sdd-es 2.0.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 +29 -29
- package/.claude/settings.local.json +10 -0
- package/.claude-plugin/marketplace.json +10 -7
- package/.claude-plugin/plugin.json +59 -37
- package/.gitignore +20 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +77 -40
- package/agents/architecture-designer.md +211 -0
- package/agents/arquitecto.md +16 -1
- package/agents/asesor-datos.md +15 -1
- package/agents/critico.md +37 -1
- package/agents/desarrollador-backend.md +3 -1
- package/agents/desarrollador-frontend.md +11 -16
- package/agents/disenador-api.md +13 -1
- package/agents/documentador.md +3 -1
- package/agents/investigador.md +3 -1
- package/agents/operaciones.md +3 -1
- package/agents/product-designer.md +268 -0
- package/agents/revisor.md +25 -1
- package/agents/seguridad.md +5 -1
- package/agents/tester.md +3 -1
- package/claude-hooks/agent-memory.js +288 -0
- package/claude-hooks/pre-tool-guard.js +61 -9
- package/cli/index.js +1 -2
- package/commands/sdd.adr.md +196 -0
- package/commands/sdd.analizar.md +23 -2
- package/commands/sdd.ayuda.md +13 -0
- package/commands/sdd.compliance.md +521 -0
- package/commands/sdd.configurar.md +34 -1
- package/commands/sdd.constitucion.md +198 -23
- package/commands/sdd.construir.md +210 -0
- 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.dise/303/261ar.md +188 -0
- package/commands/sdd.estado.md +120 -3
- package/commands/sdd.exportar.md +344 -0
- package/commands/sdd.implementar.md +272 -52
- package/commands/sdd.interpretar.md +239 -0
- package/commands/sdd.md +93 -4
- package/commands/sdd.optimizar-memoria.md +47 -0
- package/commands/sdd.optimizar.md +164 -0
- package/commands/sdd.planificar.md +64 -0
- package/commands/sdd.retro.md +74 -0
- package/commands/sdd.verificar.md +81 -0
- package/configuracion-ejemplo/.claude/CLAUDE.md +106 -0
- package/configuracion-ejemplo/sdd.config.yaml +10 -0
- package/craft/accessibility-baseline.md +216 -0
- package/craft/anti-ai-slop.md +158 -0
- package/craft/color.md +160 -0
- package/craft/typography.md +121 -0
- package/design-systems/bold-brutalist/DESIGN.md +239 -0
- package/design-systems/editorial-minimal/DESIGN.md +205 -0
- package/design-systems/neutral-modern/DESIGN.md +227 -0
- package/design-systems/vibrant-consumer/DESIGN.md +257 -0
- package/design-systems/warm-editorial/DESIGN.md +221 -0
- package/docs/AGENTES.md +4 -1
- package/docs/CASO-COMPLETO.md +206 -0
- package/docs/EJEMPLOS.md +61 -185
- package/docs/FABRICA.md +163 -115
- package/docs/INICIO-RAPIDO.md +27 -79
- package/docs/MEMORIA-Y-OBSERVABILIDAD.md +239 -0
- package/docs/MODELOS.md +3 -0
- package/docs/QUE-PASA-SI-FALLA.md +404 -0
- package/docs/README.md +43 -0
- package/docs/RELACION-CON-CLAUDE-CODE.md +38 -0
- package/docs/SEGURIDAD-PARA-NOTECNICOS.md +280 -0
- package/package.json +15 -10
- 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 +163 -0
- package/skills/critica-diseno/SKILL.md +193 -0
- package/skills/descubrir-idea/SKILL.md +133 -0
- package/skills/effort-router/SKILL.md +128 -0
- package/skills/elegir-direccion/SKILL.md +184 -0
- package/skills/github-connect/IMPLEMENTATION-CHECKLIST.md +297 -0
- package/skills/github-connect/INDEX.md +223 -0
- package/skills/github-connect/INTEGRATION.md +361 -0
- package/skills/github-connect/QUICK-START.md +168 -0
- package/skills/github-connect/README.md +414 -0
- package/skills/github-connect/RESUMEN_IMPLEMENTACION.txt +374 -0
- package/skills/github-connect/SKILL.md +343 -0
- package/skills/github-connect/STRUCTURE.txt +252 -0
- package/skills/github-connect/example-config.yaml +41 -0
- package/skills/github-connect/github-connect.sh +419 -0
- package/skills/interpretar-idea/SKILL.md +254 -0
- package/skills/mejorar-prompt/SKILL.md +237 -0
- package/skills/memory-compactor/SKILL.md +68 -0
- package/skills/modo-guiado/SKILL.md +12 -2
- package/skills/mutation-detector/SKILL.md +134 -0
- package/skills/observabilidad-consumo/SKILL.md +164 -0
- package/skills/token-budget/SKILL.md +177 -0
- package/skills/vercel-deploy/00-START-HERE.txt +364 -0
- package/skills/vercel-deploy/CHECKLIST.md +205 -0
- package/skills/vercel-deploy/EXEC-SUMMARY.txt +322 -0
- package/skills/vercel-deploy/FLOW.txt +334 -0
- package/skills/vercel-deploy/INDEX.md +276 -0
- package/skills/vercel-deploy/INTEGRATION.md +328 -0
- package/skills/vercel-deploy/MANIFEST.md +310 -0
- package/skills/vercel-deploy/README.md +65 -0
- package/skills/vercel-deploy/SKILL.md +356 -0
- package/skills/vercel-deploy/deploy.sh +298 -0
- package/skills/vercel-deploy/estado.json.example +205 -0
- package/skills/vercel-deploy/skill.yaml +323 -0
- package/skills/vercel-deploy/vercel-deploy.sh +216 -0
- package/skills/wireframe-mvp/SKILL.md +157 -0
- package/docs/EJEMPLO-PRACTICA.md +0 -383
- 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
- /package/skills/{compresion-tokens.md → compresion-tokens/SKILL.md} +0 -0
- /package/skills/{constitucion-constraint.md → constitucion-constraint/SKILL.md} +0 -0
- /package/skills/{deteccion-stack.md → deteccion-stack/SKILL.md} +0 -0
- /package/skills/{enrutador-agentes.md → enrutador-agentes/SKILL.md} +0 -0
- /package/skills/{gestion-estado.md → gestion-estado/SKILL.md} +0 -0
- /package/skills/{indexador.md → indexador/SKILL.md} +0 -0
- /package/skills/{validacion-spec.md → validacion-spec/SKILL.md} +0 -0
- /package/skills/{verificador-implementacion.md → verificador-implementacion/SKILL.md} +0 -0
|
@@ -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
|
|
@@ -42,11 +42,94 @@ cat .sdd/memoria/constitucion.md
|
|
|
42
42
|
| `fase A` | **Por fase**: solo las tareas de la Fase A |
|
|
43
43
|
| `revisar` | **Revisión**: invocar revisor sobre tareas completadas |
|
|
44
44
|
|
|
45
|
-
## PASO 3 —
|
|
45
|
+
## PASO 3 — Gate Humano (aprobación antes de ejecutar)
|
|
46
|
+
|
|
47
|
+
Antes de tocar cualquier archivo, muestra este resumen al usuario y espera confirmación:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
51
|
+
🏗️ PLAN DE IMPLEMENTACIÓN — {SPEC_ID}
|
|
52
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
53
|
+
|
|
54
|
+
📋 Tareas en cola: [N] tareas
|
|
55
|
+
🤖 Agentes que activarán: [lista única de agentes]
|
|
56
|
+
📁 Archivos a modificar: [lista de rutas, deducida de tareas.md]
|
|
57
|
+
⏱️ Tiempo estimado: [S: <15min / M: 15-45min / L: >45min]
|
|
58
|
+
💡 Modo de ejecución: [PTC paralelo / Secuencial]
|
|
59
|
+
|
|
60
|
+
⚡ Nivel de esfuerzo recomendado: [según agentes activos]
|
|
61
|
+
• Si hay agentes OPUS (arquitecto/critico/seguridad/asesor-datos):
|
|
62
|
+
Escribe `/effort xhigh` en Claude Code antes de responder sí.
|
|
63
|
+
• Si solo hay agentes SONNET: `/effort medium` (o el default está bien)
|
|
64
|
+
• Si solo hay agentes HAIKU: `/effort low`
|
|
65
|
+
Puedes ignorar esto si ya lo configuraste o si prefieres el default.
|
|
66
|
+
|
|
67
|
+
¿Procedo con la implementación?
|
|
68
|
+
→ Responde **sí** para comenzar
|
|
69
|
+
→ Responde **editar** para ajustar tareas antes
|
|
70
|
+
→ Responde **cancelar** para salir
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Bypass automático** (no pide confirmación) cuando:
|
|
74
|
+
- La variable de entorno `SDD_AUTO=1` está definida
|
|
75
|
+
- El argumento incluye la palabra `forzar` (ej: `/sdd.implementar forzar`)
|
|
76
|
+
- El modo es `continuar` (ya hubo confirmación previa)
|
|
77
|
+
|
|
78
|
+
Si el usuario responde `editar` → detente y ofrece abrir `tareas.md` con un editor.
|
|
79
|
+
Si responde `cancelar` → detente con mensaje: "Implementación cancelada. Cuando quieras continuar: `/sdd.implementar`"
|
|
80
|
+
|
|
81
|
+
## PASO 3.5 — Crear TODO list para visualización
|
|
46
82
|
|
|
47
83
|
Usa `TodoWrite` para mostrar el progreso en tiempo real al usuario. Crea un TODO por tarea pendiente.
|
|
48
84
|
|
|
49
|
-
## PASO
|
|
85
|
+
## PASO 4 — Model routing (asignación de modelo por agente)
|
|
86
|
+
|
|
87
|
+
Antes de despachar cada agente, aplica esta tabla de routing. El modelo correcto se inyecta en el prompt del agente:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
ROUTING DE MODELOS:
|
|
91
|
+
|
|
92
|
+
Grupo OPUS (decisiones de alto impacto, razonamiento extendido):
|
|
93
|
+
→ arquitecto, critico, seguridad, asesor-datos
|
|
94
|
+
→ Modelo: claude-opus-4-8
|
|
95
|
+
|
|
96
|
+
Grupo SONNET (implementación estándar, análisis medio):
|
|
97
|
+
→ desarrollador-backend, desarrollador-frontend, tester
|
|
98
|
+
→ desarrollador-mobile, operaciones, disenador-api, revisor
|
|
99
|
+
→ Modelo: claude-sonnet-4-6
|
|
100
|
+
|
|
101
|
+
Grupo HAIKU (búsqueda, resumen, tareas de baja complejidad):
|
|
102
|
+
→ investigador, documentador
|
|
103
|
+
→ Modelo: claude-haiku-4-5-20251001
|
|
104
|
+
|
|
105
|
+
Override: si userConfig.modelo_principal está definido en plugin.json,
|
|
106
|
+
aplícalo solo al Grupo OPUS (respeta preferencia del usuario para
|
|
107
|
+
decisiones críticas sin afectar el costo de tareas rutinarias).
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## PASO 4.5 — Planificación PTC (Programmatic Tool Calling) + revisión paralela
|
|
111
|
+
|
|
112
|
+
Antes de ejecutar, clasifica las tareas seleccionadas según la skill `orquestacion-ptc`.
|
|
113
|
+
|
|
114
|
+
**Revisión paralela post-implementación (B3):** Al terminar todas las tareas de implementación, si la spec toca áreas sensibles (auth, datos, APIs externas, seguridad), despacha revisor + crítico + seguridad en paralelo con PTC — los tres reciben el mismo diff y sus reportes se agregan en el reporte final. Esto es más barato que invocarlos secuencialmente.
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
// PTC revisión paralela (solo si la spec toca áreas sensibles)
|
|
118
|
+
const revisores = [
|
|
119
|
+
{ agente: "revisor", prompt: promptRevision(diff, spec, plan) },
|
|
120
|
+
{ agente: "critico", prompt: promptCritico(diff, spec, plan) },
|
|
121
|
+
{ agente: "seguridad", prompt: promptSeguridad(diff, spec) },
|
|
122
|
+
];
|
|
123
|
+
const reportes = await Promise.all(
|
|
124
|
+
revisores.map(r => Task(r.agente, r.prompt))
|
|
125
|
+
);
|
|
126
|
+
// Agregar solo veredictos + hallazgos bloqueantes
|
|
127
|
+
return reportes.map((r, i) => ({
|
|
128
|
+
agente: revisores[i].agente,
|
|
129
|
+
veredicto: r.veredicto, // APROBADO | OBSERVACIONES | RECHAZADO
|
|
130
|
+
bloqueantes: r.bloqueantes, // array de strings, vacío si no hay
|
|
131
|
+
}));
|
|
132
|
+
```
|
|
50
133
|
|
|
51
134
|
Antes de ejecutar, clasifica las tareas seleccionadas según la skill `orquestacion-ptc`:
|
|
52
135
|
|
|
@@ -95,11 +178,11 @@ Tras el bloque PTC, **procesa las tareas del siguiente nivel del grafo** de form
|
|
|
95
178
|
|
|
96
179
|
---
|
|
97
180
|
|
|
98
|
-
## PASO
|
|
181
|
+
## PASO 5 — Ciclo por tarea
|
|
99
182
|
|
|
100
183
|
Para CADA tarea seleccionada, ejecuta este ciclo:
|
|
101
184
|
|
|
102
|
-
###
|
|
185
|
+
### 5.1 — Verificar precondiciones
|
|
103
186
|
|
|
104
187
|
```bash
|
|
105
188
|
# La tarea no debe estar completada/bloqueada
|
|
@@ -109,7 +192,7 @@ Para CADA tarea seleccionada, ejecuta este ciclo:
|
|
|
109
192
|
Si una dependencia no está completa:
|
|
110
193
|
> ⏸️ T00X depende de T00Y (no completada). Cambio el orden y ejecuto T00Y primero.
|
|
111
194
|
|
|
112
|
-
###
|
|
195
|
+
### 5.2 — Anunciar inicio
|
|
113
196
|
|
|
114
197
|
```
|
|
115
198
|
🔧 T00X — [Nombre]
|
|
@@ -121,40 +204,13 @@ Si una dependencia no está completa:
|
|
|
121
204
|
|
|
122
205
|
Marca la tarea como `en_progreso` en `.estado-tareas.json` y actualiza el TodoWrite.
|
|
123
206
|
|
|
124
|
-
###
|
|
207
|
+
### 5.3 — Hook por tarea (opcional)
|
|
125
208
|
|
|
126
209
|
```bash
|
|
127
210
|
[ -f ".sdd/hooks/antes_cada_tarea.sh" ] && bash .sdd/hooks/antes_cada_tarea.sh "$TAREA_ID"
|
|
128
211
|
```
|
|
129
212
|
|
|
130
|
-
###
|
|
131
|
-
|
|
132
|
-
**Antes de delegar al agente frontend**, verifica si la tarea es de tipo UI:
|
|
133
|
-
|
|
134
|
-
```
|
|
135
|
-
SI el agente asignado es "desarrollador-frontend"
|
|
136
|
-
O el tipo/área de la tarea contiene: ui, componente, interfaz, diseño, vista, pantalla, layout, figma:
|
|
137
|
-
|
|
138
|
-
1. Ejecuta: mcp__sdd-figma__analizar_sistema_diseño({ project_root: "." })
|
|
139
|
-
→ Guarda el perfil en contexto para el agente
|
|
140
|
-
|
|
141
|
-
2. SI la constitución o config del proyecto tiene figma_file_key definido:
|
|
142
|
-
a. Ejecuta: mcp__sdd-figma__conectar_figma({ file_key: "<key>" })
|
|
143
|
-
b. Si la tarea menciona un componente específico de Figma:
|
|
144
|
-
- mcp__sdd-figma__traer_componente({ file_key, node_id })
|
|
145
|
-
- mcp__sdd-figma__mapear_estilos({ file_key, node_id, project_root: "." })
|
|
146
|
-
c. Inyecta el resultado del mapeo en el contexto del agente
|
|
147
|
-
|
|
148
|
-
3. Si hay tokens sin mapear (matchType: "new"), avisa al usuario:
|
|
149
|
-
> ⚠️ Figma tiene [N] colores sin equivalente en el proyecto.
|
|
150
|
-
> El agente usará el valor hex directo. ¿Continuar?
|
|
151
|
-
|
|
152
|
-
SI el agente NO es frontend → salta este paso
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
> **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.
|
|
156
|
-
|
|
157
|
-
### 4.5 — Constitutional AI pre-check
|
|
213
|
+
### 5.4 — Constitutional AI pre-check
|
|
158
214
|
|
|
159
215
|
Antes de delegar al agente, extrae las restricciones de constitución relevantes para la tarea:
|
|
160
216
|
|
|
@@ -173,7 +229,7 @@ esac
|
|
|
173
229
|
|
|
174
230
|
Inyecta el resultado en el contexto del agente como **restricciones explícitas**, no como contexto de fondo.
|
|
175
231
|
|
|
176
|
-
###
|
|
232
|
+
### 5.6 — Delegar al agente
|
|
177
233
|
|
|
178
234
|
Usa la herramienta `Task` para invocar al agente asignado. El agente recibe:
|
|
179
235
|
|
|
@@ -183,18 +239,18 @@ Usa la herramienta `Task` para invocar al agente asignado. El agente recibe:
|
|
|
183
239
|
- Constitución
|
|
184
240
|
- Tareas ya completadas en este ciclo (contexto)
|
|
185
241
|
- Lista de archivos modificados hasta ahora
|
|
186
|
-
- **[Si es UI]** Perfil del sistema de diseño
|
|
242
|
+
- **[Si es UI]** Perfil del sistema de diseño del proyecto
|
|
187
243
|
|
|
188
244
|
El agente debe:
|
|
189
245
|
1. Leer el código existente relacionado antes de escribir
|
|
190
246
|
2. Seguir patrones del codebase actual
|
|
191
247
|
3. Implementar SOLO lo que la tarea pide
|
|
192
248
|
4. Respetar la constitución
|
|
193
|
-
5. **[Si es UI]**
|
|
249
|
+
5. **[Si es UI]** Leer el sistema de diseño local antes de generar componentes
|
|
194
250
|
6. Devolver lista de archivos modificados
|
|
195
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
|
|
196
252
|
|
|
197
|
-
###
|
|
253
|
+
### 5.7 — Checkpoint de salida + Evaluator-Optimizer
|
|
198
254
|
|
|
199
255
|
Antes de marcar la tarea como completada, verifica en dos niveles:
|
|
200
256
|
|
|
@@ -219,6 +275,35 @@ Antes de marcar la tarea como completada, verifica en dos niveles:
|
|
|
219
275
|
# Python: python -m pytest [directorio_afectado] -q
|
|
220
276
|
```
|
|
221
277
|
|
|
278
|
+
**Nivel 4 — Evaluator-Optimizer (solo para agentes del Grupo OPUS: arquitecto, critico, seguridad, asesor-datos)**
|
|
279
|
+
|
|
280
|
+
Si el agente de la tarea es del Grupo OPUS, activa el ciclo Evaluador-Optimizador:
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
CICLO EVALUADOR-OPTIMIZADOR (máx. 3 iteraciones):
|
|
284
|
+
|
|
285
|
+
1. El agente implementador entrega su output (iteración actual)
|
|
286
|
+
|
|
287
|
+
2. El agente REVISOR evalúa el output contra los CAs de la tarea:
|
|
288
|
+
- Puntúa cada CA de 0 a 10
|
|
289
|
+
- Score final = promedio
|
|
290
|
+
- Umbral de aprobación: 8/10
|
|
291
|
+
|
|
292
|
+
3. Si score ≥ 8 → PASA directamente (el output es aceptable)
|
|
293
|
+
|
|
294
|
+
4. Si score < 8 e iteraciones < 3:
|
|
295
|
+
- El revisor devuelve feedback específico al agente implementador
|
|
296
|
+
- El agente implementador mejora el output incorporando el feedback
|
|
297
|
+
- Repetir desde paso 2
|
|
298
|
+
|
|
299
|
+
5. Si score < 8 tras la 3ª iteración:
|
|
300
|
+
→ FALLA con reporte detallado (score, CAs que no pasan, razón)
|
|
301
|
+
→ No se hacen más intentos automáticos
|
|
302
|
+
|
|
303
|
+
Importante: el ciclo NO se aplica a agentes del Grupo SONNET ni HAIKU
|
|
304
|
+
para evitar consumo excesivo de tokens en tareas rutinarias.
|
|
305
|
+
```
|
|
306
|
+
|
|
222
307
|
Si cualquier nivel falla:
|
|
223
308
|
1. Marca como `bloqueada` con descripción del fallo
|
|
224
309
|
2. **NO continúa con tareas dependientes**
|
|
@@ -230,7 +315,7 @@ Si cualquier nivel falla:
|
|
|
230
315
|
> b) Saltar y continuar (no recomendado)
|
|
231
316
|
> c) Detener y revisar manualmente
|
|
232
317
|
|
|
233
|
-
###
|
|
318
|
+
### 5.8 — Actualizar estado
|
|
234
319
|
|
|
235
320
|
```bash
|
|
236
321
|
# .estado-tareas.json: T00X → completada
|
|
@@ -238,13 +323,13 @@ Si cualquier nivel falla:
|
|
|
238
323
|
# .sdd/estado.json: ultima_actualizacion
|
|
239
324
|
```
|
|
240
325
|
|
|
241
|
-
###
|
|
326
|
+
### 5.9 — Hook post-tarea (opcional)
|
|
242
327
|
|
|
243
328
|
```bash
|
|
244
329
|
[ -f ".sdd/hooks/despues_cada_tarea.sh" ] && bash .sdd/hooks/despues_cada_tarea.sh "$TAREA_ID"
|
|
245
330
|
```
|
|
246
331
|
|
|
247
|
-
###
|
|
332
|
+
### 5.10 — Reportar
|
|
248
333
|
|
|
249
334
|
```
|
|
250
335
|
✅ T00X completada
|
|
@@ -253,15 +338,82 @@ Si cualquier nivel falla:
|
|
|
253
338
|
[N]/[M] tareas completadas ([X]%)
|
|
254
339
|
```
|
|
255
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
|
+
|
|
256
408
|
## VALIDACIÓN DE SALIDA
|
|
257
409
|
|
|
258
|
-
El checkpoint de salida se aplica por tarea (ver paso
|
|
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.
|
|
259
411
|
|
|
260
412
|
**Condición de bloqueo**: si cualquier checkpoint individual falla y el usuario no elige continuar explícitamente, la implementación se detiene y no avanza a `/sdd.verificar`.
|
|
261
413
|
|
|
262
|
-
## PASO
|
|
414
|
+
## PASO 6 — Al terminar todas las tareas
|
|
263
415
|
|
|
264
|
-
###
|
|
416
|
+
### 6.1 — Invocar revisor
|
|
265
417
|
|
|
266
418
|
```bash
|
|
267
419
|
# Usar el agente revisor con modelo de su config (recomendado: opus)
|
|
@@ -272,7 +424,7 @@ El revisor cruza el código generado contra:
|
|
|
272
424
|
- Las decisiones del plan
|
|
273
425
|
- Los principios de la constitución
|
|
274
426
|
|
|
275
|
-
###
|
|
427
|
+
### 6.2 — Invocar tester para correr toda la suite
|
|
276
428
|
|
|
277
429
|
```bash
|
|
278
430
|
# Detectar framework de tests automáticamente y correr
|
|
@@ -284,11 +436,11 @@ npm test 2>/dev/null || pnpm test 2>/dev/null || yarn test 2>/dev/null || \
|
|
|
284
436
|
echo "NO_FRAMEWORK_DETECTADO"
|
|
285
437
|
```
|
|
286
438
|
|
|
287
|
-
###
|
|
439
|
+
### 6.3 — Invocar seguridad (si la tarea tocaba área sensible)
|
|
288
440
|
|
|
289
441
|
Auditoría automática si la implementación tocó: autenticación, manejo de datos personales, queries dinámicas, APIs externas, manejo de archivos.
|
|
290
442
|
|
|
291
|
-
## PASO
|
|
443
|
+
## PASO 7 — Reporte final exhaustivo
|
|
292
444
|
|
|
293
445
|
```markdown
|
|
294
446
|
## 📊 Implementación Completada: {ID}
|
|
@@ -342,7 +494,7 @@ Cubre: {Lista de CAs}
|
|
|
342
494
|
```
|
|
343
495
|
```
|
|
344
496
|
|
|
345
|
-
## PASO
|
|
497
|
+
## PASO 8 — Actualizar estado global
|
|
346
498
|
|
|
347
499
|
```json
|
|
348
500
|
{
|
|
@@ -356,13 +508,81 @@ Cubre: {Lista de CAs}
|
|
|
356
508
|
}
|
|
357
509
|
```
|
|
358
510
|
|
|
359
|
-
## PASO
|
|
511
|
+
## PASO 9 — Hook post-ejecución
|
|
360
512
|
|
|
361
513
|
```bash
|
|
362
514
|
[ -f ".sdd/hooks/despues_implementar.sh" ] && bash .sdd/hooks/despues_implementar.sh
|
|
363
515
|
```
|
|
364
516
|
|
|
365
|
-
## PASO
|
|
517
|
+
## PASO 10 — Deploy automático (si está configurado)
|
|
518
|
+
|
|
519
|
+
**Solo si perfil == "guiado" Y vercel configurado:**
|
|
520
|
+
|
|
521
|
+
```bash
|
|
522
|
+
# Verificar si Vercel está configurado
|
|
523
|
+
if grep -q "deploy.platform: vercel" .sdd/sdd.config.yaml; then
|
|
524
|
+
echo ""
|
|
525
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
526
|
+
echo "🚀 DESPLIEGUE AUTOMÁTICO"
|
|
527
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
528
|
+
echo ""
|
|
529
|
+
echo "✅ Tu app está lista para internet."
|
|
530
|
+
echo ""
|
|
531
|
+
echo "CHECKLIST PRE-DEPLOY:"
|
|
532
|
+
echo " ✅ Código construido y verificado"
|
|
533
|
+
echo " ✅ Tests pasando"
|
|
534
|
+
echo " ✅ Sin secretos en el código"
|
|
535
|
+
echo ""
|
|
536
|
+
echo "¿Publico tu app en internet?"
|
|
537
|
+
echo "(Responde: sí / cambio algo / después)"
|
|
538
|
+
echo ""
|
|
539
|
+
|
|
540
|
+
read -p "Tu respuesta: " DEPLOY_CHOICE
|
|
541
|
+
|
|
542
|
+
if [ "$DEPLOY_CHOICE" = "sí" ]; then
|
|
543
|
+
echo ""
|
|
544
|
+
echo "⏳ Publicando en Vercel..."
|
|
545
|
+
echo ""
|
|
546
|
+
|
|
547
|
+
# Invocar skill vercel-deploy
|
|
548
|
+
bash "$(dirname "$0")/../skills/vercel-deploy/vercel-deploy.sh" \
|
|
549
|
+
--spec-id "$SPEC_ID" \
|
|
550
|
+
--profile "guiado"
|
|
551
|
+
|
|
552
|
+
if [ $? -eq 0 ]; then
|
|
553
|
+
echo ""
|
|
554
|
+
echo "✅ ¡Tu app está en internet!"
|
|
555
|
+
echo ""
|
|
556
|
+
# Leer URL del archivo de estado de Vercel
|
|
557
|
+
VERCEL_URL=$(grep "app_url" .sdd/.vercel-deploy.json 2>/dev/null | cut -d'"' -f4)
|
|
558
|
+
if [ -n "$VERCEL_URL" ]; then
|
|
559
|
+
echo " Acceso: $VERCEL_URL"
|
|
560
|
+
echo ""
|
|
561
|
+
echo "Puedes compartir este link con quien quieras."
|
|
562
|
+
fi
|
|
563
|
+
else
|
|
564
|
+
echo ""
|
|
565
|
+
echo "⚠️ Hubo un problema publicando."
|
|
566
|
+
echo ""
|
|
567
|
+
echo "Opciones:"
|
|
568
|
+
echo " 1. Reintentar: /sdd.desplegar"
|
|
569
|
+
echo " 2. Cambiar algo: edita y ejecuta /sdd.implementar continuar"
|
|
570
|
+
echo " 3. Dejar para después: los cambios están en GitHub"
|
|
571
|
+
fi
|
|
572
|
+
elif [ "$DEPLOY_CHOICE" = "cambio algo" ]; then
|
|
573
|
+
echo ""
|
|
574
|
+
echo "✅ Esos cambios se guardarán automáticamente."
|
|
575
|
+
echo "Cuando estés listo, ejecuta: /sdd.implementar continuar"
|
|
576
|
+
else
|
|
577
|
+
echo ""
|
|
578
|
+
echo "✅ Sin problema. Cuando quieras publicar, ejecuta: /sdd.desplegar"
|
|
579
|
+
fi
|
|
580
|
+
fi
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
## PASO 11 — Siguientes pasos
|
|
366
586
|
|
|
367
587
|
```
|
|
368
588
|
🎉 Implementación terminada
|
|
@@ -370,7 +590,7 @@ Cubre: {Lista de CAs}
|
|
|
370
590
|
SIGUIENTES PASOS RECOMENDADOS:
|
|
371
591
|
/sdd.verificar — verificación final contra spec original
|
|
372
592
|
/sdd.snapshot — actualizar SNAPSHOT.md del producto
|
|
373
|
-
|
|
593
|
+
/sdd.retro — retrospectiva: qué aprendimos
|
|
374
594
|
|
|
375
595
|
¿Quieres empezar otra feature?
|
|
376
596
|
/sdd.especificar [descripción]
|