Extracción de Componentes al Design System
Porta un componente desde el design system legacy (frontend-nextjs/src/modules/desingSystem/)
hacia el monorepo design-system (packages @design-system/react + @design-system/icons).
El componente resultante vive en packages/react/src/components/<Nombre>/, se
exporta desde el barrel y tiene su story en apps/docs/src/stories/.
Lectura previa obligatoria
AGENTS.md del repo design-system — reglas, stack, build
DESIGN.md — decisiones de diseño que el componente debe respetar
- El componente legacy completo en
frontend-nextjs/src/modules/desingSystem/<Componente>/
- Un componente ya migrado similar (para replicar el patrón de tema y exports)
- El theme de MUI en
packages/react/src/theme/ — para conocer las variantes ya declaradas
Cuándo usar esta skill
- "migrá este componente al design system"
- "extraé el Button del legacy"
- "traé la Modal al DS"
- "movamos el TextField al monorepo"
- Cuando diseño pide componentizar algo que todavía vive en el frontend
Cuándo NO usar esta skill
- Diseñar un componente nuevo desde cero (no existe en el legacy) →
nextjs-design-craft
- Solo actualizar tokens →
design-token-sync
- Auditar un componente ya migrado →
component-qa
- Debuggear un bug en la migración →
nextjs-debug-flow
- Planificar una migración grande (>5 componentes) →
nextjs-architect primero
Flujo de trabajo
Fase 1 — Entender el componente legacy
- Leer la implementación original (componente + sus dependencias)
- Identificar:
- Props públicas (API del componente)
- Qué MUI usa internamente (Button, Menu, etc.)
- Variantes y estados propios (ej: color="chatbot", variant="selectedMenu")
- Si tiene íconos, textos o tokens hardcodeados
- Estilos inline vs sx vs theme
- Detectar dependencias del negocio (turns, procedures, users) — NO se migran
Fase 2 — Diseñar el componente en el DS
- Decidir el patrón: wrapper fino sobre MUI con el theme propio, o compound
- Mapear las variantes propias a las variantes del theme de MUI:
- Si el theme no declara la variante (ej:
color="chatbot"), agregarla al
theme en packages/react/src/theme/ (module augmentation en types/)
- Identificar tokens a usar (colors, spacing, border-radius) — si faltan, anotar
para
design-token-sync
- Si hay iconos: chequear
@design-system/icons; si no existe, crearlo o avisar
Fase 3 — Implementar
- Crear
packages/react/src/components/<Nombre>/
index.ts — export del componente y tipos
<Nombre>.tsx — implementación
types.ts — props con TypeScript estricto
- Usar el theme (
useTheme / sx con tokens), nunca colores hardcodeados
- Mantener componentes presentacionales — sin lógica de negocio
- Actualizar el barrel
packages/react/src/index.ts (o components/index.ts)
- Crear la story en
apps/docs/src/stories/<Nombre>.stories.tsx cubriendo
todas las variantes y estados del componente legacy
Fase 4 — Verificar y Documentar (Direct-to-Disk)
pnpm build:react — compila sin errores (incluye typecheck).
- Validación Determinista de Barrel Export:
Comprobar que el componente y sus types se reexportan correctamente desde
packages/react/src/index.ts:grep -En "from ['\"]\./components/<Nombre>['\"]" packages/react/src/index.ts
# O verificar en paquete compilado:
node -e 'const ds = require("./packages/react"); if (!ds.<Nombre>) { console.error("Falta export"); process.exit(1); } console.log("✓ Barrel export confirmado");'
- Checklist de Regresión Visual (Storybook Test Runner):
Contrastar el render visual y props computadas con la story:
pnpm test-storybook --stories="**/<Nombre>.stories.*"
Validar que paddings, fuentes y colores coincidan exactamente con la especificación y no haya regresiones respecto al legacy.
- Especificación Direct-to-Disk:
- Utilizar la plantilla oficial
templates/component-migration.template.md.
- Guardar el documento en
.agents/components/<Componente>-migration.md (write_to_file).
- Reportar en el chat únicamente el resumen sintético (archivos creados, variantes cubiertas y enlace a la especificación).
Reglas de lo que SÍ debe hacer
- Guardar la especificación de migración en
.agents/components/<Componente>-migration.md (write_to_file)
- Reportar en el chat únicamente el resumen sintético sin volcar código fuente
- Replicar la API pública del componente legacy (props iguales o mejor tipadas)
- Escribir directamente a disco (
write_to_file) el componente, types y la story
- Usar los tokens y el theme del DS — nunca hex/px hardcodeados
- Crear story con todas las variantes y estados (default, hover, disabled, etc.)
- Correr
pnpm build:react antes de dar por terminado
- Agregar al theme cualquier variante nueva declarada (con module augmentation)
- Mantener el componente dumb — la lógica queda en el frontend
Reglas de lo que NO debe hacer
- NO volcar archivos de código completos de componentes o stories en la respuesta de chat
- NO omitir la persistencia de la especificación en
.agents/components/<Componente>-migration.md
- NO migrar lógica de negocio (turns, procedures, users, queries) al DS
- NO importar de
frontend-nextjs desde el package react
- NO hardcodear colores, radios o spacing — usar tokens
- NO modificar el componente legacy original (la migración es aditiva)
- NO renombrar la API pública sin consultar al usuario
- NO commitear sin que
pnpm build (todo el monorepo) pase
- NO crear variantes ad-hoc sin declararlas en el theme tipado
- NO olvidar la story — sin story el componente no se considera migrado
- NO copiar estilos inline legacy — traducirlos al theme
Verificación
- Confirmar persistencia de la especificación en
.agents/components/<Componente>-migration.md.
pnpm build:react compila con éxito.
- Story renderiza todas las variantes del legacy en Storybook.
- El componente se exporta correctamente desde
packages/react/src/index.ts.
- Sin imports de negocio ni del frontend legacy.
- Sin valores hardcodeados que deberían ser tokens.
- API pública equivalente o mejorada respecto al original.
Al terminar
Confirmar persistencia de la especificación en .agents/components/<Componente>-migration.md. Sugerir al usuario: component-qa para auditar el componente migrado
(calidad, variantes cubiertas, a11y, comparación con Figma).
Después de QA, la cadena continúa con nextjs-code-review sobre el diff.
1---2name: component-migrator3description: Migra componentes del frontend legacy al monorepo @design-system/react. Adapta a MUI, configura theme augmentation, barrel export y story en Storybook. Escribe directo a disco. Usar con "migrá este componente", "extraé X al design system", "traé el Button al DS", "mover componente legacy".4---56# Extracción de Componentes al Design System78Porta un componente desde el design system legacy (`frontend-nextjs/src/modules/desingSystem/`)9hacia el monorepo `design-system` (packages `@design-system/react` + `@design-system/icons`).10El componente resultante vive en `packages/react/src/components/<Nombre>/`, se11exporta desde el barrel y tiene su story en `apps/docs/src/stories/`.1213## Lectura previa obligatoria1415- `AGENTS.md` del repo design-system — reglas, stack, build16- `DESIGN.md` — decisiones de diseño que el componente debe respetar17- El componente legacy completo en `frontend-nextjs/src/modules/desingSystem/<Componente>/`18- Un componente ya migrado similar (para replicar el patrón de tema y exports)19- El theme de MUI en `packages/react/src/theme/` — para conocer las variantes ya declaradas2021## Cuándo usar esta skill2223- "migrá este componente al design system"24- "extraé el Button del legacy"25- "traé la Modal al DS"26- "movamos el TextField al monorepo"27- Cuando diseño pide componentizar algo que todavía vive en el frontend2829## Cuándo NO usar esta skill3031- **Diseñar un componente nuevo desde cero** (no existe en el legacy) → `nextjs-design-craft`32- **Solo actualizar tokens** → `design-token-sync`33- **Auditar un componente ya migrado** → `component-qa`34- **Debuggear un bug en la migración** → `nextjs-debug-flow`35- **Planificar una migración grande (>5 componentes)** → `nextjs-architect` primero3637---3839## Flujo de trabajo4041### Fase 1 — Entender el componente legacy42431. Leer la implementación original (componente + sus dependencias)442. Identificar:45 - Props públicas (API del componente)46 - Qué MUI usa internamente (Button, Menu, etc.)47 - Variantes y estados propios (ej: color="chatbot", variant="selectedMenu")48 - Si tiene íconos, textos o tokens hardcodeados49 - Estilos inline vs sx vs theme503. Detectar dependencias del negocio (turns, procedures, users) — NO se migran5152### Fase 2 — Diseñar el componente en el DS53541. Decidir el patrón: wrapper fino sobre MUI con el theme propio, o compound552. Mapear las variantes propias a las variantes del theme de MUI:56 - Si el theme no declara la variante (ej: `color="chatbot"`), agregarla al57 theme en `packages/react/src/theme/` (module augmentation en `types/`)583. Identificar tokens a usar (colors, spacing, border-radius) — si faltan, anotar59 para `design-token-sync`604. Si hay iconos: chequear `@design-system/icons`; si no existe, crearlo o avisar6162### Fase 3 — Implementar63641. Crear `packages/react/src/components/<Nombre>/`65 - `index.ts` — export del componente y tipos66 - `<Nombre>.tsx` — implementación67 - `types.ts` — props con TypeScript estricto682. Usar el theme (`useTheme` / `sx` con tokens), nunca colores hardcodeados693. Mantener componentes presentacionales — sin lógica de negocio704. Actualizar el barrel `packages/react/src/index.ts` (o `components/index.ts`)715. Crear la story en `apps/docs/src/stories/<Nombre>.stories.tsx` cubriendo72 todas las variantes y estados del componente legacy7374### Fase 4 — Verificar y Documentar (Direct-to-Disk)75761. `pnpm build:react` — compila sin errores (incluye typecheck).772. **Validación Determinista de Barrel Export**:78 Comprobar que el componente y sus types se reexportan correctamente desde `packages/react/src/index.ts`:79 ```bash80 grep -En "from ['\"]\./components/<Nombre>['\"]" packages/react/src/index.ts81 # O verificar en paquete compilado:82 node -e 'const ds = require("./packages/react"); if (!ds.<Nombre>) { console.error("Falta export"); process.exit(1); } console.log("✓ Barrel export confirmado");'83 ```843. **Checklist de Regresión Visual (Storybook Test Runner)**:85 Contrastar el render visual y props computadas con la story:86 ```bash87 pnpm test-storybook --stories="**/<Nombre>.stories.*"88 ```89 Validar que paddings, fuentes y colores coincidan exactamente con la especificación y no haya regresiones respecto al legacy.904. **Especificación Direct-to-Disk**:91 - Utilizar la plantilla oficial [`templates/component-migration.template.md`](./templates/component-migration.template.md).92 - Guardar el documento en `.agents/components/<Componente>-migration.md` (`write_to_file`).93 - Reportar en el chat únicamente el resumen sintético (archivos creados, variantes cubiertas y enlace a la especificación).9495---9697## Reglas de lo que SÍ debe hacer9899- Guardar la especificación de migración en `.agents/components/<Componente>-migration.md` (`write_to_file`)100- Reportar en el chat únicamente el resumen sintético sin volcar código fuente101- Replicar la API pública del componente legacy (props iguales o mejor tipadas)102- Escribir directamente a disco (`write_to_file`) el componente, types y la story103- Usar los tokens y el theme del DS — nunca hex/px hardcodeados104- Crear story con todas las variantes y estados (default, hover, disabled, etc.)105- Correr `pnpm build:react` antes de dar por terminado106- Agregar al theme cualquier variante nueva declarada (con module augmentation)107- Mantener el componente dumb — la lógica queda en el frontend108109## Reglas de lo que NO debe hacer110111- NO volcar archivos de código completos de componentes o stories en la respuesta de chat112- NO omitir la persistencia de la especificación en `.agents/components/<Componente>-migration.md`113- NO migrar lógica de negocio (turns, procedures, users, queries) al DS114- NO importar de `frontend-nextjs` desde el package react115- NO hardcodear colores, radios o spacing — usar tokens116- NO modificar el componente legacy original (la migración es aditiva)117- NO renombrar la API pública sin consultar al usuario118- NO commitear sin que `pnpm build` (todo el monorepo) pase119- NO crear variantes ad-hoc sin declararlas en el theme tipado120- NO olvidar la story — sin story el componente no se considera migrado121- NO copiar estilos inline legacy — traducirlos al theme122123## Verificación124125- Confirmar persistencia de la especificación en `.agents/components/<Componente>-migration.md`.126- `pnpm build:react` compila con éxito.127- Story renderiza todas las variantes del legacy en Storybook.128- El componente se exporta correctamente desde `packages/react/src/index.ts`.129- Sin imports de negocio ni del frontend legacy.130- Sin valores hardcodeados que deberían ser tokens.131- API pública equivalente o mejorada respecto al original.132133## Al terminar134135Confirmar persistencia de la especificación en `.agents/components/<Componente>-migration.md`. Sugerir al usuario: **component-qa** para auditar el componente migrado136(calidad, variantes cubiertas, a11y, comparación con Figma).137Después de QA, la cadena continúa con **nextjs-code-review** sobre el diff.