sdd-es 2.0.0 → 2.5.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.
- package/.claude/settings.json +21 -45
- package/LICENSE +21 -0
- package/README.md +51 -21
- package/agents/architecture-designer.md +174 -0
- package/agents/arquitecto.md +16 -1
- package/agents/asesor-datos.md +15 -1
- package/agents/critico.md +37 -1
- package/agents/desarrollador-backend.md +3 -1
- package/agents/desarrollador-frontend.md +3 -1
- package/agents/disenador-api.md +13 -1
- package/agents/documentador.md +3 -1
- package/agents/investigador.md +3 -1
- package/agents/operaciones.md +3 -1
- package/agents/product-designer.md +232 -0
- package/agents/revisor.md +25 -1
- package/agents/seguridad.md +5 -1
- package/agents/tester.md +3 -1
- package/claude-hooks/agent-memory.js +154 -0
- package/cli/index.js +1 -2
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.compliance.md +516 -0
- package/commands/sdd.configurar.md +33 -0
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- package/commands/sdd.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +68 -1
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +203 -23
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +70 -1
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.verificar.md +10 -0
- package/craft/accessibility-baseline.md +216 -0
- package/craft/anti-ai-slop.md +158 -0
- package/craft/color.md +160 -0
- package/craft/typography.md +121 -0
- package/design-systems/bold-brutalist/DESIGN.md +239 -0
- package/design-systems/editorial-minimal/DESIGN.md +205 -0
- package/design-systems/neutral-modern/DESIGN.md +227 -0
- package/design-systems/vibrant-consumer/DESIGN.md +257 -0
- package/design-systems/warm-editorial/DESIGN.md +221 -0
- package/docs/AGENTES.md +4 -1
- package/docs/FABRICA.md +164 -115
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +237 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +5 -3
- package/skills/cache-audit/SKILL.md +163 -0
- package/skills/critica-diseno/SKILL.md +193 -0
- package/skills/descubrir-idea/SKILL.md +133 -0
- package/skills/effort-router/SKILL.md +128 -0
- package/skills/elegir-direccion/SKILL.md +184 -0
- package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
- package/skills/github-connect/INDEX.md +223 -0
- package/skills/github-connect/INTEGRATION.md +361 -0
- package/skills/github-connect/QUICK-START.md +168 -0
- package/skills/github-connect/README.md +414 -0
- package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
- package/skills/github-connect/SKILL.md +343 -0
- package/skills/github-connect/STRUCTURE.txt +252 -0
- package/skills/github-connect/example-config.yaml +41 -0
- package/skills/github-connect/github-connect.sh +419 -0
- package/skills/interpretar-idea/SKILL.md +254 -0
- package/skills/memory-compactor/SKILL.md +114 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +154 -0
- package/skills/vercel-deploy/00-START-HERE.txt +364 -0
- package/skills/vercel-deploy/CHECKLIST.md +205 -0
- package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
- package/skills/vercel-deploy/FLOW.txt +334 -0
- package/skills/vercel-deploy/INDEX.md +276 -0
- package/skills/vercel-deploy/INTEGRATION.md +328 -0
- package/skills/vercel-deploy/MANIFEST.md +310 -0
- package/skills/vercel-deploy/README.md +65 -0
- package/skills/vercel-deploy/SKILL.md +356 -0
- package/skills/vercel-deploy/deploy.sh +298 -0
- package/skills/vercel-deploy/estado.json.example +205 -0
- package/skills/vercel-deploy/skill.yaml +323 -0
- package/skills/vercel-deploy/vercel-deploy.sh +216 -0
- package/skills/wireframe-mvp/SKILL.md +157 -0
- package/.claude-plugin/marketplace.json +0 -31
- package/.claude-plugin/plugin.json +0 -97
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- package/docs/EJEMPLOS.md +0 -212
- /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
- /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
- /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
- /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
- /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
- /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
- /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
- /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Ciclo completo de optimización de tokens para la sesión actual — detecta fan-out, recomienda modelos por fase, comprime memoria si supera umbral, audita oportunidades de caché y proyecta presupuesto. Punto de entrada unificado para uso eficiente de tokens en FORGE.
|
|
3
|
+
allowed-tools: Read, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.optimizar — Optimización de Tokens
|
|
7
|
+
|
|
8
|
+
## Subcomandos disponibles
|
|
9
|
+
|
|
10
|
+
| Subcomando | Qué ejecuta |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `/sdd.optimizar` | Ciclo completo (PASOes 1-6) |
|
|
13
|
+
| `/sdd.optimizar tokens` | Solo effort-router + cache-audit |
|
|
14
|
+
| `/sdd.optimizar memoria` | Solo memory-compactor |
|
|
15
|
+
| `/sdd.optimizar presupuesto` | Solo token-budget |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## PASO 1 — Verificar que el proyecto está inicializado
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
[ ! -d .sdd ] && echo "NO_INICIALIZADO" && exit 0
|
|
23
|
+
[ ! -f .sdd/estado.json ] && echo "SIN_ESTADO" && exit 0
|
|
24
|
+
cat .sdd/estado.json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Si no está inicializado: mostrar `🚫 SDD-ES no inicializado. Ejecuta: /sdd.constitucion` y terminar.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## PASO 2 — Leer ledger de consumo (observabilidad)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
if [ -f .sdd/observabilidad/consumo.jsonl ]; then
|
|
35
|
+
wc -l .sdd/observabilidad/consumo.jsonl
|
|
36
|
+
cat .sdd/observabilidad/consumo.jsonl
|
|
37
|
+
else
|
|
38
|
+
echo "SIN_LEDGER"
|
|
39
|
+
fi
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Si `SIN_LEDGER`: marcar PASO 2 como "Sin datos de sesión — ledger vacío" y continuar.
|
|
43
|
+
|
|
44
|
+
Si hay datos: invocar la skill `observabilidad-consumo` para obtener:
|
|
45
|
+
- Tabla por agente (invocaciones, bytes, archivos únicos)
|
|
46
|
+
- Alertas de fan-out (>5 agentes distintos, >20 invocaciones de un agente, >500KB total)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## PASO 3 — Routing de effort (si hay fase activa o alertas de fan-out)
|
|
51
|
+
|
|
52
|
+
Invocar la skill `effort-router` con la fase del `estado.json`.
|
|
53
|
+
|
|
54
|
+
Si el subcomando es `/sdd.optimizar presupuesto` o `/sdd.optimizar memoria`, saltar este paso.
|
|
55
|
+
|
|
56
|
+
Mostrar la tabla de modelos recomendados y el ahorro estimado.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## PASO 4 — Comprimir memoria si supera umbral
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Verificar tamaño de archivos de memoria
|
|
64
|
+
for f in .sdd/memoria/agente-*.md; do
|
|
65
|
+
[ -f "$f" ] || continue
|
|
66
|
+
entradas=$(grep -c "^## " "$f" 2>/dev/null || echo 0)
|
|
67
|
+
bytes=$(wc -c < "$f" 2>/dev/null || echo 0)
|
|
68
|
+
echo "MEMORIA:$f:$entradas:$bytes"
|
|
69
|
+
done
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Si algún archivo supera **80 entradas** o **50 000 bytes**: invocar la skill `memory-compactor`.
|
|
73
|
+
|
|
74
|
+
Si el subcomando es `/sdd.optimizar tokens` o `/sdd.optimizar presupuesto`, saltar este paso.
|
|
75
|
+
|
|
76
|
+
Si ningún archivo supera el umbral: marcar "✅ Memoria dentro del umbral".
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## PASO 5 — Auditar oportunidades de caché
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Detectar agentes instalados en el proyecto
|
|
84
|
+
ls .claude/agents/ 2>/dev/null || echo "SIN_AGENTES_LOCALES"
|
|
85
|
+
|
|
86
|
+
# Detectar patterns que invalidan caché silenciosamente
|
|
87
|
+
grep -rn "$(date +%Y-%m-%d)\|[0-9a-f]\{8\}-[0-9a-f]\{4\}\|consumo\.jsonl" .claude/agents/ 2>/dev/null || echo "SIN_INVALIDADORES"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Invocar la skill `cache-audit` con los resultados.
|
|
91
|
+
|
|
92
|
+
Si el subcomando es `/sdd.optimizar memoria` o `/sdd.optimizar presupuesto`, saltar este paso.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## PASO 6 — Proyectar presupuesto de fases restantes
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Tareas pendientes de la spec activa
|
|
100
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
101
|
+
if [ -n "$SPEC_ID" ]; then
|
|
102
|
+
cat ".sdd/especificaciones/${SPEC_ID}/.estado-tareas.json" 2>/dev/null || echo "SIN_TAREAS"
|
|
103
|
+
fi
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Invocar la skill `token-budget` con el estado, tareas pendientes y datos del ledger.
|
|
107
|
+
|
|
108
|
+
Si el subcomando es `/sdd.optimizar tokens` o `/sdd.optimizar memoria`, saltar este paso.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## PASO 7 — Reporte unificado
|
|
113
|
+
|
|
114
|
+
Generar el reporte final ordenando las acciones por impacto decreciente:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
╔══════════════════════════════════════════════════════════════════╗
|
|
118
|
+
║ ⚡ SDD.OPTIMIZAR — Reporte de Eficiencia ║
|
|
119
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
120
|
+
║ Proyecto: {nombre} | Fase: {fase} | {fecha} ║
|
|
121
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
122
|
+
║ 📊 CONSUMO DE SESIÓN ║
|
|
123
|
+
║ ║
|
|
124
|
+
║ {tabla por agente o "Sin datos de sesión"} ║
|
|
125
|
+
║ {alertas de fan-out o "✅ Sin alertas"} ║
|
|
126
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
127
|
+
║ 🎯 ROUTING DE MODELOS (fase: {fase}) ║
|
|
128
|
+
║ ║
|
|
129
|
+
║ {tabla effort-router} ║
|
|
130
|
+
║ Ahorro estimado vs. Opus-en-todo: ~{%}% ║
|
|
131
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
132
|
+
║ 🧠 MEMORIA DE AGENTES ║
|
|
133
|
+
║ ║
|
|
134
|
+
║ {estado por agente: OK / comprimido / pendiente} ║
|
|
135
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
136
|
+
║ 🔄 CACHÉ ║
|
|
137
|
+
║ ║
|
|
138
|
+
║ {oportunidades detectadas o "✅ Sin invalidadores detectados"} ║
|
|
139
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
140
|
+
║ 💰 PRESUPUESTO DE FASES RESTANTES ║
|
|
141
|
+
║ ║
|
|
142
|
+
║ {tabla por fase: costo estimado y recomendación PTC} ║
|
|
143
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
144
|
+
║ 🚀 ACCIONES RECOMENDADAS (por impacto) ║
|
|
145
|
+
║ ║
|
|
146
|
+
║ 1. {acción de mayor impacto con comando concreto} ║
|
|
147
|
+
║ 2. {segunda acción} ║
|
|
148
|
+
║ 3. {tercera acción} ║
|
|
149
|
+
╚══════════════════════════════════════════════════════════════════╝
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Lógica de priorización de acciones
|
|
153
|
+
|
|
154
|
+
Ordenar las recomendaciones así:
|
|
155
|
+
1. **Fan-out activo** (>5 agentes o >20 invocaciones) → acción inmediata con `effort-router`
|
|
156
|
+
2. **Memoria sobre umbral** (>50KB) → `memory-compactor`
|
|
157
|
+
3. **Invalidadores de caché detectados** → `cache-audit` con fix sugerido
|
|
158
|
+
4. **Fases costosas por delante** → `token-budget` + sugerencia de PTC
|
|
159
|
+
|
|
160
|
+
Si no hay ninguna de estas condiciones:
|
|
161
|
+
```
|
|
162
|
+
✅ La sesión está optimizada. No se detectan acciones de alto impacto.
|
|
163
|
+
Próximo paso sugerido según fase: {COMANDO_SDD}
|
|
164
|
+
```
|
|
@@ -21,6 +21,8 @@ Eres el **Orquestador del Plan**. Coordinas a los agentes especializados configu
|
|
|
21
21
|
|
|
22
22
|
**Si el usuario escribió `/sdd.planificar revisar`**: muestra el plan actual y pide cambios específicos.
|
|
23
23
|
|
|
24
|
+
**Si el usuario escribió `/sdd.planificar cambios [descripción]`**: registra feedback específico, edita el plan, y regresa al PASO 9 (aprobación explícita).
|
|
25
|
+
|
|
24
26
|
## VERIFICACIONES PRE-EJECUCIÓN
|
|
25
27
|
|
|
26
28
|
```bash
|
|
@@ -296,6 +298,68 @@ EOF
|
|
|
296
298
|
# Actualizar entrada de INDICE.md: "plan: ✅"
|
|
297
299
|
```
|
|
298
300
|
|
|
301
|
+
## PASO 8 — Presentar el plan (resumen ejecutivo)
|
|
302
|
+
|
|
303
|
+
No muestres el plan técnico completo. En su lugar, presenta un **resumen ejecutivo** adaptado al perfil:
|
|
304
|
+
|
|
305
|
+
**Si perfil == "guiado":**
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
✅ PLAN LISTO PARA CONSTRUIR
|
|
309
|
+
|
|
310
|
+
Lo que voy a hacer:
|
|
311
|
+
→ [3-5 frases en lenguaje simple de lo que se construye]
|
|
312
|
+
|
|
313
|
+
Tecnología que usaré:
|
|
314
|
+
→ [stack elegido, explicado sin jerga. Ej: "JavaScript (lenguaje web), SQLite (base de datos simple y gratis), Node.js (servidor web)"]
|
|
315
|
+
|
|
316
|
+
Tiempo aproximado:
|
|
317
|
+
→ [estimación legible: "unos 30-45 minutos"]
|
|
318
|
+
|
|
319
|
+
Archivos que cambiarán:
|
|
320
|
+
→ [lista simple de carpetas/conceptos afectados, no rutas técnicas]
|
|
321
|
+
|
|
322
|
+
Lo que queda por hacer después:
|
|
323
|
+
→ [QA, deploy, etc.]
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Si perfil == "experto":**
|
|
327
|
+
|
|
328
|
+
Muestra el plan técnico completo (todas las 17 secciones) con decisiones, riesgos y justificaciones.
|
|
329
|
+
|
|
330
|
+
## PASO 9 — Solicitar aprobación EXPLÍCITA
|
|
331
|
+
|
|
332
|
+
**Gate humano:** No avances a tareas sin aprobación clara.
|
|
333
|
+
|
|
334
|
+
```
|
|
335
|
+
¿Está bien este plan?
|
|
336
|
+
|
|
337
|
+
Responde:
|
|
338
|
+
✅ "sí" → Avanzamos con /sdd.tareas
|
|
339
|
+
🔄 "cambio [descripción]" → Edito el plan y pregunto de nuevo
|
|
340
|
+
❌ "rechazar" → Abortamos y revisamos la especificación
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Si usuario responde "cambio X":
|
|
344
|
+
1. Edita solo la sección relevante del plan
|
|
345
|
+
2. Vuelve al PASO 8 (resumen ejecutivo)
|
|
346
|
+
3. Solicita aprobación explícita nuevamente
|
|
347
|
+
|
|
348
|
+
**Guardar aprobación:**
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
# Si aprobación == "sí"
|
|
352
|
+
cat >> .sdd/estado.json << 'EOF'
|
|
353
|
+
"plan_aprobado": true,
|
|
354
|
+
"plan_aprobacion_timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
355
|
+
"plan_aprobacion_usuario": "usuario",
|
|
356
|
+
EOF
|
|
357
|
+
|
|
358
|
+
# Mensaje de confirmación
|
|
359
|
+
echo "✅ Plan aprobado. Siguiente: /sdd.tareas"
|
|
360
|
+
echo "💾 Tu aprobación se guardó automáticamente."
|
|
361
|
+
```
|
|
362
|
+
|
|
299
363
|
## PASO 8 — Pedir aprobación del plan
|
|
300
364
|
|
|
301
365
|
Si `comportamiento.requerir_aprobacion_plan: true` en config:
|
|
@@ -237,3 +237,13 @@ ACCIONES REQUERIDAS:
|
|
|
237
237
|
Vuelve a:
|
|
238
238
|
/sdd.implementar — completar tareas pendientes
|
|
239
239
|
```
|
|
240
|
+
|
|
241
|
+
## PASO 13 — Output styles (adaptar el PASO 12 según modo)
|
|
242
|
+
|
|
243
|
+
Si el argumento contiene `pm`, `arq` o `dev`, adapta el reporte final:
|
|
244
|
+
|
|
245
|
+
**Modo `pm`:** Muestra solo el veredicto, el % de cobertura y los bloqueos en lenguaje de negocio. Omite tablas de CA y rutas de archivo.
|
|
246
|
+
|
|
247
|
+
**Modo `arq`:** Enfatiza el cumplimiento de constitución, los ADRs afectados y los requisitos no funcionales. Incluye la tabla de CAs con archivos.
|
|
248
|
+
|
|
249
|
+
**Modo `dev`:** El reporte completo del PASO 10 con todas las tablas y rutas (comportamiento actual).
|
|
@@ -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.
|