zugzbot 1.0.18 → 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.
- package/.opencode/agents/sdd-coder.md +37 -5
- package/.opencode/agents/sdd-deployer.md +4 -1
- package/.opencode/agents/sdd-orchestrator.md +33 -12
- package/.opencode/agents/sdd-reviewer.md +53 -0
- package/.opencode/agents/sdd-spec-writer.md +14 -2
- package/.opencode/agents/sdd-tester.md +27 -4
- package/.opencode/commands/fast.md +19 -0
- package/.opencode/commands/reset.md +1 -1
- package/.opencode/commands/review.md +18 -0
- package/.opencode/contract-schema.json +8 -3
- package/.opencode/plugins/sdd-bridge.ts +96 -1
- package/.opencode/tools/brain.ts +26 -15
- package/.opencode/tools/fast-track-init.js +36 -0
- package/.opencode/tools/sdd_bootstrap.ts +625 -0
- package/.opencode/tools/sdd_core.ts +673 -0
- package/.opencode/tools/sdd_design.ts +303 -0
- package/.opencode/tools/sdd_docker.ts +254 -0
- package/.opencode/tools/sdd_network.ts +152 -0
- package/.opencode/tools/sdd_testing.ts +362 -0
- package/opencode.json +0 -108
- package/package.json +1 -1
- package/tui.json +9 -1
- package/.opencode/tools/sdd.ts +0 -2072
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Implementa
|
|
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).
|
|
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`)
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
-
|
|
52
|
-
-
|
|
53
|
-
|
|
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
|
|
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
|
-
-
|
|
62
|
-
-
|
|
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.
|
|
67
|
-
2.
|
|
68
|
-
3.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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/
|
|
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.
|
|
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 =
|
|
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) {
|
package/.opencode/tools/brain.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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
|
})
|