taskchef 2.0.0 → 3.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 +3 -3
- package/BACKLOG.md +35 -82
- package/README.md +211 -108
- package/SPEC.md +114 -246
- package/assets/taskchef-dispatcher-instructions.md +3 -2
- package/index.js +2 -5
- package/package.json +6 -2
- package/skills/taskchef-bootstrap/SKILL.md +11 -11
- package/skills/taskchef-delegate/SKILL.md +16 -18
- package/skills/taskchef-report/SKILL.md +38 -0
- package/skills/taskchef-report/agents/openai.yaml +4 -0
- package/src/cli.js +26 -70
- package/src/workspace.js +315 -251
- package/skills/taskchef-reconcile/SKILL.md +0 -35
- package/skills/taskchef-reconcile/agents/openai.yaml +0 -4
package/SPEC.md
CHANGED
|
@@ -2,73 +2,56 @@
|
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
4
|
|
|
5
|
-
TaskChef is an interactive Codex dispatcher. It
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
TaskChef is an interactive Codex dispatcher. It routes independent assignments
|
|
6
|
+
to real Codex tasks in configured local projects, records each successful
|
|
7
|
+
delegation in an append-only task history, and returns immediately.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Codex tasks remain authoritative for their progress and results. TaskChef does
|
|
10
|
+
not maintain a second lifecycle database.
|
|
10
11
|
|
|
11
12
|
## Core behavior
|
|
12
13
|
|
|
13
|
-
1. The user
|
|
14
|
-
2. TaskChef
|
|
15
|
-
3.
|
|
16
|
-
|
|
17
|
-
4.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
8. When the user asks to refresh or fix outdated task states, TaskChef performs
|
|
25
|
-
one bounded reconciliation of active `running` and `blocked` threads.
|
|
26
|
-
9. Reconciliation updates each task's current status and result, then returns
|
|
27
|
-
control without waiting for future activity. Ordinary delegation does not
|
|
28
|
-
trigger reconciliation first.
|
|
29
|
-
|
|
30
|
-
Multiple ongoing tasks may target the same project.
|
|
14
|
+
1. The user submits a request in the dispatcher workspace.
|
|
15
|
+
2. TaskChef separates only outcomes that can proceed independently.
|
|
16
|
+
3. It selects each target using configured project metadata and validates the
|
|
17
|
+
selected local path.
|
|
18
|
+
4. It creates an independently openable Codex task in that project.
|
|
19
|
+
5. After creation returns a thread ID, it appends one task entry.
|
|
20
|
+
6. It returns without waiting for the executor.
|
|
21
|
+
7. When requested, TaskChef can read task entries, query the relevant Codex
|
|
22
|
+
tasks once, and present a live report without persisting the fetched state.
|
|
23
|
+
|
|
24
|
+
Several active executors may target the same project.
|
|
31
25
|
|
|
32
26
|
## Workspace layout
|
|
33
27
|
|
|
34
28
|
```text
|
|
35
|
-
taskchef
|
|
29
|
+
taskchef/
|
|
36
30
|
├── AGENTS.md
|
|
37
31
|
├── taskchef.json
|
|
38
|
-
└── tasks
|
|
39
|
-
└── <task-id>/
|
|
40
|
-
└── task.json
|
|
32
|
+
└── tasks.jsonl
|
|
41
33
|
```
|
|
42
34
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
## Dispatcher instructions
|
|
35
|
+
`AGENTS.md` contains a marked block that routes setup and administration to
|
|
36
|
+
`$taskchef-bootstrap`, actionable work to `$taskchef-delegate`, and explicit
|
|
37
|
+
live report requests to `$taskchef-report`. Bootstrap preserves unrelated
|
|
38
|
+
instructions and refreshes only the managed block.
|
|
48
39
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
40
|
+
`workspace init` is idempotent. It creates an empty configuration and task
|
|
41
|
+
log when missing, refreshes managed instructions, removes legacy TaskChef skill
|
|
42
|
+
symlinks, and migrates legacy task records that contain executor thread IDs.
|
|
43
|
+
It stops on a legacy pending record with no thread ID rather than discarding
|
|
44
|
+
that record. If a legacy record refers to a project that was removed from the
|
|
45
|
+
configuration, migration reconstructs its project snapshot from the existing
|
|
46
|
+
local project path.
|
|
54
47
|
|
|
55
|
-
`
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
or duplicate TaskChef markers fail safely instead of overwriting the file.
|
|
59
|
-
The installed TaskChef plugin provides all three skills outside the dispatcher
|
|
60
|
-
workspace. Initialization is idempotent, takes no configuration input, creates
|
|
61
|
-
`{ "schemaVersion": 1, "projects": [] }` when configuration is missing, and
|
|
62
|
-
preserves existing configured projects. It removes only the three legacy
|
|
63
|
-
TaskChef skill symlinks from earlier workspaces and preserves unrelated
|
|
64
|
-
`.agents` content.
|
|
48
|
+
`doctor` validates configuration, project paths, the JSONL log, managed
|
|
49
|
+
instructions, and the absence of legacy workspace structures without modifying
|
|
50
|
+
the workspace.
|
|
65
51
|
|
|
66
|
-
|
|
67
|
-
paths, and task records without modifying the workspace.
|
|
52
|
+
## Project configuration
|
|
68
53
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
`taskchef.json` is the only user-facing configuration file.
|
|
54
|
+
`taskchef.json` is the user-facing routing configuration:
|
|
72
55
|
|
|
73
56
|
```json
|
|
74
57
|
{
|
|
@@ -79,7 +62,7 @@ paths, and task records without modifying the workspace.
|
|
|
79
62
|
"path": "/workspace/payments-api",
|
|
80
63
|
"isGitRepository": true,
|
|
81
64
|
"githubRepo": "https://github.com/example/payments-api",
|
|
82
|
-
"description": "Owns payment authorization, capture, refunds, and provider integrations.
|
|
65
|
+
"description": "Owns payment authorization, capture, refunds, and provider integrations."
|
|
83
66
|
},
|
|
84
67
|
{
|
|
85
68
|
"name": "local-data-tools",
|
|
@@ -92,220 +75,105 @@ paths, and task records without modifying the workspace.
|
|
|
92
75
|
```
|
|
93
76
|
|
|
94
77
|
- `schemaVersion` identifies the configuration format.
|
|
95
|
-
- `projects` lists the local
|
|
96
|
-
- `name` is the unique human-readable project identity.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
- `isGitRepository`
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
- `githubRepo` is the canonical GitHub repository URL, or `null` when the
|
|
103
|
-
project has no canonical GitHub remote. It may be `null` for either Git or
|
|
104
|
-
non-Git projects.
|
|
105
|
-
- `description` is an optional semantic routing description. When present, it
|
|
106
|
-
explains the project's responsibilities and the kinds of requests that
|
|
107
|
-
should target it, similarly to a skill trigger description.
|
|
108
|
-
|
|
109
|
-
Project paths must exist, resolve to canonical directories, and match the
|
|
110
|
-
project selected for delegation. A Git project path must resolve to its exact
|
|
111
|
-
repository root. A non-Git project must use `githubRepo: null`. Names and paths
|
|
112
|
-
must be unique.
|
|
113
|
-
|
|
114
|
-
TaskChef classifies a requested outcome against `name`, `githubRepo`, and the
|
|
115
|
-
optional `description`. The path identifies the checkout but is not a
|
|
116
|
-
classification signal. A description should be specific enough to distinguish
|
|
117
|
-
the project from its neighbors; generic technology labels are insufficient.
|
|
118
|
-
TaskChef selects a project only when the metadata yields one clear match; it
|
|
119
|
-
asks the user when no project or several projects plausibly match. It must not
|
|
120
|
-
guess solely from a directory name.
|
|
121
|
-
|
|
122
|
-
Project configuration is managed through `project add`, `project import`,
|
|
123
|
-
`project list`, and `project remove`. Add and import detect Git status, exact
|
|
124
|
-
Git roots, and canonical GitHub origins. Import accepts a JSON array from a
|
|
125
|
-
file or stdin, merges by canonical path, and preserves an existing name or
|
|
126
|
-
description when omitted. `--replace` is the only replacement mode.
|
|
127
|
-
|
|
128
|
-
The configuration does not store dispatcher identity, project-to-task
|
|
129
|
-
assignments, execution modes, scheduling options, host information, or the
|
|
130
|
-
workspace path. The directory containing `taskchef.json` is the workspace, and
|
|
131
|
-
the currently open Codex task is the dispatcher.
|
|
132
|
-
|
|
133
|
-
## Task record
|
|
134
|
-
|
|
135
|
-
Each independent assignment has one `tasks/<task-id>/task.json` file.
|
|
136
|
-
|
|
137
|
-
```json
|
|
138
|
-
{
|
|
139
|
-
"schemaVersion": 1,
|
|
140
|
-
"id": "t1-echo-input-20260808",
|
|
141
|
-
"project": "/workspace/t1",
|
|
142
|
-
"title": "Echo user input",
|
|
143
|
-
"instruction": "Create echo_input.py so it reads one line from standard input and echoes it exactly. Test the script and report the result.",
|
|
144
|
-
"status": "finished",
|
|
145
|
-
"threadId": "019f9d46-f42c-7482-9707-3c107bf241ee",
|
|
146
|
-
"result": {
|
|
147
|
-
"message": "Created and tested echo_input.py.",
|
|
148
|
-
"githubPRs": [],
|
|
149
|
-
"githubIssues": []
|
|
150
|
-
},
|
|
151
|
-
"createdAt": "2026-08-08T10:00:00.000Z",
|
|
152
|
-
"updatedAt": "2026-08-08T10:05:00.000Z"
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Fields
|
|
157
|
-
|
|
158
|
-
- `schemaVersion`: task format version.
|
|
159
|
-
- `id`: stable TaskChef task identifier.
|
|
160
|
-
- `project`: exact configured project directory.
|
|
161
|
-
- `title`: short human-readable task name.
|
|
162
|
-
- `instruction`: complete task-specific instruction.
|
|
163
|
-
- `status`: current reconciled lifecycle state.
|
|
164
|
-
- `threadId`: independently openable Codex task ID, or `null` while pending.
|
|
165
|
-
- `result`: latest meaningful report, or `null` when none exists.
|
|
166
|
-
- `createdAt`: task creation time as an ISO 8601 timestamp.
|
|
167
|
-
- `updatedAt`: latest task update time as an ISO 8601 timestamp.
|
|
78
|
+
- `projects` lists the local routing targets.
|
|
79
|
+
- `name` is the unique human-readable project identity.
|
|
80
|
+
- `path` is the normalized, canonical local directory. A Git project must use
|
|
81
|
+
its repository root.
|
|
82
|
+
- `isGitRepository` identifies Git and non-Git projects.
|
|
83
|
+
- `githubRepo` is a canonical GitHub repository URL or `null`.
|
|
84
|
+
- `description` is optional routing context.
|
|
168
85
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
86
|
+
TaskChef classifies work against `name`, `githubRepo`, and `description`. The
|
|
87
|
+
path identifies the checkout but is not a routing hint. TaskChef asks the user
|
|
88
|
+
when metadata does not produce one clear match.
|
|
172
89
|
|
|
173
|
-
|
|
90
|
+
`project add` and `project import` detect Git status, exact Git roots, and
|
|
91
|
+
canonical GitHub origins. Import merges by canonical path and preserves an
|
|
92
|
+
existing name or description when omitted. `--replace` replaces the configured
|
|
93
|
+
set. Removing or replacing a project does not alter historical task
|
|
94
|
+
entries.
|
|
174
95
|
|
|
175
|
-
|
|
96
|
+
The configuration does not store dispatcher identity, execution modes,
|
|
97
|
+
schedules, task status, results, host information, or the workspace path.
|
|
176
98
|
|
|
177
|
-
|
|
178
|
-
- `running`: the executor thread exists and may be working.
|
|
179
|
-
- `blocked`: progress requires user input, permission, credentials, or another
|
|
180
|
-
external condition.
|
|
181
|
-
- `finished`: the executor concluded its current attempt and reported a result.
|
|
99
|
+
## Task entry
|
|
182
100
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
```text
|
|
186
|
-
pending → running → finished
|
|
187
|
-
↘ blocked → running
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
`finished` describes the executor lifecycle. It does not guarantee that the
|
|
191
|
-
goal was achieved. The result message explains success, partial completion,
|
|
192
|
-
failure, or uncertainty. A finished task returns to `running` if the user gives
|
|
193
|
-
its thread more work.
|
|
194
|
-
|
|
195
|
-
## Result
|
|
196
|
-
|
|
197
|
-
`result` is `null` until there is a meaningful report.
|
|
101
|
+
`tasks.jsonl` contains one compact JSON object per line, in append order:
|
|
198
102
|
|
|
199
103
|
```json
|
|
200
|
-
{
|
|
201
|
-
"result": null
|
|
202
|
-
}
|
|
104
|
+
{"schemaVersion":1,"id":"d1-retry-logs","project":{"name":"payments-api","path":"/workspace/payments-api","isGitRepository":true,"githubRepo":"https://github.com/example/payments-api","description":"Owns payment authorization, capture, refunds, and provider integrations."},"title":"Add payment retry logs","instruction":"Add structured logs for failed payment retries and test them.","threadId":"019f9d46-f42c-7482-9707-3c107bf241ee","createdAt":"2026-08-08T10:00:00.000Z"}
|
|
203
105
|
```
|
|
204
106
|
|
|
205
|
-
|
|
107
|
+
- `schemaVersion` identifies the task entry format.
|
|
108
|
+
- `id` is a unique TaskChef task identifier.
|
|
109
|
+
- `project` is the complete configured project snapshot used for routing.
|
|
110
|
+
- `title` is a short task name.
|
|
111
|
+
- `instruction` is the complete executor instruction.
|
|
112
|
+
- `threadId` identifies the created Codex task.
|
|
113
|
+
- `createdAt` is the dispatch time as an ISO 8601 timestamp.
|
|
206
114
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
"https://github.com/example/t1/pull/12"
|
|
213
|
-
],
|
|
214
|
-
"githubIssues": [
|
|
215
|
-
"https://github.com/example/t1/issues/8"
|
|
216
|
-
]
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
- `message` is a required concise outcome, progress report, or blocker.
|
|
222
|
-
- `githubPRs` is a list of canonical GitHub pull-request URLs.
|
|
223
|
-
- `githubIssues` is a list of canonical GitHub issue URLs.
|
|
115
|
+
Every entry has exactly these fields. IDs and thread IDs must be unique. The
|
|
116
|
+
file is empty or newline terminated, with no blank lines. TaskChef rejects a
|
|
117
|
+
malformed log instead of skipping bad entries. Writers replace the complete
|
|
118
|
+
validated file atomically under a workspace lock, so an interrupted write
|
|
119
|
+
leaves either the old history or the complete new history.
|
|
224
120
|
|
|
225
|
-
The
|
|
226
|
-
|
|
121
|
+
The project snapshot preserves the route even if the project is renamed,
|
|
122
|
+
moved, or removed later. Entries never contain status, result, transcript,
|
|
123
|
+
hidden reasoning, `hostId`, or update timestamps.
|
|
227
124
|
|
|
228
125
|
## Dispatch workflow
|
|
229
126
|
|
|
230
|
-
For each
|
|
231
|
-
|
|
232
|
-
1. classifies and validates the target against project metadata in
|
|
233
|
-
`taskchef.json`;
|
|
234
|
-
2. writes `task.json` with `status: pending`, `threadId: null`, and
|
|
235
|
-
`result: null`;
|
|
236
|
-
3. creates a real Codex task rooted at the exact project;
|
|
237
|
-
4. records its `threadId` and changes the status to `running`;
|
|
238
|
-
5. returns control after all requested tasks have been dispatched.
|
|
239
|
-
|
|
240
|
-
TaskChef does not wait for delegated tasks to finish.
|
|
241
|
-
|
|
242
|
-
## Reconciliation workflow
|
|
127
|
+
For each assignment, `$taskchef-delegate`:
|
|
243
128
|
|
|
244
|
-
|
|
245
|
-
|
|
129
|
+
1. loads and validates configured projects
|
|
130
|
+
2. selects one unambiguous target
|
|
131
|
+
3. creates a real Codex task at the exact configured path
|
|
132
|
+
4. appends a task entry only after receiving the task's thread ID
|
|
133
|
+
5. returns the created task link without reading or waiting for that task.
|
|
246
134
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
3. do not wait for future activity;
|
|
251
|
-
4. update `status`, `result`, and `updatedAt` from the current thread state;
|
|
252
|
-
5. report the concise current state and return control.
|
|
135
|
+
A failed executor creation produces no entry. If executor creation succeeds but
|
|
136
|
+
the append fails, the executor remains valid and TaskChef tells the user that
|
|
137
|
+
it was not recorded.
|
|
253
138
|
|
|
254
|
-
|
|
255
|
-
`task.json` is only the latest reconciled snapshot. It may still say `running`
|
|
256
|
-
after the executor has finished and until the user explicitly requests a
|
|
257
|
-
reconciliation pass.
|
|
139
|
+
## Task history and live reports
|
|
258
140
|
|
|
259
|
-
|
|
260
|
-
event cursor, event log, callback, or automatic workspace update.
|
|
261
|
-
Finished records are excluded from normal reconciliation. An explicit full
|
|
262
|
-
refresh uses `--include-finished` to detect a new attempt added directly to a
|
|
263
|
-
finished executor thread.
|
|
141
|
+
The CLI reads persisted history without contacting Codex:
|
|
264
142
|
|
|
265
|
-
|
|
143
|
+
- `task show <id>` returns one entry.
|
|
144
|
+
- `task list` returns entries in append order, optionally filtered by
|
|
145
|
+
historical project name or exact path.
|
|
146
|
+
- `task summary` returns the total and per-project counts.
|
|
266
147
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
not
|
|
148
|
+
When the user requests current state or outcomes, `$taskchef-report` loads the
|
|
149
|
+
relevant entries and queries every recorded Codex task exactly once, in batches
|
|
150
|
+
of no more than eight. It reports the snapshot and discards it. The report does
|
|
151
|
+
not update `tasks.jsonl`, poll, wait, or create a scheduled job.
|
|
271
152
|
|
|
272
153
|
## Boundaries
|
|
273
154
|
|
|
274
|
-
TaskChef
|
|
275
|
-
|
|
276
|
-
-
|
|
277
|
-
-
|
|
278
|
-
-
|
|
279
|
-
-
|
|
280
|
-
-
|
|
281
|
-
-
|
|
282
|
-
-
|
|
283
|
-
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
2. One request produces two task-specific `task.json` records.
|
|
300
|
-
3. Two independently openable Codex tasks are created in the correct projects.
|
|
301
|
-
4. Both `threadId` values are recorded.
|
|
302
|
-
5. The dispatcher returns without waiting for execution.
|
|
303
|
-
6. The user can open and prompt either delegated task directly.
|
|
304
|
-
7. A user request to refresh outdated states reconciles each active thread once
|
|
305
|
-
without reading finished executor threads; ordinary delegation does not.
|
|
306
|
-
8. Status and result snapshots are updated correctly.
|
|
307
|
-
9. Two ongoing tasks may target the same project without data collisions.
|
|
308
|
-
10. The workspace contains only dispatcher instructions, configuration, and
|
|
309
|
-
task records; the installed plugin owns the TaskChef skills.
|
|
310
|
-
11. Bootstrap creates or idempotently merges the TaskChef-managed `AGENTS.md`
|
|
311
|
-
block without overwriting unrelated instructions.
|
|
155
|
+
TaskChef does not include:
|
|
156
|
+
|
|
157
|
+
- lifecycle status or result persistence
|
|
158
|
+
- task callbacks, hooks, polling, daemons, heartbeats, or schedules
|
|
159
|
+
- arbitrary Codex task discovery
|
|
160
|
+
- remote hosts or `hostId` storage
|
|
161
|
+
- transcript or hidden-reasoning collection
|
|
162
|
+
- one-active-task-per-project restrictions
|
|
163
|
+
- batch cancellation or replay
|
|
164
|
+
- bundled development runtimes in dispatcher workspaces.
|
|
165
|
+
|
|
166
|
+
## Acceptance test
|
|
167
|
+
|
|
168
|
+
1. Bootstrap creates `AGENTS.md`, `taskchef.json`, and `tasks.jsonl`, then
|
|
169
|
+
remains idempotent.
|
|
170
|
+
2. Project metadata routes an unambiguous request to the correct local project.
|
|
171
|
+
3. A successful delegation creates a visible Codex task and appends its thread
|
|
172
|
+
ID with a project snapshot.
|
|
173
|
+
4. The dispatcher returns without waiting for execution.
|
|
174
|
+
5. Several independent assignments can create several entries, including
|
|
175
|
+
multiple entries for the same project.
|
|
176
|
+
6. Task history commands return deterministic entries and project counts.
|
|
177
|
+
7. A live report queries each relevant task once and writes nothing.
|
|
178
|
+
8. Malformed JSONL, duplicate IDs, duplicate thread IDs, and symlinked managed
|
|
179
|
+
files fail safely.
|
|
@@ -13,6 +13,7 @@ This repository is a TaskChef dispatcher workspace.
|
|
|
13
13
|
- Return immediately after dispatch, as required by `$taskchef-delegate`.
|
|
14
14
|
- Answer directly only when the user explicitly asks about TaskChef itself or
|
|
15
15
|
explicitly says not to delegate.
|
|
16
|
-
- Use `$taskchef-
|
|
17
|
-
|
|
16
|
+
- Use `$taskchef-report` only when the user asks for a live report about
|
|
17
|
+
delegated work. Reports query the recorded Codex tasks once and do not
|
|
18
|
+
write status or results to this workspace.
|
|
18
19
|
<!-- taskchef:dispatcher-instructions:end -->
|
package/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export {
|
|
2
2
|
addProject,
|
|
3
3
|
buildTaskSummary,
|
|
4
|
-
buildReconciliationCandidates,
|
|
5
4
|
canonicalDirectory,
|
|
6
5
|
canonicalGitRoot,
|
|
7
|
-
createTask,
|
|
8
6
|
doctorWorkspace,
|
|
9
7
|
ensureWorkspaceInstructions,
|
|
10
8
|
ensureWorkspaceSkills,
|
|
@@ -12,12 +10,11 @@ export {
|
|
|
12
10
|
importProjects,
|
|
13
11
|
initializeWorkspace,
|
|
14
12
|
listProjects,
|
|
15
|
-
listTasks,
|
|
16
13
|
readConfig,
|
|
14
|
+
listTasks,
|
|
17
15
|
readTask,
|
|
16
|
+
recordTask,
|
|
18
17
|
requireSafeId,
|
|
19
18
|
removeProject,
|
|
20
|
-
updateTask,
|
|
21
19
|
validateConfig,
|
|
22
|
-
validateResult,
|
|
23
20
|
} from "./src/workspace.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "taskchef",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "A non-blocking interactive dispatcher for visible Codex tasks.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Favo Yang",
|
|
@@ -27,15 +27,19 @@
|
|
|
27
27
|
"src",
|
|
28
28
|
"skills/taskchef-bootstrap",
|
|
29
29
|
"skills/taskchef-delegate",
|
|
30
|
-
"skills/taskchef-
|
|
30
|
+
"skills/taskchef-report"
|
|
31
31
|
],
|
|
32
32
|
"engines": {
|
|
33
33
|
"node": ">=18"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
+
"conventional-changelog-conventionalcommits": "^10.3.0",
|
|
36
37
|
"yaml": "^2.9.0"
|
|
37
38
|
},
|
|
38
39
|
"scripts": {
|
|
39
40
|
"test": "node --test tests/taskchef.test.js"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"proper-lockfile": "^4.1.2"
|
|
40
44
|
}
|
|
41
45
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: taskchef-bootstrap
|
|
3
|
-
description: "Initialize, diagnose, or refresh TaskChef dispatcher workspaces, project configuration, and managed AGENTS.md instructions. Use when creating a TaskChef workspace, adding, importing, listing, or removing configured projects, running TaskChef doctor, or repairing dispatcher setup. Do not dispatch user work or
|
|
3
|
+
description: "Initialize, diagnose, or refresh TaskChef dispatcher workspaces, project configuration, task history, and managed AGENTS.md instructions. Use when creating a TaskChef workspace, adding, importing, listing, or removing configured projects, running TaskChef doctor, or repairing dispatcher setup. Do not dispatch user work or report on executor threads."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TaskChef Bootstrap
|
|
@@ -14,20 +14,21 @@ all deterministic workspace operations.
|
|
|
14
14
|
## Boundaries
|
|
15
15
|
|
|
16
16
|
- Keep implementation, tests, and reports in the TaskChef source repository.
|
|
17
|
-
- Keep only `AGENTS.md`, `taskchef.json`, and `tasks
|
|
18
|
-
|
|
19
|
-
- Do not dispatch tasks or
|
|
17
|
+
- Keep only `AGENTS.md`, `taskchef.json`, and `tasks.jsonl` in a dispatcher
|
|
18
|
+
workspace.
|
|
19
|
+
- Do not dispatch tasks or report on executor threads during bootstrap unless
|
|
20
20
|
the user separately requests those actions.
|
|
21
21
|
- Never use collaboration agents, hooks, schedules, polling, or daemons.
|
|
22
22
|
|
|
23
23
|
## Initialize and repair
|
|
24
24
|
|
|
25
25
|
1. Run `workspace init --json`. It takes no stdin, creates an empty
|
|
26
|
-
configuration when missing,
|
|
27
|
-
|
|
28
|
-
TaskChef skills outside
|
|
26
|
+
configuration when missing, creates the append-only task log, refreshes
|
|
27
|
+
managed instructions, and migrates legacy task records that have executor
|
|
28
|
+
thread IDs. The installed plugin provides all three TaskChef skills outside
|
|
29
|
+
the dispatcher workspace.
|
|
29
30
|
2. Run `doctor --json` after setup or when the user asks to diagnose the
|
|
30
|
-
workspace. Doctor is read-only
|
|
31
|
+
workspace. Doctor is read-only. Rerun `workspace init --json` to repair the
|
|
31
32
|
managed scaffold.
|
|
32
33
|
3. Report the actions or failed checks. End without dispatching unless the user
|
|
33
34
|
separately requested work.
|
|
@@ -39,7 +40,7 @@ all deterministic workspace operations.
|
|
|
39
40
|
projects are outside the v1 contract.
|
|
40
41
|
2. Add one project with `project add <path>`, normally supplying `--name` and a
|
|
41
42
|
curated `--description`. The CLI detects Git status, exact Git root, and a
|
|
42
|
-
canonical GitHub `origin
|
|
43
|
+
canonical GitHub `origin`. Use `--no-github` or `--github-repo` only to
|
|
43
44
|
override detection.
|
|
44
45
|
3. Bulk import with `project import <file|-> --json`. Input is a JSON array of
|
|
45
46
|
objects containing `path` plus optional `name`, `description`, and
|
|
@@ -47,5 +48,4 @@ all deterministic workspace operations.
|
|
|
47
48
|
or description when omitted. Use `--replace` only when the user explicitly
|
|
48
49
|
requests replacement.
|
|
49
50
|
4. Inspect configured projects with `project list --json`. Remove by name with
|
|
50
|
-
`project remove
|
|
51
|
-
records reference the project.
|
|
51
|
+
`project remove`. Existing task entries keep their project snapshots.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: taskchef-delegate
|
|
3
|
-
description: "Dispatch actionable requests from an initialized TaskChef workspace into independently openable Codex project tasks. Use for ordinary work requests in a TaskChef workspace, explicit delegation, splitting work across projects
|
|
3
|
+
description: "Dispatch actionable requests from an initialized TaskChef workspace into independently openable Codex project tasks. Use for ordinary work requests in a TaskChef workspace, explicit delegation, or splitting independent work across projects. Record successful dispatches, return immediately, and never use subagents, hooks, schedules, or foreground waiting."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TaskChef Delegate
|
|
@@ -14,10 +14,10 @@ for all deterministic workspace and task-record operations.
|
|
|
14
14
|
## Boundaries
|
|
15
15
|
|
|
16
16
|
- Keep implementation, tests, and reports in the TaskChef source repository.
|
|
17
|
-
- Keep only `AGENTS.md`, `taskchef.json`, and `tasks
|
|
18
|
-
|
|
17
|
+
- Keep only `AGENTS.md`, `taskchef.json`, and `tasks.jsonl` in a dispatcher
|
|
18
|
+
workspace.
|
|
19
19
|
- Use real Codex tasks, never collaboration or subagent tools.
|
|
20
|
-
- Never use hooks, callbacks, schedules, polling,
|
|
20
|
+
- Never use hooks, callbacks, schedules, polling, or daemons.
|
|
21
21
|
- Never wait for delegated work after executor creation.
|
|
22
22
|
- Never collect transcripts or hidden reasoning.
|
|
23
23
|
|
|
@@ -33,18 +33,16 @@ for all deterministic workspace and task-record operations.
|
|
|
33
33
|
`path` only as checkout identity. Ask when metadata does not produce one
|
|
34
34
|
clear project match.
|
|
35
35
|
4. Resolve native projects once and require the exact configured path.
|
|
36
|
-
5.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
`<plugin-root>/bin/taskchef.js task
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
7.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
8. Leave a failed creation pending. Do not invent an ID or delete the record.
|
|
49
|
-
9. Return immediately with a created-thread directive for every success. Do
|
|
36
|
+
5. Create one real Codex task per assignment using the exact configured project
|
|
37
|
+
and a local environment on its executor host. Generate a unique task ID
|
|
38
|
+
before creation, but do not write anything yet.
|
|
39
|
+
6. After executor creation returns a thread ID, immediately run
|
|
40
|
+
`<plugin-root>/bin/taskchef.js task record --json --workspace <workspace>`.
|
|
41
|
+
Send exactly `id`, `project`, `title`, `instruction`, and `threadId` as JSON
|
|
42
|
+
on stdin. Use the configured project path for `project`. Never persist
|
|
43
|
+
`hostId`, status, results, transcripts, or hidden reasoning.
|
|
44
|
+
7. If executor creation fails, do not record a task. If recording fails
|
|
45
|
+
after creation, still return the created task and clearly say that it is not
|
|
46
|
+
in the task log. Do not delete the executor.
|
|
47
|
+
8. Return immediately with a created-thread directive for every success. Do
|
|
50
48
|
not read or wait for a newly created executor.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: taskchef-report
|
|
3
|
+
description: "Report the live state of Codex tasks recorded in a TaskChef task history. Use only when the user asks for status, outcomes, or a report about delegated work. Queries each relevant task once, never polls or waits, and never persists status or results."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TaskChef Report
|
|
7
|
+
|
|
8
|
+
Read the TaskChef task history and report the current state of its Codex
|
|
9
|
+
tasks once.
|
|
10
|
+
|
|
11
|
+
Resolve this skill directory with `realpath`. The TaskChef plugin root is two
|
|
12
|
+
parents above the skill directory. Invoke `<plugin-root>/bin/taskchef.js` for
|
|
13
|
+
all deterministic task-log operations.
|
|
14
|
+
|
|
15
|
+
## Report
|
|
16
|
+
|
|
17
|
+
1. Select only the tasks the user asked about:
|
|
18
|
+
- For an exact task ID, run
|
|
19
|
+
`<plugin-root>/bin/taskchef.js task show <task-id> --json --workspace <workspace>`.
|
|
20
|
+
- For a project, run
|
|
21
|
+
`<plugin-root>/bin/taskchef.js task list --project <name-or-path> --json --workspace <workspace>`.
|
|
22
|
+
- For a title or other description, run
|
|
23
|
+
`<plugin-root>/bin/taskchef.js task list --json --workspace <workspace>`
|
|
24
|
+
once, then select matching entries. Ask the user if the match is ambiguous.
|
|
25
|
+
- Use the full list only when the user asks for an overview of the task history.
|
|
26
|
+
2. Query every selected thread exactly once using immediate native snapshots,
|
|
27
|
+
with no more than eight targets per call.
|
|
28
|
+
3. Summarize the live state and any reported outcome for each requested task.
|
|
29
|
+
Distinguish active work, requests for user input, completed work, and failed
|
|
30
|
+
or partial attempts.
|
|
31
|
+
4. Treat each Codex task as the source of truth. The task log proves that
|
|
32
|
+
TaskChef created the task, but it does not contain the task's current state.
|
|
33
|
+
5. Never update `tasks.jsonl`. Never persist status, results, transcripts,
|
|
34
|
+
or hidden reasoning. Do not poll or wait for future activity.
|
|
35
|
+
|
|
36
|
+
If the task history is empty, say that TaskChef has not recorded any tasks. If
|
|
37
|
+
a recorded task cannot be read, identify it by task ID and thread ID, then
|
|
38
|
+
continue with the remaining entries.
|