@gobing-ai/spur 0.3.25 → 0.3.27

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 (61) 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/workflows/task-pipeline.yaml +9 -0
  6. package/package.json +1 -1
  7. package/spur.js +2007 -469
  8. package/web/_astro/BoardApp.Bk3T0o6s.js +1 -0
  9. package/web/_astro/BoardApp.BwAdAgK9.js +179 -0
  10. package/web/_astro/{TaskDetail.Dsk9DnGY.js → TaskDetail.L36slEqE.js} +1 -1
  11. package/web/_astro/{arc.Biv8k-OR.js → arc.CO-I_PZe.js} +1 -1
  12. package/web/_astro/{architectureDiagram-3BPJPVTR.BrtW5Sn7.js → architectureDiagram-3BPJPVTR.Si-A1Ncl.js} +1 -1
  13. package/web/_astro/{blockDiagram-GPEHLZMM.CTpFZJhW.js → blockDiagram-GPEHLZMM.CeNy_ta6.js} +1 -1
  14. package/web/_astro/{c4Diagram-AAUBKEIU._ZJj9H0G.js → c4Diagram-AAUBKEIU.BgN_scEU.js} +1 -1
  15. package/web/_astro/channel.CYdGnFHM.js +1 -0
  16. package/web/_astro/{chunk-2J33WTMH.DD9mDiEM.js → chunk-2J33WTMH.C3oDtmdi.js} +1 -1
  17. package/web/_astro/{chunk-4BX2VUAB.ENDQu3TH.js → chunk-4BX2VUAB.Bv8Fxh4H.js} +1 -1
  18. package/web/_astro/{chunk-55IACEB6.DLpJf8Xp.js → chunk-55IACEB6.BT-TqtV6.js} +1 -1
  19. package/web/_astro/{chunk-727SXJPM.BR6vsvIV.js → chunk-727SXJPM.DkGMsI0B.js} +1 -1
  20. package/web/_astro/{chunk-AQP2D5EJ.DGOBzXM6.js → chunk-AQP2D5EJ.B_-SqGnF.js} +1 -1
  21. package/web/_astro/{chunk-FMBD7UC4.DrghnRtZ.js → chunk-FMBD7UC4.DwR3skMv.js} +1 -1
  22. package/web/_astro/{chunk-ND2GUHAM.BqIqI3oO.js → chunk-ND2GUHAM.BaTQutFl.js} +1 -1
  23. package/web/_astro/{chunk-QZHKN3VN.CJ2RJt0K.js → chunk-QZHKN3VN.BJMSqqJp.js} +1 -1
  24. package/web/_astro/{classDiagram-4FO5ZUOK.Qu1p6crX.js → classDiagram-4FO5ZUOK.SaqCNUPF.js} +1 -1
  25. package/web/_astro/{classDiagram-v2-Q7XG4LA2.Qu1p6crX.js → classDiagram-v2-Q7XG4LA2.SaqCNUPF.js} +1 -1
  26. package/web/_astro/{cose-bilkent-S5V4N54A.7VrRetJ0.js → cose-bilkent-S5V4N54A.BkmjA_E2.js} +1 -1
  27. package/web/_astro/{dagre-BM42HDAG.r4lTyJXQ.js → dagre-BM42HDAG.CNUvWhrX.js} +1 -1
  28. package/web/_astro/{diagram-2AECGRRQ.DahExuaR.js → diagram-2AECGRRQ.C68Cg9uE.js} +1 -1
  29. package/web/_astro/{diagram-5GNKFQAL.B-dSm3op.js → diagram-5GNKFQAL.DbHkPLEn.js} +1 -1
  30. package/web/_astro/{diagram-KO2AKTUF.CQGlKa6a.js → diagram-KO2AKTUF.Dt0EdErs.js} +1 -1
  31. package/web/_astro/{diagram-LMA3HP47.CJ6nomD-.js → diagram-LMA3HP47.Bixs6mnm.js} +1 -1
  32. package/web/_astro/{diagram-OG6HWLK6.ijGl68sM.js → diagram-OG6HWLK6.B4KBI6KT.js} +1 -1
  33. package/web/_astro/{erDiagram-TEJ5UH35.DBAe2Iin.js → erDiagram-TEJ5UH35.C_4i9Xvx.js} +1 -1
  34. package/web/_astro/{flowDiagram-I6XJVG4X.z3iXF6Ku.js → flowDiagram-I6XJVG4X.CfGFczAY.js} +1 -1
  35. package/web/_astro/{ganttDiagram-6RSMTGT7.DP2ouiRt.js → ganttDiagram-6RSMTGT7.C2AIvtmg.js} +1 -1
  36. package/web/_astro/{gitGraphDiagram-PVQCEYII.DizVfgVG.js → gitGraphDiagram-PVQCEYII.HlXuGqQg.js} +1 -1
  37. package/web/_astro/index.D5Wqk2Tw.css +1 -0
  38. package/web/_astro/{infoDiagram-5YYISTIA.BPTTgL0f.js → infoDiagram-5YYISTIA.BWQJsJ4Z.js} +1 -1
  39. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CXdMa4-b.js → ishikawaDiagram-YF4QCWOH.CCHgIHik.js} +1 -1
  40. package/web/_astro/{journeyDiagram-JHISSGLW.ChSKZ-1j.js → journeyDiagram-JHISSGLW.D9M6YwOJ.js} +1 -1
  41. package/web/_astro/{kanban-definition-UN3LZRKU.DUUlW-km.js → kanban-definition-UN3LZRKU.K20D-a1_.js} +1 -1
  42. package/web/_astro/{linear.AzHrSiEQ.js → linear.DeP5Qsol.js} +1 -1
  43. package/web/_astro/{mermaid.core.BajX78G7.js → mermaid.core.ClzxNMPU.js} +4 -4
  44. package/web/_astro/{mindmap-definition-RKZ34NQL.BmdUHcac.js → mindmap-definition-RKZ34NQL.CGn9RUNj.js} +1 -1
  45. package/web/_astro/{pieDiagram-4H26LBE5.Dh59Ur2v.js → pieDiagram-4H26LBE5.CoA92Csb.js} +1 -1
  46. package/web/_astro/{quadrantDiagram-W4KKPZXB.D2qYQmFj.js → quadrantDiagram-W4KKPZXB.CJ_UPjM1.js} +1 -1
  47. package/web/_astro/{requirementDiagram-4Y6WPE33.DW5nnrHl.js → requirementDiagram-4Y6WPE33.KkEPNNUU.js} +1 -1
  48. package/web/_astro/{sankeyDiagram-5OEKKPKP.CMl1PJrk.js → sankeyDiagram-5OEKKPKP.CoCWbQgh.js} +1 -1
  49. package/web/_astro/{sequenceDiagram-3UESZ5HK.U5dq1PA0.js → sequenceDiagram-3UESZ5HK.DUFpV3EP.js} +1 -1
  50. package/web/_astro/{stateDiagram-AJRCARHV.zrt55DVx.js → stateDiagram-AJRCARHV.CgWX0_9m.js} +1 -1
  51. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CKBGQ0dG.js → stateDiagram-v2-BHNVJYJU.BKUXeGSf.js} +1 -1
  52. package/web/_astro/{timeline-definition-PNZ67QCA.CKAlx9rU.js → timeline-definition-PNZ67QCA.CXayAguY.js} +1 -1
  53. package/web/_astro/{vennDiagram-CIIHVFJN.Bgt1eF06.js → vennDiagram-CIIHVFJN.DPak_Elh.js} +1 -1
  54. package/web/_astro/{wardley-L42UT6IY.BF02aioC.js → wardley-L42UT6IY.t3ZlDKd0.js} +1 -1
  55. package/web/_astro/{wardleyDiagram-YWT4CUSO.C94wxcnJ.js → wardleyDiagram-YWT4CUSO.CwPSVASQ.js} +1 -1
  56. package/web/_astro/{xychartDiagram-2RQKCTM6.BwK7SRoW.js → xychartDiagram-2RQKCTM6.CJfrQgpF.js} +1 -1
  57. package/web/index.html +2 -2
  58. package/web/_astro/BoardApp.DH9wI8y7.js +0 -179
  59. package/web/_astro/BoardApp.DZiwQCP7.js +0 -1
  60. package/web/_astro/channel.Ih1_8SAH.js +0 -1
  61. 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:
@@ -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:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.25",
3
+ "version": "0.3.27",
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",