plumbbob 0.6.4 → 0.6.5

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.4",
4
+ "version": "0.6.5",
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",
@@ -27,7 +27,7 @@ export function appendToSection(content, heading, line) {
27
27
  }
28
28
  // The Log line `checkpoint` writes for a landed step: dated, names the step (its
29
29
  // title when intent.md still carries it), and carries the short SHA. One line of the
30
- // build's history — `/plumbbob:pb-finish` reads these instead of re-narrating the build.
30
+ // build's history — `/pb-finish` reads these instead of re-narrating the build.
31
31
  export function checkpointLogLine(date, step, sha, title) {
32
32
  const head = `- ${date} — step ${step} checkpointed · ${sha.slice(0, 9)}`;
33
33
  return title !== null && title.length > 0 ? `${head} — ${title}` : head;
@@ -77,7 +77,7 @@ export function parseOpenQuestions(intent) {
77
77
  .length;
78
78
  }
79
79
  // Open parked items: `- [ ]` lines under `## Park list` (the `park` verb's format).
80
- // A harvested item is flipped to `- [x]` by `/plumbbob:pb-harvest` and no longer counts; the
80
+ // A harvested item is flipped to `- [x]` by `/pb-harvest` and no longer counts; the
81
81
  // `(none yet)` placeholder and the blockquote instructions never match.
82
82
  export function parseParked(buildLog) {
83
83
  return sectionLines(buildLog, '## Park list').filter((l) => /^-\s+\[ \]\s+\S/.test(l.trim())).length;
@@ -101,22 +101,22 @@ function nextMove(spiking, steps, inFlight, parked) {
101
101
  return 'close the spike — `plumbbob spike done`';
102
102
  }
103
103
  if (inFlight !== null) {
104
- return `finish step ${inFlight} — \`/plumbbob:pb-verify\` (or keep editing, then \`/plumbbob:pb-verify\`)`;
104
+ return `finish step ${inFlight} — \`/pb-verify\` (or keep editing, then \`/pb-verify\`)`;
105
105
  }
106
106
  // At the boundary (DESIGN): the move follows from the steps.
107
107
  const nextUndone = steps.find((s) => !s.done);
108
108
  if (nextUndone === undefined) {
109
109
  if (steps.length === 0) {
110
- return 'plan the first step — `/plumbbob:pb-step`';
110
+ return 'plan the first step — `/pb-step`';
111
111
  }
112
112
  // Batch-default: the steps were planned up front, so finishing them usually
113
- // means "finish up" — but `/plumbbob:pb-step` can still add an increment if reality grew.
114
- const harvest = parked > 0 ? `harvest ${parked} parked idea${parked === 1 ? '' : 's'} — \`/plumbbob:pb-harvest\`; then ` : '';
115
- return `${harvest}finish up — \`/plumbbob:pb-finish\` (or \`/plumbbob:pb-step\` to add another increment)`;
113
+ // means "finish up" — but `/pb-step` can still add an increment if reality grew.
114
+ const harvest = parked > 0 ? `harvest ${parked} parked idea${parked === 1 ? '' : 's'} — \`/pb-harvest\`; then ` : '';
115
+ return `${harvest}finish up — \`/pb-finish\` (or \`/pb-step\` to add another increment)`;
116
116
  }
117
117
  return nextUndone.planned
118
- ? `build step ${nextUndone.n} — \`/plumbbob:pb-build\` (or \`/plumbbob:pb-step\` to revise it first)`
119
- : `plan step ${nextUndone.n} — \`/plumbbob:pb-step\``;
118
+ ? `build step ${nextUndone.n} — \`/pb-build\` (or \`/pb-step\` to revise it first)`
119
+ : `plan step ${nextUndone.n} — \`/pb-step\``;
120
120
  }
121
121
  export function orient(input) {
122
122
  const steps = parseSteps(input.intent);
@@ -146,7 +146,7 @@ export function formatOrientation(o) {
146
146
  if (s !== nextUndone) {
147
147
  return head;
148
148
  }
149
- // Surface the next step's detail so the human can review it (and `/plumbbob:pb-step`-
149
+ // Surface the next step's detail so the human can review it (and `/pb-step`-
150
150
  // revise) before building. Only what's present — a rough step shows neither.
151
151
  const detail = [];
152
152
  if (o.nextDoneWhen !== null) {
@@ -1,5 +1,5 @@
1
1
  // `plumbbob check` — run the heavy gate (D16/D24/D32) and report, with NO state
2
- // change. The read-only half of the verify tick: `/plumbbob:pb-verify` runs this before the
2
+ // change. The read-only half of the verify tick: `/pb-verify` runs this before the
3
3
  // pause so the human approves on a known-green check. Exits with the check's own
4
4
  // code (0 = green, 1 = red, 2 = the gate itself broke).
5
5
  //
@@ -5,7 +5,7 @@
5
5
  // is already clean — the human's commit skill may have committed first), records the
6
6
  // SHA, flips the intent checkbox to `[x]`, and clears any STEP/SEAM (which returns
7
7
  // the dashboard to the DESIGN boundary). The diff's author is irrelevant:
8
- // `/plumbbob:pb-build`, your hands, a vibe session, or another harness all checkpoint
8
+ // `/pb-build`, your hands, a vibe session, or another harness all checkpoint
9
9
  // the same way.
10
10
  import { appendFileSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
11
11
  import { commit, findRepoRoot, headSha, isDirty, stageAll, stagePath, stagedPaths, stagedStat } from "../lib/git.js";
@@ -108,7 +108,7 @@ function warnScopeDrift(root, step) {
108
108
  const outside = scopeDrift(stagedPaths(root), seam);
109
109
  if (outside.length > 0) {
110
110
  process.stderr.write(`plumbbob: heads-up — staged paths outside step ${step}'s seam: ${outside.join(', ')}. ` +
111
- `The checkpoint captures them; if that's real scope drift, the plan may need a \`/plumbbob:pb-step\` revision.\n`);
111
+ `The checkpoint captures them; if that's real scope drift, the plan may need a \`/pb-step\` revision.\n`);
112
112
  }
113
113
  }
114
114
  // The seam tokens for the in-flight step: the normalized SEAM file `build` wrote
@@ -5,7 +5,7 @@
5
5
  // Code loads it in place as a plugin (skills `/plumbbob:*`, the post-edit hook from
6
6
  // hooks.json). doctor verifies the link resolves to a package carrying the manifest,
7
7
  // the skills, and the hook — and names the fix for anything missing. The failure
8
- // class it exists for is SILENT (a `/plumbbob:pb-status` that opens an empty dashboard
8
+ // class it exists for is SILENT (a `/pb-status` that opens an empty dashboard
9
9
  // because the plugin never linked).
10
10
  //
11
11
  // 2. The repo sidecar layout. A repo scaffolded by a pre-restructure plumbbob carries a
@@ -419,7 +419,7 @@ export async function doctor(cwd, args = []) {
419
419
  out.push(failed === 0
420
420
  ? 'plumbbob: all checks passed. If a skill still misbehaves, restart Claude Code (or /reload-plugins).'
421
421
  : `plumbbob: ${failed} problem(s) — apply the → fixes, then restart Claude Code.`);
422
- out.push('plumbbob: skills shell a bare `plumbbob`. The marketplace plugin puts it on PATH only inside a Claude Code session (via bin/) — there is no terminal `plumbbob`; for one (or the skills-dir install) run `npm i -g plumbbob`. In-session you can also run this as `/plumbbob:pb-doctor`. Sessions are per-project via `plumbbob start`.');
422
+ out.push('plumbbob: skills shell a bare `plumbbob`. The marketplace plugin puts it on PATH only inside a Claude Code session (via bin/) — there is no terminal `plumbbob`; for one (or the skills-dir install) run `npm i -g plumbbob`. In-session you can also run this as `/pb-doctor`. Sessions are per-project via `plumbbob start`.');
423
423
  process.stdout.write(`${out.join('\n')}\n`);
424
424
  return failed === 0 ? 0 : 1;
425
425
  }
@@ -23,7 +23,7 @@ export function finish(cwd, args = []) {
23
23
  }
24
24
  else {
25
25
  process.stderr.write('plumbbob: note — no report.md found; finishing without one ' +
26
- '(/plumbbob:pb-finish normally writes the report first). No gate (D9).\n');
26
+ '(/pb-finish normally writes the report first). No gate (D9).\n');
27
27
  }
28
28
  // The final commit (D34): stage the report just written plus the build folder's
29
29
  // tail (the last step's checkpoint line lands one commit late, D37) and commit it
@@ -49,7 +49,7 @@ export function finish(cwd, args = []) {
49
49
  rmSync(join(sidecarDir(root), 'STATE'), { force: true });
50
50
  const where = slug === null ? '.plumbbob/' : `.plumbbob/builds/${slug}/`;
51
51
  process.stdout.write(`plumbbob: finished — ${sha.slice(0, 9)}. ${where} rides your branch into the PR. ` +
52
- 'Run `/plumbbob:pb-plan` (or `plumbbob start "<title>"`) to frame the next goal.\n');
52
+ 'Run `/pb-plan` (or `plumbbob start "<title>"`) to frame the next goal.\n');
53
53
  return 0;
54
54
  }
55
55
  // The CLI-owned final-commit subject (D34): `plumbbob: finish — <title>`, mirroring
@@ -1,5 +1,5 @@
1
1
  // `plumbbob park "<text>"` — the dumb capture path: append one raw line under
2
- // the build-log's Park list. No model turn, no composition (that is /plumbbob:pb-park's job).
2
+ // the build-log's Park list. No model turn, no composition (that is /pb-park's job).
3
3
  // Capture is not a transition, so it runs in any context (terminal or in-session).
4
4
  import { readFileSync, writeFileSync } from 'node:fs';
5
5
  import { findRepoRoot } from "../lib/git.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plumbbob",
3
- "version": "0.6.4",
3
+ "version": "0.6.5",
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",