plumbbob 0.9.3 → 0.10.0
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/plugin.json +1 -1
- package/README.md +92 -89
- package/dist/cli-core.js +25 -8
- package/dist/cli.js +1 -1
- package/dist/lib/agents.js +26 -26
- package/dist/lib/buildlog.js +11 -11
- package/dist/lib/buildlogsync.js +8 -8
- package/dist/lib/check.js +55 -22
- package/dist/lib/commitbody.js +72 -0
- package/dist/lib/commitmsg.js +7 -7
- package/dist/lib/git.js +44 -15
- package/dist/lib/intent.js +21 -20
- package/dist/lib/latch.js +19 -19
- package/dist/lib/orient.js +36 -17
- package/dist/lib/reentry.js +70 -0
- package/dist/lib/settings.js +16 -16
- package/dist/lib/sidecar.js +54 -54
- package/dist/lib/templates.js +1 -1
- package/dist/verbs/agent.js +27 -27
- package/dist/verbs/build.js +9 -9
- package/dist/verbs/check.js +6 -6
- package/dist/verbs/checkpoint.js +48 -47
- package/dist/verbs/doctor.js +31 -30
- package/dist/verbs/finish.js +28 -41
- package/dist/verbs/handoff.js +9 -8
- package/dist/verbs/init.js +9 -9
- package/dist/verbs/park.js +3 -3
- package/dist/verbs/recover.js +297 -0
- package/dist/verbs/revert.js +13 -13
- package/dist/verbs/spike.js +25 -19
- package/dist/verbs/start.js +49 -19
- package/dist/verbs/status.js +8 -8
- package/dist/verbs/turn.js +16 -16
- package/dist/verbs/use.js +4 -4
- package/hooks/post-edit.sh +4 -4
- package/hooks/pre-bash-commit.sh +3 -3
- package/node_modules/checkride/.claude-plugin/plugin.json +11 -0
- package/node_modules/checkride/CHANGELOG.md +1404 -0
- package/node_modules/checkride/LICENSE +201 -21
- package/node_modules/checkride/README.md +197 -38
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.d.ts +15 -0
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.d.ts.map +1 -0
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.js +17 -0
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.js.map +1 -0
- package/node_modules/checkride/dist/adapters.d.ts +30 -10
- package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
- package/node_modules/checkride/dist/adapters.js +62 -23
- package/node_modules/checkride/dist/adapters.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/claude.d.ts +88 -0
- package/node_modules/checkride/dist/agent-setup/claude.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/claude.js +305 -0
- package/node_modules/checkride/dist/agent-setup/claude.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/command.d.ts +43 -0
- package/node_modules/checkride/dist/agent-setup/command.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/command.js +77 -0
- package/node_modules/checkride/dist/agent-setup/command.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/cursor.d.ts +69 -0
- package/node_modules/checkride/dist/agent-setup/cursor.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/cursor.js +247 -0
- package/node_modules/checkride/dist/agent-setup/cursor.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/files.d.ts +50 -0
- package/node_modules/checkride/dist/agent-setup/files.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/files.js +80 -0
- package/node_modules/checkride/dist/agent-setup/files.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/harness.d.ts +101 -0
- package/node_modules/checkride/dist/agent-setup/harness.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/harness.js +93 -0
- package/node_modules/checkride/dist/agent-setup/harness.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/hook.d.ts +45 -52
- package/node_modules/checkride/dist/agent-setup/hook.d.ts.map +1 -1
- package/node_modules/checkride/dist/agent-setup/hook.js +64 -95
- package/node_modules/checkride/dist/agent-setup/hook.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/index.d.ts +10 -4
- package/node_modules/checkride/dist/agent-setup/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/agent-setup/index.js +9 -4
- package/node_modules/checkride/dist/agent-setup/index.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/scripts.d.ts +81 -0
- package/node_modules/checkride/dist/agent-setup/scripts.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/scripts.js +604 -0
- package/node_modules/checkride/dist/agent-setup/scripts.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/skills.d.ts +31 -0
- package/node_modules/checkride/dist/agent-setup/skills.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/skills.js +56 -0
- package/node_modules/checkride/dist/agent-setup/skills.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/configured.d.ts +30 -0
- package/node_modules/checkride/dist/artifacts/configured.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/configured.js +45 -0
- package/node_modules/checkride/dist/artifacts/configured.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/format.d.ts +33 -0
- package/node_modules/checkride/dist/artifacts/format.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/format.js +56 -0
- package/node_modules/checkride/dist/artifacts/format.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/freshness.d.ts +32 -0
- package/node_modules/checkride/dist/artifacts/freshness.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/freshness.js +37 -0
- package/node_modules/checkride/dist/artifacts/freshness.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/index.d.ts +22 -0
- package/node_modules/checkride/dist/artifacts/index.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/index.js +19 -0
- package/node_modules/checkride/dist/artifacts/index.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/json.d.ts +31 -0
- package/node_modules/checkride/dist/artifacts/json.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/json.js +47 -0
- package/node_modules/checkride/dist/artifacts/json.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/raw.d.ts +60 -0
- package/node_modules/checkride/dist/artifacts/raw.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/raw.js +91 -0
- package/node_modules/checkride/dist/artifacts/raw.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/summary.d.ts +69 -0
- package/node_modules/checkride/dist/artifacts/summary.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/summary.js +108 -0
- package/node_modules/checkride/dist/artifacts/summary.js.map +1 -0
- package/node_modules/checkride/dist/atomic.d.ts +16 -1
- package/node_modules/checkride/dist/atomic.d.ts.map +1 -1
- package/node_modules/checkride/dist/atomic.js +25 -3
- package/node_modules/checkride/dist/atomic.js.map +1 -1
- package/node_modules/checkride/dist/baseline/fallow.d.ts +9 -5
- package/node_modules/checkride/dist/baseline/fallow.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/fallow.js +163 -60
- package/node_modules/checkride/dist/baseline/fallow.js.map +1 -1
- package/node_modules/checkride/dist/baseline/fingerprint.d.ts +20 -11
- package/node_modules/checkride/dist/baseline/fingerprint.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/fingerprint.js +73 -23
- package/node_modules/checkride/dist/baseline/fingerprint.js.map +1 -1
- package/node_modules/checkride/dist/baseline/history.d.ts +98 -0
- package/node_modules/checkride/dist/baseline/history.d.ts.map +1 -0
- package/node_modules/checkride/dist/baseline/history.js +232 -0
- package/node_modules/checkride/dist/baseline/history.js.map +1 -0
- package/node_modules/checkride/dist/baseline/index.d.ts +7 -5
- package/node_modules/checkride/dist/baseline/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/index.js +5 -4
- package/node_modules/checkride/dist/baseline/index.js.map +1 -1
- package/node_modules/checkride/dist/baseline/store.d.ts +41 -10
- package/node_modules/checkride/dist/baseline/store.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/store.js +65 -24
- package/node_modules/checkride/dist/baseline/store.js.map +1 -1
- package/node_modules/checkride/dist/baseline-command.d.ts +5 -5
- package/node_modules/checkride/dist/baseline-command.js +7 -7
- package/node_modules/checkride/dist/baseline-command.js.map +1 -1
- package/node_modules/checkride/dist/cli.d.ts +21 -4
- package/node_modules/checkride/dist/cli.d.ts.map +1 -1
- package/node_modules/checkride/dist/cli.js +350 -36
- package/node_modules/checkride/dist/cli.js.map +1 -1
- package/node_modules/checkride/dist/config.d.ts +114 -9
- package/node_modules/checkride/dist/config.d.ts.map +1 -1
- package/node_modules/checkride/dist/config.js +142 -23
- package/node_modules/checkride/dist/config.js.map +1 -1
- package/node_modules/checkride/dist/digest/digest.d.ts +5 -5
- package/node_modules/checkride/dist/digest/digest.js +6 -6
- package/node_modules/checkride/dist/digest/index.d.ts +2 -2
- package/node_modules/checkride/dist/digest/index.js +2 -2
- package/node_modules/checkride/dist/doctor.d.ts +27 -6
- package/node_modules/checkride/dist/doctor.d.ts.map +1 -1
- package/node_modules/checkride/dist/doctor.js +231 -27
- package/node_modules/checkride/dist/doctor.js.map +1 -1
- package/node_modules/checkride/dist/gate.d.ts +180 -0
- package/node_modules/checkride/dist/gate.d.ts.map +1 -0
- package/node_modules/checkride/dist/gate.js +617 -0
- package/node_modules/checkride/dist/gate.js.map +1 -0
- package/node_modules/checkride/dist/init.d.ts +79 -12
- package/node_modules/checkride/dist/init.d.ts.map +1 -1
- package/node_modules/checkride/dist/init.js +385 -81
- package/node_modules/checkride/dist/init.js.map +1 -1
- package/node_modules/checkride/dist/json.d.ts +21 -0
- package/node_modules/checkride/dist/json.d.ts.map +1 -0
- package/node_modules/checkride/dist/json.js +21 -0
- package/node_modules/checkride/dist/json.js.map +1 -0
- package/node_modules/checkride/dist/links.d.ts +31 -5
- package/node_modules/checkride/dist/links.d.ts.map +1 -1
- package/node_modules/checkride/dist/links.js +141 -32
- package/node_modules/checkride/dist/links.js.map +1 -1
- package/node_modules/checkride/dist/node-pin.d.ts +129 -0
- package/node_modules/checkride/dist/node-pin.d.ts.map +1 -0
- package/node_modules/checkride/dist/node-pin.js +211 -0
- package/node_modules/checkride/dist/node-pin.js.map +1 -0
- package/node_modules/checkride/dist/orchestrator.d.ts +53 -10
- package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
- package/node_modules/checkride/dist/orchestrator.js +312 -113
- package/node_modules/checkride/dist/orchestrator.js.map +1 -1
- package/node_modules/checkride/dist/pack.d.ts +8 -9
- package/node_modules/checkride/dist/pack.d.ts.map +1 -1
- package/node_modules/checkride/dist/pack.js +53 -17
- package/node_modules/checkride/dist/pack.js.map +1 -1
- package/node_modules/checkride/dist/pm/detect.d.ts +6 -1
- package/node_modules/checkride/dist/pm/detect.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/detect.js +6 -1
- package/node_modules/checkride/dist/pm/detect.js.map +1 -1
- package/node_modules/checkride/dist/pm/index.d.ts +7 -2
- package/node_modules/checkride/dist/pm/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/index.js +6 -2
- package/node_modules/checkride/dist/pm/index.js.map +1 -1
- package/node_modules/checkride/dist/pm/launch.d.ts +72 -0
- package/node_modules/checkride/dist/pm/launch.d.ts.map +1 -0
- package/node_modules/checkride/dist/pm/launch.js +108 -0
- package/node_modules/checkride/dist/pm/launch.js.map +1 -0
- package/node_modules/checkride/dist/pm/tools.d.ts +73 -0
- package/node_modules/checkride/dist/pm/tools.d.ts.map +1 -0
- package/node_modules/checkride/dist/pm/tools.js +124 -0
- package/node_modules/checkride/dist/pm/tools.js.map +1 -0
- package/node_modules/checkride/dist/pm/translate.d.ts +35 -9
- package/node_modules/checkride/dist/pm/translate.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/translate.js +78 -18
- package/node_modules/checkride/dist/pm/translate.js.map +1 -1
- package/node_modules/checkride/dist/proc.d.ts +30 -0
- package/node_modules/checkride/dist/proc.d.ts.map +1 -0
- package/node_modules/checkride/dist/proc.js +42 -0
- package/node_modules/checkride/dist/proc.js.map +1 -0
- package/node_modules/checkride/dist/qa/cli.d.ts +20 -0
- package/node_modules/checkride/dist/qa/cli.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/cli.js +24 -0
- package/node_modules/checkride/dist/qa/cli.js.map +1 -0
- package/node_modules/checkride/dist/qa/dead.d.ts +39 -0
- package/node_modules/checkride/dist/qa/dead.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/dead.js +88 -0
- package/node_modules/checkride/dist/qa/dead.js.map +1 -0
- package/node_modules/checkride/dist/qa/dupes.d.ts +45 -0
- package/node_modules/checkride/dist/qa/dupes.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/dupes.js +62 -0
- package/node_modules/checkride/dist/qa/dupes.js.map +1 -0
- package/node_modules/checkride/dist/qa/health.d.ts +85 -0
- package/node_modules/checkride/dist/qa/health.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/health.js +109 -0
- package/node_modules/checkride/dist/qa/health.js.map +1 -0
- package/node_modules/checkride/dist/qa/index.d.ts +23 -0
- package/node_modules/checkride/dist/qa/index.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/index.js +22 -0
- package/node_modules/checkride/dist/qa/index.js.map +1 -0
- package/node_modules/checkride/dist/qa/mutation.d.ts +80 -0
- package/node_modules/checkride/dist/qa/mutation.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/mutation.js +195 -0
- package/node_modules/checkride/dist/qa/mutation.js.map +1 -0
- package/node_modules/checkride/dist/qa/qa.d.ts +71 -0
- package/node_modules/checkride/dist/qa/qa.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/qa.js +158 -0
- package/node_modules/checkride/dist/qa/qa.js.map +1 -0
- package/node_modules/checkride/dist/qa/read.d.ts +40 -0
- package/node_modules/checkride/dist/qa/read.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/read.js +47 -0
- package/node_modules/checkride/dist/qa/read.js.map +1 -0
- package/node_modules/checkride/dist/qa/render.d.ts +26 -0
- package/node_modules/checkride/dist/qa/render.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/render.js +310 -0
- package/node_modules/checkride/dist/qa/render.js.map +1 -0
- package/node_modules/checkride/dist/recover.d.ts +48 -0
- package/node_modules/checkride/dist/recover.d.ts.map +1 -0
- package/node_modules/checkride/dist/recover.js +220 -0
- package/node_modules/checkride/dist/recover.js.map +1 -0
- package/node_modules/checkride/dist/security.d.ts +45 -0
- package/node_modules/checkride/dist/security.d.ts.map +1 -0
- package/node_modules/checkride/dist/security.js +86 -0
- package/node_modules/checkride/dist/security.js.map +1 -0
- package/node_modules/checkride/dist/smoke.d.ts +6 -6
- package/node_modules/checkride/dist/smoke.js +6 -6
- package/node_modules/checkride/dist/snippets.d.ts +27 -30
- package/node_modules/checkride/dist/snippets.d.ts.map +1 -1
- package/node_modules/checkride/dist/snippets.js +26 -30
- package/node_modules/checkride/dist/snippets.js.map +1 -1
- package/node_modules/checkride/dist/tool-json.d.ts +33 -0
- package/node_modules/checkride/dist/tool-json.d.ts.map +1 -0
- package/node_modules/checkride/dist/tool-json.js +58 -0
- package/node_modules/checkride/dist/tool-json.js.map +1 -0
- package/node_modules/checkride/dist/triage/cli.d.ts +21 -0
- package/node_modules/checkride/dist/triage/cli.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/cli.js +26 -0
- package/node_modules/checkride/dist/triage/cli.js.map +1 -0
- package/node_modules/checkride/dist/triage/doctor-fold.d.ts +51 -0
- package/node_modules/checkride/dist/triage/doctor-fold.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/doctor-fold.js +88 -0
- package/node_modules/checkride/dist/triage/doctor-fold.js.map +1 -0
- package/node_modules/checkride/dist/triage/env.d.ts +54 -0
- package/node_modules/checkride/dist/triage/env.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/env.js +81 -0
- package/node_modules/checkride/dist/triage/env.js.map +1 -0
- package/node_modules/checkride/dist/triage/gate.d.ts +61 -0
- package/node_modules/checkride/dist/triage/gate.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/gate.js +121 -0
- package/node_modules/checkride/dist/triage/gate.js.map +1 -0
- package/node_modules/checkride/dist/triage/index.d.ts +22 -0
- package/node_modules/checkride/dist/triage/index.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/index.js +20 -0
- package/node_modules/checkride/dist/triage/index.js.map +1 -0
- package/node_modules/checkride/dist/triage/render.d.ts +19 -0
- package/node_modules/checkride/dist/triage/render.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/render.js +419 -0
- package/node_modules/checkride/dist/triage/render.js.map +1 -0
- package/node_modules/checkride/dist/triage/triage.d.ts +83 -0
- package/node_modules/checkride/dist/triage/triage.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/triage.js +131 -0
- package/node_modules/checkride/dist/triage/triage.js.map +1 -0
- package/node_modules/checkride/package.json +18 -15
- package/node_modules/checkride/schema/checkride.config.schema.json +70 -5
- package/node_modules/checkride/schema/checkride.summary.schema.json +1 -1
- package/node_modules/checkride/skills/check/SKILL.md +265 -0
- package/node_modules/checkride/skills/qa/SKILL.md +231 -0
- package/node_modules/checkride/templates/shared/cspell.json +1 -0
- package/node_modules/checkride/templates/shared/oxlintrc.json +1 -1
- package/node_modules/checkride/templates/shared/styles/Repo/Drift.yml +41 -0
- package/node_modules/checkride/templates/shared/styles/Repo/Latin.yml +14 -0
- package/node_modules/checkride/templates/shared/styles/Repo/LyHyphen.yml +28 -0
- package/node_modules/checkride/templates/shared/styles/Repo/Minted.yml +33 -0
- package/node_modules/checkride/templates/shared/styles/Repo/ThereIs.yml +16 -0
- package/node_modules/checkride/templates/shared/styles/Repo/Weasel.yml +26 -0
- package/node_modules/checkride/templates/shared/vale.ini +34 -0
- package/package.json +10 -9
- package/skills/build/SKILL.md +85 -76
- package/skills/doctor/SKILL.md +11 -11
- package/skills/finish/SKILL.md +21 -18
- package/skills/harvest/SKILL.md +13 -11
- package/skills/park/SKILL.md +10 -10
- package/skills/plan/SKILL.md +69 -59
- package/skills/recover/SKILL.md +28 -0
- package/skills/refine/SKILL.md +21 -18
- package/skills/revert/SKILL.md +6 -6
- package/skills/spike/SKILL.md +9 -9
- package/skills/status/SKILL.md +5 -5
- package/skills/step/SKILL.md +20 -15
- package/skills/verify/SKILL.md +56 -46
- package/templates/build-log.md +7 -7
- package/templates/intent.md +52 -41
- package/templates/spike-report.md +10 -10
package/skills/plan/SKILL.md
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plan
|
|
3
|
-
description: "Frame a fresh goal and author the whole plan
|
|
3
|
+
description: "Frame a fresh goal and author the whole plan (Frame, Decisions, Constraints, and all Steps) before any code. Three input modes: no arg interviews you; a file path (or @-mention) absorbs a spec; any other text expands your inline intent."
|
|
4
4
|
argument-hint: "[spec-path | intent]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob start:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent list:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# PlumbBob
|
|
9
|
+
# PlumbBob: plan a goal (the whole-goal move)
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
|
|
12
12
|
|
|
13
|
-
`/plumbbob:plan` is the **whole-goal** move
|
|
13
|
+
`/plumbbob:plan` is the **whole-goal** move; it opens a session and gets the deciding out
|
|
14
14
|
of your head and onto `intent.md` *before* any code. By default it authors the
|
|
15
15
|
**complete plan, including all the Steps**, so the happy path afterward is just
|
|
16
16
|
`/plumbbob:build` until done. (Revising a single increment later is the separate `/plumbbob:step`
|
|
17
17
|
move; do not confuse the two.)
|
|
18
18
|
|
|
19
|
-
A model note: this skill **inherits the session model
|
|
19
|
+
A model note: this skill **inherits the session model**; nothing pins or switches
|
|
20
20
|
it. Planning is where frontier-class judgment pays for itself, so if the session is
|
|
21
|
-
running a small model, suggest `/model opus` (or better) before framing
|
|
21
|
+
running a small model, suggest `/model opus` (or better) before framing: the
|
|
22
22
|
human's call, never a gate.
|
|
23
23
|
|
|
24
|
-
## Three input modes (disambiguated for you
|
|
24
|
+
## Three input modes (disambiguated for you; no quotes needed)
|
|
25
25
|
|
|
26
26
|
Look at the argument the human gave and pick the mode yourself:
|
|
27
27
|
|
|
@@ -32,10 +32,10 @@ Look at the argument the human gave and pick the mode yourself:
|
|
|
32
32
|
the token with the `Read` tool; if Claude Code has already injected the referenced
|
|
33
33
|
file's contents into your context, treat that as the spec rather than re-fetching.
|
|
34
34
|
Read the spec and distill it into `intent.md`, **retaining enough detail that
|
|
35
|
-
`intent.md` stands on its own
|
|
35
|
+
`intent.md` stands on its own**; don't just link to the source. Add a one-line
|
|
36
36
|
provenance (`*Source: <path>*`) and, for anything sizable, a `## Source` appendix
|
|
37
|
-
preserving the original text. Any prose wrapped around the reference (
|
|
38
|
-
@spec.md") is extra intent
|
|
37
|
+
preserving the original text. Any prose wrapped around the reference (for example "absorb
|
|
38
|
+
@spec.md") is extra intent; fold it in. (If the token isn't a real file, fall to
|
|
39
39
|
mode 3.)
|
|
40
40
|
3. **Any other text → expand the inline intent.** Treat the text as the human's
|
|
41
41
|
rough plan, expand it into the full `intent.md`, and ask only about what is
|
|
@@ -50,73 +50,77 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
|
|
|
50
50
|
to create `.plumbbob/` (baseline recorded, session opened). If a session already
|
|
51
51
|
exists, say so and edit the existing `intent.md` rather than starting over.
|
|
52
52
|
- **If `start` warns that the gate sees no code checks**, surface that to the
|
|
53
|
-
human now
|
|
54
|
-
checkpoint
|
|
55
|
-
(
|
|
53
|
+
human now (while they're still deciding, not at the first refused
|
|
54
|
+
checkpoint) and offer to set the `check` key in `.plumbbob/settings.json`
|
|
55
|
+
(for example `"check": "npm test"`) before any step is built.
|
|
56
56
|
2. **Frame** (`.plumbbob/intent.md`), with the human: the **Problem** in plain words,
|
|
57
57
|
the **smallest thing** that solves it, what **done looks like**, and what you are
|
|
58
|
-
**explicitly NOT doing**. This is the human's convergence
|
|
58
|
+
**explicitly NOT doing**. This is the human's convergence: propose wording, but
|
|
59
59
|
the human decides every line.
|
|
60
60
|
3. **Decisions & Constraints.** Record the settled calls (one line each, with the
|
|
61
|
-
*because*) and the hard rules the build must honor. **
|
|
62
|
-
two- or three-word slug where the item is born
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
61
|
+
*because*) and the hard rules the build must honor. **Anchor and slug each at birth**:
|
|
62
|
+
mint a two- or three-word slug where the item is born and give it an anchor for
|
|
63
|
+
references to land on (`- <a id="d1"></a>**D1 (default-waves)**: …`,
|
|
64
|
+
`- <a id="c1"></a>**C1 (no-new-deps)**: …`), then cite it everywhere else in the file
|
|
65
|
+
as `[D4 (default-waves)](#d4)`, carrying that slug verbatim: **never a bare
|
|
66
|
+
`D4`/`C6`/`Q2` reference, and never a linkless one**: one link to the definition,
|
|
67
|
+
one glance at the gloss, so a cold reader never has to hunt the number down.
|
|
68
|
+
An unresolved hole goes to **Open questions**, never guessed into a Decision,
|
|
69
|
+
and it goes in the expanded form the template shows: an anchored, slugged opener
|
|
70
|
+
(the hole as a question, `- <a id="q1"></a>**Q1 (default-waves)**: …`, so
|
|
71
|
+
`[Q1 (default-waves)](#q1)` has somewhere to land), a `*plain:*` sub-line (what's at
|
|
72
|
+
stake, in plain words, enough to judge it cold), then a `*lean:*` sub-line (your
|
|
73
|
+
proposed resolution: one answer to react to, not a menu), so the human settles it in
|
|
74
|
+
one pass without a round-trip. (A tiny, obvious question may stay one bare line; the
|
|
75
|
+
sub-lines earn their keep only when a human decision genuinely waits on it.)
|
|
76
|
+
4. **Author the Steps.** Write the **full build plan** under `## Steps` (each step a
|
|
77
|
+
small, verifiable increment) in the exact format the parser reads:
|
|
75
78
|
|
|
76
79
|
```markdown
|
|
77
|
-
1. [ ] feat(scope): <title
|
|
80
|
+
1. [ ] feat(scope): <title>, **done when:** <criterion, ideally a test or check result>
|
|
78
81
|
- seam: `<file>`, `<file>`
|
|
79
|
-
- model: <optional
|
|
82
|
+
- model: <optional; smallest that can carry it, with the one-phrase why>
|
|
80
83
|
```
|
|
81
84
|
|
|
82
85
|
Every step needs a **done-when** `/plumbbob:verify` can check and a **seam** (the exact
|
|
83
|
-
paths it touches). Later steps may be fuzzier than the first
|
|
86
|
+
paths it touches). Later steps may be fuzzier than the first (that's fine); they get
|
|
84
87
|
sharpened just-in-time when you reach them with `/plumbbob:step`. Keep each small enough to
|
|
85
88
|
verify in one review pass.
|
|
86
89
|
|
|
87
|
-
**The title *is* the commit subject
|
|
90
|
+
**The title *is* the commit subject; author it as one**
|
|
91
|
+
([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)): write each
|
|
88
92
|
`<title>` as a plain, single-line Conventional-Commit subject,
|
|
89
93
|
`type(scope): description`, and it lands in `git log` verbatim (its breaking `!`
|
|
90
|
-
honored)
|
|
91
|
-
Keep load-bearing detail
|
|
92
|
-
**never jammed into the title
|
|
93
|
-
subject at once. Aim for **≤72 characters** (GitHub's subject convention)
|
|
94
|
-
guidance you eyeball at plan time, no lint, no gate
|
|
95
|
-
|
|
96
|
-
**Set the build's default scope, then let steps override it
|
|
97
|
-
`**Scope:**` header once with a short feature-level name
|
|
98
|
-
inherits
|
|
94
|
+
honored); this is how each step lands a *real* `feat`/`fix`/`chore` in the history.
|
|
95
|
+
Keep load-bearing detail (file paths, module names) in `seam` and `done-when`; it is
|
|
96
|
+
**never jammed into the title**, which has to read as plain English and as a clean
|
|
97
|
+
subject at once. Aim for **≤72 characters** (GitHub's subject convention): soft
|
|
98
|
+
guidance you eyeball at plan time, no lint, no gate.
|
|
99
|
+
|
|
100
|
+
**Set the build's default scope, then let steps override it**: fill the
|
|
101
|
+
`**Scope:**` header once with a short feature-level name (the catch-all every step
|
|
102
|
+
inherits) and give a step its own `(scope)` when it touches a distinct code area
|
|
99
103
|
(`plan`, `commitmsg`, `docs`). A step's `(scope)` names the *code area*; the header
|
|
100
104
|
names the *feature*, so scopes stay consistent and greppable across builds. Scope
|
|
101
105
|
resolves title-scope → `**Scope:**` default → build slug → bare, and type resolves
|
|
102
106
|
title-type → `feat`, so a scopeless plain title still yields a clean
|
|
103
|
-
`feat(<slug>): <title>` unchanged
|
|
107
|
+
`feat(<slug>): <title>` unchanged.
|
|
104
108
|
|
|
105
109
|
**Recommend a model per step where the signal is clear** *(optional)*: the
|
|
106
110
|
`- model:` sub-line names the **smallest model that can carry the step**, with the
|
|
107
|
-
one-phrase why
|
|
108
|
-
`model: sonnet
|
|
109
|
-
`model: opus
|
|
110
|
-
`model: fable
|
|
111
|
-
It is advisory metadata for the human
|
|
111
|
+
one-phrase why; the human buys capability only where the step needs it. E.g.
|
|
112
|
+
`model: sonnet (mechanical, fully specified by the done-when)` for rote edits;
|
|
113
|
+
`model: opus (strong-assertion test authoring)` where the tests do the thinking;
|
|
114
|
+
`model: fable (subtle cross-cutting design)` for judgment-heavy or creative work.
|
|
115
|
+
It is advisory metadata for the human (`/plumbbob:status` surfaces it before each build),
|
|
112
116
|
never a gate, and nothing switches models automatically. Write it plain (no
|
|
113
117
|
backticks) and omit it when any model would do.
|
|
114
118
|
5. **Offer harness bindings** *(optional)*. If the build will lean on
|
|
115
119
|
user-authored agents, author `harness.json` in the build folder (beside `intent.md`)
|
|
116
|
-
and review it at the **same plan pause**, alongside the steps
|
|
120
|
+
and review it at the **same plan pause**, alongside the steps; bindings are
|
|
117
121
|
plan-adjacent configuration, so they converge with the plan. It binds agents to a
|
|
118
|
-
step's three lifecycle slots
|
|
119
|
-
(advisory review)
|
|
122
|
+
step's three lifecycle slots, `before` (context in), `build` (the diff), and `after`
|
|
123
|
+
(advisory review), with an optional prose `note`; a `defaults` block binds every
|
|
120
124
|
step. Run `plumbbob agent list` to see what's resolvable, per step:
|
|
121
125
|
|
|
122
126
|
```json
|
|
@@ -128,31 +132,37 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
|
|
|
128
132
|
```
|
|
129
133
|
|
|
130
134
|
Keep it **bindings + prose only, never a conditional**: the file says *which*
|
|
131
|
-
agent, not *when
|
|
132
|
-
`note` and decides when to
|
|
133
|
-
uses an agent
|
|
135
|
+
agent, not *when*; the host model reads each manifest's `when` prose and a step's
|
|
136
|
+
`note` and decides when to run one mid-build. Skip the file entirely when no step
|
|
137
|
+
uses an agent; the loop runs identically without it. The plan commit picks it
|
|
134
138
|
up automatically (it lives in the build folder).
|
|
135
139
|
6. **Commit the plan.** Once the human approves the frame and steps, run
|
|
136
|
-
`plumbbob checkpoint --plan` to commit the scaffold on its own
|
|
140
|
+
`plumbbob checkpoint --plan` to commit the scaffold on its own: subject
|
|
137
141
|
`chore(<scope>): plan` (with a `plumbbob plan` body marker), only `.plumbbob/builds/<slug>/`,
|
|
138
142
|
a `plan <sha>` line in
|
|
139
143
|
`checkpoints`. This keeps the first step's diff clean, so history reads
|
|
140
144
|
baseline → plan → steps. Pass a proportional `--body` (the single-quoted stdin
|
|
141
145
|
heredoc) when the rationale is worth carrying; skip it for a small plan. Do this
|
|
142
|
-
only on the human's approval
|
|
146
|
+
only on the human's approval; the plan is their convergence.
|
|
143
147
|
- **The plan commit is latched too.** Once the turn ledger exists, `checkpoint
|
|
144
148
|
--plan` refuses to land in the same turn `start` stamped it: present the plan,
|
|
145
149
|
**end the turn**, and the human's approving message is the tick that lets it
|
|
146
|
-
commit on
|
|
150
|
+
commit on the next run; the refusal *is* the plan pause. Never route around it with a
|
|
147
151
|
raw `git commit`. (One documented seam: the very first plan of a brand-new
|
|
148
152
|
session runs `start` *before* the turn hook has ever ticked, so that single
|
|
149
|
-
commit predates the ledger and stays guidance-governed
|
|
153
|
+
commit predates the ledger and stays guidance-governed; it lands without a
|
|
150
154
|
refusal.)
|
|
151
155
|
- **Say what the commit publishes.** The close-out line names the tracked folder:
|
|
152
156
|
`.plumbbob/builds/<slug>/` now rides this branch into the PR, so teammates will
|
|
153
157
|
see the plan and build record in review. In the same breath, offer the way out:
|
|
154
158
|
a repo that won't track a tool folder can restart with `plumbbob start --local`
|
|
155
159
|
(a fully untracked sidecar) before any steps are built.
|
|
160
|
+
- **Record-only variant.** When the repo's own `.gitignore` excludes `.plumbbob/`,
|
|
161
|
+
the folder can't ride the branch; `start` flags this up front, and the plan
|
|
162
|
+
commit lands *record-only*: an empty commit whose message carries the plan
|
|
163
|
+
(the `--body` earns its keep here), the files staying untracked. Say that
|
|
164
|
+
instead: the rationale is published in `git log`, not the folder, so pass a
|
|
165
|
+
fuller `--body` than you otherwise would, since the message is the whole record.
|
|
156
166
|
7. **Offer to stress-test it.** Suggest `/plumbbob:refine` to attack the frame for holes (or
|
|
157
167
|
to repair the plan as it drifts). Optional, the human's call.
|
|
158
168
|
|
|
@@ -160,17 +170,17 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
|
|
|
160
170
|
|
|
161
171
|
Make it easy and non-intrusive:
|
|
162
172
|
|
|
163
|
-
- **Triage size first.** A tiny change earns a 3-line Frame and one Step, fast
|
|
173
|
+
- **Triage size first.** A tiny change earns a 3-line Frame and one Step, fast: never
|
|
164
174
|
ceremony on a one-liner. Scale the questions to the work.
|
|
165
175
|
- **Propose, don't interrogate.** Offer concrete suggestions the human can **accept as-is
|
|
166
|
-
without typing** ("done-when: the 6th request in 60s returns 429
|
|
176
|
+
without typing** ("done-when: the 6th request in 60s returns 429, good?"), while
|
|
167
177
|
taking arbitrary detail when they want to give it, including pointers to other files.
|
|
168
178
|
- **Let them double back.** They will revise as the picture sharpens; that's expected.
|
|
169
179
|
They can also edit `intent.md` by hand at any time, or call `/plumbbob:refine` to repair it.
|
|
170
180
|
|
|
171
181
|
## The hard contracts
|
|
172
182
|
|
|
173
|
-
- **Deciding before code.** `/plumbbob:plan` writes `intent.md` only
|
|
183
|
+
- **Deciding before code.** `/plumbbob:plan` writes `intent.md` only, never source.
|
|
174
184
|
- **The human converges.** You surface options and draft wording; the human picks.
|
|
175
185
|
An unresolved hole is an Open question, not a guessed Decision.
|
|
176
186
|
- **Stands on its own.** Whatever the input mode, the finished `intent.md` carries
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: recover
|
|
3
|
+
description: "Human-triggered driver for `plumbbob recover`; reconcile the control plane when the session looks wrong: a cursor pointing at a build that is gone, a step marked in flight that the plan no longer has, leftovers from an interrupted spike. Reports by default; `--fix` repairs the stale files it can."
|
|
4
|
+
argument-hint: "[--fix]"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
model: haiku
|
|
7
|
+
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob recover:*)
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PlumbBob: reconcile the control plane (driver)
|
|
11
|
+
|
|
12
|
+
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
|
|
13
|
+
|
|
14
|
+
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob recover` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
|
|
15
|
+
|
|
16
|
+
Reach for it when the dashboard and reality disagree: `status` shows a build you thought you finished, or an empty plan for a build you know you wrote, or a step in flight you have no memory of starting. Those are the shapes a crashed session, a lost context window, or a mid-step build switch leaves behind. `/plumbbob:doctor` answers "is plumbbob installed correctly"; this answers "is this session's own state telling the truth".
|
|
17
|
+
|
|
18
|
+
## What it does
|
|
19
|
+
|
|
20
|
+
1. Run `plumbbob recover` via Bash. It reads the control plane (the active-build cursor, the step and spike markers, the latch's stamp, the agent handoff ledger, and any leftover spike worktrees) and prints one line per check.
|
|
21
|
+
2. Report that output verbatim, `✓` and `✗` lines alike. Every problem carries a `→` line naming the fix; relay those as written rather than paraphrasing them into your own advice.
|
|
22
|
+
3. **Only if the human asks for the repair**, run `plumbbob recover --fix`. It clears stale untracked control files and re-points a cursor when exactly one build survives. It never touches intent.md, the build log, the checkpoints ledger, a report, or git history, and it never lands or advances a step.
|
|
23
|
+
|
|
24
|
+
## What it will not do for you
|
|
25
|
+
|
|
26
|
+
- **Spike leftovers are reported, never removed.** Those worktrees sit outside the repo and may hold the only copy of what a spike learned, so the verb prints the exact `git worktree remove` / `git branch -D` commands and stops. Relay them; do not run them yourself.
|
|
27
|
+
- **A contradictory phase is yours to settle.** A spike and a step both marked in flight, or a step number the plan no longer contains, need a decision about which one is real; `--fix` deliberately leaves them alone.
|
|
28
|
+
- **It is not a rewind.** Recovering reconciles bookkeeping; it never restores lost work. Discarding a half-done step is `/plumbbob:revert`, and that is a different, destructive move the human asks for by name.
|
package/skills/refine/SKILL.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refine
|
|
3
|
-
description: Keep intent.md true
|
|
3
|
+
description: "Keep intent.md true: attack the plan for holes (append as Open questions) and refine or repair the Frame, Decisions, Constraints, and Steps to match reality. Usable at any point; you propose, the human approves."
|
|
4
4
|
argument-hint: "[focus]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
allowed-tools: Read, Edit, Bash(plumbbob status:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# PlumbBob
|
|
9
|
+
# PlumbBob: refine the plan
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
|
|
12
12
|
|
|
13
|
-
`/plumbbob:refine` keeps `intent.md` honest. Use it at **any point
|
|
13
|
+
`/plumbbob:refine` keeps `intent.md` honest. Use it at **any point**: right after `/plumbbob:plan`
|
|
14
14
|
to stress-test a fresh frame, or mid-build to repair a plan that drifted from what the
|
|
15
15
|
code is actually doing. It is the document-level complement to `/plumbbob:step` (which only
|
|
16
16
|
sharpens the *next* step): `/plumbbob:refine` works the *whole* plan.
|
|
@@ -20,34 +20,37 @@ sharpens the *next* step): `/plumbbob:refine` works the *whole* plan.
|
|
|
20
20
|
This skill refines an existing plan, so it needs one. Read the state injected above: if
|
|
21
21
|
it is `NO ACTIVE SESSION`, **refuse** in one line and tell the human to run
|
|
22
22
|
`plumbbob start "<title>"` (or `/plumbbob:plan`) first, and edit nothing. Every active state
|
|
23
|
-
is fine
|
|
23
|
+
is fine; refining is always available.
|
|
24
24
|
|
|
25
25
|
## Two modes
|
|
26
26
|
|
|
27
27
|
- **Attack (diverge in the problem space).** Hand the **Frame**, **Decisions**, and
|
|
28
|
-
**Architecture sketch** a cold, adversarial read and surface holes
|
|
28
|
+
**Architecture sketch** a cold, adversarial read and surface holes: ambiguities,
|
|
29
29
|
unhandled edge cases, hidden assumptions, collisions with the existing code. Append
|
|
30
|
-
each under `## Open questions` in the expanded form the template shows
|
|
31
|
-
line (the hole as a question, slugged at birth
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
each under `## Open questions` in the expanded form the template shows: an opener
|
|
31
|
+
line (the hole as a question, anchored and slugged at birth like any Decision,
|
|
32
|
+
`- <a id="q2"></a>**Q2 (some-slug)**: …`, so a `[Q2 (some-slug)](#q2)` reference
|
|
33
|
+
elsewhere in the file lands on it), a `*plain:*` sub-line (what's at stake in plain
|
|
34
|
+
words, enough to judge it cold), and a `*lean:*` sub-line (your proposed resolution:
|
|
35
|
+
one answer to react to, not a menu). Never
|
|
36
|
+
append a hole as a Decision: resolving it is the human's convergence, not yours;
|
|
35
37
|
the lean proposes; this mode surfaces, it does not decide. (A tiny, obvious question
|
|
36
38
|
may stay one bare line; the sub-lines earn their keep only when a human decision
|
|
37
39
|
genuinely waits on it.)
|
|
38
40
|
|
|
39
41
|
Then walk the human through it in the chat: list every hole you appended, each as
|
|
40
|
-
its explanation first and its lean second, and invite per-question answers
|
|
42
|
+
its explanation first and its lean second, and invite per-question answers; the
|
|
41
43
|
human can settle any of them right there in one message, no doc-flipping, no extra
|
|
42
44
|
round-trip per hole.
|
|
43
|
-
- **Repair (re-sync to reality).** When the plan has drifted
|
|
45
|
+
- **Repair (re-sync to reality).** When the plan has drifted (a Decision was overtaken
|
|
44
46
|
by what you built, a Constraint changed, a Step no longer matches the seam, or a
|
|
45
|
-
**step's title no longer describes what the diff actually does**
|
|
47
|
+
**step's title no longer describes what the diff actually does**), propose the edits
|
|
46
48
|
that bring `intent.md` back in line with the truth. A step title *is* its checkpoint
|
|
47
|
-
commit subject (
|
|
48
|
-
single-line `type(scope): description` subject, with
|
|
49
|
-
module names) in `seam` and `done-when`,
|
|
50
|
-
checkpoint body pass then reconciles and lands
|
|
49
|
+
commit subject ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)), so bringing a drifted one back in line
|
|
50
|
+
means keeping it a plain, single-line `type(scope): description` subject, with
|
|
51
|
+
load-bearing detail (file paths, module names) in `seam` and `done-when`,
|
|
52
|
+
**never jammed into the title**; the checkpoint body pass then reconciles and lands
|
|
53
|
+
that subject at the verify pause.
|
|
51
54
|
Show the before/after for each, and **write only what the human approves**.
|
|
52
55
|
|
|
53
56
|
## The hard contracts
|
|
@@ -56,5 +59,5 @@ is fine — refining is always available.
|
|
|
56
59
|
approves every change to `intent.md`. Never guess a hole into a Decision.
|
|
57
60
|
- **Open questions for holes, edits for drift.** New uncertainty goes to
|
|
58
61
|
`## Open questions`; settled drift gets repaired in place once the human OKs it.
|
|
59
|
-
- **Refine the plan, not the code.** `/plumbbob:refine` touches `intent.md` only
|
|
62
|
+
- **Refine the plan, not the code.** `/plumbbob:refine` touches `intent.md` only; turning a
|
|
60
63
|
decision into a diff is `/plumbbob:build` or your own hands, never this skill.
|
package/skills/revert/SKILL.md
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: revert
|
|
3
|
-
description: Human-triggered driver for `plumbbob revert
|
|
3
|
+
description: "Human-triggered driver for `plumbbob revert`: git reset --hard to a checkpoint SHA (discarding the half-done step) and return to the boundary."
|
|
4
4
|
argument-hint: "[--to <step>]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
model: haiku
|
|
7
7
|
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob revert:*)
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# PlumbBob
|
|
10
|
+
# PlumbBob: revert to a checkpoint (driver)
|
|
11
11
|
|
|
12
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
|
|
13
13
|
|
|
14
|
-
This is a **driver skill
|
|
14
|
+
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob revert` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
|
|
15
15
|
|
|
16
16
|
## What it does
|
|
17
17
|
|
|
18
|
-
1. Read an optional target step from the way you were invoked (
|
|
19
|
-
2. Run `plumbbob revert` (or `plumbbob revert --to <n>`) via Bash. This is a `git reset --hard
|
|
20
|
-
3. Report the verb's output verbatim
|
|
18
|
+
1. Read an optional target step from the way you were invoked (for example `/plumbbob:revert --to 2` → step `2`). With no target, revert goes to the last done-checkpoint.
|
|
19
|
+
2. Run `plumbbob revert` (or `plumbbob revert --to <n>`) via Bash. This is a `git reset --hard`; it discards the current in-progress step. Run it exactly as the human asked; do not add or drop the `--to` on your own.
|
|
20
|
+
3. Report the verb's output verbatim: which checkpoint it reset to, or any refusal.
|
package/skills/spike/SKILL.md
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spike
|
|
3
|
-
description: Human-triggered driver for `plumbbob spike
|
|
3
|
+
description: "Human-triggered driver for `plumbbob spike`: open a throwaway worktree experiment for a genuine fork, scaffold a spike report for a spike-as-step, or tear it down with `spike done`."
|
|
4
4
|
argument-hint: "<slug> | report <slug> | done"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
model: haiku
|
|
7
7
|
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob spike:*)
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# PlumbBob
|
|
10
|
+
# PlumbBob: spike an experiment (driver)
|
|
11
11
|
|
|
12
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
|
|
13
13
|
|
|
14
|
-
This is a **driver skill
|
|
14
|
+
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob spike` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
|
|
15
15
|
|
|
16
16
|
## What it does
|
|
17
17
|
|
|
18
|
-
1. Read the spike target from the way you were invoked: a slug to open one (
|
|
18
|
+
1. Read the spike target from the way you were invoked: a slug to open one (for example `/plumbbob:spike redis-cache`), `report <slug>` to scaffold a report without worktrees (`/plumbbob:spike report auth-store`), or the literal `done` to tear the current spike down (`/plumbbob:spike done`). If none is present, ask which and run nothing.
|
|
19
19
|
2. Run `plumbbob spike "<slug>"`, `plumbbob spike report "<slug>"`, or `plumbbob spike done` via Bash.
|
|
20
|
-
3. Report the verb's output verbatim
|
|
20
|
+
3. Report the verb's output verbatim: the worktree it created or removed, the spike report it scaffolded, or any refusal. When the verb names a `spike-NN-<slug>.md` report, point the human at it; when `spike done` nudges that a verdict is unrecorded, relay that nudge verbatim.
|
|
21
21
|
|
|
22
|
-
## The spike report (D70)
|
|
22
|
+
## The spike report ([D70 (spike-reports)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d70))
|
|
23
23
|
|
|
24
|
-
Every spike leaves a durable `spike-NN-<slug>.md` in the build folder, beside `intent.md`/`report.md`, so the fork's verdict rides the branch into the PR instead of evaporating. The CLI scaffolds it from a template and numbers it
|
|
24
|
+
Every spike leaves a durable `spike-NN-<slug>.md` in the build folder, beside `intent.md`/`report.md`, so the fork's verdict rides the branch into the PR instead of evaporating. The CLI scaffolds it from a template and numbers it; you never create or number the file:
|
|
25
25
|
|
|
26
26
|
- **`/plumbbob:spike <slug>`** scaffolds the report *at open*, so findings accrue while the throwaway worktrees are still live. Fill its **Findings** and **Verdict** before `/plumbbob:spike done`.
|
|
27
|
-
- **`/plumbbob:spike report <slug>`** is for a *spike-as-step
|
|
27
|
+
- **`/plumbbob:spike report <slug>`** is for a *spike-as-step*: a planned step titled `spike: …`, where the increment itself is the experiment and there are no worktrees. It stamps the report's provenance as `step <n>` when a step is in flight.
|
|
28
28
|
|
|
29
|
-
This skill stays Write-less: the CLI owns the file. Your job is to run the verb and, between runs, help the human fill the report's prose
|
|
29
|
+
This skill stays Write-less: the CLI owns the file. Your job is to run the verb and, between runs, help the human fill the report's prose, but the edits land through the normal build flow, not this driver.
|
package/skills/status/SKILL.md
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: status
|
|
3
|
-
description: Show the orientation dashboard
|
|
3
|
+
description: "Show the orientation dashboard: where you are, what's done, what's parked, and the next move. A thin trigger for `plumbbob status`."
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
model: haiku
|
|
6
6
|
allowed-tools: Bash(plumbbob status:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# PlumbBob
|
|
9
|
+
# PlumbBob: orient (the where-am-I move)
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
|
|
12
12
|
|
|
13
13
|
This is a **thin driver** for `plumbbob status`. The dashboard above is your
|
|
14
|
-
orientation
|
|
14
|
+
orientation: the intent, the step list, the parked/open-question counts, and the
|
|
15
15
|
inferred next move. Report it verbatim and point the human at that next move. This
|
|
16
16
|
skill carries **no Edit and no Write tool**: the CLI is the source of truth, so
|
|
17
17
|
**never retry**, and never edit a file to change what the orientation says.
|
|
18
18
|
|
|
19
19
|
## What it does
|
|
20
20
|
|
|
21
|
-
1. Surface the injected `status` output
|
|
21
|
+
1. Surface the injected `status` output: the dashboard and its suggested next move.
|
|
22
22
|
2. If the next step's detail carries a `model:` line, point it out: it is the
|
|
23
23
|
plan's recommendation of the smallest model that can carry that step, so the human
|
|
24
|
-
can switch (
|
|
24
|
+
can switch (for example `/model sonnet`) before firing `/plumbbob:build`, or ignore it. Guidance,
|
|
25
25
|
never a gate.
|
|
26
26
|
3. If it reads `NO ACTIVE SESSION`, tell the human to `/plumbbob:plan` to frame a goal.
|
package/skills/step/SKILL.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: step
|
|
3
|
-
description: Revise the next increment just-in-time
|
|
3
|
+
description: "Revise the next increment just-in-time: sharpen the next undone step against what's now true, or (with input) re-cut, split, or add a step. Empty input runs an automatic sharpen. One at a time; the human approves."
|
|
4
4
|
argument-hint: "[what-changed]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob agent list:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# PlumbBob
|
|
9
|
+
# PlumbBob: revise the next step (the single-increment move)
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
|
|
12
12
|
|
|
@@ -14,14 +14,14 @@ Current session state (injected when this skill runs): !`plumbbob status 2>/dev/
|
|
|
14
14
|
**just-in-time revision** move: it keeps the *next* undone step honest against what the
|
|
15
15
|
build has actually taught you, right before you `/plumbbob:build` it. (Framing the whole goal
|
|
16
16
|
is the separate `/plumbbob:plan` move.) It can also add or re-cut a step when scope genuinely
|
|
17
|
-
grew
|
|
17
|
+
grew, but its everyday job is to sharpen, not to invent.
|
|
18
18
|
|
|
19
|
-
## Two ways to
|
|
19
|
+
## Two ways to run it
|
|
20
20
|
|
|
21
21
|
- **`/plumbbob:step` (no input) → automatic sharpen.** Re-examine the next undone step
|
|
22
22
|
against the completed code, the Decisions, the Constraints, and the build-log, then
|
|
23
|
-
make the obvious revisions to its **done-when** and **seam** so it matches reality
|
|
24
|
-
|
|
23
|
+
make the obvious revisions to its **done-when** and **seam** so it matches reality:
|
|
24
|
+
for example a file moved, a decision narrowed the scope, an earlier step already did part of
|
|
25
25
|
it. This is the zero-effort "keep my next step in sync" move: if the human does
|
|
26
26
|
nothing else, the next step stays current.
|
|
27
27
|
- **`/plumbbob:step <what changed>` → directed revision.** Take the human's input and propose
|
|
@@ -38,21 +38,21 @@ grew — but its everyday job is to sharpen, not to invent.
|
|
|
38
38
|
what you changed and why. Re-check the optional `- model:` recommendation too:
|
|
39
39
|
a step that sharpened into rote work can drop to a smaller model; one that grew subtle
|
|
40
40
|
earns a frontier one. Advisory, plain text (no backticks), never a gate.
|
|
41
|
-
3. **Get the human's OK**, then write it into `## Steps` in the standard format
|
|
42
|
-
`N. [ ] <title
|
|
41
|
+
3. **Get the human's OK**, then write it into `## Steps` in the standard format:
|
|
42
|
+
`N. [ ] <title>, **done when:** <criterion>` with a `- seam:` sub-line. Keep the
|
|
43
43
|
sharpened `<title>` a plain, single-line Conventional-Commit subject,
|
|
44
|
-
`type(scope): description
|
|
44
|
+
`type(scope): description`; it lands in `git log` verbatim, so as the step tightens
|
|
45
45
|
keep load-bearing detail (file paths, module names) in `seam` and `done-when`,
|
|
46
|
-
**never jammed into the title
|
|
47
|
-
when it touches a distinct code area
|
|
46
|
+
**never jammed into the title**. A sharpened step carries its own `(scope)`
|
|
47
|
+
when it touches a distinct code area, one that **overrides the build-default**
|
|
48
48
|
`**Scope:**` header; drop the scope and it falls back to that default → build slug →
|
|
49
|
-
bare, and the type to `feat` ([D68](
|
|
50
|
-
≤72 chars, no gate
|
|
49
|
+
bare, and the type to `feat` ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). Aim for a soft
|
|
50
|
+
≤72 chars, no gate. Revise the existing step in place; only append when you are
|
|
51
51
|
genuinely adding an increment.
|
|
52
52
|
4. **Revise the step's harness bindings if they drifted too** *(optional)*. If the
|
|
53
53
|
build carries a `harness.json` (beside `intent.md`) and the reality that moved the
|
|
54
54
|
step also changed which agents it wants, sharpen that step's slot bindings
|
|
55
|
-
(`before`/`build`/`after`) and `note` at the same time
|
|
55
|
+
(`before`/`build`/`after`) and `note` at the same time; this is the just-in-time
|
|
56
56
|
counterpart to `/plumbbob:plan`'s plan-time binding. `plumbbob agent list` shows what's
|
|
57
57
|
resolvable. Same rule as the plan move: bindings + prose only, never a conditional
|
|
58
58
|
. Leave it untouched when the step's agents are still right, or when the build
|
|
@@ -62,6 +62,11 @@ grew — but its everyday job is to sharpen, not to invent.
|
|
|
62
62
|
|
|
63
63
|
- **One verifiable increment.** Each step carries a done-when `/plumbbob:verify` can check
|
|
64
64
|
and a seam small enough to review in one pass.
|
|
65
|
-
- **Edit `## Steps` only**, in the standard format `status` and `build` parse
|
|
65
|
+
- **Edit `## Steps` only**, in the standard format `status` and `build` parse: never
|
|
66
66
|
the Roadmap, never loose prose. A done step (`[x]`) is history; do not rewrite it.
|
|
67
|
+
- **Cite the plan's own numbers in the linked form.** A `D`/`C`/`Q` you write into a
|
|
68
|
+
step's done-when, seam, or notes reads `[D4 (default-waves)](#d4)`; the slug travels
|
|
69
|
+
with the number, and the link lands on the `<a id="d4">` anchor minted where the item
|
|
70
|
+
was born. Never a bare `D4`; if the item you want to cite has no anchor yet, that is a
|
|
71
|
+
`/plumbbob:refine` repair, not something to invent here.
|
|
67
72
|
- **The human approves the revision** before it lands. You propose; they decide.
|