@gobing-ai/spur 0.3.95 → 0.3.97
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/.claude-plugin/marketplace.json +1 -1
- package/config/plugin-scripts.json +0 -54
- package/config/rules/boundary/sp-script-placement.yaml +19 -0
- package/config/rules/strict/runtime-boundaries.yaml +6 -0
- package/config/rules/structure/test-location.yaml +2 -0
- package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +1 -1
- package/config/rules/typescript/output-boundaries.yaml +15 -2
- package/config/script-placement-baseline.json +51 -0
- package/config/templates/AGENTS.md +3 -3
- package/config/workflows/feature-verification.yaml +1 -1
- package/config/workflows/history-anatomy.yaml +23 -11
- package/config/workflows/idea-pipeline.yaml +80 -85
- package/config/workflows/pr-review.yaml +18 -9
- package/config/workflows/task-pipeline.yaml +42 -95
- package/config/workflows/wrapup-pipeline.yaml +91 -38
- package/package.json +2 -2
- package/plugins/sp/README.md +14 -10
- package/plugins/sp/agents/super-reviewer.md +43 -18
- package/plugins/sp/commands/dev-fixgha.md +83 -0
- package/plugins/sp/commands/dev-gitmsg.md +8 -6
- package/plugins/sp/commands/dev-gtd.md +2 -2
- package/plugins/sp/commands/dev-idea.md +22 -12
- package/plugins/sp/commands/dev-job-dump.md +29 -0
- package/plugins/sp/commands/dev-job-resume.md +29 -0
- package/plugins/sp/commands/dev-plan.md +8 -9
- package/plugins/sp/commands/dev-review.md +22 -13
- package/plugins/sp/commands/dev-verifyall.md +1 -1
- package/plugins/sp/commands/spur-init.md +2 -2
- package/plugins/sp/lib/history-anatomy.generated.d.mts +112 -0
- package/plugins/sp/lib/history-anatomy.generated.mjs +686 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +5 -4
- package/plugins/sp/lib/inline-run.generated.d.mts +11 -0
- package/plugins/sp/lib/inline-run.generated.mjs +39 -13
- package/plugins/sp/lib/quality-gate.generated.d.mts +104 -0
- package/plugins/sp/lib/quality-gate.generated.mjs +445 -0
- package/plugins/sp/lib/residual-scan.generated.d.mts +63 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +226 -0
- package/plugins/sp/lib/spur-bin.ts +36 -0
- package/plugins/sp/lib/step-profile.generated.d.mts +71 -0
- package/plugins/sp/lib/step-profile.generated.mjs +174 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +3 -3
- package/plugins/sp/scripts/feature-verification-steps.mjs +14 -1
- package/plugins/sp/scripts/feature-verification-steps.ts +14 -1
- package/plugins/sp/scripts/history-anatomy-cache.mjs +20 -19
- package/plugins/sp/scripts/history-anatomy-cache.ts +23 -928
- package/plugins/sp/scripts/inline-run-setup.mjs +85 -320
- package/plugins/sp/scripts/inline-run-setup.ts +104 -667
- package/plugins/sp/scripts/quality-gate.mjs +46 -24
- package/plugins/sp/scripts/quality-gate.ts +13 -659
- package/plugins/sp/scripts/residual-scan.mjs +179 -174
- package/plugins/sp/scripts/residual-scan.ts +125 -517
- package/plugins/sp/scripts/script-root.mjs +5 -1
- package/plugins/sp/scripts/script-root.ts +5 -1
- package/plugins/sp/scripts/workflow-step-profile.mjs +25 -17
- package/plugins/sp/scripts/workflow-step-profile.ts +21 -315
- package/plugins/sp/scripts/wrapup-drift-probe.mjs +8 -2
- package/plugins/sp/scripts/wrapup-drift-probe.ts +3 -2
- package/plugins/sp/scripts/wrapup-steps.mjs +72 -33
- package/plugins/sp/scripts/wrapup-steps.ts +128 -37
- package/plugins/sp/skills/code-improvement/SKILL.md +5 -4
- package/plugins/sp/skills/code-verification/SKILL.md +34 -9
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +3 -3
- package/plugins/sp/skills/functional-review/SKILL.md +7 -4
- package/plugins/sp/skills/functional-review/references/verdict-schema.md +1 -1
- package/plugins/sp/skills/history-anatomy/references/modes.md +2 -1
- package/plugins/sp/skills/next-feature/references/handoff-routing.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
- package/plugins/sp/skills/source-driven-development/SKILL.md +11 -0
- package/plugins/sp/skills/spur-cli/SKILL.md +3 -3
- package/plugins/sp/skills/spur-cli/references/agent.md +10 -10
- package/plugins/sp/skills/spur-cli/references/features.md +17 -6
- package/plugins/sp/skills/spur-cli/references/init.md +17 -16
- package/plugins/sp/skills/spur-cli/references/self.md +3 -2
- package/plugins/sp/skills/spur-cli/references/serve.md +10 -10
- package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +9 -5
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +21 -6
- package/plugins/sp/skills/spur-cli/references/tasks.md +14 -8
- package/plugins/sp/skills/spur-cli/references/workflows.md +17 -14
- package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +14 -10
- package/plugins/sp/skills/spur-dev/references/decision-brief.md +1 -1
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +165 -75
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +7 -5
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +84 -39
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +8 -12
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -3
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +40 -21
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +19 -19
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +4 -3
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +72 -15
- package/plugins/sp/skills/spur-doctor/SKILL.md +1 -1
- package/plugins/sp/skills/sys-architecture/SKILL.md +3 -2
- package/spur.js +4461 -2085
- package/web/_astro/{BoardApp.Cpxntzad.js → BoardApp.Bmv5WkJ9.js} +1 -1
- package/web/_astro/BoardApp.vveLOdDq.js +322 -0
- package/web/_astro/{TaskDetail.C5bW4WGV.js → TaskDetail.IKc3uDYV.js} +1 -1
- package/web/_astro/{arc.CyjRvNMY.js → arc.C63Ufg35.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.B4lWRzJA.js → architectureDiagram-3BPJPVTR.CP8Hyldk.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.Be38USQ2.js → blockDiagram-GPEHLZMM.Bo_48MRA.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DT9Fj5Qx.js → c4Diagram-AAUBKEIU.Ch61sw-O.js} +1 -1
- package/web/_astro/channel.BKCmJpWM.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.SeSBWLg5.js → chunk-2J33WTMH.CHpzS7xf.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DoO4VE14.js → chunk-4BX2VUAB.DzMNNWIw.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DrmTFA53.js → chunk-55IACEB6.BqPrDw_Q.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.Bi-TUb_V.js → chunk-727SXJPM.ZzBHhNw-.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.B-xp8Uhi.js → chunk-AQP2D5EJ.1_O_LLkx.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.DGWrDnUU.js → chunk-FMBD7UC4.GS4UHg7_.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM._BagvPDy.js → chunk-ND2GUHAM.BnqotN4g.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.VOboYWQ0.js → chunk-QZHKN3VN.Ghuh8zoJ.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.D_apfHS7.js → classDiagram-4FO5ZUOK.BW9vC3zg.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.D_apfHS7.js → classDiagram-v2-Q7XG4LA2.BW9vC3zg.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.DNLU_L-x.js → cose-bilkent-S5V4N54A.D6jNC0ti.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.D8borhV-.js → cynefin-OW5HDTMX.BOGoCs4L.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.Uc0lvjcV.js → dagre-BM42HDAG.8iU5VcWi.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DDIxtDBo.js → diagram-2AECGRRQ.CVt88HwH.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.DVoDnD3H.js → diagram-5GNKFQAL.C9HxUUMl.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.CRubTJ-0.js → diagram-KO2AKTUF.4ywkQN3t.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.m9SeYcXQ.js → diagram-LMA3HP47.C48A6gpz.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.C6s2ZjV5.js → diagram-OG6HWLK6.DxFieQW4.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.nSzr5KTj.js → erDiagram-TEJ5UH35.CtjtQqYs.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.DrZcys16.js → flowDiagram-I6XJVG4X.C5zAiahU.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.Do4M1b-K.js → ganttDiagram-6RSMTGT7.D_L6zsny.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.BWc9oJ4l.js → gitGraphDiagram-PVQCEYII.Ignnrk3V.js} +1 -1
- package/web/_astro/index.CbNz17Sx.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.BIdOctFk.js → infoDiagram-5YYISTIA.DLv8-P5u.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CV5SuG2t.js → ishikawaDiagram-YF4QCWOH.p0OTpwFO.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.CxE-rEJ-.js → journeyDiagram-JHISSGLW.CIaBt-DD.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.BPRdKWs_.js → kanban-definition-UN3LZRKU.DGySIntq.js} +1 -1
- package/web/_astro/{linear.zRsuuDTE.js → linear.BATV4RXu.js} +1 -1
- package/web/_astro/{mermaid.core.jAJTcMKc.js → mermaid.core.DzkwM3VX.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BffJxfCr.js → mindmap-definition-RKZ34NQL.3piBRRzA.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.CacwWaE3.js → pieDiagram-4H26LBE5.DUNueLub.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.hXELD06-.js → quadrantDiagram-W4KKPZXB.9bihVbrt.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.DdEbPcqT.js → requirementDiagram-4Y6WPE33.CkjsC-YT.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.DgaDocKv.js → sankeyDiagram-5OEKKPKP.Dbq4vaoQ.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.B0KScnAu.js → sequenceDiagram-3UESZ5HK.BivrH99P.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.CV9M_WNc.js → stateDiagram-AJRCARHV.CqLQ1Vzz.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.BOAo74Et.js → stateDiagram-v2-BHNVJYJU.DvvoLD3b.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.CqqepUMe.js → timeline-definition-PNZ67QCA.B-KR78gv.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DDqe4dOG.js → vennDiagram-CIIHVFJN.Ck0Eieb5.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.B3R9OPdO.js → wardleyDiagram-YWT4CUSO.CRfdd_do.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.B3SvgXpQ.js → xychartDiagram-2RQKCTM6.Ck_Jxk9C.js} +1 -1
- package/web/index.html +2 -2
- package/plugins/sp/lib/artifact-digest.generated.d.mts +0 -7
- package/plugins/sp/lib/artifact-digest.generated.mjs +0 -48
- package/plugins/sp/scripts/feature-sync-bounded.mjs +0 -301
- package/plugins/sp/scripts/feature-sync-bounded.ts +0 -481
- package/plugins/sp/scripts/idea-coverage-check.ts +0 -168
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +0 -298
- package/plugins/sp/scripts/record-feature-sync.mjs +0 -63
- package/plugins/sp/scripts/record-feature-sync.ts +0 -84
- package/plugins/sp/scripts/script-contract-check.ts +0 -506
- package/plugins/sp/scripts/stage-registry-adapter.ts +0 -1533
- package/plugins/sp/scripts/surface-drift-inventory.ts +0 -989
- package/plugins/sp/scripts/task-evidence-precheck.ts +0 -189
- package/plugins/sp/scripts/task-size-precheck.ts +0 -212
- package/plugins/sp/scripts/transition-shim-check.ts +0 -238
- package/plugins/sp/scripts/validate-commands.ts +0 -689
- package/plugins/sp/scripts/validate-flag-contracts.ts +0 -890
- package/plugins/sp/scripts/verify-answer-lint.ts +0 -549
- package/web/_astro/BoardApp.BxJuwD7I.js +0 -191
- package/web/_astro/channel.CI6N_tCg.js +0 -1
- package/web/_astro/index.CENnIEqT.css +0 -1
|
@@ -23,12 +23,12 @@ that before using `run` for fan-out dispatch.
|
|
|
23
23
|
| ---- | ------- | --------- |
|
|
24
24
|
| `run <prompt>` | Execute a prompt or slash command via a coding agent | `--agent <name>` `--spec <id>` `--model <name>` `--mode <mode>` `--continue` `--cwd <path>` `--drain` `--json` |
|
|
25
25
|
| `wait [<specId>]` | Identity-pinned wait for an occupant run to reach a lifecycle state (G4 wave 2; `--role` selector per 0685) | `--role <name>` `--run <runId>` `--until <state>...` `--timeout <ms>` `--json` |
|
|
26
|
-
| `list` | List detected coding agents, or agent specs with `--specs` (live run status + member session merged from `spur serve`) | `--specs` `--server <url>` `--json` |
|
|
27
|
-
| `status` | Agent specs with live process status and member session (requires `spur serve`) | `--server <url>` `--json` |
|
|
26
|
+
| `list` | List detected coding agents, or agent specs with `--specs` (live run status + member session merged from `spur self serve`) | `--specs` `--server <url>` `--json` |
|
|
27
|
+
| `status` | Agent specs with live process status and member session (requires `spur self serve`) | `--server <url>` `--json` |
|
|
28
28
|
| `doctor [agent]` | Check agent readiness | `--json` `--probe-health` `--force-refresh` |
|
|
29
29
|
| `usage` | Run-once provider usage capture (codexbar) → quota-owned availability refresh; scheduled externally | `--dry-run` `--source <name>` `--json` |
|
|
30
|
-
| `start <spec-id>` | Start a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
31
|
-
| `stop <spec-id>` | Stop a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
30
|
+
| `start <spec-id>` | Start a supervised agent process (requires `spur self serve`) | `--server <url>` `--json` |
|
|
31
|
+
| `stop <spec-id>` | Stop a supervised agent process (requires `spur self serve`) | `--server <url>` `--json` |
|
|
32
32
|
|
|
33
33
|
`list`, `status`, `doctor`, `run`, `wait`, `start`, and `stop` accept `--json` plus `--json-envelope`. The hidden
|
|
34
34
|
`loop` is a supervisor-internal process surface. **Exit codes:** `0` success, `1` failure, and `2`
|
|
@@ -85,7 +85,7 @@ justify it - but ensure the run executes in a context that can write the target
|
|
|
85
85
|
|
|
86
86
|
## `loop` - supervisor-internal self-draining wrapper (hidden)
|
|
87
87
|
|
|
88
|
-
`spur agent loop --spec <id> [--poll <ms>]` is spawned by the `spur serve` supervisor for each
|
|
88
|
+
`spur agent loop --spec <id> [--poll <ms>]` is spawned by the `spur self serve` supervisor for each
|
|
89
89
|
materialized agent spec; it is hidden from `--help` and not an operator verb (use `spur agent start`).
|
|
90
90
|
It waits for a wake on the `system_events` ledger — a human request (`message.sent`), a strategy
|
|
91
91
|
change (`strategy.changed`), a capacity change (`fleet.capacity.changed`), or a completion receipt
|
|
@@ -145,7 +145,7 @@ lists agent specs (`.spur/agents/*.yaml`) **with live run status merged from the
|
|
|
145
145
|
supervisor**: each row carries a trailing status column
|
|
146
146
|
(`running` / `stopped` / `errored` / `unknown`), `pid=<n>` where a process exists, and the member
|
|
147
147
|
session (0897): the session mode plus a shortened resume id (`resume id=3f9c2a1d`), or `-` when the
|
|
148
|
-
member has no recorded session. When `spur serve` is unreachable, the listing falls back to all
|
|
148
|
+
member has no recorded session. When `spur self serve` is unreachable, the listing falls back to all
|
|
149
149
|
`stopped` with a stderr warning. `--server <url>`
|
|
150
150
|
(default `http://localhost:3000/api`) targets the supervisor API.
|
|
151
151
|
|
|
@@ -200,9 +200,9 @@ spur agent start worker-1
|
|
|
200
200
|
spur agent start worker-1 --json
|
|
201
201
|
```
|
|
202
202
|
|
|
203
|
-
Posts to the `spur serve` supervisor API
|
|
203
|
+
Posts to the `spur self serve` supervisor API
|
|
204
204
|
(`POST /api/agents/:id/start`) and prints `started <id> (pid=<n>, status=<s>)`. Requires a
|
|
205
|
-
reachable `spur serve`; `--server <url>` (default `http://localhost:3000/api`) targets it. Exit `1`
|
|
205
|
+
reachable `spur self serve`; `--server <url>` (default `http://localhost:3000/api`) targets it. Exit `1`
|
|
206
206
|
when the server is unreachable or the start fails.
|
|
207
207
|
|
|
208
208
|
## `stop` - stop a supervised process
|
|
@@ -250,7 +250,7 @@ unconfirmed or failed. For `skipped`/`pending` the printed target is intent only
|
|
|
250
250
|
0 * * * * /opt/homebrew/bin/spur agent usage >> /tmp/spur-agent-usage.log 2>&1
|
|
251
251
|
```
|
|
252
252
|
|
|
253
|
-
`spur serve` never invokes the producer (asserted by a test, design R4).
|
|
253
|
+
`spur self serve` never invokes the producer (asserted by a test, design R4).
|
|
254
254
|
|
|
255
255
|
### Flags
|
|
256
256
|
|
|
@@ -285,7 +285,7 @@ one never re-sends settled work; only never-started deliveries release and redel
|
|
|
285
285
|
- **Not the dispatch decision.** *When* to use `spur agent run` vs a native subagent is the
|
|
286
286
|
**[dispatch-surface rule](../../parallel-execution/references/dispatch-surface.md)**, not this
|
|
287
287
|
reference. This reference documents the verbs; that rule decides which surface carries a dispatch.
|
|
288
|
-
- **Not the fleet orchestrator.** The `spur serve` supervisor drives the lifecycle: `spur agent
|
|
288
|
+
- **Not the fleet orchestrator.** The `spur self serve` supervisor drives the lifecycle: `spur agent
|
|
289
289
|
start` / `stop` manage supervised processes and `agent list --specs` reports live state.
|
|
290
290
|
|
|
291
291
|
## See also
|
|
@@ -181,11 +181,16 @@ planning reference, then apply accepted deterministic changes through `spur feat
|
|
|
181
181
|
## The gate — `check --json`
|
|
182
182
|
|
|
183
183
|
```bash
|
|
184
|
-
spur feature check H2 --json
|
|
185
|
-
spur feature check --json
|
|
186
|
-
spur feature check --strict --json
|
|
184
|
+
spur feature check H2 --json # one feature
|
|
185
|
+
spur feature check --json # whole tree
|
|
186
|
+
spur feature check --strict --json # warnings → failures
|
|
187
|
+
spur feature check H2 --inventory <eval-report.md> # also cross-check AC ↔ requirement inventory
|
|
187
188
|
```
|
|
188
189
|
|
|
190
|
+
With `--inventory <report>`, the `inventory-coverage` finding (1004 R1, unsuppressible error layer)
|
|
191
|
+
fails the check when a `## Requirement inventory` item has no covering scenario (`# covers: I<n>`)
|
|
192
|
+
and is not `[deferred: ...]`; a missing/empty inventory section is itself an error.
|
|
193
|
+
|
|
189
194
|
The 4-layer validator (frontmatter, AC syntax, children-limit/structure, L4 traceability) emits its
|
|
190
195
|
verdict and findings as a JSON **array**, one entry per feature (`jq '.[0].pass'`, `.[0].findings[].code`),
|
|
191
196
|
like `spur task check --json`. Gherkin AC must keep its `Feature:` line (`L3.ac-bdd-error`) and
|
|
@@ -207,15 +212,21 @@ see the proposed status hop.
|
|
|
207
212
|
spur feature sync H2 --json # one feature
|
|
208
213
|
spur feature sync H2 --dry-run --json # propose only, no write
|
|
209
214
|
spur feature sync --all --json # every feature with linked tasks
|
|
210
|
-
spur feature sync H2 --force # apply a reopen
|
|
215
|
+
spur feature sync H2 --force # re-derive live: bypass replay + apply a reopen without confirmation
|
|
211
216
|
spur feature sync H2 --folder docs/custom-tasks --json # non-default tasks folder
|
|
212
217
|
```
|
|
213
218
|
|
|
214
219
|
- **`[id]`** syncs one feature; **`--all`** syncs every feature with linked tasks. One of the two is
|
|
215
220
|
required - exit `2` if neither is given.
|
|
216
221
|
- **`--dry-run`** reports proposed transitions without applying. **`--force`** applies a *reopen*
|
|
217
|
-
proposal (status moving backward) without interactive confirmation
|
|
218
|
-
|
|
222
|
+
proposal (status moving backward) without interactive confirmation **and** bypasses blocked-sync
|
|
223
|
+
replay (below).
|
|
224
|
+
- **Blocked-sync suppression (1004 R3):** a BLOCKED outcome is persisted at
|
|
225
|
+
`.spur/run/feature-sync-blocked-<id>.json` with an input fingerprint (feature content, linked
|
|
226
|
+
task statuses, verdict mtimes); an identical next call replays the prior result
|
|
227
|
+
(`suppressed: true`) instead of re-deriving. A changed input, `--force`, or a non-blocked
|
|
228
|
+
outcome re-derives/clears. Dry-run never reads or writes the state.
|
|
229
|
+
- **`--json`** single-feature emits `{ proposal, applied, appliedHops[], suppressed? }`; `--all` emits
|
|
219
230
|
`{ totalFeatures, evaluated, updatedCount, results[] }` where each result is the single-feature
|
|
220
231
|
shape. `proposal` is
|
|
221
232
|
`{ featureId, from, to, reason, requiresConfirm?, gateBlocked?, gateFindings?, hops? }`.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: init
|
|
3
|
-
description: "spur-cli noun reference for `spur init` and `spur status`: CLI verbs (init scaffold with --name/--force/--minimal, status with --json) plus post-scaffold init validation for /sp:spur-init - Phase 1.5 functional-validation probes and Phase 1.6 rule-glob adaptation."
|
|
3
|
+
description: "spur-cli noun reference for `spur self init` and `spur self status`: CLI verbs (init scaffold with --name/--force/--minimal, status with --json) plus post-scaffold init validation for /sp:spur-init - Phase 1.5 functional-validation probes and Phase 1.6 rule-glob adaptation."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# spur init / spur status - CLI verbs and post-scaffold validation
|
|
8
|
+
# spur self init / spur self status - CLI verbs and post-scaffold validation
|
|
9
9
|
|
|
10
10
|
## CLI verbs
|
|
11
11
|
|
|
@@ -14,14 +14,14 @@ see_also:
|
|
|
14
14
|
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
|
|
15
15
|
| `status [path]` | Show project and git status for a Spur project | `--json` |
|
|
16
16
|
|
|
17
|
-
### `spur init` - scaffold a Spur project
|
|
17
|
+
### `spur self init` - scaffold a Spur project
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
spur init # interactive: prompt for project name
|
|
21
|
-
spur init --name my-project # non-interactive
|
|
22
|
-
spur init --name my-project --force # overwrite existing .spur/ files
|
|
23
|
-
spur init --minimal # skip optional scaffolding (rules, workflows)
|
|
24
|
-
spur init --json # machine-readable
|
|
20
|
+
spur self init # interactive: prompt for project name
|
|
21
|
+
spur self init --name my-project # non-interactive
|
|
22
|
+
spur self init --name my-project --force # overwrite existing .spur/ files
|
|
23
|
+
spur self init --minimal # skip optional scaffolding (rules, workflows)
|
|
24
|
+
spur self init --json # machine-readable
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
Materializes the `.spur/` directory tree with config, docs, rules, and workflow templates. The
|
|
@@ -34,14 +34,15 @@ post-scaffold validation probes (Phase 1.5 / 1.6, below) run immediately after t
|
|
|
34
34
|
| `--name <name>` | Project name (skips interactive prompt). |
|
|
35
35
|
| `--force` | Overwrite existing `.spur/` files. Without it, existing files are preserved. |
|
|
36
36
|
| `--minimal` | Skip optional scaffolding (rules presets, workflow templates). Core config + docs only. |
|
|
37
|
+
| `--adopt-global-config` | Also rewrite `~/.config/spur/config.yaml` from the shipped global default (backed up first). Opt-in only. |
|
|
37
38
|
| `--json` | Output machine-readable JSON instead of interactive summary. |
|
|
38
39
|
|
|
39
|
-
### `spur status [path]` - project and git status
|
|
40
|
+
### `spur self status [path]` - project and git status
|
|
40
41
|
|
|
41
42
|
```bash
|
|
42
|
-
spur status # current directory
|
|
43
|
-
spur status /path/to/project # specific project
|
|
44
|
-
spur status --json # machine-readable
|
|
43
|
+
spur self status # current directory
|
|
44
|
+
spur self status /path/to/project # specific project
|
|
45
|
+
spur self status --json # machine-readable
|
|
45
46
|
```
|
|
46
47
|
|
|
47
48
|
Reports the project's Spur configuration state (init status, feature/task counts, rule preset
|
|
@@ -50,11 +51,11 @@ directory.
|
|
|
50
51
|
|
|
51
52
|
## Post-scaffold validation
|
|
52
53
|
|
|
53
|
-
Two probes sit between the deterministic scaffold (`spur init`) and the non-deterministic doc
|
|
54
|
+
Two probes sit between the deterministic scaffold (`spur self init`) and the non-deterministic doc
|
|
54
55
|
customization: Phase 1.5 (functional validation) confirms the fresh tree is immediately functional;
|
|
55
56
|
Phase 1.6 (rule glob adaptation) rewrites layout-dependent rule globs so `recommended-pre-check`
|
|
56
57
|
runs clean on this project's layout. The executing agent owns content *adaptation* only — `spur
|
|
57
|
-
init` owns *file materialization* (`04_DESIGN.md` §1.1 "Init ownership contract").
|
|
58
|
+
self init` owns *file materialization* (`04_DESIGN.md` §1.1 "Init ownership contract").
|
|
58
59
|
|
|
59
60
|
### Phase 1.5 — Functional validation probe
|
|
60
61
|
|
|
@@ -62,8 +63,8 @@ Before any customization, confirm the fresh scaffold is immediately functional.
|
|
|
62
63
|
fails, STOP and report the gap rather than papering over it with customization:
|
|
63
64
|
|
|
64
65
|
```
|
|
65
|
-
spur status
|
|
66
|
-
spur task create "__probe__" --template standard # confirms task template + matrix resolve
|
|
66
|
+
spur self status
|
|
67
|
+
spur task create "__probe__" --template standard --skip-ready # no model dispatch; confirms task template + matrix resolve
|
|
67
68
|
spur workflow validate task-pipeline.yaml
|
|
68
69
|
```
|
|
69
70
|
|
|
@@ -17,7 +17,7 @@ top-level forms are omitted from `spur --help`, leaving `self` as the visible su
|
|
|
17
17
|
|
|
18
18
|
| Verb | Purpose | Key flags |
|
|
19
19
|
| ---- | ------- | --------- |
|
|
20
|
-
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
|
|
20
|
+
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--adopt-global-config` `--json` |
|
|
21
21
|
| `maintain` | Run database maintenance: PRAGMA optimize, WAL truncation, optional VACUUM | `--vacuum` `--json` |
|
|
22
22
|
| `migrate` | Apply CLI-owned schema migrations | `--json` |
|
|
23
23
|
| `serve` | Start the Spur web server (local fallback) | `--port <n>` `--host <addr>` `--no-open` `--cwd <path>` `--json` |
|
|
@@ -40,7 +40,8 @@ spur self init --json # machine-readable
|
|
|
40
40
|
|
|
41
41
|
Materializes the `.spur/` directory tree with config, docs, rules, and workflow templates. Flags:
|
|
42
42
|
`--name <name>` (default: current directory name), `--force` (recreate existing files), `--minimal`
|
|
43
|
-
(skip optional scaffolding), `--
|
|
43
|
+
(skip optional scaffolding), `--adopt-global-config` (also rewrite `~/.config/spur/config.yaml` from
|
|
44
|
+
the shipped global default, backed up first), `--json` (machine-readable output). Post-scaffold validation probes
|
|
44
45
|
(Phase 1.5 / 1.6) run immediately after this verb completes — see **[init.md](init.md)** for the
|
|
45
46
|
probe protocol and rule-glob adaptation procedure.
|
|
46
47
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli-serve
|
|
3
|
-
description: "spur-cli noun reference: operate `spur serve` as the local web-server fallback - start the Hono/Cloudflare-Worker server that backs the web Task Kanban and the supervisor API. Single verb, five flags."
|
|
3
|
+
description: "spur-cli noun reference: operate `spur self serve` as the local web-server fallback - start the Hono/Cloudflare-Worker server that backs the web Task Kanban and the supervisor API. Single verb, five flags."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# spur serve - local web server
|
|
8
|
+
# spur self serve - local web server
|
|
9
9
|
|
|
10
|
-
`spur serve` starts the **Spur web server** - a local Hono / Cloudflare-Worker server that serves
|
|
10
|
+
`spur self serve` starts the **Spur web server** - a local Hono / Cloudflare-Worker server that serves
|
|
11
11
|
the web Task Kanban and exposes the supervisor API (`/api/processes/*` + `/api/agents/*`). It is the local fallback
|
|
12
12
|
when no remote server is configured.
|
|
13
13
|
|
|
@@ -22,10 +22,10 @@ when no remote server is configured.
|
|
|
22
22
|
## `serve` - start the web server
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
spur serve # default: localhost:3000, opens browser
|
|
26
|
-
spur serve --port 8080 --host 0.0.0.0
|
|
27
|
-
spur serve --no-open # skip browser
|
|
28
|
-
spur serve --json # dry probe: print { port, url, pid, running } and exit
|
|
25
|
+
spur self serve # default: localhost:3000, opens browser
|
|
26
|
+
spur self serve --port 8080 --host 0.0.0.0
|
|
27
|
+
spur self serve --no-open # skip browser
|
|
28
|
+
spur self serve --json # dry probe: print { port, url, pid, running } and exit
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
Starts the server with the Hono app backed by the local SQLite database. The web Task Kanban and
|
|
@@ -46,14 +46,14 @@ the supervisor API become available at `http://<host>:<port>`.
|
|
|
46
46
|
|
|
47
47
|
## What this skill is NOT
|
|
48
48
|
|
|
49
|
-
- **Not the agent supervisor.** `spur serve` hosts the supervisor API; `spur agent start` / `stop` /
|
|
49
|
+
- **Not the agent supervisor.** `spur self serve` hosts the supervisor API; `spur agent start` / `stop` /
|
|
50
50
|
`agent list --specs` are the verbs that drive and inspect it (0848). See
|
|
51
51
|
**[agent.md](agent.md)**.
|
|
52
52
|
- **Not a production server.** This is the local fallback. Production deployment uses the Cloudflare
|
|
53
|
-
Worker build (`apps/server/`), not `spur serve`.
|
|
53
|
+
Worker build (`apps/server/`), not `spur self serve`.
|
|
54
54
|
|
|
55
55
|
## See also
|
|
56
56
|
|
|
57
|
-
- **`spur agent` (see [agent.md](agent.md))** - `start`/`stop`/`list --specs` require `spur serve`
|
|
57
|
+
- **`spur agent` (see [agent.md](agent.md))** - `start`/`stop`/`list --specs` require `spur self serve`
|
|
58
58
|
for the supervisor API.
|
|
59
59
|
- **`sp:spur-cli`** SKILL.md - the facade that routes to this reference.
|
|
@@ -58,16 +58,20 @@ exactly: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `
|
|
|
58
58
|
`spur task record 0040 --transition testing` reads `.spur/run/0040-verdict.json`, writes
|
|
59
59
|
`Testing` (per-requirement table), and backfills `Review` (P1–P4 findings table) **only when the
|
|
60
60
|
section is bare** — a standalone compatibility fallback, never an overwrite of the review
|
|
61
|
-
coordinator's authored Review — optionally backfilling a bare `Solution` from `git diff -U0`.
|
|
62
|
-
|
|
61
|
+
coordinator's authored Review — optionally backfilling a bare `Solution` from `git diff -U0`.
|
|
62
|
+
Record can also refresh its own earlier Review backfill. The `--transition testing` example stops
|
|
63
|
+
at testing; `--transition done` with a PASS verdict walks the forward lifecycle edges through their
|
|
64
|
+
guards and creates the required pipeline run-link immediately before the done hop.
|
|
63
65
|
|
|
64
66
|
- **Use `record`** when a verify step produced a verdict artifact — it is the pipeline's record step
|
|
65
67
|
and the deterministic `Testing` writer.
|
|
66
68
|
- **Use `update --section`** when you are authoring a section by hand (planning, design, narrative
|
|
67
69
|
solution) or amending one `record` already wrote.
|
|
68
70
|
|
|
69
|
-
`record`
|
|
70
|
-
|
|
71
|
+
`record` re-reads the verdict on each invocation. PASS/PARTIAL/FAIL artifacts refresh Testing;
|
|
72
|
+
UNKNOWN preserves authored Testing and writes a stub only when Testing is bare. Review remains
|
|
73
|
+
fallback-only: bare content or record's own earlier backfill can be replaced, authored Review cannot.
|
|
74
|
+
A later `update --section` overwrites either section (file-wins). Both use the same atomic write.
|
|
71
75
|
|
|
72
76
|
## Which section, when
|
|
73
77
|
|
|
@@ -81,7 +85,7 @@ LLM's job (orchestrated by `sp:spur-dev`); this skill only owns the *mechanism*:
|
|
|
81
85
|
| `Plan` | before `wip` | the step list |
|
|
82
86
|
| `Solution` | during impl (implement step) | the approach actually taken; L3 `file:line` rule fires once it has real content |
|
|
83
87
|
| `Testing` | testing phase (`record` — deterministic writer) | what was verified and how — gated at `wip→testing` by `check` |
|
|
84
|
-
| `Review` | review phase (`/sp:dev-review` coordinator) | merged SECU findings + verdict — gated at `testing→done` by `check --
|
|
88
|
+
| `Review` | review phase (`/sp:dev-review` coordinator) | merged SECU findings + verdict — gated at `testing→done` by `check --as done` |
|
|
85
89
|
|
|
86
90
|
Section presence per status is a **runtime contract**, not a table: query
|
|
87
91
|
`spur task sections <wbs> list --json` (permitted present sections) and `spur task check <wbs> --json`
|
|
@@ -24,8 +24,16 @@ blocking retry).
|
|
|
24
24
|
| `--feature <id>` | Records `feature_id` in frontmatter; derives `Background` from the feature's `Goal` (L4 edge). |
|
|
25
25
|
| `--parent <wbs>` | Groups under a parent WBS for sub-task decomposition. |
|
|
26
26
|
| `--template <variant>` | Selects the section-matrix variant for the new file. |
|
|
27
|
+
| `--skip-ready` | Keep the capture as-is: no ready preparation, no model dispatch. |
|
|
28
|
+
| `--agent <selector>` | Agent used for ready preparation (default: the configured agent). Exit `2` when combined with `--skip-ready`. |
|
|
27
29
|
| `--folder <path>` | Target a non-default tasks folder. |
|
|
28
|
-
| `--json` | Emit `{ ref: { id, filePath } }`. |
|
|
30
|
+
| `--json` | Emit `{ ref: { id, filePath }, wbs, filePath, readiness: { status, depth } }`. |
|
|
31
|
+
|
|
32
|
+
**Ready by default (ADR-109):** after the capture is saved, `create` prepares the same WBS in place —
|
|
33
|
+
model refine → deterministic post-check (`task check --as todo`) → promotion to `todo`.
|
|
34
|
+
`readiness.status` is `ready`, `skipped` (`--skip-ready`), or `failed`. A failed preparation exits `1`
|
|
35
|
+
with error code `preparation-failed` (`failedStage`, `recoveryCommand`, `findings`); the task file and
|
|
36
|
+
its WBS are kept. `batch-create` takes the same two flags.
|
|
29
37
|
|
|
30
38
|
(See also the full verb map in [tasks.md](../tasks.md).)
|
|
31
39
|
|
|
@@ -67,6 +75,10 @@ frontmatter scalar.
|
|
|
67
75
|
wholesale. No inline-body flag. Section names: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Testing`, `Review`, `References`, `History`, `Notes`.
|
|
68
76
|
- **Frontmatter** (`--feature <id>`, `--priority <p>`): sets the scalar frontmatter field on an
|
|
69
77
|
existing task — the only post-create path, allow-listed to `feature_id` / `parent_wbs` / `priority`.
|
|
78
|
+
- **Estimate** (`--estimate-hours <n>`): sets the `estimate_hours` frontmatter field (positive number) —
|
|
79
|
+
the decomposition size estimate the inline pipeline driver reads.
|
|
80
|
+
- **`--provenance-bypass`** (pair with `--force-done` and `--reason`): records an audited
|
|
81
|
+
provenance-bypass link when no pipeline run exists. Replaces the `SPUR_PROVENANCE_OVERRIDE` env var.
|
|
70
82
|
- **AC controls** (`--ac-altitude <graduating|task-local>`, `--ac-numbering task-local`) — independent
|
|
71
83
|
of each other (task 0818 R5). `--ac-altitude task-local` skips the **DD-09 feature-AC subset** rule
|
|
72
84
|
because the task's scenarios are intentionally not the feature's ship criteria; `--ac-numbering
|
|
@@ -339,8 +351,11 @@ column to distinguish AC rows from requirement rows:
|
|
|
339
351
|
`AC-<i>` (which credits the scenario) and the task checkbox id `AC<i>` (which the box flip needs).
|
|
340
352
|
Key the row **`AC<n> — <scenario title>`**, omitting the scenario's own `R<n>` label — then one row
|
|
341
353
|
does both: `normalizeTitle` strips the `AC<n>` prefix so the row still matches the scenario title,
|
|
342
|
-
and `prefixId` normalizes `AC<n>` so the box flips. A bare `AC
|
|
343
|
-
|
|
354
|
+
and `prefixId` normalizes `AC<n>` so the box flips. A bare `AC-<i>` also does both: `record`
|
|
355
|
+
resolves it through the feature's scenario order to the AC line aliasing scenario *i*
|
|
356
|
+
(`AC<k> — [R<n> — ]<scenario title>`) and flips that box — never the same-numbered `AC<i>`; with no
|
|
357
|
+
aliasing line it flips nothing. A bare `AC<n>` credits no scenario; a title carrying the scenario's
|
|
358
|
+
`R<n>` label matches neither.
|
|
344
359
|
|
|
345
360
|
**Evidence rule (behavior-bearing AC):** an AC row with `status: MET` on a behavior-bearing id
|
|
346
361
|
(no `[advisory]`/`[non-core]`/`[non-behavior]`/`[docs-only]` marker) MUST carry `test` or
|
|
@@ -410,9 +425,9 @@ unallocated.
|
|
|
410
425
|
## Command surface (quick)
|
|
411
426
|
|
|
412
427
|
```
|
|
413
|
-
spur task create <title> [--feature <id>] [--parent <wbs>] [--template <v>] [--dedupe-within <seconds>] [--allow-duplicate-name] [--folder] [--json]
|
|
428
|
+
spur task create <title> [--feature <id>] [--parent <wbs>] [--template <v>] [--dedupe-within <seconds>] [--allow-duplicate-name] [--skip-ready | --agent <selector>] [--folder] [--json]
|
|
414
429
|
spur task show <wbs> [--folder] [--json]
|
|
415
|
-
spur task update <wbs> [status] [--section <n> --from-file <p>] [--feature <id>] [--priority <p>] [--no-lifecycle] [--folder] [--json]
|
|
430
|
+
spur task update <wbs> [status] [--section <n> --from-file <p>] [--feature <id>] [--priority <p>] [--ac-numbering task-local] [--ac-altitude <a>] [--estimate-hours <n>] [--assignee <spec-id>] [--no-lifecycle] [--force-done --reason <text> [--provenance-bypass] [--verdict-dir <path>]] [--folder] [--json]
|
|
416
431
|
spur task deps <wbs> <set|add|remove|clear> [values...] [--folder] [--json]
|
|
417
432
|
spur task sections <wbs> <init|add|list> [name] [--folder] [--json]
|
|
418
433
|
spur task list [--status <s>] [--phase <p>] [--parent <wbs>] [--feature <id>] [--folder] [--json]
|
|
@@ -420,7 +435,7 @@ spur task refresh [--folder] [--json]
|
|
|
420
435
|
spur task migrate [--dry-run] [--folder] [--json]
|
|
421
436
|
spur task migrate-anchors [--dry-run] [--json]
|
|
422
437
|
spur task refresh-roster <wbs> [--folder] [--json]
|
|
423
|
-
spur task batch-create --file <path> [--folder] [--json]
|
|
438
|
+
spur task batch-create --file <path> [--skip-ready | --agent <selector>] [--folder] [--json]
|
|
424
439
|
spur task record <wbs> [--verdict-file <p>] [--solution-from-diff] [--transition <s>] [--folder] [--json]
|
|
425
440
|
spur task verdict <wbs> [--from-answer <p>] [--folder] [--json]
|
|
426
441
|
spur task verifyall-aggregate [--from-file <path>] [--json]
|
|
@@ -38,9 +38,9 @@ re-reading or re-tokenizing the task.
|
|
|
38
38
|
|
|
39
39
|
| Verb | Purpose | Key flags |
|
|
40
40
|
| ---- | ------- | --------- |
|
|
41
|
-
| `create <title>` | Allocate a new task (race-safe WBS) | `--feature <id>` `--parent <wbs>` `--template <variant>` `--dedupe-within <s>` `--allow-duplicate-name` `--folder` `--json` |
|
|
41
|
+
| `create <title>` | Allocate a new task (race-safe WBS) | `--feature <id>` `--parent <wbs>` `--template <variant>` `--dedupe-within <s>` `--allow-duplicate-name` `--skip-ready` `--agent <selector>` `--folder` `--json` |
|
|
42
42
|
| `show <wbs>` | Print one task's frontmatter + body | `--folder` `--json` |
|
|
43
|
-
| `update <wbs> [status]` | Lifecycle transition, section replace, **or** frontmatter set | `--section <name> --from-file <path>` `--assignee <spec-id>` (exclusive with `--section`) `--feature <id>` `--priority <p>` `--no-lifecycle` `--force-done` `--reason <text>` `--verdict-dir <path>` `--folder` `--json` |
|
|
43
|
+
| `update <wbs> [status]` | Lifecycle transition, section replace, **or** frontmatter set | `--section <name> --from-file <path>` `--assignee <spec-id>` (exclusive with `--section`) `--feature <id>` `--priority <p>` `--ac-numbering task-local` `--ac-altitude <a>` `--estimate-hours <n>` `--no-lifecycle` `--force-done` `--reason <text>` `--provenance-bypass` `--verdict-dir <path>` `--folder` `--json` |
|
|
44
44
|
| `deps <wbs> <op> [values...]` | Mutate `dependencies[]` frontmatter array (ops: `set`, `add`, `remove`, `clear`) | `--folder` `--json` |
|
|
45
45
|
| `sections <wbs> <op> [name]` | Initialize, add, or list canonical task sections (ops: `init`, `add`, `list`) | `--folder` `--json` |
|
|
46
46
|
| `list` | List tasks, filtered | `--status <s>` `--phase <p>` `--parent <wbs>` `--feature <id>` `--folder` `--json` |
|
|
@@ -48,10 +48,10 @@ re-reading or re-tokenizing the task.
|
|
|
48
48
|
| `migrate` | One-time A17 corpus normalization pass | `--dry-run` `--folder` `--json` |
|
|
49
49
|
| `migrate-anchors` | Qualify in-repo evidence anchors to repo-relative paths (0583 R1–R3) | `--dry-run` `--json` |
|
|
50
50
|
| `refresh-roster <wbs>` | Regenerate a parent task's sub-task roster block in `## Plan` | `--folder` `--json` |
|
|
51
|
-
| `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--folder` `--json` |
|
|
51
|
+
| `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--skip-ready` `--agent <selector>` `--folder` `--json` |
|
|
52
52
|
| `record <wbs>` | Write `Testing` from a verify verdict (deterministic); bare-`## Review` fallback only; optional Solution + transition | `--verdict-file <path>` `--solution-from-diff` `--transition <status>` `--folder` `--json` |
|
|
53
53
|
| `verdict <wbs>` | Derive PASS/PARTIAL/FAIL/UNKNOWN from verify answer text → verdict JSON; see [answer-file shape](tasks/verbs.md#answer-file-shape-what---from-answer-parses) | `--from-answer <path>` `--folder` `--json` |
|
|
54
|
-
| `check [wbs]` | Four-layer validation; `--fix` repairs structure; `--corpus` is the explicit unsuppressed audit | `--strict` `--as <status>` `--strict-core` `--fix` `--folder` `--corpus` `--since <ref>` `--json` |
|
|
54
|
+
| `check [wbs]` | Four-layer validation; `--fix` repairs structure; `--corpus` is the explicit unsuppressed audit; `--precheck` adds the pipeline precheck gate (size + evidence channel, WBS required) | `--strict` `--as <status>` `--strict-core` `--precheck` `--fix` `--folder` `--corpus` `--since <ref>` `--json` |
|
|
55
55
|
| `resolve <file-path>` | Map a file path to its owning task WBS | `--strict` `--folder` `--json` |
|
|
56
56
|
| `path <wbs>` | Map a WBS to its absolute task file path (inverse of `resolve`) | `--folder` `--json` |
|
|
57
57
|
| `run-link <wbs>` | Record pipeline run provenance link for task | `--source <src>` `--run-id <id>` `--json` |
|
|
@@ -73,6 +73,11 @@ spur task create "Add email validation" --feature H2 --parent 0040
|
|
|
73
73
|
- **`--template <variant>`** selects the section-matrix variant that shapes the new file's sections:
|
|
74
74
|
`standard·feature-impl·issue·review·meta·brainstorm`. The default is **`feature-impl` when
|
|
75
75
|
`--feature` is given, else `standard`**. An unknown variant is exit `2`.
|
|
76
|
+
- **Ready by default (ADR-109):** `create` and `batch-create` dispatch a model to prepare the new task
|
|
77
|
+
to ready (refine → `task check --as todo` post-check → promotion to `todo`). Pass **`--skip-ready`**
|
|
78
|
+
for a plain capture with no model dispatch; **`--agent <selector>`** picks the preparing agent.
|
|
79
|
+
`--json` carries `readiness: { status: ready|skipped|failed, depth }`; a failed preparation exits `1`
|
|
80
|
+
(`preparation-failed`) and keeps the task.
|
|
76
81
|
|
|
77
82
|
The same `--template` axis drives both *which sections the new file carries* (per the
|
|
78
83
|
Section-Status-Matrix) and *its creation status*: a spec'd task (a `--feature` link, or a batch item
|
|
@@ -271,7 +276,7 @@ spur task check --json # whole corpus
|
|
|
271
276
|
spur task check 0040 --json # one task
|
|
272
277
|
spur task check --strict --json # elevate ALL warnings to failures
|
|
273
278
|
spur task check 0040 --as done # evaluate as the done row (lifecycle target, F92 R2)
|
|
274
|
-
spur task check 0040 --strict-core #
|
|
279
|
+
spur task check 0040 --strict-core # compatibility alias; not the done gate (use --as done)
|
|
275
280
|
```
|
|
276
281
|
|
|
277
282
|
**Folder resolution (task 0522):** a WBS-targeted check (`<wbs>` present, no `--folder`) resolves
|
|
@@ -291,9 +296,10 @@ The two flags are distinct gate profiles:
|
|
|
291
296
|
- **`--strict`** elevates *all* warnings to failures (the strictest reading).
|
|
292
297
|
- **`--as <status>`** evaluates the task as if it were already in `<status>` (F92 R2); the lifecycle
|
|
293
298
|
guards pass the transition target. Validated against canonical task statuses; excluded with `--corpus`.
|
|
294
|
-
- **`--strict-core`** is a **
|
|
295
|
-
|
|
296
|
-
as
|
|
299
|
+
- **`--strict-core`** is a **compatibility alias** (F92 R2) kept so installed plugins/workflows that
|
|
300
|
+
call it keep working. It runs the default severity computation against the task's *current* status
|
|
301
|
+
and is no longer meaningful on its own. The lifecycle guards are `--as testing` (`wip→testing`) and
|
|
302
|
+
`--as done` (`testing→done`); use `--as <status>` for gate checks.
|
|
297
303
|
|
|
298
304
|
See [tasks/verbs.md](tasks/verbs.md) for the JSON shape per finding.
|
|
299
305
|
|
|
@@ -204,7 +204,7 @@ spur workflow run ./workflows/approval.yaml --silent # errors only
|
|
|
204
204
|
spur workflow run ./workflows/approval.yaml --verbose # transitions + correlation diagnostics
|
|
205
205
|
spur workflow run ./workflows/approval.yaml --detail minimal # tersest human output
|
|
206
206
|
spur workflow run ./workflows/approval.yaml --trace-file # persist redacted JSONL trace
|
|
207
|
-
spur workflow run ./workflows/approval.yaml --no-log # opt out of the run record .spur/
|
|
207
|
+
spur workflow run ./workflows/approval.yaml --no-log # opt out of the run record .spur/memory/runs/<RUNID>.md + .state.json
|
|
208
208
|
spur workflow run ./workflows/approval.yaml --steer # interactive steering on stdin
|
|
209
209
|
```
|
|
210
210
|
|
|
@@ -214,7 +214,7 @@ spur workflow run ./workflows/approval.yaml --steer # interactive
|
|
|
214
214
|
per-step headers), `full` (transitions + correlation). `--verbose` is shorthand for `--detail full`.
|
|
215
215
|
- **`--trace-file`** appends a redacted, schema-versioned JSONL trace under `.spur/workflow/`
|
|
216
216
|
for post-run analysis - independent of human/JSON output.
|
|
217
|
-
- **`--no-log`** opts out of writing the two-file run record (`.spur/
|
|
217
|
+
- **`--no-log`** opts out of writing the two-file run record (`.spur/memory/runs/<RUNID>.md` + `.state.json`).
|
|
218
218
|
By default the record is written **and retained** after the run ends; this flag skips it entirely
|
|
219
219
|
(propagates to the `--async` detached worker). No `--keep-log` / delete-by-default exists.
|
|
220
220
|
- **`--steer`** is synchronous and in-process: it cannot combine with `--json` or `--async` (exit `2`).
|
|
@@ -285,7 +285,7 @@ not advertise `--json-envelope` because its JSON projection is a kept-raw docume
|
|
|
285
285
|
| `--verbose` | Include transitions and correlation diagnostics in human progress (implies `--detail full`). |
|
|
286
286
|
| `--detail <level>` | Human detail level: `minimal`, `invocation` (default), or `full`. |
|
|
287
287
|
| `--trace-file` | Append a redacted schema-versioned JSONL trace under `.spur/workflow/`. |
|
|
288
|
-
| `--no-log` | Opt out of writing the two-file run record `.spur/
|
|
288
|
+
| `--no-log` | Opt out of writing the two-file run record `.spur/memory/runs/<RUNID>.md` + `.state.json` (retained by default; propagates to `--async` workers). |
|
|
289
289
|
| `--steer` | Accept in-process steering commands on stdin at declared action boundaries (sync only; incompatible with `--json`/`--async`). |
|
|
290
290
|
|
|
291
291
|
`validate` and `run` exit non-zero on failure (`run` exits non-zero when the final status is not
|
|
@@ -302,7 +302,7 @@ Follow a live run to terminal (human streaming mode):
|
|
|
302
302
|
```bash
|
|
303
303
|
spur workflow trace <run-id> --follow # stream until terminal (default 1000ms poll)
|
|
304
304
|
spur workflow trace <run-id> --follow --poll 500 # poll every 500ms
|
|
305
|
-
spur workflow trace <run-id> --follow --output # stream .spur/
|
|
305
|
+
spur workflow trace <run-id> --follow --output # stream .spur/memory/runs/<RUNID>.md instead of the DB timeline
|
|
306
306
|
spur workflow trace <run-id> --follow --timeout 600000 # bound the watch; timeout → one checkpoint, run continues, exit 1
|
|
307
307
|
```
|
|
308
308
|
|
|
@@ -316,7 +316,7 @@ spur workflow trace <run-id> --follow --timeout 600000 # bound the watch; timeou
|
|
|
316
316
|
status and exits `1`. A watch timeout never cancels or relaunches the run; resume by re-running the same
|
|
317
317
|
follow command.
|
|
318
318
|
- **`--output`** swaps the follow source from the structured DB timeline to the human run record
|
|
319
|
-
(`.spur/
|
|
319
|
+
(`.spur/memory/runs/<RUNID>.md`, tail -f equivalent), streaming new lines as they land and exiting at
|
|
320
320
|
terminal status. A pre-0925 run with only a legacy `<RUNID>.log` is followed in place (read-only
|
|
321
321
|
fallback). It requires `--follow` and a `run-id`, is a human stream (rejects `--json`), and is
|
|
322
322
|
a **distinct source** — it never interleaves with the DB timeline. If no record file appears (e.g. the
|
|
@@ -360,15 +360,18 @@ redirecting `agent.run` stages (ADR-047).
|
|
|
360
360
|
|
|
361
361
|
- **Stale-run finalization** (existing): bulk-finalizes orphaned `running`/`pending` runs as `failed`.
|
|
362
362
|
`--older-than <minutes>` (default 30) and `--force` (all non-terminal regardless of age) apply here only.
|
|
363
|
-
- **Run-log reclamation** (0429): removes
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
363
|
+
- **Run-log reclamation** (0429): removes expired `.log` files from `.spur/memory/runs/`
|
|
364
|
+
and legacy `.spur/run/`, using `workflow.logRetentionDays` (default 30 days). Non-terminal
|
|
365
|
+
runs, including paused/interrupted runs, are protected; ownership lookup failures preserve logs.
|
|
366
|
+
The two-file record (`.md` + `.state.json`) and partial handoffs are retained.
|
|
367
|
+
- **Checkpoint reclamation**: removes expired terminal checkpoints only when confinement,
|
|
368
|
+
metadata and run-ownership guards pass. Recoverable runs remain protected.
|
|
369
|
+
- **Migration** (E71): verified lasting scratch data is preserved and references redirected before
|
|
370
|
+
reclamation. Unsettled imports, live dependencies, malformed files and conflicts retain their sources.
|
|
371
|
+
- **`--logs`** scopes to log reclamation and its migration (skips stale-run finalization and
|
|
372
|
+
checkpoint reclamation). `--dry-run` reports without copying or deleting. `--json` returns
|
|
373
|
+
`{ olderThanMinutes, dryRun, cleaned, logs, checkpoints, migration }`; with `--logs`, it returns
|
|
374
|
+
`{ retentionDays, dryRun, reclaimed, failures, migration }`.
|
|
372
375
|
|
|
373
376
|
## Behavior
|
|
374
377
|
|
|
@@ -206,6 +206,8 @@ section adds what that table has no room for: per-file content summaries and ite
|
|
|
206
206
|
step (glossary, config companions).** Read Step routing to find "which file for step X"; read below
|
|
207
207
|
for "what's actually in file Y" or for resources that sit outside the step sequence.
|
|
208
208
|
|
|
209
|
+
- Job transfer: [dump/resume](references/dev-operations.md#11a-job-dump).
|
|
210
|
+
|
|
209
211
|
- [references/glossary.md](references/glossary.md) — sp's own vocabulary: spine, competency, facade,
|
|
210
212
|
corpus, gate, verdict, noun/verb, half, HITL, WBS, section-write contract — canonical term +
|
|
211
213
|
Avoid list. Owns term definitions only; `cross-cutting.md` owns the process rules that use them.
|
|
@@ -125,7 +125,7 @@ Any of the four may additionally carry a **bracket tag** in any position — `[d
|
|
|
125
125
|
`Scenario: [advisory] Foo`. Tags are stripped before matching (0398 R7), so tagging never breaks
|
|
126
126
|
the linkage.
|
|
127
127
|
|
|
128
|
-
Task-side, `
|
|
128
|
+
Task-side, the `spur task verdict` answer lint additionally accepts a fifth declared id source — a **bold-trajectory
|
|
129
129
|
paragraph**: a whole-line `**AC id…**` paragraph inside the task's `### Acceptance Criteria`
|
|
130
130
|
block (task 0817 R3). The id up to its first `:` and the paragraph's full spelling are both
|
|
131
131
|
declared; two bold spans on one line are not a declaration (an interpolated bold id stays
|
|
@@ -141,7 +141,7 @@ unmatchable):
|
|
|
141
141
|
|
|
142
142
|
### A bullet's bold head is its id
|
|
143
143
|
|
|
144
|
-
`
|
|
144
|
+
The `spur task verdict` answer lint declares the bold span of a single-line criterion bullet
|
|
145
145
|
(`- **AC2 — The roster runtime is gone (R3).** Given …, when …, then …`) and its head before the
|
|
146
146
|
first ` — ` or `:` — so answer rows may key `AC2` or `AC2 — The roster runtime is gone (R3).`. Keep
|
|
147
147
|
at least one answer row keyed to the verbatim feature scenario title the task graduates, and keep
|
|
@@ -222,7 +222,8 @@ Use the canonical BDD template at `templates/bdd/gherkin.md`. Key rules:
|
|
|
222
222
|
```
|
|
223
223
|
|
|
224
224
|
Every inventory item without a `[deferred: ...]` marker must be covered by at least one
|
|
225
|
-
scenario — `
|
|
225
|
+
scenario — the `feature check --inventory` gate (inventory-coverage finding) measures this at
|
|
226
|
+
the idea-pipeline's ac-generate boundary.
|
|
226
227
|
|
|
227
228
|
Avoid:
|
|
228
229
|
|
|
@@ -22,7 +22,7 @@ not redefine it.
|
|
|
22
22
|
> precedence chain, and the `implementAgent` override.** Every other reference (flag-glossary,
|
|
23
23
|
> execution-workflow, execution-batch, dev-operations, cmd_agent, cmd_workflow) links here and
|
|
24
24
|
> does not restate the contract. The value table below is authoritative; parity with it is
|
|
25
|
-
> enforced by `validate-flag-contracts.ts` (C3a/C3b).
|
|
25
|
+
> enforced by `scripts/commands/validate-flag-contracts.ts` (C3a/C3b).
|
|
26
26
|
|
|
27
27
|
### The one rule
|
|
28
28
|
|
|
@@ -135,7 +135,9 @@ workflow run` and never redirect silently to `agent.default`. Interactive **omit
|
|
|
135
135
|
**host-controlled and non-subprocess**, but no longer guarantees host-context execution for every
|
|
136
136
|
model stage (task 0508): an eligible `agent.run` stage — pure-slash input, non-interactive state,
|
|
137
137
|
native subagent with shared-worktree read/write/shell capability, and a task above the
|
|
138
|
-
`estimate_hours` dispatch floor
|
|
138
|
+
`estimate_hours` dispatch floor — a small, non-sensitive triage diffstat
|
|
139
|
+
(`.spur/run/<wbs>-diffstat.json`, verify only) keeps that stage host-inline (2026-09-15
|
|
140
|
+
subagent-dispatch evaluation; the floor and the
|
|
139
141
|
resume-over-re-dispatch rule for worker-role continuation stages are owned by
|
|
140
142
|
[inline-pipeline-driver.md](inline-pipeline-driver.md)) — dispatches **once** to that
|
|
141
143
|
native subagent and joins before the driver continues; any pre-dispatch eligibility failure falls
|
|
@@ -289,8 +291,8 @@ Never edit a task or feature file directly. Every mutation goes through:
|
|
|
289
291
|
|
|
290
292
|
The interactive `--next` step-chain (`dev-refine → dev-run → dev-verify → done`) moves a task's
|
|
291
293
|
status with `spur task update <wbs> <status>` **without `--no-lifecycle`**, so the lifecycle guards
|
|
292
|
-
run: `wip → testing` invokes `spur task check`, `testing → done` invokes
|
|
293
|
-
`spur task check --
|
|
294
|
+
run: `wip → testing` invokes `spur task check --as testing`, `testing → done` invokes
|
|
295
|
+
`spur task check --as done`. A guard failure **stops the chain as review-pending** — leave the
|
|
294
296
|
task at its current status, surface the blocking finding, do not advance. This is the gate that
|
|
295
297
|
keeps a malformed task out of `testing`/`done`.
|
|
296
298
|
|
|
@@ -455,7 +457,7 @@ Seven non-negotiable invariants for the spur-dev lifecycle. These are laws, not
|
|
|
455
457
|
violation is a defect in the run, not a style choice. Every competency skill and the spine consume
|
|
456
458
|
them; they live here because they cross every phase boundary.
|
|
457
459
|
|
|
458
|
-
1. **NEVER skip the verification gate.** A task is not done until `spur task check <wbs> --
|
|
460
|
+
1. **NEVER skip the verification gate.** A task is not done until `spur task check <wbs> --as done`
|
|
459
461
|
returns PASS and every AC scenario has a corresponding verify command that exited 0. "I tested it
|
|
460
462
|
manually" is not verification evidence.
|
|
461
463
|
2. **NEVER write to task/feature corpus outside the `spur` CLI.** Direct file edits to
|
|
@@ -463,7 +465,7 @@ them; they live here because they cross every phase boundary.
|
|
|
463
465
|
under `.spur/memory/`. Every other mutation goes through `spur task` / `spur feature` so the
|
|
464
466
|
schema, matrix, and traceability guards run.
|
|
465
467
|
3. **NEVER mark a task done without a PASS verdict.** `testing → done` requires
|
|
466
|
-
`spur task check --
|
|
468
|
+
`spur task check --as done` PASS and a recorded verdict. PARTIAL or FAIL verdicts leave the
|
|
467
469
|
task at `testing` and surface to the operator.
|
|
468
470
|
4. **NEVER proceed past a failed gate without explicit operator approval.** A failed
|
|
469
471
|
`feature-check`, `batch-create`, `precheck`, `review`, or `verify` stops the run. The operator
|
|
@@ -783,10 +785,12 @@ The Design Approval Gate is the taste gate between system design and decompositi
|
|
|
783
785
|
**Auto-mode behavior:**
|
|
784
786
|
|
|
785
787
|
- `--auto` routes around taste HITL states BEFORE entry only when the matching pre-clear vars are
|
|
786
|
-
true.
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
788
|
+
true. On the planning commands (`dev-idea`, `dev-plan`) CLI **`--auto`** sets `profile=auto`,
|
|
789
|
+
`design_approved=true`, and `idea_approved=true` — the planning exception to Auto-Decision
|
|
790
|
+
Principle #5 (reversible corpus writes; see flag-glossary `--auto`).
|
|
791
|
+
- The bypass still follows the evidence: idea-eval continues only on a `proceed`/`reshape`
|
|
792
|
+
recommendation (`drop` cancels, missing pauses) and design-approval only on a PASS design check.
|
|
793
|
+
Direct `spur workflow run` callers that leave the pre-clear vars `false` keep both taste pauses.
|
|
790
794
|
- The brainstorm design summary is ALWAYS recorded, regardless of `--auto` — `--auto` does not
|
|
791
795
|
bypass the "nothing is too simple" pattern.
|
|
792
796
|
|