/design-screen Skill
Purpose
Coordinates the human-in-the-loop visual design phase that lives between text-only flow specs (ux-agent) and code (flutter-agent / react-agent). Wraps the Claude Design ↔ codebase round-trip in two commands so the workflow is repeatable and the context survives session boundaries.
This skill does NOT replace human visual iteration in Claude Design — that's the value-add. It removes the boilerplate around it: prompt construction, state persistence, bundle fetching, agent briefing.
Reference architecture: agentteamland/workspace/.atl/docs/design-workflow.md (the canonical decision record). Pilot evidence: <test-project>/.claude/design/login/pilot-findings.md (2026-04-19).
Two Modes
The first arg switches mode: start or done.
/design-screen start "<one-line description of the screen>"
/design-screen done <handoff-url-from-claude-design>
Mode 1 — start
Flow
Derive slug. Take the description, produce a kebab-case slug (e.g., "tasks empty state with start CTA" → tasks-empty-state). Keep it short (3–5 words). On collision with an existing .claude/design/{slug}/ directory, append -2, -3, etc.
Read project context.
- Tokens: locate
flutter/lib/app/theme.dart (Flutter), web/tailwind.config.ts (React), or equivalent.
- UX flow: scan
.atl/docs/coding-standards/, .atl/wiki/, and any flow-*.md for related screen flows.
- Existing design records:
.claude/design/*/intent.md to detect related work.
AskUserQuestion to fill gaps (only ask what isn't already inferable):
- Target platform: Flutter mobile / React admin / React public (if project has more than one and the description doesn't pin it down).
- States to render: empty / loading / error / data / submitting / success / disabled / etc. (multiSelect; offer the typical set, let user add custom).
- Actions on this screen: list (free text or multiSelect; mention things the screen lets the user do — submit, cancel, navigate, share, etc.).
- Copy decisions: title, subtitle, CTA labels, error message tone (formal/friendly), placeholder text. Ask one question per copy slot if not in the description.
- Reference screens: any existing screen the new one should visually echo.
Construct the Claude Design prompt. 5–8 sentences. Must include:
- What screen + what app (so Claude Design grounds in identity).
- Target platform explicitly.
- States to render, listed.
- User actions, listed.
- Token reference path (e.g., "honor tokens in
flutter/lib/app/theme.dart").
- UX flow reference if one exists.
- What NOT to invent (e.g., "use only icons available in Material 3"; pilot lesson).
Write .claude/design/{slug}/intent.md with status: pending-design and the schema below. Detailed, not summarized — verbatim user description, every AskUserQuestion answer as-given, full prompt text. A fresh Claude session reading this file later must be able to resume cold.
Print the prompt to the user, plus the next step:
Prompt ready. Open https://claude.ai/design and paste this in. Iterate visually
until you're satisfied. When you have the handoff URL (or you've downloaded
the zip and have its file path), run:
/design-screen done <handoff-url-or-zip-path>
intent.md schema (mandatory shape, all sections required)
---
status: pending-design
slug: {kebab-slug}
created: {ISO-8601 timestamp UTC}
description: "{user's verbatim one-liner from the start command}"
target: flutter | react-admin | react-public
---
# {Screen / surface display title}
## User's Original Description (verbatim)
> {exact quote of the description arg}
## Requirements (gathered via AskUserQuestion)
### States
- {as-given verbatim}
### Actions
- {as-given verbatim}
### Copy decisions
- title: "{verbatim}"
- subtitle: "{verbatim}"
- {other slots: verbatim}
### Target platform
{user-selected value}
### Reference screens
{list, or "none cited"}
## Token & flow references read
- tokens file: `{path}`
- ux flow doc: `{path or "none recorded"}`
- related design records: `{paths or "none"}`
## Derived prompt (sent to Claude Design)
{full prompt text — exactly what user pastes}
## Status log
- {ISO timestamp} — created (status: pending-design). Prompt handed to user.
No paraphrasing in the body. If the user said "users should be able to retry", do NOT write "supports retry" — write the verbatim quote. Detail discipline matters because the file is the only context bridge between Phase A and Phase B (sometimes weeks apart).
Mode 2 — done
Flow
Locate pending designs. Scan .claude/design/*/intent.md; collect every file with status: pending-design.
Resolve which one is being integrated:
- 0 found → Error: "No pending designs. Did you mean
/design-screen start \"<description>\"?" Stop.
- 1 found → Use it. Tell the user: "Integrating design
{slug} (created {date})." Proceed.
- N found →
AskUserQuestion: "Which pending design is this handoff for?" with options listing each {slug} — {description} ({created date}). Use the chosen one.
Read the chosen intent.md. Now you have full Phase A context: what the screen is, who it's for, what the prompt was, what tokens were referenced, every requirement.
Fetch the handoff bundle. The done arg is either:
- A URL like
https://api.anthropic.com/v1/design/h/{id}?open_file=... → use Bash curl -L -o {tempdir}/bundle.zip "{url}" to download.
- A local file path to a downloaded zip → use it directly.
Extract to .claude/design/{slug}/{YYYY-MM-DD}-v{N}-extracted/ (where N is the next available version number). Save the original zip alongside as {YYYY-MM-DD}-v{N}-handoff.zip.
Save snapshot exports if the bundle includes a renderable HTML or PDF (per Q4 versioning convention from the design-workflow doc): .claude/design/{slug}/{YYYY-MM-DD}-v{N}.{html,pdf}.
Brief the implementation agent. Pick:
target: flutter → flutter-agent (Agent tool, subagent_type=flutter-agent)
target: react-admin or react-public → react-agent
The brief MUST be self-contained. Do not say "implement this bundle" — the pilot established that blind briefs are insufficient. Include in the brief:
- The screen name and intent (from
intent.md).
- The verbatim Phase A requirements (states, actions, copy decisions).
- The extracted bundle path.
- Pointer to the agent's own
claude-design-handoff.md children file (which spells out translation rules — SVG icon substitution, idiomatic state mapping, token resolution, ARB key extraction for Flutter / namespace placement for React).
- Any project-specific conventions worth flagging (e.g., "this project uses Riverpod; map React state to Notifier patterns").
Update intent.md:
- Frontmatter:
status: integrated.
- Append to status log:
{timestamp} — integrated (status: integrated). Handoff: {URL or zip path}. Extracted: {extracted-path}. Agent: {flutter-agent|react-agent}. Notes: {agent-output-summary or "see git diff"}.
Show the user a summary of what changed (agent output highlights, files touched, fidelity match if observable, any frictions encountered).
Important Rules
State lives in files. Never rely on conversation memory between start and done — the gap could be minutes or weeks. The intent.md file is the only contract.
Detail over summary in intent.md. Verbatim user input. Future-Claude readability is the test.
Slug derivation never asks the user. Pick a kebab-case slug from the description; collision suffix on conflict. Mirrors /brainstorm skill's auto-naming.
No new agent invented. This skill orchestrates; existing agents implement. The visual-iteration step is human-only by design.
Self-contained brief to the implementation agent. Pilot lesson: blind "implement this bundle" is insufficient. Always pass the intent + the agent's translation guidance pointer.
Versioning is per-screen, not global. Each screen's .claude/design/{slug}/ accumulates v1, v2, v3 over time as the design iterates.
Handoff bundle is React+HTML, not Dart. Even for Flutter targets. Translation is part of the workflow; flutter-agent's claude-design-handoff.md covers the patterns. Do NOT promise the user "Dart code is coming directly from Claude Design."
Don't promise visual perfection. Pilot showed 4/5 fidelity is the realistic target. Brand glyphs, animation curves, subpixel color blends will diverge by ~1–5%. This is fine.
What This Skill Does NOT Do
- Open
claude.ai/design in a browser. (User does that manually after start. A future Phase 3 may add this via Chrome MCP if Claude Design's DOM stabilizes.)
- Iterate the design. (Human-in-the-loop; the value-add of the visual phase.)
- Decide platform target on user's behalf when ambiguous. (AskUserQuestion handles it.)
- Skip the AskUserQuestion gathering even when the description seems complete. (One question per slot is acceptable; better to over-capture than under-capture in intent.md.)
- Auto-trigger CI / lint /
flutter gen-l10n after agent implementation. (Implementation agent's job per its own conventions.)
Accumulated Learnings
(Auto-rebuilt by /save-learnings from learnings/*.md frontmatter. Do not edit by hand. Initially empty — entries appear as the skill encounters reusable edge cases.)
1---2name: design-screen3description: Orchestrate the Claude Design loop for a new screen. /design-screen start "<one-line description>" → derives slug, gathers requirements, builds a token-aware prompt, writes intent.md (status: pending-design), hands prompt to user. /design-screen done <handoff-url> → finds the matching pending design (or asks if multiple), fetches the handoff bundle, extracts it, hands a self-contained brief to flutter-agent or react-agent for integration. State persists in .claude/design/{slug}/intent.md across sessions — full Phase A context survives compactions and restarts.4---56# /design-screen Skill78## Purpose910Coordinates the human-in-the-loop visual design phase that lives between text-only flow specs (ux-agent) and code (flutter-agent / react-agent). Wraps the Claude Design ↔ codebase round-trip in two commands so the workflow is repeatable and the context survives session boundaries.1112This skill does NOT replace human visual iteration in Claude Design — that's the value-add. It removes the boilerplate around it: prompt construction, state persistence, bundle fetching, agent briefing.1314> **Reference architecture:** `agentteamland/workspace/.atl/docs/design-workflow.md` (the canonical decision record). Pilot evidence: `<test-project>/.claude/design/login/pilot-findings.md` (2026-04-19).1516## Two Modes1718The first arg switches mode: `start` or `done`.1920```21/design-screen start "<one-line description of the screen>"22/design-screen done <handoff-url-from-claude-design>23```2425---2627## Mode 1 — `start`2829### Flow30311. **Derive slug.** Take the description, produce a kebab-case slug (e.g., "tasks empty state with start CTA" → `tasks-empty-state`). Keep it short (3–5 words). On collision with an existing `.claude/design/{slug}/` directory, append `-2`, `-3`, etc.32332. **Read project context.**34 - Tokens: locate `flutter/lib/app/theme.dart` (Flutter), `web/tailwind.config.ts` (React), or equivalent.35 - UX flow: scan `.atl/docs/coding-standards/`, `.atl/wiki/`, and any `flow-*.md` for related screen flows.36 - Existing design records: `.claude/design/*/intent.md` to detect related work.37383. **AskUserQuestion to fill gaps** (only ask what isn't already inferable):39 - **Target platform**: Flutter mobile / React admin / React public (if project has more than one and the description doesn't pin it down).40 - **States to render**: empty / loading / error / data / submitting / success / disabled / etc. (multiSelect; offer the typical set, let user add custom).41 - **Actions on this screen**: list (free text or multiSelect; mention things the screen lets the user do — submit, cancel, navigate, share, etc.).42 - **Copy decisions**: title, subtitle, CTA labels, error message tone (formal/friendly), placeholder text. Ask one question per copy slot if not in the description.43 - **Reference screens**: any existing screen the new one should visually echo.44454. **Construct the Claude Design prompt.** 5–8 sentences. Must include:46 - What screen + what app (so Claude Design grounds in identity).47 - Target platform explicitly.48 - States to render, listed.49 - User actions, listed.50 - Token reference path (e.g., "honor tokens in `flutter/lib/app/theme.dart`").51 - UX flow reference if one exists.52 - What NOT to invent (e.g., "use only icons available in Material 3"; pilot lesson).53545. **Write `.claude/design/{slug}/intent.md`** with `status: pending-design` and the schema below. **Detailed, not summarized** — verbatim user description, every AskUserQuestion answer as-given, full prompt text. A fresh Claude session reading this file later must be able to resume cold.55566. **Print the prompt to the user**, plus the next step:57 ```58 Prompt ready. Open https://claude.ai/design and paste this in. Iterate visually59 until you're satisfied. When you have the handoff URL (or you've downloaded60 the zip and have its file path), run:6162 /design-screen done <handoff-url-or-zip-path>63 ```6465### `intent.md` schema (mandatory shape, all sections required)6667```markdown68---69status: pending-design70slug: {kebab-slug}71created: {ISO-8601 timestamp UTC}72description: "{user's verbatim one-liner from the start command}"73target: flutter | react-admin | react-public74---7576# {Screen / surface display title}7778## User's Original Description (verbatim)7980> {exact quote of the description arg}8182## Requirements (gathered via AskUserQuestion)8384### States85- {as-given verbatim}8687### Actions88- {as-given verbatim}8990### Copy decisions91- title: "{verbatim}"92- subtitle: "{verbatim}"93- {other slots: verbatim}9495### Target platform96{user-selected value}9798### Reference screens99{list, or "none cited"}100101## Token & flow references read102103- tokens file: `{path}`104- ux flow doc: `{path or "none recorded"}`105- related design records: `{paths or "none"}`106107## Derived prompt (sent to Claude Design)108109```110{full prompt text — exactly what user pastes}111```112113## Status log114115- {ISO timestamp} — created (status: pending-design). Prompt handed to user.116```117118**No paraphrasing in the body.** If the user said "users should be able to retry", do NOT write "supports retry" — write the verbatim quote. Detail discipline matters because the file is the only context bridge between Phase A and Phase B (sometimes weeks apart).119120---121122## Mode 2 — `done`123124### Flow1251261. **Locate pending designs.** Scan `.claude/design/*/intent.md`; collect every file with `status: pending-design`.1271282. **Resolve which one is being integrated:**129 - **0 found** → Error: "No pending designs. Did you mean `/design-screen start \"<description>\"`?" Stop.130 - **1 found** → Use it. Tell the user: "Integrating design `{slug}` (created {date})." Proceed.131 - **N found** → `AskUserQuestion`: "Which pending design is this handoff for?" with options listing each `{slug} — {description} ({created date})`. Use the chosen one.1321333. **Read the chosen `intent.md`.** Now you have full Phase A context: what the screen is, who it's for, what the prompt was, what tokens were referenced, every requirement.1341354. **Fetch the handoff bundle.** The `done` arg is either:136 - A URL like `https://api.anthropic.com/v1/design/h/{id}?open_file=...` → use `Bash curl -L -o {tempdir}/bundle.zip "{url}"` to download.137 - A local file path to a downloaded zip → use it directly.1381395. **Extract** to `.claude/design/{slug}/{YYYY-MM-DD}-v{N}-extracted/` (where N is the next available version number). Save the original zip alongside as `{YYYY-MM-DD}-v{N}-handoff.zip`.1401416. **Save snapshot exports** if the bundle includes a renderable HTML or PDF (per Q4 versioning convention from the design-workflow doc): `.claude/design/{slug}/{YYYY-MM-DD}-v{N}.{html,pdf}`.1421437. **Brief the implementation agent.** Pick:144 - `target: flutter` → `flutter-agent` (Agent tool, subagent_type=flutter-agent)145 - `target: react-admin` or `react-public` → `react-agent`146147 **The brief MUST be self-contained.** Do not say "implement this bundle" — the pilot established that blind briefs are insufficient. Include in the brief:148 - The screen name and intent (from `intent.md`).149 - The verbatim Phase A requirements (states, actions, copy decisions).150 - The extracted bundle path.151 - Pointer to the agent's own `claude-design-handoff.md` children file (which spells out translation rules — SVG icon substitution, idiomatic state mapping, token resolution, ARB key extraction for Flutter / namespace placement for React).152 - Any project-specific conventions worth flagging (e.g., "this project uses Riverpod; map React state to Notifier patterns").1531548. **Update `intent.md`:**155 - Frontmatter: `status: integrated`.156 - Append to status log: `{timestamp} — integrated (status: integrated). Handoff: {URL or zip path}. Extracted: {extracted-path}. Agent: {flutter-agent|react-agent}. Notes: {agent-output-summary or "see git diff"}.`1571589. **Show the user a summary** of what changed (agent output highlights, files touched, fidelity match if observable, any frictions encountered).159160---161162## Important Rules1631641. **State lives in files.** Never rely on conversation memory between `start` and `done` — the gap could be minutes or weeks. The intent.md file is the only contract.1651662. **Detail over summary in intent.md.** Verbatim user input. Future-Claude readability is the test.1671683. **Slug derivation never asks the user.** Pick a kebab-case slug from the description; collision suffix on conflict. Mirrors `/brainstorm` skill's auto-naming.1691704. **No new agent invented.** This skill orchestrates; existing agents implement. The visual-iteration step is human-only by design.1711725. **Self-contained brief to the implementation agent.** Pilot lesson: blind "implement this bundle" is insufficient. Always pass the intent + the agent's translation guidance pointer.1731746. **Versioning is per-screen, not global.** Each screen's `.claude/design/{slug}/` accumulates v1, v2, v3 over time as the design iterates.1751767. **Handoff bundle is React+HTML, not Dart.** Even for Flutter targets. Translation is part of the workflow; flutter-agent's `claude-design-handoff.md` covers the patterns. Do NOT promise the user "Dart code is coming directly from Claude Design."1771788. **Don't promise visual perfection.** Pilot showed 4/5 fidelity is the realistic target. Brand glyphs, animation curves, subpixel color blends will diverge by ~1–5%. This is fine.179180## What This Skill Does NOT Do181182- Open `claude.ai/design` in a browser. (User does that manually after `start`. A future Phase 3 may add this via Chrome MCP if Claude Design's DOM stabilizes.)183- Iterate the design. (Human-in-the-loop; the value-add of the visual phase.)184- Decide platform target on user's behalf when ambiguous. (AskUserQuestion handles it.)185- Skip the AskUserQuestion gathering even when the description seems complete. (One question per slot is acceptable; better to over-capture than under-capture in intent.md.)186- Auto-trigger CI / lint / `flutter gen-l10n` after agent implementation. (Implementation agent's job per its own conventions.)187188## Accumulated Learnings189190(Auto-rebuilt by /save-learnings from `learnings/*.md` frontmatter. Do not edit by hand. Initially empty — entries appear as the skill encounters reusable edge cases.)