Reporte del repositorio
Template Cuarzo, listo para agentes LLM
Un sistema de diseño en React 19, TanStack Start y Tailwind v4 convertido en un template que cualquier agente (Claude Code, OpenCode, Codex, Cursor) puede seguir sin alucinar: reglas escritas, comprobaciones automáticas y revisión obligatoria en el navegador.
En números
Métricas del repositorio
Cifras medidas automáticamente sobre el repositorio con npm run report:metrics en cada build.
- Límite de líneas
- 77
- por archivo de texto
- Archivo propio más largo
- 75
- líneas (excepciones aparte)
- Archivos vigilados
- 222
- código, guías, configs
- Archivos en src/
- 114
- TypeScript y TSX
- Familias de la librería
- 6
- módulos DDD de Cuarzo
- Módulos del showcase
- 8
- una página por módulo
- Exports públicos
- 30
- en src/index.ts
- Tests e2e
- 53
- escritorio y móvil
- Archivos de test
- 9
- en tests/e2e/
- Guías para agentes
- 23
- docs/agentes/, ≤77 líneas
- Scripts npm
- 26
- documentados en la guía 20
- Excepciones de líneas
- 8
- solo generados y plataforma
Entregables
Qué se hizo
Cada pestaña resume un tema con los archivos exactos donde vive.
Tres puntos de entrada equivalentes y 23 guías obligatorias con índice generado.
CLAUDE.md, OPENCODE.md y AGENTS.md
Resumen de reglas no negociables para cada agente; CLAUDE.md carga automáticamente las guías 00 y 01.
CLAUDE.mdOPENCODE.mdAGENTS.mdGuías obligatorias
Protocolo paso a paso, recetas, errores frecuentes, mapa real del repo y definición de terminado; cada una ≤77 líneas.
docs/agentes/Índice automático
INDICE.txt con título, propósito y líneas de cada guía; se pagina solo si crece y se verifica en el pre-commit.
docs/agentes/INDICE.txtscripts/docs/build-index.mjs
Ningún archivo de texto propio supera 77 líneas: código, CSS, JSON, guías y logs.
Comprobación global
check:lines recorre todos los archivos versionados y los logs; las únicas excepciones (generados y plataforma) están justificadas.
scripts/quality/check-lines.mjsquality/lines-allowlist.jsonESLint max-lines
Aviso inmediato en el editor para JS/TS, leyendo el mismo límite y las mismas excepciones.
tooling/eslint/line-limit.jsCódigo modularizado
El catálogo de 211 líneas pasó a ~15 archivos; Tabs, Pagination y Modal separaron lógica pura y hooks.
src/showcase/catalog/src/components/cuarzo/navigation/
Dos contextos (librería y showcase) con módulos y capas domain, application, infrastructure y presentation.
Librería por familias
actions, forms, feedback, containers, data, navigation y shared; la API publicada sigue en src/index.ts para Canvas.
src/components/cuarzo/src/index.tsShowcase por módulos
theme, layout, overview, color, typography, shape, catalog y report; las rutas son adaptadores sin JSX.
src/showcase/src/routes/_showcase/Fronteras verificadas
ESLint prohíbe imports entre capas en sentido incorrecto y entre módulos fuera de su index.ts; check:ddd valida ubicación y pureza.
tooling/eslint/ddd-layers.jsscripts/quality/ddd-rules.mjs
Todo elemento interactivo tiene un identificador estable y único para Playwright.
Convención de nombres
page-<slug>, nav-link-<slug>, catalog-*, demo-<componente>-<caso>; documentada con tabla de prefijos.
docs/agentes/08-test-ids.mdPropagación en la librería
Cada componente declara data-slot y deriva ids de sus subpartes (Modal -close, Tabs -tab-<id>, Pagination -page-<n>).
src/components/cuarzo/shared/domain/test-id.tsTest global
Recorre todas las rutas del menú y falla si un interactivo no tiene id o si un id se repite.
tests/e2e/quality/testids.spec.ts
Revisión obligatoria en navegador real, por MCP o por scripts, más una batería e2e.
MCP configurado
Claude Code (.mcp.json) y OpenCode (opencode.json) usan el mismo lanzador, que reutiliza el Chromium de los tests.
.mcp.jsonopencode.jsonscripts/playwright/mcp.mjsInspección por Node
pw:inspect guarda captura, ids, h1, desborde y errores de consola de cada ruta, en claro u oscuro y a cualquier ancho.
scripts/playwright/inspect.mjsTests e2e
Navegación, tema, buscador, modal, controles, testids, responsive y reporte; escritorio y móvil; fallan ante cualquier error de consola.
tests/e2e/playwright.config.ts
Todo error queda en archivos de texto de ≤77 líneas con un índice que dice qué leer primero.
Logger paginado
parte-0001.txt, parte-0002.txt… sin colores ANSI; logs/INDICE.txt se regenera solo.
scripts/lib/txt-log.mjsscripts/lib/log-index.mjsFuentes capturadas
Servidor de desarrollo, errores del navegador (plugin de Vite), Playwright, cada paso de verify y un historial común de errores.
tooling/vite/agent-log-plugin.tslogs/LEEME.txtVista rápida
npm run logs muestra índice, último resultado y últimos errores de una vez.
scripts/dev/show-logs.mjs
npm como gestor documentado y un puerto único, poco común y estricto: 43177.
Puerto 43177 estricto
Definido en config/dev-server.json; si está ocupado Vite falla en vez de saltar a otro.
config/dev-server.jsonvite.config.tsServidor sin bloquear
dev:bg arranca en segundo plano y espera a que responda; dev:stop lo detiene. Detecta sistemas sin IPv6.
scripts/dev/start-bg.mjstooling/vite/listen-host.tsGeneradores
nuevo:componente y nuevo:modulo crean archivos que ya cumplen DDD, 77 líneas y data-testid.
scripts/scaffold/
Las reglas no dependen de la memoria del agente: se comprueban solas.
Hooks de Claude Code
Validación tras cada edición, recordatorio al iniciar y bloqueo al terminar si hay reglas rotas o falta pasar Playwright.
.claude/settings.jsonscripts/hooks/Pre-commit de git
verify:rapido (índices, líneas, DDD, lint, tipos) antes de cada commit; se activa con npm install.
.githooks/pre-commitnpm run verify
Siete pasos en orden con resumen en logs/ultimo-resultado.txt; build:pages genera el sitio estático de este reporte.
scripts/quality/verify.mjsscripts/deploy/build-pages.mjs
Domain-Driven Design
Arquitectura
Dos contextos delimitados; cada módulo se divide en las capas que necesite y solo expone su index.ts.
Librería Cuarzo
src/components/cuarzo/
Se publica y Lovable la adjunta a otros proyectos. API pública: src/index.ts.
Showcase
src/showcase/
Este sitio. No se publica con la librería; cada página es un módulo y su ruta un adaptador.
| Capa | Contiene | Puede importar |
|---|---|---|
| domain/ | Tipos, datos, reglas y funciones puras | Nada: sin React, sin window |
| application/ | Hooks y casos de uso | domain, infrastructure, React |
| infrastructure/ | localStorage, fetch, matchMedia, DOM | domain |
| presentation/ | Componentes React (JSX) | domain, application |
Calidad
Cómo se verifica
Un solo comando ejecuta todo en orden y deja el resumen en logs/ultimo-resultado.txt.
| Paso | Comando | Comprueba | Estado |
|---|---|---|---|
| Índices | npm run docs:index | INDICE.txt de las guías al día | Correcto |
| Líneas | npm run check:lines | Ningún archivo propio supera 77 líneas | Correcto |
| DDD | npm run check:ddd | Ubicación, pureza de domain, rutas sin JSX, data-testid y data-slot | Correcto |
| Lint | npm run lint | ESLint, capas DDD y max-lines | Correcto |
| Tipos | npm run typecheck | TypeScript estricto sin errores | Correcto |
| Build | npm run build | Build de producción (Cloudflare Workers) | Correcto |
| E2E | npm run test:e2e | Playwright en escritorio y móvil, sin errores de consola | Correcto |
tests/e2e/showcase/navigation.spec.tsCada ruta carga, h1 único, menú activotests/e2e/showcase/theme.spec.tsTema claro/oscuro, persistencia y preferencia del sistematests/e2e/catalog/search.spec.tsBuscador del catálogo y anclastests/e2e/catalog/overlays.spec.tsModal: Escape, foco de vuelta, cerrartests/e2e/catalog/controls.spec.tsPaginación, pestañas con teclado, switch, checkbox, errorestests/e2e/quality/testids.spec.tsdata-testid presentes y únicos en todas las rutastests/e2e/quality/responsive.spec.tsSin scroll horizontal a 375 pxtests/e2e/report/report.spec.tsEsta página: métricas, pestañas y guíastests/e2e/quality/not-found.spec.tsSolo en el build estático: 404 propio y HTML sin JavaScript
Documentación
Guías para agentes LLM
Lectura obligatoria para cualquier agente. El índice docs/agentes/INDICE.txt se genera solo y cada guía tiene como máximo 77 líneas.
- 00 · Protocolo obligatorio para CADA tarea
docs/agentes/00-protocolo-obligatorio.md - 01 · Reglas no negociables
docs/agentes/01-reglas-no-negociables.md - 02 · Entorno: npm, dev server y puerto único 43177
docs/agentes/02-entorno-npm-y-puerto.md - 03 · Estructura Domain-Driven Design (obligatoria)
docs/agentes/03-ddd-estructura.md - 04 · Capas y dependencias permitidas
docs/agentes/04-ddd-capas-y-dependencias.md - 05 · ¿Dónde va cada cosa? (tabla de decisión)
docs/agentes/05-ddd-donde-va-cada-cosa.md - 06 · Límite de 77 líneas por archivo
docs/agentes/06-limite-77-lineas.md - 07 · Cómo modularizar (patrones concretos)
docs/agentes/07-como-modularizar.md - 08 · data-testid: convención obligatoria
docs/agentes/08-test-ids.md - 09 · Playwright por MCP (revisión interactiva)
docs/agentes/09-playwright-mcp.md - 10 · Playwright por scripts (Node/npm)
docs/agentes/10-playwright-scripts.md - 11 · Cómo escribir tests e2e
docs/agentes/11-escribir-tests-e2e.md - 12 · Logs en TXT para depurar rápido
docs/agentes/12-logs-txt.md - 13 · Receta: componente nuevo de la librería
docs/agentes/13-receta-nuevo-componente.md - 14 · Receta: página o módulo nuevo del showcase
docs/agentes/14-receta-nueva-pagina.md - 15 · Sistema de diseño Cuarzo (lo esencial)
docs/agentes/15-sistema-de-diseno.md - 16 · Errores frecuentes y alucinaciones típicas
docs/agentes/16-errores-frecuentes.md - 17 · Definición de terminado (checklist final)
docs/agentes/17-definicion-de-terminado.md - 18 · Mapa del repositorio (rutas reales)
docs/agentes/18-mapa-del-repo.md - 19 · Qué se ejecuta solo (automatización y hooks)
docs/agentes/19-automatizacion-y-hooks.md - 20 · Referencia de comandos npm
docs/agentes/20-comandos-referencia.md - 21 · Despliegue estático en Cloudflare Pages
docs/agentes/21-despliegue-cloudflare-pages.md - 22 · Las 10 heurísticas de Nielsen (obligatorias)
docs/agentes/22-heuristicas-nielsen.md
Transparencia
Pendientes y riesgos
Lo que conviene revisar antes de dar el template por cerrado.
Vista previa de Lovable
Hooks y MCP probados fuera de los clientes
Dos lockfiles
Fuentes desde Google Fonts
Cloudflare Pages
Cómo se publica
Este reporte es un sitio estático prerenderizado. Destino previsto: template-ui.benjacode.com.
- 1
npm run build:pagesMide el repo, prerenderiza cada ruta a HTML y deja el sitio en dist-pages/. - 2
npm run preview:pagesSirve dist-pages/ en http://localhost:43177 como lo haría Cloudflare Pages. - 3
npm run test:pagesPasa los tests e2e contra el sitio estático ya compilado. - 4
npx wrangler pages deploy dist-pagesSubida directa a Cloudflare Pages (o conectar el repo con salida dist-pages).