@gobing-ai/spur 0.3.55 → 0.3.58

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.
Files changed (91) hide show
  1. package/.claude-plugin/marketplace.json +2 -3
  2. package/config/corpus-baseline.json +2748 -68
  3. package/config/rules/strict/runtime-boundaries.yaml +3 -0
  4. package/config/rules/surface/check-cli-surface.yaml +1 -0
  5. package/config/workflow-composition-baseline.json +242 -23
  6. package/config/workflows/wrapup-pipeline.yaml +31 -1
  7. package/package.json +9 -9
  8. package/plugins/README.md +1 -1
  9. package/plugins/sp/README.md +1 -1
  10. package/plugins/sp/agents/expert-spur.md +4 -1
  11. package/plugins/sp/commands/dev-feature-change.md +2 -2
  12. package/plugins/sp/commands/dev-idea.md +7 -19
  13. package/plugins/sp/plugin.json +1 -1
  14. package/plugins/sp/scripts/task-size-precheck.ts +11 -6
  15. package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +4 -4
  16. package/plugins/sp/skills/dogfood-testing/references/report-template.md +4 -2
  17. package/plugins/sp/skills/issue-finding/SKILL.md +23 -11
  18. package/plugins/sp/skills/spur-cli/SKILL.md +23 -15
  19. package/plugins/sp/skills/spur-cli/references/agent.md +5 -0
  20. package/plugins/sp/skills/spur-cli/references/builder.md +49 -0
  21. package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +2 -2
  22. package/plugins/sp/skills/spur-cli/references/features/roadmap-priority.md +1 -1
  23. package/plugins/sp/skills/spur-cli/references/features/verbs.md +1 -1
  24. package/plugins/sp/skills/spur-cli/references/features.md +11 -3
  25. package/plugins/sp/skills/spur-cli/references/message.md +5 -0
  26. package/plugins/sp/skills/spur-cli/references/rules.md +5 -0
  27. package/plugins/sp/skills/spur-cli/references/self.md +101 -0
  28. package/plugins/sp/skills/spur-cli/references/tasks.md +6 -1
  29. package/plugins/sp/skills/spur-cli/references/team.md +5 -0
  30. package/plugins/sp/skills/spur-cli/references/workflows.md +40 -0
  31. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +1 -1
  32. package/plugins/sp/skills/spur-dev/references/dev-operations.md +9 -8
  33. package/plugins/sp/skills/spur-dev/references/execution-batch.md +19 -0
  34. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  35. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +27 -5
  36. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +1 -1
  37. package/spur.js +5060 -553
  38. package/web/_astro/BoardApp.CrusGeQ4.js +1 -0
  39. package/web/_astro/BoardApp.P8SRAD5Q.js +179 -0
  40. package/web/_astro/{TaskDetail.DN_RxS-2.js → TaskDetail.DHjEt5vl.js} +1 -1
  41. package/web/_astro/{arc.CldTHRg-.js → arc.XgRC1Ij_.js} +1 -1
  42. package/web/_astro/{architectureDiagram-3BPJPVTR.DQ4T9oeU.js → architectureDiagram-3BPJPVTR.DOZWrfHc.js} +1 -1
  43. package/web/_astro/{blockDiagram-GPEHLZMM.CGDaXH8J.js → blockDiagram-GPEHLZMM.ClQnCGf_.js} +1 -1
  44. package/web/_astro/{c4Diagram-AAUBKEIU.Cqsc2iub.js → c4Diagram-AAUBKEIU.CKCtUD0Y.js} +1 -1
  45. package/web/_astro/channel.CmK546kO.js +1 -0
  46. package/web/_astro/{chunk-2J33WTMH.CQSKsRmq.js → chunk-2J33WTMH.c7J8OHq5.js} +1 -1
  47. package/web/_astro/{chunk-4BX2VUAB.Pv1HCtp8.js → chunk-4BX2VUAB.C-A1Dv27.js} +1 -1
  48. package/web/_astro/{chunk-55IACEB6.-9MseOIk.js → chunk-55IACEB6.C4kGGALB.js} +1 -1
  49. package/web/_astro/{chunk-727SXJPM.M3OI1DF7.js → chunk-727SXJPM.Bith2NHt.js} +1 -1
  50. package/web/_astro/{chunk-AQP2D5EJ.NfHka5Ca.js → chunk-AQP2D5EJ.qeSXhsVY.js} +1 -1
  51. package/web/_astro/{chunk-FMBD7UC4.B2suYe3s.js → chunk-FMBD7UC4.DdQQnTAy.js} +1 -1
  52. package/web/_astro/{chunk-ND2GUHAM.BfJ7aucP.js → chunk-ND2GUHAM.BZYQVeZd.js} +1 -1
  53. package/web/_astro/{chunk-QZHKN3VN._582hZVc.js → chunk-QZHKN3VN.BiUWwHaV.js} +1 -1
  54. package/web/_astro/{classDiagram-4FO5ZUOK._tttU_jk.js → classDiagram-4FO5ZUOK.OGRhcldh.js} +1 -1
  55. package/web/_astro/{classDiagram-v2-Q7XG4LA2._tttU_jk.js → classDiagram-v2-Q7XG4LA2.OGRhcldh.js} +1 -1
  56. package/web/_astro/{cose-bilkent-S5V4N54A.C4rVATLQ.js → cose-bilkent-S5V4N54A.DxYklM_j.js} +1 -1
  57. package/web/_astro/{dagre-BM42HDAG.8BLRi7f9.js → dagre-BM42HDAG.BSb2dEbo.js} +1 -1
  58. package/web/_astro/{diagram-2AECGRRQ.D6lwUZos.js → diagram-2AECGRRQ.mOrItPK2.js} +1 -1
  59. package/web/_astro/{diagram-5GNKFQAL.Cl_rMiVT.js → diagram-5GNKFQAL.C99r7J3C.js} +1 -1
  60. package/web/_astro/{diagram-KO2AKTUF.DhMExHLp.js → diagram-KO2AKTUF.BKbnisJO.js} +1 -1
  61. package/web/_astro/{diagram-LMA3HP47.3OAxzH_o.js → diagram-LMA3HP47.D8FJGo4V.js} +1 -1
  62. package/web/_astro/{diagram-OG6HWLK6.Uh9RLucG.js → diagram-OG6HWLK6.DVBs7n4Q.js} +1 -1
  63. package/web/_astro/{erDiagram-TEJ5UH35.izzElG0c.js → erDiagram-TEJ5UH35.CddMTl4l.js} +1 -1
  64. package/web/_astro/{flowDiagram-I6XJVG4X.BlGwp5qM.js → flowDiagram-I6XJVG4X.B7WclnjQ.js} +1 -1
  65. package/web/_astro/{ganttDiagram-6RSMTGT7.je7Vf8dN.js → ganttDiagram-6RSMTGT7.CRh7ggvz.js} +1 -1
  66. package/web/_astro/{gitGraphDiagram-PVQCEYII.DNk0Ycop.js → gitGraphDiagram-PVQCEYII.du-L7V8A.js} +1 -1
  67. package/web/_astro/index.B4x8fe52.css +1 -0
  68. package/web/_astro/{infoDiagram-5YYISTIA.K2HhGyWH.js → infoDiagram-5YYISTIA.CClGl9Px.js} +1 -1
  69. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BbbOW4IN.js → ishikawaDiagram-YF4QCWOH.BuTETIPz.js} +1 -1
  70. package/web/_astro/{journeyDiagram-JHISSGLW.B1UaZKqN.js → journeyDiagram-JHISSGLW.Cyg1zCiE.js} +1 -1
  71. package/web/_astro/{kanban-definition-UN3LZRKU.9tsw5QFd.js → kanban-definition-UN3LZRKU.aH8eDXwX.js} +1 -1
  72. package/web/_astro/{linear.I9dvtu-j.js → linear.paE_RY_i.js} +1 -1
  73. package/web/_astro/{mermaid.core.5bKJsMgf.js → mermaid.core.BhdKkI85.js} +4 -4
  74. package/web/_astro/{mindmap-definition-RKZ34NQL.BC5MqSn6.js → mindmap-definition-RKZ34NQL.aZNfv8Nx.js} +1 -1
  75. package/web/_astro/{pieDiagram-4H26LBE5.B8GIMyxD.js → pieDiagram-4H26LBE5.5psni0hC.js} +1 -1
  76. package/web/_astro/{quadrantDiagram-W4KKPZXB.K_aZSM_u.js → quadrantDiagram-W4KKPZXB.DcGPGrFd.js} +1 -1
  77. package/web/_astro/{requirementDiagram-4Y6WPE33.B_V5kzfT.js → requirementDiagram-4Y6WPE33.BwPD2lzi.js} +1 -1
  78. package/web/_astro/{sankeyDiagram-5OEKKPKP.DyV2quLS.js → sankeyDiagram-5OEKKPKP.B3jGVk0l.js} +1 -1
  79. package/web/_astro/{sequenceDiagram-3UESZ5HK.BlKvPnBv.js → sequenceDiagram-3UESZ5HK.BdWsx3LW.js} +1 -1
  80. package/web/_astro/{stateDiagram-AJRCARHV.C1lYUMdS.js → stateDiagram-AJRCARHV.DRpG4ClZ.js} +1 -1
  81. package/web/_astro/{stateDiagram-v2-BHNVJYJU.DJWjr3QV.js → stateDiagram-v2-BHNVJYJU.Su0ML9Wo.js} +1 -1
  82. package/web/_astro/{timeline-definition-PNZ67QCA.CYYiXVlv.js → timeline-definition-PNZ67QCA.Cg_Uv8A5.js} +1 -1
  83. package/web/_astro/{vennDiagram-CIIHVFJN.zYjQKa_S.js → vennDiagram-CIIHVFJN.DVouKT4b.js} +1 -1
  84. package/web/_astro/{wardley-L42UT6IY.BGrWTY3D.js → wardley-L42UT6IY.CexIVQli.js} +1 -1
  85. package/web/_astro/{wardleyDiagram-YWT4CUSO.CkXxtcI1.js → wardleyDiagram-YWT4CUSO.ChSAzcvx.js} +1 -1
  86. package/web/_astro/{xychartDiagram-2RQKCTM6.BhKH3KG3.js → xychartDiagram-2RQKCTM6.CN-Yp50J.js} +1 -1
  87. package/web/index.html +2 -2
  88. package/web/_astro/BoardApp.DCLSB3Zs.js +0 -179
  89. package/web/_astro/BoardApp.Dx5gzAhb.js +0 -1
  90. package/web/_astro/channel.CrBJYpxo.js +0 -1
  91. package/web/_astro/index.V6Q7nhed.css +0 -1
@@ -2,12 +2,13 @@
2
2
  description: Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, feature-check, system-design, decompose, batch-create (Design by default), handoff
3
3
  role: planner
4
4
  argument-hint: "\"<idea>\" [--auto] [--skip-design] [--approve-taste] [--agent <inline|auto|name>]"
5
- allowed-tools: ["Bash", "Read", "AskUserQuestion"]
5
+ allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
6
6
  ---
7
7
 
8
8
  # Dev Idea
9
9
 
10
- Wraps the **idea-pipeline.yaml** workflow.
10
+ Wraps the **sp:spur-dev** skill; the machine is **idea-pipeline.yaml** — the stage
11
+ contract below maps to that workflow's transitions.
11
12
 
12
13
  ## Argument Flags
13
14
 
@@ -40,20 +41,7 @@ vars as subsets of `--approve-taste` (`idea_approved` / `design_approved`). Pref
40
41
 
41
42
  ## Implementation
42
43
 
43
- Map flags workflow vars, then:
44
-
45
- ```bash
46
- spur workflow run .spur/workflows/idea-pipeline.yaml --vars '{
47
- "idea":"<text>",
48
- "profile":"interactive|auto",
49
- "design":"auto|skip",
50
- "design_approved":"false|true",
51
- "idea_approved":"false|true",
52
- "agent":"<executor-or-role>"
53
- }'
54
- ```
55
-
56
- Omit `agent` from `--vars` unless the operator passed `--agent`: an absent var lets `agent.default`
57
- (a Layer-1 role, resolved to its tier's cheapest usable executor) govern, which is the intended
58
- routing. Passing `--agent <name>` pins that executor for every `agent.run` stage — the escape hatch
59
- when the resolved executor is unusable (quota exhaustion, auth failure).
44
+ - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
45
+ - `Skill(skill="sp:spur-dev", args="idea $ARGUMENTS")`
46
+ - Stage contract (discovery → idea-eval → feature-create → AC → feature-check → system-design →
47
+ decompose batch-create → handoff): `plugins/sp/skills/spur-dev/references/dev-operations.md` § idea.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.55",
3
+ "version": "0.3.58",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
5
5
  "extensions": {
6
6
  "pi": ["./hooks/pi/guard-extension.ts"]
@@ -141,13 +141,18 @@ function runSpur(spurBin: string, args: string[]): string {
141
141
  * tier all read as `standard` — conservative: a false block is one flag away,
142
142
  * a false pass costs a 30-minute timed-out implement.
143
143
  */
144
- function resolveCapabilityTier(spurBin: string, executor: string): string {
144
+ function resolveCapabilityTier(spurBin: string, executor: string): { tier: string; resolvedName: string } {
145
145
  try {
146
146
  const out = runSpur(spurBin, ['agent', 'doctor', executor, '--json']);
147
- const tier = JSON.parse(out)?.agents?.[0]?.capabilityTier;
148
- return typeof tier === 'string' && tier ? tier : 'standard';
147
+ const row = JSON.parse(out)?.agents?.[0];
148
+ const tier = row?.capabilityTier;
149
+ // R1 (0622 F2/F4 residue): `doctor <role>` resolves the role to its cheapest
150
+ // eligible executor (`coder` → `omp`); surface the resolved executor name in
151
+ // the block message, not the role the caller passed in.
152
+ const resolvedName = typeof row?.agent === 'string' && row.agent.length > 0 ? row.agent : executor;
153
+ return { tier: typeof tier === 'string' && tier ? tier : 'standard', resolvedName };
149
154
  } catch {
150
- return 'standard';
155
+ return { tier: 'standard', resolvedName: executor };
151
156
  }
152
157
  }
153
158
 
@@ -185,11 +190,11 @@ function main(): void {
185
190
  // R3 (0487): a large task on a sub-capable executor blocks even when the caller
186
191
  // raised the caps — the caps are an acceptance of size, not a capability grant.
187
192
  if (executor && (reqCount > LARGE_TASK_REQS || planItemCount > LARGE_TASK_PLAN_ITEMS)) {
188
- const tier = resolveCapabilityTier(spurBin, executor);
193
+ const { tier, resolvedName } = resolveCapabilityTier(spurBin, executor);
189
194
  if (!CAPABLE_TIERS.has(tier)) {
190
195
  reasons.push(
191
196
  `Task size (${reqCount} R-items / ${planItemCount} Plan items) requires a capable executor, ` +
192
- `but ${executor} is tier ${tier}. ` +
197
+ `but ${resolvedName} is tier ${tier}. ` +
193
198
  `Pass \`--agent <capable>\` or \`--vars '{"implementAgent":"<capable>"}'\`, or split the task.`,
194
199
  );
195
200
  }
@@ -19,7 +19,7 @@ lives in the dual artifacts (see [report-template.md](report-template.md) → Al
19
19
  artifacts):
20
20
 
21
21
  | File | Path |
22
- |------|------|
22
+ | ------ | ------ |
23
23
  | Live | `.spur/run/dogfood/<run_id>.md` |
24
24
  | Report | `docs/dogfood/YYYY-MM-DD-<testee-slug>-dogfood.md` |
25
25
 
@@ -73,7 +73,7 @@ in the report's §6 Findings (no exemption applies).
73
73
  ```
74
74
 
75
75
  | Column | Meaning |
76
- |--------|---------|
76
+ | -------- | --------- |
77
77
  | `Step` | The derived step label (Phase 1) or `N` for a single-step testee. |
78
78
  | `Attempts` | How many times the step was run (1 = first-try; >1 = retried under the fix budget). |
79
79
  | `Outcome` | `PASS` / `FIXED` / `UNRESOLVED` / `N/A`. (`FIXED` = failed then passed within budget.) |
@@ -114,7 +114,7 @@ Ledger estimates alone are **confidence: LOW**. When assembling the report Cost
114
114
  ([report-template.md](report-template.md) §2):
115
115
 
116
116
  | Source | When to use | Confidence | Scope label |
117
- |--------|-------------|------------|-------------|
117
+ | -------- | ------------- | ------------ | ------------- |
118
118
  | Ledger `chars/4` heuristic | Always | LOW | per-step trend |
119
119
  | `ccusage` daily/session | If CLI available and returns data | MEDIUM | day or session — **not** per-step |
120
120
  | Agent usage fields in tool results | If present (never invent) | MEDIUM | as reported by the tool |
@@ -168,7 +168,7 @@ the driver re-fetching data it already holds. Apply these while monitoring each
168
168
  When aggregate cache% risks falling under 50%, apply this checklist **before** re-reading:
169
169
 
170
170
  | # | Action | Why |
171
- |---|--------|-----|
171
+ | --- | -------- | ----- |
172
172
  | 1 | Reuse the Step-1 `spur task show --json` capture for the rest of the run | Avoids re-tokenizing the full task body |
173
173
  | 2 | Do not re-Read SKILL.md / report-template after Phase 1 loaded them | Skill body is large; keep one copy in context |
174
174
  | 3 | Prefer `--json` CLI over re-parsing freeform prose | Smaller, stable payloads |
@@ -25,7 +25,7 @@ colon form — the dash form `sp-dogfood-testing@…` is rejected in new runs.
25
25
  Every dogfood run **always** writes **two** files — with or without `--save`:
26
26
 
27
27
  | Artifact | Path | Role |
28
- |----------|------|------|
28
+ | ---------- | ------ | ------ |
29
29
  | **Live** | `.spur/run/dogfood/<run_id>.md` | Mid-run SSOT; opened in Phase 1; ledger rows appended on every step resolve |
30
30
  | **Report** | `docs/dogfood/YYYY-MM-DD-<testee-slug>-dogfood.md` | Operator artifact; same content promoted on open + every step + finalize |
31
31
 
@@ -59,7 +59,7 @@ workspace_fingerprint: ← optional — recorded in Phase 1 for fix-mode and
59
59
  ### Status model (partial-OK)
60
60
 
61
61
  | `status` | When |
62
- |----------|------|
62
+ | ---------- | ------ |
63
63
  | `running` | Phase 1 opened; steps still in progress |
64
64
  | `aborted` | Finalize-or-abort after mid-run stop / incomplete narrative |
65
65
  | `complete` | Phase 4 finished a normal end-of-run report |
@@ -238,6 +238,7 @@ downstream task creation does not inherit an unactionable acceptance criterion:
238
238
  The tag is a prompt to whoever turns findings into tasks: `[stale]` → drop, `[unverifiable]` →
239
239
  reframe or defer, `[feasible]` → proceed. A finding without a tag is treated as `[feasible]`.
240
240
  Severity scale:
241
+
241
242
  - **P1** — blocks correct use or causes drift/wrong output; fix before shipping the testee.
242
243
  - **P2** — real friction or a latent correctness gap; fix soon. **Includes mandatory workspace-drift
243
244
  finding:** when a drift row (`drift:external`) is present in the ledger, a P2 finding naming the
@@ -310,6 +311,7 @@ Findings (P1+P2):
310
311
  ```
311
312
 
312
313
  Rules:
314
+
313
315
  - **Result** and **Tokens** lines are mandatory; always tag token numbers `[~estimate]`.
314
316
  - List Fixed / Unresolved / Findings; print `(none)` when empty — never omit a sub-list.
315
317
  - With `--full`, Findings include P3+P4.
@@ -139,14 +139,23 @@ sessions (typed ETL via `spur history` — or raw JSONL under the three fallback
139
139
  **Primary path (typed sources):** `spur history report --mode forensics` (task 0555).
140
140
 
141
141
  ```bash
142
- # 0568 R4: SPUR_BIN env > local CLI > PATH stale PATH spur fails history import.
143
- SPUR_BIN="${SPUR_BIN:-$([ -f apps/cli/src/index.ts ] && echo 'bun apps/cli/src/index.ts' || echo spur)}"
144
-
145
- $SPUR_BIN history import --source <source> --json # checkpoint resume
146
- $SPUR_BIN history analyze --json # writes versioned artifact (0554)
147
- $SPUR_BIN history report --mode forensics # pure renderer; latest artifact pointer
142
+ # 0568 R4 / 0504 R4: SPUR_BIN env > local CLI. NEVER a bare PATH `spur` for history validation —
143
+ # a stale global binary silently runs old code. If SPUR_BIN is unset and apps/cli/src/index.ts
144
+ # is absent, FAIL LOUDLY instead of falling back to PATH.
145
+ SPUR_BIN="${SPUR_BIN:-$([ -f apps/cli/src/index.ts ] && echo 'bun apps/cli/src/index.ts' || echo '')}"
146
+ [ -n "$SPUR_BIN" ] || { echo 'REFUSING: no source-local spur and SPUR_BIN unset (0504 R4)'; exit 1; }
147
+
148
+ $SPUR_BIN history import --source <source> --json # checkpoint resume; record provenance header
149
+ $SPUR_BIN history analyze --sessions <ids> --source <src> --json # narrow the artifact (T2: full run → 2.7 MB trap)
150
+ $SPUR_BIN history report --mode forensics # pure renderer; reads the LATEST artifact — verify it is the one you just wrote
148
151
  ```
149
152
 
153
+ **Artifact-size discipline:** `history analyze` without narrowing writes an artifact covering every
154
+ session in the DB — multi-MB blobs that drown the context. Narrow with `--sessions` / `--source` to
155
+ the corpus this investigation actually needs. `history report` renders whatever artifact the latest
156
+ pointer references; if you ran analyze for another purpose in between, re-run analyze (narrowed)
157
+ before reporting.
158
+
150
159
  The forensics renderer emits **8 CLI-derivable sections**: Session Data Summary, Tool Breakdown,
151
160
  Token Profile (tokens + cache-hit ratio — never prices), Time Decomposition, Per-Phase, Per-Tool
152
161
  Execution Time, Bottleneck Ranking, and the Raw Data appendix. The CLI does not write the
@@ -271,7 +280,9 @@ EOF
271
280
  spur task update <wbs> --section Background --from-file /tmp/issue-bg.md --json
272
281
  ```
273
282
 
274
- **Required sections for a meta issue-finding task:**
283
+ **Recommended sections for a meta issue-finding task** (live matrix `.spur/tasks/section-matrix.yaml`
284
+ meta variant — `Root Cause` is allowed at every status; `Notes` and `References` are **not** defined
285
+ sections and must not be authored):
275
286
 
276
287
  | Section | Content |
277
288
  | ------------------- | ---------------------------------------------------------------------------------------------------- |
@@ -281,17 +292,18 @@ spur task update <wbs> --section Background --from-file /tmp/issue-bg.md --json
281
292
  | Q&A | 4–6 Q&A pairs: rationale, approach, hook vs guidance, savings, decomposition |
282
293
  | Design | Per-fix evidence (counts, timestamps), fix content, target location |
283
294
  | Plan | Ordered checkboxes referencing requirements |
284
- | Notes | Root-cause analyses (RC1–RC*n*) with forensic evidence (meta template: **not** a Root Cause section) |
285
- | References | Session JSONL paths, source/agent, guard `file:line`, pipeline YAML, commits |
295
+ | Root Cause | RC1–RC*n* analyses with forensic evidence allowed at every status for meta tasks |
296
+
286
297
 
287
298
  **Section format rules** (from task 0379):
288
299
 
289
300
  1. **Solution `file:line` citations**: repo-relative `file:line` (e.g. `apps/web/src/components/SupervisorTab.tsx:17-20`), never bare `:line` or bare filename without path.
290
301
  2. **Review P1–P4 table**: if a Review section exists, include a table with a cell matching
291
302
  `/^\s*P[1-4]\s*$/` and a non-placeholder content cell.
292
- 3. **Meta template**: no `Root Cause` section put analyses in `Notes`.
303
+ 3. **Meta template**: `Root Cause` is allowed at every status for meta tasks (live matrix) —
304
+ put RC analyses there, never in `Notes` or `References` (undefined sections).
293
305
  4. **Canonical sections only**: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`,
294
- `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `References`, `History`, `Notes`.
306
+ `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `History`.
295
307
  5. **Section body**: body-only for `--section` (no duplicate heading).
296
308
  6. **Batch writes**: write all section temps → apply all `spur task update --section` calls →
297
309
  **one** `spur task check`. Never write-check-rewrite-check per section.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spur-cli
3
- description: "The CLI facade for the `spur` command surface - one reference per noun (task/feature/rule/workflow/agent/message/team/init/status/serve): verbs, flags, `--json` shapes, exit codes, the CLI-gated write contract. NOT for driving the lifecycle (that is the spine, sp:spur-dev). Triggers: \"spur task\", \"spur feature\", \"spur rule\", \"spur workflow\", \"spur agent\", \"spur message\", \"spur team\", \"spur status\", \"spur init\", \"spur serve\", \"create a task\", \"task check\", \"batch-create\", or looking up any spur CLI verb or convention."
3
+ description: "The CLI facade for the `spur` command surface - one reference per noun (task/feature/rule/workflow/builder/agent/message/team/self): verbs, flags, `--json` shapes, exit codes, the CLI-gated write contract. NOT for driving the lifecycle (that is the spine, sp:spur-dev). Triggers: \"spur task\", \"spur feature\", \"spur rule\", \"spur workflow\", \"spur agent\", \"spur message\", \"spur team\", \"spur self\", \"spur self init\", \"spur self status\", \"create a task\", \"task check\", \"batch-create\", or looking up any spur CLI verb or convention."
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: spur
@@ -14,12 +14,11 @@ metadata:
14
14
  - feature
15
15
  - rule
16
16
  - workflow
17
+ - builder
17
18
  - agent
18
19
  - message
19
20
  - team
20
- - status
21
- - init
22
- - serve
21
+ - self
23
22
  openclaw:
24
23
  emoji: "🧰"
25
24
  ---
@@ -27,7 +26,7 @@ metadata:
27
26
  # spur-cli — the CLI facade for the Spur command surface
28
27
 
29
28
  `spur-cli` is the single reference for operating the **`spur` command-line surface**. Each `spur`
30
- noun (`task`, `feature`, `rule`, `workflow`, `agent`, `message`, `team`, `init`, `status`, `serve`) has one reference file that documents *what each verb
29
+ noun (`task`, `feature`, `rule`, `workflow`, `builder`, `agent`, `message`, `team`, `self`) has one reference file that documents *what each verb
31
30
  is, how to use it well, its flags, `--json` shapes, and exit codes*. This skill is a **facade /
32
31
  dispatch reference** — it tells you which verb does what and routes you to the noun's detail. It is
33
32
  **not** an orchestrator and contains **no competency logic**: the skill knows *how to invoke*; the
@@ -38,17 +37,17 @@ CLI knows *what is valid*; the **spine** (`sp:spur-dev`) knows *how to drive the
38
37
  Pick the noun, read its reference. Each Tier A and Tier B reference owns that noun's full verb catalog and conventions.
39
38
 
40
39
  | Tier | Noun | Operate | Reference |
41
- |------|------|---------|-----------|
40
+ | ------ | ------ | --------- | ----------- |
42
41
  | **Tier A** | **task** | Task corpus: create (variants), `deps` mutation, canonical `sections` (`init`/`add`/`list`), status lifecycle, `record`/`verdict` artifacts, `run-link`, `check --json` matrix | [references/tasks.md](references/tasks.md) |
43
42
  | **Tier A** | **feature** | Feature tree: author with hierarchical IDs (DD-14), acceptance criteria (Gherkin), status lifecycle, move subtrees, `check --json` | [references/features.md](references/features.md) |
44
43
  | **Tier A** | **rule** | Constraint quality gate: run presets, author rules, fine-tune, validate rule files/presets, extend engine | [references/rules.md](references/rules.md) |
45
44
  | **Tier A** | **workflow** | Dual-mode workflow runtime: author state-machine / transition-flow workflows, validate, run, read traces | [references/workflows.md](references/workflows.md) |
45
+ | **Tier A** | **builder** | Release plumbing: bump a package (or the `workspace:`-pinned set) with `bump-ver`, delete release tags with `drop-tags`, commit + tag + optional push | [references/builder.md](references/builder.md) |
46
46
  | **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, manage team agent specs, persistent self-draining loop, readiness check | [references/agent.md](references/agent.md) |
47
47
  | **Tier B** | **message** | Durable inter-agent messaging: send, inbox, reply, watch | [references/message.md](references/message.md) |
48
48
  | **Tier B** | **team** | Team coordination and supervision: assign, status, up/down rosters, start/stop supervised processes | [references/team.md](references/team.md) |
49
- | **Tier B** | **init** / **status** | Project scaffolding (`init`) + status overview; post-scaffold init validation probes & layout classification | [references/init.md](references/init.md) |
50
- | **Tier B** | **serve** | Local web server fallback: Task Kanban + team supervisor API | [references/serve.md](references/serve.md) |
51
- | **Tier C** | **history** / **migrate** / **projects** / **help** | Excluded while immature (see exclusion reasons below). Read `spur <noun> --help` as last resort | Last-resort `--help` |
49
+ | **Tier B** | **self** | Self-management verbs: scaffold (`init`), schema migrations (`migrate`), local web server (`serve`), status overview (`status`); `self init` runs post-scaffold validation probes & layout classification | [references/self.md](references/self.md) |
50
+ | **Tier C** | **history** / **projects** / **help** | Excluded while immature (see exclusion reasons below). Read `spur <noun> --help` as last resort | Last-resort `--help` |
52
51
 
53
52
  **Execute-First Contract:** Load `sp:spur-cli` references first to execute Tier A and Tier B commands directly without calling `spur --help`. Use `spur <noun> --help` only as a last resort for Tier C nouns, version skew, unlisted long-tail flags, or parity assertion failures.
54
53
 
@@ -57,9 +56,8 @@ Pick the noun, read its reference. Each Tier A and Tier B reference owns that no
57
56
  These nouns are intentionally undocumented - each has a concrete immaturity reason, not an oversight:
58
57
 
59
58
  | Noun | Reason |
60
- |------|--------|
59
+ | ------ | -------- |
61
60
  | `history` | `report` verb is a TODO stub (`spur history report` prints a marker); surface is still converging. |
62
- | `migrate` | Zero verbs - bare `spur migrate --json` runs schema migrations. No verb catalog to document. |
63
61
  | `projects` | Multi-project management surface (`add`/`remove`/`list`/`start`/`stop`); still evolving and not yet stable enough for a reference. |
64
62
  | `help` | Auto-generated by Commander.js; not a real noun. |
65
63
 
@@ -105,6 +103,17 @@ the whole point of this facade is that the CLI surface has a single, scalable ho
105
103
  semantics — including task and feature status-transition verbs — while multi-step lifecycle
106
104
  orchestration belongs to `sp:spur-dev`.
107
105
 
106
+ ## Shared option registry (0618)
107
+
108
+ Options shared by two or more command modules are declared once in
109
+ `apps/cli/src/commands/shared-options.ts` and spread at every call site
110
+ (`.option(...SHARED_OPTIONS.<key>)` — parser/default/collector args append after the spread). One
111
+ registry entry per **(flag, description) pair**: semantic homonyms (`--json`,
112
+ `--cwd`) keep separate keys with their distinct texts. When editing a command module, never
113
+ re-declare a shared flag inline — `apps/cli/tests/shared-option-parity.test.ts` fails on any literal
114
+ declaration of a flag string in `SHARED_OPTION_FLAGS`. Add a new shared option by adding the entry
115
+ and spreading it; full contract in `docs/04_DESIGN.md` §1.0.1.
116
+
108
117
  ## See also
109
118
 
110
119
  - **[references/agent.md](references/agent.md)** - coding-agent execution surface (`run`, `loop`,
@@ -114,10 +123,9 @@ the whole point of this facade is that the CLI surface has a single, scalable ho
114
123
  `inbox`, `reply`, `watch`).
115
124
  - **[references/team.md](references/team.md)** - team coordination and supervision (`assign`,
116
125
  `status`, `up`/`down`, `start`/`stop`).
117
- - **[references/serve.md](references/serve.md)** - local web server fallback (Task Kanban + team
118
- supervisor API).
119
- - **[references/init.md](references/init.md)** - `spur init` / `spur status` CLI verbs and
120
- post-scaffold init validation (Phase 1.5/1.6 probes).
126
+ - **[references/self.md](references/self.md)** - `spur self init|migrate|serve|status` CLI verbs
127
+ (the four legacy top-level nouns remain hidden aliases). `self init` runs post-scaffold init
128
+ validation (Phase 1.5/1.6 probes).
121
129
  - **`sp:spur-dev`** - the spine that dispatches these verbs into the planning +
122
130
  execution lifecycle. Use it to *drive* work; use this facade to *look up or operate a verb*.
123
131
  - **`plugins/sp/references/roles.md`** — the Layer-1 role→tier table (`scribe` / `coder` /
@@ -215,3 +215,8 @@ spur agent delete worker-1 --force
215
215
  supervision.
216
216
  - **`spur message` (see [message.md](message.md))** - the inbox `--drain` reads from.
217
217
  - **`sp:spur-cli`** SKILL.md - the facade that routes to this reference.
218
+
219
+ > **Shared option declarations (0618):** options shared across command modules resolve from
220
+ > `apps/cli/src/commands/shared-options.ts` (`SHARED_OPTIONS`). Never re-declare a shared flag
221
+ > inline in a command module — see SKILL.md "Shared option registry" and
222
+ > `docs/04_DESIGN.md` §1.0.1.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: spur-cli-builder
3
+ description: "spur-cli noun reference: operate `spur builder` as the release plumbing surface - bump a workspace package (or the `workspace:`-pinned release set) with `bump-ver`, delete release tags with `drop-tags`, with commit + annotated tag + optional push. Promoted from spur-dev (task 0617, ADR-051); frozen at exactly these two verbs."
4
+ see_also:
5
+ - spur-cli
6
+ ---
7
+
8
+ # spur builder - release plumbing
9
+
10
+ `spur builder` is the CLI for **version bumps and release tags**. It wraps the internal
11
+ `spur-dev release` flow behind a public two-verb surface, promoted verbatim from
12
+ `scripts/commands/release.ts` (now a thin forwarder to the same implementation). Package ids are
13
+ the unscoped short names (`@gobing-ai/spur` → `spur`); the released set and the aggregate tag are
14
+ discovered from the repo's own workspace manifests, so the same code serves any git+semver
15
+ monorepo.
16
+
17
+ This noun is **frozen at exactly two verbs** by operator consent (`docs/design/harness-surface-governance.md`
18
+ §3) — do not invent additional `builder` subcommands.
19
+
20
+ ## Verb map
21
+
22
+ | Verb | Purpose | Key flags |
23
+ | ---- | ------- | --------- |
24
+ | `bump-ver [package-id] <version>` | Bump one package (manifest + in-source `binaryVersion` + consumer `workspace:` pins), commit, tag, optionally push | `--all` `--push` `--json` |
25
+ | `drop-tags [package-id] <version>` | Delete a package's release tag (local only by default) | `--all` `--remote` `--json` |
26
+
27
+ A bare `bump-ver <version>` (single positional that parses as semver) or explicit `--all` bumps
28
+ every package pinned via `workspace:` by another workspace package, then adds per-package trace
29
+ tags plus the aggregate `@<scope>/<root>-v<version>` publish tag. `drop-tags --all` mirrors that
30
+ for deletion.
31
+
32
+ **Exit codes:** `0` success, `1` error (invalid semver, unknown package id, dirty tree, detached
33
+ HEAD, or an existing local/origin tag). **Errors abort before any write** — a re-run after fixing
34
+ the cause is safe.
35
+
36
+ ## `bump-ver` - bump and tag a release
37
+
38
+ ```bash
39
+ spur builder bump-ver spur 0.1.4 # one package: manifest, pins, commit, tag @gobing-ai/spur-v0.1.4
40
+ spur builder bump-ver --all 0.1.4 # every workspace:-pinned package + aggregate tag
41
+ spur builder bump-ver --all 0.1.4 --push # also push branch + tags to origin
42
+ ```
43
+
44
+ ## `drop-tags` - delete release tags
45
+
46
+ ```bash
47
+ spur builder drop-tags spur 0.1.4 # delete the local tag @gobing-ai/spur-v0.1.4
48
+ spur builder drop-tags --all 0.1.4 --remote # delete per-package + aggregate tags, locally and on origin
49
+ ```
@@ -158,7 +158,7 @@ work under H.
158
158
  - [ ] Sibling set stays MECE at that parent.
159
159
  - [ ] Name is capability/outcome, not a package path.
160
160
  - [ ] Will attach tasks with `--feature <new-id>` (or parent if intentionally epic-only).
161
- - [ ] After create: `spur feature refresh` if INDEX must update; `spur feature check <id>`.
161
+ - [ ] After create: `spur feature refresh --feature <new-id>` if INDEX must update; `spur feature check <new-id>`.
162
162
 
163
163
  ## Checklist: before restructure / `/sp:dev-feature-change`
164
164
 
@@ -166,7 +166,7 @@ work under H.
166
166
  - [ ] False merges rejected (name overlap ≠ one Goal).
167
167
  - [ ] Apply via CLI (`spur feature move`, `spur task update --feature`), not raw ID edits.
168
168
  - [ ] Dry-run reviewed; doc rewrites limited to agreed surface (e.g. root `docs/*.md`).
169
- - [ ] `spur feature refresh` + `spur feature check` after apply.
169
+ - [ ] `spur feature refresh --all` + `spur feature check --json` after apply.
170
170
 
171
171
  ---
172
172
 
@@ -78,7 +78,7 @@ For roadmap adjustment work:
78
78
  3. Present the proposed moves/status/priority changes before mutating if the blast radius spans
79
79
  multiple features.
80
80
  4. Apply each accepted deterministic change through `spur feature update` or `spur feature move`.
81
- 5. Run `spur feature refresh` and `spur feature check --json`.
81
+ 5. Run `spur feature refresh --all` and `spur feature check --json`.
82
82
 
83
83
  Do not add `/sp:prd-adjust` for this. The current CLI already has the deterministic primitives; the
84
84
  PM value is the ranking and tradeoff judgment.
@@ -116,7 +116,7 @@ spur feature update <id> [status] [--field <k> --value <v>] [--section <n> --fr
116
116
  spur feature advance <id> [--to <status>] [--folder] [--json]
117
117
  spur feature list [--status <s>] [--priority <p>] [--folder] [--json]
118
118
  spur feature move <id> [--parent <id>] [--dry-run] [--folder] [--json]
119
- spur feature refresh [--feature <id>] [--folder] [--json]
119
+ spur feature refresh [--feature <id> | --all] [--folder] [--json]
120
120
  spur feature sync [id] | --all [--dry-run] [--force] [--folder] [--json]
121
121
  spur feature check [id] [--strict] [--folder] [--json]
122
122
  ```
@@ -27,8 +27,8 @@ what* or *how to write a scenario*, this skill.
27
27
  | `advance <id>` | Walk forward along the legal lifecycle path to a target status | `--to <status>` (default `done`) `--folder` `--json` |
28
28
  | `list` | List features, filtered | `--status <s>` `--priority <p>` `--folder` `--json` |
29
29
  | `move <id>` | Re-parent a subtree (cascade-rename of descendants) | `--parent <id>` `--dry-run` `--folder` `--json` |
30
- | `refresh` | Rebuild INDEX + each feature `## Tasks` table from task edges (**docs only**; no status change) | `--feature <id>` `--folder` `--json` |
31
- | `check [id]` | Validate one feature / the tree; the 4-layer gate | `--strict` `--folder` `--json` |
30
+ | `refresh` | Rebuild INDEX + each feature `## Tasks` table from task edges (**docs only**; no status change) | `--feature <id>` `--all` `--folder` `--json` |
31
+ | `check [id]` | Validate one feature / the tree; the 4-layer gate; `--fix` repairs structural findings in place | `--strict` `--fix` `--folder` `--json` |
32
32
  | `sync [id]` | Align feature **lifecycle status** with linked task states (real transitions + guards) | `--all` `--dry-run` `--force` `--folder` `--json` |
33
33
 
34
34
  **`refresh` vs `sync` (do not conflate):**
@@ -157,6 +157,9 @@ the AC coverage map. Habits that keep it green:
157
157
  the files (files win). This is **not** `sync` — it does not change feature status.
158
158
  - **Scope `refresh` to one feature** with `--feature <id>` when only one feature's task links changed
159
159
  (INDEX.md is still regenerated for the whole tree): `spur feature refresh --feature H2`.
160
+ - **The broad sweep is explicit** (task 0625 R5a): bare `spur feature refresh` refuses to sweep; pass
161
+ `--all` to rewrite every feature's `## Tasks` region. A bare sweep silently touched unrelated
162
+ features during the A3 run.
160
163
 
161
164
  ## Roadmap and priority habits
162
165
 
@@ -192,7 +195,7 @@ reopens. It computes a proposal (`from → to` with a `reason`) and, unless `--d
192
195
  via real lifecycle transitions (dogfood / one-active-goal / L4 gates may deny a hop).
193
196
 
194
197
  **Not for roster tables.** A stale `## Tasks` line (e.g. task still listed `todo` after it is `done`)
195
- is fixed with `spur feature refresh`, not `sync`. Use `sync --dry-run` first when you only want to
198
+ is fixed with `spur feature refresh --feature <id>` (or explicit `--all`), not `sync`. Use `sync --dry-run` first when you only want to
196
199
  see the proposed status hop.
197
200
 
198
201
  ```bash
@@ -235,3 +238,8 @@ spur feature sync H2 --folder docs/custom-tasks --json # non-default tasks fol
235
238
  *drive* planning; use this skill to *look up a verb* or *author AC*.
236
239
  - **`spur task` (see [tasks.md](tasks.md))** — the companion for `spur task` (WBS lifecycle, section editing, the
237
240
  readiness matrix).
241
+
242
+ > **Shared option declarations (0618):** options shared across command modules resolve from
243
+ > `apps/cli/src/commands/shared-options.ts` (`SHARED_OPTIONS`). Never re-declare a shared flag
244
+ > inline in a command module — see SKILL.md "Shared option registry" and
245
+ > `docs/04_DESIGN.md` §1.0.1.
@@ -107,3 +107,8 @@ lines.
107
107
  - **`spur agent` (see [agent.md](agent.md))** - `run --drain` and `loop` consume the inbox.
108
108
  - **`spur team` (see [team.md](team.md))** - team lifecycle that assigns agents to tasks.
109
109
  - **`sp:spur-cli`** SKILL.md - the facade that routes to this reference.
110
+
111
+ > **Shared option declarations (0618):** options shared across command modules resolve from
112
+ > `apps/cli/src/commands/shared-options.ts` (`SHARED_OPTIONS`). Never re-declare a shared flag
113
+ > inline in a command module — see SKILL.md "Shared option registry" and
114
+ > `docs/04_DESIGN.md` §1.0.1.
@@ -207,3 +207,8 @@ directly on the command line.
207
207
 
208
208
  **Template type**: technique
209
209
  **Purpose**: Operate `spur rule` across its full lifecycle as the deterministic constraint gate in LLM code delivery
210
+
211
+ > **Shared option declarations (0618):** options shared across command modules resolve from
212
+ > `apps/cli/src/commands/shared-options.ts` (`SHARED_OPTIONS`). Never re-declare a shared flag
213
+ > inline in a command module — see SKILL.md "Shared option registry" and
214
+ > `docs/04_DESIGN.md` §1.0.1.
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: spur-cli-self
3
+ description: "spur-cli noun reference for `spur self`: self-management verbs — scaffold (`init`), schema migrations (`migrate`), local web server (`serve`), and status overview (`status`). Each verb mounts the same command builder as its legacy top-level noun, which remains a hidden alias over the identical command."
4
+ see_also:
5
+ - spur-cli
6
+ ---
7
+
8
+ # spur self - self-management verbs
9
+
10
+ `spur self` hosts the four self-management verbs. Each verb is the canonical path for a command
11
+ that also remains registered as a legacy top-level **hidden alias** (`spur init`, `spur migrate`,
12
+ `spur serve`, `spur status`) so existing scripts, workflow YAML, and habits keep working unchanged.
13
+ Both paths share the same command builder: identical flags, output, and exit codes. The legacy
14
+ top-level forms are omitted from `spur --help`, leaving `self` as the visible surface.
15
+
16
+ ## Verb map
17
+
18
+ | Verb | Purpose | Key flags |
19
+ | ---- | ------- | --------- |
20
+ | `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
21
+ | `migrate` | Apply CLI-owned schema migrations | `--json` |
22
+ | `serve` | Start the Spur web server (local fallback) | `--port <n>` `--host <addr>` `--no-open` `--cwd <path>` `--json` |
23
+ | `status [path]` | Show project and git status for a Spur project | `--json` |
24
+
25
+ **Deep detail lives in the verb-owner references** — **[init.md](init.md)** owns the `init` and
26
+ `status` verbs (scaffold semantics + the Phase 1.5 / 1.6 post-scaffold validation probes),
27
+ **[serve.md](serve.md)** owns the `serve` verb (server flags and dry-probe semantics). `migrate`
28
+ has no reference of its own and is documented inline below.
29
+
30
+ ## `self init` - scaffold a Spur project
31
+
32
+ ```bash
33
+ spur self init # interactive: prompt for project name
34
+ spur self init --name my-project # non-interactive
35
+ spur self init --name my-project --force # overwrite existing .spur/ files
36
+ spur self init --minimal # skip optional scaffolding (rules, workflows)
37
+ spur self init --json # machine-readable
38
+ ```
39
+
40
+ Materializes the `.spur/` directory tree with config, docs, rules, and workflow templates. Flags:
41
+ `--name <name>` (default: current directory name), `--force` (recreate existing files), `--minimal`
42
+ (skip optional scaffolding), `--json` (machine-readable output). Post-scaffold validation probes
43
+ (Phase 1.5 / 1.6) run immediately after this verb completes — see **[init.md](init.md)** for the
44
+ probe protocol and rule-glob adaptation procedure.
45
+
46
+ ## `self migrate` - apply CLI-owned schema migrations
47
+
48
+ ```bash
49
+ spur self migrate # apply pending migrations
50
+ spur self migrate --json # machine-readable { ok, applied }
51
+ ```
52
+
53
+ Temporary helper: applies CLI-owned schema migrations and reports `{ ok, applied }`. Only flag is
54
+ `--json`.
55
+
56
+ ## `self serve` - start the local web server
57
+
58
+ ```bash
59
+ spur self serve # default: localhost:3000, opens browser
60
+ spur self serve --port 8080 --host 0.0.0.0
61
+ spur self serve --no-open # skip browser
62
+ spur self serve --json # dry probe: print { port, url, pid, running } and exit
63
+ ```
64
+
65
+ Starts the Hono/Cloudflare-Worker server that serves the web Task Kanban and exposes the team
66
+ supervisor API (`/api/team/*`). It is the local fallback when no remote server is configured.
67
+ Flags: `--port <n>`, `--host <addr>`, `--no-open`, `--cwd <path>`, `--json` (a dry probe — reports
68
+ the resolved port/url without starting the server). Full flag semantics: **[serve.md](serve.md)**.
69
+
70
+ ## `self status [path]` - project and git status
71
+
72
+ ```bash
73
+ spur self status # current directory
74
+ spur self status /path/to/project # specific project
75
+ spur self status --json # machine-readable
76
+ ```
77
+
78
+ Reports the project's Spur configuration state (init status, feature/task counts, rule preset
79
+ health) and git working-tree status. Optional `[path]` argument targets a different project
80
+ directory. Only flag is `--json`.
81
+
82
+ ## What this skill is NOT
83
+
84
+ - **Not the team supervisor.** `self serve` hosts the supervisor API; `spur team start` / `stop` /
85
+ `status` are the verbs that drive it. See **[team.md](team.md)**.
86
+ - **Not a production server.** This is the local fallback. Production deployment uses the Cloudflare
87
+ Worker build (`apps/server/`), not `self serve`.
88
+
89
+ ## See also
90
+
91
+ - **[init.md](init.md)** - `init` / `status` verbs: scaffold semantics and the Phase 1.5 / 1.6
92
+ post-scaffold validation probes.
93
+ - **[serve.md](serve.md)** - `serve` verb: server flags and the `--json` dry-probe contract.
94
+ - **`spur team` (see [team.md](team.md))** - `start`/`stop`/`status` require `self serve` for the
95
+ supervisor API.
96
+ - **`sp:spur-cli`** SKILL.md - the facade that routes to this reference.
97
+
98
+ > **Shared option declarations (0618):** options shared across command modules resolve from
99
+ > `apps/cli/src/commands/shared-options.ts` (`SHARED_OPTIONS`). Never re-declare a shared flag
100
+ > inline in a command module — see SKILL.md "Shared option registry" and
101
+ > `docs/04_DESIGN.md` §1.0.1.
@@ -51,7 +51,7 @@ re-reading or re-tokenizing the task.
51
51
  | `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--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; the readiness matrix | `--strict` `--as <status>` `--strict-core` `--folder` `--json` |
54
+ | `check [wbs]` | Four-layer validation; the readiness matrix; `--fix` repairs structural findings in place | `--strict` `--as <status>` `--strict-core` `--fix` `--folder` `--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` |
@@ -310,3 +310,8 @@ spur task path 0040 --json
310
310
  execution loop. Use it to *drive* work; use this skill to *look up a verb*.
311
311
  - **`spur feature` (see [features.md](features.md))** — the companion for `spur feature` (hierarchical IDs, AC conventions,
312
312
  traceability).
313
+
314
+ > **Shared option declarations (0618):** options shared across command modules resolve from
315
+ > `apps/cli/src/commands/shared-options.ts` (`SHARED_OPTIONS`). Never re-declare a shared flag
316
+ > inline in a command module — see SKILL.md "Shared option registry" and
317
+ > `docs/04_DESIGN.md` §1.0.1.
@@ -138,3 +138,8 @@ process spawning. The started process runs `spur agent loop --agent <id>` under
138
138
  - **`spur message` (see [message.md](message.md))** - the durable inbox team members drain.
139
139
  - **`spur serve` (see [serve.md](serve.md))** - the local server `start`/`stop`/`status` require.
140
140
  - **`sp:spur-cli`** SKILL.md - the facade that routes to this reference.
141
+
142
+ > **Shared option declarations (0618):** options shared across command modules resolve from
143
+ > `apps/cli/src/commands/shared-options.ts` (`SHARED_OPTIONS`). Never re-declare a shared flag
144
+ > inline in a command module — see SKILL.md "Shared option registry" and
145
+ > `docs/04_DESIGN.md` §1.0.1.