extract-design-system
Skill22 starsChanged 5 months agoMITView on GitHub
Extract a website's FULL design system — tokens AND a curated component catalog (anatomy, variants, hover/focus states, section patterns) — into a bundle a coding agent consumes to build new pages that are native to the source brand. Superset of extract-design-md: use THIS skill when the goal is to build/generate pages that match the source site's components ("clone the design system", "extract components from <url>", "make new pages that look like <site>", "same buttons/cards/sections as <site>"); use extract-design-md when only a DESIGN.md token spec is wanted. Outputs .design_systems/<domain>-YYYYMMDD/ with DESIGN.md + component catalog + reference snippets + section patterns + DTCG tokens + an emitted eval harness. Fixes the "same skin, different skeletons" failure of token-only extraction.
- Installs packages
14 other projects use a version of this.
Adopted by
Most recently taken up by
- podo/design-agent-skillstheir own version, first seen Nov 8, 2026
- Fractera/Agent-Engineering-Infrastructuretheir own version, first seen Nov 8, 2026
- Fractera/Agentic-Engineering-Infrastructuretheir own version, first seen Nov 8, 2026
- therapys/dotagentstheir own version, first seen Nov 1, 2026
- desktop-commander/skillstheir own version, first seen Oct 17, 2026
- jasonfesta/design-agentstheir own version, first seen Oct 15, 2026
Used with
Projects with it also use tailwind-design-system, find-animation-opportunities and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
xfstudioSkilltailwind-design-system
Build scalable design systems with Tailwind CSS, design tokens, component libraries, and responsive patterns. Use when creating component libraries, implementing design systems, or standardizing UI patterns.
Also in 3 projects that use this
wxyhgkSkillfind-animation-opportunities
Search a codebase or UI for places that don't animate but should, and reject everything that shouldn't. Read-only; it proposes motion with exact values, it does not implement it. Use when the user asks "what could be animated here?" or wants to "make this feel more alive". For fixing existing animations, use improve-animations or review-animations instead.
Also in 4 projects that use this
wxyhgkSkillimprove-animations
Survey a codebase's animation and motion code as a senior motion advisor, then produce a prioritized audit and self-contained implementation plans for other agents (or cheaper models) to execute. Read-only on source code — it plans improvements, it does not apply them. Use when the user asks to "improve the animations", "audit the motion", "make this app feel better", or wants a roadmap of animation fixes rather than a review of a single diff.
Also in 4 projects that use this
attentiondotnetSkillanimation-vocabulary
Reverse-lookup glossary that turns a vague description of a web animation or motion effect into its exact term ("the bouncy thing when a popover opens" → Pop in; "the iOS rubber-band scroll" → Rubber-banding). Use when the user asks "what's it called when…", or describes a motion effect without knowing its name and wants the right word to prompt an AI or designer with. For naming an effect, not designing or building one.
Also in 4 projects that use this
cal1888Skillpick-ui-library
Pick the right library for a given frontend task from a curated, opinionated list — numbers, OTP inputs, charts, command menus, virtualization, drag and drop, toasts, state, styling, and more. Only runs when explicitly invoked; it does not trigger on its own.
Also in 3 projects that use this
arkanSkillreview-animations
Reviews animation and motion code against a high craft bar derived from Emil Kowalski's design engineering philosophy. Default to flagging; approval is earned.
Also in 4 projects that use this
Other versions14 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 14
- thedesignproject/agent-skills★ 88same name
- Fractera/Agent-Engineering-Infrastructure★ 61same name
- Fractera/Agentic-Engineering-Infrastructure★ 61same name
- podo/design-agent-skills★ 32same name
- therapys/dotagents★ 8same name
- desktop-commander/skills★ 4same name
- idexal/idexal-skills★ 2same name
- kimtth/agent-skill-100-lines-or-less★ 2same name
- pmatos/skills★ 2same name
- frankxai/blue-life-commons★ 1same name
4 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- ask-firstSkill
- cli-spec-to-goalSkill
- codex-imagegenSkill
- design-system-to-skillSkill
- extract-design-mdSkill
- handoff-docSkill
- orchestrateSkill
- prototype-wpSkill
- validate-block-markupSkill
- webg-spec-to-goalSkill
- wp-requirements-to-goalsSkill
- wp-rest-apiSkill
- wp-spec-to-goalSkill
The file
We split this skill into the rules it gives an agent
3 rules. 0 are common, 2 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 13 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 77
Conflict guard (standing rule): if the output folder exists, ask (overwrite / dated sibling / abort).
- Distinctive: line 169
Contract accuracy (consumers follow these lines literally): every Composition claim must be verifiable in the reference snippet's markup …
- Very specific: line 187
Completeness: every high-count candidate kind is a catalog entry or a reasoned entry in raw/skipped.json.
“Common” is measured: kept by at least 6 in 10 of the 13 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Extract a full design system bundle
Given a live URL, run the 9-stage pipeline and emit a bundle under
.design_systems/<domain>-YYYYMMDD/ (host dots→hyphens). The output bundle layout and the
AGENTS.md consumption template are specified in references/output-bundle-spec.md.
URL ─▶ 1 DISCOVER ─▶ 2 TOKENS ─▶ 3 COMPONENT SWEEP ─▶ 4 CLUSTER + CURATE
─▶ 5 DISTILL ─▶ 6 STATES ─▶ 7 SECTIONS ─▶ 8 SYNTHESIZE ─▶ 9 VALIDATEPrerequisites
This skill drives three external tools — make sure each is available before running:
- playwright-cli on
PATH— the in-browser extraction, component sweep, and screenshots run through it. Install once withnpm install -g @playwright/cli@latestthenplaywright-cli install --skills(needs Node.js 18+). Check:which playwright-cli. - A reachable Firecrawl instance — used for page
discovery (
firecrawl map) and optional copy scraping. The hosted API or a self-hosted / local instance both work; if Firecrawl is unreachable the skill falls back to playwright link discovery (thinner page coverage). Confirm your instance responds before a run. npx(Node.js) — pulls the official@google/design.mdlinter on demand for the quality gate. If it's unavailable the skill writes the files anyway and notes "lint skipped".
If your agent sandboxes network or filesystem access, allow the outbound calls this skill makes (headless browsing, Firecrawl,
npx) before running.
file:// URLs are blocked by playwright-cli — serve local HTML with
python3 -m http.server <port> and kill the server by PID afterwards (a pkill -f pattern can
match your own shell).
Let SKILL = this skill's directory. Session name: S=dsys. Compose→run→slice pattern
for every in-page script:
playwright-cli -s=$S run-code "$(cat script.js)" | bash "$SKILL/scripts/slice-result.sh" > out.jsonTwo scripts are templates with a __-placeholder substituted per page
(distill.js → COMPONENTS, eval-selftest.js → FIXTURES). Compose with
tpl.replace('<placeholder>', JSON), then node --check the result. The placeholder
literal must appear exactly once in each template, in code — never add it to a comment
(this bug has now happened twice).
Flags
| Flag | Default | Effect |
<url> | required | Entry-point URL |
--pages <n> | 5 | Max pages to sample |
--theme <auto|light|dark|both> | auto | Theme handling (as in extract-design-md) |
--no-screenshots | ON | Skip feel/section screenshots; prose leans on tokens+copy |
--out <dir> | .design_systems/<domain>-YYYYMMDD/ | Output folder |
--max-components <n> | 12 | Atom cap after curation (sections capped at 8 separately) |
--components-only | off | Reuse a prior same-domain bundle's tokens+DESIGN prose (needs raw/tokens/*.json + lint-passing DESIGN.md); rerun stages 3–9 only. On a fresh domain: minimal auto-prose with honest lint warnings |
--single-file | off | Additionally emit design-system.full.md (flatten: DESIGN → AGENTS → COMPONENTS → snippets → checklists) |
Conflict guard (standing rule): if the output folder exists, ask (overwrite / dated sibling / abort). Never silently resolve.
Stage 1 — Discover
firecrawl map "<url>" → bucket into slots (home always; pricing/product for cards+
toggles+tables; auth/contact for inputs; blog for prose; brand/about). Component
coverage weights the choice: prefer pages exposing form controls, repeated cards, tables.
Confirm the picked list with the user before crawling. Firecrawl down → try starting it,
else playwright link discovery.
Stage 2 — Tokens
scripts/extract-tokens.js (verbatim from extract-design-md — dual-theme detection and
toggling rules are in that skill's references/edge-cases.md). Run on the homepage per
theme; finalize the token table before stage 5 so distillation can re-tokenize.
Sanity-check varsTotal; thin vars → relax using varsExtra.
Stage 3 — Component sweep (per sampled page)
Scroll the page first to trigger lazy content (step ~900px, then back to top), then run
scripts/extract-components.js. It merges two channels (semantic tags/roles/class-regex
- structural fingerprints), scores component-ness (fake-interactive and sub-10px-font
penalties keep DOM-built demo UIs out), detects the styling regime (tailwind density /
hashed classes / library fingerprints), and returns top-N candidates per kind with
17-dim style vectors. Save one
candidates-<slug>.jsonper page.
Stage 4 — Cluster + curate
node "$SKILL/scripts/cluster.js" candidates-home.json candidates-pricing.json > clusters.jsonDeterministic: greedy-leader clustering (cosine ≥0.95), per-property-mode representative,
catalog gate (≥2 instances site-wide OR semantic/landmark role). Then Claude curates:
name components/variants (class-name hints beat inference: btn--secondary → secondary;
transparent → ghost; most-common → primary), merge duplicates, drop noise, trim to
--max-components, flag low-confidence picks. Output a curated list per page:
[{ name, sel, expectText }] (expectText = the element's leading text, for brittle-selector
re-resolution).
Stage 5+6 — Distill + states (per page)
Compose scripts/distill.js with the page's curated array (each entry may add
budget: <n>; default 12 descendants). Returns per component: simplified HTML with
data-src-class verbatim recipes, default-diffed CSS, CDP authored rules, forced
hover/focus diffs on 13 tracked props, transition. Components that error return
{name, error} — rerun or drop, never crash. Save distilled-<slug>.json.
Stage 7 — Sections (per page)
Scroll first, then run scripts/extract-sections.js → pattern + confidence + skeleton +
atomEvidence per section. Curate: needsSmart (<0.5) entries you label yourself from
heading/atomEvidence/screenshot (may be custom:<name>); override misclassifications;
pick ONE representative per pattern (≤8 total, ranked confidence × instances); log every
skip with a reason (goes to raw/skipped.json). Distill each representative via the
stage-5 template with budget: 40. Screenshot each section crop
(page.locator(sel).scrollIntoViewIfNeeded() then .screenshot()) into
screenshots/sections/.
Stage 8 — Synthesize the bundle
Layout (see references/output-bundle-spec.md for the full spec — read it before writing):
<out>/
├── DESIGN.md # ≤300 lines; extract-design-md prose + `## Component Catalog` table
├── AGENTS.md # consumption protocol (6 imperative steps; template in `references/output-bundle-spec.md`)
├── components/COMPONENTS.md # ~15-line contracts: anatomy, variants×states, usage, screenshots
├── components/*.html + gallery.html
├── tokens/design-tokens.json # DTCG export
├── eval/fixtures.json + checklists.md
├── screenshots/<page>.png + sections/ + states/
└── raw/ # tokens/ candidates/ sections/ distill-log.json skipped.json map.jsonMechanical parts:
node "$SKILL/scripts/build-snippets.js" --tokens tokens.json --out <out>/components \
--source <url> distilled-home.json distilled-pricing.json distilled-sections-*.json
node "$SKILL/scripts/export-dtcg.js" tokens.json <out>/tokens/design-tokens.json --source <url> --theme light
node "$SKILL/scripts/build-fixtures.js" --tokens tokens.json --components <out>/components \
--out <out>/eval/fixtures.json --source <url> --theme light \
home:distilled-home.json pricing:distilled-pricing.json home:distilled-sections-home.json ...Claude-authored parts: DESIGN.md (dual-theme rules as in extract-design-md; add the
Component Catalog table + a section-rhythm paragraph in Layout), COMPONENTS.md (anatomy
from the snippet HTML, variants×states from fixtures/states data, composition+skeleton
lines for sections, low-confidence flags visible), AGENTS.md, eval/checklists.md
(per-component judge rubrics; axis scores recorded separately, never averaged).
Contract accuracy (consumers follow these lines literally): every
Composition claim must be verifiable in the reference snippet's markup (elements seen
elsewhere → marked optional); content-dependent elements (billing toggles, testimonials)
marked conditional — omit, don't invent; prose type-size claims must match the measured
reference, not a plausible generalization.
State screenshot crops: serve <out>/components locally, screenshot the .is-hover/
.is-focus copies into screenshots/states/.
Stage 9 — Validate (all four gates before reporting)
- Lint:
npx -y @google/design.md lint <out>/DESIGN.md— fix structural errors; flag value warnings, never silently delete captured tokens. - Gallery: render
gallery.htmlheadless via the local server; 0 console errors required; screenshot and eyeball against the source screenshots. - Eval self-test: compose
scripts/eval-selftest.jswith fixtures.json; run on every sampled page of the LIVE source. Every check must pass — a failure means the fixture (or extraction) is wrong: fix or drop, never ship a fixture the source itself fails. Archive results toraw/. - Completeness: every high-count candidate kind is a catalog entry or a reasoned
entry in
raw/skipped.json.
Final report
Tight and honest: pages sampled, regime detected, atoms + sections found (counts), curation skips, lint result verbatim, self-test pass counts, fallback paths taken, known gaps (e.g. un-captured selected-state indicators). Never imply fidelity a gate didn't verify.
Ask-first rule (standing)
<95% confident on an ambiguous mapping (which variant is "primary", whether a repeated block is a real pattern, same-day output conflicts) → ask with a recommendation. Sub-agents run sequentially, never in parallel, and must carry the Firecrawl + sandbox rules above.
Bundled files
scripts/extract-tokens.js— stage-2 token extractor (copy of extract-design-md's; keep in sync)scripts/extract-components.js— stage-3 sweep (two channels, scoring, regime detection)scripts/cluster.js— stage-4 deterministic clustering + catalog gate (node CLI)scripts/distill.js— stage-5/6 template (COMPONENTS placeholder; per-entrybudget)scripts/extract-sections.js— stage-7 classifier (self-contained run-code)scripts/build-snippets.js— stage-8 snippet/gallery emitter (node CLI)scripts/export-dtcg.js— stage-8 DTCG export (node CLI)scripts/build-fixtures.js— stage-8 fixtures generator (node CLI; evidence-only assertions)scripts/eval-selftest.js— stage-9 self-test template (FIXTURES placeholder; CIEDE2000, CDP states)scripts/slice-result.sh— strips playwright-cli's markdown wrapper to clean JSONreferences/output-bundle-spec.md— the output bundle layout + AGENTS.md consumption template. Read before Stage 8.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

