Install any skill in seconds. Free to start, no credit card required.
Get Started Free →통합 디자인 워크플로 스킬 — Path A(Claude Design 핸드오프 번들 가져오기, 필요시 Figma 추출기 경유)와 .moai/design/(research·system·spec)에서 design-brief 컨텍스트 로딩을 처리합니다. DTCG 토큰을 검증하고 브랜드 컨텍스트 헌법 우선순위를 보장합니다. /moai design 워크플로에 사용 — 일반 디자인 시스템 문서용이 아닙니다.
.claude/skills/modu-ai-design-workflow/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 182% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 161% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 830% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 122% | 0% |
> ⚠️ 개발 런타임 전용 — 이 스킬은 MoAI-ADK(Claude Code) 환경을 전제한다. Claude Cowork(Desktop)에서는 .moai/config 의존으로 동작하지 않을 수 있다. Desktop 사용자는 cd-* 체인(design-brief → design-prompt-builder → design-slop-check)을 사용한다.
design-workflow)Unified /moai design workflow skill. Handles two complementary responsibilities:
B1 (Figma extractor via meta-harness). Produces DTCG-validated design tokens at .moai/design/tokens.json for expert-frontend consumption.
.moai/design/(spec.md, system.md, research.md) into the orchestrator prompt before expert-frontend or design-brand-system runs.
Brand context (.moai/project/brand/) is the constitutional parent across all paths — no path may override brand constraints (design constitution §3.1, §3.3).
Reserved output paths (design constitution §3.2, must not collide with human files): tokens.json, components.json, assets/, import-warnings.json, brief/BRIEF-*.md, copy.json, path-selection.json — all under .moai/design/.
Path selection (presented via AskUserQuestion when /moai design needs choice):
moai-harness-figma-extractor dynamicallySelection persisted to .moai/design/path-selection.json.
Context-loading priority order (REQ-2 / AC-4 from absorbed design-context skill): spec > system > research. When token budget exceeded, drop in REVERSE priority — never drop spec. Default token_budget: 20000 from design.yaml design_docs.token_budget.
Token estimation: estimated_tokens = ceiling(char_count / 4) * 1.10.
Supported formats (Phase 1):
ZIP — Claude Design export with manifest.json, tokens.json, components/, assets/HTML — single-file Claude Design exportUnsupported (Phase 2 roadmap): DOCX, PPTX, PDF, Canva link — return DESIGN_IMPORT_UNSUPPORTED_FORMAT and guide to Path B.
Version whitelist: Check manifest.json format_version against supported_bundle_versions in .moai/config/sections/design.yaml. Current default: ["1.0"]. Mismatch → DESIGN_IMPORT_UNSUPPORTED_VERSION.
Parsing flow:
DESIGN_IMPORT_NOT_FOUND if missingPK\x03\x04 for ZIP, DOCTYPE/<html for HTML).sh, .exe,.bat, .cmd, .ps1, .py, .rb, .pl), symlinks, path traversal (../, ..\), absolute paths → DESIGN_IMPORT_SECURITY_REJECT
manifest.json, validate versiontokens.json → .moai/design/tokens.json; components/ → components.json;assets/** → .moai/design/assets/; copy.json → .moai/design/copy.json
colors, typography, spacing); missingkeys → warning, not failure
Expected ZIP structure: manifest.json (format_version, claude_design_version, created_at) + tokens.json (colors, typography, spacing, radii, shadows) + optional components/ (HTML or JSON specs) + optional assets/ (images, fonts, icons) + optional copy.json (structured copy).
Output token schema (normalized to MoAI): top-level keys colors, typography, spacing, radii, shadows, plus source: "claude-design-bundle" and bundle_version.
Field normalization (silent rename, logged in import-warnings.json): primary_color/brand_color → colors.primary; heading_font → typography.fontFamily.heading; base_spacing → spacing.base.
Asset safety: Validate image MIME (png, jpg, gif, webp, svg, ico) and font formats (woff2, woff, ttf, otf). Reject nested ZIPs. Strip script tags from SVG metadata.
Prerequisite: the harness policy moai-meta-harness. Path B1 does NOT ship a static Figma skill — it is generated dynamically. When user selects Path B1, invoke moai-meta-harness to generate .claude/skills/harness-figma-extractor/SKILL.md (project-scoped and user-owned via harness-* prefix — moai update never overwrites). Meta-harness Phase 5 (Customization) collects via Socratic interview: Figma file ID, page selectors mapping pages to token categories, credential reference (env var name like FIGMA_TOKEN; value NEVER stored in skill file). Generated extractor produces tokens.json + components.json at .moai/design/; DTCG validation runs before expert-frontend consumption.
Auto-loads human-authored briefs during Phase B2.5 of /moai design when design_docs.auto_load_on_design_command: true. Can also be invoked standalone with explicit dir argument.
Configuration resolution: Read design_docs from .moai/config/sections/design.yaml. If absent, use compiled-in defaults:
dir: .moai/designauto_load_on_design_command: truetoken_budget: 20000priority: [spec, system, research]Log design_docs not configured — using defaults when key absent.
Bare-token → filename mapping:
spec → <dir>/spec.mdsystem → <dir>/system.mdresearch → <dir>/research.mdSteps:
<dir>/. Missing → emit header only and logdesign docs not initialized — run /moai init or SPEC-DESIGN-DOCS-001 to create.
auto_load_on_design_command. False → skip._TBD_ files: A file with only scaffold content (lines blank, _TBD_,headings without bodies, or <!--/> comments) is skipped. Log skip: <token> — _TBD_ only.
estimated_tokens would exceed budget. Overflow → drop lowest priority (research first, then system; never spec). Single file too large → truncate at nearest ##/### boundary and append > truncated: <filename> at char_offset=N.
.moai/design/). For each file, prepend > source: .moai/design/<filename> then content (or truncated).
> warnings: [<token1> unreadable: <reason>, ...] after the content.
All-_TBD_ case: header-only output + log design docs present but all are _TBD_ — no content loaded.
DESIGN_IMPORT_NOT_FOUND — bundle path missing → guide to Path BDESIGN_IMPORT_UNSUPPORTED_FORMAT — non-ZIP/HTML → guide to Path BDESIGN_IMPORT_UNSUPPORTED_VERSION — version not in whitelist. Required stderr (all 3lines mandatory): Detected bundle version: v<N>; Supported versions: <list from design.yaml>; Switch to path B: run /moai design and select 'Code-based brand design'.
DESIGN_IMPORT_SECURITY_REJECT — executables/symlinks/traversal/absolute pathsdetected. List offending entries. Do NOT create .moai/design/ directory.
DESIGN_IMPORT_MISSING_MANIFEST — ZIP without manifest.json → guide to Path BFallback guidance appended to every error: instruct user to run /moai design and select "Code-based brand design (design-brand-system)" after ensuring .moai/project/brand/visual-identity.md is complete.
Valid bundle missing optional components → extract what's available, log warnings to .moai/design/import-warnings.json, proceed with partial output. Never silent failure.
design-brand-system (Path B fallback / context consumer), design-handoff (produces claude-design-handoff/ for Path A), design-iteration-loop (uses tokens + context as baseline), moai-meta-harness (generates figma extractor for Path B1), expert-frontend (primary consumer), .claude/rules/moai/design/constitution.md (brand priority + reserved paths).
_TBD_ means scaffold-only. Skip to avoid polluting the prompt.../, symlinks, or executables acceptedmanifest.json version validation bypassed## Design Context (from .moai/design/)spec.md dropped when budget exceeded (priority violation).moai/design/ reserved path set.. and symlinks.moai/design/tokens.json with normalized schemamoai-meta-harness (no static skill)## Design Context (from .moai/design/)> truncated: <filename> at char_offset=N_TBD_ case emits header + log onlyREQ coverage: (internal provenance omitted)..003, (Path A); REQ-1..16 (context).
<!-- absorbed from design-workflow-import + design-workflow-context per the skill consolidation policy -->
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | fail→fail | 12,137 | 14,990 | +24% | 1 | 1 | 0% | 1,397 | 3,745 | +168% | 0 | 0 | — |
case-01 | fail→fail | 10,834 | 19,600 | +81% | 1 | 1 | 0% | 335 | 3,619 | +980% | 0 | 0 | — |
case-02 | fail→fail | 20,830 | 20,442 | -2% | 1 | 1 | 0% | 3,038 | 3,974 | +31% | 0 | 0 | — |
case-03 | fail→fail | 65,577 | 15,993 | -76% | 1 | 1 | 0% | 3,368 | 3,495 | +4% | 0 | 0 | — |
case-04 | fail→fail | 11,785 | 20,463 | +74% | 1 | 1 | 0% | 2,245 | 4,036 | +80% | 0 | 0 | — |
case-05 | fail→fail | 14,360 | 11,322 | -21% | 1 | 1 | 0% | 1,827 | 3,317 | +82% | 0 | 0 | — |
case-06 | fail→pass | 18,548 | 14,466 | -22% | 1 | 1 | 0% | 2,423 | 3,980 | +64% | 0 | 0 | — |
case-07 | fail→fail | 12,386 | 11,898 | -4% | 1 | 1 | 0% | 1,330 | 3,456 | +160% | 0 | 0 | — |
case-08 | pass→pass | 17,454 | 13,598 | -22% | 1 | 1 | 0% | 3,198 | 4,452 | +39% | 0 | 0 | — |
case-09 | fail→fail | 9,043 | 10,628 | +18% | 1 | 1 | 0% | 183 | 3,297 | +1702% | 0 | 0 | — |
case-11 | fail→pass | 13,027 | 10,936 | -16% | 1 | 1 | 0% | 1,477 | 4,166 | +182% | 0 | 0 | — |
case-12 | fail→pass | 12,702 | 11,073 | -13% | 1 | 1 | 0% | 1,498 | 3,916 | +161% | 0 | 0 | — |
case-13 | fail→pass | 8,835 | 21,258 | +141% | 1 | 1 | 0% | 452 | 4,202 | +830% | 0 | 0 | — |
case-14 | pass→pass | 10,028 | 6,896 | -31% | 1 | 1 | 0% | 980 | 3,262 | +233% | 0 | 0 | — |
case-15 | fail→fail | 31,148 | 16,549 | -47% | 1 | 1 | 0% | 5,112 | 3,274 | -36% | 0 | 0 | — |
case-16 | fail→fail | 17,825 | 35,628 | +100% | 1 | 1 | 0% | 2,527 | 3,384 | +34% | 0 | 0 | — |
case-17 | fail→pass | 13,800 | 8,612 | -38% | 1 | 1 | 0% | 1,607 | 3,563 | +122% | 0 | 0 | — |
case-18 | fail→pass | 6,557 | 11,088 | +69% | 1 | 1 | 0% | 1,234 | 4,080 | +231% | 0 | 0 | — |
case-19 | pass→pass | 10,205 | 8,572 | -16% | 1 | 1 | 0% | 836 | 3,506 | +319% | 0 | 0 | — |
case-20 | pass→pass | 21,567 | 16,208 | -25% | 1 | 1 | 0% | 3,751 | 5,483 | +46% | 0 | 0 | — |
case-21 | pass→pass | 9,211 | 10,198 | +11% | 1 | 1 | 0% | 826 | 3,898 | +372% | 0 | 0 | — |
case-22 | pass→pass | 17,864 | 22,059 | +23% | 1 | 1 | 0% | 2,951 | 5,354 | +81% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 13 counted toward the lift figure. The other 9 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 13 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.