@gobing-ai/spur 0.3.40 → 0.3.42
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 +15 -0
- package/README.md +15 -1
- package/config/templates/AGENTS.md +5 -3
- package/config/workflows/task-pipeline.yaml +103 -12
- package/package.json +15 -12
- package/plugins/README.md +655 -0
- package/plugins/sp/README.md +621 -0
- package/plugins/sp/agents/expert-spur.md +109 -0
- package/plugins/sp/agents/super-coder.md +126 -0
- package/plugins/sp/agents/super-planner.md +283 -0
- package/plugins/sp/agents/super-reviewer.md +154 -0
- package/plugins/sp/commands/dev-arch.md +30 -0
- package/plugins/sp/commands/dev-brainstorm.md +40 -0
- package/plugins/sp/commands/dev-changelog.md +28 -0
- package/plugins/sp/commands/dev-daily.md +29 -0
- package/plugins/sp/commands/dev-debug.md +29 -0
- package/plugins/sp/commands/dev-dogfood.md +33 -0
- package/plugins/sp/commands/dev-featurechange.md +130 -0
- package/plugins/sp/commands/dev-find-conflict.md +51 -0
- package/plugins/sp/commands/dev-find-issue.md +76 -0
- package/plugins/sp/commands/dev-find-next.md +60 -0
- package/plugins/sp/commands/dev-fixall.md +33 -0
- package/plugins/sp/commands/dev-gitmsg.md +28 -0
- package/plugins/sp/commands/dev-gtd.md +97 -0
- package/plugins/sp/commands/dev-handover.md +26 -0
- package/plugins/sp/commands/dev-idea.md +50 -0
- package/plugins/sp/commands/dev-next.md +31 -0
- package/plugins/sp/commands/dev-parallel.md +30 -0
- package/plugins/sp/commands/dev-plan.md +46 -0
- package/plugins/sp/commands/dev-refine.md +48 -0
- package/plugins/sp/commands/dev-refineall.md +65 -0
- package/plugins/sp/commands/dev-refresh.md +32 -0
- package/plugins/sp/commands/dev-reverse.md +32 -0
- package/plugins/sp/commands/dev-review.md +31 -0
- package/plugins/sp/commands/dev-run.md +63 -0
- package/plugins/sp/commands/dev-runall.md +80 -0
- package/plugins/sp/commands/dev-simplify.md +39 -0
- package/plugins/sp/commands/dev-unit.md +29 -0
- package/plugins/sp/commands/dev-verify.md +48 -0
- package/plugins/sp/commands/dev-verifyall.md +72 -0
- package/plugins/sp/commands/dev-wrap.md +30 -0
- package/plugins/sp/commands/dev-wrapall.md +33 -0
- package/plugins/sp/commands/rule-add.md +18 -0
- package/plugins/sp/commands/rule-refine.md +18 -0
- package/plugins/sp/commands/rule-scan.md +18 -0
- package/plugins/sp/commands/spur-init.md +22 -0
- package/plugins/sp/commands/workflow-add.md +18 -0
- package/plugins/sp/commands/workflow-refine.md +18 -0
- package/plugins/sp/hooks/agent-hint.ts +60 -0
- package/plugins/sp/hooks/careful-guard.ts +147 -0
- package/plugins/sp/hooks/context-post-tool.ts +325 -0
- package/plugins/sp/hooks/context-session-start.ts +182 -0
- package/plugins/sp/hooks/context-session-stop.ts +95 -0
- package/plugins/sp/hooks/hooks.json +51 -0
- package/plugins/sp/hooks/pi/guard-extension.ts +341 -0
- package/plugins/sp/hooks/task-write-guard.ts +84 -0
- package/plugins/sp/plugin.json +8 -0
- package/plugins/sp/scripts/batch-preflight.ts +204 -0
- package/plugins/sp/scripts/daily-summary/daily-summary.ts +606 -0
- package/plugins/sp/scripts/daily-summary/logger.ts +28 -0
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +363 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +168 -0
- package/plugins/sp/scripts/feature-sync-bounded.ts +451 -0
- package/plugins/sp/scripts/stage-registry-adapter.ts +1341 -0
- package/plugins/sp/scripts/task-size-precheck.ts +202 -0
- package/plugins/sp/scripts/validate-commands.ts +651 -0
- package/plugins/sp/scripts/validate-flag-contracts.ts +875 -0
- package/plugins/sp/skills/brainstorm/SKILL.md +361 -0
- package/plugins/sp/skills/brainstorm/agents/openai.yaml +14 -0
- package/plugins/sp/skills/brainstorm/examples/ideation-example.md +209 -0
- package/plugins/sp/skills/brainstorm/metadata.openclaw +7 -0
- package/plugins/sp/skills/brainstorm/references/grilling-interview.md +68 -0
- package/plugins/sp/skills/brainstorm/references/workflows.md +255 -0
- package/plugins/sp/skills/branch-workflow/SKILL.md +109 -0
- package/plugins/sp/skills/branch-workflow/references/branch-lifecycle.md +69 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +100 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +176 -0
- package/plugins/sp/skills/code-implementation/references/debugging.md +64 -0
- package/plugins/sp/skills/code-implementation/references/implementation-patterns.md +113 -0
- package/plugins/sp/skills/code-improvement/SKILL.md +231 -0
- package/plugins/sp/skills/code-improvement/references/deepening-signals.md +205 -0
- package/plugins/sp/skills/code-review/SKILL.md +112 -0
- package/plugins/sp/skills/code-review/references/receiving-code-review.md +70 -0
- package/plugins/sp/skills/code-review/references/review-lenses.md +117 -0
- package/plugins/sp/skills/code-review/references/self-review-checklist.md +53 -0
- package/plugins/sp/skills/code-review/references/verification-before-completion.md +68 -0
- package/plugins/sp/skills/code-simplification/SKILL.md +225 -0
- package/plugins/sp/skills/code-testing/SKILL.md +108 -0
- package/plugins/sp/skills/code-testing/references/stacks/bun-ts.md +165 -0
- package/plugins/sp/skills/code-testing/references/stacks/go.md +88 -0
- package/plugins/sp/skills/code-testing/references/stacks/python.md +117 -0
- package/plugins/sp/skills/code-testing/references/test-loop-breaker.md +37 -0
- package/plugins/sp/skills/code-testing/references/test-output-discipline.md +52 -0
- package/plugins/sp/skills/code-testing/references/unit-testing.md +212 -0
- package/plugins/sp/skills/code-verification/SKILL.md +535 -0
- package/plugins/sp/skills/code-verification/references/code-improvement.md +39 -0
- package/plugins/sp/skills/code-verification/references/secu-review.md +94 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +141 -0
- package/plugins/sp/skills/conflict-finding/SKILL.md +254 -0
- package/plugins/sp/skills/conflict-finding/references/authority-resolution.md +258 -0
- package/plugins/sp/skills/conflict-finding/references/comparison-protocol.md +277 -0
- package/plugins/sp/skills/conflict-finding/references/finding-contract.md +346 -0
- package/plugins/sp/skills/conflict-finding/references/remediation-routing.md +276 -0
- package/plugins/sp/skills/daily-summary/SKILL.md +171 -0
- package/plugins/sp/skills/daily-summary/agents/openai.yaml +13 -0
- package/plugins/sp/skills/doc-evolve/SKILL.md +175 -0
- package/plugins/sp/skills/doc-evolve/references/operations.md +93 -0
- package/plugins/sp/skills/dogfood-testing/SKILL.md +608 -0
- package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +211 -0
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +351 -0
- package/plugins/sp/skills/doubt-driven-development/SKILL.md +136 -0
- package/plugins/sp/skills/functional-review/SKILL.md +364 -0
- package/plugins/sp/skills/functional-review/references/verdict-schema.md +133 -0
- package/plugins/sp/skills/indexed-context/SKILL.md +164 -0
- package/plugins/sp/skills/issue-finding/SKILL.md +424 -0
- package/plugins/sp/skills/issue-finding/agents/openai.yaml +15 -0
- package/plugins/sp/skills/issue-finding/examples/expected-findings.json +27 -0
- package/plugins/sp/skills/issue-finding/examples/session-test-loop.jsonl +23 -0
- package/plugins/sp/skills/issue-finding/references/session-formats.md +121 -0
- package/plugins/sp/skills/next-feature/SKILL.md +125 -0
- package/plugins/sp/skills/next-feature/references/handoff-routing.md +92 -0
- package/plugins/sp/skills/next-feature/references/proposal-contract.md +49 -0
- package/plugins/sp/skills/next-feature/references/ranking-rubric.md +52 -0
- package/plugins/sp/skills/next-feature/references/signal-derivation.md +67 -0
- package/plugins/sp/skills/next-router/SKILL.md +181 -0
- package/plugins/sp/skills/next-router/references/messages.md +90 -0
- package/plugins/sp/skills/next-router/references/routing-table.md +216 -0
- package/plugins/sp/skills/parallel-execution/SKILL.md +148 -0
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +100 -0
- package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +101 -0
- package/plugins/sp/skills/parallel-execution/references/result-synthesis.md +94 -0
- package/plugins/sp/skills/reverse-engineering/SKILL.md +375 -0
- package/plugins/sp/skills/reverse-engineering/agents/openai.yaml +18 -0
- package/plugins/sp/skills/source-driven-development/SKILL.md +124 -0
- package/plugins/sp/skills/spec-decomposition/SKILL.md +117 -0
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +539 -0
- package/plugins/sp/skills/spur-cli/SKILL.md +133 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +179 -0
- package/plugins/sp/skills/spur-cli/references/features/acceptance-criteria.md +82 -0
- package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +177 -0
- package/plugins/sp/skills/spur-cli/references/features/roadmap-priority.md +84 -0
- package/plugins/sp/skills/spur-cli/references/features/verbs.md +122 -0
- package/plugins/sp/skills/spur-cli/references/features.md +234 -0
- package/plugins/sp/skills/spur-cli/references/init.md +119 -0
- package/plugins/sp/skills/spur-cli/references/message.md +98 -0
- package/plugins/sp/skills/spur-cli/references/rules/authoring-rules.md +212 -0
- package/plugins/sp/skills/spur-cli/references/rules/fine-tuning.md +148 -0
- package/plugins/sp/skills/spur-cli/references/rules/operations.md +228 -0
- package/plugins/sp/skills/spur-cli/references/rules/validation-and-extension.md +129 -0
- package/plugins/sp/skills/spur-cli/references/rules.md +209 -0
- package/plugins/sp/skills/spur-cli/references/serve.md +58 -0
- package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +98 -0
- package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +95 -0
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +361 -0
- package/plugins/sp/skills/spur-cli/references/tasks.md +278 -0
- package/plugins/sp/skills/spur-cli/references/team.md +133 -0
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +226 -0
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +211 -0
- package/plugins/sp/skills/spur-cli/references/workflows/validation-and-extension.md +129 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +355 -0
- package/plugins/sp/skills/spur-dev/SKILL.md +224 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +196 -0
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +664 -0
- package/plugins/sp/skills/spur-dev/references/decision-brief.md +80 -0
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +546 -0
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +164 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +727 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +350 -0
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +191 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +417 -0
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +171 -0
- package/plugins/sp/skills/spur-dev/references/glossary.md +95 -0
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +80 -0
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +88 -0
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +302 -0
- package/plugins/sp/skills/spur-dev/references/product-planning.md +206 -0
- package/plugins/sp/skills/spur-dev/references/section-batching.md +24 -0
- package/plugins/sp/skills/sys-architecture/SKILL.md +155 -0
- package/plugins/sp/skills/sys-architecture/references/decision-method.md +137 -0
- package/plugins/sp/skills/sys-architecture/references/upkeep-survey.md +75 -0
- package/plugins/sp/skills/sys-debugging/SKILL.md +228 -0
- package/plugins/sp/skills/sys-debugging/references/debugging-protocol.md +62 -0
- package/plugins/sp/skills/test-driven-development/SKILL.md +248 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +292 -0
- package/spur.js +6093 -5180
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dev-operations
|
|
3
|
+
description: Unified reference for all 17+ dev-* operations — purpose, inputs, backing (skill/CLI/inline), and behavior contract. The single source of truth for what each `/sp:dev-*` command does. (`implement` is covered as a sub-mode of run, #4; `runall` is the batch execution operation, #13; `refineall` is the batch refine operation, #5a.)
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-dev
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Dev Operations
|
|
9
|
+
|
|
10
|
+
Every `sp:dev-*` command maps to exactly one **operation** defined here. This is the authoritative
|
|
11
|
+
reference: if an operation is not in this file, no command should delegate to it. The operation
|
|
12
|
+
table is the index; the per-operation sections below are the detail.
|
|
13
|
+
|
|
14
|
+
## Two backing patterns
|
|
15
|
+
|
|
16
|
+
| Pattern | Meaning | Commands |
|
|
17
|
+
| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
|
18
|
+
| `Skill()` | Delegates to a backing skill via `Skill(skill="<skill>", args="<op> $ARGUMENTS")`. The skill owns the procedure; the command is a thin entry point. | implement, unit, review, verify, verifyall, run, refine, refineall, plan, brainstorm, runall, parallel, wrap, wrapall, idea |
|
|
19
|
+
| `inline` | The procedure is defined directly in the command file. No `Skill()` delegation — the command carries its own steps. | changelog, gitmsg, fixall, handover |
|
|
20
|
+
|
|
21
|
+
The `Skill()` commands back onto six skills: `sp:spur-dev` (planning + execution workflow + batch),
|
|
22
|
+
`sp:code-implementation` (single implement step), `sp:code-testing` (unit/coverage work),
|
|
23
|
+
`sp:code-verification` (SECUA review + traceability), `sp:parallel-execution` (fan-out / parallel batch),
|
|
24
|
+
and `sp:brainstorm` (structured ideation). The `runall` operation (#13) is `sp:spur-dev`'s batch entry — it delegates the driver loop to the
|
|
25
|
+
`sp:super-planner` agent (the batch orchestrator) per [execution-batch.md](execution-batch.md).
|
|
26
|
+
`dev-parallel` (#13a) is the parallel counterpart. `dev-brainstorm` carries the two artifact exits — `--task` (one task) and `--feature` (validated
|
|
27
|
+
feature with BDD AC; the front-half entry that hands off to `dev-plan`). The 4 `inline` commands
|
|
28
|
+
cover git tooling and operational utilities that have no natural skill home — creating a skill for
|
|
29
|
+
each would be scope creep for one-liner procedures.
|
|
30
|
+
|
|
31
|
+
> **`dev-dogfood`** is not in this table. It is a thin `Skill()` wrapper over the **`sp:dogfood-testing`**
|
|
32
|
+
> backbone skill (which owns the 4-phase dogfood protocol, the live ledger, and the report template);
|
|
33
|
+
> it does not map to a numbered dev-\* operation. See its command file and the backing skill for details.
|
|
34
|
+
|
|
35
|
+
> **`dev-find-issue`** is not in this table. It is a thin `Skill()` wrapper over **`sp:issue-finding`**
|
|
36
|
+
> (session-log forensics → optional CLI-gated fix task). Hygiene / post-batch analysis — not a spine
|
|
37
|
+
> pipeline stage. See `plugins/sp/commands/dev-find-issue.md` and
|
|
38
|
+
> `plugins/sp/skills/issue-finding/SKILL.md`. After a slow `/sp:dev-runall`, prefer
|
|
39
|
+
> `/sp:dev-find-issue [<topic>]` before re-running the batch.
|
|
40
|
+
|
|
41
|
+
> **`dev-find-conflict`** is not in this table. It is a thin `Skill()` wrapper over
|
|
42
|
+
> **`sp:conflict-finding`** (authority-aware four-pillar semantic audit → optional confirmed,
|
|
43
|
+
> owner-routed remediation). Standalone audit — not a spine pipeline stage. Audit mode is read-only;
|
|
44
|
+
> `--resolve` opens a proposal/confirmation workflow that routes each approved repair through its
|
|
45
|
+
> owner surface (`spur task`/`spur feature`, `sp:doc-evolve`, the Spur dev lifecycle, or the
|
|
46
|
+
> Superskill capability lifecycle). See `plugins/sp/commands/dev-find-conflict.md` and
|
|
47
|
+
> `plugins/sp/skills/conflict-finding/SKILL.md`.
|
|
48
|
+
|
|
49
|
+
> **`dev-next`** is likewise not a numbered spine operation. It is a thin `Skill()` wrapper over the
|
|
50
|
+
> **`sp:next-router`** skill — a status→command _meta-router_ that dispatches into the operations
|
|
51
|
+
> above (refine/run/verify/unit/wrap/…) via TABLE A/B/C; it never implements an operation itself.
|
|
52
|
+
> See `plugins/sp/skills/next-router/references/routing-table.md` for the routing SSOT.
|
|
53
|
+
>
|
|
54
|
+
> **Batch consumer (task 0279):** `sp:super-planner` / `/sp:dev-runall` **consumes** TABLE A STOP rows
|
|
55
|
+
> for preflight + one-shot recovery (`plugins/sp/scripts/batch-preflight.ts`) but keeps
|
|
56
|
+
> `task-pipeline.yaml` as the happy path. Do **not** deep-merge batch orchestration into a loop of
|
|
57
|
+
> `/sp:dev-next`. Single-task "what's next?" stays `/sp:dev-next`; multi-task execution stays
|
|
58
|
+
> `/sp:dev-runall` → super-planner.
|
|
59
|
+
|
|
60
|
+
## Operation map
|
|
61
|
+
|
|
62
|
+
| # | Operation | Command | Backing | Skill / Verb | Arg-hint |
|
|
63
|
+
| --- | ---------- | ------------------- | ----------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
64
|
+
| 1 | unit | `dev-unit` | `Skill()` | `sp:code-testing` | `<target> [--coverage <pct>] [--agent <inline\|auto\|name>] [--auto]` |
|
|
65
|
+
| 2 | review | `dev-review` | `Skill()` | `sp:code-verification` (`review`) + `sp:functional-review` + `sp:code-improvement` | `[<wbs\|path>] [--agent <inline\|auto\|name>] [--focus <dims>] [--fix (deprecated)]` |
|
|
66
|
+
| 3 | verify | `dev-verify` | `Skill()` | `sp:code-verification` (`verify`) | `<wbs> [--agent <inline\|auto\|name>] [--fix <none\|blockers-first\|all>] [--focus <lens>] [--bdd] [--auto] [--force] [--next] [--skip-shippable]` |
|
|
67
|
+
| 3a | verifyall | `dev-verifyall` | `Skill()` → agent | `sp:spur-dev` (`verifyall`) | `--tasks <selector> [--feature <id>] [--agent <inline\|auto\|name>] [--fix <none\|blockers-first\|all>] [--focus <lens>] [--bdd] [--auto] [--force] [--next] [--json] [--skip-shippable] [--worktree [<name>]]` |
|
|
68
|
+
| 4 | run | `dev-run` | `Skill()` | `sp:spur-dev` (`run` / `implement`) | `<wbs> [--mode <full\|implement>] [--agent <inline\|auto\|name>] [--auto] [--next] [--wrap] [--continue]` |
|
|
69
|
+
| 5 | refine | `dev-refine` | `Skill()` | `sp:spur-dev` (`refine`) | `<wbs> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--next]` |
|
|
70
|
+
| 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>]]` |
|
|
71
|
+
| 6 | plan | `dev-plan` | `Skill()` | `sp:spur-dev` (`plan`) | `"<description>" [--feature <id>] [--parent <feature-id>] [--agent <inline\|auto\|name>] [--skip-design] [--auto] [--approve-taste]` |
|
|
72
|
+
| 7 | docs | _(no thin wrapper)_ | `Skill()` | `sp:doc-evolve` | `"<change description>"` |
|
|
73
|
+
| 8 | changelog | `dev-changelog` | `inline` | git log + conventional-commit grouping | `[--since <ref>] [--until <ref>] [--version <ver>]` |
|
|
74
|
+
| 9 | gitmsg | `dev-gitmsg` | `inline` | per-file diff summary → group → conventional commit | `[--commit] [--squash] [--scope <path>]` |
|
|
75
|
+
| 10 | fixall | `dev-fixall` | `inline` | lint + test fix loop | `[<validation-command>] [--max-retry <n>] [--scope <path>] [--gate-log <path>] [--findings <anchors>]` |
|
|
76
|
+
| 11 | handover | `dev-handover` | `inline` | structured doc generation | `"<blocker description>"` |
|
|
77
|
+
| 12 | brainstorm | `dev-brainstorm` | `Skill()` | `sp:brainstorm` (`dev-brainstorm`) | `<topic> [--depth <basic\|detailed\|comprehensive>] [--options <n>] [--agent <inline\|auto\|name>] [--skip-discovery] [--wayfind] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]` |
|
|
78
|
+
| 13 | runall | `dev-runall` | `Skill()` → agent | `sp:spur-dev` (`runall`) → `sp:super-planner` | `--tasks <selector> [--feature <id>] [--mode <sequential\|parallel>] [--keep-going] [--auto] [--agent <inline\|auto\|name>] [--json] [--wrap] [--next] [--continue] [--worktree [<name>]]` |
|
|
79
|
+
| 13a | parallel | `dev-parallel` | `Skill()` | `sp:parallel-execution` | `--tasks <selector> [--feature <id>] [--mode <fan-out\|review-panel\|investigation>] [--agent <inline\|auto\|name>] [--json]` |
|
|
80
|
+
| 14 | wrap | `dev-wrap` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `<wbs> [--auto] [--merge] [--dry-run]` |
|
|
81
|
+
| 15 | wrapall | `dev-wrapall` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `[--since <iso>] [--feature <id>] [--status <s>] [--auto] [--merge] [--dry-run]` |
|
|
82
|
+
| 16 | idea | `dev-idea` | `Skill()` | `spur workflow run` (idea-pipeline) | `"<idea>" [--auto] [--skip-design] [--approve-taste]` |
|
|
83
|
+
|
|
84
|
+
## Skill-backed operations
|
|
85
|
+
|
|
86
|
+
These delegate to a backing skill via `Skill()`. The command file is a thin wrapper; the skill
|
|
87
|
+
owns the full procedure. The command's `## Implementation` section contains the `Skill()` call and
|
|
88
|
+
must not be changed without updating the backing skill.
|
|
89
|
+
|
|
90
|
+
> **`--agent <inline|auto|name>` SSOT:** the full value-semantics contract (one rule, value table,
|
|
91
|
+
> objective triggers, executor precedence chain, `implementAgent` override) lives in
|
|
92
|
+
> [cross-cutting.md](cross-cutting.md#inline-default-execution-surface).
|
|
93
|
+
> Every `Skill()` operation below accepts the selector; `inline` runs in-session, `auto`
|
|
94
|
+
> tier-resolves a subprocess executor, a name pins that executor, and named escalation triggers
|
|
95
|
+
> override inline. This note is the single statement of that contract; per-operation entries do
|
|
96
|
+
> not restate it.
|
|
97
|
+
|
|
98
|
+
### 1. unit
|
|
99
|
+
|
|
100
|
+
- **Purpose:** Extend or generate tests for a task or file until the coverage target is met with a fully passing suite.
|
|
101
|
+
- **Inputs:** `<target>` (required — WBS, task file, source file, or glob). `--coverage <pct>` overrides the default target. Execution defaults to inline (in-session); `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)).
|
|
102
|
+
- **Backing:** `sp:code-testing` competency skill.
|
|
103
|
+
- **Behavior:** Detect the project stack → read the implementation → identify untested paths → write targeted tests → measure coverage → iterate until the per-file line/function target (≥90%) is met. The language-agnostic procedure (two workflows, gap categorization, coverage-vs-quality, escalation) and the per-stack adapters are the SSOT in **`sp:code-testing`** (`references/unit-testing.md` + `references/stacks/`). The spine dispatches here; it does not inline the procedure.
|
|
104
|
+
- **Delegation:** `Skill(skill="sp:code-testing", args="$ARGUMENTS")`
|
|
105
|
+
|
|
106
|
+
### 2. review
|
|
107
|
+
|
|
108
|
+
- **Purpose:** Multi-dimensional code review of a task or path — (1) functional requirements traceability (WBS mode only), (2) SECUA framework (Security, Efficiency, Correctness, Usability, Architecture), (3) architecture depth.
|
|
109
|
+
- **Modes:**
|
|
110
|
+
- **WBS mode (`<wbs>`)**: Runs functional requirements traceability (`sp:functional-review`), SECUA framework (`sp:code-verification`), and architectural depth (`sp:code-improvement`). May write findings to the task's `## Review` section.
|
|
111
|
+
- **Path mode (`<path>`)**: Runs advisory SECUA framework (`sp:code-verification`) and architectural depth (`sp:code-improvement`). Performs no task mutation.
|
|
112
|
+
- **Inputs:** `<wbs|path>` (required). Review executes inline (in-session) by default. `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--focus <lens>` narrows to one SECUA dimension. Note: `--fix` and `--next` are **deprecated** (no-op with warning; route remediation to `/sp:dev-verify --fix` and progression to `/sp:dev-next`).
|
|
113
|
+
- **Backing:** `sp:functional-review`, `sp:code-verification` (review mode), `sp:code-improvement`.
|
|
114
|
+
- **Behavior:** WBS mode runs functional traceability + SECUA + architecture depth, ranking findings P1–P4 and writing findings to the task's `## Review` section. Path mode runs advisory SECUA + architecture depth with no task mutation.
|
|
115
|
+
- **Delegation:** WBS mode: `sp:functional-review` + `sp:code-verification` (review) + `sp:code-improvement`; Path mode: `sp:code-verification` (review) + `sp:code-improvement`.
|
|
116
|
+
|
|
117
|
+
### 3. verify
|
|
118
|
+
|
|
119
|
+
- **Purpose:** Requirements traceability — verify a task's implementation against its acceptance criteria, producing a PASS/PARTIAL/FAIL verdict with per-requirement evidence. Optionally (with `--fix all`) evaluate **feature shippable readiness**.
|
|
120
|
+
- **Inputs:** `<wbs>` (required). Verify executes inline (in-session) by default. `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--fix`, `--focus`, `--bdd`, `--auto`, `--force` modulate the verify pass. `--next` (terminal chain link): on the **post-`--fix`** PASS verdict, transition `testing → done` through the FSM (`--strict-core` guard honored). On PARTIAL/FAIL or guard failure, stop as review-pending. **`--skip-shippable`** (alias `--skip-shipable`): disable the shippable gate that otherwise runs under `--fix all` when the task has a `feature_id`.
|
|
121
|
+
- **Backing:** `sp:code-verification` skill, `verify` mode.
|
|
122
|
+
- **Behavior:** Status guard → change-scope detection → requirements traceability → SECUA review → verdict aggregation → findings write-back → verdict-artifact emission → optional `--fix` pass → **shippable readiness** (when active). The per-task verdict gates the pipeline's `done` transition. With `--next`: the (post-`--fix`) PASS verdict → transition to `done` (FSM guard honored); PARTIAL/FAIL → stop and surface verdict. Shippable FAIL does not rewrite the task verdict line but must be printed; feature is not “ready.”
|
|
123
|
+
- **Shippable readiness (default on with `--fix all`):** After the task verdict, if `--fix all` and the task has `feature_id` and not `--skip-shippable`, run `spur feature check <id> --json` + linked-task completeness. Emit `Shippable: PASS|FAIL|N/A`. FAIL when feature AC scenarios are orphaned/unverified or any linked task is not `done`/`cancelled`. SSOT procedure: `sp:code-verification` Step 13.
|
|
124
|
+
- **Delegation:** `Skill(skill="sp:code-verification", args="verify $ARGUMENTS")`
|
|
125
|
+
|
|
126
|
+
### 3a. verifyall
|
|
127
|
+
|
|
128
|
+
- **Purpose:** Batch verification of a set of tasks (or all tasks under a feature) against their requirements and AC. Produces per-task verdicts + a summary report with aggregate statistics (counts, table, overall batch verdict). With `--fix all`, also evaluates **feature shippable readiness** once for the set.
|
|
129
|
+
- **Inputs:** `--tasks <selector>` (required unless `--feature`). `--feature <id>` (convenience for `--tasks feature:<id>`). Shared verify flags from `dev-verify` (`--agent <inline|auto|name>`, `--fix`, `--focus`, `--bdd`, `--auto`, `--force`, **`--skip-shippable`**). `--next` (per-task lifecycle chaining: on a PASS verdict transition `testing → done` through the FSM with `--strict-core` honored; PARTIAL/FAIL does not transition; transitions run **before** the shippable gate so `spur feature check` sees final statuses). `--json` for machine-readable summary report.
|
|
130
|
+
- **Backing:** `sp:spur-dev` skill, `verifyall` operation (resolves the set using the shared selector grammar, dispatches per-task verify via `sp:code-verification` verify mode, writes per-task artifacts, aggregates and emits the batch summary report, then optional shippable gate).
|
|
131
|
+
- **Behavior:** Resolve + freeze the set (supports `--feature` sugar). For each task: apply status guard, requirements traceability + AC + SECUA review, write `## Testing` + verdict.json (per-task fix pass under `--fix`). After the batch: **shippable gate once** when active (see below). Emit a structured summary report (markdown or `--json`). Per-task behavior matches single `dev-verify` (except shippable is batch-once). **Batch verdict rollup is deterministic** — computed by `spur task verifyall-aggregate --from-file <batch-input.json> --json` (a tested service module, not agent discretion). **Per-task outcome grammar:** `PASS` / `PARTIAL` / `FAIL` for implemented tasks; `NOT-STARTED` for tasks that have not entered implementation (status `backlog`/`todo`/`blocked` — reachable only via `--force`). **Rollup rule:** all-NOT-STARTED → `UNKNOWN`; any `FAIL` → `FAIL`; any `PARTIAL` or `UNKNOWN` → `PARTIAL`; all `PASS` → `PASS`. NOT-STARTED rows are _excluded_ from the FAIL/PARTIAL rollup (they cannot manufacture a batch failure) but are _reported explicitly_ in the summary ("N NOT-STARTED, excluded from rollup"). This closes the 0341 dogfood gap where a healthy feature with 5 PASS + 2 unstarted tasks read as FAIL. **Shippable FAIL:** treat the batch as not clean — force rollup to at least **PARTIAL** and set `"shippable": false` under `--json` even if every task outcome is PASS.
|
|
132
|
+
- **Shippable readiness (default on with `--fix all`):** Active when `--fix all` and feature context exists (`--feature` or unique shared `feature_id`) and not `--skip-shippable`. Procedure: `sp:code-verification` Step 13 once after all per-task legs. Without `--fix all`, do not run the hard gate (optional note: use `--fix all` for ship evaluation).
|
|
133
|
+
- **Cache discipline (batch):** freeze the `spur task list --feature <id> --json` (or selector) capture once at resolve; reuse that snapshot for every per-task verify leg. Do not re-list the set mid-batch. Re-read a task body only when that task's sections changed (e.g. after a `--fix` write). Prefer re-reading only cited `file:line` anchors over re-tokenizing full Solution sections when prior Testing is already present.
|
|
134
|
+
- **Dogfood / mutation composition:** prefer step-split when dogfooding verifyall with `--fix all` and/or `--next` — first observe-only verifyall, then a separate fix pass, then `--next` only if status transitions are still needed. See `sp:dogfood-testing` §step-splitting.
|
|
135
|
+
- **Delegation:** `Skill(skill="sp:spur-dev", args="verifyall $ARGUMENTS")`
|
|
136
|
+
|
|
137
|
+
### 4. run
|
|
138
|
+
|
|
139
|
+
- **Purpose:** Run a task through the execution pipeline (full) or execute a single pipeline step (implement).
|
|
140
|
+
- **Inputs:** `<wbs>` (required). `--mode <full|implement>` selects the execution mode. `implement` invokes `sp:code-implementation` inline by default. Interactive `full` with omit/`--agent inline` reads `task-pipeline.yaml` and drives its actions/guards in the host session; `--agent auto`, a name, or headless invocation launches the workflow subprocess. `--agent <inline|auto|name>` selects the execution surface (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips the HITL approve gate / confirmations and propagates down the `--next` chain. `--next` controls chaining only and never changes the mode; a pipeline implement stage must invoke `/sp:dev-run <wbs> --mode implement`. On implement success with `--next`, transition `todo → wip → testing` through the FSM (guards honored — no `--no-lifecycle`) + chain to `/sp:dev-verify <wbs> --auto --next`. On a guard failure, stop as review-pending. **Partial-deliverable rule:** if the task ships only part of its requirements (e.g. an R1/R2 split with the rest in a follow-up task), the `## Solution` section must state that explicitly and the verify verdict will record the scope.
|
|
141
|
+
- **Backing:** `sp:spur-dev` skill — `run` operation for the full pipeline (the spine drives it); `sp:code-implementation` competency skill for the implement step (the spine dispatches to it).
|
|
142
|
+
- **Modes:**
|
|
143
|
+
- **`full`** (default): Drive the full pipeline — precheck → implement → test → review → approve(HITL) → verify → record → done. Interactive omit/inline uses [inline-pipeline-driver.md](inline-pipeline-driver.md); explicit/headless executor selection invokes `spur workflow run .spur/workflows/task-pipeline.yaml --vars '{"wbs":"<wbs>"}'` (with `profile: auto` when `--auto`). Both monitor/surface HITL and preserve the YAML gates. `--next` never changes this mode.
|
|
144
|
+
- **`implement`** (explicit `--mode implement` only): Execute only the implement step. Read the task's `## Requirements` / `## Design` / `## Plan`, write the code that satisfies them, author the `## Solution` change-map section (file:line + what/why per changed file) via `spur task update <wbs> --section Solution --from-file`. This is the implement step the pipeline calls — it is NOT the pipeline driver. With `--next`: on success, transition `todo → wip → testing` through the FSM (guards honored — no `--no-lifecycle`) + chain to `/sp:dev-verify <wbs> --auto --next`; on a guard failure, stop as review-pending. **Partial-deliverable rule:** if the task ships only part of its requirements (e.g. an R1/R2 split with the rest in a follow-up task), the `## Solution` and `## Review` sections MUST carry a `⚠️ PARTIAL` marker naming the deferred part and the follow-up WBS — see `plugins/sp/commands/dev-run.md` → "Section ownership".
|
|
145
|
+
- **Delegation:** `Skill(skill="sp:spur-dev", args="run-inline $ARGUMENTS")` for interactive full omit/inline; `Skill(skill="sp:spur-dev", args="run $ARGUMENTS")` for explicit/headless full mode; `Skill(skill="sp:code-implementation", args="$ARGUMENTS")` for implement mode.
|
|
146
|
+
|
|
147
|
+
### 5. refine
|
|
148
|
+
|
|
149
|
+
- **Purpose:** Refine a task's requirements via structured Q&A — clarify scope, elicit missing details, tighten acceptance criteria before execution. Optional **implement-ready** depth freezes Design/Requirements/Plan so another agent can implement without inventing design.
|
|
150
|
+
- **Inputs:** `<wbs>` (required). `--focus <mode>` narrows the gap analysis. `--depth <standard|ready>` (default **`standard`**) sets the depth bar — see [flag-glossary.md](flag-glossary.md#flag-depth). Execution defaults to inline (in-session); `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips interactive Q&A (synthesis only) and propagates down the `--next` chain. `--next`: advance to the next step — transition `backlog → todo` through the FSM **idempotently** (only when `status == backlog`; a task already at `todo` or past it skips the transition and chains anyway — `status >= todo` ⇒ already advanced) and invoke `/sp:dev-run <wbs> --mode implement --auto --next`. On a guard/refine failure, stop as review-pending.
|
|
151
|
+
- **Backing:** `sp:spur-dev` skill, `refine` operation. Q&A clarifications are presented as decision briefs per [decision-brief.md](decision-brief.md).
|
|
152
|
+
- **Behavior:** Read the task → elicit missing AC/Design/Plan through targeted Q&A (or auto-synthesis) → write each via `spur task update <wbs> --section <name> --from-file`. Done just-in-time, per task, immediately before execution. With `--next`: on success, transition status (idempotently — see Inputs) + chain to dev-run; on failure, stop and surface error.
|
|
153
|
+
- **Pre-synthesis skip gate (under `--auto` + `--depth standard` only):** Before invoking synthesis, run `spur task check <wbs> --json`. Filter the findings to the **refine target sections** only:
|
|
154
|
+
`{Background, Requirements, Acceptance Criteria, Design, Plan}`.
|
|
155
|
+
These are the anti-drift surfaces: constraints + planning that cheaper implementers must follow.
|
|
156
|
+
**Solution is not a refine target** (as-built change-map owned by implement). If there are no L3
|
|
157
|
+
findings for any of those sections (regardless of whether the _overall_ exit code is 0 — other
|
|
158
|
+
sections may have findings), emit a structured SKIP result instead of synthesizing:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
SKIP — sections already meet L3: sections-considered=[Background, Requirements, Acceptance Criteria, Design, Plan], reason="no L3 findings for target sections" (N L4 advisory: <labels>)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The `(N L4 advisory: <labels>)` suffix is emitted whenever `spur task check` returned ≥1 L4
|
|
165
|
+
finding — list each L4 finding's one-line label, comma-separated. Omit the suffix when there
|
|
166
|
+
are zero L4 findings. L4 advisories do not block the SKIP; the suffix is informational only.
|
|
167
|
+
Under `--json`/machine consumption, emit the same decision as a structured object so a downstream
|
|
168
|
+
(observe-only) driver need not re-run `spur task check` to reconstruct it:
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"result": "SKIP",
|
|
173
|
+
"sections-considered": [
|
|
174
|
+
"Background",
|
|
175
|
+
"Requirements",
|
|
176
|
+
"Acceptance Criteria",
|
|
177
|
+
"Design",
|
|
178
|
+
"Plan"
|
|
179
|
+
],
|
|
180
|
+
"reason": "no L3 findings for target sections",
|
|
181
|
+
"depth": "standard",
|
|
182
|
+
"l4Advisories": [{ "message": "Missing feature_id — ..." }]
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Synthesis is only invoked when a real L3 gap exists in a target section. The SKIP result is the normal outcome for a well-specified task under `--auto` + `standard`; it is not a failure.
|
|
187
|
+
**Scope:** only L3 findings whose `section` ∈ {Background, Requirements, Acceptance Criteria, Design, Plan} count toward the SKIP gate. L3 findings on other sections (e.g. `### Review`, `### Solution`) do not block the SKIP — refine does not own those sections.
|
|
188
|
+
**Variant note:** for templates that omit Design or AC (e.g. `review`, `meta`, `issue`), only apply the target sections that the section-matrix allows at the current status (`spur task check` `requiredSections` / optional list).
|
|
189
|
+
|
|
190
|
+
- **`--depth ready` (implement-ready — never L3-SKIP alone):** When `--depth ready` is set, **do not**
|
|
191
|
+
apply the L3-only SKIP gate above, even under `--auto`. Instead evaluate the **implement-ready
|
|
192
|
+
checklist** against target sections (read codebases, ADRs, dependent WBS, dogfood evidence as
|
|
193
|
+
needed). If any item fails, synthesize and rewrite via CLI-gated section updates until all pass
|
|
194
|
+
(or surface a blocked Q&A with a concrete question). Outcome vocabulary: `refined` (wrote) |
|
|
195
|
+
`ready` (checklist already met, no write — optional alias of refined with zero writes) | `failed`.
|
|
196
|
+
Prefer reporting `refined` when any section changed; if checklist already fully met, emit:
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
SKIP — sections already meet implement-ready checklist: depth=ready, sections-considered=[…]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Implement-ready checklist (all must hold for allowed target sections):**
|
|
203
|
+
1. **Requirements** — R-items are observable outcomes; explicit out-of-scope / non-goals; no
|
|
204
|
+
ambiguous “wire it up” without a named seam or file area.
|
|
205
|
+
2. **Design** — WHAT / WHY / WHERE; **frozen names** (types, flags, vars, paths) **or** explicit
|
|
206
|
+
“no new API”; precedence / algorithm when behavior is non-obvious; **anti-patterns** (what not
|
|
207
|
+
to implement); primary file/package targets; handoff to dependent tasks (WBS) if any.
|
|
208
|
+
3. **Plan** — ordered checklist mappable to R-items; test/verification intent called out.
|
|
209
|
+
4. **Acceptance Criteria** — scenarios still match feature R-titles when `feature_id` is set;
|
|
210
|
+
Given/When/Then still executable as a verify lens.
|
|
211
|
+
5. **Q&A / References** — open decisions closed or explicitly deferred with owner; links to ADR /
|
|
212
|
+
feature / upstream tasks present when the design depends on them.
|
|
213
|
+
6. **Cross-task** — if `dependencies[]` exist, Design states what this task assumes from deps and
|
|
214
|
+
what it must leave for dependents (no silent re-ownership of upstream contracts).
|
|
215
|
+
7. **Premise verification** — every factual claim in Background and Requirements that the Design
|
|
216
|
+
depends on (a status, a file/table/location, an already-landed fix, a count) is checked against
|
|
217
|
+
the **current tree** — read the file, run the query, grep the corpus. Contradictions are
|
|
218
|
+
corrected in **this** refine (rewrite the claim, or re-point the design at ground truth), never
|
|
219
|
+
deferred to the implementer. `--depth ready` exists so a downstream agent does not re-derive the
|
|
220
|
+
analysis; a frozen design built on a false premise is the worst available outcome.
|
|
221
|
+
|
|
222
|
+
Ready depth is for multi-package work, multi-agent implement handoffs, and costly pipeline
|
|
223
|
+
failures — not for every small task. Default remains `standard`.
|
|
224
|
+
|
|
225
|
+
- **SKIP short-circuits synthesis, not `--next`.** A SKIP means no synthesis was needed — it does **not** cancel the `--next` chain. Under `--auto --next`, a SKIP still flows into the (idempotent) status transition and the chained `/sp:dev-run --mode implement`. "`refine --auto --next` on a well-specified task" is therefore effectively "run the implement→verify chain"; an operator who wanted refinement only should drop `--next`.
|
|
226
|
+
- **Delegation:** `Skill(skill="sp:spur-dev", args="refine $ARGUMENTS")`
|
|
227
|
+
|
|
228
|
+
### 5a. refineall
|
|
229
|
+
|
|
230
|
+
- **Purpose:** Batch-refine a set of tasks (or all refine-eligible tasks under a feature) — resolve a set, topo-sort by dependencies, run per-task `refine`, emit a summary report. Planning-half counterpart of `verifyall` / `runall` for the just-in-time spec-completion gate. With `--depth ready`, batch **implement-ready** freeze before multi-agent implement or runall.
|
|
231
|
+
- **Inputs:**
|
|
232
|
+
- `--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).
|
|
233
|
+
- Shared refine flags (passed through to each per-task refine): `--focus <mode>`, `--description <text>`, `--depth <standard|ready>`, `--agent <inline|auto|name>`, `--auto`, `--next`.
|
|
234
|
+
- Batch-only flags: `--keep-going` (continue independents after a failure; default halt), `--status <s>` (filter resolved membership; default **`backlog,todo`** — planning-side fill candidates), `--json` (machine-readable batch report).
|
|
235
|
+
- **Backing:** `sp:spur-dev` skill, `refineall` operation (orchestrates; per-task body is the single-task `refine` operation — never a second refine implementation).
|
|
236
|
+
- **Behavior:**
|
|
237
|
+
1. Resolve + **freeze** the set at kickoff (never re-query membership mid-batch).
|
|
238
|
+
2. Apply `--status` filter (default `backlog,todo`). Tasks already `done`/`cancelled`/`testing` are excluded unless the operator widens `--status`. Report each exclusion with reason.
|
|
239
|
+
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).
|
|
240
|
+
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).
|
|
241
|
+
5. Failure policy: **stop-the-batch** (default) or `--keep-going` (skip in-batch dependents of a failed refine; continue independents).
|
|
242
|
+
6. Emit a batch report (markdown or `--json`) that records `depth` once at the header.
|
|
243
|
+
- **Per-task outcome vocabulary:** `refined` (synthesis wrote sections) | `SKIP` (already meets the active depth bar under `--auto`) | `failed` | `skipped` (dep failed under `--keep-going`) | `not-attempted` (halted) | `blocked` (unmet out-of-set dep).
|
|
244
|
+
- **Batch verdict:** `clean` (all attempted tasks `refined` or `SKIP`) | `halted` (a failure stopped the batch) | `aborted` (cycle / unknown selector / empty set after filter).
|
|
245
|
+
- **`--next` warning:** Passing `--next` chains **each** successful refine into `/sp:dev-run <wbs> --mode implement --auto --next`, which can balloon into implement+verify execution for every task. Prefer refineall without `--next`, then `/sp:dev-runall --feature <id>` for execution. Document the risk in the batch report header when `--next` is set.
|
|
246
|
+
- **`--auto` recommendation:** Batch refine without `--auto` requires per-task interactive Q&A and does not scale. Default operator path: `/sp:dev-refineall --feature <id> --auto`. For implement handoffs: `/sp:dev-refineall --feature <id> --auto --depth ready`.
|
|
247
|
+
- **Delegation:** `Skill(skill="sp:spur-dev", args="refineall $ARGUMENTS")` → per task `Skill(skill="sp:spur-dev", args="refine <wbs> $SHARED_FLAGS")` (shared flags include `--depth` when set).
|
|
248
|
+
|
|
249
|
+
### 6. plan
|
|
250
|
+
|
|
251
|
+
- **Purpose:** Plan a feature from a description — intake → feature create → AC generation → feature check gate → decomposition → batch-create (with **Design by default**).
|
|
252
|
+
- **Inputs:** `"<description>"` (required). `--feature <id>` links to an existing feature. `--parent <feature-id>` nests under a parent. The planning pipeline's `agent.run` stages always dispatch a subprocess; `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). **Design package flags (unified with `/sp:dev-idea`):**
|
|
253
|
+
- **Default:** author task `design` on every batch item + feature satellite when the seam heuristic fires (**ties lean design**). There is **no** `--design` force flag.
|
|
254
|
+
- `--skip-design` — skip feature satellite **and** omit task `design` fields (scaffold only; refine fills later). Sole design opt-out.
|
|
255
|
+
- `--approve-taste` — with `--auto`, pre-clear design-approval taste pause when that gate is used (`design_approved=true`). Alias: `--design-approved`.
|
|
256
|
+
- **Backing:** `sp:spur-dev` skill, `plan` operation. Stage `plan` floors at `capable-2` (fallback `capable-3`).
|
|
257
|
+
- **Behavior:** Clarify scope → `spur feature create` → author BDD AC → `spur feature check` gate → decompose into task-batch JSON **including `design` (unless `--skip-design`)** → `spur task batch-create` gate. Design package details: [planning-workflow.md](planning-workflow.md) Step 5.5.
|
|
258
|
+
- **Delegation:** `Skill(skill="sp:spur-dev", args="plan $ARGUMENTS")`
|
|
259
|
+
|
|
260
|
+
### 7. docs
|
|
261
|
+
|
|
262
|
+
- **Purpose:** Evolve project documentation — update ADR, PRD, ARCHITECTURE, DESIGN, FEATURES docs per the constitution's edit rules.
|
|
263
|
+
- **Inputs:** `"<change description>"` (required).
|
|
264
|
+
- **Backing:** `sp:doc-evolve` skill — no thin `dev-docs` command wrapper exists (the skill is invoked directly or via the operator).
|
|
265
|
+
- **Behavior:** Read the affected doc → apply the constitution's edit rules (single-source-of-truth, cross-reference updates, same-commit sync triggers) → write via the correct tool.
|
|
266
|
+
- **Delegation:** `Skill(skill="sp:doc-evolve", args="$ARGUMENTS")` (no thin command wrapper)
|
|
267
|
+
|
|
268
|
+
### 12. brainstorm
|
|
269
|
+
|
|
270
|
+
- **Purpose:** Interactive solution design — heuristic discovery interview (grilling) followed by structured ideation with trade-offs and confidence scoring.
|
|
271
|
+
- **Inputs:** `"<topic>"` (required). `--depth <basic|detailed|comprehensive>` controls how deep to walk the decision tree. `--options <n>` sets the number of solution approaches (default 3). Model steps execute inline (in-session) by default; `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--skip-discovery` skips the grilling interview and goes straight to ideation. `--task [<feature-id>]` and `--feature [<parent-id>]` are the two **artifact exits** (mutually exclusive — see below). `--next` chains the `--feature` exit into `/sp:dev-plan` decomposition.
|
|
272
|
+
- **Backing:** `sp:brainstorm` skill, `dev-brainstorm` operation.
|
|
273
|
+
- **Behavior:** Two-phase protocol. Phase 1 (inline): walk the decision tree one question at a time, each with a recommended answer, exploring the codebase before asking the user. Phase 2 (delegated): pass the resolved decision tree to `sp:brainstorm` for structured ideation — each approach includes description, trade-offs, implementation notes, confidence level, and decision trace.
|
|
274
|
+
- **Artifact exits (mutually exclusive):**
|
|
275
|
+
- `--task [<feature-id>]` — create one `todo` task from the ⭐ approach via `spur task create` (Background/Requirements/Plan seeded from the brainstorm). The fast path for a single unit of work.
|
|
276
|
+
- `--feature [<parent-id>]` — the **front-half entry**: `spur feature create`, then author Goal/Scope/BDD-AC by editing the feature file (no `--section` verb on `feature update`), then loop `spur feature check` to exit 0. Lands a validated feature; hands off to `/sp:dev-plan --feature <ID>` for decomposition. AC scenarios derive from the decision trace per [ac-style-guide.md](ac-style-guide.md#decision-trace--ac-scenario-mapping).
|
|
277
|
+
- `--next` (with `--feature`) — on a clean `feature check`, auto-invoke `/sp:dev-plan --feature <ID>` so the planning half chains end-to-end like the execution half. Ignored without `--feature`.
|
|
278
|
+
- Passing both `--task` and `--feature` is an error.
|
|
279
|
+
- **`--task` exit seeding:** create via `spur task create "<approach-name>" --feature <id> --template feature-impl` (omit `--feature` when no feature-id is given). The task is seeded with:
|
|
280
|
+
- **Background** ← the brainstorm Overview + the chosen approach's Description + decision-trace context
|
|
281
|
+
- **Requirements** ← the approach's Implementation Notes, converted to R-item checkboxes
|
|
282
|
+
- **Plan** ← the brainstorm's Next Steps, converted to an ordered checklist
|
|
283
|
+
|
|
284
|
+
Report the new task WBS and file path; the task lands at `todo`, ready for `/sp:dev-refine`.
|
|
285
|
+
|
|
286
|
+
- **Delegation:** `Skill(skill="sp:brainstorm", args="dev-brainstorm --context <decision-tree> --options <n>")`
|
|
287
|
+
|
|
288
|
+
### 13. runall
|
|
289
|
+
|
|
290
|
+
- **Purpose:** Run a batch of tasks through their pipelines in dependency-correct order — resolve a set, topo-sort, run each via `task-pipeline.yaml`, inspect verdicts, apply the failure policy, emit a batch report.
|
|
291
|
+
- **Inputs:** `--tasks <selector>` (required — explicit WBS list, status pseudo-list, `feature:<id>`, or `ready`). `--mode <sequential|parallel>` (default `sequential`; `parallel` fans out a proven-independent subset per `execution-batch.md` § Parallel Execution). `--keep-going` skips a failed task's in-batch dependents and continues independents (default halts on first failure). `--auto` sets `profile=auto` on each per-task run (skips the HITL approve gate). The orchestrator loop itself continues in this session; each full per-task workflow's `agent.run` stages always dispatch a subprocess. `--agent <inline|auto|name>` pins the executor for the per-task stages (see [SSOT](cross-cutting.md#inline-default-execution-surface)); the value crosses into per-task `vars.agent`, not the orchestrator. `--json` emits the report as JSON. `--wrap` triggers `wrapup-pipeline.yaml` after the batch completes, `--next` chains each task to terminal status then runs the wrap hop **once for the batch**, `--continue` resumes from checkpoint.
|
|
292
|
+
- **Three orthogonal axes (do not confuse):** `--keep-going` = batch failure policy (halt vs skip dependents); `--continue` = resume from checkpoint (pick up an interrupted batch); `--next` = per-task lifecycle chaining (advance status on a verdict — `dev-verify`/`dev-verifyall` only). `routing-table.md` offers `--continue` and `--next` as competing options for the same situation only when the batch was interrupted mid-run; otherwise they address different problems.
|
|
293
|
+
- **Backing:** `sp:spur-dev` skill, `runall` operation → delegates the driver loop to the **`sp:super-planner`** agent (the batch orchestrator).
|
|
294
|
+
- **Behavior:** The orchestrator reads [execution-batch.md](execution-batch.md) and drives: resolve selector → freeze set → topo-sort by `dependencies[]` (Kahn, WBS-ascending tie-break; cycle aborts) → resolve out-of-set deps by status (done → allow, else → block subtree) → run each task via `spur workflow run task-pipeline.yaml --async` + `spur workflow trace` polling → inspect terminal state + `.spur/run/<wbs>-verdict.json` → stop-the-batch default or `--keep-going` subtree skip → emit batch report. Per-task pipeline is invoked **verbatim** — no new FSM, no step edits. `--auto`/`--agent` are the only flags that cross the orchestrator→pipeline boundary (both into per-task `--vars`).
|
|
295
|
+
- **Delegation:** `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` → `sp:super-planner` agent.
|
|
296
|
+
|
|
297
|
+
### 14. wrap
|
|
298
|
+
|
|
299
|
+
- **Purpose:** Wrap up a single completed task — capture learnings, record metrics, sync docs, and optionally advance the feature / clean up the branch.
|
|
300
|
+
- **Inputs:** `<wbs>` (required, positional). `--auto` skips objective confirmations (the branch-cleanup HITL gate still pauses — irreversible). `--merge` triggers branch cleanup (irreversible HITL gate).
|
|
301
|
+
- **Backing:** `spur workflow run .spur/workflows/wrapup-pipeline.yaml` — direct workflow invocation (no backing skill; the pipeline IS the procedure).
|
|
302
|
+
- **Behavior:** Builds `--vars '{"tasks":"[\"<wbs>\"]","profile":"interactive|auto","merge":"true|false"}'` and invokes the wrapup pipeline. The pipeline runs: task-resolve → doc-sync → learning-capture → metrics-record → (feature-transition) → (branch-cleanup) → done. Task statuses are NOT mutated. Branch cleanup is an irreversible HITL gate that always pauses, even under `--auto`.
|
|
303
|
+
- **Vars string typing:** `tasks` is a JSON-encoded **string**, not a JSON array — `spur workflow run --vars` accepts only string values (`--vars values must be strings`); the pipeline's guards parse the string with `jq length`. `jq -nc` guarantees the shape:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
VARS=$(jq -nc --arg tasks "[\"$WBS\"]" --arg profile "$PROFILE" --arg merge "$MERGE" \
|
|
307
|
+
'{tasks:$tasks, profile:$profile, merge:$merge}')
|
|
308
|
+
spur workflow run .spur/workflows/wrapup-pipeline.yaml --vars "$VARS"
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
- **Delegation:** Direct `spur workflow run .spur/workflows/wrapup-pipeline.yaml` (no `Skill()` call — the command builds the vars JSON and invokes the workflow directly via `Bash`).
|
|
312
|
+
|
|
313
|
+
### 15. wrapall
|
|
314
|
+
|
|
315
|
+
- **Purpose:** Wrap up a batch of completed tasks — capture learnings, record metrics, sync docs, advance a feature through legal lifecycle edges, and optionally clean up branches.
|
|
316
|
+
- **Inputs:** `--since <iso-date>` filters done tasks by frontmatter `updated_at >= date` (v1 approximation). `--feature <id>` selects all tasks under a feature AND advances the feature through legal lifecycle edges (`backlog → active → verifying → done`, guards honored). `--status <s>` (default: `done`) filters by task status. `--auto` skips objective confirmations. `--merge` triggers branch cleanup (irreversible HITL gate).
|
|
317
|
+
- **Backing:** `spur workflow run .spur/workflows/wrapup-pipeline.yaml` — direct workflow invocation.
|
|
318
|
+
- **Behavior:** Resolves the task list via `spur task list --json` (filtered by `--feature`, `--since`, `--status`), builds `--vars '{"tasks":"[...]","feature":"<id>","profile":"interactive|auto","merge":"true|false"}'`, and invokes the wrapup pipeline. The pipeline runs the same states as `wrap` but with the full task list and optional feature transition. Task statuses are NOT mutated. Feature transitions go through `spur feature update` so lifecycle guards apply. Branch cleanup is an irreversible HITL gate.
|
|
319
|
+
- **Vars string typing:** `tasks` is a JSON-encoded **string**, not a JSON array — `--vars` values must be strings (the CLI rejects raw arrays); `jq -nc` passes the array text through as a string value:
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
VARS=$(jq -nc --arg tasks "$TASKS" --arg feature "$FEATURE" --arg profile "$PROFILE" --arg merge "$MERGE" \
|
|
323
|
+
'{tasks:$tasks, feature:$feature, profile:$profile, merge:$merge}')
|
|
324
|
+
spur workflow run .spur/workflows/wrapup-pipeline.yaml --vars "$VARS"
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
- **Delegation:** Direct `spur workflow run .spur/workflows/wrapup-pipeline.yaml` (no `Skill()` call — the command resolves tasks and invokes the workflow directly via `Bash`).
|
|
328
|
+
|
|
329
|
+
### 16. idea
|
|
330
|
+
|
|
331
|
+
- **Purpose:** Turn a vague idea into a feature with AC and a decomposed task batch — the unified entry point for the planning half.
|
|
332
|
+
- **Inputs:** `"<idea>"` (required, positional, quoted). Three everyday axes:
|
|
333
|
+
- `--auto` — skip **objective** HITL (feature-check, batch-create); taste gates still pause.
|
|
334
|
+
- `--skip-design` — design package off (system-design + task Design).
|
|
335
|
+
- `--approve-taste` — with `--auto`, skip **all** remaining taste pauses this run (idea-eval + design-approval). Sets `idea_approved=true` and `design_approved=true`.
|
|
336
|
+
Aliases (prefer `--approve-taste`): `--idea-approved` → `idea_approved`; `--design-approved` → `design_approved`. There is **no** `--design` force flag.
|
|
337
|
+
- **Backing:** `spur workflow run .spur/workflows/idea-pipeline.yaml` — direct workflow invocation.
|
|
338
|
+
- **Behavior:** Builds vars from the table above and invokes 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.
|
|
339
|
+
- **Delegation:** Direct `spur workflow run .spur/workflows/idea-pipeline.yaml` (command maps flags → vars, then `Bash`).
|
|
340
|
+
- **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.
|
|
341
|
+
- **Design package (`--skip-design` only):**
|
|
342
|
+
|
|
343
|
+
| Flags | Feature satellite (`system-design`) | Task `### Design` in batch |
|
|
344
|
+
| --------------- | ----------------------------------- | ----------------------------------------- |
|
|
345
|
+
| (default) | seam / `needs_design` signal | **author `design` on each batch item** |
|
|
346
|
+
| `--skip-design` | skip (keep brainstorm summary) | **omit `design`** — refine fallback later |
|
|
347
|
+
|
|
348
|
+
Ties lean design — when the signal is ambiguous, `system-design` runs. Task Design defaults on
|
|
349
|
+
unless `--skip-design`. Plan path uses the same package contract (no `--design` force flag).
|
|
350
|
+
|
|
351
|
+
- **Taste pre-clear (`--approve-taste`):** owned with design-approval var semantics in [cross-cutting.md](cross-cutting.md) § "Design Approval Gate"; idea-eval uses the parallel `idea_approved` var. One CLI flag sets both.
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## Inline operations
|
|
356
|
+
|
|
357
|
+
These define their procedure directly in the command file. No `Skill()` delegation — the command
|
|
358
|
+
is the procedure. The backing is a combination of git CLI, `spur` CLI, and agent reasoning.
|
|
359
|
+
|
|
360
|
+
### 8. changelog
|
|
361
|
+
|
|
362
|
+
- **Purpose:** Generate a structured changelog from git commits between two refs.
|
|
363
|
+
- **Inputs:** `--since <ref>` (default: last tag), `--until <ref>` (default: `HEAD`), `--version <ver>` (default: auto-detect from latest tag).
|
|
364
|
+
- **Backing:** `inline` — git log + conventional-commit grouping.
|
|
365
|
+
- **Behavior:**
|
|
366
|
+
1. Resolve `--since`: if not given, use the most recent tag (`git describe --tags --abbrev=0`). If no tags exist, use the repo root commit.
|
|
367
|
+
2. Run `git log --oneline <since>..<until>`.
|
|
368
|
+
3. Parse each commit's conventional-commit prefix (`feat`, `fix`, `refactor`, `docs`, `chore`, `perf`, `test`, `style`, `ci`, `build`). Commits without a recognized prefix go under `Other`.
|
|
369
|
+
4. Group commits by type. Within each group, list one bullet per commit: `- <summary> (<short-hash>)`.
|
|
370
|
+
5. Format as markdown:
|
|
371
|
+
- `keepachangelog` (default): `## [<version>] - <date>` header, then category headings per the keepachangelog convention — `### Added` / `### Fixed` / `### Changed` / `### Removed` / `### Other` — mapped from conventional-commit types.
|
|
372
|
+
- `simple`: flat bulleted list grouped by type heading (`### feat`, `### fix`, …).
|
|
373
|
+
6. Print the changelog to stdout. If the operator wants it in `CHANGELOG.md`, they redirect or paste.
|
|
374
|
+
- **Invariants:** Never mutates `CHANGELOG.md` directly — the command surface is stdout-only; writing it to a file (e.g. appending to `CHANGELOG.md`) is the operator's redirect choice, never the command's.
|
|
375
|
+
|
|
376
|
+
### 9. gitmsg
|
|
377
|
+
|
|
378
|
+
- **Purpose:** Generate conventional commit message(s) from staged changes via per-file summarization → concern grouping → one message per group.
|
|
379
|
+
- **Inputs:** `--scope <path>` (default: all staged changes) — limits diff analysis to a path. `--commit` — execute the commit (off by default; refuses on a multi-group staging unless `--squash`). `--squash` — collapse all concerns into one combined message and let `--commit` proceed on a mixed staging.
|
|
380
|
+
- **Backing:** `inline` — per-file diff summary + concern grouping + conventional commit formatting.
|
|
381
|
+
- **Behavior:**
|
|
382
|
+
1. Run `git diff --cached --stat` (add `-- <path>` when `--scope` is given) for the outline. If the diff is empty, report "no staged changes" and stop.
|
|
383
|
+
2. Capture the full diff to a temp file (`TEMP_FILE="/tmp/gitdiff_$(date +%s)"; git diff --cached > "$TEMP_FILE" 2>&1`) so analysis reads from disk, not a giant inline blob.
|
|
384
|
+
3. Read `$TEMP_FILE` and write **one sentence per changed file** — what changed and why, not a line count.
|
|
385
|
+
4. **Group the per-file sentences by concern.** For each group derive its commit type, scope, and message:
|
|
386
|
+
- Type from the dominant change — `feat` (new functionality) · `fix` (bug fix) · `refactor` (restructuring, no behavior change) · `docs` (documentation only) · `chore` (build/config/tooling) · `perf` · `test` · `style`.
|
|
387
|
+
- Scope from the affected module/package (`cli`, `domain`, `server`, `web`, `app`, …); `--scope` overrides.
|
|
388
|
+
- Message:
|
|
389
|
+
|
|
390
|
+
```
|
|
391
|
+
<type>(<scope>): <summary>
|
|
392
|
+
|
|
393
|
+
<body — optional bullets from the group's per-file sentences>
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
Summary: imperative mood, ≤72 chars, lowercase first word, no period. Body: only when the change is non-obvious.
|
|
397
|
+
|
|
398
|
+
5. **Resolve groups:** one group → emit its message; multiple groups (default) → emit one message per group **plus a split recommendation** (stage per concern, re-run); `--squash` → collapse to one combined message (dominant type/scope, per-file bullets).
|
|
399
|
+
6. Print the resolved message + a copy-paste `git commit -m` line. With `--commit`: execute it for a single group or under `--squash`; on a multi-group staging without `--squash`, **do not commit** — print the split guidance instead (one `git commit` can't honor per-group messages).
|
|
400
|
+
7. `rm "$TEMP_FILE"` once done — no `/tmp` diff residue (the F5 cleanup discipline).
|
|
401
|
+
|
|
402
|
+
- **Invariants:** Without `--commit`, never runs `git commit` — message only, the operator commits. With `--commit`, only commits when the staging is a single concern OR `--squash` was given — a mixed staging without `--squash` is reported, never silently squashed. Never leave the temp diff file behind.
|
|
403
|
+
|
|
404
|
+
### 10. fixall
|
|
405
|
+
|
|
406
|
+
- **Purpose:** Fix all lint, type, and test errors systematically across the working tree.
|
|
407
|
+
- **Inputs:** `--scope <path>` (default: entire working tree) — limits fixes to a file or directory. `--gate-log <path>` (R3, task 0482) — before fixing, read this captured validation-run log and start at the `file:line` anchors its findings name, rather than re-deriving the failure from a fresh gate run. `--findings <anchors>` (R3, task 0482) — space-separated `file:line` anchors already extracted from that log by the `test` hop; when present these ARE the failing set, so fix them in order and do not run the gate to discover what broke.
|
|
408
|
+
- **Backing:** `inline` — lint + test fix loop.
|
|
409
|
+
- **Behavior:** 0. **Start at the anchors, never at a discovery run.** If `--findings <anchors>` is given, that space-separated `file:line` list IS the failing set — open those locations first, in order, and fix them; do not run the gate to find out what broke. If only `--gate-log <path>` is given, read that log first and identify the failing findings (lint/test errors with their `file:line` anchors) before running the loop — the captured log is the authoritative source. Either way the first action of this hop is a read, not a gate run (R3, task 0482).
|
|
410
|
+
1. Run `bun run format` (add `-- <path>` if `--scope` is given) to settle formatter-only diffs first — `bun run lint` asserts `--error-on-warnings` + typecheck but does **not** rewrite formatting, so a formatter-only change (e.g. a multi-line import reflow) can pass `lint` locally yet still be unformatted. Formatting before linting removes that class of false-green.
|
|
411
|
+
2. Run `bun run lint` (add `-- <path>` if `--scope` is given). Collect all errors.
|
|
412
|
+
3. If lint is clean, skip to step 5.
|
|
413
|
+
4. **Lint fix loop:** for each error, diagnose the root cause and apply the smallest fix. **Use targeted probes to verify each fix** (`bunx tsc --noEmit` on the affected package, `bun run lint -- <file>`) — do NOT re-run the full gate after every batch. Loop until lint is green.
|
|
414
|
+
5. Run `bun run test`. Collect all failures.
|
|
415
|
+
6. If tests are green, done.
|
|
416
|
+
7. **Test fix loop:** for each failure, diagnose (test bug vs implementation bug), apply the fix, re-run the **failing test only** (`bun test <file> --test-name-pattern "<test>"`). Do NOT re-run the full suite per fix — it is the dominant loop cost (task 0436 R2).
|
|
417
|
+
8. **Confirming run (at most once).** After all fixes, run `bun run format && bun run lint && bun run test` **at most once** to confirm. If it passes, the hop is done.
|
|
418
|
+
9. **Pipeline-awareness (R4, task 0483).** When `/sp:dev-fixall` is invoked from the pipeline's `test-fix` hop, `test-recheck` runs the full `${vars.qualityGateCmd}` gate immediately after this hop returns — that is the **deciding** run that writes PASS to `.spur/run/<wbs>-test-gate.status`. Do NOT re-run the full gate beyond the single confirming run in step 8; the deciding run belongs to `test-recheck`. If your confirming run already passed, return immediately — a second or third gate run inside this hop is pure redundancy (0482 ran the gate 3× plus a standalone `bun run test`; all four were followed by `test-recheck` running it a 5th time). If your confirming run failed and you fixed more, re-run the full gate once more within `--max-retry` budget, then return — let `test-recheck` judge.
|
|
419
|
+
10. Report: list what was fixed (file + one-line summary per fix). If any error could not be resolved, report it explicitly — do not suppress.
|
|
420
|
+
- **Invariants:** Never bypass with `--no-verify`, `--force`, or new `biome-ignore`/`eslint-disable` suppressions. Never skip or `.skip` a test to make the suite green. Fix the root cause, not the symptom. Never claim green on `bun run lint` alone — a formatter-only diff passes `lint` but fails the formatter; run `bun run format` (or assert it produces no diff) before declaring the gate clean. **Never re-run the full gate more than once per confirming pass** (R4) — use targeted probes during the fix loops and let the pipeline's `test-recheck` state be the deciding run.
|
|
421
|
+
- **MANDATORY Exit Condition.** The ONLY way to complete successfully:
|
|
422
|
+
1. Run validation command: `eval "$VALIDATION_CMD"`
|
|
423
|
+
2. Capture exit code: `EXIT_CODE=$?`
|
|
424
|
+
3. Output: `echo "EXIT_CODE=$EXIT_CODE"`
|
|
425
|
+
4. **EXIT_CODE must equal 0**
|
|
426
|
+
|
|
427
|
+
If EXIT_CODE != 0: NOT completed. MUST continue fixing.
|
|
428
|
+
|
|
429
|
+
**Hallucination Red Flags — STOP if you think:**
|
|
430
|
+
- "The errors look fixed" — check exit code, not appearance
|
|
431
|
+
- "Most tests pass" — partial success = FAILURE
|
|
432
|
+
- "Good enough for now" — 0 is the ONLY acceptable exit code
|
|
433
|
+
|
|
434
|
+
- **7-Phase Workflow:**
|
|
435
|
+
|
|
436
|
+
```text
|
|
437
|
+
┌─────────────────────────────────────────────────┐
|
|
438
|
+
│ RETRY LOOP (max --max-retry iterations) │
|
|
439
|
+
│ │
|
|
440
|
+
│ → Phase 1: Detect validation command │
|
|
441
|
+
│ → Phase 2: Capture validation output │
|
|
442
|
+
│ → Phase 3: Auto-fix (biome check --write) │
|
|
443
|
+
│ → Phase 4: Parse and categorize errors │
|
|
444
|
+
│ → Phase 5: Root cause diagnosis │
|
|
445
|
+
│ → Phase 6: Fix by error type group │
|
|
446
|
+
│ → Phase 7: Validate (check EXIT_CODE) │
|
|
447
|
+
│ │
|
|
448
|
+
│ If EXIT_CODE = 0: SUCCESS, exit loop │
|
|
449
|
+
│ If EXIT_CODE != 0: continue │
|
|
450
|
+
│ │
|
|
451
|
+
│ If counter >= MAX_RETRY: │
|
|
452
|
+
│ Ask user: [Continue / Stop] │
|
|
453
|
+
└─────────────────────────────────────────────────┘
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
The 7 phases map onto the format→lint→test behavior loop above: Phases 1–2 capture the gate, Phase 3 settles auto-fixable formatting, Phases 4–6 are the per-group root-cause fix loops, Phase 7 is the final verification re-run.
|
|
457
|
+
|
|
458
|
+
- **Fix Priority:**
|
|
459
|
+
|
|
460
|
+
| Priority | Type | Rationale |
|
|
461
|
+
| -------- | ------------- | --------------------------------- |
|
|
462
|
+
| 1 | Build/compile | Blocks everything downstream |
|
|
463
|
+
| 2 | Import/module | May cause cascading type failures |
|
|
464
|
+
| 3 | Type errors | Often reveals logic bugs |
|
|
465
|
+
| 4 | Test failures | Confirms behavior correctness |
|
|
466
|
+
| 5 | Lint warnings | Code quality (lowest priority) |
|
|
467
|
+
|
|
468
|
+
**Critical Rule**: If THREE fixes fail consecutively, STOP. This signals architectural problems.
|
|
469
|
+
|
|
470
|
+
- **Error Patterns — TypeScript:**
|
|
471
|
+
|
|
472
|
+
| Issue | Root Cause Approach |
|
|
473
|
+
| ------------------- | ---------------------------------------------------- |
|
|
474
|
+
| `any` type | Trace where untyped data enters; add types at source |
|
|
475
|
+
| Unused variable | Check if removal breaks anything |
|
|
476
|
+
| Missing return type | Read function to understand actual return |
|
|
477
|
+
| Type mismatch | Compare expected vs. actual; find divergence |
|
|
478
|
+
|
|
479
|
+
- **Bun/V8 Coverage Quirk.** Bun uses V8's function coverage which does NOT count implicit class constructors:
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
// biome-ignore lint/complexity/noUselessConstructor: V8 function coverage requires explicit constructor
|
|
483
|
+
constructor() {}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### 11. handover
|
|
487
|
+
|
|
488
|
+
- **Purpose:** Generate a structured handover document when blocked — captures goal, progress, blocker, rejected approaches, and next steps.
|
|
489
|
+
- **Inputs:** `"<blocker description>"` (required, positional) — what is blocking progress.
|
|
490
|
+
- **Backing:** `inline` — structured doc generation from task context.
|
|
491
|
+
- **Behavior:**
|
|
492
|
+
1. Identify the current task context: read the active task file (if any) via `spur task list --status wip --json` to find the WIP task. If a WBS was given as part of the blocker or is otherwise known, use it; otherwise work from the current conversation.
|
|
493
|
+
2. Gather context:
|
|
494
|
+
- **Goal:** what the task is trying to accomplish (from the task's `## Background` / `## Requirements`).
|
|
495
|
+
- **Progress:** what has been done so far (from the task's `## Solution`, `## Testing`, `## Review` sections, and the current conversation).
|
|
496
|
+
- **Blocker:** the `"<blocker description>"` argument — what is stuck and why.
|
|
497
|
+
- **Rejected approaches:** what was tried and why it didn't work (from the conversation + any prior handover).
|
|
498
|
+
- **Next steps:** concrete actions the next agent should take.
|
|
499
|
+
3. Format as a markdown document:
|
|
500
|
+
|
|
501
|
+
```markdown
|
|
502
|
+
# Handover — <task WBS / title>
|
|
503
|
+
|
|
504
|
+
## Goal
|
|
505
|
+
|
|
506
|
+
<one-sentence goal>
|
|
507
|
+
|
|
508
|
+
## Progress
|
|
509
|
+
|
|
510
|
+
- <what was done — reference existing artifacts by path, don't restate their content>
|
|
511
|
+
|
|
512
|
+
## Blocker
|
|
513
|
+
|
|
514
|
+
<blocker description>
|
|
515
|
+
|
|
516
|
+
## Rejected Approaches
|
|
517
|
+
|
|
518
|
+
- <approach> — <why it failed>
|
|
519
|
+
|
|
520
|
+
## Suggested Skills
|
|
521
|
+
|
|
522
|
+
- <sp:skill-name> — <why the next agent should invoke it here>
|
|
523
|
+
|
|
524
|
+
## Next Steps
|
|
525
|
+
|
|
526
|
+
1. <concrete action>
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
4. Write the document & associate task:
|
|
530
|
+
- Always write the standalone handover document to `docs/handover/<YYYY-MM-DD>-<slug>.md` (create `docs/handover/` if absent). This document is the durable SSOT.
|
|
531
|
+
- If a task context exists, append a pointer link (`- Handover: [docs/handover/<YYYY-MM-DD>-<slug>.md](docs/handover/<YYYY-MM-DD>-<slug>.md) — <blocker summary>`) into the task's `## References` section (or non-destructively append to `## Notes` if `References` is unavailable), preserving any pre-existing content without replacing or clobbering it.
|
|
532
|
+
5. Print the path to the handover document.
|
|
533
|
+
|
|
534
|
+
- **Suggested Skills section:** Name the `sp:*` skill(s) the next agent should invoke to continue —
|
|
535
|
+
inferred from the task's remaining Requirements/AC and the blocker itself (e.g. a design
|
|
536
|
+
disagreement suggests `sp:sys-architecture`; an unmet AC suggests `sp:code-verification`). Omit
|
|
537
|
+
the section only when plain continuation is more relevant than any specific skill.
|
|
538
|
+
- **Redaction rule.** Never write secrets, API keys, tokens, credentials, or PII into the handover
|
|
539
|
+
document — not in the Goal/Progress/Blocker prose, not in a pasted error message or log excerpt.
|
|
540
|
+
Redact with `<REDACTED>` and note what kind of value was removed; a handover is a durable file
|
|
541
|
+
that may be read by a different session, agent, or human than the one that hit the blocker.
|
|
542
|
+
- **No-duplication rule.** Reference existing artifacts — task sections (`## Solution`,
|
|
543
|
+
`## Testing`, `## Review`), verdict files (`.spur/run/<wbs>-verdict.json`), diffs, and docs — by
|
|
544
|
+
**path**, not by pasting their content into the handover body. The handover is a pointer document;
|
|
545
|
+
restating content it can instead link to makes it stale the moment the source changes.
|
|
546
|
+
- **Invariants:** The handover is honest — rejected approaches are recorded so the next agent doesn't retry them. The blocker is specific, not "it doesn't work."
|