@gobing-ai/spur 0.3.78 → 0.3.81
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/config.example.yaml +29 -18
- package/config/config.global.yaml +10 -11
- package/config/pipeline-budgets.json +34 -2
- package/config/plugin-scripts.json +25 -0
- package/config/rules/boundary/config-loading-ownership.yaml +0 -3
- package/config/rules/boundary/dao-boundary.yaml +4 -17
- package/config/rules/boundary/planning-folder-hardcode.yaml +0 -1
- package/config/rules/boundary/sp-no-vendor-refs.yaml +3 -2
- package/config/rules/boundary/sp-runtime-path.yaml +3 -14
- package/config/rules/quality/coverage-gate.yaml +3 -14
- package/config/rules/quality/tsdoc-exports.yaml +4 -7
- package/config/rules/strict/http-boundaries.yaml +5 -8
- package/config/rules/strict/runtime-boundaries.yaml +1 -5
- package/config/rules/structure/protected-files.yaml +9 -3
- package/config/rules/structure/test-focus-skip.yaml +0 -2
- package/config/rules/structure/test-location.yaml +0 -5
- package/config/rules/surface/check-cli-surface.yaml +3 -2
- package/config/rules/typescript/bun-tooling.yaml +5 -7
- package/config/rules/typescript/guarded-happy-dom-register.yaml +0 -2
- package/config/rules/typescript/happy-dom-teardown.yaml +0 -2
- package/config/rules/typescript/no-biome-suppressions.yaml +0 -2
- package/config/rules/typescript/no-debugger.yaml +0 -2
- package/config/rules/typescript/no-eslint-suppressions.yaml +0 -4
- package/config/rules/typescript/no-leaky-module-mocks.yaml +6 -13
- package/config/rules/typescript/no-module-scope-import-calls.yaml +0 -2
- package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +0 -3
- package/config/rules/typescript/no-unmocked-module-eval-side-effects.yaml +0 -3
- package/config/rules/typescript/output-boundaries.yaml +0 -3
- package/config/rules/typescript/prefer-accessible-role-for-button-queries.yaml +0 -3
- package/config/rules/ui/ui-import-boundary.yaml +1 -5
- package/config/templates/AGENTS.md +26 -23
- package/config/templates/docs/00_ADR.md +13 -23
- package/config/templates/docs/01_PRD.md +5 -2
- package/config/templates/docs/02_ROADMAP.md +9 -13
- package/config/templates/docs/03_ARCHITECTURE.md +2 -2
- package/config/templates/docs/04_DESIGN.md +12 -31
- package/config/templates/docs/05_FEATURES.md +6 -18
- package/config/templates/docs/99_PROJECT_CONSTITUTION.md +162 -394
- package/config/transition-shims.json +7 -7
- package/config/workflows/basic.yaml +4 -0
- package/config/workflows/docs-pipeline.yaml +13 -14
- package/config/workflows/feature-dev.yaml +20 -65
- package/config/workflows/history-anatomy.yaml +22 -1
- package/config/workflows/idea-pipeline.yaml +53 -97
- package/config/workflows/pr-review.yaml +21 -33
- package/config/workflows/task-pipeline.yaml +87 -330
- package/config/workflows/wayfinder-resolution.yaml +12 -26
- package/config/workflows/wrapup-pipeline.yaml +48 -189
- package/package.json +9 -9
- package/plugins/sp/README.md +22 -8
- package/plugins/sp/agents/expert-spur.md +41 -19
- package/plugins/sp/agents/super-reviewer.md +43 -8
- package/plugins/sp/lib/idea-handoff.generated.d.mts +17 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +1301 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/feature-dev-precheck.mjs +146 -0
- package/plugins/sp/scripts/feature-dev-precheck.ts +238 -0
- package/plugins/sp/scripts/idea-handoff.mjs +27 -0
- package/plugins/sp/scripts/idea-handoff.ts +44 -0
- package/plugins/sp/scripts/quality-gate.mjs +165 -0
- package/plugins/sp/scripts/quality-gate.ts +217 -0
- package/plugins/sp/scripts/verify-answer-lint.ts +21 -3
- package/plugins/sp/scripts/workflow-step-profile.mjs +319 -0
- package/plugins/sp/scripts/workflow-step-profile.ts +456 -0
- package/plugins/sp/scripts/wrapup-steps.mjs +350 -0
- package/plugins/sp/scripts/wrapup-steps.ts +466 -0
- package/plugins/sp/skills/conflict-finding/SKILL.md +6 -0
- package/plugins/sp/skills/daily-summary/SKILL.md +1 -1
- package/plugins/sp/skills/doc-evolve/SKILL.md +26 -40
- package/plugins/sp/skills/doc-evolve/references/operations.md +17 -30
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +29 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +56 -14
- package/plugins/sp/skills/spur-cli/references/message.md +30 -3
- package/plugins/sp/skills/spur-cli/references/projects.md +45 -1
- package/plugins/sp/skills/spur-cli/references/self.md +5 -4
- package/plugins/sp/skills/spur-cli/references/serve.md +5 -4
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +17 -1
- package/plugins/sp/skills/spur-cli/references/tasks.md +32 -2
- package/plugins/sp/skills/spur-cli/references/team.md +21 -1
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +6 -3
- package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +57 -18
- package/plugins/sp/skills/spur-composer/SKILL.md +145 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +14 -0
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +3 -3
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +12 -0
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +46 -4
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +24 -0
- package/plugins/sp/skills/spur-doctor/SKILL.md +138 -0
- package/plugins/sp/skills/taste-refactoring-api/README.md +43 -0
- package/plugins/sp/skills/taste-refactoring-api/SKILL.md +334 -0
- package/plugins/sp/skills/taste-refactoring-api/checklists/daily-api-review.md +71 -0
- package/plugins/sp/skills/taste-refactoring-api/examples/refactor-example.md +72 -0
- package/plugins/sp/skills/taste-refactoring-api/examples/review-template.md +93 -0
- package/plugins/sp/skills/taste-refactoring-api/references/api-refactoring-playbook.md +253 -0
- package/plugins/sp/skills/taste-refactoring-api/references/protocol-modes.md +79 -0
- package/plugins/sp/skills/taste-refactoring-api/references/research-basis.md +58 -0
- package/plugins/sp/skills/taste-refactoring-architect/README.md +26 -0
- package/plugins/sp/skills/taste-refactoring-architect/SKILL.md +471 -0
- package/plugins/sp/skills/taste-refactoring-architect/checklists/daily-architecture-review.md +48 -0
- package/plugins/sp/skills/taste-refactoring-architect/examples/refactor-example.md +55 -0
- package/plugins/sp/skills/taste-refactoring-architect/examples/review-template.md +51 -0
- package/plugins/sp/skills/taste-refactoring-architect/references/architecture-refactoring-playbook.md +173 -0
- package/plugins/sp/skills/taste-refactoring-architect/references/research-basis.md +28 -0
- package/plugins/sp/skills/taste-refactoring-tests/README.md +28 -0
- package/plugins/sp/skills/taste-refactoring-tests/SKILL.md +482 -0
- package/plugins/sp/skills/taste-refactoring-tests/checklists/daily-test-review.md +39 -0
- package/plugins/sp/skills/taste-refactoring-tests/examples/refactor-example.md +85 -0
- package/plugins/sp/skills/taste-refactoring-tests/examples/review-template.md +59 -0
- package/plugins/sp/skills/taste-refactoring-tests/references/research-basis.md +47 -0
- package/plugins/sp/skills/taste-refactoring-tests/references/test-refactoring-playbook.md +222 -0
- package/plugins/sp/skills/taste-refactoring-ui/README.md +12 -0
- package/plugins/sp/skills/taste-refactoring-ui/SKILL.md +290 -0
- package/plugins/sp/skills/taste-refactoring-ui/checklists/daily-ui-review.md +72 -0
- package/plugins/sp/skills/taste-refactoring-ui/examples/review-template.md +51 -0
- package/plugins/sp/skills/taste-refactoring-ui/references/refactoring-ui-playbook.md +170 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +2 -2
- package/plugins/sp/skills/wayfinder/references/pipeline-resolution.md +30 -0
- package/schemas/spur-config.schema.json +49 -0
- package/spur.js +46936 -44198
- package/web/_astro/{BoardApp.CHQ1lycZ.js → BoardApp.B1U26g3I.js} +97 -95
- package/web/_astro/BoardApp.Csgyg-lS.js +1 -0
- package/web/_astro/{TaskDetail.GKfQJ60c.js → TaskDetail.DwPqpq7v.js} +1 -1
- package/web/_astro/{arc.DWEtA3Tx.js → arc.CweZEjN2.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.DB42oWmP.js → architectureDiagram-3BPJPVTR.D89pbDuv.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.rhv-zNQV.js → blockDiagram-GPEHLZMM.BOuTeEpX.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.Ci4-4VvY.js → c4Diagram-AAUBKEIU.CASbkWZF.js} +1 -1
- package/web/_astro/channel.Cx6sXxhq.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.Cc9veUgf.js → chunk-2J33WTMH.BKQYtOvY.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.Bec9c4eI.js → chunk-4BX2VUAB.9sHLdMtG.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DoV8S1iB.js → chunk-55IACEB6.wOLXWlPs.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DwR-Qlyj.js → chunk-727SXJPM.DovFbwg3.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.ND_a81WY.js → chunk-AQP2D5EJ.B1Weod1X.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.Wv_jwG48.js → chunk-FMBD7UC4.TEMS04st.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.CXKXCMmp.js → chunk-ND2GUHAM.Cp8VT1wQ.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.nkaoNYQq.js → chunk-QZHKN3VN.BzATdEcP.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.cMQcVlQu.js → classDiagram-4FO5ZUOK.C9BOCfAO.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.cMQcVlQu.js → classDiagram-v2-Q7XG4LA2.C9BOCfAO.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.OaDJ7Mr2.js → cose-bilkent-S5V4N54A.DUnr4UAw.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.Chi8IphF.js → cynefin-OW5HDTMX.rYq5uM3D.js} +1 -1
- package/web/_astro/{cytoscape.esm.DzSz-X2X.js → cytoscape.esm.BB4DxJjf.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.CzK2t_Fp.js → dagre-BM42HDAG.CWeNKe3I.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DRvxlVS7.js → diagram-2AECGRRQ.DCkfls10.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.CnYvNdwA.js → diagram-5GNKFQAL.D5U4JCka.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.CpLpMw5R.js → diagram-KO2AKTUF.BZJgqaqG.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.JTb78qUA.js → diagram-LMA3HP47.DoMeHvPR.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Bk-1jDIb.js → diagram-OG6HWLK6.B50qwwWX.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.D8hN9GZq.js → erDiagram-TEJ5UH35.DdGPG6LK.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.-6zQr6m5.js → flowDiagram-I6XJVG4X.QP2MJ12u.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DboLQ9ca.js → ganttDiagram-6RSMTGT7.BI6LgKSy.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.4tYvJKGR.js → gitGraphDiagram-PVQCEYII.npPZiC2G.js} +1 -1
- package/web/_astro/index.DayyIngm.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.Bd9rXpsB.js → infoDiagram-5YYISTIA.DCJCBVbp.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CvMoaf67.js → ishikawaDiagram-YF4QCWOH.BMLV-3I1.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.Ccy1CA7y.js → journeyDiagram-JHISSGLW.LE58crde.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.0MaMqHNS.js → kanban-definition-UN3LZRKU.BPbz8rH9.js} +1 -1
- package/web/_astro/{linear.CHXgcIbN.js → linear.DhZaBtYh.js} +1 -1
- package/web/_astro/{mermaid.core.Ca-kcelG.js → mermaid.core.BD5-jXum.js} +6 -6
- package/web/_astro/{mindmap-definition-RKZ34NQL.BUIDlHa0.js → mindmap-definition-RKZ34NQL.MTJyrQ65.js} +1 -1
- package/web/_astro/ordinal.BYWQX77i.js +1 -0
- package/web/_astro/{pieDiagram-4H26LBE5.2dX3CU1s.js → pieDiagram-4H26LBE5.BrDhDvIS.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.B3LBlRiv.js → quadrantDiagram-W4KKPZXB.71d73_5N.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.X12I2uNx.js → requirementDiagram-4Y6WPE33.Bga6UF-z.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.BXohIHqx.js → sankeyDiagram-5OEKKPKP.BnHs4K82.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.C37ZIUzg.js → sequenceDiagram-3UESZ5HK.DsfY2gnj.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BRgz317z.js → stateDiagram-AJRCARHV.DvsTSc9a.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.7VYSXN9-.js → stateDiagram-v2-BHNVJYJU.DxzzmHUR.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BVNz_HiN.js → timeline-definition-PNZ67QCA.4ZuQmOTt.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.CHVDkPX4.js → vennDiagram-CIIHVFJN.Ck5Q86SG.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.EQQ_qT9v.js → wardleyDiagram-YWT4CUSO.BK7k2hXr.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DrAT9WoP.js → xychartDiagram-2RQKCTM6.DfCrgauK.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.DV9kx0wo.js +0 -1
- package/web/_astro/channel.BAI6xLeV.js +0 -1
- package/web/_astro/index.Dcr_8fiK.css +0 -1
- package/web/_astro/ordinal.DBvzRdQf.js +0 -1
|
@@ -180,24 +180,24 @@ agent:
|
|
|
180
180
|
# dev-run: omp
|
|
181
181
|
# dev-review: claude
|
|
182
182
|
|
|
183
|
-
#
|
|
184
|
-
#
|
|
185
|
-
#
|
|
186
|
-
#
|
|
187
|
-
#
|
|
188
|
-
#
|
|
189
|
-
#
|
|
190
|
-
#
|
|
191
|
-
#
|
|
192
|
-
#
|
|
193
|
-
#
|
|
194
|
-
#
|
|
195
|
-
#
|
|
196
|
-
#
|
|
197
|
-
#
|
|
198
|
-
#
|
|
199
|
-
#
|
|
200
|
-
#
|
|
183
|
+
# A project's agent roster is a **fleet** declared in the project's own tree,
|
|
184
|
+
# not in this file: `<projectPath>/.spur/fleet.json` (ADR-116, task 0835).
|
|
185
|
+
# Materialized at `spur serve` start; preview with `spur projects list --fleet`.
|
|
186
|
+
# Shape (version is pinned; a member declares role or executor):
|
|
187
|
+
# {
|
|
188
|
+
# "version": 1,
|
|
189
|
+
# "members": [
|
|
190
|
+
# { "role": "planner", "purpose": "orchestrator" },
|
|
191
|
+
# { "role": "coder", "executor": "omp" },
|
|
192
|
+
# { "role": "reviewer", "enabled": false }
|
|
193
|
+
# ],
|
|
194
|
+
# "orchestrator": "planner-1"
|
|
195
|
+
# }
|
|
196
|
+
# `enabled: false` keeps the member's derived `<role>-<n>` id index, so later
|
|
197
|
+
# members never silently reallocate ids. The legacy `agent.team.<teamId>`
|
|
198
|
+
# config key still parses — the `spur team` noun is deprecated, not removed —
|
|
199
|
+
# but the roster is keyed on the worktree path now, not on a config-global
|
|
200
|
+
# team name.
|
|
201
201
|
|
|
202
202
|
rules:
|
|
203
203
|
paths:
|
|
@@ -210,6 +210,17 @@ workflows:
|
|
|
210
210
|
redaction:
|
|
211
211
|
enabled: false
|
|
212
212
|
|
|
213
|
+
# ── Release (spur builder bump-ver / drop-tags) ──
|
|
214
|
+
# Optional. Release plumbing knobs for `spur builder bump-ver` / `drop-tags`;
|
|
215
|
+
# every value defaults as shown, so an absent section keeps default behavior.
|
|
216
|
+
# builder:
|
|
217
|
+
# bump-ver:
|
|
218
|
+
# tagVersionSeparator: "-v"
|
|
219
|
+
# publishWorkflow: publish.yml
|
|
220
|
+
# releaseCommitType: chore
|
|
221
|
+
# releaseCommitScope: release
|
|
222
|
+
# ghRunListLimit: 5
|
|
223
|
+
|
|
213
224
|
# ── Planning (design §2.1 / §9) ──
|
|
214
225
|
tasks:
|
|
215
226
|
active: docs/tasks
|
|
@@ -17,8 +17,11 @@
|
|
|
17
17
|
# here.
|
|
18
18
|
#
|
|
19
19
|
# Only machine-wide keys belong in this file. Project-shaped keys — `name`,
|
|
20
|
-
# `bootstrap`, `rules`, `redaction`, `tasks`, `features
|
|
21
|
-
#
|
|
20
|
+
# `bootstrap`, `rules`, `redaction`, `tasks`, `features` — resolve against a
|
|
21
|
+
# project's own folder structure and must stay in `.spur/config.yaml`. The agent
|
|
22
|
+
# roster is not a config key at all any more: it is `<projectPath>/.spur/fleet.json`
|
|
23
|
+
# (ADR-116, task 0835). The legacy `agent.team` key still parses; the `spur team`
|
|
24
|
+
# noun is deprecated (0848).
|
|
22
25
|
|
|
23
26
|
$schema: "@gobing-ai/spur/schemas/spur-config.schema.json"
|
|
24
27
|
|
|
@@ -132,13 +135,9 @@ agent:
|
|
|
132
135
|
model: gpt-5.6
|
|
133
136
|
tier: capable-3
|
|
134
137
|
|
|
135
|
-
#
|
|
136
|
-
#
|
|
137
|
-
#
|
|
138
|
-
#
|
|
139
|
-
# concatenates over this (loader merge), and the run-time adapter resolves
|
|
140
|
-
# bundled → project on its own (make-lifecycle-adapter.ts, two tiers since
|
|
141
|
-
# task 0648).
|
|
138
|
+
# Workflow layers (ADR-113): the project layer is always `<cwd>/.spur/workflows`
|
|
139
|
+
# and the shared layer is the installed package's own `config/workflows`, so no
|
|
140
|
+
# config entry is needed to discover the shipped workflows. A project registers
|
|
141
|
+
# extra workflow folders by concatenating them here (loader merge):
|
|
142
142
|
workflows:
|
|
143
|
-
paths:
|
|
144
|
-
- bundled:workflows
|
|
143
|
+
paths: []
|
|
@@ -11,11 +11,15 @@
|
|
|
11
11
|
"decision": null
|
|
12
12
|
},
|
|
13
13
|
"idea-pipeline": {
|
|
14
|
-
"modelQueries":
|
|
14
|
+
"modelQueries": 6,
|
|
15
15
|
"wallClockMs": 7200000,
|
|
16
16
|
"tokenCostUsd": null,
|
|
17
17
|
"source": "No fixture (0607 option a). Real-run reading (R5): median ~435s, max-sane 8.8h (n=37). Budget = 2h gross-regression ceiling; authoritative fixture measurement pending (operator command in 0607 Solution).",
|
|
18
|
-
"decision":
|
|
18
|
+
"decision": {
|
|
19
|
+
"date": "2026-09-12",
|
|
20
|
+
"wbs": "0826",
|
|
21
|
+
"note": "I21 closeout: operator requested completion of the remaining items before commit. Reconcile the stale 5-query budget with the six existing stages: discovery, feature-create, ac-generate, system-design, decompose and ready-prepare (0788). Gates and corpus creation separate these judgments; preserve ready preparation and add no dispatch. Static live-count regression now guards the ceiling. Wall-clock and cost limits are unchanged."
|
|
22
|
+
}
|
|
19
23
|
},
|
|
20
24
|
"wrapup-pipeline": {
|
|
21
25
|
"modelQueries": 1,
|
|
@@ -41,6 +45,34 @@
|
|
|
41
45
|
"tokenCostUsd": null,
|
|
42
46
|
"source": "Zero-query pipeline (the live definition declares no model queries); query budget trivially 0 — the gate handles an empty list (0607 R3). No real full run recorded; wall-clock unenforced.",
|
|
43
47
|
"decision": null
|
|
48
|
+
},
|
|
49
|
+
"history-anatomy": {
|
|
50
|
+
"modelQueries": 4,
|
|
51
|
+
"wallClockMs": null,
|
|
52
|
+
"tokenCostUsd": null,
|
|
53
|
+
"source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
|
|
54
|
+
"decision": null
|
|
55
|
+
},
|
|
56
|
+
"feature-dev": {
|
|
57
|
+
"modelQueries": 2,
|
|
58
|
+
"wallClockMs": null,
|
|
59
|
+
"tokenCostUsd": null,
|
|
60
|
+
"source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
|
|
61
|
+
"decision": null
|
|
62
|
+
},
|
|
63
|
+
"wayfinder-resolution": {
|
|
64
|
+
"modelQueries": 2,
|
|
65
|
+
"wallClockMs": null,
|
|
66
|
+
"tokenCostUsd": null,
|
|
67
|
+
"source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
|
|
68
|
+
"decision": null
|
|
69
|
+
},
|
|
70
|
+
"basic": {
|
|
71
|
+
"modelQueries": 1,
|
|
72
|
+
"wallClockMs": null,
|
|
73
|
+
"tokenCostUsd": null,
|
|
74
|
+
"source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
|
|
75
|
+
"decision": null
|
|
44
76
|
}
|
|
45
77
|
}
|
|
46
78
|
}
|
|
@@ -26,11 +26,26 @@
|
|
|
26
26
|
"contract": "standard",
|
|
27
27
|
"twin": "dogfood-testing/validate-report.mjs"
|
|
28
28
|
},
|
|
29
|
+
{
|
|
30
|
+
"rel": "feature-dev-precheck.ts",
|
|
31
|
+
"contract": "standard",
|
|
32
|
+
"twin": "feature-dev-precheck.mjs"
|
|
33
|
+
},
|
|
29
34
|
{
|
|
30
35
|
"rel": "feature-sync-bounded.ts",
|
|
31
36
|
"contract": "standard",
|
|
32
37
|
"twin": "feature-sync-bounded.mjs"
|
|
33
38
|
},
|
|
39
|
+
{
|
|
40
|
+
"rel": "idea-handoff.ts",
|
|
41
|
+
"contract": "standard",
|
|
42
|
+
"twin": "idea-handoff.mjs"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"rel": "wrapup-steps.ts",
|
|
46
|
+
"contract": "standard",
|
|
47
|
+
"twin": "wrapup-steps.mjs"
|
|
48
|
+
},
|
|
34
49
|
{
|
|
35
50
|
"rel": "history-anatomy-cache.ts",
|
|
36
51
|
"contract": "standard",
|
|
@@ -49,6 +64,11 @@
|
|
|
49
64
|
"contract": "standard",
|
|
50
65
|
"twin": "pr-reviewing.mjs"
|
|
51
66
|
},
|
|
67
|
+
{
|
|
68
|
+
"rel": "quality-gate.ts",
|
|
69
|
+
"contract": "standard",
|
|
70
|
+
"twin": "quality-gate.mjs"
|
|
71
|
+
},
|
|
52
72
|
{
|
|
53
73
|
"rel": "script-contract-check.ts",
|
|
54
74
|
"contract": "repo-only"
|
|
@@ -84,6 +104,11 @@
|
|
|
84
104
|
{
|
|
85
105
|
"rel": "validate-flag-contracts.ts",
|
|
86
106
|
"contract": "repo-only"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"rel": "workflow-step-profile.ts",
|
|
110
|
+
"contract": "standard",
|
|
111
|
+
"twin": "workflow-step-profile.mjs"
|
|
87
112
|
}
|
|
88
113
|
]
|
|
89
114
|
}
|
|
@@ -29,7 +29,6 @@ rules:
|
|
|
29
29
|
- "packages/**/src/**/*.ts"
|
|
30
30
|
exclude:
|
|
31
31
|
- "packages/config/src/**"
|
|
32
|
-
- "**/node_modules/**"
|
|
33
32
|
- "**/tests/**"
|
|
34
33
|
|
|
35
34
|
- id: no-legacy-tasks-config-jsonc
|
|
@@ -50,7 +49,6 @@ rules:
|
|
|
50
49
|
- "apps/**/src/**/*.tsx"
|
|
51
50
|
- "packages/**/src/**/*.ts"
|
|
52
51
|
exclude:
|
|
53
|
-
- "**/node_modules/**"
|
|
54
52
|
- "**/tests/**"
|
|
55
53
|
|
|
56
54
|
- id: spur-config-loader-only-at-composition-roots
|
|
@@ -71,5 +69,4 @@ rules:
|
|
|
71
69
|
- "apps/cli/src/index.ts"
|
|
72
70
|
- "apps/server/src/serve.ts"
|
|
73
71
|
- "apps/server/src/context.ts"
|
|
74
|
-
- "**/node_modules/**"
|
|
75
72
|
- "**/tests/**"
|
|
@@ -24,8 +24,6 @@ rules:
|
|
|
24
24
|
- "packages/config/src/**/*.ts"
|
|
25
25
|
- "packages/contracts/src/**/*.ts"
|
|
26
26
|
exclude:
|
|
27
|
-
- "**/node_modules/**"
|
|
28
|
-
- "**/tests/**"
|
|
29
27
|
# apps/cli/src/index.ts carries a side-effect import of ts-db as a
|
|
30
28
|
# bundler hint for Bun --compile. The import does not use ts-db APIs;
|
|
31
29
|
# it ensures the dynamic import('@gobing-ai/ts-db') calls from within
|
|
@@ -53,10 +51,9 @@ rules:
|
|
|
53
51
|
include:
|
|
54
52
|
- "apps/**/src/**/*.ts"
|
|
55
53
|
- "packages/**/src/**/*.ts"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
- "**/tests/**"
|
|
54
|
+
# (no schema/** exemption: schema files author via defineTable and
|
|
55
|
+
# import zero drizzle modules today — verified by strip probe)
|
|
56
|
+
exclude: []
|
|
60
57
|
|
|
61
58
|
- id: tables-via-defineTable
|
|
62
59
|
description: >
|
|
@@ -71,9 +68,6 @@ rules:
|
|
|
71
68
|
include:
|
|
72
69
|
- "apps/**/src/**/*.ts"
|
|
73
70
|
- "packages/**/src/**/*.ts"
|
|
74
|
-
exclude:
|
|
75
|
-
- "**/node_modules/**"
|
|
76
|
-
- "**/tests/**"
|
|
77
71
|
|
|
78
72
|
- id: no-hand-written-ddl-for-drizzle-tables
|
|
79
73
|
description: >
|
|
@@ -92,9 +86,8 @@ rules:
|
|
|
92
86
|
- "apps/**/src/**/*.ts"
|
|
93
87
|
- "packages/**/src/**/*.ts"
|
|
94
88
|
exclude:
|
|
89
|
+
# the CLI migration journal — 43 DDL statements (verified load-bearing)
|
|
95
90
|
- "packages/domain/src/migrations.ts"
|
|
96
|
-
- "**/node_modules/**"
|
|
97
|
-
- "**/tests/**"
|
|
98
91
|
|
|
99
92
|
- id: raw-sql-only-in-domain
|
|
100
93
|
description: >
|
|
@@ -111,9 +104,6 @@ rules:
|
|
|
111
104
|
- "packages/app/src/**/*.ts"
|
|
112
105
|
- "packages/config/src/**/*.ts"
|
|
113
106
|
- "packages/contracts/src/**/*.ts"
|
|
114
|
-
exclude:
|
|
115
|
-
- "**/node_modules/**"
|
|
116
|
-
- "**/tests/**"
|
|
117
107
|
|
|
118
108
|
- id: no-sql-text-imports
|
|
119
109
|
description: >
|
|
@@ -128,6 +118,3 @@ rules:
|
|
|
128
118
|
include:
|
|
129
119
|
- "apps/**/src/**/*.ts"
|
|
130
120
|
- "packages/**/src/**/*.ts"
|
|
131
|
-
exclude:
|
|
132
|
-
- "**/node_modules/**"
|
|
133
|
-
- "**/tests/**"
|
|
@@ -12,8 +12,9 @@ include:
|
|
|
12
12
|
- "plugins/sp/**/*.json"
|
|
13
13
|
- "plugins/sp/**/*.ts"
|
|
14
14
|
exclude:
|
|
15
|
-
-
|
|
16
|
-
|
|
15
|
+
# skill-structure.test.ts legitimately names vendors/ paths in its R20
|
|
16
|
+
# structural assertions; no other plugins/sp test does (verified 2026-09).
|
|
17
|
+
- "plugins/sp/tests/skill-structure.test.ts"
|
|
17
18
|
rules:
|
|
18
19
|
- id: sp-no-vendor-refs
|
|
19
20
|
description: >
|
|
@@ -19,22 +19,11 @@ include:
|
|
|
19
19
|
- "packages/**"
|
|
20
20
|
- "plugins/sp/**"
|
|
21
21
|
exclude:
|
|
22
|
-
- "**/node_modules/**"
|
|
23
|
-
- "**/dist/**"
|
|
24
|
-
# `.pi-lens/cache/` holds autogenerated project snapshots (absolute paths that
|
|
25
|
-
# legitimately contain `config/...` substrings). Not source — exclude to avoid
|
|
26
|
-
# triaging snapshot noise every pre-check.
|
|
27
|
-
- "**/.pi-lens/**"
|
|
28
|
-
# `.spur/` runtime dirs hold run records, agent sessions, and captured test
|
|
29
|
-
# output (e.g. e2e failed-agent dumps embedding real source diffs). Not
|
|
30
|
-
# source — same class as the .pi-lens exclusion above.
|
|
31
|
-
- "**/.spur/**"
|
|
32
22
|
# Package build artifacts: `build:bundle` copies repo-root config/ →
|
|
33
|
-
# apps/cli/config
|
|
34
|
-
#
|
|
35
|
-
#
|
|
23
|
+
# apps/cli/config/. That tree is the ADR-015 SSOT payload itself and
|
|
24
|
+
# legitimately contains `config/...` documentation / self-references — not
|
|
25
|
+
# runtime paths.
|
|
36
26
|
- "apps/cli/config/**"
|
|
37
|
-
- "apps/cli/spur-cli/**"
|
|
38
27
|
rules:
|
|
39
28
|
- id: sp-runtime-path
|
|
40
29
|
description: >
|
|
@@ -10,11 +10,9 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
|
10
10
|
# - threshold kept at 90 matching bunfig.toml coverageThreshold
|
|
11
11
|
# - no drizzle exclude needed (Spur doesn't vendor generated SQL in src/)
|
|
12
12
|
#
|
|
13
|
-
# Scope tightened to production source only
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
# (DDL, journals, adapter wiring) whose per-file coverage is noise rather than
|
|
17
|
-
# a meaningful test-gap signal.
|
|
13
|
+
# Scope tightened to production source only. No per-file exclusions: every
|
|
14
|
+
# measured source file must meet the threshold. (Former vendors/stubs/schema/
|
|
15
|
+
# migrations/db exclusions were verified stale — all measured files pass 90%.)
|
|
18
16
|
rules:
|
|
19
17
|
- id: coverage-gate
|
|
20
18
|
description: "Per-file line coverage meets 90% threshold (read from lcov)"
|
|
@@ -27,12 +25,3 @@ rules:
|
|
|
27
25
|
include:
|
|
28
26
|
- "apps/**/src/**"
|
|
29
27
|
- "packages/**/src/**"
|
|
30
|
-
exclude:
|
|
31
|
-
- "**/node_modules/**"
|
|
32
|
-
- "**/vendors/**"
|
|
33
|
-
- "**/dist/**"
|
|
34
|
-
- "**/tests/**"
|
|
35
|
-
- "**/stubs/**"
|
|
36
|
-
- "**/schema/**"
|
|
37
|
-
- "**/migrations.ts"
|
|
38
|
-
- "**/db.ts"
|
|
@@ -6,17 +6,14 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
|
6
6
|
# are public integration points that warrant doc comments. The post-check gate
|
|
7
7
|
# keeps those boundaries documented.
|
|
8
8
|
#
|
|
9
|
-
# Scope tightened from the evaluator's default (**/*.ts) to production source
|
|
10
|
-
#
|
|
11
|
-
# migrations/db (implementation internals
|
|
9
|
+
# Scope tightened from the evaluator's default (**/*.ts) to production source
|
|
10
|
+
# only (src-scoped includes make tests unreachable). Excluded: schema/,
|
|
11
|
+
# migrations/db (implementation internals — DDL/journals/adapter wiring, not
|
|
12
|
+
# public API surface; verified load-bearing: 6 doc violations when stripped).
|
|
12
13
|
include:
|
|
13
14
|
- "apps/**/src/**/*.ts"
|
|
14
15
|
- "packages/**/src/**/*.ts"
|
|
15
16
|
exclude:
|
|
16
|
-
- "**/node_modules/**"
|
|
17
|
-
- "**/dist/**"
|
|
18
|
-
- "**/tests/**"
|
|
19
|
-
- "**/stubs/**"
|
|
20
17
|
- "**/schema/**" # drizzle DDL definitions — not public API surface
|
|
21
18
|
- "**/migrations.ts"
|
|
22
19
|
- "**/db.ts"
|
|
@@ -7,11 +7,9 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
|
7
7
|
include:
|
|
8
8
|
- "apps/**/src/**/*.ts"
|
|
9
9
|
- "packages/**/src/**/*.ts"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- "**/node_modules/**"
|
|
14
|
-
- "**/dist/**"
|
|
10
|
+
# NOTE: no doc-level tests exclusion — the globalThis.fetch* rules deliberately
|
|
11
|
+
# include tests, and a doc-level `**/tests/**` would neuter them (verified:
|
|
12
|
+
# zero globalThis.fetch usage in tests today, so removing it stays green).
|
|
15
13
|
|
|
16
14
|
rules:
|
|
17
15
|
- id: no-direct-fetch
|
|
@@ -22,9 +20,9 @@ rules:
|
|
|
22
20
|
config:
|
|
23
21
|
pattern: "(^|[^.[:alnum:]_])fetch\\("
|
|
24
22
|
exclude:
|
|
25
|
-
# Hono/Cloudflare Workers entrypoint — `fetch` is the platform contract
|
|
23
|
+
# Hono/Cloudflare Workers entrypoint — `fetch` is the platform contract
|
|
24
|
+
# (worker.ts:55 `async fetch(` matches the pattern when stripped).
|
|
26
25
|
- "apps/server/src/worker.ts"
|
|
27
|
-
- "apps/server/src/app.ts"
|
|
28
26
|
|
|
29
27
|
- id: no-globalthis-fetch
|
|
30
28
|
description: "Avoid globalThis.fetch(...); route HTTP through a client seam when one exists."
|
|
@@ -87,4 +85,3 @@ rules:
|
|
|
87
85
|
exclude:
|
|
88
86
|
- "**/tests/**"
|
|
89
87
|
- "**/*.test.ts"
|
|
90
|
-
- "**/dist/**"
|
|
@@ -6,8 +6,6 @@ include:
|
|
|
6
6
|
exclude:
|
|
7
7
|
- "**/tests/**"
|
|
8
8
|
- "**/*.test.ts"
|
|
9
|
-
- "**/node_modules/**"
|
|
10
|
-
- "**/dist/**"
|
|
11
9
|
|
|
12
10
|
rules:
|
|
13
11
|
- id: no-direct-process-spawn
|
|
@@ -33,7 +31,6 @@ rules:
|
|
|
33
31
|
exclude:
|
|
34
32
|
- "**/tests/**"
|
|
35
33
|
- "**/*.test.ts"
|
|
36
|
-
- "**/dist/**"
|
|
37
34
|
|
|
38
35
|
- id: no-direct-fs-io
|
|
39
36
|
description: "Prefer ts-runtime's FileSystem seam for fs IO."
|
|
@@ -53,7 +50,6 @@ rules:
|
|
|
53
50
|
exclude:
|
|
54
51
|
- "**/tests/**"
|
|
55
52
|
- "**/*.test.ts"
|
|
56
|
-
- "**/dist/**"
|
|
57
53
|
|
|
58
54
|
# Low-level system primitives (O_EXCL locks, FD byte-tailing, FS watcher, atomic registry, Vite glob fallback):
|
|
59
55
|
- "packages/domain/src/planning/locks.ts" # POSIX atomic O_EXCL file locks
|
|
@@ -75,6 +71,6 @@ rules:
|
|
|
75
71
|
|
|
76
72
|
# Synchronous template & workflow resolvers:
|
|
77
73
|
- "apps/cli/src/commands/task.ts" # sync loadTemplateContent/Bodies callbacks
|
|
78
|
-
- "apps/cli/src/workflow/make-lifecycle-adapter.ts" # sync resolveWorkflowPath lookup
|
|
79
74
|
- "packages/app/src/services/workflow-service.ts" # composition advisory source (0775: facts extracted from the live definition inside the synchronous validate path; the baseline snapshot sync read was retired)
|
|
80
75
|
- "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
|
|
76
|
+
- "apps/cli/src/version-carriers.ts" # sync manifest reads + Bun.write rewrites for registered release carriers (task 0854); mirrors release-ops.ts sync exemption
|
|
@@ -24,12 +24,19 @@ rules:
|
|
|
24
24
|
exclude:
|
|
25
25
|
- "/tests/"
|
|
26
26
|
- ".test.ts"
|
|
27
|
-
- "/node_modules/"
|
|
28
|
-
- "/dist/"
|
|
29
27
|
# nested engine scratch dirs under the included app/package trees;
|
|
30
28
|
# root .spur/ is outside this rule's include scope
|
|
29
|
+
# `/`.spur/` is load-bearing: the secrets-scanner's in-process walker
|
|
30
|
+
# does NOT skip dot-dirs, so nested .spur/ scratch dirs under app/package
|
|
31
|
+
# trees are scanned. `vendors/` fires today (LOOSE include fragments match
|
|
32
|
+
# `vendors/*/scripts/**`), so it must stay excluded.
|
|
31
33
|
- "/.spur/"
|
|
32
34
|
- "vendors/"
|
|
35
|
+
# `apps/cli/config/` is the gitignored bundle-config output (.gitignore
|
|
36
|
+
# `bundle-config`); it duplicates config/workflows YAML, which is outside
|
|
37
|
+
# this rule's include scope — scanning generated copies only adds noise
|
|
38
|
+
# (e.g. `id: task-implement-transition` trips the sk- token shape).
|
|
39
|
+
- "apps/cli/config/"
|
|
33
40
|
|
|
34
41
|
- id: no-unsafe-git-commands
|
|
35
42
|
description: "Unsafe git commands (force-push, hard reset) can overwrite history or cause data loss (AGENTS.md CRITICAL safety)."
|
|
@@ -58,7 +65,6 @@ rules:
|
|
|
58
65
|
- "**/.env.*"
|
|
59
66
|
exclude:
|
|
60
67
|
- "**/.env.example"
|
|
61
|
-
- "**/node_modules/**"
|
|
62
68
|
|
|
63
69
|
# NOTE: the ts-libs `no-github-workflows` rule (asserting .github/workflows must be
|
|
64
70
|
# ABSENT) was intentionally NOT absorbed — ts-libs is a library repo with no CI,
|
|
@@ -33,13 +33,10 @@ rules:
|
|
|
33
33
|
requireCorrespondingTest: true
|
|
34
34
|
include:
|
|
35
35
|
- "packages/**/src/**/*.ts"
|
|
36
|
-
- "packages/**/src/**/*.tsx"
|
|
37
36
|
- "apps/**/src/**/*.ts"
|
|
38
|
-
- "apps/**/src/**/*.tsx"
|
|
39
37
|
|
|
40
38
|
exclude:
|
|
41
39
|
- "**/index.ts"
|
|
42
|
-
- "**/*.tsx"
|
|
43
40
|
- "**/*.d.ts"
|
|
44
41
|
- "**/types.ts"
|
|
45
42
|
- "**/schema/**"
|
|
@@ -48,8 +45,6 @@ rules:
|
|
|
48
45
|
- "**/db.ts"
|
|
49
46
|
## Entity declarations — contracts are transport DTOs tested by the single contract.test.ts
|
|
50
47
|
- "packages/contracts/src/**"
|
|
51
|
-
- "**/node_modules/**"
|
|
52
|
-
- "**/tests/**"
|
|
53
48
|
## pure re-export for UI components
|
|
54
49
|
- "apps/web/src/ui.ts"
|
|
55
50
|
- "apps/web/src/modules/config.ts"
|
|
@@ -10,9 +10,10 @@ include:
|
|
|
10
10
|
- "apps/cli/src/commands/*.ts"
|
|
11
11
|
|
|
12
12
|
exclude:
|
|
13
|
+
# Not command files: stubs.ts is an empty module shim (consistency.test.ts
|
|
14
|
+
# excludes it too); shared-options.ts is the option registry.
|
|
13
15
|
- "apps/cli/src/commands/stubs.ts"
|
|
14
|
-
- "apps/cli/src/commands/shared-options.ts"
|
|
15
|
-
# module (consistency.test.ts excludes it too)
|
|
16
|
+
- "apps/cli/src/commands/shared-options.ts"
|
|
16
17
|
|
|
17
18
|
rules:
|
|
18
19
|
- id: cli-register-pattern
|
|
@@ -8,11 +8,6 @@ include:
|
|
|
8
8
|
- "apps/**/*.ts"
|
|
9
9
|
- "packages/**/*.ts"
|
|
10
10
|
- "scripts/**/*.ts"
|
|
11
|
-
- ".spur/**/*.yaml"
|
|
12
|
-
exclude:
|
|
13
|
-
- "**/node_modules/**"
|
|
14
|
-
- "**/dist/**"
|
|
15
|
-
|
|
16
11
|
rules:
|
|
17
12
|
- id: no-npm-pnpm-yarn-scripts
|
|
18
13
|
description: "Use bun scripts instead of npm, pnpm, or yarn commands (AGENTS.md: no npm/pnpm/yarn)."
|
|
@@ -30,8 +25,9 @@ rules:
|
|
|
30
25
|
- "**/*.yaml"
|
|
31
26
|
exclude:
|
|
32
27
|
# Rule-definition YAML legitimately names these tools in patterns/descriptions.
|
|
28
|
+
# (`.spur/rules/**` was de-listed: ripgrep never descends into hidden dirs,
|
|
29
|
+
# so that tree is unreachable by the rg evaluator.)
|
|
33
30
|
- "config/rules/**"
|
|
34
|
-
- ".spur/rules/**"
|
|
35
31
|
|
|
36
32
|
- id: enforce-bun-test
|
|
37
33
|
description: "Unit/integration tests must use bun:test, not Jest or Mocha. The server's Cloudflare Workers suite (*.cf.ts) is the only sanctioned Vitest runner."
|
|
@@ -57,6 +53,8 @@ rules:
|
|
|
57
53
|
- "packages/**/*.ts"
|
|
58
54
|
- "scripts/**/*.ts"
|
|
59
55
|
exclude:
|
|
60
|
-
|
|
56
|
+
# Sanctioned Cloudflare Workers Vitest wiring; `**/*.cf.ts` covers the
|
|
57
|
+
# test files themselves (apps/server/tests/cf/** was redundant — its only
|
|
58
|
+
# occupant is worker-runtime.cf.ts).
|
|
61
59
|
- "apps/server/vitest.cf.config.ts"
|
|
62
60
|
- "**/*.cf.ts"
|