Install any skill in seconds. Free to start, no credit card required.
Get Started Free →asgeirtj/design-sync
Push a React design system to claude.ai/design. This runs a converter that bundles the real component code (from Storybook or a bare package) and uploads it.
Passed 12 of 16 test cases with the skill, and 5 of 16 without it.
and 16 more in the full report
11 fixed5 passed either way4 still failing2 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 10 test cases the skill fixed. Same model, same prompt, with and without the skill.
We have authored a usage conventions header in `.design-sync/conventions.md` for the design agent. What configuration setting in `.design-sync/config.json` connects this file so the README inherits it during build?
| Checked | Without skill | With skill |
|---|---|---|
| Set readmeHeader to .design-sync/conventions.md in .design-sync/config.json. | Missed | Passed |
The instructions your model reads when the skill loads.
Claude Design (claude.ai/design) is Claude's design tool: users prompt a design agent and it builds working UI - screens, flows, prototypes - rendered live in the browser from real React code. Out of the box it designs with generic components. This skill changes that: it converts the user's design-system repo into the format Claude Design consumes and uploads it, so from then on the design agent builds with the customer's actual components - every design it produces is on-brand, made of their real parts, and maps 1:1 onto code their engineers can ship.
That framing should drive every judgment call in this skill, because each uploaded artifact is an input to that agent (or to the humans steering it):
| Uploaded artifact | Consumed by | For |
|---|---|---|
_ds_bundle.js + _vendor/ | the design agent's runtime | every design it produces renders these real compiled components from window.<globalName>.* |
styles.css, fonts/, tokens/, _ds_bundle.css | every rendered design | the look - tokens, fonts, and component styles, all reachable from styles.css's @import closure (designs receive only that closure) |
<Name>.d.ts (<Name>Props) | the design agent | the API contract it codes against |
<Name>.prompt.md | the design agent | its usage reference - how to compose the component, with examples |
<Name>.html preview card | humans in the component picker | how they find components and trust the sync |
_ds_sync.json | future syncs | the sync anchor - content hashes that let a re-sync (any machine) skip re-verifying unchanged components AND compute exactly what to upload/delete |
This is why fidelity is the whole game: a component that renders wrong here renders wrong in every design the agent ever builds with it, and a wrong .d.ts or misleading .prompt.md makes the agent misuse the API everywhere. The verification loops in the sub-skills exist because of this - they are not bureaucracy.
The converter builds all of the above deterministically from the repo's own dist/. With a Storybook, previews come from the repo's stories and are verified against its own storybook render (kept as a local reference, never uploaded). Without one, every component still ships fully functional, and rich previews are authored from the repo's own usage examples for the components the user scopes in, graded on an absolute rubric. Core principle: ship what the customer already built - the bundle is their compiled dist/, never a reimplementation.
You have a DesignSync tool that reads and writes the user's claude.ai/design projects. If a tool call fails with an authorization error, relay its guidance to the user verbatim - the tool's message is environment-aware (in an interactive terminal it names /design-login; in headless sessions like claude.ai/code it points at a path that works there) - and retry after they've acted on it.
A completed sync always leaves .design-sync/config.json holding both a projectId and a pkg. If both are present, this is a re-sync - skip this section (§2 covers honoring prior state). (If design-sync.config.json exists instead - the config's old name and location - move it: mkdir -p .design-sync && mv -n design-sync.config.json .design-sync/config.json, commit the move, then apply the same test.) Anything less - no config at all, or a partial one left by a run that never finished - gets first-time treatment: tell the user up front, before doing anything else:
(If §1 routes this run into an existing project - the user re-adopting one, or a projectId left pinned by an aborted run - parts of this won't apply; scale the expectations to what §1 routes them to.)
Then confirm they want to proceed - this process can use a significant number of tokens (AskUserQuestion: proceed with the full high-fidelity sync, or adjust scope first). If their request already acknowledged the time/cost, note that and continue without re-asking.
If DesignSync isn't already in your tool list, load it via ToolSearch(query: "select:DesignSync") first. A target gets picked one of three ways, in precedence order:
test cases passed, vs 5 / 16 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.