start-vibing 4.1.2 → 4.3.0
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/package.json +2 -2
- package/template/.claude/agents/sd-audit.md +167 -4
- package/template/.claude/agents/sd-fix.md +180 -7
- package/template/.claude/agents/sd-research.md +70 -1
- package/template/.claude/skills/mobile-app-patterns/SKILL.md +237 -0
- package/template/.claude/skills/super-design/SKILL.md +29 -7
- package/template/.claude/skills/super-design/references/component-flow-discovery.md +258 -0
- package/template/.claude/skills/super-design/references/design-intelligence-rubric.md +376 -0
- package/template/.claude/skills/super-design/references/design-skills-catalog.md +102 -0
- package/template/.claude/skills/super-design/templates/fix-history.md.tpl +7 -6
- package/template/.claude/skills/super-design/templates/fix-report.md.tpl +165 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
# Design Intelligence Rubric
|
|
2
|
+
|
|
3
|
+
> The missing layer between WCAG/Nielsen checklists and "does this feel
|
|
4
|
+
> designed or vibecoded?" — used by sd-audit as Phase 3g.
|
|
5
|
+
|
|
6
|
+
## Why this exists
|
|
7
|
+
|
|
8
|
+
A UI can pass axe (zero WCAG violations), Nielsen (10/10 heuristics green),
|
|
9
|
+
Lighthouse (100 perf score) and still be visually horrible: card-stacked mobile
|
|
10
|
+
dashboards, microtext tables on phones, no visual hierarchy, shadcn defaults
|
|
11
|
+
slapped onto every surface with zero variant discipline, inline arbitrary
|
|
12
|
+
pixel values everywhere. This rubric codifies those **implicit** criteria.
|
|
13
|
+
|
|
14
|
+
Every category is scored **0–10** per page × viewport. Total score → a single
|
|
15
|
+
**design-intelligence score (DIS)** 0–100. Scores below 60 auto-flag MEDIUM
|
|
16
|
+
findings; below 40 auto-flag HIGH.
|
|
17
|
+
|
|
18
|
+
## Evidence requirement
|
|
19
|
+
|
|
20
|
+
Each category's score MUST cite ≥1 piece of evidence from the audit session:
|
|
21
|
+
- **SHOT** (screenshot path)
|
|
22
|
+
- **CSS** (computed style excerpt)
|
|
23
|
+
- **DOM** (snapshot quote)
|
|
24
|
+
- **CODE** (source file + line, via Grep, for vibecode detection)
|
|
25
|
+
|
|
26
|
+
A score without evidence is invalid. Auditor records `n/a` instead of guessing.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Category 1 — Visual hierarchy (weight 1.0)
|
|
31
|
+
|
|
32
|
+
**Question:** On this view, what is the single primary goal? Is it the most
|
|
33
|
+
dominant element visually?
|
|
34
|
+
|
|
35
|
+
| Score | Criteria |
|
|
36
|
+
|---|---|
|
|
37
|
+
| 10 | One dominant element ≥ 2× larger or distinctly heavier than rest. Supporting info subordinate. Example: Cash App balance. |
|
|
38
|
+
| 7 | Primary clear but competing CTAs present. |
|
|
39
|
+
| 4 | Multiple equal-weight elements; user has to hunt. |
|
|
40
|
+
| 0 | Flat wall of cards/tables, no signal of where to look. |
|
|
41
|
+
|
|
42
|
+
**Detect:** `browser_evaluate` → collect computed `fontSize`, `fontWeight`, `lineHeight`, `color` of h1–h6, buttons, key metrics. Compute size-dominance ratio. Ratio > 2 → 10. Ratio < 1.3 → ≤4.
|
|
43
|
+
|
|
44
|
+
**Example fail (beats-market):** admin dashboard mobile — 10 equal-weight metric cards, no hero. Score: 2.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Category 2 — Density calibration per viewport (weight 1.2)
|
|
49
|
+
|
|
50
|
+
**Question:** Does information density match the device context?
|
|
51
|
+
|
|
52
|
+
| Viewport | Expected primary entities visible above fold |
|
|
53
|
+
|---|---|
|
|
54
|
+
| Mobile 375×812 | 6–8 compact rows OR 1 hero + 4–5 rows |
|
|
55
|
+
| Tablet 768×1024 | 8–12 rows or 4 cards in 2×2 |
|
|
56
|
+
| Desktop 1440×900 | 12–20+ rows or data-dense tables |
|
|
57
|
+
|
|
58
|
+
**Score:**
|
|
59
|
+
- 10 if density within ±20% of target
|
|
60
|
+
- 5 if half or double target
|
|
61
|
+
- 0 if <25% of target (wasteful) or >3× (cramped illegible)
|
|
62
|
+
|
|
63
|
+
**Detect:** Count `role=listitem | region | article` elements with `getBoundingClientRect` intersecting viewport. Compare to viewport target.
|
|
64
|
+
|
|
65
|
+
**Example fail (beats-market):** admin dashboard mobile — 3 cards above fold (target 6–8). Score: 3. Orders mobile = 20 rows visible but microtext = also fail (see Category 7).
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Category 3 — Consistency: spacing scale (weight 0.8)
|
|
70
|
+
|
|
71
|
+
**Question:** Do paddings, margins, gaps come from a scale (4/8px or 0.25rem) or are they arbitrary magic numbers?
|
|
72
|
+
|
|
73
|
+
**Detect:**
|
|
74
|
+
- `browser_evaluate` → collect computed `padding`, `margin`, `gap` from ≥50 elements.
|
|
75
|
+
- Grep codebase for `p-\[\d+px\]`, `m-\[\d+px\]`, `gap-\[\d+px\]` (Tailwind arbitrary values).
|
|
76
|
+
- Count: on-scale vs off-scale.
|
|
77
|
+
|
|
78
|
+
| Score | Criteria |
|
|
79
|
+
|---|---|
|
|
80
|
+
| 10 | 95%+ values on a 4/8 scale; no arbitrary pixel values in code |
|
|
81
|
+
| 7 | 80–95% on-scale; a few arbitrary values in leaf components |
|
|
82
|
+
| 4 | 50–80% on-scale; arbitrary values common |
|
|
83
|
+
| 0 | Random pixel values everywhere; no visible scale |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Category 4 — Consistency: typography scale (weight 0.8)
|
|
88
|
+
|
|
89
|
+
Same method for font-size, font-weight, line-height. Look for `text-\[\d+px\]` and arbitrary font-size. Expected: 6–10 sizes total in a designed system; 30+ sizes = vibecoded.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Category 5 — Consistency: color palette (weight 0.8)
|
|
94
|
+
|
|
95
|
+
**Detect:**
|
|
96
|
+
- Collect computed `color`, `background-color`, `border-color` from ≥100 elements.
|
|
97
|
+
- Unique colors count. <15 = disciplined. 30+ = vibecoded.
|
|
98
|
+
- Grep for `#[0-9a-f]{6}`, `rgb\(`, Tailwind arbitrary colors.
|
|
99
|
+
|
|
100
|
+
| Score | Criteria |
|
|
101
|
+
|---|---|
|
|
102
|
+
| 10 | ≤12 distinct colors, all from tokens |
|
|
103
|
+
| 7 | 12–20 colors, mostly tokens |
|
|
104
|
+
| 4 | 20–30 colors |
|
|
105
|
+
| 0 | 30+ colors, raw hex/rgb inline |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Category 6 — Whitespace & breathing room (weight 0.7)
|
|
110
|
+
|
|
111
|
+
**Question:** Does content have room to breathe, or is it crammed?
|
|
112
|
+
|
|
113
|
+
**Detect:** Compute average `padding-inline + margin-inline` per content block. Compare to container width. Measure content-to-chrome ratio.
|
|
114
|
+
|
|
115
|
+
| Score | Criteria |
|
|
116
|
+
|---|---|
|
|
117
|
+
| 10 | Content 60–75% of width, 25–40% whitespace |
|
|
118
|
+
| 7 | Content 75–85% |
|
|
119
|
+
| 4 | Content 85–95% OR <50% (too sparse) |
|
|
120
|
+
| 0 | Content touching edges, no breathing |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Category 7 — Text legibility (weight 1.2)
|
|
125
|
+
|
|
126
|
+
**Detect:** `browser_evaluate` → collect `fontSize` computed px. Find minimum across visible text.
|
|
127
|
+
|
|
128
|
+
| Viewport | Min body | Min meta | Min input |
|
|
129
|
+
|---|---|---|---|
|
|
130
|
+
| Mobile | 16px | 13px | 16px (iOS zoom floor) |
|
|
131
|
+
| Desktop | 14px | 12px | 14px |
|
|
132
|
+
|
|
133
|
+
| Score | Criteria |
|
|
134
|
+
|---|---|
|
|
135
|
+
| 10 | All text meets mins |
|
|
136
|
+
| 5 | One or two elements below by ≤1px |
|
|
137
|
+
| 0 | Widespread microtext (tables, chips, meta) below min |
|
|
138
|
+
|
|
139
|
+
**Example fail (beats-market):** orders mobile — table cells computed at ~8px. Score: 0.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Category 8 — CTA hierarchy (weight 1.0)
|
|
144
|
+
|
|
145
|
+
**Question:** Is there ONE primary CTA per view?
|
|
146
|
+
|
|
147
|
+
**Detect:** Count buttons with `variant=default | primary | filled` OR bg-primary class. >1 above fold = competing.
|
|
148
|
+
|
|
149
|
+
| Score | Criteria |
|
|
150
|
+
|---|---|
|
|
151
|
+
| 10 | Single primary CTA, rest secondary/ghost |
|
|
152
|
+
| 7 | Single primary + 1 competing |
|
|
153
|
+
| 4 | 2–3 competing primaries |
|
|
154
|
+
| 0 | Every button styled primary |
|
|
155
|
+
|
|
156
|
+
Reference: Baymard PDP — 51% of e-commerce pages fail due to competing CTAs.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Category 9 — State coverage (weight 1.1)
|
|
161
|
+
|
|
162
|
+
Per page, does the UI handle: default / loading / empty / error / success?
|
|
163
|
+
|
|
164
|
+
**Detect per scenario:**
|
|
165
|
+
- Loading: Grep source for `isLoading`, `pending`, `Skeleton`, `aria-busy`.
|
|
166
|
+
- Empty: Grep for `isEmpty`, `EmptyState`, zero-result ternaries.
|
|
167
|
+
- Error: Grep for `role="alert"`, error boundaries, `onError`.
|
|
168
|
+
|
|
169
|
+
| Score | Criteria |
|
|
170
|
+
|---|---|
|
|
171
|
+
| 10 | 5/5 states rendered or demonstrably coded |
|
|
172
|
+
| 8 | 4/5 (usually missing success toast) |
|
|
173
|
+
| 5 | 3/5 (missing empty + error) |
|
|
174
|
+
| 0 | Only default; fetch returns broken UI on failure |
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Category 10 — Touch targets (mobile only, weight 1.0)
|
|
179
|
+
|
|
180
|
+
**Detect:** `browser_evaluate` → get `getBoundingClientRect` of every clickable. Count targets < 44×44 px.
|
|
181
|
+
|
|
182
|
+
| Score | Criteria |
|
|
183
|
+
|---|---|
|
|
184
|
+
| 10 | 100% targets ≥ 44×44 OR 24×24 with 8px+ gap |
|
|
185
|
+
| 7 | 80–99% compliant |
|
|
186
|
+
| 4 | 50–80% compliant (common: icon-only buttons) |
|
|
187
|
+
| 0 | Widespread <24px targets |
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Category 11 — Motion & feedback (weight 0.6)
|
|
192
|
+
|
|
193
|
+
**Question:** Do interactions give feedback? Are animations tasteful and respect `prefers-reduced-motion`?
|
|
194
|
+
|
|
195
|
+
**Detect:**
|
|
196
|
+
- `browser_evaluate` with `matchMedia('(prefers-reduced-motion: reduce)')` + check for `transition` / `animation` on interactive elements.
|
|
197
|
+
- Missing hover/focus feedback on buttons = major fail.
|
|
198
|
+
- >3s animations = excessive.
|
|
199
|
+
|
|
200
|
+
| Score | Criteria |
|
|
201
|
+
|---|---|
|
|
202
|
+
| 10 | Hover/focus/active feedback everywhere; animations ≤300ms; reduced-motion respected |
|
|
203
|
+
| 7 | Most interactions feedback; reduced-motion partial |
|
|
204
|
+
| 4 | Some interactions static; reduced-motion ignored |
|
|
205
|
+
| 0 | No hover/focus feedback at all OR autoplay video + parallax with no disable |
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Category 12 — Nav pattern matches platform (weight 1.0)
|
|
210
|
+
|
|
211
|
+
| Viewport | Expected nav |
|
|
212
|
+
|---|---|
|
|
213
|
+
| Mobile (≤768) | Bottom tab bar (3–5), full-screen menus, gesture back |
|
|
214
|
+
| Tablet | Hybrid (collapsible sidebar or top tabs) |
|
|
215
|
+
| Desktop | Persistent sidebar or top navbar with search |
|
|
216
|
+
|
|
217
|
+
**Detect:** On mobile viewport, check for `<nav>` in fixed bottom position. On desktop, fixed left sidebar OR top header with nav.
|
|
218
|
+
|
|
219
|
+
| Score | Criteria |
|
|
220
|
+
|---|---|
|
|
221
|
+
| 10 | Nav matches platform convention |
|
|
222
|
+
| 5 | Hybrid but functional (e.g., bottom FAB + hamburger) |
|
|
223
|
+
| 0 | Hamburger-only on mobile OR bottom tabs on desktop |
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Category 13 — Table-on-mobile detection (weight 1.2, mobile only)
|
|
228
|
+
|
|
229
|
+
**Detect:** At ≤768px, find `<table>` with >3 visible columns OR `display: table` containers with horizontal scroll AND text < 13px.
|
|
230
|
+
|
|
231
|
+
| Score | Criteria |
|
|
232
|
+
|---|---|
|
|
233
|
+
| 10 | No table or table transformed to card-per-row |
|
|
234
|
+
| 5 | Table present but scrolls clean with sticky first col |
|
|
235
|
+
| 0 | Squashed desktop table with microtext |
|
|
236
|
+
|
|
237
|
+
**Example fail (beats-market):** admin orders mobile — 8-col desktop table rendered at 375px with ~8px text. Score: 0.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Category 14 — Modal/sheet appropriateness (weight 0.8)
|
|
242
|
+
|
|
243
|
+
| Viewport | Expected modal pattern |
|
|
244
|
+
|---|---|
|
|
245
|
+
| Mobile | Bottom sheet (slide-up) or full-screen with close top-left |
|
|
246
|
+
| Tablet | Centered dialog OR bottom sheet |
|
|
247
|
+
| Desktop | Centered dialog |
|
|
248
|
+
|
|
249
|
+
**Detect:** Open every `role=dialog` trigger. Measure position + dimensions. On mobile, centered dialog with close in top-right = fail.
|
|
250
|
+
|
|
251
|
+
| Score | Criteria |
|
|
252
|
+
|---|---|
|
|
253
|
+
| 10 | Correct per viewport |
|
|
254
|
+
| 5 | Centered on mobile but within reach |
|
|
255
|
+
| 0 | Unreachable thumb-zone close, wrong pattern for device |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Category 15 — Color semantics (weight 0.6)
|
|
260
|
+
|
|
261
|
+
**Detect:** Collect colors used on: error messages, success states, warnings, info. Red = error? Green = success? Or decorative-only?
|
|
262
|
+
|
|
263
|
+
| Score | Criteria |
|
|
264
|
+
|---|---|
|
|
265
|
+
| 10 | Semantic colors distinct and consistent across app |
|
|
266
|
+
| 5 | Used but inconsistent (red elsewhere as brand) |
|
|
267
|
+
| 0 | No semantic color system |
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Category 16 — Design-system coherence (weight 1.1)
|
|
272
|
+
|
|
273
|
+
**The meta-category.** Does the app LOOK like it was designed by one team with one vision? Or does it look like a collection of shadcn defaults?
|
|
274
|
+
|
|
275
|
+
**Detect (aesthetic signal):**
|
|
276
|
+
- Does at least one of: custom color palette, custom font pairing, custom spacing rhythm, custom radius language, custom motion language, custom illustration/icon set EXIST?
|
|
277
|
+
- Grep package.json for ≥1 of: `typeui.sh`, `framer-motion`, custom fonts beyond system, Lottie, MagicUI, Aceternity, custom token file.
|
|
278
|
+
|
|
279
|
+
| Score | Criteria |
|
|
280
|
+
|---|---|
|
|
281
|
+
| 10 | Strong identity — you could recognize this app from a cropped screenshot |
|
|
282
|
+
| 7 | Some identity (brand color + maybe custom font) |
|
|
283
|
+
| 4 | shadcn defaults + 1 accent color |
|
|
284
|
+
| 0 | Pure shadcn defaults, zero customization, looks like `npx shadcn-ui@latest init` |
|
|
285
|
+
|
|
286
|
+
**When score ≤4:** recommend a typeui.sh aesthetic skill OR a frontend-design
|
|
287
|
+
session. See `design-skills-catalog.md`.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Category 17 — Vibecode detection (weight 1.0)
|
|
292
|
+
|
|
293
|
+
**Question:** Does the code follow patterns (components, variants, tokens)
|
|
294
|
+
or is it hand-assembled divs with inline styles?
|
|
295
|
+
|
|
296
|
+
**Detect (source grep):**
|
|
297
|
+
- Count `<div className="..."` without surrounding component → raw-div score
|
|
298
|
+
- Count inline `style={{` → inline-style count
|
|
299
|
+
- Count `@media` queries inline vs breakpoint tokens
|
|
300
|
+
- Count arbitrary Tailwind values (`\[\d+px\]`, `\[#[0-9a-f]+\]`)
|
|
301
|
+
- Check if shadcn components are wrapped into domain components (MetricRow, OrderCard) or used raw per page
|
|
302
|
+
- Check if types are co-located in `types/` vs inline `any`
|
|
303
|
+
|
|
304
|
+
| Score | Criteria |
|
|
305
|
+
|---|---|
|
|
306
|
+
| 10 | Domain components, design tokens, typed props, variants via CVA |
|
|
307
|
+
| 7 | Some composition, some raw shadcn usage |
|
|
308
|
+
| 4 | Mostly raw primitives, inconsistent composition |
|
|
309
|
+
| 0 | Flat page files with 500+ lines of inline JSX; zero reuse |
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Scoring formula
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
DIS = Σ(score_i × weight_i) / Σ(weight_i) × 10
|
|
317
|
+
|
|
318
|
+
weight_sum = 14.8
|
|
319
|
+
max_raw = 148.0 → normalized to 100
|
|
320
|
+
|
|
321
|
+
Example (beats-market admin dashboard mobile):
|
|
322
|
+
C1 hierarchy: 2 × 1.0 = 2.0
|
|
323
|
+
C2 density: 3 × 1.2 = 3.6
|
|
324
|
+
C3 spacing: 7 × 0.8 = 5.6
|
|
325
|
+
C4 type: 6 × 0.8 = 4.8
|
|
326
|
+
C5 color: 7 × 0.8 = 5.6
|
|
327
|
+
C6 whitespace:4 × 0.7 = 2.8
|
|
328
|
+
C7 legibility:8 × 1.2 = 9.6
|
|
329
|
+
C8 CTA: 6 × 1.0 = 6.0
|
|
330
|
+
C9 states: 4 × 1.1 = 4.4
|
|
331
|
+
C10 touch: 6 × 1.0 = 6.0
|
|
332
|
+
C11 motion: 5 × 0.6 = 3.0
|
|
333
|
+
C12 nav: 4 × 1.0 = 4.0
|
|
334
|
+
C13 table: 10 × 1.2 = 12.0 (no table on dashboard)
|
|
335
|
+
C14 modal: 6 × 0.8 = 4.8
|
|
336
|
+
C15 color-sem:6 × 0.6 = 3.6
|
|
337
|
+
C16 coherence:3 × 1.1 = 3.3
|
|
338
|
+
C17 vibecode: 4 × 1.0 = 4.0
|
|
339
|
+
raw = 85.1 → DIS = 57.5 → MEDIUM severity
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Output format
|
|
343
|
+
|
|
344
|
+
Write `.super-design/sessions/<id>/design-intelligence.json`:
|
|
345
|
+
|
|
346
|
+
```json
|
|
347
|
+
{
|
|
348
|
+
"pages": [
|
|
349
|
+
{
|
|
350
|
+
"page_url": "/admin",
|
|
351
|
+
"viewport": "375x812",
|
|
352
|
+
"categories": {
|
|
353
|
+
"visual_hierarchy": { "score": 2, "evidence": ["screens/admin_mobile.png", "styles/admin_mobile.json"], "notes": "10 equal-weight metric cards, no hero" },
|
|
354
|
+
"density": { "score": 3, "evidence": ["screens/admin_mobile.png"], "notes": "Only 3 metrics above fold; target 6-8" }
|
|
355
|
+
},
|
|
356
|
+
"dis": 57.5,
|
|
357
|
+
"severity": "MEDIUM",
|
|
358
|
+
"top_findings": ["F-0042", "F-0043", "F-0049"]
|
|
359
|
+
}
|
|
360
|
+
],
|
|
361
|
+
"overall_dis": 54.2,
|
|
362
|
+
"overall_severity": "MEDIUM",
|
|
363
|
+
"weakest_categories": ["visual_hierarchy", "density", "design_system_coherence"]
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
Each category score ≤ 4 SHOULD spawn a finding with `template_id` from the M-family (M1–M15) in `fix-agent-playbook.md`.
|
|
368
|
+
|
|
369
|
+
## Cross-references
|
|
370
|
+
|
|
371
|
+
- Mobile-specific categories (C2, C7, C10, C12, C13, C14) reference
|
|
372
|
+
`.claude/skills/mobile-app-patterns/SKILL.md` for fix patterns.
|
|
373
|
+
- Design-system coherence (C16) references `design-skills-catalog.md` for
|
|
374
|
+
typeui.sh skill suggestions.
|
|
375
|
+
- Vibecode (C17) references `fix-agent-playbook.md` V-templates (spacing,
|
|
376
|
+
type, color tokens).
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Design Skills Catalog
|
|
2
|
+
|
|
3
|
+
> Map of installed design skills and when to recommend each. Used by
|
|
4
|
+
> sd-audit (Category 16 design-system-coherence findings) and sd-fix
|
|
5
|
+
> (when proposing aesthetic realignment above template scope).
|
|
6
|
+
|
|
7
|
+
## Installed typeui-* skills
|
|
8
|
+
|
|
9
|
+
All from https://www.typeui.sh/design-skills — already present in
|
|
10
|
+
`.claude/skills/`. Claude auto-invokes them when their description matches
|
|
11
|
+
the task. sd-audit MUST reference them by name in findings; sd-fix MUST
|
|
12
|
+
mention them as optional realignment paths when design-system-coherence
|
|
13
|
+
score ≤ 4.
|
|
14
|
+
|
|
15
|
+
| Skill | Best for | Visual signature | When to recommend |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| **typeui-dashboard** | Admin panels, data apps, SaaS | Dark theme, cloud-platform density (AWS/GCP feel), data-first | DIS C16 fail on admin/dashboard routes |
|
|
18
|
+
| **typeui-application** | Developer tools, productivity | Vercel/GitHub-inspired, clean neutrals, high information density | SaaS products without strong identity |
|
|
19
|
+
| **typeui-enterprise** | B2B workflows, compliance, finance | Clean, high-contrast, conservative | Procurement-facing, corporate |
|
|
20
|
+
| **typeui-ant** | Form-heavy enterprise | Structured, predictable, Ant Design-adjacent | CRM, admin with many forms |
|
|
21
|
+
| **typeui-clean** | Marketing sites, simple products | Minimalist, generous whitespace | Pre-launch landing pages |
|
|
22
|
+
| **typeui-bento** | Feature grids, portfolios | Modular grid blocks | Homepage feature sections |
|
|
23
|
+
| **typeui-bold** | Consumer brands, challenger products | Strong typography, vivid color, confidence | Startups differentiating vs incumbents |
|
|
24
|
+
| **typeui-artistic** | Creative tools, design products | Expressive type, unusual layouts | Non-enterprise, vibe-forward |
|
|
25
|
+
| **typeui-dramatic** | Portfolios, agencies, brand sites | High-contrast, theatrical | Hero-heavy marketing |
|
|
26
|
+
| **typeui-neobrutalism** | Gen-Z, indie brands | Raw borders, hard shadows, bold | Statement brands |
|
|
27
|
+
| **typeui-paper** | Content, editorial, reading | Paper-textured, print-like | Blogs, publications |
|
|
28
|
+
| **typeui-doodle** | Learning, kids, playful | Hand-drawn, sketch feel | Education, creative tools |
|
|
29
|
+
|
|
30
|
+
## How each skill gets applied
|
|
31
|
+
|
|
32
|
+
Each typeui-* skill contains:
|
|
33
|
+
- **Design tokens** (colors, spacing, radius, shadows) as CSS variables
|
|
34
|
+
- **Component variants** adapted to shadcn/ui structure
|
|
35
|
+
- **Layout patterns** demonstrated
|
|
36
|
+
- **Do/Don't examples**
|
|
37
|
+
|
|
38
|
+
When Claude invokes a skill (via matching description or explicit mention),
|
|
39
|
+
it follows the skill's specific tokens + patterns instead of defaults.
|
|
40
|
+
|
|
41
|
+
## Other design-related skills installed
|
|
42
|
+
|
|
43
|
+
| Skill | Purpose | Cross-ref |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| **mobile-app-patterns** | Duolingo/Linear/Arc mobile patterns | Mandatory for mobile DIS scoring |
|
|
46
|
+
| **web-design-guidelines** | 100+ WCAG + UX rules (Vercel Labs) | Feeds Nielsen + WCAG manual pass |
|
|
47
|
+
| **composition-patterns** | React compound/composition patterns | C17 vibecode detection |
|
|
48
|
+
| **react-best-practices** | Vercel-Labs performance patterns | P-templates |
|
|
49
|
+
| **shadcn-ui** | shadcn component usage | V-templates (variants) |
|
|
50
|
+
| **tailwind-patterns** | Tailwind scale adherence | C3/C4/C5 consistency checks |
|
|
51
|
+
| **frontend-design** (plugin) | Full UI design loop with competitor research | Deep aesthetic reset |
|
|
52
|
+
|
|
53
|
+
## Selection matrix (used by sd-fix / sd-audit recommendations)
|
|
54
|
+
|
|
55
|
+
| Current state | Target vibe | Recommend |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| Vibecoded admin with shadcn defaults | Professional dashboard | `typeui-dashboard` or `typeui-application` |
|
|
58
|
+
| Admin with too many forms | Structured enterprise | `typeui-ant` or `typeui-enterprise` |
|
|
59
|
+
| Landing with no identity | Consumer bold | `typeui-bold` or `typeui-dramatic` |
|
|
60
|
+
| Creative-app landing | Expressive | `typeui-artistic` or `typeui-doodle` |
|
|
61
|
+
| B2B-serious | Conservative | `typeui-enterprise` |
|
|
62
|
+
| Editorial / blog | Readable long-form | `typeui-paper` |
|
|
63
|
+
| Feature-grid homepage | Modular showcase | `typeui-bento` |
|
|
64
|
+
|
|
65
|
+
## Recommending a skill in a finding
|
|
66
|
+
|
|
67
|
+
When `design-intelligence.categories.design_system_coherence.score ≤ 4`,
|
|
68
|
+
sd-audit MUST add a non-blocking advisory finding:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"id": "F-NNNN",
|
|
73
|
+
"rule": "design-system-coherence",
|
|
74
|
+
"severity": 2,
|
|
75
|
+
"risk_for_fix": "HIGH",
|
|
76
|
+
"finding": "UI uses pure shadcn defaults with no identity. Recommend applying a design skill to establish visual language.",
|
|
77
|
+
"template_id": "DSC-1",
|
|
78
|
+
"advisory_only": true,
|
|
79
|
+
"recommended_skills": ["typeui-dashboard", "typeui-application"],
|
|
80
|
+
"why": "Admin/dashboard context; dark theme already present; data density matches cloud-platform skills.",
|
|
81
|
+
"application": "User runs /simplify or a frontend-design session with the chosen skill active — this is not auto-fixable, needs human design decision."
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Do NOT auto-apply design skills via sd-fix — aesthetic changes are always
|
|
86
|
+
HIGH risk and require human sign-off. The finding is informational:
|
|
87
|
+
sd-fix emits it into fix-report.md as "Proposed aesthetic direction" with
|
|
88
|
+
a preview capability (sd-research already has screenshots of competitors
|
|
89
|
+
in similar aesthetics to show reference).
|
|
90
|
+
|
|
91
|
+
## Integration with frontend-design plugin
|
|
92
|
+
|
|
93
|
+
If the user runs `/frontend-design` after super-design, the plugin can
|
|
94
|
+
read `design-intelligence.json` and pre-load the `recommended_skills`
|
|
95
|
+
automatically as seed context.
|
|
96
|
+
|
|
97
|
+
## References
|
|
98
|
+
|
|
99
|
+
- typeui.sh catalog — https://www.typeui.sh/design-skills
|
|
100
|
+
- shadcn/ui — https://ui.shadcn.com
|
|
101
|
+
- Karri Saarinen, Quality — https://linear.app/now/why-is-quality-so-rare
|
|
102
|
+
- Vercel Design Engineering — https://vercel.com/blog/design-engineering-at-vercel
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
**Counts:** Applied {{applied}} · Proposed {{proposed}} · Skipped {{skipped}} · Failed {{failed}}
|
|
4
4
|
**Base:** `{{base_sha}}` · **Tip:** `{{tip_sha}}`
|
|
5
|
+
**Visual report:** [`sessions/{{session_id}}/fix-report.md`](./sessions/{{session_id}}/fix-report.md) — before/after screenshots per finding
|
|
5
6
|
|
|
6
7
|
### Applied
|
|
7
|
-
| Finding | Category | Files | Commit |
|
|
8
|
-
|
|
8
|
+
| Finding | Category | Files | Commit | Before/After |
|
|
9
|
+
|---|---|---|---|---|
|
|
9
10
|
{{applied_table}}
|
|
10
11
|
|
|
11
12
|
### Proposed (awaiting approval)
|
|
12
|
-
| Finding | Category | Files | Patch |
|
|
13
|
-
|
|
13
|
+
| Finding | Category | Files | Patch | Before |
|
|
14
|
+
|---|---|---|---|---|
|
|
14
15
|
{{proposed_table}}
|
|
15
16
|
|
|
16
17
|
### Skipped (HIGH risk — tracked as issues)
|
|
@@ -19,8 +20,8 @@
|
|
|
19
20
|
{{skipped_table}}
|
|
20
21
|
|
|
21
22
|
### Failed (rolled back)
|
|
22
|
-
| Finding | Gate | Reason |
|
|
23
|
-
|
|
23
|
+
| Finding | Gate | Reason | Before |
|
|
24
|
+
|---|---|---|---|
|
|
24
25
|
{{failed_table}}
|
|
25
26
|
|
|
26
27
|
---
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Fix report — `{{session_id}}`
|
|
2
|
+
|
|
3
|
+
**Date:** {{session_date}}
|
|
4
|
+
**Branch:** `{{branch}}`
|
|
5
|
+
**Base:** `{{base_sha}}` · **Tip:** `{{tip_sha}}`
|
|
6
|
+
**Audit source:** [`findings.json`](../../../.super-design/sessions/{{session_id}}/findings.json)
|
|
7
|
+
|
|
8
|
+
## Summary
|
|
9
|
+
|
|
10
|
+
| Status | Count |
|
|
11
|
+
|---|---|
|
|
12
|
+
| Applied | {{applied}} |
|
|
13
|
+
| Proposed (awaiting approval) | {{proposed}} |
|
|
14
|
+
| Skipped (HIGH risk → issues) | {{skipped}} |
|
|
15
|
+
| Failed (rolled back) | {{failed}} |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Applied fixes — before / after
|
|
20
|
+
|
|
21
|
+
{{#each applied_findings}}
|
|
22
|
+
### {{id}} — {{rule}}{{#if wcag_criterion}} · WCAG {{wcag_criterion}}{{/if}}{{#if nielsen_heuristic}} · Nielsen H{{nielsen_heuristic}}{{/if}}
|
|
23
|
+
|
|
24
|
+
- **Page:** `{{page_url}}` · **Viewport:** {{viewport}}
|
|
25
|
+
- **Severity:** {{severity}}/4 · **Risk:** {{risk_for_fix}} · **Template:** `{{template_id}}`
|
|
26
|
+
- **Commit:** [`{{commit_sha_short}}`]({{commit_url}}) — `{{commit_subject}}`
|
|
27
|
+
- **Verification:** technical {{technical_result}} · semantic {{semantic_result}}
|
|
28
|
+
|
|
29
|
+
**Problem**
|
|
30
|
+
|
|
31
|
+
{{finding}}
|
|
32
|
+
|
|
33
|
+
**Evidence quote (from audit snapshot):**
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
{{snapshot_quote}}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Before**
|
|
40
|
+
|
|
41
|
+
Full page:
|
|
42
|
+
|
|
43
|
+

|
|
44
|
+
|
|
45
|
+
{{#if before_element}}
|
|
46
|
+
Element:
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
{{/if}}
|
|
50
|
+
|
|
51
|
+
**After**
|
|
52
|
+
|
|
53
|
+
Full page:
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
{{#if after_element}}
|
|
58
|
+
Element:
|
|
59
|
+
|
|
60
|
+

|
|
61
|
+
{{else if after_element_missing_reason}}
|
|
62
|
+
_Element screenshot skipped: {{after_element_missing_reason}}_
|
|
63
|
+
{{/if}}
|
|
64
|
+
|
|
65
|
+
**What changed**
|
|
66
|
+
|
|
67
|
+
```diff
|
|
68
|
+
{{file_diff_summary}}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Files touched:
|
|
72
|
+
{{#each files_affected}}
|
|
73
|
+
- `{{this}}`
|
|
74
|
+
{{/each}}
|
|
75
|
+
|
|
76
|
+
{{#if after_console_errors}}
|
|
77
|
+
**Console errors after fix:** {{after_console_errors.length}} — see `fix-results.json` for verbatim.
|
|
78
|
+
{{/if}}
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
{{/each}}
|
|
83
|
+
|
|
84
|
+
{{#if proposed_findings.length}}
|
|
85
|
+
## Proposed fixes (awaiting approval)
|
|
86
|
+
|
|
87
|
+
Before-only evidence is shown because these are not yet applied.
|
|
88
|
+
|
|
89
|
+
{{#each proposed_findings}}
|
|
90
|
+
### {{id}} — {{rule}}
|
|
91
|
+
|
|
92
|
+
- **Page:** `{{page_url}}` · **Viewport:** {{viewport}}
|
|
93
|
+
- **Severity:** {{severity}}/4 · **Risk:** {{risk_for_fix}}
|
|
94
|
+
- **Patch:** [`proposals/{{id}}.patch`](../../../.super-design/sessions/{{session_id}}/proposals/{{id}}.patch)
|
|
95
|
+
|
|
96
|
+
**Problem**
|
|
97
|
+
|
|
98
|
+
{{finding}}
|
|
99
|
+
|
|
100
|
+
**Before**
|
|
101
|
+
|
|
102
|
+

|
|
103
|
+
|
|
104
|
+
**Proposed change**
|
|
105
|
+
|
|
106
|
+
```diff
|
|
107
|
+
{{proposed_diff}}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
{{/each}}
|
|
113
|
+
{{/if}}
|
|
114
|
+
|
|
115
|
+
{{#if skipped_findings.length}}
|
|
116
|
+
## Skipped (HIGH risk — tracked as issues)
|
|
117
|
+
|
|
118
|
+
{{#each skipped_findings}}
|
|
119
|
+
- **{{id}}** · {{rule}} · `{{page_url}}` · Issue [#{{issue_number}}]({{issue_url}}) — {{skip_reason}}
|
|
120
|
+
{{/each}}
|
|
121
|
+
|
|
122
|
+
{{/if}}
|
|
123
|
+
|
|
124
|
+
{{#if failed_findings.length}}
|
|
125
|
+
## Failed (rolled back)
|
|
126
|
+
|
|
127
|
+
{{#each failed_findings}}
|
|
128
|
+
### {{id}} — {{rule}}
|
|
129
|
+
|
|
130
|
+
- **Failed gate:** {{failed_gate}} ({{gate_reason}})
|
|
131
|
+
- **Rolled back:** yes · **Commit sha:** none (reset before commit)
|
|
132
|
+
|
|
133
|
+
**Before**
|
|
134
|
+
|
|
135
|
+

|
|
136
|
+
|
|
137
|
+
**Attempted change (reverted)**
|
|
138
|
+
|
|
139
|
+
```diff
|
|
140
|
+
{{attempted_diff}}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
{{/each}}
|
|
146
|
+
{{/if}}
|
|
147
|
+
|
|
148
|
+
## Reproduce locally
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
git switch fix/{{session_id}}
|
|
152
|
+
git log --oneline {{base_sha}}..HEAD
|
|
153
|
+
git diff {{base_sha}}..HEAD -- <file>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Re-run audit to confirm findings cleared:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# From repo root
|
|
160
|
+
super-design --scope <page_url>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
_Generated by `sd-fix` using `fix-report.md.tpl`. Screenshots captured via Playwright MCP at the same viewport as the original audit._
|