@hustle-together/api-dev-tools 3.12.16 → 4.5.3
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 +10 -0
- package/.claude/documentation-audit.json +114 -0
- package/.claude/registry.json +289 -0
- package/.claude/settings.json +45 -1
- package/.claude/settings.local.json +1 -7
- 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 +34 -20
- package/.skills/api-research/SKILL.md +130 -0
- package/.skills/docs-update/SKILL.md +205 -0
- package/.skills/hustle-brand/SKILL.md +368 -0
- package/.skills/hustle-build/SKILL.md +365 -38
- 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 +488 -0
- package/README.md +346 -53
- package/bin/cli.js +359 -123
- 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 +97 -20
- package/{.claude/hooks → hooks}/completion-promise-detector.py +0 -0
- package/{.claude/hooks → hooks}/context-capacity-warning.py +0 -0
- package/{.claude/hooks → hooks}/docs-update-check.py +0 -0
- package/{.claude/hooks → hooks}/enforce-dry-run.py +0 -0
- package/hooks/enforce-external-research.py +25 -0
- package/hooks/enforce-interview.py +20 -0
- package/{.claude/hooks → hooks}/generate-adr-options.py +0 -0
- package/{.claude/hooks → hooks}/hook_utils.py +0 -0
- package/hooks/ntfy-on-question.py +15 -2
- package/hooks/orchestrator-handoff.py +81 -3
- package/{.claude/hooks → hooks}/parallel-orchestrator.py +0 -0
- package/hooks/periodic-reground.py +40 -0
- package/{.claude/hooks → hooks}/remote-question-server.py +0 -0
- package/hooks/run-code-review.py +176 -29
- package/{.claude/hooks → hooks}/run-visual-qa.py +0 -0
- package/hooks/session-logger.py +27 -1
- package/hooks/session-startup.py +113 -0
- package/{.claude/hooks → hooks}/update-adr-decision.py +0 -0
- package/package.json +1 -1
- package/templates/.skills/hustle-interview/SKILL.md +174 -0
- package/templates/adr-viewer/_components/ADRViewer.tsx +326 -0
- package/templates/api-dev-state.json +33 -1
- package/templates/brand-page/page.tsx +645 -0
- package/templates/component/Component.visual.spec.ts +30 -24
- 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 +53 -1
- package/templates/page/page.e2e.test.ts +30 -26
- package/templates/performance-budgets.json +63 -5
- package/templates/registry.json +279 -3
- package/templates/review-dashboard/page.tsx +510 -0
- package/templates/settings.json +74 -7
- package/templates/ui-showcase/_components/UIShowcase.tsx +47 -0
- package/templates/ui-showcase/_components/VisualTestingDashboard.tsx +579 -0
- package/.claude/commands/hustle-combine.md +0 -1089
- package/.claude/commands/hustle-ui-create-page.md +0 -1078
- package/.claude/commands/hustle-ui-create.md +0 -1058
- package/.claude/hooks/auto-answer.py +0 -305
- package/.claude/hooks/cache-research.py +0 -337
- package/.claude/hooks/check-api-routes.py +0 -168
- package/.claude/hooks/check-playwright-setup.py +0 -103
- package/.claude/hooks/check-storybook-setup.py +0 -81
- package/.claude/hooks/check-update.py +0 -132
- package/.claude/hooks/detect-interruption.py +0 -165
- package/.claude/hooks/enforce-a11y-audit.py +0 -202
- package/.claude/hooks/enforce-brand-guide.py +0 -241
- package/.claude/hooks/enforce-component-type-confirm.py +0 -97
- package/.claude/hooks/enforce-freshness.py +0 -184
- package/.claude/hooks/enforce-page-components.py +0 -186
- package/.claude/hooks/enforce-page-data-schema.py +0 -155
- package/.claude/hooks/enforce-questions-sourced.py +0 -146
- package/.claude/hooks/enforce-schema-from-interview.py +0 -248
- package/.claude/hooks/enforce-ui-disambiguation.py +0 -108
- package/.claude/hooks/enforce-ui-interview.py +0 -130
- package/.claude/hooks/generate-manifest-entry.py +0 -1161
- package/.claude/hooks/lib/__init__.py +0 -1
- package/.claude/hooks/lib/greptile.py +0 -355
- package/.claude/hooks/lib/ntfy.py +0 -209
- package/.claude/hooks/notify-input-needed.py +0 -73
- package/.claude/hooks/notify-phase-complete.py +0 -90
- package/.claude/hooks/ntfy-on-question.py +0 -240
- package/.claude/hooks/orchestrator-completion.py +0 -313
- package/.claude/hooks/orchestrator-handoff.py +0 -267
- package/.claude/hooks/orchestrator-session-startup.py +0 -146
- package/.claude/hooks/run-code-review.py +0 -393
- package/.claude/hooks/session-logger.py +0 -323
- package/.claude/hooks/test-orchestrator-reground.py +0 -248
- package/.claude/hooks/track-scope-coverage.py +0 -220
- package/.claude/hooks/track-token-usage.py +0 -121
- package/.claude/hooks/update-api-showcase.py +0 -161
- package/.claude/hooks/update-registry.py +0 -352
- package/.claude/hooks/update-ui-showcase.py +0 -224
- package/.claude/test-auto-answer-bot.py +0 -183
- package/.claude/test-completion-detector.py +0 -263
- package/.claude/test-orchestrator-state.json +0 -20
- package/.claude/test-orchestrator.sh +0 -271
- /package/{.claude/commands → commands}/hustle-build.md +0 -0
- /package/{.claude/hooks → hooks}/lib/__pycache__/__init__.cpython-314.pyc +0 -0
- /package/{.claude/hooks → hooks}/lib/__pycache__/greptile.cpython-314.pyc +0 -0
- /package/{.claude/hooks → hooks}/lib/__pycache__/ntfy.cpython-314.pyc +0 -0
- /package/{.claude/hooks → hooks}/project-document-prompt.py +0 -0
- /package/{.claude/hooks → hooks}/remote-question-proxy.py +0 -0
- /package/{.claude/hooks → hooks}/update-testing-checklist.py +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# ADR Research Requests
|
|
2
|
+
|
|
3
|
+
This directory holds pending ADR research requests created by hooks.
|
|
4
|
+
|
|
5
|
+
Files:
|
|
6
|
+
- pending-{category}.json - Request awaiting /adr-deep-research
|
|
7
|
+
- completed-{category}.json - Request that has been processed
|
|
8
|
+
|
|
9
|
+
The /adr-deep-research skill reads pending requests and spawns
|
|
10
|
+
parallel agents to research each option before creating the ADR.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr-researcher
|
|
3
|
+
description: Research a single technology option for ADR decision. Fetches official docs, extracts pros/cons, pricing, and best-use cases. Runs in parallel with other agents.
|
|
4
|
+
tools: WebSearch, WebFetch, mcp__context7__resolve-library-id, mcp__context7__get-library-docs, Read
|
|
5
|
+
model: haiku
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR Option Researcher
|
|
9
|
+
|
|
10
|
+
You are a fast, focused research agent that investigates a single technology option for an Architecture Decision Record.
|
|
11
|
+
|
|
12
|
+
## Your Role
|
|
13
|
+
|
|
14
|
+
1. **Research the assigned option** - Fetch official documentation and comparison articles
|
|
15
|
+
2. **Extract pros and cons** - Find real, specific advantages and disadvantages
|
|
16
|
+
3. **Identify best-use cases** - When is this option the right choice?
|
|
17
|
+
4. **Find pricing/limitations** - What constraints exist?
|
|
18
|
+
5. **Return structured data** - Format findings for the ADR document
|
|
19
|
+
|
|
20
|
+
## Input Format
|
|
21
|
+
|
|
22
|
+
You will receive:
|
|
23
|
+
|
|
24
|
+
- `option`: The technology/approach to research (e.g., "supabase", "firebase", "postgresql")
|
|
25
|
+
- `category`: The decision category (e.g., "database", "auth", "cache", "hosting")
|
|
26
|
+
- `context`: User's project context (what they're building)
|
|
27
|
+
- `comparison_options`: Other options being considered (for relative comparison)
|
|
28
|
+
|
|
29
|
+
## Research Process
|
|
30
|
+
|
|
31
|
+
1. **Official Documentation** - Always start with official docs
|
|
32
|
+
- Use Context7 for well-documented libraries
|
|
33
|
+
- Use WebFetch for official documentation sites
|
|
34
|
+
- Look for: features, limitations, pricing, getting started
|
|
35
|
+
|
|
36
|
+
2. **Comparison Articles** (if time permits)
|
|
37
|
+
- Search for "[option] vs [alternative]" comparisons
|
|
38
|
+
- Look for recent articles (2024-2025)
|
|
39
|
+
|
|
40
|
+
3. **Extract Key Information**
|
|
41
|
+
- Pros: 3-5 specific, factual advantages
|
|
42
|
+
- Cons: 3-5 specific, factual disadvantages
|
|
43
|
+
- Best for: 1-2 ideal use cases
|
|
44
|
+
- Pricing: Free tier limits, paid tiers
|
|
45
|
+
- Limitations: Technical constraints
|
|
46
|
+
|
|
47
|
+
## Output Format
|
|
48
|
+
|
|
49
|
+
Return your findings as structured JSON:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"option": "supabase",
|
|
54
|
+
"category": "database",
|
|
55
|
+
"research_complete": true,
|
|
56
|
+
"pros": [
|
|
57
|
+
"Real-time subscriptions built-in via PostgreSQL LISTEN/NOTIFY",
|
|
58
|
+
"Authentication system included with 20+ social providers",
|
|
59
|
+
"Row Level Security for fine-grained access control",
|
|
60
|
+
"Free tier: 500MB database, 1GB storage, 50K MAU"
|
|
61
|
+
],
|
|
62
|
+
"cons": [
|
|
63
|
+
"PostgreSQL only - no MySQL/MongoDB option",
|
|
64
|
+
"Vendor lock-in for proprietary features (Edge Functions)",
|
|
65
|
+
"Learning curve for RLS policies",
|
|
66
|
+
"Limited regions on free tier (single region)"
|
|
67
|
+
],
|
|
68
|
+
"best_for": [
|
|
69
|
+
"Rapid prototyping and MVPs",
|
|
70
|
+
"Real-time collaborative applications"
|
|
71
|
+
],
|
|
72
|
+
"pricing": {
|
|
73
|
+
"free_tier": "500MB database, 1GB storage, 50K MAU",
|
|
74
|
+
"paid_tiers": "Pro: $25/mo, Team: $599/mo",
|
|
75
|
+
"notes": "Egress charges apply at scale"
|
|
76
|
+
},
|
|
77
|
+
"limitations": [
|
|
78
|
+
"No MySQL or NoSQL database options",
|
|
79
|
+
"Edge Functions limited to Deno runtime",
|
|
80
|
+
"Self-hosted requires Docker expertise"
|
|
81
|
+
],
|
|
82
|
+
"sources": [
|
|
83
|
+
"https://supabase.com/docs",
|
|
84
|
+
"https://supabase.com/pricing"
|
|
85
|
+
],
|
|
86
|
+
"researched_at": "2025-12-30T10:00:00Z"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Guidelines
|
|
91
|
+
|
|
92
|
+
1. **Be fast** - You're using Haiku for speed, extract only what's needed
|
|
93
|
+
2. **Be factual** - Only include verifiable information from docs
|
|
94
|
+
3. **Be specific** - "Free tier: 500MB" not "generous free tier"
|
|
95
|
+
4. **Be balanced** - Every technology has cons, find them
|
|
96
|
+
5. **Cite sources** - Always include URLs where you found information
|
|
97
|
+
6. **No implementation** - Just gather data, don't write code
|
|
98
|
+
7. **Stay focused** - Only research your assigned option
|
|
99
|
+
|
|
100
|
+
## Common Categories
|
|
101
|
+
|
|
102
|
+
| Category | What to Research |
|
|
103
|
+
|----------|------------------|
|
|
104
|
+
| database | Data models, scaling, pricing, realtime, auth integration |
|
|
105
|
+
| auth | Providers, MFA, session management, pricing, compliance |
|
|
106
|
+
| cache | TTL options, eviction policies, cluster support, pricing |
|
|
107
|
+
| hosting | Regions, scaling, CI/CD, pricing, domain handling |
|
|
108
|
+
| state | Bundle size, devtools, async support, learning curve |
|
|
109
|
+
| styling | Build time, runtime, theming, bundle impact |
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-analyzer
|
|
3
|
+
description: AI-powered screenshot analysis for UI verification using Claude Haiku
|
|
4
|
+
tools: Read, Glob
|
|
5
|
+
model: haiku
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Visual Analyzer Agent
|
|
9
|
+
|
|
10
|
+
You are an AI agent specialized in analyzing UI screenshots for quality issues. You receive screenshots captured from Playwright/Storybook and provide structured feedback.
|
|
11
|
+
|
|
12
|
+
## Your Role
|
|
13
|
+
|
|
14
|
+
Analyze screenshots for:
|
|
15
|
+
1. **Layout Issues** - Overlapping elements, misalignment, clipping
|
|
16
|
+
2. **Typography** - Readability, contrast ratios, font sizes
|
|
17
|
+
3. **Touch Targets** - Minimum 44x44px for mobile
|
|
18
|
+
4. **Safe Areas** - Content not in notch/home indicator zones
|
|
19
|
+
5. **Brand Compliance** - Colors, fonts match brand guide
|
|
20
|
+
|
|
21
|
+
## Input Format
|
|
22
|
+
|
|
23
|
+
You receive:
|
|
24
|
+
- Screenshot file path
|
|
25
|
+
- Viewport information (dimensions, type)
|
|
26
|
+
- Brand guide reference (if available)
|
|
27
|
+
- Component/page context
|
|
28
|
+
|
|
29
|
+
## Analysis Process
|
|
30
|
+
|
|
31
|
+
### Step 1: Visual Inspection
|
|
32
|
+
|
|
33
|
+
Look at the screenshot and identify:
|
|
34
|
+
- Overall layout structure
|
|
35
|
+
- Color usage
|
|
36
|
+
- Text elements
|
|
37
|
+
- Interactive elements (buttons, links, inputs)
|
|
38
|
+
- Spacing and alignment
|
|
39
|
+
|
|
40
|
+
### Step 2: Issue Detection
|
|
41
|
+
|
|
42
|
+
Check for these specific issues:
|
|
43
|
+
|
|
44
|
+
#### Layout Issues
|
|
45
|
+
- Elements overlapping each other
|
|
46
|
+
- Text cut off or clipped
|
|
47
|
+
- Elements extending beyond viewport
|
|
48
|
+
- Broken responsive layout
|
|
49
|
+
- Inconsistent spacing
|
|
50
|
+
|
|
51
|
+
#### Typography Issues
|
|
52
|
+
- Text too small (< 12px body, < 16px mobile)
|
|
53
|
+
- Poor contrast (< 4.5:1 for AA compliance)
|
|
54
|
+
- Truncated text without ellipsis
|
|
55
|
+
- Unreadable fonts
|
|
56
|
+
|
|
57
|
+
#### Touch Target Issues (Mobile)
|
|
58
|
+
- Buttons smaller than 44x44px
|
|
59
|
+
- Touch targets too close together (< 8px gap)
|
|
60
|
+
- Links that are hard to tap
|
|
61
|
+
|
|
62
|
+
#### Safe Area Issues (Mobile Notch)
|
|
63
|
+
- Content in notch zone (top 47px on iPhone)
|
|
64
|
+
- Content in home indicator zone (bottom 34px)
|
|
65
|
+
- Content in side insets (landscape)
|
|
66
|
+
|
|
67
|
+
#### Brand Issues
|
|
68
|
+
- Wrong brand colors
|
|
69
|
+
- Incorrect fonts
|
|
70
|
+
- Missing brand elements
|
|
71
|
+
- Inconsistent styling
|
|
72
|
+
|
|
73
|
+
### Step 3: Output Format
|
|
74
|
+
|
|
75
|
+
Return JSON with findings **including your detailed reasoning**:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"viewport": {
|
|
80
|
+
"name": "mobile-notch",
|
|
81
|
+
"width": 393,
|
|
82
|
+
"height": 852
|
|
83
|
+
},
|
|
84
|
+
"screenshot_path": "__snapshots__/Button-mobile-notch.png",
|
|
85
|
+
"storybook_url": "http://localhost:6006/?path=/story/components-button--primary",
|
|
86
|
+
"analysis": {
|
|
87
|
+
"layout": "pass",
|
|
88
|
+
"typography": "pass",
|
|
89
|
+
"touch_targets": "warning",
|
|
90
|
+
"safe_areas": "pass",
|
|
91
|
+
"brand": "pass"
|
|
92
|
+
},
|
|
93
|
+
"overall_reasoning": "Layout is clean with proper alignment. Typography contrast measured at approximately 4.8:1 against the background, exceeding WCAG AA requirements. However, the secondary button height is below the recommended 44px minimum for touch targets.",
|
|
94
|
+
"issues": [
|
|
95
|
+
{
|
|
96
|
+
"type": "touch_target",
|
|
97
|
+
"severity": "warning",
|
|
98
|
+
"element": "secondary button",
|
|
99
|
+
"detail": "Button height is 36px, below 44px minimum",
|
|
100
|
+
"location": "bottom right",
|
|
101
|
+
"reasoning": "I measured the secondary button at approximately 36px height. Apple's HIG recommends 44×44px minimum for touch targets to ensure reliable tapping, especially on notch devices where users may be adjusting grip. The primary button meets the standard at 48px, but the secondary button falls short. This could lead to tap frustration on real devices.",
|
|
102
|
+
"suggestion": "Increase button height to 44px for better mobile usability",
|
|
103
|
+
"fix": "Add `min-h-[44px]` to secondary button variants"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"summary": {
|
|
107
|
+
"pass": true,
|
|
108
|
+
"issue_count": 1,
|
|
109
|
+
"critical": 0,
|
|
110
|
+
"warnings": 1,
|
|
111
|
+
"suggestions": 0
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Severity Levels
|
|
117
|
+
|
|
118
|
+
| Level | Description | Action |
|
|
119
|
+
|-------|-------------|--------|
|
|
120
|
+
| `critical` | Blocks functionality or major UX issue | Must fix before shipping |
|
|
121
|
+
| `warning` | Usability concern or accessibility issue | Should fix |
|
|
122
|
+
| `suggestion` | Enhancement opportunity | Nice to have |
|
|
123
|
+
|
|
124
|
+
## Viewport Reference
|
|
125
|
+
|
|
126
|
+
| Viewport | Dimensions | Safe Areas |
|
|
127
|
+
|----------|------------|------------|
|
|
128
|
+
| Mobile Portrait | 375×667 | None |
|
|
129
|
+
| Mobile Notch | 393×852 | Top: 47px, Bottom: 34px |
|
|
130
|
+
| Mobile Landscape | 667×375 | None |
|
|
131
|
+
| Tablet Portrait | 768×1024 | None |
|
|
132
|
+
| Tablet Landscape | 1024×768 | None |
|
|
133
|
+
| Small Desktop | 1280×720 | None |
|
|
134
|
+
| Desktop | 1920×1080 | None |
|
|
135
|
+
|
|
136
|
+
## Example Analysis
|
|
137
|
+
|
|
138
|
+
**Input:**
|
|
139
|
+
```
|
|
140
|
+
Analyze: __snapshots__/Button-mobile-notch.png
|
|
141
|
+
Viewport: 393x852 (mobile-notch)
|
|
142
|
+
Component: Button (primary variant)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Output:**
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"viewport": {
|
|
149
|
+
"name": "mobile-notch",
|
|
150
|
+
"width": 393,
|
|
151
|
+
"height": 852
|
|
152
|
+
},
|
|
153
|
+
"analysis": {
|
|
154
|
+
"layout": "pass",
|
|
155
|
+
"typography": "pass",
|
|
156
|
+
"touch_targets": "pass",
|
|
157
|
+
"safe_areas": "pass",
|
|
158
|
+
"brand": "pass"
|
|
159
|
+
},
|
|
160
|
+
"issues": [],
|
|
161
|
+
"summary": {
|
|
162
|
+
"pass": true,
|
|
163
|
+
"issue_count": 0,
|
|
164
|
+
"critical": 0,
|
|
165
|
+
"warnings": 0,
|
|
166
|
+
"suggestions": 0
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Integration
|
|
172
|
+
|
|
173
|
+
This agent is invoked by:
|
|
174
|
+
- `/test-visual` skill during visual regression testing
|
|
175
|
+
- `/hustle-ui-create` during Phase 11 (Visual Testing)
|
|
176
|
+
- `/hustle-ui-create-page` during Phase 11 (Visual Testing)
|
|
177
|
+
|
|
178
|
+
## Notes
|
|
179
|
+
|
|
180
|
+
- I am multimodal and can directly analyze image content
|
|
181
|
+
- I run as a Haiku subagent for fast, cost-effective analysis
|
|
182
|
+
- Multiple instances can run in parallel (one per viewport)
|
|
183
|
+
- Results are aggregated by the parent Opus agent
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"audit_version": "4.5.0",
|
|
3
|
+
"audit_date": "2025-12-30",
|
|
4
|
+
"status": "completed",
|
|
5
|
+
|
|
6
|
+
"readme_fixes": {
|
|
7
|
+
"version_number": { "old": "4.3.2", "new": "4.5.0", "status": "completed" },
|
|
8
|
+
"hook_count": { "old": "54", "new": "56", "status": "completed" },
|
|
9
|
+
"banner_width": { "issue": "broken lines on right side", "status": "completed" },
|
|
10
|
+
"five_workflows": { "added": "/hustle-build", "status": "completed" },
|
|
11
|
+
"new_skills_in_commands": { "added": ["/parallel-spawn"], "status": "completed" }
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
"counts": {
|
|
15
|
+
"skills": { "readme_claims": "40+", "actual": 44, "status": "accurate" },
|
|
16
|
+
"hooks": { "readme_claims": "56", "actual": 56, "status": "accurate" },
|
|
17
|
+
"subagents": { "readme_claims": 8, "actual": 8, "status": "accurate" },
|
|
18
|
+
"test_skills": { "readme_claims": 8, "actual": 7, "status": "review" },
|
|
19
|
+
"docs_files": { "in_docs_folder": 21, "status": "verified" }
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
"documentation_files": {
|
|
23
|
+
"docs_folder": {
|
|
24
|
+
"PHASE_REFERENCE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
25
|
+
"SKILLS.md": { "exists": true, "audited": true, "needs_update": false, "changes": "Added Testing Skills, Autonomous Mode Skills, /hustle-build" },
|
|
26
|
+
"HOOKS.md": { "exists": true, "audited": true, "needs_update": false, "changes": "Added Autonomous Mode Hooks, Parallel Execution Hooks, Shared Utilities sections" },
|
|
27
|
+
"AGENTS.md": { "exists": true, "audited": false, "needs_update": false },
|
|
28
|
+
"ORCHESTRATOR.md": { "exists": true, "audited": false, "needs_update": false },
|
|
29
|
+
"PARALLEL_AUTONOMOUS_WORKFLOW.md": { "exists": true, "audited": true, "needs_update": false, "changes": "Updated version to 4.5.0, status to Implemented, added /parallel-spawn and parallel-orchestrator.py" },
|
|
30
|
+
"AUTONOMOUS_LOOPS.md": { "exists": true, "audited": true, "needs_update": false, "changes": "Added /ralph-status and /ralph-continue skill documentation" },
|
|
31
|
+
"CONFIGURATION.md": { "exists": true, "audited": true, "needs_update": false, "changes": "Added Command-Line Flags section with --dry-run, --resume, --max-iterations, --parallel" },
|
|
32
|
+
"ARCHITECTURE_DECISION_RECORDS.md": { "exists": true, "audited": false, "needs_update": false },
|
|
33
|
+
"REGROUNDING.md": { "exists": true, "audited": false, "needs_update": false },
|
|
34
|
+
"PLUGIN_ARCHITECTURE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
35
|
+
"BRAND_GUIDE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
36
|
+
"CLAUDE_CODE_BEST_PRACTICES.md": { "exists": true, "audited": false, "needs_update": false },
|
|
37
|
+
"API-CREATE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
38
|
+
"HUSTLE-UI-CREATE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
39
|
+
"HUSTLE-UI-CREATE-PAGE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
40
|
+
"HUSTLE-COMBINE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
41
|
+
"PRE-COMMIT-SETUP.md": { "exists": true, "audited": false, "needs_update": false },
|
|
42
|
+
"ESLINT-CONFIG.md": { "exists": true, "audited": false, "needs_update": false },
|
|
43
|
+
"SCHEMA-LINT.md": { "exists": true, "audited": false, "needs_update": false },
|
|
44
|
+
"SECURITY-AUDIT.md": { "exists": true, "audited": false, "needs_update": false }
|
|
45
|
+
},
|
|
46
|
+
"root_level": {
|
|
47
|
+
"INSTALLATION_GUIDE.md": { "exists": true, "audited": false, "needs_update": false },
|
|
48
|
+
"BEST_PRACTICES_ANALYSIS.md": { "exists": true, "audited": false, "needs_update": false },
|
|
49
|
+
"CHANGELOG.md": { "exists": true, "audited": false, "needs_update": false, "note": "v4.5.0 entry exists" },
|
|
50
|
+
"ROADMAP.md": { "exists": true, "audited": false, "needs_update": false }
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
"v450_features_to_document": {
|
|
55
|
+
"new_skills": {
|
|
56
|
+
"/ralph-status": { "skill_file": true, "in_readme": true, "in_skills_md": true },
|
|
57
|
+
"/ralph-continue": { "skill_file": true, "in_readme": true, "in_skills_md": true },
|
|
58
|
+
"/parallel-spawn": { "skill_file": true, "in_readme": true, "in_skills_md": true }
|
|
59
|
+
},
|
|
60
|
+
"new_hooks": {
|
|
61
|
+
"enforce-dry-run.py": { "file_exists": true, "in_hooks_md": true },
|
|
62
|
+
"parallel-orchestrator.py": { "file_exists": true, "in_hooks_md": true },
|
|
63
|
+
"hook_utils.py": { "file_exists": true, "in_hooks_md": true }
|
|
64
|
+
},
|
|
65
|
+
"new_flags": {
|
|
66
|
+
"--dry-run": { "implemented": true, "in_config_md": true },
|
|
67
|
+
"--resume": { "implemented": true, "in_config_md": true },
|
|
68
|
+
"--max-iterations": { "implemented": true, "in_config_md": true },
|
|
69
|
+
"--parallel": { "implemented": true, "in_config_md": true }
|
|
70
|
+
},
|
|
71
|
+
"new_directories": {
|
|
72
|
+
".claude/workflow-logs/": { "created_by": "session-startup.py", "documented": true }
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
"files_modified_this_session": [
|
|
77
|
+
"README.md",
|
|
78
|
+
"docs/SKILLS.md",
|
|
79
|
+
"docs/HOOKS.md",
|
|
80
|
+
"docs/CONFIGURATION.md",
|
|
81
|
+
"docs/AUTONOMOUS_LOOPS.md",
|
|
82
|
+
"docs/PARALLEL_AUTONOMOUS_WORKFLOW.md"
|
|
83
|
+
],
|
|
84
|
+
|
|
85
|
+
"files_pending_update": [],
|
|
86
|
+
|
|
87
|
+
"completed_tasks": [
|
|
88
|
+
"Fixed README version: 4.3.2 → 4.5.0",
|
|
89
|
+
"Fixed README hook count: 54 → 56",
|
|
90
|
+
"Fixed README banner width/broken lines",
|
|
91
|
+
"Added /hustle-build as 5th main workflow in README",
|
|
92
|
+
"Added /parallel-spawn to All Slash Commands in README",
|
|
93
|
+
"Added Testing Skills section to SKILLS.md (7 skills)",
|
|
94
|
+
"Added Autonomous Mode Skills to SKILLS.md (4 skills)",
|
|
95
|
+
"Added /hustle-build to SKILLS.md",
|
|
96
|
+
"Added Autonomous Mode Hooks to HOOKS.md (3 hooks)",
|
|
97
|
+
"Added Parallel Execution Hooks to HOOKS.md (1 hook)",
|
|
98
|
+
"Added Shared Utilities to HOOKS.md (hook_utils.py)",
|
|
99
|
+
"Added Command-Line Flags section to CONFIGURATION.md (4 flags)",
|
|
100
|
+
"Added /ralph-status skill to AUTONOMOUS_LOOPS.md",
|
|
101
|
+
"Added /ralph-continue skill to AUTONOMOUS_LOOPS.md",
|
|
102
|
+
"Updated PARALLEL_AUTONOMOUS_WORKFLOW.md version to 4.5.0",
|
|
103
|
+
"Changed PARALLEL_AUTONOMOUS_WORKFLOW.md status to Implemented",
|
|
104
|
+
"Added /parallel-spawn and parallel-orchestrator.py references"
|
|
105
|
+
],
|
|
106
|
+
|
|
107
|
+
"next_steps": [
|
|
108
|
+
"Optional: Cross-reference all 44 skills with documentation",
|
|
109
|
+
"Optional: Cross-reference all 56 hooks with documentation",
|
|
110
|
+
"Optional: Final verification of all counts and links"
|
|
111
|
+
],
|
|
112
|
+
|
|
113
|
+
"audit_completed": "2025-12-30"
|
|
114
|
+
}
|