@gobing-ai/spur 0.3.12 → 0.3.14
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/config/workflows/task-lifecycle.yaml +10 -0
- package/config/workflows/wayfinder-resolution.yaml +199 -0
- package/package.json +1 -1
- package/spur.js +229 -50
- package/web/_astro/BoardApp.BdyUxAQU.js +1 -0
- package/web/_astro/{BoardApp.CqBOrPzf.js → BoardApp.oOZMY52P.js} +65 -65
- package/web/_astro/{TaskDetail.BmxycoeS.js → TaskDetail.DZVfe6fy.js} +1 -1
- package/web/_astro/{arc.-ZkWbWcN.js → arc.CmzWyu5T.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.fJ8ETc6n.js → architectureDiagram-3BPJPVTR.DEvXeSWP.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.CdhoveXr.js → blockDiagram-GPEHLZMM.DULgqAsN.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.CWv7Jy0p.js → c4Diagram-AAUBKEIU.CtwqGUxK.js} +1 -1
- package/web/_astro/channel.C6f9ncOV.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.CvYWDwal.js → chunk-2J33WTMH.lyKyWJjV.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.BVp_y1oc.js → chunk-4BX2VUAB.COAavIDd.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.CQCviGQk.js → chunk-55IACEB6.EoRbsXM1.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.B3E6Bisv.js → chunk-727SXJPM.DhjfPs_B.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.BvWfYj9E.js → chunk-AQP2D5EJ.BgSRWTUm.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.DcLP2Ypw.js → chunk-FMBD7UC4.Dj0MuLrK.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.DvXZJEqI.js → chunk-ND2GUHAM.B2_roVTb.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.D4rK2HTI.js → chunk-QZHKN3VN.Cr3PSROo.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.DSCYtdVf.js → classDiagram-4FO5ZUOK.CXEuLRp6.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.DSCYtdVf.js → classDiagram-v2-Q7XG4LA2.CXEuLRp6.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.Bf7HMV4Q.js → cose-bilkent-S5V4N54A._ulIkUyI.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.DsBoJTBN.js → dagre-BM42HDAG.D5SRsv4S.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.BMVxdKV3.js → diagram-2AECGRRQ.rMwI7OR9.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.BllW5zst.js → diagram-5GNKFQAL.DWZ2ui2V.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.CNHoSD6q.js → diagram-KO2AKTUF.DuqJ_D0B.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.DZT6otFZ.js → diagram-LMA3HP47.BDxKBl9B.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.EwFWHBRO.js → diagram-OG6HWLK6.D6IMfAPf.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.CaXPcR5W.js → erDiagram-TEJ5UH35.DSsh9EFG.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.FEcfML44.js → flowDiagram-I6XJVG4X.DwjNzc4e.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.Bs7t3AQM.js → ganttDiagram-6RSMTGT7.DbYs_nXA.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.DmxLV9JC.js → gitGraphDiagram-PVQCEYII.DX5-xqVb.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.E7_NrFUE.js → infoDiagram-5YYISTIA.jP6EGbwr.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.Bs5Q4r-U.js → ishikawaDiagram-YF4QCWOH.Cn89YzBJ.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.D3U7T1y1.js → journeyDiagram-JHISSGLW.CNT2WvMT.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.DfdWsO2E.js → kanban-definition-UN3LZRKU.CLEZjEjD.js} +1 -1
- package/web/_astro/{linear.CAqUTUf3.js → linear.Cn4ewR2z.js} +1 -1
- package/web/_astro/{mermaid.core.ZlPUJ21K.js → mermaid.core.BEACwKCZ.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.ClTJkcTG.js → mindmap-definition-RKZ34NQL.BE9cnWaH.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.B9kJfBw_.js → pieDiagram-4H26LBE5.CLcCK_JM.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.CtTJH5Fo.js → quadrantDiagram-W4KKPZXB.qw8LmkgG.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.WVLq9rr2.js → requirementDiagram-4Y6WPE33.D02534qk.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.L_XUdyqe.js → sankeyDiagram-5OEKKPKP.I6nOztAU.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.DCdtsEdj.js → sequenceDiagram-3UESZ5HK.CXTuiAV8.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.-Koi9kLh.js → stateDiagram-AJRCARHV.BV-mNJRM.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.DHXu_l8w.js → stateDiagram-v2-BHNVJYJU.kF2_t5fy.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.Czotaq0j.js → timeline-definition-PNZ67QCA.BiIzvhe5.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.BfEI3zhc.js → vennDiagram-CIIHVFJN.9cR-p_zq.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.C33mahwT.js → wardley-L42UT6IY.CwwpzGfz.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.D8IzxB1w.js → wardleyDiagram-YWT4CUSO.Q3hswh_f.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.D-cfi9uT.js → xychartDiagram-2RQKCTM6.Co-1OW2E.js} +1 -1
- package/web/index.html +1 -1
- package/web/_astro/BoardApp.XG2FoRlA.js +0 -1
- package/web/_astro/channel.BrBVc6tg.js +0 -1
|
@@ -10,6 +10,16 @@ description: >
|
|
|
10
10
|
today, behavioral wiring activates as the verb ships. Unconditional transitions
|
|
11
11
|
use the `always` guard (externally-driven via `requestTransition`, not
|
|
12
12
|
auto-advance).
|
|
13
|
+
|
|
14
|
+
Two-layer done gate (task 0292): this workflow's testing→done guard
|
|
15
|
+
(`spur task check --strict-core`) is the FIRST gate. The CLI verdict guard
|
|
16
|
+
(`packages/app/src/services/done-transition-guard.ts`) is the SECOND gate,
|
|
17
|
+
invoked by `apps/cli/src/commands/task.ts` for every `spur task update <wbs>
|
|
18
|
+
done` call — it reads `.spur/run/<wbs>-verdict.json` and blocks non-PASS
|
|
19
|
+
verdicts unless `--force-done --reason "<why>"` is supplied. The CLI gate
|
|
20
|
+
covers the `--no-lifecycle` and adapter-unavailable paths that bypass this
|
|
21
|
+
workflow. Overrides are recorded via the `done_forced` / `done_reason`
|
|
22
|
+
frontmatter fields.
|
|
13
23
|
initialState: backlog
|
|
14
24
|
terminalStates:
|
|
15
25
|
- cancelled
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
|
|
2
|
+
kind: state-machine
|
|
3
|
+
name: wayfinder-resolution
|
|
4
|
+
description: "Reusable resolution pipeline for research/specification tasks without invoking the code implementation pipeline"
|
|
5
|
+
iterationBound: 20
|
|
6
|
+
initialState: precheck
|
|
7
|
+
terminalStates:
|
|
8
|
+
- done
|
|
9
|
+
- failed
|
|
10
|
+
- cancelled
|
|
11
|
+
vars:
|
|
12
|
+
wbs: "0000"
|
|
13
|
+
profile: "standard"
|
|
14
|
+
spurBin: "spur"
|
|
15
|
+
agent: "omp"
|
|
16
|
+
stepTimeoutMs: "900000"
|
|
17
|
+
approval: "required"
|
|
18
|
+
resolutionMode: "research"
|
|
19
|
+
evidencePolicy: "spur-cli-first"
|
|
20
|
+
__hitlAnswer: ""
|
|
21
|
+
|
|
22
|
+
states:
|
|
23
|
+
- id: precheck
|
|
24
|
+
description: "Validate the task and confirm the requested resolution mode before delegation."
|
|
25
|
+
onEnter:
|
|
26
|
+
- kind: shell
|
|
27
|
+
options:
|
|
28
|
+
command: "${vars.spurBin} task check ${vars.wbs}"
|
|
29
|
+
- kind: shell
|
|
30
|
+
options:
|
|
31
|
+
command: "${vars.spurBin} task show ${vars.wbs} --json"
|
|
32
|
+
- kind: note
|
|
33
|
+
options:
|
|
34
|
+
message: "Wayfinder resolution started for task ${vars.wbs} (mode=${vars.resolutionMode}, evidence=${vars.evidencePolicy}); no code implementation pipeline is permitted."
|
|
35
|
+
|
|
36
|
+
- id: collect
|
|
37
|
+
description: "Create a deterministic local input bundle before delegation."
|
|
38
|
+
onEnter:
|
|
39
|
+
- kind: shell
|
|
40
|
+
options:
|
|
41
|
+
command: "mkdir -p .spur/run/wayfinder && ${vars.spurBin} task show ${vars.wbs} --json > .spur/run/wayfinder/${vars.wbs}-input.json"
|
|
42
|
+
- kind: shell
|
|
43
|
+
options:
|
|
44
|
+
command: "${vars.spurBin} workflow validate config/workflows/wayfinder-resolution.yaml > .spur/run/wayfinder/${vars.wbs}-workflow-check.txt"
|
|
45
|
+
- kind: shell
|
|
46
|
+
options:
|
|
47
|
+
command: "${vars.spurBin} task check ${vars.wbs} > .spur/run/wayfinder/${vars.wbs}-precheck.txt"
|
|
48
|
+
|
|
49
|
+
- id: investigate
|
|
50
|
+
description: "Resolve the task's research/specification requirements and author evidence-backed sections through Spur CLI."
|
|
51
|
+
onEnter:
|
|
52
|
+
- kind: agent.run
|
|
53
|
+
options:
|
|
54
|
+
agent: ${vars.agent}
|
|
55
|
+
capture: true
|
|
56
|
+
mode: text
|
|
57
|
+
input: >-
|
|
58
|
+
Resolve task ${vars.wbs} in resolution mode ${vars.resolutionMode} using the prepared
|
|
59
|
+
local bundle `.spur/run/wayfinder/${vars.wbs}-input.json` and only local shell/file
|
|
60
|
+
reads plus the `spur` CLI; do not use network search or MCP tools. Do not
|
|
61
|
+
invoke task-pipeline.yaml, /sp:dev-run, /sp:dev-runall, or code implementation.
|
|
62
|
+
Read the task file, map its existing Requirements and Acceptance Criteria to the
|
|
63
|
+
existing Design/Plan/References, then author concise Solution, Testing, and Review
|
|
64
|
+
sections through `spur task update --section --from-file`. Preserve the research
|
|
65
|
+
boundary. Finish with a short summary and stop. Evidence policy: ${vars.evidencePolicy}.
|
|
66
|
+
timeoutMs: ${vars.stepTimeoutMs}
|
|
67
|
+
|
|
68
|
+
- id: verify
|
|
69
|
+
description: "Perform an independent evidence and traceability check for the resolved research task."
|
|
70
|
+
onEnter:
|
|
71
|
+
- kind: agent.run
|
|
72
|
+
options:
|
|
73
|
+
agent: ${vars.agent}
|
|
74
|
+
capture: true
|
|
75
|
+
mode: text
|
|
76
|
+
input: >-
|
|
77
|
+
Verify resolved task ${vars.wbs} using only local reads and `spur` CLI. Check its
|
|
78
|
+
requirements, acceptance scenarios, Solution, Testing, and Review. Confirm workflow
|
|
79
|
+
orchestration uses `spur workflow` and execution uses `spur` CLI by default. Run
|
|
80
|
+
`spur task check ${vars.wbs}` and update Testing/Review via the CLI only if needed.
|
|
81
|
+
Do not implement plugin code. Write the final verdict word (exactly PASS, PARTIAL,
|
|
82
|
+
or FAIL, nothing else) to `.spur/run/wayfinder/${vars.wbs}-resolution-verdict.txt`,
|
|
83
|
+
then finish with the same verdict and stop.
|
|
84
|
+
timeoutMs: ${vars.stepTimeoutMs}
|
|
85
|
+
|
|
86
|
+
- id: approve
|
|
87
|
+
description: "Human review gate unless the caller explicitly selects auto approval."
|
|
88
|
+
pause: true
|
|
89
|
+
onEnter:
|
|
90
|
+
- kind: hitl.confirm
|
|
91
|
+
options:
|
|
92
|
+
prompt: "Approve research resolution for task ${vars.wbs}?"
|
|
93
|
+
|
|
94
|
+
- id: record
|
|
95
|
+
description: "Record the resolution through the canonical task CLI and transition only after checks pass."
|
|
96
|
+
onEnter:
|
|
97
|
+
- kind: shell
|
|
98
|
+
options:
|
|
99
|
+
command: "${vars.spurBin} task check ${vars.wbs}"
|
|
100
|
+
- kind: shell
|
|
101
|
+
options:
|
|
102
|
+
# PASS-only completion (preserve-list P4): lifecycle guards stay on; a forced
|
|
103
|
+
# done without verdict evidence is the 0280 regression this replaces (see 0292).
|
|
104
|
+
command: "${vars.spurBin} task update ${vars.wbs} done"
|
|
105
|
+
|
|
106
|
+
- id: done
|
|
107
|
+
description: "Research task resolved and ready to feed the implementation backlog."
|
|
108
|
+
onEnter:
|
|
109
|
+
- kind: note
|
|
110
|
+
options:
|
|
111
|
+
message: "Wayfinder research task ${vars.wbs} resolved; implementation remains deferred to the synthesized build backlog."
|
|
112
|
+
|
|
113
|
+
- id: failed
|
|
114
|
+
description: "Research resolution failed a gate; no completion transition is attempted."
|
|
115
|
+
|
|
116
|
+
- id: cancelled
|
|
117
|
+
description: "Operator cancelled the research resolution."
|
|
118
|
+
|
|
119
|
+
transitions:
|
|
120
|
+
- from: precheck
|
|
121
|
+
to: collect
|
|
122
|
+
description: "Precheck passed — collect deterministic local inputs."
|
|
123
|
+
guard:
|
|
124
|
+
kind: shell
|
|
125
|
+
options:
|
|
126
|
+
command: "${vars.spurBin} task check ${vars.wbs}"
|
|
127
|
+
- from: precheck
|
|
128
|
+
to: failed
|
|
129
|
+
description: "Precheck failed — stop before delegation."
|
|
130
|
+
guard:
|
|
131
|
+
kind: shell
|
|
132
|
+
options:
|
|
133
|
+
command: "! ${vars.spurBin} task check ${vars.wbs}"
|
|
134
|
+
- from: collect
|
|
135
|
+
to: investigate
|
|
136
|
+
description: "Input bundle collected — resolve the research task."
|
|
137
|
+
guard:
|
|
138
|
+
kind: shell
|
|
139
|
+
options:
|
|
140
|
+
command: "test -s .spur/run/wayfinder/${vars.wbs}-input.json && test -s .spur/run/wayfinder/${vars.wbs}-precheck.txt"
|
|
141
|
+
- from: collect
|
|
142
|
+
to: failed
|
|
143
|
+
description: "Input collection failed — stop before delegation."
|
|
144
|
+
guard:
|
|
145
|
+
kind: shell
|
|
146
|
+
options:
|
|
147
|
+
command: "! test -s .spur/run/wayfinder/${vars.wbs}-input.json || ! test -s .spur/run/wayfinder/${vars.wbs}-precheck.txt"
|
|
148
|
+
- from: investigate
|
|
149
|
+
to: verify
|
|
150
|
+
description: "Research resolution authored — verify evidence and traceability."
|
|
151
|
+
guard:
|
|
152
|
+
kind: always
|
|
153
|
+
- from: verify
|
|
154
|
+
to: record
|
|
155
|
+
description: "Auto profile — record only on a machine-readable PASS verdict (fail-closed to the approve gate otherwise)."
|
|
156
|
+
guard:
|
|
157
|
+
kind: shell
|
|
158
|
+
options:
|
|
159
|
+
command: 'test "${vars.approval}" = auto && grep -qx PASS .spur/run/wayfinder/${vars.wbs}-resolution-verdict.txt'
|
|
160
|
+
- from: verify
|
|
161
|
+
to: approve
|
|
162
|
+
description: "Verification completed — require explicit review approval."
|
|
163
|
+
guard:
|
|
164
|
+
kind: always
|
|
165
|
+
- from: approve
|
|
166
|
+
to: record
|
|
167
|
+
description: "Operator approved the research resolution."
|
|
168
|
+
guard:
|
|
169
|
+
kind: shell
|
|
170
|
+
options:
|
|
171
|
+
command: 'test "${vars.__hitlAnswer}" = yes'
|
|
172
|
+
- from: approve
|
|
173
|
+
to: cancelled
|
|
174
|
+
description: "Operator cancelled the research resolution."
|
|
175
|
+
guard:
|
|
176
|
+
kind: shell
|
|
177
|
+
options:
|
|
178
|
+
command: 'test "${vars.__hitlAnswer}" = cancel'
|
|
179
|
+
- from: approve
|
|
180
|
+
to: failed
|
|
181
|
+
description: "Operator rejected the research resolution."
|
|
182
|
+
guard:
|
|
183
|
+
kind: shell
|
|
184
|
+
options:
|
|
185
|
+
command: 'test "${vars.__hitlAnswer}" = no'
|
|
186
|
+
- from: record
|
|
187
|
+
to: done
|
|
188
|
+
description: "Task check passed and the task status is actually done (the lifecycle transition succeeded)."
|
|
189
|
+
guard:
|
|
190
|
+
kind: shell
|
|
191
|
+
options:
|
|
192
|
+
command: '${vars.spurBin} task check ${vars.wbs} && test "$(${vars.spurBin} task show ${vars.wbs} --json | jq -r .status)" = done'
|
|
193
|
+
- from: record
|
|
194
|
+
to: failed
|
|
195
|
+
description: "Recording/check failed or the task never reached done — stop without claiming completion."
|
|
196
|
+
guard:
|
|
197
|
+
kind: shell
|
|
198
|
+
options:
|
|
199
|
+
command: '! ${vars.spurBin} task check ${vars.wbs} || test "$(${vars.spurBin} task show ${vars.wbs} --json | jq -r .status)" != done'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.14",
|
|
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",
|