From implement-design
Turns a Figma URL into fully implemented components: scaffolded, styled with tokens, visually validated, tested, documented, and reviewed. Supports Lit and Angular.
How this skill is triggered — by the user, by Claude, or both
Slash command
/implement-design:implement-design <figma-url><figma-url>The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the coordinator for the `/implement-design` pipeline (see `vision.md` in this skill's folder). **All user input is gathered up front in Stage 0.** After that, the pipeline runs **standalone** to completion — no further questions — and presents one final report at the end.
You are the coordinator for the /implement-design pipeline (see vision.md in this skill's folder). All user input is gathered up front in Stage 0. After that, the pipeline runs standalone to completion — no further questions — and presents one final report at the end.
Figma URL: $ARGUMENTS
Working directory for all run artifacts: .implement-design/<run>/ at the project root, where <run> is a unique folder. Derive <file-slug> by kebab-casing the Figma file name from the URL (e.g. Test-CC → test-cc), then pick the smallest integer suffix -N (from 1) for which .implement-design/<file-slug>-N/ doesn't exist. Create it at the start (and make sure .implement-design/ is ignored — add it to the project's .gitignore if it isn't); everything for the run lives there:
screenshot.png — the cached Figma reference (ground truth).manifest.md — design manifest + decomposition + localized strings.figma-metadata.json, figma-code-connect-map.json, figma-design-context.md, figma-variable-defs.json — the raw output of the analyst's Figma calls (written by design-analyst, for reproducibility).testing/ — all screenshots and scratch artifacts taken during implementation/validation (written by visual-validator). Keeps validation output out of the run root.Plugin paths. This skill is installed as part of a plugin, together with the pipeline's agents and supporting files. Let <skill-dir> be the absolute path of the folder containing this SKILL.md, and <skills> its parent (the plugin's skills/ folder). The agents cannot guess where the plugin is installed, so pass each agent the absolute path(s) it needs when you spawn it:
design-analyst → the manifest schema: <skill-dir>/design-manifest.schema.mdcomponent-implementer and component-author → the chosen framework skill: <skills>/implement-design-lit/SKILL.md or <skills>/implement-design-angular/SKILL.md (each of which references <skill-dir>/component-conventions.md, so pass that path too)component-reviewer → the conventions: <skill-dir>/component-conventions.mdRead <skill-dir>/component-conventions.md once up front yourself so you can sanity-check agent output.
Validate the URL is a figma.com/design/... link. If not, ask for a corrected URL and stop.
Ask all setup questions in one batch (in Claude Code: a single AskUserQuestion call, up to 4 questions; in other tools: one consolidated message listing every question). Carry every answer through the rest of the run:
figma-desktop (recommended; most reliable for get_code_connect_map; needs the desktop app open with the file) or figma (remote; headless, but get_code_connect_map is unreliable). Governs get_metadata / get_code_connect_map / get_design_context; get_screenshot always uses the remote figma server (only it returns a cacheable PNG).lit (default) or angular. Determines which framework skill the implementers load and how components are scaffolded.@lit/localize msg(); Angular: $localize/i18n). Source locale is en; a non-English design has its strings translated to English for the source.packages/components/ (flat packages, reusable design-system components) or an app/example path like examples/ (app-specific, nested under a root folder). The pipeline derives the root component name from the decomposition and places components accordingly.Once answered, do not ask anything else — proceed through every stage autonomously. Exceptional blockers (below) are the only things that can halt the run; otherwise carry on and report at the end.
<run> folder. Spawn design-analyst (as a subagent — in Claude Code via the Agent tool; in Copilot via subagent delegation; the same applies to every "spawn" below) with the URL, the chosen server, the <run> path, and the manifest-schema path. It caches the screenshot there and writes the raw output of each Figma call (figma-metadata.json, figma-code-connect-map.json, figma-design-context.md, figma-variable-defs.json) into the same folder. It returns a design manifest, or BLOCKED_ON_CODE_CONNECT + node list, or BLOCKED_ON_MCP + error.BLOCKED_ON_MCP: re-spawn the analyst up to 2 more times (brief waits). If still failing, halt and report the server is unreachable (this can't be resolved standalone) — show the error and suggest claude mcp list / re-auth / opening the desktop app.BLOCKED_ON_CODE_CONNECT: the design has unconnected component instances that need Code Connect mappings published in Figma — a human action the pipeline can't do. Halt and report the blocked-node list so the user can publish mappings and re-run.component-decomposer with the manifest, the i18n decision, and the framework. It returns the component tree, per-component APIs (with data ownership + nested default locations), a Shared Types / Contracts section (every interface that crosses a component boundary — its fields + which component exports it), open questions, and — if i18n is on — the localized-strings table. Proceed automatically (no approval checkpoint). For each open question, pick a sensible default and proceed; record both the question and the default you chose for the final report.manifest.md into the <run> folder (design manifest + decomposition + localized strings).sl-, kebab-cased, as the folder; children nested under it — unless the location is the flat packages/components/ monorepo, where each is a sibling package)..css imported with { type: 'css' } — no style-build step. Children take a cohesive model object, not a pile of scalar props.tsc standalone (no tsconfig until the package is wired), so after all implementers return, run one package-wide check yourself — npx tsc -p <package>/tsconfig.json --noEmit — and route any errors back to the responsible implementer (cap one retry each). Two hard gates that block Stage 4:
tsc exit 0).msg(… { id: '…' }) id and diff it against the decomposer's localized-strings table, both directions — a generated id missing from the table is drift; a table id with no matching literal generated id usually means the implementer used a variable msg(x, { id: y }) (which lit-localize can't extract — a real bug). Route either back. Don't enter Stage 4 until both gates pass.
Note flagged spec gaps for the final report.yarn start Storybook; Angular: the Angular Storybook / dev server per the Angular skill) in the background and wait until ready.visual-validator for each such component with the component + its story id (from Stage 3), the URL, the <run> path, and the breakpoints. It reads the reference at <run>/screenshot.png and the intended values from <run>/manifest.md (Token Reference + per-component specs), and writes all its captures into <run>/testing/. It returns MATCH or NEEDS_WORK + discrepancies — and its MATCH must be backed by the measured comparison table (per-element built-vs-expected), not a gestalt impression.NEEDS_WORK: re-spawn the responsible implementer with the notes, then re-run the validator. With plain .css (imported via { type: 'css' }) and Lit, edits hot-reload in the running dev server — do not restart Storybook, and there's no style-build step to redo. If a discrepancy traces to a composed SLDS component's own built-in behavior (e.g. a collapse threshold, a slot you didn't use), tell the implementer to read that component's source/stories for the right API rather than re-tweaking CSS. Cap at 3 iterations per component; if still diverging, record a handoff note and move on.component-author for it (parallel across components), passing the framework + the framework-skill path, the i18n decision, and the output location. The basic story already exists (Stage 3); the author scopes its work to where the code lives:
packages/components/* (published package): write the Vitest spec, add variant stories, write website docs, add a changeset, run the tests, and — when i18n is on — run yarn extract-i18n so the new msg() ids land in the locale files.examples/ or another app path: produce only what that location uses — typically just enrich the story (variants/states); skip tests/website-docs/changeset (and i18n extraction) unless the neighbouring code there has them. Don't force the published-package set onto an example.component-implementer, then re-run Stages 4–5 for that component.component-reviewer, passing the package path, the output location (so it scopes published-package-only checks correctly), and the conventions path (see "Plugin paths"). It returns a punch list split into [CRITICAL] and [MINOR].git status and confirm nothing landed outside the intended trees (the <run> folder and the generated component path) — in particular no scratch screenshots at the repo root; remove any that slipped out. Then present one summary: components created (paths), framework, manifest location, validator verdicts, test results, unresolved handoff notes, the decomposer's open questions with the default you chose for each, and the [MINOR] punch list (suggest these as PR comments). Do not open a PR or commit unless asked.design-analyst, component-implementer, …); your tool may list them with a plugin namespace prefix (e.g. implement-design:design-analyst). Use the name exactly as it appears in your agent list.<run> folder: Figma call outputs + manifest + reference screenshot at the root, and every screenshot/scratch file from implementation or validation under <run>/testing/. Pass <run> to any agent that reads or writes these.npx claudepluginhub sl-design-system/components --plugin implement-designImplement UI from design sources (Figma, Sketch, MasterGo, etc.) into production-ready frontend components. Reuses existing components, maps design tokens, ensures accessibility and type safety.
Automates design handoff from Figma to code: extracts tokens, maps components, detects drift, and generates implementation plans. Reduces handoff time from hours to minutes.