plumbbob 0.10.2 → 0.10.3

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.10.2",
4
+ "version": "0.10.3",
5
5
  "description": "Attention-first build process — driver skills + a CLI that keep you the decider: guidance on the work, a latch on the record.",
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
@@ -152,7 +152,7 @@ a Claude Code built-in, so these docs write the full form.)
152
152
  nothing else:
153
153
 
154
154
  | Skill <img alt="" width="110" height="1"> | Does |
155
- |------------------------------------|------|
155
+ | ------------------------------------ | ------ |
156
156
  | `/plumbbob:plan` | plan the whole goal: open the session and author intent's Frame, Decisions, Constraints, **and all Steps** |
157
157
  | `/plumbbob: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 |
158
158
  | `/plumbbob:finish` | finish up: write the report, make the final commit, clear for a fresh goal |
@@ -160,7 +160,7 @@ nothing else:
160
160
  **Plan-shaping moves**: optional, for when the plan needs work mid-flight:
161
161
 
162
162
  | Skill <img alt="" width="110" height="1"> | Does |
163
- |------------------------------------|------|
163
+ | ------------------------------------ | ------ |
164
164
  | `/plumbbob:step` | revise/sharpen the next step (empty input auto-syncs it to reality) |
165
165
  | `/plumbbob:refine` | attack the frame for holes, or repair a drifted plan |
166
166
  | `/plumbbob:spike` | throwaway worktree experiment for a fork the plan can't settle |
@@ -168,7 +168,7 @@ nothing else:
168
168
  **Helpers**: orient, verify, recover, diagnose:
169
169
 
170
170
  | Skill <img alt="" width="110" height="1"> | Does |
171
- |------------------------------------|------|
171
+ | ------------------------------------ | ------ |
172
172
  | `/plumbbob:status` | orient: where you are, the next step's done-when and seam, and the next move |
173
173
  | `/plumbbob:verify` | the tick, standalone: check → self-review → validate → **PAUSE** → checkpoint, for a diff `/plumbbob:build` didn't write |
174
174
  | `/plumbbob:revert` | rewind: `git reset --hard` to a recorded checkpoint |
@@ -179,7 +179,7 @@ nothing else:
179
179
  **Capture**: the park/harvest loop for mid-build ideas:
180
180
 
181
181
  | Skill <img alt="" width="110" height="1"> | Does |
182
- |------------------------------------|------|
182
+ | ------------------------------------ | ------ |
183
183
  | `/plumbbob:park` | capture a mid-build idea without chasing it |
184
184
  | `/plumbbob:harvest` | triage parked ideas between steps (blocker / tangent / pivot) |
185
185
 
@@ -10,6 +10,12 @@
10
10
  * Append `line` after the last non-blank line of the `## <heading>` section:
11
11
  * that is, just before the next `## ` heading or EOF.
12
12
  *
13
+ * When `line` is a list item and the line above it is prose (the Park list's
14
+ * guidance blockquote, the Log's instructions paragraph), a blank line goes in
15
+ * first. Markdown wants lists separated from prose (MD032), and a consumer
16
+ * repo that lints `.plumbbob/**` turns the missing blank into a red gate at
17
+ * the first park or checkpoint of a build.
18
+ *
13
19
  * Returns null when the section is absent so the caller can report rather than
14
20
  * silently corrupt the doc.
15
21
  */
@@ -29,9 +35,19 @@ export function appendToSection(content, heading, line) {
29
35
  insertAt = i + 1;
30
36
  }
31
37
  }
32
- lines.splice(insertAt, 0, line);
38
+ const prev = lines[insertAt - 1] ?? '';
39
+ const needsBlank = isListLine(line) && prev.trim() !== '' && !isListLine(prev);
40
+ lines.splice(insertAt, 0, ...(needsBlank ? ['', line] : [line]));
33
41
  return lines.join('\n');
34
42
  }
43
+ /**
44
+ * A markdown list line: `-`, `*`, or `+` after optional indent. Every caller
45
+ * of appendToSection appends one of these, so the blank-line rule above keys
46
+ * on the line it lands after, not on which verb is writing.
47
+ */
48
+ function isListLine(line) {
49
+ return /^\s*[-*+]\s/.test(line);
50
+ }
35
51
  /**
36
52
  * Replace the `**Current step:**` line with `**Current step:** <label>`:
37
53
  * `build` sets it to the step's number and title joined by an em dash when a
@@ -140,7 +140,7 @@ function appendStats(root, slug) {
140
140
  '## Stats',
141
141
  '',
142
142
  '| step | red checks | drift warnings | reverts | wall-clock |',
143
- '|------|------------|----------------|---------|------------|',
143
+ '| ---- | ---------- | -------------- | ------- | ---------- |',
144
144
  ...rows,
145
145
  `| **total** | ${totals.redChecks} | ${totals.driftWarnings} | ${totals.reverts} | ${formatWall(totals.wallMs > 0 ? totals.wallMs : null)} |`,
146
146
  '',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plumbbob",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "description": "Attention-first build process: 14 skills + a CLI that keep you the decider — guidance on the work, a latch on the record.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -53,6 +53,7 @@
53
53
  "@types/node": "26.2.0",
54
54
  "@vitest/coverage-v8": "4.1.10",
55
55
  "@vvago/vale": "3.17.1",
56
+ "cspell": "10.0.1",
56
57
  "fallow": "3.14.0",
57
58
  "fascicle": "0.8.16",
58
59
  "markdownlint-cli2": "0.23.2",
@@ -36,11 +36,11 @@ check green + checkpoint taken, via `/plumbbob:verify` or `/plumbbob:build`.)*
36
36
  Classify each parked item as exactly ONE. Naming it before acting is what keeps you
37
37
  from sprawling across branches.
38
38
 
39
- | Class | Meaning | Action |
40
- |------------------|-------------------------------------------|---------------------------------|
41
- | **blocker** | Plan was wrong/incomplete; can't proceed | `/plumbbob:revert`, fold into intent |
42
- | **tangent** | A different path, not clearly better | Defer or kill. Default here. |
43
- | **pivot signal** | Evidence the whole approach is wrong | Stop. Replan deliberately. |
39
+ | Class | Meaning | Action |
40
+ | ---------------- | ----------------------------------------- | ------------------------------------ |
41
+ | **blocker** | Plan was wrong/incomplete; can't proceed | `/plumbbob:revert`, fold into intent |
42
+ | **tangent** | A different path, not clearly better | Defer or kill. Default here. |
43
+ | **pivot signal** | Evidence the whole approach is wrong | Stop. Replan deliberately. |
44
44
 
45
45
  > Reality check: almost everything that *feels* like a pivot is a tangent. Require a
46
46
  > failed assumption, not a shinier idea, before you pivot.