oficina-opencode 3.0.5 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +240 -208
  2. package/dist/cli.js +124 -26
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/bus.js +3 -3
  5. package/dist/core/bus.js.map +1 -1
  6. package/dist/core/catalog.d.ts +9 -1
  7. package/dist/core/catalog.d.ts.map +1 -1
  8. package/dist/core/catalog.js +77 -2
  9. package/dist/core/catalog.js.map +1 -1
  10. package/dist/core/dispatch.d.ts +1 -1
  11. package/dist/core/dispatch.d.ts.map +1 -1
  12. package/dist/core/dispatch.js +73 -12
  13. package/dist/core/dispatch.js.map +1 -1
  14. package/dist/core/docsync.d.ts +0 -9
  15. package/dist/core/docsync.d.ts.map +1 -1
  16. package/dist/core/docsync.js +12 -15
  17. package/dist/core/docsync.js.map +1 -1
  18. package/dist/core/factory.d.ts +16 -0
  19. package/dist/core/factory.d.ts.map +1 -1
  20. package/dist/core/factory.js +143 -0
  21. package/dist/core/factory.js.map +1 -1
  22. package/dist/core/fsx.d.ts +20 -2
  23. package/dist/core/fsx.d.ts.map +1 -1
  24. package/dist/core/fsx.js +10 -6
  25. package/dist/core/fsx.js.map +1 -1
  26. package/dist/core/gates.d.ts +23 -1
  27. package/dist/core/gates.d.ts.map +1 -1
  28. package/dist/core/gates.js +83 -8
  29. package/dist/core/gates.js.map +1 -1
  30. package/dist/core/leases.d.ts.map +1 -1
  31. package/dist/core/leases.js +4 -1
  32. package/dist/core/leases.js.map +1 -1
  33. package/dist/core/mesa.d.ts +1 -6
  34. package/dist/core/mesa.d.ts.map +1 -1
  35. package/dist/core/mesa.js +1 -6
  36. package/dist/core/mesa.js.map +1 -1
  37. package/dist/core/office.d.ts +3 -29
  38. package/dist/core/office.d.ts.map +1 -1
  39. package/dist/core/office.js +77 -90
  40. package/dist/core/office.js.map +1 -1
  41. package/dist/core/paths.d.ts.map +1 -1
  42. package/dist/core/paths.js +6 -1
  43. package/dist/core/paths.js.map +1 -1
  44. package/dist/core/retry.d.ts +2 -8
  45. package/dist/core/retry.d.ts.map +1 -1
  46. package/dist/core/retry.js +3 -34
  47. package/dist/core/retry.js.map +1 -1
  48. package/dist/core/roster.js +3 -3
  49. package/dist/core/roster.js.map +1 -1
  50. package/dist/core/sandbox.d.ts +38 -1
  51. package/dist/core/sandbox.d.ts.map +1 -1
  52. package/dist/core/sandbox.js +119 -15
  53. package/dist/core/sandbox.js.map +1 -1
  54. package/dist/core/state.d.ts +2 -2
  55. package/dist/core/state.d.ts.map +1 -1
  56. package/dist/core/state.js +5 -33
  57. package/dist/core/state.js.map +1 -1
  58. package/dist/core/stores.d.ts +3 -13
  59. package/dist/core/stores.d.ts.map +1 -1
  60. package/dist/core/stores.js +8 -32
  61. package/dist/core/stores.js.map +1 -1
  62. package/dist/core/systemPrompt.js +1 -1
  63. package/dist/core/systemPrompt.js.map +1 -1
  64. package/dist/core/tripwire.d.ts +22 -8
  65. package/dist/core/tripwire.d.ts.map +1 -1
  66. package/dist/core/tripwire.js +71 -26
  67. package/dist/core/tripwire.js.map +1 -1
  68. package/dist/core/types.d.ts +6 -14
  69. package/dist/core/types.d.ts.map +1 -1
  70. package/dist/core/types.js +11 -3
  71. package/dist/core/types.js.map +1 -1
  72. package/dist/hooks/scopeGuard.d.ts +15 -1
  73. package/dist/hooks/scopeGuard.d.ts.map +1 -1
  74. package/dist/hooks/scopeGuard.js +88 -73
  75. package/dist/hooks/scopeGuard.js.map +1 -1
  76. package/dist/tools/index.d.ts.map +1 -1
  77. package/dist/tools/index.js +3 -59
  78. package/dist/tools/index.js.map +1 -1
  79. package/dist/v1.d.ts.map +1 -1
  80. package/dist/v1.js +30 -36
  81. package/dist/v1.js.map +1 -1
  82. package/dist/v2.d.ts.map +1 -1
  83. package/dist/v2.js +22 -41
  84. package/dist/v2.js.map +1 -1
  85. package/docs/GARANTIAS.md +2 -2
  86. package/docs/PRUEBA-E2E.md +4 -4
  87. package/docs/QUE-ES.md +4 -5
  88. package/docs/SEGURIDAD-REPO.md +83 -0
  89. package/docs/assets/banner.svg +42 -0
  90. package/docs/catalog-facts.json +3 -3
  91. package/docs/superpowers/specs/2026-10-29-factory-skill-creator-and-remove-budget.md +182 -0
  92. package/package.json +11 -6
@@ -0,0 +1,182 @@
1
+ # Plan: Factory Auto-Crea Skills Persistentes + Eliminación Total del Sistema de Coste/Límites
2
+
3
+ ## Objetivo
4
+ 1. **Factory → Skill Creator automático**: Cuando el despacho no encuentra match (cobertura < 30%), en vez de fabricar un rol efímero de corrida, **invoca la lógica de `agency-agent-creator` para generar un archivo de agente persistente** en `<projectRoot>/.opencode/agents/<slug>.md` con la plantilla de 10 secciones Agency-Agents, que queda disponible para futuras corridas y para invocación directa (`@oficina-...`).
5
+ 2. **Catálogo vivo**: El catálogo de matching (`catalog.ts`) debe descubrir dinámicamente los agentes creados en `.opencode/agents/` e incluirlos en futuros despachos.
6
+ 3. **Eliminar todo el sistema de coste/tokens/límites**: Borrar `cost.ts`, `oficina_cost`, `Budget`, `Limits` (maxCards, maxAgentCalls, maxSpawnsTotal, etc.), enforcement en `state.ts`, `dispatch.ts`, `office.ts`, `retry.ts`, `mesa.ts`, `docsync.ts`, `systemPrompt.ts`, `cli.ts`, `router.ts`, y tests asociados.
7
+
8
+ ---
9
+
10
+ ## Archivos a modificar
11
+
12
+ ### Fase 1: Eliminar sistema de coste/límites (breaking change)
13
+
14
+ | Archivo | Cambios |
15
+ |---|---|
16
+ | `src/core/types.ts` | Eliminar `Budget` interface, campos `maxCards`, `maxAgentCalls`, `maxSpawnsTotal` de `Limits`, campos `budget` de `OfficeState`, `Card` |
17
+ | `src/core/state.ts` | Eliminar validaciones de presupuesto en `validateState`, simplificar `migrateState` |
18
+ | `src/core/dispatch.ts` | Eliminar `maxAgents` de `DispatchOptions`, eliminar tracking de `budget`, eliminar checks de presupuesto |
19
+ | `src/core/office.ts` | Eliminar `Limits` import, eliminar checks de `maxCards`, simplificar constructor |
20
+ | `src/core/retry.ts` | Eliminar `hasBudget` o simplificar a siempre `ok: true` |
21
+ | `src/core/mesa.ts` | Eliminar display de presupuesto |
22
+ | `src/core/docsync.ts` | Eliminar `maxCards` de `CatalogFacts`, eliminar display de límites |
23
+ | `src/core/systemPrompt.ts` | Eliminar presupuesto del prompt |
24
+ | `src/core/router.ts` | Eliminar `delegateBudget` defaults |
25
+ | `src/core/factory.ts` | Eliminar `delegateBudget` de `FactoryInput` |
26
+ | `src/cli.ts` | Eliminar display de presupuesto en `status`, eliminar flags de presupuesto en comandos |
27
+ | `src/tools/index.ts` | Eliminar tool `oficina_cost`, eliminar imports de `cost.ts` |
28
+ | `src/core/cost.ts` | **ELIMINAR ARCHIVO COMPLETO** |
29
+
30
+ ### Fase 2: Factory crea agentes persistentes (skill creator automático)
31
+
32
+ | Archivo | Cambios |
33
+ |---|---|
34
+ | `src/core/factory.ts` | Nueva función `createPersistentAgentSkill()` que genera el archivo `.md` en `.opencode/agents/` usando la plantilla 10-secciones de agency-agent-creator |
35
+ | `src/core/dispatch.ts` | En `instantiateFactory`: en vez de crear `Ficha` runtime, llamar a `createPersistentAgentSkill()`, guardar archivo, y registrar en catálogo dinámico |
36
+ | `src/core/catalog.ts` | Nueva función `loadDynamicAgents()` que escanea `.opencode/agents/` y parsea capabilities del frontmatter/cuerpo |
37
+ | `src/core/catalog.ts` | `buildPanel` y `resolveRole` deben incluir agentes dinámicos en el catálogo |
38
+ | `src/core/office.ts` | Cargar catálogo dinámico al inicializar |
39
+
40
+ ### Fase 3: Tests y limpieza
41
+
42
+ | Archivo | Cambios |
43
+ |---|---|
44
+ | `tests/*.test.ts` | Actualizar tests que dependen de budget/cost/factory vieja |
45
+ | `tests/dispatch.test.ts` | Tests nuevos para factory persistente + catálogo vivo |
46
+ | `tests/catalog.test.ts` | Tests para matching con agentes dinámicos |
47
+
48
+ ---
49
+
50
+ ## Detalle técnico: Factory persistente
51
+
52
+ ### Plantilla del agente (basada en agency-agent-creator)
53
+
54
+ El archivo generado en `.opencode/agents/<slug>.md`:
55
+
56
+ ```markdown
57
+ ---
58
+ name: {{display_name}}
59
+ description: {{one_line_description}}
60
+ vibe: {{curated_vibe_mindset}}
61
+ mode: subagent
62
+ permission:
63
+ edit: allow
64
+ shell: allow
65
+ task: allow
66
+ ---
67
+
68
+ # {{display_name}} Agent Personality
69
+
70
+ You are **{{display_name}}**, a specialist in {{capabilities_list}} focused on {{mission_phrase}}.
71
+
72
+ ## Your Identity & Memory
73
+ - **Role**: Specialist in {{primary_domain}} with deep expertise in {{key_technologies}}.
74
+ - **Personality**: Direct, pragmatic, and detail-oriented.
75
+ - **Memory**: Durable disk artifacts and communication logs; never hidden session memory.
76
+ - **Experience**: Edge cases, error recovery, and security boundaries.
77
+
78
+ ## Your Core Mission
79
+ ### {{Mission_1_Title}}
80
+ {{Mission_1_Description}}
81
+
82
+ ## Critical Rules You Must Follow
83
+ 1. Scope is a hard boundary, not a suggestion. Touch only authorized files.
84
+ 2. No evidence, no work. Claims without command output (evidence.md) are hypotheses.
85
+ 3. Never review or approve your own work.
86
+ 4. Ask before guessing via the office bus (oficina_bus).
87
+ 5. Acknowledge omissions and gaps explicitly in handoff.md.
88
+
89
+ ## Your Technical Deliverables
90
+ - Clean code within assigned scope.
91
+ - handoff.md: Technical summary and decisions.
92
+ - evidence.md: Verbatim terminal output with exit codes.
93
+
94
+ ## Your Workflow Process
95
+ ### Step 1: Understand the Terrain
96
+ ### Step 2: Decide the Approach
97
+ ### Step 3: Execute Within Scope
98
+ ### Step 4: Verify and Hand Off
99
+
100
+ ## Your Communication Style
101
+ Direct, structured triage of incoming bus requests, zero ambiguity.
102
+
103
+ ## Learning & Memory
104
+ Avoid domain-specific failure modes: {{failure_modes_list}}.
105
+
106
+ ## Your Success Metrics
107
+ 1. All acceptance criteria satisfied with verifiable evidence.
108
+ 2. Gates (build, typecheck, test, security) exit 0.
109
+ 3. Zero out-of-scope files touched.
110
+
111
+ ## Advanced Capabilities
112
+ {{capability_tokens_space_separated}}
113
+ ```
114
+
115
+ ### Extracción de capabilities para matching
116
+
117
+ El catálogo necesita leer `capabilities` del agente. Opciones:
118
+ - **Frontmatter**: agregar `capabilities: [token1, token2, ...]` al YAML
119
+ - **Parsing del cuerpo**: extraer de "Advanced Capabilities" o "Your Core Mission"
120
+ - **Archivo sidecar**: `<slug>.capabilities.json` (más robusto)
121
+
122
+ **Decisión**: Agregar `capabilities` al frontmatter YAML como array. El parser del catálogo lo lee directamente.
123
+
124
+ ### Catálogo dinámico
125
+
126
+ ```typescript
127
+ // En catalog.ts
128
+ export interface DynamicAgent {
129
+ slug: string
130
+ displayName: string
131
+ description: string
132
+ capabilities: string[]
133
+ division: string // inferida del slug o "factory"
134
+ path: string // ruta al archivo .md
135
+ source: "dynamic"
136
+ }
137
+
138
+ export async function loadDynamicAgents(projectRoot: string): Promise<DynamicAgent[]> {
139
+ const agentsDir = path.join(projectRoot, ".opencode", "agents")
140
+ // leer todos los .md, parsear frontmatter, extraer capabilities
141
+ }
142
+ ```
143
+
144
+ `buildPanel` recibe `catalog: CatalogAgent[]` + `dynamicAgents: DynamicAgent[]` y los mezcla para matching.
145
+
146
+ ---
147
+
148
+ ## Orden de ejecución
149
+
150
+ 1. **Eliminar cost.ts** y tool `oficina_cost` (aislado, bajo riesgo)
151
+ 2. **Eliminar Budget/Limits** de types.ts y state.ts (core, alto riesgo - tests fallen)
152
+ 3. **Eliminar budget checks** de dispatch.ts, office.ts, retry.ts, mesa.ts, docsync.ts, systemPrompt.ts, router.ts, factory.ts, cli.ts
153
+ 4. **Tests**: arreglar tests rotos por eliminación de budget
154
+ 5. **Factory persistente**: nueva función en factory.ts + modificar instantiateFactory en dispatch.ts
155
+ 6. **Catálogo dinámico**: loadDynamicAgents en catalog.ts + integración en buildPanel/resolveRole
156
+ 7. **Tests nuevos** para factory persistente + catálogo vivo
157
+ 8. **Verificación**: `npm run typecheck && npm test` → todo verde
158
+
159
+ ---
160
+
161
+ ## Criterios de aceptación
162
+
163
+ - [ ] `npm run typecheck` exit 0
164
+ - [ ] `npm test` 100% passed (tests existentes adaptados + nuevos)
165
+ - [ ] `oficina_cost` ya no existe (tool removida)
166
+ - [ ] No hay referencias a `maxCards`, `maxAgentCalls`, `maxSpawnsTotal`, `Budget` en el código (excepto migración v1→v2)
167
+ - [ ] Dispatch sin match (<30%) crea archivo en `.opencode/agents/<slug>.md` con plantilla completa
168
+ - [ ] El agente creado aparece en futuros `oficina_dispatch` como candidato de matching
169
+ - [ ] El agente creado es invocable directamente como `@oficina-<slug>`
170
+ - [ ] `.opencode/agents/` está en `.gitignore` (ya está) pero los archivos generados son parte del repo para persistencia
171
+
172
+ ---
173
+
174
+ ## Riesgos y mitigaciones
175
+
176
+ | Riesgo | Mitigación |
177
+ |---|---|
178
+ | Tests rotos masivamente por eliminación de Budget | Ejecutar tests tras cada archivo modificado; fixes incrementales |
179
+ | Catálogo dinámico no detecta cambios en caliente | `loadDynamicAgents` se llama en cada `dispatchOffice` (no cacheado agresivamente) |
180
+ | Parsing de frontmatter frágil | Usar regex simple o librería `gray-matter` si ya está en deps; sino regex robusto |
181
+ | Agentes dinámicos sin `capabilities` en frontmatter | Validar en `createPersistentAgentSkill` que el frontmatter incluya `capabilities` |
182
+ | Migración de state v1→v2 rompe | `migrateState` ya maneja defaults; solo quitar campos de budget |
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "oficina-opencode",
3
- "version": "3.0.5",
3
+ "version": "3.1.0",
4
4
  "description": "Oficina de Agents — malla de coordinadores + peer mesh para OpenCode. Orquestación durable de subagentes con bus de mensajes en disco, roster de roles, leases, gates de calidad y escalamiento por invariantes.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "engines": {
8
- "node": ">=20"
8
+ "node": ">=22"
9
9
  },
10
10
  "main": "./dist/v2.js",
11
11
  "types": "./dist/v2.d.ts",
@@ -52,7 +52,7 @@
52
52
  "cli",
53
53
  "ai"
54
54
  ],
55
- "author": "Marcos <casselsmarcos1@gmail.com>",
55
+ "author": "SOCRAMbt <noreply@github.com>",
56
56
  "repository": {
57
57
  "type": "git",
58
58
  "url": "git+https://github.com/SOCRAMbt/AI-OFFICE.git"
@@ -80,7 +80,7 @@
80
80
  },
81
81
  "dependencies": {
82
82
  "@opencode/plugin": "^2.1.2",
83
- "zod": "4.1.8"
83
+ "zod": "^4.6.7"
84
84
  },
85
85
  "peerDependencies": {
86
86
  "@opencode-ai/plugin": "^1.15.11"
@@ -91,12 +91,17 @@
91
91
  }
92
92
  },
93
93
  "devDependencies": {
94
+ "@opencode-ai/plugin": "^1.19.5",
94
95
  "@opencode/client": "^2.1.2",
95
96
  "@opencode/plugin": "^2.1.2",
96
97
  "@types/node": "^24.12.2",
97
- "@vitest/coverage-v8": "^3.2.4",
98
+ "@vitest/coverage-v8": "^5.0.5",
98
99
  "tsx": "^4.20.3",
99
100
  "typescript": "^5.8.2",
100
- "vitest": "^3.2.4"
101
+ "vitest": "^5.0.5"
102
+ },
103
+ "overrides": {
104
+ "toml": "^5.0.1",
105
+ "effect": "^4.0.0-rc.118"
101
106
  }
102
107
  }