zugzbot-sdd 1.5.21 → 1.5.23
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/.opencode/tools/sdd_bdd_tester.js +5 -1
- package/.opencode/tools/sdd_compact_context.js +4 -1
- package/.opencode/tools/sdd_requirement_tracker.js +5 -1
- package/.opencode/tools/sdd_security_vulnerability_scanner.js +4 -1
- package/.opencode/tools/sdd_spec_validator.js +5 -7
- package/.opencode/tools/sdd_transition.js +5 -1
- package/.opencode/tools/sdd_ui_auditor.js +5 -1
- package/agents/sdd-deployer.md +29 -23
- package/agents/zugzbot.md +3 -2
- package/package.json +1 -1
- package/tools/sdd_bdd_tester.ts +5 -1
- package/tools/sdd_compact_context.ts +4 -1
- package/tools/sdd_requirement_tracker.ts +5 -1
- package/tools/sdd_security_vulnerability_scanner.ts +4 -1
- package/tools/sdd_spec_validator.ts +5 -7
- package/tools/sdd_transition.ts +5 -1
- package/tools/sdd_ui_auditor.ts +5 -1
|
@@ -30,7 +30,11 @@ export default tool({
|
|
|
30
30
|
return `[BDD Tester Blocked] Error: No hay un cambio de desarrollo activo especificado o registrado en el sdd-lock.`;
|
|
31
31
|
}
|
|
32
32
|
// 2. Localizar spec.md
|
|
33
|
-
const
|
|
33
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName);
|
|
34
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
35
|
+
if (!fs.existsSync(specPath)) {
|
|
36
|
+
specPath = path.join(changeDir, "spec.md");
|
|
37
|
+
}
|
|
34
38
|
if (!fs.existsSync(specPath)) {
|
|
35
39
|
return `[BDD Tester Blocked] Error: No se pudo localizar el archivo de especificación en '${path.relative(projectRoot, specPath)}'.`;
|
|
36
40
|
}
|
|
@@ -33,7 +33,10 @@ export default tool({
|
|
|
33
33
|
}
|
|
34
34
|
// 2. Leer artefactos individuales
|
|
35
35
|
const proposalPath = path.join(changeDir, "proposal.md");
|
|
36
|
-
|
|
36
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
37
|
+
if (!fs.existsSync(specPath)) {
|
|
38
|
+
specPath = path.join(changeDir, "spec.md");
|
|
39
|
+
}
|
|
37
40
|
const archPath = path.join(changeDir, "orchestrator_architecture.md");
|
|
38
41
|
const tasksPath = path.join(changeDir, "orchestrator_tasks.md");
|
|
39
42
|
let proposalSummary = "No disponible";
|
|
@@ -44,7 +44,11 @@ export default tool({
|
|
|
44
44
|
}, null, 2);
|
|
45
45
|
}
|
|
46
46
|
// 2. Leer spec.md
|
|
47
|
-
const
|
|
47
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName);
|
|
48
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
49
|
+
if (!fs.existsSync(specPath)) {
|
|
50
|
+
specPath = path.join(changeDir, "spec.md");
|
|
51
|
+
}
|
|
48
52
|
if (!fs.existsSync(specPath)) {
|
|
49
53
|
return JSON.stringify({
|
|
50
54
|
status: "FAILED",
|
|
@@ -14,7 +14,10 @@ export default tool({
|
|
|
14
14
|
let filesToScan = [];
|
|
15
15
|
try {
|
|
16
16
|
// Intenta obtener los archivos modificados desde la spec o diagnostics
|
|
17
|
-
|
|
17
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
18
|
+
if (!fs.existsSync(specPath)) {
|
|
19
|
+
specPath = path.join(changeDir, "spec.md");
|
|
20
|
+
}
|
|
18
21
|
if (fs.existsSync(specPath)) {
|
|
19
22
|
const specContent = fs.readFileSync(specPath, "utf-8");
|
|
20
23
|
const fileMatches = specContent.match(/`([^`\s\/]+(?:\.[a-zA-Z0-9]+)+)`/g);
|
|
@@ -26,17 +26,15 @@ export default tool({
|
|
|
26
26
|
}
|
|
27
27
|
catch (e) { }
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}, null, 2);
|
|
29
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName || "nuevo-cambio");
|
|
30
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
31
|
+
if (!fs.existsSync(specPath)) {
|
|
32
|
+
specPath = path.join(changeDir, "spec.md");
|
|
34
33
|
}
|
|
35
|
-
const specPath = path.join(projectRoot, ".openspec/changes", changeName, "specs/spec.md");
|
|
36
34
|
if (!fs.existsSync(specPath)) {
|
|
37
35
|
return JSON.stringify({
|
|
38
36
|
status: "FAILED",
|
|
39
|
-
reason: `No se encuentra el archivo de especificación
|
|
37
|
+
reason: `No se encuentra el archivo de especificación spec.md para el cambio '${changeName || "nuevo-cambio"}'. Ruta esperada: .openspec/changes/${changeName || "nuevo-cambio"}/[specs/]spec.md`
|
|
40
38
|
}, null, 2);
|
|
41
39
|
}
|
|
42
40
|
const specContent = fs.readFileSync(specPath, "utf-8");
|
|
@@ -120,7 +120,11 @@ export default tool({
|
|
|
120
120
|
}
|
|
121
121
|
catch (e) { }
|
|
122
122
|
// Extracción de checklist de tareas desde spec.md para el monitor de estados
|
|
123
|
-
const
|
|
123
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", activeChangeName);
|
|
124
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
125
|
+
if (!fs.existsSync(specPath)) {
|
|
126
|
+
specPath = path.join(changeDir, "spec.md");
|
|
127
|
+
}
|
|
124
128
|
if (fs.existsSync(specPath)) {
|
|
125
129
|
try {
|
|
126
130
|
const specContent = fs.readFileSync(specPath, "utf-8");
|
|
@@ -156,7 +156,11 @@ export default tool({
|
|
|
156
156
|
catch (e) { }
|
|
157
157
|
}
|
|
158
158
|
// B. Buscar archivos listados en el spec.md activo
|
|
159
|
-
const
|
|
159
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName);
|
|
160
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
161
|
+
if (!fs.existsSync(specPath)) {
|
|
162
|
+
specPath = path.join(changeDir, "spec.md");
|
|
163
|
+
}
|
|
160
164
|
if (fs.existsSync(specPath)) {
|
|
161
165
|
try {
|
|
162
166
|
const specContent = fs.readFileSync(specPath, "utf-8");
|
package/agents/sdd-deployer.md
CHANGED
|
@@ -17,35 +17,40 @@ permission:
|
|
|
17
17
|
- Código implementado
|
|
18
18
|
|
|
19
19
|
## DO
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
- **Estandarización del Despliegue de Desarrollo**: Tu objetivo primordial en la Fase 4 es realizar el despliegue del código sanitizado **únicamente a un entorno de desarrollo / sandbox / staging** del proyecto (ej: la versión del script de pruebas en GAS, servidor de staging local, rama de desarrollo de pruebas, o Sandbox simulado) para que el usuario pueda validarlo empíricamente.
|
|
21
|
+
- **Identificar Configuración de Desarrollo**: Inspecciona el codebase para identificar cómo compilar/subir el código de forma localizada a desarrollo:
|
|
22
|
+
- **Google Apps Script**: Si existe `.clasp.json`, valida la conexión y ejecuta de manera obligatoria `npx clasp push` (asegúrate de que está apuntando al script de desarrollo/sandbox).
|
|
23
|
+
- **Ecosistemas Web/Frontend**: Busca scripts de despliegue de desarrollo en `package.json` (como `npm run deploy`, `npm run build:dev` o `npm run deploy:dev`).
|
|
24
|
+
- **Otros Ecosistemas**: Utiliza el comando nativo de subida de pruebas o integración local.
|
|
25
|
+
- **Instalación y Diagnóstico Autocontrolado**: Si detectas que herramientas globales como `clasp` o `pio` no están instaladas o fallan en caliente, realiza una instalación local de emergencia (ej: `npm install --no-save @google/clasp` local) para no interrumpir el flujo.
|
|
26
|
+
- **Ejecutar Despliegue Físico**: Usa tu permiso de terminal (`bash`) para ejecutar el despliegue físico de desarrollo.
|
|
27
|
+
- **Verificación y Reporte de Salud**: Captura el log del despliegue y certifica que los archivos se subieron correctamente. Si el deploy falla, reintenta hasta 2 veces.
|
|
27
28
|
|
|
28
29
|
## WRITE
|
|
29
30
|
- `.openspec/changes/<change-name>/deployment_report.md`
|
|
30
31
|
|
|
31
32
|
## FORMAT (deployment_report.md)
|
|
32
33
|
```markdown
|
|
33
|
-
#
|
|
34
|
+
# Reporte de Despliegue en Entorno de Desarrollo (Fase 4)
|
|
34
35
|
|
|
35
|
-
##
|
|
36
|
-
- Comando
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
36
|
+
## 🚀 Despliegue a Desarrollo / Sandbox
|
|
37
|
+
- **Comando Ejecutado**: [ej: npx clasp push]
|
|
38
|
+
- **Entorno Destino**: [Desarrollo / Sandbox / Staging]
|
|
39
|
+
- **Estado final del deploy**: ÉXITO / FALLO
|
|
40
|
+
- **Métricas / Archivos subidos**: [Detalle del output]
|
|
40
41
|
|
|
41
|
-
## Verificación
|
|
42
|
-
- [
|
|
42
|
+
## 🔍 Enlace de Verificación de QA
|
|
43
|
+
- **Dirección de Visualización**: [Inserta URL del script de pruebas de GAS, Web App dev, o localhost para testear]
|
|
44
|
+
|
|
45
|
+
## 📋 Criterios a Validar en Caliente
|
|
46
|
+
- [ ] Validar que la interfaz se renderice correctamente en desarrollo.
|
|
47
|
+
- [ ] Validar que la lógica nueva responda sin excepciones.
|
|
43
48
|
```
|
|
44
49
|
|
|
45
50
|
## RETURN
|
|
46
|
-
- Resumen: "
|
|
51
|
+
- Resumen: "Despliegue a desarrollo completado con éxito. Listo para revisión de QA."
|
|
47
52
|
- Estado: success / error
|
|
48
|
-
- Si error: "Deploy
|
|
53
|
+
- Si error: "Deploy a desarrollo fallido: [detalles del error]"
|
|
49
54
|
|
|
50
55
|
---
|
|
51
56
|
|
|
@@ -54,13 +59,14 @@ permission:
|
|
|
54
59
|
> [!CRITICAL]
|
|
55
60
|
> LÍMITES ABSOLUTOS — ESTE AGENTE NO PUEDE:
|
|
56
61
|
|
|
57
|
-
- ❌ Editar, modificar o eliminar ningún archivo de código fuente
|
|
58
|
-
- ❌ Modificar specs, spec.md, validation_report.md o cualquier archivo en `.openspec/`
|
|
62
|
+
- ❌ Editar, modificar o eliminar ningún archivo de código fuente del proyecto
|
|
63
|
+
- ❌ Modificar specs, spec.md, validation_report.md o cualquier archivo en `.openspec/` excepto el entregable `deployment_report.md`
|
|
59
64
|
- ❌ Crear tests, suites de validación o archivos de reporte más allá del `deployment_report.md`
|
|
60
65
|
- ❌ Usar herramientas diferentes a las asignadas (`sdd_transition` únicamente)
|
|
61
|
-
- ❌ Ejecutar linters, auditorías o validaciones de código
|
|
62
|
-
- ❌ Revertir, rollbackear o deshacer cambios ya hechos
|
|
63
|
-
- ❌
|
|
66
|
+
- ❌ Ejecutar linters, auditorías o validaciones de código fuente
|
|
67
|
+
- ❌ Revertir, rollbackear o deshacer cambios ya hechos de forma no autorizada
|
|
68
|
+
- ❌ Realizar deploys a entornos de **PRODUCCIÓN** reales directamente sin aprobación manual humana (HIL)
|
|
69
|
+
- ❌ Hacer más de 3 intentos de deploy de desarrollo
|
|
64
70
|
|
|
65
71
|
> [!IMPORTANT]
|
|
66
|
-
> SÓLO DEBE hacer: ejecutar
|
|
72
|
+
> SÓLO DEBE hacer: ejecutar el despliegue al entorno de desarrollo/sandbox, verificar el output del deploy, generar `deployment_report.md` con enlaces de prueba, e invocar `sdd_transition` para detener el ciclo en espera de validación manual (HIL).
|
package/agents/zugzbot.md
CHANGED
|
@@ -103,8 +103,8 @@ Ciclo cerrado (solo si 100% tasks completed)
|
|
|
103
103
|
> [!CRITICAL]
|
|
104
104
|
> LÍMITES ABSOLUTOS — ESTE AGENTE NO PUEDE:
|
|
105
105
|
|
|
106
|
-
- ❌ Editar, crear o eliminar ningún archivo de código fuente
|
|
107
|
-
- ❌ Ejecutar comandos bash de ningún tipo
|
|
106
|
+
- ❌ Editar, crear o eliminar ningún archivo de código fuente o configuración (HTML, JS, TS, GS, CSS, JSON, etc.)
|
|
107
|
+
- ❌ Ejecutar comandos bash o terminal de ningún tipo (ej: git, npm, clasp push, pio run, etc.) — DEBE DELEGAR 100% de estas tareas a sus subagentes correspondientes según la fase activa del ciclo SDD.
|
|
108
108
|
- ❌ Ejecutar herramientas LSP de diagnóstico propio (solo delegar)
|
|
109
109
|
- ❌ Escribir specs, reports, o cualquier archivo del proyecto
|
|
110
110
|
- ❌ Modificar el lockfile `sdd-lock.json` directamente (SOLO via `sdd_transition`)
|
|
@@ -114,3 +114,4 @@ Ciclo cerrado (solo si 100% tasks completed)
|
|
|
114
114
|
> [!IMPORTANT]
|
|
115
115
|
> SÓLO DEBE hacer: leer lockfile, delegar a agente correspondiente, mostrar roadmap, verificar tareas pendientes, invocar `sdd_transition` para avanzar fases.
|
|
116
116
|
> Todos los archivos generados dentro de `.openspec/` (ej: spec.md, diagnostics.md, validation_report.md, deployment_report.md, sdd-lock.json) deben quedar impecablemente estructurados y guardados con rigurosidad profesional.
|
|
117
|
+
> Queda estrictamente PROHIBIDO al orquestador realizar tareas de codificación, testeo, o despliegue por sí mismo. Su rol es puramente de coordinación estratégica y toma de decisiones.
|
package/package.json
CHANGED
package/tools/sdd_bdd_tester.ts
CHANGED
|
@@ -33,7 +33,11 @@ export default tool({
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// 2. Localizar spec.md
|
|
36
|
-
const
|
|
36
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName);
|
|
37
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
38
|
+
if (!fs.existsSync(specPath)) {
|
|
39
|
+
specPath = path.join(changeDir, "spec.md");
|
|
40
|
+
}
|
|
37
41
|
if (!fs.existsSync(specPath)) {
|
|
38
42
|
return `[BDD Tester Blocked] Error: No se pudo localizar el archivo de especificación en '${path.relative(projectRoot, specPath)}'.`;
|
|
39
43
|
}
|
|
@@ -37,7 +37,10 @@ export default tool({
|
|
|
37
37
|
|
|
38
38
|
// 2. Leer artefactos individuales
|
|
39
39
|
const proposalPath = path.join(changeDir, "proposal.md");
|
|
40
|
-
|
|
40
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
41
|
+
if (!fs.existsSync(specPath)) {
|
|
42
|
+
specPath = path.join(changeDir, "spec.md");
|
|
43
|
+
}
|
|
41
44
|
const archPath = path.join(changeDir, "orchestrator_architecture.md");
|
|
42
45
|
const tasksPath = path.join(changeDir, "orchestrator_tasks.md");
|
|
43
46
|
|
|
@@ -47,7 +47,11 @@ export default tool({
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
// 2. Leer spec.md
|
|
50
|
-
const
|
|
50
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName);
|
|
51
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
52
|
+
if (!fs.existsSync(specPath)) {
|
|
53
|
+
specPath = path.join(changeDir, "spec.md");
|
|
54
|
+
}
|
|
51
55
|
if (!fs.existsSync(specPath)) {
|
|
52
56
|
return JSON.stringify({
|
|
53
57
|
status: "FAILED",
|
|
@@ -17,7 +17,10 @@ export default tool({
|
|
|
17
17
|
|
|
18
18
|
try {
|
|
19
19
|
// Intenta obtener los archivos modificados desde la spec o diagnostics
|
|
20
|
-
|
|
20
|
+
let specPath = path.join(changeDir, "specs/spec.md")
|
|
21
|
+
if (!fs.existsSync(specPath)) {
|
|
22
|
+
specPath = path.join(changeDir, "spec.md")
|
|
23
|
+
}
|
|
21
24
|
if (fs.existsSync(specPath)) {
|
|
22
25
|
const specContent = fs.readFileSync(specPath, "utf-8")
|
|
23
26
|
const fileMatches = specContent.match(/`([^`\s\/]+(?:\.[a-zA-Z0-9]+)+)`/g)
|
|
@@ -28,18 +28,16 @@ export default tool({
|
|
|
28
28
|
} catch (e) {}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}, null, 2);
|
|
31
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName || "nuevo-cambio");
|
|
32
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
33
|
+
if (!fs.existsSync(specPath)) {
|
|
34
|
+
specPath = path.join(changeDir, "spec.md");
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
const specPath = path.join(projectRoot, ".openspec/changes", changeName, "specs/spec.md");
|
|
39
37
|
if (!fs.existsSync(specPath)) {
|
|
40
38
|
return JSON.stringify({
|
|
41
39
|
status: "FAILED",
|
|
42
|
-
reason: `No se encuentra el archivo de especificación
|
|
40
|
+
reason: `No se encuentra el archivo de especificación spec.md para el cambio '${changeName || "nuevo-cambio"}'. Ruta esperada: .openspec/changes/${changeName || "nuevo-cambio"}/[specs/]spec.md`
|
|
43
41
|
}, null, 2);
|
|
44
42
|
}
|
|
45
43
|
|
package/tools/sdd_transition.ts
CHANGED
|
@@ -129,7 +129,11 @@ export default tool({
|
|
|
129
129
|
} catch (e) {}
|
|
130
130
|
|
|
131
131
|
// Extracción de checklist de tareas desde spec.md para el monitor de estados
|
|
132
|
-
const
|
|
132
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", activeChangeName);
|
|
133
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
134
|
+
if (!fs.existsSync(specPath)) {
|
|
135
|
+
specPath = path.join(changeDir, "spec.md");
|
|
136
|
+
}
|
|
133
137
|
if (fs.existsSync(specPath)) {
|
|
134
138
|
try {
|
|
135
139
|
const specContent = fs.readFileSync(specPath, "utf-8");
|
package/tools/sdd_ui_auditor.ts
CHANGED
|
@@ -153,7 +153,11 @@ export default tool({
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
// B. Buscar archivos listados en el spec.md activo
|
|
156
|
-
const
|
|
156
|
+
const changeDir = path.join(projectRoot, ".openspec/changes", changeName);
|
|
157
|
+
let specPath = path.join(changeDir, "specs/spec.md");
|
|
158
|
+
if (!fs.existsSync(specPath)) {
|
|
159
|
+
specPath = path.join(changeDir, "spec.md");
|
|
160
|
+
}
|
|
157
161
|
if (fs.existsSync(specPath)) {
|
|
158
162
|
try {
|
|
159
163
|
const specContent = fs.readFileSync(specPath, "utf-8");
|