@gobing-ai/spur 0.4.0 → 0.4.2
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/config.global.yaml +4 -2
- package/config/decisions/gates.yaml +36 -0
- package/config/decisions/history-anatomy.yaml +35 -0
- package/config/decisions/idea-pipeline.yaml +38 -0
- package/config/plugin-scripts.json +15 -0
- package/config/rules/docs/sourced-api-claims.yaml +60 -0
- package/config/rules/recommended-pre-check.yaml +8 -3
- package/config/rules/structure/scratch-evidence-pointer.yaml +35 -0
- package/config/script-placement-baseline.json +2 -2
- package/config/templates/AGENTS.md +1 -1
- package/config/workflows/feature-lifecycle.yaml +9 -2
- package/config/workflows/history-anatomy.yaml +22 -0
- package/config/workflows/idea-pipeline.yaml +75 -0
- package/config/workflows/task-pipeline.yaml +216 -57
- package/config/workflows/wrapup-pipeline.yaml +107 -14
- package/package.json +10 -10
- package/plugins/sp/README.md +12 -3
- package/plugins/sp/agents/super-planner.md +16 -6
- package/plugins/sp/agents/super-reviewer.md +14 -0
- package/plugins/sp/bunfig.toml +8 -0
- package/plugins/sp/commands/dev-brainstorm.md +29 -16
- package/plugins/sp/commands/dev-find-way.md +80 -0
- package/plugins/sp/commands/dev-idea.md +6 -0
- package/plugins/sp/commands/dev-plan.md +6 -0
- package/plugins/sp/commands/dev-review-session.md +4 -1
- package/plugins/sp/commands/dev-run.md +12 -2
- package/plugins/sp/commands/dev-runall.md +32 -15
- package/plugins/sp/hooks/context-owner.ts +56 -0
- package/plugins/sp/hooks/context-post-tool.ts +23 -0
- package/plugins/sp/hooks/context-session-start.ts +49 -27
- package/plugins/sp/hooks/context-session-stop.ts +131 -30
- package/plugins/sp/hooks/pi/guard-extension.ts +21 -8
- package/plugins/sp/lib/idea-handoff.generated.mjs +43 -5
- package/plugins/sp/lib/inline-run-app.ts +28 -0
- package/plugins/sp/lib/inline-run.generated.d.mts +5 -0
- package/plugins/sp/lib/inline-run.generated.mjs +351 -46
- package/plugins/sp/lib/plan-projection.generated.d.mts +47 -0
- package/plugins/sp/lib/plan-projection.generated.mjs +368 -0
- package/plugins/sp/lib/quality-gate.generated.d.mts +35 -1
- package/plugins/sp/lib/quality-gate.generated.mjs +30296 -71
- package/plugins/sp/lib/residual-scan.generated.d.mts +19 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +66 -0
- package/plugins/sp/lib/run-summary-core.ts +561 -0
- package/plugins/sp/lib/transcript.ts +150 -7
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +1 -1
- package/plugins/sp/scripts/batch-plan.mjs +488 -0
- package/plugins/sp/scripts/batch-plan.ts +145 -0
- package/plugins/sp/scripts/batch-preflight.mjs +51 -3
- package/plugins/sp/scripts/batch-preflight.ts +72 -1
- package/plugins/sp/scripts/commit-guard.mjs +216 -0
- package/plugins/sp/scripts/commit-guard.ts +249 -0
- package/plugins/sp/scripts/inline-run-dispatch.mjs +130 -0
- package/plugins/sp/scripts/inline-run-dispatch.ts +135 -0
- package/plugins/sp/scripts/inline-run-setup.mjs +562 -80
- package/plugins/sp/scripts/inline-run-setup.ts +52 -78
- package/plugins/sp/scripts/persist-out-check.mjs +90 -41
- package/plugins/sp/scripts/persist-out-check.ts +112 -57
- package/plugins/sp/scripts/pr-reviewing.mjs +19 -5
- package/plugins/sp/scripts/pr-reviewing.ts +34 -9
- package/plugins/sp/scripts/quality-gate.mjs +30213 -61
- package/plugins/sp/scripts/quality-gate.ts +21 -5
- package/plugins/sp/scripts/residual-scan.mjs +86 -31
- package/plugins/sp/scripts/residual-scan.ts +28 -30
- package/plugins/sp/scripts/run-summary.mjs +432 -14
- package/plugins/sp/scripts/run-summary.ts +41 -177
- package/plugins/sp/scripts/session-timeline.mjs +109 -11
- package/plugins/sp/scripts/session-timeline.ts +57 -19
- package/plugins/sp/scripts/task-diffstat.mjs +32 -29
- package/plugins/sp/scripts/task-diffstat.ts +34 -34
- package/plugins/sp/scripts/wrapup-steps.mjs +150 -2
- package/plugins/sp/scripts/wrapup-steps.ts +203 -1
- package/plugins/sp/skills/brainstorm/SKILL.md +9 -47
- package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +1 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +48 -1
- package/plugins/sp/skills/code-verification/SKILL.md +3 -4
- package/plugins/sp/skills/code-verification/references/secu-review.md +3 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +68 -0
- package/plugins/sp/skills/fleet-join/SKILL.md +1 -1
- package/plugins/sp/skills/indexed-context/SKILL.md +14 -7
- package/plugins/sp/skills/parallel-execution/SKILL.md +2 -2
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +2 -2
- package/plugins/sp/skills/pr-reviewing/SKILL.md +7 -3
- package/plugins/sp/skills/session-review/SKILL.md +40 -7
- package/plugins/sp/skills/source-driven-development/SKILL.md +5 -0
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +5 -3
- package/plugins/sp/skills/spur-cli/SKILL.md +5 -2
- package/plugins/sp/skills/spur-cli/references/agent.md +20 -15
- package/plugins/sp/skills/spur-cli/references/decision.md +16 -8
- package/plugins/sp/skills/spur-cli/references/message.md +7 -7
- package/plugins/sp/skills/spur-cli/references/projects.md +7 -5
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +19 -3
- package/plugins/sp/skills/spur-cli/references/tasks.md +10 -7
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +7 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +7 -2
- package/plugins/sp/skills/spur-composer/SKILL.md +1 -1
- package/plugins/sp/skills/spur-dev/SKILL.md +20 -14
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +33 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +49 -14
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -17
- package/plugins/sp/skills/spur-dev/references/execution-batch-continuation.md +68 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +199 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +156 -1024
- package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +133 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +6 -0
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +471 -0
- package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +379 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +44 -12
- package/plugins/sp/skills/spur-dev/references/glossary.md +2 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +340 -165
- package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +178 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +10 -14
- package/schemas/state-machine-workflow.schema.json +23 -0
- package/spur.js +42402 -26889
- package/web/_astro/{BoardApp.VeoxxLBy.js → BoardApp.B3GQZvj8.js} +1 -1
- package/web/_astro/BoardApp.BT7L2kSb.js +324 -0
- package/web/_astro/TaskDetail.Cxov1_N_.js +1 -0
- package/web/_astro/{arc.f4e0OYLg.js → arc.vaT7tPOB.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.SSIvxi-Z.js → architectureDiagram-3BPJPVTR.DRMmTjkN.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.DSXIHOFf.js → blockDiagram-GPEHLZMM.cla0LO_q.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DG9Ubu85.js → c4Diagram-AAUBKEIU.D4YAIBKn.js} +1 -1
- package/web/_astro/channel.D4nG9YLf.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.C7QU88Qh.js → chunk-2J33WTMH.BrSJbMRZ.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.26Z94xBj.js → chunk-4BX2VUAB.CuLMgKF5.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DYRiBkqw.js → chunk-55IACEB6.zkvgu54F.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.D5Vfv5pe.js → chunk-727SXJPM.DxWkACh8.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DXHV47bN.js → chunk-AQP2D5EJ.42XrmIlH.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.D1suAfOs.js → chunk-FMBD7UC4.Bao2wMK9.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.D6BmdHEY.js → chunk-ND2GUHAM.BhydojD1.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.rnPU-Ak-.js → chunk-QZHKN3VN.CmZ82g-H.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CvEfXIo1.js → classDiagram-4FO5ZUOK.Blr83Gt_.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CvEfXIo1.js → classDiagram-v2-Q7XG4LA2.Blr83Gt_.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.DkMisLSm.js → cose-bilkent-S5V4N54A.qmfv0SPn.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.C77Q-pF6.js → cynefin-OW5HDTMX.BtELhXPR.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.YaV8ce27.js → dagre-BM42HDAG.AWmaAvXo.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.CUyGEKge.js → diagram-2AECGRRQ.DdH34KDi.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.CRgd8dgj.js → diagram-5GNKFQAL.BmNPix1k.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.Bmzys9hq.js → diagram-KO2AKTUF.BNQd_Ppo.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BvmJY4Lw.js → diagram-LMA3HP47.BAPgDi0e.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.0hEhD30d.js → diagram-OG6HWLK6.DZ4zyLdC.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.Bjt8lrnm.js → erDiagram-TEJ5UH35.Q1TySMmw.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.CJZTjRDV.js → flowDiagram-I6XJVG4X.BXhFBicG.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7._VqoVafc.js → ganttDiagram-6RSMTGT7.vHSgcuo2.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.CEDb7tVo.js → gitGraphDiagram-PVQCEYII.Bi1f73C7.js} +1 -1
- package/web/_astro/index.BhSwN8yY.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.CgwifPpK.js → infoDiagram-5YYISTIA.DPvXZEWm.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.B99wx2J1.js → ishikawaDiagram-YF4QCWOH.Cz829fsV.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.2hRwJbEo.js → journeyDiagram-JHISSGLW.enRnB9Me.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.BahJkKNC.js → kanban-definition-UN3LZRKU.DnTNk6d2.js} +1 -1
- package/web/_astro/{linear.DguUUe6V.js → linear.BzGnBwNL.js} +1 -1
- package/web/_astro/{mermaid.core.CvgfmqVr.js → mermaid.core.CSbTpIVz.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.B3qEA3x9.js → mindmap-definition-RKZ34NQL.DGJDy8zT.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.FlWA-_ru.js → pieDiagram-4H26LBE5.HSPdi5_8.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.9bVn35X7.js → quadrantDiagram-W4KKPZXB.6Gv8mz2Y.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.ChykIhct.js → requirementDiagram-4Y6WPE33.CnBCtFwa.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.Z2Y3hkYb.js → sankeyDiagram-5OEKKPKP.5M8VWAu8.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.J7JsHWDt.js → sequenceDiagram-3UESZ5HK.DN41XN-U.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DAPbiCSS.js → stateDiagram-AJRCARHV.ErOO3W8j.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.D2jvSi0q.js → stateDiagram-v2-BHNVJYJU.B_ZHICM-.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.psW2ci29.js → timeline-definition-PNZ67QCA.CWdosr07.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DlILYVmg.js → vennDiagram-CIIHVFJN.BHzYjNV5.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.xNWwLJnn.js → wardleyDiagram-YWT4CUSO.h8x4IwPX.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.EU_BuH7V.js → xychartDiagram-2RQKCTM6.RTapW2X8.js} +1 -1
- package/web/index.html +2 -2
- package/plugins/sp/commands/dev-parallel.md +0 -31
- package/web/_astro/BoardApp.Bzr4OXrW.js +0 -324
- package/web/_astro/TaskDetail.LAyR_Pvn.js +0 -1
- package/web/_astro/channel.CUFdtWhm.js +0 -1
- package/web/_astro/index.Dg_3bOaJ.css +0 -1
|
@@ -23,6 +23,18 @@
|
|
|
23
23
|
# -> done
|
|
24
24
|
# doc-sync routes a contract violation to `repair` (cheap, no
|
|
25
25
|
# re-dispatch — ADR-118 pilot) and an executor failure to `failed`;
|
|
26
|
+
# 1147 adds two deterministic post-doc-sync checks that fail the step
|
|
27
|
+
# BEFORE the tripwire backstop and name doc-sync. Those edges are
|
|
28
|
+
# declared before the contract-violation edge, so a doc-sync that both
|
|
29
|
+
# misses its learnings post-condition and trips a deterministic check
|
|
30
|
+
# fails the step instead of taking repair. The checks are: the write-scope check
|
|
31
|
+
# (the entry snapshot diffed against the working listing; allowed paths
|
|
32
|
+
# are docs/** minus docs/tasks*/docs/features* plus the declared learnings
|
|
33
|
+
# capture — a violation writes scope-violation: <paths> and is reported,
|
|
34
|
+
# never auto-reverted) and the supersession-pin re-run
|
|
35
|
+
# (repo-wide-tests/adr-supersession.test.ts), so a resurrected delinked
|
|
36
|
+
# index row is attributable to doc-sync; doc-tripwire stays the full
|
|
37
|
+
# backstop and is never weakened;
|
|
26
38
|
# learnings-validate (0986) rejects a nonempty narration-only capture to
|
|
27
39
|
# the same `repair` edge with a distinct invalid-learnings-shape status —
|
|
28
40
|
# expectFile proves existence, never shape — while empty/missing captures
|
|
@@ -86,7 +98,7 @@
|
|
|
86
98
|
"$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
|
|
87
99
|
kind: state-machine
|
|
88
100
|
name: wrapup-pipeline
|
|
89
|
-
version: "
|
|
101
|
+
version: "9"
|
|
90
102
|
description: "Post-execution wrap-up: doc-sync (doc drift + learning capture), metrics, feature-transition, branch-cleanup"
|
|
91
103
|
iterationBound: 10
|
|
92
104
|
initialState: start
|
|
@@ -232,8 +244,26 @@ states:
|
|
|
232
244
|
(a clean exit that missed its declared answerFile/expectFile post-condition)
|
|
233
245
|
routes to the cheap `repair` edge instead of a full re-dispatch (ADR-118
|
|
234
246
|
pilot, 0871) — `onError: continue` lets the transition guards read the
|
|
235
|
-
agent's result instead of halting the run.
|
|
247
|
+
agent's result instead of halting the run. 1147 R1/R2 wrap it with a
|
|
248
|
+
deterministic write-scope guard (entry snapshot before the query, diff after
|
|
249
|
+
it; a violation writes scope-violation: <paths> and routes to `failed`, the
|
|
250
|
+
edits are reported and never auto-reverted) and a supersession-pin re-run, so
|
|
251
|
+
an out-of-scope or delinked-row write is attributed here instead of surfacing
|
|
252
|
+
late at doc-tripwire.
|
|
236
253
|
onEnter:
|
|
254
|
+
# (1147 R1) entry snapshot: the working listing is recorded BEFORE the model
|
|
255
|
+
# query so the post-doc-sync check can attribute only this step's writes. Never
|
|
256
|
+
# aborts; a git failure or a missing script leaves the snapshot absent and the
|
|
257
|
+
# check fails closed rather than guessing.
|
|
258
|
+
- kind: shell
|
|
259
|
+
options:
|
|
260
|
+
command: >-
|
|
261
|
+
mkdir -p .spur/run &&
|
|
262
|
+
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
|
|
263
|
+
"$RUNNER" "$S" doc-sync-snapshot;
|
|
264
|
+
else
|
|
265
|
+
echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
|
|
266
|
+
fi
|
|
237
267
|
# (warn) free-form prompt: no /sp:doc-evolve command surface yet (ADR-043
|
|
238
268
|
# residual, 0607 R2 one-query merge); capture is bounded by expectFile.
|
|
239
269
|
- kind: agent.run
|
|
@@ -243,7 +273,10 @@ states:
|
|
|
243
273
|
input: >-
|
|
244
274
|
First run Skill(skill="sp:doc-evolve", args="wrapup") to repair drift in
|
|
245
275
|
docs/00_ADR.md, docs/03_ARCHITECTURE.md, docs/04_DESIGN.md, docs/design/* per constitution edit
|
|
246
|
-
rules; do not write task/feature corpus.
|
|
276
|
+
rules; do not write task/feature corpus. Write ONLY inside docs/ (never docs/tasks* or
|
|
277
|
+
docs/features*) — any other changed path fails the wrap step with a scope violation. A row
|
|
278
|
+
absent from docs/04_DESIGN.md for a superseded satellite is intentional: do NOT re-add it.
|
|
279
|
+
The batch task list is the normalized, validated
|
|
247
280
|
capture at .spur/run/${vars.__runId}-wrapup-tasks.json — read it for the WBS ids; never
|
|
248
281
|
re-parse raw input. THEN extract working learnings from those tasks —
|
|
249
282
|
conventions, errors fixed, patterns, gotchas, grouped by date and task WBS — as raw markdown
|
|
@@ -255,6 +288,34 @@ states:
|
|
|
255
288
|
answerFile: .spur/run/${vars.__runId}-wrapup-learnings.md
|
|
256
289
|
expectFile: .spur/run/${vars.__runId}-wrapup-learnings.md
|
|
257
290
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
291
|
+
# (1147 R1) post-doc-sync write-scope guard: the script diffs the working listing
|
|
292
|
+
# against the entry snapshot and writes PASS or `scope-violation: <paths>` — the
|
|
293
|
+
# action always exits 0 so status truth lives in the file (0783 R4) and the
|
|
294
|
+
# declared guard routes. Violating edits are reported, never reverted.
|
|
295
|
+
- kind: shell
|
|
296
|
+
options:
|
|
297
|
+
command: >-
|
|
298
|
+
mkdir -p .spur/run &&
|
|
299
|
+
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
|
|
300
|
+
"$RUNNER" "$S" doc-sync-scope;
|
|
301
|
+
else
|
|
302
|
+
echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
|
|
303
|
+
printf 'scope-violation: wrapup-steps script not found\n' > ".spur/run/$__runId-wrapup-doc-sync-scope.status";
|
|
304
|
+
fi
|
|
305
|
+
# (1147 R2) supersession pins re-run: a doc-sync that resurrects a deliberately
|
|
306
|
+
# delinked index row (`repo-wide-tests/adr-supersession.test.ts`, g2) fails HERE,
|
|
307
|
+
# named with the pin, instead of being attributed to the later doc-tripwire
|
|
308
|
+
# backstop. Skips in a project without the pin; always exits 0 (0783 R4).
|
|
309
|
+
- kind: shell
|
|
310
|
+
options:
|
|
311
|
+
command: >-
|
|
312
|
+
mkdir -p .spur/run &&
|
|
313
|
+
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
|
|
314
|
+
"$RUNNER" "$S" doc-supersession;
|
|
315
|
+
else
|
|
316
|
+
echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
|
|
317
|
+
printf 'supersession-pin-failed: wrapup-steps script not found\n' > ".spur/run/$__runId-wrapup-doc-supersession.status";
|
|
318
|
+
fi
|
|
258
319
|
|
|
259
320
|
- id: learnings-validate
|
|
260
321
|
description: >
|
|
@@ -321,7 +382,7 @@ states:
|
|
|
321
382
|
command: >-
|
|
322
383
|
mkdir -p .spur/run &&
|
|
323
384
|
R=".spur/run/$__runId-wrapup-repair.status" &&
|
|
324
|
-
V="$(cat .spur/run/$__runId-wrapup-learnings.status 2>/dev/null)" &&
|
|
385
|
+
V="$(cat .spur/run/$__runId-wrapup-learnings.status 2>/dev/null || true)" &&
|
|
325
386
|
if [ "$V" = invalid-learnings-shape ]; then printf 'invalid-learnings-shape: narration-only learnings capture — append skipped, repair recorded (0986)\n' > "$R";
|
|
326
387
|
else printf 'contract-violation: doc-sync learnings capture missed its declared contract — repair skipped re-dispatch (ADR-118 pilot)\n' > "$R";
|
|
327
388
|
fi &&
|
|
@@ -463,7 +524,8 @@ states:
|
|
|
463
524
|
description: >
|
|
464
525
|
Terminal — wrap-up failed (0770): invalid wrap input, an unresolved or
|
|
465
526
|
non-completed task, a failed metrics capture, a failed required sync, a
|
|
466
|
-
failed repo-wide tripwire (1037),
|
|
527
|
+
failed repo-wide tripwire (1037), a failed feature gate, or one of the
|
|
528
|
+
deterministic post-doc-sync checks (1147: write scope, supersession pins).
|
|
467
529
|
Already-written artifacts (learnings, metrics rows, route reason) are
|
|
468
530
|
preserved; nothing is rolled back.
|
|
469
531
|
|
|
@@ -521,17 +583,47 @@ transitions:
|
|
|
521
583
|
guard:
|
|
522
584
|
kind: always
|
|
523
585
|
|
|
524
|
-
# ── doc-sync: contract
|
|
525
|
-
# Declaration order matters
|
|
526
|
-
#
|
|
527
|
-
#
|
|
528
|
-
#
|
|
586
|
+
# ── doc-sync: deterministic checks, then contract repair (ADR-118; 1147 R1/R2) ──
|
|
587
|
+
# Declaration order matters. The engine takes the first passing guard. The two
|
|
588
|
+
# deterministic post-doc-sync checks (write scope, supersession pins) are tried
|
|
589
|
+
# first, so a doc-sync that both misses its learnings post-condition and writes
|
|
590
|
+
# out of scope (or resurrects a delinked row) fails the step. A violation they
|
|
591
|
+
# recorded can never be absorbed by repair or by the success edge. Contract
|
|
592
|
+
# violation is next (repair only when neither deterministic check fired), then
|
|
593
|
+
# success (action-ok), then the executor-failure defense (always). A failed
|
|
594
|
+
# agent.run reaches these guards because doc-sync's agent.run declares onError: continue.
|
|
595
|
+
- from: doc-sync
|
|
596
|
+
to: failed
|
|
597
|
+
terminalReason: failed-check
|
|
598
|
+
description: >
|
|
599
|
+
Write-scope violation (1147 R1): the post-doc-sync check found a changed path
|
|
600
|
+
outside docs/** minus the task/feature corpus (and the declared learnings
|
|
601
|
+
capture) — the status file names the paths and the failing step is doc-sync
|
|
602
|
+
itself. The edits are reported, never auto-reverted; already-written artifacts
|
|
603
|
+
stay on disk. Declared before contract-violation so a compound miss fails here.
|
|
604
|
+
guard:
|
|
605
|
+
kind: shell
|
|
606
|
+
options:
|
|
607
|
+
command: 'grep -q "^scope-violation:" .spur/run/$__runId-wrapup-doc-sync-scope.status 2>/dev/null'
|
|
608
|
+
- from: doc-sync
|
|
609
|
+
to: failed
|
|
610
|
+
terminalReason: failed-check
|
|
611
|
+
description: >
|
|
612
|
+
Supersession drift (1147 R2): the post-doc-sync re-run of
|
|
613
|
+
repo-wide-tests/adr-supersession.test.ts failed — doc-sync re-added a
|
|
614
|
+
deliberately delinked index row. Attributed here (named with the pin) rather
|
|
615
|
+
than at the later doc-tripwire backstop, which stays unchanged. Declared
|
|
616
|
+
before contract-violation so a compound miss fails here.
|
|
617
|
+
guard:
|
|
618
|
+
kind: shell
|
|
619
|
+
options:
|
|
620
|
+
command: 'grep -q "^supersession-pin-failed:" .spur/run/$__runId-wrapup-doc-supersession.status 2>/dev/null'
|
|
529
621
|
- from: doc-sync
|
|
530
622
|
to: repair
|
|
531
623
|
description: >
|
|
532
624
|
Contract violation (ADR-118): the agent exited 0 but missed its declared
|
|
533
|
-
post-condition. Route to the cheap
|
|
534
|
-
full agent.run on this attempt.
|
|
625
|
+
post-condition, and neither deterministic check fired. Route to the cheap
|
|
626
|
+
repair edge — never re-dispatch the full agent.run on this attempt.
|
|
535
627
|
trigger: contract-violation
|
|
536
628
|
guard:
|
|
537
629
|
kind: contract-violation
|
|
@@ -545,8 +637,9 @@ transitions:
|
|
|
545
637
|
terminalReason: failed-check
|
|
546
638
|
description: >
|
|
547
639
|
Executor failure (non-zero exit, signal, or dispatch error) — keep the
|
|
548
|
-
existing fail semantics
|
|
549
|
-
|
|
640
|
+
existing fail semantics. A scope or supersession violation is declared
|
|
641
|
+
earlier and fails the step; a contract violation never falls through here
|
|
642
|
+
because its edge is declared before this defense.
|
|
550
643
|
trigger: executor-failure
|
|
551
644
|
guard:
|
|
552
645
|
kind: always
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spur",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"dev": "bun run src/index.ts",
|
|
50
50
|
"build": "bun run ../../scripts/spur-dev.ts build-cli",
|
|
51
51
|
"build:binaries": "bun run ../../scripts/spur-dev.ts build-binaries",
|
|
52
|
-
"build:bundle": "bun run ../../scripts/commands/bundle-plugin-lib.ts && bun run ../../scripts/spur-dev.ts bundle-web && bun run ../../scripts/spur-dev.ts emit-board-types && bun build src/index.ts --target=bun --outfile spur.js && bun run ../../scripts/spur-dev.ts bundle-config config && bun run ../../scripts/spur-dev.ts bundle-plugins",
|
|
52
|
+
"build:bundle": "bun run ../../scripts/commands/bundle-plugin-lib.ts && bun run ../../scripts/spur-dev.ts bundle-web && bun run ../../scripts/spur-dev.ts emit-board-types && bun build src/index.ts --target=bun --outfile spur.js --external @johnhenry/backend-webgpu && bun run ../../scripts/spur-dev.ts bundle-config config && bun run ../../scripts/spur-dev.ts bundle-plugins",
|
|
53
53
|
"test": "bun test tests --coverage --coverage-dir=../../.coverage --pass-with-no-tests",
|
|
54
54
|
"typecheck": "tsc --noEmit",
|
|
55
55
|
"prepack": "bun run build:bundle",
|
|
@@ -57,14 +57,14 @@
|
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@commander-js/extra-typings": "^14.0.0",
|
|
60
|
-
"@gobing-ai/ts-db": "^0.5.
|
|
61
|
-
"@gobing-ai/ts-ai-runner": "^0.5.
|
|
62
|
-
"@gobing-ai/ts-dual-workflow-engine": "^0.5.
|
|
63
|
-
"@gobing-ai/ts-infra": "^0.5.
|
|
64
|
-
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.
|
|
65
|
-
"@gobing-ai/ts-rule-engine": "^0.5.
|
|
66
|
-
"@gobing-ai/ts-runtime": "^0.5.
|
|
67
|
-
"@gobing-ai/ts-utils": "^0.5.
|
|
60
|
+
"@gobing-ai/ts-db": "^0.5.22",
|
|
61
|
+
"@gobing-ai/ts-ai-runner": "^0.5.22",
|
|
62
|
+
"@gobing-ai/ts-dual-workflow-engine": "^0.5.22",
|
|
63
|
+
"@gobing-ai/ts-infra": "^0.5.22",
|
|
64
|
+
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.22",
|
|
65
|
+
"@gobing-ai/ts-rule-engine": "^0.5.22",
|
|
66
|
+
"@gobing-ai/ts-runtime": "^0.5.22",
|
|
67
|
+
"@gobing-ai/ts-utils": "^0.5.22",
|
|
68
68
|
"@types/bun": "1.3.14",
|
|
69
69
|
"@types/figlet": "^1.7.0",
|
|
70
70
|
"@types/node-notifier": "8.0.5",
|
package/plugins/sp/README.md
CHANGED
|
@@ -98,6 +98,7 @@ list this README is checked against.
|
|
|
98
98
|
| `dev-idea` | 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, handoff |
|
|
99
99
|
| `dev-plan` | Plan a feature from a written description — intake → feature create → AC generation → feature check gate → decomposition → batch-create |
|
|
100
100
|
| `dev-brainstorm` | Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring |
|
|
101
|
+
| `dev-find-way` | Wayfinder — chart a multi-session investigation map, or resolve one map ticket; always in an isolated git worktree + branch (`--worktree`, `--wrap`) |
|
|
101
102
|
| `dev-refine` | Refine task requirements via structured Q&A — clarify scope, elicit missing details, tighten acceptance criteria; `--depth ready` audits and corrects existing claims, freezes the spec, promotes to todo |
|
|
102
103
|
|
|
103
104
|
#### Lifecycle — execution
|
|
@@ -119,7 +120,6 @@ list this README is checked against.
|
|
|
119
120
|
| Command | What it does |
|
|
120
121
|
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
121
122
|
| `dev-runall` | Run a batch of tasks through their pipelines in dependency-correct order — resolve a set, topo-sort, run each via task-pipeline.yaml, emit a batch report |
|
|
122
|
-
| `dev-parallel` | Fan out independent tasks or investigations in parallel via subagents — choose the right pattern and synthesize results |
|
|
123
123
|
| `dev-refineall` | Batch-refine tasks (feature or selector) — planning-half bulk fill of Background/Requirements/AC/Design/Plan before runall; `--depth ready` audits, corrects, freezes and promotes each task |
|
|
124
124
|
| `dev-verifyall` | Batch-verify tasks against requirements and AC — resolves a set, runs per-task verification, produces consolidated PASS/PARTIAL/FAIL summary report |
|
|
125
125
|
| `dev-wrapall` | Wrap up a batch of completed tasks — learnings, metrics, doc-sync, feature transition, optional branch cleanup |
|
|
@@ -332,7 +332,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
|
|
|
332
332
|
| `source-driven-development` | 1.0 | Source-first verification — verify framework/API/library facts against primary sources before generating code; separates "the API exists" from "used correctly under its contract" |
|
|
333
333
|
| `dogfood-testing` | 1.2 | Dogfood backbone — drives a testee end-to-end with bounded auto-fix, a live monitor ledger, and a structured report; @1.2 adds footer-mandatory reports, 7-check finalize-or-abort, and the `validate-report` CLI; backs `/sp:dev-dogfood` |
|
|
334
334
|
| `next-router` | 1.0 | Status→command router — resolve a task WBS or feature frontier, TABLE A/B/C lookup with light-gate short-circuit, single dispatch or HITL stop; backs `/sp:dev-next` |
|
|
335
|
-
| `parallel-execution` | 1.0 | Fan-out decision framework — when to parallelize, four proven fan-out patterns, and result synthesis; backs `/sp:dev-parallel`
|
|
335
|
+
| `parallel-execution` | 1.0 | Fan-out decision framework — when to parallelize, four proven fan-out patterns, and result synthesis; backs `/sp:dev-runall --mode parallel\|auto` |
|
|
336
336
|
| `sys-debugging` | 1.0 | Structured debugging protocol — reproduce→isolate→root cause→fix→regression test; "ask the debugger before the LLM" principle |
|
|
337
337
|
| `branch-workflow` | 1.0 | Branch-lifecycle discipline — create→worktree→commit→self-review→merge→cleanup; git worktree patterns for parallel branches |
|
|
338
338
|
| `test-driven-development` | 1.0.0 | TDD workflow companion — red-green-refactor cycle, behavior-first test design, AAA structure, data builders, mock-at-boundary anti-patterns |
|
|
@@ -393,7 +393,7 @@ index above lists the live inventory, organized by the surface they wrap:
|
|
|
393
393
|
|
|
394
394
|
| Prefix | Count | Delegates to | Purpose |
|
|
395
395
|
| ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
396
|
-
| `dev-*` |
|
|
396
|
+
| `dev-*` | 38 | `sp:spur-dev`, `sp:spur-cli`, `sp:next-router`, `sp:next-feature`, `sp:brainstorm`, `sp:wayfinder`, `sp:sys-architecture`, `sp:code-implementation`, `sp:code-testing`, `sp:code-verification`, `sp:functional-review`, `sp:code-improvement`, `sp:code-simplification`, `sp:sys-debugging`, `sp:dogfood-testing`, `sp:parallel-execution`, `sp:history-anatomy`, `sp:session-review`, `sp:conflict-finding`, `sp:reverse-engineering`, `sp:pr-reviewing`, inline | The dev-workflow surface — planning, execution, batch, wrap-up, review/verify, hygiene |
|
|
397
397
|
| `rule-*` | 3 | `sp:spur-cli` | The rule surface — `rule-add`, `rule-refine`, `rule-scan` |
|
|
398
398
|
| `workflow-*` | 2 | `sp:spur-cli` | The workflow surface — `workflow-add`, `workflow-refine` |
|
|
399
399
|
| `spur-init` | 1 | `sp:doc-evolve` | Project bootstrap (`spur init`) with doc-evolve integration |
|
|
@@ -408,6 +408,15 @@ hand-editable source for the operator command surface. Per-platform adapters are
|
|
|
408
408
|
output** owned by `superskill` (`superskill install sp`) and never committed here. Plugin `sp` ships
|
|
409
409
|
no per-platform artifacts — only the platform-independent thin wrappers.
|
|
410
410
|
|
|
411
|
+
**Install-time `lib/` ownership (1120).** Staging and refreshing the plugin's sibling
|
|
412
|
+
`lib/inline-run.generated.mjs` app bundle into the shared scripts root is `superskill`'s install
|
|
413
|
+
contract (superskill commit `b42961b`, first release after 0.3.35): spur ships the bundle, superskill
|
|
414
|
+
places it. The inline scripts carry a skew guard for the window where the installed bundle is older
|
|
415
|
+
than its scripts (e.g. superskill ≤ 0.3.35): they fail with a named version-skew error — bundle
|
|
416
|
+
path, missing exports, and both remedies — instead of an `is not a function` TypeError. Until a
|
|
417
|
+
superskill release containing `b42961b` is installed and `sp` reinstalled, pass
|
|
418
|
+
`--spur-bin <spur checkout>/apps/cli/src/index.ts`.
|
|
419
|
+
|
|
411
420
|
**Thin-wrapper contract** is enforced by `scripts/commands/validate-commands.ts`:
|
|
412
421
|
|
|
413
422
|
```bash
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: super-planner
|
|
3
3
|
description: |
|
|
4
|
-
Use PROACTIVELY for "run this task end to end", "drive the batch", "execute the todo set", "/sp:dev-runall", or "
|
|
4
|
+
Use PROACTIVELY for "run this task end to end", "drive the batch", "execute the todo set", "/sp:dev-runall", or "fan out these tasks". Planning and execution orchestration: owns the product/project management framing (intake, scope, sequencing) and drives the batch driver loop in sp:spur-dev/references/execution-batch.md — resolve+freeze -> topo-sort -> per-task run -> verdict inspect -> continue/halt -> batch report, with optional parallel fan-out. For a one-off verb, /sp:dev-run <wbs> is lighter; for "what single step next?", prefer /sp:dev-next — NOT this agent's job.
|
|
5
5
|
|
|
6
6
|
<example>
|
|
7
7
|
Context: Batch execution of a feature's tasks
|
|
@@ -72,7 +72,6 @@ You own the spaces **between** task runs:
|
|
|
72
72
|
- **Resolve + freeze** the task set:
|
|
73
73
|
- from `--tasks <selector>`, or
|
|
74
74
|
- from the convenience `--feature <id>` (normalized by the command layer / resolver to `feature:<id>` per execution-batch.md Step 1).
|
|
75
|
-
(See also dev-runall and dev-parallel which now both accept `--feature`.)
|
|
76
75
|
- **Topologically order** the frozen set by `dependencies[]` (Step 2). Abort on cycle; pre-block
|
|
77
76
|
unmet out-of-set deps.
|
|
78
77
|
- **Preflight (Step 2.5 / 3.0)** - before each pipeline launch, evaluate TABLE A STOP rows
|
|
@@ -110,7 +109,7 @@ You explicitly do **NOT** own step-level execution:
|
|
|
110
109
|
|
|
111
110
|
## When to use
|
|
112
111
|
|
|
113
|
-
- `/sp:dev-runall --feature <id>` (or `--tasks feature:<id
|
|
112
|
+
- `/sp:dev-runall --feature <id>` (or `--tasks feature:<id>`, with any `--mode`), or equivalent is invoked.
|
|
114
113
|
- The operator asks to "run all tasks", "run the batch", "execute the todo set", "runall ready", or "fan out tasks for feature X".
|
|
115
114
|
- A feature's task batch is decomposed and ready for end-to-end (sequential or parallel) execution.
|
|
116
115
|
|
|
@@ -121,7 +120,7 @@ routes to you. On other platforms, invoke this agent directly when the batch dri
|
|
|
121
120
|
|
|
122
121
|
| Platform | Invocation |
|
|
123
122
|
| ---------- | ----------- |
|
|
124
|
-
| Claude Code | Spawned by `/sp:dev-runall --feature <id>` (or `--tasks ...`) -> `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` -> this agent (also handles parallel
|
|
123
|
+
| Claude Code | Spawned by `/sp:dev-runall --feature <id>` (or `--tasks ...`) -> `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` -> this agent (also handles `--mode parallel` and parallel `--mode auto` resolutions) |
|
|
125
124
|
| Other platforms | Spawn this agent directly; read execution-batch.md and drive the loop |
|
|
126
125
|
|
|
127
126
|
## Decision autonomy
|
|
@@ -173,8 +172,8 @@ When you fan out or dispatch a subagent, apply the four disciplines the SSOT
|
|
|
173
172
|
cardinality is 1. Never loop recovery until done.
|
|
174
173
|
- [ ] Emit the batch report at completion (clean / halted / aborted), including preflight skips.
|
|
175
174
|
- [ ] Default to sequential execution. Enter parallel mode only when explicitly requested
|
|
176
|
-
(`--mode parallel
|
|
177
|
-
clears dependency, file-overlap, and token-budget checks.
|
|
175
|
+
(`--mode parallel`, or `--mode auto` resolved to parallel by the § 2.4a schedule) and the
|
|
176
|
+
`sp:parallel-execution` decision framework clears dependency, file-overlap, and token-budget checks.
|
|
178
177
|
- [ ] To resolve a deferred `feature_id` under operator-chosen strict rigor, use the sp:spur-dev
|
|
179
178
|
feature-link helper (single-task or sweep) - never invoke it automatically from within a
|
|
180
179
|
batch run; surface it only when the operator explicitly requests strict traceability.
|
|
@@ -285,6 +284,17 @@ With `--json`, emit the same shape as a JSON object for machine consumption.
|
|
|
285
284
|
`spur workflow continue --answer-text` and the run resumes implement with the Q/A transcript
|
|
286
285
|
(bounded by `maxEscalations`). See [execution-batch.md Step 3](../skills/spur-dev/references/execution-batch.md#step-3--the-driver-loop-r3-r4).
|
|
287
286
|
|
|
287
|
+
## Parent-host ownership of the visible plan (1105 R4)
|
|
288
|
+
|
|
289
|
+
The parent host owns the visible plan: apply the § 2.7 Visible batch plan updates in the parent
|
|
290
|
+
session's native todo list (`execution-batch.md` § 2.7; the frozen status mapping lives in
|
|
291
|
+
[inline-pipeline-driver.md](../skills/spur-dev/references/inline-pipeline-driver.md) § Host todo
|
|
292
|
+
update styles). Subagents own code and evidence — subagents never render the visible list and todo
|
|
293
|
+
tools are not available to them; at each **stage boundary** (implement, test, review, verify) a
|
|
294
|
+
subagent returns `{wbs, state, outcome}` (+ optional `next`), and the parent marks the matching rows
|
|
295
|
+
with the reported outcome. Keep letters/digits from the projection identical across both layers so
|
|
296
|
+
row identity stays stable.
|
|
297
|
+
|
|
288
298
|
## Platform Notes
|
|
289
299
|
|
|
290
300
|
- **Claude Code:** native - `Bash` runs `spur` CLI for deterministic verbs; `Skill()` is available
|
|
@@ -123,6 +123,12 @@ HITL gate unless `--auto` was passed.
|
|
|
123
123
|
- [ ] Dispatch each requested dimension to its owning skill — do not inline the review logic.
|
|
124
124
|
- [ ] Merge findings into a single ranked report, emitting native priority cells
|
|
125
125
|
(`P1 (blocker)` > `P2 (major)` > `P3 (minor)` > `P4 (advisory)` — see Output Format).
|
|
126
|
+
- [ ] Sweep a finding's **class** in the same round. When a defect is one instance of a repeated
|
|
127
|
+
pattern (the same rule misapplied on two surfaces, a signature stale in both a generator and
|
|
128
|
+
its output), grep for the siblings and report every instance now. A half-found class costs a
|
|
129
|
+
full gate + review cycle when the next round finds the other half — H1 batch 2026-10-08:
|
|
130
|
+
review round 1 of task 1129 named one runbook's fingerprint/commit mismatch, round 2 found
|
|
131
|
+
the same mismatch on the sibling runbook.
|
|
126
132
|
- [ ] With a WBS target (standalone or pipeline), write the merged report to that task's
|
|
127
133
|
`## Review` section via `spur task update <wbs> --section Review --from-file` — per task
|
|
128
134
|
under a task set, then the combined summary table; with a path target, emit as advisory
|
|
@@ -175,6 +181,14 @@ with the commit) drops the row from the sweep; `DEFER(<reason>)` reclassifies a
|
|
|
175
181
|
the cell, not the sentence. `OPEN` states "still live", and `ACCEPTED` marks a non-blocking P4
|
|
176
182
|
observation you are deliberately not acting on; both behave as an ordinary open row.
|
|
177
183
|
|
|
184
|
+
**Pipeline cost of an open finding (1122).** The review PASS edges run this same classification
|
|
185
|
+
before verify (`residual-scan review-gate`): a PASS whose table still carries an open P1-P3 row
|
|
186
|
+
routes into `review-fail-triage` → the bounded repair hop instead of verify. Open P1-P3 findings
|
|
187
|
+
block `done`; fixing one invalidates the certified digest and re-runs quality → review → verify on
|
|
188
|
+
a fresh digest. Only P4 rows and `DEFER`-ed P3 rows are wrap residuals — disposition the finding in
|
|
189
|
+
its cell now, while you hold the context, instead of leaving the cost to be rediscovered after a
|
|
190
|
+
full cycle.
|
|
191
|
+
|
|
178
192
|
**Section-relative headings.** In WBS mode (standalone or pipeline) the report body is written
|
|
179
193
|
*into* the task's `### Review` section, so every heading inside it MUST be `####` or deeper. A
|
|
180
194
|
`##`/`###` heading in the body becomes a new top-level task section and corrupts the document. With
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Workspace-local test config (task 1127 R8/AC7, mirroring apps/cli's 0699 R3 precedent): without
|
|
2
|
+
# it, `cd plugins/sp && bun test` — the run AGENTS.md prescribes — skipped the root preload and
|
|
3
|
+
# resolved the operator's real ~/.config/spur/run/full-gate.lock. These suites then waited silently
|
|
4
|
+
# behind any live host-wide gate holder (their holder line is swallowed by `silenceStdout`), which
|
|
5
|
+
# is the dispatch-budget burn this task exists to remove. Coverage stays gated by the root bunfig
|
|
6
|
+
# (bun run test).
|
|
7
|
+
[test]
|
|
8
|
+
preload = ["../../tests/setup.ts"]
|
|
@@ -1,41 +1,54 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring
|
|
3
3
|
role: planner
|
|
4
|
-
argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--
|
|
4
|
+
argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]"
|
|
5
5
|
allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Dev Brainstorm
|
|
9
9
|
|
|
10
|
-
Wraps the **sp:brainstorm**
|
|
10
|
+
Wraps the **sp:brainstorm** skill.
|
|
11
11
|
|
|
12
12
|
## Argument Flags
|
|
13
13
|
|
|
14
14
|
| Flag | Description | Default |
|
|
15
15
|
| --- | --- | --- |
|
|
16
16
|
| `<topic>` | Topic or problem statement to explore. | required |
|
|
17
|
-
| `--depth` `<basic\|detailed\|comprehensive>` |
|
|
18
|
-
| `--options` `<n>` | Number of solution
|
|
17
|
+
| `--depth` `<basic\|detailed\|comprehensive>` | How deep the discovery interview walks the decision tree. | detailed |
|
|
18
|
+
| `--options` `<n>` | Number of solution approaches to generate. | 3 |
|
|
19
19
|
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. | omit |
|
|
20
20
|
| `--skip-discovery` | Skip the discovery interview; ideate immediately. | off |
|
|
21
|
-
| `--
|
|
22
|
-
| `--
|
|
23
|
-
| `--
|
|
24
|
-
| `--next` | Hand off to the next-router on success. | off |
|
|
21
|
+
| `--task` `[<feature-id>]` | Artifact exit: create one `todo` task from the chosen approach, optionally under `<feature-id>`. | omitted |
|
|
22
|
+
| `--feature` `[<parent-id>]` | Artifact exit: create a validated feature (Goal/Scope/BDD AC) from the chosen approach, optionally under `<parent-id>`. | omitted |
|
|
23
|
+
| `--next` | With `--feature` only: on a clean `feature check`, chain into `/sp:dev-plan --feature <ID>`. | off |
|
|
25
24
|
|
|
26
25
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
27
26
|
|
|
28
27
|
## Usage
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
```
|
|
30
|
+
/sp:dev-brainstorm "<topic>" [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Two phases:
|
|
34
|
+
|
|
35
|
+
1. **Discovery** — a grilling interview, one question at a time, each with a recommended answer;
|
|
36
|
+
the codebase is explored before the operator is asked. Produces a resolved decision tree.
|
|
37
|
+
`--skip-discovery` replaces it with the skill's lightweight clarification step.
|
|
38
|
+
2. **Ideation** — `--options` approaches, each with trade-offs, implementation notes, confidence
|
|
39
|
+
and the decisions it depends on; one is marked recommended.
|
|
40
|
+
|
|
41
|
+
Without an exit flag the brainstorm output is the result. `--task` and `--feature` are mutually
|
|
42
|
+
exclusive (passing both is an error); the operator confirms the chosen approach before either
|
|
43
|
+
writes to the corpus. `--next` is ignored without `--feature`.
|
|
44
|
+
|
|
45
|
+
If discovery shows the destination itself is too foggy to spec in one session, stop and recommend
|
|
46
|
+
`/sp:dev-find-way "<topic>"` with the resolved decision tree as its starting notes. Never chart a
|
|
47
|
+
multi-session map from this command.
|
|
31
48
|
|
|
32
49
|
## Implementation
|
|
33
50
|
|
|
34
51
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
`--next`: chain-to-completion with
|
|
39
|
-
propagation. Only meaningful with `--feature` (the front-half artifact exit): on a clean
|
|
40
|
-
`feature check`, chain into `/sp:dev-plan --feature <ID>` so the planning half runs end-to-end.
|
|
41
|
-
Ignored without `--feature` (there is no task in a lifecycle to advance). **was: `--next` declared but never defined.**
|
|
52
|
+
- Discovery protocol: [grilling-interview.md](../skills/brainstorm/references/grilling-interview.md).
|
|
53
|
+
- Ideation: `Skill(skill="sp:brainstorm", args="dev-brainstorm --context <decision-tree> --options <n>")`
|
|
54
|
+
- Artifact exits and `--next`: [dev-operations.md § 12. brainstorm](../skills/spur-dev/references/dev-operations.md#12-brainstorm).
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Wayfinder — chart a multi-session investigation map for a foggy destination, or resolve one map ticket, always inside an isolated git worktree + branch
|
|
3
|
+
role: planner
|
|
4
|
+
argument-hint: "<idea> | <feature-id> [<wbs>] [--agent <inline|auto|name>] [--auto] [--worktree [<name>]] [--wrap]"
|
|
5
|
+
allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Dev Find Way
|
|
9
|
+
|
|
10
|
+
Wraps the **sp:wayfinder** skill.
|
|
11
|
+
|
|
12
|
+
## Argument Flags
|
|
13
|
+
|
|
14
|
+
| Flag | Description | Default |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| `<idea>` | Loose idea whose destination is too foggy to spec in one session. Enters **chart** mode. | required (one of `<idea>` / `<feature-id>`) |
|
|
17
|
+
| `<feature-id>` | Existing wayfinder map (feature tagged `wayfinder-map`). Enters **work** mode. | required (one of `<idea>` / `<feature-id>`) |
|
|
18
|
+
| `<wbs>` | Work mode only: the ticket to resolve. Omit to take the first unclaimed frontier ticket. | first frontier ticket |
|
|
19
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing charting/resolution. | omit |
|
|
20
|
+
| `--auto` | Skip objective HITL confirmations. Never skips the map's open-question decisions. | off |
|
|
21
|
+
| `--worktree` `[<name>]` | Isolation mode. Bare (or omitted) creates a fresh worktree + branch; `--worktree <name>` adopts an existing worktree by name/path/branch. FF-merge on success, retain on failure. There is no in-place mode. | create |
|
|
22
|
+
| `--wrap` | Work mode only: after the ticket reaches `done`, run `/sp:dev-wrap <wbs>` inside the worktree before the merge. | off |
|
|
23
|
+
|
|
24
|
+
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/sp:dev-find-way "<idea>" [--agent <inline|auto|name>] [--auto] [--worktree [<name>]]
|
|
30
|
+
/sp:dev-find-way <feature-id> [<wbs>] [--agent <inline|auto|name>] [--auto] [--worktree [<name>]] [--wrap]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
A first argument that resolves as a feature id (`spur feature show <id> --json`) is work mode;
|
|
34
|
+
anything else is a chart-mode idea. Chart mode charts the map and stops; work mode resolves
|
|
35
|
+
**exactly one** ticket (one ticket per session).
|
|
36
|
+
|
|
37
|
+
**Always a worktree + branch.** Every invocation runs in an isolated git worktree on its own branch —
|
|
38
|
+
never in the invoking tree, and never as a branch switch (`git checkout -b`) in the invoking tree.
|
|
39
|
+
A branch-only session mutates the operator's checkout under every other agent sharing it, and its
|
|
40
|
+
`wayfind/*` branches pile up on the main tree. Omitting `--worktree` behaves exactly like bare
|
|
41
|
+
`--worktree`.
|
|
42
|
+
|
|
43
|
+
**Lifecycle.** `execution-batch.md` § Worktree isolation applied to a run of one (WT-1…WT-5):
|
|
44
|
+
|
|
45
|
+
- WT-1 dirty-tree precheck on the invoking tree (abort on dirty — name the files).
|
|
46
|
+
- WT-2 create (sibling dir, `bun install --frozen-lockfile --ignore-scripts`) or adopt by name.
|
|
47
|
+
- WT-3 marker in the invoking tree's `.spur/run/`: `command` = `dev-find-way`, `selector` =
|
|
48
|
+
`chart:<destination-slug>` or `<feature-id>:<wbs>`.
|
|
49
|
+
- Derived branch: `sp/wayfind-<destination-slug>-<short-id>` (chart) or
|
|
50
|
+
`sp/wayfind-<wbs>-<short-id>` (work).
|
|
51
|
+
- WT-3b commit the session's corpus writes on the branch, then WT-4 FF-merge onto the base ref
|
|
52
|
+
(create mode removes the tree and deletes the branch; reuse mode retains both).
|
|
53
|
+
- WT-5 retain intact on any failure, HITL pause, unresolved open question that ends the session,
|
|
54
|
+
or non-FF base — report path, branch and the resume command (`--worktree <name>`).
|
|
55
|
+
|
|
56
|
+
Success is: **chart** — map feature created, tagged `wayfinder-map`, `spur feature check <id>`
|
|
57
|
+
clean, child tickets wired; **work** — the ticket reached `done`, its line is in
|
|
58
|
+
**## Decisions so far**, and graduated fog became tickets.
|
|
59
|
+
|
|
60
|
+
**Ticket selection across parallel sessions (work mode).** Corpus writes — including the `wip`
|
|
61
|
+
claim — land in the worktree copy until the merge, so a claim is invisible to sibling worktrees.
|
|
62
|
+
Before choosing a frontier ticket, read every `.spur/run/worktree-*.json` marker in the invoking
|
|
63
|
+
tree with `command: dev-find-way` and `status: active`/`retained`, and exclude their `<wbs>`. A named
|
|
64
|
+
`<wbs>` held by such a marker aborts before any tree is created; resume it with
|
|
65
|
+
`--worktree <name>` instead.
|
|
66
|
+
|
|
67
|
+
**`--wrap`.** Runs after the ticket reaches `done` and before WT-3b, so the wrap's writes merge with
|
|
68
|
+
the resolution. `--agent` is preserved into the `/sp:dev-wrap <wbs>` handoff when supplied. In chart
|
|
69
|
+
mode nothing is resolved: `--wrap` is skipped with the reason `wrap skipped: chart mode resolves no
|
|
70
|
+
ticket`.
|
|
71
|
+
|
|
72
|
+
**Corpus visibility.** Until the FF-merge, the map and ticket writes exist only in the worktree; the
|
|
73
|
+
invoking tree shows the pre-session state. Expected, not a bug.
|
|
74
|
+
|
|
75
|
+
## Implementation
|
|
76
|
+
|
|
77
|
+
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
78
|
+
- Worktree lifecycle: [execution-batch.md § Worktree isolation](../skills/spur-dev/references/execution-batch.md#worktree-isolation---worktree-name) — every host call pins the execution tree per its per-call tree-pin rule.
|
|
79
|
+
- Inside the worktree: `Skill(skill="sp:wayfinder", args="$ARGUMENTS")` — the skill owns charting, ticket resolution, fog graduation and the one-ticket-per-session rule.
|
|
80
|
+
- `--wrap` (work mode): `/sp:dev-wrap <wbs> [--agent <value>]` inside the worktree before WT-3b.
|
|
@@ -52,6 +52,12 @@ Flag → vars: `--auto` sets `profile=auto`, `idea_approved=true`, `design_appro
|
|
|
52
52
|
|
|
53
53
|
## Implementation
|
|
54
54
|
|
|
55
|
+
- **Publish the generated plan first (1105):** your first tool call — before invoking the skill or
|
|
56
|
+
reading any reference — is `spur workflow show idea-pipeline.yaml --no-logo --format todo --json`
|
|
57
|
+
(the CLI resolves the project→registered→shared layer); then publish every `.plan` row's `text`
|
|
58
|
+
verbatim as the host todo list (the `steps[]` inventory when `.plan` is `null`) before the
|
|
59
|
+
pipeline's first stage — [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md)
|
|
60
|
+
run setup step 5.
|
|
55
61
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
56
62
|
- Omitted/`inline`: drive `idea-pipeline.yaml` through the [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md). Do not launch `spur workflow run`, `spur agent run`, or a native subagent unless the operator explicitly requests delegation.
|
|
57
63
|
- `auto`/name: launch `spur workflow run idea-pipeline.yaml --async`, observe with one `workflow trace --follow`, and only report cancellation as stopped when `workflow cancel --json` returns `killed: true`.
|
|
@@ -41,6 +41,12 @@ contract as `/sp:dev-idea`). If passed, ignore them with a one-line notice.
|
|
|
41
41
|
|
|
42
42
|
## Implementation
|
|
43
43
|
|
|
44
|
+
- **Publish the generated plan first (1105):** your first tool call — before invoking the skill or
|
|
45
|
+
reading any reference — is `spur workflow show idea-pipeline.yaml --no-logo --format todo --json`
|
|
46
|
+
(the CLI resolves the project→registered→shared layer); then publish every `.plan` row's `text`
|
|
47
|
+
verbatim as the host todo list (the `steps[]` inventory when `.plan` is `null`) before the
|
|
48
|
+
pipeline's first stage — [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md)
|
|
49
|
+
run setup step 5.
|
|
44
50
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
45
51
|
- Omitted/`inline`: drive `idea-pipeline.yaml` through the [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md). Do not launch `spur workflow run`, `spur agent run`, or a native subagent unless the operator explicitly requests delegation.
|
|
46
52
|
- `auto`/name: launch `spur workflow run idea-pipeline.yaml --async`, observe with one `workflow trace --follow`, and only report cancellation as stopped when `workflow cancel --json` returns `killed: true`.
|
|
@@ -16,7 +16,10 @@ implement-ready tasks for further fixing; `--triage` is an alias of `--fix auto`
|
|
|
16
16
|
it defers nothing: every actionable finding is fixed inline and no task is filed. The result includes a non-overlapping time breakdown —
|
|
17
17
|
work time, operator wait, tool calls and tokens (total / non-cached) per stage, measured from the host transcript by
|
|
18
18
|
`session-timeline.mjs` — with durations in `M:SS` or `H:MM:SS` form and `n/a` only when that
|
|
19
|
-
measurement is unavailable.
|
|
19
|
+
measurement is unavailable. The transcript resolves from `--transcript`, else
|
|
20
|
+
`CLAUDE_CODE_SESSION_ID`, else `PI_SESSION_FILE` (the pi host sets it and no Claude session id); a
|
|
21
|
+
pi `<skill name="…">` wrapper row is the operator's `/skill` invocation and opens a segment
|
|
22
|
+
rendered `/<name> <args>` (or `/<name>` argument-less), never an injected body.
|
|
20
23
|
|
|
21
24
|
## Argument Flags
|
|
22
25
|
|
|
@@ -31,8 +31,17 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
31
31
|
|
|
32
32
|
## Implementation
|
|
33
33
|
|
|
34
|
+
- **Bootstrap reads (1128):** before the first dispatch, read [SKILL.md § Bootstrap reads](../skills/spur-dev/SKILL.md#bootstrap-reads) and load only that mode's files — everything else under `references/` is on demand.
|
|
35
|
+
- **Publish the generated plan first (1105):** your first tool call — before invoking the skill,
|
|
36
|
+
reading any reference, or showing the task — is `spur workflow show task-pipeline.yaml --no-logo
|
|
37
|
+
--format todo --json` (the CLI resolves the project→registered→shared layer); then publish every
|
|
38
|
+
`.plan` row's `text` verbatim as the host todo list (the `steps[]` inventory when `.plan` is
|
|
39
|
+
`null`) before readiness, Git, or isolation work —
|
|
40
|
+
[shared startup contract](../skills/spur-dev/references/cross-cutting.md#shared-startup-contract-task-0814-r1r3r4r6r7r8)
|
|
41
|
+
step 1 / [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md) run
|
|
42
|
+
setup step 5.
|
|
34
43
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
35
|
-
- Apply the [shared startup contract](../skills/spur-dev/references/cross-cutting.md#shared-startup-contract-task-0814-r1r3r4r6r7r8) —
|
|
44
|
+
- Apply the [shared startup contract](../skills/spur-dev/references/cross-cutting.md#shared-startup-contract-task-0814-r1r3r4r6r7r8) — publish the generated plan first, quick readiness before isolation, digest binding, comprehensive checks at their owning boundaries (task 0814 R1/R3/R4/R7/R8; 1105 R1).
|
|
36
45
|
- Full pipeline (default `--mode full`): interactive omit/`--agent inline` uses the
|
|
37
46
|
[inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md) via
|
|
38
47
|
`Skill(skill="sp:spur-dev", args="run-inline $ARGUMENTS")`; `--agent auto` or a named executor
|
|
@@ -55,7 +64,8 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
55
64
|
base ref on full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree,
|
|
56
65
|
`<name>` form adopts an existing worktree by name/path/branch). The lifecycle — dirty-tree precheck,
|
|
57
66
|
creation or adoption, crash-safe `.spur/run/` marker, merge-or-retain, `--continue` re-entry — is
|
|
58
|
-
`execution-
|
|
67
|
+
`execution-worktree-setup.md` (creation/adoption, WT-1…WT-3b) + `execution-worktree-landing.md`
|
|
68
|
+
(WT-4/WT-5) applied to a batch of one: marker `command` is `dev-run`
|
|
59
69
|
and `selector` is the `<wbs>`, the derived branch is `sp/run-<wbs>-<short-id>`, and the success
|
|
60
70
|
condition is the task reaching terminal `done` with no failed stage. A failing gate, a non-PASS
|
|
61
71
|
verify verdict, or a HITL pause that ends the run all take the retention path.
|