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.
- package/README.md +91 -134
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,114 +1,122 @@
|
|
|
1
|
-
# ppdevskill —
|
|
1
|
+
# ppdevskill — your engineering partner, not a code vending machine
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/ppdevskill)
|
|
4
|
+
[](./LICENSE)
|
|
4
5
|
|
|
5
|
-
>
|
|
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
|
-
|
|
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
|
-
##
|
|
14
|
+
## The problem it solves
|
|
18
15
|
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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)
|
|
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
|
|
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["
|
|
95
|
-
H --> S{"ppdevskill banner
|
|
96
|
-
S -->|No| A["
|
|
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["
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
##
|
|
158
|
+
## Thank you 🙏 — no strings attached
|
|
189
159
|
|
|
190
|
-
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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.
|
|
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"
|