@gobing-ai/spur 0.3.47 → 0.3.48
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 +42 -11
- package/config/transition-shims.json +33 -0
- package/config/workflows/basic.yaml +2 -0
- package/config/workflows/docs-pipeline.yaml +2 -0
- package/config/workflows/feature-dev.yaml +8 -0
- package/config/workflows/idea-pipeline.yaml +10 -0
- package/config/workflows/planning-pipeline.yaml +4 -0
- package/config/workflows/task-pipeline.yaml +8 -0
- package/config/workflows/wayfinder-resolution.yaml +4 -0
- package/config/workflows/wrapup-pipeline.yaml +18 -1
- package/package.json +2 -2
- package/plugins/sp/agents/expert-spur.md +1 -0
- package/plugins/sp/commands/dev-arch.md +2 -1
- package/plugins/sp/commands/dev-brainstorm.md +2 -1
- package/plugins/sp/commands/dev-changelog.md +1 -0
- package/plugins/sp/commands/dev-daily.md +1 -0
- package/plugins/sp/commands/dev-debug.md +2 -1
- package/plugins/sp/commands/dev-dogfood.md +2 -1
- package/plugins/sp/commands/dev-featurechange.md +1 -0
- package/plugins/sp/commands/dev-find-conflict.md +2 -1
- package/plugins/sp/commands/dev-find-issue.md +20 -32
- package/plugins/sp/commands/dev-find-next.md +2 -1
- package/plugins/sp/commands/dev-fixall.md +1 -0
- package/plugins/sp/commands/dev-gitmsg.md +1 -0
- package/plugins/sp/commands/dev-gtd.md +1 -0
- package/plugins/sp/commands/dev-handover.md +1 -0
- package/plugins/sp/commands/dev-idea.md +1 -0
- package/plugins/sp/commands/dev-next.md +2 -1
- package/plugins/sp/commands/dev-parallel.md +2 -1
- package/plugins/sp/commands/dev-plan.md +2 -1
- package/plugins/sp/commands/dev-refine.md +5 -3
- package/plugins/sp/commands/dev-refineall.md +2 -1
- package/plugins/sp/commands/dev-refresh.md +2 -1
- package/plugins/sp/commands/dev-reverse.md +2 -1
- package/plugins/sp/commands/dev-review.md +2 -1
- package/plugins/sp/commands/dev-run.md +3 -2
- package/plugins/sp/commands/dev-runall.md +3 -2
- package/plugins/sp/commands/dev-simplify.md +2 -1
- package/plugins/sp/commands/dev-unit.md +2 -1
- package/plugins/sp/commands/dev-verify.md +2 -1
- package/plugins/sp/commands/dev-verifyall.md +2 -1
- package/plugins/sp/commands/dev-wrap.md +7 -5
- package/plugins/sp/commands/dev-wrapall.md +7 -5
- package/plugins/sp/commands/rule-add.md +1 -0
- package/plugins/sp/commands/rule-refine.md +1 -0
- package/plugins/sp/commands/rule-scan.md +1 -0
- package/plugins/sp/commands/spur-init.md +1 -0
- package/plugins/sp/commands/workflow-add.md +1 -0
- package/plugins/sp/commands/workflow-refine.md +1 -0
- package/plugins/sp/hooks/careful-guard.ts +5 -80
- package/plugins/sp/hooks/destructive-policy.ts +146 -0
- package/plugins/sp/hooks/pi/guard-extension.ts +33 -46
- package/plugins/sp/hooks/task-file-policy.ts +31 -0
- package/plugins/sp/hooks/task-write-guard.ts +4 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +93 -0
- package/plugins/sp/scripts/feature-sync-bounded.ts +28 -2
- package/plugins/sp/scripts/stage-registry-adapter.ts +66 -31
- package/plugins/sp/scripts/surface-drift-inventory.ts +908 -0
- package/plugins/sp/scripts/task-size-precheck.ts +30 -4
- package/plugins/sp/scripts/transition-shim-check.ts +238 -0
- package/plugins/sp/scripts/validate-flag-contracts.ts +5 -2
- package/plugins/sp/skills/code-verification/SKILL.md +2 -0
- package/plugins/sp/skills/issue-finding/SKILL.md +123 -142
- package/plugins/sp/skills/issue-finding/examples/expected-findings.json +1 -1
- package/plugins/sp/skills/issue-finding/references/session-formats.md +85 -90
- package/plugins/sp/skills/next-router/SKILL.md +1 -1
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +40 -2
- package/plugins/sp/skills/spur-cli/SKILL.md +3 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +12 -7
- package/plugins/sp/skills/spur-cli/references/team.md +10 -3
- package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +17 -0
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +44 -23
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +14 -11
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +14 -12
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +14 -3
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +2 -0
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +12 -2
- package/schemas/spur-config.schema.json +27 -3
- package/spur.js +11637 -7590
- package/web/_astro/BoardApp.8hiqShQn.js +1 -0
- package/web/_astro/{BoardApp.DKyrGxdo.js → BoardApp.BjQUNhuj.js} +74 -74
- package/web/_astro/{TaskDetail.6-27_LMa.js → TaskDetail.CVBuD6dF.js} +1 -1
- package/web/_astro/{arc.Df-9AQvS.js → arc.BMMjdODi.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.VAI_-paS.js → architectureDiagram-3BPJPVTR.BU5ShzXf.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.DFpUY1ue.js → blockDiagram-GPEHLZMM.Bj1iEqPD.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.CF8doOpg.js → c4Diagram-AAUBKEIU.vX8wepCL.js} +1 -1
- package/web/_astro/channel.EwdSemIC.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.BnjK3fjt.js → chunk-2J33WTMH.BKAipTym.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.x6ZDnJKq.js → chunk-4BX2VUAB.B68XkPG7.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.zY-0uu7w.js → chunk-55IACEB6.BmeDLcrc.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.BZxKg_Vi.js → chunk-727SXJPM.PDuBA3Kw.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.Cpi9G9Td.js → chunk-AQP2D5EJ.C7A044za.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.DWTB-Pif.js → chunk-FMBD7UC4.BtzKKFqR.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.BPDQbiOG.js → chunk-ND2GUHAM.BJuDeeOy.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.BRWIcuoM.js → chunk-QZHKN3VN.DSeMDgcQ.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.mGTCZsDO.js → classDiagram-4FO5ZUOK.D53Q4tCw.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.mGTCZsDO.js → classDiagram-v2-Q7XG4LA2.D53Q4tCw.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.D1GEut-z.js → cose-bilkent-S5V4N54A.c712AFRH.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.BV0XG9Do.js → dagre-BM42HDAG.D-idisph.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DzpYxsjo.js → diagram-2AECGRRQ.DLgnsJCU.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Cm9YzJh4.js → diagram-5GNKFQAL.BiaxBVqx.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.BjhottUj.js → diagram-KO2AKTUF.C8HX1vd8.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BFsQW5kb.js → diagram-LMA3HP47.CfqDLLes.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.8pdpzSWO.js → diagram-OG6HWLK6.15SDiEed.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.Bd7KUJmJ.js → erDiagram-TEJ5UH35.DksYtOYM.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.7LWffkaE.js → flowDiagram-I6XJVG4X.DR_Au-HV.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.BeDcO5tI.js → ganttDiagram-6RSMTGT7.CHhHrffI.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.Ca4n730A.js → gitGraphDiagram-PVQCEYII.B2Xehvam.js} +1 -1
- package/web/_astro/{index.Dbvuw6d4.css → index.DAxu50UF.css} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.B0OakQYb.js → infoDiagram-5YYISTIA.C9c3CNNN.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.DSmNQe-1.js → ishikawaDiagram-YF4QCWOH.BibUHkh8.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.Cy5ruEUu.js → journeyDiagram-JHISSGLW.BYoVHiyO.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.CUJXub0p.js → kanban-definition-UN3LZRKU.CM1K5wHE.js} +1 -1
- package/web/_astro/{linear.DC1jCCXn.js → linear.SPpjJUb-.js} +1 -1
- package/web/_astro/{mermaid.core.DxVP99Ab.js → mermaid.core.BAgx3nnb.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.D0MaV6sJ.js → mindmap-definition-RKZ34NQL.D35oPG1R.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.DCC6_q32.js → pieDiagram-4H26LBE5.DiWuRwk7.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.BeUOAM7C.js → quadrantDiagram-W4KKPZXB.B9PBzTWn.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.Dbl4MASO.js → requirementDiagram-4Y6WPE33.CYuuamFN.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.HsLg0VS4.js → sankeyDiagram-5OEKKPKP.W24UhhtD.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.DT7DJTnZ.js → sequenceDiagram-3UESZ5HK.BpbNjA51.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.d_ju1Vr1.js → stateDiagram-AJRCARHV.DqVsHudf.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.DMCAjMJ4.js → stateDiagram-v2-BHNVJYJU.CzwHYX81.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.DNOHr62_.js → timeline-definition-PNZ67QCA.Bc3B6djw.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.B7dUy-1W.js → vennDiagram-CIIHVFJN.C-D5rh8O.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.DEqOXvBh.js → wardley-L42UT6IY.D7PdYCqn.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BCRb2p6x.js → wardleyDiagram-YWT4CUSO.CwmJKXF3.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.NxVQLdBh.js → xychartDiagram-2RQKCTM6.avDYnLsb.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.Ce6zJYAH.js +0 -1
- package/web/_astro/channel.Uhm9O3UV.js +0 -1
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
# Spur project configuration example
|
|
2
|
-
# Seeded by `spur init` as ~/.config/spur/config.yaml on first run
|
|
2
|
+
# Seeded by `spur init` as ~/.config/spur/config.yaml on first run
|
|
3
|
+
# (never overwritten).
|
|
3
4
|
# Copy / adapt into a project as `.spur/config.yaml`.
|
|
4
5
|
|
|
5
6
|
$schema: "@gobing-ai/spur/schemas/spur-config.schema.json"
|
|
6
7
|
# Config schema version (string). Current recommended: "1.1".
|
|
7
|
-
# "1" remains accepted; there is no hard migrator yet. Prefer "1.1" for
|
|
8
|
-
# so editors and operators know the file targets the ADR-033
|
|
8
|
+
# "1" remains accepted; there is no hard migrator yet. Prefer "1.1" for
|
|
9
|
+
# new projects so editors and operators know the file targets the ADR-033
|
|
10
|
+
# + planning shape.
|
|
9
11
|
version: "1.1"
|
|
10
12
|
name: my-project
|
|
11
13
|
|
|
12
|
-
# ── Portable bootstrap (consumed by @gobing-ai/ts-infra
|
|
14
|
+
# ── Portable bootstrap (consumed by @gobing-ai/ts-infra
|
|
15
|
+
# runNodeApplication) ──
|
|
13
16
|
# Shared across spur and (future) spur-server. Keys map 1:1 to ts-infra's
|
|
14
17
|
# LoggingOptions / TelemetryOptions / database / SchedulerOptions.
|
|
15
18
|
# Not validated by spurConfigSchema (bootstrap is owned by runNodeApplication).
|
|
@@ -33,18 +36,24 @@ bootstrap:
|
|
|
33
36
|
scheduler:
|
|
34
37
|
enabled: false # CLI is run-once; no scheduler
|
|
35
38
|
|
|
36
|
-
# ── Spur app section (validated by spurConfigSchema in
|
|
39
|
+
# ── Spur app section (validated by spurConfigSchema in
|
|
40
|
+
# @gobing-ai/spur-config) ──
|
|
37
41
|
# Server runtime (port/host/openBrowser) is env-backed via PORT/HOST — not a
|
|
38
42
|
# project-config key. See design §2.2.
|
|
39
43
|
agent:
|
|
40
|
-
# `default` is the
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
|
|
44
|
+
# `default` is the role used for `--agent auto` when the caller declares
|
|
45
|
+
# nothing (task 0542 R2 — the value domain moved from executor names to
|
|
46
|
+
# roles). A role id selects its tier's cheapest eligible executor; a
|
|
47
|
+
# configured executor name still resolves during the transition with a
|
|
48
|
+
# one-time warning (shim agent-default-executor); any other value fails
|
|
49
|
+
# naming both accepted sets.
|
|
50
|
+
default: coder
|
|
44
51
|
|
|
45
52
|
# Canonical coding-agent ids (ts-ai-runner DISPLAY_ORDER, 0.4.8+):
|
|
46
|
-
# claude, codex, gemini, pi, omp, opencode, antigravity-cli,
|
|
47
|
-
#
|
|
53
|
+
# claude, codex, gemini, pi, omp, opencode, antigravity-cli,
|
|
54
|
+
# openclaw, hermes, grok
|
|
55
|
+
# Grok auth: non-empty XAI_API_KEY and/or ~/.grok/auth.json (no CLI
|
|
56
|
+
# auth-status verb).
|
|
48
57
|
|
|
49
58
|
# Named executor profiles (ADR-033 / 0343). Each pairs a canonical agent with
|
|
50
59
|
# an optional opaque model override and an explicit capability tier.
|
|
@@ -92,6 +101,13 @@ agent:
|
|
|
92
101
|
# purpose: "Lead — planning & review"
|
|
93
102
|
# - executor: omp
|
|
94
103
|
# purpose: "Implementer"
|
|
104
|
+
# # Role is the primary axis (0543): a role-only member resolves an
|
|
105
|
+
# # executor through the tier ladder at materialization; the resolved
|
|
106
|
+
# # executor and the role are both recorded on the materialized spec.
|
|
107
|
+
# - role: reviewer
|
|
108
|
+
# - role: coder
|
|
109
|
+
# executor: omp
|
|
110
|
+
# purpose: "Pinned executor, role recorded alongside (pin beats policy)"
|
|
95
111
|
|
|
96
112
|
rules:
|
|
97
113
|
paths:
|
|
@@ -116,3 +132,18 @@ tasks:
|
|
|
116
132
|
|
|
117
133
|
features:
|
|
118
134
|
dir: docs/features
|
|
135
|
+
|
|
136
|
+
# ── History (task 0549 — completion-triggered refresh) ──
|
|
137
|
+
# Opt-in: when work completes (task → done, pipeline run reaching
|
|
138
|
+
# terminal status), enqueue ONE coalesced `history.refresh` job on the
|
|
139
|
+
# embedded job queue (never inline). Bursts inside debounce_ms join the
|
|
140
|
+
# pending job; the covered window spans all completions. The job reuses
|
|
141
|
+
# `spur history daily` semantics (import-all fan-out with per-source
|
|
142
|
+
# isolation + analyze + artifact write) and is consumed by `spur serve`'s
|
|
143
|
+
# job worker. Debounce default 600000 ms (10 min) follows
|
|
144
|
+
# docs/tasks4/0548-import-cost-measurement.md (steady-state all-fanout
|
|
145
|
+
# import ≈ 20.6 s; 10 min comfortably bounds burst coalescing).
|
|
146
|
+
# history:
|
|
147
|
+
# refresh:
|
|
148
|
+
# on_completion: false # set true to enable; disable with no code edits
|
|
149
|
+
# debounce_ms: 600000 # coalescing window; floor 1000 ms
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"note": "Transition-shim manifest (task 0541, feature B2). Each entry records one compatibility path marked @transition-shim(<id>) in source. Every field is required. The gate (bun run transition-shim-check, inside `spur-check`) is two-sided: an unregistered marker fails, and a listed entry whose marker is gone fails. Emptying this file is the definition of the transition being complete (docs/04_DESIGN.md §2.5). Removal conditions must be objectively checkable against the repository, not 'when convenient'. Shims are registered by the tasks that create them (0536/0537/0538/0542).",
|
|
3
|
+
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"id": "agent-bare-binary-name",
|
|
6
|
+
"wbs": "0536",
|
|
7
|
+
"file": "packages/app/src/services/agent-service.ts",
|
|
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
|
+
"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-flag-spec-id",
|
|
20
|
+
"wbs": "0542",
|
|
21
|
+
"file": "apps/cli/src/commands/agent.ts",
|
|
22
|
+
"keepsWorking": "a team spec id passed to --agent <spec-id> still addresses the spec and drives the drain path, warned once by warnAgentSpecIdOnce; --spec <id> is the canonical carrier",
|
|
23
|
+
"removalCondition": "no --agent <spec-id> usage remains in config/workflows/, plugins/sp/, or docs/ (scan for --agent values that match a .spur/agents/ spec id)"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "agent-default-executor",
|
|
27
|
+
"wbs": "0542",
|
|
28
|
+
"file": "packages/app/src/services/agent-service.ts",
|
|
29
|
+
"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)",
|
|
30
|
+
"removalCondition": "no agent.default value names an agent.executors entry (scan .spur/config.yaml and config/config.example.yaml against the agent.executors names)"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
@@ -67,6 +67,8 @@ states:
|
|
|
67
67
|
options:
|
|
68
68
|
agent: ${vars.agent}
|
|
69
69
|
# Pure slash only (ADR-043). Do not bolt docs-only prose onto the input line.
|
|
70
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
71
|
+
role: coder
|
|
70
72
|
input: /sp:dev-run --mode implement ${vars.wbs} --auto
|
|
71
73
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
72
74
|
# Fail a silent no-op draft (same empty-implement class as task-pipeline R3).
|
|
@@ -84,6 +84,8 @@ states:
|
|
|
84
84
|
options:
|
|
85
85
|
agent: ${vars.agent}
|
|
86
86
|
input: /sp:dev-brainstorm --feature ${vars.featureId}
|
|
87
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
88
|
+
role: planner
|
|
87
89
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
88
90
|
|
|
89
91
|
- id: plan
|
|
@@ -95,6 +97,8 @@ states:
|
|
|
95
97
|
options:
|
|
96
98
|
agent: ${vars.agent}
|
|
97
99
|
input: /sp:dev-plan --feature ${vars.featureId}
|
|
100
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
101
|
+
role: planner
|
|
98
102
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
99
103
|
|
|
100
104
|
# Two pure-slash execute hops so vars.profile actually controls --auto (ADR-043).
|
|
@@ -109,6 +113,8 @@ states:
|
|
|
109
113
|
options:
|
|
110
114
|
agent: ${vars.agent}
|
|
111
115
|
input: /sp:dev-runall --feature ${vars.featureId} --auto
|
|
116
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
117
|
+
role: planner
|
|
112
118
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
113
119
|
|
|
114
120
|
- id: execute-tasks
|
|
@@ -120,6 +126,8 @@ states:
|
|
|
120
126
|
options:
|
|
121
127
|
agent: ${vars.agent}
|
|
122
128
|
input: /sp:dev-runall --feature ${vars.featureId}
|
|
129
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
130
|
+
role: planner
|
|
123
131
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
124
132
|
|
|
125
133
|
- id: feature-verify
|
|
@@ -108,6 +108,8 @@ states:
|
|
|
108
108
|
options:
|
|
109
109
|
agent: ${vars.agent}
|
|
110
110
|
input: "Run sp:brainstorm for the idea: ${vars.idea}. The skill owns the approach-generation, design summary, and `needs_design` signal criteria; emit .spur/run/${vars.__runId}-idea-needs-design.json ({\"needs_design\": true|false}) and the design summary per the skill's `Design Approval Gate` and `The needs_design signal` sections. Also emit the idea-evaluation report to .spur/run/${vars.__runId}-idea-eval-report.md per plugins/sp/skills/spur-dev/references/idea-evaluation.md (urgency/necessity 0–5, premises, pros/cons, alternatives, enhanced idea, recommendation). At the END of the report, append a provenance footer block of the exact form: `---\\nrun_id: ${vars.__runId}\\ngenerated_at: <RFC3339 timestamp>\\n---` (omit the footer only if run_id is empty)."
|
|
111
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
112
|
+
role: planner
|
|
111
113
|
expectFile: .spur/run/${vars.__runId}-idea-eval-report.md
|
|
112
114
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
113
115
|
|
|
@@ -140,6 +142,8 @@ states:
|
|
|
140
142
|
options:
|
|
141
143
|
agent: ${vars.agent}
|
|
142
144
|
input: "Create a feature for the idea: ${vars.idea}. Read .spur/run/${vars.__runId}-idea-eval-report.md if present for the enhanced idea and scores. Use 'spur feature create \"<name>\" --json' to create it. Write the feature id to .spur/run/${vars.__runId}-idea-feature-id.txt. If an existing feature is appropriate, use its id instead. Also write two body-only intent artifacts: .spur/run/${vars.__runId}-idea-goal.md with concise Goal intent only (a short statement of what the feature achieves; never task breakdowns, checklists, or how-to steps), and .spur/run/${vars.__runId}-idea-scope.md with explicit in-scope and out-of-scope boundary bullets."
|
|
145
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
146
|
+
role: planner
|
|
143
147
|
expectFile: .spur/run/${vars.__runId}-idea-feature-id.txt
|
|
144
148
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
145
149
|
- kind: file.read.into-var
|
|
@@ -179,6 +183,8 @@ states:
|
|
|
179
183
|
options:
|
|
180
184
|
agent: ${vars.agent}
|
|
181
185
|
input: "Generate acceptance criteria for feature ${vars.featureId}. Read the feature file and author R-numbered BDD Gherkin scenarios per ac-style-guide.md. Output only the complete Acceptance Criteria section body, including the gherkin code fence, with no surrounding commentary and no section heading."
|
|
186
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
187
|
+
role: planner
|
|
182
188
|
answerFile: .spur/run/${vars.__runId}-idea-ac-content.md
|
|
183
189
|
expectFile: .spur/run/${vars.__runId}-idea-ac-content.md
|
|
184
190
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
@@ -239,6 +245,8 @@ states:
|
|
|
239
245
|
options:
|
|
240
246
|
agent: ${vars.agent}
|
|
241
247
|
input: "Run sp:sys-architecture for feature ${vars.featureId}. Read the brainstorm artifact, feature AC, and .spur/run/${vars.__runId}-idea-design-review.md. Produce ADR entries, architecture updates, and design satellites (docs/design/<slug>.md) following the constitution edit rules. Do not write task or feature corpus files directly. Design-review contract (.spur/run/${vars.__runId}-idea-design-review.md, fixed headings `## Proposed design`, `## Operator feedback`, `## Reconciliation`): on the first pass write the proposed design summary under `## Proposed design` and leave `## Operator feedback` empty; on retry with operator feedback present, revise the design/ADR artifacts, document the changes under `## Reconciliation`, and when the feedback invalidates an Acceptance Criteria scenario write the revised AC section body to a file and persist it via `$spurBin feature update \"$featureId\" --section \"Acceptance Criteria\" --from-file <file>` — never edit feature corpus files directly."
|
|
248
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
249
|
+
role: planner
|
|
242
250
|
expectFile: .spur/run/${vars.__runId}-idea-design-review.md
|
|
243
251
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
244
252
|
# expectFile proves existence only, and the onEnter skeleton pre-creates the file — so an
|
|
@@ -293,6 +301,8 @@ states:
|
|
|
293
301
|
options:
|
|
294
302
|
agent: ${vars.agent}
|
|
295
303
|
input: "Run sp:spec-decomposition for feature ${vars.featureId}. Read the brainstorm artifact, feature AC, and design doc. SIZING FIRST, before any JSON: apply the skill's `Default to NOT decomposing` rubric to the whole unit of work — if it scores 0-2 the correct output is a ONE-entry batch, not many. Scenario count is not task count: merge scenarios that one task delivers (same file surface, same subsystem, or unreadable apart in review), and list every scenario a task covers in its background. Merging never costs AC coverage — one task may carry several scenarios. Do not emit one entry per scenario or per requirement by reflex. Then produce a task-batch JSON array at .spur/run/${vars.__runId}-idea-task-batch.json, validated against apps/cli/schemas/task-batch.schema.json. Schema-permitted fields per entry: `name`, `background`, `requirements`, `feature_id`, `parent_wbs`, `priority`, `tags`, `template` — schema validation rejects anything else. Acceptance Criteria, Design, and Plan sections are filled in by the per-task refine step after batch-create, NOT at decompose time. Validate locally against the schema before emitting. Also emit the private task-order sidecar at .spur/run/${vars.__runId}-idea-task-order.json: a JSON array (one entry per batch item) of `{ name: <exact batch item name>, depends_on_names: [<batch item names>] }` declaring ordering/dependencies between the batch items; use `[]` when no ordering exists. Every `name` and every dependency must match exactly one batch item `name` — it is private workflow data, not part of task-batch.schema.json."
|
|
304
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
305
|
+
role: planner
|
|
296
306
|
expectFile: .spur/run/${vars.__runId}-idea-task-batch.json
|
|
297
307
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
298
308
|
# R1 (0518): the task-order sidecar is the ordering contract for handoff-finalize.
|
|
@@ -102,6 +102,8 @@ states:
|
|
|
102
102
|
options:
|
|
103
103
|
agent: ${vars.agent}
|
|
104
104
|
# `vars.feature` is optional and defaults to "" — the parent flag must be
|
|
105
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
106
|
+
role: planner
|
|
105
107
|
# described conditionally, never interpolated bare. `--parent <empty> --json`
|
|
106
108
|
# makes commander swallow `--json` as the parent value.
|
|
107
109
|
input: "Skill(skill=\"sp:spur-cli\", args=\"feature create for slug ${vars.slug}\"). Run `${vars.spurBin} feature create \"${vars.slug}\" --json` (or reuse an existing id); append `--parent \"${vars.feature}\"` ONLY if the parent id between those quotes is non-empty — if it is empty, omit the --parent flag entirely. Write the feature id alone to .spur/run/${vars.__runId}-plan-feature-id.txt."
|
|
@@ -118,6 +120,8 @@ states:
|
|
|
118
120
|
options:
|
|
119
121
|
agent: ${vars.agent}
|
|
120
122
|
input: "Skill(skill=\"sp:doc-evolve\", args=\"design-gen slug=${vars.slug}\"). Author docs/design/${vars.slug}.md from docs/plans/${vars.slug}-drafted.md; stage 04_DESIGN index edit only."
|
|
123
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
124
|
+
role: planner
|
|
121
125
|
expectFile: docs/design/${vars.slug}.md
|
|
122
126
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
123
127
|
|
|
@@ -262,6 +262,8 @@ states:
|
|
|
262
262
|
options:
|
|
263
263
|
agent: ${vars.implementAgent}
|
|
264
264
|
# Pure slash command only (ADR-043). Anti-recursion / implement discipline
|
|
265
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
266
|
+
role: coder
|
|
265
267
|
# lives in /sp:dev-run --mode implement → sp:code-implementation, not YAML prose.
|
|
266
268
|
input: /sp:dev-run --mode implement ${vars.wbs} --auto
|
|
267
269
|
timeoutMs: ${vars.implementTimeoutMs}
|
|
@@ -374,6 +376,8 @@ states:
|
|
|
374
376
|
options:
|
|
375
377
|
agent: ${vars.agent}
|
|
376
378
|
# R3 (0482): `--findings` names the failing anchors inline; `--gate-log` remains
|
|
379
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
380
|
+
role: coder
|
|
377
381
|
# the full-context escape hatch when the digest is not enough.
|
|
378
382
|
input: /sp:dev-fixall "${vars.qualityGateCmd}" --gate-log .spur/run/${vars.wbs}-test-gate.log --findings "${vars.gateFindings}"
|
|
379
383
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
@@ -422,6 +426,8 @@ states:
|
|
|
422
426
|
options:
|
|
423
427
|
agent: ${vars.agent}
|
|
424
428
|
input: /sp:dev-review ${vars.wbs} --auto
|
|
429
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
430
|
+
role: reviewer
|
|
425
431
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
426
432
|
|
|
427
433
|
- id: approve
|
|
@@ -452,6 +458,8 @@ states:
|
|
|
452
458
|
options:
|
|
453
459
|
agent: ${vars.agent}
|
|
454
460
|
input: /sp:dev-verify ${vars.wbs} --auto --fix all --focus all
|
|
461
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
462
|
+
role: reviewer
|
|
455
463
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
456
464
|
answerFile: .spur/run/${vars.wbs}-verify-answer.txt
|
|
457
465
|
- kind: shell
|
|
@@ -82,6 +82,8 @@ states:
|
|
|
82
82
|
options:
|
|
83
83
|
agent: ${vars.agent}
|
|
84
84
|
capture: true
|
|
85
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
86
|
+
role: planner
|
|
85
87
|
mode: text
|
|
86
88
|
input: >-
|
|
87
89
|
Resolve task ${vars.wbs} in resolution mode ${vars.resolutionMode} using the prepared
|
|
@@ -115,6 +117,8 @@ states:
|
|
|
115
117
|
options:
|
|
116
118
|
agent: ${vars.agent}
|
|
117
119
|
capture: true
|
|
120
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
121
|
+
role: reviewer
|
|
118
122
|
mode: text
|
|
119
123
|
input: >-
|
|
120
124
|
Verify resolved task ${vars.wbs} using only local reads and `spur` CLI. Check its
|
|
@@ -80,7 +80,9 @@ states:
|
|
|
80
80
|
- kind: agent.run
|
|
81
81
|
options:
|
|
82
82
|
agent: ${vars.agent}
|
|
83
|
-
input:
|
|
83
|
+
input: 'Skill(skill="sp:doc-evolve", args="wrapup tasks=${vars.tasks}"). Repair drift in docs/00_ADR.md, docs/03_ARCHITECTURE.md, docs/04_DESIGN.md, docs/design/* per constitution edit rules. Do not write task/feature corpus.'
|
|
84
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
85
|
+
role: coder
|
|
84
86
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
85
87
|
|
|
86
88
|
- id: learning-capture
|
|
@@ -93,6 +95,8 @@ states:
|
|
|
93
95
|
options:
|
|
94
96
|
agent: ${vars.agent}
|
|
95
97
|
input: "Extract working learnings from tasks ${vars.tasks}. Output raw markdown (no fences) grouped by date and task WBS: conventions, errors fixed, patterns, gotchas. Captured to .spur/run/wrapup-learnings.md."
|
|
98
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
99
|
+
role: coder
|
|
96
100
|
answerFile: .spur/run/wrapup-learnings.md
|
|
97
101
|
expectFile: .spur/run/wrapup-learnings.md
|
|
98
102
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
@@ -103,6 +107,8 @@ states:
|
|
|
103
107
|
if test -s .spur/run/wrapup-learnings.md; then
|
|
104
108
|
cat .spur/run/wrapup-learnings.md >> .spur/memory/learnings.md &&
|
|
105
109
|
printf '\n' >> .spur/memory/learnings.md;
|
|
110
|
+
else
|
|
111
|
+
echo "wrapup: learning capture missing or empty at $PWD/.spur/run/wrapup-learnings.md - append skipped" >&2;
|
|
106
112
|
fi &&
|
|
107
113
|
exit 0
|
|
108
114
|
|
|
@@ -115,6 +121,8 @@ states:
|
|
|
115
121
|
options:
|
|
116
122
|
agent: ${vars.agent}
|
|
117
123
|
input: "For each task in ${vars.tasks}, output one JSONL line (no fences) with fields: wbs, feature_id, status, verdict, timestamp. Captured to .spur/run/wrapup-metrics.jsonl."
|
|
124
|
+
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
125
|
+
role: scribe
|
|
118
126
|
answerFile: .spur/run/wrapup-metrics.jsonl
|
|
119
127
|
expectFile: .spur/run/wrapup-metrics.jsonl
|
|
120
128
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
@@ -124,6 +132,8 @@ states:
|
|
|
124
132
|
mkdir -p .spur/memory &&
|
|
125
133
|
if test -s .spur/run/wrapup-metrics.jsonl; then
|
|
126
134
|
cat .spur/run/wrapup-metrics.jsonl >> .spur/memory/wrapup-metrics.jsonl;
|
|
135
|
+
else
|
|
136
|
+
echo "wrapup: metrics capture missing or empty at $PWD/.spur/run/wrapup-metrics.jsonl - append skipped" >&2;
|
|
127
137
|
fi &&
|
|
128
138
|
exit 0
|
|
129
139
|
|
|
@@ -131,6 +141,9 @@ states:
|
|
|
131
141
|
description: >
|
|
132
142
|
If vars.feature is set, sync feature status via bounded feature-sync-bounded
|
|
133
143
|
(0411). Soft shell — blocked/failed sync must not abort wrap-up after metrics.
|
|
144
|
+
Empty vars.feature is NOT a blocked sync but a mis-invocation (the engine only
|
|
145
|
+
enters this state when vars.feature is set) and fails loud (dogfood 2026-08-15,
|
|
146
|
+
feature I3: a silent exit 0 made the wrap look complete with no transition).
|
|
134
147
|
onEnter:
|
|
135
148
|
# Genuinely soft: the terminating `exit 0` must be reached on BOTH branches, so
|
|
136
149
|
# the sync is chained with `;` — with `&&` a non-zero sync skipped `exit 0` and
|
|
@@ -142,6 +155,10 @@ states:
|
|
|
142
155
|
- kind: shell
|
|
143
156
|
options:
|
|
144
157
|
command: >-
|
|
158
|
+
if [ -z "$feature" ]; then
|
|
159
|
+
echo "feature-transition: vars.feature is empty — refusing no-op feature sync (mis-invocation, not a blocked sync)" >&2;
|
|
160
|
+
exit 1;
|
|
161
|
+
fi;
|
|
145
162
|
if [ -f plugins/sp/scripts/feature-sync-bounded.ts ]; then
|
|
146
163
|
bun plugins/sp/scripts/feature-sync-bounded.ts "$feature" --spur-bin "$spurBin" --json;
|
|
147
164
|
else
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.48",
|
|
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",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@commander-js/extra-typings": "^14.0.0",
|
|
56
56
|
"@gobing-ai/ts-db": "^0.4.31",
|
|
57
|
-
"@gobing-ai/ts-ai-runner": "^0.4.
|
|
57
|
+
"@gobing-ai/ts-ai-runner": "^0.4.32",
|
|
58
58
|
"@gobing-ai/ts-dual-workflow-engine": "^0.4.31",
|
|
59
59
|
"@gobing-ai/ts-infra": "^0.4.31",
|
|
60
60
|
"@gobing-ai/ts-llm-jsonl-importer": "^0.4.31",
|
|
@@ -66,6 +66,7 @@ Invoke `sp:spur-cli` for verb guidance and per-noun conventions:
|
|
|
66
66
|
|
|
67
67
|
- [ ] Delegate verb guidance to `sp:spur-cli`; use the `spur` CLI for all mutations.
|
|
68
68
|
- [ ] Run the noun's `check`/`validate` verb before and after editing (e.g. `spur task check <wbs> --json`).
|
|
69
|
+
- [ ] Run the corpus-wide sweep after batch edits: `spur task check --corpus --json` (fails on structural errors outside `config/corpus-baseline.json`).
|
|
69
70
|
- [ ] Use `spur task update --section --from-file` for all task section edits.
|
|
70
71
|
- [ ] Run the noun's `refresh` after batch operations where one exists (`spur task refresh`, `spur feature refresh`).
|
|
71
72
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Survey a codebase (or module tree) for shallow modules and deepening opportunities — emit a ranked MARKDOWN candidate report that feeds the planning half; never auto-refactors
|
|
3
|
+
role: planner
|
|
3
4
|
argument-hint: "[<module-path>] [--scope <all|path>] [--agent <inline|auto|name>] [--json]"
|
|
4
5
|
allowed-tools: ["Bash", "Read", "Grep", "Glob", "Skill"]
|
|
5
6
|
---
|
|
@@ -14,7 +15,7 @@ Wraps the **sp:sys-architecture** skill.
|
|
|
14
15
|
| --- | --- | --- |
|
|
15
16
|
| `[<module-path>]` | Module path to scope the architecture survey. | omitted (whole repo) |
|
|
16
17
|
| `--scope` `<all\|path>` | Limit the survey to a path or expand to the whole repo. | all |
|
|
17
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing survey work. |
|
|
18
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing survey work. | omit |
|
|
18
19
|
| `--json` | Emit structured JSON instead of markdown. | off |
|
|
19
20
|
|
|
20
21
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring
|
|
3
|
+
role: planner
|
|
3
4
|
argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--wayfind] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]"
|
|
4
5
|
allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
|
|
5
6
|
---
|
|
@@ -15,7 +16,7 @@ Wraps the **sp:brainstorm** and **sp:wayfinder** skills.
|
|
|
15
16
|
| `<topic>` | Topic or problem statement to explore. | required |
|
|
16
17
|
| `--depth` `<basic\|detailed\|comprehensive>` | Breadth vs. depth of the exploration. | detailed |
|
|
17
18
|
| `--options` `<n>` | Number of solution options to generate. | 3 |
|
|
18
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. |
|
|
19
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. | omit |
|
|
19
20
|
| `--skip-discovery` | Skip the discovery interview; ideate immediately. | off |
|
|
20
21
|
| `--wayfind` | Spawn a wayfinder feature for multi-session routing. | off |
|
|
21
22
|
| `--task` `[<feature-id>]` | Create a tracking task under a feature. | omitted |
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Systematic debugging protocol — reproduce, isolate, diagnose root cause, apply minimal fix, and verify with regression tests"
|
|
3
|
+
role: coder
|
|
3
4
|
argument-hint: "\"<symptom | failing command>\" [--scope <path>] [--task [<wbs>]] [--agent <inline|auto|name>]"
|
|
4
5
|
allowed-tools: ["Bash", "Read", "Write", "Skill"]
|
|
5
6
|
---
|
|
@@ -15,7 +16,7 @@ Wraps the **sp:sys-debugging** skill.
|
|
|
15
16
|
| `"<symptom \| failing command>"` | Symptom or failing command to diagnose. | required |
|
|
16
17
|
| `--scope` `<path>` | Scope the reproduction/isolation to a path. | cwd |
|
|
17
18
|
| `--task` `[<wbs>]` | Attach findings to a task. | omitted |
|
|
18
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing diagnosis. |
|
|
19
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing diagnosis. | omit |
|
|
19
20
|
|
|
20
21
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
21
22
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Dogfood an agent skill/command/CLI — drive it end-to-end with bounded auto-fix, self-monitor, and emit a comprehensive report
|
|
3
|
+
role: reviewer
|
|
3
4
|
argument-hint: "<testee> [--agent <inline|auto|name>] [--max-retry <n>] [--save] [--task] [--chain-follow] [--full]"
|
|
4
5
|
allowed-tools: ["Bash", "Read", "Write", "Edit", "Grep", "Glob", "Skill"]
|
|
5
6
|
---
|
|
@@ -13,7 +14,7 @@ Wraps the **sp:dogfood-testing** skill.
|
|
|
13
14
|
| Flag | Description | Default |
|
|
14
15
|
| --- | --- | --- |
|
|
15
16
|
| `<testee>` | Skill / command / CLI to exercise end-to-end. | required |
|
|
16
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing dogfood work. |
|
|
17
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing dogfood work. | omit |
|
|
17
18
|
| `--max-retry` `<n>` | Max auto-fix retries per stage. | 3 |
|
|
18
19
|
| `--save` | Compatibility no-op; saving is now default. Retained until evidenced retirement. | off |
|
|
19
20
|
| `--task` | Record outcomes against a task. | omitted |
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Authority-aware semantic audit across source, task files, feature files, and project authority files — discover conflicts, resolve claim-specific authority, collect reproducible evidence, and route confirmed repairs through owner surfaces. Triggers: find conflict, conflict audit, semantic conflict, authority mismatch, stale projection."
|
|
3
|
+
role: reviewer
|
|
3
4
|
argument-hint: "[<scope>] [--pillar <source|tasks|features|authority|all>] [--mode <adaptive|full>] [--resolve] [--agent <inline|auto|name>] [--json]"
|
|
4
5
|
allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
|
|
5
6
|
---
|
|
@@ -18,7 +19,7 @@ owner-routed remediation.
|
|
|
18
19
|
| `--pillar` `<source\|tasks\|features\|authority\|all>` | Limit the internal audit to one pillar; the minimum authorities needed to judge it still load. | all |
|
|
19
20
|
| `--mode` `<adaptive\|full>` | Scan protocol — adaptive reuses fresh indexed context and discloses skipped areas; full forces a cold comprehensive scan. | adaptive |
|
|
20
21
|
| `--resolve` | Enable the proposal, confirmation, and owner-routed remediation workflow. Its absence guarantees no source/corpus/numbered-doc mutation. | off |
|
|
21
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. |
|
|
22
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
|
|
22
23
|
| `--json` | Emit the same result envelope as Markdown as JSON. | off |
|
|
23
24
|
|
|
24
25
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
3
|
-
|
|
2
|
+
description: "Render the session-forensics report from imported history data (8 CLI-derivable sections plus 6 model-authored), identify bottlenecks and behavioral anti-patterns, and optionally create a structured fix task behind --create-task. Triggers: post-mortem, performance analysis, session review, find issues, identify bottlenecks"
|
|
3
|
+
role: reviewer
|
|
4
|
+
argument-hint: "[<topic>] [--sessions <glob>] [--source <auto|omp|claude|codex|gemini|opencode|antigravity|openclaw|pi>] [--feature <id>] [--template <meta|issue|standard>] [--priority <P0|P1|P2|P3>] [--severity <S0|S1|S2>] [--category <list>] [--since <iso>] [--until <iso>] [--top <n>] [--min-cost <duration>] [--strict-topic] [--create-task] [--agent <inline|auto|name>] [--json]"
|
|
4
5
|
allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Dev Find Issue
|
|
8
9
|
|
|
9
|
-
Wraps the **sp:issue-finding** skill —
|
|
10
|
-
|
|
10
|
+
Wraps the **sp:issue-finding** skill — report-first session forensics over the history data plane.
|
|
11
|
+
The CLI renders the 8 derivable report sections (`spur history report --mode forensics`); the skill
|
|
12
|
+
identifies bottlenecks, proposes fixes, and — only with `--create-task` — generates a structured
|
|
11
13
|
task file via `spur task create`.
|
|
12
14
|
|
|
13
15
|
## Argument Flags
|
|
@@ -15,21 +17,20 @@ task file via `spur task create`.
|
|
|
15
17
|
| Flag | Description | Default |
|
|
16
18
|
| ------------------------------------------------------------------------------------ | ------------------------------------ | ---------- |
|
|
17
19
|
| `[<topic>]` | Narrow the analysis to a topic. | omitted |
|
|
18
|
-
| `--sessions` `<glob>` | Session log glob
|
|
20
|
+
| `--sessions` `<glob>` | Session log glob (fallback input). | recent |
|
|
19
21
|
| `--source` `<auto\|omp\|claude\|codex\|gemini\|opencode\|antigravity\|openclaw\|pi>` | Agent source to scan. | auto |
|
|
20
|
-
| `--feature` `<id>` | Attach
|
|
21
|
-
| `--template` `<meta\|issue\|standard>` |
|
|
22
|
-
| `--priority` `<P0\|P1\|P2\|P3>` | Filter / assign priority.
|
|
23
|
-
| `--severity` `<S0\|S1\|S2>` | Filter / assign severity. |
|
|
22
|
+
| `--feature` `<id>` | Attach the generated task to a feature. | omitted |
|
|
23
|
+
| `--template` `<meta\|issue\|standard>` | Task template shape (`--create-task` only). | standard |
|
|
24
|
+
| `--priority` `<P0\|P1\|P2\|P3>` | Filter / assign task priority. | P2 |
|
|
25
|
+
| `--severity` `<S0\|S1\|S2>` | Filter / assign severity. | all |
|
|
24
26
|
| `--category` `<list>` | Comma list of categories to keep. | all |
|
|
25
27
|
| `--since` `<iso>` | Start of the scan window. | configured |
|
|
26
28
|
| `--until` `<iso>` | End of the scan window. | now |
|
|
27
29
|
| `--top` `<n>` | Limit to top N findings. | omitted |
|
|
28
30
|
| `--min-cost` `<duration>` | Minimum wasted duration to report. | omitted |
|
|
29
31
|
| `--strict-topic` | Drop findings off-topic. | off |
|
|
30
|
-
| `--
|
|
31
|
-
| `--
|
|
32
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | inline |
|
|
32
|
+
| `--create-task` | Generate a fix task for findings. | off |
|
|
33
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
|
|
33
34
|
| `--json` | Emit structured JSON. | off |
|
|
34
35
|
|
|
35
36
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
@@ -41,28 +42,15 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
41
42
|
/sp:dev-find-issue "test-loop spinning"
|
|
42
43
|
/sp:dev-find-issue --sessions "~/.omp/agent/sessions/-xprojects-spur-new/2026-07-29T*"
|
|
43
44
|
/sp:dev-find-issue "L3 guard format discovery" --feature H51 --priority P1 --severity S1
|
|
44
|
-
/sp:dev-find-issue --category test-loop,guard --min-cost 30m
|
|
45
|
-
/sp:dev-find-issue --source claude --since 2026-07-28 --json
|
|
46
|
-
/sp:dev-find-issue --sessions plugins/sp/skills/issue-finding/examples/session-test-loop.jsonl --no-task
|
|
45
|
+
/sp:dev-find-issue --category test-loop,guard --min-cost 30m
|
|
46
|
+
/sp:dev-find-issue --source claude --since 2026-07-28 --create-task --json
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
| `--feature <id>` | Feature ID to link the generated task to | (none) |
|
|
55
|
-
| `--template <name>` | `meta` (umbrella), `issue` (single), or `standard` | `meta` |
|
|
56
|
-
| `--priority <P0\|P1\|P2\|P3>` | Task frontmatter priority (not bottleneck severity) | `P2` |
|
|
57
|
-
| `--severity <S0\|S1\|S2>` | Minimum bottleneck severity to keep | (all) |
|
|
58
|
-
| `--category <list>` | Comma-separated category ids (`test-loop`, `guard`, …) | `all` |
|
|
59
|
-
| `--since` / `--until` | Session start time bounds | (none) |
|
|
60
|
-
| `--top <n>` | Cap number of fixes/requirements | (no cap) |
|
|
61
|
-
| `--min-cost <duration>` | Drop findings under this waste floor (`30m`, `2h`) | (none) |
|
|
62
|
-
| `--strict-topic` | Drop off-topic findings even if severe | off |
|
|
63
|
-
| `--use-history` | Optional `spur history` import/analyze for cost aggregates | off |
|
|
64
|
-
| `--no-task` | Markdown report only | off |
|
|
65
|
-
| `--json` | JSON findings only (no task) | off |
|
|
49
|
+
**Report-first (task 0556).** Default output is the markdown report to stdout; no task file is
|
|
50
|
+
written. Task creation moved behind `--create-task`. `--use-history` and `--no-task` are removed:
|
|
51
|
+
the history data plane is now the primary source (no flag needed), and the old report-only behavior
|
|
52
|
+
is the new default. Raw JSONL remains a fallback under the three conditions documented in
|
|
53
|
+
`sp:issue-finding`.
|
|
66
54
|
|
|
67
55
|
**See also:** skill `sp:issue-finding` (SSOT), `/sp:dev-runall`, `/sp:dev-dogfood`,
|
|
68
56
|
`sp:daily-summary`, `sp:reverse-engineering`.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Prompt-first feature frontier prioritizer — answers 'which feature should we work on now?' with a ranked, evidence-carrying frontier, and emits rank-distorting tree defects as proposals /sp:dev-featurechange consumes. Triggers: find next, which feature, feature ranking, frontier priority, what should I work on."
|
|
3
|
+
role: planner
|
|
3
4
|
argument-hint: "[--task [<feature-id>]] [--agent <inline|auto|name>] [--auto] [--json]"
|
|
4
5
|
allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
|
|
5
6
|
---
|
|
@@ -19,7 +20,7 @@ Answers *"which X"* — the question `/sp:dev-next` deliberately does not (next-
|
|
|
19
20
|
| Flag | Description | Default |
|
|
20
21
|
| --- | --- | --- |
|
|
21
22
|
| `--task` `[<feature-id>]` | After the report, confirm one target and dispatch the planning half to produce implement-ready tasks. | omitted |
|
|
22
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. |
|
|
23
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
|
|
23
24
|
| `--auto` | Skip the `--task` confirm (accept the offered target) and forward into dispatched children. | off |
|
|
24
25
|
| `--json` | Emit the ranked frontier, gated list, and proposals as a JSON envelope. | off |
|
|
25
26
|
|