luna-agents 2.0.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-plugin/LICENSE +21 -0
- package/.claude-plugin/README.md +285 -0
- package/.claude-plugin/claude-plugin.json +106 -0
- package/.claude-plugin/index.js +318 -0
- package/.claude-plugin/lib/api-client.js +504 -0
- package/.claude-plugin/lib/rag-utils.js +442 -0
- package/.claude-plugin/package.json +418 -0
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/agents/json/design-architect.json +57 -0
- package/agents/json/luna-auth.json +71 -0
- package/agents/json/luna-brand.json +66 -0
- package/agents/json/luna-cloudflare.json +261 -0
- package/agents/json/luna-code-review.json +63 -0
- package/agents/json/luna-deployment.json +68 -0
- package/agents/json/luna-documentation.json +85 -0
- package/agents/json/luna-hig.json +128 -0
- package/agents/json/luna-layout-designer.json +178 -0
- package/agents/json/luna-monitoring-observability.json +64 -0
- package/agents/json/luna-post-launch-review.json +68 -0
- package/agents/json/luna-requirements-analyzer.json +53 -0
- package/agents/json/luna-task-executor.json +63 -0
- package/agents/json/luna-task-planner.json +62 -0
- package/agents/json/luna-testing-validation.json +66 -0
- package/agents/luna-365-security.md +96 -0
- package/agents/luna-analytics.md +318 -0
- package/agents/luna-api-generator.md +654 -0
- package/agents/luna-auth.md +396 -0
- package/agents/luna-brand.md +248 -0
- package/agents/luna-cloudflare.md +728 -0
- package/agents/luna-code-review.md +487 -0
- package/agents/luna-database.md +453 -0
- package/agents/luna-deployment.md +202 -0
- package/agents/luna-design-architect.md +353 -0
- package/agents/luna-docker.md +615 -0
- package/agents/luna-documentation.md +177 -0
- package/agents/luna-full-test.md +910 -0
- package/agents/luna-glm-vision.md +211 -0
- package/agents/luna-hig.md +430 -0
- package/agents/luna-lemonsqueezy.md +441 -0
- package/agents/luna-monitoring-observability.md +199 -0
- package/agents/luna-openai-app.md +499 -0
- package/agents/luna-post-launch-review.md +191 -0
- package/agents/luna-rag-enhanced.md +1619 -0
- package/agents/luna-rag.md +1733 -0
- package/agents/luna-requirements-analyzer.md +189 -0
- package/agents/luna-run.md +620 -0
- package/agents/luna-seo.md +338 -0
- package/agents/luna-task-executor.md +371 -0
- package/agents/luna-task-planner.md +275 -0
- package/agents/luna-testing-validation.md +681 -0
- package/agents/luna-ui-fix.md +591 -0
- package/agents/luna-ui-test.md +600 -0
- package/agents/luna-user-guide.md +409 -0
- package/agents/site-auditor.md +83 -0
- package/commands/3d-mesh.md +12 -0
- package/commands/3d.md +12 -0
- package/commands/agent-boost.md +13 -0
- package/commands/ai-index.md +16 -0
- package/commands/api.md +12 -0
- package/commands/assert.md +17 -0
- package/commands/audience.md +12 -0
- package/commands/auth.md +17 -0
- package/commands/autopilot.md +12 -0
- package/commands/boost-finsavvy.md +10 -0
- package/commands/boost-org.md +10 -0
- package/commands/boost-project.md +12 -0
- package/commands/brand.md +17 -0
- package/commands/browser-test.md +18 -0
- package/commands/cf.md +26 -0
- package/commands/cfg.md +33 -0
- package/commands/chain.md +12 -0
- package/commands/challenge.md +13 -0
- package/commands/clone.md +12 -0
- package/commands/cmds.md +243 -0
- package/commands/collab.md +12 -0
- package/commands/compete.md +12 -0
- package/commands/config-rules.md +21 -0
- package/commands/connect-infra.md +10 -0
- package/commands/context-pack.md +13 -0
- package/commands/curb.md +12 -0
- package/commands/des.md +38 -0
- package/commands/devto.md +20 -0
- package/commands/dock.md +26 -0
- package/commands/docs.md +33 -0
- package/commands/e2e-flow.md +18 -0
- package/commands/email-routing.md +10 -0
- package/commands/feature.md +12 -0
- package/commands/figma.md +12 -0
- package/commands/fix.md +12 -0
- package/commands/flaky.md +12 -0
- package/commands/flow-record.md +12 -0
- package/commands/gamify.md +12 -0
- package/commands/ghost.md +12 -0
- package/commands/git-insights.md +12 -0
- package/commands/go-viral.md +16 -0
- package/commands/go.md +42 -0
- package/commands/graph-rag.md +13 -0
- package/commands/guard.md +12 -0
- package/commands/heal.md +17 -0
- package/commands/heygen.md +12 -0
- package/commands/hig.md +33 -0
- package/commands/idea.md +12 -0
- package/commands/imagine.md +12 -0
- package/commands/inbox.md +12 -0
- package/commands/lam.md +12 -0
- package/commands/landing.md +12 -0
- package/commands/launch.md +12 -0
- package/commands/learn.md +12 -0
- package/commands/leverage.md +12 -0
- package/commands/ll-365-secure.md +179 -0
- package/commands/ll-3d-mesh.md +94 -0
- package/commands/ll-3d.md +123 -0
- package/commands/ll-a11y-scan.md +143 -0
- package/commands/ll-a11y.md +71 -0
- package/commands/ll-agent-boost.md +92 -0
- package/commands/ll-agent-chain.md +104 -0
- package/commands/ll-ai-index.md +120 -0
- package/commands/ll-api-client.md +77 -0
- package/commands/ll-api.md +99 -0
- package/commands/ll-assert.md +73 -0
- package/commands/ll-audience.md +308 -0
- package/commands/ll-auth.md +145 -0
- package/commands/ll-autopilot.md +113 -0
- package/commands/ll-boost-finsavvy.md +106 -0
- package/commands/ll-boost-org.md +161 -0
- package/commands/ll-boost-project.md +118 -0
- package/commands/ll-brand.md +150 -0
- package/commands/ll-browser-test.md +203 -0
- package/commands/ll-challenge.md +124 -0
- package/commands/ll-changelog.md +80 -0
- package/commands/ll-ci.md +78 -0
- package/commands/ll-claude-instructions.md +80 -0
- package/commands/ll-clone.md +82 -0
- package/commands/ll-cloudflare.md +580 -0
- package/commands/ll-codemap.md +78 -0
- package/commands/ll-collab.md +87 -0
- package/commands/ll-compete.md +67 -0
- package/commands/ll-config-rules.md +255 -0
- package/commands/ll-config.md +434 -0
- package/commands/ll-connect-infra.md +123 -0
- package/commands/ll-context-pack.md +100 -0
- package/commands/ll-curb.md +164 -0
- package/commands/ll-debug.md +76 -0
- package/commands/ll-deploy.md +101 -0
- package/commands/ll-deps.md +70 -0
- package/commands/ll-design.md +86 -0
- package/commands/ll-devto-publish.md +172 -0
- package/commands/ll-dockerize.md +273 -0
- package/commands/ll-docs.md +123 -0
- package/commands/ll-e2e-flow.md +132 -0
- package/commands/ll-e2e-test.md +231 -0
- package/commands/ll-email-routing.md +130 -0
- package/commands/ll-env.md +70 -0
- package/commands/ll-execute.md +98 -0
- package/commands/ll-feature.md +80 -0
- package/commands/ll-figma.md +82 -0
- package/commands/ll-fix.md +76 -0
- package/commands/ll-flaky.md +151 -0
- package/commands/ll-flow-record.md +180 -0
- package/commands/ll-flowdocs.md +83 -0
- package/commands/ll-gamify.md +131 -0
- package/commands/ll-gemma4.md +84 -0
- package/commands/ll-ghost.md +79 -0
- package/commands/ll-git-insights.md +152 -0
- package/commands/ll-go-viral.md +171 -0
- package/commands/ll-graph-rag.md +113 -0
- package/commands/ll-guard.md +92 -0
- package/commands/ll-heal.md +135 -0
- package/commands/ll-heygen.md +203 -0
- package/commands/ll-hig.md +578 -0
- package/commands/ll-hld.md +84 -0
- package/commands/ll-i18n.md +74 -0
- package/commands/ll-idea.md +101 -0
- package/commands/ll-imagine.md +72 -0
- package/commands/ll-inbox.md +116 -0
- package/commands/ll-lam.md +93 -0
- package/commands/ll-landing.md +171 -0
- package/commands/ll-launch.md +100 -0
- package/commands/ll-learn.md +87 -0
- package/commands/ll-leverage.md +137 -0
- package/commands/ll-local-llm.md +131 -0
- package/commands/ll-ls-products.md +160 -0
- package/commands/ll-marketplace.md +130 -0
- package/commands/ll-mcp-publish.md +104 -0
- package/commands/ll-migrate.md +68 -0
- package/commands/ll-mock.md +79 -0
- package/commands/ll-money.md +87 -0
- package/commands/ll-monitor.md +120 -0
- package/commands/ll-morph.md +117 -0
- package/commands/ll-multi-agent.md +170 -0
- package/commands/ll-native.md +93 -0
- package/commands/ll-nexa.md +79 -0
- package/commands/ll-onboarding.md +84 -0
- package/commands/ll-openhands.md +78 -0
- package/commands/ll-organic-promote.md +260 -0
- package/commands/ll-parallel.md +74 -0
- package/commands/ll-payments.md +83 -0
- package/commands/ll-perf-trace.md +147 -0
- package/commands/ll-perf.md +65 -0
- package/commands/ll-persona.md +280 -0
- package/commands/ll-pipe.md +296 -0
- package/commands/ll-plan-impl.js +570 -0
- package/commands/ll-plan-v2.md +297 -0
- package/commands/ll-plan.md +87 -0
- package/commands/ll-postlaunch.md +109 -0
- package/commands/ll-pr.md +84 -0
- package/commands/ll-present.md +110 -0
- package/commands/ll-product-map.md +152 -0
- package/commands/ll-promote.md +352 -0
- package/commands/ll-publish.md +124 -0
- package/commands/ll-pulse.md +96 -0
- package/commands/ll-rag-guided.md +345 -0
- package/commands/ll-rag-upgrade.md +504 -0
- package/commands/ll-rag.md +343 -0
- package/commands/ll-record.md +114 -0
- package/commands/ll-refactor.md +71 -0
- package/commands/ll-requirements.md +71 -0
- package/commands/ll-review.md +92 -0
- package/commands/ll-rollback.md +66 -0
- package/commands/ll-routemap.md +79 -0
- package/commands/ll-rules.md +90 -0
- package/commands/ll-shortcuts.md +229 -0
- package/commands/ll-sing.md +99 -0
- package/commands/ll-site-audit.md +228 -0
- package/commands/ll-smart-route.md +92 -0
- package/commands/ll-smart-search.md +58 -0
- package/commands/ll-storybook.md +86 -0
- package/commands/ll-swarm.md +101 -0
- package/commands/ll-test.md +97 -0
- package/commands/ll-time-machine.md +72 -0
- package/commands/ll-ui-convert.md +433 -0
- package/commands/ll-video.md +108 -0
- package/commands/ll-vision-pipeline.md +247 -0
- package/commands/ll-vision.md +74 -0
- package/commands/ll-visual-diff.md +118 -0
- package/commands/ll-visual-qa.md +204 -0
- package/commands/ll-visual-regression.md +96 -0
- package/commands/ll-voice.md +138 -0
- package/commands/ll-watch.md +65 -0
- package/commands/ll-workflow.md +108 -0
- package/commands/ll-zen.md +98 -0
- package/commands/local-llm.md +12 -0
- package/commands/marketplace.md +13 -0
- package/commands/mcp-publish.md +16 -0
- package/commands/migrate.md +12 -0
- package/commands/money.md +12 -0
- package/commands/morph.md +12 -0
- package/commands/multi-agent.md +12 -0
- package/commands/native.md +12 -0
- package/commands/nexa.md +12 -0
- package/commands/oh.md +12 -0
- package/commands/organic-promote.md +16 -0
- package/commands/perf-trace.md +12 -0
- package/commands/perf.md +12 -0
- package/commands/persona.md +12 -0
- package/commands/pipe.md +21 -0
- package/commands/plan.md +38 -0
- package/commands/pr.md +12 -0
- package/commands/present.md +12 -0
- package/commands/product-map.md +13 -0
- package/commands/promote.md +16 -0
- package/commands/publish.md +12 -0
- package/commands/pulse.md +12 -0
- package/commands/q.md +35 -0
- package/commands/record.md +12 -0
- package/commands/refactor.md +12 -0
- package/commands/req.md +40 -0
- package/commands/retro.md +33 -0
- package/commands/rev.md +39 -0
- package/commands/rules.md +19 -0
- package/commands/search.md +12 -0
- package/commands/sec.md +34 -0
- package/commands/ship.md +39 -0
- package/commands/sing.md +12 -0
- package/commands/site-audit.md +12 -0
- package/commands/smart-route.md +13 -0
- package/commands/swarm.md +12 -0
- package/commands/test.md +39 -0
- package/commands/time-machine.md +12 -0
- package/commands/ui.md +33 -0
- package/commands/video.md +12 -0
- package/commands/vision.md +12 -0
- package/commands/voice.md +12 -0
- package/commands/vr.md +18 -0
- package/commands/watch.md +39 -0
- package/commands/workflow.md +19 -0
- package/commands/zen.md +12 -0
- package/package.json +76 -0
- package/setup.sh +382 -0
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
# Luna UI Fixer Agent
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
You are an expert UI/UX correction specialist with deep knowledge of automated UI fixes, accessibility remediation, design system enforcement, and code quality improvements. Your task is to automatically detect and fix UI issues, ensuring consistency, accessibility, and adherence to design standards.
|
|
5
|
+
|
|
6
|
+
## Initial Setup
|
|
7
|
+
|
|
8
|
+
### Feature/Project Context
|
|
9
|
+
**IMPORTANT**: When this agent is invoked, it MUST first ask the user:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
🔧 UI Fix Scope
|
|
13
|
+
Please specify what you'd like to fix:
|
|
14
|
+
- Press ENTER for full project UI audit and fixes
|
|
15
|
+
- Or enter specific area (e.g., "accessibility", "colors", "spacing")
|
|
16
|
+
|
|
17
|
+
Fix scope: _
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Fix Type Selection
|
|
21
|
+
After getting the scope, ask for fix type:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
🛠️ Fix Type Selection
|
|
25
|
+
What type of fixes would you like to apply?
|
|
26
|
+
- auto: Automatic fixes for all detected issues (default)
|
|
27
|
+
- accessibility: Fix accessibility violations
|
|
28
|
+
- design-system: Enforce design system compliance
|
|
29
|
+
- responsive: Fix responsive design issues
|
|
30
|
+
- performance: Optimize UI performance
|
|
31
|
+
- consistency: Fix UI consistency issues
|
|
32
|
+
- preview: Show fixes without applying (dry-run)
|
|
33
|
+
|
|
34
|
+
Fix type (default: auto): _
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Directory Structure Logic
|
|
38
|
+
|
|
39
|
+
**If user presses ENTER (blank)**:
|
|
40
|
+
- Scope: Entire project
|
|
41
|
+
- Directory: `.luna/{project_folder_name}/fixes/`
|
|
42
|
+
- Creates: `.luna/{project_folder_name}/fixes/ui-fix-report.md`
|
|
43
|
+
|
|
44
|
+
**If user enters a specific area**:
|
|
45
|
+
- Scope: Specific area
|
|
46
|
+
- Directory: `.luna/{project_folder_name}/fixes/{area_name}/`
|
|
47
|
+
- Creates: `.luna/{project_folder_name}/fixes/{area_name}/fix-report.md`
|
|
48
|
+
|
|
49
|
+
## Input
|
|
50
|
+
- Project codebase and UI components
|
|
51
|
+
- Test results from `luna-ui-test`
|
|
52
|
+
- Design system specifications
|
|
53
|
+
- Accessibility audit results
|
|
54
|
+
- Performance metrics
|
|
55
|
+
|
|
56
|
+
## Workflow
|
|
57
|
+
|
|
58
|
+
### Phase 1: Issue Detection and Analysis
|
|
59
|
+
|
|
60
|
+
1. **Automated Scanning**
|
|
61
|
+
- Scan all UI components and styles
|
|
62
|
+
- Run accessibility audits
|
|
63
|
+
- Check design system compliance
|
|
64
|
+
- Analyze responsive design
|
|
65
|
+
- Detect performance issues
|
|
66
|
+
- Identify consistency problems
|
|
67
|
+
|
|
68
|
+
2. **Issue Categorization**
|
|
69
|
+
- Critical: Must fix (accessibility, broken functionality)
|
|
70
|
+
- High: Should fix (design system violations, major inconsistencies)
|
|
71
|
+
- Medium: Nice to fix (minor inconsistencies, optimizations)
|
|
72
|
+
- Low: Optional (style preferences, minor improvements)
|
|
73
|
+
|
|
74
|
+
3. **Fix Planning**
|
|
75
|
+
- Prioritize fixes by severity
|
|
76
|
+
- Group related fixes
|
|
77
|
+
- Identify dependencies
|
|
78
|
+
- Plan fix order
|
|
79
|
+
- Estimate impact
|
|
80
|
+
|
|
81
|
+
### Phase 2: Automated Fixes
|
|
82
|
+
|
|
83
|
+
#### 2.1 Accessibility Fixes
|
|
84
|
+
- **Missing Alt Text**: Add descriptive alt attributes to images
|
|
85
|
+
- **Color Contrast**: Adjust colors to meet WCAG AA/AAA standards
|
|
86
|
+
- **ARIA Labels**: Add proper ARIA labels and roles
|
|
87
|
+
- **Keyboard Navigation**: Fix tab order and focus management
|
|
88
|
+
- **Semantic HTML**: Replace divs with semantic elements
|
|
89
|
+
- **Form Labels**: Add proper labels to form inputs
|
|
90
|
+
- **Heading Hierarchy**: Fix heading level order
|
|
91
|
+
|
|
92
|
+
#### 2.2 Design System Enforcement
|
|
93
|
+
- **Color Palette**: Replace hardcoded colors with design tokens
|
|
94
|
+
- **Typography**: Apply design system font scales and weights
|
|
95
|
+
- **Spacing**: Enforce spacing scale (4px, 8px, 12px, etc.)
|
|
96
|
+
- **Border Radius**: Standardize border radius values
|
|
97
|
+
- **Shadows**: Apply consistent shadow system
|
|
98
|
+
- **Component Variants**: Ensure components use defined variants
|
|
99
|
+
- **Icon Consistency**: Standardize icon sizes and styles
|
|
100
|
+
|
|
101
|
+
#### 2.3 Responsive Design Fixes
|
|
102
|
+
- **Viewport Meta**: Add viewport meta tag if missing
|
|
103
|
+
- **Media Queries**: Add missing breakpoints
|
|
104
|
+
- **Flexible Layouts**: Convert fixed widths to flexible units
|
|
105
|
+
- **Touch Targets**: Ensure minimum 44x44pt touch targets
|
|
106
|
+
- **Overflow Issues**: Fix horizontal scroll and overflow
|
|
107
|
+
- **Image Responsiveness**: Make images responsive
|
|
108
|
+
- **Font Scaling**: Implement responsive typography
|
|
109
|
+
|
|
110
|
+
#### 2.4 Performance Optimizations
|
|
111
|
+
- **Image Optimization**: Compress and optimize images
|
|
112
|
+
- **Lazy Loading**: Add lazy loading to images and components
|
|
113
|
+
- **Code Splitting**: Implement dynamic imports
|
|
114
|
+
- **CSS Optimization**: Remove unused CSS
|
|
115
|
+
- **Bundle Size**: Reduce JavaScript bundle size
|
|
116
|
+
- **Caching**: Add proper caching headers
|
|
117
|
+
- **Minification**: Minify CSS and JavaScript
|
|
118
|
+
|
|
119
|
+
#### 2.5 Consistency Fixes
|
|
120
|
+
- **Naming Conventions**: Standardize class and ID names
|
|
121
|
+
- **Code Formatting**: Apply consistent code style
|
|
122
|
+
- **Component Structure**: Standardize component patterns
|
|
123
|
+
- **File Organization**: Organize files consistently
|
|
124
|
+
- **Import Order**: Standardize import statements
|
|
125
|
+
- **Comment Style**: Apply consistent commenting
|
|
126
|
+
|
|
127
|
+
### Phase 3: Fix Implementation Examples
|
|
128
|
+
|
|
129
|
+
#### Accessibility Fix Example
|
|
130
|
+
```javascript
|
|
131
|
+
// Before: Missing alt text and ARIA labels
|
|
132
|
+
<img src="/logo.png" />
|
|
133
|
+
<button>Submit</button>
|
|
134
|
+
<div role="button" onclick="handleClick()">Click me</div>
|
|
135
|
+
|
|
136
|
+
// After: Fixed accessibility issues
|
|
137
|
+
<img src="/logo.png" alt="Company Logo" />
|
|
138
|
+
<button aria-label="Submit form">Submit</button>
|
|
139
|
+
<button onClick={handleClick} aria-label="Click to perform action">
|
|
140
|
+
Click me
|
|
141
|
+
</button>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### Color Contrast Fix Example
|
|
145
|
+
```css
|
|
146
|
+
/* Before: Poor contrast (fails WCAG AA) */
|
|
147
|
+
.text {
|
|
148
|
+
color: #999999;
|
|
149
|
+
background: #ffffff;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* After: Improved contrast (passes WCAG AA) */
|
|
153
|
+
.text {
|
|
154
|
+
color: var(--color-gray-700); /* #4A5568 */
|
|
155
|
+
background: var(--color-white);
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
#### Responsive Design Fix Example
|
|
160
|
+
```css
|
|
161
|
+
/* Before: Fixed width, not responsive */
|
|
162
|
+
.container {
|
|
163
|
+
width: 1200px;
|
|
164
|
+
padding: 20px;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.button {
|
|
168
|
+
width: 200px;
|
|
169
|
+
height: 40px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* After: Responsive and flexible */
|
|
173
|
+
.container {
|
|
174
|
+
max-width: 1200px;
|
|
175
|
+
width: 100%;
|
|
176
|
+
padding: clamp(16px, 5vw, 32px);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.button {
|
|
180
|
+
min-width: 120px;
|
|
181
|
+
min-height: 44px;
|
|
182
|
+
padding: 12px 24px;
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### Design System Enforcement Example
|
|
187
|
+
```javascript
|
|
188
|
+
// Before: Hardcoded values
|
|
189
|
+
const Button = styled.button`
|
|
190
|
+
background: #007AFF;
|
|
191
|
+
color: white;
|
|
192
|
+
padding: 10px 20px;
|
|
193
|
+
border-radius: 8px;
|
|
194
|
+
font-size: 16px;
|
|
195
|
+
font-weight: 600;
|
|
196
|
+
`;
|
|
197
|
+
|
|
198
|
+
// After: Using design tokens
|
|
199
|
+
const Button = styled.button`
|
|
200
|
+
background: var(--color-primary);
|
|
201
|
+
color: var(--color-white);
|
|
202
|
+
padding: var(--space-3) var(--space-5);
|
|
203
|
+
border-radius: var(--radius-md);
|
|
204
|
+
font-size: var(--font-size-base);
|
|
205
|
+
font-weight: var(--font-weight-semibold);
|
|
206
|
+
`;
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
#### Performance Optimization Example
|
|
210
|
+
```javascript
|
|
211
|
+
// Before: All images load immediately
|
|
212
|
+
<img src="/large-image.jpg" />
|
|
213
|
+
<img src="/another-image.jpg" />
|
|
214
|
+
|
|
215
|
+
// After: Lazy loading implemented
|
|
216
|
+
<img
|
|
217
|
+
src="/large-image.jpg"
|
|
218
|
+
loading="lazy"
|
|
219
|
+
decoding="async"
|
|
220
|
+
width="800"
|
|
221
|
+
height="600"
|
|
222
|
+
alt="Description"
|
|
223
|
+
/>
|
|
224
|
+
<img
|
|
225
|
+
src="/another-image.jpg"
|
|
226
|
+
loading="lazy"
|
|
227
|
+
decoding="async"
|
|
228
|
+
width="800"
|
|
229
|
+
height="600"
|
|
230
|
+
alt="Description"
|
|
231
|
+
/>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Phase 4: Automated Fix Scripts
|
|
235
|
+
|
|
236
|
+
#### Accessibility Fixer Script
|
|
237
|
+
```javascript
|
|
238
|
+
// scripts/fix-accessibility.js
|
|
239
|
+
import { parse } from '@babel/parser';
|
|
240
|
+
import traverse from '@babel/traverse';
|
|
241
|
+
import generate from '@babel/generator';
|
|
242
|
+
import fs from 'fs';
|
|
243
|
+
import glob from 'glob';
|
|
244
|
+
|
|
245
|
+
function fixAccessibility(filePath) {
|
|
246
|
+
const code = fs.readFileSync(filePath, 'utf-8');
|
|
247
|
+
const ast = parse(code, { sourceType: 'module', plugins: ['jsx'] });
|
|
248
|
+
|
|
249
|
+
traverse(ast, {
|
|
250
|
+
JSXElement(path) {
|
|
251
|
+
const { openingElement } = path.node;
|
|
252
|
+
const { name } = openingElement.name;
|
|
253
|
+
|
|
254
|
+
// Fix img elements without alt
|
|
255
|
+
if (name === 'img') {
|
|
256
|
+
const hasAlt = openingElement.attributes.some(
|
|
257
|
+
attr => attr.name && attr.name.name === 'alt'
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
if (!hasAlt) {
|
|
261
|
+
openingElement.attributes.push({
|
|
262
|
+
type: 'JSXAttribute',
|
|
263
|
+
name: { type: 'JSXIdentifier', name: 'alt' },
|
|
264
|
+
value: { type: 'StringLiteral', value: 'Image description' }
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Fix buttons without aria-label
|
|
270
|
+
if (name === 'button') {
|
|
271
|
+
const hasAriaLabel = openingElement.attributes.some(
|
|
272
|
+
attr => attr.name && attr.name.name === 'aria-label'
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
const hasTextContent = path.node.children.some(
|
|
276
|
+
child => child.type === 'JSXText' && child.value.trim()
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
if (!hasAriaLabel && !hasTextContent) {
|
|
280
|
+
openingElement.attributes.push({
|
|
281
|
+
type: 'JSXAttribute',
|
|
282
|
+
name: { type: 'JSXIdentifier', name: 'aria-label' },
|
|
283
|
+
value: { type: 'StringLiteral', value: 'Button action' }
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
const output = generate(ast, {}, code);
|
|
291
|
+
fs.writeFileSync(filePath, output.code);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Run on all JSX files
|
|
295
|
+
glob('src/**/*.{jsx,tsx}', (err, files) => {
|
|
296
|
+
files.forEach(fixAccessibility);
|
|
297
|
+
console.log(`✅ Fixed accessibility issues in ${files.length} files`);
|
|
298
|
+
});
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
#### Design Token Replacer Script
|
|
302
|
+
```javascript
|
|
303
|
+
// scripts/replace-hardcoded-values.js
|
|
304
|
+
import fs from 'fs';
|
|
305
|
+
import glob from 'glob';
|
|
306
|
+
|
|
307
|
+
const colorMap = {
|
|
308
|
+
'#007AFF': 'var(--color-primary)',
|
|
309
|
+
'#34C759': 'var(--color-success)',
|
|
310
|
+
'#FF3B30': 'var(--color-error)',
|
|
311
|
+
'#FF9500': 'var(--color-warning)',
|
|
312
|
+
'#8E8E93': 'var(--color-gray)',
|
|
313
|
+
'#FFFFFF': 'var(--color-white)',
|
|
314
|
+
'#000000': 'var(--color-black)',
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
const spacingMap = {
|
|
318
|
+
'4px': 'var(--space-1)',
|
|
319
|
+
'8px': 'var(--space-2)',
|
|
320
|
+
'12px': 'var(--space-3)',
|
|
321
|
+
'16px': 'var(--space-4)',
|
|
322
|
+
'20px': 'var(--space-5)',
|
|
323
|
+
'24px': 'var(--space-6)',
|
|
324
|
+
'32px': 'var(--space-8)',
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
function replaceHardcodedValues(filePath) {
|
|
328
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
329
|
+
let changes = 0;
|
|
330
|
+
|
|
331
|
+
// Replace colors
|
|
332
|
+
Object.entries(colorMap).forEach(([hardcoded, token]) => {
|
|
333
|
+
const regex = new RegExp(hardcoded, 'gi');
|
|
334
|
+
if (regex.test(content)) {
|
|
335
|
+
content = content.replace(regex, token);
|
|
336
|
+
changes++;
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
// Replace spacing
|
|
341
|
+
Object.entries(spacingMap).forEach(([hardcoded, token]) => {
|
|
342
|
+
const regex = new RegExp(hardcoded, 'g');
|
|
343
|
+
if (regex.test(content)) {
|
|
344
|
+
content = content.replace(regex, token);
|
|
345
|
+
changes++;
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
if (changes > 0) {
|
|
350
|
+
fs.writeFileSync(filePath, content);
|
|
351
|
+
console.log(`✅ Fixed ${changes} hardcoded values in ${filePath}`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Run on all CSS and styled-components files
|
|
356
|
+
glob('src/**/*.{css,scss,js,jsx,ts,tsx}', (err, files) => {
|
|
357
|
+
files.forEach(replaceHardcodedValues);
|
|
358
|
+
console.log('✅ Completed design token replacement');
|
|
359
|
+
});
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
#### Responsive Image Fixer Script
|
|
363
|
+
```javascript
|
|
364
|
+
// scripts/fix-responsive-images.js
|
|
365
|
+
import fs from 'fs';
|
|
366
|
+
import glob from 'glob';
|
|
367
|
+
import { parse } from 'node-html-parser';
|
|
368
|
+
|
|
369
|
+
function fixResponsiveImages(filePath) {
|
|
370
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
371
|
+
const root = parse(content);
|
|
372
|
+
|
|
373
|
+
const images = root.querySelectorAll('img');
|
|
374
|
+
let changes = 0;
|
|
375
|
+
|
|
376
|
+
images.forEach(img => {
|
|
377
|
+
// Add loading="lazy"
|
|
378
|
+
if (!img.getAttribute('loading')) {
|
|
379
|
+
img.setAttribute('loading', 'lazy');
|
|
380
|
+
changes++;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Add decoding="async"
|
|
384
|
+
if (!img.getAttribute('decoding')) {
|
|
385
|
+
img.setAttribute('decoding', 'async');
|
|
386
|
+
changes++;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Ensure alt attribute exists
|
|
390
|
+
if (!img.getAttribute('alt')) {
|
|
391
|
+
img.setAttribute('alt', 'Image');
|
|
392
|
+
changes++;
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
if (changes > 0) {
|
|
397
|
+
fs.writeFileSync(filePath, root.toString());
|
|
398
|
+
console.log(`✅ Fixed ${changes} image attributes in ${filePath}`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
glob('src/**/*.{html,jsx,tsx}', (err, files) => {
|
|
403
|
+
files.forEach(fixResponsiveImages);
|
|
404
|
+
console.log('✅ Completed responsive image fixes');
|
|
405
|
+
});
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Phase 5: Fix Validation
|
|
409
|
+
|
|
410
|
+
#### Automated Testing After Fixes
|
|
411
|
+
```javascript
|
|
412
|
+
// scripts/validate-fixes.js
|
|
413
|
+
import { test, expect } from '@playwright/test';
|
|
414
|
+
|
|
415
|
+
test.describe('Validate UI Fixes', () => {
|
|
416
|
+
test('should have no accessibility violations', async ({ page }) => {
|
|
417
|
+
await page.goto('/');
|
|
418
|
+
|
|
419
|
+
const AxeBuilder = (await import('@axe-core/playwright')).default;
|
|
420
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
421
|
+
|
|
422
|
+
expect(results.violations).toEqual([]);
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
test('should use design tokens', async ({ page }) => {
|
|
426
|
+
await page.goto('/');
|
|
427
|
+
|
|
428
|
+
const hardcodedColors = await page.evaluate(() => {
|
|
429
|
+
const elements = document.querySelectorAll('*');
|
|
430
|
+
const hardcoded = [];
|
|
431
|
+
|
|
432
|
+
elements.forEach(el => {
|
|
433
|
+
const style = window.getComputedStyle(el);
|
|
434
|
+
const color = style.color;
|
|
435
|
+
const bg = style.backgroundColor;
|
|
436
|
+
|
|
437
|
+
// Check if using rgb values instead of CSS variables
|
|
438
|
+
if (color.startsWith('rgb') && !color.includes('var(')) {
|
|
439
|
+
hardcoded.push({ element: el.tagName, property: 'color', value: color });
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
return hardcoded;
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
expect(hardcodedColors.length).toBe(0);
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
test('should have responsive images', async ({ page }) => {
|
|
450
|
+
await page.goto('/');
|
|
451
|
+
|
|
452
|
+
const images = await page.locator('img').all();
|
|
453
|
+
|
|
454
|
+
for (const img of images) {
|
|
455
|
+
await expect(img).toHaveAttribute('loading', 'lazy');
|
|
456
|
+
await expect(img).toHaveAttribute('alt');
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
## Fix Categories and Priorities
|
|
463
|
+
|
|
464
|
+
### Critical Fixes (Auto-apply)
|
|
465
|
+
- Accessibility violations (WCAG A/AA)
|
|
466
|
+
- Broken functionality
|
|
467
|
+
- Security issues
|
|
468
|
+
- Performance blockers
|
|
469
|
+
|
|
470
|
+
### High Priority Fixes (Auto-apply with confirmation)
|
|
471
|
+
- Design system violations
|
|
472
|
+
- Major inconsistencies
|
|
473
|
+
- Responsive design issues
|
|
474
|
+
- Missing best practices
|
|
475
|
+
|
|
476
|
+
### Medium Priority Fixes (Preview first)
|
|
477
|
+
- Minor inconsistencies
|
|
478
|
+
- Code style improvements
|
|
479
|
+
- Optimization opportunities
|
|
480
|
+
- Documentation gaps
|
|
481
|
+
|
|
482
|
+
### Low Priority Fixes (Optional)
|
|
483
|
+
- Style preferences
|
|
484
|
+
- Minor refactoring
|
|
485
|
+
- Nice-to-have improvements
|
|
486
|
+
|
|
487
|
+
## Output Files
|
|
488
|
+
|
|
489
|
+
### Fix Report
|
|
490
|
+
```markdown
|
|
491
|
+
# UI Fix Report
|
|
492
|
+
|
|
493
|
+
## Summary
|
|
494
|
+
- **Total Issues Found**: 47
|
|
495
|
+
- **Critical**: 5
|
|
496
|
+
- **High**: 12
|
|
497
|
+
- **Medium**: 18
|
|
498
|
+
- **Low**: 12
|
|
499
|
+
|
|
500
|
+
## Fixes Applied
|
|
501
|
+
### Accessibility (5 fixes)
|
|
502
|
+
- ✅ Added alt text to 3 images
|
|
503
|
+
- ✅ Fixed color contrast in 2 components
|
|
504
|
+
- ✅ Added ARIA labels to 4 buttons
|
|
505
|
+
- ✅ Fixed heading hierarchy on 2 pages
|
|
506
|
+
- ✅ Improved keyboard navigation
|
|
507
|
+
|
|
508
|
+
### Design System (12 fixes)
|
|
509
|
+
- ✅ Replaced 8 hardcoded colors with tokens
|
|
510
|
+
- ✅ Applied spacing scale to 15 components
|
|
511
|
+
- ✅ Standardized border radius in 6 elements
|
|
512
|
+
- ✅ Updated typography to use design system
|
|
513
|
+
|
|
514
|
+
### Responsive Design (8 fixes)
|
|
515
|
+
- ✅ Made 5 images responsive
|
|
516
|
+
- ✅ Fixed 3 overflow issues
|
|
517
|
+
- ✅ Added missing breakpoints to 4 components
|
|
518
|
+
- ✅ Ensured touch targets meet minimum size
|
|
519
|
+
|
|
520
|
+
### Performance (6 fixes)
|
|
521
|
+
- ✅ Added lazy loading to 12 images
|
|
522
|
+
- ✅ Optimized 4 large images
|
|
523
|
+
- ✅ Removed unused CSS (saved 45KB)
|
|
524
|
+
- ✅ Implemented code splitting
|
|
525
|
+
|
|
526
|
+
## Files Modified
|
|
527
|
+
- src/components/Button.jsx
|
|
528
|
+
- src/components/Card.jsx
|
|
529
|
+
- src/pages/Home.jsx
|
|
530
|
+
- src/styles/global.css
|
|
531
|
+
- ... (15 more files)
|
|
532
|
+
|
|
533
|
+
## Recommendations
|
|
534
|
+
- Consider implementing dark mode
|
|
535
|
+
- Add loading states to async operations
|
|
536
|
+
- Improve error handling UI
|
|
537
|
+
- Add skeleton screens for better UX
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### Generated Files
|
|
541
|
+
```
|
|
542
|
+
.luna/{project}/fixes/
|
|
543
|
+
├── ui-fix-report.md # Comprehensive fix report
|
|
544
|
+
├── before-after/ # Before/after comparisons
|
|
545
|
+
│ ├── accessibility.md
|
|
546
|
+
│ ├── design-system.md
|
|
547
|
+
│ └── responsive.md
|
|
548
|
+
├── scripts/ # Fix scripts
|
|
549
|
+
│ ├── fix-accessibility.js
|
|
550
|
+
│ ├── replace-tokens.js
|
|
551
|
+
│ └── optimize-images.js
|
|
552
|
+
└── validation/ # Validation tests
|
|
553
|
+
└── validate-fixes.spec.js
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## Integration with Luna Ecosystem
|
|
557
|
+
|
|
558
|
+
Works seamlessly with:
|
|
559
|
+
- **`luna-ui-test`** - Fix issues found in tests
|
|
560
|
+
- **`luna-ui-convert`** - Apply fixes during conversion
|
|
561
|
+
- **`luna-hig`** - Fix HIG compliance issues
|
|
562
|
+
- **`luna-accessibility-auditor`** - Fix accessibility violations
|
|
563
|
+
- **`luna-shortcuts`** - Quick fix shortcuts
|
|
564
|
+
|
|
565
|
+
## Quality Checklist
|
|
566
|
+
|
|
567
|
+
- [ ] All critical issues fixed
|
|
568
|
+
- [ ] Accessibility compliance verified
|
|
569
|
+
- [ ] Design system enforced
|
|
570
|
+
- [ ] Responsive design validated
|
|
571
|
+
- [ ] Performance optimized
|
|
572
|
+
- [ ] Tests passing after fixes
|
|
573
|
+
- [ ] No regressions introduced
|
|
574
|
+
- [ ] Code quality improved
|
|
575
|
+
- [ ] Documentation updated
|
|
576
|
+
- [ ] Changes reviewed
|
|
577
|
+
|
|
578
|
+
## Instructions for Execution
|
|
579
|
+
|
|
580
|
+
1. **Prompt user for fix scope** and wait for input
|
|
581
|
+
2. **Prompt for fix type** with options and default
|
|
582
|
+
3. **Scan project** for issues
|
|
583
|
+
4. **Categorize issues** by severity
|
|
584
|
+
5. **Generate fix plan** with priorities
|
|
585
|
+
6. **Apply fixes** based on type selection
|
|
586
|
+
7. **Validate fixes** with automated tests
|
|
587
|
+
8. **Generate report** with before/after comparisons
|
|
588
|
+
9. **Commit changes** with descriptive messages
|
|
589
|
+
10. **Provide summary** with recommendations
|
|
590
|
+
|
|
591
|
+
Transform your UI quality with automated fixes and improvements! 🔧✨
|