@gobing-ai/spur 0.4.5 → 0.4.7

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 (79) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +3 -4
  3. package/config/config.global.yaml +3 -4
  4. package/config/rules/quality/coverage-gate.yaml +6 -4
  5. package/config/rules/strict/runtime-boundaries.yaml +8 -3
  6. package/config/rules/surface/check-cli-surface.yaml +20 -0
  7. package/config/transition-shims.json +1 -15
  8. package/config/workflows/task-lifecycle.yaml +1 -1
  9. package/package.json +1 -1
  10. package/plugins/sp/commands/dev-changelog.md +1 -1
  11. package/plugins/sp/lib/inline-run.generated.mjs +1 -1
  12. package/plugins/sp/plugin.json +1 -1
  13. package/plugins/sp/scripts/commit-guard.mjs +49 -39
  14. package/plugins/sp/scripts/commit-guard.ts +60 -61
  15. package/plugins/sp/scripts/persist-out-check.mjs +28 -24
  16. package/plugins/sp/scripts/persist-out-check.ts +42 -33
  17. package/plugins/sp/skills/code-verification/SKILL.md +1 -1
  18. package/plugins/sp/skills/code-verification/references/verdict-schema.md +6 -4
  19. package/plugins/sp/skills/functional-review/SKILL.md +1 -1
  20. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +4 -2
  21. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +3 -1
  22. package/plugins/sp/skills/spur-dev/references/dev-operations.md +7 -3
  23. package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +3 -2
  24. package/plugins/sp/skills/spur-dev/references/execution-batch.md +1 -1
  25. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +1 -1
  26. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -1
  27. package/spur.js +43097 -42239
  28. package/web/_astro/{BoardApp.hF0RAIrg.js → BoardApp.C5jnkkKP.js} +124 -124
  29. package/web/_astro/{BoardApp.Niubpe6z.js → BoardApp.CaNvQBD_.js} +1 -1
  30. package/web/_astro/{TaskDetail.DJpapt38.js → TaskDetail.DGKndhI8.js} +1 -1
  31. package/web/_astro/{arc.BgKcK0i8.js → arc.DHrwdg3G.js} +1 -1
  32. package/web/_astro/{architectureDiagram-3BPJPVTR.ChP-Ig0V.js → architectureDiagram-3BPJPVTR.pvKpK1s5.js} +1 -1
  33. package/web/_astro/{blockDiagram-GPEHLZMM.BVaCBoeN.js → blockDiagram-GPEHLZMM.BQmRcZsS.js} +1 -1
  34. package/web/_astro/{c4Diagram-AAUBKEIU.CHSDpEO5.js → c4Diagram-AAUBKEIU.CCLjHeH1.js} +1 -1
  35. package/web/_astro/channel.C7wG9RxA.js +1 -0
  36. package/web/_astro/{chunk-2J33WTMH.MYRcYVRa.js → chunk-2J33WTMH.DL6Yuoma.js} +1 -1
  37. package/web/_astro/{chunk-4BX2VUAB.S5j22Zqa.js → chunk-4BX2VUAB.CzlyEI7l.js} +1 -1
  38. package/web/_astro/{chunk-55IACEB6.gciRPvmZ.js → chunk-55IACEB6.B60EWxp1.js} +1 -1
  39. package/web/_astro/{chunk-727SXJPM.CdqrSQkX.js → chunk-727SXJPM.c7v_fRLo.js} +1 -1
  40. package/web/_astro/{chunk-AQP2D5EJ.CyokdHT3.js → chunk-AQP2D5EJ.8BxLWdDc.js} +1 -1
  41. package/web/_astro/{chunk-FMBD7UC4.Bg9KJhjW.js → chunk-FMBD7UC4.DmKuxGFT.js} +1 -1
  42. package/web/_astro/{chunk-ND2GUHAM.1gxxI-vD.js → chunk-ND2GUHAM.1Zwd4mqV.js} +1 -1
  43. package/web/_astro/{chunk-QZHKN3VN.DDEYtCKU.js → chunk-QZHKN3VN.BvYLu-A1.js} +1 -1
  44. package/web/_astro/{classDiagram-4FO5ZUOK.Ch3zi37T.js → classDiagram-4FO5ZUOK.CEqRt0WU.js} +1 -1
  45. package/web/_astro/{classDiagram-v2-Q7XG4LA2.Ch3zi37T.js → classDiagram-v2-Q7XG4LA2.CEqRt0WU.js} +1 -1
  46. package/web/_astro/{cose-bilkent-S5V4N54A.D2q5AINI.js → cose-bilkent-S5V4N54A.C7JiUdj2.js} +1 -1
  47. package/web/_astro/{cynefin-OW5HDTMX.BA9kC2YT.js → cynefin-OW5HDTMX.B6mZ-1be.js} +1 -1
  48. package/web/_astro/{dagre-BM42HDAG.CHO08nRp.js → dagre-BM42HDAG.BuryfDy6.js} +1 -1
  49. package/web/_astro/{diagram-2AECGRRQ.BfFQt0LW.js → diagram-2AECGRRQ.dao39YQM.js} +1 -1
  50. package/web/_astro/{diagram-5GNKFQAL.CHMwMTe4.js → diagram-5GNKFQAL.lnGZe4At.js} +1 -1
  51. package/web/_astro/{diagram-KO2AKTUF.BJ-7gK-w.js → diagram-KO2AKTUF.uWfhzEfT.js} +1 -1
  52. package/web/_astro/{diagram-LMA3HP47.C5xqcc0t.js → diagram-LMA3HP47.ppq8-198.js} +1 -1
  53. package/web/_astro/{diagram-OG6HWLK6.C2pQjfrC.js → diagram-OG6HWLK6.CKSCqDt5.js} +1 -1
  54. package/web/_astro/{erDiagram-TEJ5UH35._FoNyxgC.js → erDiagram-TEJ5UH35.sFSf2yBN.js} +1 -1
  55. package/web/_astro/{flowDiagram-I6XJVG4X.B_ENkT2I.js → flowDiagram-I6XJVG4X.BJQjKLbz.js} +1 -1
  56. package/web/_astro/{ganttDiagram-6RSMTGT7.B3q8h77C.js → ganttDiagram-6RSMTGT7.DAHKNj2N.js} +1 -1
  57. package/web/_astro/{gitGraphDiagram-PVQCEYII.QWZFDboZ.js → gitGraphDiagram-PVQCEYII.BlmzcW_O.js} +1 -1
  58. package/web/_astro/index.BCY1JJHd.css +1 -0
  59. package/web/_astro/{infoDiagram-5YYISTIA.Cs6eEc92.js → infoDiagram-5YYISTIA.DGhjaqsi.js} +1 -1
  60. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BU9DJMHA.js → ishikawaDiagram-YF4QCWOH.gKIpgt6F.js} +1 -1
  61. package/web/_astro/{journeyDiagram-JHISSGLW.D35k6Jpe.js → journeyDiagram-JHISSGLW.DG3tmP0R.js} +1 -1
  62. package/web/_astro/{kanban-definition-UN3LZRKU.DBqcAT4m.js → kanban-definition-UN3LZRKU.CgHDSxkR.js} +1 -1
  63. package/web/_astro/{linear.D-LSNK8W.js → linear.BuGEpcuM.js} +1 -1
  64. package/web/_astro/{mermaid.core.CSruWVOa.js → mermaid.core.DBVqkWBp.js} +4 -4
  65. package/web/_astro/{mindmap-definition-RKZ34NQL.BiFaUsfj.js → mindmap-definition-RKZ34NQL.D-kOcji9.js} +1 -1
  66. package/web/_astro/{pieDiagram-4H26LBE5.D1KTKqb9.js → pieDiagram-4H26LBE5.BvGPwtZt.js} +1 -1
  67. package/web/_astro/{quadrantDiagram-W4KKPZXB.DBHflsMG.js → quadrantDiagram-W4KKPZXB.BKb_9FV6.js} +1 -1
  68. package/web/_astro/{requirementDiagram-4Y6WPE33.hwX9CNdk.js → requirementDiagram-4Y6WPE33.Cx0fvD8v.js} +1 -1
  69. package/web/_astro/{sankeyDiagram-5OEKKPKP.DkI8mJiE.js → sankeyDiagram-5OEKKPKP.fatULi0W.js} +1 -1
  70. package/web/_astro/{sequenceDiagram-3UESZ5HK.DMz7jBDx.js → sequenceDiagram-3UESZ5HK.ChHyKqco.js} +1 -1
  71. package/web/_astro/{stateDiagram-AJRCARHV.B6Ef2xJ1.js → stateDiagram-AJRCARHV.BdUpKWyj.js} +1 -1
  72. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CgoaufB9.js → stateDiagram-v2-BHNVJYJU.fmJxqIm5.js} +1 -1
  73. package/web/_astro/{timeline-definition-PNZ67QCA.B3c8h1t-.js → timeline-definition-PNZ67QCA.BayDn5-V.js} +1 -1
  74. package/web/_astro/{vennDiagram-CIIHVFJN.BdHPAxAb.js → vennDiagram-CIIHVFJN.Bm2Aggwa.js} +1 -1
  75. package/web/_astro/{wardleyDiagram-YWT4CUSO.BrJXPPAj.js → wardleyDiagram-YWT4CUSO.DI75O-uG.js} +1 -1
  76. package/web/_astro/{xychartDiagram-2RQKCTM6.CMH5yFsV.js → xychartDiagram-2RQKCTM6.DL90E7Q7.js} +1 -1
  77. package/web/index.html +2 -2
  78. package/web/_astro/channel.DkpvN2tD.js +0 -1
  79. package/web/_astro/index.BFyW13JJ.css +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.4.5",
10
+ "version": "0.4.7",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -66,10 +66,9 @@ bootstrap:
66
66
  agent:
67
67
  # `default` is the role used for `--agent auto` when the caller declares
68
68
  # nothing (task 0542 R2 — the value domain moved from executor names to
69
- # roles). A role id selects its tier's cheapest eligible executor; a
70
- # configured executor name still resolves during the transition with a
71
- # one-time warning (shim agent-default-executor); any other value fails
72
- # naming both accepted sets.
69
+ # roles). A role id selects its tier's cheapest eligible executor; any
70
+ # other value fails. A configured executor name fails with a fix (use a
71
+ # role, and pin the executor with --agent <name>).
73
72
  default: coder
74
73
 
75
74
  # Role → tier map (SSOT: DEFAULT_AGENT_ROLES in packages/config, task 0572 /
@@ -35,10 +35,9 @@ version: "1.2"
35
35
  agent:
36
36
  # `default` is the role used for `--agent auto` when the caller declares
37
37
  # nothing (task 0542 R2 — the value domain moved from executor names to
38
- # roles). A role id selects its tier's cheapest eligible executor; a
39
- # configured executor name still resolves during the transition with a
40
- # one-time warning (shim agent-default-executor); any other value fails
41
- # naming both accepted sets.
38
+ # roles). A role id selects its tier's cheapest eligible executor; any
39
+ # other value fails. A configured executor name fails with a fix (use a
40
+ # role, and pin the executor with --agent <name>).
42
41
  default: coder
43
42
 
44
43
  # Role → tier map. Resolution: role → tier → cheapest USABLE executor whose
@@ -12,14 +12,16 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
12
12
  # `bun run test:full`. Running this rule directly via `spur rule run` outside the
13
13
  # repository wrapper bypasses that certification wrapper and is outside this
14
14
  # repository's certification contract. This rule and its evaluator are unchanged.
15
+ # Launcher children write isolated LCOV; canonical publication is exclusive and
16
+ # accepts only that run's complete records. Noncanonical launcher runs cannot
17
+ # overwrite the certified tracefile. Bare `bun test` still bypasses the launcher.
15
18
  #
16
19
  # Absorbed from ts-libs/.spur/rules/quality/coverage-gate.yaml, re-scoped to
17
20
  # Spur's monorepo layout:
18
21
  # - lcovPath kept at .coverage/lcov.info (Spur's `bun run test:coverage`
19
- # writes it via --coverage-dir=.coverage, and `bunfig.toml
20
- # [test] coverage = true` means a plain `bun run test` writes the same
21
- # artifact — so a TARGETED `bun test <file>` overwrites it with a partial
22
- # tracefile, and this rule then judges that partial data)
22
+ # publishes it after a completed run; bare TARGETED `bun test <file>` can
23
+ # still overwrite it with partial data, which the repository provenance
24
+ # wrapper refuses before this rule runs)
23
25
  # - include expanded to apps/** + packages/** (Spur tests cover both;
24
26
  # ts-libs only covers packages/**)
25
27
  # - threshold kept at 90 matching bunfig.toml coverageThreshold
@@ -78,7 +78,8 @@ rules:
78
78
  - "packages/app/src/services/history-anatomy.ts" # deterministic history-anatomy cache core (task 1005 R2): fsync'd tmp+rename atomic publish, readdir digest scans and sync report reads must stay byte-stable; bundled standalone for the bare-node plugin twin (mirrors agent-usage-producer.ts / history-service.ts exemptions)
79
79
  - "packages/app/src/observability/workflow-run-log-sink.ts" # sync FD append for mid-run tail-able all-in-one run log (task 0426 / feature D2); append() is sync from the observability bus
80
80
  - "packages/app/src/observability/agent-run-log.ts" # same primitive as the sink above for the per-run agent stream (task 1076 R1, ADR-132); append() is sync from the agent service's own onOutput hook, and the byte cap needs the FD position it tracks
81
- - "apps/cli/src/commands/workflow.ts" # FD byte-window tail of the mid-run run log for `workflow trace --follow` streaming (task 0428 / feature D2); readSync at offset over the observability sink's FDs
81
+ # commands/workflow.ts was split per verb (commands/workflow/<verb>.ts); the FD tail lives in trace.ts.
82
+ - "apps/cli/src/commands/workflow/trace.ts" # FD byte-window tail of the mid-run run log for `workflow trace --follow` streaming (task 0428 / feature D2); readSync at offset over the observability sink's FDs
82
83
  - "apps/web/src/modules/discover.ts" # Vite/Astro module scanner fallback under bun test
83
84
  - "packages/app/src/services/quality-gate.ts" # gate artifacts (log/findings/receipt) written directly; merged-fd gate log and fsync-free atomic writes must stay byte-stable; bundled standalone for the bare-node plugin twin (task 1006 R1; mirrors history-anatomy.ts)
84
85
  - "packages/app/src/workflow/feature-verification-run.ts" # the pass opens the run's single merged log fd (`openSync(path,'a')`) and mkdirs the run dir beside the receipt writer, exactly as the plugin entry did before the move; the fd cannot be expressed through the FileSystem seam (task 1176 R2; same class as the quality-gate exemption above)
@@ -99,8 +100,12 @@ rules:
99
100
  - "apps/cli/src/commands/serve.ts" # sync resolveServeCwd() directory validation before server startup (task 0805 R2); mirrors task.ts sync-template exemption
100
101
 
101
102
  # Synchronous template & workflow resolvers:
102
- - "apps/cli/src/commands/task.ts" # sync loadTemplateContent/Bodies callbacks
103
- - "packages/app/src/services/workflow-service.ts" # run-log/checkpoint reclamation realpath confinement (:988, :1014)
103
+ # commands/task.ts was split per verb (commands/task/<verb>.ts); the exempt fs use moved verbatim:
104
+ - "apps/cli/src/commands/task/shared.ts" # sync loadTemplateContent/Bodies callbacks
105
+ - "apps/cli/src/commands/task/batch-create.ts" # temp batch payload write + cleanup for `task batch-create` (moved verbatim from task.ts, same exemption)
106
+ # WorkflowAppService's class body was split into verb modules; the reclamation passes moved verbatim to workflow-clean-ops.ts.
107
+ - "packages/app/src/services/workflow-clean-ops.ts" # run-log/checkpoint reclamation realpath confinement (cleanRunLogs / cleanScratch, moved verbatim out of workflow-service.ts, same exemption)
108
+ - "packages/app/src/services/workflow-catalog-scan.ts" # `workflow list` catalogue scan (lstat/readdir newest-mtime walk) moved verbatim out of workflow-service.ts (same exemption)
104
109
  - "packages/app/src/workflow/run-record.ts" # confined sync run-record reads: realpath + fstat byte-window (moved from workflow-service.ts, 0962)
105
110
  - "apps/cli/src/release-ops.ts" # sync manifest/workspace reads + Bun.write rewrites inside the git release flow (task 0617); mirrors task.ts sync-template exemption
106
111
  - "apps/cli/src/version-carriers.ts" # sync manifest reads + Bun.write rewrites for registered release carriers (task 0854); mirrors release-ops.ts sync exemption
@@ -5,9 +5,15 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
5
5
  #
6
6
  # Part of the recommended-pre-check preset. Run:
7
7
  # spur rule run --preset recommended-pre-check
8
+ #
9
+ # Layout: single-file nouns live at commands/<noun>.ts; large nouns are split
10
+ # into commands/<noun>/{index.ts, <verb>.ts..., shared.ts} (one module per
11
+ # `spur <noun> <verb>`). Both shapes are covered below.
8
12
 
9
13
  include:
10
14
  - "apps/cli/src/commands/*.ts"
15
+ # Per-noun folders (commands/task/, commands/workflow/, commands/agent/).
16
+ - "apps/cli/src/commands/*/*.ts"
11
17
 
12
18
  exclude:
13
19
  # Not a command file: shared-options.ts is the option registry.
@@ -19,6 +25,9 @@ rules:
19
25
  Every CLI command file must export a registerXxxCommand(program, context)
20
26
  function matching the standard Commander.js wiring pattern.
21
27
  severity: error
28
+ exclude:
29
+ # Per-noun shared.ts holds helpers used by 2+ verbs; it registers nothing.
30
+ - "apps/cli/src/commands/*/shared.ts"
22
31
  evaluator:
23
32
  type: rg
24
33
  config:
@@ -31,6 +40,17 @@ rules:
31
40
  (ADR-091 envelope seam), toJson(), or JSON.stringify() to produce
32
41
  machine-readable output.
33
42
  severity: error
43
+ exclude:
44
+ # Per-noun index.ts only creates the noun and calls each verb's register
45
+ # function; it declares no options, so there is no --json to back.
46
+ - "apps/cli/src/commands/*/index.ts"
47
+ # Verbs that hand JSON rendering to the code that serializes it:
48
+ # doctor -> AgentService.doctor (spur-app); start/stop -> runAgentLifecycle
49
+ # in commands/agent/shared.ts (checked). loop declares no --json.
50
+ - "apps/cli/src/commands/agent/doctor.ts"
51
+ - "apps/cli/src/commands/agent/loop.ts"
52
+ - "apps/cli/src/commands/agent/start.ts"
53
+ - "apps/cli/src/commands/agent/stop.ts"
34
54
  evaluator:
35
55
  type: rg
36
56
  config:
@@ -4,23 +4,9 @@
4
4
  {
5
5
  "id": "agent-bare-binary-name",
6
6
  "wbs": "0536",
7
- "file": "packages/app/src/services/agent-service.ts",
7
+ "file": "packages/app/src/services/agent-resolver.ts",
8
8
  "keepsWorking": "a bare coding-agent binary name (codex, omp, claude with no matching agent.executors entry) remains a valid --agent value during the role transition, with a one-time warning emitted by warnBareBinaryOnce",
9
9
  "removalCondition": "no bare-binary --agent value remains in docs/, config/workflows/, or plugins/sp/ (scan for --agent <binary-name> usages against agent.executors names)"
10
- },
11
- {
12
- "id": "spec-without-executor-field",
13
- "wbs": "0537",
14
- "file": "apps/cli/src/commands/agent.ts",
15
- "keepsWorking": "a pre-existing agent spec carrying only type (no executor field) still drains: --agent <specId> falls back to the spec's coding-agent type instead of resolving a missing executor",
16
- "removalCondition": "every spec under .spur/agents/ records an executor field (scan .spur/agents/*.yaml for the key; re-materialize the demo team first)"
17
- },
18
- {
19
- "id": "agent-default-executor",
20
- "wbs": "0542",
21
- "file": "packages/app/src/services/agent-service.ts",
22
- "keepsWorking": "a configured executor name in agent.default still resolves during the transition, warned once by warnAgentDefaultExecutorOnce; the value domain moved to roles (recommended default: coder)",
23
- "removalCondition": "no agent.default value names an agent.executors entry (scan .spur/config.yaml and config/config.example.yaml against the agent.executors names)"
24
10
  }
25
11
  ]
26
12
  }
@@ -35,7 +35,7 @@ description: >
35
35
  Two-layer done gate (task 0292): this workflow's testing→done guard
36
36
  (`spur task check --as done`, F92 R3 — target-aware) is the FIRST gate.
37
37
  The CLI verdict guard (`packages/app/src/services/done-transition-guard.ts`)
38
- is the SECOND gate, invoked by `apps/cli/src/commands/task.ts` for every
38
+ is the SECOND gate, invoked by `apps/cli/src/commands/task/update.ts` for every
39
39
  `spur task update <wbs> done` call — it reads `.spur/run/<wbs>-verdict.json`
40
40
  and blocks non-PASS verdicts unless `--force-done --reason "<why>"` is
41
41
  supplied. The CLI gate covers the `--no-lifecycle` and adapter-unavailable
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
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",
@@ -26,5 +26,5 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
26
26
 
27
27
  ## Implementation
28
28
 
29
- Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (`bun run gate`, lint, typecheck, tests, `spur-check`, rules, citation checks) — a generic "verify before finishing" rule does not apply here.
29
+ Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (`bun run gate`, lint, typecheck, tests, `spur-check`, rules) — a generic "verify before finishing" rule does not apply here. The generator's own claim-verification pass (dev-operations §8, step 7: API/library claims get `<!-- src: … · HIGH|MEDIUM|LOW -->` citations) is part of the procedure, not a gate.
30
30