sdd-es 2.0.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 +51 -0
- package/.claude-plugin/marketplace.json +31 -0
- package/.claude-plugin/plugin.json +97 -0
- package/README.md +332 -0
- package/agents/arquitecto.md +148 -0
- package/agents/asesor-datos.md +163 -0
- package/agents/critico.md +142 -0
- package/agents/desarrollador-backend.md +242 -0
- package/agents/desarrollador-frontend.md +120 -0
- package/agents/disenador-api.md +108 -0
- package/agents/documentador.md +177 -0
- package/agents/investigador.md +174 -0
- package/agents/operaciones.md +105 -0
- package/agents/revisor.md +153 -0
- package/agents/seguridad.md +216 -0
- package/agents/tester.md +286 -0
- package/claude-hooks/post-write-conventions.js +412 -0
- package/claude-hooks/pre-tool-guard.js +159 -0
- package/cli/index.js +401 -0
- package/commands/sdd.aclarar.md +200 -0
- package/commands/sdd.analizar.md +241 -0
- package/commands/sdd.ayuda.md +227 -0
- package/commands/sdd.canary.md +60 -0
- package/commands/sdd.checklist.md +174 -0
- package/commands/sdd.comprimir.md +166 -0
- package/commands/sdd.configurar.md +195 -0
- package/commands/sdd.constitucion.md +343 -0
- package/commands/sdd.crear-app.md +168 -0
- package/commands/sdd.crear-mcp.md +174 -0
- package/commands/sdd.descubrir.md +269 -0
- package/commands/sdd.desplegar.md +155 -0
- package/commands/sdd.especificar.md +302 -0
- package/commands/sdd.estado.md +124 -0
- package/commands/sdd.glosario.md +108 -0
- package/commands/sdd.implementar.md +377 -0
- package/commands/sdd.importar.md +91 -0
- package/commands/sdd.mapear.md +120 -0
- package/commands/sdd.md +119 -0
- package/commands/sdd.planificar.md +372 -0
- package/commands/sdd.qa.md +108 -0
- package/commands/sdd.release.md +253 -0
- package/commands/sdd.retro.md +82 -0
- package/commands/sdd.snapshot.md +122 -0
- package/commands/sdd.tareas.md +300 -0
- package/commands/sdd.verificar.md +239 -0
- package/configuracion-ejemplo/hooks-ejemplo/antes_cada_tarea.sh +18 -0
- package/configuracion-ejemplo/hooks-ejemplo/antes_implementar.sh +45 -0
- package/configuracion-ejemplo/hooks-ejemplo/despues_especificar.sh +14 -0
- package/configuracion-ejemplo/hooks-ejemplo/despues_implementar.sh +36 -0
- package/configuracion-ejemplo/hooks-ejemplo/despues_planificar.sh +19 -0
- package/configuracion-ejemplo/hooks-ejemplo/guardia-seguridad.sh +367 -0
- package/configuracion-ejemplo/sdd.config.yaml +310 -0
- package/docs/AGENTES.md +74 -0
- package/docs/COMPRESION.md +155 -0
- package/docs/EJEMPLO-PRACTICA.md +383 -0
- package/docs/EJEMPLOS.md +212 -0
- package/docs/FABRICA.md +185 -0
- package/docs/FILOSOFIA.md +61 -0
- package/docs/FLUJO.md +149 -0
- package/docs/INICIO-RAPIDO.md +116 -0
- package/docs/MAPAS.md +113 -0
- package/docs/MODELOS.md +103 -0
- package/docs/PERSONALIZACION.md +152 -0
- package/instalar.ps1 +39 -0
- package/instalar.sh +22 -0
- package/mcp-figma/README.md +158 -0
- package/mcp-figma/package.json +7 -0
- package/mcp-figma/src/component-generator.js +162 -0
- package/mcp-figma/src/design-system-analyzer.js +247 -0
- package/mcp-figma/src/figma-client.js +75 -0
- package/mcp-figma/src/index.js +114 -0
- package/mcp-figma/src/mcp.js +97 -0
- package/mcp-figma/src/style-mapper.js +85 -0
- package/package.json +50 -0
- package/plantillas/analisis.md +57 -0
- package/plantillas/checklist-especificacion.md +66 -0
- package/plantillas/constitucion.md +104 -0
- package/plantillas/decision-arquitectura.md +39 -0
- package/plantillas/dependencias-mapa.md +89 -0
- package/plantillas/especificacion.md +108 -0
- package/plantillas/estructura-mapa.md +40 -0
- package/plantillas/glosario.md +22 -0
- package/plantillas/index-especificaciones.md +15 -0
- package/plantillas/mcp-server.md +147 -0
- package/plantillas/plan.md +152 -0
- package/plantillas/simbolos-mapa.md +57 -0
- package/plantillas/snapshot.md +54 -0
- package/plantillas/tareas.md +72 -0
- package/presets/enterprise.yaml +69 -0
- package/presets/lean.yaml +63 -0
- package/presets/startup.yaml +67 -0
- package/skills/compresion-tokens.md +264 -0
- package/skills/constitucion-constraint.md +78 -0
- package/skills/deteccion-stack.md +175 -0
- package/skills/enrutador-agentes.md +69 -0
- package/skills/gestion-estado.md +114 -0
- package/skills/indexador.md +199 -0
- package/skills/modo-guiado/SKILL.md +78 -0
- package/skills/orquestacion-ptc/SKILL.md +96 -0
- package/skills/validacion-spec.md +52 -0
- package/skills/verificador-implementacion.md +71 -0
package/docs/AGENTES.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Guía de Agentes Especializados
|
|
2
|
+
|
|
3
|
+
SDD-ES incluye 11 agentes con roles bien definidos. Esta guía explica cuándo se activa cada uno.
|
|
4
|
+
|
|
5
|
+
## Tabla rápida
|
|
6
|
+
|
|
7
|
+
| Agente | Modelo recomendado | Cuándo se activa | Para qué |
|
|
8
|
+
|--------|--------------------|------------------|----------|
|
|
9
|
+
| arquitecto | opus | `/sdd.planificar`, fase A | Decisiones técnicas de alto nivel |
|
|
10
|
+
| disenador-api | sonnet | `/sdd.planificar` (si hay contratos) | OpenAPI, GraphQL, gRPC, eventos |
|
|
11
|
+
| asesor-datos | opus | `/sdd.planificar` (si toca BD) | Schemas, queries, índices, migraciones |
|
|
12
|
+
| desarrollador-backend | sonnet | `/sdd.implementar` (servidor) | Servicios, controllers, lógica |
|
|
13
|
+
| desarrollador-frontend | sonnet | `/sdd.implementar` (UI) | Componentes, vistas, estado cliente |
|
|
14
|
+
| operaciones | sonnet | `/sdd.implementar` (infra) | CI/CD, Docker, IaC, deploy |
|
|
15
|
+
| tester | sonnet | `/sdd.implementar` (tests) | Unitarios, integración, E2E |
|
|
16
|
+
| revisor | opus | Al final de `/sdd.implementar` | Revisión cruzada de calidad |
|
|
17
|
+
| critico | opus | `/sdd.planificar`, `/sdd.analizar` | Riesgos y puntos ciegos |
|
|
18
|
+
| seguridad | opus | Cambios sensibles automáticamente | Auditoría de vulnerabilidades |
|
|
19
|
+
| documentador | sonnet | Bajo demanda (desactivado por defecto) | Docs útiles (no obvias) |
|
|
20
|
+
|
|
21
|
+
## Cuándo activar/desactivar agentes
|
|
22
|
+
|
|
23
|
+
### Proyectos típicos
|
|
24
|
+
|
|
25
|
+
**API REST sin frontend:**
|
|
26
|
+
```yaml
|
|
27
|
+
disenador-api: activo
|
|
28
|
+
desarrollador-backend: activo
|
|
29
|
+
desarrollador-frontend: desactivado ← no necesario
|
|
30
|
+
asesor-datos: activo
|
|
31
|
+
operaciones: activo
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**SPA sin backend propio (consume APIs externas):**
|
|
35
|
+
```yaml
|
|
36
|
+
desarrollador-frontend: activo
|
|
37
|
+
desarrollador-backend: desactivado
|
|
38
|
+
asesor-datos: desactivado
|
|
39
|
+
disenador-api: desactivado
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**MVP / Side project / Prototipo:**
|
|
43
|
+
```yaml
|
|
44
|
+
critico: desactivado ← acelera el flujo
|
|
45
|
+
seguridad: desactivado ← no es producto público aún
|
|
46
|
+
documentador: desactivado
|
|
47
|
+
# todos los modelos a sonnet o haiku
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Producto enterprise / Crítico:**
|
|
51
|
+
```yaml
|
|
52
|
+
# Todos activos
|
|
53
|
+
# Modelos opus en: arquitecto, asesor-datos, revisor, critico, seguridad
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Cómo se invocan los agentes
|
|
57
|
+
|
|
58
|
+
Los agentes NO se invocan manualmente por el usuario. El plugin los orquesta:
|
|
59
|
+
|
|
60
|
+
- **Durante `/sdd.planificar`**: el orquestador llama a `arquitecto`, `disenador-api`, `asesor-datos`, `critico` (y `seguridad` si es sensible). Cada uno aporta su sección al plan.
|
|
61
|
+
|
|
62
|
+
- **Durante `/sdd.implementar`**: por cada tarea, el skill `enrutador-agentes` decide qué agente la ejecuta según el tipo de tarea.
|
|
63
|
+
|
|
64
|
+
- **Al final de `/sdd.implementar`**: el `revisor` cruza el código contra la spec; el `tester` ejecuta la suite; el `seguridad` audita si tocó algo sensible.
|
|
65
|
+
|
|
66
|
+
## Personalizar un agente
|
|
67
|
+
|
|
68
|
+
Los agentes son archivos Markdown plano. Edita `.claude/agents/[nombre].md` para:
|
|
69
|
+
- Cambiar la personalidad/tono
|
|
70
|
+
- Añadir restricciones específicas de tu proyecto
|
|
71
|
+
- Cambiar el formato de salida
|
|
72
|
+
- Agregar conocimiento de domain específico
|
|
73
|
+
|
|
74
|
+
Cambios al frontmatter `model:` se sobreescriben con la config en `.sdd/sdd.config.yaml`.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Compresión de Tokens — Caveman-Lite adaptado al español
|
|
2
|
+
|
|
3
|
+
## El problema
|
|
4
|
+
|
|
5
|
+
Tus archivos de memoria (CLAUDE.md, notas, preferencias) se cargan cada sesión:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
CLAUDE.md normal: 5000 palabras = 5000 tokens
|
|
9
|
+
CLAUDE.md comprimido: 1500 palabras = 1500 tokens
|
|
10
|
+
Ahorro por sesión: 3500 tokens
|
|
11
|
+
Ahorro mensual (20 sesiones): 70k tokens (~USD 0.30)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Pequeño, pero suma. Especialmente si mantienes memoria grande.
|
|
15
|
+
|
|
16
|
+
## Cómo funciona
|
|
17
|
+
|
|
18
|
+
Aplica transformaciones lingüísticas simples que preservan sustancia técnica:
|
|
19
|
+
|
|
20
|
+
| Cambio | Ejemplo |
|
|
21
|
+
|--------|---------|
|
|
22
|
+
| Quita artículos | "el BD" → "BD" |
|
|
23
|
+
| Simplifica conectores | "sin embargo" → "pero" |
|
|
24
|
+
| Quita hedging | "creo que falla" → "falla" |
|
|
25
|
+
| Quita cortesía | "por favor" → [quitar] |
|
|
26
|
+
| Abreviar | "base de datos" → "BD" |
|
|
27
|
+
|
|
28
|
+
Result: 64-75% de ahorro en palabras, 0% pérdida de sustancia.
|
|
29
|
+
|
|
30
|
+
## Niveles
|
|
31
|
+
|
|
32
|
+
### Lite
|
|
33
|
+
- Solo quita: hedging + cortesía
|
|
34
|
+
- Mantiene: frases completas, estructura
|
|
35
|
+
- Ahorro: 20-30%
|
|
36
|
+
- **Cuándo**: documentación editada frecuentemente
|
|
37
|
+
|
|
38
|
+
### Full (default)
|
|
39
|
+
- Quita: artículos, conectores, hedging, cortesía
|
|
40
|
+
- Mantiene: sustancia técnica, estructura
|
|
41
|
+
- Ahorro: 40-50%
|
|
42
|
+
- **Cuándo**: memoria de proyecto, notas internas
|
|
43
|
+
|
|
44
|
+
### Ultra
|
|
45
|
+
- Quita: TODO lo anterior + términos técnicos se abrevian
|
|
46
|
+
- Fragmentos OK
|
|
47
|
+
- Ahorro: 60-75%
|
|
48
|
+
- **Cuándo**: archivos internos, nunca editarás manualmente
|
|
49
|
+
|
|
50
|
+
## Uso
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Comprimir CLAUDE.md con nivel full
|
|
54
|
+
/sdd.comprimir aplicar CLAUDE.md full
|
|
55
|
+
|
|
56
|
+
# Comprimir archivo.md con nivel lite
|
|
57
|
+
/sdd.comprimir aplicar archivo.md lite
|
|
58
|
+
|
|
59
|
+
# Ver antes/después sin guardar
|
|
60
|
+
/sdd.comprimir validar archivo.md
|
|
61
|
+
|
|
62
|
+
# Restaurar desde backup
|
|
63
|
+
/sdd.comprimir revertir archivo.md
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Seguridad automática
|
|
67
|
+
|
|
68
|
+
NUNCA comprime:
|
|
69
|
+
- ❌ Código (`.py`, `.ts`, `.js`, `.json`, etc.)
|
|
70
|
+
- ❌ Líneas con "PELIGRO", "CUIDADO", "NO USAR EN PRODUCCIÓN"
|
|
71
|
+
- ❌ Instrucciones de acciones irreversibles ("ELIMINAR", "BORRAR")
|
|
72
|
+
- ❌ Secuencias multi-paso donde fragmentación causa confusión
|
|
73
|
+
|
|
74
|
+
Si detecta estos patrones: deja el texto como estaba.
|
|
75
|
+
|
|
76
|
+
## Ejemplo completo
|
|
77
|
+
|
|
78
|
+
**CLAUDE.md original** (456 palabras):
|
|
79
|
+
|
|
80
|
+
```markdown
|
|
81
|
+
# Estado del proyecto: Auth v2.0
|
|
82
|
+
|
|
83
|
+
Estamos trabajando en migrar la autenticación hacia un sistema
|
|
84
|
+
basado en magic links por email. Es importante notar que, sin embargo,
|
|
85
|
+
esto requiere que el usuario sea validado correctamente en la base de datos.
|
|
86
|
+
|
|
87
|
+
Por favor, asegúrate de que todos los commits incluyan tests.
|
|
88
|
+
Creo que es fundamental que sigamos estas prácticas de calidad.
|
|
89
|
+
|
|
90
|
+
La razón por la cual sugiero este enfoque es porque reduce la fricción
|
|
91
|
+
de los usuarios nuevos al no tener que recordar contraseñas.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Comprimido (Full)** (147 palabras, 68% ahorro):
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
# Estado del proyecto: Auth v2.0
|
|
98
|
+
|
|
99
|
+
Migración: auth → magic links por email.
|
|
100
|
+
Requiere validación correcta BD.
|
|
101
|
+
|
|
102
|
+
Debe incluir tests en commits.
|
|
103
|
+
Prácticas de calidad obligatorias.
|
|
104
|
+
|
|
105
|
+
Approach: reduce fricción usuarios. No recordar pwd.
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Backup automático
|
|
109
|
+
|
|
110
|
+
Cuando comprimes:
|
|
111
|
+
```
|
|
112
|
+
archivo.md ← comprimido (nuevo)
|
|
113
|
+
archivo.md.original ← backup (automático)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Para revertir:
|
|
117
|
+
```bash
|
|
118
|
+
/sdd.comprimir revertir archivo.md
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Tips
|
|
122
|
+
|
|
123
|
+
1. **Empieza con Lite**: menos agresivo, más reversible
|
|
124
|
+
2. **Valida antes**: `/sdd.comprimir validar` sin guardar
|
|
125
|
+
3. **Equipo**: Si trabajas en equipo, comunica que comprimiste
|
|
126
|
+
4. **Git**: Committea el `.original.md` también (es el "canonical")
|
|
127
|
+
|
|
128
|
+
## Diccionario completo
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
/sdd.comprimir reglas
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Muestra todas las 80+ parejas español-caveman-lite.
|
|
135
|
+
|
|
136
|
+
## Limitaciones
|
|
137
|
+
|
|
138
|
+
- ⚠️ Pierde matices tonales (formal → casual)
|
|
139
|
+
- ⚠️ Manual review recomendado para docs importantes
|
|
140
|
+
- ❌ No entiende contexto profundo (un "tal vez" crítico podría comprimirse)
|
|
141
|
+
|
|
142
|
+
## Configuración global
|
|
143
|
+
|
|
144
|
+
En `.sdd/sdd.config.yaml`:
|
|
145
|
+
|
|
146
|
+
```yaml
|
|
147
|
+
compresion:
|
|
148
|
+
enabled: true
|
|
149
|
+
modo_salida_usuario: lite # user-facing: contenido/agentes
|
|
150
|
+
modo_agentes_internos: ultra # comunicación IA-IA (usuario no ve)
|
|
151
|
+
preservar_terminos:
|
|
152
|
+
- autenticación
|
|
153
|
+
- verificación
|
|
154
|
+
- algoritmo
|
|
155
|
+
```
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
# Ejemplo Práctico — API de Lista de Tareas desde Cero
|
|
2
|
+
|
|
3
|
+
Este ejemplo recorre el flujo completo de SDD-ES construyendo una API REST de lista de tareas con Node.js + Express + SQLite. No asume ningún código previo.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Contexto del proyecto
|
|
8
|
+
|
|
9
|
+
Tienes una carpeta vacía. Quieres construir una API que permita crear, listar, completar y eliminar tareas.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
mkdir mi-api-tareas
|
|
13
|
+
cd mi-api-tareas
|
|
14
|
+
git init
|
|
15
|
+
bash /ruta/a/sdd-es/instalar.sh
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Abre Claude Code en `mi-api-tareas`.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Paso 1 — Constitución
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
/sdd.constitucion
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Claude detecta que el proyecto está vacío y te pregunta por el stack. Respondes:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
Stack: Node.js con Express
|
|
32
|
+
Base de datos: SQLite (sin ORM, queries directas)
|
|
33
|
+
Tests: Jest
|
|
34
|
+
Calidad: cobertura mínima 80%, funciones ≤40 líneas, sin any en TypeScript
|
|
35
|
+
Sin TypeScript por ahora — JavaScript puro
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Claude genera `.sdd/memoria/constitucion.md` con tus principios.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Paso 2 — Primera especificación
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
/sdd.especificar API de lista de tareas — CRUD completo con SQLite
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Claude detecta que es un cambio **mediano** (varios endpoints, BD, tests) y genera la spec:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
✅ Spec creada: .sdd/especificaciones/2026-06-09-api-lista-tareas/spec.md
|
|
52
|
+
|
|
53
|
+
⚠️ 2 puntos requieren aclaración.
|
|
54
|
+
|
|
55
|
+
PRÓXIMO PASO RECOMENDADO:
|
|
56
|
+
/sdd.aclarar — resolver los [NECESITA_ACLARACION]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
La spec generada contiene secciones como:
|
|
60
|
+
|
|
61
|
+
```markdown
|
|
62
|
+
## 4. Historias de Usuario
|
|
63
|
+
|
|
64
|
+
### HU-001: Gestión de tareas
|
|
65
|
+
Como usuario de la API
|
|
66
|
+
Quiero crear, listar, completar y eliminar tareas
|
|
67
|
+
Para organizar mi trabajo
|
|
68
|
+
|
|
69
|
+
Criterios de aceptación:
|
|
70
|
+
- [ ] CA-001-01: POST /tareas crea una tarea con título obligatorio (P1)
|
|
71
|
+
- [ ] CA-001-02: GET /tareas devuelve todas las tareas ordenadas por fecha (P1)
|
|
72
|
+
- [ ] CA-001-03: PATCH /tareas/:id/completar marca la tarea como completa (P1)
|
|
73
|
+
- [ ] CA-001-04: DELETE /tareas/:id elimina la tarea (P1)
|
|
74
|
+
- [ ] CA-001-05: POST /tareas sin título devuelve 400 con mensaje de error (P1)
|
|
75
|
+
- [ ] CA-001-06: PATCH /tareas/:id con ID inexistente devuelve 404 (P2)
|
|
76
|
+
|
|
77
|
+
## 8. Fuera de Alcance
|
|
78
|
+
|
|
79
|
+
❌ Autenticación de usuarios
|
|
80
|
+
❌ Múltiples listas por usuario
|
|
81
|
+
❌ Prioridades o etiquetas
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Paso 3 — Aclarar ambigüedades
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
/sdd.aclarar
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Claude encuentra 2 puntos sin definir y pregunta:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
🔴 ACLARACIONES CRÍTICAS
|
|
96
|
+
|
|
97
|
+
1. [Datos] — ¿Las tareas tienen fecha de vencimiento?
|
|
98
|
+
a) Sí, campo opcional `vence_en` (ISO 8601)
|
|
99
|
+
b) No, solo título y estado
|
|
100
|
+
|
|
101
|
+
2. [Formato] — ¿Qué devuelve DELETE /tareas/:id?
|
|
102
|
+
a) 204 sin body
|
|
103
|
+
b) 200 con la tarea eliminada
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Respondes: `1.b, 2.a`
|
|
107
|
+
|
|
108
|
+
Claude actualiza la spec y elimina los marcadores `[NECESITA_ACLARACION]`.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Paso 4 — Plan técnico
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
/sdd.planificar
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
El arquitecto, el asesor de datos y el crítico trabajan en paralelo. Claude genera `.sdd/especificaciones/{ID}/plan.md`:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
── Constitutional AI Check ─────────────────────────────
|
|
122
|
+
✅ Stack: Express + SQLite — alineado con constitución
|
|
123
|
+
✅ Patrones: módulos ES, funciones ≤40 líneas
|
|
124
|
+
✅ Sin dependencias nuevas más allá de express y better-sqlite3
|
|
125
|
+
─────────────────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
📋 Plan técnico generado
|
|
128
|
+
• 6 archivos afectados
|
|
129
|
+
• 2 dependencias nuevas (express, better-sqlite3)
|
|
130
|
+
• 4 decisiones técnicas
|
|
131
|
+
• 1 riesgo identificado
|
|
132
|
+
|
|
133
|
+
⚠️ PUNTOS DESTACADOS:
|
|
134
|
+
• Riesgo medio: SQLite no soporta concurrencia alta — documentado, aceptado
|
|
135
|
+
para el scope actual (API local/dev)
|
|
136
|
+
|
|
137
|
+
POR FAVOR REVISA EL PLAN:
|
|
138
|
+
/sdd.planificar aprobar — continuar al desglose
|
|
139
|
+
/sdd.planificar revisar — discutir cambios
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Revisas el plan en `.sdd/especificaciones/{ID}/plan.md`. Ves que el arquitecto propuso esta estructura:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
src/
|
|
146
|
+
db.js ← inicialización de SQLite
|
|
147
|
+
tareas.js ← lógica de negocio
|
|
148
|
+
rutas.js ← endpoints Express
|
|
149
|
+
app.js ← setup de Express
|
|
150
|
+
server.js ← punto de entrada
|
|
151
|
+
tests/
|
|
152
|
+
tareas.test.js
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
/sdd.planificar aprobar
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Paso 5 — Desglose en tareas
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
/sdd.tareas
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
✅ 8 tareas generadas
|
|
169
|
+
|
|
170
|
+
DISTRIBUCIÓN POR AGENTE:
|
|
171
|
+
• arquitecto: 1 (estructura base)
|
|
172
|
+
• desarrollador-backend: 5 (BD, lógica, rutas)
|
|
173
|
+
• tester: 2 (tests unitarios + integración)
|
|
174
|
+
|
|
175
|
+
COBERTURA:
|
|
176
|
+
• 6/6 CAs cubiertos
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Las tareas generadas en `.sdd/especificaciones/{ID}/tareas.md`:
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
T001 — Inicializar proyecto e instalar dependencias [arquitecto]
|
|
183
|
+
T002 — Crear módulo de BD (db.js + migración inicial) [backend]
|
|
184
|
+
T003 — Tests unitarios de la capa de datos [tester]
|
|
185
|
+
T004 — Implementar lógica de tareas (tareas.js) [backend]
|
|
186
|
+
T005 — Tests unitarios de lógica [tester]
|
|
187
|
+
T006 — Implementar rutas Express (rutas.js) [backend]
|
|
188
|
+
T007 — Setup de app.js y server.js [backend]
|
|
189
|
+
T008 — Tests de integración (API completa) [tester]
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Paso 6 — Implementación
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
/sdd.implementar
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Claude muestra el progreso en tiempo real:
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
🔧 T001 — Inicializar proyecto e instalar dependencias
|
|
204
|
+
Agente: arquitecto (modelo: opus)
|
|
205
|
+
Tiempo estimado: S
|
|
206
|
+
|
|
207
|
+
✅ T001 completada — Verificación: PASADA
|
|
208
|
+
|
|
209
|
+
🔧 T002 — Crear módulo de BD
|
|
210
|
+
Agente: desarrollador-backend (modelo: sonnet)
|
|
211
|
+
|
|
212
|
+
── Validación de convenciones: src/db.js (fuentes: constitución, inferido) ──
|
|
213
|
+
✅ Sin violaciones
|
|
214
|
+
────────────────────────────────────────────────────────────────────────────
|
|
215
|
+
|
|
216
|
+
✅ T002 completada — Verificación: PASADA
|
|
217
|
+
|
|
218
|
+
🔧 T003 — Tests unitarios de la capa de datos
|
|
219
|
+
Agente: tester (modelo: sonnet)
|
|
220
|
+
✅ T003 completada
|
|
221
|
+
|
|
222
|
+
[...continúa para T004–T008...]
|
|
223
|
+
|
|
224
|
+
✅ T008 completada
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
El código generado en `src/db.js`:
|
|
228
|
+
|
|
229
|
+
```javascript
|
|
230
|
+
import Database from 'better-sqlite3'
|
|
231
|
+
import { join, dirname } from 'node:path'
|
|
232
|
+
import { fileURLToPath } from 'node:url'
|
|
233
|
+
|
|
234
|
+
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
235
|
+
const DB_PATH = join(__dirname, '..', 'tareas.db')
|
|
236
|
+
|
|
237
|
+
let db
|
|
238
|
+
|
|
239
|
+
export function getDb() {
|
|
240
|
+
if (!db) {
|
|
241
|
+
db = new Database(DB_PATH)
|
|
242
|
+
db.pragma('journal_mode = WAL')
|
|
243
|
+
inicializar(db)
|
|
244
|
+
}
|
|
245
|
+
return db
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function inicializar(db) {
|
|
249
|
+
db.exec(`
|
|
250
|
+
CREATE TABLE IF NOT EXISTS tareas (
|
|
251
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
252
|
+
titulo TEXT NOT NULL,
|
|
253
|
+
completa INTEGER NOT NULL DEFAULT 0,
|
|
254
|
+
creada_en TEXT NOT NULL DEFAULT (datetime('now'))
|
|
255
|
+
)
|
|
256
|
+
`)
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Y en `src/tareas.js`:
|
|
261
|
+
|
|
262
|
+
```javascript
|
|
263
|
+
import { getDb } from './db.js'
|
|
264
|
+
|
|
265
|
+
export function listarTareas() {
|
|
266
|
+
return getDb()
|
|
267
|
+
.prepare('SELECT * FROM tareas ORDER BY creada_en DESC')
|
|
268
|
+
.all()
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function crearTarea(titulo) {
|
|
272
|
+
if (!titulo || titulo.trim().length === 0) {
|
|
273
|
+
throw new Error('El título es obligatorio')
|
|
274
|
+
}
|
|
275
|
+
const stmt = getDb().prepare('INSERT INTO tareas (titulo) VALUES (?)')
|
|
276
|
+
const result = stmt.run(titulo.trim())
|
|
277
|
+
return getDb().prepare('SELECT * FROM tareas WHERE id = ?').get(result.lastInsertRowid)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export function completarTarea(id) {
|
|
281
|
+
const tarea = getDb().prepare('SELECT * FROM tareas WHERE id = ?').get(id)
|
|
282
|
+
if (!tarea) return null
|
|
283
|
+
getDb().prepare('UPDATE tareas SET completa = 1 WHERE id = ?').run(id)
|
|
284
|
+
return { ...tarea, completa: 1 }
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export function eliminarTarea(id) {
|
|
288
|
+
const result = getDb().prepare('DELETE FROM tareas WHERE id = ?').run(id)
|
|
289
|
+
return result.changes > 0
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Paso 7 — Verificación final
|
|
296
|
+
|
|
297
|
+
Al terminar todas las tareas, Claude invoca automáticamente al revisor y corre los tests:
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
📊 Implementación Completada: 2026-06-09-api-lista-tareas
|
|
301
|
+
|
|
302
|
+
Tareas: 8/8 ✅
|
|
303
|
+
Tests: Jest — 14 pasados, 0 fallidos
|
|
304
|
+
Cobertura: 87% (umbral: 80%) ✅
|
|
305
|
+
Constitución: ✅
|
|
306
|
+
|
|
307
|
+
Revisión del agente revisor:
|
|
308
|
+
✅ Todos los CAs cubiertos por tests
|
|
309
|
+
✅ Funciones ≤40 líneas (máx. encontrada: 18 líneas)
|
|
310
|
+
🟡 Sugerencia: añadir middleware de manejo de errores global (no bloqueante)
|
|
311
|
+
|
|
312
|
+
SIGUIENTES PASOS:
|
|
313
|
+
/sdd.verificar — verificación final contra spec original
|
|
314
|
+
/sdd.snapshot — actualizar SNAPSHOT del producto
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
/sdd.verificar
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
✅ Verificación completada
|
|
323
|
+
|
|
324
|
+
CA-001-01: POST /tareas crea tarea ✅ test: "debería crear tarea con título"
|
|
325
|
+
CA-001-02: GET /tareas devuelve ordenadas ✅ test: "debería listar en orden descendente"
|
|
326
|
+
CA-001-03: PATCH completa la tarea ✅ test: "debería marcar como completa"
|
|
327
|
+
CA-001-04: DELETE elimina la tarea ✅ test: "debería eliminar y devolver 204"
|
|
328
|
+
CA-001-05: POST sin título → 400 ✅ test: "debería devolver 400 sin título"
|
|
329
|
+
CA-001-06: PATCH ID inexistente → 404 ✅ test: "debería devolver 404 si no existe"
|
|
330
|
+
|
|
331
|
+
6/6 criterios de aceptación verificados ✅
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Resultado final
|
|
337
|
+
|
|
338
|
+
```
|
|
339
|
+
mi-api-tareas/
|
|
340
|
+
├── src/
|
|
341
|
+
│ ├── db.js ← BD SQLite
|
|
342
|
+
│ ├── tareas.js ← lógica de negocio
|
|
343
|
+
│ ├── rutas.js ← endpoints Express
|
|
344
|
+
│ ├── app.js ← setup Express
|
|
345
|
+
│ └── server.js ← punto de entrada
|
|
346
|
+
├── tests/
|
|
347
|
+
│ └── tareas.test.js ← 14 tests, 87% cobertura
|
|
348
|
+
├── package.json
|
|
349
|
+
├── tareas.db ← BD generada en primera ejecución
|
|
350
|
+
└── .sdd/
|
|
351
|
+
├── memoria/constitucion.md
|
|
352
|
+
├── especificaciones/2026-06-09-api-lista-tareas/
|
|
353
|
+
│ ├── spec.md
|
|
354
|
+
│ ├── plan.md
|
|
355
|
+
│ ├── tareas.md
|
|
356
|
+
│ └── checklist-spec.md
|
|
357
|
+
└── SNAPSHOT.md
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Lo que SDD-ES garantizó:**
|
|
361
|
+
- Cada línea de código está trazada a un criterio de aceptación
|
|
362
|
+
- El revisor verificó independientemente del implementador
|
|
363
|
+
- La constitución se cumplió en cada decisión técnica
|
|
364
|
+
- Los tests no son decorativos — cada CA tiene su test
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## Próxima feature
|
|
369
|
+
|
|
370
|
+
```
|
|
371
|
+
/sdd.especificar añadir prioridad a las tareas (alta/media/baja)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
El sistema detecta que hay una spec anterior completada, carga el contexto del proyecto (constitución + snapshot) y empieza desde cero — sin repetir preguntas ya respondidas.
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Ver también
|
|
379
|
+
|
|
380
|
+
- [FLUJO.md](FLUJO.md) — diagrama completo del flujo
|
|
381
|
+
- [AGENTES.md](AGENTES.md) — qué hace cada agente
|
|
382
|
+
- [PERSONALIZACION.md](PERSONALIZACION.md) — ajustar modelos, activar/desactivar agentes
|
|
383
|
+
- [FILOSOFIA.md](FILOSOFIA.md) — por qué SDD con IA
|