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/build/SKILL.md
CHANGED
|
@@ -1,116 +1,124 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: build
|
|
3
|
-
description: The default engine
|
|
3
|
+
description: "The default engine: read the next planned step from intent, implement it (its done-when, seam, Decisions, Constraints), then verify it through to the approval pause. Swappable: build by hand/vibed/another harness and run /plumbbob:verify instead. `--auto` self-approves and chains to done; a step range like `1-3` self-approves through step 3, then pauses."
|
|
4
4
|
argument-hint: "[step-number | step-range] [--auto]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob build:*), Bash(plumbbob handoff:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(plumbbob park:*), Bash(plumbbob agent:*), Bash(plumbbob spike:*), Bash(git diff:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# PlumbBob
|
|
9
|
+
# PlumbBob: build a step (the default engine)
|
|
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
|
-
This is the **bundled executor
|
|
13
|
+
This is the **bundled executor**: the default engine, not the only one. It is
|
|
14
14
|
**swappable**: you can implement any step by hand, in a vibe session, or with
|
|
15
|
-
another harness and go straight to `/plumbbob:verify` instead
|
|
15
|
+
another harness and go straight to `/plumbbob:verify` instead; plumbbob does not care how
|
|
16
16
|
the diff appeared. When you do run it, it reads the plan, writes the step, and
|
|
17
17
|
carries straight through to the verify pause.
|
|
18
18
|
|
|
19
|
-
Since `/plumbbob:plan` lays down the whole step list up front, the happy path is to
|
|
20
|
-
`/plumbbob:build` once per step until done
|
|
21
|
-
at the pause for your approval. **
|
|
19
|
+
Since `/plumbbob:plan` lays down the whole step list up front, the happy path is to run
|
|
20
|
+
`/plumbbob:build` once per step until done: each run builds the next undone step and stops
|
|
21
|
+
at the pause for your approval. **Running `/plumbbob:build` again is itself the clock tick.**
|
|
22
22
|
|
|
23
|
-
A model note: this skill **inherits the session model
|
|
23
|
+
A model note: this skill **inherits the session model**; nothing pins or switches
|
|
24
24
|
it. If the step you're about to build carries a `- model:` recommendation that
|
|
25
|
-
differs from the model you're running as, say so before implementing
|
|
26
|
-
`/model` and
|
|
25
|
+
differs from the model you're running as, say so before implementing; the human can
|
|
26
|
+
switch with `/model` and rerun to honor it, or wave you on. Advisory, never a gate.
|
|
27
27
|
|
|
28
28
|
## What this skill does, in order
|
|
29
29
|
|
|
30
|
-
1. **Pick the step.** Use the number you were invoked with (
|
|
30
|
+
1. **Pick the step.** Use the number you were invoked with (for example `/plumbbob:build 4`), or,
|
|
31
31
|
if you were given a range like `/plumbbob:build 1-3`, start at the first number and treat
|
|
32
32
|
the second as the auto-approve ceiling (see the range note under `--auto`). With no
|
|
33
|
-
argument, don't resolve the next step yourself
|
|
33
|
+
argument, don't resolve the next step yourself; the CLI does: bare `plumbbob build`
|
|
34
34
|
(step 2) enters the next undone step and refuses with a `/plumbbob:step` nudge when every
|
|
35
35
|
step is checkpointed.
|
|
36
|
-
2. **Enter the step.** Run `plumbbob build <n
|
|
36
|
+
2. **Enter the step.** Run `plumbbob build <n>`, or bare `plumbbob build` to enter the
|
|
37
37
|
next undone step (records the in-flight STEP + SEAM so `/plumbbob:status` shows the step in
|
|
38
38
|
flight; the seam is awareness, not a lock).
|
|
39
39
|
- **Spike-as-step.** If the step's title opens with `spike:` / `Spike:`, the increment
|
|
40
|
-
*is* the experiment
|
|
40
|
+
*is* the experiment: resolving a fork the plan couldn't settle on paper. After
|
|
41
41
|
entering it, run `plumbbob spike report "<slug>"` (the CLI scaffolds a
|
|
42
42
|
`spike-NN-<slug>.md` in the build folder, stamped `via: step <n>`), then work the
|
|
43
43
|
experiment and record your **Findings** and **Verdict** there. A recorded verdict is
|
|
44
|
-
what the step's done-when should check
|
|
45
|
-
deliverable. This is the same artifact `/plumbbob:spike` produces for a mid-build fork
|
|
44
|
+
what the step's done-when should check; the report, not just the code, is the
|
|
45
|
+
deliverable. This is the same artifact `/plumbbob:spike` produces for a mid-build fork
|
|
46
|
+
([D70 (spike-reports)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d70)).
|
|
46
47
|
3. **Read the plan.** Read the step's **done-when**, its **seam**, and the
|
|
47
|
-
**Decisions** and **Constraints** in `intent.md`. Build to *that
|
|
48
|
+
**Decisions** and **Constraints** in `intent.md`. Build to *that*; the deciding
|
|
48
49
|
already happened, off the chat.
|
|
49
50
|
- **Bound `before`-agents load context first.** If `plumbbob status` shows a
|
|
50
|
-
`harness bindings:` block, this build binds agents
|
|
51
|
+
`harness bindings:` block, this build binds agents; see **§ Running bound agents**
|
|
51
52
|
and load their context in before you write. No bindings, no harness: just build.
|
|
52
53
|
4. **Implement** the step, and only that step, staying within the declared seam. A
|
|
53
54
|
new problem or "ooh what if" that surfaces mid-build is a park, **not** an edit:
|
|
54
|
-
capture it by running `plumbbob park "<one tidy line>"
|
|
55
|
+
capture it by running `plumbbob park "<one tidy line>"`: **saying "let's defer
|
|
55
56
|
that" writes nothing; only the park line in the build log is a capture.** When the
|
|
56
57
|
*human* hands you the tangent mid-build, their message **is** the approval to park
|
|
57
|
-
it
|
|
58
|
+
it; capture it right away, say what you parked, and stay on the step. If you
|
|
58
59
|
genuinely cannot finish without touching more than the seam, that is scope drift:
|
|
59
60
|
surface it to the human rather than sprawling.
|
|
60
61
|
- **Bound agents can shape the build.** If `plumbbob status` shows a
|
|
61
62
|
`harness bindings:` block, a `build`-slot agent may author the diff, a `when`-cue may
|
|
62
|
-
fire an agent mid-build, and a non-`done` envelope routes by its status
|
|
63
|
+
fire an agent mid-build, and a non-`done` envelope routes by its status; see
|
|
63
64
|
**§ Running bound agents**.
|
|
64
65
|
5. **Verify, through to the pause.** Run the verify tick exactly as `/plumbbob:verify`
|
|
65
66
|
does: `plumbbob check` (on red, read `.check/summary.json` and the failing slot's
|
|
66
67
|
raw output under `.check/` for the actual diagnostics; while iterating on a fix,
|
|
67
|
-
narrow the loop with `plumbbob check --bail --only <slots
|
|
68
|
+
narrow the loop with `plumbbob check --bail --only <slots>`; the checkpoint gate
|
|
68
69
|
still runs everything) → self-review the diff against the done-when, the Decisions,
|
|
69
|
-
and the Constraints (a single structured read
|
|
70
|
+
and the Constraints (a single structured read; cite each with its slug from
|
|
71
|
+
`intent.md`: `C1 (no-new-deps)`, never a bare `C1`) → validate → **PAUSE
|
|
70
72
|
for the human's approval** → only on approval, checkpoint with
|
|
71
|
-
`plumbbob checkpoint <n> --body <<'BODY' … BODY
|
|
73
|
+
`plumbbob checkpoint <n> --body <<'BODY' … BODY`: a commit body **proportional to the
|
|
72
74
|
step** (a line for a trivial change, a short paragraph for a meatier one; no TIL scan,
|
|
73
75
|
no separate commit skill). The CLI owns the subject and appends this step to the
|
|
74
|
-
build-log's `## Log`, so the history writes itself
|
|
76
|
+
build-log's `## Log`, so the history writes itself; you only supply the body (or omit
|
|
75
77
|
`--body` for the deterministic done-when + seam + diffstat fallback). Do **not** bump
|
|
76
|
-
the version or changelog
|
|
77
|
-
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
is the
|
|
78
|
+
the version or changelog; that is the human's `/version` call.
|
|
79
|
+
- **`--body` reads stdin only.** Redirect the heredoc *into* the command (`--body
|
|
80
|
+
<<'BODY'`). Do **not** pass it as an argument value (`--body "$(cat <<'BODY'…)"`):
|
|
81
|
+
`--body` ignores an argument and always reads stdin. Under an agent harness that
|
|
82
|
+
stdin is a socket, and `--body` now refuses rather than blocking on one; the
|
|
83
|
+
refusal names this exact heredoc form.
|
|
84
|
+
- **A drifted subject is reconciled at the pause, never silently.** The planned
|
|
85
|
+
title *is* the checkpoint subject ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). If the diff drifted
|
|
86
|
+
from it, **present** a corrected subject at the pause (`planned title → proposed
|
|
87
|
+
subject`, one line) for explicit approval, and only on approval land it by adding
|
|
88
|
+
`-m "<subject>"` to the checkpoint. Present nothing and the deterministic
|
|
89
|
+
title-derived subject lands untouched: the reconcile is the human-approved exception,
|
|
90
|
+
not a quiet `-m` swap (which is the agent-authored subject [D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)
|
|
91
|
+
refuses).
|
|
84
92
|
- **If `plumbbob status` shows a `harness bindings:` block**, fold any bound
|
|
85
|
-
`after`-agents into that self-review as advisory input
|
|
93
|
+
`after`-agents into that self-review as advisory input; see **§ Running bound
|
|
86
94
|
agents**.
|
|
87
95
|
|
|
88
96
|
**The latch makes this pause real.** On the default (non-`--auto`) path you
|
|
89
|
-
build the step and reach the pause *in one turn
|
|
97
|
+
build the step and reach the pause *in one turn*, so under plumbbob's turn hook the
|
|
90
98
|
checkpoint at the end of that turn is **refused** ("no human turn since this step
|
|
91
99
|
began"), and that refusal **is** the pause working as designed. Do exactly what the
|
|
92
100
|
pause asks: present the diff and the self-review, emit the closing block below, and
|
|
93
|
-
**end the turn**. The human's next message
|
|
101
|
+
**end the turn**. The human's next message (their approval) is the human turn that
|
|
94
102
|
lets the checkpoint land: on that turn you run `plumbbob checkpoint <n>` (now allowed)
|
|
95
|
-
and **stop at the boundary**. Landing the checkpoint is its own deliberate beat
|
|
96
|
-
thing approval triggers
|
|
103
|
+
and **stop at the boundary**. Landing the checkpoint is its own deliberate beat (the
|
|
104
|
+
thing approval triggers), never a side effect of starting the next step, and
|
|
97
105
|
`/plumbbob:build` only ever starts the *next* step. **Never route around a refusal with a
|
|
98
|
-
raw `git commit
|
|
106
|
+
raw `git commit`**; the work plane stays free, but the *record* is latched on purpose.
|
|
99
107
|
|
|
100
108
|
**End every default build turn with the standardized hand-off block.** Run `plumbbob
|
|
101
|
-
handoff` and present its output
|
|
109
|
+
handoff` and present its output; it renders the same three-part shape (the state, the
|
|
102
110
|
choice, what's next) straight from the session: step N built, the looks-good /
|
|
103
111
|
needs-work choice, and the next undone step with its `- model:` recommendation. Show
|
|
104
112
|
your diff and self-review above it. The CLI owns the block so it can't drift from what
|
|
105
113
|
`/plumbbob:status` reports; you supply only the judgment above it. It already drops the model
|
|
106
|
-
clause when the next step has none, and says so when no planned step remains
|
|
114
|
+
clause when the next step has none, and says so when no planned step remains; you
|
|
107
115
|
don't reproduce the template by hand.
|
|
108
116
|
|
|
109
117
|
**Then hand off with the next model.** Once the checkpoint lands in the approval turn,
|
|
110
|
-
run `plumbbob handoff` again and relay its boundary block
|
|
118
|
+
run `plumbbob handoff` again and relay its boundary block; with the step gone from
|
|
111
119
|
in-flight it renders "step N checkpointed" and points at the next undone step, carrying
|
|
112
120
|
that step's `- model:` recommendation (the plan's smallest-model-that-fits call) so the
|
|
113
|
-
human knows which `/model` to select before
|
|
121
|
+
human knows which `/model` to select before running `/plumbbob:build` again. It is what
|
|
114
122
|
carries the plan's suggestion across a fresh context window, which inherits the session
|
|
115
123
|
model, not the plan's. No `- model:` line means any model will do. Guidance, never a
|
|
116
124
|
gate.
|
|
@@ -118,38 +126,38 @@ differs from the model you're running as, say so before implementing — the hum
|
|
|
118
126
|
## Running bound agents
|
|
119
127
|
|
|
120
128
|
Skip this section unless `plumbbob status` shows a `harness bindings:` block. Nearly every
|
|
121
|
-
build binds **no** agents
|
|
129
|
+
build binds **no** agents; for them the default path above is the whole story. When a
|
|
122
130
|
harness *is* bound, this is what each affected step gains, in lifecycle order.
|
|
123
131
|
|
|
124
|
-
- **`before
|
|
132
|
+
- **`before`: load context in (step 3).** If the build's `harness.json` binds agents to
|
|
125
133
|
this step's `before` slot, run `plumbbob agent run --step <n> --mode before` first: each
|
|
126
134
|
returns a validated envelope on stdout that plumbbob also appends to the step's
|
|
127
135
|
`handoff.json`, and its `summary`/`body` become **context you read into the build** (that
|
|
128
|
-
is the whole point of the slot
|
|
129
|
-
harness, is a clean no-op
|
|
130
|
-
- **`build
|
|
136
|
+
is the whole point of the slot: load the context in before you write). No binding, or no
|
|
137
|
+
harness, is a clean no-op: just build.
|
|
138
|
+
- **`build`: delegate the diff (step 4).** If a `build`-slot agent is bound, run
|
|
131
139
|
`plumbbob agent run --step <n> --mode build` and let that agent author the step's code
|
|
132
140
|
instead of writing it yourself; its envelope reports what it did. You still own the verify
|
|
133
|
-
tick
|
|
134
|
-
- **A manifest's `when` prose is your cue to
|
|
141
|
+
tick; the diff is reviewed the same way whoever wrote it.
|
|
142
|
+
- **A manifest's `when` prose is your cue to run an agent mid-build (step 4).** The three
|
|
135
143
|
slots are the only *declarative* lifecycle points; there is no config for "a salient
|
|
136
144
|
moment in the middle." That is judgment, and you are the frontier model in the room: when
|
|
137
|
-
the work reaches the situation a bound agent's `when` (or a step `note`) describes,
|
|
145
|
+
the work reaches the situation a bound agent's `when` (or a step `note`) describes, run
|
|
138
146
|
`plumbbob agent run <name> --step <n>` yourself. Prose is the orchestration language; you
|
|
139
147
|
are the workflow engine.
|
|
140
148
|
- **Route a non-`done` envelope by its status (step 4).** An agent that returns `blocked`
|
|
141
149
|
couldn't finish (missing input, failed precondition): surface its `notes`, let the human
|
|
142
|
-
unblock, and re-run it
|
|
150
|
+
unblock, and re-run it; don't work around it. One that returns `drift` finished but found
|
|
143
151
|
the plan no longer matches reality: **stop and send the human to `/plumbbob:refine`** to repair
|
|
144
152
|
the plan before continuing, rather than building on a plan that's now wrong. A non-zero
|
|
145
153
|
exit is a failed run: report it and stop.
|
|
146
|
-
- **`after
|
|
154
|
+
- **`after`: advisory input to the verify tick (step 5).** After `plumbbob check`, run any
|
|
147
155
|
bound `after`-agents (`plumbbob agent run --step <n> --mode after`) and fold their
|
|
148
|
-
envelopes into the self-review as **advisory input
|
|
149
|
-
(checkride gates, the human is the clock; an `after`-agent that could fail a step
|
|
150
|
-
lock in
|
|
156
|
+
envelopes into the self-review as **advisory input**; they inform, they never gate
|
|
157
|
+
(checkride gates, the human is the clock; an `after`-agent that could fail a step would
|
|
158
|
+
be the old lock back in another form).
|
|
151
159
|
|
|
152
|
-
## `--auto
|
|
160
|
+
## `--auto`: let the agent be the clock (opt-in)
|
|
153
161
|
|
|
154
162
|
`/plumbbob:build --auto` is the explicit escape hatch when the human wants unattended
|
|
155
163
|
progress instead of approving each step. It does the same work, but **the agent reviews
|
|
@@ -159,41 +167,41 @@ and approves in the human's place**, and it **chains**:
|
|
|
159
167
|
order as the default path: bound `before`-agents → implement (or the bound `build`-agent) → bound
|
|
160
168
|
`after`-agents → `check` → self-review → **if the check is green AND the
|
|
161
169
|
self-review finds no done-when / Decision / Constraint mismatch, checkpoint** and move
|
|
162
|
-
straight on to the next planned step. Repeat. `--auto` adds no new machinery
|
|
170
|
+
straight on to the next planned step. Repeat. `--auto` adds no new machinery; the
|
|
163
171
|
`after`-agent output simply feeds the *existing* self-review halt condition.
|
|
164
172
|
- **Stop and hand back to the human** the moment any of these is true: the check is red,
|
|
165
173
|
the self-review finds a mismatch (surface exactly what, and do not checkpoint it), a
|
|
166
|
-
bound agent returns `blocked` or `drift` (unblock-and-re-run, or `/plumbbob:refine
|
|
174
|
+
bound agent returns `blocked` or `drift` (unblock-and-re-run, or `/plumbbob:refine`; an
|
|
167
175
|
agent cannot advance the loop), a new decision is needed, no planned steps
|
|
168
176
|
remain, or the top of a requested range is reached. **When `--auto` halts back to the
|
|
169
|
-
human, give the same hand-off the default pause does
|
|
177
|
+
human, give the same hand-off the default pause does**; run `plumbbob handoff` and
|
|
170
178
|
relay its block: the step just completed, the next undone step, and that next step's
|
|
171
179
|
`- model:` recommendation if it has one, so a fresh context window knows which `/model`
|
|
172
180
|
to select.
|
|
173
181
|
|
|
174
182
|
`--auto` and a step range are the only paths that checkpoint without a human pause, and
|
|
175
183
|
only because the human asked for it by name; a range re-imposes the pause at its top.
|
|
176
|
-
The default
|
|
184
|
+
The default (no flag, no range) always ends at the pause.
|
|
177
185
|
|
|
178
186
|
### A step range (`N-M`) is a bounded `--auto`
|
|
179
187
|
|
|
180
188
|
`/plumbbob:build 1-3` self-approves steps 1 through 3 exactly as `--auto` does, then **pauses
|
|
181
|
-
after step 3** instead of chaining to done. The range *is* the opt-in
|
|
189
|
+
after step 3** instead of chaining to done. The range *is* the opt-in; you do not also
|
|
182
190
|
pass `--auto`. Run it as the `--auto` loop with one extra halt: **stop before building
|
|
183
|
-
any next step whose plan number is past the top of the range.** It adds no machinery
|
|
191
|
+
any next step whose plan number is past the top of the range.** It adds no machinery:
|
|
184
192
|
just the one more entry already in the halt list above.
|
|
185
193
|
|
|
186
|
-
- **`N-M` with N ≤ M
|
|
194
|
+
- **`N-M` with N ≤ M**: build N…M, self-approving and checkpointing each, then pause at
|
|
187
195
|
M. `N-N` is just the single step `N` (which already ends at the pause).
|
|
188
|
-
- **N > M** (
|
|
196
|
+
- **N > M** (for example `3-1`): that is not a range you can walk; report it and stop rather
|
|
189
197
|
than guess the intent.
|
|
190
|
-
- **M past the last planned step** (
|
|
198
|
+
- **M past the last planned step** (for example `1-9` with three steps): build through the
|
|
191
199
|
last planned step and stop; that is the existing "no planned steps remain" halt, not
|
|
192
200
|
an error.
|
|
193
|
-
- **A step inside the range won't build** (missing, or its seam won't parse)
|
|
201
|
+
- **A step inside the range won't build** (missing, or its seam won't parse): `plumbbob
|
|
194
202
|
build <n>` fails exactly as it always does; surface it and stop, the same as a red
|
|
195
203
|
check. Do not skip past the gap.
|
|
196
|
-
- **N is above the next undone step
|
|
204
|
+
- **N is above the next undone step**: you are jumping over earlier planned work; note
|
|
197
205
|
that you are skipping the steps before N, then proceed (the same latitude as a
|
|
198
206
|
single-number jump like `/plumbbob:build 4`).
|
|
199
207
|
|
|
@@ -202,26 +210,27 @@ just the one more entry already in the halt list above.
|
|
|
202
210
|
- **Swappable, never required.** The loop works without this skill; `/plumbbob:verify`
|
|
203
211
|
checkpoints a hand-built or vibed diff just the same.
|
|
204
212
|
- **Build the decided step, not a new one.** Implement what `intent.md` settled. A
|
|
205
|
-
new idea mid-build is captured with `plumbbob park`, not an edit
|
|
213
|
+
new idea mid-build is captured with `plumbbob park`, not an edit: a promise to
|
|
206
214
|
defer writes nothing; the park line does.
|
|
207
215
|
- **Default ends at the pause.** Implement → verify → wait for approval; never
|
|
208
216
|
checkpoint without it. Only an explicit `--auto` or a step range lets the agent approve
|
|
209
|
-
in your place, and it still halts on a red check or any mismatch
|
|
217
|
+
in your place, and it still halts on a red check or any mismatch; a range also stops
|
|
210
218
|
at its top.
|
|
211
219
|
- **Agents feed the beat; they never advance it**. `before` loads context,
|
|
212
|
-
`build` writes the diff, `after` is advisory
|
|
220
|
+
`build` writes the diff, `after` is advisory; none can checkpoint, flip a step, or
|
|
213
221
|
chain. `blocked` → unblock and re-run; `drift` → `/plumbbob:refine`. You are still the one
|
|
214
222
|
who verifies and (bar `--auto`) the human is still the clock. See **§ Running bound
|
|
215
223
|
agents** for the mechanics.
|
|
216
224
|
- **A refused checkpoint is the pause, not an error.** Under plumbbob's turn
|
|
217
|
-
hook a same-turn `checkpoint` is refused by design
|
|
225
|
+
hook a same-turn `checkpoint` is refused by design: present the diff and the closing
|
|
218
226
|
block, **end the turn**; the human's approval on their next turn is what lets you land
|
|
219
227
|
it, and landing it is a deliberate beat, not a side effect of the next `/plumbbob:build`.
|
|
220
228
|
Never route around it with a raw `git commit`. An explicit `/plumbbob:build --auto` or a typed
|
|
221
|
-
step range in the human's own prompt are the only self-approvals
|
|
229
|
+
step range in the human's own prompt are the only self-approvals; **never write `auto`
|
|
222
230
|
into a settings file yourself to unlock a checkpoint. A grant you mint is no grant (the
|
|
223
|
-
latch ignores it
|
|
231
|
+
latch ignores it; [D67 (auto-not-a-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d67)); ask the human to type
|
|
232
|
+
`/plumbbob:build --auto` again instead.**
|
|
224
233
|
- **Close with the next model.** When a step lands, run `plumbbob handoff` and relay its
|
|
225
|
-
block
|
|
234
|
+
block; it cites the completed step and the next undone step, and names that next step's
|
|
226
235
|
`- model:` recommendation if it has one, which is what a fresh context window needs to
|
|
227
|
-
pick the right `/model` before
|
|
236
|
+
pick the right `/model` before the next run. Guidance, never a gate.
|
package/skills/doctor/SKILL.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: doctor
|
|
3
|
-
description: Diagnose the plugin install from inside a session
|
|
3
|
+
description: "Diagnose the plugin install from inside a session: is plumbbob linked, are the skills and hook present, is there a collision. A thin trigger for `plumbbob doctor`. Matters most for a marketplace install, where the CLI is on PATH only inside Claude Code."
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
model: haiku
|
|
6
6
|
allowed-tools: Bash(plumbbob doctor:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# PlumbBob
|
|
9
|
+
# PlumbBob: doctor (the is-it-installed-right move)
|
|
10
10
|
|
|
11
11
|
Install diagnostic (injected when this skill runs): !`plumbbob doctor 2>&1 || true`
|
|
12
12
|
|
|
13
|
-
This is a **thin driver** for `plumbbob doctor`. The report above is read-only
|
|
13
|
+
This is a **thin driver** for `plumbbob doctor`. The report above is read-only: `doctor`
|
|
14
14
|
inspects, it never writes. This skill carries **no Edit and no Write tool**: never edit a file
|
|
15
15
|
to change what the report says. If a check failed, surface its `→ fix` verbatim and apply
|
|
16
16
|
*that* fix, then have the human **restart Claude Code (or `/reload-plugins`)**. **Never retry.**
|
|
@@ -19,23 +19,23 @@ to change what the report says. If a check failed, surface its `→ fix` verbati
|
|
|
19
19
|
|
|
20
20
|
The CLI's reach differs by install path, and that is the whole point of running `doctor` here:
|
|
21
21
|
|
|
22
|
-
- **Marketplace plugin
|
|
23
|
-
`bin/` shims are injected into the Bash tool while the plugin is enabled).
|
|
24
|
-
terminal `plumbbob`**
|
|
25
|
-
|
|
22
|
+
- **Marketplace plugin**: `plumbbob` is on PATH **only inside a Claude Code session** (its
|
|
23
|
+
`bin/` shims are injected into the Bash tool while the plugin is enabled). **No
|
|
24
|
+
terminal `plumbbob`** exists. So this skill (or letting me run `plumbbob doctor` in-session)
|
|
25
|
+
is the *only* way to reach `doctor`. The fact that this skill loaded at all already proves
|
|
26
26
|
the plugin is enabled and the shim is on PATH.
|
|
27
|
-
- **Skills-dir / global install** (`npm i -g plumbbob` + `plumbbob init`)
|
|
27
|
+
- **Skills-dir / global install** (`npm i -g plumbbob` + `plumbbob init`): `plumbbob` is on
|
|
28
28
|
PATH everywhere, so terminal `plumbbob doctor` works too; this skill is just convenience.
|
|
29
29
|
|
|
30
30
|
The one failure `doctor` **cannot** diagnose: a plugin that never loaded at all (no
|
|
31
|
-
`/plumbbob:*` skill appears). That is a `/plugin` / `/reload-plugins` problem, not doctor's
|
|
31
|
+
`/plumbbob:*` skill appears). That is a `/plugin` / `/reload-plugins` problem, not doctor's,
|
|
32
32
|
and if you are reading this, that is not your situation.
|
|
33
33
|
|
|
34
34
|
## What it does
|
|
35
35
|
|
|
36
|
-
1. Surface the injected `doctor` report verbatim
|
|
36
|
+
1. Surface the injected `doctor` report verbatim: every `✓` and any `✗` with its `→ fix`.
|
|
37
37
|
If nothing rendered above (a few headless `-p` sessions skip the injection), just run
|
|
38
|
-
`plumbbob doctor` yourself
|
|
38
|
+
`plumbbob doctor` yourself (it is in your tools) and surface that.
|
|
39
39
|
2. If all checks passed, say so; if a skill still misbehaves, the fix is a restart, not a re-run.
|
|
40
40
|
3. If a check failed, apply its named `→ fix`, then restart Claude Code (or `/reload-plugins`).
|
|
41
41
|
4. If the report is empty or shows `command not found`, the CLI is not on PATH: for a
|
package/skills/finish/SKILL.md
CHANGED
|
@@ -1,42 +1,44 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: finish
|
|
3
|
-
description: Finish the build
|
|
3
|
+
description: "Finish the build: write the report (what shipped, decisions, parked/harvested items, deferred tangents), then make the final commit that closes the session. The build folder rides the branch into the PR: no separate archive. Report by default, no gate."
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
allowed-tools: Read, Write, Bash(plumbbob status:*), Bash(plumbbob finish:*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# PlumbBob
|
|
8
|
+
# PlumbBob: finish the build (the close-out)
|
|
9
9
|
|
|
10
10
|
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."`
|
|
11
11
|
|
|
12
12
|
`/plumbbob:finish` ends the build: it captures what happened, then makes the final commit
|
|
13
|
-
that closes the session. **Report by default
|
|
13
|
+
that closes the session. **Report by default**: no refuse-without-report gate,
|
|
14
14
|
and no separate docs phase. The build folder is tracked: it merges with the
|
|
15
|
-
branch and shows up in the PR, so there is nothing to archive
|
|
15
|
+
branch and shows up in the PR, so there is nothing to archive; the folder *is* the
|
|
16
16
|
record.
|
|
17
17
|
|
|
18
18
|
## What this skill does, in order
|
|
19
19
|
|
|
20
20
|
1. **Write the report** to the active build's `report.md`
|
|
21
21
|
(`.plumbbob/builds/<slug>/report.md`), from `intent.md` + `build-log.md`.
|
|
22
|
-
The build-log's `## Log` is already the chronological history
|
|
22
|
+
The build-log's `## Log` is already the chronological history; `plumbbob checkpoint`
|
|
23
23
|
wrote a dated line for every step as it landed. **Read it as the spine; do not
|
|
24
24
|
re-narrate it.** The report adds only what the log does not already carry:
|
|
25
|
-
- **What shipped
|
|
26
|
-
- **Decisions and why
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
- **
|
|
25
|
+
- **What shipped**: summarize from the `## Log` timeline; don't rebuild it step by step.
|
|
26
|
+
- **Decisions and why**: the settled calls that shaped the build (the *why* behind
|
|
27
|
+
the log). Copy each one's `D# (slug)` from `intent.md` (never a bare `D#`) so
|
|
28
|
+
the report reads without flipping back to the intent.
|
|
29
|
+
- **Parked & harvested**: what was captured and how each was classified.
|
|
30
|
+
- **Final status**: done or partial, and what is left.
|
|
31
|
+
- **Deferred tangents**: the harvested items that become future work.
|
|
30
32
|
This is the "yeah, I did that" artifact. Write it by default; the human may edit it.
|
|
31
33
|
2. **Finish.** Run `plumbbob finish`, which appends the checkpoint SHAs to the
|
|
32
|
-
report and makes the final commit
|
|
33
|
-
led by a `plumbbob finish` marker plus an optional proportional `--body`
|
|
34
|
-
clears the control state (the in-flight markers, then `STATE` last
|
|
34
|
+
report and makes the final commit (subject `chore(<scope>): finish`, its body
|
|
35
|
+
led by a `plumbbob finish` marker plus an optional proportional `--body`), then
|
|
36
|
+
clears the control state (the in-flight markers, then `STATE` last; one delete
|
|
35
37
|
drops both the session sentinel and the active-build cursor it carries). The
|
|
36
38
|
build folder stays in place, committed, and rides the branch into the PR.
|
|
37
39
|
|
|
38
40
|
`--body` reads the close-out message from **stdin via a single-quoted heredoc
|
|
39
|
-
redirect
|
|
41
|
+
redirect**, the same form the other verbs use:
|
|
40
42
|
|
|
41
43
|
```
|
|
42
44
|
plumbbob finish --body <<'BODY'
|
|
@@ -46,16 +48,17 @@ record.
|
|
|
46
48
|
|
|
47
49
|
Redirect the heredoc *into* the command (`--body <<'BODY'`). Do **not** pass it as
|
|
48
50
|
an argument value (`--body "$(cat <<'BODY'…)"`): `--body` ignores an argument and
|
|
49
|
-
reads stdin
|
|
51
|
+
always reads stdin. Under an agent harness that stdin is a socket, and `--body` now
|
|
52
|
+
refuses rather than blocking on one; the refusal names this exact heredoc form. Omit
|
|
50
53
|
`--body` entirely and the commit carries the `plumbbob finish` marker subject only.
|
|
51
|
-
3. **Point at the next goal
|
|
54
|
+
3. **Point at the next goal**: `/plumbbob:plan` to frame the next one.
|
|
52
55
|
|
|
53
56
|
## The hard contracts
|
|
54
57
|
|
|
55
58
|
- **Report by default, never a gate.** Always offer the report; never wall the exit. A
|
|
56
|
-
bug fix's report can be three lines
|
|
59
|
+
bug fix's report can be three lines; size it to the work.
|
|
57
60
|
- **The log is the history; the report is the synthesis.** `checkpoint` already recorded
|
|
58
|
-
what shipped, step by step
|
|
61
|
+
what shipped, step by step; finish applies the *unique additions* (the why, the deferred
|
|
59
62
|
tangents, the final status), it does not rewrite the timeline.
|
|
60
63
|
- **The folder is the archive, never destroy**. `finish` keeps intent +
|
|
61
64
|
build-log + report in `builds/<slug>/` and commits them; nothing is copied out and
|
package/skills/harvest/SKILL.md
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: harvest
|
|
3
|
-
description: Triage the park list at a step boundary
|
|
3
|
+
description: "Triage the park list at a step boundary: propose one class (blocker/tangent/pivot) per parked item, write only after the human confirms each, record under ## Harvest, and fold a confirmed blocker into intent."
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
allowed-tools: Read, Edit, Bash(plumbbob status:*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# PlumbBob
|
|
8
|
+
# PlumbBob: harvest the park list
|
|
9
9
|
|
|
10
10
|
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."`
|
|
11
11
|
|
|
12
12
|
`/plumbbob:harvest` is the complement of `/plumbbob:park`: you parked ideas as seeds during a
|
|
13
|
-
build; now, at a boundary, you harvest them
|
|
13
|
+
build; now, at a boundary, you harvest them: decide what each one is.
|
|
14
14
|
|
|
15
|
-
## When to run it
|
|
15
|
+
## When to run it: boundary only
|
|
16
16
|
|
|
17
17
|
Harvest at a **step boundary**: after a step is checkpointed and you are back at the
|
|
18
18
|
DESIGN boundary, not mid-step. Read the dashboard injected above:
|
|
19
19
|
|
|
20
|
-
- `NO ACTIVE SESSION
|
|
20
|
+
- `NO ACTIVE SESSION`: **refuse**; tell the human to `plumbbob start "<title>"` first.
|
|
21
21
|
- A step in flight (the dashboard reads `[BUILD]`, and `next →` points at finishing the
|
|
22
|
-
step)
|
|
22
|
+
step): **refuse** and suggest finishing it with `/plumbbob:verify` before harvesting.
|
|
23
23
|
Chasing parked items mid-step is the disease parking prevents.
|
|
24
|
-
- At the boundary (the dashboard reads `[DESIGN]`)
|
|
24
|
+
- At the boundary (the dashboard reads `[DESIGN]`): go ahead.
|
|
25
25
|
|
|
26
26
|
## What this skill does
|
|
27
27
|
|
|
28
28
|
Walk the **Park list** in `build-log.md` item by item and, for each, **propose exactly
|
|
29
29
|
one class**:
|
|
30
30
|
|
|
31
|
-
- **blocker
|
|
31
|
+
- **blocker**: the plan was wrong or incomplete; can't proceed. Folds into `intent.md`
|
|
32
32
|
and is handled now.
|
|
33
|
-
- **tangent
|
|
34
|
-
- **pivot signal
|
|
33
|
+
- **tangent**: a different path, not clearly better. **The default**: defer or kill.
|
|
34
|
+
- **pivot signal**: real evidence the whole approach is wrong. Stop and replan.
|
|
35
35
|
|
|
36
36
|
## The one hard contract
|
|
37
37
|
|
|
@@ -42,6 +42,8 @@ one line of reasoning, then **wait for the human to confirm or override**. Write
|
|
|
42
42
|
- Record each confirmed class in `build-log.md`'s `## Harvest` section.
|
|
43
43
|
- **Flip the harvested item** from `- [ ]` to `- [x]` in the Park list, so `/plumbbob:status`
|
|
44
44
|
stops counting it as open.
|
|
45
|
-
- A confirmed **blocker** also folds its decision into `intent.md
|
|
45
|
+
- A confirmed **blocker** also folds its decision into `intent.md`, slugged at birth
|
|
46
|
+
like any Decision, anchored the same way
|
|
47
|
+
(`- <a id="d5"></a>**D5 (retry-cap)**: <the call>, *because* <why>`), never a bare `D5`.
|
|
46
48
|
- Never reclassify or resolve an item the human hasn't confirmed, and default every
|
|
47
49
|
uncertain item to **tangent**, never to blocker.
|
package/skills/park/SKILL.md
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: park
|
|
3
|
-
description: Compose one tidy tagged park line, get the human's OK in-turn, then capture it by shelling `plumbbob park
|
|
3
|
+
description: "Compose one tidy tagged park line, get the human's OK in-turn, then capture it by shelling `plumbbob park`, never by editing a file. The capture half of the park/harvest loop."
|
|
4
4
|
argument-hint: "[idea]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
model: haiku
|
|
7
7
|
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob park:*)
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# PlumbBob
|
|
10
|
+
# PlumbBob: park an idea (capture, don't chase)
|
|
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
14
|
`/plumbbob:park` is the **capture** half of the loop; `/plumbbob:harvest` is where parked items
|
|
15
|
-
get triaged later. Capturing the instant an idea arrives
|
|
16
|
-
it
|
|
15
|
+
get triaged later. Capturing the instant an idea arrives (instead of acting on
|
|
16
|
+
it) is the whole point: it protects the step in flight.
|
|
17
17
|
|
|
18
18
|
## Wrong-state refusal
|
|
19
19
|
|
|
20
20
|
Parking needs an **active session** to capture into. Read the dashboard injected above: if
|
|
21
21
|
it is `NO ACTIVE SESSION`, **refuse** and tell the human to run `plumbbob start
|
|
22
|
-
"<title>"` first. Any time the session is live
|
|
22
|
+
"<title>"` first. Any time the session is live (at the boundary, mid-step, or in a spike)
|
|
23
23
|
is fine; capture is always available, which is the whole point of parking.
|
|
24
24
|
|
|
25
25
|
## What this skill does
|
|
26
26
|
|
|
27
27
|
Take the idea, problem, or "ooh what if" the human just had and **compose it into one
|
|
28
|
-
tidy, tagged line
|
|
28
|
+
tidy, tagged line**: short, legible, self-contained, and carrying a **one-clause why**
|
|
29
29
|
(what it is *and* why it's worth revisiting), so it still reads cleanly weeks later when
|
|
30
30
|
harvest triages it cold. Then:
|
|
31
31
|
|
|
32
|
-
1. **Show the composed line to the human** and wait for **in-turn approval
|
|
32
|
+
1. **Show the composed line to the human** and wait for **in-turn approval**: they
|
|
33
33
|
confirm it as-is or edit the wording.
|
|
34
34
|
2. **Only after** that approval, capture it by running `plumbbob park "<the
|
|
35
35
|
approved line>"` via Bash.
|
|
@@ -38,8 +38,8 @@ harvest triages it cold. Then:
|
|
|
38
38
|
|
|
39
39
|
The capture itself is the **dumb CLI**, never an edit. This skill carries **no Edit and
|
|
40
40
|
no Write tool** on purpose: you may not append to `build-log.md` yourself. Compose, get
|
|
41
|
-
approval, then shell `plumbbob park
|
|
42
|
-
never comes, capture nothing. (When the human's **own message** states the idea
|
|
43
|
-
tangent they raise mid-build
|
|
41
|
+
approval, then shell `plumbbob park`; that is the only write path. If approval
|
|
42
|
+
never comes, capture nothing. (When the human's **own message** states the idea, a
|
|
43
|
+
tangent they raise mid-build, that message **is** the approval: capture it directly
|
|
44
44
|
with `plumbbob park`, don't ask again. Deferring in words without the CLI line captures
|
|
45
45
|
nothing.)
|