taskchef 8.5.0 → 8.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,514 +1,164 @@
1
1
  # TaskChef
2
2
 
3
- TaskChef is a local dispatch desk for Codex. Give one dispatcher a request and
4
- it records each independently useful outcome, creates a normal Codex task in
5
- the right project, and returns immediately. The executor task is where live
6
- work, approvals, and follow-ups happen; TaskChef pairs each turn's request with
7
- its semantic result while projecting the latest pair for compact navigation.
3
+ **Less time managing tasks. More time moving them forward.**
8
4
 
9
- ```text
10
- request -> recorded TaskChef task -> Codex executor -> request/result turn timeline
11
- ```
12
-
13
- ## Which document should I read?
14
-
15
- | Goal | Document |
16
- | --- | --- |
17
- | Install, configure, dispatch, inspect, and recover | This README |
18
- | Follow the normative agent contract and MCP interfaces | [Specification](docs/spec.md) |
19
- | Understand dashboard start, upgrade, and shutdown | [Dashboard lifecycle](docs/dashboard-lifecycle.md) |
20
- | Build or change dashboard pages consistently | [Dashboard UI baseline](docs/dashboard-ui.md) |
21
- | Understand implementation flows and trust boundaries | [Workflows](docs/workflows.md) |
22
- | Compare TaskChef with FirstMate | [FirstMate comparison research](docs/firstmate-taskchef-comparison.md) |
23
- | Review deferred ideas | [Backlog](BACKLOG.md) |
24
-
25
- ## Install
26
-
27
- TaskChef requires Node.js 18 or newer, Git, Codex desktop, and local access to
28
- the projects that will receive work.
29
-
30
- TaskChef pins [`ccusage`](https://github.com/ccusage/ccusage) as an optional
31
- dependency for dashboard token and API-equivalent cost estimates. A normal npm
32
- installation uses that package-local executable; plugin-only installations use
33
- an npm-cache-friendly `npx` fallback to resolve the same exact version's native
34
- executable. `npx` never launches the analyzer against Codex data. TaskChef then
35
- requests ccusage's live-capable online pricing and falls back to its bundled
36
- offline snapshot, while never parsing Codex rollout files itself. Lifecycle
37
- reporting and the dashboard continue to work when ccusage, npm, or pricing is
38
- unavailable.
5
+ When work spans several Codex projects, you have to choose the right project,
6
+ find each conversation again, and check which tasks are waiting for you.
7
+ TaskChef gives you one dispatcher conversation as a central place to talk to
8
+ agents and delegate work across projects, plus a dashboard for seeing what
9
+ needs your attention.
39
10
 
40
- ```sh
41
- codex plugin marketplace add favoyang/codex-plugins
42
- codex plugin add taskchef@favoyang-plugins
43
- npm install --global taskchef
44
- ```
11
+ Give TaskChef a GitHub issue or a rough idea. It uses an explicit project name,
12
+ the conversation's context, or saved repository mappings to choose a Codex
13
+ project; if the destination is unclear, it asks you to choose. TaskChef creates
14
+ separate, ordinary Codex tasks in those projects. Each has its own conversation
15
+ and native tools, and tasks can run in parallel.
45
16
 
46
- The plugin provides five skills and a local MCP server. The npm installation
47
- puts the `taskchef` CLI on `PATH`. TaskChef installs no hooks, schedules,
48
- daemons, login items, system services, or background identity search and needs
49
- no elevated permissions.
17
+ You can keep using Codex as you do today. Start by delegating work where the
18
+ project choice or follow-up is cumbersome, then bring more work into TaskChef
19
+ as you go.
50
20
 
51
- ## Bootstrap and index projects
21
+ ## What working with TaskChef looks like
52
22
 
53
- Ask the bootstrap skill to create the per-user dispatcher:
23
+ Suppose you have indexed two Codex projects, **payments** and **recipe-book**,
24
+ and saved a GitHub repository mapping for payments. In your TaskChef dispatcher
25
+ conversation, paste a payments issue link and ask:
54
26
 
55
27
  ```text
56
- $taskchef-bootstrap Set up TaskChef and index my local Codex projects.
28
+ Investigate this issue, fix the cause, and run the relevant tests: https://github.com/example/payments/issues/42
57
29
  ```
58
30
 
59
- The canonical workspace is `~/.agents/taskchef`. TaskChef owns only:
60
-
61
- ```text
62
- AGENTS.md managed dispatcher instructions plus user additions
63
- taskchef.json schema-2 Codex project index, dashboard preference, and delegation metadata
64
- tasks.jsonl one task snapshot per line (schema 10; schema 4-9 migration supported)
65
- .taskchef-usage.json optional mode-0600 ccusage snapshot and turn-boundary cache
66
- ```
31
+ TaskChef uses the issue URL's repository to identify the mapped payments
32
+ project. It then opens a separate Codex task there and returns its link. The
33
+ task investigates the issue in its own conversation while other delegated
34
+ tasks can work in recipe-book or other projects.
67
35
 
68
- Index or inspect Codex projects conversationally:
36
+ In the same dispatcher conversation, start another task from a rough idea:
69
37
 
70
38
  ```text
71
- $taskchef-bootstrap List my indexed Codex projects.
72
- $taskchef-bootstrap Index /workspace/payments as payments. It owns authorization, capture, refunds, and retries.
73
- $taskchef-bootstrap Reindex after the Codex projects I added today.
39
+ In recipe-book, explore an idea for weekly meal planning. Discuss the approach with me before coding.
74
40
  ```
75
41
 
76
- TaskChef indexes existing Codex projects for delegation. The index stores
77
- canonical paths and routing metadata; it never indexes repository contents or
78
- creates another kind of project. For a folder already saved as a local Codex
79
- project, the bootstrap skill requires an exact canonical-path match before
80
- writing and verifying its TaskChef index entry. For a new folder, or an existing
81
- folder not yet saved by Codex, it creates the directory only when explicitly
82
- requested, opens the canonical path with the validated Codex Desktop CLI's
83
- `codex app <path>` mechanism, re-lists native projects, and requires the same
84
- exact match before indexing it. An open request without a verified native
85
- project is reported as partial setup, not delegation-ready.
86
-
87
- Update one indexed project with taskchef project update; repeated
88
- --github-repo values replace that entry's complete repository list while
89
- leaving every other project untouched. project list --json returns stable
90
- configuration and project-set hashes for postcondition checks.
91
-
92
- Whole-index replacement, project removal, and restore are preview-bound. Run
93
- them with --dry-run, inspect the exact diff, then apply with the returned
94
- hashes, counts, plan hash, and exact removed-name confirmation after the user
95
- approves every removed project. TaskChef creates private snapshots under
96
- backups/ before mutations and actual dashboard startup. Use taskchef backup
97
- list, create, verify, restore, and prune; restore never runs automatically and
98
- creates a pre-restore safety snapshot. If the live configuration is missing or
99
- malformed, preview an explicit config or state restore, then bind the apply to
100
- the preview's raw-state hash and plan with --confirm-unreadable-current.
101
-
102
- Reindexing catches TaskChef up with newly saved Codex projects by comparing
103
- exact same-host canonical paths from one native schema-2 project snapshot.
104
- Reconciliation adds eligible paths and identity bindings atomically, isolates
105
- per-project failures, and preserves existing curated names, descriptions, and
106
- complete repository lists. It does not delete missing projects. Duplicate
107
- native IDs, duplicate canonical targets, and identity/path moves remain
108
- diagnostics rather than guesses.
109
-
110
- Configuration schema 2 accepts an optional strict `projectIndex` containing
111
- local native identity bindings, explicit exclusions, and bounded routing hints.
112
- Removing a project records an exclusion so reconciliation cannot silently
113
- re-add it; `include_project` clears an exact exclusion before a later reconcile.
114
- Aliases come only from explicit selection or correction. Repository ownership
115
- requires an inspected exact origin, and report-derived responsibilities retain
116
- their accepted task/thread/turn provenance. Forgetting keeps bounded suppression
117
- so an old report retry cannot recreate a removed hint. Older TaskChef releases
118
- reject this optional field; use a compatible backup before downgrading.
119
-
120
- Codex CLI resolution follows the same contract as
121
- `workspace init --register-codex`: an explicit `--codex-cli` path wins, then
122
- `TASKCHEF_CODEX_CLI`; either must be executable and support `app --help`.
123
- Without an override, TaskChef prefers a validated `codex` PATH candidate under
124
- `Contents/Resources`; otherwise it validates only the first executable `codex`
125
- in PATH order. It does not assume an arbitrary shell command or hard-code an
126
- application bundle location.
127
-
128
- Or use the CLI:
42
+ TaskChef selects recipe-book by name and opens a separate task there. Discuss
43
+ the options in that task. If a written plan would help, ask it to save a
44
+ Markdown plan, then ask it to implement the agreed approach in the same task.
45
+ A plan file is created when you request one; it is not a required step for
46
+ every task.
129
47
 
130
- ```sh
131
- taskchef project add /workspace/payments --name payments \
132
- --description "Authorization, capture, refunds, and retries."
133
- taskchef project list
134
- ```
48
+ The screenshots in this walkthrough use illustrative demo data. Open the
49
+ dashboard beside TaskChef master to see both tasks across your projects.
50
+ **Board** groups tasks by **Working**, **Needs input**, **Completed**, and
51
+ **Failed** so you can see their status at a glance.
135
52
 
136
- The CLI command writes TaskChef metadata only; it does not query Codex. Before
137
- using it directly, verify that `/workspace/payments` exactly matches the
138
- canonical path of an existing local Codex project. The bootstrap skill performs
139
- that native-project check for you.
53
+ ![TaskChef master beside the dashboard board with recipe-book working and payments needing input](docs/images/readme-board.png)
140
54
 
141
- A project may advertise several GitHub repositories with repeated
142
- `--github-repo`. Explicit values replace automatic origin detection and form
143
- the complete advertised list, so include the origin when it should remain
144
- routable. A managed `*-workspace` should advertise every relevant child or
145
- subrepository canonical GitHub URL, plus the workspace repository itself when
146
- applicable, so issue and pull-request links select the correct Codex project.
147
- TaskChef accepts Git roots and ordinary local folders on the same execution
148
- host. Unsupported configuration schemas are rejected and are never rewritten
149
- automatically.
55
+ *Board gives an overview of task status across projects.*
150
56
 
151
- ## Dispatch
57
+ If the payments task needs a decision, it might ask, for example, whether to
58
+ show a failed refund beside the original payment or in a separate list. Switch
59
+ to **List** to see each task's request, latest result, and status in rows. Filter
60
+ by **Needs input** to focus on the payments task's question.
152
61
 
153
- Open the TaskChef dispatcher project and ask for an outcome:
62
+ ![TaskChef master beside the dashboard list filtered to Needs input, showing the payments request and result](docs/images/readme-list.png)
154
63
 
155
- ```text
156
- In payments, fix duplicate charges after a retry, add a regression test, and report what changed.
157
- ```
64
+ *List shows the payments request and result in the Needs input queue.*
158
65
 
159
- From another project, invoke the delegation skill explicitly:
66
+ Select the payments task and choose **Open chat** to answer in its original
67
+ Codex conversation.
160
68
 
161
- ```text
162
- $taskchef-delegate In payments, add structured logs for failed retries and test them.
163
- ```
69
+ ![Payments task detail showing Open chat and the question in its activity timeline](docs/images/readme-needs-input.png)
164
70
 
165
- The dispatcher lists native projects once per batch, reconciles that snapshot,
166
- then prepares a UUID and marker for each outcome, persists the task before native creation,
167
- creates the executor, and returns its task link. New executor instructions keep
168
- the assignment visible from the first line, add a concise local reporting
169
- authorization paragraph, leave one blank line, then place
170
- an explicit `$taskchef-executor` invocation immediately before the final
171
- correlation marker. That skill reads the executor's own `CODEX_THREAD_ID`, self-links, and
172
- reports lifecycle state. Independent outcomes may become separate executors;
173
- dependent work should stay together.
174
-
175
- Activating the TaskChef MCP process best-effort ensures the dashboard by
176
- default. The managed workspace instructions also retry it at the start of each
177
- dispatcher turn. A startup failure never blocks MCP tools, an answer, report,
178
- or delegation. Every dispatcher response ends with
179
- the stable [TaskChef Dashboard](http://127.0.0.1:3210/) link; a created-task
180
- directive remains on the preceding line so dispatch still returns immediately.
181
-
182
- For example, TaskChef generates this shape:
71
+ *Payments task details show the question and the Open chat action.*
183
72
 
184
- ```text
185
- Fix duplicate charges after a retry and add a regression test.
186
-
187
- Report this task and its follow-ups to my local TaskChef dashboard. Relevant private-repository links and concise work, test, and deployment results are authorized; exclude secrets.
188
-
189
- Use $taskchef-executor to execute and report this delegated TaskChef assignment.
190
- <!-- taskchef_id=c0f010ff-84f2-4838-a69d-0ff1f5d721d7 -->
191
- ```
192
-
193
- ### Model roles
194
-
195
- TaskChef can apply personal Orchestrator, Planner, Implementer, and Reviewer
196
- model preferences from `~/.codex/agents/`. Every delegated task uses the
197
- Orchestrator preference for its visible parent. For repository work, a combined
198
- investigate-or-plan-and-implement request runs fresh Planner, Implementer, and
199
- Reviewer subagents in that order. A direct implementation, or a later request
200
- to implement prior investigation, skips the Planner and runs a fresh Implementer
201
- and Reviewer in the same visible task. Explicit model choices take precedence
202
- for the role they target.
203
-
204
- ## Work with and report executors
205
-
206
- Open an executor as an ordinary Codex task. Each executor reports `working`
207
- when a turn starts and one semantic outcome before that same turn ends:
208
-
209
- - `completed`: the requested outcome is complete;
210
- - `needs_input`: a real user decision or missing fact blocks progress;
211
- - `failed`: the executor or creation attempt ended unsuccessfully.
212
-
213
- A native approval prompt is live Codex state, not `needs_input`.
214
- When work starts, the executor reports a concise request summary. TaskChef
215
- appends a `turns` entry that pairs that request with a null result while working,
216
- then fills the same entry with the semantic outcome. A follow-up therefore shows
217
- its own request with “In progress,” never the preceding turn's result. Returned
218
- tasks still derive `results` and `lastResult` as compatibility projections.
219
- Every entry has a required `turnRef`, which is the lifecycle identity. When
220
- Codex exposes a native turn ID, both `turnRef` and `turnId` contain that value.
221
- Otherwise the executor retains a fresh UUID in `turnRef` and stores
222
- `turnId: null`; native turn lookup is never a prerequisite for work or reporting.
223
- If Codex crashes, an MCP call is lost, or the app restarts before that terminal
224
- report, the next newer `working` report atomically marks the unfinished turn
225
- `interrupted` and appends the new active turn. `interrupted` is TaskChef-authored
226
- timeline evidence, not semantic `failed`, and it never enters `results` or
227
- `lastResult`. TaskChef stores only a fixed interruption summary; it does not
228
- store transcripts, hidden reasoning, crash output, or other non-semantic events.
229
-
230
- Delegated tasks created by earlier TaskChef versions remain compatible: their
231
- inline executor protocol still parses, self-links, and may use the deprecated
232
- `report_result` alias. The v7 inline-paragraph named exports remain as deprecated
233
- historical snapshots, but new delegations use the executor skill and `report_state`.
234
-
235
- ## View tasks and ask copilot
236
-
237
- The dashboard is the primary monitoring and browsing UI. Ask copilot when you
238
- want a concise explanation or recommendation:
73
+ In that conversation, answer the question and ask the task to finish:
239
74
 
240
75
  ```text
241
- $taskchef-copilot Summarize recent delegated work and tell me what needs attention.
242
- ```
243
-
244
- Copilot starts from TaskChef's normalized cached brief. It uses live Codex
245
- metadata only when you explicitly request fresh/live verification or a focused
246
- task presents a meaningful contradiction, and it never polls. It can identify
247
- the exact executor, explain or draft a same-assignment follow-up, and—with your
248
- explicit authorization—continue that existing task. It never automatically
249
- retries failures, interrupts working tasks, or redelegates an executor. New
250
- independent work still belongs to `$taskchef-delegate`. In the dispatcher, an
251
- explicit instruction to answer, resume, or continue a named existing task
252
- routes to copilot; it re-reads that exact task before sending.
253
-
254
- The former `$taskchef-report` skill is not packaged as an alias because a
255
- second discoverable skill would preserve ambiguous behavior. Explicit
256
- historical invocations are understood as requests for `$taskchef-copilot` and
257
- receive a brief rename notice.
258
-
259
- File-backed inspection is also available:
260
-
261
- ```sh
262
- taskchef task brief
263
- taskchef task brief c0f010ff
264
- taskchef task brief --project payments
265
- taskchef task list
266
- taskchef task list --project payments
267
- taskchef task show c0f010ff
268
- taskchef task summary
76
+ Show failed refunds beside the original payment. Implement it and run the tests.
269
77
  ```
270
78
 
271
- Add `--json` for structured output. `task brief` returns the stable schema-1
272
- cached coordination model and omits terminal tasks older than seven days from
273
- overviews unless `--all` is supplied. Focused task and project briefs retain
274
- their full selected scope. Task IDs accept a full UUID or an unambiguous
275
- eight-character prefix.
276
-
277
- ## Dashboard
79
+ When the work finishes, its result appears on the dashboard; TaskChef does
80
+ not post each result back into the dispatcher chat.
278
81
 
279
- Use the packaged recovery skill to make the dashboard available and open it:
82
+ ![Completed payments task detail showing the latest result and earlier question](docs/images/readme-completed.png)
280
83
 
281
- ```text
282
- $taskchef-dashboard Ensure and open the TaskChef dashboard.
283
- ```
84
+ *The completed task shows its latest result above the earlier question.*
284
85
 
285
- MCP activation and `$taskchef-dashboard` call the input-free `ensure_dashboard`
286
- MCP tool. It starts at most one loopback dashboard scoped to the running Codex
287
- session on `127.0.0.1:3210`, or reuses a listener only when its bounded
288
- `/api/health` identity reports the exact TaskChef/dashboard-server version,
289
- canonical workspace, and recognized launcher. The response says `started` or
290
- `reused` and includes the stable URL, canonical workspace, versions, and actual
291
- launcher.
292
-
293
- The dashboard is launched by MCP but is not hosted by one MCP transport. It
294
- therefore survives an individual MCP close, stdin EOF, signal, or plugin reload.
295
- Only a listener launched as `session` registers each same-version MCP's original
296
- Codex parent PID in its in-memory lease. After every registered Codex session
297
- PID disappears for a grace period, the dashboard closes and exits. Activating
298
- an installed newer TaskChef MCP recognizes and
299
- gracefully stops an older TaskChef dashboard for the same canonical workspace,
300
- waits boundedly for the port, then starts the installed version in that ensure.
301
- Lease state is not transferred across versions; the replacement initially knows
302
- only the activating session. These are best-effort
303
- local guards, not a claim that Codex supplies a restart guarantee. TaskChef adds
304
- no daemon or OS-persistent component. See the complete
305
- [dashboard lifecycle](docs/dashboard-lifecycle.md).
306
-
307
- TaskChef uses a trusted, single-user localhost model. Exact structured health is
308
- sufficient service recognition; it is not cryptographic authentication. Simple
309
- session and shutdown controls require exact Host and Origin, JSON content, a
310
- non-simple request header, and an exact bounded body to block ordinary
311
- cross-site browser requests. Each control names the exact health identity the
312
- caller observed; the listener refuses a stale identity and the caller probes the
313
- port again before deciding what to do. Unknown, malformed, different-workspace,
314
- unrelated, and newer listeners remain untouched. A release using the former HMAC control
315
- protocol refuses the new simple shutdown request, so the first upgrade across
316
- that boundary may require stopping that verified legacy TaskChef listener once
317
- before ensuring again.
318
-
319
- Autostart is enabled when `dashboard` is absent and in new workspaces. To opt
320
- out, add this optional exact object to `taskchef.json` while retaining its other
321
- fields:
322
-
323
- ```json
324
- "dashboard": { "autostart": false }
325
- ```
86
+ Keep the dashboard beside your conversation in Codex's built-in browser. It
87
+ shows each task's latest request and result. Open a task to see its total
88
+ reported work duration, token usage, and estimated cost, with the same figures
89
+ for each turn in its activity timeline. Duration is reported wall-clock time
90
+ spent on turns; cost is an API-equivalent estimate, not a bill. Token and cost
91
+ figures can be unavailable when usage cannot be mapped to the Codex task.
92
+ Task states normally come from the task's own reports; TaskChef does not
93
+ automatically supervise execution.
326
94
 
327
- The manual `$taskchef-dashboard` recovery skill remains available when
328
- autostart is disabled or fails. It reports whether the compatible dashboard was
329
- started or reused and always returns its canonical clickable URL. It may open
330
- the returned localhost URL in an available in-app browser, but browser failure
331
- does not make dashboard recovery fail.
95
+ ## Install and delegate your first task
332
96
 
333
- For manual development, run the foreground CLI:
97
+ You need Node.js 18 or newer, Git, Codex desktop, and local access to the
98
+ projects that will receive work. Install the plugin:
334
99
 
335
100
  ```sh
336
- taskchef dashboard
337
- taskchef dashboard --port 3211
101
+ codex plugin marketplace add favoyang/codex-plugins
102
+ codex plugin add taskchef@favoyang-plugins
338
103
  ```
339
104
 
340
- The loopback dashboard watches `tasks.jsonl`, groups current states, and opens
341
- linked Codex tasks. List snapshots and SSE events carry only the latest
342
- request/result pair; opening task details fetches the full newest-first activity
343
- timeline, including clearly labeled interrupted turns.
344
- Task details offer infrequent administrative actions without cluttering task
345
- cards. Selecting **More task actions** (`…`) reveals the action list immediately
346
- beside the disclosure and changes it to a back/hide control. The list contains
347
- **Copy Task ID** and direct **Mark completed** and **Mark failed** actions.
348
- Working and needs-input tasks offer either terminal outcome; completed tasks
349
- offer **Mark failed**, and failed tasks offer **Mark completed**. The menu
350
- disclosure is the deliberate first step; choosing an outcome submits it
351
- immediately without a second confirmation. There is no
352
- free-form reason: the audit turn records a fixed summary, timestamp, dashboard
353
- provenance, optimistic preconditions, and a unique action ID while preserving
354
- every executor turn. Same-state terminal rewrites remain invalid. Stale or
355
- concurrent changes are rejected and the dialog refreshes to the current task. A stalled
356
- local request is aborted after a bounded wait so the dialog cannot remain
357
- permanently locked; retry keeps the same idempotency identity.
358
-
359
- The archive implementation is retained behind a disabled capability gate, and
360
- the **Archive chat** control is hidden. The bundled `codex archive` command can
361
- reject a valid idle desktop-app thread even when the dashboard runs in the MCP
362
- host environment, while Codex's native app archive operation succeeds. TaskChef
363
- will keep the feature disabled until Codex exposes a reliable supported
364
- app-callable archive interface or guarantees CLI compatibility. The dormant
365
- server path also rejects requests before discovering or invoking the CLI.
366
-
367
- Task details also show whole-task and per-turn token usage when `ccusage` can
368
- map the linked Codex thread. A completed turn briefly shows “Calculating token
369
- usage…” while TaskChef performs bounded deferred reconciliation, because
370
- the terminal lifecycle callback precedes Codex's final output write. The
371
- dashboard also preloads missing, interrupted, and retry-eligible usage in a
372
- bounded background queue at startup, after task changes, and on a periodic
373
- recovery pass; opening task details is not required to start collection. Historical
374
- tasks may show a trustworthy task total while older turns remain “Token usage
375
- unavailable” when no cumulative turn boundaries were recorded. Input, cached
376
- input, output, reasoning, and total counts retain ccusage's categories. Dollar
377
- figures are labeled API-equivalent estimates; provenance identifies the online
378
- pricing request or offline fallback mode, and zero-priced unknown models show
379
- cost unavailable rather than a misleading `$0.00`. Per-turn cost is also
380
- unavailable when its cumulative boundaries used different ccusage versions or
381
- pricing modes. TaskChef displays the cumulative estimate supplied by ccusage
382
- without applying a separate model-family or cache-write coverage policy.
383
- The same detail view reports lifecycle wall-clock elapsed time independently of
384
- ccusage. Each terminal turn shows **Elapsed** from `startedAt` to
385
- `result.updatedAt`; **Total reported work** sums only valid terminal-turn
386
- durations, excluding idle gaps and unfinished work. A working turn shows live
387
- **Elapsed so far** without contributing to the total. This is reported
388
- wall-clock elapsed time, not model compute time, and malformed or reversed
389
- timestamp ranges are shown as unavailable.
390
- The header shows the running TaskChef package version reported by the same
391
- bounded health identity used for compatible-listener checks.
392
- The Settings page shows the ccusage version reported by the executable that
393
- TaskChef resolves at runtime.
394
- The canonical port is normally owned by a dashboard session process initialized
395
- by the TaskChef MCP before its tool transport connects. MCP recovery reuses an
396
- exact-compatible same-workspace dashboard and reports its actual launcher;
397
- a foreground `taskchef dashboard` process is intentionally standalone so its
398
- child commands cannot silently inherit an agent-shell sandbox.
399
- Task and result times are relative through 29 days (with minute detail for the
400
- first six hours), then use a locale-aware calendar date. Each time is a keyboard-
401
- accessible toggle for its full locale-aware date and time, and one shared
402
- 30-second timer keeps relative labels current without reloading the page.
403
- The Updates panel captures immutable event-time lifecycle notices. It identifies
404
- them by task, turn when available, and lifecycle event rather than dashboard
405
- revision, so reconnects and non-semantic rewrites do not replay a notice and a
406
- later task state cannot rewrite an older notice. A notice remains readable if
407
- its task disappears; selecting it then explains that current details are no
408
- longer available.
409
- Apart from an explicit manual state selection from the task-detail menu, it does not mutate
410
- TaskChef data and prints its local URL. A foreground dashboard identifies
411
- itself as `standalone`. An exact-current, healthy same-workspace listener with a
412
- recognized `standalone`, `mcp`, or `session` launcher may be reused on the
413
- canonical MCP port; ensure reports its actual launcher, and only `session`
414
- listeners register Codex PID leases. If an unknown, malformed, or
415
- different-workspace process owns port 3210, TaskChef reports a concise conflict
416
- and never kills that process. A recognized older same-workspace TaskChef
417
- listener receives a simple guarded graceful shutdown request. If it lacks the
418
- compatible callback or refuses the request, it remains running and ensure
419
- reports a conflict. The foreground CLI similarly asks you to stop a conflicting
420
- listener or choose another `--port`.
421
-
422
- The health endpoint contains only a fixed service marker, health schema,
423
- TaskChef version, dashboard-server version, canonical workspace, and launcher.
424
- It exposes no task data, credentials, environment variables, process control,
425
- or secrets.
426
-
427
- ![TaskChef dashboard identity and version](docs/images/dashboard-identity.jpg)
428
-
429
- ![Immutable event-time dashboard notifications](docs/images/notification-event-snapshots.jpg)
430
-
431
- ![Task detail activity timeline](docs/images/result-history-dashboard.jpg)
432
-
433
- ![Deferred ccusage token consumption in task details](docs/images/ccusage-token-consumption.png)
434
-
435
- ![Interrupted turn followed by active recovery](docs/images/interrupted-turn-recovery.jpg)
436
-
437
- ## Common recovery
438
-
439
- Check the managed workspace:
105
+ For the first run, set up the TaskChef dispatcher and import your saved local
106
+ Codex projects:
440
107
 
441
- ```sh
442
- taskchef doctor
443
- taskchef workspace init
444
- taskchef workspace migrate
445
- taskchef doctor
108
+ ```text
109
+ $taskchef-bootstrap Set up TaskChef and index my local Codex projects.
446
110
  ```
447
111
 
448
- `doctor` is read-only. `workspace init` creates missing files and refreshes
449
- managed instructions. `workspace migrate` explicitly upgrades supported schema
450
- 4-9 task lines to schema 10 under the workspace lock. It validates task and turn
451
- counts plus the complete source and converted log before writing, creates an
452
- exclusive `tasks.jsonl.pre-v10-*.bak`
453
- backup, atomically replaces the log, validates the result, and becomes an
454
- idempotent no-op after migration. If replacement fails, the original remains
455
- or the reported backup can be restored; unsupported or invalid input is rejected
456
- before a backup or rewrite.
112
+ After bootstrap, choose **New chat** in Codex and select the TaskChef dispatcher
113
+ project at `~/.agents/taskchef`. We suggest renaming the new conversation
114
+ **TaskChef master**, then pinning it for easy return. Bootstrap registers and
115
+ opens the project; you create, rename, and pin the conversation yourself.
116
+ Replace `<your-project>` with one of your indexed
117
+ Codex project names and try a read-only first request:
457
118
 
458
- If a new record has no thread ID, the executor is link-pending. Reopen that
459
- executor so its first action can retry `link_task`. Do not guess an identity
460
- or edit `tasks.jsonl`. If native task creation failed, the record is retained
461
- as `failed` with a retained fallback `turnRef` and null thread and Codex turn IDs.
119
+ ```text
120
+ In <your-project>, explain how to run the app and tests. Do not change files.
121
+ ```
462
122
 
463
- Schemas other than 4, 5, 6, 7, 8, 9, and 10 remain unsupported. Retain such a workspace
464
- unchanged and create a current workspace; the migration command deliberately
465
- does not guess how to convert unknown formats.
123
+ TaskChef returns a link to the new Codex task. From then on, the dispatcher
124
+ checks your saved Codex projects when you delegate, so you do not need to
125
+ reindex after adding one. The local dashboard normally starts when the TaskChef
126
+ plugin activates. Open the [dashboard link](http://127.0.0.1:3210/) from the
127
+ end of each dispatcher response in Codex's side browser, beside your
128
+ conversation. If the dashboard is unavailable, ask `$taskchef-dashboard` to
129
+ ensure and open it. Use `$taskchef-bootstrap` to add repository mappings or
130
+ refine project descriptions when routing needs more context. If the installed
131
+ skills do not appear, activate or reload the TaskChef plugin in Codex and try
132
+ again.
466
133
 
467
- ## Boundaries
134
+ ## Choose models for each role
468
135
 
469
- TaskChef dispatches; it is not a scheduler, supervisor, worker runtime, or
470
- merge coordinator. Executor identity is a cooperative assertion inside a local
471
- single-user trust boundary. The [specification](docs/spec.md) defines the
472
- required contract; [workflows](docs/workflows.md) ties it to current code.
136
+ In the dashboard's **Settings** page, choose a model and reasoning effort for
137
+ the **Orchestrator**, **Planner**, **Implementer**, and **Reviewer** roles.
138
+ TaskChef saves these preferences in native Codex agent files under
139
+ `~/.codex/agents/` and applies them when it dispatches the corresponding work.
140
+ Set them once for future tasks; a model choice you make explicitly for a task
141
+ takes precedence over its role preference.
473
142
 
474
- ## Update
143
+ ![TaskChef Settings page with model and reasoning effort for four roles](docs/images/readme-roles.png)
475
144
 
476
- ```sh
477
- codex plugin marketplace upgrade favoyang-plugins
478
- codex plugin add taskchef@favoyang-plugins
479
- ```
480
-
481
- Replacing or installing plugin files cannot execute autostart by itself. After
482
- installation, activate or reload the new TaskChef MCP process; installation
483
- does not necessarily reload Codex. Then run `$taskchef-dashboard` (or call
484
- `ensure_dashboard`) and verify the returned dashboard identity has all of:
485
-
486
- - the expected released TaskChef version;
487
- - the expected dashboard protocol `serverVersion`;
488
- - the reported dashboard launcher (`session` for a newly started canonical dashboard);
489
- - the canonical TaskChef workspace path;
490
- - the canonical `http://127.0.0.1:3210/` URL.
145
+ *Settings shows the model and reasoning effort selected for each role.*
491
146
 
492
- The release-install sequence is therefore: install plugin, activate or reload
493
- the new MCP process, ensure the dashboard, then verify TaskChef version,
494
- protocol `serverVersion`, reported launcher, canonical workspace, and URL.
495
- Exact-compatible same-workspace servers with a recognized launcher may be
496
- reused; unknown listeners remain untouched.
147
+ ## More detail
497
148
 
498
- If autostart reports a **verified older TaskChef** listener, the port occupant
499
- passed the bounded TaskChef identity check but refused the simple graceful
500
- shutdown request. Releases using the former HMAC control protocol form a
501
- one-time compatibility boundary: stop that verified legacy TaskChef listener
502
- through the application/session that launched it, then activate the installed
503
- plugin and ensure again. Do not kill an arbitrary port owner.
149
+ The [advanced guide](docs/advanced-guide.md) covers project indexing, routing,
150
+ task reporting, dashboard behavior, recovery, updates, and development. The
151
+ [specification](docs/spec.md) and [workflows](docs/workflows.md) describe the
152
+ implementation contracts. TaskChef was inspired by
153
+ [FirstMate](https://github.com/kunchenguid/firstmate); the
154
+ [comparison](docs/firstmate-taskchef-comparison.md) explains their different
155
+ approaches.
504
156
 
505
- ## Development
157
+ ## License
506
158
 
507
- ```sh
508
- npm ci
509
- npm test
510
- npm pack --dry-run
511
- ```
159
+ Copyright 2026 Favo Yang. TaskChef is licensed under the
160
+ [Apache License 2.0](LICENSE).
512
161
 
513
- Merges to `main` run semantic-release and update the shared plugin
514
- marketplace. Removing unsupported schemas is a major-version change.
162
+ Third-party dependencies retain their own licenses. The OpenAI Codex icons
163
+ are excluded from TaskChef's license; see the
164
+ [Codex asset notice](assets/CODEX_ASSET_NOTICE.md).
@@ -16,7 +16,7 @@ icon previews. Their SHA-256 digests are:
16
16
  - `codex-app-light.png`: `de7d43f3386105ab20952958c2c25beb0d903e2aeb6e1aef57c49a648c0d1c07`
17
17
 
18
18
  The Codex icon is an OpenAI trademark and copyrighted asset. It is not covered
19
- by TaskChef's MIT license. TaskChef uses it unchanged and only beside the
19
+ by TaskChef's Apache-2.0 license. TaskChef uses it unchanged and only beside the
20
20
  visible **Open task** label to identify an action that opens the corresponding
21
21
  task in OpenAI Codex. Use remains subject to the [OpenAI Design
22
22
  Guidelines](https://openai.com/brand/), including OpenAI's Marks usage terms.