@iceinvein/agent-skills 0.1.34 → 0.1.36

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 (42) hide show
  1. package/README.md +19 -19
  2. package/package.json +2 -1
  3. package/skills/bounded-context-auditor/skill.json +8 -3
  4. package/skills/cognitive-load-auditor/skill.json +8 -3
  5. package/skills/cohesion-analyzer/skill.json +8 -3
  6. package/skills/complexity-accountant/skill.json +8 -3
  7. package/skills/composability-auditor/skill.json +8 -3
  8. package/skills/contract-enforcer/skill.json +8 -3
  9. package/skills/coupling-auditor/skill.json +8 -3
  10. package/skills/cover-letter/skill.json +26 -0
  11. package/skills/cover-letter-audit/skill.json +26 -0
  12. package/skills/cover-letter-persona/skill.json +26 -0
  13. package/skills/cover-letter-rewrite/skill.json +26 -0
  14. package/skills/cover-letter-write/skill.json +26 -0
  15. package/skills/cqs-auditor/skill.json +8 -3
  16. package/skills/demeter-enforcer/skill.json +8 -3
  17. package/skills/dependency-direction-auditor/skill.json +8 -3
  18. package/skills/design-review/SKILL.md +1 -1
  19. package/skills/design-review/skill.json +8 -3
  20. package/skills/error-strategist/skill.json +8 -3
  21. package/skills/event-design-reviewer/skill.json +8 -3
  22. package/skills/evolution-analyzer/skill.json +8 -3
  23. package/skills/gestalt-reviewer/skill.json +8 -3
  24. package/skills/idempotency-guardian/skill.json +8 -3
  25. package/skills/index.json +82 -52
  26. package/skills/integration-pattern-auditor/skill.json +8 -3
  27. package/skills/magpie/README.md +2 -2
  28. package/skills/magpie/SKILL.md +26 -12
  29. package/skills/magpie/scripts/__tests__/preflight.test.ts +15 -3
  30. package/skills/magpie/scripts/__tests__/render-progress.test.ts +1 -1
  31. package/skills/magpie/scripts/preflight.ts +13 -2
  32. package/skills/magpie/scripts/render-progress.ts +2 -2
  33. package/skills/magpie/scripts/setup-cmd.ts +12 -1
  34. package/skills/magpie/skill.json +2 -2
  35. package/skills/module-secret-auditor/skill.json +8 -3
  36. package/skills/port-adapter-auditor/skill.json +8 -3
  37. package/skills/rams-design-audit/skill.json +8 -3
  38. package/skills/seam-finder/skill.json +8 -3
  39. package/skills/simplicity-razor/skill.json +8 -3
  40. package/skills/temporal-coupling-detector/skill.json +8 -3
  41. package/skills/type-driven-designer/skill.json +8 -3
  42. package/skills/unidirectional-flow-enforcer/skill.json +8 -3
package/skills/index.json CHANGED
@@ -1,9 +1,9 @@
1
1
  [
2
2
  {
3
3
  "name": "bounded-context-auditor",
4
- "description": "Evans-inspired bounded context analysis — detect linguistic fractures, draw context maps, identify leaking language and shared model pollution",
4
+ "description": "Evans-inspired bounded context analysis: detect linguistic fractures, draw context maps, identify leaking language and shared model pollution",
5
5
  "type": "prompt",
6
- "version": "1.0.0",
6
+ "version": "1.0.1",
7
7
  "applies": [
8
8
  "domain"
9
9
  ],
@@ -22,9 +22,9 @@
22
22
  },
23
23
  {
24
24
  "name": "cognitive-load-auditor",
25
- "description": "Jeff Johnson-inspired cognitive load analysis — evaluate UI against Miller's Law, Hick's Law, Fitts's Law, and working memory limits",
25
+ "description": "Jeff Johnson-inspired cognitive load analysis: evaluate UI against Miller's Law, Hick's Law, Fitts's Law, and working memory limits",
26
26
  "type": "prompt",
27
- "version": "1.0.0",
27
+ "version": "1.0.1",
28
28
  "applies": [
29
29
  "ui"
30
30
  ],
@@ -32,9 +32,9 @@
32
32
  },
33
33
  {
34
34
  "name": "cohesion-analyzer",
35
- "description": "Constantine & Yourdon-inspired cohesion analysis — classify module focus on the 7-level spectrum, find split lines, reduce mixed responsibilities",
35
+ "description": "Constantine & Yourdon-inspired cohesion analysis: classify module focus on the 7-level spectrum, find split lines, reduce mixed responsibilities",
36
36
  "type": "prompt",
37
- "version": "1.0.0",
37
+ "version": "1.0.1",
38
38
  "applies": [
39
39
  "architecture"
40
40
  ],
@@ -42,9 +42,9 @@
42
42
  },
43
43
  {
44
44
  "name": "complexity-accountant",
45
- "description": "Ousterhout-inspired complexity analysis — deep vs shallow modules, complexity budget, justified abstractions",
45
+ "description": "Ousterhout-inspired complexity analysis: deep vs shallow modules, complexity budget, justified abstractions",
46
46
  "type": "prompt",
47
- "version": "1.0.0",
47
+ "version": "1.0.1",
48
48
  "applies": [
49
49
  "any"
50
50
  ],
@@ -52,9 +52,9 @@
52
52
  },
53
53
  {
54
54
  "name": "composability-auditor",
55
- "description": "Unix Philosophy-inspired composability analysis — identify reuse blockers, decompose self-sufficient units into composable pieces with standard interfaces",
55
+ "description": "Unix Philosophy-inspired composability analysis: identify reuse blockers, decompose self-sufficient units into composable pieces with standard interfaces",
56
56
  "type": "prompt",
57
- "version": "1.0.0",
57
+ "version": "1.0.1",
58
58
  "applies": [
59
59
  "any"
60
60
  ],
@@ -62,9 +62,9 @@
62
62
  },
63
63
  {
64
64
  "name": "contract-enforcer",
65
- "description": "Meyer-inspired Design by Contract — preconditions, postconditions, invariants, and failure contracts for non-trivial functions",
65
+ "description": "Meyer-inspired Design by Contract: preconditions, postconditions, invariants, and failure contracts for non-trivial functions",
66
66
  "type": "prompt",
67
- "version": "1.0.0",
67
+ "version": "1.0.1",
68
68
  "applies": [
69
69
  "any"
70
70
  ],
@@ -72,19 +72,49 @@
72
72
  },
73
73
  {
74
74
  "name": "coupling-auditor",
75
- "description": "Constantine & Yourdon-inspired coupling analysis — classify, measure, and reduce interdependence between modules",
75
+ "description": "Constantine & Yourdon-inspired coupling analysis: classify, measure, and reduce interdependence between modules",
76
76
  "type": "prompt",
77
- "version": "1.0.0",
77
+ "version": "1.0.1",
78
78
  "applies": [
79
79
  "architecture"
80
80
  ],
81
81
  "quick": true
82
82
  },
83
+ {
84
+ "name": "cover-letter",
85
+ "description": "Cover letter suite router. Dispatches to write, audit, rewrite, or persona subcommands and shares file I/O (PDF, DOCX, MD/MDX, URL), output formats, and writing conventions across the suite",
86
+ "type": "prompt",
87
+ "version": "1.0.0"
88
+ },
89
+ {
90
+ "name": "cover-letter-audit",
91
+ "description": "Scores a cover letter on 100 points across content/fit, structure, voice/humanness, and correctness; detects AI-generated-content signals and produces a prioritized fix list",
92
+ "type": "prompt",
93
+ "version": "1.0.0"
94
+ },
95
+ {
96
+ "name": "cover-letter-persona",
97
+ "description": "Reusable writing personas built on the NNGroup 4-dimension tone framework, adapted for professional correspondence and used by cover-letter-write and cover-letter-rewrite",
98
+ "type": "prompt",
99
+ "version": "1.0.0"
100
+ },
101
+ {
102
+ "name": "cover-letter-rewrite",
103
+ "description": "Audit-driven targeted rewrite of an existing cover letter. Focus modes: humanize, align, tighten, structure, tone; preserves voice where it already works",
104
+ "type": "prompt",
105
+ "version": "1.0.0"
106
+ },
107
+ {
108
+ "name": "cover-letter-write",
109
+ "description": "Generates a cover letter from a resume and job description. Outputs markdown, DOCX, and PDF; enforces human prose, maps every claim to a resume bullet, and covers top JD requirements without keyword stuffing",
110
+ "type": "prompt",
111
+ "version": "1.0.0"
112
+ },
83
113
  {
84
114
  "name": "cqs-auditor",
85
- "description": "Meyer-inspired Command-Query Separation — classify functions as commands or queries, detect mixed violations, separate side effects from return values",
115
+ "description": "Meyer-inspired Command-Query Separation: classify functions as commands or queries, detect mixed violations, separate side effects from return values",
86
116
  "type": "prompt",
87
- "version": "1.0.0",
117
+ "version": "1.0.1",
88
118
  "applies": [
89
119
  "architecture"
90
120
  ],
@@ -92,9 +122,9 @@
92
122
  },
93
123
  {
94
124
  "name": "demeter-enforcer",
95
- "description": "Lieberherr-inspired Law of Demeter analysis — detect chain violations, parameter drilling, and hidden traversal; fix with tell-don't-ask or parameter narrowing",
125
+ "description": "Lieberherr-inspired Law of Demeter analysis: detect chain violations, parameter drilling, and hidden traversal; fix with tell-don't-ask or parameter narrowing",
96
126
  "type": "prompt",
97
- "version": "1.0.0",
127
+ "version": "1.0.1",
98
128
  "applies": [
99
129
  "architecture"
100
130
  ],
@@ -102,9 +132,9 @@
102
132
  },
103
133
  {
104
134
  "name": "dependency-direction-auditor",
105
- "description": "Martin-inspired dependency direction analysis — trace imports across layers, classify violations by severity, recommend inversion",
135
+ "description": "Martin-inspired dependency direction analysis: trace imports across layers, classify violations by severity, recommend inversion",
106
136
  "type": "prompt",
107
- "version": "1.0.0",
137
+ "version": "1.0.1",
108
138
  "applies": [
109
139
  "architecture"
110
140
  ],
@@ -112,9 +142,9 @@
112
142
  },
113
143
  {
114
144
  "name": "design-review",
115
- "description": "Brooks-inspired design integrity review — tests conceptual integrity, constraint exploitation, removal discipline, and scope control",
145
+ "description": "Brooks-inspired design integrity review: tests conceptual integrity, constraint exploitation, removal discipline, and scope control",
116
146
  "type": "prompt",
117
- "version": "1.0.0",
147
+ "version": "1.0.1",
118
148
  "applies": [
119
149
  "any"
120
150
  ],
@@ -122,9 +152,9 @@
122
152
  },
123
153
  {
124
154
  "name": "error-strategist",
125
- "description": "Duffy & Abrahams-inspired error handling — classify errors (bug/recoverable/fatal), assign safety guarantees, design recovery boundaries",
155
+ "description": "Duffy & Abrahams-inspired error handling: classify errors (bug/recoverable/fatal), assign safety guarantees, design recovery boundaries",
126
156
  "type": "prompt",
127
- "version": "1.0.0",
157
+ "version": "1.0.1",
128
158
  "applies": [
129
159
  "errors"
130
160
  ],
@@ -132,9 +162,9 @@
132
162
  },
133
163
  {
134
164
  "name": "event-design-reviewer",
135
- "description": "Evans/Vernon/Dahan-inspired event design — domain-meaningful naming, fat payloads, schema evolution, and the domain expert test",
165
+ "description": "Evans/Vernon/Dahan-inspired event design: domain-meaningful naming, fat payloads, schema evolution, and the domain expert test",
136
166
  "type": "prompt",
137
- "version": "1.0.0",
167
+ "version": "1.0.1",
138
168
  "applies": [
139
169
  "integration",
140
170
  "domain"
@@ -143,9 +173,9 @@
143
173
  },
144
174
  {
145
175
  "name": "evolution-analyzer",
146
- "description": "Lehman-inspired software evolution analysis — trajectory assessment, debt visibility, and change impact on system health",
176
+ "description": "Lehman-inspired software evolution analysis: trajectory assessment, debt visibility, and change impact on system health",
147
177
  "type": "prompt",
148
- "version": "1.0.0",
178
+ "version": "1.0.1",
149
179
  "applies": [
150
180
  "any"
151
181
  ],
@@ -153,9 +183,9 @@
153
183
  },
154
184
  {
155
185
  "name": "gestalt-reviewer",
156
- "description": "Gestalt-inspired visual perception audit — proximity, similarity, closure, continuity, and figure-ground analysis for UI layouts",
186
+ "description": "Gestalt-inspired visual perception audit: proximity, similarity, closure, continuity, and figure-ground analysis for UI layouts",
157
187
  "type": "prompt",
158
- "version": "1.0.0",
188
+ "version": "1.0.1",
159
189
  "applies": [
160
190
  "ui"
161
191
  ],
@@ -163,9 +193,9 @@
163
193
  },
164
194
  {
165
195
  "name": "idempotency-guardian",
166
- "description": "Helland-inspired idempotency analysis — classify mutation points, check protection mechanisms, evaluate side effect safety for retry-safe systems",
196
+ "description": "Helland-inspired idempotency analysis: classify mutation points, check protection mechanisms, evaluate side effect safety for retry-safe systems",
167
197
  "type": "prompt",
168
- "version": "1.0.0",
198
+ "version": "1.0.1",
169
199
  "applies": [
170
200
  "integration"
171
201
  ],
@@ -179,9 +209,9 @@
179
209
  },
180
210
  {
181
211
  "name": "integration-pattern-auditor",
182
- "description": "Hohpe & Woolf-inspired messaging analysis — name the integration pattern, verify delivery guarantees, identify missing infrastructure",
212
+ "description": "Hohpe & Woolf-inspired messaging analysis: name the integration pattern, verify delivery guarantees, identify missing infrastructure",
183
213
  "type": "prompt",
184
- "version": "1.0.0",
214
+ "version": "1.0.1",
185
215
  "applies": [
186
216
  "integration"
187
217
  ],
@@ -189,15 +219,15 @@
189
219
  },
190
220
  {
191
221
  "name": "magpie",
192
- "description": "Interactive PR review pipeline. Runs five parallel specialist subagents (security, bugs, performance, code-smells, architecture), dedupes findings, applies a critic rubric, peer-reviews via codex exec, and serves an interactive HTML report for selecting findings to post via gh. Bundles a Bun CLI installed onto PATH via the skill's postinstall step. Use when the user asks to review a GitHub pull request.",
222
+ "description": "Interactive PR review pipeline. Runs five parallel specialist subagents (security, bugs, performance, code-smells, architecture), dedupes findings, applies a critic rubric, peer-reviews via codex exec (falling back to a Claude second opinion when codex is unavailable), and serves an interactive HTML report for selecting findings to post via gh. Bundles a Bun CLI installed onto PATH via the skill's postinstall step. Use when the user asks to review a GitHub pull request.",
193
223
  "type": "prompt",
194
- "version": "0.5.1"
224
+ "version": "0.6.0"
195
225
  },
196
226
  {
197
227
  "name": "module-secret-auditor",
198
- "description": "Parnas-inspired information hiding analysis — module boundaries drawn by change-reason, not by noun or technical layer",
228
+ "description": "Parnas-inspired information hiding analysis: module boundaries drawn by change-reason, not by noun or technical layer",
199
229
  "type": "prompt",
200
- "version": "1.0.0",
230
+ "version": "1.0.1",
201
231
  "applies": [
202
232
  "architecture"
203
233
  ],
@@ -205,9 +235,9 @@
205
235
  },
206
236
  {
207
237
  "name": "port-adapter-auditor",
208
- "description": "Cockburn-inspired hexagonal architecture analysis — identify ports and adapters, classify boundary health, ensure core testability and swappability",
238
+ "description": "Cockburn-inspired hexagonal architecture analysis: identify ports and adapters, classify boundary health, ensure core testability and swappability",
209
239
  "type": "prompt",
210
- "version": "1.0.0",
240
+ "version": "1.0.1",
211
241
  "applies": [
212
242
  "architecture"
213
243
  ],
@@ -215,9 +245,9 @@
215
245
  },
216
246
  {
217
247
  "name": "rams-design-audit",
218
- "description": "Dieter Rams-inspired design audit — every visual element must earn its presence, less but better, clarity through restraint",
248
+ "description": "Dieter Rams-inspired design audit: every visual element must earn its presence, less but better, clarity through restraint",
219
249
  "type": "prompt",
220
- "version": "1.0.0",
250
+ "version": "1.0.1",
221
251
  "applies": [
222
252
  "ui"
223
253
  ],
@@ -225,9 +255,9 @@
225
255
  },
226
256
  {
227
257
  "name": "seam-finder",
228
- "description": "Feathers-inspired legacy code modification — find seams, make minimal incisions, preserve existing behavior",
258
+ "description": "Feathers-inspired legacy code modification: find seams, make minimal incisions, preserve existing behavior",
229
259
  "type": "prompt",
230
- "version": "1.0.0",
260
+ "version": "1.0.1",
231
261
  "applies": [
232
262
  "legacy"
233
263
  ],
@@ -235,9 +265,9 @@
235
265
  },
236
266
  {
237
267
  "name": "simplicity-razor",
238
- "description": "Hickey-inspired simplicity analysis — simple vs easy, complecting detection, strand decomposition",
268
+ "description": "Hickey-inspired simplicity analysis: simple vs easy, complecting detection, strand decomposition",
239
269
  "type": "prompt",
240
- "version": "1.0.0",
270
+ "version": "1.0.1",
241
271
  "applies": [
242
272
  "any"
243
273
  ],
@@ -245,9 +275,9 @@
245
275
  },
246
276
  {
247
277
  "name": "temporal-coupling-detector",
248
- "description": "Hidden ordering dependency analysis — detect two-phase init, method order dependencies, invisible preconditions, and resource lifecycle violations; fix with types, parameters, and factory patterns",
278
+ "description": "Hidden ordering dependency analysis: detect two-phase init, method order dependencies, invisible preconditions, and resource lifecycle violations; fix with types, parameters, and factory patterns",
249
279
  "type": "prompt",
250
- "version": "1.0.0",
280
+ "version": "1.0.1",
251
281
  "applies": [
252
282
  "any"
253
283
  ],
@@ -261,9 +291,9 @@
261
291
  },
262
292
  {
263
293
  "name": "type-driven-designer",
264
- "description": "Wlaschin & Minsky-inspired type design — make illegal states unrepresentable through branded types, discriminated unions, and domain-encoded constraints",
294
+ "description": "Wlaschin & Minsky-inspired type design: make illegal states unrepresentable through branded types, discriminated unions, and domain-encoded constraints",
265
295
  "type": "prompt",
266
- "version": "1.0.0",
296
+ "version": "1.0.1",
267
297
  "applies": [
268
298
  "any"
269
299
  ],
@@ -271,9 +301,9 @@
271
301
  },
272
302
  {
273
303
  "name": "unidirectional-flow-enforcer",
274
- "description": "Elm Architecture-inspired data flow analysis — enforce unidirectional state flow, detect bidirectional mutations, trace state lifecycle in UI applications",
304
+ "description": "Elm Architecture-inspired data flow analysis: enforce unidirectional state flow, detect bidirectional mutations, trace state lifecycle in UI applications",
275
305
  "type": "prompt",
276
- "version": "1.0.0",
306
+ "version": "1.0.1",
277
307
  "applies": [
278
308
  "ui"
279
309
  ],
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "integration-pattern-auditor",
3
- "version": "1.0.0",
4
- "description": "Hohpe & Woolf-inspired messaging analysis — name the integration pattern, verify delivery guarantees, identify missing infrastructure",
3
+ "version": "1.0.1",
4
+ "description": "Hohpe & Woolf-inspired messaging analysis: name the integration pattern, verify delivery guarantees, identify missing infrastructure",
5
5
  "author": "iceinvein",
6
6
  "type": "prompt",
7
- "tools": ["claude", "cursor", "codex", "gemini"],
7
+ "tools": [
8
+ "claude",
9
+ "cursor",
10
+ "codex",
11
+ "gemini"
12
+ ],
8
13
  "files": {
9
14
  "prompt": "SKILL.md"
10
15
  },
@@ -4,14 +4,14 @@ Interactive Claude Code skill that runs a multi-stage PR review pipeline inside
4
4
 
5
5
  ## What it does
6
6
 
7
- Given a GitHub PR number, dispatches five specialist subagents in parallel (security, bugs, performance, code-smells, architecture), dedupes their findings, applies a critic rubric, peer-reviews via `codex exec`, serves an interactive HTML report, and posts the findings the user selects via `gh`.
7
+ Given a GitHub PR number, dispatches five specialist subagents in parallel (security, bugs, performance, code-smells, architecture), dedupes their findings, applies a critic rubric, peer-reviews via `codex exec` (falling back to a Claude second-opinion subagent when codex is unavailable), serves an interactive HTML report, and posts the findings the user selects via `gh`.
8
8
 
9
9
  ## Requirements
10
10
 
11
11
  - `bun` on PATH (https://bun.sh)
12
12
  - `gh` on PATH, authenticated (`gh auth status`)
13
- - `codex` on PATH, authenticated
14
13
  - `git` on PATH
14
+ - `codex` on PATH, authenticated (optional; if absent the peer-review stage falls back to a Claude second-opinion subagent)
15
15
 
16
16
  ## Install
17
17
 
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: magpie
3
- description: Interactive PR review pipeline. Runs five parallel specialist subagents (security, bugs, performance, code-smells, architecture), dedupes findings, applies a critic rubric, peer-reviews via codex exec, and serves an interactive HTML report for selecting findings to post via gh. Use when the user asks to review a GitHub pull request.
3
+ description: Interactive PR review pipeline. Runs five parallel specialist subagents (security, bugs, performance, code-smells, architecture), dedupes findings, applies a critic rubric, peer-reviews via codex exec (falling back to a Claude second opinion when codex is unavailable), and serves an interactive HTML report for selecting findings to post via gh. Use when the user asks to review a GitHub pull request.
4
4
  ---
5
5
 
6
6
  # Magpie
7
7
 
8
8
  ## Prerequisites
9
9
 
10
- The skill pre-flights `bun`, `gh`, `codex`, `git`. If any are missing the run aborts with a single install hint line.
10
+ The skill pre-flights `bun`, `gh`, `git` (required) and `codex` (optional). If a required binary is missing the run aborts with a single install hint line. `codex` is the preferred peer reviewer, but it is optional: if it is missing the run continues and the peer-review stage falls back to a Claude second-opinion subagent (setup prints a one-line notice and logs `{stage: preflight, status: done, missingOptional: ["codex"]}`).
11
11
 
12
12
  ## Stage walkthrough
13
13
 
@@ -147,17 +147,23 @@ Read `$RUN_DIR/findings.deduped.json`. Apply the critic rubric from this SKILL.m
147
147
 
148
148
  ### 6. Peer review
149
149
 
150
- Build the peer-review prompt by taking the `magpie-peer-review` block from this SKILL.md and substituting the placeholders listed in its `## Substitute before use` preamble. Write the substituted prompt to `$RUN_DIR/peer-prompt.md`. Then run codex with the prompt piped on stdin:
150
+ This stage always runs. `codex` is the preferred reviewer because it is a different model from the Claude agents that produced the findings; when `codex` is unavailable, a Claude second-opinion subagent stands in.
151
+
152
+ Build the peer-review prompt first: take the `magpie-peer-review` block from this SKILL.md and substitute the placeholders listed in its `## Substitute before use` preamble. Write the substituted prompt to `$RUN_DIR/peer-prompt.md`.
153
+
154
+ **Codex path (preferred).** If `codex` is available (setup did not log `missingOptional: ["codex"]` and `command -v codex` succeeds), set `<<PEER_PROVIDER>>` to `codex` and run codex with the prompt piped on stdin:
151
155
 
152
156
  ```
153
157
  codex exec < "$RUN_DIR/peer-prompt.md" > "$RUN_DIR/peer.out"
154
158
  ```
155
159
 
156
- `peer.out` is codex's full transcript; extract the fenced JSON block tagged `review-peer-review` from it to get the verdicts array. Write that verdicts array to `$RUN_DIR/peer.json` for record-keeping.
160
+ `peer.out` is codex's full transcript; extract the fenced JSON block tagged `review-peer-review` from it to get the verdicts array. Write that verdicts array to `$RUN_DIR/peer.json`, append `{stage: peer-review, status: done, provider: codex}`, then apply the verdicts as described below.
161
+
162
+ If codex returns non-zero, do not abort: fall through to the Claude path and record `{stage: peer-review, provider: codex, status: error}` first.
157
163
 
158
- If codex returns non-zero, ask the user once: "Codex peer-review failed: <stderr>. Skip peer-review and proceed, or abort?". On "skip", copy `findings.kept.json` to `findings.final.json` and add `{stage: peer-review, status: skipped}`.
164
+ **Claude path (fallback).** When `codex` is unavailable or failed, get the second opinion from a Claude subagent instead. Set `<<PEER_PROVIDER>>` to `claude`, then prepend the `magpie-peer-review-claude-preamble` block from this SKILL.md to the substituted peer-review prompt (the preamble forces genuine independence, since the reviewer shares a model family with the primary reviewers). Dispatch one subagent (Agent tool, `general-purpose`) whose entire task is that combined prompt, and instruct it to return only the fenced `review-peer-review` JSON block. Write its output to `$RUN_DIR/peer.out`, extract the `review-peer-review` block to `$RUN_DIR/peer.json`, and append `{stage: peer-review, status: done, provider: claude}`.
159
165
 
160
- Otherwise parse the verdicts JSON, apply them (drop / downgrade), and write `findings.final.json`. Append `{stage: peer-review, status: done}` and re-render progress.
166
+ **Apply the verdicts (both paths).** Parse the verdicts JSON and apply the `update` / `add` entries (an empty array means no change), then write `findings.final.json`. Re-render progress.
161
167
 
162
168
  ### 7. Report
163
169
 
@@ -564,13 +570,9 @@ Output every candidate exactly once. Do not invent ids. Do not output anything o
564
570
 
565
571
  ## Peer-review prompt
566
572
 
567
- The agent substitutes the placeholders below, writes the result to `<run-dir>/peer-prompt.md`, then runs:
568
-
569
- ```
570
- codex exec < <run-dir>/peer-prompt.md > <run-dir>/peer.out
571
- ```
573
+ The agent substitutes the placeholders below and writes the result to `<run-dir>/peer-prompt.md`. Step 6 then feeds that prompt to the peer reviewer: `codex exec < <run-dir>/peer-prompt.md > <run-dir>/peer.out` when codex is available, or a Claude `general-purpose` subagent (with the `magpie-peer-review-claude-preamble` prepended) writing to `<run-dir>/peer.out` when it is not.
572
574
 
573
- Then extract the fenced `review-peer-review` block from `peer.out` and save it to `<run-dir>/peer.json`.
575
+ Either way, extract the fenced `review-peer-review` block from `peer.out` and save it to `<run-dir>/peer.json`.
574
576
 
575
577
  ## Substitute before use
576
578
 
@@ -638,6 +640,18 @@ Rules:
638
640
  ```
639
641
  ````
640
642
 
643
+ ## Claude peer-review preamble
644
+
645
+ Used only by the Claude fallback path in step 6. Prepend this block verbatim (no substitutions) to the substituted `magpie-peer-review` prompt before dispatching the subagent. Its job is to buy back the independence you lose by using the same model family that produced the findings: the reviewer must re-derive each verdict from the diff rather than trusting the finding text, and must actively resist rubber-stamping.
646
+
647
+ ````magpie-peer-review-claude-preamble
648
+ You are a fresh, independent second-opinion reviewer. You have no memory of, and no stake in, how the findings below were produced. They were generated by other agents that share your model family, so they may carry the same blind spots you would: do not defer to them, and do not assume they are correct because they sound confident.
649
+
650
+ Ground every verdict in the diff hunks provided, not in the prose of the finding. For each finding, independently re-derive whether the described problem is actually present on the cited line before you accept it. If a finding's reasoning does not hold against the hunk, or the anchor is wrong, or the severity is off, say so with "update"; if you can see a clearly actionable adjacent issue in the same hunks that was missed, add it. When the existing finding survives your own check unchanged, leave it alone.
651
+
652
+ Hold yourself to the exact same output contract and constraints described below. Return [] when the review is already sound.
653
+ ````
654
+
641
655
  ## Resuming a crashed run
642
656
 
643
657
  If the user re-invokes the skill and a `$RUN_DIR/state/server-info` exists:
@@ -10,18 +10,30 @@ test('returns ok when all binaries resolve', async () => {
10
10
  })
11
11
  expect(result.ok).toBe(true)
12
12
  expect(result.missing).toEqual([])
13
+ expect(result.missingOptional).toEqual([])
13
14
  })
14
15
 
15
- test('returns missing list when binaries do not resolve', async () => {
16
+ test('returns missing list when required binaries do not resolve', async () => {
16
17
  const result = await preflight({
17
18
  bun: 'bun',
18
19
  gh: 'definitely-not-a-binary-xyz123',
19
- codex: 'also-not-real-abc456',
20
+ codex: 'echo',
20
21
  git: 'git',
21
22
  })
22
23
  expect(result.ok).toBe(false)
23
24
  expect(result.missing).toContain('gh')
24
- expect(result.missing).toContain('codex')
25
+ })
26
+
27
+ test('missing codex is optional and does not abort the run', async () => {
28
+ const result = await preflight({
29
+ bun: 'bun',
30
+ gh: 'echo',
31
+ codex: 'also-not-real-abc456',
32
+ git: 'git',
33
+ })
34
+ expect(result.ok).toBe(true)
35
+ expect(result.missing).not.toContain('codex')
36
+ expect(result.missingOptional).toContain('codex')
25
37
  })
26
38
 
27
39
  test('renderInstallHint produces a single-line message per missing tool', () => {
@@ -92,7 +92,7 @@ test('each pipeline stage exposes a short sublabel so first-timers can learn wha
92
92
  })
93
93
  expect(html).toContain('class="hint"')
94
94
  expect(html).toContain('five reviewers in parallel')
95
- expect(html).toContain('second opinion via codex')
95
+ expect(html).toContain('independent second opinion')
96
96
  })
97
97
 
98
98
  test('renderProgressHtml includes the archived banner element', () => {
@@ -7,10 +7,17 @@ export type Deps = {
7
7
 
8
8
  export type PreflightResult = {
9
9
  ok: boolean
10
+ /** Required binaries that did not resolve; any entry here aborts the run. */
10
11
  missing: string[]
12
+ /** Optional binaries that did not resolve; these only degrade features, they never abort. */
13
+ missingOptional: string[]
11
14
  resolved: Record<keyof Deps, string | null>
12
15
  }
13
16
 
17
+ // codex only powers the optional peer-review stage; a missing codex degrades that
18
+ // stage to skipped rather than blocking the whole run.
19
+ const OPTIONAL_DEPS: ReadonlySet<keyof Deps> = new Set<keyof Deps>(['codex'])
20
+
14
21
  export async function preflight(deps: Deps): Promise<PreflightResult> {
15
22
  const resolved: Record<keyof Deps, string | null> = {
16
23
  bun: Bun.which(deps.bun),
@@ -18,8 +25,12 @@ export async function preflight(deps: Deps): Promise<PreflightResult> {
18
25
  codex: Bun.which(deps.codex),
19
26
  git: Bun.which(deps.git),
20
27
  }
21
- const missing = (Object.keys(resolved) as Array<keyof Deps>).filter((k) => resolved[k] === null)
22
- return { ok: missing.length === 0, missing, resolved }
28
+ const unresolved = (Object.keys(resolved) as Array<keyof Deps>).filter(
29
+ (k) => resolved[k] === null,
30
+ )
31
+ const missing = unresolved.filter((k) => !OPTIONAL_DEPS.has(k))
32
+ const missingOptional = unresolved.filter((k) => OPTIONAL_DEPS.has(k))
33
+ return { ok: missing.length === 0, missing, missingOptional, resolved }
23
34
  }
24
35
 
25
36
  const HINTS: Record<string, string> = {
@@ -19,7 +19,7 @@ const STAGE_HINT: Record<StageId, string> = {
19
19
  specialists: 'five reviewers in parallel',
20
20
  dedupe: 'merge overlaps',
21
21
  critic: 'keep the high-signal ones',
22
- 'peer-review': 'second opinion via codex',
22
+ 'peer-review': 'independent second opinion',
23
23
  report: 'render this page',
24
24
  post: 'comment on the PR',
25
25
  }
@@ -30,7 +30,7 @@ const STAGE_NOW_DOING: Record<StageId, string> = {
30
30
  specialists: 'Five reviewers reading the diff in parallel',
31
31
  dedupe: 'Merging overlapping findings',
32
32
  critic: 'Keeping only the high-signal ones',
33
- 'peer-review': 'Asking a second opinion via codex',
33
+ 'peer-review': 'Getting an independent second opinion',
34
34
  report: 'Composing the report page',
35
35
  post: 'Ready to post; switch tabs to pick findings',
36
36
  }
@@ -32,7 +32,18 @@ export async function runSetup(input: RunSetupInput): Promise<number> {
32
32
  await cleanup(input.runDir)
33
33
  return 3
34
34
  }
35
- await logLine(input.runDir, { stage: 'preflight', status: 'done' })
35
+ if (preResult.missingOptional.length > 0) {
36
+ await logLine(input.runDir, {
37
+ stage: 'preflight',
38
+ status: 'done',
39
+ missingOptional: preResult.missingOptional,
40
+ })
41
+ process.stderr.write(
42
+ `magpie: optional dependency unavailable, some stages will be skipped:\n${renderInstallHint(preResult.missingOptional)}\n`,
43
+ )
44
+ } else {
45
+ await logLine(input.runDir, { stage: 'preflight', status: 'done' })
46
+ }
36
47
 
37
48
  const fetched = await fetchPr({
38
49
  ghBin: deps.gh,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "magpie",
3
- "version": "0.5.1",
4
- "description": "Interactive PR review pipeline. Runs five parallel specialist subagents (security, bugs, performance, code-smells, architecture), dedupes findings, applies a critic rubric, peer-reviews via codex exec, and serves an interactive HTML report for selecting findings to post via gh. Bundles a Bun CLI installed onto PATH via the skill's postinstall step. Use when the user asks to review a GitHub pull request.",
3
+ "version": "0.6.0",
4
+ "description": "Interactive PR review pipeline. Runs five parallel specialist subagents (security, bugs, performance, code-smells, architecture), dedupes findings, applies a critic rubric, peer-reviews via codex exec (falling back to a Claude second opinion when codex is unavailable), and serves an interactive HTML report for selecting findings to post via gh. Bundles a Bun CLI installed onto PATH via the skill's postinstall step. Use when the user asks to review a GitHub pull request.",
5
5
  "author": "iceinvein",
6
6
  "type": "prompt",
7
7
  "tools": [
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "module-secret-auditor",
3
- "version": "1.0.0",
4
- "description": "Parnas-inspired information hiding analysis — module boundaries drawn by change-reason, not by noun or technical layer",
3
+ "version": "1.0.1",
4
+ "description": "Parnas-inspired information hiding analysis: module boundaries drawn by change-reason, not by noun or technical layer",
5
5
  "author": "iceinvein",
6
6
  "type": "prompt",
7
- "tools": ["claude", "cursor", "codex", "gemini"],
7
+ "tools": [
8
+ "claude",
9
+ "cursor",
10
+ "codex",
11
+ "gemini"
12
+ ],
8
13
  "files": {
9
14
  "prompt": "SKILL.md"
10
15
  },
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "port-adapter-auditor",
3
- "version": "1.0.0",
4
- "description": "Cockburn-inspired hexagonal architecture analysis — identify ports and adapters, classify boundary health, ensure core testability and swappability",
3
+ "version": "1.0.1",
4
+ "description": "Cockburn-inspired hexagonal architecture analysis: identify ports and adapters, classify boundary health, ensure core testability and swappability",
5
5
  "author": "iceinvein",
6
6
  "type": "prompt",
7
- "tools": ["claude", "cursor", "codex", "gemini"],
7
+ "tools": [
8
+ "claude",
9
+ "cursor",
10
+ "codex",
11
+ "gemini"
12
+ ],
8
13
  "files": {
9
14
  "prompt": "SKILL.md"
10
15
  },
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "rams-design-audit",
3
- "version": "1.0.0",
4
- "description": "Dieter Rams-inspired design audit — every visual element must earn its presence, less but better, clarity through restraint",
3
+ "version": "1.0.1",
4
+ "description": "Dieter Rams-inspired design audit: every visual element must earn its presence, less but better, clarity through restraint",
5
5
  "author": "iceinvein",
6
6
  "type": "prompt",
7
- "tools": ["claude", "cursor", "codex", "gemini"],
7
+ "tools": [
8
+ "claude",
9
+ "cursor",
10
+ "codex",
11
+ "gemini"
12
+ ],
8
13
  "files": {
9
14
  "prompt": "SKILL.md"
10
15
  },