KQ-2069 · ROUTINE/WEEK
Routine Week
Every scheduled agent routine on one week: days across, the small hours down, each run a block coloured by its outcome and each future slot a dashed ghost, with overlapping runs sharing the column under a notch and skipped runs hatched. The now line moves down today's column on springs.glide as now advances, and as it crosses a scheduled slot a new block buds out of the line — a sliver that opens to the block on springs.recoil, scaled from its top edge — then fills while the run executes, the fill following now on glide until the host records the outcome. The slots are a grid with one row per day: arrows move between slots (Left and Right to the nearest slot in time on the neighbouring day), Home and End jump, Enter opens a run, R runs the focused routine now and P pauses it; under 32rem the grid becomes the day's agenda under a week strip.
Nightly reports
Coldbrook · week of 12 Oct
- 01:00Sales digestQuill · 36 minSucceeded
- 02:30Inventory snapshotSift · 20 minScheduled
- 03:15Churn watchSift · 45 minScheduled
- 05:00Ad spend recapQuill · 25 minScheduled
- 07:30Support backlogPenn · 15 minScheduled
Inventory snapshot· Sift
Daily at 02:30 · 20 min
Thu 15 · Scheduled
Arrow keys move between runs, Enter opens a run or edits a slot that has not run, R runs the routine now, P pauses it.
thu 02:20 · next at 02:30
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/routine-week
Props
- routines
- RoutineWeekRoutine[]
- default defaultRoutineWeekRoutines (6)
- The recurring routines: { id, name, agent, days (0 = Monday), at (minutes after midnight), duration, paused? }.
- runs / defaultRuns
- RoutineWeekRun[]
- default — / defaultRoutineWeekRuns
- This week's runs: { id, routine, day, start, duration, outcome, note? }; outcome is success, failed, skipped or running. A run whose routine, day and start match a slot fills that slot.
- onRunsChange
- (runs: RoutineWeekRun[]) => void
- default —
- Fires with the whole list when Run now adds a running run.
- weekOf
- number
- default defaultRoutineWeekStart (Mon 12 Oct 2026)
- Monday 00:00 of the week, in ms.
- now
- number
- default Thursday 02:20 of that week
- The moment the week is read, in ms: places the now line and decides which slot is running.
- utcOffset
- number
- default 0
- Minutes added to UTC before dates are read.
- hours
- [number, number]
- default [0, 9]
- The hours drawn, as [from, to).
- day / defaultDay
- number
- default — / today
- The day the narrow agenda shows, 0 to 6.
- onDayChange
- (day: number) => void
- default —
- Fires when the week strip picks another day.
- onRunNow
- (routine: RoutineWeekRoutine, run: RoutineWeekRun) => void
- default —
- Run now (or R) was pressed, with the run it started at the now line.
- onPause
- (routine: RoutineWeekRoutine, paused: boolean) => void
- default —
- Pause or Resume (or P) was pressed, with the new state.
- onEditSchedule
- (routine: RoutineWeekRoutine | null) => void
- default —
- Edit schedule was pressed, or Enter on a slot that has not run; null from the empty week's Add a routine.
- onOpenRun
- (run: RoutineWeekRun, routine: RoutineWeekRoutine) => void
- default —
- Open run was pressed, or Enter on a slot that ran.
- title
- string
- default "Nightly reports"
- The surface's name and accessible name.
- team
- string
- default "Coldbrook"
- Whose routines, under the title.
- hourHeight
- number
- default 32
- Height of an hour on the grid, px; the agenda's rows breathe with it.
- blockStyle
- "solid" | "tinted" | "outline"
- default "tinted"
- Run blocks: pigment-filled, washed with a side bar, or outlined with an outcome dot.
- accent
- string
- default "var(--accent-bright)"
- The now line, running blocks, scheduled slots, today's shading and focus — any CSS colour.
- maxHeight
- number
- default 300
- Tallest the grid's viewport grows, px, before the hours scroll inside it.
- status
- "ready" | "loading" | "error"
- default "ready"
- Whether the week has loaded; loading draws placeholder columns, error offers Try again.
- onReload
- () => void
- default —
- Try again was pressed after the week failed to load.
- disabled
- boolean
- default false
- Read only: nothing can be run, paused or edited.
- className
- string
- default —
- Classes for the outer region.
| Prop | Type | Default | Description |
|---|---|---|---|
| routines | RoutineWeekRoutine[] | defaultRoutineWeekRoutines (6) | The recurring routines: { id, name, agent, days (0 = Monday), at (minutes after midnight), duration, paused? }. |
| runs / defaultRuns | RoutineWeekRun[] | — / defaultRoutineWeekRuns | This week's runs: { id, routine, day, start, duration, outcome, note? }; outcome is success, failed, skipped or running. A run whose routine, day and start match a slot fills that slot. |
| onRunsChange | (runs: RoutineWeekRun[]) => void | — | Fires with the whole list when Run now adds a running run. |
| weekOf | number | defaultRoutineWeekStart (Mon 12 Oct 2026) | Monday 00:00 of the week, in ms. |
| now | number | Thursday 02:20 of that week | The moment the week is read, in ms: places the now line and decides which slot is running. |
| utcOffset | number | 0 | Minutes added to UTC before dates are read. |
| hours | [number, number] | [0, 9] | The hours drawn, as [from, to). |
| day / defaultDay | number | — / today | The day the narrow agenda shows, 0 to 6. |
| onDayChange | (day: number) => void | — | Fires when the week strip picks another day. |
| onRunNow | (routine: RoutineWeekRoutine, run: RoutineWeekRun) => void | — | Run now (or R) was pressed, with the run it started at the now line. |
| onPause | (routine: RoutineWeekRoutine, paused: boolean) => void | — | Pause or Resume (or P) was pressed, with the new state. |
| onEditSchedule | (routine: RoutineWeekRoutine | null) => void | — | Edit schedule was pressed, or Enter on a slot that has not run; null from the empty week's Add a routine. |
| onOpenRun | (run: RoutineWeekRun, routine: RoutineWeekRoutine) => void | — | Open run was pressed, or Enter on a slot that ran. |
| title | string | "Nightly reports" | The surface's name and accessible name. |
| team | string | "Coldbrook" | Whose routines, under the title. |
| hourHeight | number | 32 | Height of an hour on the grid, px; the agenda's rows breathe with it. |
| blockStyle | "solid" | "tinted" | "outline" | "tinted" | Run blocks: pigment-filled, washed with a side bar, or outlined with an outcome dot. |
| accent | string | "var(--accent-bright)" | The now line, running blocks, scheduled slots, today's shading and focus — any CSS colour. |
| maxHeight | number | 300 | Tallest the grid's viewport grows, px, before the hours scroll inside it. |
| status | "ready" | "loading" | "error" | "ready" | Whether the week has loaded; loading draws placeholder columns, error offers Try again. |
| onReload | () => void | — | Try again was pressed after the week failed to load. |
| disabled | boolean | false | Read only: nothing can be run, paused or edited. |
| className | string | — | Classes for the outer region. |