plumbbob 0.6.1 → 0.6.4

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "plumbbob",
3
3
  "displayName": "PlumbBob",
4
- "version": "0.6.1",
4
+ "version": "0.6.4",
5
5
  "description": "Attention-first build process — driver skills + a CLI that keep you the decider; guidance, not enforcement.",
6
6
  "author": { "name": "Rob McLarty", "email": "hello@robmclarty.com", "url": "https://robmclarty.com" },
7
7
  "homepage": "https://github.com/robmclarty/plumbbob#readme",
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # PlumbBob
2
2
 
3
3
  <p align="center">
4
- <img src="hero.jpg" alt="A row of plumb bobs of varying shapes hanging from strings" width="600">
4
+ <img src="hero.svg" alt="A row of plumb bobs of varying shapes hanging from strings" width="600">
5
5
  </p>
6
6
 
7
7
  PlumbBob is a Claude Code plugin — twelve `/pb-*` skills and a small CLI — that runs
@@ -80,7 +80,7 @@ In Claude Code, inside any git repo with a clean tree:
80
80
 
81
81
  1. **Plan.** Fire `/pb-plan` and give it whatever you have — nothing (it interviews
82
82
  you), a rough line (`/pb-plan rate-limit POST /login, 5/min/IP, return 429`), or a
83
- path to a spec file. Together you fill `.plumbbob/intent.md`. No code is written
83
+ path to a spec file. Together you fill the build's `intent.md`. No code is written
84
84
  yet.
85
85
  2. **Build.** Fire `/pb-build`. It implements the next undone step, runs the
86
86
  heavy check gate, reviews its own diff against the plan, and stops:
@@ -115,21 +115,40 @@ every move, and `/pb-status` always names your next one. (Claude Code namespaces
115
115
  under the plugin — the real command is `/plumbbob:pb-plan`; for readability these docs
116
116
  write the short form `/pb-plan`.)
117
117
 
118
- | Skill | Does |
119
- |-------|------|
118
+ **The happy path** the three moves every session makes; many sessions need
119
+ nothing else:
120
+
121
+ | Skill <img alt="" width="110" height="1"> | Does |
122
+ |------------------------------------|------|
120
123
  | `/pb-plan` | plan the whole goal — open the session and author intent's Frame, Decisions, Constraints, **and all Steps** |
124
+ | `/pb-build` | implement the next planned step, then verify it to the pause — `--auto` self-approves and chains to done; a range like `1-3` self-approves through step 3, then pauses |
125
+ | `/pb-finish` | finish up — write the report, make the final commit, clear for a fresh goal |
126
+
127
+ **Plan-shaping moves** — optional, for when the plan needs work mid-flight:
128
+
129
+ | Skill <img alt="" width="110" height="1"> | Does |
130
+ |------------------------------------|------|
121
131
  | `/pb-step` | revise/sharpen the next step (empty input auto-syncs it to reality) |
122
- | `/pb-build` | *(optional)* implement the next planned step, then verify it to the pause — `--auto` self-approves and chains to done |
123
- | `/pb-verify` | the tick check self-review validate **PAUSE** → checkpoint |
124
- | `/pb-park` | capture a mid-build idea without chasing it |
132
+ | `/pb-refine` | attack the frame for holes, or repair a drifted plan |
133
+ | `/pb-spike` | throwaway worktree experiment for a fork the plan can't settle |
134
+
135
+ **Helpers** — orient, verify, recover, diagnose:
136
+
137
+ | Skill <img alt="" width="110" height="1"> | Does |
138
+ |------------------------------------|------|
125
139
  | `/pb-status` | orient — where you are, the next step's done-when and seam, and the next move |
140
+ | `/pb-verify` | the tick, standalone — check → self-review → validate → **PAUSE** → checkpoint, for a diff `/pb-build` didn't write |
141
+ | `/pb-revert` | recover — `git reset --hard` to a recorded checkpoint |
142
+ | `/pb-doctor` | check the install from inside a session |
143
+
144
+ **Capture** — the park/harvest loop for mid-build ideas:
145
+
146
+ | Skill <img alt="" width="110" height="1"> | Does |
147
+ |------------------------------------|------|
148
+ | `/pb-park` | capture a mid-build idea without chasing it |
126
149
  | `/pb-harvest` | triage parked ideas between steps (blocker / tangent / pivot) |
127
- | `/pb-finish` | finish up — write the report, make the final commit, clear for a fresh goal |
128
150
 
129
- Three power moves round it out `/pb-revert` (recover to a checkpoint), `/pb-spike`
130
- (throwaway worktree experiment for a fork the plan can't settle), and `/pb-refine`
131
- (attack the frame for holes or repair a drifted plan) — plus `/pb-doctor` to check
132
- your install. All twelve, with inputs and effects, are in
151
+ All twelve, with inputs and effects, are in
133
152
  [`docs/skills-reference.md`](docs/skills-reference.md).
134
153
 
135
154
  Under the skills ships a lean `plumbbob` CLI (the mechanical verbs the
@@ -139,10 +158,10 @@ flow), and a `.plumbbob/` sidecar you can open and edit by hand at any time —
139
158
  that rides the branch into the PR, plus an untracked control plane (`settings.local.json`,
140
159
  the session sentinel, the in-flight markers).
141
160
 
142
- **`/pb-build` is optional.** It's one executor, not the loop. Implement a step by
143
- hand or vibe it in another session, or in another harness entirely and run
144
- `/pb-verify` instead: same checks, same pause, same checkpoint. It reads the *diff,
145
- not the author*.
161
+ **`/pb-build` is the default engine, not the only one.** It's one executor the
162
+ loop doesn't care who writes the code. Implement a step by handor vibe it in
163
+ another session, or in another harness entirely and run `/pb-verify` instead:
164
+ same checks, same pause, same checkpoint. It reads the *diff, not the author*.
146
165
 
147
166
  **Bring your own agents.** Because the executor is author-blind, you can plug your
148
167
  own in. A **user-authored agent** is any executable that speaks one small JSON
@@ -194,7 +213,7 @@ actually learning is the method: decisions before code, one verified step at a
194
213
  time, capture instead of chase. That transfers to whatever tool wins. If
195
214
  something better ships, you walk away with your archives and your habits intact.
196
215
 
197
- **…admit the pause is unenforceable?** It is — on purpose (D10/D13 in
216
+ **…admit the pause is unenforceable?** It is — on purpose ([D10](docs/decisions.md#d10)/[D13](docs/decisions.md#d13) in
198
217
  [`docs/decisions.md`](docs/decisions.md)). A hard lock buys ritual, not control:
199
218
  a determined model routes around it. So PlumbBob enforces deterministically where
200
219
  it can — `checkpoint` refuses on a red check, `revert` restores only recorded
@@ -211,7 +230,8 @@ Each doc answers one question — in rough reading order for a new user:
211
230
  - *Should I / can I / what about…?* → [`docs/faq.md`](docs/faq.md) — the adoption questions, answered straight.
212
231
  - *What is each method for?* → [`docs/techniques.md`](docs/techniques.md) — steps, seams, the pause, park/harvest, spikes.
213
232
  - *What does each skill do?* → [`docs/skills-reference.md`](docs/skills-reference.md) — all twelve `/pb-*` skills: inputs, effects, when to reach for each.
214
- - *How do I plug in my own agent?* → [`docs/agents.md`](docs/agents.md) — the subprocess envelope, the manifest, `harness.json`, and a working example.
233
+ - *How do I plug in my own agent?* → [`docs/agents.md`](docs/agents.md) — the subprocess envelope, the manifest, `harness.json`, and working examples (including a local-model reviewer via Ollama).
234
+ - *How do I get a local model reviewing my steps?* → [`docs/local-model-review.md`](docs/local-model-review.md) — the ollama-reviewer example walked end to end, install to every-pause review.
215
235
  - *How do I install it, exactly?* → [`docs/install.md`](docs/install.md) — the full guide and the agent-neutral roadmap.
216
236
  - *What does the CLI underneath do?* → [`docs/cli-reference.md`](docs/cli-reference.md) — every verb, flag, exit code, and the `.plumbbob/` sidecar.
217
237
  - *Something's broken.* → [`docs/troubleshooting.md`](docs/troubleshooting.md) — fixes for the common snags.
@@ -13,6 +13,13 @@ export function build(cwd, args) {
13
13
  }
14
14
  const { build: slug, rest } = resolveBuild(root, args);
15
15
  const raw = rest.find((a) => !a.startsWith('--'));
16
+ // A step range like `1-3` is a `/pb-build` skill affordance (auto-approve
17
+ // through the range, then pause), not a CLI capability — the CLI records one
18
+ // in-flight step at a time. Name it rather than bounce off the generic usage.
19
+ if (raw !== undefined && /^\d+-\d*$/.test(raw)) {
20
+ process.stderr.write(`plumbbob: build takes one step number; \`${raw}\` step ranges are a \`/pb-build\` feature (auto-approve through the range, then pause). Try \`plumbbob build ${raw.split('-')[0]}\`.\n`);
21
+ return 1;
22
+ }
16
23
  if (raw === undefined || !/^\d+$/.test(raw) || Number(raw) < 1) {
17
24
  process.stderr.write('plumbbob: build needs a step number. Try: plumbbob build 2.\n');
18
25
  return 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plumbbob",
3
- "version": "0.6.1",
3
+ "version": "0.6.4",
4
4
  "description": "Attention-first build process: 12 skills + a CLI that keep you the decider — guidance, not enforcement.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -1,18 +1,18 @@
1
1
  ---
2
2
  name: pb-build
3
- description: The optional engine — read the next planned step from intent, implement it (its done-when, seam, Decisions, Constraints), then verify it through to the approval pause. Skip it to build by hand/vibed/another harness. `--auto` self-approves and chains to done.
4
- argument-hint: "[step-number] [--auto]"
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 /pb-verify instead. `--auto` self-approves and chains to done; a step range like `1-3` self-approves through step 3, then pauses.
4
+ argument-hint: "[step-number | step-range] [--auto]"
5
5
  disable-model-invocation: true
6
6
  model: opus
7
7
  allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob build:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent:*), Bash(git diff:*)
8
8
  ---
9
9
 
10
- # PlumbBob — build a step (the optional engine)
10
+ # PlumbBob — build a step (the default engine)
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 the **bundled executor** — one way to turn a planned step into code. It is
15
- **optional** (D3): you can implement any step by hand, in a vibe session, or with
14
+ This is the **bundled executor** — the default engine, not the only one. It is
15
+ **swappable** (D3): you can implement any step by hand, in a vibe session, or with
16
16
  another harness and go straight to `/pb-verify` instead — plumbbob does not care how
17
17
  the diff appeared. When you do run it, it reads the plan, writes the step, and
18
18
  carries straight through to the verify pause.
@@ -23,9 +23,11 @@ at the pause for your approval. **Re-firing `/pb-build` is itself the clock tick
23
23
 
24
24
  ## What this skill does, in order
25
25
 
26
- 1. **Pick the step.** Use the number you were invoked with (e.g. `/pb-build 4`), else
27
- the next undone, planned step in `.plumbbob/intent.md`. If there is no planned step
28
- to build, stop and tell the human to `/pb-step` first.
26
+ 1. **Pick the step.** Use the number you were invoked with (e.g. `/pb-build 4`) — or,
27
+ if you were given a range like `/pb-build 1-3`, start at the first number and treat
28
+ the second as the auto-approve ceiling (see the range note under `--auto`). With no
29
+ argument, take the next undone, planned step in `.plumbbob/intent.md`. If there is no
30
+ planned step to build, stop and tell the human to `/pb-step` first.
29
31
  2. **Enter the step.** Run `plumbbob build <n>` (records the in-flight STEP +
30
32
  SEAM so `/pb-status` shows the step in flight; the seam is awareness, not a
31
33
  lock).
@@ -92,21 +94,45 @@ and approves in the human's place**, and it **chains**:
92
94
  - **Stop and hand back to the human** the moment any of these is true: the check is red,
93
95
  the self-review finds a mismatch (surface exactly what, and do not checkpoint it), a
94
96
  bound agent returns `blocked` or `drift` (unblock-and-re-run, or `/pb-refine` — an
95
- agent cannot advance the loop, C6), a new decision is needed, or no planned steps
96
- remain.
97
+ agent cannot advance the loop, C6), a new decision is needed, no planned steps
98
+ remain, or the top of a requested range is reached.
97
99
 
98
- `--auto` is the only path that checkpoints without a human pause, and only because the
99
- human asked for it by name. The default no flag — always ends at the pause.
100
+ `--auto` and a step range are the only paths that checkpoint without a human pause, and
101
+ only because the human asked for it by name; a range re-imposes the pause at its top.
102
+ The default — no flag, no range — always ends at the pause.
103
+
104
+ ### A step range (`N-M`) is a bounded `--auto`
105
+
106
+ `/pb-build 1-3` self-approves steps 1 through 3 exactly as `--auto` does, then **pauses
107
+ after step 3** instead of chaining to done. The range *is* the opt-in — you do not also
108
+ pass `--auto`. Run it as the `--auto` loop with one extra halt: **stop before building
109
+ any next step whose plan number is past the top of the range.** It adds no machinery —
110
+ just the one more entry already in the halt list above.
111
+
112
+ - **`N-M` with N ≤ M** — build N…M, self-approving and checkpointing each, then pause at
113
+ M. `N-N` is just the single step `N` (which already ends at the pause).
114
+ - **N > M** (e.g. `3-1`) — that is not a range you can walk; report it and stop rather
115
+ than guess the intent.
116
+ - **M past the last planned step** (e.g. `1-9` with three steps) — build through the
117
+ last planned step and stop; that is the existing "no planned steps remain" halt, not
118
+ an error.
119
+ - **A step inside the range won't build** (missing, or its seam won't parse) — `plumbbob
120
+ build <n>` fails exactly as it always does; surface it and stop, the same as a red
121
+ check. Do not skip past the gap.
122
+ - **N is above the next undone step** — you are jumping over earlier planned work; note
123
+ that you are skipping the steps before N, then proceed (the same latitude as a
124
+ single-number jump like `/pb-build 4`).
100
125
 
101
126
  ## The hard contracts
102
127
 
103
- - **Optional, never required.** The loop works without this skill; `/pb-verify`
128
+ - **Swappable, never required.** The loop works without this skill; `/pb-verify`
104
129
  checkpoints a hand-built or vibed diff just the same (D3).
105
130
  - **Build the decided step, not a new one.** Implement what `intent.md` settled. A
106
131
  new idea mid-build is a `/pb-park`, not an edit.
107
132
  - **Default ends at the pause.** Implement → verify → wait for approval; never
108
- checkpoint without it. Only an explicit `--auto` lets the agent approve in your place,
109
- and it still halts on a red check or any mismatch.
133
+ checkpoint without it. Only an explicit `--auto` or a step range lets the agent approve
134
+ in your place, and it still halts on a red check or any mismatch — a range also stops
135
+ at its top.
110
136
  - **Agents feed the beat; they never advance it** (C6/D45). `before` loads context,
111
137
  `build` writes the diff, `after` is advisory — none can checkpoint, flip a step, or
112
138
  chain. `blocked` → unblock and re-run; `drift` → `/pb-refine`. You are still the one