opencodekit 0.10.0 → 0.11.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/dist/index.js +1 -1
- package/dist/template/.opencode/agent/planner.md +3 -2
- package/dist/template/.opencode/command/accessibility-check.md +297 -30
- package/dist/template/.opencode/command/analyze-mockup.md +412 -20
- package/dist/template/.opencode/command/analyze-project.md +445 -30
- package/dist/template/.opencode/command/brainstorm.md +294 -5
- package/dist/template/.opencode/command/commit.md +231 -17
- package/dist/template/.opencode/command/create.md +415 -77
- package/dist/template/.opencode/command/design-audit.md +483 -29
- package/dist/template/.opencode/command/design.md +615 -6
- package/dist/template/.opencode/command/edit-image.md +223 -20
- package/dist/template/.opencode/command/finish.md +163 -71
- package/dist/template/.opencode/command/fix-ci.md +297 -24
- package/dist/template/.opencode/command/fix-types.md +351 -13
- package/dist/template/.opencode/command/fix-ui.md +299 -13
- package/dist/template/.opencode/command/fix.md +262 -9
- package/dist/template/.opencode/command/generate-diagram.md +327 -26
- package/dist/template/.opencode/command/generate-icon.md +266 -22
- package/dist/template/.opencode/command/generate-image.md +232 -12
- package/dist/template/.opencode/command/generate-pattern.md +234 -20
- package/dist/template/.opencode/command/generate-storyboard.md +231 -21
- package/dist/template/.opencode/command/handoff.md +208 -31
- package/dist/template/.opencode/command/implement.md +163 -50
- package/dist/template/.opencode/command/import-plan.md +253 -52
- package/dist/template/.opencode/command/init.md +154 -35
- package/dist/template/.opencode/command/integration-test.md +410 -24
- package/dist/template/.opencode/command/issue.md +177 -21
- package/dist/template/.opencode/command/new-feature.md +390 -54
- package/dist/template/.opencode/command/plan.md +394 -107
- package/dist/template/.opencode/command/pr.md +235 -29
- package/dist/template/.opencode/command/quick-build.md +234 -5
- package/dist/template/.opencode/command/research-and-implement.md +442 -12
- package/dist/template/.opencode/command/research-ui.md +444 -34
- package/dist/template/.opencode/command/research.md +179 -45
- package/dist/template/.opencode/command/restore-image.md +416 -22
- package/dist/template/.opencode/command/resume.md +447 -63
- package/dist/template/.opencode/command/revert-feature.md +347 -65
- package/dist/template/.opencode/command/review-codebase.md +199 -4
- package/dist/template/.opencode/command/skill-create.md +506 -14
- package/dist/template/.opencode/command/skill-optimize.md +487 -16
- package/dist/template/.opencode/command/status.md +326 -60
- package/dist/template/.opencode/command/summarize.md +374 -33
- package/dist/template/.opencode/command/triage.md +361 -0
- package/dist/template/.opencode/command/ui-review.md +296 -25
- package/dist/template/.opencode/skill/beads/SKILL.md +108 -3
- package/dist/template/.opencode/skill/playwriter/SKILL.md +148 -0
- package/package.json +1 -1
|
@@ -1,30 +1,368 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Fix type errors with optional bead tracking
|
|
3
|
-
argument-hint: "[bead-id]"
|
|
3
|
+
argument-hint: "[bead-id] [--strict]"
|
|
4
|
+
agent: build
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Fix Type Errors
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
## Load Beads Skill
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
```typescript
|
|
12
|
+
skill({ name: "beads" });
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Options
|
|
16
|
+
|
|
17
|
+
- `--strict`: Also fix warnings and enable stricter checks
|
|
18
|
+
|
|
19
|
+
## Phase 1: Load Context
|
|
20
|
+
|
|
21
|
+
**Load skill:**
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
skill({ name: "systematic-debugging" });
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Check for bead context:**
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
bd_show({ id: "$ARGUMENTS" });
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Reserve files:**
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
bd_reserve({
|
|
37
|
+
paths: ["src/**/*.ts", "src/**/*.tsx"],
|
|
38
|
+
reason: "Fixing type errors",
|
|
39
|
+
ttl: 600,
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Phase 2: Detect Project & Run Type Check
|
|
44
|
+
|
|
45
|
+
**Detect type check command:**
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Check package.json for type-check script
|
|
49
|
+
grep -q "type-check\|typecheck" package.json && echo "npm run type-check"
|
|
50
|
+
|
|
51
|
+
# Or use tsc directly
|
|
52
|
+
npx tsc --noEmit
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
| Project Type | Type Check Command |
|
|
56
|
+
| ------------ | ------------------------------------------ |
|
|
57
|
+
| npm | `npm run type-check` or `npx tsc --noEmit` |
|
|
58
|
+
| bun | `bun run typecheck` |
|
|
59
|
+
| yarn | `yarn type-check` |
|
|
60
|
+
| pnpm | `pnpm type-check` |
|
|
61
|
+
|
|
62
|
+
**Capture initial error count:**
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npx tsc --noEmit 2>&1 | grep -c "error TS"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Type Check Status:
|
|
70
|
+
━━━━━━━━━━━━━━━━━━
|
|
71
|
+
|
|
72
|
+
Initial errors: [N]
|
|
73
|
+
Files affected: [N]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Phase 3: Use LSP for Semantic Analysis
|
|
77
|
+
|
|
78
|
+
Get errors with full context:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
lsp_diagnostics({ filePath: "<file>", severity: "error" });
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
For each file with errors:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
lsp_hover({ filePath: "<file>", line: N, character: N }); // Understand types
|
|
88
|
+
lsp_goto_definition({ filePath: "<file>", line: N, character: N }); // Find source
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Phase 4: Categorize Errors
|
|
92
|
+
|
|
93
|
+
Group errors by pattern:
|
|
94
|
+
|
|
95
|
+
| Category | Error Pattern | Typical Fix |
|
|
96
|
+
| ---------------------- | ----------------------------------- | -------------------------------- |
|
|
97
|
+
| **Missing type** | `implicitly has 'any' type` | Add explicit type annotation |
|
|
98
|
+
| **Incorrect type** | `Type 'X' is not assignable to 'Y'` | Fix type or add conversion |
|
|
99
|
+
| **Null/undefined** | `possibly 'null' or 'undefined'` | Add null check or optional chain |
|
|
100
|
+
| **Property missing** | `Property 'x' does not exist` | Add to interface or fix typo |
|
|
101
|
+
| **Generic constraint** | `does not satisfy constraint` | Fix generic or add constraint |
|
|
102
|
+
| **Import error** | `Cannot find module` | Fix import path or install dep |
|
|
103
|
+
| **Overload mismatch** | `No overload matches this call` | Check function signature |
|
|
104
|
+
| **Readonly violation** | `Cannot assign to 'x' (read-only)` | Remove mutation or cast |
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
Error Categories:
|
|
108
|
+
━━━━━━━━━━━━━━━━
|
|
109
|
+
|
|
110
|
+
- Missing types: [N]
|
|
111
|
+
- Incorrect types: [N]
|
|
112
|
+
- Null handling: [N]
|
|
113
|
+
- Property errors: [N]
|
|
114
|
+
- Other: [N]
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Phase 5: Estimate Complexity
|
|
118
|
+
|
|
119
|
+
| Signals | Estimate | Approach |
|
|
120
|
+
| ---------------------------------------- | -------- | ---------------- |
|
|
121
|
+
| <10 errors, single category | S (~10) | Quick fix |
|
|
122
|
+
| 10-30 errors, few categories | M (~30) | Systematic |
|
|
123
|
+
| 30-100 errors, multiple categories | L (~100) | Batch by pattern |
|
|
124
|
+
| >100 errors or architectural type issues | XL | Plan first |
|
|
125
|
+
|
|
126
|
+
## Phase 6: Fix Errors
|
|
127
|
+
|
|
128
|
+
### Rules (MUST follow)
|
|
129
|
+
|
|
130
|
+
- ❌ **Never** use `any` just to pass type check
|
|
131
|
+
- ❌ **Never** use `// @ts-ignore` without justification
|
|
132
|
+
- ❌ **Never** use `as unknown as T` pattern
|
|
133
|
+
- ✅ **Prefer** proper typing over type assertions
|
|
134
|
+
- ✅ **Prefer** narrowing with type guards
|
|
135
|
+
- ✅ **Prefer** `unknown` over `any` when type is truly unknown
|
|
11
136
|
|
|
12
|
-
|
|
137
|
+
### Common Fixes
|
|
13
138
|
|
|
14
|
-
|
|
15
|
-
- Do not use `any` just to pass the type check.
|
|
16
|
-
- Prefer proper typing over type assertions where possible.
|
|
139
|
+
**Missing type on parameter:**
|
|
17
140
|
|
|
18
|
-
|
|
141
|
+
```typescript
|
|
142
|
+
// Before
|
|
143
|
+
function process(data) { ... }
|
|
144
|
+
|
|
145
|
+
// After
|
|
146
|
+
function process(data: ProcessInput): ProcessOutput { ... }
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Null/undefined handling:**
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// Before
|
|
153
|
+
const name = user.name.toUpperCase();
|
|
154
|
+
|
|
155
|
+
// After (optional chaining)
|
|
156
|
+
const name = user?.name?.toUpperCase() ?? "Unknown";
|
|
157
|
+
|
|
158
|
+
// After (type guard)
|
|
159
|
+
if (user?.name) {
|
|
160
|
+
const name = user.name.toUpperCase();
|
|
161
|
+
}
|
|
162
|
+
```
|
|
19
163
|
|
|
20
|
-
|
|
164
|
+
**Property doesn't exist:**
|
|
21
165
|
|
|
22
|
-
|
|
166
|
+
```typescript
|
|
167
|
+
// Before
|
|
168
|
+
interface User {
|
|
169
|
+
name: string;
|
|
170
|
+
}
|
|
171
|
+
user.email; // Error
|
|
172
|
+
|
|
173
|
+
// After - extend interface
|
|
174
|
+
interface User {
|
|
175
|
+
name: string;
|
|
176
|
+
email?: string;
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Generic constraint:**
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// Before
|
|
184
|
+
function getValue<T>(obj: T, key: string) {
|
|
185
|
+
return obj[key]; // Error
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// After
|
|
189
|
+
function getValue<T extends Record<string, unknown>>(obj: T, key: keyof T) {
|
|
190
|
+
return obj[key];
|
|
191
|
+
}
|
|
192
|
+
```
|
|
23
193
|
|
|
24
|
-
|
|
194
|
+
### Batch Fixing Strategy
|
|
25
195
|
|
|
26
|
-
|
|
196
|
+
For many errors of same type:
|
|
27
197
|
|
|
28
198
|
```typescript
|
|
29
|
-
|
|
199
|
+
// Use AST grep to find patterns
|
|
200
|
+
ast - grep({ pattern: "function $NAME($PARAMS) {" }); // Find untyped functions
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Fix one, then apply pattern to similar cases.
|
|
204
|
+
|
|
205
|
+
## Phase 7: Iterate Until Clean
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
npx tsc --noEmit 2>&1
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Repeat until:
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
Type Check: 0 errors ✓
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Maximum iterations:** 5 passes. If still errors after 5, reassess approach.
|
|
218
|
+
|
|
219
|
+
## Phase 8: Verification
|
|
220
|
+
|
|
221
|
+
**Type check passes:**
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
npx tsc --noEmit
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Tests still pass:**
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
npm test
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Lint still passes:**
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
npm run lint
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
Verification:
|
|
241
|
+
━━━━━━━━━━━━━
|
|
242
|
+
|
|
243
|
+
Types: 0 errors ✓
|
|
244
|
+
Tests: Passing ✓
|
|
245
|
+
Lint: Passing ✓
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Phase 9: Track Improvement
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
Type Error Resolution:
|
|
252
|
+
━━━━━━━━━━━━━━━━━━━━━━
|
|
253
|
+
|
|
254
|
+
Before: [N] errors
|
|
255
|
+
After: 0 errors
|
|
256
|
+
Reduction: 100%
|
|
257
|
+
|
|
258
|
+
By category:
|
|
259
|
+
- Missing types: [N] → 0
|
|
260
|
+
- Null handling: [N] → 0
|
|
261
|
+
- Property errors: [N] → 0
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Phase 10: Document Patterns
|
|
265
|
+
|
|
266
|
+
If you discovered useful type patterns:
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
observation({
|
|
270
|
+
type: "pattern",
|
|
271
|
+
title: "Type pattern: [name]",
|
|
272
|
+
content: `
|
|
273
|
+
## Pattern
|
|
274
|
+
[Description of the type pattern]
|
|
275
|
+
|
|
276
|
+
## Example
|
|
277
|
+
\`\`\`typescript
|
|
278
|
+
[Code showing the pattern]
|
|
279
|
+
\`\`\`
|
|
280
|
+
|
|
281
|
+
## When to Use
|
|
282
|
+
[When this pattern applies]
|
|
283
|
+
`,
|
|
284
|
+
concepts: "typescript, types, [specific pattern]",
|
|
285
|
+
bead_id: "<bead-id>",
|
|
286
|
+
});
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Update conventions if this should be standard:
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
memory -
|
|
293
|
+
update({
|
|
294
|
+
file: "project/conventions",
|
|
295
|
+
content: `
|
|
296
|
+
## Type Pattern: [Name]
|
|
297
|
+
|
|
298
|
+
[Pattern description and example]
|
|
299
|
+
`,
|
|
300
|
+
mode: "append",
|
|
301
|
+
});
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Phase 11: Handle Deep Issues
|
|
305
|
+
|
|
306
|
+
If type errors reveal architectural problems:
|
|
307
|
+
|
|
308
|
+
```typescript
|
|
309
|
+
bd_add({
|
|
310
|
+
title: "Refactor: [type issue summary]",
|
|
311
|
+
type: "task",
|
|
312
|
+
pri: 2,
|
|
313
|
+
desc: "Type errors revealed need for: [description]",
|
|
314
|
+
});
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Phase 12: Commit & Sync
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
git add <files>
|
|
321
|
+
git commit -m "fix(types): resolve type errors
|
|
322
|
+
|
|
323
|
+
- Fixed [N] type errors
|
|
324
|
+
- Categories: [list main categories]
|
|
325
|
+
- No 'any' types added
|
|
326
|
+
[bead-id if applicable]"
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
bd_release({ _: true });
|
|
331
|
+
bd_sync({ reason: "Fixed type errors" });
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## Output
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
Type Errors Fixed
|
|
338
|
+
━━━━━━━━━━━━━━━━━
|
|
339
|
+
|
|
340
|
+
Estimate: [S/M/L]
|
|
341
|
+
Before: [N] errors
|
|
342
|
+
After: 0 errors
|
|
343
|
+
|
|
344
|
+
Categories fixed:
|
|
345
|
+
- Missing types: [N]
|
|
346
|
+
- Null handling: [N]
|
|
347
|
+
- Property errors: [N]
|
|
348
|
+
|
|
349
|
+
Verification:
|
|
350
|
+
- Type check: ✓
|
|
351
|
+
- Tests: ✓
|
|
352
|
+
- Lint: ✓
|
|
353
|
+
|
|
354
|
+
'any' types added: 0 ✓
|
|
355
|
+
Patterns documented: [N]
|
|
356
|
+
|
|
357
|
+
Commit: [hash]
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Next steps:**
|
|
361
|
+
|
|
362
|
+
```
|
|
363
|
+
If part of larger task:
|
|
364
|
+
/implement <bead-id>
|
|
365
|
+
|
|
366
|
+
If standalone:
|
|
367
|
+
/finish <bead-id>
|
|
30
368
|
```
|
|
@@ -1,22 +1,308 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Analyze and fix UI issues
|
|
3
|
-
argument-hint: "[
|
|
3
|
+
argument-hint: "<issue or bead-id> [--a11y]"
|
|
4
4
|
agent: build
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Fix UI: $ARGUMENTS
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Load Beads Skill
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
2. **Research:** @vision checks design guidelines, component patterns
|
|
15
|
-
- Apply `frontend-aesthetics` criteria (typography, color, motion, backgrounds)
|
|
16
|
-
3. **Fix:** Implement step by step
|
|
17
|
-
- Avoid generic AI aesthetics (Inter font, purple gradients, flat backgrounds)
|
|
18
|
-
- Use distinctive typography, cohesive themes, meaningful motion
|
|
19
|
-
4. **Verify:** Screenshot/test the fix
|
|
20
|
-
5. **Review:** Run tests, ensure quality
|
|
11
|
+
```typescript
|
|
12
|
+
skill({ name: "beads" });
|
|
13
|
+
```
|
|
21
14
|
|
|
22
|
-
|
|
15
|
+
## Options
|
|
16
|
+
|
|
17
|
+
- `--a11y`: Include full accessibility audit
|
|
18
|
+
|
|
19
|
+
## Phase 1: Load Context
|
|
20
|
+
|
|
21
|
+
**Check for bead context:**
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
bd_show({ id: "$ARGUMENTS" });
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Load skill:**
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
skill({ name: "frontend-aesthetics" });
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Reserve UI files:**
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
bd_reserve({
|
|
37
|
+
paths: ["src/components/**", "src/styles/**"],
|
|
38
|
+
reason: "Fixing UI: $ARGUMENTS",
|
|
39
|
+
ttl: 600,
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Phase 2: Capture Before State
|
|
44
|
+
|
|
45
|
+
Take screenshot before making changes:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// Using Playwright skill
|
|
49
|
+
skill({ name: "playwright" });
|
|
50
|
+
skill_mcp({
|
|
51
|
+
skill_name: "playwright",
|
|
52
|
+
tool_name: "browser_screenshot",
|
|
53
|
+
arguments: '{"name": "before-fix"}',
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Or use browser DevTools:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
skill({ name: "chrome-devtools" });
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Save screenshot to `.beads/artifacts/<bead-id>/before.png`
|
|
64
|
+
|
|
65
|
+
## Phase 3: Analyze with Vision
|
|
66
|
+
|
|
67
|
+
Delegate to @vision for initial assessment:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
task({
|
|
71
|
+
subagent_type: "vision",
|
|
72
|
+
description: "Analyze UI issue",
|
|
73
|
+
prompt: `
|
|
74
|
+
TASK: Analyze UI issue: $ARGUMENTS
|
|
75
|
+
|
|
76
|
+
EXPECTED OUTCOME:
|
|
77
|
+
- Describe the visual problem in detail
|
|
78
|
+
- Identify affected components
|
|
79
|
+
- Suggest fix approach
|
|
80
|
+
- Check against frontend-aesthetics anti-patterns
|
|
81
|
+
|
|
82
|
+
MUST DO:
|
|
83
|
+
- Load the before screenshot
|
|
84
|
+
- Identify specific CSS/component issues
|
|
85
|
+
- Check for AI slop patterns (Inter font, purple gradients, flat backgrounds)
|
|
86
|
+
- Assess color contrast and typography
|
|
87
|
+
|
|
88
|
+
MUST NOT DO:
|
|
89
|
+
- Don't make changes, just analyze
|
|
90
|
+
- Don't suggest generic solutions
|
|
91
|
+
|
|
92
|
+
CONTEXT:
|
|
93
|
+
- Screenshot: .beads/artifacts/<bead-id>/before.png
|
|
94
|
+
- Issue: $ARGUMENTS
|
|
95
|
+
`,
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Phase 4: Estimate Complexity
|
|
100
|
+
|
|
101
|
+
| Signals | Estimate | Approach |
|
|
102
|
+
| ---------------------------------------- | -------- | --------------- |
|
|
103
|
+
| Single component, CSS tweak | S (~10) | Quick fix |
|
|
104
|
+
| Multiple components, layout issue | M (~30) | Systematic fix |
|
|
105
|
+
| Cross-cutting, design system change | L (~100) | Design review |
|
|
106
|
+
| Responsive + a11y + multiple breakpoints | XL | Decompose first |
|
|
107
|
+
|
|
108
|
+
## Phase 5: Design System Check
|
|
109
|
+
|
|
110
|
+
Before fixing, verify design tokens:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Check for design tokens/variables
|
|
114
|
+
grep -r "var(--" src/styles/ | head -20
|
|
115
|
+
grep -r "theme\." src/components/ | head -20
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Verify fix will use:**
|
|
119
|
+
|
|
120
|
+
- [ ] Existing color tokens (not hardcoded colors)
|
|
121
|
+
- [ ] Existing spacing scale (not arbitrary px values)
|
|
122
|
+
- [ ] Existing typography scale
|
|
123
|
+
- [ ] Existing breakpoints
|
|
124
|
+
|
|
125
|
+
## Phase 6: Implement Fix
|
|
126
|
+
|
|
127
|
+
**Anti-AI-slop checklist:**
|
|
128
|
+
|
|
129
|
+
| Avoid | Use Instead |
|
|
130
|
+
| ---------------------------- | ------------------------------ |
|
|
131
|
+
| Inter/system-ui everywhere | Distinctive, intentional fonts |
|
|
132
|
+
| Purple/blue gradients | Cohesive project color palette |
|
|
133
|
+
| Flat, shadowless backgrounds | Subtle depth and texture |
|
|
134
|
+
| Generic rounded corners | Consistent border-radius scale |
|
|
135
|
+
| No motion | Meaningful, subtle animations |
|
|
136
|
+
|
|
137
|
+
**Make changes:**
|
|
138
|
+
|
|
139
|
+
1. Identify affected files
|
|
140
|
+
2. Make minimal, focused CSS/component changes
|
|
141
|
+
3. Use existing design tokens
|
|
142
|
+
4. Test in browser during development
|
|
143
|
+
|
|
144
|
+
## Phase 7: Capture After State
|
|
145
|
+
|
|
146
|
+
Take screenshot after changes:
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
skill_mcp({
|
|
150
|
+
skill_name: "playwright",
|
|
151
|
+
tool_name: "browser_screenshot",
|
|
152
|
+
arguments: '{"name": "after-fix"}',
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Save to `.beads/artifacts/<bead-id>/after.png`
|
|
157
|
+
|
|
158
|
+
## Phase 8: Verification
|
|
159
|
+
|
|
160
|
+
### Visual Verification
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
task({
|
|
164
|
+
subagent_type: "vision",
|
|
165
|
+
description: "Compare before/after",
|
|
166
|
+
prompt: `
|
|
167
|
+
Compare these screenshots:
|
|
168
|
+
- Before: .beads/artifacts/<bead-id>/before.png
|
|
169
|
+
- After: .beads/artifacts/<bead-id>/after.png
|
|
170
|
+
|
|
171
|
+
Verify:
|
|
172
|
+
1. Issue is fixed
|
|
173
|
+
2. No visual regressions
|
|
174
|
+
3. Follows frontend-aesthetics principles
|
|
175
|
+
4. No AI slop patterns introduced
|
|
176
|
+
`,
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Responsive Verification
|
|
181
|
+
|
|
182
|
+
Test at multiple breakpoints:
|
|
183
|
+
|
|
184
|
+
| Breakpoint | Width | Check |
|
|
185
|
+
| ---------- | ------ | -------------------- |
|
|
186
|
+
| Mobile | 375px | Layout doesn't break |
|
|
187
|
+
| Tablet | 768px | Spacing appropriate |
|
|
188
|
+
| Desktop | 1280px | Full layout correct |
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
skill_mcp({
|
|
192
|
+
skill_name: "playwright",
|
|
193
|
+
tool_name: "browser_resize",
|
|
194
|
+
arguments: '{"width": 375, "height": 812}',
|
|
195
|
+
});
|
|
196
|
+
// Screenshot and verify
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Accessibility Verification (--a11y or always for M+ fixes)
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
skill({ name: "accessibility-audit" });
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Check:
|
|
206
|
+
|
|
207
|
+
- [ ] Color contrast (4.5:1 for text, 3:1 for large text)
|
|
208
|
+
- [ ] Keyboard navigation works
|
|
209
|
+
- [ ] Focus states visible
|
|
210
|
+
- [ ] Screen reader text present for icons
|
|
211
|
+
- [ ] No motion for prefers-reduced-motion users
|
|
212
|
+
|
|
213
|
+
### Automated Tests
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
npm test -- --grep "component-name"
|
|
217
|
+
npm run test:visual # If visual regression tests exist
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
Verification:
|
|
222
|
+
━━━━━━━━━━━━━
|
|
223
|
+
|
|
224
|
+
Visual: Issue fixed ✓
|
|
225
|
+
Responsive:
|
|
226
|
+
- Mobile (375px): ✓
|
|
227
|
+
- Tablet (768px): ✓
|
|
228
|
+
- Desktop (1280px): ✓
|
|
229
|
+
Accessibility: [✓/⚠️ needs review]
|
|
230
|
+
Tests: [✓/✗]
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Phase 9: Document & Observe
|
|
234
|
+
|
|
235
|
+
If this revealed a UI pattern worth remembering:
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
observation({
|
|
239
|
+
type: "pattern",
|
|
240
|
+
title: "[UI pattern name]",
|
|
241
|
+
content: `
|
|
242
|
+
## Pattern
|
|
243
|
+
[What we learned about UI implementation]
|
|
244
|
+
|
|
245
|
+
## Example
|
|
246
|
+
\`\`\`css
|
|
247
|
+
[Code snippet]
|
|
248
|
+
\`\`\`
|
|
249
|
+
|
|
250
|
+
## When to Use
|
|
251
|
+
[When this pattern applies]
|
|
252
|
+
`,
|
|
253
|
+
concepts: "ui, css, [component-type]",
|
|
254
|
+
files: "[affected files]",
|
|
255
|
+
bead_id: "<bead-id>",
|
|
256
|
+
});
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Phase 10: Commit & Sync
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
git add <files>
|
|
263
|
+
git commit -m "fix(ui): <description>
|
|
264
|
+
|
|
265
|
+
- [what changed]
|
|
266
|
+
- [visual improvement]
|
|
267
|
+
[bead-id if applicable]"
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
bd_release({ _: true });
|
|
272
|
+
bd_sync({ reason: "Fixed UI: $ARGUMENTS" });
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Output
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
UI Fixed: $ARGUMENTS
|
|
279
|
+
━━━━━━━━━━━━━━━━━━━━
|
|
280
|
+
|
|
281
|
+
Estimate: [S/M/L]
|
|
282
|
+
Components: [list]
|
|
283
|
+
|
|
284
|
+
Before: .beads/artifacts/<bead-id>/before.png
|
|
285
|
+
After: .beads/artifacts/<bead-id>/after.png
|
|
286
|
+
|
|
287
|
+
Verification:
|
|
288
|
+
- Visual: ✓
|
|
289
|
+
- Responsive: ✓
|
|
290
|
+
- Accessibility: [✓/⚠️]
|
|
291
|
+
- Tests: ✓
|
|
292
|
+
|
|
293
|
+
Design system: Used existing tokens ✓
|
|
294
|
+
AI slop check: None detected ✓
|
|
295
|
+
|
|
296
|
+
Commit: [hash]
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Next steps:**
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
If part of larger task:
|
|
303
|
+
/implement <bead-id>
|
|
304
|
+
|
|
305
|
+
If standalone fix:
|
|
306
|
+
/finish <bead-id>
|
|
307
|
+
/pr <bead-id>
|
|
308
|
+
```
|