@gobing-ai/spur 0.3.66 → 0.3.68
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/corpus-baseline.json +463 -10507
- package/config/templates/docs/99_PROJECT_CONSTITUTION.md +21 -16
- package/config/workflow-composition-baseline.json +109 -59
- package/config/workflows/docs-pipeline.yaml +98 -22
- package/config/workflows/idea-pipeline.yaml +20 -22
- package/config/workflows/task-pipeline.yaml +207 -108
- package/package.json +9 -9
- package/plugins/sp/README.md +6 -7
- package/plugins/sp/agents/expert-spur.md +61 -88
- package/plugins/sp/commands/dev-idea.md +5 -3
- package/plugins/sp/commands/dev-plan.md +3 -1
- package/plugins/sp/commands/dev-review-session.md +2 -1
- package/plugins/sp/hooks/context-post-tool.ts +101 -2
- package/plugins/sp/hooks/context-session-start.ts +22 -1
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/stage-registry-adapter.ts +144 -2
- package/plugins/sp/skills/session-review/SKILL.md +16 -0
- package/plugins/sp/skills/spur-cli/SKILL.md +38 -13
- package/plugins/sp/skills/spur-cli/references/agent.md +7 -4
- package/plugins/sp/skills/spur-cli/references/history.md +69 -0
- package/plugins/sp/skills/spur-cli/references/message.md +2 -2
- package/plugins/sp/skills/spur-cli/references/projects.md +59 -0
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +28 -0
- package/plugins/sp/skills/spur-cli/references/team.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows.md +6 -0
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +40 -16
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +6 -6
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +80 -11
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +18 -13
- package/spur.js +2099 -650
- package/web/_astro/{BoardApp.BEtcJqde.js → BoardApp.BQFbkeqq.js} +15 -15
- package/web/_astro/BoardApp.CTkqrhWd.js +1 -0
- package/web/_astro/{TaskDetail.ClAbCXom.js → TaskDetail.Dl2Eaj1w.js} +1 -1
- package/web/_astro/{arc.CCvf51_y.js → arc.uG14rp8A.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.C0cb0J5M.js → architectureDiagram-3BPJPVTR.Dye6uD_x.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.CIyjqoCE.js → blockDiagram-GPEHLZMM.B9Pkh7Hb.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.fs14IuFs.js → c4Diagram-AAUBKEIU.C2x7SC_X.js} +1 -1
- package/web/_astro/channel.Dsvulp7W.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.CaBKv4ZO.js → chunk-2J33WTMH.D2p4-nWk.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.BOllTPto.js → chunk-4BX2VUAB.S-6jf33o.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.ChEof0O4.js → chunk-55IACEB6.DVXj4Fdh.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.Co2kdjD8.js → chunk-727SXJPM.Dz689FMN.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.SWmfcnog.js → chunk-AQP2D5EJ.KxYj5TnI.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.rDAFifF3.js → chunk-FMBD7UC4.itTQyHQB.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.BCnoXKCw.js → chunk-ND2GUHAM.euSrbJf5.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.RSmy2hDO.js → chunk-QZHKN3VN.OWASJRQy.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.Be7PEfrX.js → classDiagram-4FO5ZUOK.BLvrlpNO.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.Be7PEfrX.js → classDiagram-v2-Q7XG4LA2.BLvrlpNO.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.BkUp2aSK.js → cose-bilkent-S5V4N54A.XBF-rmyD.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.BegGGlUV.js → cynefin-OW5HDTMX.DlCx762Z.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.BkUdjsaC.js → dagre-BM42HDAG.D17Rshxv.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.E9vugt3-.js → diagram-2AECGRRQ.AhBIVJC8.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Dj4yeHXB.js → diagram-5GNKFQAL.C9ximjyC.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.Buaquwli.js → diagram-KO2AKTUF.CZb7Ru_9.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BV3dgGgm.js → diagram-LMA3HP47.BW7LwqoS.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Cnx3s-tc.js → diagram-OG6HWLK6.XC025W0V.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.DKK_abu4.js → erDiagram-TEJ5UH35.CpMXmBDP.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.BNuu9fbm.js → flowDiagram-I6XJVG4X.D2ednJWg.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.b16KUMjy.js → ganttDiagram-6RSMTGT7.BjL9FGKO.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.Kh41lbG5.js → gitGraphDiagram-PVQCEYII.B90g1VGk.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.DEWBXkp-.js → infoDiagram-5YYISTIA.RqgycKtQ.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.DiAdmcL6.js → ishikawaDiagram-YF4QCWOH.Ctn-zt6a.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.D1Ki7IRm.js → journeyDiagram-JHISSGLW.DJhT8Ctp.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.CWUhrQpc.js → kanban-definition-UN3LZRKU.BY1QdejI.js} +1 -1
- package/web/_astro/{linear.BaFsgcCe.js → linear.Di7YObSt.js} +1 -1
- package/web/_astro/{mermaid.core.CHw_AsGy.js → mermaid.core.CbxtJS3Q.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.UIhghgmN.js → mindmap-definition-RKZ34NQL.CxvR4g_J.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.D05l3JUA.js → pieDiagram-4H26LBE5.jNWqnBHH.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.BcWIhIcE.js → quadrantDiagram-W4KKPZXB.BCp12MbA.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.B1rYvKGn.js → requirementDiagram-4Y6WPE33.Dxhm4TyR.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.CKylVRC4.js → sankeyDiagram-5OEKKPKP.BtQXp4J9.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.Dm3uA_s4.js → sequenceDiagram-3UESZ5HK.BWEM1R_Q.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.Bgca_BLe.js → stateDiagram-AJRCARHV.BG3wUkWB.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.C1T7YFrG.js → stateDiagram-v2-BHNVJYJU.BLtMeFVP.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.ZOHJn3Sn.js → timeline-definition-PNZ67QCA.D5fHo0az.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DegZitjD.js → vennDiagram-CIIHVFJN.0DcuMluU.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BDsC115d.js → wardleyDiagram-YWT4CUSO.BZ-dxgHm.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.D0MO70ea.js → xychartDiagram-2RQKCTM6.Bg-XWF7z.js} +1 -1
- package/web/index.html +1 -1
- package/web/_astro/BoardApp.DBEin4N5.js +0 -1
- package/web/_astro/channel.BGn_DUCD.js +0 -1
|
@@ -46,6 +46,9 @@ cross-agent windows, recurrence, trends, or quantitative performance forensics.
|
|
|
46
46
|
name the confirmation needed.
|
|
47
47
|
- State `not available` when compaction or missing output removed evidence. Never reconstruct it from
|
|
48
48
|
memory or claim a verification that did not run.
|
|
49
|
+
- Derive timing only from timestamps and tool-call records visible in the active session. Use
|
|
50
|
+
non-overlapping stages whose durations sum to elapsed time; render unavailable duration or call
|
|
51
|
+
counts as `n/a` instead of estimating them.
|
|
49
52
|
|
|
50
53
|
## Triage mode (`--triage`)
|
|
51
54
|
|
|
@@ -91,6 +94,19 @@ three buckets — never skip triage and start fixing from the raw findings list.
|
|
|
91
94
|
|
|
92
95
|
State the overall result in one to three sentences, including partial or blocked scope.
|
|
93
96
|
|
|
97
|
+
### Time breakdown
|
|
98
|
+
|
|
99
|
+
Summarize elapsed time and, when supported by evidence, productive work, avoidable setup/recovery,
|
|
100
|
+
and operator wait time. Then render non-overlapping stages:
|
|
101
|
+
|
|
102
|
+
| Stage | Time | Tool calls | Assessment |
|
|
103
|
+
| --- | ---: | ---: | --- |
|
|
104
|
+
|
|
105
|
+
Format durations as `M:SS` below one hour and `H:MM:SS` at one hour or above (`1:44`, not `1m44s`;
|
|
106
|
+
`0:33`, not `33s`). Include a `Total` row when elapsed time is available. Keep operator approval
|
|
107
|
+
waits separate from execution bottlenecks. Use `n/a` for any value not supported by the active
|
|
108
|
+
session evidence.
|
|
109
|
+
|
|
94
110
|
### Resolved issues
|
|
95
111
|
|
|
96
112
|
| Issue | Root cause | Resolution | Evidence |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli
|
|
3
|
-
description: "
|
|
3
|
+
description: "Reference and operate the complete `spur` CLI surface: task, feature, rule, workflow, builder, agent, message, team, self, history, and projects. Use for verb or flag lookup, machine-readable output and exit contracts, or CLI-gated corpus writes. Triggers: \"spur task\", \"spur history\", \"spur projects\", \"create a task\", \"task check\", and any Spur CLI convention. Not for planning or execution lifecycle orchestration (`sp:spur-dev`)."
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: spur
|
|
@@ -19,15 +19,17 @@ metadata:
|
|
|
19
19
|
- message
|
|
20
20
|
- team
|
|
21
21
|
- self
|
|
22
|
+
- history
|
|
23
|
+
- projects
|
|
22
24
|
openclaw:
|
|
23
25
|
emoji: "🧰"
|
|
24
26
|
---
|
|
25
27
|
|
|
26
28
|
# spur-cli — the CLI facade for the Spur command surface
|
|
27
29
|
|
|
28
|
-
`spur-cli` is the single reference for operating the **`spur` command-line surface**. Each
|
|
29
|
-
noun
|
|
30
|
-
|
|
30
|
+
`spur-cli` is the single reference for operating the **`spur` command-line surface**. Each visible
|
|
31
|
+
noun has one reference file that documents *what each verb is, how to use it well, its flags,
|
|
32
|
+
machine-readable output, and material exit semantics*. This skill is a **facade /
|
|
31
33
|
dispatch reference** — it tells you which verb does what and routes you to the noun's detail. It is
|
|
32
34
|
**not** an orchestrator and contains **no competency logic**: the skill knows *how to invoke*; the
|
|
33
35
|
CLI knows *what is valid*; the **spine** (`sp:spur-dev`) knows *how to drive the lifecycle*.
|
|
@@ -47,18 +49,20 @@ Pick the noun, read its reference. Each Tier A and Tier B reference owns that no
|
|
|
47
49
|
| **Tier B** | **message** | Durable inter-agent messaging: send, inbox, reply, watch | [references/message.md](references/message.md) |
|
|
48
50
|
| **Tier B** | **team** | Team coordination and supervision: assign, status, up/down rosters, start/stop supervised processes | [references/team.md](references/team.md) |
|
|
49
51
|
| **Tier B** | **self** | Self-management verbs: scaffold (`init`), schema migrations (`migrate`), local web server (`serve`), status overview (`status`); `self init` runs post-scaffold validation probes & layout classification | [references/self.md](references/self.md) |
|
|
50
|
-
| **Tier
|
|
52
|
+
| **Tier B** | **history** | Import agent histories, aggregate forensic artifacts, render reports, and run the checkpoint-resumed daily pipeline | [references/history.md](references/history.md) |
|
|
53
|
+
| **Tier B** | **projects** | Manage the local multi-project registry and start/stop project servers | [references/projects.md](references/projects.md) |
|
|
54
|
+
| **Tier C** | **help** | Commander-generated help command; not a Spur noun | Generated `--help` |
|
|
51
55
|
|
|
52
|
-
**Execute-First Contract:** Load
|
|
56
|
+
**Execute-First Contract:** Load the noun reference first and execute Tier A or Tier B commands
|
|
57
|
+
without calling `spur --help`. Use the source-local `spur <noun> [verb] --help` only for version
|
|
58
|
+
skew, unlisted long-tail flags, or a parity assertion failure.
|
|
53
59
|
|
|
54
60
|
### Tier C exclusion reasons
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
The only exclusion is generated by Commander and is not a product noun:
|
|
57
63
|
|
|
58
64
|
| Noun | Reason |
|
|
59
65
|
| ------ | -------- |
|
|
60
|
-
| `history` | `report` verb is a TODO stub (`spur history report` prints a marker); surface is still converging. |
|
|
61
|
-
| `projects` | Multi-project management surface (`add`/`remove`/`list`/`start`/`stop`); still evolving and not yet stable enough for a reference. |
|
|
62
66
|
| `help` | Auto-generated by Commander.js; not a real noun. |
|
|
63
67
|
|
|
64
68
|
Each noun's per-topic detail lives one level deeper under `references/<noun>/` (e.g.
|
|
@@ -74,6 +78,8 @@ Use this skill to:
|
|
|
74
78
|
or run a workflow, from the command line.
|
|
75
79
|
- **Author within a noun** — write a rule, author a workflow, write acceptance criteria — following
|
|
76
80
|
the noun reference's conventions.
|
|
81
|
+
- **Operate local analytics and project management** — import/analyze/report history or manage the
|
|
82
|
+
multi-project registry through their references.
|
|
77
83
|
|
|
78
84
|
Do **not** use this skill for:
|
|
79
85
|
|
|
@@ -89,6 +95,22 @@ file** (`references/<noun>.md`), plus an optional `references/<noun>/` subdir fo
|
|
|
89
95
|
detail, plus one row in the Noun-routing table above. Do not create a separate `spur-<noun>` skill —
|
|
90
96
|
the whole point of this facade is that the CLI surface has a single, scalable home.
|
|
91
97
|
|
|
98
|
+
## Source and machine-output contract
|
|
99
|
+
|
|
100
|
+
The implementation authority is `apps/cli/src/index.ts` plus the noun registration module under
|
|
101
|
+
`apps/cli/src/commands/`; application-service output types remain authoritative for payload fields.
|
|
102
|
+
When a reference and the source-local CLI disagree, stop, cite the source symbol, and repair the
|
|
103
|
+
reference in the same change. The live parity gate is
|
|
104
|
+
`plugins/sp/tests/cli-surface-parity.test.ts`.
|
|
105
|
+
|
|
106
|
+
Do not assume every verb supports JSON. When `<noun> <verb> --help` advertises `--json`, parse
|
|
107
|
+
stdout as one JSON document (or one document per row for documented streams). When it also
|
|
108
|
+
advertises `--json-envelope`, raw JSON remains the default; the opt-in shape is
|
|
109
|
+
`{ ok: true, data }` / `{ ok: false, error }`, with paginated list metadata where applicable.
|
|
110
|
+
`SPUR_JSON_ENVELOPE=1` enables the same seam unless an explicit flag overrides it. The guarded
|
|
111
|
+
inventory and deliberate raw exceptions live in `docs/04_DESIGN.md` §4.1 and
|
|
112
|
+
`apps/cli/tests/json-envelope-inventory.test.ts`; do not duplicate that inventory here.
|
|
113
|
+
|
|
92
114
|
## What this skill is NOT
|
|
93
115
|
|
|
94
116
|
- **Not the spine.** Driving a task through `task-pipeline.yaml`, HITL surfacing, decomposition, and
|
|
@@ -126,20 +148,23 @@ and spreading it; full contract in `docs/04_DESIGN.md` §1.0.1.
|
|
|
126
148
|
- **[references/self.md](references/self.md)** - `spur self init|migrate|serve|status` CLI verbs
|
|
127
149
|
(the four legacy top-level nouns remain hidden aliases). `self init` runs post-scaffold init
|
|
128
150
|
validation (Phase 1.5/1.6 probes).
|
|
151
|
+
- **[references/history.md](references/history.md)** - history import, forensic artifact analysis,
|
|
152
|
+
pure report rendering, and the daily pipeline.
|
|
153
|
+
- **[references/projects.md](references/projects.md)** - local multi-project registry and server
|
|
154
|
+
lifecycle.
|
|
129
155
|
- **`sp:spur-dev`** - the spine that dispatches these verbs into the planning +
|
|
130
156
|
execution lifecycle. Use it to *drive* work; use this facade to *look up or operate a verb*.
|
|
131
157
|
- **`plugins/sp/references/roles.md`** — the Layer-1 role→tier table (`scribe` / `coder` /
|
|
132
158
|
`reviewer` / `planner`, one per tier). The facade's nouns/verbs serve those roles; the table is
|
|
133
159
|
the role vocabulary, the operator config maps tiers to executors.
|
|
134
|
-
- **`sp:expert-spur`** — the subagent that loads this facade for multi-step, multi-noun corpus work
|
|
135
|
-
in its own context window.
|
|
136
160
|
|
|
137
161
|
## Platform Notes
|
|
138
162
|
|
|
139
163
|
### Claude Code
|
|
140
164
|
|
|
141
|
-
`spur` CLI via the Bash tool
|
|
142
|
-
directly via `Skill(skill="sp:spur-cli", args="<noun> <verb> …")` to look up or operate
|
|
165
|
+
Run the `spur` CLI via the Bash tool. Use `--json` only where the selected verb advertises it. Invoke
|
|
166
|
+
this skill directly via `Skill(skill="sp:spur-cli", args="<noun> <verb> …")` to look up or operate
|
|
167
|
+
a verb.
|
|
143
168
|
|
|
144
169
|
### Codex / OpenClaw / OpenCode / Antigravity
|
|
145
170
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli-agent
|
|
3
|
-
description: "spur-cli noun reference: operate `spur agent` as the coding-agent execution surface - run prompts
|
|
3
|
+
description: "spur-cli noun reference: operate `spur agent` as the coding-agent execution surface - run prompts, wait on pinned occupants, manage team agent specs, run the persistent self-draining loop, and check readiness."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
@@ -9,7 +9,7 @@ see_also:
|
|
|
9
9
|
|
|
10
10
|
`spur agent` is the CLI for **running and inspecting coding agents**. It wraps the agents the
|
|
11
11
|
operator already has installed (Claude Code, Codex, omp, OpenCode, Antigravity, etc.) behind a
|
|
12
|
-
uniform
|
|
12
|
+
uniform run, wait, loop, and spec-management surface, so the rest of the harness can dispatch work without
|
|
13
13
|
hard-coding a specific agent.
|
|
14
14
|
|
|
15
15
|
This is a **companion reference**, not an orchestrator. It documents *what each verb is and how to
|
|
@@ -30,8 +30,9 @@ that before using `run` for fan-out dispatch.
|
|
|
30
30
|
| `edit <id>` | Open an agent spec in `$EDITOR`, or print its path | - |
|
|
31
31
|
| `delete <id>` | Remove an agent spec | `--force` |
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
`list`, `doctor`, `run`, `wait`, and `create` accept `--json` plus `--json-envelope`. `loop`, `edit`,
|
|
34
|
+
and `delete` are human/process-control surfaces. **Exit codes:** `0` success, `1` failure, and `2`
|
|
35
|
+
invalid usage; `run` can also propagate the invoked agent's non-zero result.
|
|
35
36
|
|
|
36
37
|
## `run` - execute a prompt via a coding agent
|
|
37
38
|
|
|
@@ -56,6 +57,7 @@ through a coding agent as an external process, producing a persisted run record
|
|
|
56
57
|
| `--spec <id>` | Team agent spec id (occupant addressing, 0542 R1). Pairs with `--drain`; with `--spec` alone the run is addressed to the occupant without touching the inbox. A legacy `--agent <spec-id>` still works during the transition with a one-time warning (shim `agent-flag-spec-id`). |
|
|
57
58
|
| `--drain` | Prepend pending inbox messages addressed to `--spec <id>` before the prompt. |
|
|
58
59
|
| `--json` | Output machine-readable JSON where supported. |
|
|
60
|
+
| `--json-envelope` | Wrap JSON using the facade's standard output contract. |
|
|
59
61
|
|
|
60
62
|
`--json` adds a `resolved` block (`{ role?, tier?, executor?, agent, source }`) reporting the
|
|
61
63
|
resolution decision — the role, its tier, and the executor that won for role routing; the pin for
|
|
@@ -125,6 +127,7 @@ exits 2 naming the accepted vocabulary. Resolution collapses onto the same ident
|
|
|
125
127
|
|
|
126
128
|
| Flag | Purpose |
|
|
127
129
|
| ------ | --------- |
|
|
130
|
+
| `--role <name>` | Resolve a Layer-1 role or executor name to exactly one materialized instance; mutually exclusive with `[specId]`. |
|
|
128
131
|
| `--run <runId>` | Pin a specific run id (default: the spec's latest run). |
|
|
129
132
|
| `--until <state>` | Lifecycle state to wait for (repeatable OR): `idle` \| `working` \| `invoke-exit` \| `blocked`. Default `idle`. |
|
|
130
133
|
| `--timeout <ms>` | Caller deadline. Undefined = no deadline (stall budget still applies). |
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spur-cli-history
|
|
3
|
+
description: "spur-cli noun reference: operate `spur history` to import coding-agent transcripts, aggregate versioned forensic artifacts, render an artifact without database access, or run the checkpoint-resumed daily pipeline."
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-cli
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# spur history - local forensic analytics
|
|
9
|
+
|
|
10
|
+
`spur history` is the local history data plane: import transcripts into SQLite, aggregate a
|
|
11
|
+
versioned artifact, render that artifact, or run the daily composition. Command registration and
|
|
12
|
+
CLI guards live in `apps/cli/src/commands/history.ts` (`registerHistoryCommand`); payload contracts
|
|
13
|
+
live in `packages/app/src/services/history-service.ts` (`FanOutResult`, `DailyResult`,
|
|
14
|
+
`HistoryService`, `runHistoryReport`) and `packages/domain/src/analytics/artifact.ts`
|
|
15
|
+
(`HistoryArtifact`).
|
|
16
|
+
|
|
17
|
+
## Verb map
|
|
18
|
+
|
|
19
|
+
| Verb | Purpose | Key flags |
|
|
20
|
+
| ---- | ------- | --------- |
|
|
21
|
+
| `import` | Import one source or fan out across all supported sources | `--source <source>` `--file <path>` `--root <path>` `--mode <mode>` `--dry-run` `--source-timeout <ms>` `--json` |
|
|
22
|
+
| `analyze` | Aggregate imported rows and write a versioned forensic artifact | `--since <iso>` `--until <iso>` `--source <source>` `--session <id>` `--run <runId>` `--task <wbs>` `--top <n>` `--out <path>` `--json` |
|
|
23
|
+
| `report [path]` | Purely render an existing artifact; default to `latest.json` | `--mode <name>` `--task <wbs>` `--top <n>` `--json` |
|
|
24
|
+
| `daily` | Run import-all → analyze → artifact → 90-day report pruning once | `--since <iso>` `--until <iso>` `--root <path>` `--source-timeout <ms>` `--mode <name>` `--json` |
|
|
25
|
+
|
|
26
|
+
Every JSON-capable verb also advertises `--json-envelope`; use the facade's machine-output contract.
|
|
27
|
+
|
|
28
|
+
## `import` - isolated fan-out
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
bun run apps/cli/src/index.ts history import --source all --dry-run --json
|
|
32
|
+
bun run apps/cli/src/index.ts history import --source codex --mode incremental --json
|
|
33
|
+
bun run apps/cli/src/index.ts history import --source codex --file session.jsonl --mode force-file --json
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- `--source all` and a single source use the same per-source fan-out path. A failed/timed-out source
|
|
37
|
+
does not abort its siblings.
|
|
38
|
+
- Modes are `incremental`, `full`, and `force-file`. `--file` with the default `all` source is a
|
|
39
|
+
usage error. `--file --mode full` requires `--dry-run`; use `force-file` for a real single-file
|
|
40
|
+
write.
|
|
41
|
+
- JSON contains `entries`, `warnings`, `exitCode`, and CLI/importer `provenance`. For real-data
|
|
42
|
+
validation, invoke the source-local CLI and record that provenance; never trust a bare global
|
|
43
|
+
`spur` that may be stale.
|
|
44
|
+
- Exit `0` when every source is clean/empty, `2` for a mixed failure or any degraded source, and `1`
|
|
45
|
+
when all sources fail. CLI usage guards also exit `1` on this noun.
|
|
46
|
+
|
|
47
|
+
## `analyze` - artifact writer
|
|
48
|
+
|
|
49
|
+
`analyze` performs SQL aggregation over imported history and writes a stable, versioned
|
|
50
|
+
`HistoryArtifact`. Selectors combine with AND. `--top` bounds leaderboards, not totals. `--out`
|
|
51
|
+
overrides the dated report path; otherwise the service writes under `.spur/reports/history/` and
|
|
52
|
+
updates `latest.json`. Human mode renders a summary; `--json` emits the artifact.
|
|
53
|
+
|
|
54
|
+
## `report` - pure artifact renderer
|
|
55
|
+
|
|
56
|
+
`report` never opens the database. It reads an explicit artifact or the `latest.json` pointer,
|
|
57
|
+
validates the schema version, optionally narrows the loaded artifact with `--task` / `--top`, and
|
|
58
|
+
renders `default` or `forensics` mode. Unknown modes, invalid `--top`, missing/mismatched task
|
|
59
|
+
dimensions, missing artifacts, and schema mismatches exit `1` instead of silently widening output.
|
|
60
|
+
|
|
61
|
+
## `daily` - run-once composition
|
|
62
|
+
|
|
63
|
+
`daily` runs incremental import-all, analyze, artifact write, and report-directory pruning in one
|
|
64
|
+
process. `--since` / `--until` scope analysis only, not import. Checkpoints make a missed run resume
|
|
65
|
+
without double-counting. The result carries `{ fanOut, artifact, pruned, coverage, reportPath? }`;
|
|
66
|
+
its exit code is the fan-out exit code. `--mode` adds a rendered sidecar after analysis.
|
|
67
|
+
|
|
68
|
+
For the full artifact and data-plane contracts, use `docs/04_DESIGN.md` history sections and
|
|
69
|
+
`docs/design/history-data-processing.md`; do not infer fields from rendered prose.
|
|
@@ -24,8 +24,8 @@ use it well*.
|
|
|
24
24
|
| `reply <msg-id> <body>` | Thread a reply to a message | `--json` |
|
|
25
25
|
| `watch` | Follow an agent inbox - surface new messages as they arrive | `--agent <id>` `--interval <ms>` `--json` |
|
|
26
26
|
|
|
27
|
-
All verbs accept `--json`
|
|
28
|
-
invalid usage.
|
|
27
|
+
All verbs accept `--json` and `--json-envelope`. `watch` applies the envelope per emitted row.
|
|
28
|
+
**Exit codes:** `0` success, `1` error, `2` invalid usage.
|
|
29
29
|
|
|
30
30
|
## `send` - enqueue a message
|
|
31
31
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spur-cli-projects
|
|
3
|
+
description: "spur-cli noun reference: operate `spur projects` to register local project roots, inspect live status, start detached project servers, and stop or remove registry entries."
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-cli
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# spur projects - local multi-project registry
|
|
9
|
+
|
|
10
|
+
`spur projects` manages the machine-local registry resolved by
|
|
11
|
+
`packages/config/src/projects.ts` (`getProjectsFilePath`) and implemented by
|
|
12
|
+
`packages/app/src/services/project-registry.ts` (`ProjectRegistry`). Server startup is owned by
|
|
13
|
+
`packages/app/src/services/project-start.ts` (`startRegisteredProject`); CLI registration and JSON
|
|
14
|
+
shapes live in `apps/cli/src/commands/projects.ts`.
|
|
15
|
+
|
|
16
|
+
## Verb map
|
|
17
|
+
|
|
18
|
+
| Verb | Purpose | Key flags |
|
|
19
|
+
| ---- | ------- | --------- |
|
|
20
|
+
| `add <path>` | Upsert an existing path in the registry | `--name <name>` `--json` |
|
|
21
|
+
| `remove <target>` | Remove an entry by display name or path | `--json` |
|
|
22
|
+
| `list` | List entries with live running status | `--json` |
|
|
23
|
+
| `start <target>` | Start or reuse a detached project server | `--port <n>` `--json` |
|
|
24
|
+
| `stop <target>` | Best-effort stop the listener and clear its recorded port | `--json` |
|
|
25
|
+
|
|
26
|
+
Every verb also advertises `--json-envelope`; use the facade's machine-output contract. Success is
|
|
27
|
+
exit `0`; validation, registry, spawn, health, or lookup failure is exit `1`.
|
|
28
|
+
|
|
29
|
+
## Registry behavior
|
|
30
|
+
|
|
31
|
+
- The default file is `~/.config/spur/projects.json`; `SPUR_PROJECTS_FILE` overrides it. Entries are
|
|
32
|
+
`{ name, path, port }`, where `port: 0` means stopped.
|
|
33
|
+
- Paths are normalized (including `~`) and existing paths resolve to real paths. Name lookup is
|
|
34
|
+
case-insensitive. Registry mutations use an advisory lock.
|
|
35
|
+
- `add` requires an existing path, resolves a relative path from the current working directory, and
|
|
36
|
+
defaults the display name to its basename. It upserts; it does not start a server. The current
|
|
37
|
+
source does not enforce a `.spur/` marker or directory type.
|
|
38
|
+
- `list` probes recorded ports and heals stale entries to `port: 0` before reporting `running`.
|
|
39
|
+
|
|
40
|
+
## Server lifecycle
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
spur projects start my-project --json
|
|
44
|
+
spur projects start /path/to/unregistered/project --port 3333 --json
|
|
45
|
+
spur projects stop my-project --json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`start` resolves by name or path. An existing unregistered path is auto-registered. A live recorded
|
|
49
|
+
port is returned idempotently; otherwise the service allocates a port (3000–3999 unless explicitly
|
|
50
|
+
set), spawns `spur serve --host 127.0.0.1 --no-open` detached in the project root, waits for the port,
|
|
51
|
+
then persists it.
|
|
52
|
+
|
|
53
|
+
`stop` finds processes bound to the recorded port, sends `SIGTERM` best-effort while excluding the
|
|
54
|
+
CLI and its parent, and clears the registry port. It is not a persistent supervisor contract.
|
|
55
|
+
`remove` only removes the registry entry; stop a running project first when process cleanup matters.
|
|
56
|
+
|
|
57
|
+
Raw JSON success payloads are verb-specific (`project`, `projects`, `removed`, `stopped`, or start
|
|
58
|
+
status fields). Under `--json-envelope` they move beneath `data`; failures normalize beneath
|
|
59
|
+
`error`. Read `apps/cli/src/commands/projects.ts` for exact fields.
|
|
@@ -223,6 +223,18 @@ the active tasks folder (or `--folder`).
|
|
|
223
223
|
| `--folder <path>` | Custom tasks folder. |
|
|
224
224
|
| `--json` | Machine-readable report envelope. |
|
|
225
225
|
|
|
226
|
+
## `migrate-anchors`
|
|
227
|
+
|
|
228
|
+
Qualify ambiguous in-repo evidence anchors to repo-relative paths across the task corpus. Run
|
|
229
|
+
`--dry-run` first: unambiguous matches are reported in `qualified`, multiple matches in `ambiguous`
|
|
230
|
+
without rewriting, and schema-incompatible files in `skipped`. The write path uses the planning
|
|
231
|
+
service rather than raw file edits.
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
spur task migrate-anchors --dry-run --json
|
|
235
|
+
spur task migrate-anchors --json
|
|
236
|
+
```
|
|
237
|
+
|
|
226
238
|
## `resolve <file-path>`
|
|
227
239
|
|
|
228
240
|
Map a file path to its **owning task** — returns the WBS + task file. Strategies, in order: direct
|
|
@@ -329,6 +341,19 @@ A free-form prose answer (no tables, or tables missing the required headers) yie
|
|
|
329
341
|
the artifact source and directs the operator to `/sp:dev-verify <wbs>`. Re-run verify with the
|
|
330
342
|
table format above.
|
|
331
343
|
|
|
344
|
+
## `verifyall-aggregate`
|
|
345
|
+
|
|
346
|
+
Read a JSON array of `{wbs,outcome[,reason]}` rows from `--from-file` (default
|
|
347
|
+
`.spur/run/verifyall-batch-input.json`) and derive one deterministic batch verdict. Valid outcomes
|
|
348
|
+
are `PASS`, `PARTIAL`, `FAIL`, `NOT-STARTED`, and `UNKNOWN`; `NOT-STARTED` rows are reported but
|
|
349
|
+
excluded from rollup. Exit `1` when the aggregate verdict is `FAIL` or the input is invalid.
|
|
350
|
+
|
|
351
|
+
## `scaffold-tests <wbs>`
|
|
352
|
+
|
|
353
|
+
Generate BDD stubs from the task's Acceptance Criteria. `--file <path>` overrides the target test
|
|
354
|
+
file; `--folder <path>` overrides task lookup. JSON reports the target plus created, skipped,
|
|
355
|
+
drifted, and warning results.
|
|
356
|
+
|
|
332
357
|
## `refresh-roster <wbs>`
|
|
333
358
|
|
|
334
359
|
Regenerate a parent task's sub-task roster block in `## Plan` — the marker-delimited table that the
|
|
@@ -367,12 +392,15 @@ spur task sections <wbs> <init|add|list> [name] [--folder] [--json]
|
|
|
367
392
|
spur task list [--status <s>] [--phase <p>] [--parent <wbs>] [--feature <id>] [--folder] [--json]
|
|
368
393
|
spur task refresh [--folder] [--json]
|
|
369
394
|
spur task migrate [--dry-run] [--folder] [--json]
|
|
395
|
+
spur task migrate-anchors [--dry-run] [--json]
|
|
370
396
|
spur task refresh-roster <wbs> [--folder] [--json]
|
|
371
397
|
spur task batch-create --file <path> [--folder] [--json]
|
|
372
398
|
spur task record <wbs> [--verdict-file <p>] [--solution-from-diff] [--transition <s>] [--folder] [--json]
|
|
373
399
|
spur task verdict <wbs> [--from-answer <p>] [--folder] [--json]
|
|
400
|
+
spur task verifyall-aggregate [--from-file <path>] [--json]
|
|
374
401
|
spur task check [wbs] [--strict] [--as <status>] [--strict-core] [--folder] [--json]
|
|
375
402
|
spur task resolve <file-path> [--strict] [--folder] [--json]
|
|
376
403
|
spur task path <wbs> [--folder] [--json]
|
|
377
404
|
spur task run-link <wbs> [--source <src>] [--run-id <id>] [--json]
|
|
405
|
+
spur task scaffold-tests <wbs> [--file <path>] [--folder] [--json]
|
|
378
406
|
```
|
|
@@ -26,7 +26,7 @@ use it well*.
|
|
|
26
26
|
| `start <agent-id>` | Start a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
27
27
|
| `stop <agent-id>` | Stop a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
28
28
|
|
|
29
|
-
All verbs accept `--json`
|
|
29
|
+
All verbs except the text-only `assign` accept `--json` and `--json-envelope`. `--server <url>` (default:
|
|
30
30
|
`http://localhost:3000/api`) targets the supervisor API started by `spur serve`. **Exit codes:** `0`
|
|
31
31
|
success, `1` error, `2` invalid usage.
|
|
32
32
|
|
|
@@ -264,6 +264,12 @@ spur workflow list [--json]
|
|
|
264
264
|
spur workflow trace [run-id] [--workflow <name>] [--status <s>] [--since <iso>] [--last <n>] [--follow] [--poll <ms>] [--output] [--json]
|
|
265
265
|
```
|
|
266
266
|
|
|
267
|
+
### `show` - project a definition
|
|
268
|
+
|
|
269
|
+
`spur workflow show <file>` renders the declared graph as Mermaid. `--format todo` instead emits a
|
|
270
|
+
declared-step checklist; `--json` serializes the selected projection. This verb intentionally does
|
|
271
|
+
not advertise `--json-envelope` because its JSON projection is a kept-raw document surface.
|
|
272
|
+
|
|
267
273
|
| Flag (on `run`) | Effect |
|
|
268
274
|
| --------------- | ------ |
|
|
269
275
|
| `--vars <json>` | Per-run variable overrides (JSON object). Merged over the workflow's `vars`. Values must be strings. User vars win over injected defaults (`spurBin`). |
|
|
@@ -96,9 +96,9 @@ surface is already resolved and name the trigger / `operator override`. A comman
|
|
|
96
96
|
inside that subprocess boundary runs its backing skill in that process; it must not spawn another
|
|
97
97
|
`spur agent run` for the same trigger. This prevents recursive dispatch.
|
|
98
98
|
|
|
99
|
-
**Pipeline wrappers (`dev-run`, `dev-runall`)** — the orchestrator is a loop; its *stages* do the
|
|
99
|
+
**Pipeline wrappers (`dev-run`, `dev-runall`, `dev-idea`, `dev-plan`)** — the orchestrator is a loop; its *stages* do the
|
|
100
100
|
model-bearing work. Interactive omit/`inline` therefore uses the
|
|
101
|
-
[inline pipeline driver](inline-pipeline-driver.md): it reads
|
|
101
|
+
[inline pipeline driver](inline-pipeline-driver.md): it reads the selected pipeline YAML, executes each
|
|
102
102
|
`agent.run` input through the backing skill in the host session, and preserves every shell action
|
|
103
103
|
and guard. `auto` or a named executor is merged into per-task `vars.agent` and
|
|
104
104
|
`vars.implementAgent`, and the workflow's `agent.run` steps run under that subprocess executor (see
|
|
@@ -122,9 +122,11 @@ leg for eligible stages. Operator
|
|
|
122
122
|
confirmation actions, `pause: true`, and approve/taste/ask decisions stay host-owned. Each inline
|
|
123
123
|
model stage appends `stage <id> executed inline in session <session-id>` to its run log; a
|
|
124
124
|
subagent-dispatched stage appends `stage <id> executed via subagent <agent-id> (host session
|
|
125
|
-
<session-id>)` instead. `dev-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
<session-id>)` instead. `dev-idea` and `dev-plan` also drive `idea-pipeline.yaml` in the host session,
|
|
126
|
+
with no native subagent unless the operator explicitly requests delegation. `--agent auto` or a
|
|
127
|
+
name, parallel batches, and every headless `spur workflow run` / `spur agent run` use subprocesses;
|
|
128
|
+
dev-command workflow subprocesses launch `--async` so cancellation owns a process group and only
|
|
129
|
+
`killed: true` means a live run stopped. `dev-run --mode implement` continues to run its single competency in-session under omitted
|
|
128
130
|
`--agent` or explicit `--agent inline` (identical values, 0687 R1).
|
|
129
131
|
|
|
130
132
|
### Executor precedence chain (R7)
|
|
@@ -143,7 +145,7 @@ resolved in this order; first match wins:
|
|
|
143
145
|
`--agent auto` tier-resolves an executor (stage `model_policy` → `agent.default` → tier priority)
|
|
144
146
|
**before** merging, so it enters the chain at step 1 already resolved to a concrete name.
|
|
145
147
|
On a headless workflow surface, explicit `--agent inline` substitutes tier resolution with a warning
|
|
146
|
-
(0687 R3) instead of rejecting — it resolves exactly like an omitted flag. Interactive
|
|
148
|
+
(0687 R3) instead of rejecting — it resolves exactly like an omitted flag. Interactive pipeline wrappers
|
|
147
149
|
consume both inline resolutions identically (0508 eligibility as generalized by 0687 R2) before this
|
|
148
150
|
chain and use the host driver. Omitting the flag on a headless surface forwards nothing, so the
|
|
149
151
|
spawned step resolves to `agent.default` (step 2) or the YAML literal (step 3).
|
|
@@ -193,18 +195,17 @@ explicit process boundary and retain their existing resolution, output, timeout,
|
|
|
193
195
|
contracts. The interactive task wrapper does not change the YAML or engine; it reads the YAML as
|
|
194
196
|
SSOT and interprets the actions in-session before any workflow subprocess exists. It records inline
|
|
195
197
|
provenance without fabricating an `AgentRunTracedResult`.
|
|
196
|
-
`spur agent run`
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
CLI's resolution.
|
|
198
|
+
`spur agent run` resolves omitted or explicit `inline` through tier substitution on its headless
|
|
199
|
+
surface and emits one warning naming the concrete executor; `auto` tier-resolves without the inline
|
|
200
|
+
warning. Interactive dev wrappers consume inline before this boundary, so they never spawn it.
|
|
200
201
|
|
|
201
202
|
### Inline trade-off
|
|
202
203
|
|
|
203
204
|
Inline avoids process startup and preserves the host session's context and tools. Relative to
|
|
204
205
|
subprocess dispatch it provides **no isolated workspace**, **no per-stage subprocess action
|
|
205
206
|
record**, **no independent timeout or abort boundary**, and **no tier-selected executor**: the
|
|
206
|
-
executor is the current coding agent. Interactive
|
|
207
|
-
|
|
207
|
+
executor is the current coding agent. Interactive pipelines retain a run log and session provenance
|
|
208
|
+
through the inline driver; task pipelines additionally record a task run-link. If process isolation or an independently killable
|
|
208
209
|
stage is required, select the subprocess path (`--agent auto` or `--agent <name>`).
|
|
209
210
|
|
|
210
211
|
## Every write is CLI-gated
|
|
@@ -611,22 +612,30 @@ CLI-gated corpus artifact. The `wrapup-pipeline.yaml` `learning-capture` step wr
|
|
|
611
612
|
## Session Checkpoint Convention
|
|
612
613
|
|
|
613
614
|
Long-running pipelines write resumable checkpoints to `.spur/memory/sessions/` so an interrupted
|
|
614
|
-
run can be resumed. The
|
|
615
|
-
|
|
615
|
+
run can be resumed. The canonical frontmatter schema below is parsed by
|
|
616
|
+
`packages/app/src/workflow/checkpoint-contract.ts` (task 0711): a checkpoint that does not match
|
|
617
|
+
it is ignored by routing/cleanup (safe fallthrough) and never reclaimed.
|
|
616
618
|
|
|
617
|
-
**Format:** Markdown file with YAML frontmatter:
|
|
619
|
+
**Format:** Markdown file with YAML frontmatter (canonical field set, task 0711):
|
|
618
620
|
|
|
619
621
|
```yaml
|
|
620
622
|
---
|
|
623
|
+
schema_version: 1
|
|
621
624
|
session_id: "2026-07-01-0167"
|
|
622
625
|
workflow: "task-pipeline"
|
|
623
626
|
run_id: "wf_..."
|
|
624
627
|
task_wbs: "0167"
|
|
625
628
|
feature_id: "I"
|
|
626
629
|
phase: "verify"
|
|
630
|
+
status: "running"
|
|
627
631
|
last_gate: "review-approved"
|
|
628
|
-
|
|
632
|
+
source_commit: "<full 40-hex HEAD at write time>"
|
|
633
|
+
digest: "sha256:..."
|
|
634
|
+
generated_at: "2026-07-01T18:30:00Z"
|
|
635
|
+
updated_at: "2026-07-01T18:30:00Z"
|
|
629
636
|
next_action: "run verification"
|
|
637
|
+
artifacts:
|
|
638
|
+
- .spur/run/0167-verdict.json
|
|
630
639
|
---
|
|
631
640
|
|
|
632
641
|
## Session Notes
|
|
@@ -634,6 +643,17 @@ next_action: "run verification"
|
|
|
634
643
|
<free-form markdown: what was done, what's pending, any blockers>
|
|
635
644
|
```
|
|
636
645
|
|
|
646
|
+
Field semantics (enforced by `parseCheckpointMetadata` / `checkpointStaleness`):
|
|
647
|
+
|
|
648
|
+
- `schema_version` must be `1`; any other value → ignored.
|
|
649
|
+
- `status` is one of `running|pending|approved|done|failed|cancelled|skipped`. A terminal status
|
|
650
|
+
(`done|failed|cancelled|skipped`) marks the checkpoint terminal — never resumed, only cleaned
|
|
651
|
+
up once retention expires.
|
|
652
|
+
- `source_commit` pins repository HEAD at write time; drift staleness is reported, not hidden.
|
|
653
|
+
- `artifacts` lists referenced run files; a missing artifact makes the checkpoint stale.
|
|
654
|
+
- Writers: write after every HITL gate decision, phase transition, and terminal state; overwrite
|
|
655
|
+
the same file on resume (`session_id` = `<date>-<wbs-or-feature>`).
|
|
656
|
+
|
|
637
657
|
**Write checkpoints after:**
|
|
638
658
|
|
|
639
659
|
- Every HITL gate decision (approved/rejected/deferred).
|
|
@@ -652,6 +672,10 @@ next_action: "run verification"
|
|
|
652
672
|
- **Not CLI-gated.** Checkpoint files are written directly by the pipeline's checkpoint action
|
|
653
673
|
(a `shell` step that writes to `.spur/memory/sessions/<session-id>.md`). They do not go through
|
|
654
674
|
`spur task update`.
|
|
675
|
+
- **Canonical schema.** The frontmatter above is the contract (task 0711 R1). Non-canonical or
|
|
676
|
+
malformed checkpoints are ignored by the router and kept (never silently deleted) by cleanup.
|
|
677
|
+
- **Retention.** Terminal checkpoints older than `workflowLogRetentionDays` with no active run are
|
|
678
|
+
reclaimed by `spur workflow clean` (task 0711 R5–R8); non-terminal checkpoints are always kept.
|
|
655
679
|
- **Not a validated corpus.** Checkpoints are working memory. They are overwritten when a session
|
|
656
680
|
resumes and re-checkpoints. They are NOT authoritative task state — the task file is.
|
|
657
681
|
- **One file per session.** The `session_id` is `<date>-<wbs-or-feature>`. A resumed session
|
|
@@ -74,7 +74,7 @@ each would be scope creep for one-liner procedures.
|
|
|
74
74
|
| 4 | run | `dev-run` | `Skill()` | `sp:spur-dev` (`run` / `implement`) | `<wbs> [--mode <full\|implement>] [--agent <inline\|auto\|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]]` |
|
|
75
75
|
| 5 | refine | `dev-refine` | `Skill()` | `sp:spur-dev` (`refine`) | `<wbs> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--next]` |
|
|
76
76
|
| 5a | refineall | `dev-refineall` | `Skill()` | `sp:spur-dev` (`refineall`) | `--feature <id> \| --tasks <selector> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--keep-going] [--status <s>] [--json] [--worktree [<name>]]` |
|
|
77
|
-
| 6 | plan | `dev-plan` | `Skill()` |
|
|
77
|
+
| 6 | plan | `dev-plan` | `Skill()` | inline driver (`idea-pipeline`) or async workflow | `"<description>" [--feature <id>] [--parent <feature-id>] [--agent <inline\|auto\|name>] [--skip-design] [--auto] [--approve-taste]` |
|
|
78
78
|
| 7 | docs | _(no thin wrapper)_ | `Skill()` | `sp:doc-evolve` | `"<change description>"` |
|
|
79
79
|
| 8 | changelog | `dev-changelog` | `inline` | git log + conventional-commit grouping | `[--since <ref>] [--until <ref>] [--version <ver>]` |
|
|
80
80
|
| 9 | gitmsg | `dev-gitmsg` | `inline` | bounded diff capture → concern grouping → conventional commit | `[--commit] [--squash] [--all] [--scope <path>]` |
|
|
@@ -85,7 +85,7 @@ each would be scope creep for one-liner procedures.
|
|
|
85
85
|
| 13a | parallel | `dev-parallel` | `Skill()` | `sp:parallel-execution` | `--tasks <selector> [--feature <id>] [--mode <fan-out\|review-panel\|investigation>] [--agent <inline\|auto\|name>] [--json]` |
|
|
86
86
|
| 14 | wrap | `dev-wrap` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `<wbs> [--agent <inline\|auto\|name>] [--auto] [--merge] [--dry-run]` |
|
|
87
87
|
| 15 | wrapall | `dev-wrapall` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `[--since <iso>] [--feature <id>] [--status <s>] [--agent <inline\|auto\|name>] [--auto] [--merge] [--dry-run]` |
|
|
88
|
-
| 16 | idea | `dev-idea` | `Skill()` |
|
|
88
|
+
| 16 | idea | `dev-idea` | `Skill()` | inline driver (`idea-pipeline`) or async workflow | `"<idea>" [--auto] [--skip-design] [--approve-taste] [--agent <inline\|auto\|name>]` |
|
|
89
89
|
|
|
90
90
|
## Skill-backed operations
|
|
91
91
|
|
|
@@ -255,7 +255,7 @@ must not be changed without updating the backing skill.
|
|
|
255
255
|
### 6. plan
|
|
256
256
|
|
|
257
257
|
- **Purpose:** Plan a feature from a description — intake → feature create → AC generation → feature check gate → decomposition → batch-create (with **Design by default**).
|
|
258
|
-
- **Inputs:** `"<description>"` (required). `--feature <id>` links to an existing feature. `--parent <feature-id>` nests under a parent.
|
|
258
|
+
- **Inputs:** `"<description>"` (required). `--feature <id>` links to an existing feature. `--parent <feature-id>` nests under a parent. Omitted/`inline` drives `idea-pipeline.yaml` in the host session; `auto` or a name launches the async workflow worker. **Design package flags (unified with `/sp:dev-idea`):**
|
|
259
259
|
- **Default:** author task `design` on every batch item + feature satellite when the seam heuristic fires (**ties lean design**). There is **no** `--design` force flag.
|
|
260
260
|
- `--skip-design` — skip feature satellite **and** omit task `design` fields (scaffold only; refine fills later). Sole design opt-out.
|
|
261
261
|
- `--approve-taste` — with `--auto`, pre-clear design-approval taste pause when that gate is used (`design_approved=true`). Alias: `--design-approved`.
|
|
@@ -340,9 +340,9 @@ must not be changed without updating the backing skill.
|
|
|
340
340
|
- `--skip-design` — design package off (system-design + task Design).
|
|
341
341
|
- `--approve-taste` — with `--auto`, skip **all** remaining taste pauses this run (idea-eval + design-approval). Sets `idea_approved=true` and `design_approved=true`.
|
|
342
342
|
Aliases (prefer `--approve-taste`): `--idea-approved` → `idea_approved`; `--design-approved` → `design_approved`. There is **no** `--design` force flag.
|
|
343
|
-
- **Backing:** `spur workflow run idea-pipeline.yaml`
|
|
344
|
-
- **Behavior:** Builds vars from the table above and
|
|
345
|
-
- **Delegation:**
|
|
343
|
+
- **Backing:** `idea-pipeline.yaml` through the inline driver for omitted/`inline`, or `spur workflow run idea-pipeline.yaml --async` for `auto`/name.
|
|
344
|
+
- **Behavior:** Builds vars from the table above and drives the idea pipeline. Flow: discovery → **idea-eval** (taste; reject → cancelled) → feature-create → ac-generate → feature-check → system-design (conditional) → design-approval (taste) → decompose → batch-create → handoff. STOPS at handoff — no task execution, no pipeline nesting. Headless runs use one `trace --follow`; cancellation is reported stopped only when `workflow cancel --json` returns `killed: true`.
|
|
345
|
+
- **Delegation:** Host-session inline driver by default; explicit executor selection uses the async workflow worker.
|
|
346
346
|
- **Idea-evaluation gate:** After discovery, operator reviews `.spur/run/idea-eval-report.md` ([idea-evaluation.md](idea-evaluation.md)). Approve continues; reject/cancel → no feature. Under `--auto`, still pauses unless taste pre-cleared (`--approve-taste` / alias). Enhanced idea is a sidecar — `vars.idea` is not overwritten.
|
|
347
347
|
- **Design package (`--skip-design` only):**
|
|
348
348
|
|