From ca07927d38ddb46eb32cd2e86ea2d35fb1339e7a Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Tue, 21 Apr 2026 20:46:00 +0200 Subject: [PATCH] feat(design-system): DESIGN_SYSTEM.md + prompts + extract-design command - frontend/DESIGN_SYSTEM.md: contrato del @fn_library (regla suprema para Claude Design y agentes). - frontend/design_prompts/: 11 plantillas de prompt (onboarding, dashboard, crud, detail, settings, auth, error, custom, handoff_integrate) + questionnaire numerado para arranque rapido. - .claude/commands/extract-design.md: workflow de 10 pasos para extraer componentes nuevos y mejoras desde exports "standalone" de Claude Design al registry, sync al espejo fn-design-system y push a gitea+github. - .claude/scripts/extract_design_bundle.py: decodificador del bundle (base64+gzip en manifest, nombra JSX por heuristica de header). - .gitignore: ignorar subrepos/*/ (el mirror fn-design-system es repo propio con remotes dataforge/fn-design-system + gutierenmanuel/fn-design-system). Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/commands/extract-design.md | 281 ++++++++++++ .claude/scripts/extract_design_bundle.py | 159 +++++++ .gitignore | 3 + frontend/DESIGN_SYSTEM.md | 457 +++++++++++++++++++ frontend/design_prompts/INDEX.md | 23 + frontend/design_prompts/auth.md | 37 ++ frontend/design_prompts/crud.md | 43 ++ frontend/design_prompts/custom.md | 44 ++ frontend/design_prompts/dashboard.md | 36 ++ frontend/design_prompts/detail.md | 36 ++ frontend/design_prompts/error.md | 25 + frontend/design_prompts/handoff_integrate.md | 29 ++ frontend/design_prompts/onboarding.md | 23 + frontend/design_prompts/questionnaire.md | 349 ++++++++++++++ frontend/design_prompts/settings.md | 42 ++ 15 files changed, 1587 insertions(+) create mode 100644 .claude/commands/extract-design.md create mode 100755 .claude/scripts/extract_design_bundle.py create mode 100644 frontend/DESIGN_SYSTEM.md create mode 100644 frontend/design_prompts/INDEX.md create mode 100644 frontend/design_prompts/auth.md create mode 100644 frontend/design_prompts/crud.md create mode 100644 frontend/design_prompts/custom.md create mode 100644 frontend/design_prompts/dashboard.md create mode 100644 frontend/design_prompts/detail.md create mode 100644 frontend/design_prompts/error.md create mode 100644 frontend/design_prompts/handoff_integrate.md create mode 100644 frontend/design_prompts/onboarding.md create mode 100644 frontend/design_prompts/questionnaire.md create mode 100644 frontend/design_prompts/settings.md diff --git a/.claude/commands/extract-design.md b/.claude/commands/extract-design.md new file mode 100644 index 00000000..91b8a63d --- /dev/null +++ b/.claude/commands/extract-design.md @@ -0,0 +1,281 @@ +# /extract-design — Mejorar @fn_library con exports de Claude Design + +Eres un agente mejorador del design system. Tu trabajo es analizar un export "standalone" de Claude Design (`sources/frontend_designs/*.html`), identificar componentes nuevos o mejoras sobre `@fn_library`, aplicarlos al registry y propagarlos al espejo público `subrepos/fn-design-system` (GitHub + Gitea). + +**Objetivo:** cada diseño exportado debería dejar el registry un poco mejor que antes. Lo que Claude Design inventó para cubrir un hueco hoy → componente reutilizable del registry mañana. + +--- + +## Argumento + +`$ARGUMENTS` — ruta al `.html` en `sources/frontend_designs/`. Si no se proporciona: +1. Lista los `.html` bajo `sources/frontend_designs/` ordenados por fecha. +2. Muestra fecha + nombre + tamaño. +3. Pregunta cuál procesar. Default: el más reciente. + +--- + +## PASO 0 — Validar input + +```bash +ls -lht sources/frontend_designs/*.html 2>/dev/null +``` + +Si no existe el fichero, abortar. Si existe, leer las primeras líneas para confirmar que es un export de Claude Design (`__bundler/manifest`, `__bundler/template` en el HTML). + +--- + +## PASO 1 — Decodificar el bundle + +Ejecutar el extractor: + +```bash +python3 .claude/scripts/extract_design_bundle.py \ + "sources/frontend_designs/.html" \ + "sources/frontend_designs/_extracted/" +``` + +Esperado: directorio con `app.jsx`, `fn_library_emu.jsx`, `charts_emu.jsx`, `data.jsx` + fuentes woff2 + `manifest.json`. + +Si falta alguno de los 4 `.jsx` clave, inspeccionar por UUID; puede que Claude Design haya usado estructura distinta. Reportar al usuario. + +--- + +## PASO 2 — Inventariar el diseño + +Leer `app.jsx` y listar **todos los componentes React definidos** (funciones que empiezan con mayúscula o usan `function Xxx(`). Categorizar: + +### 2a. Componentes del export que YA existen en `@fn_library` +- Grep el barrel: `cat frontend/functions/ui/index.ts | grep "^export"`. +- Para cada componente del export, ver si aparece en el barrel. Registrar coincidencias. + +### 2b. Componentes nuevos (no existen en el registry) +Componentes React del `app.jsx` cuyo nombre no aparece en el barrel. Estos son **candidatos a extracción**. + +### 2c. Uso de variantes / props no documentadas +Leer `fn_library_emu.jsx` del export y comparar API con tus `.tsx` reales: + +```bash +# Comprobar componentes específicos si el export los usa con props nuevas +sqlite3 registry.db "SELECT id, signature, props FROM functions WHERE id = 'alert_ts_ui';" +``` + +Anotar discrepancias (variantes faltantes, props nuevas, tipos distintos). + +### 2d. Datos/patrones reutilizables en `data.jsx` +- RNG determinista (mulberry32) → candidato a `frontend/functions/core/rng_seeded_ts_core` o `python/functions/core/`. +- Helpers tipo `statusBadge()` → documentar como receta, no como componente. + +--- + +## PASO 3 — Consultar el registry para evitar duplicados + +Para cada componente candidato del paso 2b, búsqueda FTS5 antes de proponerlo: + +```bash +sqlite3 registry.db "SELECT id, kind, description FROM functions WHERE id IN (SELECT id FROM functions_fts WHERE functions_fts MATCH 'name:* OR description:') ORDER BY name;" +``` + +Si encuentras algo similar que pueda ser mejorado en lugar de duplicado, márcalo como **mejora** a ese existente. + +--- + +## PASO 4 — Presentar el diagnóstico al usuario + +Muestra en tablas separadas: + +### 🟢 Componentes nuevos candidatos + +| # | Nombre propuesto | Dominio | Líneas | Reutilizable en | API | +|---|---|---|---|---|---| +| 1 | `funnel_chart_ts_ui` | ui | ~35 | CRM, analytics, funnels genéricos | `(data: Array<{stage, value}>, variant?) → JSX` | + +### 🟡 Mejoras a componentes existentes + +| # | Componente | Mejora | Tipo | Riesgo | +|---|---|---|---|---| +| A | `alert_ts_ui` | Añadir variantes `success`, `warning`, `info` | Expandir enum | Bajo — no rompe API | +| B | `data_table_ts_ui` | Prop `density: 'compact'|'cozy'|'roomy'` | Añadir prop opcional | Bajo | + +### 🔵 Patrones a documentar (no componente) + +| Patrón | Dónde registrar | +|---|---| +| `statusBadge` helper | `DESIGN_SYSTEM.md` sección "patterns" | + +**Esperar confirmación.** El usuario responde con sintaxis `1,2,A,B` (o `all`, o `nuevos only`, o descarta algunos). Si dice `all`, aplica todo lo listado. + +--- + +## PASO 5 — Aplicar mejoras aprobadas + +### 5a. Para componentes nuevos (candidatos 🟢) + +Por cada aprobado: + +1. **Leer código** del `app.jsx` / `fn_library_emu.jsx` / `charts_emu.jsx` del export. +2. **Adaptar al stack real del registry:** + - Cambiar elementos SVG/HTML planos por primitivas de `@mantine/core` cuando corresponda (`Paper`, `Stack`, `Group`, `Text`). + - Cambiar `style={{...}}` por props Mantine (`p`, `m`, `fw`, `gap`, `radius`, `c`). + - Si es un chart, delegar en `@mantine/charts` cuando sea posible; solo usar SVG puro si Mantine no cubre el caso (ej: `Sparkline` en el registry ya es SVG puro por rendimiento). + - Iconos: `@tabler/icons-react`. +3. **Crear los dos ficheros** siguiendo la convención: + - `frontend/functions/ui/.tsx` — código React. + - `frontend/functions/ui/.md` — frontmatter completo. +4. **Frontmatter del .md** (campos clave): + ```yaml + id: _ts_ui + name: + kind: component + lang: ts + domain: ui + purity: impure + framework: react + version: 1.0.0 + description: "..." + tags: [...] + props: {...} + emits: null + params: [] + output: "JSX.Element — ..." + source_repo: "claude.ai/design" + source_license: "" + source_file: "sources/frontend_designs/.html" + file_path: frontend/functions/ui/.tsx + tested: false + ``` +5. **Añadir al barrel** `frontend/functions/ui/index.ts`: `export { Xxx } from './'`. + +### 5b. Para mejoras a componentes existentes (🟡) + +Por cada aprobada: + +1. **Leer** el `.tsx` actual. +2. **Aplicar la mejora** sin romper la API existente: añade prop opcional, amplía enum de `variant`, etc. +3. **Actualizar** el `.md` correspondiente para reflejar las nuevas variantes/props (campos `variant`, `props`, `description`). +4. **Si la firma cambia**, actualizar también el `signature` del frontmatter. + +### 5c. Para patrones a documentar (🔵) + +1. Añadir una sección "Patterns" en `frontend/DESIGN_SYSTEM.md` si no existe. +2. Registrar el patrón con un ejemplo corto. + +--- + +## PASO 6 — Indexar y verificar + +```bash +./fn index +``` + +- Si falla por integridad, arreglar y reintentar. +- Verificar cada componente nuevo: `./fn show `. +- Confirmar que el barrel compila haciendo `cd frontend && pnpm tsc --noEmit` (si tarda, al menos verificar imports manualmente). + +--- + +## PASO 7 — Sincronizar al espejo + +```bash +cd subrepos/fn-design-system +./sync_from_registry.sh +git add -A +git status --short # Mostrar qué cambió en el espejo +``` + +Si hay cambios, preparar commit. Si no, el sync no recogió las modificaciones — investigar. + +--- + +## PASO 8 — Commit en ambos repos + +### 8a. Commit en `fn_registry` + +```bash +git add frontend/functions/ui/ frontend/DESIGN_SYSTEM.md registry.db +git commit -m "$(cat <<'EOF' +feat(ui): extract components / improvements from design export + +From: sources/frontend_designs/.html + +New components: +- +- ... + +Improvements: +- +- ... + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +### 8b. Commit en el espejo + +```bash +cd subrepos/fn-design-system +git commit -m "sync: new components + improvements from + +Co-Authored-By: Claude Opus 4.7 (1M context) " +``` + +--- + +## PASO 9 — Push + +### 9a. Push del espejo (ambos remotes) + +```bash +cd subrepos/fn-design-system +./push_all.sh +``` + +Esto propaga a: +- `gitea/dataforge/fn-design-system` +- `github/gutierenmanuel/fn-design-system` ← este es el que Claude Design consume + +### 9b. Push de fn_registry + +**Preguntar al usuario** antes — no push sin permiso (ver CLAUDE.md del proyecto). Si dice sí: + +```bash +git push origin master +``` + +--- + +## PASO 10 — Resumen final + +Mostrar al usuario: + +``` +✓ Extracción completa. + +Nuevos componentes en @fn_library: + - (frontend/functions/ui/.tsx) + - ... + +Mejoras aplicadas: + - : + +Espejo actualizado: + - Commit gitea: + - Commit github: + +Claude Design verá estas mejoras en su próxima lectura del repo enlazado. +Siguiente acción sugerida: probar un prompt de dashboard que use . +``` + +--- + +## Reglas críticas + +- **NUNCA extraer sin aprobación explícita del usuario** — siempre paso 4 con tabla y espera. +- **NUNCA sobrescribir un componente existente** en el paso 5b — solo añadir variantes/props opcionales. Si la mejora es incompatible, proponerlo como propuesta aparte (`fn proposal add`) en vez de aplicarla. +- **SIEMPRE `source_repo: "claude.ai/design"`** en el frontmatter de componentes nuevos, y `source_file` apuntando al `.html` original. +- **SIEMPRE mantener el orden:** registry → index → verify → sync mirror → commit both → push mirror → (ask to push fn_registry). +- **El barrel `index.ts`** debe estar actualizado antes de hacer `fn index` (hay apps que lo importan). +- **NO committear** `operations.db*`, `node_modules/`, `dist/`, `.env` ni nada que `.gitignore` excluya. Usa `git add` con rutas explícitas, no `git add -A` a ciegas. +- **Si el usuario cancela a mitad**, dejar el working tree limpio o documentar qué quedó pendiente. No medio-commits. +- **Patrones que no tienen sentido como primitiva** (ej. envs, branding específico) → documentar, no componentizar. diff --git a/.claude/scripts/extract_design_bundle.py b/.claude/scripts/extract_design_bundle.py new file mode 100755 index 00000000..9e05cabe --- /dev/null +++ b/.claude/scripts/extract_design_bundle.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +""" +Extract Claude Design "standalone" HTML exports. + +Claude Design packs the whole React app as base64+gzip blobs inside +', + html, re.DOTALL, + ) + return m.group(1) if m else None + + +def extract(html_path: pathlib.Path, out_dir: pathlib.Path) -> dict: + html = html_path.read_text(encoding="utf-8") + + manifest_raw = grab_script(html, "manifest") + if not manifest_raw: + raise SystemExit(f"No