taskchef 6.1.3 → 7.0.0
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 +1 -1
- package/BACKLOG.md +1 -1
- package/README.md +96 -454
- package/docs/firstmate-taskchef-comparison.md +277 -0
- package/docs/spec.md +246 -0
- package/docs/workflows.md +236 -0
- package/index.js +0 -2
- package/package.json +4 -3
- package/scripts/benchmark-dispatch-prepare.js +7 -7
- package/skills/taskchef-bootstrap/SKILL.md +7 -8
- package/skills/taskchef-delegate/SKILL.md +2 -9
- package/skills/taskchef-report/SKILL.md +4 -8
- package/src/cli.js +0 -21
- package/src/dashboard.js +1 -1
- package/src/delegation.js +4 -8
- package/src/github.js +0 -4
- package/src/mcp.js +5 -5
- package/src/workspace.js +26 -233
- package/SPEC.md +0 -107
- package/docs/delegation-design.md +0 -227
package/BACKLOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TaskChef backlog
|
|
2
2
|
|
|
3
|
-
`
|
|
3
|
+
[`docs/spec.md`](docs/spec.md) is the current contract. These ideas need a concrete user case and a
|
|
4
4
|
clear data model before implementation.
|
|
5
5
|
|
|
6
6
|
## Task history views
|
package/README.md
CHANGED
|
@@ -1,537 +1,179 @@
|
|
|
1
1
|
# TaskChef
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
If a request contains independent work for different projects, TaskChef can
|
|
9
|
-
open several tasks. It returns as soon as they are created, so you can send the
|
|
10
|
-
next request or open any executor and work with it directly.
|
|
11
|
-
|
|
12
|
-
## The mental model
|
|
13
|
-
|
|
14
|
-
- The **dispatcher workspace** is the per-user `~/.agents/taskchef` folder that
|
|
15
|
-
stores project routes and task history. A Codex task opened in this folder is the
|
|
16
|
-
**dispatcher**.
|
|
17
|
-
- A **configured project** is a local repository or folder where TaskChef may
|
|
18
|
-
send work.
|
|
19
|
-
- An **executor** is the normal Codex task that handles delegated work inside a
|
|
20
|
-
configured project.
|
|
21
|
-
- A **task entry** records what TaskChef delegated, which project it chose, and
|
|
22
|
-
the executor's Codex task ID.
|
|
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 keeps the latest compact
|
|
7
|
+
snapshot for navigation and reporting.
|
|
23
8
|
|
|
24
9
|
```text
|
|
25
|
-
request
|
|
26
|
-
|
|
|
27
|
-
+-- task entry --> executor in project A
|
|
28
|
-
+-- task entry --> executor in project B
|
|
10
|
+
request -> recorded TaskChef task -> Codex executor -> latest semantic result
|
|
29
11
|
```
|
|
30
12
|
|
|
31
|
-
|
|
32
|
-
their existing task entry. When you ask for a report, TaskChef filters old
|
|
33
|
-
terminal work and checks cheap live metadata once for every selected task.
|
|
34
|
-
Active or approval-waiting metadata overrides the cache immediately; idle MCP
|
|
35
|
-
results are trusted by default, with detailed reads reserved for anomalies.
|
|
13
|
+
## Which document should I read?
|
|
36
14
|
|
|
37
|
-
|
|
38
|
-
|
|
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 implementation flows and trust boundaries | [Workflows](docs/workflows.md) |
|
|
20
|
+
| Compare TaskChef with FirstMate | [FirstMate comparison research](docs/firstmate-taskchef-comparison.md) |
|
|
21
|
+
| Review deferred ideas | [Backlog](BACKLOG.md) |
|
|
39
22
|
|
|
40
|
-
##
|
|
23
|
+
## Install
|
|
41
24
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
You need Node.js 18 or newer, Git, and local access to each target project.
|
|
45
|
-
|
|
46
|
-
Add the [Favo Yang plugin marketplace](https://github.com/favoyang/codex-plugins)
|
|
47
|
-
and install TaskChef:
|
|
25
|
+
TaskChef requires Node.js 18 or newer, Git, Codex desktop, and local access to
|
|
26
|
+
the projects that will receive work.
|
|
48
27
|
|
|
49
28
|
```sh
|
|
50
29
|
codex plugin marketplace add favoyang/codex-plugins
|
|
51
30
|
codex plugin add taskchef@favoyang-plugins
|
|
31
|
+
npm install --global taskchef
|
|
52
32
|
```
|
|
53
33
|
|
|
54
|
-
|
|
55
|
-
|
|
34
|
+
The plugin provides three skills and a local MCP server. The npm installation
|
|
35
|
+
puts the `taskchef` CLI on `PATH`. TaskChef installs no hooks, schedules,
|
|
36
|
+
daemons, or background identity search.
|
|
56
37
|
|
|
57
|
-
|
|
38
|
+
## Bootstrap and configure
|
|
58
39
|
|
|
59
|
-
|
|
40
|
+
Ask the bootstrap skill to create the per-user dispatcher:
|
|
60
41
|
|
|
61
42
|
```text
|
|
62
43
|
$taskchef-bootstrap Set up TaskChef.
|
|
63
44
|
```
|
|
64
45
|
|
|
65
|
-
|
|
66
|
-
app when it is not already a saved local project, and creates:
|
|
67
|
-
|
|
68
|
-
```text
|
|
69
|
-
AGENTS.md
|
|
70
|
-
taskchef.json
|
|
71
|
-
tasks.jsonl
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
TaskChef scans eligible local Codex projects during setup and adds them to the
|
|
75
|
-
managed project list in `taskchef.json`.
|
|
76
|
-
|
|
77
|
-
`taskchef.json` defines the available routes. A project name or GitHub issue or
|
|
78
|
-
pull-request URL in your request is usually enough for TaskChef to choose the
|
|
79
|
-
right project. Each project's `githubRepos` field is a list. A managed
|
|
80
|
-
`*-workspace` project lists all child or sub-repositories there, so links into
|
|
81
|
-
any of them route to the workspace. If a project needs more context, extend its
|
|
82
|
-
optional `description` field with responsibilities and keywords that
|
|
83
|
-
distinguish it from nearby projects.
|
|
84
|
-
|
|
85
|
-
The generated `AGENTS.md` turns ordinary requests in the TaskChef project into
|
|
86
|
-
delegated work. From any other project, explicitly invoke `$taskchef-delegate`;
|
|
87
|
-
it uses the same configuration and task history.
|
|
88
|
-
|
|
89
|
-
### 3. Delegate the first task
|
|
90
|
-
|
|
91
|
-
Suppose bootstrap found a project named `payments-api`. This prompt delegates
|
|
92
|
-
one task to it:
|
|
46
|
+
The canonical workspace is `~/.agents/taskchef`. TaskChef owns only:
|
|
93
47
|
|
|
94
48
|
```text
|
|
95
|
-
|
|
49
|
+
AGENTS.md managed dispatcher instructions plus user additions
|
|
50
|
+
taskchef.json schema-2 configured projects and routing metadata
|
|
51
|
+
tasks.jsonl one schema-4 snapshot per task
|
|
96
52
|
```
|
|
97
53
|
|
|
98
|
-
|
|
99
|
-
or give the executor more instructions. The dispatcher is ready for another
|
|
100
|
-
request immediately.
|
|
101
|
-
|
|
102
|
-
The plugin's focused MCP tools prepare and record delegations directly in the
|
|
103
|
-
canonical workspace. They preserve TaskChef's lock and atomic-write guarantees
|
|
104
|
-
without shell quoting, stdin handling, temporary record files, or a separate
|
|
105
|
-
command-sandbox permission round trip.
|
|
106
|
-
|
|
107
|
-
## Everyday workflows
|
|
108
|
-
|
|
109
|
-
### Route work across projects
|
|
110
|
-
|
|
111
|
-
Suppose `storefront` is another configured project and owns the customer web
|
|
112
|
-
interface. These two changes do not depend on each other, so they can run in
|
|
113
|
-
separate tasks:
|
|
54
|
+
List or change routing targets conversationally:
|
|
114
55
|
|
|
115
56
|
```text
|
|
116
|
-
|
|
57
|
+
$taskchef-bootstrap List my configured TaskChef projects.
|
|
58
|
+
$taskchef-bootstrap Add /workspace/payments as payments. It owns authorization, capture, refunds, and retries.
|
|
117
59
|
```
|
|
118
60
|
|
|
119
|
-
|
|
120
|
-
coordination, keep them in one task instead of splitting them just because
|
|
121
|
-
they touch frontend and backend code. Multiple active executors may also use
|
|
122
|
-
the same project.
|
|
123
|
-
|
|
124
|
-
### Follow up on delegated work
|
|
125
|
-
|
|
126
|
-
Open an executor and prompt it like any other Codex task. Its thread is the
|
|
127
|
-
live source of truth for progress, questions, and results.
|
|
128
|
-
|
|
129
|
-
The dispatcher workspace keeps `tasks.jsonl`, one line per submitted
|
|
130
|
-
delegation. New tasks are appended. Later locked atomic updates may fill the
|
|
131
|
-
nullable thread ID and replace the task's latest status, summary, turn ID,
|
|
132
|
-
timestamp, and writer. There is no transition-event log.
|
|
61
|
+
Or use the CLI:
|
|
133
62
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
rendered Markdown. TaskChef records the marked delegation before executor
|
|
139
|
-
creation and returns immediately. The child calls `link_task` before substantive
|
|
140
|
-
work with its own durable native ID, never the parent/delegator or provisional
|
|
141
|
-
client ID. Failed or interrupted linking remains visibly pending and retryable.
|
|
142
|
-
|
|
143
|
-
### Ask for a live report
|
|
144
|
-
|
|
145
|
-
Ask the dispatcher when you want a current overview:
|
|
146
|
-
|
|
147
|
-
```text
|
|
148
|
-
Report on the work TaskChef has dispatched.
|
|
63
|
+
```sh
|
|
64
|
+
taskchef project add /workspace/payments --name payments \
|
|
65
|
+
--description "Authorization, capture, refunds, and retries."
|
|
66
|
+
taskchef project list
|
|
149
67
|
```
|
|
150
68
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
in broad overviews. Active or approval-waiting tasks are reported directly from
|
|
156
|
-
the one broad metadata snapshot. Focused reports read a selected idle task once
|
|
157
|
-
when its metadata is newer than the callback; missing callbacks and other
|
|
158
|
-
anomalies also receive at most one targeted read. Reporting writes nothing and
|
|
159
|
-
never polls.
|
|
160
|
-
|
|
161
|
-
### Watch the local dashboard
|
|
162
|
-
|
|
163
|
-
Run a local dashboard when you want the task history to remain visible while
|
|
164
|
-
executors report results:
|
|
69
|
+
A project may advertise several GitHub repositories with repeated
|
|
70
|
+
`--github-repo`. TaskChef accepts Git roots and ordinary local folders on the
|
|
71
|
+
same execution host. Unsupported configuration schemas are rejected and are
|
|
72
|
+
never rewritten automatically.
|
|
165
73
|
|
|
166
|
-
|
|
167
|
-
taskchef dashboard
|
|
168
|
-
```
|
|
74
|
+
## Dispatch
|
|
169
75
|
|
|
170
|
-
Open the
|
|
171
|
-
same server can be open in the Codex in-app browser and an external browser at
|
|
172
|
-
the same time. Use `--port <number>` to choose another port and `--workspace
|
|
173
|
-
<path>` to override the normal workspace resolution. Press Ctrl+C in the
|
|
174
|
-
terminal to stop the server.
|
|
175
|
-
|
|
176
|
-
The dashboard:
|
|
177
|
-
|
|
178
|
-
- orders tasks by their latest semantic or identity update;
|
|
179
|
-
- filters by project, status, and latest update window (24 hours, 7 days, or
|
|
180
|
-
all time);
|
|
181
|
-
- shows dismissible notifications when tasks are added or changed;
|
|
182
|
-
- reveals the original instruction, latest semantic result, and task metadata;
|
|
183
|
-
- opens the recorded task directly in Codex when it has a supported UUID thread
|
|
184
|
-
ID, with a project-opening fallback for unresolved or legacy identities.
|
|
185
|
-
|
|
186
|
-
The server binds only to the numeric IPv4 loopback interface and rejects
|
|
187
|
-
non-loopback configuration. It intentionally does not authenticate browser
|
|
188
|
-
sessions, so any local process or browser that can reach the port can read the
|
|
189
|
-
dashboard data. Keep the server running only while needed and do not expose it
|
|
190
|
-
through a proxy or tunnel. State-changing actions still require an exact Host
|
|
191
|
-
and same-origin request. The server validates the same task schema as the CLI,
|
|
192
|
-
retains its last valid snapshot if the log becomes invalid, and never writes
|
|
193
|
-
dispatcher-workspace files. It limits event
|
|
194
|
-
streams and disconnects slow clients instead of buffering snapshots without
|
|
195
|
-
bound. It watches the workspace directory
|
|
196
|
-
so TaskChef's atomic log replacement remains visible, uses a low-frequency file
|
|
197
|
-
metadata check to recover from missed watcher events, and streams snapshots to
|
|
198
|
-
the browser with automatic reconnect. To keep untrusted history from exhausting
|
|
199
|
-
the server or browser, the dashboard rejects logs above 16 MiB, histories above
|
|
200
|
-
2,000 tasks, and unusually large display fields while retaining the last valid
|
|
201
|
-
snapshot. The data CLI remains unaffected by these display limits.
|
|
202
|
-
|
|
203
|
-
Date windows advance while the page is open, even when the task file is idle.
|
|
204
|
-
They use persisted semantic/identity timestamps and identity changes observed by
|
|
205
|
-
the current server. Legacy schema-v1 identity resolutions did not record an
|
|
206
|
-
update timestamp, so after a dashboard restart those rare historical records
|
|
207
|
-
fall back to their creation time.
|
|
208
|
-
|
|
209
|
-
The dashboard uses Codex's registered `codex://threads/<thread-id>` desktop
|
|
210
|
-
route for direct navigation. A task-level refresh would require native Codex
|
|
211
|
-
metadata tools that are available to the report skill, not to a standalone
|
|
212
|
-
browser page. TaskChef also does not submit replies from the dashboard: `codex
|
|
213
|
-
resume <session> [prompt]` starts an interactive CLI session and may execute the
|
|
214
|
-
prompt immediately, rather than opening a reviewed draft in the desktop app.
|
|
215
|
-
Refresh and reply integrations remain deferred until Codex exposes supported
|
|
216
|
-
browser-facing contracts for those actions.
|
|
217
|
-
|
|
218
|
-
TaskChef task records do not contain model token usage, and the supported Codex
|
|
219
|
-
task metadata surface does not expose it to this local server. The dashboard
|
|
220
|
-
therefore does not estimate tokens or inspect private Codex session logs. Token
|
|
221
|
-
usage can be added later if Codex exposes a supported per-task usage field or
|
|
222
|
-
TaskChef executors begin reporting a structured usage value.
|
|
223
|
-
|
|
224
|
-
### Manage configured projects
|
|
225
|
-
|
|
226
|
-
Use `$taskchef-bootstrap` to scan local Codex projects and refresh the managed
|
|
227
|
-
list:
|
|
76
|
+
Open the TaskChef dispatcher project and ask for an outcome:
|
|
228
77
|
|
|
229
78
|
```text
|
|
230
|
-
|
|
79
|
+
In payments, fix duplicate charges after a retry, add a regression test, and report what changed.
|
|
231
80
|
```
|
|
232
81
|
|
|
233
|
-
|
|
234
|
-
it can fix safely:
|
|
82
|
+
From another project, invoke the delegation skill explicitly:
|
|
235
83
|
|
|
236
84
|
```text
|
|
237
|
-
$taskchef-
|
|
85
|
+
$taskchef-delegate In payments, add structured logs for failed retries and test them.
|
|
238
86
|
```
|
|
239
87
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
`githubRepos` array in an import. URLs are canonicalized and deduplicated.
|
|
88
|
+
TaskChef prepares a UUID and marker, persists the task before native creation,
|
|
89
|
+
creates the executor, and returns its task link. The executor reads its own
|
|
90
|
+
`CODEX_THREAD_ID` and self-links before substantive work. Independent
|
|
91
|
+
outcomes may become separate executors; dependent work should stay together.
|
|
245
92
|
|
|
246
|
-
|
|
247
|
-
project metadata that TaskChef used when it delegated the work.
|
|
93
|
+
## Work with and report executors
|
|
248
94
|
|
|
249
|
-
|
|
95
|
+
Open an executor as an ordinary Codex task. Each executor reports its latest
|
|
96
|
+
semantic outcome:
|
|
250
97
|
|
|
251
|
-
-
|
|
252
|
-
|
|
253
|
-
-
|
|
254
|
-
wait for them to finish.
|
|
255
|
-
- TaskChef routes only to projects on the same local execution host.
|
|
256
|
-
- Each task line contains the latest reported semantic result, not a complete
|
|
257
|
-
lifecycle or event history.
|
|
258
|
-
- TaskChef does not store executor transcripts, hidden reasoning, or `hostId`.
|
|
259
|
-
- A live report uses one metadata snapshot for all selected tasks and
|
|
260
|
-
immediately overrides active or approval-waiting state. Broad overviews stay
|
|
261
|
-
cache-first; focused reports read selected idle tasks once when metadata is
|
|
262
|
-
newer than the callback. Reporting never persists inferred live state.
|
|
98
|
+
- `completed`: the requested outcome is complete.
|
|
99
|
+
- `needs_input`: a real user decision or missing fact blocks progress.
|
|
100
|
+
- `failed`: execution or executor creation failed.
|
|
263
101
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
Refresh the marketplace snapshot, then reinstall TaskChef:
|
|
267
|
-
|
|
268
|
-
```sh
|
|
269
|
-
codex plugin marketplace upgrade favoyang-plugins
|
|
270
|
-
codex plugin add taskchef@favoyang-plugins
|
|
271
|
-
```
|
|
102
|
+
A native approval prompt is live Codex state, not `needs_input`. TaskChef
|
|
103
|
+
stores a concise summary, never a transcript or hidden reasoning.
|
|
272
104
|
|
|
273
|
-
|
|
105
|
+
Ask for a current report:
|
|
274
106
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
- `$taskchef-bootstrap` initializes, diagnoses, and configures a workspace
|
|
278
|
-
- `$taskchef-delegate` routes requests and creates executor tasks
|
|
279
|
-
- `$taskchef-report` reads the task history and reports live executor state once
|
|
280
|
-
|
|
281
|
-
Normal delegation uses the plugin's bundled MCP tools. The bootstrap and report
|
|
282
|
-
skills continue to call the CLI for deterministic workspace administration,
|
|
283
|
-
task-history reads, and later recovery. The same CLI is also available for
|
|
284
|
-
direct inspection, benchmarking, and manual operations over the shared
|
|
285
|
-
workspace logic. Run it once with `npx` if you do not want a global installation:
|
|
286
|
-
|
|
287
|
-
```sh
|
|
288
|
-
npx taskchef help
|
|
107
|
+
```text
|
|
108
|
+
Report on the work TaskChef has dispatched.
|
|
289
109
|
```
|
|
290
110
|
|
|
291
|
-
|
|
111
|
+
The reporting skill combines cached semantic results with one bounded live
|
|
112
|
+
metadata snapshot. It does not poll or write inferred status. File-backed
|
|
113
|
+
inspection is also available:
|
|
292
114
|
|
|
293
115
|
```sh
|
|
294
|
-
npm install --global taskchef
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
The npm package provides the data CLI. The Codex plugin provides the skills and
|
|
298
|
-
focused MCP tools used during delegation; native Codex tools still create and
|
|
299
|
-
inspect executor tasks. From a source checkout, use `node bin/taskchef.js`.
|
|
300
|
-
|
|
301
|
-
```text
|
|
302
|
-
taskchef help
|
|
303
|
-
taskchef doctor
|
|
304
|
-
taskchef workspace path
|
|
305
|
-
taskchef workspace init
|
|
306
|
-
taskchef project add <path>
|
|
307
|
-
taskchef project import [<file> | -]
|
|
308
|
-
taskchef project list
|
|
309
|
-
taskchef project remove <name>
|
|
310
|
-
taskchef dispatch prepare
|
|
311
|
-
taskchef task record
|
|
312
|
-
taskchef task resolve <task-id> --thread-id <thread-id>
|
|
313
|
-
taskchef task show <task-id-or-8-character-prefix>
|
|
314
116
|
taskchef task list
|
|
117
|
+
taskchef task list --project payments
|
|
118
|
+
taskchef task show c0f010ff
|
|
315
119
|
taskchef task summary
|
|
316
120
|
```
|
|
317
121
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
environment override must be absolute (or start with `~/`) so plugin processes
|
|
321
|
-
with different working directories resolve the same workspace. The current
|
|
322
|
-
directory is never an implicit workspace. Data commands use concise
|
|
323
|
-
human-readable output by default and accept `--json` for machine-readable
|
|
324
|
-
output. Run `taskchef help` for every option.
|
|
325
|
-
|
|
326
|
-
`taskchef dispatch prepare --json` is the CLI equivalent of the MCP
|
|
327
|
-
`prepare_dispatch` operation: it resolves the canonical workspace, loads and
|
|
328
|
-
validates configured projects, and returns a generated task UUID, preparation
|
|
329
|
-
timestamp, and exact correlation marker. Normal delegation calls the MCP tool;
|
|
330
|
-
the CLI command remains useful for diagnostics and benchmarks. `task record`
|
|
331
|
-
accepts one JSON value only from closed, non-interactive standard input and is
|
|
332
|
-
intended for manual recovery or direct CLI use, not the skill's normal
|
|
333
|
-
recording path.
|
|
334
|
-
|
|
335
|
-
For repeatable live delegation measurements, run
|
|
336
|
-
`npm run benchmark:e2e -- write`. It reads one non-interactive JSON value,
|
|
337
|
-
validates a stable schema, derives durations and summary totals, and writes a
|
|
338
|
-
timestamped result under the supplied output directory (default:
|
|
339
|
-
`reports/e2e-benchmarks`). Use `validate <file>` to verify a saved result and
|
|
340
|
-
`clean [directory]` to remove only prior TaskChef end-to-end result JSON files.
|
|
341
|
-
Start from `assets/e2e-benchmark-example.json`; the strict schema records the
|
|
342
|
-
record-before-create order, provisional client ID, executor self-link, rejected
|
|
343
|
-
parent identity, needs-input callback, fresh follow-up turn, final result, and
|
|
344
|
-
exact dashboard deep link. The writer stamps `taskchefVersion` from its own
|
|
345
|
-
package; saved files retain that version for historical validation.
|
|
346
|
-
|
|
347
|
-
### One-time upgrade from an older workspace
|
|
348
|
-
|
|
349
|
-
TaskChef 5 does not include a general migration command. For a one-time upgrade,
|
|
350
|
-
stop delegating and validate the old workspace. Then perform this one-time copy
|
|
351
|
-
only when the destination does not already exist:
|
|
352
|
-
|
|
353
|
-
```sh
|
|
354
|
-
set -eu
|
|
355
|
-
old_workspace=/path/to/old-taskchef-workspace
|
|
356
|
-
new_workspace="$HOME/.agents/taskchef"
|
|
357
|
-
backup_workspace="$old_workspace.pre-taskchef-5-backup"
|
|
358
|
-
if [ -e "$new_workspace" ]; then
|
|
359
|
-
printf '%s\n' "Refusing to overwrite existing destination: $new_workspace" >&2
|
|
360
|
-
exit 1
|
|
361
|
-
fi
|
|
362
|
-
if [ -e "$backup_workspace" ]; then
|
|
363
|
-
printf '%s\n' "Refusing to overwrite existing backup: $backup_workspace" >&2
|
|
364
|
-
exit 1
|
|
365
|
-
fi
|
|
366
|
-
taskchef doctor --workspace "$old_workspace"
|
|
367
|
-
cp -pR "$old_workspace" "$backup_workspace"
|
|
368
|
-
install -d -m 700 "$new_workspace"
|
|
369
|
-
install -m 600 "$old_workspace/AGENTS.md" "$new_workspace/AGENTS.md"
|
|
370
|
-
install -m 600 "$old_workspace/taskchef.json" "$new_workspace/taskchef.json"
|
|
371
|
-
install -m 600 "$old_workspace/tasks.jsonl" "$new_workspace/tasks.jsonl"
|
|
372
|
-
taskchef workspace init --workspace "$new_workspace" --register-codex
|
|
373
|
-
taskchef doctor --workspace "$new_workspace"
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
Keep the backup and old saved Codex project until `project list`, `task list`,
|
|
377
|
-
and `doctor` confirm the expected project and task counts. Do not merge several
|
|
378
|
-
histories by hand; conflicting task or thread IDs require case-by-case review.
|
|
122
|
+
Add `--json` for structured output. `task show` accepts a full task UUID or
|
|
123
|
+
an unambiguous eight-character prefix.
|
|
379
124
|
|
|
380
|
-
|
|
125
|
+
## Dashboard
|
|
381
126
|
|
|
382
127
|
```sh
|
|
383
|
-
taskchef
|
|
384
|
-
taskchef doctor
|
|
385
|
-
|
|
386
|
-
taskchef project add /workspace/payments \
|
|
387
|
-
--name payments \
|
|
388
|
-
--description "Owns payment authorization, capture, and refunds." \
|
|
389
|
-
--github-repo https://github.com/example/payments-api \
|
|
390
|
-
--github-repo https://github.com/example/payments-sdk
|
|
391
|
-
|
|
392
|
-
taskchef project list
|
|
393
|
-
taskchef project remove payments
|
|
128
|
+
taskchef dashboard
|
|
394
129
|
```
|
|
395
130
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
leave the repeated name, kind, and path columns blank. A project without a
|
|
399
|
-
configured repository has one row containing `-` in the repository column:
|
|
131
|
+
The loopback dashboard watches `tasks.jsonl`, groups current states, and opens
|
|
132
|
+
linked Codex tasks. It does not mutate TaskChef data and prints its local URL.
|
|
400
133
|
|
|
401
|
-
|
|
402
|
-
NAME KIND GITHUB REPOSITORY PATH
|
|
403
|
-
notes folder - /workspace/notes
|
|
404
|
-
payments git https://github.com/example/payments-api /workspace/payments
|
|
405
|
-
https://github.com/example/payments-sdk
|
|
406
|
-
```
|
|
134
|
+
## Common recovery
|
|
407
135
|
|
|
408
|
-
|
|
136
|
+
Check the managed workspace:
|
|
409
137
|
|
|
410
138
|
```sh
|
|
411
|
-
taskchef
|
|
412
|
-
taskchef
|
|
139
|
+
taskchef doctor
|
|
140
|
+
taskchef workspace init
|
|
141
|
+
taskchef doctor
|
|
413
142
|
```
|
|
414
143
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
The current configuration schema is version 2. Version 1 remains readable:
|
|
420
|
-
legacy `githubRepo: null` normalizes to `githubRepos: []`, and a legacy string
|
|
421
|
-
normalizes to a one-item `githubRepos` list. `workspace init` persists this
|
|
422
|
-
migration atomically; other configuration writes also emit version 2. Legacy
|
|
423
|
-
task lines remain readable without an eager rewrite of the JSONL history.
|
|
144
|
+
`doctor` is read-only. `workspace init` creates missing current-schema files
|
|
145
|
+
and refreshes managed instructions; it does not migrate unsupported
|
|
146
|
+
configuration or task records.
|
|
424
147
|
|
|
425
|
-
|
|
148
|
+
If a new record has no thread ID, the executor is link-pending. Reopen that
|
|
149
|
+
executor so its first action can retry `link_task`. Do not guess an identity
|
|
150
|
+
or edit `tasks.jsonl`. If native task creation failed, the record is retained
|
|
151
|
+
as `failed` with null thread and turn IDs.
|
|
426
152
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
```sh
|
|
431
|
-
printf '%s\n' '{"id":"c0f010ff-84f2-4838-a69d-0ff1f5d721d7","project":"/workspace/payments","title":"Add retry logs","instruction":"<!-- taskchef_id=c0f010ff-84f2-4838-a69d-0ff1f5d721d7 -->\n\nThis task owns the delegated assignment. Execute it in this task; do not re-dispatch it merely because it concerns TaskChef or a configured project. Explicit requests to delegate separate work remain valid.\n\nBefore any other work, read this executor's own durable Codex thread ID from the current task's CODEX_THREAD_ID environment value and call the TaskChef link_task MCP tool with that thread ID and the marked TaskChef task ID. Never use CODEX_SESSION_ID or the parent or delegator thread ID. If linking fails, CODEX_THREAD_ID is unavailable, or the tool is unavailable, report the failure visibly and retry on a later turn; do not guess an identity or continue substantive work while the task is link-pending.\n\nBefore ending, call the TaskChef report_result MCP tool with the marked task ID, this executor's self-linked thread ID, the current turn ID from an exact native read of that same thread, completed, needs_input, or failed, and a concise summary. Never reuse a prior turn ID after a follow-up. Use needs_input only for a semantic decision or information the user must provide; a native approval prompt is live Codex state, not a TaskChef result. Do not include secrets, transcripts, or raw command output.\n\nAdd structured logs for failed retries and test them.","threadId":null}' |
|
|
432
|
-
taskchef task record --json
|
|
433
|
-
```
|
|
153
|
+
If an unsupported workspace must be retained, keep it as a backup and create a
|
|
154
|
+
new current workspace. TaskChef provides no conversion or merge command.
|
|
434
155
|
|
|
435
|
-
|
|
436
|
-
may use the CLI operation below after verifying one exact structured marker
|
|
437
|
-
match. Schema 4 self-linking records reject this command:
|
|
156
|
+
## Boundaries
|
|
438
157
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
158
|
+
TaskChef dispatches; it is not a scheduler, supervisor, worker runtime, or
|
|
159
|
+
merge coordinator. Executor identity is a cooperative assertion inside a local
|
|
160
|
+
single-user trust boundary. The [specification](docs/spec.md) defines the
|
|
161
|
+
required contract; [workflows](docs/workflows.md) ties it to current code.
|
|
443
162
|
|
|
444
|
-
|
|
163
|
+
## Update
|
|
445
164
|
|
|
446
165
|
```sh
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
taskchef task list
|
|
450
|
-
taskchef task list --project payments
|
|
451
|
-
taskchef task list --ascending
|
|
452
|
-
taskchef task list --full-id
|
|
453
|
-
taskchef task summary
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
Human-readable task listings include both the task ID and Codex thread ID.
|
|
457
|
-
UUID-shaped IDs use their first eight-character section by default; pass
|
|
458
|
-
`--full-id` to show both IDs in full. Null thread IDs appear as `-`, consistent
|
|
459
|
-
with other empty table cells. Tasks are newest-first by default; pass
|
|
460
|
-
`--ascending` to list them from oldest to newest. ID formatting does not alter
|
|
461
|
-
the complete values in `--json` output, and the selected order applies to its
|
|
462
|
-
`tasks` array.
|
|
463
|
-
|
|
464
|
-
`task show` accepts either the full task ID or the exact eight-character task
|
|
465
|
-
ID printed by the default human-readable list. A short ID must identify exactly
|
|
466
|
-
one recorded task; use `task list --full-id` when a short ID is missing or
|
|
467
|
-
ambiguous. Its default output labels the title, project, latest result fields,
|
|
468
|
-
creation and update times, task/thread/turn IDs, and instruction. A null thread ID appears as
|
|
469
|
-
`-`. Line breaks in labeled values are escaped as `\\r` and `\\n`, while
|
|
470
|
-
multiline instructions retain their original line breaks and indentation. Pass
|
|
471
|
-
`--json` to receive the unchanged complete task object.
|
|
472
|
-
|
|
473
|
-
```text
|
|
474
|
-
Title: Add retry logs
|
|
475
|
-
Project: payments
|
|
476
|
-
Status: completed
|
|
477
|
-
Summary: Added structured retry logs and regression coverage.
|
|
478
|
-
Project path: /workspace/payments
|
|
479
|
-
Created: 2026-08-12T10:00:00.000Z
|
|
480
|
-
Updated: 2026-08-12T10:08:00.000Z
|
|
481
|
-
Updated by: mcp
|
|
482
|
-
Task ID: c0f010ff-84f2-4838-a69d-0ff1f5d721d7
|
|
483
|
-
Thread ID: 019f9d46-f42c-7482-9707-3c107bf241ee
|
|
484
|
-
Turn ID: 019f9d47-f42c-7482-9707-3c107bf241ef
|
|
485
|
-
Instruction:
|
|
486
|
-
<!-- taskchef_id=c0f010ff-84f2-4838-a69d-0ff1f5d721d7 -->
|
|
487
|
-
|
|
488
|
-
This task owns the delegated assignment. Execute it in this task; do not re-dispatch it merely because it concerns TaskChef or a configured project. Explicit requests to delegate separate work remain valid.
|
|
489
|
-
|
|
490
|
-
Before any other work, read this executor's own durable Codex thread ID from the current task's CODEX_THREAD_ID environment value and call the TaskChef link_task MCP tool with that thread ID and the marked TaskChef task ID. Never use CODEX_SESSION_ID or the parent or delegator thread ID. If linking fails, CODEX_THREAD_ID is unavailable, or the tool is unavailable, report the failure visibly and retry on a later turn; do not guess an identity or continue substantive work while the task is link-pending.
|
|
491
|
-
|
|
492
|
-
Before ending, call the TaskChef report_result MCP tool with the marked task ID, this executor's self-linked thread ID, the current turn ID from an exact native read of that same thread, completed, needs_input, or failed, and a concise summary. Never reuse a prior turn ID after a follow-up. Use needs_input only for a semantic decision or information the user must provide; a native approval prompt is live Codex state, not a TaskChef result. Do not include secrets, transcripts, or raw command output.
|
|
493
|
-
|
|
494
|
-
Add structured logs for failed payment retries and test them.
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
The list remains a compact table:
|
|
498
|
-
|
|
499
|
-
```text
|
|
500
|
-
TITLE PROJECT STATUS UPDATED ID THREAD ID
|
|
501
|
-
Add retry logs payments completed 2026-08-12T10:08:00.000Z c0f010ff 019f9d46
|
|
166
|
+
codex plugin marketplace upgrade favoyang-plugins
|
|
167
|
+
codex plugin add taskchef@favoyang-plugins
|
|
502
168
|
```
|
|
503
169
|
|
|
504
|
-
|
|
505
|
-
workflow, writer boundaries, and freshness rules are in
|
|
506
|
-
[Delegation design](docs/delegation-design.md). Deferred ideas are in
|
|
507
|
-
[BACKLOG.md](BACKLOG.md).
|
|
508
|
-
|
|
509
|
-
## Development and release
|
|
510
|
-
|
|
511
|
-
This executor self-linking redesign removes post-creation discovery and hooks.
|
|
512
|
-
It requires a major release. Library callers migrating from TaskChef 5.x should
|
|
513
|
-
remove thread-list/read, checkpoint, timeout, and `resolveRecordedTask`
|
|
514
|
-
arguments. Provide `recordTask` before creation and optionally
|
|
515
|
-
`reportRecordedResult` for creation failure. Creation errors expose
|
|
516
|
-
`taskChefTaskId` and `taskChefResultReporting` for bounded recovery.
|
|
170
|
+
## Development
|
|
517
171
|
|
|
518
172
|
```sh
|
|
173
|
+
npm ci
|
|
519
174
|
npm test
|
|
520
175
|
npm pack --dry-run
|
|
521
|
-
npx -y -p semantic-release@25 -p @semantic-release/exec -p @semantic-release/git semantic-release --dry-run
|
|
522
|
-
```
|
|
523
|
-
|
|
524
|
-
The `Release` GitHub Actions workflow runs semantic-release on `main`.
|
|
525
|
-
Semantic Commit Messages determine the release type:
|
|
526
|
-
|
|
527
|
-
```text
|
|
528
|
-
fix: correct task log validation
|
|
529
|
-
feat: add a new CLI command
|
|
530
|
-
feat!: change the workspace data contract
|
|
531
176
|
```
|
|
532
177
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
GitHub release, and pins the TaskChef entry in `favoyang/codex-plugins` to the
|
|
536
|
-
published npm version. Marketplace updates use the `MARKETPLACE_DEPLOY_KEY`
|
|
537
|
-
Actions secret, a write-enabled deploy key scoped to the catalog repository.
|
|
178
|
+
Merges to `main` run semantic-release and update the shared plugin
|
|
179
|
+
marketplace. Removing unsupported schemas is a major-version change.
|