@hustle-together/api-dev-tools 3.6.3 → 3.6.5
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 +56 -56
- package/bin/cli.js +11 -11
- package/commands/README.md +17 -17
- package/commands/api-create.md +7 -7
- package/commands/api-interview.md +5 -5
- package/commands/api-research.md +7 -7
- package/commands/api-verify.md +8 -8
- package/demo/workflow-demo.html +65 -65
- package/hooks/enforce-deep-research.py +2 -2
- package/hooks/enforce-disambiguation.py +3 -3
- package/hooks/enforce-documentation.py +2 -2
- package/hooks/enforce-environment.py +2 -2
- package/hooks/enforce-refactor.py +3 -3
- package/hooks/enforce-research.py +2 -2
- package/hooks/enforce-schema.py +3 -3
- package/hooks/enforce-scope.py +2 -2
- package/hooks/enforce-tdd-red.py +2 -2
- package/hooks/enforce-verify.py +5 -5
- package/hooks/verify-after-green.py +2 -2
- package/package.json +1 -1
- package/templates/CLAUDE-SECTION.md +13 -13
package/demo/workflow-demo.html
CHANGED
|
@@ -1117,7 +1117,7 @@
|
|
|
1117
1117
|
}
|
|
1118
1118
|
|
|
1119
1119
|
/* ============================================
|
|
1120
|
-
SECTION 5: THE
|
|
1120
|
+
SECTION 5: THE 12 PHASES
|
|
1121
1121
|
============================================ */
|
|
1122
1122
|
#phases .section-header {
|
|
1123
1123
|
text-align: center;
|
|
@@ -3036,20 +3036,20 @@ Required actions:
|
|
|
3036
3036
|
</div>
|
|
3037
3037
|
</section>
|
|
3038
3038
|
|
|
3039
|
-
<!-- Section 5: The
|
|
3039
|
+
<!-- Section 5: The 12 Phases -->
|
|
3040
3040
|
<section id="phases">
|
|
3041
3041
|
<div class="section-inner">
|
|
3042
3042
|
<div class="section-header">
|
|
3043
|
-
<h2>The
|
|
3043
|
+
<h2>The 12 Phases</h2>
|
|
3044
3044
|
<p class="text-muted">Each phase must complete before proceeding. Click EXPAND for details.</p>
|
|
3045
3045
|
</div>
|
|
3046
3046
|
|
|
3047
3047
|
<div class="phases-grid">
|
|
3048
|
-
<!-- Phase
|
|
3048
|
+
<!-- Phase 1: Disambiguation -->
|
|
3049
3049
|
<div class="phase-card">
|
|
3050
3050
|
<div class="phase-card-main">
|
|
3051
3051
|
<div class="phase-info">
|
|
3052
|
-
<span class="phase-number">PHASE
|
|
3052
|
+
<span class="phase-number">PHASE 1</span>
|
|
3053
3053
|
<h4>Disambiguation</h4>
|
|
3054
3054
|
<p>Clarify ambiguous terms before any research begins.</p>
|
|
3055
3055
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-disambiguation.py</span>
|
|
@@ -3085,11 +3085,11 @@ Required actions:
|
|
|
3085
3085
|
</div>
|
|
3086
3086
|
</div>
|
|
3087
3087
|
|
|
3088
|
-
<!-- Phase
|
|
3088
|
+
<!-- Phase 2: Scope -->
|
|
3089
3089
|
<div class="phase-card">
|
|
3090
3090
|
<div class="phase-card-main">
|
|
3091
3091
|
<div class="phase-info">
|
|
3092
|
-
<span class="phase-number">PHASE
|
|
3092
|
+
<span class="phase-number">PHASE 2</span>
|
|
3093
3093
|
<h4>Scope Confirmation</h4>
|
|
3094
3094
|
<p>Confirm understanding of what endpoint should do.</p>
|
|
3095
3095
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-scope.py</span>
|
|
@@ -3126,11 +3126,11 @@ Required actions:
|
|
|
3126
3126
|
</div>
|
|
3127
3127
|
</div>
|
|
3128
3128
|
|
|
3129
|
-
<!-- Phase
|
|
3129
|
+
<!-- Phase 3: Initial Research -->
|
|
3130
3130
|
<div class="phase-card">
|
|
3131
3131
|
<div class="phase-card-main">
|
|
3132
3132
|
<div class="phase-info">
|
|
3133
|
-
<span class="phase-number">PHASE
|
|
3133
|
+
<span class="phase-number">PHASE 3</span>
|
|
3134
3134
|
<h4>Initial Research</h4>
|
|
3135
3135
|
<p>Fetch documentation via Context7 or WebSearch.</p>
|
|
3136
3136
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-research.py</span>
|
|
@@ -3169,11 +3169,11 @@ Required actions:
|
|
|
3169
3169
|
</div>
|
|
3170
3170
|
</div>
|
|
3171
3171
|
|
|
3172
|
-
<!-- Phase
|
|
3172
|
+
<!-- Phase 4: Interview -->
|
|
3173
3173
|
<div class="phase-card">
|
|
3174
3174
|
<div class="phase-card-main">
|
|
3175
3175
|
<div class="phase-info">
|
|
3176
|
-
<span class="phase-number">PHASE
|
|
3176
|
+
<span class="phase-number">PHASE 4</span>
|
|
3177
3177
|
<h4>Interview</h4>
|
|
3178
3178
|
<p>Ask questions FROM research findings, not templates.</p>
|
|
3179
3179
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-interview.py</span>
|
|
@@ -3211,11 +3211,11 @@ Required actions:
|
|
|
3211
3211
|
</div>
|
|
3212
3212
|
</div>
|
|
3213
3213
|
|
|
3214
|
-
<!-- Phase
|
|
3214
|
+
<!-- Phase 5: Deep Research -->
|
|
3215
3215
|
<div class="phase-card">
|
|
3216
3216
|
<div class="phase-card-main">
|
|
3217
3217
|
<div class="phase-info">
|
|
3218
|
-
<span class="phase-number">PHASE
|
|
3218
|
+
<span class="phase-number">PHASE 5</span>
|
|
3219
3219
|
<h4>Deep Research</h4>
|
|
3220
3220
|
<p>Research additional topics based on interview answers.</p>
|
|
3221
3221
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-deep-research.py</span>
|
|
@@ -3251,11 +3251,11 @@ Required actions:
|
|
|
3251
3251
|
</div>
|
|
3252
3252
|
</div>
|
|
3253
3253
|
|
|
3254
|
-
<!-- Phase
|
|
3254
|
+
<!-- Phase 6: Schema Creation -->
|
|
3255
3255
|
<div class="phase-card">
|
|
3256
3256
|
<div class="phase-card-main">
|
|
3257
3257
|
<div class="phase-info">
|
|
3258
|
-
<span class="phase-number">PHASE
|
|
3258
|
+
<span class="phase-number">PHASE 6</span>
|
|
3259
3259
|
<h4>Schema Creation</h4>
|
|
3260
3260
|
<p>Create Zod schemas from research + interview decisions.</p>
|
|
3261
3261
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-schema.py</span>
|
|
@@ -3294,11 +3294,11 @@ Required actions:
|
|
|
3294
3294
|
</div>
|
|
3295
3295
|
</div>
|
|
3296
3296
|
|
|
3297
|
-
<!-- Phase
|
|
3297
|
+
<!-- Phase 7: Environment Check -->
|
|
3298
3298
|
<div class="phase-card">
|
|
3299
3299
|
<div class="phase-card-main">
|
|
3300
3300
|
<div class="phase-info">
|
|
3301
|
-
<span class="phase-number">PHASE
|
|
3301
|
+
<span class="phase-number">PHASE 7</span>
|
|
3302
3302
|
<h4>Environment Check</h4>
|
|
3303
3303
|
<p>Verify required API keys and environment setup.</p>
|
|
3304
3304
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-environment.py</span>
|
|
@@ -3335,11 +3335,11 @@ Required actions:
|
|
|
3335
3335
|
</div>
|
|
3336
3336
|
</div>
|
|
3337
3337
|
|
|
3338
|
-
<!-- Phase
|
|
3338
|
+
<!-- Phase 8: TDD Red -->
|
|
3339
3339
|
<div class="phase-card">
|
|
3340
3340
|
<div class="phase-card-main">
|
|
3341
3341
|
<div class="phase-info">
|
|
3342
|
-
<span class="phase-number">PHASE
|
|
3342
|
+
<span class="phase-number">PHASE 8</span>
|
|
3343
3343
|
<h4>TDD Red Phase</h4>
|
|
3344
3344
|
<p>Write failing tests BEFORE any implementation.</p>
|
|
3345
3345
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-tdd-red.py</span>
|
|
@@ -3377,11 +3377,11 @@ Required actions:
|
|
|
3377
3377
|
</div>
|
|
3378
3378
|
</div>
|
|
3379
3379
|
|
|
3380
|
-
<!-- Phase
|
|
3380
|
+
<!-- Phase 9: TDD Green -->
|
|
3381
3381
|
<div class="phase-card">
|
|
3382
3382
|
<div class="phase-card-main">
|
|
3383
3383
|
<div class="phase-info">
|
|
3384
|
-
<span class="phase-number">PHASE
|
|
3384
|
+
<span class="phase-number">PHASE 9</span>
|
|
3385
3385
|
<h4>TDD Green Phase</h4>
|
|
3386
3386
|
<p>Minimal implementation to make tests pass.</p>
|
|
3387
3387
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> verify-after-green.py</span>
|
|
@@ -3396,7 +3396,7 @@ Required actions:
|
|
|
3396
3396
|
<span class="success"><i class="fa-solid fa-check"></i></span> <span class="output">respects format parameter</span>
|
|
3397
3397
|
|
|
3398
3398
|
<span class="success">3 tests passed</span>
|
|
3399
|
-
<span class="warning">Triggering Phase
|
|
3399
|
+
<span class="warning">Triggering Phase 10: Verify</span></pre>
|
|
3400
3400
|
</div>
|
|
3401
3401
|
</div>
|
|
3402
3402
|
<button class="expand-btn" onclick="toggleExpand(this)">
|
|
@@ -3420,11 +3420,11 @@ Required actions:
|
|
|
3420
3420
|
</div>
|
|
3421
3421
|
</div>
|
|
3422
3422
|
|
|
3423
|
-
<!-- Phase
|
|
3423
|
+
<!-- Phase 10: Verify -->
|
|
3424
3424
|
<div class="phase-card">
|
|
3425
3425
|
<div class="phase-card-main">
|
|
3426
3426
|
<div class="phase-info">
|
|
3427
|
-
<span class="phase-number">PHASE
|
|
3427
|
+
<span class="phase-number">PHASE 10</span>
|
|
3428
3428
|
<h4>Verification</h4>
|
|
3429
3429
|
<p>Re-research docs and compare to implementation.</p>
|
|
3430
3430
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-verify.py</span>
|
|
@@ -3464,11 +3464,11 @@ Required actions:
|
|
|
3464
3464
|
</div>
|
|
3465
3465
|
</div>
|
|
3466
3466
|
|
|
3467
|
-
<!-- Phase
|
|
3467
|
+
<!-- Phase 11: TDD Refactor -->
|
|
3468
3468
|
<div class="phase-card">
|
|
3469
3469
|
<div class="phase-card-main">
|
|
3470
3470
|
<div class="phase-info">
|
|
3471
|
-
<span class="phase-number">PHASE
|
|
3471
|
+
<span class="phase-number">PHASE 11</span>
|
|
3472
3472
|
<h4>TDD Refactor</h4>
|
|
3473
3473
|
<p>Clean up code while keeping tests green.</p>
|
|
3474
3474
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-refactor.py</span>
|
|
@@ -3506,11 +3506,11 @@ Required actions:
|
|
|
3506
3506
|
</div>
|
|
3507
3507
|
</div>
|
|
3508
3508
|
|
|
3509
|
-
<!-- Phase
|
|
3509
|
+
<!-- Phase 12: Documentation -->
|
|
3510
3510
|
<div class="phase-card">
|
|
3511
3511
|
<div class="phase-card-main">
|
|
3512
3512
|
<div class="phase-info">
|
|
3513
|
-
<span class="phase-number">PHASE
|
|
3513
|
+
<span class="phase-number">PHASE 12</span>
|
|
3514
3514
|
<h4>Documentation</h4>
|
|
3515
3515
|
<p>Update manifests and cache research findings.</p>
|
|
3516
3516
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> enforce-documentation.py</span>
|
|
@@ -3547,11 +3547,11 @@ Required actions:
|
|
|
3547
3547
|
</div>
|
|
3548
3548
|
</div>
|
|
3549
3549
|
|
|
3550
|
-
<!-- Phase
|
|
3550
|
+
<!-- Phase 13: Completion -->
|
|
3551
3551
|
<div class="phase-card">
|
|
3552
3552
|
<div class="phase-card-main">
|
|
3553
3553
|
<div class="phase-info">
|
|
3554
|
-
<span class="phase-number">PHASE
|
|
3554
|
+
<span class="phase-number">PHASE 13</span>
|
|
3555
3555
|
<h4>Completion</h4>
|
|
3556
3556
|
<p>Final verification and commit.</p>
|
|
3557
3557
|
<span class="phase-hook"><i class="fa-solid fa-lock"></i> api-workflow-check.py</span>
|
|
@@ -3560,7 +3560,7 @@ Required actions:
|
|
|
3560
3560
|
<div class="terminal-title">~/project</div>
|
|
3561
3561
|
<pre><span class="prompt">Final check...</span>
|
|
3562
3562
|
|
|
3563
|
-
<span class="success"><i class="fa-solid fa-check"></i></span> <span class="output">All
|
|
3563
|
+
<span class="success"><i class="fa-solid fa-check"></i></span> <span class="output">All 12 phases complete</span>
|
|
3564
3564
|
<span class="success"><i class="fa-solid fa-check"></i></span> <span class="output">Tests passing</span>
|
|
3565
3565
|
<span class="success"><i class="fa-solid fa-check"></i></span> <span class="output">Docs updated</span>
|
|
3566
3566
|
<span class="success"><i class="fa-solid fa-check"></i></span> <span class="output">Research cached</span>
|
|
@@ -3598,7 +3598,7 @@ Required actions:
|
|
|
3598
3598
|
<div class="section-inner">
|
|
3599
3599
|
<div class="section-header">
|
|
3600
3600
|
<h2>See It In Action</h2>
|
|
3601
|
-
<p class="text-muted">Watch the complete
|
|
3601
|
+
<p class="text-muted">Watch the complete 12-phase workflow: /api-create brandfetch</p>
|
|
3602
3602
|
</div>
|
|
3603
3603
|
|
|
3604
3604
|
<div class="demo-controls-bar">
|
|
@@ -3767,7 +3767,7 @@ Required actions:
|
|
|
3767
3767
|
<div class="state-explanation">
|
|
3768
3768
|
<div class="state-field">
|
|
3769
3769
|
<h4><i class="fa-solid fa-database"></i> phases.*</h4>
|
|
3770
|
-
<p>Tracks completion status for all
|
|
3770
|
+
<p>Tracks completion status for all 12 phases. Hooks check this before allowing operations.</p>
|
|
3771
3771
|
</div>
|
|
3772
3772
|
|
|
3773
3773
|
<div class="state-field">
|
|
@@ -4169,7 +4169,7 @@ Required actions:
|
|
|
4169
4169
|
}
|
|
4170
4170
|
|
|
4171
4171
|
// ============================================
|
|
4172
|
-
// TERMINAL DEMO - Scene-based system (All
|
|
4172
|
+
// TERMINAL DEMO - Scene-based system (All 12 phases)
|
|
4173
4173
|
// ============================================
|
|
4174
4174
|
|
|
4175
4175
|
const demoScenes = [
|
|
@@ -4177,7 +4177,7 @@ Required actions:
|
|
|
4177
4177
|
{
|
|
4178
4178
|
id: 1,
|
|
4179
4179
|
phase: 0,
|
|
4180
|
-
title: 'Phase
|
|
4180
|
+
title: 'Phase 1: Disambiguation',
|
|
4181
4181
|
problem: 'Claude might research the wrong library. "Brandfetch" could mean the REST API, npm SDK, or custom code.',
|
|
4182
4182
|
solution: 'The enforce-disambiguation hook blocks ALL research until Claude asks you to clarify. You pick from numbered options.',
|
|
4183
4183
|
hook: 'enforce-disambiguation.py',
|
|
@@ -4187,7 +4187,7 @@ Required actions:
|
|
|
4187
4187
|
{ text: 'Starting API workflow for "brandfetch"...', class: 'ai' },
|
|
4188
4188
|
{ text: '', class: 'output' },
|
|
4189
4189
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4190
|
-
{ text: '║ PHASE
|
|
4190
|
+
{ text: '║ PHASE 1: DISAMBIGUATION ║', class: 'highlight' },
|
|
4191
4191
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4192
4192
|
{ text: '', class: 'output' },
|
|
4193
4193
|
{ text: 'Claude: The term "brandfetch" could refer to:', class: 'ai' },
|
|
@@ -4233,14 +4233,14 @@ Required actions:
|
|
|
4233
4233
|
{
|
|
4234
4234
|
id: 3,
|
|
4235
4235
|
phase: 1,
|
|
4236
|
-
title: 'Phase
|
|
4236
|
+
title: 'Phase 2: Scope Confirmation',
|
|
4237
4237
|
problem: 'Claude might misunderstand what you want. You say "fetch brand assets" but Claude thinks you want a database model.',
|
|
4238
4238
|
solution: 'Before research, Claude summarizes its understanding and asks "Is this correct?" You confirm or correct before any work begins.',
|
|
4239
4239
|
hook: 'enforce-scope.py',
|
|
4240
4240
|
lines: [
|
|
4241
4241
|
{ text: '', class: 'output' },
|
|
4242
4242
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4243
|
-
{ text: '║ PHASE
|
|
4243
|
+
{ text: '║ PHASE 2: SCOPE CONFIRMATION ║', class: 'highlight' },
|
|
4244
4244
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4245
4245
|
{ text: '', class: 'output' },
|
|
4246
4246
|
{ text: 'Claude: Let me confirm the scope:', class: 'ai' },
|
|
@@ -4257,14 +4257,14 @@ Required actions:
|
|
|
4257
4257
|
{
|
|
4258
4258
|
id: 4,
|
|
4259
4259
|
phase: 2,
|
|
4260
|
-
title: 'Phase
|
|
4260
|
+
title: 'Phase 3: Initial Research',
|
|
4261
4261
|
problem: 'Claude\'s training data might be months or years old. APIs change, endpoints get deprecated, auth methods evolve.',
|
|
4262
4262
|
solution: 'Claude must fetch CURRENT docs via Context7 MCP or WebSearch. Two sources minimum. Cross-referenced for accuracy.',
|
|
4263
4263
|
hook: 'enforce-research.py',
|
|
4264
4264
|
lines: [
|
|
4265
4265
|
{ text: '', class: 'output' },
|
|
4266
4266
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4267
|
-
{ text: '║ PHASE
|
|
4267
|
+
{ text: '║ PHASE 3: INITIAL RESEARCH ║', class: 'highlight' },
|
|
4268
4268
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4269
4269
|
{ text: '', class: 'output' },
|
|
4270
4270
|
{ text: 'Claude: Fetching current documentation via MCP...', class: 'ai' },
|
|
@@ -4291,14 +4291,14 @@ Required actions:
|
|
|
4291
4291
|
{
|
|
4292
4292
|
id: 5,
|
|
4293
4293
|
phase: 3,
|
|
4294
|
-
title: 'Phase
|
|
4294
|
+
title: 'Phase 4: Structured Interview',
|
|
4295
4295
|
problem: 'Generic AI asks template questions without knowing what options exist. Or worse, it asks then immediately answers itself.',
|
|
4296
4296
|
solution: 'Questions come FROM research findings. Numbered options only. Self-answering blocked. Your decisions are locked in.',
|
|
4297
4297
|
hook: 'enforce-interview.py',
|
|
4298
4298
|
lines: [
|
|
4299
4299
|
{ text: '', class: 'output' },
|
|
4300
4300
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4301
|
-
{ text: '║ PHASE
|
|
4301
|
+
{ text: '║ PHASE 4: STRUCTURED INTERVIEW ║', class: 'highlight' },
|
|
4302
4302
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4303
4303
|
{ text: '', class: 'output' },
|
|
4304
4304
|
{ text: 'Q1: Logo formats? (discovered: svg|png|jpg)', class: 'output' },
|
|
@@ -4318,14 +4318,14 @@ Required actions:
|
|
|
4318
4318
|
{
|
|
4319
4319
|
id: 6,
|
|
4320
4320
|
phase: 4,
|
|
4321
|
-
title: 'Phase
|
|
4321
|
+
title: 'Phase 5: Deep Research',
|
|
4322
4322
|
problem: 'Initial research gives the overview, but your specific choices might need deeper investigation.',
|
|
4323
4323
|
solution: 'Based on YOUR interview answers, Claude proposes targeted follow-up searches. Your requirements drive the investigation.',
|
|
4324
4324
|
hook: 'enforce-deep-research.py',
|
|
4325
4325
|
lines: [
|
|
4326
4326
|
{ text: '', class: 'output' },
|
|
4327
4327
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4328
|
-
{ text: '║ PHASE
|
|
4328
|
+
{ text: '║ PHASE 5: DEEP RESEARCH ║', class: 'highlight' },
|
|
4329
4329
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4330
4330
|
{ text: '', class: 'output' },
|
|
4331
4331
|
{ text: 'Claude: Researching specific areas from your choices...', class: 'ai' },
|
|
@@ -4343,14 +4343,14 @@ Required actions:
|
|
|
4343
4343
|
{
|
|
4344
4344
|
id: 7,
|
|
4345
4345
|
phase: 5,
|
|
4346
|
-
title: 'Phase
|
|
4346
|
+
title: 'Phase 6: Schema Creation',
|
|
4347
4347
|
problem: 'Without a contract, tests and implementation drift apart. Fields aren\'t validated or typed correctly.',
|
|
4348
4348
|
solution: 'Zod schemas define exact request/response shapes. Every discovered parameter typed. Becomes the source of truth.',
|
|
4349
4349
|
hook: 'enforce-schema.py',
|
|
4350
4350
|
lines: [
|
|
4351
4351
|
{ text: '', class: 'output' },
|
|
4352
4352
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4353
|
-
{ text: '║ PHASE
|
|
4353
|
+
{ text: '║ PHASE 6: SCHEMA CREATION ║', class: 'highlight' },
|
|
4354
4354
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4355
4355
|
{ text: '', class: 'output' },
|
|
4356
4356
|
{ text: '→ Write: src/lib/schemas/brandfetch.ts', class: 'mcp-call' },
|
|
@@ -4365,14 +4365,14 @@ Required actions:
|
|
|
4365
4365
|
{
|
|
4366
4366
|
id: 8,
|
|
4367
4367
|
phase: 6,
|
|
4368
|
-
title: 'Phase
|
|
4368
|
+
title: 'Phase 7: Environment Check',
|
|
4369
4369
|
problem: 'Tests pass locally but fail in CI. Why? Missing API key. You waste 30 minutes debugging.',
|
|
4370
4370
|
solution: 'Check environment BEFORE writing tests. Is the API key present? Is the format valid? No surprises later.',
|
|
4371
4371
|
hook: 'enforce-environment.py',
|
|
4372
4372
|
lines: [
|
|
4373
4373
|
{ text: '', class: 'output' },
|
|
4374
4374
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4375
|
-
{ text: '║ PHASE
|
|
4375
|
+
{ text: '║ PHASE 7: ENVIRONMENT CHECK ║', class: 'highlight' },
|
|
4376
4376
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4377
4377
|
{ text: '', class: 'output' },
|
|
4378
4378
|
{ text: ' BRANDFETCH_API_KEY: ✓ present (.env.local)', class: 'success' },
|
|
@@ -4385,14 +4385,14 @@ Required actions:
|
|
|
4385
4385
|
{
|
|
4386
4386
|
id: 9,
|
|
4387
4387
|
phase: 7,
|
|
4388
|
-
title: 'Phase
|
|
4388
|
+
title: 'Phase 8: TDD Red',
|
|
4389
4389
|
problem: 'Without tests, you don\'t know if code works. You ship bugs. You break things in production.',
|
|
4390
4390
|
solution: 'Write failing tests FIRST. Define success before implementation. Tests cover research findings AND interview decisions.',
|
|
4391
4391
|
hook: 'enforce-tdd-red.py',
|
|
4392
4392
|
lines: [
|
|
4393
4393
|
{ text: '', class: 'output' },
|
|
4394
4394
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4395
|
-
{ text: '║ PHASE
|
|
4395
|
+
{ text: '║ PHASE 8: TDD RED - Write Failing Tests ║', class: 'highlight' },
|
|
4396
4396
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4397
4397
|
{ text: '', class: 'output' },
|
|
4398
4398
|
{ text: '→ Write: brandfetch/__tests__/brandfetch.test.ts', class: 'mcp-call' },
|
|
@@ -4412,14 +4412,14 @@ Required actions:
|
|
|
4412
4412
|
{
|
|
4413
4413
|
id: 10,
|
|
4414
4414
|
phase: 8,
|
|
4415
|
-
title: 'Phase
|
|
4415
|
+
title: 'Phase 9: TDD Green',
|
|
4416
4416
|
problem: 'Developers write more code than needed. They add features not requested. They over-engineer.',
|
|
4417
4417
|
solution: 'Write MINIMAL implementation. Just enough to pass tests. When tests pass, verification triggers automatically.',
|
|
4418
4418
|
hook: 'verify-after-green.py (PostToolUse)',
|
|
4419
4419
|
lines: [
|
|
4420
4420
|
{ text: '', class: 'output' },
|
|
4421
4421
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4422
|
-
{ text: '║ PHASE
|
|
4422
|
+
{ text: '║ PHASE 9: TDD GREEN - Make Tests Pass ║', class: 'highlight' },
|
|
4423
4423
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4424
4424
|
{ text: '', class: 'output' },
|
|
4425
4425
|
{ text: '→ Write: src/app/api/v2/brandfetch/route.ts', class: 'mcp-call' },
|
|
@@ -4442,14 +4442,14 @@ Required actions:
|
|
|
4442
4442
|
{
|
|
4443
4443
|
id: 11,
|
|
4444
4444
|
phase: 9,
|
|
4445
|
-
title: 'Phase
|
|
4445
|
+
title: 'Phase 10: Verification',
|
|
4446
4446
|
problem: 'Even after researching, Claude might implement from memory. It forgets details. Implementation drifts from docs.',
|
|
4447
4447
|
solution: 'After tests pass, RE-FETCH docs. Compare implementation to current docs. If mismatch, loop back to Red phase.',
|
|
4448
4448
|
hook: 'verify-after-green.py',
|
|
4449
4449
|
lines: [
|
|
4450
4450
|
{ text: '', class: 'output' },
|
|
4451
4451
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4452
|
-
{ text: '║ PHASE
|
|
4452
|
+
{ text: '║ PHASE 10: VERIFY - Re-Research & Compare ║', class: 'highlight' },
|
|
4453
4453
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4454
4454
|
{ text: '', class: 'output' },
|
|
4455
4455
|
{ text: '→ mcp__context7__get-library-docs (re-fetch)', class: 'mcp-call' },
|
|
@@ -4468,14 +4468,14 @@ Required actions:
|
|
|
4468
4468
|
{
|
|
4469
4469
|
id: 12,
|
|
4470
4470
|
phase: 10,
|
|
4471
|
-
title: 'Phase
|
|
4471
|
+
title: 'Phase 11: TDD Refactor',
|
|
4472
4472
|
problem: 'First implementations are often messy. But cleaning up code might break things without you knowing.',
|
|
4473
4473
|
solution: 'Refactor WHILE tests stay green. Every change verified by existing test suite. If anything breaks, you know immediately.',
|
|
4474
4474
|
hook: 'enforce-refactor.py',
|
|
4475
4475
|
lines: [
|
|
4476
4476
|
{ text: '', class: 'output' },
|
|
4477
4477
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4478
|
-
{ text: '║ PHASE
|
|
4478
|
+
{ text: '║ PHASE 11: TDD REFACTOR - Clean Up Code ║', class: 'highlight' },
|
|
4479
4479
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4480
4480
|
{ text: '', class: 'output' },
|
|
4481
4481
|
{ text: '→ Edit: Extract fetchBrandData helper', class: 'mcp-call' },
|
|
@@ -4490,14 +4490,14 @@ Required actions:
|
|
|
4490
4490
|
{
|
|
4491
4491
|
id: 13,
|
|
4492
4492
|
phase: 11,
|
|
4493
|
-
title: 'Phase
|
|
4493
|
+
title: 'Phase 12: Documentation',
|
|
4494
4494
|
problem: 'Knowledge gets lost. The next developer starts from scratch. They make the same mistakes, ask the same questions.',
|
|
4495
4495
|
solution: 'Cache everything. Research cached with 7-day freshness. API manifest updated. Future sessions benefit from today\'s work.',
|
|
4496
4496
|
hook: 'enforce-documentation.py',
|
|
4497
4497
|
lines: [
|
|
4498
4498
|
{ text: '', class: 'output' },
|
|
4499
4499
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4500
|
-
{ text: '║ PHASE
|
|
4500
|
+
{ text: '║ PHASE 12: DOCUMENTATION ║', class: 'highlight' },
|
|
4501
4501
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4502
4502
|
{ text: '', class: 'output' },
|
|
4503
4503
|
{ text: '→ Write: .claude/research/brandfetch/CURRENT.md', class: 'mcp-call' },
|
|
@@ -4511,17 +4511,17 @@ Required actions:
|
|
|
4511
4511
|
{
|
|
4512
4512
|
id: 14,
|
|
4513
4513
|
phase: 12,
|
|
4514
|
-
title: 'Phase
|
|
4514
|
+
title: 'Phase 13: Completion',
|
|
4515
4515
|
problem: 'How do you know everything is actually done? Claude might claim finished but skip steps.',
|
|
4516
|
-
solution: 'The api-workflow-check hook runs at stop time. Verifies all
|
|
4516
|
+
solution: 'The api-workflow-check hook runs at stop time. Verifies all 12 phases completed. All files created, tests passing, docs updated.',
|
|
4517
4517
|
hook: 'api-workflow-check.py (Stop)',
|
|
4518
4518
|
lines: [
|
|
4519
4519
|
{ text: '', class: 'output' },
|
|
4520
4520
|
{ text: '╔══════════════════════════════════════════════════════════════╗', class: 'highlight' },
|
|
4521
|
-
{ text: '║ PHASE
|
|
4521
|
+
{ text: '║ PHASE 13: COMPLETION ║', class: 'highlight' },
|
|
4522
4522
|
{ text: '╚══════════════════════════════════════════════════════════════╝', class: 'highlight' },
|
|
4523
4523
|
{ text: '', class: 'output' },
|
|
4524
|
-
{ text: '→ api-workflow-check.py verifying all
|
|
4524
|
+
{ text: '→ api-workflow-check.py verifying all 12 phases...', class: 'mcp-call' },
|
|
4525
4525
|
{ text: '', class: 'output' },
|
|
4526
4526
|
{ text: ' ✓ disambiguation: complete', class: 'success' },
|
|
4527
4527
|
{ text: ' ✓ scope: complete', class: 'success' },
|
|
@@ -4539,7 +4539,7 @@ Required actions:
|
|
|
4539
4539
|
{ text: 'Files created: route.ts, brandfetch.test.ts, schema.ts', class: 'output' },
|
|
4540
4540
|
{ text: '', class: 'output' },
|
|
4541
4541
|
{ text: '════════════════════════════════════════════════════════════════', class: 'success' },
|
|
4542
|
-
{ text: ' ✓ WORKFLOW COMPLETE - All
|
|
4542
|
+
{ text: ' ✓ WORKFLOW COMPLETE - All 12 phases verified ', class: 'success' },
|
|
4543
4543
|
{ text: '════════════════════════════════════════════════════════════════', class: 'success' }
|
|
4544
4544
|
]
|
|
4545
4545
|
}
|
|
@@ -5411,7 +5411,7 @@ Required actions:
|
|
|
5411
5411
|
solution: 'Six fixes with Python hooks...',
|
|
5412
5412
|
grounding: 'Research grounding...',
|
|
5413
5413
|
hooks: 'Workflow enforcement...',
|
|
5414
|
-
phases: 'The
|
|
5414
|
+
phases: 'The 12 phases...',
|
|
5415
5415
|
demo: 'See it in action...',
|
|
5416
5416
|
state: 'Persistent memory...',
|
|
5417
5417
|
install: 'Get started...'
|
|
@@ -5659,7 +5659,7 @@ Required actions:
|
|
|
5659
5659
|
solution: 'Solution',
|
|
5660
5660
|
grounding: 'Research',
|
|
5661
5661
|
hooks: 'Workflow',
|
|
5662
|
-
phases: '
|
|
5662
|
+
phases: '12 Phases',
|
|
5663
5663
|
demo: 'Demo',
|
|
5664
5664
|
state: 'Memory',
|
|
5665
5665
|
install: 'Install'
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Hook: PreToolUse for Write/Edit
|
|
4
4
|
Purpose: Block writing if deep research not completed WITH USER APPROVAL
|
|
5
5
|
|
|
6
|
-
Phase
|
|
6
|
+
Phase 5 requires:
|
|
7
7
|
1. PROPOSE searches based on interview answers
|
|
8
8
|
2. Show checkbox list to user
|
|
9
9
|
3. USE AskUserQuestion: "Approve? [Y] / Add more? ____"
|
|
@@ -99,7 +99,7 @@ def main():
|
|
|
99
99
|
|
|
100
100
|
print(json.dumps({
|
|
101
101
|
"permissionDecision": "deny",
|
|
102
|
-
"reason": f"""❌ BLOCKED: Deep research (Phase
|
|
102
|
+
"reason": f"""❌ BLOCKED: Deep research (Phase 5) not complete.
|
|
103
103
|
|
|
104
104
|
Status: {status}
|
|
105
105
|
Proposed searches: {len(proposed)}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Hook: PreToolUse for Write/Edit
|
|
4
4
|
Purpose: Block writing API code if disambiguation phase not complete WITH USER CONFIRMATION
|
|
5
5
|
|
|
6
|
-
Phase
|
|
6
|
+
Phase 1 requires:
|
|
7
7
|
1. Search 3-5 variations of the term
|
|
8
8
|
2. Present options to user via AskUserQuestion
|
|
9
9
|
3. User selects which interpretation
|
|
@@ -55,7 +55,7 @@ def main():
|
|
|
55
55
|
|
|
56
56
|
Run /api-create [endpoint-name] to begin the interview-driven workflow.
|
|
57
57
|
|
|
58
|
-
Phase
|
|
58
|
+
Phase 1 (Disambiguation) is required before any implementation."""
|
|
59
59
|
}))
|
|
60
60
|
sys.exit(0)
|
|
61
61
|
|
|
@@ -95,7 +95,7 @@ Phase 0 (Disambiguation) is required before any implementation."""
|
|
|
95
95
|
|
|
96
96
|
print(json.dumps({
|
|
97
97
|
"permissionDecision": "deny",
|
|
98
|
-
"reason": f"""❌ BLOCKED: Disambiguation phase (Phase
|
|
98
|
+
"reason": f"""❌ BLOCKED: Disambiguation phase (Phase 1) not complete.
|
|
99
99
|
|
|
100
100
|
Status: {status}
|
|
101
101
|
Search variations: {len(search_variations)}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Hook: PreToolUse for Write/Edit (and Stop)
|
|
4
4
|
Purpose: Block completion until documentation confirmed WITH USER REVIEW
|
|
5
5
|
|
|
6
|
-
Phase
|
|
6
|
+
Phase 21 (Documentation) requires:
|
|
7
7
|
1. Update api-tests-manifest.json
|
|
8
8
|
2. Cache research to .claude/research/
|
|
9
9
|
3. Update OpenAPI spec if applicable
|
|
@@ -93,7 +93,7 @@ def main():
|
|
|
93
93
|
|
|
94
94
|
print(json.dumps({
|
|
95
95
|
"permissionDecision": "deny",
|
|
96
|
-
"reason": f"""❌ BLOCKED: Documentation (Phase
|
|
96
|
+
"reason": f"""❌ BLOCKED: Documentation (Phase 21) not complete.
|
|
97
97
|
|
|
98
98
|
Status: {status}
|
|
99
99
|
Manifest updated: {manifest_updated}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Hook: PreToolUse for Write/Edit
|
|
4
4
|
Purpose: Block writing if environment not verified WITH USER READINESS CONFIRMATION
|
|
5
5
|
|
|
6
|
-
Phase
|
|
6
|
+
Phase 7 requires:
|
|
7
7
|
1. Check required API keys based on endpoint/interview
|
|
8
8
|
2. Report found/missing keys to user
|
|
9
9
|
3. USE AskUserQuestion: "Ready for testing? [Y/n]"
|
|
@@ -163,7 +163,7 @@ def main():
|
|
|
163
163
|
|
|
164
164
|
print(json.dumps({
|
|
165
165
|
"permissionDecision": "deny",
|
|
166
|
-
"reason": f"""❌ BLOCKED: Environment check (Phase
|
|
166
|
+
"reason": f"""❌ BLOCKED: Environment check (Phase 7) not complete.
|
|
167
167
|
|
|
168
168
|
Current status: {env_status}
|
|
169
169
|
Required keys: {len(keys_required)}
|
|
@@ -6,9 +6,9 @@ Purpose: Block refactoring until verification phase is complete
|
|
|
6
6
|
This hook ensures that after tests pass (Green phase), the implementation
|
|
7
7
|
is verified against documentation before any refactoring begins.
|
|
8
8
|
|
|
9
|
-
Phase
|
|
9
|
+
Phase 20 of the 13-phase workflow requires:
|
|
10
10
|
- TDD Green phase complete (tests passing)
|
|
11
|
-
- Verify phase complete (Phase
|
|
11
|
+
- Verify phase complete (Phase 10)
|
|
12
12
|
- All gaps found have been fixed or documented as intentional omissions
|
|
13
13
|
|
|
14
14
|
Returns:
|
|
@@ -124,7 +124,7 @@ def main():
|
|
|
124
124
|
if verify_status != "complete" or not phase_exit_confirmed:
|
|
125
125
|
print(json.dumps({
|
|
126
126
|
"permissionDecision": "deny",
|
|
127
|
-
"reason": f"""❌ BLOCKED: Verify phase (Phase
|
|
127
|
+
"reason": f"""❌ BLOCKED: Verify phase (Phase 10) not complete.
|
|
128
128
|
|
|
129
129
|
Current status: {verify_status}
|
|
130
130
|
Gaps found: {gaps_found}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Hook: PreToolUse for Write/Edit
|
|
4
4
|
Purpose: Block writing API code if research phase not complete WITH USER CHECKPOINT
|
|
5
5
|
|
|
6
|
-
Phase
|
|
6
|
+
Phase 3 requires:
|
|
7
7
|
1. Execute 2-3 initial searches (Context7, WebSearch)
|
|
8
8
|
2. Present summary TABLE to user
|
|
9
9
|
3. USE AskUserQuestion: "Proceed? [Y] / Search more? [n]"
|
|
@@ -85,7 +85,7 @@ Run /api-create [endpoint-name] to start the workflow."""
|
|
|
85
85
|
|
|
86
86
|
print(json.dumps({
|
|
87
87
|
"permissionDecision": "deny",
|
|
88
|
-
"reason": f"""❌ BLOCKED: Initial research (Phase
|
|
88
|
+
"reason": f"""❌ BLOCKED: Initial research (Phase 3) not complete.
|
|
89
89
|
|
|
90
90
|
Status: {status}
|
|
91
91
|
Sources consulted: {len(sources)}
|