@gobing-ai/spur 0.4.0 → 0.4.1
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/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/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 +106 -13
- package/package.json +9 -9
- package/plugins/sp/README.md +11 -1
- package/plugins/sp/agents/super-planner.md +11 -0
- 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-parallel.md +8 -2
- package/plugins/sp/commands/dev-plan.md +6 -0
- package/plugins/sp/commands/dev-review-session.md +3 -1
- package/plugins/sp/commands/dev-run.md +12 -2
- package/plugins/sp/commands/dev-runall.md +18 -10
- package/plugins/sp/hooks/context-session-start.ts +1 -1
- package/plugins/sp/lib/idea-handoff.generated.mjs +41 -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 +333 -45
- package/plugins/sp/lib/plan-projection.generated.d.mts +28 -0
- package/plugins/sp/lib/plan-projection.generated.mjs +255 -0
- package/plugins/sp/lib/quality-gate.generated.d.mts +47 -1
- package/plugins/sp/lib/quality-gate.generated.mjs +30489 -82
- 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 +121 -6
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +1 -1
- package/plugins/sp/scripts/batch-plan.mjs +335 -0
- package/plugins/sp/scripts/batch-plan.ts +100 -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 +551 -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/quality-gate.mjs +30407 -73
- 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 +421 -14
- package/plugins/sp/scripts/run-summary.ts +41 -177
- package/plugins/sp/scripts/session-timeline.mjs +109 -12
- package/plugins/sp/scripts/session-timeline.ts +71 -19
- 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/session-review/SKILL.md +38 -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 +7 -6
- package/plugins/sp/skills/spur-cli/references/message.md +7 -7
- 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 +18 -14
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +6 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +49 -14
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -16
- package/plugins/sp/skills/spur-dev/references/execution-batch-continuation.md +68 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +194 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +113 -1020
- package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +130 -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 +35 -5
- package/plugins/sp/skills/spur-dev/references/glossary.md +2 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +343 -163
- 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 +20728 -16630
- package/web/_astro/{BoardApp.VeoxxLBy.js → BoardApp.D66k_s_T.js} +1 -1
- package/web/_astro/{BoardApp.Bzr4OXrW.js → BoardApp.D6sjAJr_.js} +173 -173
- package/web/_astro/{TaskDetail.LAyR_Pvn.js → TaskDetail.BynLnMNc.js} +1 -1
- package/web/_astro/{arc.f4e0OYLg.js → arc._BUadrdH.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.SSIvxi-Z.js → architectureDiagram-3BPJPVTR.Dh7xS1Pp.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.DSXIHOFf.js → blockDiagram-GPEHLZMM.DFDVpfXm.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DG9Ubu85.js → c4Diagram-AAUBKEIU.V7_3_glh.js} +1 -1
- package/web/_astro/channel.DZVfto-r.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.C7QU88Qh.js → chunk-2J33WTMH.De1yx7Jz.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.26Z94xBj.js → chunk-4BX2VUAB.BDhHFuxx.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DYRiBkqw.js → chunk-55IACEB6.DDLkWnmC.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.D5Vfv5pe.js → chunk-727SXJPM.CwfiLnA7.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DXHV47bN.js → chunk-AQP2D5EJ.CtGDmUnM.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.D1suAfOs.js → chunk-FMBD7UC4.BOLjpw73.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.D6BmdHEY.js → chunk-ND2GUHAM.BDhQls6O.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.rnPU-Ak-.js → chunk-QZHKN3VN.76qBynDF.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CvEfXIo1.js → classDiagram-4FO5ZUOK.N0mpPHT0.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CvEfXIo1.js → classDiagram-v2-Q7XG4LA2.N0mpPHT0.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.DkMisLSm.js → cose-bilkent-S5V4N54A.CKknFfjB.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.C77Q-pF6.js → cynefin-OW5HDTMX.Cw3ZWBAh.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.YaV8ce27.js → dagre-BM42HDAG.D3yIKCRD.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.CUyGEKge.js → diagram-2AECGRRQ.D51dO83Z.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.CRgd8dgj.js → diagram-5GNKFQAL.Bb-FViDj.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.Bmzys9hq.js → diagram-KO2AKTUF.D3mN8S6x.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BvmJY4Lw.js → diagram-LMA3HP47.dMMyPcbJ.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.0hEhD30d.js → diagram-OG6HWLK6.AzbvzY4C.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.Bjt8lrnm.js → erDiagram-TEJ5UH35.BR5I4OZb.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.CJZTjRDV.js → flowDiagram-I6XJVG4X.DFqvhGkn.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7._VqoVafc.js → ganttDiagram-6RSMTGT7.ByJbhH6J.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.CEDb7tVo.js → gitGraphDiagram-PVQCEYII.CInHjQR3.js} +1 -1
- package/web/_astro/index.COh_kBxN.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.CgwifPpK.js → infoDiagram-5YYISTIA.Cm0dGVjJ.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.B99wx2J1.js → ishikawaDiagram-YF4QCWOH.C3nOP6Sj.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.2hRwJbEo.js → journeyDiagram-JHISSGLW.4IvLa2MW.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.BahJkKNC.js → kanban-definition-UN3LZRKU.DS87Cl-k.js} +1 -1
- package/web/_astro/{linear.DguUUe6V.js → linear.MzmRrNER.js} +1 -1
- package/web/_astro/{mermaid.core.CvgfmqVr.js → mermaid.core.fK-WNswS.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.B3qEA3x9.js → mindmap-definition-RKZ34NQL.BqipOHhY.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.FlWA-_ru.js → pieDiagram-4H26LBE5.0nBiPqFG.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.9bVn35X7.js → quadrantDiagram-W4KKPZXB.Szj7Zpx5.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.ChykIhct.js → requirementDiagram-4Y6WPE33.D4UR6TWo.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.Z2Y3hkYb.js → sankeyDiagram-5OEKKPKP.DAE7BdOs.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.J7JsHWDt.js → sequenceDiagram-3UESZ5HK.BP9ZVq25.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DAPbiCSS.js → stateDiagram-AJRCARHV.BQW7mIxk.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.D2jvSi0q.js → stateDiagram-v2-BHNVJYJU.PbK4nDih.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.psW2ci29.js → timeline-definition-PNZ67QCA.Ci_GvUpo.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DlILYVmg.js → vennDiagram-CIIHVFJN.DNw1Y5qx.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.xNWwLJnn.js → wardleyDiagram-YWT4CUSO.CwlkaaNe.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.EU_BuH7V.js → xychartDiagram-2RQKCTM6.MI6ZuiH_.js} +1 -1
- package/web/index.html +2 -2
- 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: >
|
|
@@ -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.1",
|
|
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",
|
|
@@ -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.21",
|
|
61
|
+
"@gobing-ai/ts-ai-runner": "^0.5.21",
|
|
62
|
+
"@gobing-ai/ts-dual-workflow-engine": "^0.5.21",
|
|
63
|
+
"@gobing-ai/ts-infra": "^0.5.21",
|
|
64
|
+
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.21",
|
|
65
|
+
"@gobing-ai/ts-rule-engine": "^0.5.21",
|
|
66
|
+
"@gobing-ai/ts-runtime": "^0.5.21",
|
|
67
|
+
"@gobing-ai/ts-utils": "^0.5.21",
|
|
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
|
|
@@ -393,7 +394,7 @@ index above lists the live inventory, organized by the surface they wrap:
|
|
|
393
394
|
|
|
394
395
|
| Prefix | Count | Delegates to | Purpose |
|
|
395
396
|
| ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
396
|
-
| `dev-*` |
|
|
397
|
+
| `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
398
|
| `rule-*` | 3 | `sp:spur-cli` | The rule surface — `rule-add`, `rule-refine`, `rule-scan` |
|
|
398
399
|
| `workflow-*` | 2 | `sp:spur-cli` | The workflow surface — `workflow-add`, `workflow-refine` |
|
|
399
400
|
| `spur-init` | 1 | `sp:doc-evolve` | Project bootstrap (`spur init`) with doc-evolve integration |
|
|
@@ -408,6 +409,15 @@ hand-editable source for the operator command surface. Per-platform adapters are
|
|
|
408
409
|
output** owned by `superskill` (`superskill install sp`) and never committed here. Plugin `sp` ships
|
|
409
410
|
no per-platform artifacts — only the platform-independent thin wrappers.
|
|
410
411
|
|
|
412
|
+
**Install-time `lib/` ownership (1120).** Staging and refreshing the plugin's sibling
|
|
413
|
+
`lib/inline-run.generated.mjs` app bundle into the shared scripts root is `superskill`'s install
|
|
414
|
+
contract (superskill commit `b42961b`, first release after 0.3.35): spur ships the bundle, superskill
|
|
415
|
+
places it. The inline scripts carry a skew guard for the window where the installed bundle is older
|
|
416
|
+
than its scripts (e.g. superskill ≤ 0.3.35): they fail with a named version-skew error — bundle
|
|
417
|
+
path, missing exports, and both remedies — instead of an `is not a function` TypeError. Until a
|
|
418
|
+
superskill release containing `b42961b` is installed and `sp` reinstalled, pass
|
|
419
|
+
`--spur-bin <spur checkout>/apps/cli/src/index.ts`.
|
|
420
|
+
|
|
411
421
|
**Thin-wrapper contract** is enforced by `scripts/commands/validate-commands.ts`:
|
|
412
422
|
|
|
413
423
|
```bash
|
|
@@ -285,6 +285,17 @@ With `--json`, emit the same shape as a JSON object for machine consumption.
|
|
|
285
285
|
`spur workflow continue --answer-text` and the run resumes implement with the Q/A transcript
|
|
286
286
|
(bounded by `maxEscalations`). See [execution-batch.md Step 3](../skills/spur-dev/references/execution-batch.md#step-3--the-driver-loop-r3-r4).
|
|
287
287
|
|
|
288
|
+
## Parent-host ownership of the visible plan (1105 R4)
|
|
289
|
+
|
|
290
|
+
The parent host owns the visible plan: apply the § 2.7 Visible batch plan updates in the parent
|
|
291
|
+
session's native todo list (`execution-batch.md` § 2.7; the frozen status mapping lives in
|
|
292
|
+
[inline-pipeline-driver.md](../skills/spur-dev/references/inline-pipeline-driver.md) § Host todo
|
|
293
|
+
update styles). Subagents own code and evidence — subagents never render the visible list and todo
|
|
294
|
+
tools are not available to them; at each **stage boundary** (implement, test, review, verify) a
|
|
295
|
+
subagent returns `{wbs, state, outcome}` (+ optional `next`), and the parent marks the matching rows
|
|
296
|
+
with the reported outcome. Keep letters/digits from the projection identical across both layers so
|
|
297
|
+
row identity stays stable.
|
|
298
|
+
|
|
288
299
|
## Platform Notes
|
|
289
300
|
|
|
290
301
|
- **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`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Fan out independent tasks or investigations in parallel via subagents — choose the right pattern and synthesize results
|
|
3
3
|
role: planner
|
|
4
|
-
argument-hint: "--tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json]"
|
|
4
|
+
argument-hint: "--tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json] [--defer-gate]"
|
|
5
5
|
allowed-tools: ["Bash", "Read", "Skill"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -18,14 +18,20 @@ Wraps the **sp:parallel-execution** skill.
|
|
|
18
18
|
| `--mode` `<fan-out\|review-panel\|investigation>` | Fan-out pattern. | fan-out |
|
|
19
19
|
| `--agent` `<inline\|auto\|name>` | Who runs each dispatched slice. Parallel fan-out is dispatch, so explicit `--agent inline` runs the batch **sequentially in the host session** with a printed notice (zero dispatch); omit keeps the default fan-out semantics; `auto` tier-resolves an executor; a name pins that executor. | omit |
|
|
20
20
|
| `--json` | Emit structured JSON. | off |
|
|
21
|
+
| `--defer-gate` | Opt-in parallel-batch gate policy (task 1111): each task's `test` hop runs the light tier and writes `DEFERRED`; the batch runs one integrated full gate on the base ref before the feature sync. Requires `--mode parallel`; default off. | off |
|
|
21
22
|
|
|
22
23
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
23
24
|
|
|
24
25
|
## Usage
|
|
25
26
|
|
|
26
|
-
/sp:dev-parallel --tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json]
|
|
27
|
+
/sp:dev-parallel --tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json] [--defer-gate]
|
|
27
28
|
|
|
28
29
|
## Implementation
|
|
29
30
|
|
|
31
|
+
- **Publish the visible batch plan first (1105):** as the batch orchestrator, publish `A Prepare
|
|
32
|
+
batch` (A1–A4) and `Z Batch report` before the first task, then one letter per task from
|
|
33
|
+
`batch-plan.mjs waves` after freeze/order and digit children from `batch-plan.mjs task-children` at
|
|
34
|
+
task start — [execution-batch.md](../skills/spur-dev/references/execution-batch.md#27-visible-batch-plan-1105-r3)
|
|
35
|
+
§ 2.7 Visible batch plan.
|
|
30
36
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface) before choosing native subagents or `spur agent run`.
|
|
31
37
|
- `Skill(skill="sp:parallel-execution", args="$ARGUMENTS")`
|
|
@@ -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,9 @@ 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
|
+
skill-injected `<skill name="…">` body counts as activity in `injectedPrompts`, never as a segment.
|
|
20
22
|
|
|
21
23
|
## Argument Flags
|
|
22
24
|
|
|
@@ -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.
|