figma-design-md-generator

Generate DESIGN.md and SKILL.md files from Figma design systems for AI-assisted development

Skill file

Preview skill file
---
name: figma-design-md-generator
description: Generate DESIGN.md and SKILL.md files from Figma design systems for AI-assisted development
triggers:
  - "extract design tokens from Figma"
  - "generate DESIGN.md from Figma file"
  - "create design system documentation"
  - "export Figma styles to markdown"
  - "build SKILL.md for design system"
  - "document Figma design tokens"
  - "extract typography and color tokens"
  - "generate AI-ready design guidelines"
---

# Figma DESIGN.md Generator

> Skill by [ara.so](https://ara.so) — Design Skills collection.

A Figma plugin that extracts local style guidelines, variables, and component families from Figma files and generates `DESIGN.md` and `SKILL.md` files. These outputs provide AI tools (Claude Code, Cursor, Codex) with structured design-system blueprints for building consistent interfaces.

## What It Does

The plugin reads Figma's local styles and variables—colors, typography, spacing, radius, effects, grids, and component sets—and converts them into editable markdown files following the [TypeUI DESIGN.md](https://www.typeui.sh/design-md) format.

**Key capabilities:**
- Auto-extracts color tokens (paint styles + variables)
- Auto-extracts typography tokens (text styles + scales)
- Auto-extracts spacing, radius, motion tokens
- Auto-extracts effect styles (shadows, blur)
- Auto-extracts grid styles and component families
- Generates human-editable `DESIGN.md` (reference documentation)
- Generates AI-optimized `SKILL.md` (agent instructions)

## Installation

### As a Figma Plugin (Development Mode)

1. **Clone the repository:**
   ```bash
   git clone https://github.com/bergside/design-md-figma.git
   cd design-md-figma
   ```

2. **Install dependencies:**
   ```bash
   npm install
   ```

3. **Build the plugin:**
   ```bash
   npm run build
   ```

4. **Import into Figma Desktop:**
   - Open Figma Desktop
   - Go to **Plugins → Development → Import plugin from manifest...**
   - Select `manifest.json` from the project directory
   - Run **Design MD Skill Generator** from the plugins menu

### Development Workflow

```bash
# Watch mode for live development
npm run watch

# Type checking
npm run typecheck

# Production build
npm run build
```

## Key Plugin Actions

| Action | Description |
|--------|-------------|
| **Auto-extract** | Reads local styles and variables from active Figma file |
| **Generate DESIGN.md** | Creates design-guideline markdown from extracted signals |
| **Generate SKILL.md** | Creates agent-ready markdown with implementation rules |
| **Toggle view** | Switches between DESIGN.md and SKILL.md in editor |
| **Refresh** | Re-runs extraction for current file state |
| **Download** | Saves generated output as `.md` file |

## Plugin Architecture

### Main Entry Points

**`code.ts`** – Plugin backend (runs in Figma sandbox):

```typescript
figma.showUI(__html__, { width: 800, height: 600 });

// Listen for extraction requests
figma.ui.onmessage = (msg) => {
  if (msg.type === 'extract-styles') {
    const styles = extractLocalStyles();
    const variables = extractVariables();
    const components = extractComponentFamilies();
    
    figma.ui.postMessage({
      type: 'extraction-complete',
      data: { styles, variables, components }
    });
  }
};

function extractLocalStyles() {
  const paintStyles = figma.getLocalPaintStyles();
  const textStyles = figma.getLocalTextStyles();
  const effectStyles = figma.getLocalEffectStyles();
  const gridStyles = figma.getLocalGridStyles();
  
  return {
    colors: paintStyles.map(s => ({
      name: s.name,
      type: s.paints[0]?.type,
      value: paintToHex(s.paints[0])
    })),
    typography: textStyles.map(s => ({
      name: s.name,
      fontFamily: s.fontName.family,
      fontSize: s.fontSize,
      lineHeight: s.lineHeight
    })),
    effects: effectStyles.map(s => ({
      name: s.name,
      effects: s.effects
    })),
    grids: gridStyles.map(s => ({
      name: s.name,
      layoutGrids: s.layoutGrids
    }))
  };
}

function extractVariables() {
  const collections = figma.variables.getLocalVariableCollections();
  
  return collections.map(collection => ({
    name: collection.name,
    modes: collection.modes,
    variables: collection.variableIds.map(id => {
      const variable = figma.variables.getVariableById(id);
      return {
        name: variable?.name,
        resolvedType: variable?.resolvedType,
        valuesByMode: variable?.valuesByMode
      };
    })
  }));
}

function extractComponentFamilies() {
  const components = figma.root.findAll(node => 
    node.type === 'COMPONENT_SET'
  ) as ComponentSetNode[];
  
  return components.map(comp => ({
    name: comp.name,
    variantCount: comp.children.length,
    properties: Object.keys(comp.componentPropertyDefinitions || {})
  }));
}
```

**`ui.html`** – Plugin UI (React-based):

```typescript
// Send extraction request
window.parent.postMessage(
  { pluginMessage: { type: 'extract-styles' } },
  '*'
);

// Receive extraction results
window.onmessage = (event) => {
  const msg = event.data.pluginMessage;
  
  if (msg.type === 'extraction-complete') {
    const designMd = generateDesignMd(msg.data);
    const skillMd = generateSkillMd(msg.data);
    
    setDesignContent(designMd);
    setSkillContent(skillMd);
  }
};
```

## Generated File Structure

### DESIGN.md Format

```markdown
# Design System – [File Name]

## Source
- **File**: [Figma file name]
- **Page**: [Current page]
- **Extracted**: [ISO timestamp]

## Variable Collections
- **Collection Name** (2 modes: Light, Dark)

## Color Tokens
| Token | Value | Type |
|-------|-------|------|
| primary/500 | #3B82F6 | solid |
| neutral/900 | #111827 | solid |

## Typography Tokens
| Token | Font Family | Size | Line Height | Weight |
|-------|-------------|------|-------------|--------|
| heading/xl | Inter | 32px | 1.2 | 700 |
| body/md | Inter | 16px | 1.5 | 400 |

## Spacing Tokens
| Token | Value |
|-------|-------|
| spacing/xs | 4px |
| spacing/md | 16px |

## Component Families
- Button (variants: 8)
- Input (variants: 6)
- Card (variants: 4)
```

### SKILL.md Format

```markdown
# AI Design System Agent – [File Name]

## Mission
Implement UI components that strictly follow the extracted design system from [File Name].

## Brand
- **Product**: [Inferred from file]
- **Audience**: [Inferred context]
- **Surface**: Web/Mobile

## Style Foundations
### Colors
- Primary: #3B82F6
- Semantic: Success (#10B981), Error (#EF4444)

### Typography
- Heading scale: 32/24/20/16px
- Body scale: 16/14/12px
- Font stack: Inter, system-ui, sans-serif

## Accessibility
- WCAG 2.2 AA contrast (4.5:1 text, 3:1 UI)
- Minimum touch target: 44×44px
- Focus indicators required

## Rules: Do
- Use extracted color tokens exactly
- Apply typography tokens for all text
- Respect spacing scale for layout
- Implement all component variants

## Rules: Don't
- Don't invent new colors outside token set
- Don't use arbitrary font sizes
- Don't skip accessibility requirements
```

## Common Usage Patterns

### Extract and Download

```typescript
// In plugin code
async function extractAndGenerate() {
  // Extract all design tokens
  const styles = extractLocalStyles();
  const variables = extractVariables();
  const components = extractComponentFamilies();
  
  // Generate markdown
  const designMd = formatDesignMd({ styles, variables, components });
  const skillMd = formatSkillMd({ styles, variables, components });
  
  // Send to UI for download
  figma.ui.postMessage({
    type: 'download-ready',
    designMd,
    skillMd
  });
}
```

### Convert Paint to Hex

```typescript
function paintToHex(paint: Paint): string {
  if (paint.type === 'SOLID') {
    const r = Math.round(paint.color.r * 255);
    const g = Math.round(paint.color.g * 255);
    const b = Math.round(paint.color.b * 255);
    return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`.toUpperCase();
  }
  return 'gradient';
}
```

### Format Typography Token

```typescript
function formatTypographyToken(style: TextStyle) {
  const lineHeight = style.lineHeight.unit === 'PIXELS' 
    ? `${style.lineHeight.value}px`
    : style.lineHeight.value;
    
  return {
    name: style.name,
    fontFamily: style.fontName.family,
    fontSize: `${style.fontSize}px`,
    fontWeight: style.fontWeight,
    lineHeight,
    letterSpacing: style.letterSpacing
  };
}
```

### Extract Component Variants

```typescript
function extractComponentVariants(componentSet: ComponentSetNode) {
  const variants = componentSet.children.map(child => {
    if (child.type === 'COMPONENT') {
      return {
        name: child.name,
        properties: child.variantProperties || {}
      };
    }
  }).filter(Boolean);
  
  return {
    family: componentSet.name,
    count: variants.length,
    variants
  };
}
```

## Using Generated Files with AI Tools

### Claude Code / Cursor

1. Place `DESIGN.md` and `SKILL.md` in project root
2. Reference in agent context:
   ```
   @SKILL.md implement a button component following the design system
   ```

### Prompt Engineering

```
Using the design tokens in DESIGN.md, create a React component 
for [Component Name] that:
- Uses color tokens from primary palette
- Applies typography token heading/md
- Respects spacing/md for padding
- Implements all variants listed in Component Families
```

## Configuration

The plugin reads Figma's native structures—no external configuration required. All extraction is based on:

- Local paint styles
- Local text styles  
- Local effect styles
- Local grid styles
- Variable collections
- Component sets in current file

## Troubleshooting

### No Styles Extracted

**Problem**: Plugin returns empty DESIGN.md

**Solution**: Ensure you have local styles created in Figma. Shared library styles are not extracted—only local file styles.

```typescript
// Check for local styles
const paintStyles = figma.getLocalPaintStyles();
if (paintStyles.length === 0) {
  console.warn('No local paint styles found in this file');
}
```

### Variables Not Showing

**Problem**: Variable collections missing from output

**Solution**: Verify variables are created as local collections, not external libraries.

```typescript
const collections = figma.variables.getLocalVariableCollections();
console.log('Found collections:', collections.length);
```

### Build Errors

**Problem**: TypeScript compilation fails

**Solution**: Ensure Figma plugin types are installed:

```bash
npm install --save-dev @figma/plugin-typings
```

Update `tsconfig.json`:

```json
{
  "compilerOptions": {
    "types": ["@figma/plugin-typings"]
  }
}
```

### Plugin Won't Load

**Problem**: "Failed to load manifest" error

**Solution**: Check `manifest.json` structure:

```json
{
  "name": "Design MD Skill Generator",
  "id": "YOUR_PLUGIN_ID",
  "api": "1.0.0",
  "main": "code.js",
  "ui": "ui.html",
  "editorType": ["figma"]
}
```

## Best Practices

1. **Run extraction on finalized designs** – Ensure your local styles and variables are complete before generating files

2. **Name tokens consistently** – Use `/` separators for token hierarchy (e.g., `color/primary/500`)

3. **Version control generated files** – Commit `DESIGN.md` and `SKILL.md` alongside design system code

4. **Update after design changes** – Re-run extraction when design tokens change

5. **Combine with component library** – Use generated files as source of truth for design token implementation

## Resources

- [TypeUI DESIGN.md format](https://www.typeui.sh/design-md)
- [Curated design skills](https://www.typeui.sh/design-skills)
- [Figma Plugin API](https://www.figma.com/plugin-docs/)
- [Plugin GitHub repository](https://github.com/bergside/design-md-figma)

Source

Creator's repository · aradotso/design-skills

View on GitHub

Security

Security checks in progress
Results will appear here once audits complete
Checked by 3 independent security firms
Does it try to trick the AI?Not yet checkedPending · Gen Agent Trust Hub
Does it sneak in hidden code?Not yet checkedPending · Socket
Does it have known bugs?Not yet checkedPending · Snyk