@gobing-ai/spur 0.3.58 → 0.3.60

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 (60) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +133 -0
  3. package/package.json +9 -9
  4. package/plugins/sp/plugin.json +1 -1
  5. package/schemas/spur-config.schema.json +0 -1
  6. package/spur.js +1188 -454
  7. package/web/_astro/BoardApp.BJs3l7O8.js +179 -0
  8. package/web/_astro/BoardApp.D8InuCYx.js +1 -0
  9. package/web/_astro/{TaskDetail.DHjEt5vl.js → TaskDetail.B0l1uzsB.js} +1 -1
  10. package/web/_astro/{arc.XgRC1Ij_.js → arc.DPruHC3P.js} +1 -1
  11. package/web/_astro/{architectureDiagram-3BPJPVTR.DOZWrfHc.js → architectureDiagram-3BPJPVTR.CuOqAck6.js} +1 -1
  12. package/web/_astro/{blockDiagram-GPEHLZMM.ClQnCGf_.js → blockDiagram-GPEHLZMM.Cxb7HDIA.js} +1 -1
  13. package/web/_astro/{c4Diagram-AAUBKEIU.CKCtUD0Y.js → c4Diagram-AAUBKEIU.Dw7wa-0S.js} +1 -1
  14. package/web/_astro/channel.XCf1DcsL.js +1 -0
  15. package/web/_astro/{chunk-2J33WTMH.c7J8OHq5.js → chunk-2J33WTMH.MECQitzo.js} +1 -1
  16. package/web/_astro/{chunk-4BX2VUAB.C-A1Dv27.js → chunk-4BX2VUAB.p3ofhIGE.js} +1 -1
  17. package/web/_astro/{chunk-55IACEB6.C4kGGALB.js → chunk-55IACEB6.BmQGsPZP.js} +1 -1
  18. package/web/_astro/{chunk-727SXJPM.Bith2NHt.js → chunk-727SXJPM.CwrK23OA.js} +1 -1
  19. package/web/_astro/{chunk-AQP2D5EJ.qeSXhsVY.js → chunk-AQP2D5EJ.CUKI_QXp.js} +1 -1
  20. package/web/_astro/{chunk-FMBD7UC4.DdQQnTAy.js → chunk-FMBD7UC4.7AtDgShM.js} +1 -1
  21. package/web/_astro/{chunk-ND2GUHAM.BZYQVeZd.js → chunk-ND2GUHAM.f_YJbTs3.js} +1 -1
  22. package/web/_astro/{chunk-QZHKN3VN.BiUWwHaV.js → chunk-QZHKN3VN.0q7V3gEg.js} +1 -1
  23. package/web/_astro/{classDiagram-4FO5ZUOK.OGRhcldh.js → classDiagram-4FO5ZUOK.C_hG3HMK.js} +1 -1
  24. package/web/_astro/{classDiagram-v2-Q7XG4LA2.OGRhcldh.js → classDiagram-v2-Q7XG4LA2.C_hG3HMK.js} +1 -1
  25. package/web/_astro/{cose-bilkent-S5V4N54A.DxYklM_j.js → cose-bilkent-S5V4N54A.vsaaaEMy.js} +1 -1
  26. package/web/_astro/{dagre-BM42HDAG.BSb2dEbo.js → dagre-BM42HDAG.BN7XFqQ4.js} +1 -1
  27. package/web/_astro/{diagram-2AECGRRQ.mOrItPK2.js → diagram-2AECGRRQ.ED6AfryZ.js} +1 -1
  28. package/web/_astro/{diagram-5GNKFQAL.C99r7J3C.js → diagram-5GNKFQAL.Dxllzg8R.js} +1 -1
  29. package/web/_astro/{diagram-KO2AKTUF.BKbnisJO.js → diagram-KO2AKTUF.RuWppieD.js} +1 -1
  30. package/web/_astro/{diagram-LMA3HP47.D8FJGo4V.js → diagram-LMA3HP47.CL32Xn6s.js} +1 -1
  31. package/web/_astro/{diagram-OG6HWLK6.DVBs7n4Q.js → diagram-OG6HWLK6.CUneEhqB.js} +1 -1
  32. package/web/_astro/{erDiagram-TEJ5UH35.CddMTl4l.js → erDiagram-TEJ5UH35.DI-92Lec.js} +1 -1
  33. package/web/_astro/{flowDiagram-I6XJVG4X.B7WclnjQ.js → flowDiagram-I6XJVG4X.69Aqa1FF.js} +1 -1
  34. package/web/_astro/{ganttDiagram-6RSMTGT7.CRh7ggvz.js → ganttDiagram-6RSMTGT7.DdpClZpa.js} +1 -1
  35. package/web/_astro/{gitGraphDiagram-PVQCEYII.du-L7V8A.js → gitGraphDiagram-PVQCEYII.xqWfkvB4.js} +1 -1
  36. package/web/_astro/index.DJl2RAVZ.css +1 -0
  37. package/web/_astro/{infoDiagram-5YYISTIA.CClGl9Px.js → infoDiagram-5YYISTIA.B3G5sfKm.js} +1 -1
  38. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BuTETIPz.js → ishikawaDiagram-YF4QCWOH.ahVNsoAQ.js} +1 -1
  39. package/web/_astro/{journeyDiagram-JHISSGLW.Cyg1zCiE.js → journeyDiagram-JHISSGLW.PmFHLc-X.js} +1 -1
  40. package/web/_astro/{kanban-definition-UN3LZRKU.aH8eDXwX.js → kanban-definition-UN3LZRKU.Co1qOPTd.js} +1 -1
  41. package/web/_astro/{linear.paE_RY_i.js → linear.DoHZ-iRt.js} +1 -1
  42. package/web/_astro/{mermaid.core.BhdKkI85.js → mermaid.core.DNRElYN2.js} +4 -4
  43. package/web/_astro/{mindmap-definition-RKZ34NQL.aZNfv8Nx.js → mindmap-definition-RKZ34NQL.CdfJZidJ.js} +1 -1
  44. package/web/_astro/{pieDiagram-4H26LBE5.5psni0hC.js → pieDiagram-4H26LBE5.C1A8dby4.js} +1 -1
  45. package/web/_astro/{quadrantDiagram-W4KKPZXB.DcGPGrFd.js → quadrantDiagram-W4KKPZXB.NmZqjG_c.js} +1 -1
  46. package/web/_astro/{requirementDiagram-4Y6WPE33.BwPD2lzi.js → requirementDiagram-4Y6WPE33.tY36zYtK.js} +1 -1
  47. package/web/_astro/{sankeyDiagram-5OEKKPKP.B3jGVk0l.js → sankeyDiagram-5OEKKPKP.rOEGZYjo.js} +1 -1
  48. package/web/_astro/{sequenceDiagram-3UESZ5HK.BdWsx3LW.js → sequenceDiagram-3UESZ5HK.Dpnw3S9J.js} +1 -1
  49. package/web/_astro/{stateDiagram-AJRCARHV.DRpG4ClZ.js → stateDiagram-AJRCARHV.DGpvQ3Wz.js} +1 -1
  50. package/web/_astro/{stateDiagram-v2-BHNVJYJU.Su0ML9Wo.js → stateDiagram-v2-BHNVJYJU.CbwQdEfu.js} +1 -1
  51. package/web/_astro/{timeline-definition-PNZ67QCA.Cg_Uv8A5.js → timeline-definition-PNZ67QCA.DAYUpUJT.js} +1 -1
  52. package/web/_astro/{vennDiagram-CIIHVFJN.DVouKT4b.js → vennDiagram-CIIHVFJN.C7JCCd6-.js} +1 -1
  53. package/web/_astro/{wardley-L42UT6IY.CexIVQli.js → wardley-L42UT6IY.BGgwOH5_.js} +1 -1
  54. package/web/_astro/{wardleyDiagram-YWT4CUSO.ChSAzcvx.js → wardleyDiagram-YWT4CUSO.oIZqzI2l.js} +1 -1
  55. package/web/_astro/{xychartDiagram-2RQKCTM6.CN-Yp50J.js → xychartDiagram-2RQKCTM6.DohcJzqm.js} +1 -1
  56. package/web/index.html +2 -2
  57. package/web/_astro/BoardApp.CrusGeQ4.js +0 -1
  58. package/web/_astro/BoardApp.P8SRAD5Q.js +0 -179
  59. package/web/_astro/channel.CmK546kO.js +0 -1
  60. package/web/_astro/index.B4x8fe52.css +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.3.58",
10
+ "version": "0.3.60",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -0,0 +1,133 @@
1
+ # Spur GLOBAL configuration — `~/.config/spur/config.yaml`
2
+ #
3
+ # Seeded here by `spur init` on first run (never overwritten once it exists — you
4
+ # own this file). It is the DEFAULT layer: every project's `.spur/config.yaml` is
5
+ # merged OVER it, so a project config only needs to carry its delta.
6
+ #
7
+ # Merge contract (A4 / config 1.2):
8
+ # - Both layers are validated by the SAME schema; each legitimately carries a subset.
9
+ # - The merge is total and automatic: project layer wins over global, key by key.
10
+ # - Validation runs ONCE, on the merged result — a partial entry here is a legal
11
+ # merge fragment, never a legal config on its own.
12
+ # - `agent.executors` merges by `name`: a project restating `- name: omp` with a
13
+ # different `model` overrides just that field and keeps the rest from here.
14
+ #
15
+ # Only machine-wide keys belong in this file. Project-shaped keys — `name`,
16
+ # `bootstrap`, `rules`, `redaction`, `tasks`, `features`, `agent.team` — resolve
17
+ # against a project's own folder structure and must stay in `.spur/config.yaml`.
18
+
19
+ $schema: "@gobing-ai/spur/schemas/spur-config.schema.json"
20
+
21
+ agent:
22
+ # `default` is the role used for `--agent auto` when the caller declares
23
+ # nothing (task 0542 R2 — the value domain moved from executor names to
24
+ # roles). A role id selects its tier's cheapest eligible executor; a
25
+ # configured executor name still resolves during the transition with a
26
+ # one-time warning (shim agent-default-executor); any other value fails
27
+ # naming both accepted sets.
28
+ default: coder
29
+
30
+ # Role → tier map. Resolution: role → tier → cheapest USABLE executor whose
31
+ # tier >= the role's tier, climbing the ladder across gaps. Keep at least one
32
+ # usable executor at or above each rung or that role fails loudly at dispatch.
33
+ # Stage floors (stage-registry model_policy): changelog=cheap;
34
+ # implement/test/wrap/review/refine/brainstorm=standard;
35
+ # verify/dogfood=capable-1; plan=capable-2. A stage's fallback ladder
36
+ # (auth / resource-exhaustion / gate-fail) only advances when a higher rung
37
+ # has a usable executor — an empty rung turns a quota failure into a hang.
38
+ #
39
+ # The vocabulary is CLOSED (task 0536): re-tier or re-stage these four, never
40
+ # invent a fifth — a config naming any other key fails at load naming the
41
+ # accepted four. A project may override per-field in its own `.spur/config.yaml`;
42
+ # restate only what you change.
43
+ #
44
+ # ADR-078: THIS TABLE IS THE SSOT. `DEFAULT_AGENT_ROLES` in
45
+ # `packages/config/src/index.ts` is a byte-identical fallback that applies only
46
+ # when no config layer supplies `agent.roles` at all (the CF-safe core must
47
+ # resolve roles with no filesystem). The two must stay byte-identical — a
48
+ # fallback that differed would turn a missing config file into a silent
49
+ # behavior change. `plugins/sp/tests/roles.test.ts` R9 gates all three
50
+ # projections (this table, the constant, and `plugins/sp/references/roles.md`).
51
+ roles:
52
+ scribe:
53
+ tier: cheap
54
+ stages: [changelog]
55
+ coder:
56
+ tier: standard
57
+ stages: [implement, test, wrap]
58
+ reviewer:
59
+ tier: capable-1
60
+ stages: [verify, review, dogfood]
61
+ planner:
62
+ tier: capable-2
63
+ stages: [plan, refine, brainstorm]
64
+
65
+ # Canonical coding-agent ids (ts-ai-runner DISPLAY_ORDER, 0.4.8+):
66
+ # claude, codex, gemini, pi, omp, opencode, antigravity-cli,
67
+ # openclaw, hermes, grok
68
+ # Grok auth: non-empty XAI_API_KEY and/or ~/.grok/auth.json (no CLI
69
+ # auth-status verb).
70
+
71
+ # Named executor profiles (ADR-033 / 0343). Each pairs a canonical agent with
72
+ # an explicit model override and an explicit capability tier.
73
+ # `model` is pinned on every entry: omitting it defers to the agent CLI's own
74
+ # default, which drifts with CLI upgrades and account state — pin what your
75
+ # CLI would resolve today (`grok models`, omp config.yml modelRoles.default,
76
+ # ~/.codex/config.toml, ~/.claude.json). The ids below are working examples,
77
+ # not vendor defaults — re-pin for your accounts.
78
+ #
79
+ # Pairing philosophy (operator guidance, 2026-08): a `native` pair — a vendor's
80
+ # model served by that vendor's own CLI (gpt-5.6-* via codex, claude-*-5 via
81
+ # claude, grok-4.6 via grok, gemini-3.x via agy) — consistently outperforms the
82
+ # same model routed through a third-party CLI, and belongs at the capable rungs.
83
+ # `portable` models (glm-5.x, deepseek-v4-*, …) are provider-agnostic and best
84
+ # carried by omp or pi at the cheap/standard rungs. The ladder below mixes both
85
+ # classes on purpose; measure pairings with the history plane before promoting
86
+ # a portable model into a capable rung.
87
+ # Live tiers: cheap | standard | capable-1 | capable-2 | capable-3
88
+ # (1=low quality within capable, 3=high). DECLARE tier — inference never
89
+ # invents capable-2/3. Stage routing starts on the cheapest executor whose
90
+ # tier >= min_tier; same exact tier ties break by array order.
91
+ # Legacy bare `capable` is accepted at runtime as synonym for capable-1.
92
+ #
93
+ # Because this is the global layer, a project that wants one different model
94
+ # writes only `- name: omp` + `model: …` — the agent and tier come from here.
95
+ executors:
96
+ # cheap rung is optional: with none declared, scribe-role work starts one
97
+ # rung up at the cheapest standard executor. Add one when transcript-heavy
98
+ # mechanical commands (changelog/gitmsg/handover) get noisy on cost.
99
+ # - name: minimax
100
+ # agent: omp
101
+ # model: minimax/MiniMax-M3
102
+ # tier: cheap
103
+ - name: omp
104
+ agent: omp
105
+ model: opencode/deepseek-v4-flash
106
+ tier: standard
107
+ - name: pi
108
+ agent: pi
109
+ model: "k3"
110
+ tier: capable-1
111
+ - name: grok
112
+ agent: grok
113
+ model: grok-4.6
114
+ tier: capable-2
115
+ - name: claude
116
+ agent: claude
117
+ model: k3
118
+ tier: capable-3
119
+ - name: codex
120
+ agent: codex
121
+ model: gpt-5.6
122
+ tier: capable-3
123
+
124
+ # `workflows.paths` is deliberately NOT set here. Its values are search paths
125
+ # resolved against a project's own root (0639 classifies it project-relative), so
126
+ # a machine-wide value would point every project at a directory that mostly does
127
+ # not exist. The global workflow tree is already reachable without it: the
128
+ # lifecycle adapter resolves bundled → project `.spur/workflows/` →
129
+ # `~/.config/spur/workflows/` on its own (make-lifecycle-adapter.ts:44).
130
+ # Set it per project when a project keeps workflows somewhere non-standard.
131
+ # workflows:
132
+ # paths:
133
+ # - .spur/workflows/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.58",
3
+ "version": "0.3.60",
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",
@@ -53,14 +53,14 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@commander-js/extra-typings": "^14.0.0",
56
- "@gobing-ai/ts-db": "^0.4.41",
57
- "@gobing-ai/ts-ai-runner": "^0.4.41",
58
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.41",
59
- "@gobing-ai/ts-infra": "^0.4.41",
60
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.41",
61
- "@gobing-ai/ts-rule-engine": "^0.4.41",
62
- "@gobing-ai/ts-runtime": "^0.4.41",
63
- "@gobing-ai/ts-utils": "^0.4.41",
56
+ "@gobing-ai/ts-db": "^0.4.42",
57
+ "@gobing-ai/ts-ai-runner": "^0.4.42",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.42",
59
+ "@gobing-ai/ts-infra": "^0.4.42",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.42",
61
+ "@gobing-ai/ts-rule-engine": "^0.4.42",
62
+ "@gobing-ai/ts-runtime": "^0.4.42",
63
+ "@gobing-ai/ts-utils": "^0.4.42",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.58",
3
+ "version": "0.3.60",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
5
5
  "extensions": {
6
6
  "pi": ["./hooks/pi/guard-extension.ts"]
@@ -4,7 +4,6 @@
4
4
  "title": "Spur Project Configuration",
5
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
- "required": ["version", "name"],
8
7
  "properties": {
9
8
  "$schema": {
10
9
  "type": "string",