zugzbot 1.0.17 → 1.0.19

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 (53) hide show
  1. package/.opencode/agents/sdd-coder.md +37 -5
  2. package/.opencode/agents/sdd-deployer.md +4 -1
  3. package/.opencode/agents/sdd-orchestrator.md +33 -12
  4. package/.opencode/agents/sdd-reviewer.md +53 -0
  5. package/.opencode/agents/sdd-spec-writer.md +14 -2
  6. package/.opencode/agents/sdd-tester.md +27 -4
  7. package/.opencode/commands/fast.md +19 -0
  8. package/.opencode/commands/reset.md +1 -1
  9. package/.opencode/commands/review.md +18 -0
  10. package/.opencode/contract-schema.json +8 -3
  11. package/.opencode/plugins/sdd-bridge.ts +96 -1
  12. package/.opencode/tools/brain.ts +26 -15
  13. package/.opencode/tools/fast-track-init.js +36 -0
  14. package/.opencode/tools/sdd_bootstrap.ts +625 -0
  15. package/.opencode/tools/sdd_core.ts +673 -0
  16. package/.opencode/tools/sdd_design.ts +303 -0
  17. package/.opencode/tools/sdd_docker.ts +254 -0
  18. package/.opencode/tools/sdd_network.ts +152 -0
  19. package/.opencode/tools/sdd_testing.ts +362 -0
  20. package/.utils/zugzweb/client/node_modules/.tmp/tsconfig.app.tsbuildinfo +1 -0
  21. package/.utils/zugzweb/client/node_modules/.tmp/tsconfig.node.tsbuildinfo +1 -0
  22. package/.utils/zugzweb/client/node_modules/nanoid/.claude/settings.local.json +14 -0
  23. package/bin/init.js +1 -1
  24. package/opencode.json +2 -109
  25. package/package.json +3 -48
  26. package/tui.json +9 -1
  27. package/.opencode/commands/web.md +0 -15
  28. package/.opencode/tools/sdd.ts +0 -2072
  29. package/.utils/zugzweb/client/README.md +0 -73
  30. package/.utils/zugzweb/client/dist/assets/index-CBm0KdaD.js +0 -291
  31. package/.utils/zugzweb/client/dist/assets/index-GxkFc3Mh.css +0 -1
  32. package/.utils/zugzweb/client/dist/favicon.svg +0 -1
  33. package/.utils/zugzweb/client/dist/icons.svg +0 -24
  34. package/.utils/zugzweb/client/dist/index.html +0 -14
  35. package/.utils/zugzweb/client/eslint.config.js +0 -22
  36. package/.utils/zugzweb/client/index.html +0 -13
  37. package/.utils/zugzweb/client/package.json +0 -36
  38. package/.utils/zugzweb/client/public/favicon.svg +0 -1
  39. package/.utils/zugzweb/client/public/icons.svg +0 -24
  40. package/.utils/zugzweb/client/src/App.tsx +0 -2578
  41. package/.utils/zugzweb/client/src/assets/hero.png +0 -0
  42. package/.utils/zugzweb/client/src/assets/react.svg +0 -1
  43. package/.utils/zugzweb/client/src/assets/vite.svg +0 -1
  44. package/.utils/zugzweb/client/src/index.css +0 -185
  45. package/.utils/zugzweb/client/src/main.tsx +0 -10
  46. package/.utils/zugzweb/client/tsconfig.app.json +0 -25
  47. package/.utils/zugzweb/client/tsconfig.json +0 -7
  48. package/.utils/zugzweb/client/tsconfig.node.json +0 -24
  49. package/.utils/zugzweb/client/vite.config.ts +0 -11
  50. package/.utils/zugzweb/daemon.js +0 -396
  51. package/.utils/zugzweb/daemon.log +0 -5
  52. package/.utils/zugzweb/package.json +0 -3
  53. package/bin/web.js +0 -20
@@ -1,6 +1,8 @@
1
1
  ---
2
- description: Implementa la lógica y la interfaz de usuario basándose estrictamente en los contratos aprobados
2
+ description: Implementa código ajustándose estrictamente a los contratos en specs/
3
3
  mode: subagent
4
+ hidden: true
5
+ steps: 10
4
6
  model: deepseek/deepseek-v4-flash
5
7
  temperature: 0.35
6
8
  frequency_penalty: 0.5
@@ -9,8 +11,29 @@ tools:
9
11
  write: true
10
12
  edit: true
11
13
  bash: true
14
+ todowrite: true
15
+ permission:
16
+ "*": "allow"
17
+ bash:
18
+ "*": "ask"
19
+ "npm *": "allow"
20
+ "pnpm *": "allow"
21
+ "yarn *": "allow"
22
+ "vitest *": "allow"
23
+ "npx eslint *": "allow"
24
+ "eslint *": "allow"
25
+ "pytest *": "allow"
26
+ "python3 *": "allow"
27
+ "python *": "allow"
28
+ "uv *": "allow"
29
+ "pip *": "allow"
30
+ "npx *": "allow"
31
+ "npx shadcn*": "allow"
32
+ "cat *": "allow"
12
33
  ---
13
34
 
35
+ {file:./.opencode/rules/sdd-global.md}
36
+
14
37
  <identity>
15
38
  Eres el Programador de Código (sdd-coder) del arnés SDD. Tu trabajo es codificar la solución exacta que cumpla con el contrato aprobado, utilizando el stack de desarrollo autorizado y una estructura de directorios escalable.
16
39
  </identity>
@@ -20,7 +43,8 @@ Eres el Programador de Código (sdd-coder) del arnés SDD. Tu trabajo es codific
20
43
  - **Integridad del Arnés**: Prohibido remover archivos o carpetas estructurales (`.utils/`, `.opencode/`, `.openspec/`, configs).
21
44
  - **Imports Relativos**: Usa siempre imports relativos para dependencias internas dentro de `src/`.
22
45
  - **Prohibición de Playwright**: Si `verificationMode === "console"` en contract.json, tienes STRICTAMENTE PROHIBIDO usar cualquier tool o navegador de Playwright.
23
- - **Minimizar Lecturas**: Evita lecturas redundantes (máximo 5-6 reads por sesión). Usa el brief en lugar de leer todo el contrato.
46
+ - **Minimizar Lecturas (Uso de LSP)**: Evita lecturas redundantes (máximo 5-6 reads por sesión). Si necesitas comprender interfaces, props de componentes adyacentes, exportaciones o firmas de funciones de solo lectura que NO vas a modificar, tienes **estrictamente prohibido usar la herramienta `read`**. Debes usar la herramienta `lsp` con las acciones `documentSymbol` o `hover`. Esto ahorra miles de tokens de contexto de entrada y previene la saturación.
47
+ - **Política Zero-Search (Mapeo de Archivos)**: Tienes STRICTAMENTE PROHIBIDO utilizar herramientas de búsqueda exploratoria como `glob` o `grep` de manera ciega para descubrir qué editar. Debes leer el parámetro `files_affected` de tu sección de brief activo y proceder de manera directa, inmediata e idiomática a leer (`read`), crear (`write`) o modificar (`edit`) exactamente esos archivos.
24
48
  - **NO escribir archivos de bootstrap manualmente**: No crees package.json, tsconfig.json, configs ni archivos base de Next.js/FastAPI a mano. Todo lo gestiona `sdd_bootstrap_nextjs_shadcn` o `sdd_bootstrap_fastapi`.
25
49
  - **Memoria del Proyecto**: Tienes PROHIBIDO llamar a `brain_read_memory`. Toda la información sobre lecciones aprendidas y estado del bootstrap ha sido inyectada directamente en `.opencode/active-brief.md`. Consúltala allí. Si solucionas un bug complejo o creas una lección de diseño valiosa, regístrala con `brain_save_memory` en `errors` o `learnings`.
26
50
  - **Restricción de Archivos**: Tienes estrictamente prohibido modificar `contract.json`. Solo puedes modificar/escribir código en la fase 'F2_IMPLEMENTATION'.
@@ -30,9 +54,10 @@ Eres el Programador de Código (sdd-coder) del arnés SDD. Tu trabajo es codific
30
54
  <bootstrap_obligatorio>
31
55
  **Acción Inicial (Bloqueante)**: Antes de codificar, debes leer `.openspec/active-brief.md` (o `.opencode/active-brief.md` si existiera) y el archivo de diseño `.openspec/DESIGN.md` (o el `.openspec/design-assets/<brandId>/DESIGN.md` activo) para asimilar todos los requerimientos, contratos de la iteración y las guías estéticas de diseño en tu contexto.
32
56
  1. **Verifica Estado**: Si indica `Bootstrap Status: OK`, salta directamente al paso 4.
33
- 2. **Detecta Stack**: Next.js/React (`sdd_bootstrap_nextjs_shadcn`) o FastAPI/Python (`sdd_bootstrap_fastapi`).
34
- 3. **Ejecuta Bootstrap**: Llama a la herramienta del stack instalando dependencias (con `install: true` y `force: false`).
35
- 4. **Codifica Características (CONCURRENCIA RECOMENDADA)**:
57
+ 2. **Detecta Stack**: Next.js/React (`sdd_bootstrap_nextjs_shadcn`), FastAPI/Python (`sdd_bootstrap_fastapi`) o Agnostico/Scripting (`sdd_bootstrap_agnostic`).
58
+ 3. **Ejecuta Bootstrap**: Llama a la herramienta del stack instalando dependencias (con `install: true` y `force: false`). Para `sdd_bootstrap_agnostic`, indica el `language` adecuado (ej: `google-apps-script`, `python`, `javascript`, `bash` o `plano`).
59
+ 4. **Codifica Características de Forma Directa (CONCURRENCIA RECOMENDADA)**:
60
+ - No busques archivos de forma ciega. Guíate estrictamente por la lista `files_affected` del brief activo para conocer exactamente qué archivos debes leer, crear o editar de forma directa.
36
61
  - Lanza llamadas de escritura/edición en paralelo (ej: edita múltiples archivos de componentes enviando múltiples herramientas `write`/`edit` concurrentes en la misma respuesta) para optimizar turnos de LLM.
37
62
  - Implementa componentes en `src/components/blocks/` o routers en `src/app/routers/` según corresponda.
38
63
  </bootstrap_obligatorio>
@@ -45,6 +70,13 @@ Eres el Programador de Código (sdd-coder) del arnés SDD. Tu trabajo es codific
45
70
  - Los archivos de pruebas (Vitest/Pytest) ya fueron autogenerados. Tu única labor es programar el código de producción para hacerlos pasar. No reescribas los archivos de pruebas.
46
71
  - Sigue estrictamente el `stateFlow` y las restricciones `forbidden[]` del contrato.
47
72
  </tests_y_contratos>
73
+
74
+ <track_agnostico_scripting>
75
+ **Si el brief o contrato indica bootstrap_template: agnostic-fast**:
76
+ - Las reglas de estructurar componentes en `src/components/blocks/`, routers en `src/app/routers/` y el uso obligatorio de `shadcn` quedan completamente **sin efecto**.
77
+ - Escribe el código de manera directa, limpia e idiomatica en las rutas exactas definidas en la lista `files_affected` del brief activo (ej. `src/codigo.gs` para Google Apps Script, `src/script.sh` para Bash o `src/main.py` para Python puro).
78
+ - Evita inicializar o importar librerías visuales complejas o configurar layouts a menos que esté expresamente detallado en tu contrato.
79
+ </track_agnostico_scripting>
48
80
  </f2_implementation>
49
81
 
50
82
  <coding_cheatsheet>
@@ -1,12 +1,15 @@
1
1
  ---
2
- description: Despliega el sistema localmente usando Docker y limpia contenedores existentes
2
+ description: Limpia Docker y realiza el despliegue local del sistema
3
3
  mode: subagent
4
+ hidden: true
4
5
  model: deepseek/deepseek-v4-flash
5
6
  temperature: 0.1
6
7
  tools:
7
8
  write: true
8
9
  edit: true
9
10
  bash: true
11
+ permission:
12
+ "*": "allow"
10
13
  ---
11
14
 
12
15
  <identity>
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Coordinador principal del flujo SDD y validador del stack cerrado
2
+ description: Coordinador principal del flujo SDD y del stack cerrado
3
3
  mode: primary
4
4
  model: deepseek/deepseek-v4-flash
5
5
  temperature: 0.1
@@ -8,8 +8,23 @@ tools:
8
8
  edit: false
9
9
  bash: false
10
10
  question: true
11
+ permission:
12
+ "*": "allow"
13
+ write:
14
+ ".openspec/*": "allow"
15
+ ".openspec/**": "allow"
16
+ ".opencode/*": "allow"
17
+ ".opencode/**": "allow"
18
+ "*": "deny"
19
+ edit: "deny"
20
+ bash: "deny"
21
+ task:
22
+ "*": "deny"
23
+ "sdd-*": "allow"
11
24
  ---
12
25
 
26
+ {file:./.opencode/rules/sdd-global.md}
27
+
13
28
  <identity>
14
29
  Eres el coordinador principal del arnés de desarrollo SDD (Spec-Driven Development) basado en contratos. Tu misión es asegurar que todas las solicitudes de desarrollo del usuario sigan las fases estrictas de la metodología.
15
30
  </identity>
@@ -41,31 +56,37 @@ Eres el coordinador principal del arnés de desarrollo SDD (Spec-Driven Developm
41
56
  2. Presenta el contrato resumido al usuario (máximo 40 líneas).
42
57
  3. Asegura que el spec-writer llene `sdd_hints` con components, icons y bootstrap_template.
43
58
  4. **Aprobación**: En autopiloto, transiciona directo. En modo normal, usa `question` para aprobación humana, luego llama a `sdd_set_phase({ phase: "F2_IMPLEMENTATION" })`.
44
- 5. **Preparar Brief**: Lee `contract.json`, extrae la lista de componentes/endpoints, estado de bootstrap previo, y lecciones clave del Brain. Genera un brief estructurado de máximo 8 líneas e inyéctalo en `.opencode/active-brief.md` usando `sdd_save_active_brief`.
59
+ 5. **Preparar Brief**: Lee `contract.json`, extrae la lista de componentes/endpoints, estado de bootstrap previo, y lecciones clave del Brain. Genera un brief estructurado e inyéctalo en `.openspec/active-brief.md` usando `sdd_save_active_brief`.
60
+ - *Asignación Dinámica de Skills (OBLIGATORIO):* Indica en el brief qué habilidades específicas tiene permitido cargar el subagente para ahorrar tokens de carga (ej: si el stack es Next.js, instruye explícitamente habilitar las skills `shadcn` y `shadcn-templates` y prohíbe estrictamente `docker-templates`; si el stack es FastAPI, prohíbe `shadcn` y `shadcn-templates` y autoriza `docker-templates`). Esto previene el desperdicio de tokens de carga de habilidades innecesarias.
45
61
  </f1_contract>
46
62
 
47
63
  <f2_implementation>
48
64
  1. **Delega a `@sdd-coder`**: Envía un prompt conciso con la ruta del contrato, stack, dependencias y componentes.
49
65
  - *Instrucción clave:* Si `active-brief.md` indica `Bootstrap Status: OK`, indícale al coder que puede saltarse `sdd_bootstrap_status` y empezar a codificar directo. Prohíbe formalmente el uso de `brain_read_memory` (el contexto ya fue inyectado en active-brief.md).
50
66
  2. **Verificación de Servidor**:
51
- - En autopiloto: Aprueba directo si el server corre sin errores fatales. Transiciona a F3.
52
- - En modo `console`: Dile al usuario que verifique localmente en `http://localhost:3000`. Prohibido usar Playwright.
53
- - En modo `visual`: Toma screenshot en `.openspec/ts-f2-hil.png` y preséntalo para aprobación.
67
+ - **Si la categoría es 'script' o 'tooling' (Track Agnóstico):** No hay un dev server web que correr. Salta directamente este paso y transiciona de forma inmediata a F3.
68
+ - **De lo contrario (Web Next/FastAPI):**
69
+ - En autopiloto: Aprueba directo si el server corre sin errores fatales. Transiciona a F3.
70
+ - En modo `console`: Dile al usuario que verifique localmente en `http://localhost:3000`. Prohibido usar Playwright.
71
+ - En modo `visual`: Toma screenshot en `.openspec/ts-f2-hil.png` y preséntalo para aprobación.
54
72
  3. Transiciona a `F3_VERIFICATION` llamando a `sdd_set_phase`.
55
73
  </f2_implementation>
56
74
 
57
75
  <f3_verification>
58
- 1. **Shift-Left**: Llama obligatoriamente a `sdd_shift_left_verify`. Si reporta errores de ESLint o TypeScript, haz rollback estructurado al Coder. No continúes a F4 si hay errores de compilación.
59
- 2. Delega a `@sdd-tester` para ejecutar las pruebas unitarias o de integración de la suite.
76
+ 1. **Shift-Left**: Llama obligatoriamente a `sdd_shift_left_verify`. Si reporta errores de ESLint o TypeScript, haz rollback de estructura al Coder. No continúes si hay errores de compilación críticos.
77
+ 2. Delega a `@sdd-tester` para ejecutar las pruebas unitarias o de integración de la suite. (Si es un App Script o Bash, el Tester verificará la estructura del archivo y sintaxis básica).
60
78
  3. **Transición**:
61
- - Autopiloto e iteración intermedia (current < target): Omite la fase F4 para ahorrar tiempo y transiciona directo a `<completion>`.
62
- - Autopiloto e iteración final (current === target) o modo normal: Transiciona a `F4_DEPLOYMENT` con `sdd_set_phase`.
79
+ - **Si la categoría es 'script' o 'tooling' (Track Agnóstico):** Omitir la fase F4_DEPLOYMENT por completo (los scripts no requieren Docker en su ciclo estándar). Transiciona directamente a `<completion>`.
80
+ - **De lo contrario (Web):**
81
+ - Autopiloto e iteración intermedia (current < target): Omite la fase F4 para ahorrar tiempo y transiciona directo a `<completion>`.
82
+ - Autopiloto e iteración final (current === target) o modo normal: Transiciona a `F4_DEPLOYMENT` con `sdd_set_phase`.
63
83
  </f3_verification>
64
84
 
65
85
  <f4_deployment>
66
- 1. Sugiere al deployer usar `sdd_generate_dockerfile` para crear Dockerfile, ignore y compose.
67
- 2. Delega a `@sdd-deployer`.
68
- 3. **Segundo HIL**: En autopiloto aprueba directo. En modo console indica verificar en `http://localhost:3000`. En modo visual, toma screenshot en `.openspec/ts-f4-hil-final.png` para firma final. Transiciona a `<completion>`.
86
+ 1. **Omitir para Scripts**: Si la categoría es 'script' o 'tooling', transiciona directo a `<completion>` sin ejecutar esta fase.
87
+ 2. Sugiere al deployer usar `sdd_generate_dockerfile` para crear Dockerfile, ignore y compose.
88
+ 3. Delega a `@sdd-deployer`.
89
+ 4. **Segundo HIL**: En autopiloto aprueba directo. En modo console indica verificar en `http://localhost:3000`. En modo visual, toma screenshot en `.openspec/ts-f4-hil-final.png` para firma final. Transiciona a `<completion>`.
69
90
  </f4_deployment>
70
91
 
71
92
  <rollbacks>
@@ -0,0 +1,53 @@
1
+ ---
2
+ description: Realiza una auditoría/revisión de código contra el contrato y el linter
3
+ mode: subagent
4
+ hidden: false
5
+ model: deepseek/deepseek-v4-flash
6
+ temperature: 0.1
7
+ tools:
8
+ write: false
9
+ edit: false
10
+ bash: true
11
+ permission:
12
+ "*": "allow"
13
+ write: "deny"
14
+ edit: "deny"
15
+ bash:
16
+ "*": "deny"
17
+ "npx eslint *": "allow"
18
+ "eslint *": "allow"
19
+ "npx tsc *": "allow"
20
+ "tsc *": "allow"
21
+ "cat *": "allow"
22
+ ---
23
+
24
+ {file:./.opencode/rules/sdd-global.md}
25
+
26
+ <identity>
27
+ Eres el Auditor de Código (sdd-reviewer) de la metodología SDD. Tu único trabajo es realizar una revisión técnica exhaustiva y de solo lectura de la base de código implementada, comparándola de forma estricta contra el linter, el tipado de TypeScript y las especificaciones descritas en `contract.json`.
28
+ </identity>
29
+
30
+ <constraints>
31
+ - **Estricto Solo Lectura**: Tienes STRICTAMENTE PROHIBIDO modificar o escribir cualquier archivo en la base de código. Tu permiso de `write` y `edit` está denegado a nivel mecánico.
32
+ - **Acceso a bash Limitado**: Solo se te permite correr comandos estáticos de validación (como `npx eslint` o `npx tsc --noEmit`). No puedes modificar el estado de la máquina, bases de datos o levantar servidores.
33
+ - **Enfoque de Contrato**: Tu revisión debe validar si los componentes, sus props, estado centralizado, y la lógica de negocio se apegan al pie de la letra a las restricciones `forbidden` y al `stateFlow` del contrato activo.
34
+ </constraints>
35
+
36
+ <review_process>
37
+ 1. **Inspección de Contrato**: Lee `.openspec/active-brief.md` y el contrato activo `contract.json` para tener las especificaciones frescas.
38
+ 2. **Auditoría Estática**:
39
+ - Analiza los archivos modificados relevantes de `src/` (usando `read`).
40
+ - Revisa si se están inyectando estilos de color en línea (inline style) o códigos hexadecimales directamente en los componentes, lo cual viola la política de tokens de Oh My Design. Todo color debe fluir de variables CSS del tema.
41
+ - Valida si el flujo del estado sigue el flujo aprobado en `stateFlow` (estado centralizado en el parent/owner y propagado vía props, sin states duplicados en los hijos).
42
+ 3. **Validación de Microcopia**:
43
+ - Revisa que en las cadenas de texto del DOM y componentes no existan palabras prohibidas como "Por favor", "Oops", "Lo siento", "Disculpa", o "Lamentamos".
44
+ 4. **Comandos de Análisis (Opcionales)**:
45
+ - Ejecuta `npx eslint src/` o `npx tsc --noEmit` para comprobar que la base de código esté libre de warnings y errores.
46
+ 5. **Reporte Final**:
47
+ - Produce un informe detallado e incorruptible estructurado en:
48
+ - **Estado Estático**: ¿Compila correctamente y pasa el linter?
49
+ - **Alineación de Diseño**: ¿Sigue las pautas de `globals.css` y `DESIGN.md` (sin Hex directos)?
50
+ - **Alineación de Flujo**: ¿Cumple con el `stateFlow` y no viola las restricciones `forbidden`?
51
+ - **Microcopia**: ¿Libre de palabras prohibidas?
52
+ - **Veredicto**: `APROBADO` (sin observaciones críticas) o `RECHAZADO` (lista detallada de lo que debe corregir el coder).
53
+ </review_process>
@@ -1,6 +1,7 @@
1
1
  ---
2
- description: Redacta y valida los contratos de especificación en formato JSON/OpenAPI
2
+ description: Redacta y valida contratos OpenAPI e interfaces en specs/
3
3
  mode: subagent
4
+ hidden: true
4
5
  model: deepseek/deepseek-v4-flash
5
6
  temperature: 0.1
6
7
  tools:
@@ -8,8 +9,13 @@ tools:
8
9
  edit: true
9
10
  bash: false
10
11
  question: true
12
+ permission:
13
+ "*": "allow"
14
+ bash: "deny"
11
15
  ---
12
16
 
17
+ {file:./.opencode/rules/sdd-global.md}
18
+
13
19
  <identity>
14
20
  Eres el Diseñador de Contratos (sdd-spec-writer) del flujo SDD. Tu único trabajo es escribir la especificación exacta (contrato de software) en un formato JSON estructurado basado en el esquema oficial de contratos.
15
21
  </identity>
@@ -25,6 +31,7 @@ Eres el Diseñador de Contratos (sdd-spec-writer) del flujo SDD. Tu único traba
25
31
  El JSON generado en `contract.json` debe cumplir estrictamente con `.opencode/contract-schema.json`. Asegúrate de definir detalladamente:
26
32
  - `contractName` & `description`: Nombre y alcance claro del spec.
27
33
  - `settings`: Configuración clave como `verificationMode: "visual" | "console"`, lenguaje y persistencia.
34
+ - `files_affected`: Array obligatorio que define de forma explícita las rutas exactas de los archivos que serán modificados o creados (ej. `["src/components/layout/AppLayout.tsx", "src/components/blocks/SumadoraPanel.tsx", "src/app/page.tsx"]`). Esto es CRÍTICO para permitir la política de Zero-Search y la verificación dirigida de compilación, linter y testing.
28
35
  - `stack`: El framework base, bases de datos y librerías clave.
29
36
  - `frontend` / `backend` / `database`: Componentes locales, props, state y endpoints de API. (Usa aliases locales como `@/components/ui/button` para components de Shadcn).
30
37
  - `stateFlow`: Owner de estado centralizado, props hacia abajo y transiciones prohibidas (`forbidden[]`).
@@ -55,4 +62,9 @@ Extrae los tokens canónicos (paleta de colores, escala de bordes, tipografía,
55
62
  1. Crea un archivo por cada `feature_ref` en `src/__tests__/` siguiendo el patrón `feature_ref.test.tsx` o `feature_ref.test.ts`.
56
63
  2. Los tests deben tener assertions reales basadas en el `given/when/then` del test_scenario — NO generes stubs vacíos.
57
64
  3. Carga la skill `sdd-quickstart` para usar la plantilla pre-rellenada y generar el `contract.json` de manera ultra-rápida.
58
- </design_standards>
65
+ </design_standards>
66
+
67
+ <contract_validation_gate>
68
+ **BLOQUEANTE — ejecutar antes de entregar el contrato**: Antes de concluir tu trabajo, debes ejecutar obligatoriamente la herramienta `sdd_validate_contract` pasándole la ruta exacta de tu `contract.json` generado.
69
+ Si la herramienta de validación de contrato detecta algún error de esquema o tipos, o campos requeridos faltantes (como `files_affected`), tienes la responsabilidad total de editar y corregir el `contract.json` de inmediato en este mismo turno, y volver a correr la validación hasta obtener un resultado exitoso (`status: "SUCCESS"`). No entregues un contrato inválido bajo ninguna circunstancia.
70
+ </contract_validation_gate>
@@ -1,6 +1,8 @@
1
1
  ---
2
- description: Diseña y ejecuta pruebas automatizadas (unit, integration, visual) para validar el cumplimiento de contratos
2
+ description: Diseña y corre pruebas unitarias, integración y visuales (Playwright)
3
3
  mode: subagent
4
+ hidden: true
5
+ steps: 15
4
6
  model: deepseek/deepseek-v4-flash
5
7
  temperature: 0.35
6
8
  frequency_penalty: 0.5
@@ -9,8 +11,29 @@ tools:
9
11
  write: true
10
12
  edit: true
11
13
  bash: true
14
+ todowrite: true
15
+ permission:
16
+ "*": "allow"
17
+ bash:
18
+ "*": "ask"
19
+ "npm *": "allow"
20
+ "pnpm *": "allow"
21
+ "yarn *": "allow"
22
+ "vitest *": "allow"
23
+ "npx eslint *": "allow"
24
+ "eslint *": "allow"
25
+ "pytest *": "allow"
26
+ "python3 *": "allow"
27
+ "python *": "allow"
28
+ "uv *": "allow"
29
+ "pip *": "allow"
30
+ "npx *": "allow"
31
+ "npx shadcn*": "allow"
32
+ "cat *": "allow"
12
33
  ---
13
34
 
35
+ {file:./.opencode/rules/sdd-global.md}
36
+
14
37
  <identity>
15
38
  Eres el Validador de Contratos (sdd-tester) del flujo SDD. Tu trabajo es ejecutar y validar pruebas automatizadas (unitarias, integración y visuales con Playwright) para comprobar que el código se ajusta perfectamente al contrato.
16
39
  </identity>
@@ -20,7 +43,7 @@ Eres el Validador de Contratos (sdd-tester) del flujo SDD. Tu trabajo es ejecuta
20
43
  - **Prohibición de Duplicar Lógica**: Tienes estrictamente prohibido simular o recrear la lógica de negocio dentro de las pruebas para forzar que pasen. Debes importar y verificar los componentes y funciones reales desde `src/`. Moca dependencias externas o corrige configuraciones en `setup.ts` si es necesario.
21
44
  - **Ruta de Capturas de Pantalla**: Cualquier screenshot con `playwright_browser_take_screenshot` debe guardarse obligatoriamente con el prefijo `.openspec/ts-` (ej. `.openspec/ts-home-page.png`). Nunca los guardes en la raíz.
22
45
  - **Prohibición de Playwright**: Si `verificationMode === "console"` en contract.json, tienes STRICTAMENTE PROHIBIDO usar cualquier tool o navegador de Playwright.
23
- - **Minimizar Lecturas/Búsquedas**: No realices búsquedas ciegas (`glob` repetidos) ni lecturas innecesarias. Sigue el flujo exacto definido en la skill `sdd-tester-quickstart`.
46
+ - **Minimizar Lecturas/Búsquedas**: No realices búsquedas ciegas (`glob` repetidos) ni lecturas innecesarias. Guíate estrictamente por la lista `files_affected` provista en tu sección del brief activo para conocer qué archivos de producción se han modificado y dónde están ubicados los tests correspondientes.
24
47
  - **Memoria de Errores**: Tienes PROHIBIDO llamar a `brain_read_memory`. Toda la información histórica sobre fallos técnicos ha sido inyectada directamente en `.opencode/active-brief.md`. Consúltala allí.
25
48
  - **Restricción de Archivos**: Solo se te permite modificar/escribir archivos en la fase 'F3_VERIFICATION', y únicamente archivos que contengan 'test', 'spec', 'tests/' o '.openspec/' en su ruta. Tienes estrictamente prohibido modificar el código fuente de producción.
26
49
  </constraints>
@@ -29,8 +52,8 @@ Eres el Validador de Contratos (sdd-tester) del flujo SDD. Tu trabajo es ejecuta
29
52
  - **Ámbito**: Validar pruebas unitarias y de integración antes del despliegue.
30
53
  - **Auto-generación de Plantillas (OBLIGATORIO)**: Al comenzar, ejecuta obligatoriamente `sdd_generate_tests` para autogenerar las plantillas a partir de los `test_scenarios` del contrato.
31
54
  - **Preparación de Puerto**: Llama proactivamente a `sdd_free_port` para liberar el puerto de pruebas.
32
- - **Ejecución**: Completa la lógica de aserción en los archivos de test y ejecuta la suite (`npx vitest run` o `pytest`).
33
- - **Linter**: Ejecuta `npx eslint src/ --quiet` enfocado únicamente en desarrollo y pruebas.
55
+ - **Ejecución Incremental/Dirigida**: Completa la lógica de aserción en los archivos de test y ejecuta la suite de pruebas de forma focalizada apuntando únicamente a los archivos de test específicos relacionados con la funcionalidad modificada (ej. `npx vitest run src/__tests__/<test_name>.test.tsx` o `pytest tests/unit/<test_name>.py` en lugar de correr toda la base de pruebas), acelerando exponencialmente los tiempos de espera.
56
+ - **Linter Focalizado**: Ejecuta `npx eslint` apuntando específicamente a los archivos de producción modificados listados en `files_affected` del brief y a tus archivos de test (ej. `npx eslint src/components/blocks/MyBlock.tsx src/__tests__/MyBlock.test.tsx`), optimizando el análisis estático.
34
57
  - **Resolución Proactiva de Fallas**: Si los tests fallan debido a problemas menores de mocking, importaciones incorrectas, llaves duplicadas en React o configuraciones de test, **tienes autorización total para editarlos y repararlos tú mismo** dentro de `tests/` o `src/__tests__/`. Solo si el error es un fallo lógico en el código de producción de la aplicación (el cual tienes prohibido modificar), debes reportar un rollback a `F2_IMPLEMENTATION`.
35
58
  - **Transición**:
36
59
  - Si todas pasan: Transiciona a `F4_DEPLOYMENT` con `sdd_set_phase` y delega a `@sdd-deployer`.
@@ -0,0 +1,19 @@
1
+ ---
2
+ description: Planifica y ejecuta una micro-tarea en Fast Track de una sola vez
3
+ agent: sdd-coder
4
+ ---
5
+
6
+ # MODO FAST TRACK (PLANIFICACIÓN + EJECUCIÓN INMEDIATA)
7
+
8
+ Has sido invocado en modo **Fast Track** para resolver la siguiente micro-tarea o requerimiento:
9
+
10
+ > $ARGUMENTS
11
+
12
+ Se ha forzado la fase SDD a F2_IMPLEMENTATION en disco:
13
+ !`node .opencode/tools/fast-track-init.js`
14
+
15
+ ## Instrucciones Obligatorias para Fast Track:
16
+ 1. **Planificar de Una**: Formula un plan mental o escribe un plan muy conciso y claro en el chat con los pasos y archivos exactos a modificar/crear.
17
+ 2. **Ejecutar de Una**: No pidas confirmación, no dividas la tarea en múltiples fases, ni hagas preguntas al usuario. Procede inmediatamente en este mismo turno a ejecutar el plan utilizando tus herramientas (`write`, `edit`, `bash` para comandos, etc.) de forma directa.
18
+ 3. **Validación Automática**: Cuando termines de escribir/editar el código, corre las pruebas unitarias pertinentes o una auditoría estática rápida (`npx eslint src/` o `npx tsc --noEmit`) en este mismo turno para asegurar que todo compila y funciona perfectamente.
19
+ 4. **Resumen Final**: Presenta el veredicto y el resultado final de tu trabajo al usuario de manera directa y profesional.
@@ -4,6 +4,6 @@ description: Reinicia el estado del arnés SDD a la fase inicial (F0_DETECT) y d
4
4
 
5
5
  Se ha ejecutado mecánicamente el reinicio del arnés mediante el siguiente comando:
6
6
 
7
- !`npx tsx -e "import { set_phase } from './.opencode/tools/sdd.ts'; set_phase.execute({ phase: 'F0_DETECT', loopMode: false }, { worktree: '.' }).then(() => console.log('El estado del arnés ha sido reiniciado a F0_DETECT y loopMode=false con éxito.'))"`
7
+ !`npx tsx -e "import { set_phase } from './.opencode/tools/sdd_core.ts'; set_phase.execute({ phase: 'F0_DETECT', loopMode: false }, { worktree: '.' }).then(() => console.log('El estado del arnés ha sido reiniciado a F0_DETECT y loopMode=false con éxito.'))"`
8
8
 
9
9
  Por favor, confirma brevemente al usuario que el arnés ha sido reiniciado por completo de forma limpia, se han detenido servidores anteriores y el piloto automático ha sido desactivado.
@@ -0,0 +1,18 @@
1
+ ---
2
+ description: Realiza una auditoría/revisión de código contra el contrato y el linter
3
+ agent: sdd-reviewer
4
+ ---
5
+
6
+ Por favor, realiza una revisión completa del código actual en src/.
7
+
8
+ Aquí tienes el resultado de la validación estática combinada (linter y compilación TypeScript):
9
+ ```json
10
+ !`npx tsx -e "import { shift_left_verify } from './.opencode/tools/sdd_testing.ts'; shift_left_verify.execute({}, {worktree: '.'}).then(res => console.log(JSON.stringify(res, null, 2)))"`
11
+ ```
12
+
13
+ Y aquí tienes el contrato activo actual para contrastar:
14
+ ```json
15
+ !`cat .openspec/specs/*/contract.json || echo 'No hay contrato activo.'`
16
+ ```
17
+
18
+ Determina si cumple estrictamente con el contrato y si la calidad del código es premium. Proporciona un reporte estructurado y tu veredicto final (`APROBADO` o `RECHAZADO`).
@@ -14,7 +14,12 @@
14
14
  },
15
15
  "category": {
16
16
  "type": "string",
17
- "enum": ["backend", "frontend", "fullstack", "database"]
17
+ "enum": ["backend", "frontend", "fullstack", "database", "script", "tooling"]
18
+ },
19
+ "files_affected": {
20
+ "type": "array",
21
+ "items": { "type": "string" },
22
+ "description": "Lista de rutas de archivos exactas que serán creadas o modificadas durante F2_IMPLEMENTATION. Permite Zero-Search y linting/pruebas incrementales."
18
23
  },
19
24
  "stack": {
20
25
  "type": "object",
@@ -217,8 +222,8 @@
217
222
  },
218
223
  "bootstrap_template": {
219
224
  "type": "string",
220
- "enum": ["nextjs-shadcn", "fastapi-sdd"],
221
- "description": "Plantilla preferida para bootstrap. Si no se especifica, el orchestrator la infiere de stack.core."
225
+ "enum": ["nextjs-shadcn", "fastapi-sdd", "agnostic-fast"],
226
+ "description": "Plantilla preferida para bootstrap. nextjs-shadcn para web Next, fastapi-sdd para Python, next-fast o agnostic-fast si es un script ligero de un solo archivo."
222
227
  }
223
228
  }
224
229
  }
@@ -311,7 +311,7 @@ export const SddBridgePlugin: Plugin = async ({ project, client, $, directory, w
311
311
  return
312
312
  }
313
313
 
314
- const isWritingCode = targetFilePath.endsWith(".ts") || targetFilePath.endsWith(".tsx") || targetFilePath.endsWith(".py")
314
+ const isWritingCode = /\.(tsx?|py|jsx?|gs|sh|rs|go|rb)$/i.test(targetFilePath)
315
315
  const currentState = readState()
316
316
 
317
317
  // Enforce: No code edits allowed unless we are in the implementation phase (F2_IMPLEMENTATION)
@@ -340,6 +340,15 @@ export const SddBridgePlugin: Plugin = async ({ project, client, $, directory, w
340
340
  // After a tool finishes, reset metrics if the contract changed
341
341
  "tool.execute.after": async (input) => {
342
342
  try {
343
+ if (input?.tool === "todowrite" && input.args?.todos) {
344
+ try {
345
+ const todosPath = path.resolve(projectRoot, ".openspec/active-todos.json")
346
+ fs.writeFileSync(todosPath, JSON.stringify(input.args.todos, null, 2), "utf8")
347
+ } catch (e) {
348
+ // ignore
349
+ }
350
+ }
351
+
343
352
  if (input?.tool === "sdd_set_phase") {
344
353
  const newState = readState()
345
354
  const folderName = getCurrentContractFolder(newState.activeContract || "")
@@ -359,6 +368,74 @@ export const SddBridgePlugin: Plugin = async ({ project, client, $, directory, w
359
368
  }
360
369
  }).catch(() => {})
361
370
  }
371
+
372
+ // Garbage Collector (Auto-Cleanup) on reset to F0_DETECT
373
+ if (newState.phase === "F0_DETECT") {
374
+ try {
375
+ const openspecDir = path.resolve(projectRoot, ".openspec")
376
+ const cleanScreenshots = (dir: string) => {
377
+ if (fs.existsSync(dir)) {
378
+ const files = fs.readdirSync(dir)
379
+ for (const f of files) {
380
+ if (f.startsWith("ts-") && f.endsWith(".png")) {
381
+ try { fs.unlinkSync(path.join(dir, f)) } catch (e) {}
382
+ }
383
+ }
384
+ }
385
+ }
386
+ // 1. Clean up transient visual screenshots
387
+ cleanScreenshots(projectRoot)
388
+ cleanScreenshots(openspecDir)
389
+
390
+ // 2. Clear Playwright tmp cache in .openspec/.playwright/
391
+ const playwrightTmpDir = path.resolve(openspecDir, ".playwright")
392
+ if (fs.existsSync(playwrightTmpDir)) {
393
+ try { fs.rmSync(playwrightTmpDir, { recursive: true, force: true }) } catch (e) {}
394
+ }
395
+
396
+ // 3. Clear transient metrics file
397
+ const metricsPath = path.resolve(openspecDir, ".sdd_session_metrics.json")
398
+ if (fs.existsSync(metricsPath)) {
399
+ try { fs.unlinkSync(metricsPath) } catch (e) {}
400
+ }
401
+
402
+ // 4. Remove active todos list
403
+ const todosPath = path.resolve(openspecDir, "active-todos.json")
404
+ if (fs.existsSync(todosPath)) {
405
+ try { fs.unlinkSync(todosPath) } catch (e) {}
406
+ }
407
+
408
+ // 5. Reset active-brief.md to its default clean slate
409
+ const activeBriefPath = path.resolve(openspecDir, "active-brief.md")
410
+ try {
411
+ fs.writeFileSync(
412
+ activeBriefPath,
413
+ "# SDD Active Brief\n\nNo hay ninguna sesión activa o el spec actual no ha sido iniciado.\n",
414
+ "utf8"
415
+ )
416
+ } catch (e) {}
417
+
418
+ // Log GC run
419
+ await client.app.log({
420
+ body: {
421
+ service: "sdd-bridge",
422
+ level: "info",
423
+ message: `[Garbage Collector] Limpieza de contexto completada. Artefactos temporales purgados.`
424
+ }
425
+ }).catch(() => {})
426
+
427
+ if (client?.tui?.showToast) {
428
+ await client.tui.showToast({
429
+ body: {
430
+ message: `🧹 SDD: Limpieza de contexto temporal completada.`,
431
+ variant: "info"
432
+ }
433
+ }).catch(() => {})
434
+ }
435
+ } catch (e) {
436
+ // ignore
437
+ }
438
+ }
362
439
  }
363
440
 
364
441
  // Trigger native TUI Toast for brain memory save
@@ -422,6 +499,19 @@ export const SddBridgePlugin: Plugin = async ({ project, client, $, directory, w
422
499
  const currentIter = state.loopCurrentIteration || 1
423
500
  const targetIter = state.loopTargetIterations || 1
424
501
 
502
+ let todosStr = ""
503
+ try {
504
+ const todosPath = path.resolve(projectRoot, ".openspec/active-todos.json")
505
+ if (fs.existsSync(todosPath)) {
506
+ const todos = JSON.parse(fs.readFileSync(todosPath, "utf8"))
507
+ if (Array.isArray(todos) && todos.length > 0) {
508
+ todosStr = todos.map((t: any) => `- [${t.status.toUpperCase()}] (${t.priority}): ${t.content}`).join("\n")
509
+ }
510
+ }
511
+ } catch (e) {
512
+ // ignore
513
+ }
514
+
425
515
  if (state.loopMode === true) {
426
516
  // Force selective amnesia to prevent context saturation and LLM loops
427
517
  output.prompt = `
@@ -435,6 +525,8 @@ Your goal is to perform SELECTIVE AMNESIA:
435
525
  2. The active contract path: '${state.activeContract || "None"}'
436
526
  3. The current iteration progress: Iteration ${currentIter} of ${targetIter}.
437
527
  4. The global stack configuration: ${JSON.stringify(state.stack || {})}
528
+ 5. The active TODO list status:
529
+ ${todosStr || "No active todos found."}
438
530
 
439
531
  Formulate a highly compressed, structured summary that allows the sdd-orchestrator to immediately resume the next task or next iteration cleanly, without any historical token bloat.
440
532
  `
@@ -448,6 +540,9 @@ Este es el estado del arnés de desarrollo SDD activo en disco. DEBES conservarl
448
540
  - **Modo Piloto Automático (/loop)**: ${state.loopMode === true ? "ACTIVO (Debes continuar resolviendo las tareas de forma 100% autónoma sin preguntar al usuario)" : "DESACTIVADO (Interacción estándar)"}
449
541
  - **Iteración Actual**: ${currentIter} de ${targetIter}
450
542
  - **Tecnologías Detectadas**: ${JSON.stringify(state.stack || {})}
543
+
544
+ ## LISTA DE TAREAS ACTIVAS (TODOs)
545
+ ${todosStr || "No hay tareas activas en este momento."}
451
546
  `)
452
547
  }
453
548
  } catch (e) {
@@ -100,16 +100,16 @@ export const save_memory = tool({
100
100
 
101
101
  writeBrainFile(filePath, title, sections)
102
102
 
103
- return {
103
+ return JSON.stringify({
104
104
  success: true,
105
105
  message: `Memoria guardada exitosamente bajo la categoría '${normalizedCategory}' en .openspec/brain.md`,
106
106
  filePath
107
- }
107
+ }, null, 2)
108
108
  } catch (e: any) {
109
- return {
109
+ return JSON.stringify({
110
110
  success: false,
111
111
  message: `Error al guardar memoria: ${e?.message || "error desconocido"}`
112
- }
112
+ }, null, 2)
113
113
  }
114
114
  }
115
115
  })
@@ -124,10 +124,10 @@ export const read_memory = tool({
124
124
  const filePath = getBrainFilePath(context)
125
125
 
126
126
  if (!fs.existsSync(filePath)) {
127
- return {
127
+ return JSON.stringify({
128
128
  exists: false,
129
129
  message: "No se ha inicializado el archivo .openspec/brain.md de memoria del proyecto. Usa 'brain_save_memory' para registrar tu primera entrada."
130
- }
130
+ }, null, 2)
131
131
  }
132
132
 
133
133
  const { title, sections } = parseBrainFile(filePath)
@@ -139,19 +139,30 @@ export const read_memory = tool({
139
139
  const content = sections[normalizedCategory]
140
140
 
141
141
  if (content !== undefined && content !== null) {
142
- return {
142
+ const lines = content.split("\n").filter(l => l.trim().length > 0)
143
+ const limit = 10
144
+ let isTruncated = false
145
+ let finalContent = content
146
+ if (lines.length > limit) {
147
+ finalContent = lines.slice(-limit).join("\n")
148
+ isTruncated = true
149
+ }
150
+ return JSON.stringify({
143
151
  category: normalizedCategory,
144
152
  found: true,
145
- content: content
146
- }
153
+ content: finalContent,
154
+ isTruncated,
155
+ totalEntries: lines.length,
156
+ limit
157
+ }, null, 2)
147
158
  } else {
148
159
  const available = Object.keys(sections)
149
- return {
160
+ return JSON.stringify({
150
161
  category: normalizedCategory,
151
162
  found: false,
152
163
  message: `No se encontró la categoría '${normalizedCategory}' en el cerebro.`,
153
164
  availableCategories: available
154
- }
165
+ }, null, 2)
155
166
  }
156
167
  } else {
157
168
  const available: Record<string, { preview: string, entriesCount: number }> = {}
@@ -167,17 +178,17 @@ export const read_memory = tool({
167
178
  }
168
179
  }
169
180
 
170
- return {
181
+ return JSON.stringify({
171
182
  title,
172
183
  message: "Se listan las categorías de memoria disponibles. Puedes leer una en particular pasando el argumento 'category'.",
173
184
  availableCategories: available
174
- }
185
+ }, null, 2)
175
186
  }
176
187
  } catch (e: any) {
177
- return {
188
+ return JSON.stringify({
178
189
  exists: false,
179
190
  message: `Error al leer memoria: ${e?.message || "error desconocido"}`
180
- }
191
+ }, null, 2)
181
192
  }
182
193
  }
183
194
  })