Plugin pairs with Symphony — Composer's output (issues in the project's tracker) is Symphony's input. State-aware /composer command walks the user through 11 phases: concept, users (with workflow probing for hidden actors), requirements/NFR/IA, design system, interaction design, flows, mocks, architecture, stories, roadmap, load. Each phase produces a reviewable artifact in docs/planning/ (or, for design and interaction, a project-local skill — see below). Architecture is intentionally LAST, after the spec is complete. Mocks are JSX/TSX regardless of final stack and pass a "text feasibility" audit — every visible string is categorized (static/computed/authored), computed strings are traced to source data, and any string implying an unspecified feature halts the commit. Design system and interaction design are produced as PROJECT-LOCAL SKILLS in .claude/skills/<slug>-design-system/ and .claude/skills/<slug>-interaction-design/, not as docs in docs/planning/. Skills auto-load via description matching whenever UI work happens; a reference doc gets read once and drifts out of context. The mocks skill imports tokens directly from the design-system skill for a single source of truth across mocks and (eventually) real code. ui-system is currently a PLACEHOLDER — captures the minimum needed for mocks to proceed with <TBD: ...> markers as a return-pass worklist. Full interview specification is the next pass. Council touchpoints baked in: PM/skeptic/end-user after requirements, end-user/a11y after mocks, full architecture council after architecture, plus auto-additions (legal-triage on regulated data, privacy-advocate on PII, finance-controller on money flows). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.1 KiB
name, description
| name | description |
|---|---|
| ui-system | Interview the user and produce two project-local skills — a design-system skill and an interaction-design skill — that auto-load whenever UI work is in progress. Output goes to .claude/skills/<slug>-design-system/ and .claude/skills/<slug>-interaction-design/, NOT docs/planning/. The skills load themselves into context when anyone codes UI (mock or real); a plain reference doc would not. Currently a placeholder skill that captures the minimum needed for downstream phases to proceed; planned for a fuller specification pass. Use when the composer skill reaches phase 4 or 5, or when the user asks to "set up the design system" or "specify interaction patterns." |
UI system (placeholder)
Status: PLACEHOLDER. This skill currently captures the minimum design-system and interaction-design content needed for the mocks phase to proceed. A fuller specification pass is planned. When the user returns to flesh this out, expand the interview sections below and the SKILL.md / sidecar templates.
Why this is a skill, not a doc
A reference document at docs/planning/design-system.md gets read once
and then drifts out of context as the conversation grows. UI work that
happens later — generating a mock, writing a component, picking a color —
won't have it loaded.
A skill with a description that triggers on UI work is loaded automatically every time the trigger matches. That's the whole point of the skill mechanism. The design system and interaction design must be skills.
What this skill produces
Two project-local skills, plus their sidecar data files:
.claude/skills/<slug>-design-system/
├── SKILL.md ← the skill itself; auto-loads on UI work
├── tokens.ts ← machine-readable color / type / spacing / motion tokens
└── components.md ← component vocabulary with anatomy
.claude/skills/<slug>-interaction-design/
└── SKILL.md ← interaction patterns, state surfaces, input modes, i18n
And two stub pointer files in docs/planning/ so the planning index
finds them:
docs/planning/design-system.md ← pointer; tells humans where the skill lives
docs/planning/interaction-design.md ← pointer
Slug
The skills need a project slug for their name: frontmatter, so they
don't collide with skills from other projects on the same machine.
Resolution order:
- If
package.jsonhas aname, slugify it. - Else if a git remote exists, slugify the repo name.
- Else ask the user. Default to the directory name.
Slug rule: lowercase, hyphenated, kebab-case, ASCII only. Example:
SourdoughTracker → sourdough-tracker → skill sourdough-tracker-design-system.
design-system interview (placeholder pass)
Ask the user, in order, with sensible defaults:
- Existing material? Brand assets, mood boards, screenshots, "make it look like Linear/Notion/Stripe", or nothing. If material exists, ingest it before asking the rest.
- Color: brand color(s), neutral scale (warm/cool/true), dark mode (yes/no/system). Offer to generate accessible contrast pairs.
- Typography: one family or two (display + body), size scale base and ratio, line-height policy.
- Spacing: scale base (4px / 8px), key spacing tokens.
- Radii: tight / medium / pillowy.
- Shadows: flat / subtle / generous.
- Visual motion: default duration, default easing.
- Components: confirm vocabulary against
ia.md.
Mark unanswered with <TBD: ...> so the return pass has a worklist.
Write phase — design-system
- Write
.claude/skills/<slug>-design-system/SKILL.mdfromtemplates/design-system/SKILL.md. Substitute the slug into thename:field and the project name into thedescription:. - Write
.claude/skills/<slug>-design-system/tokens.tsfromtemplates/design-system/tokens.ts. Fill in the values gathered in the interview;<TBD>for unanswered. - Write
.claude/skills/<slug>-design-system/components.mdfromtemplates/design-system/components.md. - Write
docs/planning/design-system.mdfrom the pointer template — one paragraph saying where the skill lives.
interaction-design interview (placeholder pass)
Ask, in order:
- Primary input: touch / mouse / keyboard / mixed. Primary, supported, not supported.
- State surfaces: pick one pattern per action class.
- Motion: minimal / restrained / expressive.
prefers-reduced-motionalways honored. - Breakpoints: count, primary design target.
- i18n: locales planned, RTL, string-length budget.
- Empty/loading/error/offline: one declared posture each.
- Time formatting: relative threshold, absolute format.
- Keyboard: global shortcuts, escape behavior.
Write phase — interaction-design
- Write
.claude/skills/<slug>-interaction-design/SKILL.mdfromtemplates/interaction-design/SKILL.md. - Write
docs/planning/interaction-design.mdpointer.
Re-entry
When the user returns to flesh this out fully:
- Expand the interviews above.
- Expand the SKILL.md and sidecar templates.
- Both skills are version-controlled in
.claude/skills/— re-running this phase shows the user a diff before overwriting.
The downstream contract is: composer-mocks reads the skills, not
the planning pointer files. That contract does not change as the
templates grow.
Hard rules even in placeholder mode
- Always produce both skills with sidecars. Mocks can't proceed without them.
- Always slug-namespace so projects on the same machine don't collide.
- Mark unknowns with
<TBD: ...>rather than inventing — TBDs are the return-pass worklist. - Don't pretend. If the user has nothing and no opinions, say so in the SKILL.md: "No design direction set; defaults applied. Revisit before mocks are committed."
- Tell the user what just happened. After write, print:
Wrote two project skills: .claude/skills/<slug>-design-system/SKILL.md .claude/skills/<slug>-interaction-design/SKILL.md These auto-load whenever UI work is happening. Verify after restart with /agents (they should appear as project-local skills).