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,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.
|
|
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/
|
|
47
|
+
"homepage": "https://github.com/carlos060798/FORGE",
|
|
46
48
|
"repository": {
|
|
47
49
|
"type": "git",
|
|
48
|
-
"url": "https://github.com/carlos060798/
|
|
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)
|