@hustle-together/api-dev-tools 3.11.1 → 3.12.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/.claude/agents/code-reviewer.md +170 -0
- package/.claude/agents/docs-generator.md +80 -0
- package/.claude/agents/implementation-reviewer.md +119 -0
- package/.claude/agents/parallel-researcher.md +52 -0
- package/.claude/agents/research-validator.md +116 -0
- package/.claude/agents/schema-generator.md +70 -0
- package/.claude/agents/test-writer.md +104 -0
- package/.claude/api-dev-state.json +305 -56
- package/.claude/commands/README.md +21 -10
- package/.claude/commands/add-command.md +8 -5
- package/.claude/commands/api-create.md +36 -25
- package/.claude/commands/api-env.md +1 -0
- package/.claude/commands/api-interview.md +32 -19
- package/.claude/commands/api-research.md +47 -21
- package/.claude/commands/api-status.md +21 -1
- package/.claude/commands/api-verify.md +14 -13
- package/.claude/commands/beepboop.md +4 -5
- package/.claude/commands/busycommit.md +2 -3
- package/.claude/commands/commit.md +2 -3
- package/.claude/commands/cycle.md +2 -7
- package/.claude/commands/gap.md +2 -3
- package/.claude/commands/green.md +2 -7
- package/.claude/commands/issue.md +3 -8
- package/.claude/commands/ntfy-setup.md +91 -0
- package/.claude/commands/ntfy-test.md +74 -0
- package/.claude/commands/plan.md +2 -3
- package/.claude/commands/pr.md +2 -3
- package/.claude/commands/publish.md +40 -0
- package/.claude/commands/red.md +2 -7
- package/.claude/commands/refactor.md +2 -7
- package/.claude/commands/spike.md +2 -7
- package/.claude/commands/summarize.md +2 -3
- package/.claude/commands/tdd.md +2 -7
- package/.claude/commands/worktree-add.md +208 -216
- package/.claude/commands/worktree-cleanup.md +172 -178
- package/.claude/settings.json +63 -12
- package/.claude/settings.local.json +2 -1
- package/.claude-plugin/marketplace.json +2 -11
- package/.skills/README.md +55 -53
- package/.skills/_shared/settings.json +1 -1
- package/.skills/add-command/SKILL.md +10 -5
- package/.skills/api-create/SKILL.md +146 -35
- package/.skills/api-env/SKILL.md +1 -0
- package/.skills/api-interview/SKILL.md +32 -19
- package/.skills/api-research/SKILL.md +47 -21
- package/.skills/api-status/SKILL.md +21 -1
- package/.skills/api-verify/SKILL.md +14 -13
- package/.skills/beepboop/SKILL.md +6 -5
- package/.skills/busycommit/SKILL.md +4 -3
- package/.skills/commit/SKILL.md +4 -3
- package/.skills/cycle/SKILL.md +4 -7
- package/.skills/gap/SKILL.md +4 -3
- package/.skills/green/SKILL.md +4 -7
- package/.skills/issue/SKILL.md +5 -8
- package/.skills/plan/SKILL.md +4 -3
- package/.skills/pr/SKILL.md +4 -3
- package/.skills/publish/SKILL.md +160 -0
- package/.skills/red/SKILL.md +4 -7
- package/.skills/refactor/SKILL.md +4 -7
- package/.skills/spike/SKILL.md +4 -7
- package/.skills/summarize/SKILL.md +4 -3
- package/.skills/tdd/SKILL.md +4 -7
- package/.skills/update-todos/SKILL.md +22 -0
- package/.skills/worktree-add/SKILL.md +210 -216
- package/.skills/worktree-cleanup/SKILL.md +183 -187
- package/CHANGELOG.md +97 -79
- package/README.md +161 -7142
- package/bin/cli.js +448 -805
- package/commands/README.md +66 -31
- package/commands/add-command.md +8 -5
- package/commands/beepboop.md +4 -5
- package/commands/busycommit.md +2 -3
- package/commands/commit.md +2 -3
- package/commands/cycle.md +2 -7
- package/commands/gap.md +2 -3
- package/commands/green.md +2 -7
- package/commands/hustle-api-continue.md +8 -5
- package/commands/hustle-api-create.md +70 -29
- package/commands/hustle-api-env.md +1 -0
- package/commands/hustle-api-interview.md +32 -19
- package/commands/hustle-api-research.md +47 -21
- package/commands/hustle-api-sessions.md +8 -7
- package/commands/hustle-api-status.md +21 -1
- package/commands/hustle-api-verify.md +14 -13
- package/commands/hustle-combine.md +488 -241
- package/commands/hustle-ui-create-page.md +113 -50
- package/commands/hustle-ui-create.md +179 -26
- package/commands/issue.md +3 -8
- package/commands/plan.md +2 -3
- package/commands/pr.md +2 -3
- package/commands/red.md +2 -7
- package/commands/refactor.md +2 -7
- package/commands/spike.md +2 -7
- package/commands/summarize.md +2 -3
- package/commands/tdd.md +2 -7
- package/commands/worktree-add.md +208 -216
- package/commands/worktree-cleanup.md +172 -178
- package/hooks/api-workflow-check.py +5 -3
- package/hooks/enforce-component-type-confirm.py +97 -0
- package/hooks/lib/__init__.py +1 -0
- package/hooks/lib/greptile.py +355 -0
- package/hooks/lib/ntfy.py +209 -0
- package/hooks/notify-input-needed.py +73 -0
- package/hooks/notify-phase-complete.py +90 -0
- package/hooks/run-code-review.py +246 -0
- package/hooks/track-token-usage.py +121 -0
- package/package.json +13 -3
- package/scripts/collect-test-results.ts +102 -77
- package/scripts/extract-parameters.ts +112 -70
- package/scripts/generate-test-manifest.ts +118 -77
- package/templates/.env.example +57 -0
- package/templates/BRAND_GUIDE.md +92 -52
- package/templates/CLAUDE-SECTION.md +40 -37
- package/templates/SPEC.json +186 -38
- package/templates/api-dev-state.json +33 -4
- package/templates/api-showcase/_components/APICard.tsx +22 -18
- package/templates/api-showcase/_components/APIModal.tsx +110 -64
- package/templates/api-showcase/_components/APIShowcase.tsx +53 -35
- package/templates/api-showcase/_components/APITester.tsx +128 -67
- package/templates/api-showcase/page.tsx +4 -4
- package/templates/api-test/page.tsx +51 -30
- package/templates/api-test/test-structure/route.ts +43 -34
- package/templates/component/Component.stories.tsx +41 -39
- package/templates/component/Component.test.tsx +96 -78
- package/templates/component/Component.tsx +63 -52
- package/templates/component/Component.types.ts +10 -6
- package/templates/component/Component.visual.spec.ts +170 -0
- package/templates/component/index.ts +2 -2
- package/templates/dev-tools/_components/DevToolsLanding.tsx +8 -8
- package/templates/dev-tools/page.tsx +4 -3
- package/templates/mcp-servers.json +30 -2
- package/templates/page/page.e2e.test.ts +56 -48
- package/templates/page/page.tsx +3 -3
- package/templates/shared/HeroHeader.tsx +16 -15
- package/templates/shared/index.ts +1 -1
- package/templates/ui-showcase/_components/PreviewCard.tsx +20 -20
- package/templates/ui-showcase/_components/PreviewModal.tsx +149 -108
- package/templates/ui-showcase/_components/UIShowcase.tsx +43 -35
- package/templates/ui-showcase/page.tsx +4 -4
package/templates/SPEC.json
CHANGED
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
"blocks_writes": true,
|
|
16
16
|
"requires_user_confirmation": true,
|
|
17
17
|
"required_state_fields": {
|
|
18
|
-
"status": {
|
|
18
|
+
"status": {
|
|
19
|
+
"type": "enum",
|
|
20
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
21
|
+
},
|
|
19
22
|
"clarified": { "type": "string", "nullable": true },
|
|
20
23
|
"search_variations": { "type": "array" },
|
|
21
24
|
"user_question_asked": { "type": "boolean" },
|
|
@@ -34,13 +37,20 @@
|
|
|
34
37
|
"blocks_writes": true,
|
|
35
38
|
"requires_user_confirmation": true,
|
|
36
39
|
"required_state_fields": {
|
|
37
|
-
"status": {
|
|
40
|
+
"status": {
|
|
41
|
+
"type": "enum",
|
|
42
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
43
|
+
},
|
|
38
44
|
"confirmed": { "type": "boolean" },
|
|
39
45
|
"user_question_asked": { "type": "boolean" },
|
|
40
46
|
"user_confirmed": { "type": "boolean" },
|
|
41
47
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
42
48
|
},
|
|
43
|
-
"completion_conditions": [
|
|
49
|
+
"completion_conditions": [
|
|
50
|
+
"user_question_asked",
|
|
51
|
+
"user_confirmed",
|
|
52
|
+
"phase_exit_confirmed"
|
|
53
|
+
]
|
|
44
54
|
},
|
|
45
55
|
"3_research_initial": {
|
|
46
56
|
"number": 3,
|
|
@@ -52,14 +62,21 @@
|
|
|
52
62
|
"blocks_writes": true,
|
|
53
63
|
"requires_user_confirmation": true,
|
|
54
64
|
"required_state_fields": {
|
|
55
|
-
"status": {
|
|
65
|
+
"status": {
|
|
66
|
+
"type": "enum",
|
|
67
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
68
|
+
},
|
|
56
69
|
"sources": { "type": "array" },
|
|
57
70
|
"summary_shown": { "type": "boolean" },
|
|
58
71
|
"user_question_asked": { "type": "boolean" },
|
|
59
72
|
"user_approved": { "type": "boolean" },
|
|
60
73
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
61
74
|
},
|
|
62
|
-
"completion_conditions": [
|
|
75
|
+
"completion_conditions": [
|
|
76
|
+
"sources.length > 0",
|
|
77
|
+
"user_approved",
|
|
78
|
+
"phase_exit_confirmed"
|
|
79
|
+
]
|
|
63
80
|
},
|
|
64
81
|
"4_interview": {
|
|
65
82
|
"number": 4,
|
|
@@ -71,7 +88,10 @@
|
|
|
71
88
|
"blocks_writes": true,
|
|
72
89
|
"requires_user_confirmation": true,
|
|
73
90
|
"required_state_fields": {
|
|
74
|
-
"status": {
|
|
91
|
+
"status": {
|
|
92
|
+
"type": "enum",
|
|
93
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
94
|
+
},
|
|
75
95
|
"questions": { "type": "array" },
|
|
76
96
|
"user_question_count": { "type": "number" },
|
|
77
97
|
"structured_question_count": { "type": "number" },
|
|
@@ -80,7 +100,11 @@
|
|
|
80
100
|
"user_completed": { "type": "boolean" },
|
|
81
101
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
82
102
|
},
|
|
83
|
-
"completion_conditions": [
|
|
103
|
+
"completion_conditions": [
|
|
104
|
+
"user_question_count >= 1",
|
|
105
|
+
"user_completed",
|
|
106
|
+
"phase_exit_confirmed"
|
|
107
|
+
]
|
|
84
108
|
},
|
|
85
109
|
"5_research_deep": {
|
|
86
110
|
"number": 5,
|
|
@@ -92,7 +116,10 @@
|
|
|
92
116
|
"blocks_writes": true,
|
|
93
117
|
"requires_user_confirmation": true,
|
|
94
118
|
"required_state_fields": {
|
|
95
|
-
"status": {
|
|
119
|
+
"status": {
|
|
120
|
+
"type": "enum",
|
|
121
|
+
"values": ["not_started", "in_progress", "complete", "skipped"]
|
|
122
|
+
},
|
|
96
123
|
"sources": { "type": "array" },
|
|
97
124
|
"proposed_searches": { "type": "array" },
|
|
98
125
|
"approved_searches": { "type": "array" },
|
|
@@ -114,7 +141,10 @@
|
|
|
114
141
|
"blocks_writes": true,
|
|
115
142
|
"requires_user_confirmation": true,
|
|
116
143
|
"required_state_fields": {
|
|
117
|
-
"status": {
|
|
144
|
+
"status": {
|
|
145
|
+
"type": "enum",
|
|
146
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
147
|
+
},
|
|
118
148
|
"schema_file": { "type": "string", "nullable": true },
|
|
119
149
|
"fields_count": { "type": "number" },
|
|
120
150
|
"schema_shown": { "type": "boolean" },
|
|
@@ -122,7 +152,11 @@
|
|
|
122
152
|
"user_confirmed": { "type": "boolean" },
|
|
123
153
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
124
154
|
},
|
|
125
|
-
"completion_conditions": [
|
|
155
|
+
"completion_conditions": [
|
|
156
|
+
"schema_file !== null",
|
|
157
|
+
"user_confirmed",
|
|
158
|
+
"phase_exit_confirmed"
|
|
159
|
+
]
|
|
126
160
|
},
|
|
127
161
|
"7_environment": {
|
|
128
162
|
"number": 7,
|
|
@@ -134,7 +168,10 @@
|
|
|
134
168
|
"blocks_writes": true,
|
|
135
169
|
"requires_user_confirmation": true,
|
|
136
170
|
"required_state_fields": {
|
|
137
|
-
"status": {
|
|
171
|
+
"status": {
|
|
172
|
+
"type": "enum",
|
|
173
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
174
|
+
},
|
|
138
175
|
"keys_required": { "type": "array" },
|
|
139
176
|
"keys_found": { "type": "array" },
|
|
140
177
|
"keys_missing": { "type": "array" },
|
|
@@ -155,7 +192,10 @@
|
|
|
155
192
|
"blocks_writes": true,
|
|
156
193
|
"requires_user_confirmation": true,
|
|
157
194
|
"required_state_fields": {
|
|
158
|
-
"status": {
|
|
195
|
+
"status": {
|
|
196
|
+
"type": "enum",
|
|
197
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
198
|
+
},
|
|
159
199
|
"test_file": { "type": "string", "nullable": true },
|
|
160
200
|
"test_count": { "type": "number" },
|
|
161
201
|
"test_scenarios": { "type": "array" },
|
|
@@ -164,7 +204,12 @@
|
|
|
164
204
|
"user_approved": { "type": "boolean" },
|
|
165
205
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
166
206
|
},
|
|
167
|
-
"completion_conditions": [
|
|
207
|
+
"completion_conditions": [
|
|
208
|
+
"test_file !== null",
|
|
209
|
+
"test_count > 0",
|
|
210
|
+
"user_approved",
|
|
211
|
+
"phase_exit_confirmed"
|
|
212
|
+
]
|
|
168
213
|
},
|
|
169
214
|
"9_tdd_green": {
|
|
170
215
|
"number": 9,
|
|
@@ -176,7 +221,10 @@
|
|
|
176
221
|
"blocks_writes": true,
|
|
177
222
|
"requires_user_confirmation": false,
|
|
178
223
|
"required_state_fields": {
|
|
179
|
-
"status": {
|
|
224
|
+
"status": {
|
|
225
|
+
"type": "enum",
|
|
226
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
227
|
+
},
|
|
180
228
|
"implementation_file": { "type": "string", "nullable": true },
|
|
181
229
|
"all_tests_passing": { "type": "boolean" },
|
|
182
230
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
@@ -193,7 +241,10 @@
|
|
|
193
241
|
"blocks_writes": true,
|
|
194
242
|
"requires_user_confirmation": true,
|
|
195
243
|
"required_state_fields": {
|
|
196
|
-
"status": {
|
|
244
|
+
"status": {
|
|
245
|
+
"type": "enum",
|
|
246
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
247
|
+
},
|
|
197
248
|
"gaps_found": { "type": "number" },
|
|
198
249
|
"gaps_fixed": { "type": "number" },
|
|
199
250
|
"gaps_skipped": { "type": "number" },
|
|
@@ -205,7 +256,11 @@
|
|
|
205
256
|
"user_decision": { "type": "string", "nullable": true },
|
|
206
257
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
207
258
|
},
|
|
208
|
-
"completion_conditions": [
|
|
259
|
+
"completion_conditions": [
|
|
260
|
+
"re_research_done",
|
|
261
|
+
"user_decided",
|
|
262
|
+
"phase_exit_confirmed"
|
|
263
|
+
]
|
|
209
264
|
},
|
|
210
265
|
"11_refactor": {
|
|
211
266
|
"number": 11,
|
|
@@ -217,7 +272,10 @@
|
|
|
217
272
|
"blocks_writes": false,
|
|
218
273
|
"requires_user_confirmation": false,
|
|
219
274
|
"required_state_fields": {
|
|
220
|
-
"status": {
|
|
275
|
+
"status": {
|
|
276
|
+
"type": "enum",
|
|
277
|
+
"values": ["not_started", "in_progress", "complete", "skipped"]
|
|
278
|
+
},
|
|
221
279
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
222
280
|
},
|
|
223
281
|
"completion_conditions": ["status === 'complete' || status === 'skipped'"]
|
|
@@ -232,7 +290,10 @@
|
|
|
232
290
|
"blocks_writes": true,
|
|
233
291
|
"requires_user_confirmation": true,
|
|
234
292
|
"required_state_fields": {
|
|
235
|
-
"status": {
|
|
293
|
+
"status": {
|
|
294
|
+
"type": "enum",
|
|
295
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
296
|
+
},
|
|
236
297
|
"files_updated": { "type": "array" },
|
|
237
298
|
"manifest_updated": { "type": "boolean" },
|
|
238
299
|
"openapi_updated": { "type": "boolean" },
|
|
@@ -242,7 +303,12 @@
|
|
|
242
303
|
"user_confirmed": { "type": "boolean" },
|
|
243
304
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
244
305
|
},
|
|
245
|
-
"completion_conditions": [
|
|
306
|
+
"completion_conditions": [
|
|
307
|
+
"manifest_updated",
|
|
308
|
+
"research_cached",
|
|
309
|
+
"user_confirmed",
|
|
310
|
+
"phase_exit_confirmed"
|
|
311
|
+
]
|
|
246
312
|
},
|
|
247
313
|
"13_completion": {
|
|
248
314
|
"number": 13,
|
|
@@ -254,7 +320,10 @@
|
|
|
254
320
|
"blocks_writes": false,
|
|
255
321
|
"requires_user_confirmation": false,
|
|
256
322
|
"required_state_fields": {
|
|
257
|
-
"status": {
|
|
323
|
+
"status": {
|
|
324
|
+
"type": "enum",
|
|
325
|
+
"values": ["not_started", "in_progress", "complete"]
|
|
326
|
+
},
|
|
258
327
|
"all_tests_passing": { "type": "boolean" },
|
|
259
328
|
"coverage_100_percent": { "type": "boolean" },
|
|
260
329
|
"typescript_compiles": { "type": "boolean" },
|
|
@@ -265,7 +334,17 @@
|
|
|
265
334
|
"phase_exit_confirmed": { "type": "boolean" }
|
|
266
335
|
},
|
|
267
336
|
"completion_conditions": ["all_tests_passing", "docs_updated"],
|
|
268
|
-
"output_generates": [
|
|
337
|
+
"output_generates": [
|
|
338
|
+
"summary",
|
|
339
|
+
"files_created",
|
|
340
|
+
"files_modified",
|
|
341
|
+
"test_commands",
|
|
342
|
+
"curl_examples",
|
|
343
|
+
"parameter_table",
|
|
344
|
+
"scope_coverage",
|
|
345
|
+
"research_cache_location",
|
|
346
|
+
"next_steps"
|
|
347
|
+
]
|
|
269
348
|
}
|
|
270
349
|
},
|
|
271
350
|
|
|
@@ -390,13 +469,23 @@
|
|
|
390
469
|
"track-tool-use.py": {
|
|
391
470
|
"description": "Log research and tool usage, update state",
|
|
392
471
|
"matcher": "WebSearch|WebFetch|mcp__context7.*|AskUserQuestion",
|
|
393
|
-
"actions": [
|
|
472
|
+
"actions": [
|
|
473
|
+
"log_research",
|
|
474
|
+
"update_state",
|
|
475
|
+
"count_turns",
|
|
476
|
+
"populate_research_index"
|
|
477
|
+
]
|
|
394
478
|
},
|
|
395
479
|
"periodic-reground.py": {
|
|
396
480
|
"description": "Re-inject context every 7 turns",
|
|
397
481
|
"matcher": "WebSearch|WebFetch|mcp__context7.*|AskUserQuestion",
|
|
398
482
|
"interval": 7,
|
|
399
|
-
"actions": [
|
|
483
|
+
"actions": [
|
|
484
|
+
"inject_endpoint",
|
|
485
|
+
"inject_phase",
|
|
486
|
+
"inject_decisions",
|
|
487
|
+
"inject_freshness_warning"
|
|
488
|
+
]
|
|
400
489
|
},
|
|
401
490
|
"verify-after-green.py": {
|
|
402
491
|
"description": "Trigger Phase 10 verification after tests pass",
|
|
@@ -406,7 +495,13 @@
|
|
|
406
495
|
"cache-research.py": {
|
|
407
496
|
"description": "Create research cache files from state",
|
|
408
497
|
"matcher": "Write|Edit",
|
|
409
|
-
"actions": [
|
|
498
|
+
"actions": [
|
|
499
|
+
"create_sources_json",
|
|
500
|
+
"create_interview_json",
|
|
501
|
+
"create_schema_json",
|
|
502
|
+
"update_current_md",
|
|
503
|
+
"update_index_json"
|
|
504
|
+
],
|
|
410
505
|
"added_in": "3.6.7"
|
|
411
506
|
},
|
|
412
507
|
"track-scope-coverage.py": {
|
|
@@ -423,7 +518,12 @@
|
|
|
423
518
|
},
|
|
424
519
|
"session-logger.py": {
|
|
425
520
|
"description": "Save session to .claude/api-sessions/",
|
|
426
|
-
"actions": [
|
|
521
|
+
"actions": [
|
|
522
|
+
"copy_jsonl",
|
|
523
|
+
"convert_to_markdown",
|
|
524
|
+
"snapshot_state",
|
|
525
|
+
"generate_summary"
|
|
526
|
+
],
|
|
427
527
|
"added_in": "3.6.7"
|
|
428
528
|
}
|
|
429
529
|
}
|
|
@@ -486,20 +586,58 @@
|
|
|
486
586
|
"state_structure": {
|
|
487
587
|
"root": {
|
|
488
588
|
"version": { "type": "string", "description": "State file version" },
|
|
489
|
-
"created_at": {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
589
|
+
"created_at": {
|
|
590
|
+
"type": "string",
|
|
591
|
+
"nullable": true,
|
|
592
|
+
"description": "ISO timestamp of creation"
|
|
593
|
+
},
|
|
594
|
+
"active_endpoint": {
|
|
595
|
+
"type": "string",
|
|
596
|
+
"nullable": true,
|
|
597
|
+
"description": "Currently active endpoint name"
|
|
598
|
+
},
|
|
599
|
+
"endpoints": {
|
|
600
|
+
"type": "object",
|
|
601
|
+
"description": "All endpoint workflows"
|
|
602
|
+
},
|
|
603
|
+
"turn_count": {
|
|
604
|
+
"type": "number",
|
|
605
|
+
"description": "Total turns in session"
|
|
606
|
+
},
|
|
493
607
|
"last_turn_timestamp": { "type": "string", "nullable": true },
|
|
494
|
-
"research_queries": {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
608
|
+
"research_queries": {
|
|
609
|
+
"type": "array",
|
|
610
|
+
"description": "All research queries made"
|
|
611
|
+
},
|
|
612
|
+
"prompt_detections": {
|
|
613
|
+
"type": "array",
|
|
614
|
+
"description": "Detected API terms in prompts"
|
|
615
|
+
},
|
|
616
|
+
"decisions_history": {
|
|
617
|
+
"type": "array",
|
|
618
|
+
"description": "History of interview decision changes",
|
|
619
|
+
"added_in": "3.6.7"
|
|
620
|
+
},
|
|
621
|
+
"reground_history": {
|
|
622
|
+
"type": "array",
|
|
623
|
+
"description": "History of re-grounding injections"
|
|
624
|
+
}
|
|
498
625
|
},
|
|
499
626
|
"endpoint": {
|
|
500
|
-
"started_at": {
|
|
501
|
-
|
|
502
|
-
|
|
627
|
+
"started_at": {
|
|
628
|
+
"type": "string",
|
|
629
|
+
"description": "ISO timestamp when workflow started"
|
|
630
|
+
},
|
|
631
|
+
"status": {
|
|
632
|
+
"type": "enum",
|
|
633
|
+
"values": ["not_started", "in_progress", "complete"],
|
|
634
|
+
"description": "Overall workflow status"
|
|
635
|
+
},
|
|
636
|
+
"library": {
|
|
637
|
+
"type": "string",
|
|
638
|
+
"nullable": true,
|
|
639
|
+
"description": "External library/API name"
|
|
640
|
+
},
|
|
503
641
|
"phases": { "type": "object", "description": "Phase-specific state" },
|
|
504
642
|
"scope": {
|
|
505
643
|
"type": "object",
|
|
@@ -574,7 +712,13 @@
|
|
|
574
712
|
{
|
|
575
713
|
"name": "summary",
|
|
576
714
|
"title": "API Implementation Complete",
|
|
577
|
-
"includes": [
|
|
715
|
+
"includes": [
|
|
716
|
+
"status",
|
|
717
|
+
"phases_completed",
|
|
718
|
+
"test_count",
|
|
719
|
+
"coverage",
|
|
720
|
+
"duration"
|
|
721
|
+
]
|
|
578
722
|
},
|
|
579
723
|
{
|
|
580
724
|
"name": "files_created",
|
|
@@ -607,7 +751,11 @@
|
|
|
607
751
|
{
|
|
608
752
|
"name": "scope_coverage",
|
|
609
753
|
"title": "Implementation Scope",
|
|
610
|
-
"includes": [
|
|
754
|
+
"includes": [
|
|
755
|
+
"implemented_features",
|
|
756
|
+
"deferred_features",
|
|
757
|
+
"coverage_percent"
|
|
758
|
+
],
|
|
611
759
|
"added_in": "3.6.7"
|
|
612
760
|
},
|
|
613
761
|
{
|
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
"version": "3.10.0",
|
|
3
3
|
"created_at": null,
|
|
4
4
|
"workflow": null,
|
|
5
|
-
"_workflow_options": [
|
|
5
|
+
"_workflow_options": [
|
|
6
|
+
"api-create",
|
|
7
|
+
"combine-api",
|
|
8
|
+
"ui-create-component",
|
|
9
|
+
"ui-create-page"
|
|
10
|
+
],
|
|
6
11
|
"active_endpoint": null,
|
|
7
12
|
"active_element": null,
|
|
8
13
|
"endpoints": {},
|
|
@@ -32,9 +37,20 @@
|
|
|
32
37
|
"_mode_options": ["component", "page"],
|
|
33
38
|
"use_brand_guide": false,
|
|
34
39
|
"component_type": null,
|
|
35
|
-
"_component_type_options": ["
|
|
40
|
+
"_component_type_options": ["basic", "complex"],
|
|
41
|
+
"_component_type_descriptions": {
|
|
42
|
+
"basic": "Single-purpose, few props (Button, Input, Icon, Badge)",
|
|
43
|
+
"complex": "Multi-part, many states, user flows (ChatWindow, DataTable, Modal)"
|
|
44
|
+
},
|
|
36
45
|
"page_type": null,
|
|
37
|
-
"_page_type_options": [
|
|
46
|
+
"_page_type_options": [
|
|
47
|
+
"landing",
|
|
48
|
+
"dashboard",
|
|
49
|
+
"form",
|
|
50
|
+
"list",
|
|
51
|
+
"detail",
|
|
52
|
+
"auth"
|
|
53
|
+
],
|
|
38
54
|
"accessibility_level": null,
|
|
39
55
|
"_accessibility_level_options": ["AA", "AAA"],
|
|
40
56
|
"data_sources": [],
|
|
@@ -190,11 +206,24 @@
|
|
|
190
206
|
"last_question_type": null,
|
|
191
207
|
"description": "Re-research after Green to verify implementation matches docs"
|
|
192
208
|
},
|
|
209
|
+
"code_review": {
|
|
210
|
+
"status": "not_started",
|
|
211
|
+
"review_requested": false,
|
|
212
|
+
"issues_found": 0,
|
|
213
|
+
"issues_fixed": 0,
|
|
214
|
+
"issues_deferred": [],
|
|
215
|
+
"greptile_response": null,
|
|
216
|
+
"phase_exit_confirmed": false,
|
|
217
|
+
"last_question_type": null,
|
|
218
|
+
"description": "Greptile AI code review for bugs, security, and performance"
|
|
219
|
+
},
|
|
193
220
|
"tdd_refactor": {
|
|
194
221
|
"status": "not_started",
|
|
222
|
+
"review_issues_addressed": false,
|
|
223
|
+
"tests_passing_after_refactor": false,
|
|
195
224
|
"phase_exit_confirmed": false,
|
|
196
225
|
"last_question_type": null,
|
|
197
|
-
"description": "
|
|
226
|
+
"description": "Fix review issues + code cleanup while keeping tests green"
|
|
198
227
|
},
|
|
199
228
|
"documentation": {
|
|
200
229
|
"status": "not_started",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
3
|
interface RegistryAPI {
|
|
4
4
|
name: string;
|
|
@@ -15,7 +15,7 @@ interface RegistryAPI {
|
|
|
15
15
|
|
|
16
16
|
interface APICardProps {
|
|
17
17
|
id: string;
|
|
18
|
-
type:
|
|
18
|
+
type: "api" | "combined";
|
|
19
19
|
data: RegistryAPI;
|
|
20
20
|
onClick: () => void;
|
|
21
21
|
}
|
|
@@ -32,22 +32,24 @@ interface APICardProps {
|
|
|
32
32
|
export function APICard({ id, type, data, onClick }: APICardProps) {
|
|
33
33
|
// Method badge colors
|
|
34
34
|
const methodColors: Record<string, string> = {
|
|
35
|
-
GET:
|
|
36
|
-
POST:
|
|
37
|
-
PUT:
|
|
38
|
-
PATCH:
|
|
39
|
-
|
|
35
|
+
GET: "border-green-600 bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-400",
|
|
36
|
+
POST: "border-blue-600 bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
|
|
37
|
+
PUT: "border-yellow-600 bg-yellow-50 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",
|
|
38
|
+
PATCH:
|
|
39
|
+
"border-orange-600 bg-orange-50 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400",
|
|
40
|
+
DELETE:
|
|
41
|
+
"border-red-600 bg-red-50 text-red-700 dark:bg-red-900/30 dark:text-red-400",
|
|
40
42
|
};
|
|
41
43
|
|
|
42
44
|
// Status colors
|
|
43
45
|
const statusColors: Record<string, string> = {
|
|
44
|
-
complete:
|
|
45
|
-
|
|
46
|
-
error:
|
|
46
|
+
complete: "bg-green-500",
|
|
47
|
+
"in-progress": "bg-yellow-500",
|
|
48
|
+
error: "bg-red-500",
|
|
47
49
|
};
|
|
48
50
|
|
|
49
|
-
const methods = data.methods || [
|
|
50
|
-
const status = data.status ||
|
|
51
|
+
const methods = data.methods || ["POST"];
|
|
52
|
+
const status = data.status || "complete";
|
|
51
53
|
|
|
52
54
|
return (
|
|
53
55
|
<button
|
|
@@ -59,7 +61,7 @@ export function APICard({ id, type, data, onClick }: APICardProps) {
|
|
|
59
61
|
<div className="flex-1">
|
|
60
62
|
{/* Type Badge */}
|
|
61
63
|
<div className="mb-2 flex items-center gap-2">
|
|
62
|
-
{type ===
|
|
64
|
+
{type === "combined" ? (
|
|
63
65
|
<span className="border border-purple-600 bg-purple-50 px-2 py-0.5 text-xs font-bold uppercase tracking-wide text-purple-700 dark:bg-purple-900/30 dark:text-purple-400">
|
|
64
66
|
Combined API
|
|
65
67
|
</span>
|
|
@@ -70,7 +72,7 @@ export function APICard({ id, type, data, onClick }: APICardProps) {
|
|
|
70
72
|
)}
|
|
71
73
|
{/* Status Dot */}
|
|
72
74
|
<span
|
|
73
|
-
className={`h-2.5 w-2.5 rounded-full ${statusColors[status] ||
|
|
75
|
+
className={`h-2.5 w-2.5 rounded-full ${statusColors[status] || "bg-gray-400"}`}
|
|
74
76
|
title={status}
|
|
75
77
|
/>
|
|
76
78
|
</div>
|
|
@@ -119,7 +121,8 @@ export function APICard({ id, type, data, onClick }: APICardProps) {
|
|
|
119
121
|
<span
|
|
120
122
|
key={method}
|
|
121
123
|
className={`border px-2 py-0.5 font-mono text-xs font-bold ${
|
|
122
|
-
methodColors[method] ||
|
|
124
|
+
methodColors[method] ||
|
|
125
|
+
"border-gray-400 bg-gray-100 text-gray-700"
|
|
123
126
|
}`}
|
|
124
127
|
>
|
|
125
128
|
{method}
|
|
@@ -128,10 +131,11 @@ export function APICard({ id, type, data, onClick }: APICardProps) {
|
|
|
128
131
|
</div>
|
|
129
132
|
|
|
130
133
|
{/* Combined Info */}
|
|
131
|
-
{type ===
|
|
134
|
+
{type === "combined" && data.combines && (
|
|
132
135
|
<div className="mt-3 border-t border-gray-200 pt-3 dark:border-gray-700">
|
|
133
136
|
<p className="text-xs text-gray-500 dark:text-gray-400">
|
|
134
|
-
<span className="font-semibold">Combines:</span>
|
|
137
|
+
<span className="font-semibold">Combines:</span>{" "}
|
|
138
|
+
{data.combines.join(", ")}
|
|
135
139
|
</p>
|
|
136
140
|
{data.flow_type && (
|
|
137
141
|
<p className="text-xs text-gray-500 dark:text-gray-400">
|
|
@@ -145,7 +149,7 @@ export function APICard({ id, type, data, onClick }: APICardProps) {
|
|
|
145
149
|
{/* Footer */}
|
|
146
150
|
<div className="border-t border-gray-200 bg-gray-50 px-4 py-2 dark:border-gray-700 dark:bg-gray-800">
|
|
147
151
|
<p className="text-xs text-gray-500 dark:text-gray-400">
|
|
148
|
-
{data.created_at ? `Created ${data.created_at}` :
|
|
152
|
+
{data.created_at ? `Created ${data.created_at}` : "Click to test"}
|
|
149
153
|
</p>
|
|
150
154
|
</div>
|
|
151
155
|
</button>
|