Figma Build
awdr74100/figwright
Build a Figma design from code or a description — the reverse of figma-codegen.
Generate per-component JSON metadata files (.ai/metadata/) from source: props, behaviour, composition, a11y contract, prohibited prop combinations.
$ npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install murphytrueman/design-system-ops metadata-schema-generator --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/murphytrueman/design-system-ops.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/metadata-schema-generator .claude/skills/metadata-schema-generator && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "metadata-schema-generator" agent skill from https://github.com/murphytrueman/design-system-ops/tree/main/skills/metadata-schema-generator into .claude/skills/metadata-schema-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metadata-schema-generator", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/murphytrueman/design-system-ops/tree/main/skills/metadata-schema-generatorType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install murphytrueman/design-system-ops metadata-schema-generator --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/murphytrueman/design-system-ops.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/metadata-schema-generator .agents/skills/metadata-schema-generator && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "metadata-schema-generator" agent skill from https://github.com/murphytrueman/design-system-ops/tree/main/skills/metadata-schema-generator into .agents/skills/metadata-schema-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metadata-schema-generator", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install murphytrueman/design-system-ops metadata-schema-generator --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/murphytrueman/design-system-ops.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/metadata-schema-generator .cursor/skills/metadata-schema-generator && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "metadata-schema-generator" agent skill from https://github.com/murphytrueman/design-system-ops/tree/main/skills/metadata-schema-generator into .cursor/skills/metadata-schema-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metadata-schema-generator", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/murphytrueman/design-system-ops.git --path skills/metadata-schema-generator--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install murphytrueman/design-system-ops metadata-schema-generator --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/murphytrueman/design-system-ops.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/metadata-schema-generator .gemini/skills/metadata-schema-generator && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "metadata-schema-generator" agent skill from https://github.com/murphytrueman/design-system-ops/tree/main/skills/metadata-schema-generator into .gemini/skills/metadata-schema-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metadata-schema-generator", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install murphytrueman/design-system-ops metadata-schema-generatorInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/murphytrueman/design-system-ops.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/metadata-schema-generator .github/skills/metadata-schema-generator && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "metadata-schema-generator" agent skill from https://github.com/murphytrueman/design-system-ops/tree/main/skills/metadata-schema-generator into .github/skills/metadata-schema-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metadata-schema-generator", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install murphytrueman/design-system-ops metadata-schema-generator --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/murphytrueman/design-system-ops.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/metadata-schema-generator .opencode/skills/metadata-schema-generator && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "metadata-schema-generator" agent skill from https://github.com/murphytrueman/design-system-ops/tree/main/skills/metadata-schema-generator into .opencode/skills/metadata-schema-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metadata-schema-generator", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
metadata-schema-generatorGenerate per-component JSON metadata files (.ai/metadata/) from source: props, behaviour, composition, a11y contract, prohibited prop combinations.
Metadata Schema Generator is an agent skill from murphytrueman/design-system-ops. Generate per-component JSON metadata files (.ai/metadata/) from source: props, behaviour, composition, a11y contract, prohibited prop combinations. Triggers: component metadata schema, machine-readable component JSON, manifest for MCP/codegen. Prose for Figma: use ai-component-description.
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Accessibility, Project scaffolding and Design systems. It works with Model Context Protocol and Figma. The repository describes itself as: Claude Code skills for the work that keeps a design system alive. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f167898. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteGrepGlobBash(cat:*)Bash(find:*)Bash(head:*)Bash(ls:*)Bash(npx react-docgen-typescript:*)Bash(npx custom-elements-manifest:*)…and 2 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
json-schema.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Metadata Schema Generator loads about 5.4k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 1,841 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from murphytrueman/design-system-ops at commit f167898, republished under its MIT licence (© murphytrueman). 1,841 words, ~5,364 tokens.
.claude/skills/metadata-schema-generator/SKILL.md (or your agent's skills folder).A skill for generating structured JSON metadata schemas for design system components. These schemas encode everything an AI agent, MCP server, code generator, or testing framework needs to work with a component programmatically — props, behavioural rules, composition constraints, accessibility contracts, and (where the team supplies it) business context — in a format that does not require natural language parsing.
Confirm that every path in this skill's frontmatter references: exists relative to this SKILL.md. If any is missing, stop: the install is incomplete, usually because a flattening installer (for example npx skills install) dropped the repo-root knowledge-notes/ directory. Tell the user to reinstall by a method in 1-INSTALL.md and run verify-install.sh from the install root. Proceed without the references only if the user explicitly says to, and then say in the output that it was produced without the pack's reference material.
Component documentation serves humans. Component metadata serves machines. The distinction matters because the information needs are different, the format requirements are different, and the failure modes are different.
A human reading a component's documentation can infer that "this button triggers the primary action" means it should be visually prominent and placed in the expected location. A code generation agent reading that same string cannot infer any of that — it needs explicit data: { "role": "primary_action", "visual_weight": "high", "placement": ["form_footer", "dialog_footer", "page_header"] }.
Most design systems have one layer of machine-readable data: TypeScript interfaces or PropTypes declarations that define prop names and types. This is necessary but insufficient. A TypeScript interface tells a tool that a Button accepts a variant prop of type "primary" | "secondary" | "ghost" — but it does not tell the tool when to use primary vs secondary, which combinations of props are prohibited, where the component can be placed in a layout, or what accessibility contract it must honour.
Structured metadata fills this gap. It encodes the knowledge layer between "what the component accepts" (TypeScript) and "how the component should be used" (documentation) as machine-readable data that tooling consumes directly.
The ai-component-description skill produces text descriptions optimised for LLM consumption. This skill produces structured data optimised for programmatic consumption. Together they serve the two modes of AI interaction: conversational (descriptions) and deterministic (metadata).
This skill is the pack's one extraction of component facts. It generates structured JSON metadata for tooling — not human-readable documentation (usage-guidelines, pattern-documentation) or LLM-facing prose (ai-component-description); those two read .ai/metadata/ when it exists and render from it, so the props and accessibility contract are derived once. If the system has no component inventory yet, run codebase-index first. If no component source is in reach, stop and ask for it: metadata can't be extracted from a description. If the team has no consumer for the files yet (no AGENTS.md pointing at them, no MCP server, no lint integration), say so and suggest agent-instructions as the first consumer rather than generating files nothing reads.
If .ds-ops-config.yml exists, follow the configuration-and-recurring knowledge note (../../knowledge-notes/configuration-and-recurring.md) for loading, integration fallbacks and recurring runs. This skill reads:
system.framework — determines prop extraction approach (React, Vue, Svelte, etc.)system.component_paths — directs scanning to component source filesintegrations.* — component data (see below)metadata.schema_version — locks the output schema version for compatibilitymetadata.output_directory — overrides default output locationmetadata.include_business_context — toggles the business context layer (default: false; see Step 4)Figma MCP (integrations.figma.enabled: true):
integrations.figma.file_keyStorybook (integrations.storybook.enabled: true):
Source (always attempted, with the tool that fits):
react-docgen-typescript gives name, type, required, default and description per prop; hand-read only what it can't resolve (complex generics), and say sovue-component-metanpx custom-elements-manifest analyze, or an existing custom-elements.json)Ask for or confirm (skip questions already answered by auto-pull):
For each component, scan for existing metadata sources:
.metadata.json, .metadata.ts)Produce a source assessment per component:
| Component | TS interface | JSDoc | Storybook | Figma | Existing metadata | Gaps |
|---|---|---|---|---|---|---|
| Button | complete | partial | complete | yes | none | composition, behaviour |
| Card | complete | none | partial | yes | none | all semantic layers |
For each component, extract the prop layer automatically from TypeScript or equivalent:
Illustrative Button (a real run uses the component's actual source):
{
"$schema": "./schema.json",
"component": "Button",
"version": "1.0.0",
"status": "stable",
"props": [
{
"name": "variant",
"type": "enum",
"values": ["primary", "secondary", "ghost"],
"default": "primary",
"required": false,
"description": "Visual weight of the button",
"semantic": {
"primary": "Use for the single most important action on the page or in a section",
"secondary": "Use for supporting actions alongside a primary action",
"ghost": "Use for tertiary actions or actions within dense UI"
}
},
{
"name": "size",
"type": "enum",
"values": ["sm", "md", "lg"],
"default": "md",
"required": false,
"description": "Controls button height and text size"
},
{
"name": "disabled",
"type": "boolean",
"default": false,
"required": false,
"description": "Prevents interaction and applies disabled styling"
},
{
"name": "loading",
"type": "boolean",
"default": false,
"required": false,
"description": "Shows a spinner in place of the label and prevents interaction"
},
{
"name": "aria-label",
"type": "string",
"required": false,
"description": "Accessible name when the button has no visible text"
},
{
"name": "children",
"type": "ReactNode",
"required": true,
"description": "Button label content"
}
]
}Build on the standard, don't invent one. For Web Components the metadata file is the Custom Elements Manifest with a dsops object added to each declaration for the semantic layers (CEM allows additional properties, and every CEM consumer keeps reading it). For React and Vue, the props array keeps docgen's field names (name, type, required, defaultValue, description) so anything that reads docgen output reads this too, and the semantic layers sit beside it.
Extraction rules:
type.raw; add type.kind normalised to string, number, boolean, enum, ReactNode, function, object, array, so generics and non-literal unions aren't lostdefault from the source's declared default. Omit default when source declares nonesemantic text comes from JSDoc or the team's docs. If neither has it, leave semantic out and flag the prop rather than writing plausible guidanceThe semantic layer encodes meaning that TypeScript types cannot express. For each component, add the three blocks below.
Provenance rule. Every behaviour, composition and accessibility block carries a provenance value: source (read from the component code), docs (from the team's documentation or the user), or proposed (anything not traced to either). A block that mixes sources takes the weakest. Never present a proposed rule as the system's actual behaviour or policy: tools and agents read this file as ground truth. See "Every figure and fact needs a source" in the output-discipline knowledge note.
The examples below continue the illustrative Button.
{
"behaviour": {
"states": ["default", "hover", "active", "focus", "disabled", "loading"],
"transitions": {
"default_to_loading": {
"trigger": "Form submission or async action",
"visual": "Replace label with spinner, disable interaction",
"duration": "Until async operation completes or times out"
}
},
"constraints": [
"At most one primary variant Button per form",
"Loading state must disable all sibling interactive elements",
"Icon-only buttons must have an aria-label prop"
],
"provenance": "docs"
}
}The first two constraints stand in for team rules: record rules like these only when the team's docs or the user state them.
{
"composition": {
"valid_parents": ["Form", "Card", "Dialog", "Toolbar", "PageHeader"],
"valid_children": ["Icon", "text"],
"prohibited_nesting": ["Button may not contain another Button"],
"slot_contract": {
"children": {
"accepts": ["string", "Icon"],
"max_elements": 2,
"pattern": "Optional leading Icon + text label"
}
},
"common_combinations": [
{ "pattern": "Primary + Secondary pair", "context": "Dialog footer, form actions" },
{ "pattern": "Icon-only in Toolbar", "context": "Dense action bars" }
],
"provenance": "proposed"
}
}{
"accessibility": {
"role": "button",
"aria_required": [],
"aria_conditional": [
{ "prop": "aria-label", "when": "children is Icon only (no visible text)" },
{ "prop": "aria-expanded", "when": "button controls a collapsible region" },
{ "prop": "aria-haspopup", "when": "button opens a menu or dialog" }
],
"keyboard": {
"Enter": "Activate button",
"Space": "Activate button"
},
"focus": {
"receives_focus": true,
"focus_visible": "Required — uses system focus ring token",
"tab_order": "Follows DOM order unless explicitly managed"
},
"screen_reader": {
"announcement": "Button label + role",
"state_changes": "Announces disabled state change"
},
"provenance": "source"
}
}The business context layer connects the component to product outcomes. It is off by default (metadata.include_business_context: false). Include it only when the user or the team's docs supply the metrics and rules, and give every entry a source (file path, URL, or user). Never infer a component's business function, metrics or traffic from its name.
Illustrative shape:
{
"business_context": {
"function": { "value": "conversion", "source": "user" },
"metrics": [
{ "name": "Click-through rate", "role": "primary", "source": "docs/analytics/cta-tracking.md" },
{ "name": "Form completion rate", "role": "secondary", "source": "user" }
],
"experimentation": {
"safe_to_test": ["label text", "variant within brand palette"],
"never_test": ["removing disabled state logic", "removing aria attributes"],
"requires_review": ["changing size scale", "adding new variants"],
"source": "user"
},
"usage_analytics": {
"custom_events": [
{ "event": "cta_click", "data": ["variant", "page", "position"], "source": "src/analytics/events.ts" }
]
}
}
}Encode prop combinations that are technically valid but semantically wrong. Each entry carries a provenance value, as in Step 3:
{
"prohibited_combinations": [
{
"combination": { "variant": "ghost", "size": "lg" },
"reason": "Ghost buttons at large size create false visual hierarchy — they appear as primary actions despite being tertiary",
"severity": "warning",
"provenance": "proposed"
},
{
"combination": { "disabled": true, "loading": true },
"reason": "Redundant states — loading already prevents interaction. Use loading alone.",
"severity": "error",
"provenance": "docs"
}
]
}Severity levels:
error — this combination is prohibited and tools should refuse to generate itwarning — this combination is discouraged and tools should flag it for reviewinfo — this combination has nuances the developer should be aware ofAssemble all layers into the complete metadata schema per component.
.ai/metadata/
schema.json # JSON Schema definition for validation
Button.metadata.json
Card.metadata.json
Modal.metadata.json
...
manifest.json # Index of all metadata filesschema.json)Write a JSON Schema alongside the metadata files so validation (Step 7) and CI have something to check against. A minimal version:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Component metadata",
"type": "object",
"required": ["component", "props"],
"properties": {
"component": { "type": "string" },
"version": { "type": "string" },
"status": { "enum": ["alpha", "beta", "stable", "deprecated"] },
"props": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "type", "required"],
"properties": {
"name": { "type": "string" },
"type": { "enum": ["string", "number", "boolean", "enum", "ReactNode", "function", "object", "array"] },
"values": { "type": "array" },
"default": {},
"required": { "type": "boolean" },
"description": { "type": "string" },
"semantic": { "type": "object" }
}
}
},
"behaviour": { "$ref": "#/$defs/layer" },
"composition": { "$ref": "#/$defs/layer" },
"accessibility": { "$ref": "#/$defs/layer" },
"business_context": { "type": "object" },
"prohibited_combinations": {
"type": "array",
"items": {
"type": "object",
"required": ["combination", "reason", "severity", "provenance"],
"properties": {
"severity": { "enum": ["error", "warning", "info"] },
"provenance": { "$ref": "#/$defs/provenance" }
}
}
}
},
"$defs": {
"provenance": { "enum": ["source", "docs", "proposed"] },
"layer": {
"type": "object",
"required": ["provenance"],
"properties": { "provenance": { "$ref": "#/$defs/provenance" } }
}
}
}Illustrative values; coverage figures are counted from the files actually generated.
{
"generated": "[date]",
"system": "[design system name]",
"component_count": 55,
"coverage": {
"props": "100%",
"semantic": "85%",
"accessibility": "90%",
"business_context": "40%",
"prohibited_combinations": "60%"
},
"components": [
{ "name": "Button", "file": "Button.metadata.json", "status": "stable" },
{ "name": "Card", "file": "Card.metadata.json", "status": "stable" }
]
}Run validation checks on the generated schemas:
Structural validation:
schema.json: run npx ajv validate -s .ai/metadata/schema.json -d ".ai/metadata/*.metadata.json" (ajv-cli) and report its output. If ajv isn't available and can't be installed, say validation wasn't run; don't report the files as validbehaviour, composition and accessibility block, and every prohibited combination, has a provenance valueSemantic validation:
Cross-reference validation:
Coverage reporting:
End with a short chat summary:
.ai/metadata/ (or the configured metadata.output_directory), including schema.json and manifest.jsonproposed.ai/metadata/ directoryproposed until someone on the team confirms themsourceproposed marker© murphytrueman, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/metadata-schema-generator of murphytrueman/design-system-ops.
Open the folder on GitHubat commit f167898
Metadata Schema Generator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Metadata Schema Generator this skillmurphytrueman/design-system-ops | 203 | — | ~5.4k | Automated safety check: Pass | MIT | |
| Figma Buildawdr74100/figwright | 982 | — | ~2k | Automated safety check: Pass | MIT | |
| Extracting Design Systemnoemuch/bridge | 156 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Figma use_figma Plugin API Ruleswarpdotdev/warp | 65k | 4 repos | ~4.4k | Automated safety check: Pass | AGPL-3.0 | |
| Figma Code Connect Componentswarpdotdev/warp | 65k | 2 repos | ~4.2k | Automated safety check: Pass | AGPL-3.0 | |
| Figma Screen Generatorwarpdotdev/warp | 65k | 2 repos | ~5k | Automated safety check: Pass | AGPL-3.0 |
awdr74100/figwright
Build a Figma design from code or a description — the reverse of figma-codegen.
noemuch/bridge
A skill your agent uses when the user says "setup", "setup bridge", "extract", "extract DS", "onboard", "build knowledge base", "initialize bridge", or is starting Bridge in a project for the first…
warpdotdev/warp
Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.
warpdotdev/warp
Maps published Figma components to their code implementations with Code Connect, using the Figma MCP suggestion and mapping tools.
warpdotdev/warp
Builds or updates full Figma screens from code or a description by reusing the file's published design system components, variables and styles.
Manavarya09/design-extract
Extract the full design language from any website URL. An agent skill from Manavarya09/design-extract.
murphytrueman/design-system-ops
Write the AGENTS.md that tells coding agents how to use this design system: where things live, sourced rules, how to check work, what not to do; Claude, Cursor or Copilot pointers on request.
murphytrueman/design-system-ops
Write a six-section prose description (purpose, props, anti-patterns, composition, accessibility, examples) for a Figma component's description field so LLMs read it via MCP.
murphytrueman/design-system-ops
Write release notes, a migration guide and a team announcement for a design system change that is already decided, scaled to its impact.
murphytrueman/design-system-ops
Generate machine-readable index files in .ai/index/ (component inventory, uses/usedBy graph, stats) for AI agents.
murphytrueman/design-system-ops
Generate tested jscodeshift/postcss codemods for design system migrations: token renames, prop renames or removals, import paths, component swaps.
murphytrueman/design-system-ops
Audit prop APIs across a component library: naming consistency, boolean/default patterns, type coverage, exported types, breaking changes between versions.
Works with
Categories
Generate per-component JSON metadata files (.ai/metadata/) from source: props, behaviour, composition, a11y contract, prohibited prop combinations. Metadata Schema Generator is an agent skill from murphytrueman/design-system-ops.ai/metadata/) from source: props, behaviour, composition, a11y contract, prohibited prop combinations.
Metadata Schema Generator fits situations like: tasks that involve Accessibility; tasks that involve Project scaffolding; tasks that involve Design systems.
Run `npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a claude-code`. Or copy the skill folder (skills/metadata-schema-generator in murphytrueman/design-system-ops) into .claude/skills/metadata-schema-generator in your project. Claude Code loads it when a task matches its description.
Run `npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a codex`. Or copy the skill folder (skills/metadata-schema-generator in murphytrueman/design-system-ops) into .agents/skills/metadata-schema-generator in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add murphytrueman/design-system-ops --skill metadata-schema-generator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/metadata-schema-generator, .gemini/skills/metadata-schema-generator, .github/skills/metadata-schema-generator and .opencode/skills/metadata-schema-generator in your project.
Going by SKILL.md and its folder, Metadata Schema Generator needs the command-line tools its instructions call (npx). Our summary lists: Node.js. Its frontmatter pre-approves these tools: Read, Write, Grep, Glob, Bash(cat:*), Bash(find:*), Bash(head:*), Bash(ls:*), Bash(npx react-docgen-typescript:*), Bash(npx custom-elements-manifest:*), Bash(npx vue-component-meta:*), Bash(npx ajv:*).
SKILL.md names 1 domain. In commands or code: json-schema.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Metadata Schema Generator is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Metadata Schema Generator: Figma Build (awdr74100/figwright, 982 stars), Extracting Design System (noemuch/bridge, 156 stars), Figma use_figma Plugin API Rules (warpdotdev/warp, 65k stars) and Figma Code Connect Components (warpdotdev/warp, 65k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
murphytrueman (a GitHub user) maintains it in murphytrueman/design-system-ops, which has 203 GitHub stars. The repository holds 36 skills in this directory. The repository was last updated on September 24, 2026.
Source: murphytrueman/design-system-ops on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.