@hustle-together/api-dev-tools 3.3.0 → 3.5.0

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 (45) hide show
  1. package/README.md +712 -377
  2. package/commands/api-create.md +68 -23
  3. package/demo/hustle-together/blog/gemini-vs-claude-widgets.html +1 -1
  4. package/demo/hustle-together/blog/interview-driven-api-development.html +1 -1
  5. package/demo/hustle-together/blog/tdd-for-ai.html +1 -1
  6. package/demo/hustle-together/index.html +2 -2
  7. package/demo/workflow-demo-v3.5-backup.html +5008 -0
  8. package/demo/workflow-demo.html +5137 -3805
  9. package/hooks/enforce-deep-research.py +6 -1
  10. package/hooks/enforce-disambiguation.py +7 -1
  11. package/hooks/enforce-documentation.py +6 -1
  12. package/hooks/enforce-environment.py +5 -1
  13. package/hooks/enforce-interview.py +5 -1
  14. package/hooks/enforce-refactor.py +3 -1
  15. package/hooks/enforce-schema.py +0 -0
  16. package/hooks/enforce-scope.py +5 -1
  17. package/hooks/enforce-tdd-red.py +5 -1
  18. package/hooks/enforce-verify.py +0 -0
  19. package/hooks/track-tool-use.py +167 -0
  20. package/hooks/verify-implementation.py +0 -0
  21. package/package.json +1 -1
  22. package/templates/api-dev-state.json +24 -0
  23. package/demo/audio/audio-sync.js +0 -295
  24. package/demo/audio/generate-all-narrations.js +0 -581
  25. package/demo/audio/generate-narration.js +0 -486
  26. package/demo/audio/generate-voice-previews.js +0 -140
  27. package/demo/audio/narration-adam-timing.json +0 -4675
  28. package/demo/audio/narration-adam.mp3 +0 -0
  29. package/demo/audio/narration-creature-timing.json +0 -4675
  30. package/demo/audio/narration-creature.mp3 +0 -0
  31. package/demo/audio/narration-gaming-timing.json +0 -4675
  32. package/demo/audio/narration-gaming.mp3 +0 -0
  33. package/demo/audio/narration-hope-timing.json +0 -4675
  34. package/demo/audio/narration-hope.mp3 +0 -0
  35. package/demo/audio/narration-mark-timing.json +0 -4675
  36. package/demo/audio/narration-mark.mp3 +0 -0
  37. package/demo/audio/narration-timing.json +0 -3614
  38. package/demo/audio/narration-timing.sample.json +0 -48
  39. package/demo/audio/narration.mp3 +0 -0
  40. package/demo/audio/previews/manifest.json +0 -30
  41. package/demo/audio/previews/preview-creature.mp3 +0 -0
  42. package/demo/audio/previews/preview-gaming.mp3 +0 -0
  43. package/demo/audio/previews/preview-hope.mp3 +0 -0
  44. package/demo/audio/previews/preview-mark.mp3 +0 -0
  45. package/demo/audio/voices-manifest.json +0 -50
@@ -16,29 +16,75 @@ This workflow requires REAL user input at each phase. You are **FORBIDDEN** from
16
16
 
17
17
  ### How to Ask Questions Correctly
18
18
 
19
- At every `[Y/n]` or multiple-choice prompt in this workflow, you MUST call:
19
+ At every `[Y/n]` or multiple-choice prompt in this workflow, you MUST call the `AskUserQuestion` tool with this EXACT schema:
20
20
 
21
+ ```json
22
+ {
23
+ "questions": [
24
+ {
25
+ "question": "Your question here? (must end with ?)",
26
+ "header": "Phase",
27
+ "multiSelect": false,
28
+ "options": [
29
+ {"label": "Option A", "description": "What this option means"},
30
+ {"label": "Option B", "description": "What this option means"},
31
+ {"label": "Other", "description": "I'll type my own answer"}
32
+ ]
33
+ }
34
+ ]
35
+ }
21
36
  ```
22
- AskUserQuestion({
23
- questions: [{
24
- question: "Your question here?",
25
- header: "Phase",
26
- options: ["Option A", "Option B", "Option C", "Type something else..."]
27
- }]
28
- })
29
- ```
30
37
 
31
- **WAIT for the user's response before proceeding.** The tool will pause execution until the user answers.
38
+ **CRITICAL REQUIREMENTS:**
39
+ - `header`: Max 12 characters (e.g., "Scope", "Research", "Format")
40
+ - `options`: 2-4 options, each with `label` (1-5 words) and `description`
41
+ - `multiSelect`: Required boolean (true for checkboxes, false for radio)
42
+ - `question`: Must end with a question mark
43
+ - Users can always select "Other" to provide custom input
44
+
45
+ **WAIT for the user's response before proceeding.** The tool will show a UI dialog and pause execution until the user answers. Do NOT continue until you receive the response.
32
46
 
33
47
  ### Violation Detection
34
48
 
35
49
  The enforcement hooks will BLOCK your progress if:
36
50
  - `user_question_asked` is false for any phase
37
51
  - `user_confirmed`/`user_approved`/`user_completed` is false
52
+ - `phase_exit_confirmed` is false (user must explicitly approve proceeding to next phase)
38
53
  - Questions were not asked via the AskUserQuestion tool
39
54
 
40
55
  If you see "BLOCKED" messages, it means you skipped user interaction.
41
56
 
57
+ ### Phase Exit Confirmation (NEW in v3.5.0)
58
+
59
+ **Every phase requires an EXIT CONFIRMATION question** before proceeding to the next phase. This prevents Claude from self-answering and moving on without explicit user approval.
60
+
61
+ The exit confirmation question MUST:
62
+ 1. Summarize what was accomplished in the current phase
63
+ 2. Ask if user is ready to proceed to the next phase
64
+ 3. Include options like "Yes, proceed", "No, I have changes", "Add more"
65
+
66
+ Example exit confirmation:
67
+ ```json
68
+ {
69
+ "questions": [{
70
+ "question": "Phase complete. Research found 5 sources. Ready to proceed to Interview phase?",
71
+ "header": "Proceed",
72
+ "multiSelect": false,
73
+ "options": [
74
+ {"label": "Yes, proceed", "description": "Move to next phase"},
75
+ {"label": "No, more research", "description": "I need additional research on [topic]"},
76
+ {"label": "Review sources", "description": "Show me what was found"}
77
+ ]
78
+ }]
79
+ }
80
+ ```
81
+
82
+ The `phase_exit_confirmed` flag is automatically set when:
83
+ 1. An `AskUserQuestion` is called with a question containing words like "proceed", "continue", "ready", "confirm", "approve"
84
+ 2. The user responds with an affirmative answer (yes, proceed, confirm, approve, etc.)
85
+
86
+ Both conditions must be true for the flag to be set.
87
+
42
88
  ---
43
89
 
44
90
  ## Key Principles
@@ -62,21 +108,20 @@ If you see "BLOCKED" messages, it means you skipped user interaction.
62
108
  │ • "[term] SDK" │
63
109
  │ • "[term] npm package" │
64
110
  │ │
65
- │ ⚠️ REQUIRED: Use AskUserQuestion tool:
66
- │ │
67
- AskUserQuestion({
68
- │ questions: [{
69
- │ question: "I found multiple things matching
70
- '[term]'. Which should we use?",
71
- header: "Disambig",
72
- │ options: [
73
- │ "Option A - Description", │
74
- │ "Option B - Description", │
75
- │ "Both A and B",
76
- │ "Something else (I'll describe)" │
111
+ │ ⚠️ REQUIRED: Use AskUserQuestion tool with EXACT schema:
112
+ │ │
113
+ │ {
114
+ "questions": [{
115
+ "question": "Which interpretation of [term]?",
116
+ "header": "Disambig",
117
+ "multiSelect": false,
118
+ "options": [
119
+ {"label": "REST API", "description": "Official API"},│
120
+ {"label": "SDK/Package", "description": "NPM wrapper"},│
121
+ {"label": "Both", "description": "API + SDK"}
77
122
  │ ] │
78
123
  │ }] │
79
- │ })
124
+ │ } │
80
125
  │ │
81
126
  │ WAIT for user response. Do NOT proceed without it. │
82
127
  │ ──── Loop back if user selects "Something else" ──── │
@@ -7,7 +7,7 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=Fredoka:wght@600;700&display=swap" rel="stylesheet">
10
- <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
10
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.14.1/gsap.min.js"></script>
11
11
  <style>
12
12
  * { margin: 0; padding: 0; box-sizing: border-box; }
13
13
 
@@ -7,7 +7,7 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=Fredoka:wght@600;700&display=swap" rel="stylesheet">
10
- <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
10
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.14.1/gsap.min.js"></script>
11
11
  <style>
12
12
  * {
13
13
  margin: 0;
@@ -7,7 +7,7 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=Fredoka:wght@600;700&display=swap" rel="stylesheet">
10
- <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
10
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.14.1/gsap.min.js"></script>
11
11
  <style>
12
12
  * { margin: 0; padding: 0; box-sizing: border-box; }
13
13
 
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=Righteous&family=Bungee&family=Fredoka:wght@600;700&display=swap" rel="stylesheet">
10
- <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
11
- <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollTrigger.min.js"></script>
10
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.14.1/gsap.min.js"></script>
11
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.14.1/ScrollTrigger.min.js"></script>
12
12
  <style>
13
13
  /* ============================================
14
14
  HUSTLE TOGETHER - 90s BOXY AESTHETIC