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
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Desglosa el plan en tareas atómicas, ordenadas por dependencias, con criterios de verificación concretos y asignación de agente responsable.
|
|
3
|
+
allowed-tools: Read, Write, Edit, Bash
|
|
4
|
+
handoffs:
|
|
5
|
+
- etiqueta: "Auditar consistencia"
|
|
6
|
+
comando: sdd.analizar
|
|
7
|
+
- etiqueta: "Empezar implementación"
|
|
8
|
+
comando: sdd.implementar
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /sdd.tareas — Desglose en Tareas
|
|
12
|
+
|
|
13
|
+
Eres el **Planificador de Tareas**. Transformas el plan en una secuencia ejecutable.
|
|
14
|
+
|
|
15
|
+
## Filosofía
|
|
16
|
+
|
|
17
|
+
Una buena tarea:
|
|
18
|
+
- **Atómica**: una responsabilidad. Si tiene "y" en el medio, divídela.
|
|
19
|
+
- **Verificable**: tiene un criterio booleano (pasa/no pasa).
|
|
20
|
+
- **Independiente**: el agente puede ejecutarla sin necesitar al humano.
|
|
21
|
+
- **Pequeña**: < 2 horas de trabajo equivalente humano.
|
|
22
|
+
- **Ordenable**: sus dependencias están claras.
|
|
23
|
+
- **Asignable**: tiene un agente responsable.
|
|
24
|
+
|
|
25
|
+
## PASO 1 — Verificar prerequisitos
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
[ -f ".sdd/hooks/antes_tareas.sh" ] && bash .sdd/hooks/antes_tareas.sh
|
|
29
|
+
|
|
30
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json | cut -d'"' -f4)
|
|
31
|
+
SPEC_DIR=".sdd/especificaciones/${SPEC_ID}"
|
|
32
|
+
|
|
33
|
+
# Verificar que el plan está aprobado
|
|
34
|
+
APROBADO=$(grep -o '"plan_aprobado": [a-z]*' .sdd/estado.json | cut -d' ' -f2)
|
|
35
|
+
if [ "$APROBADO" != "true" ]; then
|
|
36
|
+
echo "El plan no está aprobado. Ejecuta /sdd.planificar primero."
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
cat "${SPEC_DIR}/spec.md"
|
|
41
|
+
cat "${SPEC_DIR}/plan.md"
|
|
42
|
+
cat .sdd/memoria/constitucion.md
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## PASO 2 — Orden estándar de tareas
|
|
46
|
+
|
|
47
|
+
Genera tareas siguiendo este orden por defecto (cada paso puede omitirse si no aplica al cambio):
|
|
48
|
+
|
|
49
|
+
### Fase A — Fundamentos
|
|
50
|
+
1. Migraciones de BD (si aplica)
|
|
51
|
+
2. Tipos / interfaces / contratos (DTOs, schemas, modelos)
|
|
52
|
+
3. Configuración nueva / variables de entorno
|
|
53
|
+
|
|
54
|
+
### Fase B — Tests primero (si la constitución exige TDD)
|
|
55
|
+
4. Tests unitarios fallidos esperados (test de la API por implementar)
|
|
56
|
+
|
|
57
|
+
### Fase C — Capa de datos
|
|
58
|
+
5. Repositorios / accesos a BD
|
|
59
|
+
6. Tests unitarios de la capa de datos
|
|
60
|
+
|
|
61
|
+
### Fase D — Lógica de negocio
|
|
62
|
+
7. Servicios / casos de uso
|
|
63
|
+
8. Tests unitarios de servicios
|
|
64
|
+
|
|
65
|
+
### Fase E — Interfaz / API
|
|
66
|
+
9. Controllers / handlers / endpoints
|
|
67
|
+
10. Validaciones de input
|
|
68
|
+
11. Tests de integración
|
|
69
|
+
|
|
70
|
+
### Fase F — UI (si aplica)
|
|
71
|
+
12. Componentes / vistas
|
|
72
|
+
13. Estado del cliente
|
|
73
|
+
14. Tests de UI
|
|
74
|
+
|
|
75
|
+
### Fase G — Integración
|
|
76
|
+
15. Cableado entre capas
|
|
77
|
+
16. Tests E2E
|
|
78
|
+
|
|
79
|
+
### Fase H — Verificación y limpieza
|
|
80
|
+
17. Verificación contra criterios de aceptación
|
|
81
|
+
18. Documentación
|
|
82
|
+
19. Limpieza de dead code
|
|
83
|
+
|
|
84
|
+
## PASO 3 — Asignar agente responsable
|
|
85
|
+
|
|
86
|
+
Cada tarea debe asignarse al agente correcto. Lee `.sdd/sdd.config.yaml` para ver qué agentes están activos.
|
|
87
|
+
|
|
88
|
+
| Tipo de tarea | Agente |
|
|
89
|
+
|--------------|--------|
|
|
90
|
+
| Tipos, interfaces, contratos | arquitecto o disenador-api |
|
|
91
|
+
| Migraciones, esquemas BD | asesor-datos |
|
|
92
|
+
| Servicios backend, controllers | desarrollador-backend |
|
|
93
|
+
| Componentes UI, estado | desarrollador-frontend |
|
|
94
|
+
| Tests unitarios/integración | tester o el dev que escribió la lógica |
|
|
95
|
+
| Tests E2E | tester |
|
|
96
|
+
| CI/CD, infra | operaciones |
|
|
97
|
+
| Validación final cruzada | revisor |
|
|
98
|
+
| Documentación | documentador |
|
|
99
|
+
|
|
100
|
+
## PASO 4 — Generar tareas.md
|
|
101
|
+
|
|
102
|
+
Lee plantilla `plantillas/tareas.md`. Si no existe, usa esta:
|
|
103
|
+
|
|
104
|
+
```markdown
|
|
105
|
+
---
|
|
106
|
+
spec_id: {SPEC_ID}
|
|
107
|
+
total_tareas: {N}
|
|
108
|
+
estado: pendiente
|
|
109
|
+
generado: {FECHA}
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
# Tareas: [TÍTULO_SPEC]
|
|
113
|
+
|
|
114
|
+
## Progreso
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
[░░░░░░░░░░░░░░░░░░░░] 0% (0/{N})
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
| Total | Pendientes | En progreso | Completadas | Bloqueadas |
|
|
121
|
+
|-------|------------|-------------|-------------|------------|
|
|
122
|
+
| {N} | {N} | 0 | 0 | 0 |
|
|
123
|
+
|
|
124
|
+
## Leyenda de estados
|
|
125
|
+
- ⬜ pendiente
|
|
126
|
+
- 🔧 en_progreso
|
|
127
|
+
- ✅ completada
|
|
128
|
+
- ❌ bloqueada
|
|
129
|
+
- ⏭️ omitida (con justificación)
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## T001 — [Nombre descriptivo]
|
|
134
|
+
|
|
135
|
+
**Fase:** A (Fundamentos)
|
|
136
|
+
**Agente:** arquitecto
|
|
137
|
+
**Modelo recomendado:** opus (según config: `agentes.arquitecto.modelo`)
|
|
138
|
+
**Archivos:** `ruta/nuevo.ext` (CREAR)
|
|
139
|
+
**Depende de:** —
|
|
140
|
+
**Estado:** ⬜ pendiente
|
|
141
|
+
**Tiempo estimado:** S/M/L (small/medium/large)
|
|
142
|
+
|
|
143
|
+
### Qué hacer
|
|
144
|
+
|
|
145
|
+
[Descripción específica e inequívoca de qué implementar.
|
|
146
|
+
Debe poder ejecutarse sin necesidad de re-leer la spec.]
|
|
147
|
+
|
|
148
|
+
### Contexto relevante (de spec/plan)
|
|
149
|
+
|
|
150
|
+
- CA cubierto: CA-001-01, CA-001-02
|
|
151
|
+
- Decisión técnica aplicable: #3 (del plan)
|
|
152
|
+
|
|
153
|
+
### Criterio de verificación
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# Comando ejecutable que retorna 0 si la tarea está completa, 1 si no
|
|
157
|
+
[test concreto o comando]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
O alternativamente:
|
|
161
|
+
- [ ] El archivo X existe
|
|
162
|
+
- [ ] El símbolo Y se exporta
|
|
163
|
+
- [ ] Test Z pasa
|
|
164
|
+
|
|
165
|
+
### Notas / Gotchas
|
|
166
|
+
|
|
167
|
+
[Cualquier cosa que el implementador deba saber. Patrones existentes a seguir, decisiones ya tomadas, etc.]
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## T002 — [...]
|
|
172
|
+
|
|
173
|
+
[mismo formato]
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Matriz de Cobertura de CAs
|
|
178
|
+
|
|
179
|
+
| Criterio de Aceptación | Tareas que lo cubren |
|
|
180
|
+
|------------------------|----------------------|
|
|
181
|
+
| CA-001-01 | T001, T003, T008 |
|
|
182
|
+
| CA-001-02 | T002, T009 |
|
|
183
|
+
| ... | ... |
|
|
184
|
+
|
|
185
|
+
## Diagrama de Dependencias
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
T001 ──┐
|
|
189
|
+
├──> T003 ──> T005 ──> T008
|
|
190
|
+
T002 ──┘ │
|
|
191
|
+
└──> T007
|
|
192
|
+
T004 ──> T006
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Historial de Cambios de Estado
|
|
196
|
+
|
|
197
|
+
| Tarea | Anterior | Nuevo | Fecha | Notas |
|
|
198
|
+
|-------|----------|-------|-------|-------|
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## PASO 5 — Generar estado de tareas
|
|
202
|
+
|
|
203
|
+
Crea `.sdd/especificaciones/{ID}/.estado-tareas.json`:
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"spec_id": "{SPEC_ID}",
|
|
208
|
+
"total": N,
|
|
209
|
+
"completadas": 0,
|
|
210
|
+
"en_progreso": null,
|
|
211
|
+
"bloqueadas": 0,
|
|
212
|
+
"tareas": {
|
|
213
|
+
"T001": {
|
|
214
|
+
"estado": "pendiente",
|
|
215
|
+
"agente": "arquitecto",
|
|
216
|
+
"modelo": "opus",
|
|
217
|
+
"depende_de": [],
|
|
218
|
+
"cubre_cas": ["CA-001-01", "CA-001-02"]
|
|
219
|
+
},
|
|
220
|
+
"T002": { ... }
|
|
221
|
+
},
|
|
222
|
+
"ultima_actualizacion": "{FECHA}"
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## PASO 6 — Verificar cobertura
|
|
227
|
+
|
|
228
|
+
Antes de finalizar, valida internamente:
|
|
229
|
+
|
|
230
|
+
1. ¿Cada CA tiene al menos una tarea que lo cubre?
|
|
231
|
+
2. ¿Cada archivo del plan tiene al menos una tarea asociada?
|
|
232
|
+
3. ¿Cada riesgo del plan tiene una tarea de mitigación o se acepta?
|
|
233
|
+
|
|
234
|
+
Si hay huecos, añade tareas faltantes o documéntalos.
|
|
235
|
+
|
|
236
|
+
## PASO 7 — Actualizar estado global
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"fase_actual": "tareas_generadas",
|
|
241
|
+
"tareas_generadas": true,
|
|
242
|
+
"ultima_actualizacion": "{FECHA}"
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## PASO 8 — Resumen
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
✅ {N} tareas generadas
|
|
250
|
+
📁 .sdd/especificaciones/{ID}/tareas.md
|
|
251
|
+
|
|
252
|
+
DISTRIBUCIÓN POR AGENTE:
|
|
253
|
+
• arquitecto: [N]
|
|
254
|
+
• desarrollador-backend: [N]
|
|
255
|
+
• desarrollador-frontend: [N]
|
|
256
|
+
• tester: [N]
|
|
257
|
+
• [...]
|
|
258
|
+
|
|
259
|
+
COBERTURA:
|
|
260
|
+
• {N}/{M} CAs cubiertos por al menos una tarea
|
|
261
|
+
• Archivos del plan asignados: ✅
|
|
262
|
+
• Riesgos con tarea de mitigación: [N]/[M]
|
|
263
|
+
|
|
264
|
+
SIGUIENTES PASOS:
|
|
265
|
+
/sdd.analizar — verificar consistencia spec/plan/tareas (RECOMENDADO)
|
|
266
|
+
/sdd.implementar — ejecutar todas las tareas
|
|
267
|
+
/sdd.implementar T001 — ejecutar una tarea específica
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## VALIDACIÓN DE SALIDA
|
|
271
|
+
|
|
272
|
+
Antes de entregar las tareas al usuario, verifica cobertura y estructura:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json 2>/dev/null | cut -d'"' -f4)
|
|
276
|
+
TAREAS_FILE=".sdd/especificaciones/${SPEC_ID}/tareas.md"
|
|
277
|
+
ESTADO_FILE=".sdd/especificaciones/${SPEC_ID}/.estado-tareas.json"
|
|
278
|
+
|
|
279
|
+
# Los dos archivos deben existir
|
|
280
|
+
[ -f "$TAREAS_FILE" ] || echo "FALTA: tareas.md no se generó"
|
|
281
|
+
[ -f "$ESTADO_FILE" ] || echo "FALTA: .estado-tareas.json no se generó"
|
|
282
|
+
|
|
283
|
+
# Debe haber al menos una tarea
|
|
284
|
+
TOTAL_TAREAS=$(grep -c "^## T[0-9]" "$TAREAS_FILE" 2>/dev/null || echo 0)
|
|
285
|
+
[ "$TOTAL_TAREAS" -eq 0 ] && echo "ERROR: no se generó ninguna tarea"
|
|
286
|
+
|
|
287
|
+
# Cada tarea debe tener criterio de verificación
|
|
288
|
+
TAREAS_SIN_VERIFICACION=$(grep -B20 "^## T[0-9]" "$TAREAS_FILE" 2>/dev/null | grep -c "Criterio de verificación" || echo 0)
|
|
289
|
+
[ "$TAREAS_SIN_VERIFICACION" -lt "$TOTAL_TAREAS" ] && echo "ADVERTENCIA: alguna tarea no tiene criterio de verificación"
|
|
290
|
+
|
|
291
|
+
# La matriz de cobertura de CAs debe existir
|
|
292
|
+
grep -q "Matriz de Cobertura" "$TAREAS_FILE" || echo "FALTA: Matriz de Cobertura de CAs"
|
|
293
|
+
|
|
294
|
+
echo "Validación completada — total tareas: $TOTAL_TAREAS"
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Si alguna verificación falla, corrige antes de habilitar el handoff a `/sdd.implementar`.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
**HOOK:** `.sdd/hooks/despues_tareas.sh`
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Verifica que el código implementado cumple TODOS los criterios de aceptación de la spec original. Auditoría independiente con el agente revisor.
|
|
3
|
+
allowed-tools: Read, Write, Bash, Task, Grep, Glob
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /sdd.verificar — Verificación Final
|
|
7
|
+
|
|
8
|
+
Eres el **Auditor de Cumplimiento**. Tu trabajo es validar que el código entregado satisface CADA criterio de aceptación de la spec original, sin asumirlo.
|
|
9
|
+
|
|
10
|
+
## Filosofía
|
|
11
|
+
|
|
12
|
+
Esta verificación es **independiente de la implementación**. No te basas en lo que dijeron los agentes implementadores. Vas al código y compruebas por ti mismo.
|
|
13
|
+
|
|
14
|
+
## PASO 1 — Cargar contexto
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json | cut -d'"' -f4)
|
|
18
|
+
SPEC_DIR=".sdd/especificaciones/${SPEC_ID}"
|
|
19
|
+
|
|
20
|
+
cat "${SPEC_DIR}/spec.md"
|
|
21
|
+
cat "${SPEC_DIR}/plan.md"
|
|
22
|
+
cat "${SPEC_DIR}/.estado-tareas.json"
|
|
23
|
+
cat .sdd/memoria/constitucion.md
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## PASO 2 — Extraer todos los CAs
|
|
27
|
+
|
|
28
|
+
Lee la spec y genera una lista de TODOS los criterios de aceptación con sus IDs:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
CA-001-01: [texto del CA]
|
|
32
|
+
CA-001-02: [texto del CA]
|
|
33
|
+
...
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## PASO 3 — Verificar CA por CA
|
|
37
|
+
|
|
38
|
+
Para CADA CA, sigue este proceso:
|
|
39
|
+
|
|
40
|
+
### 3.1 — Identificar dónde buscar
|
|
41
|
+
Determina en qué parte del código debería estar implementado este CA:
|
|
42
|
+
- Servicios/módulos relevantes
|
|
43
|
+
- Tests que deberían cubrirlo
|
|
44
|
+
|
|
45
|
+
### 3.2 — Buscar implementación
|
|
46
|
+
```bash
|
|
47
|
+
# Usa grep/glob para localizar código relacionado al CA
|
|
48
|
+
grep -rn "[concepto del CA]" --include="*.ts" --include="*.py" --include="*.js" .
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 3.3 — Buscar test
|
|
52
|
+
```bash
|
|
53
|
+
# Hay test que verifica este CA específicamente?
|
|
54
|
+
grep -rn "[CA-001-01 o el comportamiento]" --include="*test*" --include="*spec*" .
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3.4 — Verificar manualmente
|
|
58
|
+
Lee el código encontrado. ¿Realmente implementa lo que pide el CA?
|
|
59
|
+
|
|
60
|
+
- ✅ **Implementado y testeado**
|
|
61
|
+
- ⚠️ **Implementado pero sin test específico**
|
|
62
|
+
- ⚠️ **Implementado parcialmente** (cubre algunos escenarios pero no todos)
|
|
63
|
+
- ❌ **No implementado**
|
|
64
|
+
|
|
65
|
+
## PASO 4 — Verificar requisitos funcionales
|
|
66
|
+
|
|
67
|
+
Repite el proceso para cada RF-XXX de la spec.
|
|
68
|
+
|
|
69
|
+
## PASO 5 — Verificar requisitos no funcionales
|
|
70
|
+
|
|
71
|
+
Estos requieren validación específica:
|
|
72
|
+
|
|
73
|
+
- **Rendimiento**: ¿hay benchmark? ¿la métrica se cumple?
|
|
74
|
+
- **Seguridad**: ¿se aplicaron las medidas? Invocar agente `seguridad`
|
|
75
|
+
- **Accesibilidad**: ¿se respetan los estándares? (revisar UI si aplica)
|
|
76
|
+
- **Disponibilidad**: ¿el manejo de errores/retries existe?
|
|
77
|
+
|
|
78
|
+
## PASO 6 — Verificar exclusiones
|
|
79
|
+
|
|
80
|
+
Las "Exclusiones Explícitas" de la spec dicen qué NO debía implementarse. Verifica:
|
|
81
|
+
- ¿Se respetaron? (no se agregó funcionalidad fuera de scope)
|
|
82
|
+
|
|
83
|
+
## PASO 7 — Verificar cumplimiento de constitución
|
|
84
|
+
|
|
85
|
+
Para CADA principio de la constitución:
|
|
86
|
+
- ¿El código respeta el principio?
|
|
87
|
+
- Si no, ¿hay justificación documentada en "Complejidad Justificada" del plan?
|
|
88
|
+
|
|
89
|
+
## PASO 8 — Correr tests completos
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Detectar y ejecutar la suite completa
|
|
93
|
+
[ -f package.json ] && (npm test || pnpm test || yarn test) 2>&1
|
|
94
|
+
[ -f pyproject.toml ] && (pytest -v || python -m pytest -v) 2>&1
|
|
95
|
+
[ -f Cargo.toml ] && cargo test 2>&1
|
|
96
|
+
[ -f go.mod ] && go test ./... 2>&1
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## PASO 9 — Verificar tareas como completas
|
|
100
|
+
|
|
101
|
+
Lee `.estado-tareas.json` y verifica:
|
|
102
|
+
- ¿Las tareas marcadas como `completada` tienen sus archivos modificados?
|
|
103
|
+
- ¿Hay tareas `bloqueada` que necesitan resolución?
|
|
104
|
+
|
|
105
|
+
## PASO 10 — Generar reporte de verificación
|
|
106
|
+
|
|
107
|
+
Crea `.sdd/especificaciones/{ID}/verificacion.md`:
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
---
|
|
111
|
+
spec_id: {SPEC_ID}
|
|
112
|
+
fecha_verificacion: {FECHA}
|
|
113
|
+
veredicto: APROBADA | APROBADA_CON_OBSERVACIONES | RECHAZADA
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
# Verificación Final: {SPEC_ID}
|
|
117
|
+
|
|
118
|
+
## Veredicto: **{VEREDICTO}**
|
|
119
|
+
|
|
120
|
+
[Resumen ejecutivo]
|
|
121
|
+
|
|
122
|
+
## Cumplimiento de Criterios de Aceptación
|
|
123
|
+
|
|
124
|
+
| CA | Descripción | Implementado | Testeado | Archivo(s) | Test(s) |
|
|
125
|
+
|----|-------------|--------------|----------|-----------|---------|
|
|
126
|
+
| CA-001-01 | [texto] | ✅ | ✅ | src/auth.ts:45 | tests/auth.test.ts:12 |
|
|
127
|
+
| CA-001-02 | [texto] | ⚠️ Parcial | ❌ | src/auth.ts:78 | — |
|
|
128
|
+
| CA-002-01 | [texto] | ❌ | — | — | — |
|
|
129
|
+
|
|
130
|
+
## Cumplimiento de Requisitos Funcionales
|
|
131
|
+
|
|
132
|
+
| RF | Cumple | Notas |
|
|
133
|
+
|----|--------|-------|
|
|
134
|
+
| RF-001 | ✅ | — |
|
|
135
|
+
| RF-002 | ⚠️ | [explicación] |
|
|
136
|
+
|
|
137
|
+
## Cumplimiento de Requisitos No Funcionales
|
|
138
|
+
|
|
139
|
+
| RNF | Métrica | Esperado | Medido | Cumple |
|
|
140
|
+
|-----|---------|---------|--------|--------|
|
|
141
|
+
| Rendimiento | latencia p95 | <200ms | 180ms | ✅ |
|
|
142
|
+
| Seguridad | auth requerida | sí | sí | ✅ |
|
|
143
|
+
|
|
144
|
+
## Exclusiones Respetadas
|
|
145
|
+
|
|
146
|
+
| Exclusión | Respetada |
|
|
147
|
+
|-----------|-----------|
|
|
148
|
+
| [exclusión 1] | ✅ |
|
|
149
|
+
|
|
150
|
+
## Cumplimiento de Constitución
|
|
151
|
+
|
|
152
|
+
| Principio | Cumple |
|
|
153
|
+
|-----------|--------|
|
|
154
|
+
| Principio I | ✅ |
|
|
155
|
+
| Principio II | ⚠️ — ver Complejidad Justificada del plan |
|
|
156
|
+
|
|
157
|
+
## Suite de Tests
|
|
158
|
+
|
|
159
|
+
- Framework: [detectado]
|
|
160
|
+
- Tests totales: [N]
|
|
161
|
+
- Pasados: [N]
|
|
162
|
+
- Fallidos: [N]
|
|
163
|
+
- Cobertura: [%]
|
|
164
|
+
- Umbral mínimo (constitución): [%]
|
|
165
|
+
- **Cumple**: ✅/❌
|
|
166
|
+
|
|
167
|
+
## Hallazgos
|
|
168
|
+
|
|
169
|
+
### 🔴 Críticos (bloquean entrega)
|
|
170
|
+
[Lista]
|
|
171
|
+
|
|
172
|
+
### 🟡 Importantes (corregir antes de release)
|
|
173
|
+
[Lista]
|
|
174
|
+
|
|
175
|
+
### 🟢 Menores (mejoras futuras)
|
|
176
|
+
[Lista]
|
|
177
|
+
|
|
178
|
+
## Recomendaciones
|
|
179
|
+
|
|
180
|
+
[Lista accionable]
|
|
181
|
+
|
|
182
|
+
## Sugerencia de siguiente acción
|
|
183
|
+
|
|
184
|
+
[Comando o acción manual]
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## PASO 11 — Determinar veredicto
|
|
188
|
+
|
|
189
|
+
**APROBADA**:
|
|
190
|
+
- 100% CAs cubiertos e implementados
|
|
191
|
+
- Todos los RF cumplidos
|
|
192
|
+
- Tests pasando
|
|
193
|
+
- Cobertura sobre el umbral
|
|
194
|
+
- Constitución respetada
|
|
195
|
+
|
|
196
|
+
**APROBADA_CON_OBSERVACIONES**:
|
|
197
|
+
- ≥95% CAs cubiertos
|
|
198
|
+
- Hallazgos menores
|
|
199
|
+
- Tests pasando
|
|
200
|
+
|
|
201
|
+
**RECHAZADA**:
|
|
202
|
+
- CAs sin implementar
|
|
203
|
+
- Tests fallando
|
|
204
|
+
- Violaciones graves de constitución
|
|
205
|
+
|
|
206
|
+
## PASO 12 — Acción
|
|
207
|
+
|
|
208
|
+
**APROBADA:**
|
|
209
|
+
```
|
|
210
|
+
✅ Verificación: APROBADA
|
|
211
|
+
🎉 La implementación cumple TODOS los criterios
|
|
212
|
+
|
|
213
|
+
📁 .sdd/especificaciones/{ID}/verificacion.md
|
|
214
|
+
|
|
215
|
+
SIGUIENTES PASOS:
|
|
216
|
+
/sdd.snapshot — actualizar SNAPSHOT.md del producto
|
|
217
|
+
(haz commit y push manualmente)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**APROBADA_CON_OBSERVACIONES:**
|
|
221
|
+
```
|
|
222
|
+
🟡 Verificación: APROBADA CON OBSERVACIONES
|
|
223
|
+
✅ Cumple los CAs críticos
|
|
224
|
+
⚠️ [N] observaciones documentadas
|
|
225
|
+
|
|
226
|
+
Puedes entregar, pero considera abordar las observaciones.
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**RECHAZADA:**
|
|
230
|
+
```
|
|
231
|
+
❌ Verificación: RECHAZADA
|
|
232
|
+
🔴 [N] CAs no cumplidos
|
|
233
|
+
|
|
234
|
+
ACCIONES REQUERIDAS:
|
|
235
|
+
[Lista priorizada]
|
|
236
|
+
|
|
237
|
+
Vuelve a:
|
|
238
|
+
/sdd.implementar — completar tareas pendientes
|
|
239
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# antes_cada_tarea.sh — se ejecuta antes de cada tarea individual en /sdd.implementar
|
|
3
|
+
# Cópialo a .sdd/hooks/ y hazlo ejecutable: chmod +x .sdd/hooks/antes_cada_tarea.sh
|
|
4
|
+
#
|
|
5
|
+
# Recibe como argumento: $1 = TAREA_ID (ej: "T003")
|
|
6
|
+
# El agente puede pasar variables de entorno opcionales:
|
|
7
|
+
# SDD_ARCHIVOS — archivos que la tarea va a modificar
|
|
8
|
+
# SDD_COMANDO — comando que la tarea va a ejecutar (si aplica)
|
|
9
|
+
|
|
10
|
+
TAREA_ID="${1:-?}"
|
|
11
|
+
export SDD_TAREA_ID="$TAREA_ID"
|
|
12
|
+
|
|
13
|
+
echo "🔒 Verificación de seguridad para ${TAREA_ID}..."
|
|
14
|
+
|
|
15
|
+
# Invocar el guardia para esta tarea específica
|
|
16
|
+
bash "$(dirname "$0")/guardia-seguridad.sh"
|
|
17
|
+
|
|
18
|
+
echo "✅ ${TAREA_ID} — verificaciones pasadas, iniciando ejecución"
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# antes_implementar.sh — se ejecuta antes de cada /sdd.implementar
|
|
3
|
+
# Cópialo a .sdd/hooks/ y hazlo ejecutable: chmod +x .sdd/hooks/antes_implementar.sh
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# ── 1. Guardia de seguridad ──────────────────────────────────
|
|
8
|
+
# Bloquea .env, comandos destructivos, push sin confirmación, secrets hardcodeados
|
|
9
|
+
bash "$(dirname "$0")/guardia-seguridad.sh"
|
|
10
|
+
|
|
11
|
+
# ── 2. Verificar rama git ────────────────────────────────────
|
|
12
|
+
# (Ya cubierto por guardia-seguridad.sh — esto es redundante si usas el guardia)
|
|
13
|
+
|
|
14
|
+
# ── 3. Verificar tests previos pasan ────────────────────────
|
|
15
|
+
# No implementes sobre una base rota
|
|
16
|
+
echo "🔍 Verificando que los tests actuales pasan antes de implementar..."
|
|
17
|
+
|
|
18
|
+
TESTS_OK=false
|
|
19
|
+
|
|
20
|
+
if [ -f package.json ]; then
|
|
21
|
+
npx jest --passWithNoTests --silent 2>/dev/null && TESTS_OK=true \
|
|
22
|
+
|| pnpm test --silent 2>/dev/null && TESTS_OK=true \
|
|
23
|
+
|| TESTS_OK=false
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
if [ -f pyproject.toml ] || [ -f pytest.ini ]; then
|
|
27
|
+
python -m pytest -q --tb=no 2>/dev/null && TESTS_OK=true || TESTS_OK=false
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
if [ -f Cargo.toml ]; then
|
|
31
|
+
cargo test -q 2>/dev/null && TESTS_OK=true || TESTS_OK=false
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
if [ "$TESTS_OK" = "false" ]; then
|
|
35
|
+
echo "⚠️ Los tests actuales tienen fallos pre-existentes."
|
|
36
|
+
echo " Implementar sobre una base rota dificulta identificar regresiones."
|
|
37
|
+
echo " ¿Continuar de todos modos? (s/N)"
|
|
38
|
+
read -r RESP
|
|
39
|
+
if [ "$RESP" != "s" ] && [ "$RESP" != "S" ]; then
|
|
40
|
+
echo "❌ Implementación cancelada — corrige los tests fallidos primero."
|
|
41
|
+
exit 1
|
|
42
|
+
fi
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
echo "✅ Hook antes_implementar completado"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Ejemplo: crear branch Git automáticamente al crear una spec
|
|
3
|
+
|
|
4
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json | cut -d'"' -f4)
|
|
5
|
+
|
|
6
|
+
if [ -d .git ] && [ -n "$SPEC_ID" ]; then
|
|
7
|
+
RAMA="spec/${SPEC_ID}"
|
|
8
|
+
|
|
9
|
+
# Solo crear si no existe
|
|
10
|
+
if ! git show-ref --verify --quiet "refs/heads/${RAMA}"; then
|
|
11
|
+
git checkout -b "$RAMA" 2>/dev/null && \
|
|
12
|
+
echo "✅ Branch creada: $RAMA"
|
|
13
|
+
fi
|
|
14
|
+
fi
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Ejemplo: aplicar linter después de implementar
|
|
3
|
+
# Cópialo a .sdd/hooks/ y hazlo ejecutable
|
|
4
|
+
|
|
5
|
+
if [ -f package.json ]; then
|
|
6
|
+
echo "🧹 Aplicando linter..."
|
|
7
|
+
npm run lint --fix 2>/dev/null || pnpm lint --fix 2>/dev/null || yarn lint --fix 2>/dev/null
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
if [ -f pyproject.toml ]; then
|
|
11
|
+
echo "🧹 Aplicando formateador..."
|
|
12
|
+
ruff format . 2>/dev/null || black . 2>/dev/null
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if [ -f Cargo.toml ]; then
|
|
16
|
+
echo "🧹 Aplicando rustfmt..."
|
|
17
|
+
cargo fmt 2>/dev/null
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
echo "✅ Hook despues_implementar completado"
|
|
21
|
+
|
|
22
|
+
# ===== NUEVO: Actualizar mapas =====
|
|
23
|
+
if [ -d ".sdd/mapa" ]; then
|
|
24
|
+
echo "🗺️ Actualizando mapas..."
|
|
25
|
+
bash ./.claude/bin/mapear.sh validar > /dev/null 2>&1 || true
|
|
26
|
+
|
|
27
|
+
# Obtener archivos modificados en esta sesión
|
|
28
|
+
# (esto es aproximado, en producción usarías git diff)
|
|
29
|
+
MAPA_ANTIGUO=$(stat -c %Y .sdd/mapa/estructura.md 2>/dev/null || echo 0)
|
|
30
|
+
ARCHIVOS_NUEVOS=$(find . -newer <(date -r $MAPA_ANTIGUO) -type f 2>/dev/null | grep -v '.sdd' | wc -l)
|
|
31
|
+
|
|
32
|
+
if [ "$ARCHIVOS_NUEVOS" -gt 0 ]; then
|
|
33
|
+
echo "📝 Detectados $ARCHIVOS_NUEVOS archivos modificados"
|
|
34
|
+
echo "⏰ Próxima actualización: /sdd.mapear actualizar"
|
|
35
|
+
fi
|
|
36
|
+
fi
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Ejemplo: notificación a Slack/Teams cuando un plan se aprueba
|
|
3
|
+
|
|
4
|
+
SPEC_ID=$(grep -o '"especificacion_activa": "[^"]*"' .sdd/estado.json | cut -d'"' -f4)
|
|
5
|
+
TITULO=$(grep "^titulo:" ".sdd/especificaciones/${SPEC_ID}/spec.md" | cut -d'"' -f2)
|
|
6
|
+
|
|
7
|
+
if [ -n "$SLACK_WEBHOOK" ]; then
|
|
8
|
+
curl -s -X POST "$SLACK_WEBHOOK" \
|
|
9
|
+
-H 'Content-type: application/json' \
|
|
10
|
+
--data "{\"text\":\"📋 Plan SDD aprobado: ${TITULO} (${SPEC_ID})\"}"
|
|
11
|
+
echo "✅ Notificación enviada a Slack"
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
if [ -n "$TEAMS_WEBHOOK" ]; then
|
|
15
|
+
curl -s -X POST "$TEAMS_WEBHOOK" \
|
|
16
|
+
-H 'Content-type: application/json' \
|
|
17
|
+
--data "{\"text\":\"📋 Plan SDD aprobado: ${TITULO} (${SPEC_ID})\"}"
|
|
18
|
+
echo "✅ Notificación enviada a Teams"
|
|
19
|
+
fi
|