ppdevskill 1.3.0 → 1.3.1

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.
Files changed (2) hide show
  1. package/README.md +91 -134
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,114 +1,122 @@
1
- # ppdevskill — Engineering Partner Skill
1
+ # ppdevskill — your engineering partner, not a code vending machine
2
2
 
3
- A Claude skill that turns Claude from *"an AI that throws out throwaway code to finish fast"* into a **real engineering thought-partner** — one that understands the actual need, fixes the right spot, avoids over-engineering, and writes principled code.
3
+ [![npm version](https://img.shields.io/npm/v/ppdevskill.svg)](https://www.npmjs.com/package/ppdevskill)
4
+ [![license](https://img.shields.io/npm/l/ppdevskill.svg)](./LICENSE)
4
5
 
5
- > **Language note:** by design, the skill **replies to you in Thai**, keeping technical terms function names, paths, errors, commands, code in English. That is why the `examples/` walkthroughs and a few quoted strings below are in Thai: they are not untranslated debt, they are the demonstrated behavior.
6
+ > Turn Claude from *"an AI that throws out throwaway code to finish fast"* into a **real engineering thought-partner**one that understands the actual need, fixes the right spot, refuses to over-engineer, and never says *"it's done"* about something it never ran.
6
7
 
7
- ---
8
-
9
- ## What it is
10
-
11
- `ppdevskill` is a single skill that unifies the software-engineering workflow into **six modes plus a commit action**. Every mode has a **hard gate** that cannot be skipped — the gate stops Claude from writing code before the information is complete and before you have approved a plan.
8
+ `ppdevskill` is a single [Claude](https://claude.ai/code) skill that unifies the whole software-engineering workflow into **six modes + a commit action**, each guarded by a **hard gate** that cannot be skipped. The gate stops Claude from writing code before the information is complete and before you have approved a plan.
12
9
 
13
- The core idea is **zero drift**. LLMs tend to "slip" their rules as a conversation grows longer or as the user grows impatient. This skill forces Claude to follow every rule literally, every time. A user saying *"just do it"* or *"skip the gate"* is **not** authorization to break a rule — the rule is restated and the work stops until the gate is genuinely satisfied.
10
+ > **Language note:** by design the skill **replies in Thai**, keeping technical terms function names, paths, errors, commands, code in English. The technical docs below are English for reach; the demonstrated behavior is Thai.
14
11
 
15
12
  ---
16
13
 
17
- ## Modes & commands
14
+ ## The problem it solves
18
15
 
19
- | Mode | Command | Use when |
20
- |---|---|---|
21
- | Plan | `#plan` | A big multi-step arc spanning more than one mode or more than 3 slices — orchestrate and decompose |
22
- | Debug | `#dbg` | A bug, an error / stack trace, something broken or throwing |
23
- | Feature | `#ft` | Add / build / implement a new capability |
24
- | Refactor | `#rf` | Clean up / restructure code with **no behavior change** |
25
- | Review | `#rv` | Review / audit a PR, diff, plan, or design doc |
26
- | Post-mortem | `#pm` | Write the RCA / post-mortem after a fix has landed |
16
+ LLM coding assistants share three expensive failure modes:
27
17
 
28
- Plus two routers and one action:
18
+ 1. **Code from thin air** — they start editing before they understand the need.
19
+ 2. **"It works" that doesn't** — they claim success they never verified.
20
+ 3. **Unguarded boundaries** — they touch auth / SQL / file-upload without a threat model.
29
21
 
30
- - **`#pp`** auto-route: Claude picks the mode from context; if it is ambiguous, it asks one question and stops.
31
- - **`#plan`** — orchestrator: breaks a big arc into slices (ordered by dependency), tags each slice with a mode, then hands off. It **never writes code itself**.
32
- - **`#cp`** — commit / push **action** (not a mode): clean message, no AI attribution, stage only what the change touched. Runs *after* the work is verified.
33
- - **`#bs`** — brainstorm-partner is a **separate skill** the workflow hands off to when the *approach itself* is undecided (it generates and selects, never builds).
22
+ And a fourth that grows over time: **drift** the longer the session, the more they "slip" their own rules.
34
23
 
35
- ```mermaid
36
- flowchart TD
37
- U[User request or command] --> PP{"#pp — auto-route"}
38
- PP -->|"bug / stack trace / broken"| DBG["#dbg Debug"]
39
- PP -->|"add / build / implement"| FT["#ft Feature"]
40
- PP -->|"clean up / restructure"| RF["#rf Refactor"]
41
- PP -->|"review / audit PR or diff"| RV["#rv Review"]
42
- PP -->|"write RCA / post-mortem"| PM["#pm Post-mortem"]
43
- PP -->|"big multi-step arc"| PLAN["#plan Orchestrate"]
44
- PP -->|"ambiguous"| ASK["Ask one question, stop"]
45
- PLAN -.->|"decompose into slices,<br/>each faces its own gate"| DBG
46
- PLAN -.-> FT
47
- PLAN -.-> RF
48
- PP -.->|"approach undecided"| BS["#bs Brainstorm<br/>(separate skill)"]
49
- ```
24
+ `ppdevskill` attacks all four with **gates, a verification discipline, a mechanical Stop-hook, and an on-disk ledger** — discipline backed by mechanism, not willpower.
50
25
 
51
26
  ---
52
27
 
53
- ## The gate model
28
+ ## Modes & commands
29
+
30
+ | Mode | Command | Use when | Gate |
31
+ |---|---|---|---|
32
+ | Plan | `#plan` | A big multi-step arc spanning >1 mode or >3 slices — orchestrate & decompose | GATE 0 · outcome + size + DoD |
33
+ | Debug | `#dbg` | A bug, error / stack trace, something broken or throwing | GATE 1 · reliable repro |
34
+ | Feature | `#ft` | Add / build / implement a new capability | GATE 2 · need + 3 scenarios + scope |
35
+ | Refactor | `#rf` | Clean up / restructure with **no behavior change** | GATE 3 · safety net + smell + pin |
36
+ | Review | `#rv` | Review / audit a PR, diff, plan, or design doc | GATE 4 · outsider trace + cite |
37
+ | Post-mortem | `#pm` | Write the RCA after a fix has landed | GATE 5 · repro + cause + fix + validation |
54
38
 
55
- Each mode opens with a gate. **No gate, no proceed** if the gate is not satisfied, Claude states exactly what is missing, stops, and waits. Security is a cross-cutting gate that **cannot be waved off**.
39
+ Plus: **`#pp`** auto-routes from context · **`#cp`** is the commit/push action (clean message, no AI attribution, runs only after work is verified) · **`#bs`** hands off to a separate brainstorm skill when the *approach itself* is undecided.
56
40
 
57
- - **GATE 0 `#plan`**outcome stated as an end state + size gate passed + unknowns surfaced + whole-arc definition of done.
58
- - **GATE 1 `#dbg`** — a reliable reproduction exists; no repro → full stop, no hypothesizing.
59
- - **GATE 2 `#ft`** — real need stated + at least 3 given/when/then acceptance scenarios + scope bounded IN/OUT.
60
- - **GATE 3 `#rf`** — a safety net + a concrete motivation (a named smell) + behavior pinned in one sentence.
61
- - **GATE 4 `#rv`** — outsider stance, end-to-end trace, cite `file:line`, no rubber stamps.
62
- - **GATE 5 `#pm`** — repro + root cause + fix + validation all in hand, else refuse.
63
- - **SECURITY GATE (cross-cutting)** — any change touching a trust boundary (input / auth / token / file / SQL / shell / crypto / secret / network / access control / new dependency) trips this gate; the abuse case is written and the relevant OWASP Top 10 items are exercised, not assumed.
41
+ **No gate, no proceed.** If the gate is not satisfied, Claude states exactly what is missing, stops, and waits. Security is a **cross-cutting gate that cannot be waved off** any change touching a trust boundary (input / auth / token / file / SQL / shell / crypto / secret / network / access control / new dependency) trips it, and the abuse case is *exercised, not assumed*.
64
42
 
65
43
  ```mermaid
66
44
  flowchart LR
67
- PLAN["#plan"] --> G0["GATE 0<br/>outcome + size + DoD"]
68
- DBG["#dbg"] --> G1["GATE 1<br/>reliable repro"]
69
- FT["#ft"] --> G2["GATE 2<br/>need + 3 scenarios + scope"]
70
- RF["#rf"] --> G3["GATE 3<br/>safety net + smell + pin"]
71
- RV["#rv"] --> G4["GATE 4<br/>outsider trace + cite"]
72
- PM["#pm"] --> G5["GATE 5<br/>repro + cause + fix + validation"]
73
- G0 --> D{Gate satisfied?}
74
- G1 --> D
75
- G2 --> D
76
- G3 --> D
77
- G4 --> D
78
- G5 --> D
79
- D -->|No| B["BLOCKED — state what's missing, stop"]
80
- D -->|Yes| P["Proceed to the mode's steps"]
81
- SEC["SECURITY GATE<br/>cross-cutting, cannot be waived"] -.-> P
45
+ REQ["request / command"] --> ROUTE["pick mode + gate"]
46
+ ROUTE --> G{"gate satisfied?<br/>(info + approval)"}
47
+ G -->|No| B["BLOCKED name what's missing, stop"]
48
+ G -->|Yes| P["proceed + VERIFIED block"]
49
+ SEC["security gate · cannot be waived"] -.-> P
82
50
  ```
83
51
 
52
+ A user saying *"just do it"* / *"ทำเลย"* / *"trust me"* is **not** authorization to break a rule. The rule is restated and the work stops until the gate is genuinely satisfied. This is the **zero-drift** core.
53
+
84
54
  ---
85
55
 
86
56
  ## VERIFIED discipline + mechanical enforcement
87
57
 
88
- The skill never claims success it has not observed. Any claim-word — *done*, *works*, *complete*, `เสร็จ`, `เรียบร้อย` — must be backed by a `VERIFIED:` block (the actual commands run + their actual output) **immediately above it**. The escape hatch is `NOT VERIFIED:`, which lists every skipped step, the reason, and the concrete checks the user must perform. Static checks (type-check, lint) do not count as verification.
58
+ The skill never claims success it has not observed. Any claim-word — *done*, *works*, *complete*, `เสร็จ`, `เรียบร้อย` — must be backed by a `VERIFIED:` block (the **actual** commands run + their **actual** output) immediately above it. The escape hatch is `NOT VERIFIED:`, which lists every skipped step, the reason, and the concrete checks you must perform. Static checks (type-check, lint) do **not** count as verification.
89
59
 
90
- This is not left to willpower. A **Stop hook** (`hooks/verify-guard.sh`) blocks the turn from ending when a ppdevskill response carries a banner and a claim-word but no verification block, and feeds the reason back so the model fixes it in the same turn. It is **self-scoping** (fires only on responses with a ppdevskill banner — other workflows are untouched), **fail-open** (any error → allow; a discipline hook must never brick a session), and catches **Thai claim-words too**.
60
+ This is not left to willpower. A **Stop hook** (`hooks/verify-guard.sh`) blocks the turn from ending when a ppdevskill response carries a banner + a claim-word but no verification block, and feeds the reason back so the model fixes it in the same turn. It is **self-scoping** (fires only on ppdevskill responses — other workflows untouched), **fail-open** (any error → allow; a discipline hook must never brick a session), and catches **Thai claim-words too**.
91
61
 
92
62
  ```mermaid
93
63
  flowchart TD
94
- R["Assistant reply at turn end"] --> H["verify-guard.sh (Stop hook)"]
95
- H --> S{"ppdevskill banner present?"}
96
- S -->|No| A["Allow — not a ppdevskill turn"]
64
+ R["reply at turn end"] --> H["verify-guard.sh (Stop hook)"]
65
+ H --> S{"ppdevskill banner?"}
66
+ S -->|No| A["allow — not our turn"]
97
67
  S -->|Yes| V{"VERIFIED: / NOT VERIFIED: block?"}
98
68
  V -->|Yes| A
99
69
  V -->|No| C{"claim-word? (done / works / เสร็จ ...)"}
100
70
  C -->|No| A
101
- C -->|Yes| BL["Block — feed reason back, fix this turn"]
71
+ C -->|Yes| BL["block — feed reason back, fix this turn"]
102
72
  H -.->|"any error / no jq / no banner"| A
103
73
  ```
104
74
 
75
+ **Ledger — anti-drift persistence.** `#plan` / `#dbg` / `#ft` / `#rf` persist their gate state (slice table, hypotheses, scope) to `.ppdev/<mode>-ledger.md`, so it **survives context compaction** — Claude re-anchors from the file, not from memory. It is bounded to one active unit (overwrite on a new unit, mark `[x]` in place, clear when done).
76
+
105
77
  ---
106
78
 
107
- ## Ledger anti-drift persistence
79
+ ## Does it actually change anything? (benchmark)
80
+
81
+ Measured on a 27-trial A/B benchmark — **same model both arms**, identical prompts, with-skill vs without-skill, across all 7 modes + 3 security classes. The skill does not make a weak model smart; it makes a capable model **consistently, mechanically disciplined**.
82
+
83
+ | Behavior | Without skill | With skill |
84
+ |---|---:|---:|
85
+ | Wrote code with no plan/approval | **64%** of turns | **0%** |
86
+ | Claimed "works/done" without running it | **100%** (2/2) | **0%** |
87
+ | Enumerated abuse-cases on a boundary task | **0%** (0/7) | **100%** (6/6) |
88
+ | Guessed a root cause before a repro existed | yes | **no** |
89
+ | Mixed a bug-fix into a refactor diff | yes | **no** |
90
+ | Discipline banner + gate state every reply | 0% | **100%** |
91
+
92
+ The underrated win is **consistency**: the with-skill arm has near-zero variance; the baseline is disciplined only some of the time, which is exactly what you can't trust in production.
93
+
94
+ ---
95
+
96
+ ## Pros & cons — the honest list
97
+
98
+ **Pros**
108
99
 
109
- `#plan` / `#dbg` / `#ft` / `#rf` persist their gate state (slice table, hypotheses, scope) to `.ppdev/<mode>-ledger.md` in the working repo, so it **survives context compaction** — Claude re-anchors from the file, not from memory. Add `.ppdev/` to that repo's `.gitignore`.
100
+ - **Kills "fake done."** Every claim is backed by real commands + real output, or an explicit `NOT VERIFIED:`.
101
+ - ✅ **No code from thin air.** No gate, no code; incomplete info → it asks, never guesses.
102
+ - ✅ **Security is non-negotiable.** Trust-boundary changes always go through the OWASP gate, and it cannot be waved off.
103
+ - ✅ **Finds the root cause.** Demands a repro before hypothesizing; fixes the cause, not the symptom.
104
+ - ✅ **Clean separation.** Behavior change and refactor never share a diff.
105
+ - ✅ **Mechanical, not aspirational.** The Stop hook enforces verification; the ledger fights drift in long sessions.
106
+ - ✅ **Consistent floor.** Near-zero variance — it behaves the same on turn 50 as on turn 1.
107
+ - ✅ **An honest stance.** No flattery, no hedging, no rubber-stamp "LGTM" — an opinionated recommendation with tradeoffs.
108
+ - ✅ **Plays nice.** The hook is self-scoping and fail-open: it never touches other workflows and never bricks a session.
110
109
 
111
- The ledger is **bounded to one active unit, never append-only**: a new unit overwrites the file, a finished slice is marked `[x]` in place, a replan edits the table in place, and a met definition-of-done clears the file. Steady-state size is one unit's worth (a slice table is ~4–12 rows). If a ledger grows past that, it is being mis-appended — truncate it to the current unit.
110
+ **Cons** *(so you can decide with eyes open)*
111
+
112
+ - ⚠️ **It costs more per turn.** ~1.8× tokens and latency on a *cold* turn (it reads its own rules). This amortizes over a session, but it is real upfront cost.
113
+ - ⚠️ **It adds friction to trivial work.** A one-line rename or a throwaway script still meets some ceremony. For spikes / REPL experiments, that friction is not worth it.
114
+ - ⚠️ **It replies in Thai by design.** Technical terms stay English, but the prose is Thai. If you need English replies, this is a mismatch.
115
+ - ⚠️ **The Stop hook needs `jq`.** No `jq`, the hook fails open (so nothing breaks) but you lose the mechanical net.
116
+ - ⚠️ **It pushes back.** It will ask for a repro, acceptance scenarios, or a security abuse-case before writing code. If you just want code *now*, that refusal is friction — by design ("refusal is a feature").
117
+ - ⚠️ **Benchmark caveat.** Gains are measured against the *same* model, so the value is *consistency and guarantees*, not raw capability. Multi-turn anti-drift benefits are real but harder to quantify.
118
+
119
+ **Bottom line:** use it for production code, anything touching auth / payments / data deletion, PR reviews, and long multi-day arcs. Skip it for throwaway scripts and quick learning spikes.
112
120
 
113
121
  ---
114
122
 
@@ -122,7 +130,7 @@ npx ppdevskill install --with-hook # wire the Stop hook immediately, no promp
122
130
  npx ppdevskill install --no-hook # don't touch settings.json (prints the snippet to paste)
123
131
  ```
124
132
 
125
- The installer backs up any existing install first, `chmod +x` the hook, and never clobbers unrelated keys in `settings.json`. Restart Claude Code afterward.
133
+ The installer backs up any existing install, `chmod +x` the hook, and never clobbers unrelated keys in `settings.json`. Restart Claude Code afterward. The hook requires `jq`.
126
134
 
127
135
  **Or git clone:**
128
136
 
@@ -130,45 +138,11 @@ The installer backs up any existing install first, `chmod +x` the hook, and neve
130
138
  git clone https://github.com/Kamisadev/ppdevskill.git ~/.claude/skills/ppdevskill
131
139
  ```
132
140
 
133
- **Enable the hook manually** (if you used `--no-hook` or cloned): merge `hooks/settings.snippet.json` into `~/.claude/settings.json` (global) or `.claude/settings.json` (per project) — if a `hooks` key already exists, add the `Stop` entry, **do not overwrite**. The hook requires `jq`.
134
-
135
- ```bash
136
- chmod +x ~/.claude/skills/ppdevskill/hooks/verify-guard.sh
137
- ```
138
-
139
- File layout:
140
-
141
- ```
142
- ppdevskill/
143
- ├── SKILL.md # main hub — rules, principles, routing
144
- ├── references/
145
- │ ├── plan.md # GATE 0 + steps for the ultra-plan orchestrator
146
- │ ├── dbg.md # gate + steps for debug
147
- │ ├── ft.md # gate + steps for feature
148
- │ ├── rf.md # gate + steps for refactor
149
- │ ├── rv.md # gate + steps for review
150
- │ ├── pm.md # gate + steps for post-mortem
151
- │ ├── sec.md # security gate (OWASP Top 10)
152
- │ ├── verify.md # verification recipes per work type
153
- │ └── git-auto.md # #cp commit / push procedure
154
- ├── hooks/
155
- │ ├── verify-guard.sh # Stop hook — mechanically enforces the VERIFIED block
156
- │ └── settings.snippet.json # config to merge into settings.json
157
- └── examples/ # one worked example per mode — read on demand
158
- ├── plan.md # ultra-plan example (GATE 0 → slice table)
159
- ├── dbg.md # debug example (gate → VERIFIED)
160
- ├── ft.md # feature example
161
- ├── rf.md # refactor example
162
- ├── rv.md # review example
163
- ├── pm.md # post-mortem example
164
- └── cp.md # commit / push example
165
- ```
166
-
167
141
  ---
168
142
 
169
143
  ## Usage
170
144
 
171
- Type a mode command in chat, or let the triggers fire on their own. (Realistic input is in Thai — the skill is built for a Thai-replying workflow.)
145
+ Type a mode command in chat, or let the triggers fire on their own:
172
146
 
173
147
  ```
174
148
  #dbg API /users คืน 500 ตอน login
@@ -177,38 +151,21 @@ Type a mode command in chat, or let the triggers fire on their own. (Realistic i
177
151
  #pp <describe the task> ← let Claude pick the mode
178
152
  ```
179
153
 
180
- Claude replies in Thai (technical terms / function names / paths / errors stay English), with a one-line banner stating the mode and gate status on every response, e.g.:
181
-
182
- ```
183
- > #dbg | GATE 1 PASS | STEP 1.2
184
- ```
154
+ Every reply carries a one-line banner stating mode + gate status, e.g. `> #dbg | GATE 1 PASS | STEP 1.2`.
185
155
 
186
156
  ---
187
157
 
188
- ## What it buys you
158
+ ## Thank you 🙏 — no strings attached
189
159
 
190
- - **No code from thin air** no gate, no code; incomplete information means brainstorm first, never guess.
191
- - **Fix the right spot** — find the root cause, don't patch the symptom.
192
- - **No over-engineering** — YAGNI: no abstraction before its time.
193
- - **An honest stance** — no flattery, no hedging, no rubber-stamps; an opinionated recommendation with the tradeoffs.
194
- - **No hollow "it's done"** — every *done / works / เสร็จ* is backed by a `VERIFIED:` block (real commands + real output).
195
- - **Security first** — touching a trust boundary always goes through the security gate (OWASP Top 10), and it cannot be waved off.
196
- - **Enforced by mechanism, not just by asking** — the Stop hook enforces the VERIFIED block; the ledger persists to disk to fight drift in long sessions.
197
- - **Worked examples + an automatic commit offer** — `examples/<mode>.md` shows each mode from gate to VERIFIED block; once work is verified, the skill **offers `#cp`** on its own (never auto-commits, never offers on broken work).
198
- - **Clean separation of concerns** — behavior change and refactor never share a diff; one response, one mode.
160
+ If you are reading this, you might be about to try this skill and that already means a lot.
199
161
 
200
- ```mermaid
201
- flowchart TD
202
- P0["#plan GATE 0"] --> ST["slice table → .ppdev/plan-ledger.md"]
203
- ST --> S1["slice 1 its mode (full gate)"]
204
- S1 --> Vf{"VERIFIED?"}
205
- Vf -->|"No"| S1
206
- Vf -->|"Yes"| CP["offer #cp commit"]
207
- CP --> NEXT["next slice ..."]
208
- NEXT --> DOD{"arc DoD met?"}
209
- DOD -->|"No"| S1
210
- DOD -->|"Yes"| RVW["#rv over the whole arc"]
211
- ```
162
+ **Even a single download is real encouragement to me.** It tells me this skill is useful to someone out there, and that is the whole reason I keep building it. You don't owe me anything: use it for months on a serious codebase, or just `npx` it once to see how it feels and walk away. Both are completely fine. **No commitment, no lock-in, no pressure.**
163
+
164
+ > ขอบคุณจริง สำหรับการดาวน์โหลดและทดลองใช้ครับ 🙏
165
+ > แค่ **1 download** ก็เป็นกำลังใจดี ให้ผมแล้วว่า skill นี้มีประโยชน์ต่อใครสักคน
166
+ > จะใช้ยาว ๆ กับงานจริง หรือลองเล่นแล้วเลิกก็ได้ — **ไม่ผูกมัดอะไรทั้งนั้น** ขอบคุณที่ให้โอกาสครับ
167
+
168
+ If it saved you from one "it works" that didn't, it did its job. ❤️
212
169
 
213
170
  ---
214
171
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ppdevskill",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Unified engineering-partner workflow for Claude Code — debug, build, refactor, review, post-mortem — with hard gates and mechanical (hook-enforced) verification discipline.",
5
5
  "bin": {
6
6
  "ppdevskill": "bin/cli.js"