claude-devkit-cli 1.3.0 → 1.3.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-devkit-cli",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "CLI toolkit for spec-first development with Claude Code — hooks, commands, guards, and test runners",
5
5
  "bin": {
6
6
  "claude-devkit": "./bin/devkit.js",
@@ -173,11 +173,33 @@ Include 1-sentence rationale for each disposition. Be honest — don't reject va
173
173
 
174
174
  Show adjudicated findings using the reviewer output format plus Disposition and Rationale fields.
175
175
 
176
- Then ask: "How would you like to proceed?"
177
- 1. **"Apply all accepted"** — update the plan with all accepted fixes
178
- 2. **"Review each"** — walk through one by one, accept/reject/modify each
176
+ Then present the decision:
179
177
 
180
- If user picks "Review each": for each finding, ask "Accept / Reject / Modify fix?"
178
+ ```
179
+ How to proceed with N accepted findings?
180
+
181
+ A) Apply all accepted — bulk-apply all fixes at once
182
+ Fit: N/10 | Trade-off: fast vs. no per-finding control
183
+
184
+ B) Review each — walk through one by one, accept/reject/modify
185
+ Fit: N/10 | Trade-off: precise control vs. slower
186
+
187
+ RECOMMENDATION: [A or B] — <reason based on finding count and severity>
188
+ ```
189
+
190
+ Score Fit based on context: if most findings are High/Critical, recommend B (review each). If mostly Medium with clear fixes, recommend A.
191
+
192
+ If user picks B: for each finding, present:
193
+
194
+ ```
195
+ Finding [C-1]: <title>
196
+
197
+ A) Accept — apply the suggested fix
198
+ B) Modify — accept with changes (describe your modification)
199
+ C) Reject — skip this finding
200
+
201
+ RECOMMENDATION: [A/B/C] — <based on your adjudication>
202
+ ```
181
203
 
182
204
  ## Phase 7: Apply
183
205
 
@@ -1,5 +1,40 @@
1
1
  Generate spec with acceptance scenarios from description or existing spec.
2
2
 
3
+ ## Question Format
4
+
5
+ When presenting a question to the user with multiple options, ALWAYS use this structured format:
6
+
7
+ ```
8
+ Q<N>: <Plain-language problem statement — what needs deciding and why>
9
+
10
+ A) <option> — <1-line rationale>
11
+ Fit: X/10 | Trade-off: <what you gain vs. lose>
12
+
13
+ B) <option> — <1-line rationale>
14
+ Fit: X/10 | Trade-off: <what you gain vs. lose>
15
+
16
+ C) <option> — <1-line rationale> (if applicable)
17
+ Fit: X/10 | Trade-off: <what you gain vs. lose>
18
+
19
+ RECOMMENDATION: [A/B/C] — <one-sentence reason>
20
+ ```
21
+
22
+ **Fit scoring calibration:**
23
+ - **9-10:** Covers the requirement fully, no meaningful downside.
24
+ - **7-8:** Solid choice, minor trade-offs that are acceptable for most projects.
25
+ - **5-6:** Workable but defers significant decisions or adds friction.
26
+ - **3-4:** Shortcut — gets past the question but creates debt.
27
+ - **1-2:** Placeholder only, must be revisited.
28
+
29
+ Rules:
30
+ - 2-4 options per question. Never more than 4.
31
+ - Every option must have a Fit score AND a Trade-off. No score without rationale.
32
+ - RECOMMENDATION is mandatory. Pick one. State why.
33
+ - If two options score within 1 point, flag it: "Close call — A and B are both strong. Leaning A because [reason]."
34
+ - Present all questions at once (not one-by-one) unless the answer to Q1 changes what Q2 should be.
35
+
36
+ ---
37
+
3
38
  ## Determine mode
4
39
 
5
40
  Examine `$ARGUMENTS`:
@@ -78,7 +113,7 @@ Mode C does not run Phase 1 — it uses its own flow (see Mode C section).
78
113
  | T6 | Splitting would duplicate >50% of context (entities, constraints) | DO NOT split |
79
114
 
80
115
  "MUST" = mandatory split, inform user.
81
- "SHOULD" = suggest split, ask user.
116
+ "SHOULD" = suggest split, present using **Question Format** with split vs. keep-together as options.
82
117
  "DO NOT" = keep together, unless user requests split.
83
118
 
84
119
  If splitting:
@@ -240,7 +275,22 @@ Before finalizing, scan the spec for gaps. Check BOTH the spec content AND the a
240
275
  | Priority consistency | P0 story with only 1 happy path AS? |
241
276
  | Constraint coverage | Which constraint has no AS verifying it? |
242
277
 
243
- Identify the top 3-5 ambiguities (most impactful first). For each, ask the user a targeted question with 2-4 concrete options and a recommendation.
278
+ Identify the top 3-5 ambiguities (most impactful first). Present each using the **Question Format** (see top of this file). Example:
279
+
280
+ ```
281
+ Q1: Auth strategy not specified — spec mentions "logged-in users" but no auth mechanism.
282
+
283
+ A) Session-based auth (cookie) — traditional, simple server-side
284
+ Fit: 8/10 | Trade-off: simple setup vs. harder to scale across services
285
+
286
+ B) JWT (stateless tokens) — API-friendly, no server session
287
+ Fit: 7/10 | Trade-off: scalable vs. token revocation complexity
288
+
289
+ C) Defer — add auth story later when auth requirements are clearer
290
+ Fit: 5/10 | Trade-off: unblocks now vs. may require spec rewrite later
291
+
292
+ RECOMMENDATION: A — single-service app, session auth is simplest path.
293
+ ```
244
294
 
245
295
  If 0 questions remain, you MUST state why — not just "spec is clear." Cite at minimum:
246
296
  - **Edge cases checked:** which boundary conditions were considered and found covered.
@@ -375,6 +425,23 @@ Display to the user:
375
425
  S-001, S-003
376
426
  ```
377
427
 
428
+ Present the decision using **Question Format**:
429
+
430
+ ```
431
+ Q1: Apply these changes to <feature> spec?
432
+
433
+ A) Apply all — accept the full change report as shown
434
+ Fit: N/10 | Trade-off: fast vs. no per-item control
435
+
436
+ B) Review each — walk through changes one by one, accept/reject/modify
437
+ Fit: N/10 | Trade-off: precise control vs. slower
438
+
439
+ C) Reject all — discard and start over
440
+ Fit: N/10 | Trade-off: clean slate vs. loses work
441
+
442
+ RECOMMENDATION: [A or B] — <reason based on change count and complexity>
443
+ ```
444
+
378
445
  > **⛔ MUST wait for user confirmation before applying.**
379
446
  > Do not show the report and apply in the same step.
380
447
  > User has the right to reject or modify the change report.
@@ -46,17 +46,35 @@ COMMAND=$(extract_command "$INPUT") || exit 0
46
46
  BLOCKED="(^|[ /])node_modules(/|$| )"
47
47
  BLOCKED+="|(__pycache__)"
48
48
  BLOCKED+="|\.git/(objects|refs)"
49
- BLOCKED+="|(^|[ /])dist(/|$| )"
50
- BLOCKED+="|(^|[ /])build(/|$| )"
49
+ BLOCKED+="|(^|[ /])dist/"
50
+ BLOCKED+="|(^|[ /])build/"
51
51
  BLOCKED+="|\.next/"
52
52
  BLOCKED+="|(^|[ /])vendor(/|$| )"
53
53
  BLOCKED+="|(^|[ /])Pods(/|$| )"
54
54
  BLOCKED+="|\.build/"
55
55
  BLOCKED+="|DerivedData"
56
56
  BLOCKED+="|\.gradle/"
57
- BLOCKED+="|target/(debug|release)(/|$| )"
57
+ BLOCKED+="|(^|[ /])target/"
58
58
  BLOCKED+="|\.nuget"
59
59
  BLOCKED+="|\.cache(/|$| )"
60
+ # Python
61
+ BLOCKED+="|(^|[ /])\.venv/"
62
+ BLOCKED+="|(^|[ /])venv/"
63
+ BLOCKED+="|\.mypy_cache/"
64
+ BLOCKED+="|\.pytest_cache/"
65
+ BLOCKED+="|\.ruff_cache/"
66
+ BLOCKED+="|\.egg-info(/|$| )"
67
+ # C# .NET (match .NET-specific subdirs to avoid false positives on generic bin/)
68
+ BLOCKED+="|(^|[ /])bin/(Debug|Release|net|x64|x86)"
69
+ BLOCKED+="|(^|[ /])obj/(Debug|Release|net)"
70
+ # Node.js frameworks
71
+ BLOCKED+="|\.nuxt/"
72
+ BLOCKED+="|\.svelte-kit/"
73
+ BLOCKED+="|\.parcel-cache/"
74
+ BLOCKED+="|\.turbo/"
75
+ BLOCKED+="|(^|[ /])out/(server|static|_next)"
76
+ # Ruby
77
+ BLOCKED+="|\.bundle/"
60
78
 
61
79
  # Append project-specific patterns from env
62
80
  if [[ -n "${PATH_GUARD_EXTRA:-}" ]]; then