sdd-es 2.5.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.
- package/.claude/settings.json +24 -0
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +34 -0
- package/.claude-plugin/plugin.json +119 -0
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/README.md +27 -20
- package/agents/architecture-designer.md +37 -0
- package/agents/desarrollador-frontend.md +8 -15
- package/agents/product-designer.md +36 -0
- package/claude-hooks/agent-memory.js +137 -3
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +5 -0
- package/commands/sdd.configurar.md +1 -1
- package/commands/sdd.crear-mcp.md +2 -0
- package/commands/sdd.defect-report.md +134 -0
- package/commands/sdd.descubrir.md +19 -0
- package/commands/sdd.estado.md +52 -2
- package/commands/sdd.implementar.md +71 -31
- package/commands/sdd.md +23 -3
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +71 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +88 -0
- package/docs/FABRICA.md +5 -6
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +12 -10
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/package.json +11 -8
- package/plantillas/job-story-mejorar-prompt.md +107 -0
- package/presets/enterprise.yaml +6 -0
- package/presets/lean.yaml +4 -0
- package/presets/startup.yaml +6 -0
- package/skills/adr-indexer/SKILL.md +181 -0
- package/skills/cache-audit/SKILL.md +1 -1
- package/skills/critica-diseno/SKILL.md +1 -1
- package/skills/descubrir-idea/SKILL.md +1 -1
- package/skills/effort-router/SKILL.md +1 -1
- package/skills/elegir-direccion/SKILL.md +1 -1
- package/skills/interpretar-idea/SKILL.md +1 -1
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +34 -80
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +1 -1
- package/skills/token-budget/SKILL.md +24 -1
- package/skills/wireframe-mvp/SKILL.md +1 -1
- package/mcp-figma/README.md +0 -158
- package/mcp-figma/package.json +0 -7
- package/mcp-figma/src/component-generator.js +0 -162
- package/mcp-figma/src/design-system-analyzer.js +0 -247
- package/mcp-figma/src/figma-client.js +0 -75
- package/mcp-figma/src/index.js +0 -114
- package/mcp-figma/src/mcp.js +0 -97
- package/mcp-figma/src/style-mapper.js +0 -85
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Ejecuta las tareas con los agentes especializados configurados. Modos: todas en secuencia (sin args), tarea específica (T003), continuar (continuar). Cada tarea se verifica antes de la siguiente.
|
|
3
|
-
allowed-tools: Read, Write, Edit, Bash, Task, TodoWrite
|
|
3
|
+
allowed-tools: Read, Write, Edit, Bash, Task, TodoWrite
|
|
4
4
|
handoffs:
|
|
5
5
|
- etiqueta: "Verificar contra spec"
|
|
6
6
|
comando: sdd.verificar
|
|
@@ -210,34 +210,7 @@ Marca la tarea como `en_progreso` en `.estado-tareas.json` y actualiza el TodoWr
|
|
|
210
210
|
[ -f ".sdd/hooks/antes_cada_tarea.sh" ] && bash .sdd/hooks/antes_cada_tarea.sh "$TAREA_ID"
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
### 5.4 —
|
|
214
|
-
|
|
215
|
-
**Antes de delegar al agente frontend**, verifica si la tarea es de tipo UI:
|
|
216
|
-
|
|
217
|
-
```
|
|
218
|
-
SI el agente asignado es "desarrollador-frontend"
|
|
219
|
-
O el tipo/área de la tarea contiene: ui, componente, interfaz, diseño, vista, pantalla, layout, figma:
|
|
220
|
-
|
|
221
|
-
1. Ejecuta: mcp__sdd-figma__analizar_sistema_diseño({ project_root: "." })
|
|
222
|
-
→ Guarda el perfil en contexto para el agente
|
|
223
|
-
|
|
224
|
-
2. SI la constitución o config del proyecto tiene figma_file_key definido:
|
|
225
|
-
a. Ejecuta: mcp__sdd-figma__conectar_figma({ file_key: "<key>" })
|
|
226
|
-
b. Si la tarea menciona un componente específico de Figma:
|
|
227
|
-
- mcp__sdd-figma__traer_componente({ file_key, node_id })
|
|
228
|
-
- mcp__sdd-figma__mapear_estilos({ file_key, node_id, project_root: "." })
|
|
229
|
-
c. Inyecta el resultado del mapeo en el contexto del agente
|
|
230
|
-
|
|
231
|
-
3. Si hay tokens sin mapear (matchType: "new"), avisa al usuario:
|
|
232
|
-
> ⚠️ Figma tiene [N] colores sin equivalente en el proyecto.
|
|
233
|
-
> El agente usará el valor hex directo. ¿Continuar?
|
|
234
|
-
|
|
235
|
-
SI el agente NO es frontend → salta este paso
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
> **Sin PAT / sin Figma:** Si `FIGMA_PAT` no está definido o la conexión falla, continúa sin el MCP — no bloquea la implementación.
|
|
239
|
-
|
|
240
|
-
### 5.5 — Constitutional AI pre-check
|
|
213
|
+
### 5.4 — Constitutional AI pre-check
|
|
241
214
|
|
|
242
215
|
Antes de delegar al agente, extrae las restricciones de constitución relevantes para la tarea:
|
|
243
216
|
|
|
@@ -266,14 +239,14 @@ Usa la herramienta `Task` para invocar al agente asignado. El agente recibe:
|
|
|
266
239
|
- Constitución
|
|
267
240
|
- Tareas ya completadas en este ciclo (contexto)
|
|
268
241
|
- Lista de archivos modificados hasta ahora
|
|
269
|
-
- **[Si es UI]** Perfil del sistema de diseño
|
|
242
|
+
- **[Si es UI]** Perfil del sistema de diseño del proyecto
|
|
270
243
|
|
|
271
244
|
El agente debe:
|
|
272
245
|
1. Leer el código existente relacionado antes de escribir
|
|
273
246
|
2. Seguir patrones del codebase actual
|
|
274
247
|
3. Implementar SOLO lo que la tarea pide
|
|
275
248
|
4. Respetar la constitución
|
|
276
|
-
5. **[Si es UI]**
|
|
249
|
+
5. **[Si es UI]** Leer el sistema de diseño local antes de generar componentes
|
|
277
250
|
6. Devolver lista de archivos modificados
|
|
278
251
|
7. **NUNCA modificar `package.json` ni instalar paquetes** salvo que la spec lo indique de forma explícita — usar exclusivamente las dependencias ya presentes en el proyecto
|
|
279
252
|
|
|
@@ -365,6 +338,73 @@ Si cualquier nivel falla:
|
|
|
365
338
|
[N]/[M] tareas completadas ([X]%)
|
|
366
339
|
```
|
|
367
340
|
|
|
341
|
+
### 5.10.5 — Gate de calidad automático (antes de marcar DONE)
|
|
342
|
+
|
|
343
|
+
Antes de marcar cualquier tarea como `completada`, ejecuta este gate en orden. **Los 3 puntos deben pasar**; si alguno falla, la tarea queda en `en_progreso` con el motivo anotado.
|
|
344
|
+
|
|
345
|
+
**Punto 1 — Tests corren y pasan**
|
|
346
|
+
```bash
|
|
347
|
+
# Detectar framework y correr solo los tests relacionados con los archivos modificados
|
|
348
|
+
TS_FILES=$(echo "$ARCHIVOS_MODIFICADOS" | tr ',' ' ')
|
|
349
|
+
|
|
350
|
+
# Intento rápido (tests relacionados):
|
|
351
|
+
npx jest --passWithNoTests --findRelatedTests $TS_FILES 2>/dev/null \
|
|
352
|
+
|| python -m pytest $TS_FILES -q 2>/dev/null \
|
|
353
|
+
|| echo "SKIP_NO_FRAMEWORK"
|
|
354
|
+
|
|
355
|
+
# Si no hay tests relacionados detectables, corre la suite completa en modo quiet:
|
|
356
|
+
# npm test -- --silent 2>/dev/null || echo "NO_TESTS_OK"
|
|
357
|
+
```
|
|
358
|
+
Resultado esperado: exit code 0 o "SKIP_NO_FRAMEWORK" / "NO_TESTS_OK".
|
|
359
|
+
Si hay fallos de test → tarea queda `en_progreso`: `"Tests fallando: [detalle]"`.
|
|
360
|
+
|
|
361
|
+
**Punto 2 — Linter pasa (o no hay linter configurado)**
|
|
362
|
+
```bash
|
|
363
|
+
# Detectar linter y ejecutar solo sobre archivos modificados
|
|
364
|
+
if [ -f ".eslintrc*" ] || [ -f "eslint.config*" ]; then
|
|
365
|
+
npx eslint $TS_FILES --max-warnings=0 2>/dev/null
|
|
366
|
+
elif [ -f "pyproject.toml" ] || [ -f ".flake8" ]; then
|
|
367
|
+
flake8 $TS_FILES 2>/dev/null || ruff check $TS_FILES 2>/dev/null
|
|
368
|
+
else
|
|
369
|
+
echo "NO_LINTER_CONFIGURADO"
|
|
370
|
+
fi
|
|
371
|
+
```
|
|
372
|
+
Resultado esperado: exit code 0 o "NO_LINTER_CONFIGURADO".
|
|
373
|
+
Si hay errores de linter → tarea queda `en_progreso`: `"Linter fallando: [detalle]"`.
|
|
374
|
+
|
|
375
|
+
**Punto 3 — Criterio de aceptación de la tarea se cumple**
|
|
376
|
+
|
|
377
|
+
Lee la sección "Criterio de verificación" de la tarea en `tareas.md` y ejecuta el comando definido ahí. Si no hay comando definido, verifica manualmente que los artefactos esperados existen y exportan correctamente (según paso 5.7 niveles 1 y 2).
|
|
378
|
+
|
|
379
|
+
Resultado esperado: el comando retorna exit 0 O la inspección manual confirma que el CA está cubierto.
|
|
380
|
+
Si el CA no se cumple → tarea queda `en_progreso`: `"CA no cumplido: [razón]"`.
|
|
381
|
+
|
|
382
|
+
**Decisión final:**
|
|
383
|
+
```
|
|
384
|
+
SI los 3 puntos pasan → marcar tarea como `completada` → continuar al paso 5.10
|
|
385
|
+
SI alguno falla → marcar tarea como `en_progreso` con campo "motivo_bloqueo"
|
|
386
|
+
→ NO avanzar a tareas dependientes
|
|
387
|
+
→ Reportar al usuario:
|
|
388
|
+
⚠️ T00X no pasó el gate de calidad: [motivo]
|
|
389
|
+
¿Qué hacemos?
|
|
390
|
+
a) Reintentar corrección automática
|
|
391
|
+
b) Saltar (no recomendado, registra deuda técnica)
|
|
392
|
+
c) Detener y revisar manualmente
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### 5.11 — Checkpoint de contexto (compresión automática)
|
|
396
|
+
|
|
397
|
+
Lleva un contador de tareas completadas en este ciclo. **Tras cada 5 tareas completadas**, ejecuta automáticamente la compresión de contexto para evitar el desbordamiento de la ventana en sesiones largas:
|
|
398
|
+
|
|
399
|
+
```
|
|
400
|
+
SI (tareas_completadas_en_ciclo % 5 == 0) Y tareas_completadas_en_ciclo > 0:
|
|
401
|
+
→ Notificar: "🧹 Checkpoint de contexto: 5 tareas completadas, comprimiendo contexto…"
|
|
402
|
+
→ Ejecutar: /sdd.comprimir aplicar
|
|
403
|
+
→ Continuar con la siguiente tarea
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
Esto se hace de forma silenciosa y no requiere confirmación del usuario: es un mantenimiento automático del presupuesto de tokens. Si quedan menos de 5 tareas pendientes, no se fuerza un checkpoint extra (la compresión final ocurre en el PASO 6).
|
|
407
|
+
|
|
368
408
|
## VALIDACIÓN DE SALIDA
|
|
369
409
|
|
|
370
410
|
El checkpoint de salida se aplica por tarea (ver paso 5.7 — cuatro niveles: criterio de tarea, artefactos esperados, no regresión, Evaluator-Optimizer para agentes OPUS). Al final de todas las tareas, la validación global se ejecuta en el PASO 6 mediante el revisor y la suite de tests completa.
|
package/commands/sdd.md
CHANGED
|
@@ -20,6 +20,20 @@ else
|
|
|
20
20
|
fi
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
**Recuperación de contexto automática:** Si existe `.sdd/estado.json`, antes de pedir nada al usuario muestra un resumen de **exactamente 3 líneas** con:
|
|
24
|
+
|
|
25
|
+
1. `pipeline_step` actual (campo `pipeline_step` del estado).
|
|
26
|
+
2. Spec activa (campo `spec_activa` o equivalente).
|
|
27
|
+
3. Número de tareas pendientes.
|
|
28
|
+
|
|
29
|
+
Ejemplo:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Paso del pipeline: implementar
|
|
33
|
+
Spec activa: 2026-06-14-auth
|
|
34
|
+
Tareas pendientes: 3
|
|
35
|
+
```
|
|
36
|
+
|
|
23
37
|
## PASO 1.2 — Detectar modo de output
|
|
24
38
|
|
|
25
39
|
Si el argumento del comando contiene un modo de output (`pm`, `arq`, `dev`), actívalo globalmente para esta sesión:
|
|
@@ -45,10 +59,11 @@ Lee el perfil desde el estado o la configuración:
|
|
|
45
59
|
```bash
|
|
46
60
|
PERFIL=$(grep -o '"perfil": *"[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
47
61
|
[ -z "$PERFIL" ] && PERFIL=$(grep '^perfil:' .sdd/sdd.config.yaml 2>/dev/null | cut -d':' -f2 | tr -d ' ')
|
|
48
|
-
|
|
62
|
+
# Por defecto: modo guiado (sin jerga) — si sdd.config.yaml declara explícitamente "perfil: experto", se respeta
|
|
63
|
+
echo "PERFIL=${PERFIL:-guiado}"
|
|
49
64
|
```
|
|
50
65
|
|
|
51
|
-
**Si `PERFIL=guiado
|
|
66
|
+
**Si `PERFIL=guiado` (o no hay perfil configurado):** activa la skill `modo-guiado` y conduce TODO el resto de la interacción según sus 6 reglas (sin jerga, confirmar antes de actuar, una pregunta a la vez, nunca pedir que edite archivos). En este modo:
|
|
52
67
|
|
|
53
68
|
- **Encadenas automáticamente** los pasos del flujo (especificar → planificar → tareas → implementar) pidiendo solo una confirmación simple entre fases, sin exponer los nombres de los comandos. El usuario dice "sí" y tú avanzas.
|
|
54
69
|
- Traduces cada fase a lenguaje natural (ver tabla en la skill `modo-guiado`).
|
|
@@ -58,7 +73,7 @@ Ejemplo de conducción en modo guiado:
|
|
|
58
73
|
|
|
59
74
|
> Entendido, quieres una lista de tareas. Primero voy a entender bien los detalles, luego lo construyo y lo pruebo. ¿Arrancamos? (responde *sí*)
|
|
60
75
|
|
|
61
|
-
**Si `PERFIL=experto
|
|
76
|
+
**Si `PERFIL=experto`:** sigue el enrutamiento normal del PASO 2, exponiendo comandos técnicos. Este modo se activa SOLO cuando el archivo `sdd.config.yaml` incluye explícitamente `perfil: experto`.
|
|
62
77
|
|
|
63
78
|
## PASO 2 — Interpretar la intención del usuario
|
|
64
79
|
|
|
@@ -92,6 +107,11 @@ El usuario invocó este comando con argumentos en lenguaje natural. Mapea su int
|
|
|
92
107
|
| "cambia configuración", "ajusta agentes/modelos" | `/sdd.configurar` |
|
|
93
108
|
| "indexa el proyecto", "genera mapa de símbolos" | `/sdd.mapear` |
|
|
94
109
|
| "comprime", "ahorra tokens", "compacta memoria" | `/sdd.comprimir` |
|
|
110
|
+
| "optimiza artefactos", "reduce contexto" | `/sdd.optimizar` |
|
|
111
|
+
| "optimiza memoria", "compacta agente" | `/sdd.optimizar-memoria` |
|
|
112
|
+
| "compliance", "reporte regulatorio", "GDPR", "SOC2" | `/sdd.compliance` |
|
|
113
|
+
| "registra decisión", "ADR", "architecture decision" | `/sdd.adr` |
|
|
114
|
+
| "reporte de bugs", "defect rate", "tasa de defectos" | `/sdd.defect-report` |
|
|
95
115
|
| "haz un release", "nueva versión", "changelog" | `/sdd.release` |
|
|
96
116
|
| "descubre el proyecto", "tengo una idea vaga" | `/sdd.descubrir` |
|
|
97
117
|
| "crea una app", "construye una app", "quiero una app de X" | `/sdd.crear-app [resto]` |
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Comprimir manualmente la memoria de agentes (deduplicación + compresión)
|
|
3
|
+
allowed-tools: Read, Write, Bash
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.optimizar memoria
|
|
7
|
+
|
|
8
|
+
Comprime automáticamente los archivos de memoria de agentes (`.sdd/memoria/agente-*.md`) cuando superan 50KB.
|
|
9
|
+
|
|
10
|
+
## Uso
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/sdd.optimizar memoria
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Qué Hace
|
|
17
|
+
|
|
18
|
+
1. **Lee** archivos en `.sdd/memoria/`
|
|
19
|
+
2. **Deduplica** entradas por filepath (guarda solo la más reciente)
|
|
20
|
+
3. **Comprime** aplicando diccionario Caveman Level Full
|
|
21
|
+
4. **Crea backup** `.original.md` antes de sobrescribir
|
|
22
|
+
5. **Reporta** bytes salvados
|
|
23
|
+
|
|
24
|
+
## Ejemplo
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
ANTES: agente-arquitecto.md = 150KB (80 entradas)
|
|
28
|
+
|
|
29
|
+
/sdd.optimizar memoria
|
|
30
|
+
|
|
31
|
+
✨ [compress] arquitecto: 150KB → 15KB (10%), backup en .original.md
|
|
32
|
+
✨ [compress] critico: 87KB → 8.7KB (10%)
|
|
33
|
+
|
|
34
|
+
DESPUÉS: memoria total = 24KB
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Seguridad
|
|
38
|
+
|
|
39
|
+
- Nunca pierdes datos (backup siempre)
|
|
40
|
+
- Idempotente (ejecutar 2 veces = mismo resultado)
|
|
41
|
+
- Reversible: `.original.md` contiene datos originales
|
|
42
|
+
|
|
43
|
+
## Notas
|
|
44
|
+
|
|
45
|
+
- Se ejecuta automáticamente vía hook cuando memoria > 50KB
|
|
46
|
+
- Puedes ejecutarla manualmente cuando quieras
|
|
47
|
+
- Segura para ejecutar frecuentemente (sin riesgos)
|
package/commands/sdd.retro.md
CHANGED
|
@@ -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:
|
|
@@ -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)
|