taskchef 8.5.1 → 8.5.3
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/.codex-plugin/plugin.json +2 -2
- package/LICENSE +202 -21
- package/README.md +113 -460
- package/assets/CODEX_ASSET_NOTICE.md +1 -1
- package/docs/advanced-guide.md +506 -0
- package/docs/images/readme-board.png +0 -0
- package/docs/images/readme-completed.png +0 -0
- package/docs/images/readme-list.png +0 -0
- package/docs/images/readme-needs-input.png +0 -0
- package/docs/images/readme-roles.png +0 -0
- package/docs/spec.md +4 -3
- package/docs/workflows.md +1 -1
- package/package.json +9 -3
|
@@ -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
|
|
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.
|
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
# TaskChef advanced guide
|
|
2
|
+
|
|
3
|
+
Detailed setup, operation, recovery, and development reference for TaskChef.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
TaskChef requires Node.js 18 or newer, Git, Codex desktop, and local access to
|
|
8
|
+
the projects that will receive work.
|
|
9
|
+
|
|
10
|
+
TaskChef pins [`ccusage`](https://github.com/ccusage/ccusage) as an optional
|
|
11
|
+
dependency for dashboard token and API-equivalent cost estimates. A normal npm
|
|
12
|
+
installation uses that package-local executable; plugin-only installations use
|
|
13
|
+
an npm-cache-friendly `npx` fallback to resolve the same exact version's native
|
|
14
|
+
executable. `npx` never launches the analyzer against Codex data. TaskChef then
|
|
15
|
+
requests ccusage's live-capable online pricing and falls back to its bundled
|
|
16
|
+
offline snapshot, while never parsing Codex rollout files itself. Lifecycle
|
|
17
|
+
reporting and the dashboard continue to work when ccusage, npm, or pricing is
|
|
18
|
+
unavailable.
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
codex plugin marketplace add favoyang/codex-plugins
|
|
22
|
+
codex plugin add taskchef@favoyang-plugins
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The plugin provides five skills and a local MCP server. Its skills use the CLI
|
|
26
|
+
bundled with the plugin, so a global npm installation is not needed for the
|
|
27
|
+
dispatcher workflow. To run `taskchef` directly from a terminal, install the
|
|
28
|
+
CLI separately:
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
npm install --global taskchef
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
TaskChef installs no hooks, schedules, daemons, login items, system services,
|
|
35
|
+
or background identity search and needs no elevated permissions.
|
|
36
|
+
|
|
37
|
+
## Bootstrap and index projects
|
|
38
|
+
|
|
39
|
+
For the first run, ask the bootstrap skill to create and verify the per-user
|
|
40
|
+
dispatcher and import saved local Codex projects:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
$taskchef-bootstrap Set up TaskChef and index my local Codex projects.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The canonical workspace is `~/.agents/taskchef`. TaskChef owns only:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
AGENTS.md managed dispatcher instructions plus user additions
|
|
50
|
+
taskchef.json schema-2 Codex project index, dashboard preference, and delegation metadata
|
|
51
|
+
tasks.jsonl one task snapshot per line (schema 10; schema 4-9 migration supported)
|
|
52
|
+
.taskchef-usage.json optional mode-0600 ccusage snapshot and turn-boundary cache
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
To inspect or manually adjust the project index later, use the bootstrap skill:
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
$taskchef-bootstrap List my indexed Codex projects.
|
|
59
|
+
$taskchef-bootstrap Index /workspace/payments as payments. It owns authorization, capture, refunds, and retries.
|
|
60
|
+
$taskchef-bootstrap Reindex after the Codex projects I added today.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
TaskChef indexes existing Codex projects for delegation. The index stores
|
|
64
|
+
canonical paths and routing metadata; it never indexes repository contents or
|
|
65
|
+
creates another kind of project. For a folder already saved as a local Codex
|
|
66
|
+
project, the bootstrap skill requires an exact canonical-path match before
|
|
67
|
+
writing and verifying its TaskChef index entry. For a new folder, or an existing
|
|
68
|
+
folder not yet saved by Codex, it creates the directory only when explicitly
|
|
69
|
+
requested, opens the canonical path with the validated Codex Desktop CLI's
|
|
70
|
+
`codex app <path>` mechanism, re-lists native projects, and requires the same
|
|
71
|
+
exact match before indexing it. An open request without a verified native
|
|
72
|
+
project is reported as partial setup, not delegation-ready.
|
|
73
|
+
|
|
74
|
+
Update one indexed project with taskchef project update; repeated
|
|
75
|
+
--github-repo values replace that entry's complete repository list while
|
|
76
|
+
leaving every other project untouched. project list --json returns stable
|
|
77
|
+
configuration and project-set hashes for postcondition checks.
|
|
78
|
+
|
|
79
|
+
Whole-index replacement, project removal, and restore are preview-bound. Run
|
|
80
|
+
them with --dry-run, inspect the exact diff, then apply with the returned
|
|
81
|
+
hashes, counts, plan hash, and exact removed-name confirmation after the user
|
|
82
|
+
approves every removed project. TaskChef creates private snapshots under
|
|
83
|
+
backups/ before mutations and actual dashboard startup. Use taskchef backup
|
|
84
|
+
list, create, verify, restore, and prune; restore never runs automatically and
|
|
85
|
+
creates a pre-restore safety snapshot. If the live configuration is missing or
|
|
86
|
+
malformed, preview an explicit config or state restore, then bind the apply to
|
|
87
|
+
the preview's raw-state hash and plan with --confirm-unreadable-current.
|
|
88
|
+
|
|
89
|
+
The dispatcher also reconciles saved Codex projects automatically before each
|
|
90
|
+
delegation batch. You do not need a separate reindex step when adding a native
|
|
91
|
+
Codex project. Manual reindexing compares exact same-host canonical paths from
|
|
92
|
+
one native schema-2 project snapshot.
|
|
93
|
+
Reconciliation adds eligible paths and identity bindings atomically, isolates
|
|
94
|
+
per-project failures, and preserves existing curated names, descriptions, and
|
|
95
|
+
complete repository lists. It does not delete missing projects. Duplicate
|
|
96
|
+
native IDs, duplicate canonical targets, and identity/path moves remain
|
|
97
|
+
diagnostics rather than guesses.
|
|
98
|
+
|
|
99
|
+
Configuration schema 2 accepts an optional strict `projectIndex` containing
|
|
100
|
+
local native identity bindings, explicit exclusions, and bounded routing hints.
|
|
101
|
+
Removing a project records an exclusion so reconciliation cannot silently
|
|
102
|
+
re-add it; `include_project` clears an exact exclusion before a later reconcile.
|
|
103
|
+
Aliases come only from explicit selection or correction. Repository ownership
|
|
104
|
+
requires an inspected exact origin, and report-derived responsibilities retain
|
|
105
|
+
their accepted task/thread/turn provenance. Forgetting keeps bounded suppression
|
|
106
|
+
so an old report retry cannot recreate a removed hint. Older TaskChef releases
|
|
107
|
+
reject this optional field; use a compatible backup before downgrading.
|
|
108
|
+
|
|
109
|
+
Codex CLI resolution follows the same contract as
|
|
110
|
+
`workspace init --register-codex`: an explicit `--codex-cli` path wins, then
|
|
111
|
+
`TASKCHEF_CODEX_CLI`; either must be executable and support `app --help`.
|
|
112
|
+
Without an override, TaskChef prefers a validated `codex` PATH candidate under
|
|
113
|
+
`Contents/Resources`; otherwise it validates only the first executable `codex`
|
|
114
|
+
in PATH order. It does not assume an arbitrary shell command or hard-code an
|
|
115
|
+
application bundle location.
|
|
116
|
+
|
|
117
|
+
Or use the CLI:
|
|
118
|
+
|
|
119
|
+
```sh
|
|
120
|
+
taskchef project add /workspace/payments --name payments \
|
|
121
|
+
--description "Authorization, capture, refunds, and retries."
|
|
122
|
+
taskchef project list
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The CLI command writes TaskChef metadata only; it does not query Codex. Before
|
|
126
|
+
using it directly, verify that `/workspace/payments` exactly matches the
|
|
127
|
+
canonical path of an existing local Codex project. The bootstrap skill performs
|
|
128
|
+
that native-project check for you.
|
|
129
|
+
|
|
130
|
+
A project may advertise several GitHub repositories with repeated
|
|
131
|
+
`--github-repo`. Explicit values replace automatic origin detection and form
|
|
132
|
+
the complete advertised list, so include the origin when it should remain
|
|
133
|
+
routable. A managed `*-workspace` should advertise every relevant child or
|
|
134
|
+
subrepository canonical GitHub URL, plus the workspace repository itself when
|
|
135
|
+
applicable, so issue and pull-request links select the correct Codex project.
|
|
136
|
+
TaskChef accepts Git roots and ordinary local folders on the same execution
|
|
137
|
+
host. Unsupported configuration schemas are rejected and are never rewritten
|
|
138
|
+
automatically.
|
|
139
|
+
|
|
140
|
+
## Dispatch
|
|
141
|
+
|
|
142
|
+
Open the TaskChef dispatcher project and ask for an outcome:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
In payments, fix duplicate charges after a retry, add a regression test, and report what changed.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
From another project, invoke the delegation skill explicitly:
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
$taskchef-delegate In payments, add structured logs for failed retries and test them.
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The dispatcher lists native projects once per batch, reconciles that snapshot,
|
|
155
|
+
then prepares a UUID and marker for each outcome, persists the task before native creation,
|
|
156
|
+
creates the executor, and returns its task link. New executor instructions keep
|
|
157
|
+
the assignment visible from the first line, add a concise local reporting
|
|
158
|
+
authorization paragraph, leave one blank line, then place
|
|
159
|
+
an explicit `$taskchef-executor` invocation immediately before the final
|
|
160
|
+
correlation marker. That skill reads the executor's own `CODEX_THREAD_ID`, self-links, and
|
|
161
|
+
reports lifecycle state. Independent outcomes may become separate executors;
|
|
162
|
+
dependent work should stay together.
|
|
163
|
+
|
|
164
|
+
Activating the TaskChef MCP process best-effort ensures the dashboard by
|
|
165
|
+
default. The managed workspace instructions also retry it at the start of each
|
|
166
|
+
dispatcher turn. A startup failure never blocks MCP tools, an answer, report,
|
|
167
|
+
or delegation. Every dispatcher response ends with
|
|
168
|
+
the stable [TaskChef Dashboard](http://127.0.0.1:3210/) link; a created-task
|
|
169
|
+
directive remains on the preceding line so dispatch still returns immediately.
|
|
170
|
+
|
|
171
|
+
For example, TaskChef generates this shape:
|
|
172
|
+
|
|
173
|
+
```text
|
|
174
|
+
Fix duplicate charges after a retry and add a regression test.
|
|
175
|
+
|
|
176
|
+
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.
|
|
177
|
+
|
|
178
|
+
Use $taskchef-executor to execute and report this delegated TaskChef assignment.
|
|
179
|
+
<!-- taskchef_id=c0f010ff-84f2-4838-a69d-0ff1f5d721d7 -->
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Model roles
|
|
183
|
+
|
|
184
|
+
TaskChef can apply personal Orchestrator, Planner, Implementer, and Reviewer
|
|
185
|
+
model preferences from `~/.codex/agents/`. Every delegated task uses the
|
|
186
|
+
Orchestrator preference for its visible parent. For repository work, a combined
|
|
187
|
+
investigate-or-plan-and-implement request runs fresh Planner, Implementer, and
|
|
188
|
+
Reviewer subagents in that order. A direct implementation, or a later request
|
|
189
|
+
to implement prior investigation, skips the Planner and runs a fresh Implementer
|
|
190
|
+
and Reviewer in the same visible task. Explicit model choices take precedence
|
|
191
|
+
for the role they target.
|
|
192
|
+
|
|
193
|
+
## Work with and report executors
|
|
194
|
+
|
|
195
|
+
Open an executor as an ordinary Codex task. Each executor reports `working`
|
|
196
|
+
when a turn starts and one semantic outcome before that same turn ends:
|
|
197
|
+
|
|
198
|
+
- `completed`: the requested outcome is complete;
|
|
199
|
+
- `needs_input`: a real user decision or missing fact blocks progress;
|
|
200
|
+
- `failed`: the executor or creation attempt ended unsuccessfully.
|
|
201
|
+
|
|
202
|
+
A native approval prompt is live Codex state, not `needs_input`.
|
|
203
|
+
When work starts, the executor reports a concise request summary. TaskChef
|
|
204
|
+
appends a `turns` entry that pairs that request with a null result while working,
|
|
205
|
+
then fills the same entry with the semantic outcome. A follow-up therefore shows
|
|
206
|
+
its own request with “In progress,” never the preceding turn's result. Returned
|
|
207
|
+
tasks still derive `results` and `lastResult` as compatibility projections.
|
|
208
|
+
Every entry has a required `turnRef`, which is the lifecycle identity. When
|
|
209
|
+
Codex exposes a native turn ID, both `turnRef` and `turnId` contain that value.
|
|
210
|
+
Otherwise the executor retains a fresh UUID in `turnRef` and stores
|
|
211
|
+
`turnId: null`; native turn lookup is never a prerequisite for work or reporting.
|
|
212
|
+
If Codex crashes, an MCP call is lost, or the app restarts before that terminal
|
|
213
|
+
report, the next newer `working` report atomically marks the unfinished turn
|
|
214
|
+
`interrupted` and appends the new active turn. `interrupted` is TaskChef-authored
|
|
215
|
+
timeline evidence, not semantic `failed`, and it never enters `results` or
|
|
216
|
+
`lastResult`. TaskChef stores only a fixed interruption summary; it does not
|
|
217
|
+
store transcripts, hidden reasoning, crash output, or other non-semantic events.
|
|
218
|
+
|
|
219
|
+
Delegated tasks created by earlier TaskChef versions remain compatible: their
|
|
220
|
+
inline executor protocol still parses, self-links, and may use the deprecated
|
|
221
|
+
`report_result` alias. The v7 inline-paragraph named exports remain as deprecated
|
|
222
|
+
historical snapshots, but new delegations use the executor skill and `report_state`.
|
|
223
|
+
|
|
224
|
+
## View tasks and ask copilot
|
|
225
|
+
|
|
226
|
+
The dashboard is the primary monitoring and browsing UI. Ask copilot when you
|
|
227
|
+
want a concise explanation or recommendation:
|
|
228
|
+
|
|
229
|
+
```text
|
|
230
|
+
$taskchef-copilot Summarize recent delegated work and tell me what needs attention.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Copilot starts from TaskChef's normalized cached brief. It uses live Codex
|
|
234
|
+
metadata only when you explicitly request fresh/live verification or a focused
|
|
235
|
+
task presents a meaningful contradiction, and it never polls. It can identify
|
|
236
|
+
the exact executor, explain or draft a same-assignment follow-up, and—with your
|
|
237
|
+
explicit authorization—continue that existing task. It never automatically
|
|
238
|
+
retries failures, interrupts working tasks, or redelegates an executor. New
|
|
239
|
+
independent work still belongs to `$taskchef-delegate`. In the dispatcher, an
|
|
240
|
+
explicit instruction to answer, resume, or continue a named existing task
|
|
241
|
+
routes to copilot; it re-reads that exact task before sending.
|
|
242
|
+
|
|
243
|
+
The former `$taskchef-report` skill is not packaged as an alias because a
|
|
244
|
+
second discoverable skill would preserve ambiguous behavior. Explicit
|
|
245
|
+
historical invocations are understood as requests for `$taskchef-copilot` and
|
|
246
|
+
receive a brief rename notice.
|
|
247
|
+
|
|
248
|
+
File-backed inspection is also available:
|
|
249
|
+
|
|
250
|
+
```sh
|
|
251
|
+
taskchef task brief
|
|
252
|
+
taskchef task brief c0f010ff
|
|
253
|
+
taskchef task brief --project payments
|
|
254
|
+
taskchef task list
|
|
255
|
+
taskchef task list --project payments
|
|
256
|
+
taskchef task show c0f010ff
|
|
257
|
+
taskchef task summary
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Add `--json` for structured output. `task brief` returns the stable schema-1
|
|
261
|
+
cached coordination model and omits terminal tasks older than seven days from
|
|
262
|
+
overviews unless `--all` is supplied. Focused task and project briefs retain
|
|
263
|
+
their full selected scope. Task IDs accept a full UUID or an unambiguous
|
|
264
|
+
eight-character prefix.
|
|
265
|
+
|
|
266
|
+
## Dashboard
|
|
267
|
+
|
|
268
|
+
The dashboard normally starts when the TaskChef MCP activates, and the
|
|
269
|
+
dispatcher retries startup at the beginning of each turn. Its final response
|
|
270
|
+
includes the dashboard link even if startup fails. If the dashboard is
|
|
271
|
+
unavailable, use the packaged recovery skill to start or open it:
|
|
272
|
+
|
|
273
|
+
```text
|
|
274
|
+
$taskchef-dashboard Ensure and open the TaskChef dashboard.
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
MCP activation and `$taskchef-dashboard` call the input-free `ensure_dashboard`
|
|
278
|
+
MCP tool. It starts at most one loopback dashboard scoped to the running Codex
|
|
279
|
+
session on `127.0.0.1:3210`, or reuses a listener only when its bounded
|
|
280
|
+
`/api/health` identity reports the exact TaskChef/dashboard-server version,
|
|
281
|
+
canonical workspace, and recognized launcher. The response says `started` or
|
|
282
|
+
`reused` and includes the stable URL, canonical workspace, versions, and actual
|
|
283
|
+
launcher.
|
|
284
|
+
|
|
285
|
+
The dashboard is launched by MCP but is not hosted by one MCP transport. It
|
|
286
|
+
therefore survives an individual MCP close, stdin EOF, signal, or plugin reload.
|
|
287
|
+
Only a listener launched as `session` registers each same-version MCP's original
|
|
288
|
+
Codex parent PID in its in-memory lease. After every registered Codex session
|
|
289
|
+
PID disappears for a grace period, the dashboard closes and exits. Activating
|
|
290
|
+
an installed newer TaskChef MCP recognizes and
|
|
291
|
+
gracefully stops an older TaskChef dashboard for the same canonical workspace,
|
|
292
|
+
waits boundedly for the port, then starts the installed version in that ensure.
|
|
293
|
+
Lease state is not transferred across versions; the replacement initially knows
|
|
294
|
+
only the activating session. These are best-effort
|
|
295
|
+
local guards, not a claim that Codex supplies a restart guarantee. TaskChef adds
|
|
296
|
+
no daemon or OS-persistent component. See the complete
|
|
297
|
+
[dashboard lifecycle](dashboard-lifecycle.md).
|
|
298
|
+
|
|
299
|
+
TaskChef uses a trusted, single-user localhost model. Exact structured health is
|
|
300
|
+
sufficient service recognition; it is not cryptographic authentication. Simple
|
|
301
|
+
session and shutdown controls require exact Host and Origin, JSON content, a
|
|
302
|
+
non-simple request header, and an exact bounded body to block ordinary
|
|
303
|
+
cross-site browser requests. Each control names the exact health identity the
|
|
304
|
+
caller observed; the listener refuses a stale identity and the caller probes the
|
|
305
|
+
port again before deciding what to do. Unknown, malformed, different-workspace,
|
|
306
|
+
unrelated, and newer listeners remain untouched. A release using the former HMAC control
|
|
307
|
+
protocol refuses the new simple shutdown request, so the first upgrade across
|
|
308
|
+
that boundary may require stopping that verified legacy TaskChef listener once
|
|
309
|
+
before ensuring again.
|
|
310
|
+
|
|
311
|
+
Autostart is enabled when `dashboard` is absent and in new workspaces. To opt
|
|
312
|
+
out, add this optional exact object to `taskchef.json` while retaining its other
|
|
313
|
+
fields:
|
|
314
|
+
|
|
315
|
+
```json
|
|
316
|
+
"dashboard": { "autostart": false }
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
The manual `$taskchef-dashboard` recovery skill remains available when
|
|
320
|
+
autostart is disabled or fails. It reports whether the compatible dashboard was
|
|
321
|
+
started or reused and always returns its canonical clickable URL. It may open
|
|
322
|
+
the returned localhost URL in an available in-app browser, but browser failure
|
|
323
|
+
does not make dashboard recovery fail.
|
|
324
|
+
|
|
325
|
+
For manual development, run the foreground CLI:
|
|
326
|
+
|
|
327
|
+
```sh
|
|
328
|
+
taskchef dashboard
|
|
329
|
+
taskchef dashboard --port 3211
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
The loopback dashboard watches `tasks.jsonl`, groups current states, and opens
|
|
333
|
+
linked Codex tasks. List snapshots and SSE events carry only the latest
|
|
334
|
+
request/result pair; opening task details fetches the full newest-first activity
|
|
335
|
+
timeline, including clearly labeled interrupted turns.
|
|
336
|
+
Task details offer infrequent administrative actions without cluttering task
|
|
337
|
+
cards. Selecting **More task actions** (`…`) reveals the action list immediately
|
|
338
|
+
beside the disclosure and changes it to a back/hide control. The list contains
|
|
339
|
+
**Copy Task ID** and direct **Mark completed** and **Mark failed** actions.
|
|
340
|
+
Working and needs-input tasks offer either terminal outcome; completed tasks
|
|
341
|
+
offer **Mark failed**, and failed tasks offer **Mark completed**. The menu
|
|
342
|
+
disclosure is the deliberate first step; choosing an outcome submits it
|
|
343
|
+
immediately without a second confirmation. There is no
|
|
344
|
+
free-form reason: the audit turn records a fixed summary, timestamp, dashboard
|
|
345
|
+
provenance, optimistic preconditions, and a unique action ID while preserving
|
|
346
|
+
every executor turn. Same-state terminal rewrites remain invalid. Stale or
|
|
347
|
+
concurrent changes are rejected and the dialog refreshes to the current task. A stalled
|
|
348
|
+
local request is aborted after a bounded wait so the dialog cannot remain
|
|
349
|
+
permanently locked; retry keeps the same idempotency identity.
|
|
350
|
+
|
|
351
|
+
The archive implementation is retained behind a disabled capability gate, and
|
|
352
|
+
the **Archive chat** control is hidden. The bundled `codex archive` command can
|
|
353
|
+
reject a valid idle desktop-app thread even when the dashboard runs in the MCP
|
|
354
|
+
host environment, while Codex's native app archive operation succeeds. TaskChef
|
|
355
|
+
will keep the feature disabled until Codex exposes a reliable supported
|
|
356
|
+
app-callable archive interface or guarantees CLI compatibility. The dormant
|
|
357
|
+
server path also rejects requests before discovering or invoking the CLI.
|
|
358
|
+
|
|
359
|
+
Task details also show whole-task and per-turn token usage when `ccusage` can
|
|
360
|
+
map the linked Codex thread. A completed turn briefly shows “Calculating token
|
|
361
|
+
usage…” while TaskChef performs bounded deferred reconciliation, because
|
|
362
|
+
the terminal lifecycle callback precedes Codex's final output write. The
|
|
363
|
+
dashboard also preloads missing, interrupted, and retry-eligible usage in a
|
|
364
|
+
bounded background queue at startup, after task changes, and on a periodic
|
|
365
|
+
recovery pass; opening task details is not required to start collection. Historical
|
|
366
|
+
tasks may show a trustworthy task total while older turns remain “Token usage
|
|
367
|
+
unavailable” when no cumulative turn boundaries were recorded. Input, cached
|
|
368
|
+
input, output, reasoning, and total counts retain ccusage's categories. Dollar
|
|
369
|
+
figures are labeled API-equivalent estimates; provenance identifies the online
|
|
370
|
+
pricing request or offline fallback mode, and zero-priced unknown models show
|
|
371
|
+
cost unavailable rather than a misleading `$0.00`. Per-turn cost is also
|
|
372
|
+
unavailable when its cumulative boundaries used different ccusage versions or
|
|
373
|
+
pricing modes. TaskChef displays the cumulative estimate supplied by ccusage
|
|
374
|
+
without applying a separate model-family or cache-write coverage policy.
|
|
375
|
+
The same detail view reports lifecycle wall-clock elapsed time independently of
|
|
376
|
+
ccusage. Each terminal turn shows **Elapsed** from `startedAt` to
|
|
377
|
+
`result.updatedAt`; **Total reported work** sums only valid terminal-turn
|
|
378
|
+
durations, excluding idle gaps and unfinished work. A working turn shows live
|
|
379
|
+
**Elapsed so far** without contributing to the total. This is reported
|
|
380
|
+
wall-clock elapsed time, not model compute time, and malformed or reversed
|
|
381
|
+
timestamp ranges are shown as unavailable.
|
|
382
|
+
The header shows the running TaskChef package version reported by the same
|
|
383
|
+
bounded health identity used for compatible-listener checks.
|
|
384
|
+
The Settings page shows the ccusage version reported by the executable that
|
|
385
|
+
TaskChef resolves at runtime.
|
|
386
|
+
The canonical port is normally owned by a dashboard session process initialized
|
|
387
|
+
by the TaskChef MCP before its tool transport connects. MCP recovery reuses an
|
|
388
|
+
exact-compatible same-workspace dashboard and reports its actual launcher;
|
|
389
|
+
a foreground `taskchef dashboard` process is intentionally standalone so its
|
|
390
|
+
child commands cannot silently inherit an agent-shell sandbox.
|
|
391
|
+
Task and result times are relative through 29 days (with minute detail for the
|
|
392
|
+
first six hours), then use a locale-aware calendar date. Each time is a keyboard-
|
|
393
|
+
accessible toggle for its full locale-aware date and time, and one shared
|
|
394
|
+
30-second timer keeps relative labels current without reloading the page.
|
|
395
|
+
The Updates panel captures immutable event-time lifecycle notices. It identifies
|
|
396
|
+
them by task, turn when available, and lifecycle event rather than dashboard
|
|
397
|
+
revision, so reconnects and non-semantic rewrites do not replay a notice and a
|
|
398
|
+
later task state cannot rewrite an older notice. A notice remains readable if
|
|
399
|
+
its task disappears; selecting it then explains that current details are no
|
|
400
|
+
longer available.
|
|
401
|
+
Apart from an explicit manual state selection from the task-detail menu, it does not mutate
|
|
402
|
+
TaskChef data and prints its local URL. A foreground dashboard identifies
|
|
403
|
+
itself as `standalone`. An exact-current, healthy same-workspace listener with a
|
|
404
|
+
recognized `standalone`, `mcp`, or `session` launcher may be reused on the
|
|
405
|
+
canonical MCP port; ensure reports its actual launcher, and only `session`
|
|
406
|
+
listeners register Codex PID leases. If an unknown, malformed, or
|
|
407
|
+
different-workspace process owns port 3210, TaskChef reports a concise conflict
|
|
408
|
+
and never kills that process. A recognized older same-workspace TaskChef
|
|
409
|
+
listener receives a simple guarded graceful shutdown request. If it lacks the
|
|
410
|
+
compatible callback or refuses the request, it remains running and ensure
|
|
411
|
+
reports a conflict. The foreground CLI similarly asks you to stop a conflicting
|
|
412
|
+
listener or choose another `--port`.
|
|
413
|
+
|
|
414
|
+
The health endpoint contains only a fixed service marker, health schema,
|
|
415
|
+
TaskChef version, dashboard-server version, canonical workspace, and launcher.
|
|
416
|
+
It exposes no task data, credentials, environment variables, process control,
|
|
417
|
+
or secrets.
|
|
418
|
+
|
|
419
|
+

|
|
420
|
+
|
|
421
|
+

|
|
422
|
+
|
|
423
|
+

|
|
424
|
+
|
|
425
|
+

|
|
426
|
+
|
|
427
|
+

|
|
428
|
+
|
|
429
|
+
## Common recovery
|
|
430
|
+
|
|
431
|
+
Check the managed workspace:
|
|
432
|
+
|
|
433
|
+
```sh
|
|
434
|
+
taskchef doctor
|
|
435
|
+
taskchef workspace init
|
|
436
|
+
taskchef workspace migrate
|
|
437
|
+
taskchef doctor
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
`doctor` is read-only. `workspace init` creates missing files and refreshes
|
|
441
|
+
managed instructions. `workspace migrate` explicitly upgrades supported schema
|
|
442
|
+
4-9 task lines to schema 10 under the workspace lock. It validates task and turn
|
|
443
|
+
counts plus the complete source and converted log before writing, creates an
|
|
444
|
+
exclusive `tasks.jsonl.pre-v10-*.bak`
|
|
445
|
+
backup, atomically replaces the log, validates the result, and becomes an
|
|
446
|
+
idempotent no-op after migration. If replacement fails, the original remains
|
|
447
|
+
or the reported backup can be restored; unsupported or invalid input is rejected
|
|
448
|
+
before a backup or rewrite.
|
|
449
|
+
|
|
450
|
+
If a new record has no thread ID, the executor is link-pending. Reopen that
|
|
451
|
+
executor so its first action can retry `link_task`. Do not guess an identity
|
|
452
|
+
or edit `tasks.jsonl`. If native task creation failed, the record is retained
|
|
453
|
+
as `failed` with a retained fallback `turnRef` and null thread and Codex turn IDs.
|
|
454
|
+
|
|
455
|
+
Schemas other than 4, 5, 6, 7, 8, 9, and 10 remain unsupported. Retain such a workspace
|
|
456
|
+
unchanged and create a current workspace; the migration command deliberately
|
|
457
|
+
does not guess how to convert unknown formats.
|
|
458
|
+
|
|
459
|
+
## Boundaries
|
|
460
|
+
|
|
461
|
+
TaskChef dispatches; it is not a scheduler, supervisor, worker runtime, or
|
|
462
|
+
merge coordinator. Executor identity is a cooperative assertion inside a local
|
|
463
|
+
single-user trust boundary. The [specification](spec.md) defines the
|
|
464
|
+
required contract; [workflows](workflows.md) ties it to current code.
|
|
465
|
+
|
|
466
|
+
## Update
|
|
467
|
+
|
|
468
|
+
```sh
|
|
469
|
+
codex plugin marketplace upgrade favoyang-plugins
|
|
470
|
+
codex plugin add taskchef@favoyang-plugins
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
Replacing or installing plugin files cannot execute autostart by itself. After
|
|
474
|
+
installation, activate or reload the new TaskChef MCP process; installation
|
|
475
|
+
does not necessarily reload Codex. Then run `$taskchef-dashboard` (or call
|
|
476
|
+
`ensure_dashboard`) and verify the returned dashboard identity has all of:
|
|
477
|
+
|
|
478
|
+
- the expected released TaskChef version;
|
|
479
|
+
- the expected dashboard protocol `serverVersion`;
|
|
480
|
+
- the reported dashboard launcher (`session` for a newly started canonical dashboard);
|
|
481
|
+
- the canonical TaskChef workspace path;
|
|
482
|
+
- the canonical `http://127.0.0.1:3210/` URL.
|
|
483
|
+
|
|
484
|
+
The release-install sequence is therefore: install plugin, activate or reload
|
|
485
|
+
the new MCP process, ensure the dashboard, then verify TaskChef version,
|
|
486
|
+
protocol `serverVersion`, reported launcher, canonical workspace, and URL.
|
|
487
|
+
Exact-compatible same-workspace servers with a recognized launcher may be
|
|
488
|
+
reused; unknown listeners remain untouched.
|
|
489
|
+
|
|
490
|
+
If autostart reports a **verified older TaskChef** listener, the port occupant
|
|
491
|
+
passed the bounded TaskChef identity check but refused the simple graceful
|
|
492
|
+
shutdown request. Releases using the former HMAC control protocol form a
|
|
493
|
+
one-time compatibility boundary: stop that verified legacy TaskChef listener
|
|
494
|
+
through the application/session that launched it, then activate the installed
|
|
495
|
+
plugin and ensure again. Do not kill an arbitrary port owner.
|
|
496
|
+
|
|
497
|
+
## Development
|
|
498
|
+
|
|
499
|
+
```sh
|
|
500
|
+
npm ci
|
|
501
|
+
npm test
|
|
502
|
+
npm pack --dry-run
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
Merges to `main` run semantic-release and update the shared plugin
|
|
506
|
+
marketplace. Removing unsupported schemas is a major-version change.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/docs/spec.md
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
This is TaskChef's normative agent-facing contract. **MUST**, **MUST NOT**,
|
|
4
4
|
**SHOULD**, and **MAY** are requirements in the RFC 2119 sense. The
|
|
5
|
-
[
|
|
6
|
-
owns implementation walkthroughs; the
|
|
7
|
-
is dated research,
|
|
5
|
+
[advanced guide](advanced-guide.md) owns detailed user setup and operation;
|
|
6
|
+
[workflows](workflows.md) owns implementation walkthroughs; the
|
|
7
|
+
[FirstMate comparison](firstmate-taskchef-comparison.md) is dated research,
|
|
8
|
+
not contract.
|
|
8
9
|
|
|
9
10
|
## Terminology
|
|
10
11
|
|
package/docs/workflows.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This developer and advanced-agent guide explains how the current implementation
|
|
4
4
|
moves data through TaskChef. The [specification](spec.md) is normative; the
|
|
5
|
-
[
|
|
5
|
+
[advanced guide](advanced-guide.md) owns detailed user operation. The
|
|
6
6
|
[FirstMate comparison](firstmate-taskchef-comparison.md) is non-normative
|
|
7
7
|
research. The [dashboard lifecycle](dashboard-lifecycle.md) owns the focused
|
|
8
8
|
start, upgrade, shutdown, and security rationale.
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "taskchef",
|
|
3
|
-
"version": "8.5.
|
|
3
|
+
"version": "8.5.3",
|
|
4
4
|
"description": "A non-blocking interactive dispatcher for visible Codex tasks.",
|
|
5
|
-
"license": "
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
6
|
"author": "Favo Yang",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"assets",
|
|
24
24
|
"BACKLOG.md",
|
|
25
25
|
"bin",
|
|
26
|
+
"docs/advanced-guide.md",
|
|
26
27
|
"docs/spec.md",
|
|
27
28
|
"docs/workflows.md",
|
|
28
29
|
"docs/dashboard-lifecycle.md",
|
|
@@ -36,6 +37,11 @@
|
|
|
36
37
|
"docs/images/dashboard-token-pending.jpg",
|
|
37
38
|
"docs/images/reported-work-duration-desktop.jpg",
|
|
38
39
|
"docs/images/reported-work-duration-mobile.jpg",
|
|
40
|
+
"docs/images/readme-board.png",
|
|
41
|
+
"docs/images/readme-list.png",
|
|
42
|
+
"docs/images/readme-needs-input.png",
|
|
43
|
+
"docs/images/readme-completed.png",
|
|
44
|
+
"docs/images/readme-roles.png",
|
|
39
45
|
"index.js",
|
|
40
46
|
"mcp",
|
|
41
47
|
"scripts/roles",
|
|
@@ -94,6 +100,6 @@
|
|
|
94
100
|
"zod"
|
|
95
101
|
],
|
|
96
102
|
"optionalDependencies": {
|
|
97
|
-
"ccusage": "20.0.
|
|
103
|
+
"ccusage": "20.0.24"
|
|
98
104
|
}
|
|
99
105
|
}
|