@gobing-ai/spur 0.3.95 → 0.3.96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/plugin-scripts.json +0 -54
- package/config/rules/boundary/sp-script-placement.yaml +19 -0
- package/config/rules/strict/runtime-boundaries.yaml +5 -0
- package/config/rules/structure/test-location.yaml +2 -0
- package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +1 -1
- package/config/rules/typescript/output-boundaries.yaml +15 -2
- package/config/script-placement-baseline.json +51 -0
- package/config/workflows/feature-verification.yaml +1 -1
- package/config/workflows/history-anatomy.yaml +23 -11
- package/config/workflows/idea-pipeline.yaml +80 -85
- package/config/workflows/pr-review.yaml +18 -9
- package/config/workflows/task-pipeline.yaml +42 -95
- package/config/workflows/wrapup-pipeline.yaml +89 -37
- package/package.json +1 -1
- package/plugins/sp/README.md +8 -10
- package/plugins/sp/agents/super-reviewer.md +43 -18
- package/plugins/sp/commands/dev-fixgha.md +83 -0
- package/plugins/sp/commands/dev-gitmsg.md +8 -6
- package/plugins/sp/commands/dev-gtd.md +2 -2
- package/plugins/sp/commands/dev-idea.md +22 -12
- package/plugins/sp/commands/dev-plan.md +8 -9
- package/plugins/sp/commands/dev-review.md +22 -13
- package/plugins/sp/commands/dev-verifyall.md +1 -1
- package/plugins/sp/commands/spur-init.md +2 -2
- package/plugins/sp/lib/history-anatomy.generated.d.mts +112 -0
- package/plugins/sp/lib/history-anatomy.generated.mjs +686 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +5 -4
- package/plugins/sp/lib/inline-run.generated.d.mts +11 -0
- package/plugins/sp/lib/inline-run.generated.mjs +25 -8
- package/plugins/sp/lib/quality-gate.generated.d.mts +104 -0
- package/plugins/sp/lib/quality-gate.generated.mjs +438 -0
- package/plugins/sp/lib/residual-scan.generated.d.mts +62 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +210 -0
- package/plugins/sp/lib/spur-bin.ts +36 -0
- package/plugins/sp/lib/step-profile.generated.d.mts +71 -0
- package/plugins/sp/lib/step-profile.generated.mjs +174 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +1 -1
- package/plugins/sp/scripts/history-anatomy-cache.mjs +20 -19
- package/plugins/sp/scripts/history-anatomy-cache.ts +23 -928
- package/plugins/sp/scripts/inline-run-setup.mjs +85 -320
- package/plugins/sp/scripts/inline-run-setup.ts +104 -667
- package/plugins/sp/scripts/quality-gate.mjs +34 -19
- package/plugins/sp/scripts/quality-gate.ts +12 -658
- package/plugins/sp/scripts/residual-scan.mjs +135 -156
- package/plugins/sp/scripts/residual-scan.ts +102 -499
- package/plugins/sp/scripts/script-root.mjs +5 -1
- package/plugins/sp/scripts/script-root.ts +5 -1
- package/plugins/sp/scripts/workflow-step-profile.mjs +25 -17
- package/plugins/sp/scripts/workflow-step-profile.ts +21 -315
- package/plugins/sp/scripts/wrapup-drift-probe.mjs +8 -2
- package/plugins/sp/scripts/wrapup-drift-probe.ts +3 -2
- package/plugins/sp/scripts/wrapup-steps.mjs +10 -32
- package/plugins/sp/scripts/wrapup-steps.ts +8 -36
- package/plugins/sp/skills/code-improvement/SKILL.md +5 -4
- package/plugins/sp/skills/code-verification/SKILL.md +34 -9
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +3 -3
- package/plugins/sp/skills/functional-review/SKILL.md +7 -4
- package/plugins/sp/skills/functional-review/references/verdict-schema.md +1 -1
- package/plugins/sp/skills/history-anatomy/references/modes.md +2 -1
- package/plugins/sp/skills/next-feature/references/handoff-routing.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
- package/plugins/sp/skills/spur-cli/SKILL.md +3 -3
- package/plugins/sp/skills/spur-cli/references/agent.md +10 -10
- package/plugins/sp/skills/spur-cli/references/features.md +17 -6
- package/plugins/sp/skills/spur-cli/references/init.md +17 -16
- package/plugins/sp/skills/spur-cli/references/self.md +3 -2
- package/plugins/sp/skills/spur-cli/references/serve.md +10 -10
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +21 -6
- package/plugins/sp/skills/spur-cli/references/tasks.md +14 -8
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +11 -9
- package/plugins/sp/skills/spur-dev/references/decision-brief.md +1 -1
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +86 -70
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +3 -3
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +77 -34
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +5 -9
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -3
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +31 -21
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +19 -19
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +4 -3
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +29 -3
- package/plugins/sp/skills/spur-doctor/SKILL.md +1 -1
- package/plugins/sp/skills/sys-architecture/SKILL.md +3 -2
- package/spur.js +1495 -369
- package/web/_astro/{BoardApp.Cpxntzad.js → BoardApp.BIjMatT1.js} +1 -1
- package/web/_astro/{BoardApp.BxJuwD7I.js → BoardApp.GvjIe9Z6.js} +42 -42
- package/web/_astro/{TaskDetail.C5bW4WGV.js → TaskDetail.BZM3EAFx.js} +1 -1
- package/web/_astro/{arc.CyjRvNMY.js → arc.HkRiZnoI.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.B4lWRzJA.js → architectureDiagram-3BPJPVTR.BDdK-tgZ.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.Be38USQ2.js → blockDiagram-GPEHLZMM.CZ9kOBxx.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DT9Fj5Qx.js → c4Diagram-AAUBKEIU.DXK9qeRD.js} +1 -1
- package/web/_astro/channel.DlhX2MEt.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.SeSBWLg5.js → chunk-2J33WTMH.BTD2WeX5.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DoO4VE14.js → chunk-4BX2VUAB.Ci6Qbcvk.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DrmTFA53.js → chunk-55IACEB6.yl3zsj7p.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.Bi-TUb_V.js → chunk-727SXJPM.ClXZsfyR.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.B-xp8Uhi.js → chunk-AQP2D5EJ.BmKWZBcP.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.DGWrDnUU.js → chunk-FMBD7UC4.By30fcb7.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM._BagvPDy.js → chunk-ND2GUHAM.24NmrD-k.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.VOboYWQ0.js → chunk-QZHKN3VN.BN4sKdcS.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.D_apfHS7.js → classDiagram-4FO5ZUOK.CJpoMPb5.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.D_apfHS7.js → classDiagram-v2-Q7XG4LA2.CJpoMPb5.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.DNLU_L-x.js → cose-bilkent-S5V4N54A.BraxQ2Nt.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.D8borhV-.js → cynefin-OW5HDTMX.gzoU73oL.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.Uc0lvjcV.js → dagre-BM42HDAG.wyDfWySU.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DDIxtDBo.js → diagram-2AECGRRQ.h2_EbMxV.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.DVoDnD3H.js → diagram-5GNKFQAL.Db6dcs89.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.CRubTJ-0.js → diagram-KO2AKTUF.NVwzxu_U.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.m9SeYcXQ.js → diagram-LMA3HP47.B-eNgDQk.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.C6s2ZjV5.js → diagram-OG6HWLK6.Bsa8ZRbJ.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.nSzr5KTj.js → erDiagram-TEJ5UH35.BospRE5Q.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.DrZcys16.js → flowDiagram-I6XJVG4X.DMzvHwAA.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.Do4M1b-K.js → ganttDiagram-6RSMTGT7.Dmdxgd-M.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.BWc9oJ4l.js → gitGraphDiagram-PVQCEYII.CaqdO0rL.js} +1 -1
- package/web/_astro/index.EoZlzLK-.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.BIdOctFk.js → infoDiagram-5YYISTIA.DDVD9Wn7.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CV5SuG2t.js → ishikawaDiagram-YF4QCWOH.EKyCUFsL.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.CxE-rEJ-.js → journeyDiagram-JHISSGLW.By2-RkYB.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.BPRdKWs_.js → kanban-definition-UN3LZRKU.ar-WmlyR.js} +1 -1
- package/web/_astro/{linear.zRsuuDTE.js → linear.BnzMBgo_.js} +1 -1
- package/web/_astro/{mermaid.core.jAJTcMKc.js → mermaid.core.DSqeFu2Y.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BffJxfCr.js → mindmap-definition-RKZ34NQL.1XcF8Wh2.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.CacwWaE3.js → pieDiagram-4H26LBE5.DnItHOdK.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.hXELD06-.js → quadrantDiagram-W4KKPZXB.BQQyrnBt.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.DdEbPcqT.js → requirementDiagram-4Y6WPE33.Dmzxun82.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.DgaDocKv.js → sankeyDiagram-5OEKKPKP.BBIeRKYB.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.B0KScnAu.js → sequenceDiagram-3UESZ5HK.CUNVdBBf.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.CV9M_WNc.js → stateDiagram-AJRCARHV.DlFf2sJm.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.BOAo74Et.js → stateDiagram-v2-BHNVJYJU.DXR7I1H5.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.CqqepUMe.js → timeline-definition-PNZ67QCA.BcO-GyX2.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DDqe4dOG.js → vennDiagram-CIIHVFJN.ChCECmmW.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.B3R9OPdO.js → wardleyDiagram-YWT4CUSO.CRaT12mD.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.B3SvgXpQ.js → xychartDiagram-2RQKCTM6.B3lsHVpj.js} +1 -1
- package/web/index.html +2 -2
- package/plugins/sp/lib/artifact-digest.generated.d.mts +0 -7
- package/plugins/sp/lib/artifact-digest.generated.mjs +0 -48
- package/plugins/sp/scripts/feature-sync-bounded.mjs +0 -301
- package/plugins/sp/scripts/feature-sync-bounded.ts +0 -481
- package/plugins/sp/scripts/idea-coverage-check.ts +0 -168
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +0 -298
- package/plugins/sp/scripts/record-feature-sync.mjs +0 -63
- package/plugins/sp/scripts/record-feature-sync.ts +0 -84
- package/plugins/sp/scripts/script-contract-check.ts +0 -506
- package/plugins/sp/scripts/stage-registry-adapter.ts +0 -1533
- package/plugins/sp/scripts/surface-drift-inventory.ts +0 -989
- package/plugins/sp/scripts/task-evidence-precheck.ts +0 -189
- package/plugins/sp/scripts/task-size-precheck.ts +0 -212
- package/plugins/sp/scripts/transition-shim-check.ts +0 -238
- package/plugins/sp/scripts/validate-commands.ts +0 -689
- package/plugins/sp/scripts/validate-flag-contracts.ts +0 -890
- package/plugins/sp/scripts/verify-answer-lint.ts +0 -549
- package/web/_astro/channel.CI6N_tCg.js +0 -1
- package/web/_astro/index.CENnIEqT.css +0 -1
|
@@ -30,9 +30,10 @@
|
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
32
|
import { spawnSync } from 'node:child_process';
|
|
33
|
-
import { appendFileSync,
|
|
33
|
+
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
34
34
|
import { join } from 'node:path';
|
|
35
35
|
import { getEnvVars } from '../lib/env';
|
|
36
|
+
import { spurCommand } from '../lib/spur-bin';
|
|
36
37
|
|
|
37
38
|
export interface WrapupStepsEnv {
|
|
38
39
|
__runId?: string;
|
|
@@ -64,15 +65,6 @@ function jqText(value: unknown): string {
|
|
|
64
65
|
/** Canonical four-digit WBS string: whitespace is rejected, not trimmed (0783 R1). */
|
|
65
66
|
export const WBS_PATTERN = /^[0-9]{4}$/;
|
|
66
67
|
|
|
67
|
-
/** `spurBin` splits on whitespace into a command plus prefix args (so `bun x.ts` works). */
|
|
68
|
-
export function spurCommand(spurBin: string | undefined): { cmd: string; prefix: string[] } {
|
|
69
|
-
const parts = (spurBin ?? 'spur')
|
|
70
|
-
.trim()
|
|
71
|
-
.split(/\s+/)
|
|
72
|
-
.filter((p) => p.length > 0);
|
|
73
|
-
return { cmd: parts[0] ?? 'spur', prefix: parts.slice(1) };
|
|
74
|
-
}
|
|
75
|
-
|
|
76
68
|
function spur(
|
|
77
69
|
env: WrapupStepsEnv,
|
|
78
70
|
args: string[],
|
|
@@ -484,34 +476,14 @@ export function runFeatureTransition(env: WrapupStepsEnv, options: WrapupStepsOp
|
|
|
484
476
|
return { status: 'FAIL', statusFile: relStatusFile, exitCode: 1 };
|
|
485
477
|
}
|
|
486
478
|
|
|
487
|
-
//
|
|
479
|
+
// 1004 R5: one direct service sync (stderr streams through, stdout is the JSON payload).
|
|
480
|
+
// Repeated-BLOCKED suppression (0411) lives in the feature sync service itself (1004 R3),
|
|
481
|
+
// so the bounded-wrapper resolution branches are gone.
|
|
488
482
|
let syncOutput = '';
|
|
489
483
|
let syncRc = 1;
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
const result = spawnSync('bun', [boundedTs, ...boundedArgs], { cwd, encoding: 'utf8' });
|
|
494
|
-
syncOutput = result.stdout ?? '';
|
|
495
|
-
syncRc = result.status ?? 1;
|
|
496
|
-
if (result.stderr !== null && result.stderr.length > 0) process.stderr.write(result.stderr);
|
|
497
|
-
} else {
|
|
498
|
-
const probe = spawnSync('superskill', ['script', 'path', 'sp', 'feature-sync-bounded.mjs'], {
|
|
499
|
-
cwd,
|
|
500
|
-
encoding: 'utf8',
|
|
501
|
-
});
|
|
502
|
-
const twin = probe.status === 0 ? (probe.stdout ?? '').trim() : '';
|
|
503
|
-
if (twin.length > 0 && existsSync(twin)) {
|
|
504
|
-
const result = spawnSync('node', [twin, ...boundedArgs], { cwd, encoding: 'utf8' });
|
|
505
|
-
syncOutput = result.stdout ?? '';
|
|
506
|
-
syncRc = result.status ?? 1;
|
|
507
|
-
if (result.stderr !== null && result.stderr.length > 0) process.stderr.write(result.stderr);
|
|
508
|
-
} else {
|
|
509
|
-
// Last branch: stderr streams through (visible), stdout is the JSON payload.
|
|
510
|
-
const result = spur(env, ['feature', 'sync', feature, '--json'], { cwd, stderr: 'inherit' });
|
|
511
|
-
syncOutput = result.stdout;
|
|
512
|
-
syncRc = result.status;
|
|
513
|
-
}
|
|
514
|
-
}
|
|
484
|
+
const sync = spur(env, ['feature', 'sync', feature, '--json'], { cwd, stderr: 'inherit' });
|
|
485
|
+
syncOutput = sync.stdout;
|
|
486
|
+
syncRc = sync.status;
|
|
515
487
|
process.stdout.write(`${syncOutput}\n`);
|
|
516
488
|
|
|
517
489
|
const shown = spur(env, ['feature', 'show', feature, '--json'], { cwd });
|
|
@@ -105,9 +105,9 @@ spur task show <wbs> --json # for a pipeline run
|
|
|
105
105
|
# scope = 'src/api/' | 'packages/domain/' | 'plugins/sp/'
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
For a pipeline run, derive the diff scope the same way `sp:code-verification` Step 3 does (the
|
|
109
|
-
task
|
|
110
|
-
scope.
|
|
108
|
+
For a pipeline run, derive the diff scope the same way `sp:code-verification` Step 3 does (the SSOT
|
|
109
|
+
recipe: tagged-commit task diff — defined there, not restated here). For standalone, the `path`
|
|
110
|
+
argument is the scope.
|
|
111
111
|
|
|
112
112
|
### Step 2 — Explore (read the map)
|
|
113
113
|
|
|
@@ -188,7 +188,8 @@ When invoked as the `--focus architecture` dimension of `/sp:dev-review`:
|
|
|
188
188
|
- `blocker`/`major` candidates block the `approve(HITL)` gate alongside any SECUA blockers from
|
|
189
189
|
`sp:code-verification`.
|
|
190
190
|
- The candidate list is returned as a **review fragment**; the review coordinator
|
|
191
|
-
(`sp:super-reviewer` under `/sp:dev-review`) merges it into the combined
|
|
191
|
+
(`sp:super-reviewer` — the invoking session under `/sp:dev-review`) merges it into the combined
|
|
192
|
+
`## Review` section —
|
|
192
193
|
it is never written by `record`, which backfills `## Review` only when the section is bare
|
|
193
194
|
(fallback-only, F92 0593 R1).
|
|
194
195
|
- This skill does **not** write to the task file directly — the coordinator (or the operator) does.
|
|
@@ -36,7 +36,7 @@ It backs two commands:
|
|
|
36
36
|
| Command | Mode | Input | Output |
|
|
37
37
|
|---------|------|-------|--------|
|
|
38
38
|
| `/sp:dev-verify <wbs>` | **verify** | a task WBS | `.spur/run/<wbs>-verdict.json`; `record` transcribes `## Testing` |
|
|
39
|
-
| `/sp:dev-review <wbs>` | **review** (coordinator) | a task WBS (diff scope) | merged three-dimensional findings → `## Review` |
|
|
39
|
+
| `/sp:dev-review --tasks <wbs>` | **review** (coordinator) | a task WBS (diff scope) | merged three-dimensional findings → `## Review` |
|
|
40
40
|
|
|
41
41
|
The verify mode is the **completion gate's evidence source**: it emits a machine verdict the
|
|
42
42
|
`task-pipeline.yaml` workflow reads before allowing `record → done`. A `PASS` clears the gate; a
|
|
@@ -96,16 +96,39 @@ no-op there; `--force` matters for re-auditing completed tasks.)
|
|
|
96
96
|
|
|
97
97
|
### Step 3 — Establish the change scope
|
|
98
98
|
|
|
99
|
-
Determine which files the task changed
|
|
99
|
+
Determine which files the task changed. This step is the SSOT scope recipe:
|
|
100
|
+
`sp:functional-review` Step 3, `sp:code-improvement` Step 1, and `sp:super-reviewer` "Establish
|
|
101
|
+
scope first" defer here and must not restate it.
|
|
102
|
+
|
|
103
|
+
WBS mode — the union of files changed by the task's implementation commits, identified by the
|
|
104
|
+
`(<wbs>)` subject tag, excluding the task file itself:
|
|
100
105
|
|
|
101
106
|
```bash
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
git
|
|
105
|
-
|
|
107
|
+
ROOT=$(git rev-parse --show-toplevel)
|
|
108
|
+
TASK_FILE=$(cd "$ROOT" && spur task show <wbs> --json | jq -r .filePath)
|
|
109
|
+
COMMITS=$(git log --format='%H %s' | grep -F "(<wbs>)" | cut -d' ' -f1)
|
|
110
|
+
for c in $COMMITS; do git diff-tree --no-commit-id --name-only -r "$c"; done \
|
|
111
|
+
| sort -u | grep -vxF "${TASK_FILE#$ROOT/}"
|
|
112
|
+
# Empty scope → working-tree diff.
|
|
106
113
|
git status --porcelain
|
|
107
114
|
```
|
|
108
115
|
|
|
116
|
+
- No file-extension filter — `.md`/`.yaml` are first-class harness surfaces. Generated/lock files
|
|
117
|
+
(`*.generated.mjs`, `bun.lock`) may be excluded by name, stated in the Scope line.
|
|
118
|
+
- Empty scope (no tagged commit, or tagged commits touch only the task file) degrades visibly:
|
|
119
|
+
state `working tree` and the reason in the Scope line.
|
|
120
|
+
|
|
121
|
+
### Step 3p — Path scope (review mode only)
|
|
122
|
+
|
|
123
|
+
When the review target is a path, not a WBS, Step 3 does not apply — derive the scope from the
|
|
124
|
+
path: the tracked files under it, with the file count reported in the Scope line.
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
git ls-files -- <path>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Large scopes are fanned out by the review coordinator, not here.
|
|
131
|
+
|
|
109
132
|
### Step 4 — Requirements traceability gate (Phase 8)
|
|
110
133
|
|
|
111
134
|
For each `R{n}` in `## Requirements`, find implementation evidence in the changed files / tests and
|
|
@@ -338,7 +361,8 @@ canonical.
|
|
|
338
361
|
Under the pipeline, the verifier owns the answer file `.spur/run/<wbs>-verify-answer.txt` (0726
|
|
339
362
|
R3): `Verdict: PARTIAL` first, append one row at a time, replace the verdict line only when all
|
|
340
363
|
rows are certified — interruptions leave lintable partial rows; retries fill only missing IDs.
|
|
341
|
-
Host: `
|
|
364
|
+
Host: `spur task verdict --from-answer` lints the answer file, then derives the verdict +
|
|
365
|
+
`spur task check` (R9). Vocabularies,
|
|
342
366
|
rejection classes, and the AC identity rule: `references/verdict-schema.md`. Sections follow the
|
|
343
367
|
Step 10 contract.
|
|
344
368
|
|
|
@@ -481,10 +505,11 @@ re-audit is never misread as a successful `testing -> done` (dev-verify.md `--ne
|
|
|
481
505
|
## Mode: review (`/sp:dev-review`)
|
|
482
506
|
|
|
483
507
|
The source-oriented path: SECUA review of a task's diff without the full traceability verdict. Runs
|
|
484
|
-
|
|
508
|
+
Step 3 (WBS target) or Step 3p (path target — a path target never derives scope from Step 3) plus
|
|
509
|
+
Step 7, and returns a **review fragment** — no verdict artifact, no section write, no `done`
|
|
485
510
|
gate (F92 0593 R1); the coordinator (`sp:super-reviewer`) merges fragments into `## Review`.
|
|
486
511
|
|
|
487
|
-
Flags: `--agent <inline|auto|name>` (execution surface — inline default, with named escalation triggers taking precedence), `--auto` (no confirmations),
|
|
512
|
+
Flags: `--agent <inline|auto|name>` (execution surface — inline default, with named escalation triggers taking precedence), `--auto` (no confirmations), and `--focus <all|functional|security|efficiency|correctness|usability|architecture>` (review dimensions — **the single review `--focus` vocabulary is declared here (SSOT)**: `functional` routes to `sp:functional-review`, `architecture` to `sp:code-improvement` + SECUA-A, the SECUA lenses to Step 7; `dev-review.md`, `dev-operations.md` §2 and `flag-glossary.md#flag-focus` link here instead of restating a second list). Apply the [central contract](../spur-dev/references/cross-cutting.md#inline-default-execution-surface) before starting the review.
|
|
488
513
|
|
|
489
514
|
---
|
|
490
515
|
|
|
@@ -108,8 +108,8 @@ For answer files, emit a matching parseable table:
|
|
|
108
108
|
|
|
109
109
|
**Authoring contract under the pipeline (0726 R3).** The verifier owns the answer file: write
|
|
110
110
|
`Verdict: PARTIAL` first, append one complete row at a time, and replace the first verdict line only
|
|
111
|
-
after every row is certified. `
|
|
112
|
-
|
|
111
|
+
after every row is certified. `spur task verdict --from-answer` lints the file before deriving the
|
|
112
|
+
verdict and rejects, with row-level diagnostics: missing/duplicate/unknown requirement IDs,
|
|
113
113
|
AC ids that do not resolve to one accepted identity — a task AC checklist label or its declared
|
|
114
114
|
`AC-N`/checklist-token alias, or a linked feature scenario title, in the ac-style-guide forms
|
|
115
115
|
(exact/bare title, `Scenario:` prefix, bracket tags, `AC-N`); paraphrases and ambiguous aliases
|
|
@@ -119,7 +119,7 @@ manual-review | llm-judge | n/a`, or a `+` compound), and empty evidence. Interr
|
|
|
119
119
|
rows that pass the lint and complete only the missing IDs on retry.
|
|
120
120
|
|
|
121
121
|
**Feature-credited AC ids are narrower than the lint's accepted set (task 0966 finding).** A row keyed
|
|
122
|
-
by a bare checklist ordinal (`AC1`) passes `
|
|
122
|
+
by a bare checklist ordinal (`AC1`) passes the `spur task verdict` answer lint — it resolves to the task's AC
|
|
123
123
|
checklist label — but `feature-check.rowMatchesScenario` credits a linked feature scenario only by the
|
|
124
124
|
scenario's normalized title or its `AC-N` ordinal alias. Such a row therefore carries a PASS verdict
|
|
125
125
|
while crediting no scenario, and the feature's `verifying → done` gate denies with
|
|
@@ -11,6 +11,7 @@ metadata:
|
|
|
11
11
|
- pipeline
|
|
12
12
|
modes:
|
|
13
13
|
- verify
|
|
14
|
+
- review
|
|
14
15
|
verdicts:
|
|
15
16
|
- PASS
|
|
16
17
|
- PARTIAL
|
|
@@ -214,8 +215,8 @@ return `verdict = PASS` with "No requirements to verify" (zero-requirements case
|
|
|
214
215
|
### Step 3 — Establish the change scope
|
|
215
216
|
|
|
216
217
|
If `--source-paths` is given, use it. Otherwise derive the diff scope exactly as
|
|
217
|
-
`sp:code-verification` Step 3 does (the
|
|
218
|
-
|
|
218
|
+
`sp:code-verification` Step 3 does (the SSOT recipe: the `(<wbs>)`-tagged implementation commits'
|
|
219
|
+
changed files, fallback to the working-tree diff — defined there, not restated here).
|
|
219
220
|
|
|
220
221
|
### Step 4 — Track A: BDD mapping (if `--bdd-report`)
|
|
221
222
|
|
|
@@ -268,7 +269,8 @@ The priority table leads; the traceability table follows for per-requirement det
|
|
|
268
269
|
**Fragment-only discipline (F92 0593 R1).** In coordinated mode (dispatched by `/sp:dev-review` /
|
|
269
270
|
`sp:super-reviewer`), do **not** write `## Review` — return the fragment to the coordinator, which
|
|
270
271
|
merges the functional + SECUA + architecture fragments into the combined `## Review` section. Only
|
|
271
|
-
`sp:super-reviewer` (the
|
|
272
|
+
`sp:super-reviewer` (the invoking session under `/sp:dev-review` acting as review coordinator)
|
|
273
|
+
writes `## Review`; direct component-skill use is
|
|
272
274
|
advisory output. `spur task record` backfills a **bare** `## Review` from the verdict artifact as a
|
|
273
275
|
standalone compatibility fallback only and never overwrites authored Review (F92 0593 R1).
|
|
274
276
|
|
|
@@ -291,7 +293,8 @@ Include the per-requirement traceability table in the report:
|
|
|
291
293
|
```
|
|
292
294
|
|
|
293
295
|
**Under the pipeline**, `sp:functional-review` is a component of `/sp:dev-review`: it returns its
|
|
294
|
-
fragment to the coordinator (`sp:super-reviewer`
|
|
296
|
+
fragment to the coordinator (`sp:super-reviewer` — the invoking session under `/sp:dev-review`),
|
|
297
|
+
which writes the combined `## Review`. The
|
|
295
298
|
`record` step transcribes only `## Testing` from the verdict artifact and backfills `## Review`
|
|
296
299
|
only when the section is bare (`sectionIsBare` guard, `task-service.ts`); it never overwrites the
|
|
297
300
|
coordinator's authored Review. Keep the priority-table lead stable in the fragment so the L3 gate
|
|
@@ -27,7 +27,7 @@ interface FunctionalVerdict {
|
|
|
27
27
|
bddReportPath: string | null;
|
|
28
28
|
/**
|
|
29
29
|
* Explicit source scope (if --source-paths given) or derived diff scope
|
|
30
|
-
* (
|
|
30
|
+
* (tagged-commit recipe; SSOT = code-verification SKILL Step 3/3p).
|
|
31
31
|
*/
|
|
32
32
|
sourcePaths: string[];
|
|
33
33
|
}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
The skill resolves exactly two modes. Everything else fails loud. This matrix is the enforcement
|
|
4
4
|
surface the workflow (0660) and the skill share; keep the vocabulary frozen. Execution note
|
|
5
5
|
(0920): argument validation runs deterministically in the `history-anatomy-cache` helper `paths`
|
|
6
|
-
command
|
|
6
|
+
command (logic core: `packages/app/src/services/history-anatomy.ts`, task 1005) before the
|
|
7
|
+
workflow starts; the model hop no longer performs it.
|
|
7
8
|
|
|
8
9
|
## Mode vocabulary (frozen)
|
|
9
10
|
|
|
@@ -78,7 +78,7 @@ survivors would make its primary case unreachable. Offer the rank-1 ranked candi
|
|
|
78
78
|
**Why this is not a Principle #5 taste auto-click.** The ranking already produced the recommendation;
|
|
79
79
|
`--auto` only skips the *proceed-with-offer* pause. Overriding the ranking (picking a non-offered
|
|
80
80
|
candidate) still requires the interactive confirm path. Architecture / design-approval taste gates
|
|
81
|
-
inside dispatched children remain governed by their own contracts (`--
|
|
81
|
+
inside dispatched children remain governed by their own contracts (`--auto` where applicable).
|
|
82
82
|
|
|
83
83
|
### What `--task` does not change
|
|
84
84
|
|
|
@@ -131,7 +131,7 @@ call; no git dirtiness as a route (optional advisory print only).
|
|
|
131
131
|
| C2 and C3 both true | lint vs tests both red | (1) fixall (2) unit (3) abort |
|
|
132
132
|
| Feature B3 pick ambiguous because two `todo` same rank — **should not happen** after WBS sort | — | N/A — WBS tie-break is total |
|
|
133
133
|
| Task `todo` but also feature-level AC invalid when invoked via feature id | feature health vs task progress | (1) fix feature AC (2) proceed with task A3 |
|
|
134
|
-
| `testing` with open P1 in Review section | verify vs review-fix | (1) `/sp:dev-review <wbs> --
|
|
134
|
+
| `testing` with open P1 in Review section | verify vs review-fix | (1) `/sp:dev-review --tasks <wbs> --triage` (2) verify anyway |
|
|
135
135
|
| `wip` with both checkpoint and dirty Solution L3 | resume vs re-implement | (1) `--continue` (2) implement `--next` |
|
|
136
136
|
|
|
137
137
|
When HITL STOP fires: print decision-brief (question, stakes, recommended option, alternatives).
|
|
@@ -46,7 +46,7 @@ Pick the noun, read its reference. Each Tier A and Tier B reference owns that no
|
|
|
46
46
|
| **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) |
|
|
47
47
|
| **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, list agent specs, start/stop supervised processes, readiness check | [references/agent.md](references/agent.md) |
|
|
48
48
|
| **Tier B** | **message** | Durable inter-agent messaging: send, inbox, reply, watch | [references/message.md](references/message.md) |
|
|
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) |
|
|
49
|
+
| **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) |
|
|
50
50
|
| **Tier B** | **history** | Import agent histories, aggregate forensic artifacts, render reports, and run the checkpoint-resumed daily pipeline | [references/history.md](references/history.md) |
|
|
51
51
|
| **Tier B** | **projects** | Manage the local multi-project registry and start/stop project servers | [references/projects.md](references/projects.md) |
|
|
52
52
|
| **Tier C** | **help** | Commander-generated help command; not a Spur noun | Generated `--help` |
|
|
@@ -141,8 +141,8 @@ and spreading it; full contract in `docs/04_DESIGN.md` §1.0.1.
|
|
|
141
141
|
[dispatch-surface rule](../parallel-execution/references/dispatch-surface.md).
|
|
142
142
|
- **[references/message.md](references/message.md)** - durable inter-agent messaging (`send`,
|
|
143
143
|
`inbox`, `reply`, `watch`).
|
|
144
|
-
- **[references/self.md](references/self.md)** - `spur self init|migrate|serve|status` CLI verbs
|
|
145
|
-
(the
|
|
144
|
+
- **[references/self.md](references/self.md)** - `spur self init|maintain|migrate|serve|status` CLI verbs
|
|
145
|
+
(the five legacy top-level nouns remain hidden aliases). `self init` runs post-scaffold init
|
|
146
146
|
validation (Phase 1.5/1.6 probes).
|
|
147
147
|
- **[references/history.md](references/history.md)** - history import, forensic artifact analysis,
|
|
148
148
|
pure report rendering, and the daily pipeline.
|
|
@@ -23,12 +23,12 @@ that before using `run` for fan-out dispatch.
|
|
|
23
23
|
| ---- | ------- | --------- |
|
|
24
24
|
| `run <prompt>` | Execute a prompt or slash command via a coding agent | `--agent <name>` `--spec <id>` `--model <name>` `--mode <mode>` `--continue` `--cwd <path>` `--drain` `--json` |
|
|
25
25
|
| `wait [<specId>]` | Identity-pinned wait for an occupant run to reach a lifecycle state (G4 wave 2; `--role` selector per 0685) | `--role <name>` `--run <runId>` `--until <state>...` `--timeout <ms>` `--json` |
|
|
26
|
-
| `list` | List detected coding agents, or agent specs with `--specs` (live run status + member session merged from `spur serve`) | `--specs` `--server <url>` `--json` |
|
|
27
|
-
| `status` | Agent specs with live process status and member session (requires `spur serve`) | `--server <url>` `--json` |
|
|
26
|
+
| `list` | List detected coding agents, or agent specs with `--specs` (live run status + member session merged from `spur self serve`) | `--specs` `--server <url>` `--json` |
|
|
27
|
+
| `status` | Agent specs with live process status and member session (requires `spur self serve`) | `--server <url>` `--json` |
|
|
28
28
|
| `doctor [agent]` | Check agent readiness | `--json` `--probe-health` `--force-refresh` |
|
|
29
29
|
| `usage` | Run-once provider usage capture (codexbar) → quota-owned availability refresh; scheduled externally | `--dry-run` `--source <name>` `--json` |
|
|
30
|
-
| `start <spec-id>` | Start a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
31
|
-
| `stop <spec-id>` | Stop a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
30
|
+
| `start <spec-id>` | Start a supervised agent process (requires `spur self serve`) | `--server <url>` `--json` |
|
|
31
|
+
| `stop <spec-id>` | Stop a supervised agent process (requires `spur self serve`) | `--server <url>` `--json` |
|
|
32
32
|
|
|
33
33
|
`list`, `status`, `doctor`, `run`, `wait`, `start`, and `stop` accept `--json` plus `--json-envelope`. The hidden
|
|
34
34
|
`loop` is a supervisor-internal process surface. **Exit codes:** `0` success, `1` failure, and `2`
|
|
@@ -85,7 +85,7 @@ justify it - but ensure the run executes in a context that can write the target
|
|
|
85
85
|
|
|
86
86
|
## `loop` - supervisor-internal self-draining wrapper (hidden)
|
|
87
87
|
|
|
88
|
-
`spur agent loop --spec <id> [--poll <ms>]` is spawned by the `spur serve` supervisor for each
|
|
88
|
+
`spur agent loop --spec <id> [--poll <ms>]` is spawned by the `spur self serve` supervisor for each
|
|
89
89
|
materialized agent spec; it is hidden from `--help` and not an operator verb (use `spur agent start`).
|
|
90
90
|
It waits for a wake on the `system_events` ledger — a human request (`message.sent`), a strategy
|
|
91
91
|
change (`strategy.changed`), a capacity change (`fleet.capacity.changed`), or a completion receipt
|
|
@@ -145,7 +145,7 @@ lists agent specs (`.spur/agents/*.yaml`) **with live run status merged from the
|
|
|
145
145
|
supervisor**: each row carries a trailing status column
|
|
146
146
|
(`running` / `stopped` / `errored` / `unknown`), `pid=<n>` where a process exists, and the member
|
|
147
147
|
session (0897): the session mode plus a shortened resume id (`resume id=3f9c2a1d`), or `-` when the
|
|
148
|
-
member has no recorded session. When `spur serve` is unreachable, the listing falls back to all
|
|
148
|
+
member has no recorded session. When `spur self serve` is unreachable, the listing falls back to all
|
|
149
149
|
`stopped` with a stderr warning. `--server <url>`
|
|
150
150
|
(default `http://localhost:3000/api`) targets the supervisor API.
|
|
151
151
|
|
|
@@ -200,9 +200,9 @@ spur agent start worker-1
|
|
|
200
200
|
spur agent start worker-1 --json
|
|
201
201
|
```
|
|
202
202
|
|
|
203
|
-
Posts to the `spur serve` supervisor API
|
|
203
|
+
Posts to the `spur self serve` supervisor API
|
|
204
204
|
(`POST /api/agents/:id/start`) and prints `started <id> (pid=<n>, status=<s>)`. Requires a
|
|
205
|
-
reachable `spur serve`; `--server <url>` (default `http://localhost:3000/api`) targets it. Exit `1`
|
|
205
|
+
reachable `spur self serve`; `--server <url>` (default `http://localhost:3000/api`) targets it. Exit `1`
|
|
206
206
|
when the server is unreachable or the start fails.
|
|
207
207
|
|
|
208
208
|
## `stop` - stop a supervised process
|
|
@@ -250,7 +250,7 @@ unconfirmed or failed. For `skipped`/`pending` the printed target is intent only
|
|
|
250
250
|
0 * * * * /opt/homebrew/bin/spur agent usage >> /tmp/spur-agent-usage.log 2>&1
|
|
251
251
|
```
|
|
252
252
|
|
|
253
|
-
`spur serve` never invokes the producer (asserted by a test, design R4).
|
|
253
|
+
`spur self serve` never invokes the producer (asserted by a test, design R4).
|
|
254
254
|
|
|
255
255
|
### Flags
|
|
256
256
|
|
|
@@ -285,7 +285,7 @@ one never re-sends settled work; only never-started deliveries release and redel
|
|
|
285
285
|
- **Not the dispatch decision.** *When* to use `spur agent run` vs a native subagent is the
|
|
286
286
|
**[dispatch-surface rule](../../parallel-execution/references/dispatch-surface.md)**, not this
|
|
287
287
|
reference. This reference documents the verbs; that rule decides which surface carries a dispatch.
|
|
288
|
-
- **Not the fleet orchestrator.** The `spur serve` supervisor drives the lifecycle: `spur agent
|
|
288
|
+
- **Not the fleet orchestrator.** The `spur self serve` supervisor drives the lifecycle: `spur agent
|
|
289
289
|
start` / `stop` manage supervised processes and `agent list --specs` reports live state.
|
|
290
290
|
|
|
291
291
|
## See also
|
|
@@ -181,11 +181,16 @@ planning reference, then apply accepted deterministic changes through `spur feat
|
|
|
181
181
|
## The gate — `check --json`
|
|
182
182
|
|
|
183
183
|
```bash
|
|
184
|
-
spur feature check H2 --json
|
|
185
|
-
spur feature check --json
|
|
186
|
-
spur feature check --strict --json
|
|
184
|
+
spur feature check H2 --json # one feature
|
|
185
|
+
spur feature check --json # whole tree
|
|
186
|
+
spur feature check --strict --json # warnings → failures
|
|
187
|
+
spur feature check H2 --inventory <eval-report.md> # also cross-check AC ↔ requirement inventory
|
|
187
188
|
```
|
|
188
189
|
|
|
190
|
+
With `--inventory <report>`, the `inventory-coverage` finding (1004 R1, unsuppressible error layer)
|
|
191
|
+
fails the check when a `## Requirement inventory` item has no covering scenario (`# covers: I<n>`)
|
|
192
|
+
and is not `[deferred: ...]`; a missing/empty inventory section is itself an error.
|
|
193
|
+
|
|
189
194
|
The 4-layer validator (frontmatter, AC syntax, children-limit/structure, L4 traceability) emits its
|
|
190
195
|
verdict and findings as a JSON **array**, one entry per feature (`jq '.[0].pass'`, `.[0].findings[].code`),
|
|
191
196
|
like `spur task check --json`. Gherkin AC must keep its `Feature:` line (`L3.ac-bdd-error`) and
|
|
@@ -207,15 +212,21 @@ see the proposed status hop.
|
|
|
207
212
|
spur feature sync H2 --json # one feature
|
|
208
213
|
spur feature sync H2 --dry-run --json # propose only, no write
|
|
209
214
|
spur feature sync --all --json # every feature with linked tasks
|
|
210
|
-
spur feature sync H2 --force # apply a reopen
|
|
215
|
+
spur feature sync H2 --force # re-derive live: bypass replay + apply a reopen without confirmation
|
|
211
216
|
spur feature sync H2 --folder docs/custom-tasks --json # non-default tasks folder
|
|
212
217
|
```
|
|
213
218
|
|
|
214
219
|
- **`[id]`** syncs one feature; **`--all`** syncs every feature with linked tasks. One of the two is
|
|
215
220
|
required - exit `2` if neither is given.
|
|
216
221
|
- **`--dry-run`** reports proposed transitions without applying. **`--force`** applies a *reopen*
|
|
217
|
-
proposal (status moving backward) without interactive confirmation
|
|
218
|
-
|
|
222
|
+
proposal (status moving backward) without interactive confirmation **and** bypasses blocked-sync
|
|
223
|
+
replay (below).
|
|
224
|
+
- **Blocked-sync suppression (1004 R3):** a BLOCKED outcome is persisted at
|
|
225
|
+
`.spur/run/feature-sync-blocked-<id>.json` with an input fingerprint (feature content, linked
|
|
226
|
+
task statuses, verdict mtimes); an identical next call replays the prior result
|
|
227
|
+
(`suppressed: true`) instead of re-deriving. A changed input, `--force`, or a non-blocked
|
|
228
|
+
outcome re-derives/clears. Dry-run never reads or writes the state.
|
|
229
|
+
- **`--json`** single-feature emits `{ proposal, applied, appliedHops[], suppressed? }`; `--all` emits
|
|
219
230
|
`{ totalFeatures, evaluated, updatedCount, results[] }` where each result is the single-feature
|
|
220
231
|
shape. `proposal` is
|
|
221
232
|
`{ featureId, from, to, reason, requiresConfirm?, gateBlocked?, gateFindings?, hops? }`.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: init
|
|
3
|
-
description: "spur-cli noun reference for `spur init` and `spur status`: CLI verbs (init scaffold with --name/--force/--minimal, status with --json) plus post-scaffold init validation for /sp:spur-init - Phase 1.5 functional-validation probes and Phase 1.6 rule-glob adaptation."
|
|
3
|
+
description: "spur-cli noun reference for `spur self init` and `spur self status`: CLI verbs (init scaffold with --name/--force/--minimal, status with --json) plus post-scaffold init validation for /sp:spur-init - Phase 1.5 functional-validation probes and Phase 1.6 rule-glob adaptation."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# spur init / spur status - CLI verbs and post-scaffold validation
|
|
8
|
+
# spur self init / spur self status - CLI verbs and post-scaffold validation
|
|
9
9
|
|
|
10
10
|
## CLI verbs
|
|
11
11
|
|
|
@@ -14,14 +14,14 @@ see_also:
|
|
|
14
14
|
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
|
|
15
15
|
| `status [path]` | Show project and git status for a Spur project | `--json` |
|
|
16
16
|
|
|
17
|
-
### `spur init` - scaffold a Spur project
|
|
17
|
+
### `spur self init` - scaffold a Spur project
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
spur init # interactive: prompt for project name
|
|
21
|
-
spur init --name my-project # non-interactive
|
|
22
|
-
spur init --name my-project --force # overwrite existing .spur/ files
|
|
23
|
-
spur init --minimal # skip optional scaffolding (rules, workflows)
|
|
24
|
-
spur init --json # machine-readable
|
|
20
|
+
spur self init # interactive: prompt for project name
|
|
21
|
+
spur self init --name my-project # non-interactive
|
|
22
|
+
spur self init --name my-project --force # overwrite existing .spur/ files
|
|
23
|
+
spur self init --minimal # skip optional scaffolding (rules, workflows)
|
|
24
|
+
spur self init --json # machine-readable
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
Materializes the `.spur/` directory tree with config, docs, rules, and workflow templates. The
|
|
@@ -34,14 +34,15 @@ post-scaffold validation probes (Phase 1.5 / 1.6, below) run immediately after t
|
|
|
34
34
|
| `--name <name>` | Project name (skips interactive prompt). |
|
|
35
35
|
| `--force` | Overwrite existing `.spur/` files. Without it, existing files are preserved. |
|
|
36
36
|
| `--minimal` | Skip optional scaffolding (rules presets, workflow templates). Core config + docs only. |
|
|
37
|
+
| `--adopt-global-config` | Also rewrite `~/.config/spur/config.yaml` from the shipped global default (backed up first). Opt-in only. |
|
|
37
38
|
| `--json` | Output machine-readable JSON instead of interactive summary. |
|
|
38
39
|
|
|
39
|
-
### `spur status [path]` - project and git status
|
|
40
|
+
### `spur self status [path]` - project and git status
|
|
40
41
|
|
|
41
42
|
```bash
|
|
42
|
-
spur status # current directory
|
|
43
|
-
spur status /path/to/project # specific project
|
|
44
|
-
spur status --json # machine-readable
|
|
43
|
+
spur self status # current directory
|
|
44
|
+
spur self status /path/to/project # specific project
|
|
45
|
+
spur self status --json # machine-readable
|
|
45
46
|
```
|
|
46
47
|
|
|
47
48
|
Reports the project's Spur configuration state (init status, feature/task counts, rule preset
|
|
@@ -50,11 +51,11 @@ directory.
|
|
|
50
51
|
|
|
51
52
|
## Post-scaffold validation
|
|
52
53
|
|
|
53
|
-
Two probes sit between the deterministic scaffold (`spur init`) and the non-deterministic doc
|
|
54
|
+
Two probes sit between the deterministic scaffold (`spur self init`) and the non-deterministic doc
|
|
54
55
|
customization: Phase 1.5 (functional validation) confirms the fresh tree is immediately functional;
|
|
55
56
|
Phase 1.6 (rule glob adaptation) rewrites layout-dependent rule globs so `recommended-pre-check`
|
|
56
57
|
runs clean on this project's layout. The executing agent owns content *adaptation* only — `spur
|
|
57
|
-
init` owns *file materialization* (`04_DESIGN.md` §1.1 "Init ownership contract").
|
|
58
|
+
self init` owns *file materialization* (`04_DESIGN.md` §1.1 "Init ownership contract").
|
|
58
59
|
|
|
59
60
|
### Phase 1.5 — Functional validation probe
|
|
60
61
|
|
|
@@ -62,8 +63,8 @@ Before any customization, confirm the fresh scaffold is immediately functional.
|
|
|
62
63
|
fails, STOP and report the gap rather than papering over it with customization:
|
|
63
64
|
|
|
64
65
|
```
|
|
65
|
-
spur status
|
|
66
|
-
spur task create "__probe__" --template standard # confirms task template + matrix resolve
|
|
66
|
+
spur self status
|
|
67
|
+
spur task create "__probe__" --template standard --skip-ready # no model dispatch; confirms task template + matrix resolve
|
|
67
68
|
spur workflow validate task-pipeline.yaml
|
|
68
69
|
```
|
|
69
70
|
|
|
@@ -17,7 +17,7 @@ top-level forms are omitted from `spur --help`, leaving `self` as the visible su
|
|
|
17
17
|
|
|
18
18
|
| Verb | Purpose | Key flags |
|
|
19
19
|
| ---- | ------- | --------- |
|
|
20
|
-
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
|
|
20
|
+
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--adopt-global-config` `--json` |
|
|
21
21
|
| `maintain` | Run database maintenance: PRAGMA optimize, WAL truncation, optional VACUUM | `--vacuum` `--json` |
|
|
22
22
|
| `migrate` | Apply CLI-owned schema migrations | `--json` |
|
|
23
23
|
| `serve` | Start the Spur web server (local fallback) | `--port <n>` `--host <addr>` `--no-open` `--cwd <path>` `--json` |
|
|
@@ -40,7 +40,8 @@ spur self init --json # machine-readable
|
|
|
40
40
|
|
|
41
41
|
Materializes the `.spur/` directory tree with config, docs, rules, and workflow templates. Flags:
|
|
42
42
|
`--name <name>` (default: current directory name), `--force` (recreate existing files), `--minimal`
|
|
43
|
-
(skip optional scaffolding), `--
|
|
43
|
+
(skip optional scaffolding), `--adopt-global-config` (also rewrite `~/.config/spur/config.yaml` from
|
|
44
|
+
the shipped global default, backed up first), `--json` (machine-readable output). Post-scaffold validation probes
|
|
44
45
|
(Phase 1.5 / 1.6) run immediately after this verb completes — see **[init.md](init.md)** for the
|
|
45
46
|
probe protocol and rule-glob adaptation procedure.
|
|
46
47
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli-serve
|
|
3
|
-
description: "spur-cli noun reference: operate `spur serve` as the local web-server fallback - start the Hono/Cloudflare-Worker server that backs the web Task Kanban and the supervisor API. Single verb, five flags."
|
|
3
|
+
description: "spur-cli noun reference: operate `spur self serve` as the local web-server fallback - start the Hono/Cloudflare-Worker server that backs the web Task Kanban and the supervisor API. Single verb, five flags."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# spur serve - local web server
|
|
8
|
+
# spur self serve - local web server
|
|
9
9
|
|
|
10
|
-
`spur serve` starts the **Spur web server** - a local Hono / Cloudflare-Worker server that serves
|
|
10
|
+
`spur self serve` starts the **Spur web server** - a local Hono / Cloudflare-Worker server that serves
|
|
11
11
|
the web Task Kanban and exposes the supervisor API (`/api/processes/*` + `/api/agents/*`). It is the local fallback
|
|
12
12
|
when no remote server is configured.
|
|
13
13
|
|
|
@@ -22,10 +22,10 @@ when no remote server is configured.
|
|
|
22
22
|
## `serve` - start the web server
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
spur serve # default: localhost:3000, opens browser
|
|
26
|
-
spur serve --port 8080 --host 0.0.0.0
|
|
27
|
-
spur serve --no-open # skip browser
|
|
28
|
-
spur serve --json # dry probe: print { port, url, pid, running } and exit
|
|
25
|
+
spur self serve # default: localhost:3000, opens browser
|
|
26
|
+
spur self serve --port 8080 --host 0.0.0.0
|
|
27
|
+
spur self serve --no-open # skip browser
|
|
28
|
+
spur self serve --json # dry probe: print { port, url, pid, running } and exit
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
Starts the server with the Hono app backed by the local SQLite database. The web Task Kanban and
|
|
@@ -46,14 +46,14 @@ the supervisor API become available at `http://<host>:<port>`.
|
|
|
46
46
|
|
|
47
47
|
## What this skill is NOT
|
|
48
48
|
|
|
49
|
-
- **Not the agent supervisor.** `spur serve` hosts the supervisor API; `spur agent start` / `stop` /
|
|
49
|
+
- **Not the agent supervisor.** `spur self serve` hosts the supervisor API; `spur agent start` / `stop` /
|
|
50
50
|
`agent list --specs` are the verbs that drive and inspect it (0848). See
|
|
51
51
|
**[agent.md](agent.md)**.
|
|
52
52
|
- **Not a production server.** This is the local fallback. Production deployment uses the Cloudflare
|
|
53
|
-
Worker build (`apps/server/`), not `spur serve`.
|
|
53
|
+
Worker build (`apps/server/`), not `spur self serve`.
|
|
54
54
|
|
|
55
55
|
## See also
|
|
56
56
|
|
|
57
|
-
- **`spur agent` (see [agent.md](agent.md))** - `start`/`stop`/`list --specs` require `spur serve`
|
|
57
|
+
- **`spur agent` (see [agent.md](agent.md))** - `start`/`stop`/`list --specs` require `spur self serve`
|
|
58
58
|
for the supervisor API.
|
|
59
59
|
- **`sp:spur-cli`** SKILL.md - the facade that routes to this reference.
|
|
@@ -24,8 +24,16 @@ blocking retry).
|
|
|
24
24
|
| `--feature <id>` | Records `feature_id` in frontmatter; derives `Background` from the feature's `Goal` (L4 edge). |
|
|
25
25
|
| `--parent <wbs>` | Groups under a parent WBS for sub-task decomposition. |
|
|
26
26
|
| `--template <variant>` | Selects the section-matrix variant for the new file. |
|
|
27
|
+
| `--skip-ready` | Keep the capture as-is: no ready preparation, no model dispatch. |
|
|
28
|
+
| `--agent <selector>` | Agent used for ready preparation (default: the configured agent). Exit `2` when combined with `--skip-ready`. |
|
|
27
29
|
| `--folder <path>` | Target a non-default tasks folder. |
|
|
28
|
-
| `--json` | Emit `{ ref: { id, filePath } }`. |
|
|
30
|
+
| `--json` | Emit `{ ref: { id, filePath }, wbs, filePath, readiness: { status, depth } }`. |
|
|
31
|
+
|
|
32
|
+
**Ready by default (ADR-109):** after the capture is saved, `create` prepares the same WBS in place —
|
|
33
|
+
model refine → deterministic post-check (`task check --as todo`) → promotion to `todo`.
|
|
34
|
+
`readiness.status` is `ready`, `skipped` (`--skip-ready`), or `failed`. A failed preparation exits `1`
|
|
35
|
+
with error code `preparation-failed` (`failedStage`, `recoveryCommand`, `findings`); the task file and
|
|
36
|
+
its WBS are kept. `batch-create` takes the same two flags.
|
|
29
37
|
|
|
30
38
|
(See also the full verb map in [tasks.md](../tasks.md).)
|
|
31
39
|
|
|
@@ -67,6 +75,10 @@ frontmatter scalar.
|
|
|
67
75
|
wholesale. No inline-body flag. Section names: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Testing`, `Review`, `References`, `History`, `Notes`.
|
|
68
76
|
- **Frontmatter** (`--feature <id>`, `--priority <p>`): sets the scalar frontmatter field on an
|
|
69
77
|
existing task — the only post-create path, allow-listed to `feature_id` / `parent_wbs` / `priority`.
|
|
78
|
+
- **Estimate** (`--estimate-hours <n>`): sets the `estimate_hours` frontmatter field (positive number) —
|
|
79
|
+
the decomposition size estimate the inline pipeline driver reads.
|
|
80
|
+
- **`--provenance-bypass`** (pair with `--force-done` and `--reason`): records an audited
|
|
81
|
+
provenance-bypass link when no pipeline run exists. Replaces the `SPUR_PROVENANCE_OVERRIDE` env var.
|
|
70
82
|
- **AC controls** (`--ac-altitude <graduating|task-local>`, `--ac-numbering task-local`) — independent
|
|
71
83
|
of each other (task 0818 R5). `--ac-altitude task-local` skips the **DD-09 feature-AC subset** rule
|
|
72
84
|
because the task's scenarios are intentionally not the feature's ship criteria; `--ac-numbering
|
|
@@ -339,8 +351,11 @@ column to distinguish AC rows from requirement rows:
|
|
|
339
351
|
`AC-<i>` (which credits the scenario) and the task checkbox id `AC<i>` (which the box flip needs).
|
|
340
352
|
Key the row **`AC<n> — <scenario title>`**, omitting the scenario's own `R<n>` label — then one row
|
|
341
353
|
does both: `normalizeTitle` strips the `AC<n>` prefix so the row still matches the scenario title,
|
|
342
|
-
and `prefixId` normalizes `AC<n>` so the box flips. A bare `AC
|
|
343
|
-
|
|
354
|
+
and `prefixId` normalizes `AC<n>` so the box flips. A bare `AC-<i>` also does both: `record`
|
|
355
|
+
resolves it through the feature's scenario order to the AC line aliasing scenario *i*
|
|
356
|
+
(`AC<k> — [R<n> — ]<scenario title>`) and flips that box — never the same-numbered `AC<i>`; with no
|
|
357
|
+
aliasing line it flips nothing. A bare `AC<n>` credits no scenario; a title carrying the scenario's
|
|
358
|
+
`R<n>` label matches neither.
|
|
344
359
|
|
|
345
360
|
**Evidence rule (behavior-bearing AC):** an AC row with `status: MET` on a behavior-bearing id
|
|
346
361
|
(no `[advisory]`/`[non-core]`/`[non-behavior]`/`[docs-only]` marker) MUST carry `test` or
|
|
@@ -410,9 +425,9 @@ unallocated.
|
|
|
410
425
|
## Command surface (quick)
|
|
411
426
|
|
|
412
427
|
```
|
|
413
|
-
spur task create <title> [--feature <id>] [--parent <wbs>] [--template <v>] [--dedupe-within <seconds>] [--allow-duplicate-name] [--folder] [--json]
|
|
428
|
+
spur task create <title> [--feature <id>] [--parent <wbs>] [--template <v>] [--dedupe-within <seconds>] [--allow-duplicate-name] [--skip-ready | --agent <selector>] [--folder] [--json]
|
|
414
429
|
spur task show <wbs> [--folder] [--json]
|
|
415
|
-
spur task update <wbs> [status] [--section <n> --from-file <p>] [--feature <id>] [--priority <p>] [--no-lifecycle] [--folder] [--json]
|
|
430
|
+
spur task update <wbs> [status] [--section <n> --from-file <p>] [--feature <id>] [--priority <p>] [--ac-numbering task-local] [--ac-altitude <a>] [--estimate-hours <n>] [--assignee <spec-id>] [--no-lifecycle] [--force-done --reason <text> [--provenance-bypass] [--verdict-dir <path>]] [--folder] [--json]
|
|
416
431
|
spur task deps <wbs> <set|add|remove|clear> [values...] [--folder] [--json]
|
|
417
432
|
spur task sections <wbs> <init|add|list> [name] [--folder] [--json]
|
|
418
433
|
spur task list [--status <s>] [--phase <p>] [--parent <wbs>] [--feature <id>] [--folder] [--json]
|
|
@@ -420,7 +435,7 @@ spur task refresh [--folder] [--json]
|
|
|
420
435
|
spur task migrate [--dry-run] [--folder] [--json]
|
|
421
436
|
spur task migrate-anchors [--dry-run] [--json]
|
|
422
437
|
spur task refresh-roster <wbs> [--folder] [--json]
|
|
423
|
-
spur task batch-create --file <path> [--folder] [--json]
|
|
438
|
+
spur task batch-create --file <path> [--skip-ready | --agent <selector>] [--folder] [--json]
|
|
424
439
|
spur task record <wbs> [--verdict-file <p>] [--solution-from-diff] [--transition <s>] [--folder] [--json]
|
|
425
440
|
spur task verdict <wbs> [--from-answer <p>] [--folder] [--json]
|
|
426
441
|
spur task verifyall-aggregate [--from-file <path>] [--json]
|