Arquitectura: cómo funciona por dentro
La idea central: escribes las reglas UNA vez (en core/ + stacks/<lenguaje>/) y un renderer las
traduce al formato de cada herramienta (Claude Code, Codex, Cursor, Windsurf, Antigravity). Nunca
mantienes el mismo prompt en 5 sitios.
Estructura del repo
Sección titulada «Estructura del repo»senzu/├── core/ # Reglas COMUNES a todos los lenguajes│ ├── methodology/ # devlog, git-flow, acciones prohibidas│ ├── prompts/ # systemprompt base (se hereda en cada stack)│ ├── hooks/ # hooks Node (.mjs, agnósticos de OS) — ver docs/hooks.md│ ├── skills/ # skills propias (devlog, project-planner, code-quality, deploy-ops, email-html…)│ ├── skills-vendor/ # skills de terceros COPIADAS por tools/vendor.ps1 (inglés, NO editar)│ ├── skills-overlay/ # NUESTRA capa en español que se copia ENCIMA del vendor al renderizar│ ├── skills-plugin/ # routers (skill-router, front-activation): tablas GENERADAS del registro│ ├── skills-registry.json # FUENTE ÚNICA de enrutado: grupo, cuándo, keywords, prioridad, requires│ ├── commands/ # comandos slash — ver docs/comandos.md│ ├── effects-vendor/ # 124 repos MIT de efectos reales (catálogo con código descargado)│ ├── githooks/ # commit-msg, pre-commit, pre-push (capa dura para CUALQUIER herramienta)│ └── bundles.json # bundles de skills opcionales├── plugins/ # GENERADO: 13 plugins de Claude Code (se versionan para instalar desde GitHub)├── .claude-plugin/ # marketplace.json (GENERADO)├── stacks/ # UNA carpeta por stack — ver docs/stacks.md│ └── <stack>/ # stack.json, systemprompt.md (EVOLUTIVO), best-practices.md,│ # prohibited.md, mcp.json, rules/ (extensible), settings.partial.json├── tools/ # Automatización (PowerShell 5.1, corre en la máquina que mantiene el repo)│ ├── init-project.ps1 # BOOTSTRAP de un proyecto con un stack│ ├── sync.ps1 # Re-renderiza la config a un proyecto (-Skills / -Bundle / -GitHooks)│ ├── vendor.ps1 # Actualiza las skills upstream · vendor-effects.ps1: colección de efectos│ ├── build-routers.ps1 # Regenera las tablas de skill-router/front-activation desde el registro│ ├── build-plugins.ps1 # Genera plugins/ + marketplace.json│ ├── build-docs.ps1 # Genera docs/ + REFERENCIA.md desde las fuentes de verdad│ ├── check-skills.ps1 # Verificador (11 checks): falla si algo se desconecta│ ├── test-router.ps1 # 51 casos dorados prompt → skill│ ├── test-hooks.ps1 # 34 casos de los muros (exit 2 = bloquea)│ ├── install-skills.ps1 # Skills globales para Codex/Cursor/Windsurf/Claude│ └── renderers/ # claude.ps1 · codex.ps1 · cursor.ps1 · windsurf.ps1 · antigravity.ps1└── templates/ # Plantillas (devlog, plan, decisiones)Registro único y verificador (todo conectado)
Sección titulada «Registro único y verificador (todo conectado)»core/skills-registry.jsones la única fuente de “qué skill se usa”: por skill,group,when,keywords(regex del prompt-router),priority(la específica gana),requireseinstalledBy. De él se derivan: las tablas de activación deCLAUDE.md/AGENTS.md, las reglas del router (config.json → router), las tablas generadas deskill-router/front-activationydocs/skills.md.tools/check-skills.ps1(11 checks) falla si: una skill no está en el registro (o al revés); unSKILL.mdpasa de 100 líneas o sudescriptionde 250; una referencia citada no existe; una citaskill §secciónno resuelve; las tablas generadas están desactualizadas; un plugin/bundle no satisfacerequires; los ejemplos de tarjeta no los parsea la regex real de los hooks.- Contratos únicos: tarjeta de tarea (una regex en
core/hooks/lib.mjs), devlog (senzu/devlog/<fecha>/NNN-slug.md), design system (senzu/design-system/<slug>/MASTER.md),hooks/config.json(mismas claves para proyecto y plugin). - El repo se protege solo:
.githooks/con commit-msg (Conventional ≤72, sin co-autores) y pre-commit que regenera plugins+docs y ejecuta las 3 suites antes de aceptar el commit.
El plan manda: project-planner
Sección titulada «El plan manda: project-planner»Con decenas de skills y de muros hace falta quién decide qué se hace, en qué orden y con qué skill:
senzu/plan/PLAN.mdcon fases entregables (walking skeleton primero) y tareas pequeñas (F1-T2 · título [S] [todo]), cada una con skill+sección a leer, “hecho cuando” y verificación. Una sola tareadoinga la vez.- Los hooks lo leen:
session-startmuestra progreso y siguientes,stop-guardexige cerrar la tarea con devlog,pre-compactconserva el estado al compactar contexto. - El “alma” son tres piezas: principios (
core/prompts/base-systemprompt.md),skill-router(qué leer) yproject-planner(qué hacer y en qué orden).
Disciplina de contexto (por qué no se come la ventana del agente)
Sección titulada «Disciplina de contexto (por qué no se come la ventana del agente)»Lo que se carga siempre es pequeño; lo grande se lee bajo demanda y por secciones:
| Capa | Tamaño | Cuándo se carga |
|---|---|---|
Reglas generadas (CLAUDE.md/AGENTS.md) con las tablas de activación |
~300 líneas | siempre |
description de cada skill instalada |
≤ 250 caracteres | siempre |
SKILL.md efectivo (propio u overlay ES) con su tabla “Lectura mínima por tarea” |
≤ 100 líneas | solo cuando la tarea encaja |
SKILL.upstream.md y references/ |
grande | solo la sección indicada (offset/limit o Grep) |
Protocolo: una skill por tarea, solo su sección mínima, nada se lee entero, no se relee.
Capas vendor + overlay (skills de terceros sin perder upstream)
Sección titulada «Capas vendor + overlay (skills de terceros sin perder upstream)»Las skills de front son los repos reales UI UX Pro Max y Claude Design Skillstack (MIT), vendorizados:
| Capa | Qué contiene | Quién la edita |
|---|---|---|
core/skills-vendor/<skill>/ |
Copia íntegra upstream + LICENSE.upstream; VENDOR.json registra repo/commit |
Nadie: tools/vendor.ps1 |
core/skills-overlay/<skill>/ |
SKILL.md en español, references/es/ (brief, propuestas, gustos, anti-IA, fuentes/iconos, inspiración, copywriting…), plantillas y CSVs propios |
Nosotros |
Al renderizar se fusionan (overlay ENCIMA del vendor). Actualizar upstream (vendor.ps1) nunca pisa
la capa propia. El mismo patrón aplica al catálogo de efectos (core/effects-vendor/, 124 repos MIT
con el código descargado e indexado).
Cómo detecta el front cada herramienta
Sección titulada «Cómo detecta el front cada herramienta»- Descripción del SKILL.md con disparadores explícitos: lo usan Claude/Codex/Cursor para auto-invocar.
- Bloque generado “Front y diseño” en las reglas: perfil del stack + tabla de activación — la garantía para herramientas sin hooks.
- Hooks de Claude Code: recordatorio en la primera edición de UI + muro si no hay brief ni design system + verificación móvil obligatoria al cerrar (ver docs/hooks.md).
Búsqueda de diseño dentro de un proyecto:
py -3 .claude/skills/ui-ux-pro-max/scripts/search.py "fintech dashboard" --design-system -p "Mi App" --persist -o .# macOS/Linux: python3 …Paridad entre herramientas
Sección titulada «Paridad entre herramientas»| Claude Code | Codex / Cursor / Windsurf / Antigravity | |
|---|---|---|
| Reglas + tablas de activación | CLAUDE.md | AGENTS.md / .cursor/rules / .windsurf/rules |
| Skills | .claude/skills/ | .agents/skills/ · .cursor/skills/ · .windsurf/skills/ |
| Muros en vivo (hooks) | ✔ | — (los cubren los githooks + las reglas) |
| Comandos slash | ✔ | — (frases en llano equivalentes: USO.md §4) |
| Guía propia del proyecto | CLAUDE.project.md importada | AGENTS.project.md referenciada |
Versiones
Sección titulada «Versiones»Una sola numeración para todo: la versión que ves en Claude y en Codex es la del tag de git.
| Tipo de cambio | Versión | Cómo se publica |
|---|---|---|
| Tanda de funcionalidades | sube el segundo número (1.1.0 → 1.2.0) | SENZU_RELEASE=1.2.0 git commit … y luego git tag -a v1.2.0 |
| Arreglos | sube el tercero (1.1.0 → 1.1.1) | igual, con SENZU_RELEASE=1.1.1 y tag v1.1.1 |
| Cambio incompatible (obliga a reinstalar) | sube el primero (2.0.0) | igual |
Entre dos releases, cada commit sube solo el tercer número (último tag + commits desde él), así
/plugin marketplace update siempre detecta que hay versión nueva. El CHANGELOG.md se genera del
devlog; en GitHub, cada tag puede tener su Release con esa parte del changelog.