@gobing-ai/spur 0.3.33 → 0.3.35

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.
Files changed (65) hide show
  1. package/config/config.example.yaml +1 -1
  2. package/config/corpus-baseline.json +61 -0
  3. package/config/templates/task/brainstorm.md +1 -0
  4. package/config/templates/task/feature-impl.md +4 -1
  5. package/config/templates/task/issue.md +1 -0
  6. package/config/templates/task/meta.md +4 -1
  7. package/config/templates/task/review.md +1 -0
  8. package/config/templates/task/standard.md +4 -1
  9. package/config/workflows/feature-lifecycle.yaml +10 -0
  10. package/config/workflows/idea-pipeline.yaml +1 -1
  11. package/config/workflows/task-pipeline.yaml +38 -5
  12. package/package.json +9 -9
  13. package/schemas/spur-config.schema.json +37 -23
  14. package/spur.js +1864 -482
  15. package/web/_astro/{BoardApp.CyyIiK76.js → BoardApp.8sc6Rb1t.js} +14 -14
  16. package/web/_astro/BoardApp.ChKnY1JD.js +1 -0
  17. package/web/_astro/{TaskDetail.BfUuRsfM.js → TaskDetail.DOKJP-Kp.js} +1 -1
  18. package/web/_astro/{arc.C7fql4LL.js → arc.CTqmqspU.js} +1 -1
  19. package/web/_astro/{architectureDiagram-3BPJPVTR.IJPsRX-V.js → architectureDiagram-3BPJPVTR.B0iBdehs.js} +1 -1
  20. package/web/_astro/{blockDiagram-GPEHLZMM.B1AUwBxq.js → blockDiagram-GPEHLZMM.BHE5UFj5.js} +1 -1
  21. package/web/_astro/{c4Diagram-AAUBKEIU.BuSJPR3z.js → c4Diagram-AAUBKEIU.DQApkgGM.js} +1 -1
  22. package/web/_astro/channel.B0q9WGrH.js +1 -0
  23. package/web/_astro/{chunk-2J33WTMH.CaOPTr9l.js → chunk-2J33WTMH.fPrKLM8v.js} +1 -1
  24. package/web/_astro/{chunk-4BX2VUAB.DQzxExn8.js → chunk-4BX2VUAB.DExvwBhn.js} +1 -1
  25. package/web/_astro/{chunk-55IACEB6.IIb103c7.js → chunk-55IACEB6.EjNkjuD6.js} +1 -1
  26. package/web/_astro/{chunk-727SXJPM.DOYz1K1b.js → chunk-727SXJPM.Dl8xy5rT.js} +1 -1
  27. package/web/_astro/{chunk-AQP2D5EJ.CFcfW-wt.js → chunk-AQP2D5EJ.BSzMBgBs.js} +1 -1
  28. package/web/_astro/{chunk-FMBD7UC4.C7Hn0jo3.js → chunk-FMBD7UC4.CAeOHpbb.js} +1 -1
  29. package/web/_astro/{chunk-ND2GUHAM.Ba83VQ1m.js → chunk-ND2GUHAM.Bbeu_ZOH.js} +1 -1
  30. package/web/_astro/{chunk-QZHKN3VN.CizNbIIP.js → chunk-QZHKN3VN.Da_GaIAZ.js} +1 -1
  31. package/web/_astro/{classDiagram-4FO5ZUOK.2NYYPXHq.js → classDiagram-4FO5ZUOK.sMfFYSQp.js} +1 -1
  32. package/web/_astro/{classDiagram-v2-Q7XG4LA2.2NYYPXHq.js → classDiagram-v2-Q7XG4LA2.sMfFYSQp.js} +1 -1
  33. package/web/_astro/{cose-bilkent-S5V4N54A.DwBqVzml.js → cose-bilkent-S5V4N54A.PS3IwOH4.js} +1 -1
  34. package/web/_astro/{dagre-BM42HDAG.DqnYsHWG.js → dagre-BM42HDAG.EQCx8a6D.js} +1 -1
  35. package/web/_astro/{diagram-2AECGRRQ.D8TKhgy-.js → diagram-2AECGRRQ.aEFQl8v8.js} +1 -1
  36. package/web/_astro/{diagram-5GNKFQAL.BUD6Prj5.js → diagram-5GNKFQAL.jyN4tqFX.js} +1 -1
  37. package/web/_astro/{diagram-KO2AKTUF.Cvg7hmND.js → diagram-KO2AKTUF.DaTVHnme.js} +1 -1
  38. package/web/_astro/{diagram-LMA3HP47.FUG_B9eS.js → diagram-LMA3HP47.DWsGRLAN.js} +1 -1
  39. package/web/_astro/{diagram-OG6HWLK6.XsBZQ0hQ.js → diagram-OG6HWLK6.DYxmOViu.js} +1 -1
  40. package/web/_astro/{erDiagram-TEJ5UH35.M_LSGgLQ.js → erDiagram-TEJ5UH35.BKM75coa.js} +1 -1
  41. package/web/_astro/{flowDiagram-I6XJVG4X.DZikZBRa.js → flowDiagram-I6XJVG4X.B7qpqDW5.js} +1 -1
  42. package/web/_astro/{ganttDiagram-6RSMTGT7.DTKuEmXY.js → ganttDiagram-6RSMTGT7.CYBL-hwy.js} +1 -1
  43. package/web/_astro/{gitGraphDiagram-PVQCEYII.Dt-E9XmY.js → gitGraphDiagram-PVQCEYII.Cz4ly3Kq.js} +1 -1
  44. package/web/_astro/{infoDiagram-5YYISTIA.D5snevU1.js → infoDiagram-5YYISTIA.CIS7cXrJ.js} +1 -1
  45. package/web/_astro/{ishikawaDiagram-YF4QCWOH.DmXdBf9W.js → ishikawaDiagram-YF4QCWOH.DQ-pmaOG.js} +1 -1
  46. package/web/_astro/{journeyDiagram-JHISSGLW.HPJSRkkU.js → journeyDiagram-JHISSGLW.DVS6F7UM.js} +1 -1
  47. package/web/_astro/{kanban-definition-UN3LZRKU.BxCqCnL1.js → kanban-definition-UN3LZRKU.D8t-G-U6.js} +1 -1
  48. package/web/_astro/{linear.BnXQUpS-.js → linear.IO8rTd_n.js} +1 -1
  49. package/web/_astro/{mermaid.core.D-ZeOmpg.js → mermaid.core.CjVnvFNf.js} +4 -4
  50. package/web/_astro/{mindmap-definition-RKZ34NQL.DxrftiFR.js → mindmap-definition-RKZ34NQL.DZoEMTnU.js} +1 -1
  51. package/web/_astro/{pieDiagram-4H26LBE5.D-ZcWxwg.js → pieDiagram-4H26LBE5.86r1QWnX.js} +1 -1
  52. package/web/_astro/{quadrantDiagram-W4KKPZXB.C-dVJ7GW.js → quadrantDiagram-W4KKPZXB.DzFA9uPk.js} +1 -1
  53. package/web/_astro/{requirementDiagram-4Y6WPE33.lalE_R8X.js → requirementDiagram-4Y6WPE33.dQvdvfMr.js} +1 -1
  54. package/web/_astro/{sankeyDiagram-5OEKKPKP.C4uPynAF.js → sankeyDiagram-5OEKKPKP.BvC-VNI8.js} +1 -1
  55. package/web/_astro/{sequenceDiagram-3UESZ5HK.uBOenkqh.js → sequenceDiagram-3UESZ5HK.DDQNwHs8.js} +1 -1
  56. package/web/_astro/{stateDiagram-AJRCARHV.CQOusSP2.js → stateDiagram-AJRCARHV.BKwYy-tQ.js} +1 -1
  57. package/web/_astro/{stateDiagram-v2-BHNVJYJU.Bw0ZdjYb.js → stateDiagram-v2-BHNVJYJU.KxCiRYYf.js} +1 -1
  58. package/web/_astro/{timeline-definition-PNZ67QCA.DbkPA5ce.js → timeline-definition-PNZ67QCA.Bh9NDjOx.js} +1 -1
  59. package/web/_astro/{vennDiagram-CIIHVFJN.CIKhzwoA.js → vennDiagram-CIIHVFJN.DIM-n6us.js} +1 -1
  60. package/web/_astro/{wardley-L42UT6IY.0P-tqaFs.js → wardley-L42UT6IY.DW15qOFQ.js} +1 -1
  61. package/web/_astro/{wardleyDiagram-YWT4CUSO.DrwTvM_M.js → wardleyDiagram-YWT4CUSO.UTIvjsG9.js} +1 -1
  62. package/web/_astro/{xychartDiagram-2RQKCTM6.BgJsQVms.js → xychartDiagram-2RQKCTM6.CQYhkVDS.js} +1 -1
  63. package/web/index.html +1 -1
  64. package/web/_astro/BoardApp.CBVEjvSW.js +0 -1
  65. package/web/_astro/channel.D3uZSASb.js +0 -1
@@ -74,7 +74,7 @@ agent:
74
74
  # agent: pi
75
75
  # tier: capable-1
76
76
 
77
- # `default-by-phase` is a deprecated backward-compat shim (ADR-033). Prefer
77
+ # `default-by-phase` is a REMOVED (0452). Prefer
78
78
  # executor `tier` + stage-registry model_policy. When present, a matching
79
79
  # phase mapping is still authoritative (fail-fast; no fall back to default)
80
80
  # and shadows stage routing for that phase.
@@ -0,0 +1,61 @@
1
+ {
2
+ "note": "Accepted `spur task check` / `spur feature check` errors. This is a POLICY file, not a status dump: it is an INPUT to `bun run corpus-check`, so it must be committed — an untracked baseline means the gate behaves differently on every clone and CI, and the first person to meet 8 unexplained failures disables it. Do not move it under `.spur/` (gitignored, ephemeral run artifacts). The gate fails on any error NOT listed here, and ALSO on any entry that no longer reproduces, so this cannot rot into a silent suppression list. Every entry needs a real diagnosis, a reason, and a date — 'pre-existing, not investigated' is not a reason.",
3
+ "entries": [
4
+ {
5
+ "kind": "task",
6
+ "id": "0368",
7
+ "code": "L3.required-section-placeholder",
8
+ "reason": "RATCHET DRIFT, not a bypass. Closed 2026-07-28; the rule that flags it landed 2026-08-01 (f373e90b), four days later. It was legally closed under the rules of its day and became non-compliant retroactively. Backfill Testing/Solution or exempt permanently when someone next touches it.",
9
+ "since": "2026-08-07"
10
+ },
11
+ {
12
+ "kind": "task",
13
+ "id": "0454",
14
+ "code": "L3.solution-file-line",
15
+ "reason": "GENUINE PRE-FIX BYPASS. Closed 2026-08-06, well after the rule existed (2026-07-24), via the `--no-lifecycle` hole closed on 2026-08-07. Its Solution needs one file:line citation. The only entry here representing real unpaid debt.",
16
+ "since": "2026-08-07"
17
+ },
18
+ {
19
+ "kind": "feature",
20
+ "id": "M",
21
+ "code": "L3.ac-bdd-error",
22
+ "reason": "CHECKER GAP, not corpus debt. M is a wayfinder MAP; its Acceptance Criteria section carries an explicit prose disclaimer ('This feature is a wayfinder MAP... It has no acceptance criteria — its target is the ## Goal'). The BDD validator requires a `Feature:` declaration and has no notion of the map feature type. Correct fix is to teach `feature check` about wayfinder maps, not to bolt fake Gherkin onto a map.",
23
+ "since": "2026-08-07"
24
+ },
25
+ {
26
+ "kind": "feature",
27
+ "id": "M",
28
+ "code": "L3.ac-bdd-invalid",
29
+ "reason": "Downstream of the M ac-bdd-error entry — same missing-Feature-declaration cause, reported twice by the validator.",
30
+ "since": "2026-08-07"
31
+ },
32
+ {
33
+ "kind": "feature",
34
+ "id": "F82",
35
+ "code": "L3.ac-bdd-error",
36
+ "reason": "CHECKER GAP, same class as M: wayfinder map with a deliberate no-AC prose disclaimer (plus a noted exception for two implementation-ready child tickets). Not a syntax error to fix.",
37
+ "since": "2026-08-07"
38
+ },
39
+ {
40
+ "kind": "feature",
41
+ "id": "F82",
42
+ "code": "L3.ac-bdd-invalid",
43
+ "reason": "Downstream of the F82 ac-bdd-error entry — same cause, reported twice.",
44
+ "since": "2026-08-07"
45
+ },
46
+ {
47
+ "kind": "feature",
48
+ "id": "F821",
49
+ "code": "L3.ac-bdd-error",
50
+ "reason": "LEGACY AC FORMAT, not a map. F821's Acceptance Criteria are written as plain `R1 @core — …` prose rows rather than Gherkin, an older convention predating the BDD validator. Converting them is a real (small) job with traceability risk: AC titles are identity keys, so renaming breaks child-task scenario references.",
51
+ "since": "2026-08-07"
52
+ },
53
+ {
54
+ "kind": "feature",
55
+ "id": "F821",
56
+ "code": "L3.ac-bdd-invalid",
57
+ "reason": "Downstream of the F821 ac-bdd-error entry — same cause, reported twice.",
58
+ "since": "2026-08-07"
59
+ }
60
+ ]
61
+ }
@@ -10,6 +10,7 @@ parent_wbs: null
10
10
  priority: P2
11
11
  tags: []
12
12
  dependencies: []
13
+ ac_numbering: task-local
13
14
  created_at: "{{ CREATED_AT }}"
14
15
  updated_at: "{{ CREATED_AT }}"
15
16
  ---
@@ -10,6 +10,7 @@ parent_wbs: null
10
10
  priority: P2
11
11
  tags: []
12
12
  dependencies: []
13
+ ac_numbering: task-local
13
14
  created_at: "{{ CREATED_AT }}"
14
15
  updated_at: "{{ CREATED_AT }}"
15
16
  ---
@@ -30,7 +31,9 @@ updated_at: "{{ CREATED_AT }}"
30
31
 
31
32
  ### Q&A
32
33
 
33
- <!-- Clarifications and decisions made during refinement. Keep empty if none. -->
34
+ <!-- CLOSED decisions from refinement: what was chosen and why, what was deferred and on what
35
+ condition. Not a parking lot for open questions — an unanswered question here means the task
36
+ is not ready to hand off. Keep empty if none. -->
34
37
 
35
38
  ### Design
36
39
 
@@ -10,6 +10,7 @@ parent_wbs: null
10
10
  priority: P2
11
11
  tags: ["bug"]
12
12
  dependencies: []
13
+ ac_numbering: task-local
13
14
  created_at: "{{ CREATED_AT }}"
14
15
  updated_at: "{{ CREATED_AT }}"
15
16
  ---
@@ -10,6 +10,7 @@ parent_wbs: null
10
10
  priority: P2
11
11
  tags: ["meta"]
12
12
  dependencies: []
13
+ ac_numbering: task-local
13
14
  created_at: "{{ CREATED_AT }}"
14
15
  updated_at: "{{ CREATED_AT }}"
15
16
  ---
@@ -30,7 +31,9 @@ updated_at: "{{ CREATED_AT }}"
30
31
 
31
32
  ### Q&A
32
33
 
33
- <!-- Clarifications and decisions made during refinement. Keep empty if none. -->
34
+ <!-- CLOSED decisions from refinement: what was chosen and why, what was deferred and on what
35
+ condition. Not a parking lot for open questions — an unanswered question here means the task
36
+ is not ready to hand off. Keep empty if none. -->
34
37
 
35
38
  ### Design
36
39
 
@@ -10,6 +10,7 @@ parent_wbs: null
10
10
  priority: P2
11
11
  tags: ["review"]
12
12
  dependencies: []
13
+ ac_numbering: task-local
13
14
  created_at: "{{ CREATED_AT }}"
14
15
  updated_at: "{{ CREATED_AT }}"
15
16
  ---
@@ -10,6 +10,7 @@ parent_wbs: null
10
10
  priority: P2
11
11
  tags: []
12
12
  dependencies: []
13
+ ac_numbering: task-local
13
14
  created_at: "{{ CREATED_AT }}"
14
15
  updated_at: "{{ CREATED_AT }}"
15
16
  ---
@@ -30,7 +31,9 @@ updated_at: "{{ CREATED_AT }}"
30
31
 
31
32
  ### Q&A
32
33
 
33
- <!-- Clarifications and decisions made during refinement. Keep empty if none. -->
34
+ <!-- CLOSED decisions from refinement: what was chosen and why, what was deferred and on what
35
+ condition. Not a parking lot for open questions — an unanswered question here means the task
36
+ is not ready to hand off. Keep empty if none. -->
34
37
 
35
38
  ### Design
36
39
 
@@ -74,6 +74,16 @@ transitions:
74
74
  guard:
75
75
  kind: always
76
76
 
77
+ # Reopen: done → active (design §7.5 — done is re-enterable; cancelled is not)
78
+ - from: done
79
+ to: active
80
+ description: >
81
+ Reopen completed feature for follow-up work (mandatory History entry).
82
+ Mirrors task-lifecycle done→wip. Prefer spur feature sync --force when
83
+ non-terminal tasks are already linked.
84
+ guard:
85
+ kind: always
86
+
77
87
  # Blocked ↔ active — bidirectional
78
88
  - from: active
79
89
  to: blocked
@@ -247,7 +247,7 @@ states:
247
247
  - kind: agent.run
248
248
  options:
249
249
  agent: ${vars.agent}
250
- input: "Run sp:spec-decomposition for feature ${vars.featureId}. Read the brainstorm artifact, feature AC, and design doc. Produce a task-batch JSON array at .spur/run/${vars.__runId}-idea-task-batch.json, validated against apps/cli/schemas/task-batch.schema.json. Schema-permitted fields per entry: `name`, `background`, `requirements`, `feature_id`, `parent_wbs`, `priority`, `tags`, `template` — schema validation rejects anything else. Acceptance Criteria, Design, and Plan sections are filled in by the per-task refine step after batch-create, NOT at decompose time. Validate locally against the schema before emitting."
250
+ input: "Run sp:spec-decomposition for feature ${vars.featureId}. Read the brainstorm artifact, feature AC, and design doc. SIZING FIRST, before any JSON: apply the skill's `Default to NOT decomposing` rubric to the whole unit of work — if it scores 0-2 the correct output is a ONE-entry batch, not many. Scenario count is not task count: merge scenarios that one task delivers (same file surface, same subsystem, or unreadable apart in review), and list every scenario a task covers in its background. Merging never costs AC coverage — one task may carry several scenarios. Do not emit one entry per scenario or per requirement by reflex. Then produce a task-batch JSON array at .spur/run/${vars.__runId}-idea-task-batch.json, validated against apps/cli/schemas/task-batch.schema.json. Schema-permitted fields per entry: `name`, `background`, `requirements`, `feature_id`, `parent_wbs`, `priority`, `tags`, `template` — schema validation rejects anything else. Acceptance Criteria, Design, and Plan sections are filled in by the per-task refine step after batch-create, NOT at decompose time. Validate locally against the schema before emitting."
251
251
  expectFile: .spur/run/${vars.__runId}-idea-task-batch.json
252
252
  timeoutMs: ${vars.stepTimeoutMs}
253
253
 
@@ -57,6 +57,10 @@ vars:
57
57
  # `--vars '{"agent":"claude"}'`. Pinned (not left to the AiRunner's <default>
58
58
  # selection) so a broken/misconfigured agent on the box can't silently capture the run.
59
59
  agent: "omp"
60
+ # Implement-only executor override (R1, task 0454). Defaults to same as agent.
61
+ # Override with `--vars '{"implementAgent":"omp-zai"}'` to pin implement to a
62
+ # specific executor while other hops keep the default agent.
63
+ implementAgent: "omp"
60
64
  # Step-level timeout for agentic hops (review / verify / test-fix) in ms.
61
65
  # Soft quality-gate shells are unbounded by this var (host shell only).
62
66
  # Raised 600s → 1800s (task 0398 R4 / H6 dogfood). Override:
@@ -86,6 +90,12 @@ vars:
86
90
  # project can point it at its own formatter; invoked best-effort (a missing or
87
91
  # failing formatter must never abort a run — the quality gate is the real gate).
88
92
  formatCmd: "bun run format"
93
+ # Max R-items in ## Requirements before size precheck fails (R2, task 0454).
94
+ # Override with `--vars '{"maxImplementReqs":"12"}'`.
95
+ maxImplementReqs: "5"
96
+ # Max checklist items under ## Plan before size precheck fails (R2, task 0454).
97
+ # Override with `--vars '{"maxImplementPlanItems":"15"}'`.
98
+ maxImplementPlanItems: "8"
89
99
 
90
100
  states:
91
101
  - id: precheck
@@ -113,6 +123,32 @@ states:
113
123
  # hook at run start — see the 0062 follow-up note; there is no link-writing
114
124
  # CLI verb to call from a shell step, so it cannot live in pure YAML.
115
125
  message: "Pipeline start for task ${vars.wbs}."
126
+ # R1 (0453): auto-profile precheck reopens a done feature before task check.
127
+ # Under profile=auto, resolve feature_id, sync (preferred) or update to active.
128
+ # Under non-auto, leave R4 message to guide the operator.
129
+ - kind: shell
130
+ options:
131
+ command: >-
132
+ if [ "$profile" = auto ]; then
133
+ FID=$($spurBin task show $wbs --json 2>/dev/null |
134
+ jq -r '.feature_id // .frontmatter.feature_id // empty' 2>/dev/null);
135
+ if [ -n "$FID" ]; then
136
+ $spurBin feature sync "$FID" --force --json 2>/dev/null ||
137
+ $spurBin feature update "$FID" active 2>/dev/null || true;
138
+ fi;
139
+ fi;
140
+ exit 0
141
+ # R2 (0454): task size precheck — evaluate R-item and Plan-item counts.
142
+ # Writes PASS/FAIL to .spur/run/<wbs>-precheck-size.status. Always exit 0
143
+ # (soft check, like doctor). The precheck→implement guard reads the file.
144
+ - kind: shell
145
+ options:
146
+ command: >-
147
+ SIZE_FILE=".spur/run/$wbs-precheck-size.status" &&
148
+ mkdir -p .spur/run &&
149
+ bun plugins/sp/scripts/task-size-precheck.ts "$wbs"
150
+ --max-reqs "$maxImplementReqs" --max-plan-items "$maxImplementPlanItems" &&
151
+ exit 0
116
152
 
117
153
  - id: implement
118
154
  description: >
@@ -130,7 +166,7 @@ states:
130
166
  onEnter:
131
167
  - kind: agent.run
132
168
  options:
133
- agent: ${vars.agent}
169
+ agent: ${vars.implementAgent}
134
170
  # Pure slash command only (ADR-043). Anti-recursion / implement discipline
135
171
  # lives in /sp:dev-run --mode implement → sp:code-implementation, not YAML prose.
136
172
  input: /sp:dev-run --mode implement ${vars.wbs} --auto
@@ -181,8 +217,6 @@ states:
181
217
  ATTEMPT_FILE=".spur/run/$wbs-test-fix-attempt" &&
182
218
  echo 0 > "$ATTEMPT_FILE" &&
183
219
  set +e &&
184
- # sh -c re-parses multi-command gates (&&, ;); do NOT use bare `$qualityGateCmd`
185
- # word-split (breaks on &&). qualityGateCmd is pipeline-owned trusted config only.
186
220
  ( sh -c "$qualityGateCmd" ); gate_rc=$?; set -e &&
187
221
  if [ "$gate_rc" -eq 0 ]; then
188
222
  printf 'PASS\n' > "$STATUS_FILE";
@@ -223,7 +257,6 @@ states:
223
257
  mkdir -p .spur/run &&
224
258
  STATUS_FILE=".spur/run/$wbs-test-gate.status" &&
225
259
  set +e &&
226
- # See test probe: sh -c for multi-command; qualityGateCmd is trusted config only.
227
260
  ( sh -c "$qualityGateCmd" ); gate_rc=$?; set -e &&
228
261
  if [ "$gate_rc" -eq 0 ]; then
229
262
  printf 'PASS\n' > "$STATUS_FILE";
@@ -340,7 +373,7 @@ transitions:
340
373
  guard:
341
374
  kind: shell
342
375
  options:
343
- command: 'test "$(cat .spur/run/$wbs-precheck-doctor.status 2>/dev/null)" = PASS && $spurBin task check $wbs'
376
+ command: 'test "$(cat .spur/run/$wbs-precheck-doctor.status 2>/dev/null)" = PASS && test "$(cat .spur/run/$wbs-precheck-size.status 2>/dev/null)" = PASS && $spurBin task check $wbs'
344
377
  - from: precheck
345
378
  to: failed
346
379
  description: Doctor FAIL and/or task check failed — stop before implement.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.33",
3
+ "version": "0.3.35",
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",
@@ -50,14 +50,14 @@
50
50
  },
51
51
  "devDependencies": {
52
52
  "@commander-js/extra-typings": "^14.0.0",
53
- "@gobing-ai/ts-db": "^0.4.19",
54
- "@gobing-ai/ts-ai-runner": "^0.4.19",
55
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.19",
56
- "@gobing-ai/ts-infra": "^0.4.19",
57
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.19",
58
- "@gobing-ai/ts-rule-engine": "^0.4.19",
59
- "@gobing-ai/ts-runtime": "^0.4.19",
60
- "@gobing-ai/ts-utils": "^0.4.19",
53
+ "@gobing-ai/ts-db": "^0.4.22",
54
+ "@gobing-ai/ts-ai-runner": "^0.4.22",
55
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.22",
56
+ "@gobing-ai/ts-infra": "^0.4.22",
57
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.22",
58
+ "@gobing-ai/ts-rule-engine": "^0.4.22",
59
+ "@gobing-ai/ts-runtime": "^0.4.22",
60
+ "@gobing-ai/ts-utils": "^0.4.22",
61
61
  "@types/bun": "1.3.14",
62
62
  "@types/figlet": "^1.7.0",
63
63
  "@types/node-notifier": "8.0.5",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://github.com/gobing-ai/spur/schemas/spur-config.schema.json",
4
4
  "title": "Spur Project Configuration",
5
- "description": "Schema for .spur/config.yaml the single project configuration surface consumed by spur and (future) spur-server.",
5
+ "description": "Schema for .spur/config.yaml \u2014 the single project configuration surface consumed by spur and (future) spur-server.",
6
6
  "type": "object",
7
7
  "required": ["version", "name"],
8
8
  "properties": {
@@ -107,7 +107,7 @@
107
107
  },
108
108
  "executors": {
109
109
  "type": "array",
110
- "description": "Named executor profiles: each pairs a canonical agent with an optional model override. Referenced by name from `default` and `default-by-phase`.",
110
+ "description": "Named executor profiles: each pairs a canonical agent with an optional model override. Referenced by name from `agent.default` and stage model_policy (default-by-phase removed 0452).",
111
111
  "items": {
112
112
  "type": "object",
113
113
  "required": ["name", "agent"],
@@ -130,18 +130,11 @@
130
130
  "tier": {
131
131
  "type": "string",
132
132
  "enum": ["cheap", "standard", "capable-1", "capable-2", "capable-3"],
133
- "description": "Capability tier for stage-registry adaptive model routing (ADR-033, 0343). Live values: cheap | standard | capable-1 | capable-2 | capable-3 (1=low output quality, 3=high within the capable band). A stage starts on the cheapest eligible executor meeting its model_policy min_tier. Bare legacy `capable` is accepted at runtime (zod preprocess capable-1) during the deprecation window but is not part of this editor enum."
133
+ "description": "Capability tier for stage-registry adaptive model routing (ADR-033, 0343). Live values: cheap | standard | capable-1 | capable-2 | capable-3 (1=low output quality, 3=high within the capable band). A stage starts on the cheapest eligible executor meeting its model_policy min_tier. Bare legacy `capable` is accepted at runtime (zod preprocess \u2192 capable-1) during the deprecation window but is not part of this editor enum."
134
134
  }
135
135
  }
136
136
  }
137
137
  },
138
- "default-by-phase": {
139
- "type": "object",
140
- "description": "DEPRECATED (ADR-033). Backward-compat map of dev phase (e.g. dev-run, dev-review) to executor selector. Prefer executor `tier` + stage-registry model_policy. When present, a matching phase mapping is still authoritative (fail-fast; no fall back to `default`) and shadows stage routing for that phase.",
141
- "additionalProperties": {
142
- "type": "string"
143
- }
144
- },
145
138
  "team": {
146
139
  "type": "object",
147
140
  "description": "Declarative agent teams keyed by team id (the map key is the teamId). Each team materializes a roster of agent specs (feature M). Mirrors @gobing-ai/spur-config TeamConfigSchema (Zod is SSOT).",
@@ -169,7 +162,10 @@
169
162
  "description": "Roster of member references (>= 1). A bare string is shorthand for { executor: <string> }; the composed agent id is <teamId>-<id ?? executor>.",
170
163
  "items": {
171
164
  "oneOf": [
172
- { "type": "string", "minLength": 1 },
165
+ {
166
+ "type": "string",
167
+ "minLength": 1
168
+ },
173
169
  {
174
170
  "type": "object",
175
171
  "required": ["executor"],
@@ -177,27 +173,41 @@
177
173
  "executor": {
178
174
  "type": "string",
179
175
  "minLength": 1,
180
- "description": "Executor name resolved against agent.executors first, else a raw canonical agent type."
176
+ "description": "Executor name \u2014 resolved against agent.executors first, else a raw canonical agent type."
181
177
  },
182
178
  "id": {
183
179
  "type": "string",
184
180
  "minLength": 1,
185
181
  "description": "Local member id; composed id is <teamId>-<id ?? executor> (must match ^[a-z][a-z0-9_-]{1,63}$)."
186
182
  },
187
- "purpose": { "type": "string" },
183
+ "purpose": {
184
+ "type": "string"
185
+ },
188
186
  "workspace": {
189
187
  "type": "string",
190
188
  "minLength": 1,
191
189
  "description": "Per-member workspace override. A leading `~` is tilde-expanded at load."
192
190
  },
193
- "model": { "type": "string", "minLength": 1 },
194
- "autonomy": { "type": "string" },
195
- "systemPrompt": { "type": "string" },
191
+ "model": {
192
+ "type": "string",
193
+ "minLength": 1
194
+ },
195
+ "autonomy": {
196
+ "type": "string"
197
+ },
198
+ "systemPrompt": {
199
+ "type": "string"
200
+ },
196
201
  "command": {
197
202
  "type": "array",
198
- "items": { "type": "string", "minLength": 1 }
203
+ "items": {
204
+ "type": "string",
205
+ "minLength": 1
206
+ }
199
207
  },
200
- "autostart": { "type": "boolean" }
208
+ "autostart": {
209
+ "type": "boolean"
210
+ }
201
211
  }
202
212
  }
203
213
  ]
@@ -213,7 +223,9 @@
213
223
  "properties": {
214
224
  "paths": {
215
225
  "type": "array",
216
- "items": { "type": "string" },
226
+ "items": {
227
+ "type": "string"
228
+ },
217
229
  "description": "Glob paths to rule files."
218
230
  }
219
231
  }
@@ -223,7 +235,9 @@
223
235
  "properties": {
224
236
  "paths": {
225
237
  "type": "array",
226
- "items": { "type": "string" },
238
+ "items": {
239
+ "type": "string"
240
+ },
227
241
  "description": "Glob paths to workflow directories."
228
242
  }
229
243
  }
@@ -239,11 +253,11 @@
239
253
  },
240
254
  "tasks": {
241
255
  "type": "object",
242
- "description": "Task-folder registration (design §9). Absorbs the legacy docs/.tasks/config.json folders + baseCounter concepts. Mirrors @gobing-ai/spur-config tasksConfigSchema (Zod is SSOT).",
256
+ "description": "Task-folder registration (design \u00a79). Absorbs the legacy docs/.tasks/config.json folders + baseCounter concepts. Mirrors @gobing-ai/spur-config tasksConfigSchema (Zod is SSOT).",
243
257
  "properties": {
244
258
  "folders": {
245
259
  "type": "object",
246
- "description": "Map of task-folder path folder config.",
260
+ "description": "Map of task-folder path \u2192 folder config.",
247
261
  "additionalProperties": {
248
262
  "type": "object",
249
263
  "properties": {
@@ -275,7 +289,7 @@
275
289
  },
276
290
  "features": {
277
291
  "type": "object",
278
- "description": "Feature directory location (design §9). Mirrors @gobing-ai/spur-config featuresConfigSchema (Zod is SSOT).",
292
+ "description": "Feature directory location (design \u00a79). Mirrors @gobing-ai/spur-config featuresConfigSchema (Zod is SSOT).",
279
293
  "properties": {
280
294
  "dir": {
281
295
  "type": "string",