plumbbob 0.4.13 → 0.4.14
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 +6 -3
- package/dist/cli-core.js +4 -4
- package/dist/lib/archive.js +2 -2
- package/dist/verbs/build.js +1 -1
- package/dist/verbs/checkpoint.js +1 -1
- package/dist/verbs/wrap.js +4 -4
- package/package.json +1 -1
- package/skills/pb-build/SKILL.md +1 -1
- package/templates/intent.md +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plumbbob",
|
|
3
3
|
"displayName": "PlumbBob",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.14",
|
|
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
|
@@ -33,11 +33,14 @@ PlumbBob installs **once, globally** — like `gh` or your dotfiles — in one o
|
|
|
33
33
|
co-equal, mutually-exclusive ways (both register a Claude Code plugin named
|
|
34
34
|
`plumbbob`).
|
|
35
35
|
|
|
36
|
-
**Marketplace plugin** —
|
|
37
|
-
|
|
36
|
+
**Marketplace plugin** — Claude Code installs the published `plumbbob` package for
|
|
37
|
+
you (skills, hook, and the CLI on PATH), so you run no `npm i -g` and no `init`. It's
|
|
38
|
+
published in the [`agent-tools`](https://github.com/robmclarty/agent-tools)
|
|
39
|
+
marketplace — add that once, then install:
|
|
38
40
|
|
|
39
41
|
```text
|
|
40
|
-
/plugin
|
|
42
|
+
/plugin marketplace add robmclarty/agent-tools
|
|
43
|
+
/plugin install plumbbob@robmclarty
|
|
41
44
|
```
|
|
42
45
|
|
|
43
46
|
**npm global + `init`** — installs the CLI, then links the skills and hook into
|
package/dist/cli-core.js
CHANGED
|
@@ -24,14 +24,14 @@ const VERBS = [
|
|
|
24
24
|
{ name: 'revert', summary: 'revert [--to n]: git reset --hard to a checkpoint SHA' },
|
|
25
25
|
{ name: 'park', summary: 'park "<text>": append a raw line to the park list' },
|
|
26
26
|
{ name: 'spike', summary: 'spike "<slug>" | spike done: throwaway worktree experiment' },
|
|
27
|
-
{ name: 'wrap', summary: '
|
|
27
|
+
{ name: 'wrap', summary: 'close-out: archive intent+log+report (no gate), clear the sidecar, close the session' },
|
|
28
28
|
{ name: 'init', summary: 'link plumbbob into Claude Code as an in-place plugin (~/.claude/skills/plumbbob); --uninstall to undo' },
|
|
29
29
|
{ name: 'doctor', summary: 'diagnose the plugin link (manifest, skills, hook) and print the fix for anything broken' },
|
|
30
30
|
];
|
|
31
|
-
//
|
|
31
|
+
// PlumbBob (D1/D10/D13): the deciding/executing boundary is a pause, not a lock,
|
|
32
32
|
// so there is nothing to defend — every verb runs the same whether a human or the
|
|
33
|
-
// model triggers it.
|
|
34
|
-
// in-session refusal
|
|
33
|
+
// model triggers it. There is no human-only `mode` escape hatch and no CLAUDECODE
|
|
34
|
+
// in-session refusal; what keeps the human the decider is the pause at
|
|
35
35
|
// the step boundary (the skills), not a refusal here.
|
|
36
36
|
export function formatHelp() {
|
|
37
37
|
const width = Math.max(...VERBS.map((v) => v.name.length));
|
package/dist/lib/archive.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// The finish-phase archive helper (D20: archive is local-only markdown
|
|
1
|
+
// The finish-phase archive helper (D20: archive is local-only markdown).
|
|
2
2
|
// `finish` copies the three active files into .plumbbob/archive/<date>-<slug>/
|
|
3
3
|
// before clearing the actives — "archive-then-clear, never destroy" (C4).
|
|
4
4
|
// Functional/procedural, node builtins only (C1/C2).
|
|
@@ -58,7 +58,7 @@ function uniqueArchiveDir(root, base) {
|
|
|
58
58
|
}
|
|
59
59
|
// Copy intent + build-log + report into archive/<date>-<slug>/ and return the
|
|
60
60
|
// directory created. Intent and build-log always exist in an active session; the
|
|
61
|
-
// report is copied only when present —
|
|
61
|
+
// report is copied only when present — `wrap` does not gate on it (D9), so a
|
|
62
62
|
// close-out without a report still archives the rest.
|
|
63
63
|
export function archiveSession(root) {
|
|
64
64
|
const dir = uniqueArchiveDir(root, `${today()}-${slugify(sessionTitle(root))}`);
|
package/dist/verbs/build.js
CHANGED
|
@@ -24,6 +24,6 @@ export function build(cwd, args) {
|
|
|
24
24
|
}
|
|
25
25
|
writeFileSync(seamPath(root), `${parsed.seam.join('\n')}\n`);
|
|
26
26
|
writeFileSync(stepPath(root), `${step}\n`);
|
|
27
|
-
process.stdout.write(`plumbbob: building step ${step}. Seam (for orientation; not a lock
|
|
27
|
+
process.stdout.write(`plumbbob: building step ${step}. Seam (for orientation; not a lock):\n${parsed.seam.map((p) => ` ${p}`).join('\n')}\n`);
|
|
28
28
|
return 0;
|
|
29
29
|
}
|
package/dist/verbs/checkpoint.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// `plumbbob checkpoint [<n>] [-m <msg>]` — the executor-agnostic commit tick (D3).
|
|
2
|
-
//
|
|
2
|
+
// It does NOT require a STEP file: the step is whatever you pass,
|
|
3
3
|
// else the in-flight STEP, else the next undone step in intent. It gates on a green
|
|
4
4
|
// check, then commits any pending work (or records the existing HEAD when the tree
|
|
5
5
|
// is already clean — the human's commit skill may have committed first), records the
|
package/dist/verbs/wrap.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// `plumbbob wrap` (D9) — the
|
|
2
|
-
//
|
|
1
|
+
// `plumbbob wrap` (D9) — the close-out: one verb does the whole thing.
|
|
2
|
+
// It archives intent + build-log + report
|
|
3
3
|
// (the `/plumbbob:pb-wrap` skill writes the report by default) under .plumbbob/archive/,
|
|
4
|
-
// clears the active files, and deletes the control state (STATE last).
|
|
5
|
-
//
|
|
4
|
+
// clears the active files, and deletes the control state (STATE last). There is
|
|
5
|
+
// NO refuse-without-report gate — guidance offers the artifact, it
|
|
6
6
|
// does not wall the exit. Archive-then-clear, never destroy (C4); git untouched (C5).
|
|
7
7
|
import { appendFileSync, existsSync, readFileSync, rmSync } from 'node:fs';
|
|
8
8
|
import { join, relative } from 'node:path';
|
package/package.json
CHANGED
package/skills/pb-build/SKILL.md
CHANGED
|
@@ -27,7 +27,7 @@ at the pause for your approval. **Re-firing `/pb-build` is itself the clock tick
|
|
|
27
27
|
the next undone, planned step in `.plumbbob/intent.md`. If there is no planned step
|
|
28
28
|
to build, stop and tell the human to `/pb-step` first.
|
|
29
29
|
2. **Enter the step.** Run `plumbbob build <n>` (records the in-flight STEP +
|
|
30
|
-
SEAM so `/pb-status` shows the step in flight;
|
|
30
|
+
SEAM so `/pb-status` shows the step in flight; the seam is awareness, not a
|
|
31
31
|
lock).
|
|
32
32
|
3. **Read the plan.** Read the step's **done-when**, its **seam**, and the
|
|
33
33
|
**Decisions** and **Constraints** in `intent.md`. Build to *that* — the deciding
|
package/templates/intent.md
CHANGED
|
@@ -46,8 +46,8 @@ holes `/pb-refine` surfaces, and as blockers fold in during BUILD.)*
|
|
|
46
46
|
|
|
47
47
|
*(The build plan. `/pb-plan` authors the **whole list up front** — each step a small,
|
|
48
48
|
verifiable increment with its own **done-when** and **seam** (the paths it will touch,
|
|
49
|
-
which `/pb-build` records in `.plumbbob/SEAM` for orientation — awareness, not a lock
|
|
50
|
-
|
|
49
|
+
which `/pb-build` records in `.plumbbob/SEAM` for orientation — awareness, not a lock).
|
|
50
|
+
Then drive `/pb-build` until done. Later steps may be fuzzier than the first;
|
|
51
51
|
sharpen the next one just-in-time with `/pb-step` (empty input auto-syncs it), and use
|
|
52
52
|
`/pb-refine` to repair the whole plan when a blocker rewrites it.)*
|
|
53
53
|
|