@hustle-together/api-dev-tools 3.12.3 → 4.5.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/.claude/adr-requests/.gitkeep +10 -0
- package/.claude/agents/adr-researcher.md +109 -0
- package/.claude/agents/visual-analyzer.md +183 -0
- package/.claude/api-dev-state.json +7 -463
- package/.claude/documentation-audit.json +114 -0
- package/.claude/registry.json +289 -0
- package/.claude/settings.json +45 -1
- package/.claude/workflow-logs/None.json +49 -0
- package/.claude/workflow-logs/session-20251230-143727.json +106 -0
- package/.skills/adr-deep-research/SKILL.md +351 -0
- package/.skills/api-create/SKILL.md +116 -17
- package/.skills/api-research/SKILL.md +130 -0
- package/.skills/docs-sync/SKILL.md +260 -0
- package/.skills/docs-update/SKILL.md +205 -0
- package/.skills/hustle-brand/SKILL.md +368 -0
- package/.skills/hustle-build/SKILL.md +786 -0
- package/.skills/hustle-build-review/SKILL.md +518 -0
- package/.skills/parallel-spawn/SKILL.md +212 -0
- package/.skills/ralph-continue/SKILL.md +151 -0
- package/.skills/ralph-loop/SKILL.md +341 -0
- package/.skills/ralph-status/SKILL.md +87 -0
- package/.skills/refactor/SKILL.md +59 -0
- package/.skills/shadcn/SKILL.md +522 -0
- package/.skills/test-all/SKILL.md +210 -0
- package/.skills/test-builds/SKILL.md +208 -0
- package/.skills/test-debug/SKILL.md +212 -0
- package/.skills/test-e2e/SKILL.md +168 -0
- package/.skills/test-review/SKILL.md +707 -0
- package/.skills/test-unit/SKILL.md +143 -0
- package/.skills/test-visual/SKILL.md +301 -0
- package/.skills/token-report/SKILL.md +132 -0
- package/CHANGELOG.md +575 -0
- package/README.md +426 -56
- package/bin/cli.js +1538 -88
- package/commands/hustle-api-create.md +22 -0
- package/commands/hustle-build.md +259 -0
- package/commands/hustle-combine.md +81 -2
- package/commands/hustle-ui-create-page.md +84 -2
- package/commands/hustle-ui-create.md +82 -2
- package/hooks/__pycache__/api-workflow-check.cpython-314.pyc +0 -0
- package/hooks/__pycache__/auto-answer.cpython-314.pyc +0 -0
- package/hooks/__pycache__/cache-research.cpython-314.pyc +0 -0
- package/hooks/__pycache__/check-api-routes.cpython-314.pyc +0 -0
- package/hooks/__pycache__/check-playwright-setup.cpython-314.pyc +0 -0
- package/hooks/__pycache__/check-storybook-setup.cpython-314.pyc +0 -0
- package/hooks/__pycache__/check-update.cpython-314.pyc +0 -0
- package/hooks/__pycache__/completion-promise-detector.cpython-314.pyc +0 -0
- package/hooks/__pycache__/context-capacity-warning.cpython-314.pyc +0 -0
- package/hooks/__pycache__/detect-interruption.cpython-314.pyc +0 -0
- package/hooks/__pycache__/docs-update-check.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-a11y-audit.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-brand-guide.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-component-type-confirm.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-deep-research.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-disambiguation.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-documentation.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-dry-run.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-environment.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-external-research.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-freshness.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-interview.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-page-components.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-page-data-schema.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-questions-sourced.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-refactor.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-research.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-schema-from-interview.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-schema.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-scope.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-tdd-red.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-ui-disambiguation.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-ui-interview.cpython-314.pyc +0 -0
- package/hooks/__pycache__/enforce-verify.cpython-314.pyc +0 -0
- package/hooks/__pycache__/generate-adr-options.cpython-314.pyc +0 -0
- package/hooks/__pycache__/generate-manifest-entry.cpython-314.pyc +0 -0
- package/hooks/__pycache__/hook_utils.cpython-314.pyc +0 -0
- package/hooks/__pycache__/notify-input-needed.cpython-314.pyc +0 -0
- package/hooks/__pycache__/notify-phase-complete.cpython-314.pyc +0 -0
- package/hooks/__pycache__/ntfy-on-question.cpython-314.pyc +0 -0
- package/hooks/__pycache__/orchestrator-completion.cpython-314.pyc +0 -0
- package/hooks/__pycache__/orchestrator-handoff.cpython-314.pyc +0 -0
- package/hooks/__pycache__/orchestrator-session-startup.cpython-314.pyc +0 -0
- package/hooks/__pycache__/parallel-orchestrator.cpython-314.pyc +0 -0
- package/hooks/__pycache__/periodic-reground.cpython-314.pyc +0 -0
- package/hooks/__pycache__/project-document-prompt.cpython-314.pyc +0 -0
- package/hooks/__pycache__/remote-question-proxy.cpython-314.pyc +0 -0
- package/hooks/__pycache__/remote-question-server.cpython-314.pyc +0 -0
- package/hooks/__pycache__/run-code-review.cpython-314.pyc +0 -0
- package/hooks/__pycache__/run-visual-qa.cpython-314.pyc +0 -0
- package/hooks/__pycache__/session-logger.cpython-314.pyc +0 -0
- package/hooks/__pycache__/session-startup.cpython-314.pyc +0 -0
- package/hooks/__pycache__/track-scope-coverage.cpython-314.pyc +0 -0
- package/hooks/__pycache__/track-token-usage.cpython-314.pyc +0 -0
- package/hooks/__pycache__/track-tool-use.cpython-314.pyc +0 -0
- package/hooks/__pycache__/update-adr-decision.cpython-314.pyc +0 -0
- package/hooks/__pycache__/update-api-showcase.cpython-314.pyc +0 -0
- package/hooks/__pycache__/update-registry.cpython-314.pyc +0 -0
- package/hooks/__pycache__/update-ui-showcase.cpython-314.pyc +0 -0
- package/hooks/__pycache__/verify-after-green.cpython-314.pyc +0 -0
- package/hooks/__pycache__/verify-implementation.cpython-314.pyc +0 -0
- package/hooks/api-workflow-check.py +34 -0
- package/hooks/auto-answer.py +305 -0
- package/hooks/check-update.py +132 -0
- package/hooks/completion-promise-detector.py +293 -0
- package/hooks/context-capacity-warning.py +171 -0
- package/hooks/docs-update-check.py +120 -0
- package/hooks/enforce-dry-run.py +134 -0
- package/hooks/enforce-external-research.py +25 -0
- package/hooks/enforce-interview.py +20 -0
- package/hooks/generate-adr-options.py +282 -0
- package/hooks/hook_utils.py +609 -0
- package/hooks/lib/__pycache__/__init__.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/greptile.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/ntfy.cpython-314.pyc +0 -0
- package/hooks/ntfy-on-question.py +240 -0
- package/hooks/orchestrator-completion.py +313 -0
- package/hooks/orchestrator-handoff.py +267 -0
- package/hooks/orchestrator-session-startup.py +146 -0
- package/hooks/parallel-orchestrator.py +451 -0
- package/hooks/periodic-reground.py +270 -67
- package/hooks/project-document-prompt.py +302 -0
- package/hooks/remote-question-proxy.py +284 -0
- package/hooks/remote-question-server.py +1224 -0
- package/hooks/run-code-review.py +176 -29
- package/hooks/run-visual-qa.py +338 -0
- package/hooks/session-logger.py +27 -1
- package/hooks/session-startup.py +113 -0
- package/hooks/update-adr-decision.py +236 -0
- package/hooks/update-api-showcase.py +13 -1
- package/hooks/update-testing-checklist.py +195 -0
- package/hooks/update-ui-showcase.py +13 -1
- package/package.json +7 -3
- package/scripts/extract-schema-docs.cjs +322 -0
- package/templates/.skills/hustle-interview/SKILL.md +174 -0
- package/templates/CLAUDE-SECTION.md +89 -64
- package/templates/adr-viewer/_components/ADRViewer.tsx +326 -0
- package/templates/api-dev-state.json +33 -1
- package/templates/api-showcase/_components/APIModal.tsx +100 -8
- package/templates/api-showcase/_components/APIShowcase.tsx +36 -4
- package/templates/api-showcase/_components/APITester.tsx +367 -58
- package/templates/brand-page/page.tsx +645 -0
- package/templates/component/Component.visual.spec.ts +30 -24
- package/templates/docs/page.tsx +230 -0
- package/templates/eslint-plugin-zod-schema/index.js +446 -0
- package/templates/eslint-plugin-zod-schema/package.json +26 -0
- package/templates/github-workflows/security.yml +274 -0
- package/templates/hustle-build-defaults.json +136 -0
- package/templates/hustle-dev-dashboard/page.tsx +365 -0
- package/templates/page/page.e2e.test.ts +30 -26
- package/templates/performance-budgets.json +63 -5
- package/templates/playwright-report/page.tsx +258 -0
- package/templates/registry.json +279 -3
- package/templates/review-dashboard/page.tsx +510 -0
- package/templates/settings.json +155 -7
- package/templates/test-results/page.tsx +237 -0
- package/templates/typedoc.json +19 -0
- package/templates/ui-showcase/_components/UIShowcase.tsx +48 -1
- package/templates/ui-showcase/_components/VisualTestingDashboard.tsx +579 -0
- package/templates/ui-showcase/page.tsx +1 -1
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hustle-build-review
|
|
3
|
+
description: Review auto-build results, decisions, and logs. Analyze what happened during a /hustle-build execution.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Requires Claude Code with hooks configured
|
|
6
|
+
metadata:
|
|
7
|
+
version: "4.0.0"
|
|
8
|
+
category: "review"
|
|
9
|
+
tags: ["review", "audit", "analysis", "auto-mode"]
|
|
10
|
+
author: "Hustle Together"
|
|
11
|
+
allowed-tools: Read Glob Grep WebFetch AskUserQuestion TodoWrite
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Hustle Build Review - Auto-Build Analysis
|
|
15
|
+
|
|
16
|
+
Review and analyze the results of a `/hustle-build` execution. Essential for understanding what decisions were made in auto-mode and identifying areas for improvement.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/hustle-build-review [build-id]
|
|
22
|
+
/hustle-build-review --latest
|
|
23
|
+
/hustle-build-review --list
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Arguments
|
|
27
|
+
|
|
28
|
+
- `$ARGUMENTS` - Build ID to review (e.g., `build-2025-12-28-dashboard`)
|
|
29
|
+
- `--latest` - Review the most recent build
|
|
30
|
+
- `--list` - List all available build logs
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Phase 1: Load Build Data
|
|
35
|
+
|
|
36
|
+
### 1.1 Find Build Log
|
|
37
|
+
|
|
38
|
+
If `--list`:
|
|
39
|
+
```bash
|
|
40
|
+
ls -la .claude/workflow-logs/build-*.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Display table:
|
|
44
|
+
```
|
|
45
|
+
Available Builds:
|
|
46
|
+
| Build ID | Date | Status | Elements |
|
|
47
|
+
|-----------------------------|------------|----------|----------|
|
|
48
|
+
| build-2025-12-28-dashboard | 2025-12-28 | complete | 8 |
|
|
49
|
+
| build-2025-12-27-checkout | 2025-12-27 | complete | 5 |
|
|
50
|
+
| build-2025-12-26-auth | 2025-12-26 | failed | 3 |
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
If `--latest`:
|
|
54
|
+
- Find most recent `build-*.json` file
|
|
55
|
+
- Load that build ID
|
|
56
|
+
|
|
57
|
+
### 1.2 Load Files
|
|
58
|
+
|
|
59
|
+
Load from `.claude/`:
|
|
60
|
+
- `hustle-build-state.json` - Orchestration state
|
|
61
|
+
- `workflow-logs/[build-id].json` - Detailed log
|
|
62
|
+
- `registry.json` - Created elements
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Phase 2: Executive Summary
|
|
67
|
+
|
|
68
|
+
Present high-level overview:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
BUILD REVIEW: [Build ID]
|
|
72
|
+
============================================================
|
|
73
|
+
|
|
74
|
+
Status: [complete/failed/interrupted]
|
|
75
|
+
Duration: [X minutes]
|
|
76
|
+
Mode: [interactive/auto]
|
|
77
|
+
|
|
78
|
+
CREATED:
|
|
79
|
+
APIs: X new + Y combined
|
|
80
|
+
Components: X new
|
|
81
|
+
Pages: X new
|
|
82
|
+
|
|
83
|
+
TESTS:
|
|
84
|
+
Total: X tests
|
|
85
|
+
Passed: X (XX%)
|
|
86
|
+
Failed: X
|
|
87
|
+
|
|
88
|
+
DECISIONS:
|
|
89
|
+
Total Questions: X
|
|
90
|
+
Auto-Answered: X (if auto mode)
|
|
91
|
+
User-Answered: X
|
|
92
|
+
|
|
93
|
+
============================================================
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Phase 3: Decision Audit
|
|
99
|
+
|
|
100
|
+
### 3.1 Orchestrator Decisions
|
|
101
|
+
|
|
102
|
+
Show high-level decisions from orchestrator interview:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
ORCHESTRATOR DECISIONS
|
|
106
|
+
----------------------
|
|
107
|
+
|
|
108
|
+
Q1: Authentication
|
|
109
|
+
Answer: Protected (requires login)
|
|
110
|
+
Source: [user | auto-comprehensive | default]
|
|
111
|
+
Applied: All 8 elements
|
|
112
|
+
|
|
113
|
+
Q2: Error Handling
|
|
114
|
+
Answer: Partial success
|
|
115
|
+
Source: [user | auto-comprehensive | default]
|
|
116
|
+
Applied: Combined API, individual APIs
|
|
117
|
+
|
|
118
|
+
Q3: Brand Guide
|
|
119
|
+
Answer: Yes, use BRAND_GUIDE.md
|
|
120
|
+
Source: [user | auto-comprehensive | default]
|
|
121
|
+
Applied: All components, page
|
|
122
|
+
|
|
123
|
+
Q4: Testing Level
|
|
124
|
+
Answer: Full TDD (all 14 phases)
|
|
125
|
+
Source: [user | auto-comprehensive | default]
|
|
126
|
+
Applied: All elements
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 3.2 Per-Element Decisions
|
|
130
|
+
|
|
131
|
+
For each element, show workflow-specific decisions:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
ELEMENT: user-stats (API)
|
|
135
|
+
-------------------------
|
|
136
|
+
|
|
137
|
+
Interview Questions:
|
|
138
|
+
Q: "Which stats to include?"
|
|
139
|
+
Answer: Comprehensive (all available)
|
|
140
|
+
Source: auto-comprehensive
|
|
141
|
+
Reason: "Selected most comprehensive option"
|
|
142
|
+
|
|
143
|
+
Q: "Rate limiting?"
|
|
144
|
+
Answer: Yes, 100 req/min
|
|
145
|
+
Source: default (hustle-build-defaults.json)
|
|
146
|
+
|
|
147
|
+
Q: "Caching strategy?"
|
|
148
|
+
Answer: Individual (per-endpoint)
|
|
149
|
+
Source: shared_decisions (orchestrator)
|
|
150
|
+
|
|
151
|
+
Would you have answered differently? [View code to adjust]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 3.3 Decision Summary Table
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
DECISION SUMMARY
|
|
158
|
+
----------------
|
|
159
|
+
|
|
160
|
+
| Element | Questions | Auto | User | Default | Shared |
|
|
161
|
+
|--------------|-----------|------|------|---------|--------|
|
|
162
|
+
| user-stats | 3 | 1 | 0 | 1 | 1 |
|
|
163
|
+
| chart-data | 3 | 2 | 0 | 0 | 1 |
|
|
164
|
+
| StatCard | 4 | 3 | 0 | 0 | 1 |
|
|
165
|
+
| Dashboard | 2 | 1 | 0 | 0 | 1 |
|
|
166
|
+
| TOTAL | 12 | 7 | 0 | 1 | 4 |
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Phase 4: Workflow Analysis
|
|
172
|
+
|
|
173
|
+
### 4.1 Execution Timeline
|
|
174
|
+
|
|
175
|
+
Show how workflows executed:
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
EXECUTION TIMELINE
|
|
179
|
+
------------------
|
|
180
|
+
|
|
181
|
+
10:00:00 BUILD START
|
|
182
|
+
10:00:15 Orchestrator interview complete (4 questions)
|
|
183
|
+
|
|
184
|
+
TIER 1 (APIs - parallel eligible):
|
|
185
|
+
10:00:30 [api] user-stats START
|
|
186
|
+
10:08:45 [api] user-stats COMPLETE (8m 15s, 4 tests)
|
|
187
|
+
10:08:50 [api] chart-data START
|
|
188
|
+
10:17:22 [api] chart-data COMPLETE (8m 32s, 4 tests)
|
|
189
|
+
10:17:25 [api] dashboard-metrics START
|
|
190
|
+
10:25:40 [api] dashboard-metrics COMPLETE (8m 15s, 4 tests)
|
|
191
|
+
|
|
192
|
+
TIER 2 (Combined API):
|
|
193
|
+
10:25:45 [combined] dashboard-data START
|
|
194
|
+
10:38:20 [combined] dashboard-data COMPLETE (12m 35s, 8 tests)
|
|
195
|
+
|
|
196
|
+
TIER 3 (Components):
|
|
197
|
+
10:38:25 [component] StatCard START
|
|
198
|
+
10:50:10 [component] StatCard COMPLETE (11m 45s, 5 tests)
|
|
199
|
+
10:50:15 [component] ChartWidget START
|
|
200
|
+
11:02:30 [component] ChartWidget COMPLETE (12m 15s, 5 tests)
|
|
201
|
+
|
|
202
|
+
TIER 4 (Page):
|
|
203
|
+
11:02:35 [page] Dashboard START
|
|
204
|
+
11:22:50 [page] Dashboard COMPLETE (20m 15s, 17 tests)
|
|
205
|
+
|
|
206
|
+
11:23:00 Cross-workflow wiring
|
|
207
|
+
11:25:00 Final verification (47 tests)
|
|
208
|
+
11:26:30 Documentation rollup
|
|
209
|
+
|
|
210
|
+
11:27:00 BUILD COMPLETE
|
|
211
|
+
|
|
212
|
+
Total Duration: 87 minutes
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 4.2 Per-Element Details
|
|
216
|
+
|
|
217
|
+
For each element, show:
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
ELEMENT DETAIL: user-stats (API)
|
|
221
|
+
================================
|
|
222
|
+
|
|
223
|
+
Phases Completed: 14/14
|
|
224
|
+
Duration: 8m 15s
|
|
225
|
+
Tests: 4 passed, 0 failed
|
|
226
|
+
|
|
227
|
+
Files Created:
|
|
228
|
+
- src/app/api/v2/user-stats/route.ts
|
|
229
|
+
- src/lib/schemas/user-stats.schema.ts
|
|
230
|
+
- src/app/api/v2/user-stats/__tests__/route.test.ts
|
|
231
|
+
|
|
232
|
+
Registry Entry:
|
|
233
|
+
{
|
|
234
|
+
"name": "user-stats",
|
|
235
|
+
"type": "api",
|
|
236
|
+
"path": "/api/v2/user-stats",
|
|
237
|
+
"schema": "src/lib/schemas/user-stats.schema.ts",
|
|
238
|
+
"exportedTypes": ["UserStatsResponse", "UserStatsParams"]
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
Research Sources:
|
|
242
|
+
- Context7: /supabase/supabase (user stats patterns)
|
|
243
|
+
- WebSearch: "user statistics API best practices 2025"
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Phase 5: Issues & Resolutions
|
|
249
|
+
|
|
250
|
+
### 5.1 Issues Encountered
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
ISSUES ENCOUNTERED
|
|
254
|
+
------------------
|
|
255
|
+
|
|
256
|
+
Issue #1:
|
|
257
|
+
Workflow: chart-data
|
|
258
|
+
Phase: TDD Green (Phase 9)
|
|
259
|
+
Problem: Test failed on first attempt
|
|
260
|
+
Error: "TypeError: chartType is not defined"
|
|
261
|
+
|
|
262
|
+
Resolution: Retried, passed on attempt 2
|
|
263
|
+
Auto-fix: Yes (retry logic)
|
|
264
|
+
|
|
265
|
+
Code diff:
|
|
266
|
+
- const type = chartType;
|
|
267
|
+
+ const type = params.chartType ?? 'line';
|
|
268
|
+
|
|
269
|
+
Issue #2:
|
|
270
|
+
Workflow: Dashboard (page)
|
|
271
|
+
Phase: Verification (Phase 10)
|
|
272
|
+
Problem: Missing loading state
|
|
273
|
+
|
|
274
|
+
Resolution: Added Suspense boundary
|
|
275
|
+
Auto-fix: Yes (verification loop)
|
|
276
|
+
|
|
277
|
+
Code added:
|
|
278
|
+
+ <Suspense fallback={<DashboardSkeleton />}>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### 5.2 Unresolved Issues
|
|
282
|
+
|
|
283
|
+
If any:
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
UNRESOLVED ISSUES
|
|
287
|
+
-----------------
|
|
288
|
+
|
|
289
|
+
Issue #1:
|
|
290
|
+
Workflow: ChartWidget
|
|
291
|
+
Phase: Code Review (Phase 11)
|
|
292
|
+
Problem: "Consider adding aria-label for accessibility"
|
|
293
|
+
Status: Logged for future improvement
|
|
294
|
+
|
|
295
|
+
Recommended action:
|
|
296
|
+
Edit src/components/ChartWidget/ChartWidget.tsx
|
|
297
|
+
Add: aria-label={`${chartType} chart showing ${dataLabel}`}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Phase 6: Test Results
|
|
303
|
+
|
|
304
|
+
### 6.1 Test Summary
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
TEST RESULTS
|
|
308
|
+
------------
|
|
309
|
+
|
|
310
|
+
Unit Tests:
|
|
311
|
+
src/app/api/v2/user-stats/__tests__/route.test.ts 4/4 PASS
|
|
312
|
+
src/app/api/v2/chart-data/__tests__/route.test.ts 4/4 PASS
|
|
313
|
+
src/app/api/v2/dashboard-data/__tests__/route.test.ts 8/8 PASS
|
|
314
|
+
src/components/StatCard/__tests__/StatCard.test.ts 5/5 PASS
|
|
315
|
+
src/components/ChartWidget/__tests__/ChartWidget.test.ts 5/5 PASS
|
|
316
|
+
|
|
317
|
+
E2E Tests:
|
|
318
|
+
e2e/dashboard.spec.ts 12/12 PASS
|
|
319
|
+
|
|
320
|
+
Integration Tests:
|
|
321
|
+
src/app/dashboard/__tests__/page.test.ts 9/9 PASS
|
|
322
|
+
|
|
323
|
+
TOTAL: 47/47 tests passing (100%)
|
|
324
|
+
Coverage: 94%
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### 6.2 Coverage Breakdown
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
COVERAGE BY ELEMENT
|
|
331
|
+
-------------------
|
|
332
|
+
|
|
333
|
+
| Element | Statements | Branches | Functions | Lines |
|
|
334
|
+
|------------------|------------|----------|-----------|-------|
|
|
335
|
+
| user-stats | 98% | 95% | 100% | 98% |
|
|
336
|
+
| chart-data | 96% | 92% | 100% | 96% |
|
|
337
|
+
| dashboard-data | 94% | 90% | 100% | 94% |
|
|
338
|
+
| StatCard | 100% | 100% | 100% | 100% |
|
|
339
|
+
| ChartWidget | 92% | 88% | 100% | 92% |
|
|
340
|
+
| Dashboard page | 89% | 85% | 100% | 89% |
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Phase 7: Registry Impact
|
|
346
|
+
|
|
347
|
+
### 7.1 Elements Added
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
REGISTRY ADDITIONS
|
|
351
|
+
------------------
|
|
352
|
+
|
|
353
|
+
APIs (3 new):
|
|
354
|
+
apis.user-stats
|
|
355
|
+
apis.chart-data
|
|
356
|
+
apis.dashboard-metrics
|
|
357
|
+
|
|
358
|
+
Combined APIs (1 new):
|
|
359
|
+
combined.dashboard-data
|
|
360
|
+
Sources: [user-stats, chart-data, dashboard-metrics]
|
|
361
|
+
|
|
362
|
+
Components (2 new):
|
|
363
|
+
components.StatCard
|
|
364
|
+
components.ChartWidget
|
|
365
|
+
|
|
366
|
+
Pages (1 new):
|
|
367
|
+
pages.Dashboard
|
|
368
|
+
Route: /dashboard
|
|
369
|
+
Components: [StatCard, ChartWidget]
|
|
370
|
+
Data: dashboard-data
|
|
371
|
+
|
|
372
|
+
Type Exports (8 new):
|
|
373
|
+
UserStatsResponse, UserStatsParams
|
|
374
|
+
ChartDataResponse, ChartDataParams
|
|
375
|
+
DashboardMetricsResponse
|
|
376
|
+
DashboardDataResponse
|
|
377
|
+
StatCardProps
|
|
378
|
+
ChartWidgetProps
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### 7.2 Relationships
|
|
382
|
+
|
|
383
|
+
```
|
|
384
|
+
DEPENDENCY GRAPH
|
|
385
|
+
----------------
|
|
386
|
+
|
|
387
|
+
dashboard-data (combined)
|
|
388
|
+
├── user-stats (api)
|
|
389
|
+
├── chart-data (api)
|
|
390
|
+
└── dashboard-metrics (api)
|
|
391
|
+
|
|
392
|
+
Dashboard (page)
|
|
393
|
+
├── StatCard (component)
|
|
394
|
+
│ └── uses: UserStatsResponse
|
|
395
|
+
├── ChartWidget (component)
|
|
396
|
+
│ └── uses: ChartDataResponse
|
|
397
|
+
└── fetches: dashboard-data
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## Phase 8: Recommendations
|
|
403
|
+
|
|
404
|
+
Based on the build analysis:
|
|
405
|
+
|
|
406
|
+
### 8.1 Auto-Mode Tuning
|
|
407
|
+
|
|
408
|
+
If decisions seem suboptimal:
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
RECOMMENDED DEFAULT CHANGES
|
|
412
|
+
---------------------------
|
|
413
|
+
|
|
414
|
+
Based on this build, consider updating .claude/hustle-build-defaults.json:
|
|
415
|
+
|
|
416
|
+
{
|
|
417
|
+
"component": {
|
|
418
|
+
- "all_variants": true,
|
|
419
|
+
+ "all_variants": false, // Only 2 variants used in practice
|
|
420
|
+
|
|
421
|
+
- "animations": true,
|
|
422
|
+
+ "animations": false, // Animations not used in dashboard
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### 8.2 Future Improvements
|
|
428
|
+
|
|
429
|
+
```
|
|
430
|
+
SUGGESTED IMPROVEMENTS
|
|
431
|
+
----------------------
|
|
432
|
+
|
|
433
|
+
1. StatCard could benefit from skeleton loading state
|
|
434
|
+
File: src/components/StatCard/StatCard.tsx
|
|
435
|
+
|
|
436
|
+
2. ChartWidget accessibility could be improved
|
|
437
|
+
Add: aria-label, role="img"
|
|
438
|
+
|
|
439
|
+
3. Dashboard page could use error boundary
|
|
440
|
+
Currently: No error boundary
|
|
441
|
+
Suggested: Add ErrorBoundary component
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## Phase 9: Actions
|
|
447
|
+
|
|
448
|
+
Offer next steps:
|
|
449
|
+
|
|
450
|
+
```
|
|
451
|
+
AVAILABLE ACTIONS
|
|
452
|
+
-----------------
|
|
453
|
+
|
|
454
|
+
1. View specific element details:
|
|
455
|
+
/hustle-build-review [build-id] --element user-stats
|
|
456
|
+
|
|
457
|
+
2. Re-run with different decisions:
|
|
458
|
+
/hustle-build --resume [build-id] --interactive
|
|
459
|
+
|
|
460
|
+
3. Apply recommended improvements:
|
|
461
|
+
/hustle-build-improve [build-id]
|
|
462
|
+
|
|
463
|
+
4. Export review as markdown:
|
|
464
|
+
/hustle-build-review [build-id] --export
|
|
465
|
+
|
|
466
|
+
5. Compare with previous build:
|
|
467
|
+
/hustle-build-review --compare [build-id-1] [build-id-2]
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
Ask user:
|
|
471
|
+
```
|
|
472
|
+
What would you like to do?
|
|
473
|
+
- View more details on a specific element
|
|
474
|
+
- Apply recommended changes
|
|
475
|
+
- Export this review
|
|
476
|
+
- Return to development
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## Output Format
|
|
482
|
+
|
|
483
|
+
Final summary displayed:
|
|
484
|
+
|
|
485
|
+
```
|
|
486
|
+
============================================================
|
|
487
|
+
BUILD REVIEW COMPLETE: [build-id]
|
|
488
|
+
============================================================
|
|
489
|
+
|
|
490
|
+
Key Metrics:
|
|
491
|
+
- 8 elements created
|
|
492
|
+
- 47 tests passing (100%)
|
|
493
|
+
- 94% code coverage
|
|
494
|
+
- 87 minute build time
|
|
495
|
+
|
|
496
|
+
Decision Quality:
|
|
497
|
+
- 7/12 questions auto-answered
|
|
498
|
+
- 1 issue auto-resolved
|
|
499
|
+
- 0 unresolved issues
|
|
500
|
+
|
|
501
|
+
Recommendations:
|
|
502
|
+
- 2 optional improvements identified
|
|
503
|
+
- 1 default setting could be tuned
|
|
504
|
+
|
|
505
|
+
Review exported to: docs/reviews/[build-id].md
|
|
506
|
+
============================================================
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## Integration with Other Skills
|
|
512
|
+
|
|
513
|
+
This skill integrates with:
|
|
514
|
+
|
|
515
|
+
- `/hustle-build --resume [id]` - Resume interrupted build
|
|
516
|
+
- `/api-create-review [id]` - Review single API workflow
|
|
517
|
+
- `/hustle-ui-create-review [id]` - Review single component workflow
|
|
518
|
+
- `/commit` - Commit after review approval
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parallel-spawn
|
|
3
|
+
description: Spawn multiple Task agents in parallel for concurrent workflow execution across git worktrees
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Requires Claude Code with Task tool, git worktrees support
|
|
6
|
+
metadata:
|
|
7
|
+
version: "4.5.0"
|
|
8
|
+
category: "workflow"
|
|
9
|
+
tags: ['parallel', 'concurrent', 'worktree', 'agents', 'orchestration']
|
|
10
|
+
author: "Hustle Together"
|
|
11
|
+
allowed-tools: Task Read Write Bash TodoWrite
|
|
12
|
+
model: sonnet
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Parallel Spawn
|
|
16
|
+
|
|
17
|
+
Coordinate parallel agent execution across git worktrees for concurrent workflow processing.
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
/parallel-spawn api:users api:products api:analytics
|
|
23
|
+
/parallel-spawn component:chart component:table page:dashboard
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Format: `type:name` where type is `api`, `component`, or `page`
|
|
27
|
+
|
|
28
|
+
## How It Works
|
|
29
|
+
|
|
30
|
+
1. **Interview Once** - Shared decisions are collected upfront
|
|
31
|
+
2. **Create Worktrees** - Each workflow gets its own git worktree
|
|
32
|
+
3. **Spawn Agents** - Background Task agents run in parallel
|
|
33
|
+
4. **Monitor Progress** - Track completion with /parallel-status
|
|
34
|
+
5. **Merge Results** - Combine all changes back to main branch
|
|
35
|
+
|
|
36
|
+
## Example Session
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
User: /parallel-spawn api:users api:products api:orders
|
|
40
|
+
|
|
41
|
+
AI: Setting up 3 parallel workflows...
|
|
42
|
+
|
|
43
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
44
|
+
│ PARALLEL EXECUTION SETUP │
|
|
45
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
46
|
+
│ │
|
|
47
|
+
│ Workflows to spawn: │
|
|
48
|
+
│ └─ api:users │
|
|
49
|
+
│ └─ api:products │
|
|
50
|
+
│ └─ api:orders │
|
|
51
|
+
│ │
|
|
52
|
+
│ Shared interview required first! │
|
|
53
|
+
│ │
|
|
54
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
55
|
+
|
|
56
|
+
Before spawning, I need to collect shared decisions that will apply
|
|
57
|
+
to ALL workflows:
|
|
58
|
+
|
|
59
|
+
1. Authentication method?
|
|
60
|
+
[1] API Key
|
|
61
|
+
[2] Bearer Token
|
|
62
|
+
[3] OAuth 2.0
|
|
63
|
+
|
|
64
|
+
2. Error handling strategy?
|
|
65
|
+
[1] Fail-fast
|
|
66
|
+
[2] Partial success
|
|
67
|
+
[3] Retry with backoff
|
|
68
|
+
|
|
69
|
+
... (shared interview)
|
|
70
|
+
|
|
71
|
+
AI: Creating worktrees and spawning agents...
|
|
72
|
+
|
|
73
|
+
[Spawns 3 Task agents in parallel with run_in_background: true]
|
|
74
|
+
|
|
75
|
+
Parallel execution started! Monitor with /parallel-status
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Implementation
|
|
79
|
+
|
|
80
|
+
<claude-commands-template>
|
|
81
|
+
When /parallel-spawn is invoked:
|
|
82
|
+
|
|
83
|
+
### 1. Parse Workflows
|
|
84
|
+
|
|
85
|
+
Extract workflow definitions from the command:
|
|
86
|
+
```python
|
|
87
|
+
workflows = []
|
|
88
|
+
for match in re.findall(r'(api|component|page):(\w+)', args):
|
|
89
|
+
workflows.append({"type": match[0], "name": match[1]})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 2. Collect Shared Decisions
|
|
93
|
+
|
|
94
|
+
Before spawning, conduct ONE shared interview:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
98
|
+
│ SHARED INTERVIEW │
|
|
99
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
100
|
+
│ │
|
|
101
|
+
│ These decisions apply to ALL {len(workflows)} workflows: │
|
|
102
|
+
│ │
|
|
103
|
+
│ [Questions based on workflow types] │
|
|
104
|
+
│ │
|
|
105
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Use AskUserQuestion with options based on hustle-build-defaults.json.
|
|
109
|
+
|
|
110
|
+
### 3. Create Worktrees
|
|
111
|
+
|
|
112
|
+
For each workflow, create an isolated git worktree:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Create worktree with new branch
|
|
116
|
+
git worktree add ../parallel-users-0 -b parallel-users-0
|
|
117
|
+
|
|
118
|
+
# Copy shared decisions
|
|
119
|
+
cp .claude/shared-decisions.json ../parallel-users-0/.claude/
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 4. Update State
|
|
123
|
+
|
|
124
|
+
Save parallel execution state:
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"parallel_execution": {
|
|
128
|
+
"enabled": true,
|
|
129
|
+
"worktrees": [
|
|
130
|
+
{"name": "parallel-users-0", "path": "../parallel-users-0", "status": "pending"},
|
|
131
|
+
{"name": "parallel-products-1", "path": "../parallel-products-1", "status": "pending"},
|
|
132
|
+
{"name": "parallel-orders-2", "path": "../parallel-orders-2", "status": "pending"}
|
|
133
|
+
],
|
|
134
|
+
"shared_decisions": {
|
|
135
|
+
"auth_required": true,
|
|
136
|
+
"error_handling": "partial-success"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 5. Spawn Task Agents
|
|
143
|
+
|
|
144
|
+
**CRITICAL: Spawn all agents in a SINGLE message with multiple Task tool calls!**
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
Call Task tool 3 times in ONE message:
|
|
148
|
+
|
|
149
|
+
Task 1:
|
|
150
|
+
subagent_type: "general-purpose"
|
|
151
|
+
prompt: "Execute api-create users in worktree parallel-users-0..."
|
|
152
|
+
run_in_background: true
|
|
153
|
+
|
|
154
|
+
Task 2:
|
|
155
|
+
subagent_type: "general-purpose"
|
|
156
|
+
prompt: "Execute api-create products in worktree parallel-products-1..."
|
|
157
|
+
run_in_background: true
|
|
158
|
+
|
|
159
|
+
Task 3:
|
|
160
|
+
subagent_type: "general-purpose"
|
|
161
|
+
prompt: "Execute api-create orders in worktree parallel-orders-2..."
|
|
162
|
+
run_in_background: true
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 6. Monitor Completion
|
|
166
|
+
|
|
167
|
+
Use TaskOutput with block=false to check status:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
For each background agent ID:
|
|
171
|
+
TaskOutput(task_id=agent_id, block=false)
|
|
172
|
+
|
|
173
|
+
Update worktree status based on results.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 7. Merge When Complete
|
|
177
|
+
|
|
178
|
+
When all agents complete:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# Merge each worktree branch
|
|
182
|
+
git merge parallel-users-0 --no-ff -m "Merge parallel: users API"
|
|
183
|
+
git merge parallel-products-1 --no-ff -m "Merge parallel: products API"
|
|
184
|
+
git merge parallel-orders-2 --no-ff -m "Merge parallel: orders API"
|
|
185
|
+
|
|
186
|
+
# Clean up worktrees
|
|
187
|
+
git worktree remove ../parallel-users-0
|
|
188
|
+
git worktree remove ../parallel-products-1
|
|
189
|
+
git worktree remove ../parallel-orders-2
|
|
190
|
+
```
|
|
191
|
+
</claude-commands-template>
|
|
192
|
+
|
|
193
|
+
## Related Commands
|
|
194
|
+
|
|
195
|
+
- `/parallel-status` - Check parallel execution progress
|
|
196
|
+
- `/parallel-merge` - Merge all completed worktrees
|
|
197
|
+
- `/parallel-abort` - Cancel parallel execution and clean up
|
|
198
|
+
- `/ralph-status` - Check individual agent loop status
|
|
199
|
+
|
|
200
|
+
## Configuration
|
|
201
|
+
|
|
202
|
+
In `hustle-build-defaults.json`:
|
|
203
|
+
|
|
204
|
+
```json
|
|
205
|
+
{
|
|
206
|
+
"parallel": {
|
|
207
|
+
"max_worktrees": 5,
|
|
208
|
+
"auto_merge": false,
|
|
209
|
+
"cleanup_on_error": true
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|