Scaffolds everything the UI/UX skills assume is in place. Explore first, present findings, confirm with the user, then write. Never guess — always check before installing or creating.
Process
1. Explore
Read the current state of the repo. Don't assume anything — check each one:
# Framework detection
cat package.json | grep -E '"next"|"vite"|"nuxt"|"astro"|"svelte"' 2>/dev/null | head -5
Playwright installed?
node -e "require('@playwright/test')" 2>/dev/null && echo "playwright: yes" || echo "playwright: no" find . -name "playwright.config." -not -path "/node_modules/*" 2>/dev/null | head -3
If a playwright.config exists, check for custom outputDir or use option that might conflict with /tmp writesgrep -h "outputDir|use:" playwright.config.* 2>/dev/null | head -5
axe-core installed?find . -path "/axe-core/package.json" -not -path "/node_modules/.cache/*" 2>/dev/null | head -1
&& echo "axe-core: yes" || echo "axe-core: no"
grep -r "i18next|next-intl|react-i18next|@lingui|formatjs|next-translate"
package.json packages//package.json apps//package.json 2>/dev/null | head -3
find . ( -name "globals.css" -o -name "variables.css" -o -name "tokens.css" )
-not -path "/node_modules/" 2>/dev/null
find . -name "tailwind.config." -not -path "/node_modules/*" 2>/dev/null
find . -name "tokens.json" -o -name "design-tokens.json" 2>/dev/null | grep -v node_modules
ls DESIGN-BRIEF.md 2>/dev/null && echo "brief: yes" || echo "brief: no"
CLAUDE.md / AGENTS.mdls CLAUDE.md AGENTS.md 2>/dev/null grep -n "UI skills|ui skills|design-grill|/uiux" CLAUDE.md AGENTS.md 2>/dev/null | head -5
prefers-reduced-motion in global CSS (needed by /animate and /a11y)grep -rn "prefers-reduced-motion" . --include="*.css" -l 2>/dev/null | grep -v node_modules
Skip link in root layout (needed by /a11y)grep -rn "skip.main|Skip.content|#main-content" . --include=".tsx" --include=".html" 2>/dev/null
| grep -v node_modules | head -3
find . -type d -name "src" -not -path "/node_modules/" -not -path "/.next/"
-not -path "/dist/" -not -path "/.turbo/" 2>/dev/null | head -1
### 2. Present findings
Summarise exactly what's present and what's missing. Use this table format:
Playwright ✓ installed / ✗ missing Chromium browser ✓ installed / ✗ missing / ? unknown Playwright baseURL ✓ localhost:3000 / ⚠ custom port [n] — note for skills axe-core ✓ installed / ✗ missing Token home ✓ globals.css :root / ✓ tailwind.config / ✗ none i18n library ✓ [library name] — /copy edits message files / ✗ none Design brief ✓ DESIGN-BRIEF.md found / ✗ none CLAUDE.md/AGENTS.md ✓ exists / ✗ neither exists UI skills section ✓ already set up / ✗ missing prefers-reduced-motion ✓ in globals.css / ✗ missing Skip link ✓ found / ✗ missing
Tell the user: "I'll walk you through setting up each missing piece. For already-present items I'll verify they're correct and skip anything that doesn't need changing."
### 3. Walk through each decision (one at a time)
---
#### Section A — Playwright
> **What it is:** Playwright is the browser automation tool all the visual skills use to take screenshots, record animations, and run accessibility scans. Every skill that verifies changes visually needs it.
> **Which skills need it:** /uiux, /animate, /copy, /a11y, /landing, /tokens
**If already installed:** verify Chromium browser is available:
```bash
npx playwright install chromium --dry-run 2>/dev/null && echo "chromium: ok" || echo "chromium: needs install"
If Chromium is missing, install it: npx playwright install chromium
Also check whether an existing playwright.config.* could conflict with how skill scripts write to /tmp:
- Skills write screenshots and videos directly to
/tmp/using absolute paths — they bypass anyoutputDirin the config entirely. - Conflict to watch for: if the config sets
use: { baseURL: ... }pointing to a port other than 3000, note it — skill scripts all default tohttp://localhost:3000. Record the actual port in the CLAUDE.md block if it differs. - If
playwright.configrestricts which browsers are installed (e.g. onlyfirefox), Chromium may still need a separate install. The skills always usechromium— verify it's available regardless of the config.
If not installed:
"Playwright isn't installed. It's a dev dependency used only during skill runs — it won't affect your production bundle. Should I install it?"
Default: yes. Install:
pnpm add -D @playwright/test 2>/dev/null || npm install -D @playwright/test
npx playwright install chromium
Section B — axe-core
What it is: axe-core is the accessibility scanning engine /a11y uses to programmatically detect WCAG violations. Which skills need it: /a11y only
If already installed: skip.
If not installed:
"axe-core isn't installed. It's a dev dependency used only by /a11y for programmatic accessibility scanning. Should I install it?"
Default: yes.
pnpm add -D axe-core 2>/dev/null || npm install -D axe-core
Section C — Token home
What it is: The file where design tokens (colors, spacing, typography) live. /tokens reads and writes here. /uiux applies fixes here for global changes. Which skills need it: /tokens, /uiux
If a token home exists (globals.css with :root, tailwind.config, or tokens.json): note the location and confirm it with the user. No action needed.
If no token home exists:
"No design token file was found. Tokens need a home — usually a
:rootblock in globals.css or atheme.extendin tailwind.config.ts. Which do you prefer?"
Options:
- CSS custom properties in globals.css — works with any framework, most flexible (recommended for new projects)
- Tailwind config — works if you're already using Tailwind
- I'll set it up myself — skip, just note the location
If globals.css exists but has no :root block: offer to add a minimal starter block:
/* Design tokens */
:root {
/* Add your tokens here — /tokens will help you fill this in */
}
Section D — prefers-reduced-motion
What it is: A CSS media query that suppresses animations for users who've requested reduced motion in their OS settings. Required for WCAG 2.1 AA compliance. Which skills need it: /animate (adds it), /a11y (checks for it)
If already present: skip.
If missing:
First, identify the correct global CSS file to write to. In a monorepo there may be multiple — pick the one that is imported by the root layout or _app.tsx, not a component-scoped one:
# Find all global CSS files
find . \( -name "globals.css" -o -name "global.css" -o -name "index.css" \) \
-not -path "*/node_modules/*" -not -path "*/.next/*" 2>/dev/null
# Which one is imported in the root layout or app entry?
grep -rn "globals.css\|global.css\|index.css" . \
--include="*.tsx" --include="*.ts" --include="*.js" \
-not -path "*/node_modules/*" | grep "import\|require" | head -5
Use the file imported at the root — not the first globals.css found. If multiple root-level imports exist, show them to the user and ask which one is the true global entry.
"The
prefers-reduced-motionrule isn't in your global CSS. It's a WCAG requirement that makes all animations respect the user's OS motion preference. I'll add it to[confirmed file path]."
No further confirmation needed — add to the end of the identified file:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
Section E — Design brief
What it is: DESIGN-BRIEF.md is a project-root file that captures visual direction — brand personality, color system, typography, animation level, component style. All UI skills read it before starting so they don't have to re-derive what's already been decided. Which skills need it: /uiux, /animate, /tokens, /landing (all read it if present)
If already exists: read it, summarise it in two sentences, confirm it's current.
If missing:
"No DESIGN-BRIEF.md found. Without it, each skill run starts from scratch on visual direction. You have two options:
- Run /design-grill now — 12-question interview that produces the brief (recommended before any UI work)
- Skip for now — skills will ask about visual direction inline when needed"
If user chooses option 1: stop here and instruct them to invoke /design-grill. After the brief is written, re-run /ui-init to complete setup.
If user chooses option 2: note it in the CLAUDE.md section.
Section F — CLAUDE.md / AGENTS.md update
Pick the file to edit:
- If
CLAUDE.mdexists → edit it - Else if
AGENTS.mdexists → edit it - If neither exists → ask which to create. Don't pick for them.
If a ## UI skills section already exists: update it in-place. Don't append a duplicate.
Add this block (adjust based on what was found/installed):
## UI skills
### Visual verification
Playwright is installed for screenshot and animation verification. Chromium browser is available.
Dev server runs on `http://localhost:[PORT]` — all skill scripts default to this URL.
Run `npx playwright install chromium` if screenshots fail.
### Accessibility scanning
axe-core is installed. /a11y uses it for programmatic WCAG 2.1 AA scanning.
### Token home
Design tokens live in `[path to token file]`. /tokens reads and writes here.
[If none: "No token home configured — /tokens will ask at setup time."]
### Internationalisation
[If i18n detected: "/copy detected [library name]. All copy edits go into message files under `[path]`, not hardcoded into component files."]
[If none: "No i18n library detected. /copy edits strings directly in component files."]
### Design brief
[If DESIGN-BRIEF.md exists: "Visual direction is documented in `DESIGN-BRIEF.md`. All UI skills read this before starting."]
[If none: "No design brief yet. Run /design-grill before /uiux or /tokens to establish visual direction."]
### Skills available
| Skill | When to use |
|-------|------------|
| /design-grill | Before any UI work — establishes visual direction and writes DESIGN-BRIEF.md |
| /uiux | Redesign any screen — pixel-perfect, recursive |
| /uicolor | Color correction master — balance, temperature, shadows, hierarchy, 60-30-10 |
| /animate | Add or fix animations and micro-interactions |
| /copy | Audit and rewrite all user-facing strings |
| /a11y | Fix accessibility violations — WCAG 2.1 AA |
| /tokens | Find hardcoded design values and replace with tokens |
| /landing | Optimise a marketing or product landing page for conversion |
4. Done
Tell the user what was set up and what was skipped. Recommend the next step:
- If no design brief: "Run
/design-grillnext to establish visual direction before any skill touches the UI." - If brief exists but no token system: "Run
/tokensnext to build the token system from the existing colors." - If everything is in place: "Setup is complete. You can now run any UI skill. Recommended order for a new project:
/design-grill→/tokens→/uiux→/uicolor→/animate→/copy→/a11y."
Rules
- Explore before acting. Never install or create files without checking first.
- Edit the existing file, don't create a duplicate. If
CLAUDE.mdexists, edit it. If## UI skillsalready exists, update it in-place. - Only install dev dependencies. Playwright and axe-core are
devDependencies— neverdependencies. - Skip what's already correct. Don't reinstall a working Playwright setup.
- Never create
AGENTS.mdifCLAUDE.mdexists (or vice versa). - The
prefers-reduced-motionrule is always added without asking — it's a WCAG requirement, not a preference. - Don't run /design-grill yourself — instruct the user to invoke it. It's a full interactive session that belongs in its own turn.