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.
Files changed (95) hide show
  1. package/.claude/settings.json +21 -45
  2. package/LICENSE +21 -0
  3. package/README.md +51 -21
  4. package/agents/architecture-designer.md +174 -0
  5. package/agents/arquitecto.md +16 -1
  6. package/agents/asesor-datos.md +15 -1
  7. package/agents/critico.md +37 -1
  8. package/agents/desarrollador-backend.md +3 -1
  9. package/agents/desarrollador-frontend.md +3 -1
  10. package/agents/disenador-api.md +13 -1
  11. package/agents/documentador.md +3 -1
  12. package/agents/investigador.md +3 -1
  13. package/agents/operaciones.md +3 -1
  14. package/agents/product-designer.md +232 -0
  15. package/agents/revisor.md +25 -1
  16. package/agents/seguridad.md +5 -1
  17. package/agents/tester.md +3 -1
  18. package/claude-hooks/agent-memory.js +154 -0
  19. package/cli/index.js +1 -2
  20. package/commands/sdd.analizar.md +23 -2
  21. package/commands/sdd.compliance.md +516 -0
  22. package/commands/sdd.configurar.md +33 -0
  23. package/commands/sdd.constitucion.md +198 -23
  24. package/commands/sdd.construir.md +210 -0
  25. package/commands/sdd.dise/303/261ar.md +188 -0
  26. package/commands/sdd.estado.md +68 -1
  27. package/commands/sdd.exportar.md +344 -0
  28. package/commands/sdd.implementar.md +203 -23
  29. package/commands/sdd.interpretar.md +239 -0
  30. package/commands/sdd.md +70 -1
  31. package/commands/sdd.optimizar.md +164 -0
  32. package/commands/sdd.planificar.md +64 -0
  33. package/commands/sdd.verificar.md +10 -0
  34. package/craft/accessibility-baseline.md +216 -0
  35. package/craft/anti-ai-slop.md +158 -0
  36. package/craft/color.md +160 -0
  37. package/craft/typography.md +121 -0
  38. package/design-systems/bold-brutalist/DESIGN.md +239 -0
  39. package/design-systems/editorial-minimal/DESIGN.md +205 -0
  40. package/design-systems/neutral-modern/DESIGN.md +227 -0
  41. package/design-systems/vibrant-consumer/DESIGN.md +257 -0
  42. package/design-systems/warm-editorial/DESIGN.md +221 -0
  43. package/docs/AGENTES.md +4 -1
  44. package/docs/FABRICA.md +164 -115
  45. package/docs/MEMORIA-Y-OBSERVABILIDAD.md +237 -0
  46. package/docs/MODELOS.md +3 -0
  47. package/docs/QUE-PASA-SI-FALLA.md +404 -0
  48. package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
  49. package/package.json +5 -3
  50. package/skills/cache-audit/SKILL.md +163 -0
  51. package/skills/critica-diseno/SKILL.md +193 -0
  52. package/skills/descubrir-idea/SKILL.md +133 -0
  53. package/skills/effort-router/SKILL.md +128 -0
  54. package/skills/elegir-direccion/SKILL.md +184 -0
  55. package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
  56. package/skills/github-connect/INDEX.md +223 -0
  57. package/skills/github-connect/INTEGRATION.md +361 -0
  58. package/skills/github-connect/QUICK-START.md +168 -0
  59. package/skills/github-connect/README.md +414 -0
  60. package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
  61. package/skills/github-connect/SKILL.md +343 -0
  62. package/skills/github-connect/STRUCTURE.txt +252 -0
  63. package/skills/github-connect/example-config.yaml +41 -0
  64. package/skills/github-connect/github-connect.sh +419 -0
  65. package/skills/interpretar-idea/SKILL.md +254 -0
  66. package/skills/memory-compactor/SKILL.md +114 -0
  67. package/skills/modo-guiado/SKILL.md +12 -2
  68. package/skills/observabilidad-consumo/SKILL.md +164 -0
  69. package/skills/token-budget/SKILL.md +154 -0
  70. package/skills/vercel-deploy/00-START-HERE.txt +364 -0
  71. package/skills/vercel-deploy/CHECKLIST.md +205 -0
  72. package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
  73. package/skills/vercel-deploy/FLOW.txt +334 -0
  74. package/skills/vercel-deploy/INDEX.md +276 -0
  75. package/skills/vercel-deploy/INTEGRATION.md +328 -0
  76. package/skills/vercel-deploy/MANIFEST.md +310 -0
  77. package/skills/vercel-deploy/README.md +65 -0
  78. package/skills/vercel-deploy/SKILL.md +356 -0
  79. package/skills/vercel-deploy/deploy.sh +298 -0
  80. package/skills/vercel-deploy/estado.json.example +205 -0
  81. package/skills/vercel-deploy/skill.yaml +323 -0
  82. package/skills/vercel-deploy/vercel-deploy.sh +216 -0
  83. package/skills/wireframe-mvp/SKILL.md +157 -0
  84. package/.claude-plugin/marketplace.json +0 -31
  85. package/.claude-plugin/plugin.json +0 -97
  86. package/docs/EJEMPLO-PRACTICA.md +0 -383
  87. package/docs/EJEMPLOS.md +0 -212
  88. /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
  89. /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
  90. /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
  91. /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
  92. /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
  93. /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
  94. /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
  95. /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
@@ -0,0 +1,280 @@
1
+ # 🔐 Seguridad para No-Técnicos
2
+
3
+ > SDD-ES maneja tokens de GitHub y Vercel. Esta guía te explica qué son, cómo protegerlos, y qué hacer si cometes un error.
4
+
5
+ ---
6
+
7
+ ## ¿Qué es un "token"?
8
+
9
+ Un **token** es como una **contraseña especial** que funciona solo para una cosa.
10
+
11
+ ### Comparación
12
+
13
+ ```
14
+ Contraseña normal:
15
+ ├─ Acceso a: email, redes sociales, archivos, TODO
16
+ └─ Riesgo: si alguien la roba, controla tu cuenta
17
+
18
+ Token:
19
+ ├─ Acceso a: SOLO GitHub (o SOLO Vercel)
20
+ ├─ Duración: puedes ponerle límite de tiempo
21
+ └─ Riesgo: si alguien lo roba, SOLO puede hacer lo que le diste permiso
22
+ ```
23
+
24
+ **Ejemplo real:**
25
+ ```
26
+ Token de GitHub para SDD-ES:
27
+ ├─ ✅ PUEDE: crear repositorio, hacer commits, pushear código
28
+ ├─ ✅ PUEDE: leer público el repositorio
29
+ └─ ❌ NO PUEDE: ver tus emails privados, cambiar contraseña, acceder a otros proyectos
30
+ ```
31
+
32
+ ---
33
+
34
+ ## ¿Por qué SDD-ES pide tokens?
35
+
36
+ SDD-ES necesita tokens para:
37
+
38
+ 1. **GitHub:** Crear tu repositorio automáticamente (sin que escribas `git init`)
39
+ 2. **Vercel:** Publicar tu app en internet (sin que escribas `vercel deploy`)
40
+
41
+ Sin tokens, tendrías que hacer todo manualmente (comandos, CLI, etc.).
42
+
43
+ **Con tokens:** SDD-ES lo hace automáticamente por ti.
44
+
45
+ ---
46
+
47
+ ## 🚨 NUNCA hagas ESTO con tokens
48
+
49
+ ### ❌ NO 1: No compartas tu token
50
+
51
+ ```
52
+ ❌ MALO:
53
+ - Enviar token por Whatsapp a un amigo
54
+ - Pegar token en Slack o Discord
55
+ - Guardar token en Notas o Google Docs
56
+ - Decirle a alguien tu token
57
+ ```
58
+
59
+ **¿Por qué?** Si alguien tiene tu token, puede:
60
+ - Acceder a tu GitHub/Vercel
61
+ - Hacer commits en tu nombre
62
+ - Borrar repositorios
63
+ - Cambiar configuración de apps
64
+
65
+ ---
66
+
67
+ ### ❌ NO 2: No guardes token en archivos
68
+
69
+ ```
70
+ ❌ MALO (SDD-ES NO hace esto):
71
+ - No guardes token en .env
72
+ - No lo guardes en un archivo de texto
73
+ - No lo commitess a GitHub
74
+
75
+ ✅ BIEN (SDD-ES SÍ hace esto):
76
+ - Token se usa en memoria mientras se necesita
77
+ - Cuando termina, se borra automáticamente
78
+ - Nunca se escribe en archivos persistentes
79
+ ```
80
+
81
+ ---
82
+
83
+ ### ❌ NO 3: No commitess archivos sensibles
84
+
85
+ ```
86
+ ❌ MALO:
87
+ git add .
88
+ git commit -m "Mi proyecto"
89
+ [Si accidentalmente commiteas .env o credenciales]
90
+
91
+ ✅ BIEN:
92
+ SDD-ES usa .gitignore para proteger:
93
+ - .sdd/.vercel-deploy.json (metadata de deploy)
94
+ - .env (variables de entorno)
95
+ - Cualquier archivo con secretos
96
+
97
+ [Git automáticamente ignora estos archivos]
98
+ ```
99
+
100
+ ---
101
+
102
+ ## 📋 ¿Cómo generar un token SEGURO?
103
+
104
+ ### Token de GitHub (para SDD-ES)
105
+
106
+ **Paso 1:** Abre https://github.com/settings/tokens?type=pat
107
+
108
+ **Paso 2:** Click "Generate new token" → "Fine-grained tokens"
109
+
110
+ **Paso 3:** Configura permisos **MÍNIMOS**:
111
+ ```
112
+ Repository access:
113
+ ✅ All repositories (SDD-ES creará uno nuevo)
114
+
115
+ Permissions:
116
+ ✅ Repository: READ + WRITE (crear repo, hacer commits)
117
+ ✅ Administration: NONE (no cambiar settings)
118
+ ✅ Secrets: NONE (no leer otros secrets)
119
+ ❌ User: NONE (no acceder emails)
120
+ ```
121
+
122
+ **Paso 4:** Expiration:
123
+ ```
124
+ ⚠️ IMPORTANTE: Pon un límite de 90 días
125
+ (No "No expiration" — riesgo si token se roba)
126
+ ```
127
+
128
+ **Paso 5:** Click "Generate token", copia y **úsalo INMEDIATAMENTE**
129
+
130
+ **Paso 6:** En SDD-ES, pega el token cuando pida
131
+
132
+ ---
133
+
134
+ ### Token de Vercel (para SDD-ES)
135
+
136
+ **Paso 1:** Abre https://vercel.com/account/tokens
137
+
138
+ **Paso 2:** Click "Create Token"
139
+
140
+ **Paso 3:** Configura:
141
+ ```
142
+ Token Name: "SDD-ES [nombre-proyecto]" (ej: SDD-ES Mi Tienda)
143
+ Scope: Todos los equipos (o tu equipo)
144
+ Expiration: 90 días (NO "No expiration")
145
+ ```
146
+
147
+ **Paso 4:** Click "Create", copia y **úsalo INMEDIATAMENTE**
148
+
149
+ ---
150
+
151
+ ## ✅ Si generaste token correctamente
152
+
153
+ ```
154
+ Después de pegar el token en SDD-ES:
155
+
156
+ Sistema: "✅ Token válido"
157
+ Sistema: "[invoca skill de GitHub/Vercel]"
158
+ Sistema: "✅ Tu proyecto está en GitHub/Vercel"
159
+
160
+ El token se BORRA de la memoria automáticamente.
161
+ Ya NO lo necesitas más.
162
+ ```
163
+
164
+ ---
165
+
166
+ ## 🚨 Si cometiste un error (compartiste token accidentalmente)
167
+
168
+ ### Escenario 1: Compartiste token por Whatsapp/Slack
169
+
170
+ **¿Qué hacer?**
171
+
172
+ 1. **IMMEDIATO — Revoca el token:**
173
+ - GitHub: https://github.com/settings/tokens
174
+ - Busca el token
175
+ - Click "Delete"
176
+
177
+ 2. **Genera uno NUEVO:**
178
+ - Sigue los pasos de arriba
179
+ - USA el nuevo en SDD-ES
180
+
181
+ 3. **Chequea que no pasó nada malo:**
182
+ - GitHub: Mira el repositorio, ¿alguien cambió código?
183
+ - Vercel: ¿Apps raras desplegadas?
184
+
185
+ 4. **Si sospechas actividad extraña:**
186
+ - Cambia contraseña de GitHub/Vercel
187
+ - Activa 2FA (autenticación de dos factores)
188
+
189
+ ---
190
+
191
+ ### Escenario 2: Accidentalmente commitease token a GitHub
192
+
193
+ ```
194
+ (SDD-ES NO hace esto, pero si ocurre por error)
195
+
196
+ ❌ MALO: El token está en GitHub público
197
+ Cualquiera puede verlo en git log
198
+
199
+ ✅ RECUPERACIÓN:
200
+ 1. Revoca el token INMEDIATAMENTE (arriba)
201
+ 2. Borra el archivo de histórico de git:
202
+ git filter-branch --tree-filter 'rm -f .env' HEAD
203
+ 3. Force push: git push --force
204
+ 4. Avisa a GitHub (https://github.com/security/advisories)
205
+ ```
206
+
207
+ ---
208
+
209
+ ## 🔒 SDD-ES protege tu seguridad
210
+
211
+ ### Cómo SDD-ES cuida los tokens
212
+
213
+ ```
214
+ ✅ TOKENS EN VARIABLES DE ENTORNO (memoria)
215
+ └─ No se escriben en archivos
216
+ └─ Se borran cuando termina el script
217
+
218
+ ✅ VALIDACIÓN INMEDIATA
219
+ └─ Si token es inválido, sale rápido
220
+ └─ No continúa si hay problema
221
+
222
+ ✅ .gitignore AUTOMÁTICO
223
+ └─ Protege archivos sensibles
224
+ └─ Aunque hagas "git add .", no se commitean
225
+
226
+ ✅ SIN GUARDAR CREDENTIALS
227
+ └─ sdd.config.yaml SOLO guarda URLs, no tokens
228
+ └─ Tokens se usan ONCE y desaparecen
229
+ ```
230
+
231
+ ---
232
+
233
+ ## 📋 Checklist de Seguridad
234
+
235
+ Antes de usar SDD-ES, asegúrate de:
236
+
237
+ ```
238
+ [ ] Generé un token NUEVO (no uno viejo)
239
+ [ ] Token tiene expiración 90 días (no "No expiration")
240
+ [ ] Token tiene permisos MÍNIMOS (solo repo, no everything)
241
+ [ ] Guardé el token en un lugar SEGURO temporalmente (1Password, Bitwarden)
242
+ [ ] Voy a pegar el token INMEDIATAMENTE en SDD-ES
243
+ [ ] NO voy a guardar el token en archivos
244
+ [ ] NO voy a compartir el token en mensajes
245
+ ```
246
+
247
+ ---
248
+
249
+ ## 🆘 Emergencia: Creo que mi token fue robado
250
+
251
+ ```
252
+ ACCIÓN: REVOCA INMEDIATAMENTE
253
+
254
+ 1. GitHub: https://github.com/settings/tokens
255
+ → Busca token → Click "Delete"
256
+
257
+ 2. Vercel: https://vercel.com/account/tokens
258
+ → Click "Delete"
259
+
260
+ 3. Genera NUEVOS tokens
261
+
262
+ 4. IMPORTANTE: Cambia contraseña GitHub/Vercel
263
+ (por si alguien también robó contraseña)
264
+ ```
265
+
266
+ ---
267
+
268
+ ## 📚 Más información
269
+
270
+ - **GitHub Security:** https://docs.github.com/en/authentication/keeping-your-account-and-data-secure
271
+ - **Vercel Security:** https://vercel.com/docs/security
272
+ - **OWASP (Seguridad general):** https://owasp.org/
273
+
274
+ ---
275
+
276
+ ## 💬 ¿Preguntas?
277
+
278
+ Si no estás seguro sobre algo de seguridad, **mejor pregunta que arreglar después.**
279
+
280
+ Abre un issue en GitHub: https://github.com/carlos060798/sdd-lite/issues
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdd-es",
3
- "version": "2.0.0",
3
+ "version": "2.5.0",
4
4
  "description": "Spec-Driven Development en español para Claude Code. Fábrica de software: de la idea al despliegue, agnóstica al stack. Instalador multiplataforma.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,6 +20,8 @@
20
20
  "commands/",
21
21
  "agents/",
22
22
  "skills/",
23
+ "craft/",
24
+ "design-systems/",
23
25
  "plantillas/",
24
26
  "presets/",
25
27
  "claude-hooks/",
@@ -42,9 +44,9 @@
42
44
  "plugin"
43
45
  ],
44
46
  "license": "MIT",
45
- "homepage": "https://github.com/carlos060798/sdd-lite",
47
+ "homepage": "https://github.com/carlos060798/FORGE",
46
48
  "repository": {
47
49
  "type": "git",
48
- "url": "https://github.com/carlos060798/sdd-lite.git"
50
+ "url": "https://github.com/carlos060798/FORGE.git"
49
51
  }
50
52
  }
@@ -0,0 +1,163 @@
1
+ ---
2
+ description: Audita los archivos de agentes (.claude/agents/*.md) para detectar bloques estables susceptibles de cache_control y los 3 patrones que invalidan caché silenciosamente (timestamps dinámicos, UUIDs, contenido JSONL embebido). Produce una lista de oportunidades de caché ordenadas por impacto.
3
+ model: claude-haiku-4-5-20251001
4
+ allowed-tools: Read, Bash
5
+ ---
6
+
7
+ # Skill: Cache Audit
8
+
9
+ ## Propósito
10
+
11
+ El prompt caching de Claude reduce el costo de tokens de entrada hasta un 90% para bloques de contexto que no cambian entre invocaciones. Sin embargo, tres patrones comunes invalidan el caché silenciosamente — el modelo re-paga el precio completo sin que nadie se dé cuenta.
12
+
13
+ Esta skill detecta esos patrones en los archivos de agentes del proyecto activo y produce recomendaciones concretas.
14
+
15
+ ---
16
+
17
+ ## Lo que lees
18
+
19
+ ```bash
20
+ # Agentes instalados en el proyecto (instalados localmente, no en el plugin)
21
+ ls .claude/agents/ 2>/dev/null || echo "SIN_AGENTES_LOCALES"
22
+
23
+ # Agentes del plugin (si existe {PLUGIN_DIR})
24
+ ls {PLUGIN_DIR}/agents/ 2>/dev/null | head -20
25
+
26
+ # Contenido de cada archivo de agente
27
+ for f in .claude/agents/*.md {PLUGIN_DIR}/agents/*.md; do
28
+ [ -f "$f" ] || continue
29
+ echo "=== AGENTE: $f ==="
30
+ cat "$f"
31
+ echo "---"
32
+ done
33
+ ```
34
+
35
+ ---
36
+
37
+ ## Los 3 invalidadores de caché
38
+
39
+ ### Invalidador 1 — Timestamps dinámicos en el system prompt
40
+
41
+ Un timestamp que cambia en cada sesión rompe el caché de todo el bloque que lo contiene y todos los bloques siguientes.
42
+
43
+ **Patrones a detectar:**
44
+ ```bash
45
+ grep -n "\b[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\b" .claude/agents/*.md {PLUGIN_DIR}/agents/*.md 2>/dev/null
46
+ ```
47
+
48
+ **Severidad:** ALTA — invalida el caché en cada nueva sesión (cada día).
49
+
50
+ **Fix:** Mover el timestamp al final del prompt, en un bloque marcado como dinámico separado del bloque estable. O eliminarlo si no es necesario.
51
+
52
+ ---
53
+
54
+ ### Invalidador 2 — UUIDs / IDs únicos por sesión
55
+
56
+ Hashes o IDs generados en cada invocación invalidan todo el bloque donde aparecen.
57
+
58
+ **Patrones a detectar:**
59
+ ```bash
60
+ grep -nE "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" \
61
+ .claude/agents/*.md {PLUGIN_DIR}/agents/*.md 2>/dev/null
62
+ ```
63
+
64
+ **Severidad:** ALTA — invalida en cada invocación.
65
+
66
+ **Fix:** Sacar el ID del bloque estable. Si el agente necesita el ID, inyectarlo como variable de entorno o como argumento de la invocación, no como parte del system prompt fijo.
67
+
68
+ ---
69
+
70
+ ### Invalidador 3 — Contenido JSONL o ledger embebido directamente
71
+
72
+ Si el system prompt incluye el contenido del `consumo.jsonl` u otro archivo que cambia frecuentemente, el bloque se invalida en cada escritura del hook.
73
+
74
+ **Patrones a detectar:**
75
+ ```bash
76
+ grep -n "consumo\.jsonl\|\.jsonl\|\"ts\":\|\"agente\":\|\"bytes\":" \
77
+ .claude/agents/*.md {PLUGIN_DIR}/agents/*.md 2>/dev/null
78
+ ```
79
+
80
+ **Severidad:** MEDIA — invalida con cada invocación de agente.
81
+
82
+ **Fix:** En lugar de embeber el JSONL en el prompt, hacer que el agente lo lea con la tool `Read` cuando necesite esa información.
83
+
84
+ ---
85
+
86
+ ## Análisis de ratio estable/dinámico
87
+
88
+ Para cada archivo de agente, calcular:
89
+
90
+ ```bash
91
+ node -e "
92
+ const fs = require('fs');
93
+ const archivos = process.argv.slice(1);
94
+
95
+ for (const f of archivos) {
96
+ if (!fs.existsSync(f)) continue;
97
+ const contenido = fs.readFileSync(f, 'utf8');
98
+ const lineas = contenido.split('\n');
99
+ const total = lineas.length;
100
+
101
+ // Líneas sospechosas de ser dinámicas
102
+ const dinamicas = lineas.filter(l =>
103
+ /\d{4}-\d{2}-\d{2}/.test(l) || // fechas
104
+ /[0-9a-f]{8}-[0-9a-f]{4}/.test(l) || // UUIDs
105
+ /\"ts\":/.test(l) || // JSONL
106
+ /consumo\.jsonl/.test(l)
107
+ ).length;
108
+
109
+ const pct_estatico = Math.round((1 - dinamicas/total) * 100);
110
+ console.log(f + ': ' + pct_estatico + '% estático (' + dinamicas + '/' + total + ' líneas dinámicas)');
111
+ }
112
+ " .claude/agents/*.md {PLUGIN_DIR}/agents/*.md 2>/dev/null || echo "node no disponible"
113
+ ```
114
+
115
+ ---
116
+
117
+ ## Output que produces
118
+
119
+ ```
120
+ ╔══════════════════════════════════════════════════════════════════╗
121
+ ║ 🔄 CACHE AUDIT — Oportunidades de Caché ║
122
+ ╠══════════════════════════════════════════════════════════════════╣
123
+ ║ AGENTE | % ESTÁTICO | INVALIDADORES | SEVERIDAD ║
124
+ ║ ────────────────────┼────────────┼───────────────┼──────────── ║
125
+ ║ arquitecto | 98% | Ninguno | ✅ OK ║
126
+ ║ desarrollador-back | 95% | Ninguno | ✅ OK ║
127
+ ║ {agente con prob} | 72% | Timestamp L34 | ⚠️ MEDIO ║
128
+ ║ {agente con prob} | 45% | UUID L12, L67 | 🔴 ALTO ║
129
+ ╠══════════════════════════════════════════════════════════════════╣
130
+ ║ HALLAZGOS CONCRETOS ║
131
+ ║ ║
132
+ ║ 🔴 {agente}.md:12 — UUID detectado en bloque estable ║
133
+ ║ Fix: mover a argumento de invocación o variable de entorno ║
134
+ ║ ║
135
+ ║ ⚠️ {agente}.md:34 — Timestamp 2026-06-14 en system prompt ║
136
+ ║ Fix: mover al final del prompt, separar en bloque dinámico ║
137
+ ╠══════════════════════════════════════════════════════════════════╣
138
+ ║ 💰 AHORRO POTENCIAL ║
139
+ ║ ║
140
+ ║ Los agentes con >90% contenido estático son candidatos ║
141
+ ║ para cache_control: la primera invocación escribe el caché ║
142
+ ║ y las siguientes pagan ~10% del costo original de input. ║
143
+ ║ ║
144
+ ║ Para activar: separar el system prompt en bloque estable ║
145
+ ║ (primero) + bloque dinámico (al final). El modelo detecta ║
146
+ ║ automáticamente el prefijo estable y lo cachea. ║
147
+ ╚══════════════════════════════════════════════════════════════════╝
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Cuándo usar esta skill
153
+
154
+ - Antes de `/sdd.implementar` en proyectos con >5 tareas (sesiones largas = más valor del caché)
155
+ - Cuando `/sdd.estado consumo` reporta >1MB de bytes escritos (la sesión es larga)
156
+ - Cuando un agente tarda más de lo esperado en responder (el caché podría no estar activo)
157
+ - Desde `/sdd.optimizar tokens` (se ejecuta automáticamente como parte del ciclo)
158
+
159
+ ## Notas
160
+
161
+ - El prompt caching es automático en Claude Code — no requiere cambios en el código del hook.
162
+ - Lo que sí requiere intervención manual son los invalidadores: un UUID en línea 1 del prompt hace que el modelo no pueda cachear nada de lo que sigue.
163
+ - Esta skill audita; no modifica archivos. Los fixes los aplica el usuario (o un agente dedicado con permiso de Edit).
@@ -0,0 +1,193 @@
1
+ ---
2
+ description: Auto-crítica del wireframe generado. Evalúa en 5 dimensiones con score 1-5. Si score < 4 y iteraciones < 3, refina el artefacto y repite. Adaptado de critique-theater de open-design.
3
+ model: claude-sonnet-4-6
4
+ allowed-tools: Read, Write
5
+ ---
6
+
7
+ # Skill: Crítica de Diseño
8
+
9
+ ## Propósito
10
+
11
+ Después de generar el wireframe, esta skill lo evalúa en **5 dimensiones** y da un **score 1–5**. Si el score es bajo, refina el wireframe automáticamente y lo re-evalúa. El ciclo se repite hasta score ≥ 4 o 3 iteraciones.
12
+
13
+ Inspirado en `critique-theater` de open-design (nexu-io).
14
+
15
+ ---
16
+
17
+ ## Lo que lees antes de empezar
18
+
19
+ ```bash
20
+ # El wireframe generado
21
+ cat .sdd/diseño/wireframe-pantalla-principal.html
22
+
23
+ # El DESIGN.md activo (para verificar fidelidad)
24
+ cat "$(cat .sdd/estado.json | node -e "
25
+ const d = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
26
+ console.log(d.design_system_path || '{PLUGIN_DIR}/design-systems/neutral-modern/DESIGN.md');
27
+ ")"
28
+
29
+ # Las reglas anti-slop
30
+ cat "{PLUGIN_DIR}/craft/anti-ai-slop.md"
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Las 5 Dimensiones de Evaluación
36
+
37
+ ### Dimensión 1: Jerarquía Visual (1–5)
38
+ ¿El ojo del usuario sabe a dónde ir primero?
39
+
40
+ | Score | Criterio |
41
+ |-------|----------|
42
+ | 5 | Jerarquía clara: un elemento domina, luego soporte, luego detalle |
43
+ | 4 | Jerarquía buena con algún elemento secundario algo fuerte |
44
+ | 3 | Dos elementos compiten por atención principal |
45
+ | 2 | Múltiples elementos con el mismo peso visual |
46
+ | 1 | Sin jerarquía — todo tiene el mismo peso |
47
+
48
+ ### Dimensión 2: Fidelidad al DESIGN.md (1–5)
49
+ ¿El wireframe usa los tokens del sistema activo?
50
+
51
+ | Score | Criterio |
52
+ |-------|----------|
53
+ | 5 | Todos los colores, fuentes y componentes corresponden exactamente al DESIGN.md |
54
+ | 4 | Pequeñas desviaciones (un color ligeramente diferente, borde-radius incorrecto) |
55
+ | 3 | Usa el sistema general pero con elementos fuera del DESIGN.md |
56
+ | 2 | Sistema visual mixto — algunos tokens del DESIGN.md, otros no |
57
+ | 1 | Ignora el DESIGN.md activo completamente |
58
+
59
+ ### Dimensión 3: Funcionalidad del MVP (1–5)
60
+ ¿La pantalla permite hacer la acción principal del MVP?
61
+
62
+ | Score | Criterio |
63
+ |-------|----------|
64
+ | 5 | El usuario puede realizar la acción principal en ≤3 clicks desde esta pantalla |
65
+ | 4 | La acción principal está presente, quizás con un paso de más |
66
+ | 3 | La acción existe pero no es el elemento más prominente |
67
+ | 2 | La acción existe pero está perdida entre otros elementos |
68
+ | 1 | La pantalla no permite realizar la acción principal |
69
+
70
+ ### Dimensión 4: Ausencia de AI-Slop (1–5)
71
+ ¿El wireframe evita los patrones genéricos de IA?
72
+
73
+ | Score | Criterio |
74
+ |-------|----------|
75
+ | 5 | Cero violaciones de las 7 reglas cardinales + cero patrones P1 |
76
+ | 4 | Sin violaciones P0, máximo 1 patrón P1 |
77
+ | 3 | Sin violaciones P0, 2–3 patrones P1 |
78
+ | 2 | 1 violación P0 |
79
+ | 1 | 2+ violaciones P0 |
80
+
81
+ ### Dimensión 5: Innovación Contextual (1–5)
82
+ ¿El diseño tiene algo específico de este producto, o es completamente genérico?
83
+
84
+ | Score | Criterio |
85
+ |-------|----------|
86
+ | 5 | El copy, los datos de ejemplo y los elementos reflejan exactamente el dominio del producto |
87
+ | 4 | Mayoría de elementos son específicos del dominio, alguno genérico |
88
+ | 3 | Mezcla: algunos elementos específicos, otros genéricos |
89
+ | 2 | Solo el nombre del producto es específico — el resto es genérico |
90
+ | 1 | El wireframe podría ser de cualquier producto |
91
+
92
+ ---
93
+
94
+ ## Flujo de Crítica
95
+
96
+ ### Iteración 1
97
+
98
+ 1. Lee el wireframe
99
+ 2. Evalúa las 5 dimensiones
100
+ 3. Calcula el score promedio: `(D1 + D2 + D3 + D4 + D5) / 5`
101
+ 4. Muestra el resultado:
102
+
103
+ ```
104
+ CRÍTICA DEL DISEÑO (iteración 1/3)
105
+ ─────────────────────────────────
106
+ Jerarquía visual: [score]/5 [comentario breve]
107
+ Fidelidad al sistema: [score]/5 [comentario breve]
108
+ Funcionalidad MVP: [score]/5 [comentario breve]
109
+ Ausencia de AI-slop: [score]/5 [comentario breve]
110
+ Innovación contextual: [score]/5 [comentario breve]
111
+ ─────────────────────────────────
112
+ SCORE TOTAL: [promedio]/5
113
+
114
+ [Si score ≥ 4]: ✅ El diseño está listo.
115
+ [Si score < 4]: 🔄 Refinando... (iteración 1 → 2)
116
+ ```
117
+
118
+ ### Si score < 4 y iteraciones < 3
119
+
120
+ Genera una versión mejorada del wireframe corrigiendo los problemas detectados:
121
+
122
+ ```
123
+ Mejoras aplicadas:
124
+ → [problema D1 → solución aplicada]
125
+ → [problema D4 → corrección aplicada]
126
+ ```
127
+
128
+ Luego re-evalúa. Repite el proceso.
129
+
130
+ ### Si score ≥ 4 (en cualquier iteración)
131
+
132
+ ```
133
+ ✅ DISEÑO APROBADO (score [X]/5, iteración [N]/3)
134
+
135
+ El wireframe de [screen.name] está listo.
136
+ ```
137
+
138
+ ### Si iteración 3 y aún < 4
139
+
140
+ ```
141
+ ⚠️ Score final: [X]/5 (después de 3 iteraciones)
142
+
143
+ El diseño es funcional pero tiene áreas de mejora.
144
+ Puedes continuar o decirme qué cambiar manualmente.
145
+ ```
146
+
147
+ Continúa de todos modos — no bloquea el pipeline.
148
+
149
+ ---
150
+
151
+ ## Output del wireframe refinado
152
+
153
+ Si se hicieron mejoras, el wireframe refinado **reemplaza** el anterior usando la tool `Write`:
154
+ - Ruta: `.sdd/diseño/wireframe-pantalla-principal.html` (sobreescribe el anterior)
155
+ - Contenido: HTML completo refinado
156
+
157
+ ---
158
+
159
+ ## Guardar resultado de la crítica
160
+
161
+ ```bash
162
+ cat > .sdd/diseño/critica-wireframe.md << 'CRITICA'
163
+ # Crítica del Wireframe — [product.name]
164
+
165
+ **Fecha**: [timestamp]
166
+ **Iteraciones**: [N]
167
+ **Score final**: [X]/5
168
+
169
+ ## Dimensiones
170
+
171
+ | Dimensión | Score | Comentario |
172
+ |-----------|-------|-----------|
173
+ | Jerarquía visual | [N]/5 | [texto] |
174
+ | Fidelidad DESIGN.md | [N]/5 | [texto] |
175
+ | Funcionalidad MVP | [N]/5 | [texto] |
176
+ | Ausencia AI-slop | [N]/5 | [texto] |
177
+ | Innovación contextual | [N]/5 | [texto] |
178
+
179
+ ## Mejoras aplicadas
180
+
181
+ [lista de mejoras si hubo iteraciones]
182
+ CRITICA
183
+ ```
184
+
185
+ ---
186
+
187
+ ## Notas
188
+
189
+ - **No hay evaluación de colores "bonitos"** — solo fidelidad al DESIGN.md
190
+ - **No hay evaluación de creatividad** — solo funcionalidad y ausencia de slop
191
+ - La dimensión "Innovación Contextual" evalúa especificidad del dominio, no creatividad artística
192
+ - El score mínimo para continuar sin comentario es 4/5
193
+ - Si el usuario quiere saltarse la crítica: `/sdd.diseñar --sin-critica` (disponible en el comando)