Stack-agnostic UI design for HeyEddi apps: discovery, briefs, critique, and design-system documentation. Implementation (Vue, Flutter, CSS in components) belongs to stack skills — see reference/implement-routing.md.
Team: @taste-penpot owns the look in one pass (Anthropic frontend-design + tokens). This skill owns product fit and implementation handoff. Read reference/design-team.md before any design turn. Do not author a second palette or restart discover → research → explore to find a look.
Auto-pickup: Design talk still loads this skill, and it immediately loads @taste-penpot if that pass has not already produced tokens. Then record those tokens. reference/brief-language.md is product language for the brief, not a second art direction.
Design vs implement (mandatory split)
| Layer | Skill | Delivers |
|---|---|---|
| Design (this skill) | @heyeddi-design |
Briefs, wireframes, critique, design.md, IA, aesthetic direction |
| Implement (stack) | @heyeddi-handoff, @design-handoff-flutter |
Production UI code in Vue / Flutter |
| Enforce (stack) | @primevue-openprops-architect |
Vue tokens + PrimeVue guardrails |
| Verify (agnostic) | @visual-auditor, @ux-flow-auditor |
Screenshots, contrast, flows, fixes |
Read reference/implement-routing.md every session that ends in shipped UI.
Default behavior (no confirmation)
- Design talk of any kind: load
brief-language.mdfirst; pin taste + subject + hard rejects before chrome - Better design / redesign: "better design", "make it better", "redesign", "new look", "overhaul", "wow", "top notch" → do not polish-only. Run critique ambition gate (
reference/critique.md); if template-like or ambition fails →shape→ craft → implement. Spacing/token tweaks alone are wrong for these phrases. - Critique + fix (local): "looks bad", "fix this page", "polish", "tweak spacing" → critique then stack implementer +
@visual-auditor— unless the ambition gate says escalate toshape(then shape first; do not ask). - Craft: confirmed brief → hand off to stack implementer in the same workflow
- Ambition bar: impressive craft is default on flagship routes — do not wait for user to ask
Subagents (default)
Delegate by sub-command: see reference/subagents.md. Main chat confirms briefs and merges results.
| Always delegate | Subagent |
|---|---|
@visual-auditor / Playwright |
shell |
validate_vue, npm test, build |
shell |
critique, craft, polish (route work) |
generalPurpose |
research, wireframe explore |
generalPurpose |
Codebase scan for document |
explore |
Do not run visual capture inline during handoff turns.
Cross-pillar sync (mandatory)
Read reference/cross-pillar-handoff.md. Bookend craft, critique, polish, shape (confirmed brief):
@heyeddi load_workflow_context --route /path
… design work + Decision log in design.md …
@heyeddi append_pillar_opinion --pillar design …
→ @heyeddi-product scope check; @ux-flow-auditor flow note if IA affects tasks
Setup (every session)
- Run
python scripts/load_context.py --project-root <root>once per session (skip if output is already in the conversation). - If
product_existsis false and the task needs strategic context, runinitbefore shape/craft. - Read the sub-command reference file for the invoked mode (required: do not skip).
3a. Read
reference/brief-language.mdfirst on any design/look/feel talk (discover, shape, craft, critique, polish, or informal "make it look…"): subject/metaphor, hard rejects, hero/type/accent/responsive/SSOT, first-viewport checklist, done gate. 3b. Readreference/implement-routing.mdwhen shaping, crafting, critiquing, or polishing any route. 3c. Readreference/surface-completeness.mdonce per session when shaping, crafting, or critiquing any route. 3d. Readreference/foundations.mdonce per session: responsive, theme, i18n, a11y, reading modes are always on unlessproduct.mdwaives them. 3e. Readreference/modern-reference.mdwhen shaping marketing, dashboard, or settings routes. 3f. Readreference/audience-design.mdwhen shaping, crafting, or polishing any user-facing route. 3g. Readreference/design-ambition.mdon flagship routes. 3h. Readreference/aesthetic-direction.mdon any user-facing route. 3i. Readcontext/PROSE_ANTI_SLOP.mdwhen writing UI copy in briefs ordesign.md. 3j. Readreference/visual-tools.mdduringexplore,shape, andcritiqueon flagship routes: use GenerateImage for direction probes and Canvas for compare/brief/critique summaries when the IDE provides them. - After shape (brief confirmed), critique, or polish, append to Decision log in
.heyeddi/design.md. - After stack implementer finishes:
@visual-auditorfast widths375,768,1440while iterating. Before calling done on flagship/marketing: done widths375,430,768,1024,1440,1920(--preset done) and fix what you see. Logo-off test: if it could be another startup after removing the brand, it is not done.
Commands
| Command | Purpose |
|---|---|
| (no sub-command) | Vague design request → start discover |
init |
Create or refresh PRODUCT.md; offer document for DESIGN.md |
discover |
Discovery interview only: no code, no final brief yet |
research |
Web trend / reference research for current design direction |
explore |
Concept images (GenerateImage) + Canvas compare + wireframes |
shape |
Full planning flow: discover → research → explore → confirmed brief |
document |
Generate or refresh DESIGN.md from code or seed questions |
craft |
Brief ready → hand off to stack implementer (see implement-routing) |
critique |
UX review of existing UI → report → auto-chain implement + visual-auditor |
polish |
Design-spec refinement + stack implementer for code (after critique) |
Routing rules
- Better design / redesign intent ("better design", "make it better", "redesign", "new look", "overhaul", "major improvement", "wow", "top notch" on an existing route): load
reference/critique.mdambition gate → if escalate →reference/shape.mdthencraft(not polish-only). Seereference/design-ambition.md§ Improve vs redesign. - Existing UI: local fix ("critique", "looks bad", "fix this page", "polish"): load
reference/critique.md→ run ambition gate → polish-path implement +@visual-auditoronly if gate says stay local. Do not ask. - No sub-command, vague greenfield: load
reference/discover.md+brief-language.md. - Sub-command matches table: load
reference/<command>.md(+brief-language.mdfor shape/craft/critique/polish). craftwithout confirmed brief: runshapefirst (brief must include subject + hard rejects). 5b. Flagship routes without personas:@heyeddi-intakeordiscoverfirst.polishwithout critique this session: run critique first (including ambition gate).- Screenshots / approved mockups:
@heyeddi-handoff(implement), not designcraftcode. - Never invoke impeccable: this skill replaces it.
Artifacts
| Artifact | Location |
|---|---|
| Design brief (confirmed) | .heyeddi/designs/<feature>/brief.md |
| Wireframes | .heyeddi/designs/<feature>/wireframes/ |
| Research notes | .heyeddi/designs/<feature>/research.md |
| Design system | .heyeddi/design.md |
| Product context | .heyeddi/product.md |
| Critiques, audits | .heyeddi/docs/ |
Use kebab-case for <feature>.
Foundations (design spec — implementer enforces in code)
Responsive, light/dark, en+es i18n, WCAG 2.2 AA, semantic tokens: see reference/foundations.md, reference/token-strategy.md, reference/brief-language.md.
See context/VOCABULARY.md, context/ANTI_PATTERNS.md, context/PROSE_ANTI_SLOP.md, context/EXAMPLES.md, reference/brief-language.md.
When the task is complete: suggest next skills
python .agents/skills/heyeddi/scripts/suggest_next_skill.py \
--current-skill heyeddi-design --project-root .
Add --route /path and --mode <sub-command> when known.