@gobing-ai/spur 0.3.75 → 0.3.76
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 +6 -0
- package/config/rules/README.md +1 -1
- package/config/rules/strict/runtime-boundaries.yaml +1 -0
- package/config/rules/typescript/no-eslint-suppressions.yaml +30 -0
- package/package.json +9 -9
- package/plugins/sp/commands/dev-refineall.md +2 -2
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/skills/dogfood-testing/SKILL.md +7 -4
- package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +9 -3
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +5 -3
- package/plugins/sp/skills/spur-cli/references/workflows.md +3 -3
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
- package/schemas/spur-config.schema.json +4 -0
- package/spur.js +1854 -665
- package/web/_astro/{BoardApp.BOW1815F.js → BoardApp.CHQ1lycZ.js} +83 -83
- package/web/_astro/BoardApp.DV9kx0wo.js +1 -0
- package/web/_astro/{TaskDetail.CX6C7dSJ.js → TaskDetail.GKfQJ60c.js} +1 -1
- package/web/_astro/{arc.CwSvH1ji.js → arc.DWEtA3Tx.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.Dxne1RvP.js → architectureDiagram-3BPJPVTR.DB42oWmP.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.D9Fb14rC.js → blockDiagram-GPEHLZMM.rhv-zNQV.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DmvWSFvv.js → c4Diagram-AAUBKEIU.Ci4-4VvY.js} +1 -1
- package/web/_astro/channel.BAI6xLeV.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.BCCktIrE.js → chunk-2J33WTMH.Cc9veUgf.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.BzCk9q27.js → chunk-4BX2VUAB.Bec9c4eI.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.CZXVgTk4.js → chunk-55IACEB6.DoV8S1iB.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.CJL8UIpX.js → chunk-727SXJPM.DwR-Qlyj.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.Dz8MDEdw.js → chunk-AQP2D5EJ.ND_a81WY.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.CkQeYYUw.js → chunk-FMBD7UC4.Wv_jwG48.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.KiC1QgzH.js → chunk-ND2GUHAM.CXKXCMmp.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.AJ08mw2e.js → chunk-QZHKN3VN.nkaoNYQq.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.DRWRDKzK.js → classDiagram-4FO5ZUOK.cMQcVlQu.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.DRWRDKzK.js → classDiagram-v2-Q7XG4LA2.cMQcVlQu.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CavydfLP.js → cose-bilkent-S5V4N54A.OaDJ7Mr2.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.D_7o_a0B.js → cynefin-OW5HDTMX.Chi8IphF.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.LWk2dKgg.js → dagre-BM42HDAG.CzK2t_Fp.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.82lbq6aB.js → diagram-2AECGRRQ.DRvxlVS7.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.hyNL1pwY.js → diagram-5GNKFQAL.CnYvNdwA.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.BaLqVf-b.js → diagram-KO2AKTUF.CpLpMw5R.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.DQJxj0oz.js → diagram-LMA3HP47.JTb78qUA.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.DhlL8cG2.js → diagram-OG6HWLK6.Bk-1jDIb.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.HoTnXwkF.js → erDiagram-TEJ5UH35.D8hN9GZq.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.DkFKlZIZ.js → flowDiagram-I6XJVG4X.-6zQr6m5.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.9qPfOTDb.js → ganttDiagram-6RSMTGT7.DboLQ9ca.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.B4G18Dwc.js → gitGraphDiagram-PVQCEYII.4tYvJKGR.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.e3KJkXAM.js → infoDiagram-5YYISTIA.Bd9rXpsB.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CY3yddhD.js → ishikawaDiagram-YF4QCWOH.CvMoaf67.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.DaAKIO1t.js → journeyDiagram-JHISSGLW.Ccy1CA7y.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.DGkDddtc.js → kanban-definition-UN3LZRKU.0MaMqHNS.js} +1 -1
- package/web/_astro/{linear.DnDPcpd1.js → linear.CHXgcIbN.js} +1 -1
- package/web/_astro/{mermaid.core.1uBmxa9t.js → mermaid.core.Ca-kcelG.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.XFJVayxw.js → mindmap-definition-RKZ34NQL.BUIDlHa0.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.BXm2OgHh.js → pieDiagram-4H26LBE5.2dX3CU1s.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.DgB2p5fc.js → quadrantDiagram-W4KKPZXB.B3LBlRiv.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.jBR39bnS.js → requirementDiagram-4Y6WPE33.X12I2uNx.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.N3u9OhE3.js → sankeyDiagram-5OEKKPKP.BXohIHqx.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.CZhqZXNL.js → sequenceDiagram-3UESZ5HK.C37ZIUzg.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DlNu1VEa.js → stateDiagram-AJRCARHV.BRgz317z.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.BEqi8NQV.js → stateDiagram-v2-BHNVJYJU.7VYSXN9-.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BPcexclc.js → timeline-definition-PNZ67QCA.BVNz_HiN.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.BZalxKGQ.js → vennDiagram-CIIHVFJN.CHVDkPX4.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BqOljod9.js → wardleyDiagram-YWT4CUSO.EQQ_qT9v.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.tkO4ppN5.js → xychartDiagram-2RQKCTM6.DrAT9WoP.js} +1 -1
- package/web/index.html +1 -1
- package/web/_astro/BoardApp.C4zimv1U.js +0 -1
- package/web/_astro/channel.CQHdDVp9.js +0 -1
|
@@ -130,6 +130,12 @@ agent:
|
|
|
130
130
|
# agent: omp
|
|
131
131
|
# model: minimax/MiniMax-M3
|
|
132
132
|
# tier: cheap
|
|
133
|
+
# A disabled profile stays visible to `spur agent doctor` but never routes
|
|
134
|
+
# (no role, team, stage, or explicit selection). Flip back to enabled by
|
|
135
|
+
# removing the line or setting disabled: false.
|
|
136
|
+
# - name: retired-profile
|
|
137
|
+
# agent: omp
|
|
138
|
+
# disabled: true
|
|
133
139
|
- name: pi-dsv4-flash-volc
|
|
134
140
|
agent: pi
|
|
135
141
|
# tier: standard
|
package/config/rules/README.md
CHANGED
|
@@ -9,7 +9,7 @@ install or to ts-libs.
|
|
|
9
9
|
|
|
10
10
|
| Category | Dir | Purpose |
|
|
11
11
|
|---|---|---|
|
|
12
|
-
| `typescript` | `typescript/` | TypeScript tooling, output boundaries, biome-suppression ban, no `debugger` |
|
|
12
|
+
| `typescript` | `typescript/` | TypeScript tooling, output boundaries, biome/eslint-suppression ban, no `debugger` |
|
|
13
13
|
| `strict` | `strict/` | Opt-in strict rules (runtime boundaries, HTTP boundaries, structural) |
|
|
14
14
|
| `boundary` | `boundary/` | DB/DAO boundary enforcement |
|
|
15
15
|
| `structure` | `structure/` | File layout, protected files, no focused/skipped tests |
|
|
@@ -69,6 +69,7 @@ rules:
|
|
|
69
69
|
# Synchronous bootstrap & path resolution:
|
|
70
70
|
- "packages/config/src/bundled-config.ts" # sync bundledConfigRoot() directory walk
|
|
71
71
|
- "packages/config/src/loader.ts" # sync resolveConfigFile() / schema specifier lookup
|
|
72
|
+
- "packages/config/src/executor-update.ts" # atomic single-entry config update (task 0797): O_EXCL lock, fsync'd tmp+rename commit, lstat symlink refusal, mode preservation — ts-runtime FileSystem seam has no lstat/fsync/chmod/O_EXCL
|
|
72
73
|
- "packages/app/src/services/project-start.ts" # sync CLI binary path checks before daemon spawn
|
|
73
74
|
|
|
74
75
|
# Synchronous template & workflow resolvers:
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
$schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
2
|
+
# No ESLint suppression comments. Spur lints with Biome, not ESLint; leftover
|
|
3
|
+
# `eslint-disable*` comments are dead suppressions that hide the real fix and
|
|
4
|
+
# would not even silence the live gate. Sibling of `no-biome-suppressions`
|
|
5
|
+
# (AGENTS.md: never suppress a gate to force green).
|
|
6
|
+
#
|
|
7
|
+
# Tests ARE in scope: an eslint-disable in a test is the same bypass.
|
|
8
|
+
include:
|
|
9
|
+
- "apps/**/*.ts"
|
|
10
|
+
- "apps/**/*.tsx"
|
|
11
|
+
- "packages/**/*.ts"
|
|
12
|
+
- "packages/**/*.tsx"
|
|
13
|
+
- "plugins/**/*.ts"
|
|
14
|
+
- "scripts/**/*.ts"
|
|
15
|
+
exclude:
|
|
16
|
+
- "**/node_modules/**"
|
|
17
|
+
- "**/dist/**"
|
|
18
|
+
- "**/vendors/**"
|
|
19
|
+
rules:
|
|
20
|
+
- id: no-eslint-suppressions
|
|
21
|
+
description: >
|
|
22
|
+
Do not use ESLint disable comments (file, line, or next-line forms).
|
|
23
|
+
Spur lints with Biome; an ESLint suppression does not silence the live
|
|
24
|
+
gate and hides the real fix. Remove the comment and fix the underlying
|
|
25
|
+
issue (AGENTS.md: no suppressions to force green).
|
|
26
|
+
severity: error
|
|
27
|
+
evaluator:
|
|
28
|
+
type: rg
|
|
29
|
+
config:
|
|
30
|
+
pattern: "eslint-disable"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.76",
|
|
4
4
|
"description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spur",
|
|
@@ -53,14 +53,14 @@
|
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@commander-js/extra-typings": "^14.0.0",
|
|
56
|
-
"@gobing-ai/ts-db": "^0.4.
|
|
57
|
-
"@gobing-ai/ts-ai-runner": "^0.4.
|
|
58
|
-
"@gobing-ai/ts-dual-workflow-engine": "^0.4.
|
|
59
|
-
"@gobing-ai/ts-infra": "^0.4.
|
|
60
|
-
"@gobing-ai/ts-llm-jsonl-importer": "^0.4.
|
|
61
|
-
"@gobing-ai/ts-rule-engine": "^0.4.
|
|
62
|
-
"@gobing-ai/ts-runtime": "^0.4.
|
|
63
|
-
"@gobing-ai/ts-utils": "^0.4.
|
|
56
|
+
"@gobing-ai/ts-db": "^0.4.57",
|
|
57
|
+
"@gobing-ai/ts-ai-runner": "^0.4.57",
|
|
58
|
+
"@gobing-ai/ts-dual-workflow-engine": "^0.4.57",
|
|
59
|
+
"@gobing-ai/ts-infra": "^0.4.57",
|
|
60
|
+
"@gobing-ai/ts-llm-jsonl-importer": "^0.4.57",
|
|
61
|
+
"@gobing-ai/ts-rule-engine": "^0.4.57",
|
|
62
|
+
"@gobing-ai/ts-runtime": "^0.4.57",
|
|
63
|
+
"@gobing-ai/ts-utils": "^0.4.57",
|
|
64
64
|
"@types/bun": "1.3.14",
|
|
65
65
|
"@types/figlet": "^1.7.0",
|
|
66
66
|
"@types/node-notifier": "8.0.5",
|
|
@@ -23,7 +23,7 @@ operation, applied to a resolved set (typically every task under a feature). Pas
|
|
|
23
23
|
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing refinement. | omit |
|
|
24
24
|
| `--auto` | Skip objective HITL gates. | off |
|
|
25
25
|
| `--keep-going` | Continue past per-task failures. | off |
|
|
26
|
-
| `--status` `<s>` | Only refine tasks in
|
|
26
|
+
| `--status` `<s>` | Only refine tasks in these statuses (applied in-agent to the frozen set). | `backlog` + `todo` |
|
|
27
27
|
| `--json` | Emit structured JSON. | off |
|
|
28
28
|
| `--worktree` `[<name>]` | Run the batch in an isolated git worktree; FF-merge on success, retain on failure. Bare `--worktree` creates a fresh tree; `--worktree <name>` adopts an existing worktree by name/path/branch. | off |
|
|
29
29
|
|
|
@@ -39,7 +39,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
39
39
|
Flags: `--feature` (sugar for `feature:<id>`), `--tasks <selector>`, shared refine flags
|
|
40
40
|
(`--focus`, `--description`, `--depth`, `--agent`, `--auto`),
|
|
41
41
|
plus `--keep-going`,
|
|
42
|
-
`--status` (default `backlog
|
|
42
|
+
`--status` (default `backlog` + `todo`),
|
|
43
43
|
`--json`, `--worktree` `[<name>]` (run the batch in an isolated git worktree — FF-merge onto the base ref on
|
|
44
44
|
full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree, `<name>`
|
|
45
45
|
form adopts an existing worktree by name/path/branch; see `execution-batch.md` § Worktree
|
package/plugins/sp/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.76",
|
|
4
4
|
"description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
|
|
5
5
|
"extensions": {
|
|
6
6
|
"pi": ["./hooks/pi/guard-extension.ts"]
|
|
@@ -75,8 +75,11 @@ The command forwards these via `$ARGUMENTS`:
|
|
|
75
75
|
> independent mutation sources is present:
|
|
76
76
|
>
|
|
77
77
|
> - **Pipeline-driving testees** — tokens
|
|
78
|
-
>
|
|
79
|
-
> `runall`, `wrapall`, `run`, `wrap`, `idea
|
|
78
|
+
> <!-- pipeline-tokens:start -->
|
|
79
|
+
> [`--next`, `dev-runall`, `dev-wrapall`, `dev-refineall`, `dev-verifyall`, `dev-run`, `dev-wrap`, `dev-idea`,
|
|
80
|
+
> `refineall`, `verifyall`, `runall`, `wrapall`, `run`, `wrap`, `idea`]
|
|
81
|
+
> <!-- pipeline-tokens:end -->
|
|
82
|
+
> matched as a **distinct hyphen-word**
|
|
80
83
|
> (machine-checked by
|
|
81
84
|
> [`detectPipelineDriving`](../../scripts/dogfood-testing/detect-pipeline-driving.ts);
|
|
82
85
|
> see [§Pipeline-driving word-boundary contract](#pipeline-driving-word-boundary-contract))
|
|
@@ -335,8 +338,8 @@ node "$(superskill script path sp dogfood-testing/detect-pipeline-driving.mjs)"
|
|
|
335
338
|
|
|
336
339
|
| Token shape | Examples | Matches | Rejects |
|
|
337
340
|
|-------------|----------|---------|---------|
|
|
338
|
-
| Flag / complete |
|
|
339
|
-
| Bare noun |
|
|
341
|
+
| Flag / complete | <!-- pipeline-tokens:start -->`--next`, `dev-run`, `dev-runall`, `dev-wrap`, `dev-wrapall`, `dev-idea`, `dev-refineall`, `dev-verifyall`<!-- pipeline-tokens:end --> | `/sp:dev-run 0125`, bare `--next` | `--next-gen`, `dev-runner` |
|
|
342
|
+
| Bare noun | <!-- pipeline-tokens:start -->`run`, `runall`, `wrap`, `wrapall`, `idea`, `refineall`, `verifyall`<!-- pipeline-tokens:end --> | `task run 0042` | `runaway`, `wrapper`, `idealist` |
|
|
340
343
|
|
|
341
344
|
`-` is a **word character** for boundaries: a token must be a distinct hyphen-word. Contract tests:
|
|
342
345
|
`plugins/sp/tests/dogfood-testing/pipeline-detect.test.ts`. Helpers:
|
|
@@ -9,8 +9,8 @@ see_also:
|
|
|
9
9
|
|
|
10
10
|
Task bodies are edited section-by-section through `spur task update --section <name> --from-file
|
|
11
11
|
<path>`. The write is **file-wins and crash-safe** (atomic write): the named section's body is
|
|
12
|
-
replaced wholesale from the file you point at
|
|
13
|
-
body in a file first.
|
|
12
|
+
replaced wholesale from the file you point at — with one exception, `Q&A`, which appends (see
|
|
13
|
+
below). There is no inline-body flag — always stage the new body in a file first.
|
|
14
14
|
|
|
15
15
|
For **pipeline output**, section authorship is one-writer-per-section (F92 0593 R1):
|
|
16
16
|
`Testing` comes from `spur task record` (deterministic, from a verify verdict artifact — the
|
|
@@ -23,6 +23,8 @@ for `Plan`, `Acceptance Criteria`, hand-authored `Solution`, and any narrative s
|
|
|
23
23
|
|
|
24
24
|
1. **Assemble the full section body** in a temp file. The body is everything *under* the `###`
|
|
25
25
|
heading — do not include the heading line itself; the CLI owns the heading.
|
|
26
|
+
Sub-headings inside the body MUST be `####` or deeper: a `###` in a body parses as a new
|
|
27
|
+
top-level section and trips `L2.disallowed-section` (task 0787 grew 8 phantom sections this way).
|
|
26
28
|
|
|
27
29
|
```bash
|
|
28
30
|
cat > /tmp/review.md <<'EOF'
|
|
@@ -42,7 +44,11 @@ for `Plan`, `Acceptance Criteria`, hand-authored `Solution`, and any narrative s
|
|
|
42
44
|
|
|
43
45
|
3. The whole `### Review` body is now that file's contents. To amend rather than overwrite, read
|
|
44
46
|
the current body (`spur task show 0040`), edit the temp file to the full desired state, and
|
|
45
|
-
replace again — there is no append mode.
|
|
47
|
+
replace again — there is no append mode for ordinary sections.
|
|
48
|
+
|
|
49
|
+
**`Q&A` is the exception.** `--section "Q&A"` APPENDS a timestamped `#### Q&A entry — <ISO>`
|
|
50
|
+
block rather than replacing the section. Start the body with `<!-- qa:replace -->` to replace it
|
|
51
|
+
wholesale.
|
|
46
52
|
|
|
47
53
|
`--section` **requires** `--from-file` (exit `2` otherwise). Section names match the DD-08 headings
|
|
48
54
|
exactly: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `References`, `History`, `Notes` (universal sections are `History`, `References`, `Notes`; `Root Cause` is carried by the `issue` template variant).
|
|
@@ -61,8 +61,10 @@ frontmatter scalar.
|
|
|
61
61
|
to avoid orphaned nested lifecycle runs). **It is not a guard bypass** — the `wip→testing` and
|
|
62
62
|
`testing→done` `check` gates above still run; the CLI evaluates them inline when the FSM guard
|
|
63
63
|
does not. `--force-done` waives the verify **verdict** only, never the section matrix.
|
|
64
|
-
- **Section** (`--section` **requires** `--from-file`):
|
|
65
|
-
|
|
64
|
+
- **Section** (`--section` **requires** `--from-file`): writes the named section body from the file.
|
|
65
|
+
Most sections replace wholesale. Exception: `--section "Q&A"` APPENDS a timestamped
|
|
66
|
+
`#### Q&A entry — <ISO>` block; start the body with `<!-- qa:replace -->` to replace the section
|
|
67
|
+
wholesale. No inline-body flag. Section names: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Testing`, `Review`, `References`, `History`, `Notes`.
|
|
66
68
|
- **Frontmatter** (`--feature <id>`, `--priority <p>`): sets the scalar frontmatter field on an
|
|
67
69
|
existing task — the only post-create path, allow-listed to `feature_id` / `parent_wbs` / `priority`.
|
|
68
70
|
|
|
@@ -85,7 +87,7 @@ Flags: `--folder <path>`, `--json`. Exit codes: `0` success, `1` error, `2` usag
|
|
|
85
87
|
|
|
86
88
|
## `sections <wbs> <op> [name]`
|
|
87
89
|
|
|
88
|
-
CLI-safe, matrix-enforced task section mutation. Section names are validated against canonical sections (`Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `References`, `History`, `Notes`). Universal sections (`History`, `References`, `Notes`) are always allowed; `Root Cause` is carried by the `issue` template variant.
|
|
90
|
+
CLI-safe, matrix-enforced task section mutation. Section names are validated against canonical sections (`Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `References`, `History`, `Notes`). Universal sections (`History`, `References`, `Notes`) are always allowed; `Root Cause` is carried by the `issue` template variant. `Q&A` on `update --section` appends rather than replacing (see the Section bullet above); `<!-- qa:replace -->` forces a wholesale replace.
|
|
89
91
|
|
|
90
92
|
| Op | Usage | Description |
|
|
91
93
|
| --- | --- | --- |
|
|
@@ -209,7 +209,7 @@ spur workflow run ./workflows/approval.yaml --steer # interactive
|
|
|
209
209
|
are exclusive (exit `2`); `--silent` cannot combine with either (exit `2`).
|
|
210
210
|
- **`--detail <level>`** sets human verbosity: `minimal` (state changes only), `invocation` (default;
|
|
211
211
|
per-step headers), `full` (transitions + correlation). `--verbose` is shorthand for `--detail full`.
|
|
212
|
-
- **`--trace-file`** appends a redacted, schema-versioned JSONL trace under `.spur/
|
|
212
|
+
- **`--trace-file`** appends a redacted, schema-versioned JSONL trace under `.spur/workflow/`
|
|
213
213
|
for post-run analysis - independent of human/JSON output.
|
|
214
214
|
- **`--no-log`** opts out of writing the consolidated all-in-one run log (`.spur/run/<RUNID>.log`).
|
|
215
215
|
By default the log is written **and retained** after the run ends; this flag skips it entirely
|
|
@@ -280,7 +280,7 @@ not advertise `--json-envelope` because its JSON projection is a kept-raw docume
|
|
|
280
280
|
| `--silent` | Suppress all routine output; errors still set a non-zero exit status. |
|
|
281
281
|
| `--verbose` | Include transitions and correlation diagnostics in human progress (implies `--detail full`). |
|
|
282
282
|
| `--detail <level>` | Human detail level: `minimal`, `invocation` (default), or `full`. |
|
|
283
|
-
| `--trace-file` | Append a redacted schema-versioned JSONL trace under `.spur/
|
|
283
|
+
| `--trace-file` | Append a redacted schema-versioned JSONL trace under `.spur/workflow/`. |
|
|
284
284
|
| `--no-log` | Opt out of writing the consolidated `.spur/run/<RUNID>.log` (retained by default; propagates to `--async` workers). |
|
|
285
285
|
| `--steer` | Accept in-process steering commands on stdin at declared action boundaries (sync only; incompatible with `--json`/`--async`). |
|
|
286
286
|
|
|
@@ -335,7 +335,7 @@ redirecting `agent.run` stages (ADR-047).
|
|
|
335
335
|
- **Run-log reclamation** (0429): removes retained `.spur/run/<RUNID>.log` files whose mtime is older
|
|
336
336
|
than `workflow.logRetentionDays` in `.spur/config.yaml` (default 30 days; integer days, not minutes).
|
|
337
337
|
Age is the only gate; best-effort deletes never abort the rest. Never touches
|
|
338
|
-
`.spur/
|
|
338
|
+
`.spur/workflow/<RUNID>.jsonl` or `*-partial.md`.
|
|
339
339
|
- **`--logs`** scopes to log reclamation only (skips stale-run finalization). `--dry-run` applies to
|
|
340
340
|
both scopes (lists what would be removed, writes nothing). `--json` returns
|
|
341
341
|
`{ olderThanMinutes, dryRun, cleaned, logs: { retentionDays, dryRun, reclaimed, failures } }` (with
|
|
@@ -237,11 +237,11 @@ must not be changed without updating the backing skill.
|
|
|
237
237
|
- **Inputs:**
|
|
238
238
|
- `--feature <id>` **or** `--tasks <selector>` (required — at least one). `--feature` is sugar for `--tasks feature:<id>` (shared selector grammar: explicit WBS list, `feature:<id>`, `ready`, status pseudo-list — [execution-batch.md](execution-batch.md) Step 1). If both are present, `--tasks` wins (one-line note in the report).
|
|
239
239
|
- Shared refine flags (passed through to each per-task refine): `--focus <mode>`, `--description <text>`, `--depth <standard|ready>`, `--agent <inline|auto|name>`, `--auto`.
|
|
240
|
-
- Batch-only flags: `--keep-going` (continue independents after a failure; default halt), `--status <s>` (filter resolved membership; default **`backlog
|
|
240
|
+
- Batch-only flags: `--keep-going` (continue independents after a failure; default halt), `--status <s>` (filter resolved membership; default **`backlog` + `todo`** — planning-side fill candidates. The filter is applied in-agent against the frozen set; `spur task list --status` takes exactly one canonical status per call (see `execution-batch.md` Step 1).), `--json` (machine-readable batch report).
|
|
241
241
|
- **Backing:** `sp:spur-dev` skill, `refineall` operation (orchestrates; per-task body is the single-task `refine` operation — never a second refine implementation).
|
|
242
242
|
- **Behavior:**
|
|
243
243
|
1. Resolve + **freeze** the set at kickoff (never re-query membership mid-batch).
|
|
244
|
-
2. Apply `--status` filter (default `backlog
|
|
244
|
+
2. Apply `--status` filter (default `backlog` + `todo`; applied in-agent against the frozen set; `spur task list --status` takes exactly one canonical status per call — see `execution-batch.md` Step 1). Tasks already `done`/`cancelled`/`testing` are excluded unless the operator widens `--status`. Report each exclusion with reason.
|
|
245
245
|
3. Topo-sort by `dependencies[]` (Kahn, WBS-ascending tie-break). Cycle → abort entire batch before any refine. Out-of-set deps: `done` → allow; else → block subtree (same as runall).
|
|
246
246
|
4. For each WBS in order: invoke single-task refine with shared flags **including `--depth`**. Under `--auto` + **`--depth standard`** (default), the per-task **L3 pre-synthesis SKIP gate** still applies. Under **`--depth ready`**, each task runs the implement-ready checklist (no L3-only SKIP).
|
|
247
247
|
5. Failure policy: **stop-the-batch** (default) or `--keep-going` (skip in-batch dependents of a failed refine; continue independents).
|
|
@@ -165,6 +165,10 @@
|
|
|
165
165
|
"type": "string",
|
|
166
166
|
"enum": ["cheap", "standard", "capable-1", "capable-2", "capable-3"],
|
|
167
167
|
"description": "Capability tier for stage-registry adaptive model routing (ADR-033, 0343). Live values: cheap | standard | capable-1 | capable-2 | capable-3 (1=low output quality, 3=high within the capable band). A stage starts on the cheapest eligible executor meeting its model_policy min_tier. Bare legacy `capable` is accepted at runtime (zod preprocess \u2192 capable-1) during the deprecation window but is not part of this editor enum."
|
|
168
|
+
},
|
|
169
|
+
"disabled": {
|
|
170
|
+
"type": "boolean",
|
|
171
|
+
"description": "Routing kill-switch (111): a disabled profile never serves a role, team, stage, or explicit selection, and doctor inventories it without probing. Omitted = enabled; only true/false accepted (no string/number/null coercion)."
|
|
168
172
|
}
|
|
169
173
|
}
|
|
170
174
|
}
|