Skip to content
Back to skills

Visual Setup

ASecurity

Configure complete visual identity for a project before development. Use when the user says "visual setup", "setup design", "configure brand", "design system", "visual identity", "brand kit", or wants to set up Stitch + VEG + brand tokens before running /plan.

  • 16 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added June 1, 2026
designjavascriptgojavabashvueexpressgitapidocumentation

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned June 1, 2026

npx -y skills add EmbedBuild/specbox-engine --skill visual-setup --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Visual Setup?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Visual Setup
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/embedbuild-visual-setup/badge)](https://www.skillsdirectory.com/skills/embedbuild-visual-setup)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: visual-setup
description: >
  Configure complete visual identity for a project before development.
  Use when the user says "visual setup", "setup design", "configure brand",
  "design system", "visual identity", "brand kit", or wants to set up
  Stitch + VEG + brand tokens before running /plan.
context: direct
---

# /visual-setup (Global)

Configura la identidad visual completa de un proyecto ANTES de empezar a desarrollar: Brand Kit + Google Stitch Design System + VEG base + Multi-Form-Factor + Prompt Template. Tras ejecutar este skill, `/plan` y `/implement` generan disenos consistentes con la marca sin intervencion adicional.

## Uso

```
/visual-setup                          # Modo interactivo completo
/visual-setup calm-enterprise          # Preset de estetica
/visual-setup --from doc/brand/        # Parsear brand kit existente
```

## Posicion en el pipeline

```
/prd → PRD + Trello/Plane
  ↓
/visual-setup → Brand Kit + Stitch DS + VEG + Multi-FF  ← ESTE SKILL
  ↓
/plan → Plan tecnico + Disenos Stitch (ya con brand)
  ↓
/implement → Codigo con design-to-code fiel a la marca
```

---

## Paso 0.0 — Leer documentos canónicos (v5.29.0 + v6.0.1 content-passing)

**ANTES de cualquier otro paso**:

1. Usa `Read` localmente sobre `doc/app/app_prd.md` y `doc/app/app_spec.md`.
2. Llama a la tool MCP con el contenido:

```
get_inheritable_values_tool(
  app_prd_content=<contenido o null>,
  app_spec_content=<contenido o null>,
)
```

> **v6.0.1**: `get_inheritable_values_tool` y `read_app_docs_tool` dejaron de aceptar `project_path` — el cliente lee localmente y pasa el contenido.

Si `app_spec.md` ya define identidad visual (`brand_visual` zone con valores reales — no plantilla):

| Flag | Si es `True`, salta el paso |
|------|------------------------------|
| `veg_archetype` definido | Paso 1 (recopilar identidad estética) — la dirección visual está fijada a nivel de proyecto |
| `veg_mode_known` | Paso 1 (modo VEG) — heredado |

En ese caso, pregunta solo:

```
He detectado en doc/app/app_spec.md:
  - VEG arquetipo: {valor}
  - Modo VEG: {valor}

¿Quieres usarlos para esta sesión de visual-setup, o prefieres redefinir?
  [s] usar app_spec    [r] redefinir    [c] cancelar
```

Si el usuario responde `r`, el flujo legacy de Paso 1 se activa. Si responde `s`, salta directamente a generación de tokens (Paso 2 si existe, o el paso equivalente del flujo).

### 0.0.1 — Política de Autopilot aplicable a /visual-setup

Antes de cada confirmación, llama a `evaluateDecision(decision_key, context)` desde `.claude/hooks/lib/autopilot.mjs`:

| Pregunta del skill | decision_key | Default si auto |
|--------------------|--------------|------------------|
| "¿Quieres actualizar o empezar de cero?" (Paso 0 si COMPLETO) | `design_system_update_check` | `equilibrado`+: conservar existente |
| Dirección estética (Paso 1, 7 opciones) | `feature_aesthetic_direction` | `equilibrado`+: hereda de `app_spec.md` cuando `hasAppSpec=true` |
| "¿Confirmas estos tokens?" (Paso 2.X) | `tokens_confirmation` | `conservador`+: auto-confirma siempre |
| Stitch API key faltante | `stitch_api_key_missing` | siempre `ask` |

Tras cada auto-confirmación visible al usuario:

```
ℹ️  Tokens auto-confirmados (autopilot: equilibrado, decision_key: tokens_confirmation)
```

---

## Paso 0: Detectar Estado Actual

### 0.1 Verificar artefactos existentes

```
¿Que existe ya?
├── doc/brand/brand_kit/SKILL.md     → Brand Kit completo
├── doc/brand/brand_kit/variables.css → Tokens CSS
├── doc/brand/brand_briefing.md      → Briefing parcial
├── doc/veg/base/                    → VEG base existente
├── doc/design/stitch-prompt-template.md → Prompt template
└── .claude/settings.local.json      → Config Stitch/VEG
```

```bash
# Detectar brand kit
ls doc/brand/brand_kit/SKILL.md 2>/dev/null
ls doc/brand/brand_kit/variables.css 2>/dev/null
ls doc/brand/brand_briefing.md 2>/dev/null

# Detectar VEG base
ls doc/veg/base/ 2>/dev/null

# Detectar Stitch config
cat .claude/settings.local.json 2>/dev/null | grep -E "stitch|projectId|designSystem"

# Detectar prompt template
ls doc/design/stitch-prompt-template.md 2>/dev/null
```

### 0.2 Evaluar estado

```
Estado detectado:
├── COMPLETO → Todo existe (brand kit + stitch + VEG + template)
│   └── INFO: "El proyecto ya tiene identidad visual configurada."
│       └── Preguntar: "¿Quieres actualizar algo o empezar de cero?"
│
├── PARCIAL → Algunos artefactos existen
│   └── INFO: "Se encontraron artefactos parciales. Se completara lo que falta."
│   └── Listar que existe y que falta
│   └── Continuar desde el paso que corresponda
│
└── VACIO → Nada existe
    └── INFO: "Proyecto sin identidad visual. Iniciando configuracion completa."
    └── Continuar con Paso 1
```

### 0.3 Detectar proyecto Stitch existente

Si hay `stitch.projectId` en `.claude/settings.local.json`:
1. Llamar `mcp__stitch__get_project` con ese projectId
2. Si responde OK → reusar proyecto existente
3. Si falla → crear nuevo en Paso 3

---

## Paso 1: Recopilar Identidad Visual

### 1.1 Arbol de decision de fuentes de datos

```
¿De donde vienen los tokens?
├── doc/brand/brand_kit/SKILL.md existe
│   └── Parsear SKILL.md y extraer:
│       ├── Nombre del producto
│       ├── Dominio/sector
│       ├── Colores (primary, secondary, accent, neutral)
│       ├── Tipografia (heading, body, mono)
│       ├── Roundness
│       ├── Shadows
│       └── Dispositivo principal
│   └── Confirmar con usuario: "He extraido estos tokens del brand kit existente: [tabla]. ¿Correcto?"
│
├── doc/brand/brand_briefing.md existe
│   └── Parsear briefing y extraer tokens parciales
│   └── Completar datos faltantes con preguntas al usuario
│
└── No hay fuentes → Modo interactivo completo (1.2)
```

### 1.2 Modo interactivo

Preguntar al usuario en este orden. Mostrar las opciones como tabla para facilitar la eleccion.

**Pregunta 1: Nombre y dominio**

```
¿Cual es el nombre del producto y su dominio?
Ejemplo: "McProfit — fintech para gestion de inversiones"
```

**Pregunta 2: Estetica**

Mostrar tabla de presets disponibles:

| # | Estetica | Primary | Secondary | Font | Roundness | Referentes |
|---|----------|---------|-----------|------|-----------|------------|
| 1 | Calm Enterprise | #4F46E5 (Indigo) | #8B5CF6 (Violet) | GEIST | Rounded (12px) | Linear, Stripe |
| 2 | Bold Startup | #7C3AED (Violet) | #EC4899 (Pink) | DM_SANS | Medium (8px) | Notion, Figma |
| 3 | Minimal Tool | #171717 (Neutral) | #525252 (Gray) | INTER | Sharp (4px) | GitHub, Vercel |
| 4 | Financial Pro | #0F172A (Slate) | #0EA5E9 (Sky) | PLUS_JAKARTA_SANS | Medium (8px) | Stripe, Wise |
| 5 | Health & Care | #059669 (Emerald) | #14B8A6 (Teal) | MANROPE | Full/Pill | Calm, Headspace |
| 6 | Developer DX | #F97316 (Orange) | #EAB308 (Yellow) | SPACE_GROTESK | Medium (8px) | Vercel, Railway |
| 7 | Custom | (preguntar) | (preguntar) | (preguntar) | (preguntar) | — |

```
¿Que estetica se acerca mas a tu producto? (1-7)
```

**Si elige 1-6** → cargar preset completo, confirmar con usuario, permitir override de cualquier campo.

**Si elige 7 (Custom)** → continuar con preguntas 3-7.

**Pregunta 3: Color primario** (solo si Custom)

```
¿Color primario? (hex, ej: #4F46E5)
Puedo sugerir uno si me dices el sector del producto.
```

**Pregunta 4: Color secundario** (solo si Custom)

```
¿Color secundario? (hex, ej: #8B5CF6)
Si no tienes uno, puedo derivarlo del primario (complementario o analogo).
```

**Pregunta 5: Tipografia** (solo si Custom)

Mostrar tabla de fuentes soportadas por Stitch:

| # | Fuente | Estilo | Recomendada para |
|---|--------|--------|------------------|
| 1 | GEIST | Modern, clean, Vercel-style | SaaS, tech products, calm enterprise |
| 2 | INTER | Neutral, versatile | Universal, safe choice |
| 3 | DM_SANS | Geometric, friendly | Startups, consumer products |
| 4 | PLUS_JAKARTA_SANS | Elegant, modern | Fintech, premium SaaS |
| 5 | SPACE_GROTESK | Technical, distinctive | Developer tools, data products |
| 6 | SORA | Geometric, balanced | Modern apps, dashboards |
| 7 | IBM_PLEX_SANS | Corporate, reliable | Enterprise, B2B |
| 8 | MANROPE | Warm, rounded | Health, education, HR |
| 9 | RUBIK | Soft, approachable | Consumer, mobile-first |
| 10 | SOURCE_SANS_THREE | Clean, readable | Content-heavy, documentation |
| 11 | MONTSERRAT | Bold, impactful | Marketing, landing pages |
| 12 | WORK_SANS | Professional, balanced | Business tools, enterprise |

```
¿Tipografia? (1-12, o nombre directamente)
```

**Pregunta 6: Roundness** (solo si Custom)

| # | Nombre | CSS radius | Stitch enum | Efecto |
|---|--------|------------|-------------|--------|
| 1 | Sharp | 4px | ROUND_FOUR | Profesional, tecnico |
| 2 | Medium | 8px | ROUND_EIGHT | Balanceado, moderno |
| 3 | Rounded | 12px | ROUND_TWELVE | Amigable, suave |
| 4 | Full/Pill | 9999px | ROUND_FULL | Jugueton, bold |

```
¿Roundness? (1-4)
```

**Pregunta 7: Dispositivo principal** (solo si Custom)

```
¿Desktop-first o mobile-first?
```

### 1.3 Derivar colores complementarios

A partir de los colores primario y secundario, derivar automaticamente:

```
Paleta completa:
├── primary: {color elegido}
├── secondary: {color elegido}
├── accent: {derivar — triadic o split-complementary del primary}
├── success: #10B981 (Emerald 500 — standard)
├── warning: #F59E0B (Amber 500 — standard)
├── error: #EF4444 (Red 500 — standard)
├── info: #3B82F6 (Blue 500 — standard)
├── neutral-50 a neutral-900: {escala de grises derivada}
├── surface-light: #FFFFFF
├── surface-dark: #0F172A
├── text-primary-light: #1E293B
├── text-primary-dark: #F1F5F9
├── text-secondary-light: #64748B
└── text-secondary-dark: #94A3B8
```

### 1.4 Mapear tipografia a Stitch enum

```
Mapeo de fuentes:
├── headlineFont: {fuente elegida} (para titulos h1-h3)
├── bodyFont: {fuente elegida} (para texto body)
├── labelFont: {fuente elegida} (para labels, captions, buttons)
└── monoFont: "JetBrains Mono" o "Fira Code" (para code blocks — solo CSS, no Stitch)
```

**REGLA**: Las 3 fuentes de Stitch (headline, body, label) usan la MISMA familia por defecto. Solo separar si el usuario lo pide explicitamente o si la estetica lo requiere (ej: serif para headlines + sans para body).

### 1.5 Confirmar tokens con el usuario

Antes de generar cualquier artefacto, mostrar resumen completo:

```markdown
## Identidad Visual — {Nombre del Producto}

| Token | Valor |
|-------|-------|
| Nombre | {nombre} |
| Dominio | {dominio} |
| Estetica | {nombre preset o "Custom"} |
| Primary | {hex} ████ |
| Secondary | {hex} ████ |
| Accent | {hex} ████ |
| Font Headline | {FONT_ENUM} |
| Font Body | {FONT_ENUM} |
| Roundness | {nombre} ({Npx}) |
| Device | {desktop-first / mobile-first} |

¿Confirmas estos tokens? (si / ajustar campo)
```

**IMPORTANTE**: No avanzar al Paso 2 sin confirmacion explicita del usuario.

---

## Paso 2: Generar Brand Kit

> Solo si no existe `doc/brand/brand_kit/` o el usuario pidio regenerar.

### 2.1 Crear estructura de directorios

```bash
mkdir -p doc/brand/brand_kit
```

### 2.2 Generar `variables.css`

Archivo con CSS custom properties para light y dark mode:

```css
/* Brand Kit — {Nombre del Producto}
 * Generated by /visual-setup
 * Estetica: {estetica}
 */

:root {
  /* === Primary === */
  --color-primary: {primary};
  --color-primary-hover: {primary-600};
  --color-primary-active: {primary-700};
  --color-primary-subtle: {primary-50};
  --color-on-primary: #FFFFFF;

  /* === Secondary === */
  --color-secondary: {secondary};
  --color-secondary-hover: {secondary-600};
  --color-secondary-active: {secondary-700};
  --color-secondary-subtle: {secondary-50};
  --color-on-secondary: #FFFFFF;

  /* === Accent === */
  --color-accent: {accent};
  --color-accent-subtle: {accent-50};

  /* === Semantic === */
  --color-success: #10B981;
  --color-warning: #F59E0B;
  --color-error: #EF4444;
  --color-info: #3B82F6;

  /* === Neutral === */
  --color-neutral-50: {neutral-50};
  --color-neutral-100: {neutral-100};
  --color-neutral-200: {neutral-200};
  --color-neutral-300: {neutral-300};
  --color-neutral-400: {neutral-400};
  --color-neutral-500: {neutral-500};
  --color-neutral-600: {neutral-600};
  --color-neutral-700: {neutral-700};
  --color-neutral-800: {neutral-800};
  --color-neutral-900: {neutral-900};
  --color-neutral-950: {neutral-950};

  /* === Surfaces === */
  --color-surface: #FFFFFF;
  --color-surface-raised: {neutral-50};
  --color-surface-overlay: rgba(0, 0, 0, 0.5);
  --color-border: {neutral-200};
  --color-border-strong: {neutral-300};

  /* === Text === */
  --color-text-primary: #1E293B;
  --color-text-secondary: #64748B;
  --color-text-tertiary: #94A3B8;
  --color-text-inverse: #F1F5F9;

  /* === Typography === */
  --font-heading: '{font-name}', system-ui, sans-serif;
  --font-body: '{font-name}', system-ui, sans-serif;
  --font-label: '{font-name}', system-ui, sans-serif;
  --font-mono: 'JetBrains Mono', 'Fira Code', monospace;

  /* === Sizes === */
  --text-xs: 0.75rem;    /* 12px */
  --text-sm: 0.875rem;   /* 14px */
  --text-base: 1rem;     /* 16px */
  --text-lg: 1.125rem;   /* 18px */
  --text-xl: 1.25rem;    /* 20px */
  --text-2xl: 1.5rem;    /* 24px */
  --text-3xl: 1.875rem;  /* 30px */
  --text-4xl: 2.25rem;   /* 36px */

  /* === Spacing === */
  --space-1: 0.25rem;    /* 4px */
  --space-2: 0.5rem;     /* 8px */
  --space-3: 0.75rem;    /* 12px */
  --space-4: 1rem;       /* 16px */
  --space-6: 1.5rem;     /* 24px */
  --space-8: 2rem;       /* 32px */
  --space-12: 3rem;      /* 48px */
  --space-16: 4rem;      /* 64px */

  /* === Radius === */
  --radius-sm: {radius-sm}px;
  --radius-md: {radius-md}px;
  --radius-lg: {radius-lg}px;
  --radius-full: 9999px;

  /* === Shadows === */
  --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
  --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
  --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
  --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
}

/* === Dark Mode === */
[data-theme="dark"], .dark {
  --color-primary: {primary-400};
  --color-primary-hover: {primary-300};
  --color-primary-active: {primary-200};
  --color-primary-subtle: {primary-950};
  --color-on-primary: #0F172A;

  --color-secondary: {secondary-400};
  --color-secondary-hover: {secondary-300};
  --color-secondary-active: {secondary-200};
  --color-secondary-subtle: {secondary-950};
  --color-on-secondary: #0F172A;

  --color-accent: {accent-400};
  --color-accent-subtle: {accent-950};

  --color-surface: #0F172A;
  --color-surface-raised: #1E293B;
  --color-surface-overlay: rgba(0, 0, 0, 0.7);
  --color-border: #334155;
  --color-border-strong: #475569;

  --color-text-primary: #F1F5F9;
  --color-text-secondary: #94A3B8;
  --color-text-tertiary: #64748B;
  --color-text-inverse: #1E293B;
}
```

**Reglas de derivacion de radius por roundness:**

| Roundness | radius-sm | radius-md | radius-lg |
|-----------|-----------|-----------|-----------|
| Sharp (ROUND_FOUR) | 2 | 4 | 6 |
| Medium (ROUND_EIGHT) | 4 | 8 | 12 |
| Rounded (ROUND_TWELVE) | 6 | 12 | 16 |
| Full (ROUND_FULL) | 8 | 16 | 9999 |

### 2.3 Generar `tailwind.config.js`

```javascript
// Brand Kit — {Nombre del Producto}
// Generated by /visual-setup

/** @type {import('tailwindcss').Config} */
export default {
  theme: {
    extend: {
      colors: {
        primary: {
          DEFAULT: 'var(--color-primary)',
          hover: 'var(--color-primary-hover)',
          active: 'var(--color-primary-active)',
          subtle: 'var(--color-primary-subtle)',
        },
        secondary: {
          DEFAULT: 'var(--color-secondary)',
          hover: 'var(--color-secondary-hover)',
          active: 'var(--color-secondary-active)',
          subtle: 'var(--color-secondary-subtle)',
        },
        accent: {
          DEFAULT: 'var(--color-accent)',
          subtle: 'var(--color-accent-subtle)',
        },
        success: 'var(--color-success)',
        warning: 'var(--color-warning)',
        error: 'var(--color-error)',
        info: 'var(--color-info)',
        surface: {
          DEFAULT: 'var(--color-surface)',
          raised: 'var(--color-surface-raised)',
        },
        border: {
          DEFAULT: 'var(--color-border)',
          strong: 'var(--color-border-strong)',
        },
      },
      fontFamily: {
        heading: 'var(--font-heading)',
        body: 'var(--font-body)',
        label: 'var(--font-label)',
        mono: 'var(--font-mono)',
      },
      borderRadius: {
        sm: 'var(--radius-sm)',
        md: 'var(--radius-md)',
        lg: 'var(--radius-lg)',
        full: 'var(--radius-full)',
      },
      boxShadow: {
        sm: 'var(--shadow-sm)',
        md: 'var(--shadow-md)',
        lg: 'var(--shadow-lg)',
        xl: 'var(--shadow-xl)',
      },
    },
  },
};
```

### 2.4 Generar `SKILL.md` (resumen compacto para agentes)

Este archivo es lo que los sub-agentes (AG-02, AG-06) reciben en su contexto. Maximo ~600 tokens.

```markdown
# Brand: {Nombre del Producto}

> {Dominio} — Estetica: {nombre estetica}

## Paleta

| Rol | Hex | Uso |
|-----|-----|-----|
| Primary | {hex} | CTAs, links, focus rings, active states |
| Secondary | {hex} | Secondary buttons, tags, badges |
| Accent | {hex} | Highlights, notifications, progress |
| Neutral | {neutral-500} | Borders, dividers, disabled states |

## Tipografia

- **Heading**: {font-name} (bold/semibold)
- **Body**: {font-name} (regular, 16px base)
- **Label**: {font-name} (medium, 14px)
- **Mono**: JetBrains Mono (code blocks)

## Forma

- **Radius**: {roundness-name} ({N}px base)
- **Shadows**: {subtle/moderate/elevated} — usar shadow-sm por defecto, shadow-md para cards elevadas
- **Borders**: 1px solid neutral-200 (light) / neutral-700 (dark)

## Reglas

1. Primary solo para CTAs principales y elementos interactivos primarios
2. Secondary para acciones secundarias, nunca para texto
3. Neutral-50 para fondos de cards, neutral-100 para fondos de seccion
4. Mantener contraste minimo 4.5:1 (AA) para texto
5. Dark mode usa las variantes -400 de primary/secondary (mas brillantes sobre fondo oscuro)
6. Espaciado consistente: multiplos de 4px (space-1 a space-16)
```

### 2.5 Generar `light.md` (especificaciones tema claro)

```markdown
# {Nombre} — Light Theme

## Surfaces
- Background: #FFFFFF
- Card: {neutral-50}
- Section alt: {neutral-100}
- Sidebar: #FFFFFF border-r neutral-200

## Text
- Primary: #1E293B
- Secondary: #64748B
- Disabled: #CBD5E1

## Interactive
- Button primary: bg {primary}, text white, hover {primary-600}
- Button secondary: bg white, border {neutral-300}, hover bg {neutral-50}
- Input: bg white, border {neutral-300}, focus ring {primary}/20%
- Link: {primary}, hover {primary-700}, underline on hover

## Feedback
- Success: bg #ECFDF5, border #10B981, text #065F46
- Error: bg #FEF2F2, border #EF4444, text #991B1B
- Warning: bg #FFFBEB, border #F59E0B, text #92400E
- Info: bg #EFF6FF, border #3B82F6, text #1E40AF
```

### 2.6 Generar `dark.md` (especificaciones tema oscuro)

```markdown
# {Nombre} — Dark Theme

## Surfaces
- Background: #0F172A
- Card: #1E293B
- Section alt: #334155
- Sidebar: #0F172A border-r #334155

## Text
- Primary: #F1F5F9
- Secondary: #94A3B8
- Disabled: #475569

## Interactive
- Button primary: bg {primary-400}, text #0F172A, hover {primary-300}
- Button secondary: bg #1E293B, border #475569, hover bg #334155
- Input: bg #1E293B, border #475569, focus ring {primary-400}/20%
- Link: {primary-400}, hover {primary-300}, underline on hover

## Feedback
- Success: bg #064E3B, border #10B981, text #A7F3D0
- Error: bg #7F1D1D, border #EF4444, text #FECACA
- Warning: bg #78350F, border #F59E0B, text #FDE68A
- Info: bg #1E3A5F, border #3B82F6, text #BFDBFE
```

### 2.7 Confirmar Brand Kit generado

```
Brand Kit generado en doc/brand/brand_kit/:
├── SKILL.md          — Resumen para agentes (~600 tokens)
├── variables.css     — Tokens CSS (light + dark)
├── tailwind.config.js — Configuracion Tailwind con CSS vars
├── light.md          — Specs tema claro
└── dark.md           — Specs tema oscuro

¿Quieres revisar o ajustar algun archivo antes de continuar?
```

---

## Paso 3: Configurar Google Stitch

### 3.1 Verificar API Key de Stitch

```
¿Hay API Key de Stitch configurada?
├── stitch_set_api_key ya ejecutado → Continuar
├── stitch.apiKey en settings.local.json → Usar esa
└── No hay key → Preguntar al usuario:
    "Necesito tu API Key de Google Stitch para crear el proyecto y design system.
     Puedes obtenerla en: https://stitch.withgoogle.com/settings
     Introduce tu API Key:"
```

Si el usuario proporciona API Key, configurarla via MCP:

```
mcp__SpecBox-MCP__stitch_set_api_key(
  project="{project_path}",
  api_key="{api_key}"
)
```

### 3.2 Crear proyecto en Stitch

> Solo si no hay `stitch.projectId` valido en settings.

```
mcp__stitch__create_project(
  title="{Nombre del Producto}"
)
```

Guardar el `projectId` retornado para el siguiente paso.

### 3.3 Crear Design System en Stitch

**CRITICO**: El `designMd` es el campo mas importante. Stitch lo lee para guiar TODA la generacion visual. Debe ser un resumen denso y completo del brand kit.

```
mcp__stitch__create_design_system(
  projectId="{stitch_project_id}",
  designSystem={
    "displayName": "{Nombre del Producto} Design System",
    "theme": {
      "colorMode": "LIGHT",
      "headlineFont": "{FONT_ENUM}",
      "bodyFont": "{FONT_ENUM}",
      "labelFont": "{FONT_ENUM}",
      "roundness": "{ROUND_FOUR|ROUND_EIGHT|ROUND_TWELVE|ROUND_FULL}",
      "customColor": "{primary_hex}",
      "overridePrimaryColor": "{primary_hex}",
      "overrideSecondaryColor": "{secondary_hex}",
      "overrideTertiaryColor": "{accent_hex}",
      "overrideNeutralColor": "{neutral_500_hex}",
      "colorVariant": "{color_variant}",
      "designMd": "{design_md_content}"
    }
  }
)
```

**Mapeo de estetica a colorVariant:**

| Estetica | colorVariant | Razon |
|----------|-------------|-------|
| Calm Enterprise | TONAL_SPOT | Palette armonica, profesional |
| Bold Startup | VIBRANT | Colores saturados, energeticos |
| Minimal Tool | NEUTRAL | Palette restringida, funcional |
| Financial Pro | FIDELITY | Fidelidad al color elegido |
| Health & Care | TONAL_SPOT | Armonia natural, confianza |
| Developer DX | EXPRESSIVE | Colores distintos, personalidad |
| Custom | TONAL_SPOT | Default seguro |

**Contenido del `designMd`** (~2000 palabras max):

Generar un Markdown denso que incluya:

```markdown
# {Nombre del Producto} — Design Guidelines

## Brand Identity
- Product: {nombre} — {dominio}
- Aesthetic: {estetica} ({referentes})
- Visual tone: {profesional/energetico/minimal/calido/tecnico}

## Color System
- Primary: {hex} — Use for CTAs, active states, focus rings, primary actions
- Secondary: {hex} — Use for secondary buttons, tags, badges, supporting elements
- Accent: {hex} — Use for highlights, notifications, progress indicators
- Semantic: Success #10B981, Warning #F59E0B, Error #EF4444, Info #3B82F6
- Neutrals: Scale from {neutral-50} (lightest bg) to {neutral-900} (darkest text)
- RULE: Primary buttons are solid primary bg with white text. Secondary buttons are outlined with neutral border.
- RULE: Card backgrounds use neutral-50. Section alternating backgrounds use neutral-100.

## Typography
- Headings: {font-name}, bold, sizes 36/30/24/20px (h1/h2/h3/h4)
- Body: {font-name}, regular, 16px base, line-height 1.5
- Labels: {font-name}, medium, 14px, letter-spacing 0.01em
- RULE: Maximum 2 font weights per page. Bold for headings, regular for body.

## Shape & Spacing
- Border radius: {N}px base ({roundness-name})
- Buttons: {radius-md}px radius
- Cards: {radius-lg}px radius
- Inputs: {radius-md}px radius
- Spacing: 4px grid. Minimum padding inside cards: 16px. Section gaps: 48px.
- RULE: All interactive elements have at least 44px tap target.

## Component Patterns
- Cards: white bg, {radius-lg}px radius, shadow-sm, 1px border neutral-200, 24px padding
- Buttons: {radius-md}px radius, 14px font, 500 weight, 12px 24px padding
- Inputs: {radius-md}px radius, 1px border neutral-300, 12px 16px padding, focus ring 2px primary/20%
- Tables: header bg neutral-50, rows alternate white/neutral-50, 1px border-b neutral-200
- Navigation: fixed top, white bg, shadow-sm, 64px height
- Sidebar: 280px width, white bg, border-r neutral-200

## Layout Principles
- Max content width: 1280px (centered)
- Grid: 12 columns with 24px gap
- Responsive breakpoints: sm 640px, md 768px, lg 1024px, xl 1280px
- {desktop-first|mobile-first} approach

## Visual Hierarchy
1. Page title (h1) — largest, bold, primary text color
2. Section title (h2) — medium, semibold
3. Card title (h3) — smaller, semibold
4. Body text — regular weight, secondary text for descriptions

## Do NOT
- Use gradients on backgrounds (flat colors only)
- Use more than 2 font sizes in a single card
- Stack more than 3 CTAs in one viewport
- Use shadows heavier than shadow-md on cards
- Mix rounded and sharp corners in the same view
```

### 3.4 Guardar asset ID del Design System

Tras la creacion, `create_design_system` retorna un `name` con formato `assets/{asset_id}`.
Extraer el `asset_id` y guardar para siguiente paso.

### 3.5 Aplicar Design System al proyecto

Inmediatamente despues de crear el Design System, llamar a `update_design_system` para activarlo:

```
mcp__stitch__update_design_system(
  name="assets/{asset_id}",
  projectId="{stitch_project_id}",
  designSystem={...mismo objeto que en create...}
)
```

### 3.6 Confirmar con usuario

```
Google Stitch configurado:
├── Proyecto: "{Nombre}" (ID: {stitch_project_id})
├── Design System: "{Nombre} Design System" (Asset: {asset_id})
├── Color Mode: LIGHT (dark mode se implementa en codigo)
├── Font: {font_name}
├── Roundness: {roundness_name}
└── Color Variant: {variant}

¿Todo correcto?
```

### 3.7 Generar DESIGN.md canónico (v5.31.0)

Una vez configurado el Design System de Stitch, materializar también un
`DESIGN.md` canónico — formato oficial de Google
(github.com/google-labs-code/design.md) que Stitch lee como contexto
persistente en cada generación. Sin esto, las pantallas tienden a
derivar visualmente entre sí.

```
generate_design_md_tool(
  project="{project-slug}",
  project_root="{absolute_path_a_la_raiz_del_proyecto}",
  project_name="{Nombre Visible}",
  archetype_override=None  # opcional: corporate|startup|creative|consumer|gen_z|gov
)
```

Esto crea `doc/design/DESIGN.md` con:
- YAML front-matter con `colors`, `typography`, `rounded`, `spacing`, `components` (todos en hex codes o token references — nunca nombres de color)
- Body Markdown con secciones `Overview`, `Colors`, `Typography`, `Layout`, `Elevation & Depth`, `Shapes`, `Components`, `Do's and Don'ts`

El generador lee el Brand Kit recién creado (`doc/brand/brand_kit.md`),
el VEG si ya existe, y los documentos canónicos `doc/app/app_prd.md` /
`doc/app/app_spec.md`. Si falta cualquier input, completa con el
arquetipo VEG más cercano (default `startup`).

Inmediatamente después, registrar el DESIGN.md frente al proyecto Stitch:

```
upload_design_md_to_stitch(
  project="{project-slug}",
  stitch_project_id="{stitch_project_id}",
  project_root="{absolute_path}"
)
```

Hoy esto registra DESIGN.md en `meta.json` con modo `inline-prefix`:
las herramientas de generación posteriores (Phase 4 fallback +
batched build) anteponen el contenido al prompt automáticamente. El
día que Google añada un endpoint nativo de attach, el comportamiento
upgradea sin requerir cambio del skill.

### 3.8 Confirmar DESIGN.md

```
DESIGN.md canónico generado:
├── Path: doc/design/DESIGN.md
├── Signature: {sha256_first_8}
├── Archetype detectado: {auto|override}
├── Secciones presentes: {sections_list}
└── Registrado en proyecto Stitch: {stitch_project_id} (modo inline-prefix)

A partir de ahora, /plan y /implement leerán este DESIGN.md como fuente
de verdad visual. Si modificas el Brand Kit, vuelve a correr este skill
o `generate_design_md_tool` para regenerarlo (idempotente).
```

---

## Paso 4: Configurar VEG Base

> Solo si no existe `doc/veg/base/` o el usuario pidio regenerar.

### 4.1 Crear estructura

```bash
mkdir -p doc/veg/base
```

### 4.2 Generar VEG base

Crear `doc/veg/base/veg-{project-slug}.md` derivando TODAS las directivas del brand kit (no inventar):

```markdown
# VEG: {Nombre del Producto} — Base

> Feature: Global (base para todas las features)
> Modo: uniforme
> Generado: {fecha}

## Contexto del Target

- **Quien**: {derivar del dominio — ej: "Profesionales financieros que gestionan inversiones"}
- **Referentes visuales**: {referentes de la estetica elegida}
- **Tolerancia visual**: {minimal / balanced / expressive — derivar de estetica}
- **Plataforma primaria**: {desktop-first / mobile-first}

## Pilar 1: Imagenes

### Estrategia de imagen

| Campo | Valor |
|-------|-------|
| Tipo | {derivar de estetica y dominio} |
| Mood | {derivar de estetica} |
| Paleta | {derivar de colores elegidos} |
| Sujetos | {derivar de dominio} |

### Prompts de imagen por seccion

| Seccion | Tipo | Prompt |
|---------|------|--------|
| Hero | {tipo} | "{prompt contextualizado al dominio y estetica}" |
| Features | {tipo} | "{prompt}" |
| Empty states | {tipo} | "{prompt}" |
| Backgrounds | {tipo} | "{prompt}" |

## Pilar 2: Motion

### Estrategia de motion

| Campo | Valor |
|-------|-------|
| Nivel | {derivar de estetica: calm→subtle, bold→moderate, minimal→subtle} |
| Personalidad | {derivar de estetica} |

### Catalogo de animaciones

| Tipo | Animacion | Duracion | Easing |
|------|-----------|----------|--------|
| page_enter | {derivar} | {N}ms | {derivar} |
| scroll_reveal | {derivar} | {N}ms | {derivar} |
| scroll_stagger_delay | — | {N}ms | — |
| hover_buttons | {derivar} | {N}ms | — |
| loading | {derivar} | — | — |
| transitions_pages | {derivar} | {N}ms | — |
| transitions_modals | {derivar} | {N}ms | — |
| feedback_success | {derivar} | — | — |
| feedback_error | {derivar} | — | — |

**Reglas de nivel:**
- subtle: SOLO page_enter + loading. Skip scroll, hover, feedback.
- moderate: Todos excepto feedback.
- expressive: Catalogo completo.

## Pilar 3: Diseno

### Estrategia de diseno

| Campo | Valor |
|-------|-------|
| Densidad | {derivar de estetica} |
| Whitespace | {derivar de estetica} |
| Separacion de secciones | {derivar de estetica} |

### Tipografia

| Campo | Valor |
|-------|-------|
| Heading weight | {derivar} |
| Body spacing | {derivar} |
| Hero scale | {derivar} |

### Jerarquia visual

| Campo | Valor |
|-------|-------|
| Estilo | {derivar de estetica y dominio} |
| CTA prominence | {derivar} |
| Data presentation | {derivar de dominio} |

## Form Factor Adaptations

### Desktop (>= 1024px)
- Layout: {derivar — ej: sidebar + main content area}
- Grid: 12 columnas, gap 24px
- Max width: 1280px centered
- Navigation: {top bar / sidebar / combined}

### Tablet (768px - 1023px)
- Layout: {derivar — ej: collapsible sidebar, stack secondary panels}
- Grid: 8 columnas, gap 16px
- Navigation: {hamburger / bottom tabs / collapsible sidebar}

### Mobile (< 768px)
- Layout: {derivar — ej: single column, bottom sheet for details}
- Grid: 4 columnas, gap 12px
- Navigation: {bottom tabs / hamburger}
- Touch targets: minimo 44px

## Resumen para inyeccion en sub-agentes (~400 tokens)

> Este bloque es lo que viaja a los sub-agentes dentro del context budget.

VEG [uniforme] Base: {Nombre del Producto}
Images: {type}, mood {mood}, palette {palette}
Motion: level {level}, personality {personality}
  - page_enter: {animation} {duration}ms {easing}
  - scroll: {animation} stagger {delay}ms
  - loading: {style}
  - transitions: {pages} {duration}ms
Design: density {density}, whitespace {whitespace}
  - hierarchy: {style}, CTA {prominence}
  - typography: heading {weight}, body {spacing}, hero {scale}
Form factors: {desktop-first|mobile-first}, breakpoints 640/768/1024/1280
Brand: {primary} + {secondary}, font {font-name}, radius {N}px
```

**Reglas de derivacion por estetica:**

| Estetica | Densidad | Whitespace | Motion Level | Hierarchy | CTA |
|----------|----------|------------|--------------|-----------|-----|
| Calm Enterprise | balanced | generous | subtle | card-based | medium |
| Bold Startup | balanced | moderate | moderate | full-bleed | high |
| Minimal Tool | compact | moderate | subtle | minimal | subtle |
| Financial Pro | compact | moderate | subtle | dashboard | medium |
| Health & Care | spacious | generous | moderate | card-based | medium |
| Developer DX | compact | moderate | subtle | dashboard | medium |

---

## Paso 5: Configurar Multi-Form-Factor y Prompt Template

### 5.1 Actualizar `settings.local.json`

Leer `.claude/settings.local.json` actual (o crear si no existe) y MERGE con:

```json
{
  "stitch": {
    "projectId": "{stitch_project_id}",
    "designSystemAssetId": "{asset_id}",
    "deviceType": "{DESKTOP|MOBILE}",
    "modelId": "GEMINI_3_PRO",
    "multiFormFactor": true,
    "formFactors": ["DESKTOP", "TABLET", "MOBILE"],
    "brandContextFile": "doc/brand/brand_kit/SKILL.md"
  }
}
```

**REGLA**: Hacer MERGE con el JSON existente, no sobrescribir. Preservar todas las keys existentes (trello, plane, acceptance, etc.).

### 5.2 Generar `doc/design/stitch-prompt-template.md`

```bash
mkdir -p doc/design
```

```markdown
# Stitch Prompt Template — {Nombre del Producto}

> Generado por /visual-setup — usar como base para TODAS las generaciones de pantalla.
> Design System Asset: {asset_id}
> Stitch Project: {stitch_project_id}

## Estructura del Prompt

Cada generacion de pantalla via `mcp__stitch__generate_screen_from_text` debe seguir esta estructura:

---

### Template

```
[SCREEN NAME]
{UC-XXX}: {nombre del use case}

[PURPOSE]
{descripcion funcional de la pantalla — que hace el usuario aqui}

[VISUAL DIRECTION]
{Pegar aqui el bloque "Resumen para inyeccion" del VEG base o del VEG de la feature}

[LAYOUT]
- Device: {DESKTOP|TABLET|MOBILE}
- Structure: {descripcion del layout — ej: "sidebar left 280px + main content area"}
- Sections: {enumerar secciones de arriba a abajo}

[CONTENT]
- Header: {que muestra}
- Main: {contenido principal}
- Sidebar/Secondary: {si aplica}
- Footer/Actions: {botones, acciones}

[COMPONENTS]
- {componente 1}: {especificacion — ej: "data table with 5 columns, sortable, paginated"}
- {componente 2}: {especificacion}

[INTERACTIONS]
- {interaccion 1}: {ej: "click row → expand detail panel right"}
- {interaccion 2}: {ej: "filter dropdown → update table in place"}

[RULES]
- ALWAYS use LIGHT MODE (dark mode is handled in code via CSS variables)
- Follow the Design System applied to this project (asset {asset_id})
- Use brand colors: primary {primary_hex}, secondary {secondary_hex}
- Font: {font_name} for all text
- Radius: {roundness_name} ({N}px)
- Minimum touch target: 44px on mobile
- Maintain 4.5:1 contrast ratio for all text
```

---

## Multi-Form-Factor Protocol

Para cada pantalla que requiera responsive, generar 3 versiones:

| # | Form Factor | Stitch deviceType | Nombre archivo |
|---|------------|-------------------|----------------|
| 1 | Desktop | DESKTOP | `{uc-id}_{screen-name}_desktop.html` |
| 2 | Tablet | TABLET | `{uc-id}_{screen-name}_tablet.html` |
| 3 | Mobile | MOBILE | `{uc-id}_{screen-name}_mobile.html` |

**Reglas:**
- Generar SIEMPRE desktop primero (es la referencia principal)
- Tablet y mobile se generan con el mismo prompt + adaptaciones de layout
- Para tablet: colapsar sidebar, reducir columnas de grid, reorganizar panels
- Para mobile: single column, bottom sheet para detalles, bottom tabs para nav
- Guardar en: `doc/design/{feature}/{uc-id}/`

## Seleccion de Modelo

| Complejidad | Modelo | Cuando usar |
|-------------|--------|-------------|
| Simple | GEMINI_3_FLASH | Pantallas con 1-3 secciones, formularios simples, paginas de confirmacion |
| Compleja | GEMINI_3_PRO | Dashboards, tablas de datos, multi-panel, pantallas con >3 secciones |

## Referencia Rapida

| Parametro | Valor |
|-----------|-------|
| Stitch Project ID | `{stitch_project_id}` |
| Design System Asset | `{asset_id}` |
| Primary Color | `{primary_hex}` |
| Secondary Color | `{secondary_hex}` |
| Font | `{font_name}` |
| Roundness | `{roundness_name}` |
| Color Mode | LIGHT (siempre) |
| Brand Context | `doc/brand/brand_kit/SKILL.md` |
| VEG Base | `doc/veg/base/veg-{slug}.md` |
```

---

## Paso 6: Actualizar CLAUDE.md del Proyecto

### 6.1 Buscar CLAUDE.md del proyecto

```bash
ls CLAUDE.md 2>/dev/null
```

Si no existe → WARNING: "No se encontro CLAUDE.md en la raiz del proyecto. Creando seccion de diseno standalone en doc/brand/README.md."

### 6.2 Insertar seccion "Sistema de Diseno"

Buscar en CLAUDE.md un lugar apropiado para insertar (despues de "Stack" o "Estructura", antes de "Para contribuir"). Si ya existe una seccion de diseno, REEMPLAZARLA.

Insertar:

```markdown
## Sistema de Diseno

> Configurado via `/visual-setup` — {fecha}

### Identidad Visual

| Campo | Valor |
|-------|-------|
| Estetica | {nombre estetica} ({referentes}) |
| Dominio | {dominio} |
| Primary | `{primary_hex}` |
| Secondary | `{secondary_hex}` |
| Font | {font_name} |
| Roundness | {roundness_name} ({N}px) |
| Device | {desktop-first / mobile-first} |

### Google Stitch

| Campo | Valor |
|-------|-------|
| Project ID | `{stitch_project_id}` |
| Design System | `{asset_id}` |
| Color Mode | LIGHT (dark mode via CSS vars) |
| Multi-Form-Factor | DESKTOP + TABLET + MOBILE |

### Brand Kit

| Archivo | Ruta |
|---------|------|
| Resumen agentes | `doc/brand/brand_kit/SKILL.md` |
| CSS Tokens | `doc/brand/brand_kit/variables.css` |
| Tailwind Config | `doc/brand/brand_kit/tailwind.config.js` |
| Light Theme | `doc/brand/brand_kit/light.md` |
| Dark Theme | `doc/brand/brand_kit/dark.md` |

### VEG & Design

| Archivo | Ruta |
|---------|------|
| VEG Base | `doc/veg/base/veg-{slug}.md` |
| Prompt Template | `doc/design/stitch-prompt-template.md` |

### Reglas de Diseno

1. Stitch genera SIEMPRE en Light Mode — dark mode se implementa en codigo con tokens CSS
2. Todo prompt de Stitch debe seguir `doc/design/stitch-prompt-template.md`
3. Cada pantalla genera 3 form factors (desktop, tablet, mobile) si `multiFormFactor: true`
4. El Design System Asset se aplica automaticamente a todas las pantallas generadas
5. El brand kit se inyecta como contexto en sub-agentes (AG-02, AG-06)
```

### 6.3 Actualizar estructura del monorepo en CLAUDE.md

Si CLAUDE.md tiene una seccion de estructura de archivos/carpetas, agregar:

```
├── doc/
│   ├── brand/
│   │   ├── brand_kit/
│   │   │   ├── SKILL.md         ← Resumen compacto para agentes
│   │   │   ├── variables.css    ← Tokens CSS (light + dark)
│   │   │   ├── tailwind.config.js ← Config Tailwind
│   │   │   ├── light.md         ← Specs tema claro
│   │   │   └── dark.md          ← Specs tema oscuro
│   │   └── brand_briefing.md    ← (opcional) briefing original
│   ├── veg/
│   │   └── base/
│   │       └── veg-{slug}.md    ← VEG base global
│   └── design/
│       └── stitch-prompt-template.md ← Template de prompts Stitch
```

---

## Paso 7: Resumen y Validacion

### 7.1 Verificar completitud

Ejecutar checklist:

```
Verificacion de /visual-setup:
├── [x] Brand Kit generado en doc/brand/brand_kit/
│   ├── [x] SKILL.md (resumen agentes)
│   ├── [x] variables.css (tokens CSS)
│   ├── [x] tailwind.config.js
│   ├── [x] light.md
│   └── [x] dark.md
├── [x] Stitch configurado
│   ├── [x] Proyecto creado (ID: {id})
│   ├── [x] Design System creado (Asset: {id})
│   └── [x] settings.local.json actualizado
├── [x] VEG base generado
│   └── [x] doc/veg/base/veg-{slug}.md
├── [x] Multi-Form-Factor configurado
│   ├── [x] settings.local.json → multiFormFactor: true
│   └── [x] doc/design/stitch-prompt-template.md
├── [x] CLAUDE.md actualizado
│   ├── [x] Seccion "Sistema de Diseno"
│   └── [x] Estructura de archivos
└── [ ] Sin campos vacios en ningun archivo
```

### 7.2 Validar que no hay campos vacios

Buscar placeholders sin resolver:

```bash
grep -r "{.*}" doc/brand/brand_kit/ doc/veg/base/ doc/design/stitch-prompt-template.md 2>/dev/null
```

Si hay campos con `{placeholder}` → ERROR: listar y pedir al usuario los valores faltantes.

### 7.3 Mostrar resumen final

```markdown
## /visual-setup completado

### Identidad Visual: {Nombre del Producto}

| Artefacto | Estado | Ubicacion |
|-----------|--------|-----------|
| Brand Kit | Generado | `doc/brand/brand_kit/` |
| Stitch Project | Creado | ID: `{stitch_project_id}` |
| Design System | Aplicado | Asset: `{asset_id}` |
| VEG Base | Generado | `doc/veg/base/veg-{slug}.md` |
| Prompt Template | Generado | `doc/design/stitch-prompt-template.md` |
| settings.local.json | Actualizado | `.claude/settings.local.json` |
| CLAUDE.md | Actualizado | `CLAUDE.md` |

### Siguiente paso

El proyecto esta listo para `/plan`. Al ejecutar `/plan`:
- Los disenos de Stitch usaran el Design System configurado
- El VEG base se inyectara como "Visual Direction" en cada prompt
- Los 3 form factors se generaran automaticamente (si multiFormFactor: true)
- Los sub-agentes (AG-02, AG-06) recibiran el brand kit como contexto
```

---

## Manejo de Errores

### Stitch API no disponible

```
¿Stitch responde?
├── SI → Continuar normalmente
└── NO → Generar TODOS los artefactos locales (brand kit, VEG, template)
    └── WARNING: "Stitch no responde. Se generaron todos los artefactos locales.
         Cuando Stitch este disponible, ejecuta /visual-setup de nuevo
         para crear el proyecto y design system remotos."
    └── Marcar en settings.local.json: "stitch.pendingSetup": true
```

### Brand Kit parcial

```
¿El brand kit existente esta completo?
├── Tiene SKILL.md + variables.css → Completo, reusar
├── Solo tiene SKILL.md → Generar variables.css, tailwind, light.md, dark.md
├── Solo tiene variables.css → Generar SKILL.md, light.md, dark.md
└── Solo tiene briefing → Parsear y generar todo
```

### Usuario cancela en medio

Todos los artefactos generados hasta el punto de cancelacion se mantienen. El usuario puede re-ejecutar `/visual-setup` y el skill detectara lo que ya existe (Paso 0) y completara lo que falta.

---

## Referencia de Enums Stitch

### Fuentes (headlineFont, bodyFont, labelFont)

| Enum | Nombre | Estilo |
|------|--------|--------|
| GEIST | Geist | Modern, clean, Vercel |
| INTER | Inter | Neutral, versatile |
| DM_SANS | DM Sans | Geometric, friendly |
| PLUS_JAKARTA_SANS | Plus Jakarta Sans | Elegant, modern |
| SPACE_GROTESK | Space Grotesk | Technical, distinctive |
| SORA | Sora | Geometric, balanced |
| IBM_PLEX_SANS | IBM Plex Sans | Corporate, reliable |
| MANROPE | Manrope | Warm, rounded |
| RUBIK | Rubik | Soft, approachable |
| SOURCE_SANS_THREE | Source Sans 3 | Clean, readable |
| MONTSERRAT | Montserrat | Bold, impactful |
| WORK_SANS | Work Sans | Professional, balanced |
| BE_VIETNAM_PRO | Be Vietnam Pro | Modern, geometric |
| EPILOGUE | Epilogue | Contemporary, editorial |
| LEXEND | Lexend | Readable, accessibility |
| NEWSREADER | Newsreader | Serif, editorial |
| NOTO_SERIF | Noto Serif | Classic, serif |
| PUBLIC_SANS | Public Sans | Government, neutral |
| SPLINE_SANS | Spline Sans | Clean, tech |
| DOMINE | Domine | Serif, formal |
| LIBRE_CASLON_TEXT | Libre Caslon Text | Serif, elegant |
| EB_GARAMOND | EB Garamond | Serif, classic |
| LITERATA | Literata | Serif, reading |
| SOURCE_SERIF_FOUR | Source Serif 4 | Serif, versatile |
| METROPOLIS | Metropolis | Geometric, urban |
| NUNITO_SANS | Nunito Sans | Rounded, friendly |
| ARIMO | Arimo | Neutral, Arial-like |
| HANKEN_GROTESK | Hanken Grotesk | Clean, modern |

### Roundness

| Enum | CSS | UI Name |
|------|-----|---------|
| ROUND_FOUR | 4px | Sharp |
| ROUND_EIGHT | 8px | Medium |
| ROUND_TWELVE | 12px | Rounded |
| ROUND_FULL | 9999px | Full/Pill |

### Color Variant

| Enum | Descripcion | Mejor para |
|------|-------------|------------|
| TONAL_SPOT | Harmonious palette from seed | Default seguro, enterprise |
| VIBRANT | Saturated, energetic | Startups, consumer |
| NEUTRAL | Restrained, functional | Minimal, tools |
| FIDELITY | True to chosen color | Financial, brand-strict |
| EXPRESSIVE | Distinct, personality | Developer, creative |
| MONOCHROME | Single hue variations | Ultra-minimal |
| CONTENT | Derived from content | Media, galleries |
| RAINBOW | Full spectrum | Playful, kids |
| FRUIT_SALAD | Colorful, varied | Fun, casual |

### Color Mode

| Enum | Nota |
|------|------|
| LIGHT | **SIEMPRE usar LIGHT** — Stitch solo genera bien en light mode |
| DARK | No usar — dark mode se implementa en codigo con CSS vars |

### Device Type

| Enum | Breakpoint |
|------|-----------|
| DESKTOP | >= 1024px |
| TABLET | 768px - 1023px |
| MOBILE | < 768px |

> `AGNOSTIC` aparecía en versiones previas de la documentación pero **no existe** en el MCP real de Stitch (verificado vía `tools/list` en v6.4.0). Usar `DESKTOP` como fallback.

---

## Modo `--migrate-stitch` (v6.5.0)

Sub-comando que migra un proyecto del contrato legacy `inline_prefix_v1` al chain nativo `native_v2` (DESIGN.md → `create_design_system_from_design_md` → `apply_design_system`). Documentado end-to-end en [doc/migrations/v7_stitch_native_chain.md](../../doc/migrations/v7_stitch_native_chain.md). Cutover duro previsto para **v7.0**.

### Cuándo usarlo

- El usuario dice "migrar stitch", "pasar a chain nativa", "migrate stitch", "actualizar contrato stitch".
- `upgrade_project` emitió un hint `stitch_migration_pending`.
- Antes de empezar a trabajar en un proyecto v5.x con Stitch ya cableado.

### Pasos

**0. Pre-check**

- Lee `.claude/settings.local.json` del proyecto cliente (no del MCP).
- Lee `doc/design/DESIGN.md` si existe.
- Cuenta los HTML generados en `doc/design/{feature}/*.html` (estimación del nº de pantallas previas).
- Llama:
  ```
  detect_stitch_migration_case(
    project="<slug>",
    settings_local_json=<text>,
    design_md_content=<text>,
    generated_screens_count=<int>
  )
  ```
- Toma el `case` (A-F) y el `recommended_action`.

**1. Pide la recipe**

```
migrate_project_to_native_v2(
  project="<slug>",
  case="<A|B|C|D|E|F>",
  settings_local_json=<text>,
  design_md_content=<text>
)
```

Devuelve `{actions, files_to_write, stitch_calls, settings_patch, confirmation_required, notes}`.

**2. Presenta el plan al usuario**

- Muestra `actions` en orden + `notes`.
- Si `confirmation_required` no es null, dile al usuario el literal exacto que debe escribir (e.g., `MIGRATE-RETROACTIVE` para case D, `APPLY-PROPOSAL` para case E).
- Si el caso es `A`, sal sin hacer nada.

**3. Ejecuta cada action en orden**

| Action ID | Operación |
|-----------|-----------|
| `noop` | Nada |
| `set_contract_native_v2` | Aplica `settings_patch` a `.claude/settings.local.json` |
| `backup_design_md` / `backup_design_md_if_present` | Renombra DESIGN.md → DESIGN.md.pre-migration.bak |
| `regenerate_design_md_as_native_v2` | Llama `generate_design_md_tool(contract="native_v2", ...)` |
| `create_stitch_project_if_missing` | Llama `stitch_create_project` si no hay `stitch.projectId` |
| `upload_design_md_via_rest_batch_create` | Llama `stitch_upload_design_md` (auto-elige REST si >5KB) |
| `create_design_system_from_design_md` | Llama `stitch_create_design_system_from_design_md` |
| `list_design_systems` | Llama `stitch_list_design_systems` |
| `list_screens` | Llama `stitch_list_screens` (para case D) |
| `preview_apply_design_system` | Toma 3 screens representativas + fetch_screen_image antes y después, presenta al usuario |
| `WAIT_FOR_LITERAL_CONFIRMATION` | Bloquea hasta que el usuario escriba el literal exacto |
| `apply_design_system_to_all_screens` | Loop `stitch_apply_design_system` por instance |
| `generate_mapping_proposal_material3` | Construye Material 3 candidate desde el DESIGN.md custom |
| `WRITE_PROPOSAL_FOR_REVIEW` | Escribe `doc/design/migration_proposal_material3.md` |
| `delegate_to_orchestrator` | Para case F satellite: terminar y dirigir al orchestrator |

**4. Telemetría**

Tras cada acción exitosa, append a `.quality/logs/stitch-migration.jsonl`:
```json
{"ts": "<iso>", "project": "<slug>", "case": "<A-F>", "action": "<id>", "outcome": "ok|fail|skipped"}
```

**5. Rollback**

Si una acción falla a mitad:
- DESIGN.md.pre-migration.bak permanece (paso 3 lo creó primero).
- `settings.local.json` no se ha modificado hasta `set_contract_native_v2` (último step).
- Stitch project queda en estado intermedio: el usuario puede borrarlo desde la UI Stitch o ejecutar de nuevo `--migrate-stitch` (la recipe es idempotente).

### Casos resumidos

- **A**: ya en `native_v2` → no-op.
- **B**: Stitch configurado sin uso → flip de marker, no migración real.
- **C**: DESIGN.md sin Stitch project → backup + regen + bootstrap.
- **D**: Stitch project con screens → backup + regen + bootstrap + **preview + literal `MIGRATE-RETROACTIVE`** + apply a todas las instances.
- **E**: DESIGN.md custom → genera mapping_proposal_material3.md + literal `APPLY-PROPOSAL`.
- **F**: Multirepo → solo orchestrator migra.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.