extract-design
Extract a Google DESIGN.md file from an HTML prototype (claude.ai/design or any styled page) using Puppeteer, producing machine-readable tokens and AI-generated prose. Use when the user has an HTML prototype and wants a DESIGN.md to anchor their project's visual identity, or when seed-conventions has just scaffolded a new project.
- License 许可
- MIT
- 最近更新
- 2026-11-10
- Stars
- ★ 289
- Forks
- 24
01 前言 Front Matter
- name
- extract-design
- model
- sonnet
- description
- Extract a Google DESIGN.md file from an HTML prototype (claude.ai/design or any styled page) using Puppeteer, producing machine-readable tokens and AI-generated prose. Use when the user has an HTML prototype and wants a DESIGN.md to anchor their project's visual identity, or when seed-conventions has just scaffolded a new project.
03 SKILL.md 正文
Extract DESIGN.md from HTML
HARD GATE — Do NOT write DESIGN.md without Puppeteer dual-pass extraction. Tokens from static HTML (Cheerio, regex, string scanning) are invalid — they miss cascade, custom properties, and Tailwind resolution.
HARD GATE — Do NOT claim certainty where evidence is thin. Low-confidence color roles, component classifications, and prose assertions MUST be flagged with
<!-- AGENT NOTE: uncertain — validate during grill-me. Evidence: [what was observed] -->.HARD GATE — Do NOT ship DESIGN.md without running
npx @google/design.md lint. Unvalidated output is unverified output. If lint is unavailable (offline), flag prominently in terminal and in DESIGN.md prose.
Quick Start
# First run — extract from HTML prototype
node extract-design/scripts/extract.js --source ./prototype.html
# From a published URL
node extract-design/scripts/extract.js --source https://my-prototype.example.com
# With a custom name
node extract-design/scripts/extract.js --source ./proto.html --name "My Design System"
# Update — re-extract from new HTML, diff against existing
node extract-design/scripts/extract.js --source ./proto-v2.html
# Lint-only — validate existing DESIGN.md without re-extraction
node extract-design/scripts/extract.js --lint-only
Flow
- Launch Puppeteer — dual-pass (light + dark) with retry + timeout. CI flags:
--headless=new --no-sandbox --disable-gpu --disable-dbus --use-gl=angle --use-angle=swiftshader. - Collect styles —
page.evaluate()collects computed styles from every element. Returns raw JSON to Node.js. Browser = sensor; Node = brain. - Classify tokens — modular pipeline: colors (Material 3 roles), typography (scale detection), spacing (tolerance GCD), rounded (clustering), components (visual signature + pseudo-state variants).
- Generate prose — AI heuristics produce all 8 DESIGN.md sections. Overview and Do's/Don'ts flagged with agent notes.
- Write + validate — serialize to
specs/tech-architecture/DESIGN_LATEST.md, runnpx @google/design.md lint, report to terminal. - Handoff — writes
handoff.next_skill: grill-metospecs/state.yamlwith uncertain decisions context.
Inputs
| Parameter | Required | Description |
|---|---|---|
--source <file|url> |
First run: yes. Update: optional | HTML prototype path or URL |
--name <string> |
No | Design system name (defaults to <title> or directory name) |
--lint-only |
No | Validate existing DESIGN.md without re-extraction |
Output
specs/tech-architecture/DESIGN_LATEST.md— replacesDESIGN_PLAN_LATEST.mdas the canonical design artifact- Terminal summary: token counts, component count, lint result, uncertain decisions
- Structured JSON log to stderr: extraction events, timing, counts
specs/state.yaml→handoff.next_skill: grill-mewith context
Error Tiers
| Tier | Condition | Response |
|---|---|---|
| Fatal | No Chrome, page load timeout after retries | Exit non-zero, suggest fixes |
| Degraded | Zero colors, zero typography, SPA shell | Write DESIGN.md with degradation warning |
| Warned | Lint errors, uncertain decisions | Write DESIGN.md, flag in terminal, hand off to grill-me |
Dependencies
- Puppeteer (Chrome binary) — wrapped behind
BrowserExtractorinterface for testability @google/design.md(soft, vianpx) — wrapped behindDesignValidatorinterface. Warns and skips if offline.
verify
node extract-design/tests/test-extraction.js
See REFERENCE.md for extraction algorithms and heuristics.
Extract Design — Reference
Extraction Algorithms
Color Classification
- Collect unique computed
background-color,color,border-colorfrom every DOM element. - Count frequency and context (text vs. bg vs. border vs. button).
- Classify using Material 3 roles: surface = largest-area bg, on-surface = most-used text, tertiary = highest-saturation on CTAs, error = reddish.
- Surface container levels: luminance-ordered. Hard-cap at 3 unless data supports 5.
- Low-confidence →
<!-- AGENT NOTE -->in Colors prose.
Typography Classification
- Collect unique (fontFamily, fontSize, fontWeight, lineHeight, letterSpacing) tuples.
- Cluster by fontSize (±2px) → type scale.
- Detect heading hierarchy from HTML tag + computed size.
- Name levels: display-lg, headline-lg/md/sm, title-lg, body-lg/md/sm, label-lg/md/sm.
- Parse
<link>and@font-face; warn if computed font differs from declared.
Spacing Classification
- Collect unique padding, margin, gap values. Filter: ignore values < 3 occurrences.
- Compute tolerance-based GCD (0.5px tolerance).
- Declare base unit. Detect half-step if gcd/2 values present ≥3 times.
- Map: unit×1 → sm, ×2 → md, ×4 → lg, ×8 → xl.
Rounded Classification
- Collect unique border-radius values. Cluster (1px tolerance).
- Name: none (0), sm (smallest), md (median), lg (large), xl (largest), full (9999px).
Component Detection
- Button: w<300px, h<64px, bg+radius set, short text. cursor:pointer is bonus.
- Card: bg+radius+padding set, larger area.
- Input:
<input>or<textarea>tag. - Pseudo-state variants: force :hover, :active, :focus for high-confidence components.
Prose Generation
Generates all 8 DESIGN.md sections. Overview and Do's/Don'ts flagged with <!-- AGENT NOTE: Generated from visual analysis. Grill-me should validate. -->.
Material 3 Token Conventions
Colors: primary, on-primary, secondary, tertiary, error, surface, on-surface, surface-container-*, outline, background, on-background. Typography: display-lg/md/sm, headline-lg/md/sm, title-lg/md/sm, body-lg/md/sm, label-lg/md/sm. Rounded: none, xs, sm, md, lg, xl, full.
CI Compatibility
Chrome flags: --headless=new --no-sandbox --disable-gpu --disable-dbus --use-gl=angle --use-angle=swiftshader
Defensive Code
Retry with backoff (3 attempts, 1s/2s/4s), Timeout (30s page load, 10s pseudo-state), Graceful degradation (Tier 2 on empty extraction).
Known Risks
- DESIGN.md spec is alpha. Skill pins to current spec.
- Puppeteer is heavy (~300MB Chrome). Document requirement clearly.
- Prose quality depends on AI heuristics. grill-me is the validation gate.
04 同仓库更多 Skills
skill-verify-fail-open-fixture
Negative-path fixture for run-skill-verify.sh — must never PASS.
negative-path
暂无简介
write-document
Write, organize, and sync high-integrity technical documents using the BMAD methodology. Ensures every document is Bold, Minimal, Actionable, and Durable. Use when creating architectural docs, technical guides, or organizing the specs/ directory.
wire-observability
Add structured JSON logging, observability commands, and idempotent setup scripts to a project. Use when a project needs production-readiness instrumentation, when user wants structured logging, or as a production-readiness gate at any phase of development.
wire-ci
CI pipeline setup with bundled, forge-neutral templates and local validation. Detects the forge from the git remote, generates workflows for supported forges, and skips honestly for the rest. The CI equivalent of wire-observability.
visual-dashboard
Start a browser-based dashboard that visualizes architecture, implementation plans, and project status. Persists artifacts in .bigpowers/dashboard/. Reads specs/state.yaml, release-plan.yaml, epics, and planning-status via HTTP API or opencode panel.