@gobing-ai/spur 0.3.26 → 0.3.28

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 (62) hide show
  1. package/config/rules/recommended-pre-check.yaml +1 -0
  2. package/config/rules/strict/runtime-boundaries.yaml +23 -16
  3. package/config/rules/ui/ui-import-boundary.yaml +7 -4
  4. package/config/tasks/section-matrix.yaml +7 -7
  5. package/config/templates/AGENTS.md +6 -6
  6. package/config/workflows/task-pipeline.yaml +18 -1
  7. package/package.json +9 -9
  8. package/spur.js +2417 -674
  9. package/web/_astro/BoardApp.Bk3T0o6s.js +1 -0
  10. package/web/_astro/BoardApp.BwAdAgK9.js +179 -0
  11. package/web/_astro/{TaskDetail.Dsk9DnGY.js → TaskDetail.L36slEqE.js} +1 -1
  12. package/web/_astro/{arc.Biv8k-OR.js → arc.CO-I_PZe.js} +1 -1
  13. package/web/_astro/{architectureDiagram-3BPJPVTR.BrtW5Sn7.js → architectureDiagram-3BPJPVTR.Si-A1Ncl.js} +1 -1
  14. package/web/_astro/{blockDiagram-GPEHLZMM.CTpFZJhW.js → blockDiagram-GPEHLZMM.CeNy_ta6.js} +1 -1
  15. package/web/_astro/{c4Diagram-AAUBKEIU._ZJj9H0G.js → c4Diagram-AAUBKEIU.BgN_scEU.js} +1 -1
  16. package/web/_astro/channel.CYdGnFHM.js +1 -0
  17. package/web/_astro/{chunk-2J33WTMH.DD9mDiEM.js → chunk-2J33WTMH.C3oDtmdi.js} +1 -1
  18. package/web/_astro/{chunk-4BX2VUAB.ENDQu3TH.js → chunk-4BX2VUAB.Bv8Fxh4H.js} +1 -1
  19. package/web/_astro/{chunk-55IACEB6.DLpJf8Xp.js → chunk-55IACEB6.BT-TqtV6.js} +1 -1
  20. package/web/_astro/{chunk-727SXJPM.BR6vsvIV.js → chunk-727SXJPM.DkGMsI0B.js} +1 -1
  21. package/web/_astro/{chunk-AQP2D5EJ.DGOBzXM6.js → chunk-AQP2D5EJ.B_-SqGnF.js} +1 -1
  22. package/web/_astro/{chunk-FMBD7UC4.DrghnRtZ.js → chunk-FMBD7UC4.DwR3skMv.js} +1 -1
  23. package/web/_astro/{chunk-ND2GUHAM.BqIqI3oO.js → chunk-ND2GUHAM.BaTQutFl.js} +1 -1
  24. package/web/_astro/{chunk-QZHKN3VN.CJ2RJt0K.js → chunk-QZHKN3VN.BJMSqqJp.js} +1 -1
  25. package/web/_astro/{classDiagram-4FO5ZUOK.Qu1p6crX.js → classDiagram-4FO5ZUOK.SaqCNUPF.js} +1 -1
  26. package/web/_astro/{classDiagram-v2-Q7XG4LA2.Qu1p6crX.js → classDiagram-v2-Q7XG4LA2.SaqCNUPF.js} +1 -1
  27. package/web/_astro/{cose-bilkent-S5V4N54A.7VrRetJ0.js → cose-bilkent-S5V4N54A.BkmjA_E2.js} +1 -1
  28. package/web/_astro/{dagre-BM42HDAG.r4lTyJXQ.js → dagre-BM42HDAG.CNUvWhrX.js} +1 -1
  29. package/web/_astro/{diagram-2AECGRRQ.DahExuaR.js → diagram-2AECGRRQ.C68Cg9uE.js} +1 -1
  30. package/web/_astro/{diagram-5GNKFQAL.B-dSm3op.js → diagram-5GNKFQAL.DbHkPLEn.js} +1 -1
  31. package/web/_astro/{diagram-KO2AKTUF.CQGlKa6a.js → diagram-KO2AKTUF.Dt0EdErs.js} +1 -1
  32. package/web/_astro/{diagram-LMA3HP47.CJ6nomD-.js → diagram-LMA3HP47.Bixs6mnm.js} +1 -1
  33. package/web/_astro/{diagram-OG6HWLK6.ijGl68sM.js → diagram-OG6HWLK6.B4KBI6KT.js} +1 -1
  34. package/web/_astro/{erDiagram-TEJ5UH35.DBAe2Iin.js → erDiagram-TEJ5UH35.C_4i9Xvx.js} +1 -1
  35. package/web/_astro/{flowDiagram-I6XJVG4X.z3iXF6Ku.js → flowDiagram-I6XJVG4X.CfGFczAY.js} +1 -1
  36. package/web/_astro/{ganttDiagram-6RSMTGT7.DP2ouiRt.js → ganttDiagram-6RSMTGT7.C2AIvtmg.js} +1 -1
  37. package/web/_astro/{gitGraphDiagram-PVQCEYII.DizVfgVG.js → gitGraphDiagram-PVQCEYII.HlXuGqQg.js} +1 -1
  38. package/web/_astro/index.D5Wqk2Tw.css +1 -0
  39. package/web/_astro/{infoDiagram-5YYISTIA.BPTTgL0f.js → infoDiagram-5YYISTIA.BWQJsJ4Z.js} +1 -1
  40. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CXdMa4-b.js → ishikawaDiagram-YF4QCWOH.CCHgIHik.js} +1 -1
  41. package/web/_astro/{journeyDiagram-JHISSGLW.ChSKZ-1j.js → journeyDiagram-JHISSGLW.D9M6YwOJ.js} +1 -1
  42. package/web/_astro/{kanban-definition-UN3LZRKU.DUUlW-km.js → kanban-definition-UN3LZRKU.K20D-a1_.js} +1 -1
  43. package/web/_astro/{linear.AzHrSiEQ.js → linear.DeP5Qsol.js} +1 -1
  44. package/web/_astro/{mermaid.core.BajX78G7.js → mermaid.core.ClzxNMPU.js} +4 -4
  45. package/web/_astro/{mindmap-definition-RKZ34NQL.BmdUHcac.js → mindmap-definition-RKZ34NQL.CGn9RUNj.js} +1 -1
  46. package/web/_astro/{pieDiagram-4H26LBE5.Dh59Ur2v.js → pieDiagram-4H26LBE5.CoA92Csb.js} +1 -1
  47. package/web/_astro/{quadrantDiagram-W4KKPZXB.D2qYQmFj.js → quadrantDiagram-W4KKPZXB.CJ_UPjM1.js} +1 -1
  48. package/web/_astro/{requirementDiagram-4Y6WPE33.DW5nnrHl.js → requirementDiagram-4Y6WPE33.KkEPNNUU.js} +1 -1
  49. package/web/_astro/{sankeyDiagram-5OEKKPKP.CMl1PJrk.js → sankeyDiagram-5OEKKPKP.CoCWbQgh.js} +1 -1
  50. package/web/_astro/{sequenceDiagram-3UESZ5HK.U5dq1PA0.js → sequenceDiagram-3UESZ5HK.DUFpV3EP.js} +1 -1
  51. package/web/_astro/{stateDiagram-AJRCARHV.zrt55DVx.js → stateDiagram-AJRCARHV.CgWX0_9m.js} +1 -1
  52. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CKBGQ0dG.js → stateDiagram-v2-BHNVJYJU.BKUXeGSf.js} +1 -1
  53. package/web/_astro/{timeline-definition-PNZ67QCA.CKAlx9rU.js → timeline-definition-PNZ67QCA.CXayAguY.js} +1 -1
  54. package/web/_astro/{vennDiagram-CIIHVFJN.Bgt1eF06.js → vennDiagram-CIIHVFJN.DPak_Elh.js} +1 -1
  55. package/web/_astro/{wardley-L42UT6IY.BF02aioC.js → wardley-L42UT6IY.t3ZlDKd0.js} +1 -1
  56. package/web/_astro/{wardleyDiagram-YWT4CUSO.C94wxcnJ.js → wardleyDiagram-YWT4CUSO.CwPSVASQ.js} +1 -1
  57. package/web/_astro/{xychartDiagram-2RQKCTM6.BwK7SRoW.js → xychartDiagram-2RQKCTM6.CJfrQgpF.js} +1 -1
  58. package/web/index.html +2 -2
  59. package/web/_astro/BoardApp.DH9wI8y7.js +0 -179
  60. package/web/_astro/BoardApp.DZiwQCP7.js +0 -1
  61. package/web/_astro/channel.Ih1_8SAH.js +0 -1
  62. package/web/_astro/index.D3Y4Q0mx.css +0 -1
@@ -12,3 +12,4 @@ extends:
12
12
  - boundary
13
13
  - surface
14
14
  - ui
15
+ - strict
@@ -1,11 +1,5 @@
1
1
  $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
2
- # [STRICT opt-in] Runtime boundaries. Absorbed from
3
- # ts-libs/.spur/rules/typescript/runtime-boundaries.yaml. NOT in
4
- # recommended-pre-check: Spur consumes ts-runtime's ProcessExecutor/FileSystem
5
- # seams but also does light direct fs/spawn at app edges, so these run as
6
- # opt-in hygiene with explicit allowlists for the sanctioned sites.
7
- # `no-direct-process-env` is intentionally omitted — config-from-env is Spur's
8
- # design (packages/config, apps/cli/context).
2
+ # Runtime boundaries: process execution and fs IO hygiene.
9
3
  include:
10
4
  - "apps/**/src/**/*.ts"
11
5
  - "packages/**/src/**/*.ts"
@@ -17,8 +11,11 @@ exclude:
17
11
 
18
12
  rules:
19
13
  - id: no-direct-process-spawn
20
- description: "Agent/process execution must go through ts-ai-runner / ts-runtime's ProcessExecutor. The only sanctioned direct spawn is `spur agent edit` opening $EDITOR."
21
- severity: warning
14
+ description: >
15
+ Process execution must go through @gobing-ai/ts-runtime ProcessExecutor
16
+ (or ts-ai-runner for agents). Do not call Bun.spawn/spawnSync, import
17
+ node:child_process, or pull in execa/zx at app/package sources.
18
+ severity: error
22
19
  evaluator:
23
20
  type: forbidden-import
24
21
  config:
@@ -37,11 +34,9 @@ rules:
37
34
  - "**/tests/**"
38
35
  - "**/*.test.ts"
39
36
  - "**/dist/**"
40
- # `spur agent edit` opens the operator's $EDITOR interactively.
41
- - "apps/cli/src/commands/agent.ts"
42
37
 
43
38
  - id: no-direct-fs-io
44
- description: "Prefer ts-runtime's FileSystem seam for fs IO. Light direct fs at app edges (service stat/access, migration loading) is allowlisted."
39
+ description: "Prefer ts-runtime's FileSystem seam for fs IO."
45
40
  severity: warning
46
41
  evaluator:
47
42
  type: forbidden-import
@@ -59,7 +54,19 @@ rules:
59
54
  - "**/tests/**"
60
55
  - "**/*.test.ts"
61
56
  - "**/dist/**"
62
- # Sanctioned direct-fs sites (no local FileSystem seam re-implemented):
63
- - "packages/app/src/services/workflow-service.ts"
64
- - "packages/app/src/services/agent-service.ts"
65
- - "packages/domain/src/migrations.ts"
57
+
58
+ # Low-level system primitives (O_EXCL locks, FD byte-tailing, FS watcher, atomic registry, Vite glob fallback):
59
+ - "packages/domain/src/planning/locks.ts" # POSIX atomic O_EXCL file locks
60
+ - "packages/app/src/services/token-ledger-service.ts" # FD byte-window log tailing
61
+ - "packages/app/src/services/token-ledger-watcher.ts" # node:fs watch() live watcher
62
+ - "packages/app/src/services/project-registry.ts" # atomic projects.json persistence
63
+ - "apps/web/src/modules/discover.ts" # Vite/Astro module scanner fallback under bun test
64
+
65
+ # Synchronous bootstrap & path resolution:
66
+ - "packages/config/src/bundled-config.ts" # sync bundledConfigRoot() directory walk
67
+ - "packages/config/src/loader.ts" # sync resolveConfigFile() / schema specifier lookup
68
+ - "packages/app/src/services/project-start.ts" # sync CLI binary path checks before daemon spawn
69
+
70
+ # Synchronous template & workflow resolvers:
71
+ - "apps/cli/src/commands/task.ts" # sync loadTemplateContent/Bodies callbacks
72
+ - "apps/cli/src/workflow/make-lifecycle-adapter.ts" # sync resolveWorkflowPath lookup
@@ -34,14 +34,17 @@ rules:
34
34
  description: >
35
35
  daisyUI COMPONENT classes (btn, card, badge, modal, ...) must not appear in
36
36
  className strings outside `apps/web/src/components/ui/`. Layout/utility classes
37
- (flex, grid, gap-*, p-*) are unaffected — the pattern is anchored to a
38
- className context and word-bounded to the component-class allowlist only.
39
- `components/ui/` stays excluded: it is the sanctioned class-authoring site.
37
+ (flex, grid, gap-*, p-*, select-none, [user-select:none]) are unaffected -
38
+ the pattern is anchored to a className context and word-bounded to the
39
+ component-class allowlist only. `select` is matched as a standalone class
40
+ token (followed by whitespace or quote) to avoid colliding with Tailwind's
41
+ `select-*` utilities and CSS `user-select` property. `components/ui/` stays
42
+ excluded: it is the sanctioned class-authoring site.
40
43
  severity: error
41
44
  evaluator:
42
45
  type: rg
43
46
  config:
44
- pattern: "className=[\"'][^\"']*\\b(btn|card|badge|modal|menu|navbar|drawer|tabs|alert|dropdown|collapse|join|tooltip|loading|select|checkbox|toggle)\\b"
47
+ pattern: "className=[\"'][^\"']*\\b(btn|card|badge|modal|menu|navbar|drawer|tabs|alert|dropdown|collapse|join|tooltip|loading|checkbox|toggle)\\b|className=[\"'][^\"']*\\bselect[\\s\"']"
45
48
  include:
46
49
  - "apps/web/src/**/*.tsx"
47
50
  exclude:
@@ -135,25 +135,25 @@ variants:
135
135
  meta:
136
136
  backlog:
137
137
  required: [Background]
138
- optional: [Requirements, Acceptance Criteria, Q&A, Design, Plan, Solution, Testing, Review]
138
+ optional: [Requirements, Acceptance Criteria, Q&A, Design, Plan, Root Cause, Solution, Testing, Review]
139
139
  todo:
140
140
  required: [Background, Plan]
141
- optional: [Requirements, Acceptance Criteria, Q&A, Design, Solution, Testing, Review]
141
+ optional: [Requirements, Acceptance Criteria, Q&A, Design, Root Cause, Solution, Testing, Review]
142
142
  wip:
143
143
  required: [Background, Plan]
144
- optional: [Requirements, Acceptance Criteria, Q&A, Design, Solution, Testing, Review]
144
+ optional: [Requirements, Acceptance Criteria, Q&A, Design, Root Cause, Solution, Testing, Review]
145
145
  testing:
146
146
  required: [Background, Plan]
147
- optional: [Requirements, Acceptance Criteria, Q&A, Design, Solution, Testing, Review]
147
+ optional: [Requirements, Acceptance Criteria, Q&A, Design, Root Cause, Solution, Testing, Review]
148
148
  done:
149
149
  required: [Background, Plan]
150
- optional: [Requirements, Acceptance Criteria, Q&A, Design, Solution, Testing, Review]
150
+ optional: [Requirements, Acceptance Criteria, Q&A, Design, Root Cause, Solution, Testing, Review]
151
151
  blocked:
152
152
  required: [Background]
153
- optional: [Requirements, Acceptance Criteria, Q&A, Design, Plan, Solution, Testing, Review]
153
+ optional: [Requirements, Acceptance Criteria, Q&A, Design, Plan, Root Cause, Solution, Testing, Review]
154
154
  cancelled:
155
155
  required: []
156
- optional: [Background, Requirements, Acceptance Criteria, Q&A, Design, Plan, Solution, Testing, Review]
156
+ optional: [Background, Requirements, Acceptance Criteria, Q&A, Design, Plan, Root Cause, Solution, Testing, Review]
157
157
 
158
158
  # Brainstorm template (minimal idea capture).
159
159
  brainstorm:
@@ -33,10 +33,10 @@ All product development work goes through the harness by default.
33
33
  ### Harness tool routing
34
34
 
35
35
  | Need | Route to | Avoid |
36
- |------|----------|--------|
36
+ | ------ | ---------- | -------- |
37
37
  | Plan a feature (intake → AC → tasks) | `/sp:dev-plan`, `/sp:dev-idea` | Freeform feature files without gates |
38
- | Drive one task end-to-end | `/sp:dev-run <wbs>` or **`sp:super-coder`** | Implement with no task / no pipeline |
39
- | Batch or parallel task runs | `/sp:dev-runall`, `/sp:dev-parallel` → **`sp:super-coder`** | Unordered multi-task thrash |
38
+ | Drive one task end-to-end | `/sp:dev-run <wbs>` or **`sp:super-planner`** | Implement with no task / no pipeline |
39
+ | Batch or parallel task runs | `/sp:dev-runall`, `/sp:dev-parallel` → **`sp:super-planner`** | Unordered multi-task thrash |
40
40
  | Batch-refine tasks under a feature | `/sp:dev-refineall --feature <id> --auto` | Hand-looping `/sp:dev-refine` per WBS |
41
41
  | Multi-step corpus CLI (tasks/features/rules/workflows) | **`sp:expert-spur`** | Raw Write/Edit on corpus files |
42
42
  | Look up `spur` verbs / flags / `--json` | Skill **`sp:spur-cli`** | Inventing flags from memory |
@@ -59,7 +59,7 @@ All product development work goes through the harness by default.
59
59
  2. **Gates before done** — `spur task check` / `spur feature check` / `spur rule run`; pipeline done
60
60
  needs a real verify **PASS**.
61
61
  3. **`--json` for machines** — parse CLI with `--json`.
62
- 4. **Route, don’t invent** — verbs → `sp:spur-cli`; lifecycle → `/sp:dev-*` / `sp:super-coder`;
62
+ 4. **Route, don’t invent** — verbs → `sp:spur-cli`; lifecycle → `/sp:dev-*` / `sp:super-planner`;
63
63
  multi-noun corpus → `sp:expert-spur`; review → `sp:super-reviewer`; docs process → `sp:doc-evolve`.
64
64
  5. **Keep tool ownership explicit** — project lifecycle/corpus/gates → Spur; plugin installation and
65
65
  capability lifecycle → Superskill. Do not hand-maintain per-platform adapters Superskill generates.
@@ -84,7 +84,7 @@ authority first, then derived docs, then this file.
84
84
  ### Doc map
85
85
 
86
86
  | Doc | Owns | Authority | When |
87
- |------|------|-----------|------|
87
+ | ------ | ------ | ----------- | ------ |
88
88
  | `docs/00_ADR.md` | **WHY** | Authoritative (content) | Structural change; dated entry before diverging |
89
89
  | `docs/01_PRD.md` | **WHAT** | Authoritative on scope | New feature/command |
90
90
  | `docs/02_ROADMAP.md` | **WHEN** | Derived | Phase placement |
@@ -134,7 +134,7 @@ _(Fill from package manifests / README — or during `sp:doc-evolve` customize.)
134
134
  ## Spur CLI surface
135
135
 
136
136
  **Not the verb catalog.** For `task` / `feature` / `rule` / `workflow` flags, exit codes, and
137
- `--json` shapes → skill **`sp:spur-cli`**. Lifecycle → `/sp:dev-*` / **`sp:super-coder`**.
137
+ `--json` shapes → skill **`sp:spur-cli`**. Lifecycle → `/sp:dev-*` / **`sp:super-planner`**.
138
138
  Multi-noun corpus campaigns → **`sp:expert-spur`**.
139
139
 
140
140
  ```bash
@@ -20,6 +20,15 @@
20
20
  kind: state-machine
21
21
  name: task-pipeline
22
22
  description: "Standard task execution pipeline (precheck → implement → test → review → approve → verify → record → done)"
23
+ # Task entity lifecycle (owned by task-lifecycle.yaml):
24
+ # normal: backlog → todo → wip → testing → done
25
+ # blocked is bidirectional with todo/wip/testing; done may reopen to wip.
26
+ # any non-terminal state may transition to cancelled.
27
+ # Guards:
28
+ # wip → testing: spur task check <wbs>
29
+ # testing → done: spur task check <wbs> --strict-core, then PASS-verdict provenance
30
+ # Invalid: todo → testing, todo → done, and wip → done.
31
+ # Pipeline states below are orchestration states, not task statuses.
23
32
  iterationBound: 20
24
33
  initialState: precheck
25
34
  terminalStates:
@@ -40,7 +49,15 @@ vars:
40
49
  # Step-level timeout for agent.run steps in milliseconds. A timed-out agent
41
50
  # subprocess is killed (not abandoned) and the step fails → pipeline routes to
42
51
  # `failed`. Override per run with `--vars '{"stepTimeoutMs":120000}'`.
43
- stepTimeoutMs: "600000"
52
+ # Raised 600s → 1800s (task 0398 R4). The H6 dogfood batch lost 3 of its 4
53
+ # timeouts on `test` steps hitting exactly the 600s wall (0391, 0395 test;
54
+ # `.spur/run/*-test-partial.md`), the same failure signature that justified
55
+ # implementTimeoutMs below. Agentic test/review/verify steps read the diff,
56
+ # run the suite, and write a section — that does not fit in 10 min on this
57
+ # corpus. Same honesty rule as implementTimeoutMs: 30 min is headroom, not a
58
+ # licence to run unbounded. If a step still hits this wall, STOP and record it
59
+ # rather than raising again without operator sign-off.
60
+ stepTimeoutMs: "1800000"
44
61
  # Timeout for the `implement` step specifically (R2a). Implementation is the
45
62
  # heaviest agent.run step (full read/write/test-probe loop) and has timed out
46
63
  # at the 600s default in five consecutive dogfood runs (bugs 742/744/746/748),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.26",
3
+ "version": "0.3.28",
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.14",
54
- "@gobing-ai/ts-ai-runner": "^0.4.14",
55
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.14",
56
- "@gobing-ai/ts-infra": "^0.4.14",
57
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.14",
58
- "@gobing-ai/ts-rule-engine": "^0.4.14",
59
- "@gobing-ai/ts-runtime": "^0.4.14",
60
- "@gobing-ai/ts-utils": "^0.4.14",
53
+ "@gobing-ai/ts-db": "^0.4.15",
54
+ "@gobing-ai/ts-ai-runner": "^0.4.15",
55
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.15",
56
+ "@gobing-ai/ts-infra": "^0.4.15",
57
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.15",
58
+ "@gobing-ai/ts-rule-engine": "^0.4.15",
59
+ "@gobing-ai/ts-runtime": "^0.4.15",
60
+ "@gobing-ai/ts-utils": "^0.4.15",
61
61
  "@types/bun": "1.3.14",
62
62
  "@types/figlet": "^1.7.0",
63
63
  "@types/node-notifier": "8.0.5",