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.
Files changed (101) hide show
  1. package/.claude/settings.json +51 -0
  2. package/.claude-plugin/marketplace.json +31 -0
  3. package/.claude-plugin/plugin.json +97 -0
  4. package/README.md +332 -0
  5. package/agents/arquitecto.md +148 -0
  6. package/agents/asesor-datos.md +163 -0
  7. package/agents/critico.md +142 -0
  8. package/agents/desarrollador-backend.md +242 -0
  9. package/agents/desarrollador-frontend.md +120 -0
  10. package/agents/disenador-api.md +108 -0
  11. package/agents/documentador.md +177 -0
  12. package/agents/investigador.md +174 -0
  13. package/agents/operaciones.md +105 -0
  14. package/agents/revisor.md +153 -0
  15. package/agents/seguridad.md +216 -0
  16. package/agents/tester.md +286 -0
  17. package/claude-hooks/post-write-conventions.js +412 -0
  18. package/claude-hooks/pre-tool-guard.js +159 -0
  19. package/cli/index.js +401 -0
  20. package/commands/sdd.aclarar.md +200 -0
  21. package/commands/sdd.analizar.md +241 -0
  22. package/commands/sdd.ayuda.md +227 -0
  23. package/commands/sdd.canary.md +60 -0
  24. package/commands/sdd.checklist.md +174 -0
  25. package/commands/sdd.comprimir.md +166 -0
  26. package/commands/sdd.configurar.md +195 -0
  27. package/commands/sdd.constitucion.md +343 -0
  28. package/commands/sdd.crear-app.md +168 -0
  29. package/commands/sdd.crear-mcp.md +174 -0
  30. package/commands/sdd.descubrir.md +269 -0
  31. package/commands/sdd.desplegar.md +155 -0
  32. package/commands/sdd.especificar.md +302 -0
  33. package/commands/sdd.estado.md +124 -0
  34. package/commands/sdd.glosario.md +108 -0
  35. package/commands/sdd.implementar.md +377 -0
  36. package/commands/sdd.importar.md +91 -0
  37. package/commands/sdd.mapear.md +120 -0
  38. package/commands/sdd.md +119 -0
  39. package/commands/sdd.planificar.md +372 -0
  40. package/commands/sdd.qa.md +108 -0
  41. package/commands/sdd.release.md +253 -0
  42. package/commands/sdd.retro.md +82 -0
  43. package/commands/sdd.snapshot.md +122 -0
  44. package/commands/sdd.tareas.md +300 -0
  45. package/commands/sdd.verificar.md +239 -0
  46. package/configuracion-ejemplo/hooks-ejemplo/antes_cada_tarea.sh +18 -0
  47. package/configuracion-ejemplo/hooks-ejemplo/antes_implementar.sh +45 -0
  48. package/configuracion-ejemplo/hooks-ejemplo/despues_especificar.sh +14 -0
  49. package/configuracion-ejemplo/hooks-ejemplo/despues_implementar.sh +36 -0
  50. package/configuracion-ejemplo/hooks-ejemplo/despues_planificar.sh +19 -0
  51. package/configuracion-ejemplo/hooks-ejemplo/guardia-seguridad.sh +367 -0
  52. package/configuracion-ejemplo/sdd.config.yaml +310 -0
  53. package/docs/AGENTES.md +74 -0
  54. package/docs/COMPRESION.md +155 -0
  55. package/docs/EJEMPLO-PRACTICA.md +383 -0
  56. package/docs/EJEMPLOS.md +212 -0
  57. package/docs/FABRICA.md +185 -0
  58. package/docs/FILOSOFIA.md +61 -0
  59. package/docs/FLUJO.md +149 -0
  60. package/docs/INICIO-RAPIDO.md +116 -0
  61. package/docs/MAPAS.md +113 -0
  62. package/docs/MODELOS.md +103 -0
  63. package/docs/PERSONALIZACION.md +152 -0
  64. package/instalar.ps1 +39 -0
  65. package/instalar.sh +22 -0
  66. package/mcp-figma/README.md +158 -0
  67. package/mcp-figma/package.json +7 -0
  68. package/mcp-figma/src/component-generator.js +162 -0
  69. package/mcp-figma/src/design-system-analyzer.js +247 -0
  70. package/mcp-figma/src/figma-client.js +75 -0
  71. package/mcp-figma/src/index.js +114 -0
  72. package/mcp-figma/src/mcp.js +97 -0
  73. package/mcp-figma/src/style-mapper.js +85 -0
  74. package/package.json +50 -0
  75. package/plantillas/analisis.md +57 -0
  76. package/plantillas/checklist-especificacion.md +66 -0
  77. package/plantillas/constitucion.md +104 -0
  78. package/plantillas/decision-arquitectura.md +39 -0
  79. package/plantillas/dependencias-mapa.md +89 -0
  80. package/plantillas/especificacion.md +108 -0
  81. package/plantillas/estructura-mapa.md +40 -0
  82. package/plantillas/glosario.md +22 -0
  83. package/plantillas/index-especificaciones.md +15 -0
  84. package/plantillas/mcp-server.md +147 -0
  85. package/plantillas/plan.md +152 -0
  86. package/plantillas/simbolos-mapa.md +57 -0
  87. package/plantillas/snapshot.md +54 -0
  88. package/plantillas/tareas.md +72 -0
  89. package/presets/enterprise.yaml +69 -0
  90. package/presets/lean.yaml +63 -0
  91. package/presets/startup.yaml +67 -0
  92. package/skills/compresion-tokens.md +264 -0
  93. package/skills/constitucion-constraint.md +78 -0
  94. package/skills/deteccion-stack.md +175 -0
  95. package/skills/enrutador-agentes.md +69 -0
  96. package/skills/gestion-estado.md +114 -0
  97. package/skills/indexador.md +199 -0
  98. package/skills/modo-guiado/SKILL.md +78 -0
  99. package/skills/orquestacion-ptc/SKILL.md +96 -0
  100. package/skills/validacion-spec.md +52 -0
  101. package/skills/verificador-implementacion.md +71 -0
@@ -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