@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.
- package/.claude-plugin/marketplace.json +2 -3
- package/config/corpus-baseline.json +2748 -68
- package/config/rules/strict/runtime-boundaries.yaml +3 -0
- package/config/rules/surface/check-cli-surface.yaml +1 -0
- package/config/workflow-composition-baseline.json +242 -23
- package/config/workflows/wrapup-pipeline.yaml +31 -1
- package/package.json +9 -9
- package/plugins/README.md +1 -1
- package/plugins/sp/README.md +1 -1
- package/plugins/sp/agents/expert-spur.md +4 -1
- package/plugins/sp/commands/dev-feature-change.md +2 -2
- package/plugins/sp/commands/dev-idea.md +7 -19
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/task-size-precheck.ts +11 -6
- package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +4 -4
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +4 -2
- package/plugins/sp/skills/issue-finding/SKILL.md +23 -11
- package/plugins/sp/skills/spur-cli/SKILL.md +23 -15
- package/plugins/sp/skills/spur-cli/references/agent.md +5 -0
- package/plugins/sp/skills/spur-cli/references/builder.md +49 -0
- package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +2 -2
- package/plugins/sp/skills/spur-cli/references/features/roadmap-priority.md +1 -1
- package/plugins/sp/skills/spur-cli/references/features/verbs.md +1 -1
- package/plugins/sp/skills/spur-cli/references/features.md +11 -3
- package/plugins/sp/skills/spur-cli/references/message.md +5 -0
- package/plugins/sp/skills/spur-cli/references/rules.md +5 -0
- package/plugins/sp/skills/spur-cli/references/self.md +101 -0
- package/plugins/sp/skills/spur-cli/references/tasks.md +6 -1
- package/plugins/sp/skills/spur-cli/references/team.md +5 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +40 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +1 -1
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +9 -8
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +19 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +27 -5
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +1 -1
- package/spur.js +5060 -553
- package/web/_astro/BoardApp.CrusGeQ4.js +1 -0
- package/web/_astro/BoardApp.P8SRAD5Q.js +179 -0
- package/web/_astro/{TaskDetail.DN_RxS-2.js → TaskDetail.DHjEt5vl.js} +1 -1
- package/web/_astro/{arc.CldTHRg-.js → arc.XgRC1Ij_.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.DQ4T9oeU.js → architectureDiagram-3BPJPVTR.DOZWrfHc.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.CGDaXH8J.js → blockDiagram-GPEHLZMM.ClQnCGf_.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.Cqsc2iub.js → c4Diagram-AAUBKEIU.CKCtUD0Y.js} +1 -1
- package/web/_astro/channel.CmK546kO.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.CQSKsRmq.js → chunk-2J33WTMH.c7J8OHq5.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.Pv1HCtp8.js → chunk-4BX2VUAB.C-A1Dv27.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.-9MseOIk.js → chunk-55IACEB6.C4kGGALB.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.M3OI1DF7.js → chunk-727SXJPM.Bith2NHt.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.NfHka5Ca.js → chunk-AQP2D5EJ.qeSXhsVY.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.B2suYe3s.js → chunk-FMBD7UC4.DdQQnTAy.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.BfJ7aucP.js → chunk-ND2GUHAM.BZYQVeZd.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN._582hZVc.js → chunk-QZHKN3VN.BiUWwHaV.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK._tttU_jk.js → classDiagram-4FO5ZUOK.OGRhcldh.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2._tttU_jk.js → classDiagram-v2-Q7XG4LA2.OGRhcldh.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.C4rVATLQ.js → cose-bilkent-S5V4N54A.DxYklM_j.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.8BLRi7f9.js → dagre-BM42HDAG.BSb2dEbo.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.D6lwUZos.js → diagram-2AECGRRQ.mOrItPK2.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Cl_rMiVT.js → diagram-5GNKFQAL.C99r7J3C.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.DhMExHLp.js → diagram-KO2AKTUF.BKbnisJO.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.3OAxzH_o.js → diagram-LMA3HP47.D8FJGo4V.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Uh9RLucG.js → diagram-OG6HWLK6.DVBs7n4Q.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.izzElG0c.js → erDiagram-TEJ5UH35.CddMTl4l.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.BlGwp5qM.js → flowDiagram-I6XJVG4X.B7WclnjQ.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.je7Vf8dN.js → ganttDiagram-6RSMTGT7.CRh7ggvz.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.DNk0Ycop.js → gitGraphDiagram-PVQCEYII.du-L7V8A.js} +1 -1
- package/web/_astro/index.B4x8fe52.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.K2HhGyWH.js → infoDiagram-5YYISTIA.CClGl9Px.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.BbbOW4IN.js → ishikawaDiagram-YF4QCWOH.BuTETIPz.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.B1UaZKqN.js → journeyDiagram-JHISSGLW.Cyg1zCiE.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.9tsw5QFd.js → kanban-definition-UN3LZRKU.aH8eDXwX.js} +1 -1
- package/web/_astro/{linear.I9dvtu-j.js → linear.paE_RY_i.js} +1 -1
- package/web/_astro/{mermaid.core.5bKJsMgf.js → mermaid.core.BhdKkI85.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BC5MqSn6.js → mindmap-definition-RKZ34NQL.aZNfv8Nx.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.B8GIMyxD.js → pieDiagram-4H26LBE5.5psni0hC.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.K_aZSM_u.js → quadrantDiagram-W4KKPZXB.DcGPGrFd.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.B_V5kzfT.js → requirementDiagram-4Y6WPE33.BwPD2lzi.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.DyV2quLS.js → sankeyDiagram-5OEKKPKP.B3jGVk0l.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.BlKvPnBv.js → sequenceDiagram-3UESZ5HK.BdWsx3LW.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.C1lYUMdS.js → stateDiagram-AJRCARHV.DRpG4ClZ.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.DJWjr3QV.js → stateDiagram-v2-BHNVJYJU.Su0ML9Wo.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.CYYiXVlv.js → timeline-definition-PNZ67QCA.Cg_Uv8A5.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.zYjQKa_S.js → vennDiagram-CIIHVFJN.DVouKT4b.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.BGrWTY3D.js → wardley-L42UT6IY.CexIVQli.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.CkXxtcI1.js → wardleyDiagram-YWT4CUSO.ChSAzcvx.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.BhKH3KG3.js → xychartDiagram-2RQKCTM6.CN-Yp50J.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.DCLSB3Zs.js +0 -179
- package/web/_astro/BoardApp.Dx5gzAhb.js +0 -1
- package/web/_astro/channel.CrBJYpxo.js +0 -1
- 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**
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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.
|
package/plugins/sp/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sp",
|
|
3
|
-
"version": "0.3.
|
|
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
|
|
148
|
-
|
|
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 ${
|
|
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
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
$SPUR_BIN
|
|
146
|
-
$SPUR_BIN
|
|
147
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
|
285
|
-
|
|
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**:
|
|
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`, `
|
|
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/
|
|
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
|
-
-
|
|
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`, `
|
|
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** | **
|
|
50
|
-
| **Tier
|
|
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/
|
|
118
|
-
|
|
119
|
-
|
|
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
|
|
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
|
|
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.
|