@gobing-ai/spur 0.4.9 → 0.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/rules/README.md +1 -1
- package/config/rules/boundary/env-var-hygiene.yaml +0 -1
- package/config/rules/boundary/sp-script-placement.yaml +3 -3
- package/config/rules/docs/sourced-api-claims.yaml +23 -96
- package/config/workflows/feature-verification.yaml +1 -9
- package/config/workflows/pr-review.yaml +72 -224
- package/config/workflows/task-pipeline.yaml +2 -2
- package/package.json +1 -1
- package/plugins/sp/agents/expert-spur.md +0 -1
- package/plugins/sp/commands/dev-changelog.md +1 -1
- package/plugins/sp/commands/dev-pr-review.md +27 -17
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/skills/brainstorm/SKILL.md +12 -11
- package/plugins/sp/skills/brainstorm/agents/openai.yaml +1 -1
- package/plugins/sp/skills/brainstorm/examples/ideation-example.md +0 -4
- package/plugins/sp/skills/brainstorm/metadata.openclaw +1 -1
- package/plugins/sp/skills/brainstorm/references/workflows.md +4 -14
- package/plugins/sp/skills/code-verification/references/secu-review.md +7 -4
- package/plugins/sp/skills/history-anatomy/references/operations.md +3 -4
- package/plugins/sp/skills/history-anatomy/references/report-contract.md +2 -3
- package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
- package/plugins/sp/skills/parallel-execution/SKILL.md +1 -1
- package/plugins/sp/skills/parallel-execution/references/result-synthesis.md +9 -10
- package/plugins/sp/skills/pr-reviewing/SKILL.md +157 -210
- package/plugins/sp/skills/reverse-engineering/SKILL.md +4 -6
- package/plugins/sp/skills/session-review/SKILL.md +10 -26
- package/plugins/sp/skills/source-driven-development/SKILL.md +35 -31
- package/plugins/sp/skills/spur-cli/SKILL.md +1 -1
- package/plugins/sp/skills/spur-cli/references/agent.md +5 -2
- package/plugins/sp/skills/spur-cli/references/builder.md +86 -13
- package/plugins/sp/skills/spur-cli/references/features.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +1 -1
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +5 -6
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +1 -1
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +3 -2
- package/spur.js +1280 -417
- package/web/_astro/{BoardApp.CaNvQBD_.js → BoardApp.B5rTVNd_.js} +1 -1
- package/web/_astro/{BoardApp.C5jnkkKP.js → BoardApp.BMprmPRc.js} +141 -141
- package/web/_astro/{TaskDetail.DGKndhI8.js → TaskDetail.Ddsur8qd.js} +1 -1
- package/web/_astro/{arc.DHrwdg3G.js → arc.DLqVVBxP.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.pvKpK1s5.js → architectureDiagram-3BPJPVTR.C-Pk3uAi.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.BQmRcZsS.js → blockDiagram-GPEHLZMM.BRO1i_Nm.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.CCLjHeH1.js → c4Diagram-AAUBKEIU.BU_cWu6e.js} +1 -1
- package/web/_astro/channel.Bs3Illhy.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.DL6Yuoma.js → chunk-2J33WTMH.D2VXiQ2t.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.CzlyEI7l.js → chunk-4BX2VUAB.BcHT772J.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.B60EWxp1.js → chunk-55IACEB6.DhDtICmo.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.c7v_fRLo.js → chunk-727SXJPM.BoKHp7gV.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.8BxLWdDc.js → chunk-AQP2D5EJ.Chu4JRpE.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.DmKuxGFT.js → chunk-FMBD7UC4.wHdwKPlq.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.1Zwd4mqV.js → chunk-ND2GUHAM.ffN-M1JB.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.BvYLu-A1.js → chunk-QZHKN3VN.FRubwg4S.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CEqRt0WU.js → classDiagram-4FO5ZUOK.c22tQsc_.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CEqRt0WU.js → classDiagram-v2-Q7XG4LA2.c22tQsc_.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.C7JiUdj2.js → cose-bilkent-S5V4N54A.B9c6fiSj.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.B6mZ-1be.js → cynefin-OW5HDTMX.DrZsrUHl.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.BuryfDy6.js → dagre-BM42HDAG.DG1U4b3y.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.dao39YQM.js → diagram-2AECGRRQ.CH15b-K3.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.lnGZe4At.js → diagram-5GNKFQAL.BH1j7twR.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.uWfhzEfT.js → diagram-KO2AKTUF.q2zCkbAj.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.ppq8-198.js → diagram-LMA3HP47.BLaaZnHV.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.CKSCqDt5.js → diagram-OG6HWLK6.BcpRdQwI.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.sFSf2yBN.js → erDiagram-TEJ5UH35.D7KBlqfM.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.BJQjKLbz.js → flowDiagram-I6XJVG4X.D_gmuRqg.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DAHKNj2N.js → ganttDiagram-6RSMTGT7.DzgWYniD.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.BlmzcW_O.js → gitGraphDiagram-PVQCEYII.576i3hm3.js} +1 -1
- package/web/_astro/index.DiC1a6lh.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.DGhjaqsi.js → infoDiagram-5YYISTIA.DMCclBiz.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.gKIpgt6F.js → ishikawaDiagram-YF4QCWOH.9Kyca4SH.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.DG3tmP0R.js → journeyDiagram-JHISSGLW.chbdG-8q.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.CgHDSxkR.js → kanban-definition-UN3LZRKU.Bds54-e0.js} +1 -1
- package/web/_astro/{linear.BuGEpcuM.js → linear.D5ND9GN_.js} +1 -1
- package/web/_astro/{mermaid.core.DBVqkWBp.js → mermaid.core.D9N_PGbj.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.D-kOcji9.js → mindmap-definition-RKZ34NQL.t0xop5vp.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.BvGPwtZt.js → pieDiagram-4H26LBE5.DqgKh6hM.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.BKb_9FV6.js → quadrantDiagram-W4KKPZXB.DeuHVi2t.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.Cx0fvD8v.js → requirementDiagram-4Y6WPE33.BdYFSG4W.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.fatULi0W.js → sankeyDiagram-5OEKKPKP.k1LPPETJ.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.ChHyKqco.js → sequenceDiagram-3UESZ5HK.DdyfpzoG.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BdUpKWyj.js → stateDiagram-AJRCARHV.DSEI8il0.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.fmJxqIm5.js → stateDiagram-v2-BHNVJYJU.CoMnQRKo.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BayDn5-V.js → timeline-definition-PNZ67QCA.DM1AHNm-.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.Bm2Aggwa.js → vennDiagram-CIIHVFJN.C-cJmVtl.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.DI75O-uG.js → wardleyDiagram-YWT4CUSO.D0xMzKPb.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DL90E7Q7.js → xychartDiagram-2RQKCTM6.BH5xJcEq.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/channel.C7wG9RxA.js +0 -1
- package/web/_astro/index.BCY1JJHd.css +0 -1
|
@@ -55,27 +55,31 @@ Do **not** use this skill for:
|
|
|
55
55
|
|
|
56
56
|
- **Your own code's correctness** — that is `sp:code-verification` (requirements/AC) and `sp:code-review`.
|
|
57
57
|
- **Stress-testing a design decision** — that is `sp:doubt-driven-development` (artifact vs contract).
|
|
58
|
-
- **Well-known, version-stable stdlib** you
|
|
58
|
+
- **Well-known, version-stable stdlib** you have already checked — verification has a cost;
|
|
59
59
|
spend it where being wrong is likely and expensive.
|
|
60
60
|
|
|
61
61
|
## The process
|
|
62
62
|
|
|
63
|
-
### Step 1 —
|
|
63
|
+
### Step 1 — Know where each fact came from before you write
|
|
64
64
|
|
|
65
|
-
|
|
|
66
|
-
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
|
|
|
65
|
+
| Source in hand | Action |
|
|
66
|
+
|---|---|
|
|
67
|
+
| Checked against the pinned version's docs/source **this session** | Generate; cite the source inline |
|
|
68
|
+
| Recalled from a prior session; plausibly stale | Verify before relying on it |
|
|
69
|
+
| Memory only, no source in hand | Stop — verify first; never present as fact |
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
Every claim carries its citation **and an earned confidence level** — `HIGH|MEDIUM|LOW`: `HIGH`
|
|
72
|
+
cites (`path:line`, a URL, or a path with a code/doc extension), `MEDIUM`/`LOW` cite or name what is
|
|
73
|
+
unverified. That grade is evidence, not self-assessment, so it can only be as strong as what is cited
|
|
74
|
+
beside it. ADR-138 still forbids a confidence label on a verdict or verify answer, where the citation
|
|
75
|
+
alone is the evidence.
|
|
72
76
|
|
|
73
77
|
### Step 2 — Go to the primary source, in priority order
|
|
74
78
|
|
|
75
79
|
1. The **type signature / source** in the installed, pinned dependency (the ground truth for *this* build).
|
|
76
80
|
2. The **official docs for the pinned version** (not the latest — the version in the lockfile).
|
|
77
81
|
3. Authoritative references when docs are thin.
|
|
78
|
-
4. Memory —
|
|
82
|
+
4. Memory — never the final authority; verify before relying on it.
|
|
79
83
|
|
|
80
84
|
State the **version** inline whenever behavior is version-specific.
|
|
81
85
|
|
|
@@ -88,43 +92,44 @@ State the **version** inline whenever behavior is version-specific.
|
|
|
88
92
|
### Step 4 — Cite, then generate
|
|
89
93
|
|
|
90
94
|
Generate the code and **cite the source** (doc URL + date, or `pkg@version` + the file/symbol) at the
|
|
91
|
-
point of use or in the task's notes
|
|
92
|
-
unverified — flag it as such rather than presenting it as
|
|
93
|
-
|
|
94
|
-
### Step 5 — Close with a verification verdict
|
|
95
|
+
point of use or in the task's notes, with the claim's earned `HIGH|MEDIUM|LOW` level beside it. A claim
|
|
96
|
+
about external behavior without a citation is unverified — flag it as such rather than presenting it as
|
|
97
|
+
fact.
|
|
95
98
|
|
|
96
|
-
|
|
97
|
-
line: `Verification: HIGH|MEDIUM|LOW — <first failing check and deviation, or 'all checks passed'>`.
|
|
99
|
+
### Step 5 — Check the citations before finishing
|
|
98
100
|
|
|
99
101
|
- **Citation coverage** — every API/library claim in the output carries a source citation (doc URL + date, or `pkg@version` + file/symbol); no uncited claim is asserted as fact.
|
|
100
102
|
- **Source authority** — each citation points at the pinned version's primary source (installed signature/source, or official docs for the lockfile version), not the latest docs or memory.
|
|
101
|
-
- **
|
|
102
|
-
|
|
103
|
+
- **Claim confidence** — every API/library claim carries an earned level inside `HIGH|MEDIUM|LOW`: `HIGH` cites evidence, `MEDIUM`/`LOW` cite or name what is unverified. A level outside the enum, or one nothing cited earns, is a defect.
|
|
104
|
+
|
|
105
|
+
Report the first failing check and its deviation, if any. This grade lives on the claim: do not append
|
|
106
|
+
a confidence verdict or a `Confidence:` line to the answer (ADR-138).
|
|
103
107
|
|
|
104
|
-
Deterministic backstop: the `cited-version-strings
|
|
105
|
-
`cited-api-claims-confidence` and `cited-high-confidence` rules
|
|
108
|
+
Deterministic backstop: the `cited-version-strings` and `cited-api-claims` rules
|
|
106
109
|
(`.spur/rules/docs/sourced-api-claims.yaml`) flag markdown lines that assert a version string or a
|
|
107
|
-
time-anchored API claim
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
this contract and are deliberately NOT wired into `recommended-pre-check` — run them ad
|
|
112
|
-
`spur rule run --file .spur/rules/docs/sourced-api-claims.yaml`.
|
|
113
|
-
|
|
110
|
+
time- or version-anchored API claim (`deprecated since`, `removed in 0.9`, `fixers (since 0.3.4)`)
|
|
111
|
+
with no citation anchor on the same line. Where a project runs the claim-table companion
|
|
112
|
+
(`structure/api-library-claim-citation`), the rows of an `API/library claim sources and confidence`
|
|
113
|
+
block are checked the same way — citation present, level earned. They are an info-severity advisory
|
|
114
|
+
backstop for this contract and are deliberately NOT wired into `recommended-pre-check` — run them ad
|
|
115
|
+
hoc with `spur rule run --file .spur/rules/docs/sourced-api-claims.yaml`. Dated working records
|
|
116
|
+
(`docs/report*`, `docs/dogfood`, `docs/plans`, `docs/analysis`) are excluded, as are the task
|
|
117
|
+
archives: a version measured by a past run is not an authorable claim. The checks above and the
|
|
118
|
+
SECUA checklist remain the enforcement points.
|
|
114
119
|
|
|
115
120
|
## Common Rationalizations
|
|
116
121
|
|
|
117
122
|
| Rationalization | Reality |
|
|
118
123
|
|---|---|
|
|
119
|
-
| "I've used this API a hundred times — I know the signature." | APIs change across versions and your memory is a silent cache. Verify against the *pinned* version; recall is
|
|
124
|
+
| "I've used this API a hundred times — I know the signature." | APIs change across versions and your memory is a silent cache. Verify against the *pinned* version; recall is not a source. |
|
|
120
125
|
| "It compiled, so I used it right." | Compiling proves existence and types, not contract. Ordering, preconditions, and error modes are not checked by the compiler. |
|
|
121
126
|
| "The latest docs say so." | You ship against the *pinned* version, not latest. Read the docs for the version in the lockfile. |
|
|
122
127
|
| "Close enough — I'll fix it if it breaks." | Guessing at an external contract moves the cost to runtime/production. Verify before generating; it is cheaper here. |
|
|
123
|
-
| "Verifying every call is too slow." | Verify what you
|
|
128
|
+
| "Verifying every call is too slow." | Verify what you have no source for. A fact checked this session needs no re-check; memory always does. |
|
|
124
129
|
|
|
125
130
|
## Red Flags
|
|
126
131
|
|
|
127
|
-
- Generating version-specific code
|
|
132
|
+
- Generating version-specific code from memory, without opening a source.
|
|
128
133
|
- Presenting an API claim as fact with no citation (doc + date, or `pkg@version` + symbol).
|
|
129
134
|
- Treating "it exists" as proof it is used correctly (the two questions collapsed into one).
|
|
130
135
|
- Reading the *latest* docs for a dependency pinned to an older version.
|
|
@@ -136,8 +141,7 @@ checklist remain the enforcement points.
|
|
|
136
141
|
- [ ] Every version-specific external behavior relied on was checked against the pinned version's source/docs **this session**.
|
|
137
142
|
- [ ] Both questions answered — the API exists **and** is called within its contract.
|
|
138
143
|
- [ ] Claims about external behavior carry a citation (source + date, or `pkg@version` + symbol); unverifiable ones are flagged, not asserted.
|
|
139
|
-
- [ ]
|
|
140
|
-
- [ ] Run closes with the Step 5 verdict line: `Verification: HIGH|MEDIUM|LOW — <first failing check and deviation, or 'all checks passed'>`.
|
|
144
|
+
- [ ] Nothing recalled from memory alone was presented as fact.
|
|
141
145
|
|
|
142
146
|
## See also
|
|
143
147
|
|
|
@@ -44,7 +44,7 @@ Pick the noun, read its reference. Each Tier A and Tier B reference owns that no
|
|
|
44
44
|
| **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) |
|
|
45
45
|
| **Tier A** | **rule** | Constraint quality gate: run presets, author rules, fine-tune, validate rule files/presets, extend engine | [references/rules.md](references/rules.md) |
|
|
46
46
|
| **Tier A** | **workflow** | Dual-mode workflow runtime: author state-machine / transition-flow workflows, validate, run, read traces | [references/workflows.md](references/workflows.md) |
|
|
47
|
-
| **Tier A** | **builder** | Release/PR plumbing: `bump-ver` (including read-only `--check`), `drop-tags`, `publish`,
|
|
47
|
+
| **Tier A** | **builder** | Release/PR plumbing: `bump-ver` (including read-only `--check`), `drop-tags`, `publish`, the four flat PR verbs (`pr-status`, `pr-check`, `pr-open`, `pr-review`), and the read-only `show-branches` topology report | [references/builder.md](references/builder.md) |
|
|
48
48
|
| **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, list agent specs (incl. `agent.fleet` members), start/stop supervised processes, fleet `report`/`join`/`leave`/`wait`/`trace`, readiness check | [references/agent.md](references/agent.md) |
|
|
49
49
|
| **Tier B** | **message** | Durable inter-agent messaging: send, inbox, reply, watch | [references/message.md](references/message.md) |
|
|
50
50
|
| **Tier B** | **self** | Self-management verbs: scaffold (`init`), database maintenance (`maintain`), 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) |
|
|
@@ -341,9 +341,12 @@ spur agent usage --dry-run # print would-be changes; write nothing
|
|
|
341
341
|
spur agent usage --json
|
|
342
342
|
```
|
|
343
343
|
|
|
344
|
-
Runs `codexbar usage --format json
|
|
344
|
+
Runs `codexbar usage --format json` once — the operator-enabled provider set, deliberately not an
|
|
345
|
+
all-provider sweep (`--provider all` covers every provider configured in CodexBar, most of them
|
|
346
|
+
uncredentialed, and its wall time is the slowest of all of them) — writes the snapshot to
|
|
345
347
|
`~/.config/spur/agent-usage.json` (`captured_at`, `source`, `providers[]`, `raw`), maps providers
|
|
346
|
-
to executors via `agent.executors[].agent` (
|
|
348
|
+
to executors via `agent.executors[].agent` (with the `antigravity-cli` → `antigravity` alias) or the
|
|
349
|
+
model's `<provider>/` prefix, and records
|
|
347
350
|
`owner: quota` availability observations that the standard drain applies — the single availability
|
|
348
351
|
write path. A provider is exhausted when any `primary|secondary|tertiary` window reports
|
|
349
352
|
`usedPercent >= 100`; the window name and `resetsAt` go into the observation reason. Per-provider
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
---
|
|
2
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; publish a package to npm with `publish` (and guard version drift with `bump-ver --check`); run the `/sp:dev-pr-review`
|
|
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; publish a package to npm with `publish` (and guard version drift with `bump-ver --check`); run the `/sp:dev-pr-review` PR loop with the four flat verbs `pr-status` (read-only status), `pr-check` (submission gate), `pr-open` (push + ensure PR) and `pr-review` (Codex request + wait + collect); report base-relative branch topology with `show-branches`. Promoted from spur-dev (task 0617, ADR-051); frozen at exactly these eight verbs."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# spur builder - release plumbing
|
|
9
9
|
|
|
10
|
-
`spur builder` is the CLI for **version bumps and release tags
|
|
11
|
-
|
|
10
|
+
`spur builder` is the CLI for **version bumps and release tags**, plus the PR-review loop and the
|
|
11
|
+
read-only branch report. It wraps the internal
|
|
12
|
+
`release-ops` implementation behind a public eight-verb surface. The repo-local forwarder
|
|
12
13
|
(`scripts/commands/release.ts`) and its `spur-dev` dispatcher cases were retired in task 1173; the
|
|
13
14
|
root `bun run bump-ver` / `bun run drop-tags` names route to `spur builder` directly. Package ids are
|
|
14
15
|
the unscoped short names (`@gobing-ai/spur` → `spur`); the released set and the aggregate tag are
|
|
15
16
|
discovered from the repo's own workspace manifests, so the same code serves any git+semver
|
|
16
17
|
monorepo.
|
|
17
18
|
|
|
18
|
-
This noun is **frozen at exactly
|
|
19
|
-
|
|
19
|
+
This noun is **frozen at exactly eight verbs** (`bump-ver`, `drop-tags`, `publish` from the 2026-10-15
|
|
20
|
+
script-absorption entries; `show-branches` and the four flat PR verbs `pr-status`, `pr-check`,
|
|
21
|
+
`pr-open`, `pr-review` from the 2026-10-16 feature-L1 entries) by operator consent
|
|
22
|
+
(`docs/design/harness-surface-governance.md` §3) — do not invent additional `builder` subcommands.
|
|
23
|
+
The former `pr <op>` pass-through stays registered as a **hidden, deprecated alias** for one release
|
|
24
|
+
(it prints one stderr deprecation line naming the replacement verb), so it is not listed here.
|
|
20
25
|
|
|
21
26
|
## Verb map
|
|
22
27
|
|
|
@@ -25,7 +30,11 @@ This noun is **frozen at exactly four verbs** (`bump-ver`, `drop-tags`, plus `pr
|
|
|
25
30
|
| `bump-ver [package-id] [version]` | Bump one package (manifest + in-source `binaryVersion` + consumer `workspace:` pins), commit, tag, optionally push; `--check [package-id]` only verifies marketplace/plugin versions (exit 1 on drift) | `--all` `--push` `--check` `--json` |
|
|
26
31
|
| `drop-tags [package-id] <version>` | Delete a package's release tag (local only by default) | `--all` `--remote` `--json` |
|
|
27
32
|
| `publish <dir>` | CI npm publish: resolve `workspace:`/`catalog:` ranges, `build:bundle`, `npm publish --access public`, restore the manifest | `--otp` |
|
|
28
|
-
| `pr <
|
|
33
|
+
| `pr-check [--base <branch>] [--scan-only]` | Submission gate for `/sp:dev-pr-review`: preflight then the `base...HEAD` hygiene scan; a preflight failure stops before hygiene (`PASS`/`WARN`/`BLOCK`/`FAIL`) | `--base` `--scan-only` `--json` `--status-file` |
|
|
34
|
+
| `pr-open [--base <branch>]` | Publish the branch (never force) and reuse or create its PR (`FOUND`/`CREATED`/`FAIL`) | `--base` `--json` `--status-file` |
|
|
35
|
+
| `pr-review [--force] [--focus <text>] [--no-wait]` | Post the `@codex review` request, wait, then collect (`CLEAN`/`FINDINGS`/`PENDING`/`FAIL`; exit 3 = pending) | `--force` `--focus` `--no-wait` `--timeout` `--interval` `--json` `--status-file` |
|
|
36
|
+
| `pr-status [--since <iso>] [--head <sha>]` | Read-only PR/CI/Codex status with the current-HEAD review as `review` (no verdict) | `--since` `--head` `--json` `--status-file` |
|
|
37
|
+
| `show-branches` | Read-only branch topology report against a base (default `markdown` with a condensed mermaid `gitGraph`) | `--format` `--json` `--base` `--local` `--remote` `--pr` `--limit` `--max-commits` `--hide-contained` `--theme` |
|
|
29
38
|
|
|
30
39
|
A bare `bump-ver <version>` (single positional that parses as semver) or explicit `--all` bumps
|
|
31
40
|
every package pinned via `workspace:` by another workspace package, then adds per-package trace
|
|
@@ -58,14 +67,78 @@ spur builder drop-tags spur 0.1.4 # delete the local tag @gobing-ai/sp
|
|
|
58
67
|
spur builder drop-tags --all 0.1.4 --remote # delete per-package + aggregate tags, locally and on origin
|
|
59
68
|
```
|
|
60
69
|
|
|
61
|
-
## `pr` - PR-review
|
|
70
|
+
## `pr-status`, `pr-check`, `pr-open`, `pr-review` - the PR-review loop
|
|
62
71
|
|
|
63
72
|
```bash
|
|
64
|
-
spur builder pr
|
|
65
|
-
spur builder pr
|
|
66
|
-
spur builder pr
|
|
67
|
-
spur builder pr
|
|
73
|
+
spur builder pr-status --json # read-only composite status + .review
|
|
74
|
+
spur builder pr-check --base main --json # preflight + hygiene submission gate
|
|
75
|
+
spur builder pr-check --scan-only --json # hygiene alone (local review on a dirty tree)
|
|
76
|
+
spur builder pr-open --base main --json # push, then reuse or create the PR
|
|
77
|
+
spur builder pr-review --focus "migration safety" --json # request → wait → collect
|
|
78
|
+
spur builder pr-review --no-wait --json # post the request, return PENDING
|
|
79
|
+
spur builder pr-review --force --json # force a fresh review of the current HEAD
|
|
68
80
|
```
|
|
69
81
|
|
|
70
|
-
|
|
71
|
-
the `pr-review` workflow.
|
|
82
|
+
Four flat verbs over the ops absorbed from `plugins/sp/scripts/pr-reviewing.ts` (script-absorption
|
|
83
|
+
PR-7); driven by the `pr-review` workflow. Each composes existing ops and embeds their records in
|
|
84
|
+
one JSON object per verb: `pr-status` → the status object plus `review` (collect, or `null` with no
|
|
85
|
+
PR); `pr-check` → `{ ok, verdict, preflight, hygiene }`; `pr-open` → `{ ok, verdict, push, pr }`;
|
|
86
|
+
`pr-review` → `{ ok, verdict, request, findings }`.
|
|
87
|
+
|
|
88
|
+
- **`--status-file`** holds the verb's one-word verdict: `PASS`/`WARN`/`BLOCK`/`FAIL` (`pr-check`),
|
|
89
|
+
`FOUND`/`CREATED`/`FAIL` (`pr-open`), `CLEAN`/`FINDINGS`/`PENDING`/`FAIL` (`pr-review`).
|
|
90
|
+
`pr-status` is read-only and writes none.
|
|
91
|
+
- **Exit codes:** `0` ok, `1` usage, `2` hard failure, `3` wait timeout — exit 3 is `PENDING`
|
|
92
|
+
(pending, never failure; collect later with `pr-status`).
|
|
93
|
+
- **`--head`:** `pr-status` pins the reviewed commit; it defaults to the current local HEAD, and an
|
|
94
|
+
explicit pin that no longer matches the PR head fails loud instead of reporting a moved commit.
|
|
95
|
+
- **Deduping:** `pr-review` collects without a new request when the exact HEAD is already reviewed,
|
|
96
|
+
and returns `PENDING` when a marked request is still in flight; `--force` requests a fresh review
|
|
97
|
+
(`mode=rerun`). Never force-pushes.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# deprecated alias, one release: maps the old op names to the verbs above
|
|
101
|
+
spur builder pr preflight --json # -> spur builder pr-check
|
|
102
|
+
spur builder pr status --json # -> spur builder pr-status
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## `show-branches` - read-only branch topology report
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
spur builder show-branches # markdown: summary table + condensed mermaid gitGraph
|
|
109
|
+
spur builder show-branches --base origin/main # measure every branch against another base
|
|
110
|
+
spur builder show-branches --format json # raw { base, generatedAt, branches[], omitted, warnings[] }
|
|
111
|
+
spur builder show-branches --pr --limit 50 # add open pull-request state, keep up to 50 rows
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
One row per branch — local, remote-only, or the detached HEAD by short sha — with the fork point,
|
|
115
|
+
commits ahead/behind the base, the contained flag (`ahead == 0`, i.e. everything in it is already in
|
|
116
|
+
the base), the last commit, and the worktree path that has it checked out. Base resolution is
|
|
117
|
+
`--base <ref>`, else the `origin/HEAD` target, else `main`. `--local` / `--remote` filter the ref
|
|
118
|
+
namespace (mutually exclusive), `--limit <n>` (default 30) caps rows by most recent commit and
|
|
119
|
+
reports the omitted count, and `--pr` adds the open pull-request number/state/review decision from a
|
|
120
|
+
single `gh pr list` call (a missing or unauthenticated `gh` degrades to null PR fields plus one
|
|
121
|
+
warning, never a failure).
|
|
122
|
+
|
|
123
|
+
| Flag | Description |
|
|
124
|
+
| ---- | ----------- |
|
|
125
|
+
| `--format <markdown\|json\|text>` | Output format; `markdown` is the default |
|
|
126
|
+
| `--json` | Alias of `--format json` |
|
|
127
|
+
| `--base <ref>` | Base ref (default: the `origin/HEAD` target, else `main`) |
|
|
128
|
+
| `--local` / `--remote` | Restrict to local or remote branches |
|
|
129
|
+
| `--pr` | Enrich rows with open pull-request state (one `gh pr list` call) |
|
|
130
|
+
| `--limit <n>` | Maximum branch rows (default 30) |
|
|
131
|
+
| `--max-commits <n>` | Maximum commit nodes per branch line in the graph (default 3) |
|
|
132
|
+
| `--hide-contained` | Drop contained branches from the graph instead of drawing their join |
|
|
133
|
+
| `--theme <name>` | Mermaid theme for the graph init directive |
|
|
134
|
+
|
|
135
|
+
The graph draws the base line, one `branch` per open branch, a `+N earlier` summary node for the
|
|
136
|
+
commits a cap hides, `HIGHLIGHT` tips, `REVERSE` reverts and the tag names of the commits it shows.
|
|
137
|
+
Read-only: it never creates, moves or deletes a ref, config entry, index entry or worktree.
|
|
138
|
+
|
|
139
|
+
The graph rules are `mermaid@11.15.0` HIGH, pinned at `apps/web/package.json:28` and asserted by
|
|
140
|
+
`apps/web/tests/branch-topology-graph.heavy.test.ts:155`. The `--pr` vocabulary is `gh@2.102.0` HIGH at
|
|
141
|
+
`https://cli.github.com/manual/gh_pr_list` (read 2026-10-16), measured against this repo's own PRs.
|
|
142
|
+
|
|
143
|
+
**Exit codes:** `0` ok, `1` usage (unknown `--format`, non-positive `--limit`/`--max-commits`,
|
|
144
|
+
unknown base ref, `--local` with `--remote`), `2` git failure (not a repository, `git` missing).
|
|
@@ -30,7 +30,7 @@ what* or *how to write a scenario*, this skill.
|
|
|
30
30
|
| `refresh` | Rebuild INDEX + each feature `## Tasks` table from task edges (**docs only**; no status change) | `--feature <id>` `--all` `--folder` `--json` |
|
|
31
31
|
| `check [id]` | Validate one feature / the tree; the 4-layer gate; `--fix` repairs structural findings in place | `--strict` `--fix` `--as <status>` `--folder` `--json` |
|
|
32
32
|
| `sync [id]` | Align feature **lifecycle status** with linked task states (real transitions + guards) | `--all` `--dry-run` `--force` `--folder` `--json` |
|
|
33
|
-
| `verify [id]` | The `feature-verification` pass: run the check set once and record the bound PASS/FAIL receipt — workflow-internal (`feature-lifecycle` runs it) | `--run-id <id>` `--cmd <command>`
|
|
33
|
+
| `verify [id]` | The `feature-verification` pass: run the check set once and record the bound PASS/FAIL receipt — workflow-internal (`feature-lifecycle` runs it) | `--run-id <id>` `--cmd <command>` |
|
|
34
34
|
| `handoff [id]` | The `idea-pipeline` finalization: task ordering, roster refresh, handoff report — workflow-internal | `--run-id <id>` `--spur-bin <cmd>` |
|
|
35
35
|
|
|
36
36
|
**`refresh` vs `sync` (do not conflate):**
|
|
@@ -138,7 +138,7 @@ Spur's host additionally registers (`registerSpurBuiltins`, `packages/app/src/wo
|
|
|
138
138
|
|
|
139
139
|
| Kind | Capability |
|
|
140
140
|
| ---- | ---------- |
|
|
141
|
-
| Action | `agent.run` (model call via `spur agent run`; `executor: 'fleet'` dispatches into the agent fleet), `decide` (inline `id`/`method`/`question`/`choices`/`default`/`evidence` → outcome written to `resultFile`; catalog-id references are pending task 1094 — use `spur decision run` for catalog decisions), `command.gate`, `rule.check`, `doctor.probe`, `
|
|
141
|
+
| Action | `agent.run` (model call via `spur agent run`; `executor: 'fleet'` dispatches into the agent fleet), `decide` (inline `id`/`method`/`question`/`choices`/`default`/`evidence` → outcome written to `resultFile`; catalog-id references are pending task 1094 — use `spur decision run` for catalog decisions), `command.gate`, `rule.check`, `doctor.probe`, `proof.fingerprint`, `run.artifact`, `file.exists`, `file.read`, `file.read.into-var`, `http.request`, `hitl.confirm`, `hitl.select`, `hitl.input`, `shell` (streaming) |
|
|
142
142
|
| Guard | `shell` (env-aware), `contract-violation` |
|
|
143
143
|
|
|
144
144
|
Order matters for both guards and conditions: **the first that passes wins.** Put the discriminating
|
|
@@ -590,12 +590,11 @@ host instructions does not add one. An opt-in gate is explicit: `gitmsg --check
|
|
|
590
590
|
- `keepachangelog` (default): `## [<version>] - <date>` header, then category headings per the keepachangelog convention — `### Added` / `### Fixed` / `### Changed` / `### Removed` / `### Other` — mapped from conventional-commit types.
|
|
591
591
|
- `simple`: flat bulleted list grouped by type heading (`### feat`, `### fix`, …).
|
|
592
592
|
6. Emit: with `<file>`, insert the section into that file above its newest `## [` release heading (or after its title when none exists) and touch nothing else in the file; without `<file>`, print it to stdout.
|
|
593
|
-
7. **Verify claims before emitting —
|
|
594
|
-
- **
|
|
595
|
-
- **
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
9. Reply in at most three lines: the range, bullet counts per category plus verified-claim counts (`x HIGH / y MEDIUM / z LOW`), and the output target.
|
|
593
|
+
7. **Verify claims before emitting — one required check on every claim bullet.** Classify first: an *API/library claim* is a bullet asserting what code, an API, a library, a dependency or a version does — skip merge/bookkeeping bullets that assert no such fact (a status move, a filing, a doc relocation). Then run the check and append one HTML comment line directly under the bullet carrying its anchor: `<!-- src: <citation> -->`. No confidence level is recorded (ADR-138): the anchor is the evidence.
|
|
594
|
+
- **Source citation — the anchor.** Internal claims (what a commit or the code does): confirm against the commit diff (`git show --stat <hash>`, reading hunks when the summary asserts behavior) or the artifact's presence in the tree; cite `path[:line]` — bare path for whole-file claims, `path:line` for a specific behavior or symbol. External claims (framework/library/version behavior): confirm against official docs for the installed version; cite the URL. An anchor you cannot produce fails the check — reword the bullet or drop the claim; a citation is not a citation until it names something a reader can open.
|
|
595
|
+
- **Defect precision decides what must be fixed.** The check is precise once a bullet is classified as a claim: an annotation missing its anchor is unambiguously wrong and blocks emitting. A summary broader than its evidence is reworded to what the anchor shows. Which bullets *are* claims is the heuristic half — resolve it by this step's rule, and for a genuinely borderline bullet say so in the bullet's body rather than annotating or skipping it silently.
|
|
596
|
+
8. Self-check before emitting: every short hash in `<since>..<until>` appears exactly once, and every claim bullet carries exactly one `<!-- src: … -->` comment holding exactly one anchor — no unannotated claim bullets, no duplicate annotations. Fix any miss or duplicate; do not report a verdict.
|
|
597
|
+
9. Reply in at most three lines: the range, bullet counts per category plus the verified-claim count, and the output target.
|
|
599
598
|
- **Invariants:** Bullets are derived from `git log` only; the claim-verification pass (step 7) adds evidence from commit diffs, the working tree, and official docs. No quality gates — no `bun run gate`/lint/typecheck/test/`spur-check`/rule runs, and no edits beyond the one inserted section (its verification comments included). The file is left uncommitted.
|
|
600
599
|
|
|
601
600
|
### 9. gitmsg
|
|
@@ -425,7 +425,7 @@ git checkout <base-ref> && git merge --no-ff -m "<prepared message>" <branch>
|
|
|
425
425
|
# git checkout <base-ref> && git merge --no-commit <branch>
|
|
426
426
|
# 2. resolve source conflicts by hand; generated files are then regenerated with the project's
|
|
427
427
|
# generator, never hand-merged
|
|
428
|
-
# (this repo: bun run
|
|
428
|
+
# (this repo: bun run --filter @gobing-ai/spur build:bundle)
|
|
429
429
|
# 3. stage every resolved path and regenerated bundle through the guard — an unmerged or
|
|
430
430
|
# unstaged path makes step 5 abort, and a conflict-marked path exits 3 (resolve, then retry):
|
|
431
431
|
# spur workflow commit-guard stage --run "$RUN_ID" -- <resolved paths and regenerated bundles>
|
|
@@ -209,8 +209,9 @@ wraps the one resolved ticket inside the worktree before the merge, and is skipp
|
|
|
209
209
|
**Anchor:** `#flag-force`.
|
|
210
210
|
|
|
211
211
|
Bypass a specific named guard that would otherwise stop the command (e.g. a shippable check on
|
|
212
|
-
`dev-verify`/`dev-verifyall`). Named, not global:
|
|
213
|
-
forced. Never bypasses lifecycle status transitions
|
|
212
|
+
`dev-verify`/`dev-verifyall`, or the per-HEAD review dedupe on `dev-pr-review`). Named, not global:
|
|
213
|
+
the command documentation states which guard is forced. Never bypasses lifecycle status transitions
|
|
214
|
+
or irreversible HITL gates.
|
|
214
215
|
|
|
215
216
|
### `--feature <id>` — scope the operation to a feature
|
|
216
217
|
|