diff --git a/docs/work/_state.json b/docs/work/_state.json index 875199d..17c453c 100644 --- a/docs/work/_state.json +++ b/docs/work/_state.json @@ -1,5 +1,5 @@ { - "updated_at": "2026-05-13T06:12:30.043Z", + "updated_at": "2026-05-13T06:16:11.738Z", "epics": { "agent-workflow-docs-v1": { "status": "done", @@ -254,6 +254,58 @@ } } }, + "sandcastle-dispatch-v1": { + "status": "in-progress", + "title": "Sandcastle dispatch v1 — pnpm work dispatch with planning + execute modes", + "stories": { + "01-sandcastle-install": { + "status": "in-progress", + "title": "Install @ai-hero/sandcastle + Dockerfile", + "ac_total": 4, + "ac_completed": 0, + "depends_on": [], + "blocks": [ + "02-dispatch-planner" + ] + }, + "02-dispatch-planner": { + "status": "todo", + "title": "Dispatch planner — finds next ready bullet, prints plan", + "ac_total": 3, + "ac_completed": 0, + "depends_on": [ + "01-sandcastle-install" + ], + "blocks": [ + "03-dispatch-execute", + "04-dispatch-cli-wiring" + ] + }, + "03-dispatch-execute": { + "status": "todo", + "title": "Dispatch execute mode — invoke sandcastle.run for impl + review", + "ac_total": 4, + "ac_completed": 0, + "depends_on": [ + "02-dispatch-planner" + ], + "blocks": [ + "04-dispatch-cli-wiring" + ] + }, + "04-dispatch-cli-wiring": { + "status": "todo", + "title": "pnpm work dispatch CLI wiring + smoke tests", + "ac_total": 4, + "ac_completed": 0, + "depends_on": [ + "02-dispatch-planner", + "03-dispatch-execute" + ], + "blocks": [] + } + } + }, "work-system-v1": { "status": "done", "title": "Work system v1 (MVP) — state tracking + pnpm work CLI", @@ -269,6 +321,38 @@ } } }, - "ready": [], - "blocked": [] + "ready": [ + { + "epic": "sandcastle-dispatch-v1", + "story": "01-sandcastle-install", + "title": "Install @ai-hero/sandcastle + Dockerfile" + } + ], + "blocked": [ + { + "epic": "sandcastle-dispatch-v1", + "story": "02-dispatch-planner", + "title": "Dispatch planner — finds next ready bullet, prints plan", + "waiting_on": [ + "sandcastle-dispatch-v1/01-sandcastle-install" + ] + }, + { + "epic": "sandcastle-dispatch-v1", + "story": "03-dispatch-execute", + "title": "Dispatch execute mode — invoke sandcastle.run for impl + review", + "waiting_on": [ + "sandcastle-dispatch-v1/02-dispatch-planner" + ] + }, + { + "epic": "sandcastle-dispatch-v1", + "story": "04-dispatch-cli-wiring", + "title": "pnpm work dispatch CLI wiring + smoke tests", + "waiting_on": [ + "sandcastle-dispatch-v1/02-dispatch-planner", + "sandcastle-dispatch-v1/03-dispatch-execute" + ] + } + ] } diff --git a/docs/work/sandcastle-dispatch-v1/01-sandcastle-install/_story.md b/docs/work/sandcastle-dispatch-v1/01-sandcastle-install/_story.md new file mode 100644 index 0000000..b9a81fe --- /dev/null +++ b/docs/work/sandcastle-dispatch-v1/01-sandcastle-install/_story.md @@ -0,0 +1,17 @@ +--- +id: 01-sandcastle-install +epic: sandcastle-dispatch-v1 +title: Install @ai-hero/sandcastle + Dockerfile +type: technical-story +status: in-progress +feature: tooling +depends-on: [] +blocks: [02-dispatch-planner] +--- + +## Tasks + +- [ ] Story scaffold +- [ ] Add @ai-hero/sandcastle to devDependencies +- [ ] Create .sandcastle/Dockerfile (minimal node + pnpm) +- [ ] Verify install + import resolves diff --git a/docs/work/sandcastle-dispatch-v1/02-dispatch-planner/_story.md b/docs/work/sandcastle-dispatch-v1/02-dispatch-planner/_story.md new file mode 100644 index 0000000..f829727 --- /dev/null +++ b/docs/work/sandcastle-dispatch-v1/02-dispatch-planner/_story.md @@ -0,0 +1,16 @@ +--- +id: 02-dispatch-planner +epic: sandcastle-dispatch-v1 +title: Dispatch planner — finds next ready bullet, prints plan +type: technical-story +status: todo +feature: scripts +depends-on: [01-sandcastle-install] +blocks: [03-dispatch-execute, 04-dispatch-cli-wiring] +--- + +## Tasks + +- [ ] findNextTask() — returns { epic, story, bullet, storyContent } or null +- [ ] Tests +- [ ] CLI: printPlan() — prints the dispatch plan diff --git a/docs/work/sandcastle-dispatch-v1/03-dispatch-execute/_story.md b/docs/work/sandcastle-dispatch-v1/03-dispatch-execute/_story.md new file mode 100644 index 0000000..baec85a --- /dev/null +++ b/docs/work/sandcastle-dispatch-v1/03-dispatch-execute/_story.md @@ -0,0 +1,17 @@ +--- +id: 03-dispatch-execute +epic: sandcastle-dispatch-v1 +title: Dispatch execute mode — invoke sandcastle.run for impl + review +type: technical-story +status: todo +feature: scripts +depends-on: [02-dispatch-planner] +blocks: [04-dispatch-cli-wiring] +--- + +## Tasks + +- [ ] dispatchImplementer() — calls sandcastle.run with implementer prompt +- [ ] dispatchReviewer() — calls sandcastle.run with reviewer prompt + diff +- [ ] applyReviewerDecision() — prints what state mutation WOULD happen +- [ ] Tests with mocked sandcastle.run diff --git a/docs/work/sandcastle-dispatch-v1/04-dispatch-cli-wiring/_story.md b/docs/work/sandcastle-dispatch-v1/04-dispatch-cli-wiring/_story.md new file mode 100644 index 0000000..6be5c9c --- /dev/null +++ b/docs/work/sandcastle-dispatch-v1/04-dispatch-cli-wiring/_story.md @@ -0,0 +1,17 @@ +--- +id: 04-dispatch-cli-wiring +epic: sandcastle-dispatch-v1 +title: pnpm work dispatch CLI wiring + smoke tests +type: technical-story +status: todo +feature: scripts +depends-on: [02-dispatch-planner, 03-dispatch-execute] +blocks: [] +--- + +## Tasks + +- [ ] cli.mjs: add `dispatch` subcommand with `--execute` flag +- [ ] CLI smoke tests +- [ ] README / docs update +- [ ] Final verification + closeout diff --git a/docs/work/sandcastle-dispatch-v1/_epic.md b/docs/work/sandcastle-dispatch-v1/_epic.md new file mode 100644 index 0000000..0c08142 --- /dev/null +++ b/docs/work/sandcastle-dispatch-v1/_epic.md @@ -0,0 +1,27 @@ +--- +id: sandcastle-dispatch-v1 +prd: null +title: Sandcastle dispatch v1 — pnpm work dispatch with planning + execute modes +type: epic +status: in-progress +features: [tooling, scripts] +created: 2026-05-13 +--- + +## Goal + +Install `@ai-hero/sandcastle` + ship `pnpm work dispatch` that picks the +next ready AC bullet, prints the dispatch plan, and (with `--execute`) +invokes sandcastle to run the implementer then reviewer. + +## Why + +The orchestrator closes the loop: docs/work/ tracks state, `.sandcastle/` +holds the prompts, and dispatch.mjs connects them to sandcastle. + +## Stories + +- [ ] [01 — Install @ai-hero/sandcastle + Dockerfile](01-sandcastle-install/_story.md) +- [ ] [02 — Dispatch planner (default mode)](02-dispatch-planner/_story.md) +- [ ] [03 — Dispatch execute mode (sandcastle.run integration)](03-dispatch-execute/_story.md) +- [ ] [04 — pnpm work dispatch wiring + tests](04-dispatch-cli-wiring/_story.md)