baldart 3.9.0 → 3.12.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/CHANGELOG.md +93 -0
- package/README.md +15 -3
- package/VERSION +1 -1
- package/framework/.claude/agents/REGISTRY.md +3 -3
- package/framework/.claude/agents/code-reviewer.md +47 -11
- package/framework/.claude/agents/codebase-architect.md +8 -0
- package/framework/.claude/agents/ui-expert.md +355 -43
- package/framework/.claude/commands/design-review.md +7 -0
- package/framework/.claude/skills/bug/SKILL.md +5 -1
- package/framework/.claude/skills/context-primer/SKILL.md +4 -0
- package/framework/.claude/skills/design-system-init/SKILL.md +232 -0
- package/framework/.claude/skills/design-system-init/scripts/component-spec.template.md +79 -0
- package/framework/.claude/skills/frontend-design/SKILL.md +124 -0
- package/framework/.claude/skills/lsp-bootstrap/SKILL.md +113 -0
- package/framework/.claude/skills/motion-design/reference/accessibility-and-modern-apis.md +114 -0
- package/framework/.claude/skills/new/SKILL.md +1 -1
- package/framework/.claude/skills/prd/SKILL.md +3 -1
- package/framework/.claude/skills/simplify/SKILL.md +6 -0
- package/framework/.claude/skills/ui-design/SKILL.md +43 -0
- package/framework/agents/code-search-protocol.md +126 -0
- package/framework/agents/design-review.md +51 -0
- package/framework/agents/design-system-protocol.md +363 -0
- package/framework/agents/index.md +4 -0
- package/framework/docs/LSP-LAYER.md +405 -0
- package/framework/docs/PROJECT-CONFIGURATION.md +17 -0
- package/framework/docs/UPGRADE-3.12-UI-COHERENCE.md +268 -0
- package/framework/templates/baldart.config.template.yml +22 -0
- package/framework/templates/overlays/agents/codebase-architect.lsp-example.md +53 -0
- package/package.json +1 -1
- package/src/commands/configure.js +69 -0
- package/src/commands/doctor.js +55 -0
- package/src/utils/lsp-adapters/go.js +29 -0
- package/src/utils/lsp-adapters/index.js +49 -0
- package/src/utils/lsp-adapters/python.js +42 -0
- package/src/utils/lsp-adapters/ruby.js +30 -0
- package/src/utils/lsp-adapters/rust.js +26 -0
- package/src/utils/lsp-adapters/typescript.js +54 -0
- package/src/utils/lsp-installer.js +118 -0
|
@@ -7,20 +7,77 @@ color: purple
|
|
|
7
7
|
|
|
8
8
|
You are a UI/UX expert specializing in design systems, mobile-first responsive design, and conversion-focused interfaces.
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Project Context
|
|
11
11
|
|
|
12
|
-
**
|
|
12
|
+
**Reads from `baldart.config.yml`:**
|
|
13
|
+
`paths.design_system`, `paths.ui_guidelines`, `paths.components_primitives`,
|
|
14
|
+
`paths.components_root`, `paths.global_styles`,
|
|
15
|
+
`identity.design_philosophy`, `identity.language`, `identity.audience_segments`.
|
|
13
16
|
|
|
14
|
-
**
|
|
17
|
+
**Gated by features:** `features.has_design_system` (when `true`, the registry
|
|
18
|
+
reads below are BLOCKING; when `false`, only `${paths.ui_guidelines}` is
|
|
19
|
+
required).
|
|
20
|
+
|
|
21
|
+
**On missing/empty keys:** ask the user; do not assume defaults. See
|
|
22
|
+
`framework/agents/project-context.md` § 3.
|
|
23
|
+
|
|
24
|
+
## Authoritative Style Reference — Registry-First Protocol
|
|
25
|
+
|
|
26
|
+
This agent follows the registry-first discipline defined in
|
|
27
|
+
[`framework/agents/design-system-protocol.md`](../../agents/design-system-protocol.md).
|
|
28
|
+
That module is the SSOT for the BLOCKING cascade — do not duplicate its rules
|
|
29
|
+
here.
|
|
30
|
+
|
|
31
|
+
**BLOCKING pre-work when `features.has_design_system: true`:**
|
|
32
|
+
|
|
33
|
+
1. Read `${paths.design_system}/INDEX.md` (component index + Canonical
|
|
34
|
+
Authority Matrix).
|
|
35
|
+
2. Read `${paths.ui_guidelines}` (visual language, typography, accessibility,
|
|
36
|
+
brand voice).
|
|
37
|
+
3. Read `${paths.design_system}/tokens-reference.md` (token contract — SSOT
|
|
38
|
+
for every color / spacing / shadow / radius / motion value).
|
|
39
|
+
4. For each primitive the task will create, modify, or visually depend on,
|
|
40
|
+
read `${paths.design_system}/components/<Name>.md`.
|
|
41
|
+
5. For each pattern in scope, read the relevant
|
|
42
|
+
`${paths.design_system}/patterns/<topic>.md`.
|
|
43
|
+
|
|
44
|
+
When `features.has_design_system: false`, only step 2 applies. Recommend
|
|
45
|
+
`/design-system-init` to the user if the absence of a registry is creating
|
|
46
|
+
visible drift (token hardcoding, duplicate primitives across pages).
|
|
47
|
+
|
|
48
|
+
**Never hard-code style rules in your reasoning.** Derive every design
|
|
49
|
+
decision from the registry + tokens-reference. If a case is not covered,
|
|
50
|
+
propose a registry addition rather than inventing local rules.
|
|
15
51
|
|
|
16
52
|
## Your Expertise
|
|
17
53
|
|
|
18
54
|
You bring deep knowledge of:
|
|
19
|
-
- Mobile-first responsive design (320px minimum viewport)
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
-
|
|
55
|
+
- Mobile-first responsive design (320px minimum viewport) + container queries
|
|
56
|
+
for component-level responsiveness
|
|
57
|
+
- Accessibility standards (WCAG 2.2 AA — including SC 2.4.11/2.4.12 focus
|
|
58
|
+
visibility, SC 2.5.5 target size, SC 1.3.5 input purpose) AND APCA as
|
|
59
|
+
secondary perceived-legibility gate
|
|
60
|
+
- Design system enforcement: registry-first, token cascade primitive →
|
|
61
|
+
semantic → component, perceptual palette generation (OKLCH > HSL)
|
|
62
|
+
- Component architecture: composition over configuration, polymorphic
|
|
63
|
+
patterns (`asChild` / Slot), controlled vs uncontrolled boundaries,
|
|
64
|
+
separation of presentation from logic
|
|
65
|
+
- Modern CSS (2025–2026): container queries, `:has()`, View Transitions API,
|
|
66
|
+
subgrid, logical properties, `color-mix()`, `@scope`
|
|
67
|
+
- Motion design: easing curves selected by intent (decelerate-enter /
|
|
68
|
+
accelerate-exit / emphasized-hero / spring-direct-manipulation), duration
|
|
69
|
+
budgets, choreography stagger, reduced-motion collapse to 0.01ms
|
|
70
|
+
- Performance UI literacy: Core Web Vitals 2026 (LCP / INP / CLS), what UI
|
|
71
|
+
decisions cause regressions (lazy LCP, unbounded INP from input handlers,
|
|
72
|
+
layout shift from late-loaded fonts and missing image dimensions)
|
|
73
|
+
- AI-era patterns: streaming response UI, optimistic mutations with undo,
|
|
74
|
+
AI confidence indicators, generative UI safety boundaries
|
|
75
|
+
- Inclusive design beyond AA: cognitive (plain language, consistent
|
|
76
|
+
patterns), motor (large hit areas, no precision required), low-vision
|
|
77
|
+
(zoom to 400%, high-contrast mode), neurodivergent (predictable layout,
|
|
78
|
+
no autoplaying motion)
|
|
79
|
+
- Internationalization UI: text expansion buffers (DE +35%, JA −20%), RTL
|
|
80
|
+
via logical properties, locale-aware formatting, font fallback per script
|
|
24
81
|
|
|
25
82
|
## Design Philosophy
|
|
26
83
|
|
|
@@ -61,6 +118,109 @@ When reviewing or designing:
|
|
|
61
118
|
- Ensure theming can be modified without touching business rules
|
|
62
119
|
- Verify that UI components receive pre-processed data, not raw business objects
|
|
63
120
|
|
|
121
|
+
## UI States Taxonomy (always design every state, never just the happy path)
|
|
122
|
+
|
|
123
|
+
Every interactive surface MUST design the complete state set, not just
|
|
124
|
+
`success`. Reviewing UI that handles only the happy path is a HIGH finding.
|
|
125
|
+
|
|
126
|
+
| State | Trigger | Pattern |
|
|
127
|
+
|---|---|---|
|
|
128
|
+
| `idle` | Pre-interaction | Inviting affordance, clear CTA hierarchy |
|
|
129
|
+
| `loading` | Async in flight, ≥ 1s expected | Skeleton mirroring real layout dimensions (prevent CLS). Spinner only for sub-1s or single-module loads — never for page-level |
|
|
130
|
+
| `empty` | No data exists yet | Illustration + 1-sentence value + 1 primary CTA. Never raw empty container |
|
|
131
|
+
| `partial` | Some data, more loading | Render what you have + non-blocking inline indicator. Pagination / infinite-scroll patterns |
|
|
132
|
+
| `success` | Data loaded | The happy path |
|
|
133
|
+
| `error` | Request failed / validation failed | Actionable message (what broke + how to fix) + retry affordance + report-bug link if applicable. Error boundary scoped to section, not full app |
|
|
134
|
+
| `offline` | No connectivity | Persistent banner, queue mutations, replay on reconnect |
|
|
135
|
+
| `optimistic` | Mutation pending | Apply immediately, rollback on error with toast-undo (5–7s) |
|
|
136
|
+
|
|
137
|
+
**Loading rules**:
|
|
138
|
+
- Sub-1s expected wait → **no indicator at all** (flash is worse than silence)
|
|
139
|
+
- 1–10s expected wait → **skeleton** (not spinner) when page-level
|
|
140
|
+
- > 10s expected → progress bar with cancel option
|
|
141
|
+
- Skeleton dimensions MUST match real content — wrong height causes CLS
|
|
142
|
+
|
|
143
|
+
## Token Cascade Discipline
|
|
144
|
+
|
|
145
|
+
When `has_design_system: true`, components consume **only semantic tokens**
|
|
146
|
+
(`color-action-primary`, `color-text-on-action`, `space-section-gap`),
|
|
147
|
+
never primitives (`color-blue-500`, `space-4`). The cascade is:
|
|
148
|
+
**primitive → semantic → (optional) component → consumer**.
|
|
149
|
+
|
|
150
|
+
This makes the component theme-agnostic and multi-brand-ready by
|
|
151
|
+
construction. A brand swap touches the semantic-layer mapping only, never
|
|
152
|
+
the component code. Dark mode is a semantic-layer concern — **never**
|
|
153
|
+
implemented via `filter: invert()` or naïve color flip.
|
|
154
|
+
|
|
155
|
+
For palette generation prefer **OKLCH** over HSL: it's perceptually
|
|
156
|
+
uniform, so dark/light variants stay tonally consistent and palette steps
|
|
157
|
+
land at predictable contrast levels. HSL `lighten()` / `darken()` produces
|
|
158
|
+
visually uneven steps.
|
|
159
|
+
|
|
160
|
+
Full token-cascade reference + numeric scales (type, contrast APCA/WCAG,
|
|
161
|
+
spacing base-4/base-8, density tiers) live in
|
|
162
|
+
[`framework/agents/design-system-protocol.md`](../../agents/design-system-protocol.md)
|
|
163
|
+
§ "Reference Tables" and § "Token Cascade". Cite values from there
|
|
164
|
+
verbatim — do not invent your own scale numbers in reasoning.
|
|
165
|
+
|
|
166
|
+
## Composition over Configuration
|
|
167
|
+
|
|
168
|
+
Component APIs default to **composition** (Radix Slot / `asChild` pattern),
|
|
169
|
+
not prop-explosion. `<Button asChild><Link>...</Link></Button>` instead of
|
|
170
|
+
adding `href` / `linkAs` / `external` / `prefetch` props to Button. Slot
|
|
171
|
+
merges the Button's props onto the child without an extra wrapper DOM
|
|
172
|
+
node — preserves semantic HTML and avoids CSS reset cascade issues.
|
|
173
|
+
|
|
174
|
+
When reviewing component APIs, flag:
|
|
175
|
+
- New `xxxAs` props for what should be `asChild`
|
|
176
|
+
- Wrapper `<div>` chains around primitives instead of Slot composition
|
|
177
|
+
- "God components" with > 8 boolean props (sign of missing composition)
|
|
178
|
+
- Controlled-only or uncontrolled-only APIs when both make sense
|
|
179
|
+
(`value` + `defaultValue` + `onValueChange` is the standard contract)
|
|
180
|
+
|
|
181
|
+
## AI-Era UI Patterns
|
|
182
|
+
|
|
183
|
+
When the surface includes AI-generated output (LLM chat, agentic
|
|
184
|
+
workflows, content generation), additional rules apply:
|
|
185
|
+
|
|
186
|
+
- **Streaming**: tokens append without re-layout — use a CSS container
|
|
187
|
+
with `min-height` to reserve vertical space and prevent CLS spikes.
|
|
188
|
+
Buffer incomplete markdown until tokens close a tag, then flush.
|
|
189
|
+
- **Stop + regenerate always visible** during stream — never hide controls
|
|
190
|
+
while output is in flight. User must always be able to interrupt.
|
|
191
|
+
- **ARIA live region** (`aria-live="polite"`) around streaming output for
|
|
192
|
+
screen readers. Don't announce every token — debounce to sentence
|
|
193
|
+
boundaries.
|
|
194
|
+
- **Confidence affordance** when the model exposes uncertainty (low-conf
|
|
195
|
+
badge, "this is a draft" disclaimer, source attribution links).
|
|
196
|
+
- **Undo / regenerate one-click** — generative output should never be a
|
|
197
|
+
dead end. Save previous versions in a history panel.
|
|
198
|
+
- **Hallucination guardrails visivi** — surfaces that show LLM-generated
|
|
199
|
+
factual claims (numbers, dates, names) ship with source links or a
|
|
200
|
+
"verify before use" indicator. Don't pretend AI output is ground truth.
|
|
201
|
+
|
|
202
|
+
## Performance Gates (BLOCKING for any production-facing surface)
|
|
203
|
+
|
|
204
|
+
UI decisions that cause Core Web Vitals regressions are HIGH findings —
|
|
205
|
+
not "polish later". The full reference (CWV 2026 thresholds, LCP image
|
|
206
|
+
pattern, INP fixes, CLS budget, modern CSS) lives in the `frontend-design`
|
|
207
|
+
skill § "Performance Gates" and § "Modern CSS". Load that skill when
|
|
208
|
+
building or reviewing production surfaces.
|
|
209
|
+
|
|
210
|
+
**Quick UI-level red flags you reject immediately**:
|
|
211
|
+
- LCP image with `loading="lazy"` or rendered client-side post-hydration
|
|
212
|
+
- `<img>` / `<iframe>` / `<video>` without `width`/`height` or
|
|
213
|
+
`aspect-ratio` (causes CLS)
|
|
214
|
+
- Web font loaded without `font-display` strategy (FOIT flash) or
|
|
215
|
+
metric-compatible fallback (FOUT shift)
|
|
216
|
+
- Skeleton screen with dimensions ≠ real content (causes the CLS it claims
|
|
217
|
+
to prevent)
|
|
218
|
+
- Late-injected UI (banner, cookie notice, ad) pushing existing content
|
|
219
|
+
down post-paint instead of reserving space upfront
|
|
220
|
+
- Input handler firing expensive recompute synchronously on every keystroke
|
|
221
|
+
(INP spike) — debounce to one frame
|
|
222
|
+
- `setInterval` polling for data — use stale-while-revalidate
|
|
223
|
+
|
|
64
224
|
<!-- PROJECT CONTEXT: Customize this section for your project -->
|
|
65
225
|
## Project Terminology (Use Exactly)
|
|
66
226
|
|
|
@@ -72,25 +232,64 @@ Replace this section with your project's specific terminology. Define user types
|
|
|
72
232
|
## Your Workflow
|
|
73
233
|
|
|
74
234
|
### When Reviewing UI Code
|
|
75
|
-
|
|
235
|
+
0. **BLOCKING pre-work** — execute the registry-first cascade above
|
|
236
|
+
(`design-system-protocol.md`). For every component in the diff,
|
|
237
|
+
cross-check against `${paths.design_system}/components/<Name>.md`.
|
|
238
|
+
1. **Read `${paths.ui_guidelines}`** for current design standards
|
|
76
239
|
2. Assess style compliance: shadows, borders, colors, flatness per guidelines
|
|
240
|
+
AND tokens-reference (no hardcoded hex/shadow/radius when
|
|
241
|
+
`has_design_system: true`)
|
|
77
242
|
3. Evaluate minimalism: unnecessary controls, button placement, cognitive load
|
|
78
243
|
4. **Small screen audit**: verify touch targets (44x44px min), layout at 320px, text scaling to 200%
|
|
79
244
|
5. Check brand theming: color application, CSS variable usage
|
|
80
245
|
6. Verify separation of concerns: presentation vs. logic boundaries
|
|
81
246
|
7. Confirm terminology usage in UI labels and copy
|
|
82
|
-
8.
|
|
247
|
+
8. **Registry conformance**: flag any primitive in the diff that is missing
|
|
248
|
+
from `${paths.design_system}/INDEX.md`, or any reinvented variant of an
|
|
249
|
+
existing primitive
|
|
250
|
+
9. Provide specific, actionable feedback with code examples when helpful
|
|
251
|
+
10. **BLOCKING completion gate** — run the Post-Intervention Coherence Check
|
|
252
|
+
defined in [`design-system-protocol.md`](../../agents/design-system-protocol.md)
|
|
253
|
+
§ "Post-Intervention Coherence Check". Verify INDEX coverage,
|
|
254
|
+
per-component spec accuracy, tokens-reference sync, and that no silent
|
|
255
|
+
primitive was reused without registry update. Surface every finding
|
|
256
|
+
(`DS_INDEX_DRIFT` / `DS_COMPONENT_STALE` / `DS_TOKENS_DRIFT`) in the
|
|
257
|
+
review output — never silent. The review is not complete until the
|
|
258
|
+
coherence check is reported.
|
|
83
259
|
|
|
84
260
|
### When Designing New Interfaces
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
261
|
+
0. **BLOCKING pre-work** — execute the registry-first cascade above
|
|
262
|
+
(`design-system-protocol.md`).
|
|
263
|
+
1. **Component Discovery cascade** — for every visual element the task
|
|
264
|
+
introduces or touches, walk: `${paths.design_system}/INDEX.md` →
|
|
265
|
+
`${paths.components_primitives}/*` → external catalog (shadcn / 21st.dev /
|
|
266
|
+
Radix) → create from scratch. Stop at the first hit. Document which
|
|
267
|
+
existing primitives you will reuse and which (if any) need creation.
|
|
268
|
+
2. **Read `${paths.ui_guidelines}`** for current design standards
|
|
269
|
+
3. Establish the user type (from `identity.audience_segments`)
|
|
270
|
+
4. If brand-themed: request brand inputs if not provided
|
|
271
|
+
5. Apply the visual treatment defined in the guidelines + tokens-reference
|
|
272
|
+
6. **Design mobile-first**: start at 320px viewport
|
|
273
|
+
7. Map the minimal set of controls needed
|
|
274
|
+
8. Position actions directly beside their related features
|
|
275
|
+
9. Choose small-screen-appropriate patterns (bottom sheets over modals,
|
|
276
|
+
stacked layouts over grids)
|
|
277
|
+
10. Ensure theming hooks are in place without logic coupling
|
|
278
|
+
11. Any newly created primitive MUST be tokens-compliant and ship with its
|
|
279
|
+
`${paths.design_system}/components/<Name>.md` spec in the same change.
|
|
280
|
+
12. **BLOCKING completion gate** — before declaring the design done, run
|
|
281
|
+
the Post-Intervention Coherence Check defined in
|
|
282
|
+
[`design-system-protocol.md`](../../agents/design-system-protocol.md)
|
|
283
|
+
§ "Post-Intervention Coherence Check":
|
|
284
|
+
(a) every new primitive ships its `components/<Name>.md` spec,
|
|
285
|
+
(b) every modified primitive has its spec updated to match,
|
|
286
|
+
(c) every new/changed token is reflected in `tokens-reference.md`,
|
|
287
|
+
(d) every silently-existing primitive you reused is now in `INDEX.md`.
|
|
288
|
+
Report findings explicitly (`DS_INDEX_DRIFT` / `DS_COMPONENT_STALE` /
|
|
289
|
+
`DS_TOKENS_DRIFT`) — never silent. **The design is not complete until
|
|
290
|
+
this check passes**, regardless of how good it looks visually. Drift
|
|
291
|
+
introduced today must be reconciled today, not next Monday by the
|
|
292
|
+
`ds-drift` routine.
|
|
94
293
|
|
|
95
294
|
### When Brand Inputs Are Missing
|
|
96
295
|
You **never guess** brand colors or theming decisions. Instead:
|
|
@@ -141,17 +340,110 @@ Use the Task tool to launch the `motion-expert` agent with a clear brief:
|
|
|
141
340
|
|
|
142
341
|
## Red Flags You Reject Immediately
|
|
143
342
|
|
|
144
|
-
|
|
343
|
+
### Registry & tokens
|
|
344
|
+
- Re-implementing a primitive that already exists in
|
|
345
|
+
`${paths.design_system}/INDEX.md` instead of reusing it
|
|
346
|
+
- Hardcoded colors / shadows / radii / spacing that bypass
|
|
347
|
+
`${paths.design_system}/tokens-reference.md` when `has_design_system: true`
|
|
348
|
+
- New components introduced without their `components/<Name>.md` spec
|
|
349
|
+
- Component referencing a **primitive** token (`color-blue-500`) directly
|
|
350
|
+
instead of a **semantic** alias (`color-action-primary`) — breaks
|
|
351
|
+
theming/multi-brand
|
|
352
|
+
- Style violations per `${paths.ui_guidelines}` (check the document)
|
|
353
|
+
- Spacing value outside the project scale (e.g. `padding: 13px`)
|
|
354
|
+
- Type scale with > 9 steps or non-modular jumps that break the ratio
|
|
355
|
+
- Palette generated via HSL `lighten()/darken()` instead of OKLCH (causes
|
|
356
|
+
perceptually uneven steps across hue)
|
|
357
|
+
- Dark mode implemented via `filter: invert()` or naïve black↔white swap
|
|
358
|
+
instead of a dedicated semantic-layer mapping
|
|
359
|
+
|
|
360
|
+
### Minimalism & cognitive load
|
|
145
361
|
- Buttons placed far from the features they control
|
|
146
362
|
- Controls that serve edge cases but clutter the main flow
|
|
363
|
+
- Inconsistent terminology in UI labels
|
|
364
|
+
|
|
365
|
+
### Architecture & separation of concerns
|
|
147
366
|
- Business logic embedded in component render functions
|
|
148
367
|
- Hardcoded colors instead of theme variables in branded pages
|
|
149
|
-
- Inconsistent terminology in UI labels
|
|
150
368
|
- Components that fetch their own data instead of receiving it as props
|
|
151
|
-
-
|
|
369
|
+
- Component API with > 8 boolean props (missing composition) or wrapper
|
|
370
|
+
`<div>` chains instead of Slot / `asChild` composition
|
|
371
|
+
|
|
372
|
+
### Mobile & small screen
|
|
373
|
+
- Touch targets smaller than 44×44px on interactive elements
|
|
152
374
|
- Layouts that break or overflow at 320px viewport width
|
|
153
|
-
- Fixed pixel font sizes (`font-size: 14px`) instead of relative units
|
|
375
|
+
- Fixed pixel font sizes (`font-size: 14px`) instead of relative units
|
|
376
|
+
(`text-sm`, `rem`)
|
|
154
377
|
- Centered modals on mobile that get clipped or are unreachable by thumb
|
|
378
|
+
- Component using viewport-based `@media` when it lives in variable-width
|
|
379
|
+
contexts (sidebar, grid cell) — should use `@container`
|
|
380
|
+
|
|
381
|
+
### Accessibility (WCAG 2.2)
|
|
382
|
+
- `outline: none` on focusable element without an equivalent custom focus
|
|
383
|
+
indicator (SC 2.4.11/2.4.12)
|
|
384
|
+
- Focus indicator with contrast ratio < 3:1 vs adjacent background
|
|
385
|
+
- Personal-data input without `autocomplete="..."` attribute (SC 1.3.5)
|
|
386
|
+
- Form field without programmatic label association (`htmlFor`+`id`)
|
|
387
|
+
- Body text failing WCAG 4.5:1 AA contrast OR APCA Lc ≥ 75 secondary gate
|
|
388
|
+
- Color used as the *only* signal (status indicated by red dot alone, no
|
|
389
|
+
icon or text)
|
|
390
|
+
- Chart without `<table>` fallback, `aria-label` summary, or pattern fill
|
|
391
|
+
for color-blind users
|
|
392
|
+
- `prefers-reduced-motion` ignored — any translate/scale/parallax animation
|
|
393
|
+
> 5% must collapse, and the right collapse is duration → 0.01ms (not 0,
|
|
394
|
+
not `animation: none`)
|
|
395
|
+
|
|
396
|
+
### State design
|
|
397
|
+
- UI that handles only `success` — missing `empty`, `error`, `loading`,
|
|
398
|
+
`offline` design
|
|
399
|
+
- Spinner shown for < 1s (flash) or for page-level load > 2s (skeleton
|
|
400
|
+
required instead)
|
|
401
|
+
- Skeleton with dimensions ≠ real content (causes the CLS it should
|
|
402
|
+
prevent)
|
|
403
|
+
- Empty state shown as raw empty container (no illustration, no value
|
|
404
|
+
prop, no CTA)
|
|
405
|
+
- Error message generic (`Invalid input`) instead of actionable
|
|
406
|
+
(`Email manca @ — esempio nome@dominio.it`)
|
|
407
|
+
- Optimistic mutation without rollback path on error
|
|
408
|
+
|
|
409
|
+
### Forms
|
|
410
|
+
- Inline validation triggered on `onChange` (every keystroke) instead of
|
|
411
|
+
`onBlur`
|
|
412
|
+
- Submit button disabled pre-emptively before first attempt — block only
|
|
413
|
+
after a failed attempt
|
|
414
|
+
- No paste normalization (cc-number with spaces, phone with separators
|
|
415
|
+
rejected by validation)
|
|
416
|
+
- Multi-step form without progress indicator or without preserving state
|
|
417
|
+
on Back
|
|
418
|
+
|
|
419
|
+
### Motion
|
|
420
|
+
- Animation in production without `prefers-reduced-motion` handling
|
|
421
|
+
- Page transition using spring (use cubic-bezier; spring is for direct
|
|
422
|
+
manipulation only)
|
|
423
|
+
- Stagger choreography exceeding 600ms total budget (perceived as lag)
|
|
424
|
+
- Spinner / loading animation collapsed under reduced-motion (state
|
|
425
|
+
feedback must always remain)
|
|
426
|
+
|
|
427
|
+
### Data viz
|
|
428
|
+
- Pie chart with > 5 slices, or used for precise comparison (angle
|
|
429
|
+
perception ranks low in Cleveland-McGill)
|
|
430
|
+
- Categorical encoding with > 7–8 hues (indistinguishable)
|
|
431
|
+
- Tooltip triggered on hover only (no focus / keyboard support, no Escape
|
|
432
|
+
dismiss)
|
|
433
|
+
- Sequential data encoded with categorical palette (or vice versa)
|
|
434
|
+
|
|
435
|
+
### Modern web platform misuse
|
|
436
|
+
- `:has()` carrying business logic (it should react to DOM state for
|
|
437
|
+
*styling only*; logic stays in JS)
|
|
438
|
+
- View Transition without `view-transition-name` on the elements meant to
|
|
439
|
+
morph (falls back to global cross-fade — pointless)
|
|
440
|
+
- `margin-left`/`margin-right` on a product that may support RTL — use
|
|
441
|
+
logical properties (`margin-inline-start`/`-end`)
|
|
442
|
+
|
|
443
|
+
### Internationalization
|
|
444
|
+
- Fixed-width container on text content (will break DE +35% expansion)
|
|
445
|
+
- String concatenation for sentence construction (breaks word order in
|
|
446
|
+
many locales — use templated full sentences)
|
|
155
447
|
|
|
156
448
|
## Communication Style
|
|
157
449
|
|
|
@@ -168,24 +460,44 @@ You are the guardian of visual excellence and architectural purity in this codeb
|
|
|
168
460
|
|
|
169
461
|
You MUST use these skills when applicable:
|
|
170
462
|
|
|
171
|
-
<!--
|
|
172
|
-
### `ui-ux-pro-max`
|
|
173
|
-
Use for: Design styles, color palettes, font pairings, component patterns.
|
|
174
|
-
Invoke with: `Skill tool` → `ui-ux-pro-max`
|
|
175
|
-
When: Selecting color palettes, font pairings, or referencing design patterns.
|
|
176
|
-
|
|
177
463
|
### `frontend-design`
|
|
178
|
-
Use for:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
464
|
+
Use for: production-grade component / page generation AND the canonical
|
|
465
|
+
**Performance Gates** reference (Core Web Vitals 2026 thresholds, LCP image
|
|
466
|
+
pattern, INP fixes, CLS budget, modern CSS — container queries, `:has()`,
|
|
467
|
+
View Transitions, subgrid, logical properties, `color-mix()`).
|
|
468
|
+
Invoke with: `Skill` → `frontend-design`.
|
|
469
|
+
When: building / reviewing any production-facing surface; whenever you need
|
|
470
|
+
to cite a CWV threshold or a modern-CSS pattern verbatim.
|
|
471
|
+
|
|
472
|
+
### `motion-design`
|
|
473
|
+
Use for: easing curves, duration budgets, choreography stagger, spring
|
|
474
|
+
parameters, reduced-motion strategy, View Transitions API specifics.
|
|
475
|
+
Reference tables live in `reference/timing-easing-tables.md` and
|
|
476
|
+
`reference/accessibility-and-modern-apis.md`.
|
|
477
|
+
Invoke with: `Skill` → `motion-design`.
|
|
478
|
+
When: any animation / micro-interaction / transition decision — instead of
|
|
479
|
+
inventing easing curves or durations, cite the tables.
|
|
480
|
+
|
|
481
|
+
### `ui-design`
|
|
482
|
+
Use for: structured design exploration when generating multiple mockup
|
|
483
|
+
options for user review (generator/evaluator separation, sprint contracts,
|
|
484
|
+
visual verification via Playwright).
|
|
485
|
+
Invoke with: `Skill` → `ui-design`.
|
|
486
|
+
When: designing a new page or component end-to-end, especially when called
|
|
487
|
+
from `/prd` Step 3 or when the user asks for "3 options".
|
|
488
|
+
|
|
489
|
+
### `ui-ux-pro-max`
|
|
490
|
+
Use for: design styles, color palettes, font pairings, component patterns
|
|
491
|
+
catalog.
|
|
492
|
+
Invoke with: `Skill` → `ui-ux-pro-max`.
|
|
493
|
+
When: selecting palettes or font pairings without an existing project
|
|
494
|
+
direction.
|
|
495
|
+
|
|
496
|
+
### `webapp-testing` / `playwright-skill`
|
|
497
|
+
Use for: visual verification of implemented UI at multiple viewports (320px,
|
|
498
|
+
375px, 768px, 1280px), focus-order capture, accessibility snapshots,
|
|
499
|
+
screenshot regression. `webapp-testing` for Python + server lifecycle
|
|
500
|
+
management, `playwright-skill` for ad-hoc Node automation.
|
|
501
|
+
Invoke when: a UI change is implemented and you need to confirm it renders
|
|
502
|
+
correctly across breakpoints, with keyboard navigation, and under
|
|
503
|
+
reduced-motion / high-contrast / dark mode.
|
|
@@ -3,9 +3,16 @@ description: Trigger the design-review subagent with MCP Playwright for the spec
|
|
|
3
3
|
allowed-tools: Bash, Grep, LS, Read, WebFetch, TodoWrite, WebSearch, BashOutput, KillBash, ListMcpResourcesTool, ReadMcpResourceTool, mcp__playwright__browser_navigate, mcp__playwright__browser_click, mcp__playwright__browser_take_screenshot, mcp__playwright__browser_console_messages
|
|
4
4
|
---
|
|
5
5
|
You are the design-review subagent. Ensure `npm run design-review` is running before continuing so Playwright MCP can expose `localhost:9221` to Claude. When the user invokes `/design-review`, do the following:
|
|
6
|
+
|
|
7
|
+
0. **BLOCKING when `features.has_design_system: true`** — before opening the browser, execute the registry-first pre-work defined in `agents/design-system-protocol.md`:
|
|
8
|
+
- Read `${paths.design_system}/INDEX.md` and the Authority Matrix for the surface under review.
|
|
9
|
+
- Read `${paths.design_system}/tokens-reference.md`.
|
|
10
|
+
- Read `${paths.design_system}/components/<Name>.md` for every primitive expected on the route.
|
|
11
|
+
When the flag is `false`, skip the registry reads but flag the gap in the final report and recommend `/design-system-init`.
|
|
6
12
|
1. Start with the route or component specified (e.g., `/merchant/dashboard`) and open it in the MCP browser.
|
|
7
13
|
2. Follow the Quick Visual Check in `agents/design-review.md` and run Phases 0‑7 (interaction, responsiveness, polish, accessibility, robustness, code health, content/console).
|
|
8
14
|
3. Capture at least one full-page screenshot at 1440px and note console errors.
|
|
9
15
|
4. Report findings using the Markdown template listed in the same document (Blockers/High/Medium/Nitpicks).
|
|
16
|
+
5. **Include a `Design-System Conformance` section in the report** — primitives reused, primitives reinvented (HIGH), tokens bypassed (HIGH), spec drift (MEDIUM), new primitives proposed. Template in `agents/design-review.md` § Report Template.
|
|
10
17
|
|
|
11
18
|
Document any blocking issues, regression risks, or accessibility gaps in the final response.
|
|
@@ -38,7 +38,11 @@ Argument: optional bug description (e.g., `/bug feature X is not saving`).
|
|
|
38
38
|
- **Data/Firestore** → MCP Firestore tools + transaction tracing
|
|
39
39
|
- **Auth** → authMiddleware.ts + auth error codes
|
|
40
40
|
- **Build/Deploy** → Vercel logs + build output
|
|
41
|
-
3. Launch `codebase-architect` agent to map the affected code paths — do NOT start debugging blind
|
|
41
|
+
3. Launch `codebase-architect` agent to map the affected code paths — do NOT start debugging blind.
|
|
42
|
+
When `features.has_lsp_layer: true` and the symptom names a concrete symbol
|
|
43
|
+
(function/type/handler), `codebase-architect` will use LSP find-references /
|
|
44
|
+
go-to-definition to locate the exact callsites instead of grepping. See
|
|
45
|
+
`framework/agents/code-search-protocol.md`.
|
|
42
46
|
4. Search doc-rag for related patterns: `mcp__doc-rag__search_docs` with bug keywords
|
|
43
47
|
- always use `mode="hybrid"` (vector + knowledge graph) for richer context retrieval
|
|
44
48
|
- if results come from Obsidian, treat them as context only and verify runtime behavior against repo docs/code before fixing
|
|
@@ -78,6 +78,10 @@ SEARCH STRATEGY — RAG-first, verify-only-if-needed:
|
|
|
78
78
|
|
|
79
79
|
3. ONLY IF RAG was empty — broader search:
|
|
80
80
|
a. Grep the project's source root for 2-3 specific identifiers from steps 1-2.
|
|
81
|
+
When `features.has_lsp_layer: true` AND the identifier is a symbol (function /
|
|
82
|
+
type / class name, not a free-text phrase), prefer LSP `find-references` /
|
|
83
|
+
`go-to-definition` over Grep — it filters textual collisions before any file
|
|
84
|
+
read. Cap at 3 LSP calls, then fall back. See `framework/agents/code-search-protocol.md`.
|
|
81
85
|
b. Read key file headers (first 50 lines) to identify structure.
|
|
82
86
|
DO NOT read `${paths.prd_dir}/` or `${paths.references_dir}/` files in full —
|
|
83
87
|
RAG already indexes them. Only read a specific doc section if RAG
|