sdd-es 2.0.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/.claude/settings.json +29 -29
  2. package/.claude/settings.local.json +10 -0
  3. package/.claude-plugin/marketplace.json +10 -7
  4. package/.claude-plugin/plugin.json +59 -37
  5. package/.gitignore +20 -0
  6. package/.mcp.json +8 -0
  7. package/LICENSE +21 -0
  8. package/README.md +77 -40
  9. package/agents/architecture-designer.md +211 -0
  10. package/agents/arquitecto.md +16 -1
  11. package/agents/asesor-datos.md +15 -1
  12. package/agents/critico.md +37 -1
  13. package/agents/desarrollador-backend.md +3 -1
  14. package/agents/desarrollador-frontend.md +11 -16
  15. package/agents/disenador-api.md +13 -1
  16. package/agents/documentador.md +3 -1
  17. package/agents/investigador.md +3 -1
  18. package/agents/operaciones.md +3 -1
  19. package/agents/product-designer.md +268 -0
  20. package/agents/revisor.md +25 -1
  21. package/agents/seguridad.md +5 -1
  22. package/agents/tester.md +3 -1
  23. package/claude-hooks/agent-memory.js +288 -0
  24. package/claude-hooks/pre-tool-guard.js +61 -9
  25. package/cli/index.js +1 -2
  26. package/commands/sdd.adr.md +196 -0
  27. package/commands/sdd.analizar.md +23 -2
  28. package/commands/sdd.ayuda.md +13 -0
  29. package/commands/sdd.compliance.md +521 -0
  30. package/commands/sdd.configurar.md +34 -1
  31. package/commands/sdd.constitucion.md +198 -23
  32. package/commands/sdd.construir.md +210 -0
  33. package/commands/sdd.crear-mcp.md +2 -0
  34. package/commands/sdd.defect-report.md +134 -0
  35. package/commands/sdd.descubrir.md +19 -0
  36. package/commands/sdd.dise/303/261ar.md +188 -0
  37. package/commands/sdd.estado.md +120 -3
  38. package/commands/sdd.exportar.md +344 -0
  39. package/commands/sdd.implementar.md +272 -52
  40. package/commands/sdd.interpretar.md +239 -0
  41. package/commands/sdd.md +93 -4
  42. package/commands/sdd.optimizar-memoria.md +47 -0
  43. package/commands/sdd.optimizar.md +164 -0
  44. package/commands/sdd.planificar.md +64 -0
  45. package/commands/sdd.retro.md +74 -0
  46. package/commands/sdd.verificar.md +81 -0
  47. package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
  48. package/configuracion-ejemplo/sdd.config.yaml +10 -0
  49. package/craft/accessibility-baseline.md +216 -0
  50. package/craft/anti-ai-slop.md +158 -0
  51. package/craft/color.md +160 -0
  52. package/craft/typography.md +121 -0
  53. package/design-systems/bold-brutalist/DESIGN.md +239 -0
  54. package/design-systems/editorial-minimal/DESIGN.md +205 -0
  55. package/design-systems/neutral-modern/DESIGN.md +227 -0
  56. package/design-systems/vibrant-consumer/DESIGN.md +257 -0
  57. package/design-systems/warm-editorial/DESIGN.md +221 -0
  58. package/docs/AGENTES.md +4 -1
  59. package/docs/CASO-COMPLETO.md +206 -0
  60. package/docs/EJEMPLOS.md +61 -185
  61. package/docs/FABRICA.md +163 -115
  62. package/docs/INICIO-RAPIDO.md +27 -79
  63. package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
  64. package/docs/MODELOS.md +3 -0
  65. package/docs/QUE-PASA-SI-FALLA.md +404 -0
  66. package/docs/README.md +43 -0
  67. package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
  68. package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
  69. package/package.json +15 -10
  70. package/plantillas/job-story-mejorar-prompt.md +107 -0
  71. package/presets/enterprise.yaml +6 -0
  72. package/presets/lean.yaml +4 -0
  73. package/presets/startup.yaml +6 -0
  74. package/skills/adr-indexer/SKILL.md +181 -0
  75. package/skills/cache-audit/SKILL.md +163 -0
  76. package/skills/critica-diseno/SKILL.md +193 -0
  77. package/skills/descubrir-idea/SKILL.md +133 -0
  78. package/skills/effort-router/SKILL.md +128 -0
  79. package/skills/elegir-direccion/SKILL.md +184 -0
  80. package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
  81. package/skills/github-connect/INDEX.md +223 -0
  82. package/skills/github-connect/INTEGRATION.md +361 -0
  83. package/skills/github-connect/QUICK-START.md +168 -0
  84. package/skills/github-connect/README.md +414 -0
  85. package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
  86. package/skills/github-connect/SKILL.md +343 -0
  87. package/skills/github-connect/STRUCTURE.txt +252 -0
  88. package/skills/github-connect/example-config.yaml +41 -0
  89. package/skills/github-connect/github-connect.sh +419 -0
  90. package/skills/interpretar-idea/SKILL.md +254 -0
  91. package/skills/mejorar-prompt/SKILL.md +237 -0
  92. package/skills/memory-compactor/SKILL.md +68 -0
  93. package/skills/modo-guiado/SKILL.md +12 -2
  94. package/skills/mutation-detector/SKILL.md +134 -0
  95. package/skills/observabilidad-consumo/SKILL.md +164 -0
  96. package/skills/token-budget/SKILL.md +177 -0
  97. package/skills/vercel-deploy/00-START-HERE.txt +364 -0
  98. package/skills/vercel-deploy/CHECKLIST.md +205 -0
  99. package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
  100. package/skills/vercel-deploy/FLOW.txt +334 -0
  101. package/skills/vercel-deploy/INDEX.md +276 -0
  102. package/skills/vercel-deploy/INTEGRATION.md +328 -0
  103. package/skills/vercel-deploy/MANIFEST.md +310 -0
  104. package/skills/vercel-deploy/README.md +65 -0
  105. package/skills/vercel-deploy/SKILL.md +356 -0
  106. package/skills/vercel-deploy/deploy.sh +298 -0
  107. package/skills/vercel-deploy/estado.json.example +205 -0
  108. package/skills/vercel-deploy/skill.yaml +323 -0
  109. package/skills/vercel-deploy/vercel-deploy.sh +216 -0
  110. package/skills/wireframe-mvp/SKILL.md +157 -0
  111. package/docs/EJEMPLO-PRACTICA.md +0 -383
  112. package/mcp-figma/README.md +0 -158
  113. package/mcp-figma/package.json +0 -7
  114. package/mcp-figma/src/component-generator.js +0 -162
  115. package/mcp-figma/src/design-system-analyzer.js +0 -247
  116. package/mcp-figma/src/figma-client.js +0 -75
  117. package/mcp-figma/src/index.js +0 -114
  118. package/mcp-figma/src/mcp.js +0 -97
  119. package/mcp-figma/src/style-mapper.js +0 -85
  120. /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
  121. /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
  122. /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
  123. /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
  124. /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
  125. /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
  126. /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
  127. /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
@@ -55,6 +55,80 @@ Si un aprendizaje implica un **principio nuevo** del proyecto, sugiere actualiza
55
55
 
56
56
  > Este aprendizaje parece una regla general del proyecto. ¿Lo elevo a la constitución con `/sdd.constitucion`?
57
57
 
58
+ ## PASO 3.5 — Resumen de calidad al cierre
59
+
60
+ Al final de cada sesión de implementación, antes del resumen de retro, FORGE genera automáticamente un **resumen de calidad en lenguaje de producto** (~5 líneas, sin jerga técnica). El objetivo es que el usuario entienda qué se hizo y en qué estado quedó sin leer tablas ni logs.
61
+
62
+ ### Cómo construirlo
63
+
64
+ ```bash
65
+ # Recopilar señales objetivas del ciclo
66
+ TAREAS_OK=$(grep -c '"estado": "completada"' "$DIR/.estado-tareas.json" 2>/dev/null || echo "?")
67
+ TAREAS_TOTAL=$(grep -c '"estado"' "$DIR/.estado-tareas.json" 2>/dev/null || echo "?")
68
+
69
+ # Tests: buscar resultado en verificacion.md o qa.md
70
+ TESTS_RESULTADO=$(grep -oE "Pasados: [0-9]+" "$DIR/verificacion.md" 2>/dev/null | head -1)
71
+ TESTS_FALLIDOS=$(grep -oE "Fallidos: [0-9]+" "$DIR/verificacion.md" 2>/dev/null | head -1)
72
+ COBERTURA=$(grep -oE "Cobertura: [0-9]+%" "$DIR/verificacion.md" 2>/dev/null | head -1)
73
+
74
+ # Seguridad: ¿se invocó el agente seguridad?
75
+ SEGURIDAD=$(grep -q "Gate de seguridad activado\|agente seguridad" "$DIR/verificacion.md" 2>/dev/null \
76
+ && echo "revisión de seguridad incluida" || echo "sin revisión de seguridad (no aplica)")
77
+
78
+ # Feature principal: título de la spec
79
+ TITULO=$(grep -m1 "^# " "$DIR/spec.md" 2>/dev/null | sed 's/# //')
80
+ ```
81
+
82
+ ### Formato del resumen (adaptar al perfil)
83
+
84
+ **Perfil `guiado`** (lenguaje de producto, sin jerga):
85
+ ```
86
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
87
+ 📦 Resumen de lo que se hizo
88
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
89
+ Hiciste [TÍTULO en lenguaje natural].
90
+ Pruebas: [✓ N/N pasaron | ✗ N fallaron | no hay pruebas aún].
91
+ [Si hubo seguridad]: Se revisó la seguridad — sin problemas encontrados.
92
+ [Si hay cobertura]: Cobertura: N%.
93
+ Listo para [usar / probar / desplegar].
94
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
95
+ ```
96
+
97
+ Ejemplo concreto:
98
+ ```
99
+ Hiciste el login con email.
100
+ Pruebas: ✓ 12/12 pasaron.
101
+ Se revisó la seguridad — sin vulnerabilidades.
102
+ Cobertura: 87%.
103
+ Listo para usar.
104
+ ```
105
+
106
+ **Perfil `profesional`** (lenguaje técnico compacto):
107
+ ```
108
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
109
+ 📊 Quality Summary — {SPEC_ID}
110
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
111
+ Feature: [TÍTULO]
112
+ Tareas: [N/M completadas]
113
+ Tests: [✓ N pasaron | ✗ N fallaron] · Cobertura: [N% | N/A]
114
+ Seguridad: [Auditada — APROBADO | No aplica (sin keywords sensibles)]
115
+ Estado: [APROBADA | APROBADA CON OBSERVACIONES | RECHAZADA]
116
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
117
+ ```
118
+
119
+ ### Cuándo se genera
120
+
121
+ Este resumen se emite **siempre** al ejecutar `/sdd.retro`, independientemente de si la sesión terminó bien o mal. Si la sesión terminó con tareas bloqueadas o tests fallando, el resumen lo refleja honestamente:
122
+
123
+ ```
124
+ Hiciste el login con email (en progreso).
125
+ Pruebas: ✗ 2 fallaron (ver verificacion.md).
126
+ No se revisó seguridad.
127
+ Pendiente: corregir errores antes de entregar.
128
+ ```
129
+
130
+ El resumen se incluye también en la entrada que se escribe en `.sdd/SNAPSHOT.md` (paso 3).
131
+
58
132
  ## PASO 4 — Resumen
59
133
 
60
134
  ```
@@ -66,6 +66,77 @@ Lee el código encontrado. ¿Realmente implementa lo que pide el CA?
66
66
 
67
67
  Repite el proceso para cada RF-XXX de la spec.
68
68
 
69
+ ## PASO 4.5 — Gate de seguridad automático
70
+
71
+ **Antes de continuar con los requisitos no funcionales**, escanea la spec y las tareas en busca de keywords sensibles. Si se detecta alguna, invoca al agente `seguridad` automáticamente sin esperar a que el usuario lo solicite.
72
+
73
+ ### Keywords que activan el gate de seguridad
74
+
75
+ ```
76
+ KEYWORDS_AUTH:
77
+ auth, login, logout, signin, signup, registro, sesión, session,
78
+ password, contraseña, credenciales, credentials
79
+
80
+ KEYWORDS_TOKENS:
81
+ token, jwt, bearer, oauth, api_key, apikey, secret, secreto
82
+
83
+ KEYWORDS_DATOS:
84
+ base de datos, bd, database, sql, query, consulta, migration, migracion,
85
+ postgres, mysql, sqlite, mongodb, redis
86
+
87
+ KEYWORDS_CONFIG:
88
+ config, configuracion, .env, environment, variable de entorno,
89
+ settings, dotenv
90
+
91
+ KEYWORDS_PAGOS:
92
+ pago, payment, stripe, checkout, factura, invoice, tarjeta, card,
93
+ billing, cobro, precio, price
94
+ ```
95
+
96
+ ### Lógica de detección
97
+
98
+ ```bash
99
+ SPEC_CONTENT=$(cat "${SPEC_DIR}/spec.md" "${SPEC_DIR}/tareas.md" 2>/dev/null | tr '[:upper:]' '[:lower:]')
100
+
101
+ KEYWORDS="auth|login|logout|signin|signup|registro|sesión|session|\
102
+ password|contraseña|credenciales|credentials|\
103
+ token|jwt|bearer|oauth|api_key|apikey|secret|secreto|\
104
+ base de datos| bd |database|sql|migration|migracion|\
105
+ postgres|mysql|sqlite|mongodb|redis|\
106
+ config|configuracion|\.env|environment|dotenv|\
107
+ pago|payment|stripe|checkout|factura|tarjeta|billing"
108
+
109
+ if echo "$SPEC_CONTENT" | grep -qiE "$KEYWORDS"; then
110
+ KEYWORD_DETECTADA=$(echo "$SPEC_CONTENT" | grep -oiE "$KEYWORDS" | head -1)
111
+ echo "🔒 Gate de seguridad activado automáticamente (keyword detectada: '$KEYWORD_DETECTADA')"
112
+ echo " Invocando agente seguridad..."
113
+ # → Task("seguridad", prompt_seguridad(spec, plan, diff, keyword))
114
+ GATE_SEGURIDAD_EJECUTADO=true
115
+ else
116
+ echo "✅ Gate de seguridad: sin keywords sensibles detectadas. Omitiendo."
117
+ GATE_SEGURIDAD_EJECUTADO=false
118
+ fi
119
+ ```
120
+
121
+ ### Qué hace el agente `seguridad` en este contexto
122
+
123
+ Recibe: spec completa + plan + diff de archivos modificados + keyword que activó el gate.
124
+
125
+ Verifica mínimamente:
126
+ - Ausencia de secretos hardcodeados en el diff
127
+ - Validación/sanitización de inputs sensibles
128
+ - Ausencia de SQL dinámico sin parametrizar
129
+ - Tokens/passwords no logueados ni expuestos en respuestas
130
+ - Configuraciones sensibles gestionadas via variables de entorno
131
+
132
+ Retorna: `APROBADO` | `OBSERVACIONES` | `RECHAZADO` + lista de hallazgos.
133
+
134
+ Si retorna `RECHAZADO` → la verificación global queda `RECHAZADA` independientemente de los CAs.
135
+ Si retorna `OBSERVACIONES` → se documentan en el reporte de verificación bajo "Hallazgos 🟡 Importantes".
136
+ Si retorna `APROBADO` → continúa normalmente.
137
+
138
+ > **Nota**: si el agente `seguridad` ya fue invocado durante `sdd.implementar` (paso 6.3 o revisión paralela del paso 4.5), sus resultados se reutilizan y no se invoca de nuevo — se indica en el reporte: `"Seguridad: resultado reutilizado de implementación (fecha/hora)"`.
139
+
69
140
  ## PASO 5 — Verificar requisitos no funcionales
70
141
 
71
142
  Estos requieren validación específica:
@@ -237,3 +308,13 @@ ACCIONES REQUERIDAS:
237
308
  Vuelve a:
238
309
  /sdd.implementar — completar tareas pendientes
239
310
  ```
311
+
312
+ ## PASO 13 — Output styles (adaptar el PASO 12 según modo)
313
+
314
+ Si el argumento contiene `pm`, `arq` o `dev`, adapta el reporte final:
315
+
316
+ **Modo `pm`:** Muestra solo el veredicto, el % de cobertura y los bloqueos en lenguaje de negocio. Omite tablas de CA y rutas de archivo.
317
+
318
+ **Modo `arq`:** Enfatiza el cumplimiento de constitución, los ADRs afectados y los requisitos no funcionales. Incluye la tabla de CAs con archivos.
319
+
320
+ **Modo `dev`:** El reporte completo del PASO 10 con todas las tablas y rutas (comportamiento actual).
@@ -0,0 +1,106 @@
1
+ # Proyecto SDD — Instrucciones para Claude Code
2
+
3
+ Este proyecto usa el flujo **SDD-ES** (Spec-Driven Development).
4
+ El estado vive en `.sdd/` y se sincroniza con cada comando `/sdd.*`.
5
+
6
+ ## Recuperación de contexto al inicio
7
+
8
+ Al comenzar cada sesión, antes de pedir nada al usuario:
9
+
10
+ 1. Si existe `.sdd/estado.json`, cárgalo y léelo.
11
+ 2. Muestra un resumen breve (máx. 3 líneas) con la fase actual, feature activa y tareas pendientes.
12
+ 3. Si no existe, sugiere escribir `/sdd` para empezar.
13
+
14
+ Ejemplo de resumen:
15
+ ```
16
+ Estás en: implementar · feature activa: login con email · 3 pasos pendientes.
17
+ ```
18
+
19
+ ## Reglas del proyecto
20
+
21
+ @.sdd/memoria/constitucion.md
22
+ @.sdd/memoria/reglas-proyecto.md
23
+
24
+ - No edites `.sdd/estado.json` manualmente; los comandos `/sdd.*` lo gestionan.
25
+ - Respeta la spec activa: no implementes fuera de ella sin avisar.
26
+ - La memoria de cada agente vive en `.sdd/memoria/agente-{nombre}.md`.
27
+
28
+ ## Hooks activos
29
+
30
+ | Hook | Archivo | Cuándo se ejecuta |
31
+ |------|---------|-------------------|
32
+ | PreToolUse | `claude-hooks/pre-tool-guard.js` | Antes de cada comando Bash/PowerShell |
33
+ | PostToolUse | `claude-hooks/agent-memory.js` | Al finalizar cada herramienta (guarda memoria de agentes) |
34
+
35
+ Los hooks bloquean operaciones destructivas y protegen secretos automáticamente.
36
+ No es necesario configurarlos — ya están activos.
37
+
38
+ ## Convención de commits
39
+
40
+ Formato: `[LAYER] ACTION: descripción breve`
41
+
42
+ | Capa | Cuándo usarla |
43
+ |------|---------------|
44
+ | `[SPEC]` | Cambios en especificaciones o plan |
45
+ | `[IMPL]` | Código de implementación |
46
+ | `[TEST]` | Tests nuevos o modificados |
47
+ | `[INFRA]` | Configuración, CI, dependencias |
48
+ | `[DOCS]` | Documentación |
49
+
50
+ Ejemplos:
51
+ ```
52
+ [IMPL] ADD: login con magic link
53
+ [TEST] FIX: corrige test flaky de autenticación
54
+ [SPEC] UPDATE: aclara criterios de aceptación del módulo de pagos
55
+ ```
56
+
57
+ ## Comandos clave
58
+
59
+ - `/sdd` — punto de entrada: detecta contexto y te guía al siguiente paso.
60
+ - `/sdd.especificar` — define o refina una feature.
61
+ - `/sdd.implementar` — ejecuta las tareas de la feature activa.
62
+ - `/sdd.comprimir aplicar` — reduce el contexto en sesiones largas.
63
+ - `/mejorar-prompt "texto"` — transforma un prompt vago en versión profesional.
64
+
65
+ ---
66
+
67
+ ## Metodología de prompts
68
+
69
+ Antes de ejecutar cualquier instrucción del usuario que modifique archivos o inicie
70
+ una tarea nueva, comprueba que la petición tiene al menos **3 de los 5 componentes**
71
+ de un prompt profesional:
72
+
73
+ | Componente | Descripción | Señal de que falta |
74
+ |---|---|---|
75
+ | **Contexto** | Qué proyecto/stack/estado existe ya | El usuario no menciona el proyecto |
76
+ | **Tarea** | Qué hay que hacer exactamente | La instrucción es de 1-2 palabras |
77
+ | **Restricciones** | Qué no tocar, qué no instalar | No se especifica qué preservar |
78
+ | **Formato** | Cómo quiere el resultado | No aplica a todos los casos |
79
+ | **Verificación** | Cómo confirmar que funcionó | No hay criterio de éxito |
80
+
81
+ Si el prompt tiene **menos de 3 componentes**, responde así:
82
+
83
+ 1. El componente más crítico que falta (solo uno, no todos).
84
+ 2. Una pregunta concreta para obtenerlo.
85
+ 3. Un ejemplo de cómo quedaría el prompt con ese componente añadido.
86
+
87
+ **No inicies la implementación sin la respuesta.**
88
+
89
+ Ejemplo de respuesta cuando falta contexto:
90
+ > "Para implementar esto con precisión necesito saber: ¿qué stack usa el proyecto
91
+ > (Express, FastAPI, Rails...)? Por ejemplo: *'Contexto: Express + TypeScript, ya tiene
92
+ > autenticación JWT, falta el módulo de perfiles de usuario.'*"
93
+
94
+ ---
95
+
96
+ ## Guardia de spec activa
97
+
98
+ Si existe `.sdd/estado.json` y el usuario pide algo que **no está en el alcance de la
99
+ feature activa**, advierte antes de proceder:
100
+
101
+ > "⚠️ Esto parece estar fuera de la spec activa (**{feature}**, fase: **{fase}**).
102
+ > ¿Quieres abrir una spec nueva con `/sdd.especificar`, o confirmas que esto sí
103
+ > forma parte de esta feature?"
104
+
105
+ **No ejecutes sin confirmación explícita.** La spec activa es la fuente de verdad del
106
+ alcance; salir de ella sin avisar introduce deuda técnica invisible.
@@ -34,6 +34,16 @@ agentes:
34
34
  modelo: opus # Recomendado: opus (decisiones difíciles de revertir)
35
35
  descripcion: "Toma decisiones de arquitectura del sistema y diseño técnico de alto nivel."
36
36
 
37
+ architecture-designer:
38
+ activo: true
39
+ modelo: sonnet # Recomendado: sonnet (stack técnico para MVPs)
40
+ descripcion: "Recomienda el stack técnico más simple viable: frontend, backend, BD, deploy."
41
+
42
+ product-designer:
43
+ activo: true
44
+ modelo: opus # Recomendado: opus (decisiones de producto son difíciles de revertir)
45
+ descripcion: "Genera el ProductDesign completo: pantallas P0/P1/P2, user flow, mvp_scope."
46
+
37
47
  disenador-api:
38
48
  activo: true
39
49
  modelo: sonnet # Recomendado: sonnet (contratos estructurados)
@@ -0,0 +1,216 @@
1
+ # Accessibility Baseline — FORGE Craft
2
+
3
+ Adoptado de open-design (nexu-io). Referencia para agentes de diseño.
4
+
5
+ ---
6
+
7
+ ## Principio fundamental
8
+
9
+ **Accesibilidad no es una feature extra — es la calidad mínima.**
10
+
11
+ Un wireframe inaccesible no es un MVP funcional. Estas reglas se aplican a todos los artefactos HTML generados por FORGE, sin excepción.
12
+
13
+ ---
14
+
15
+ ## Checklist de accesibilidad mínima (WCAG AA)
16
+
17
+ ### Estructura semántica
18
+
19
+ - [ ] `<html lang="es">` — idioma declarado
20
+ - [ ] Un solo `<h1>` por página — el título principal
21
+ - [ ] Jerarquía de headings sin saltos: h1 → h2 → h3 (no saltar de h1 a h3)
22
+ - [ ] `<main>`, `<header>`, `<nav>`, `<footer>` — landmarks semánticos
23
+ - [ ] `<button>` para acciones, `<a>` para navegación — nunca `<div onclick>`
24
+ - [ ] Formularios con `<label>` asociado a cada `<input>` (via `for` + `id`)
25
+
26
+ ### Contraste de color
27
+
28
+ - [ ] Texto normal (< 18px no bold): ratio ≥ 4.5:1
29
+ - [ ] Texto grande (≥ 18px o ≥ 14px bold): ratio ≥ 3:1
30
+ - [ ] Iconos y bordes de UI: ratio ≥ 3:1
31
+ - [ ] Texto desactivado (disabled): puede tener ratio menor — es intencional
32
+
33
+ ### Teclado
34
+
35
+ - [ ] Todos los elementos interactivos son alcanzables con Tab
36
+ - [ ] El foco visible es obvio (no eliminar `outline: none` sin reemplazarlo)
37
+ - [ ] Los dropdowns y modales son navegables con teclado (Enter/Escape/Flechas)
38
+ - [ ] El orden de Tab sigue el flujo visual de izquierda a derecha, arriba a abajo
39
+
40
+ ### Imágenes y medios
41
+
42
+ - [ ] `<img alt="descripción">` — siempre, aunque sea vacío (`alt=""`) para imágenes decorativas
43
+ - [ ] Iconos SVG con `aria-hidden="true"` si son decorativos, o `aria-label` si comunican algo
44
+ - [ ] No usar solo color para comunicar estado (agregar texto o icono también)
45
+
46
+ ### Formularios
47
+
48
+ - [ ] Mensajes de error junto al campo (no solo cambio de color del borde)
49
+ - [ ] `required` en campos obligatorios + indicación visual (asterisco + leyenda)
50
+ - [ ] `autocomplete` en campos comunes: `name`, `email`, `tel`, `current-password`
51
+
52
+ ---
53
+
54
+ ## HTML semántico en wireframes FORGE
55
+
56
+ ### Estructura base de cada wireframe
57
+
58
+ ```html
59
+ <!DOCTYPE html>
60
+ <html lang="es">
61
+ <head>
62
+ <meta charset="UTF-8">
63
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
64
+ <title>[Nombre del producto] — [Nombre de pantalla]</title>
65
+ </head>
66
+ <body>
67
+ <header>
68
+ <nav aria-label="Navegación principal">...</nav>
69
+ </header>
70
+ <main>
71
+ <h1>[Título principal de la pantalla]</h1>
72
+ <!-- contenido -->
73
+ </main>
74
+ </body>
75
+ </html>
76
+ ```
77
+
78
+ ### Botones correctos vs incorrectos
79
+
80
+ ```html
81
+ <!-- ✅ Correcto -->
82
+ <button type="button" class="btn-primary">Crear cita</button>
83
+ <button type="submit" class="btn-primary">Guardar cambios</button>
84
+
85
+ <!-- ❌ Incorrecto — div no es interactivo por defecto -->
86
+ <div class="btn-primary" onclick="...">Crear cita</div>
87
+ ```
88
+
89
+ ### Labels de formularios
90
+
91
+ ```html
92
+ <!-- ✅ Correcto — label asociado por for/id -->
93
+ <label for="paciente-nombre">Nombre del paciente</label>
94
+ <input id="paciente-nombre" type="text" autocomplete="name" required>
95
+
96
+ <!-- ✅ Correcto — label envolvente -->
97
+ <label>
98
+ Nombre del paciente
99
+ <input type="text" autocomplete="name" required>
100
+ </label>
101
+
102
+ <!-- ❌ Incorrecto — placeholder no reemplaza el label -->
103
+ <input type="text" placeholder="Nombre del paciente">
104
+ ```
105
+
106
+ ### Foco visible
107
+
108
+ ```css
109
+ /* ✅ Foco visible con el color de acento */
110
+ :focus-visible {
111
+ outline: 2px solid var(--accent);
112
+ outline-offset: 2px;
113
+ border-radius: 2px;
114
+ }
115
+
116
+ /* ❌ Nunca eliminar el foco sin reemplazarlo */
117
+ * { outline: none; }
118
+ ```
119
+
120
+ ### Iconos SVG
121
+
122
+ ```html
123
+ <!-- ✅ Icono decorativo (acompañado de texto) -->
124
+ <button>
125
+ <svg aria-hidden="true" focusable="false">...</svg>
126
+ Crear cita
127
+ </button>
128
+
129
+ <!-- ✅ Icono solo (sin texto) -->
130
+ <button aria-label="Cerrar menú">
131
+ <svg aria-hidden="true" focusable="false">...</svg>
132
+ </button>
133
+
134
+ <!-- ❌ Icono sin descripción -->
135
+ <button>
136
+ <svg>...</svg>
137
+ </button>
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Estado de elementos interactivos
143
+
144
+ Cada elemento interactivo debe tener estilos para 4 estados:
145
+
146
+ | Estado | CSS | Cuándo |
147
+ |--------|-----|--------|
148
+ | Normal | (base) | Sin interacción |
149
+ | Hover | `:hover` | Ratón encima (desktop) |
150
+ | Focus | `:focus-visible` | Navegación por teclado |
151
+ | Disabled | `[disabled]`, `aria-disabled="true"` | No disponible |
152
+ | Active | `:active` | Click/tap en progreso |
153
+
154
+ ```css
155
+ .btn-primary { background: var(--accent); color: var(--text-inverse); }
156
+ .btn-primary:hover { background: var(--accent-hover); }
157
+ .btn-primary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
158
+ .btn-primary:disabled { opacity: 0.45; cursor: not-allowed; }
159
+ .btn-primary:active { transform: translateY(1px); }
160
+ ```
161
+
162
+ ---
163
+
164
+ ## ARIA mínimo necesario
165
+
166
+ No sobrecargar con ARIA. La regla: **si el HTML semántico ya lo comunica, no añadir ARIA**.
167
+
168
+ ```html
169
+ <!-- Necesario: nav con múltiples navs en la página -->
170
+ <nav aria-label="Navegación principal">...</nav>
171
+ <nav aria-label="Breadcrumb">...</nav>
172
+
173
+ <!-- Necesario: estado de un componente dinámico -->
174
+ <button aria-expanded="false" aria-controls="menu-id">Menú</button>
175
+ <div id="menu-id" hidden>...</div>
176
+
177
+ <!-- Necesario: live regions para notificaciones -->
178
+ <div role="status" aria-live="polite" id="notifications"></div>
179
+
180
+ <!-- No necesario: botón ya tiene rol button -->
181
+ <button role="button">No necesario</button>
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Responsive mínimo
187
+
188
+ ```css
189
+ /* Viewport meta — siempre */
190
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
191
+
192
+ /* Tamaño de tap target mínimo — 44x44px */
193
+ button, a, input[type="checkbox"], input[type="radio"] {
194
+ min-height: 44px;
195
+ min-width: 44px;
196
+ }
197
+
198
+ /* Texto legible en mobile */
199
+ body { font-size: 16px; } /* evita zoom automático en iOS */
200
+ input, textarea, select { font-size: 16px; } /* evita zoom en focus en iOS */
201
+ ```
202
+
203
+ ---
204
+
205
+ ## Referencia rápida para agentes
206
+
207
+ Antes de cerrar el `<artifact>`, verificar:
208
+
209
+ 1. `<html lang="es">` presente
210
+ 2. Un solo `<h1>` en la página
211
+ 3. Todos los `<input>` tienen `<label>` asociado
212
+ 4. Todos los `<button>` tienen texto o `aria-label`
213
+ 5. Imágenes tienen `alt`
214
+ 6. `:focus-visible` definido con `outline` visible
215
+ 7. No usar `<div>` para elementos clicables — usar `<button>` o `<a>`
216
+ 8. Contraste de texto verificado mentalmente (colores del DESIGN.md tienen ratio ≥ 4.5:1)
@@ -0,0 +1,158 @@
1
+ # Anti-AI-Slop Rules
2
+
3
+ > Reglas cardinales para evitar patrones visuales genéricos de IA. Adoptado de open-design (nexu-io).
4
+ > **P0 = bloqueante**: si el artefacto viola estas reglas, la crítica automática lo rechaza (score < 4).
5
+
6
+ ---
7
+
8
+ ## Las 7 Reglas Cardinales
9
+
10
+ ### Regla 1 — Prohibido el índigo default de Tailwind
11
+
12
+ ❌ **Nunca usar**: `#6366F1`, `#4F46E5`, `#7C3AED`, `#8B5CF6`, `#6D28D9`
13
+
14
+ Estos colores son la firma del "AI-generated UI" sin dirección. Si el DESIGN.md activo no especifica morado/índigo, no lo uses. Si lo especifica, usa el valor exacto del DESIGN.md.
15
+
16
+ ✅ **En su lugar**: el color de acento definido en el DESIGN.md activo.
17
+
18
+ ---
19
+
20
+ ### Regla 2 — Prohibido el gradiente "trust" de 2 paradas
21
+
22
+ ❌ **Nunca usar en heroes o CTAs**:
23
+ - `linear-gradient(135deg, #6366F1, #2563EB)` (purple → blue)
24
+ - `linear-gradient(135deg, #667EEA, #764BA2)` (lavender → purple)
25
+ - `linear-gradient(90deg, #00B4D8, #90E0EF)` (blue → cyan)
26
+ - Cualquier gradiente de 2 colores en una dirección diagonal sobre el hero
27
+
28
+ ✅ **En su lugar**: fondo sólido del color base del DESIGN.md. Si el diseño requiere gradiente, que tenga intención editorial (ej: warm-editorial puede usar un gradiente de tonos tierra muy sutil).
29
+
30
+ ---
31
+
32
+ ### Regla 3 — Prohibidos los emojis como iconos de features
33
+
34
+ ❌ **Nunca hacer esto**:
35
+ ```html
36
+ <div class="feature">
37
+ <span class="icon">⚡</span>
38
+ <h3>Rápido y confiable</h3>
39
+ </div>
40
+ ```
41
+
42
+ ✅ **En su lugar**: SVG monoline simple, o ningún icono. Si no hay icono SVG disponible, usar texto puro o un elemento decorativo del DESIGN.md.
43
+
44
+ ---
45
+
46
+ ### Regla 4 — Respetar la fuente del DESIGN.md activo
47
+
48
+ ❌ **Nunca mezclar**: si el DESIGN.md dice `font-display: 'Playfair Display'`, no usar sans-serif para headings.
49
+
50
+ ✅ **Regla**: las fuentes del artefacto deben coincidir exactamente con las del DESIGN.md activo. No "mejorar" con fuentes propias.
51
+
52
+ Si el DESIGN.md no especifica una fuente (raro), usar `system-ui, sans-serif`.
53
+
54
+ ---
55
+
56
+ ### Regla 5 — Prohibido el patrón "AI dashboard tile"
57
+
58
+ ❌ **Nunca hacer esto**:
59
+ ```html
60
+ <div style="border-left: 4px solid #6366F1; border-radius: 8px; background: #F9FAFB;">
61
+ <span>10x más rápido</span>
62
+ </div>
63
+ ```
64
+
65
+ Este patrón — card redondeada con borde izquierdo de color + métrica — es el sello del UI genérico de IA.
66
+
67
+ ✅ **En su lugar**: el estilo de card definido en el DESIGN.md activo. Las métricas deben ser reales o no aparecer.
68
+
69
+ ---
70
+
71
+ ### Regla 6 — Prohibidas las métricas inventadas
72
+
73
+ ❌ **Nunca usar**:
74
+ - "10x más rápido"
75
+ - "99.9% de uptime"
76
+ - "2 millones de usuarios satisfechos"
77
+ - "50% de ahorro de tiempo garantizado"
78
+
79
+ ...a menos que el usuario haya provisto esos números en el IR o el contexto.
80
+
81
+ ✅ **En su lugar**: si se necesita una métrica de ejemplo, usar un placeholder explícito como `[X]% de mejora` o omitirla.
82
+
83
+ ---
84
+
85
+ ### Regla 7 — Prohibido el copy de relleno
86
+
87
+ ❌ **Nunca usar**:
88
+ - Lorem ipsum o variantes
89
+ - "Feature One", "Feature Two", "Feature Three"
90
+ - "Descripción de la feature aquí"
91
+ - "Título del beneficio"
92
+ - "Texto placeholder"
93
+
94
+ ✅ **En su lugar**: copy derivado del IR del proyecto. Si no hay copy real, usar `[Nombre de la feature]` con corchetes para marcar que es un placeholder explícito.
95
+
96
+ ---
97
+
98
+ ## Patrones Adicionales a Evitar (P1 — no bloqueante pero penaliza el score)
99
+
100
+ ### P1-A: Hero con imagen de stock genérica
101
+ - Personas sonriendo frente a pantallas
102
+ - Oficinas modernas con plantas
103
+ - Manos sobre teclados
104
+
105
+ ✅ En su lugar: sin imagen, color de fondo sólido del DESIGN.md, o SVG ilustrativo relacionado al producto.
106
+
107
+ ### P1-B: Navbar con logo "Empresa" y menú genérico
108
+ ```html
109
+ <!-- Evitar -->
110
+ <nav>
111
+ <div class="logo">Empresa</div>
112
+ <a href="#">Inicio</a>
113
+ <a href="#">Características</a>
114
+ <a href="#">Precios</a>
115
+ <a href="#">Blog</a>
116
+ <button>Empieza Gratis</button>
117
+ </nav>
118
+ ```
119
+ ✅ El nombre de la navbar debe venir del `product.name` del IR.
120
+
121
+ ### P1-C: Footer con 4 columnas de links vacíos
122
+ El footer de "AI-slop" tiene 4 columnas (Producto, Empresa, Recursos, Legal) con links que no llevan a ningún lado.
123
+ ✅ Si el MVP no tiene esas secciones, el footer es mínimo: copyright + link principal.
124
+
125
+ ### P1-D: Sección "Como funciona" con 3 pasos numerados + iconos genéricos
126
+ El patrón de "1. Regístrate → 2. Configura → 3. Disfruta" con íconos de rocket/check/star es omnipresente.
127
+ ✅ Si el producto tiene un flujo real, muéstralo. Si no, omite esta sección.
128
+
129
+ ### P1-E: Testimonials inventados
130
+ ```html
131
+ <!-- Evitar -->
132
+ <blockquote>
133
+ "Este producto cambió mi vida."
134
+ — María García, CEO de Empresa S.A.
135
+ </blockquote>
136
+ ```
137
+ ✅ Si no hay testimonials reales del IR, omitir la sección completamente.
138
+
139
+ ---
140
+
141
+ ## Cómo aplicar estas reglas
142
+
143
+ Los agentes **product-designer** y **wireframe-mvp** deben:
144
+
145
+ 1. Antes de generar cualquier UI, leer este archivo
146
+ 2. Generar el artefacto
147
+ 3. Hacer auto-checklist: ¿viola alguna de las 7 reglas cardinales?
148
+ 4. Si viola alguna P0: corregir antes de entregar
149
+ 5. Si viola P1: mencionar en el output y decidir si corregir
150
+
151
+ La skill **critica-diseno** evalúa explícitamente "Ausencia de AI-slop" como una de sus 5 dimensiones.
152
+
153
+ ---
154
+
155
+ ## Origen
156
+
157
+ Estas reglas están adaptadas de `open-design` (nexu-io/open-design), proyecto Apache-2.0.
158
+ La lista de colores prohibidos y los patrones fueron identificados por análisis de outputs de modelos de lenguaje entre 2023–2025.