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.
- package/README.md +240 -208
- package/dist/cli.js +124 -26
- package/dist/cli.js.map +1 -1
- package/dist/core/bus.js +3 -3
- package/dist/core/bus.js.map +1 -1
- package/dist/core/catalog.d.ts +9 -1
- package/dist/core/catalog.d.ts.map +1 -1
- package/dist/core/catalog.js +77 -2
- package/dist/core/catalog.js.map +1 -1
- package/dist/core/dispatch.d.ts +1 -1
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +73 -12
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/docsync.d.ts +0 -9
- package/dist/core/docsync.d.ts.map +1 -1
- package/dist/core/docsync.js +12 -15
- package/dist/core/docsync.js.map +1 -1
- package/dist/core/factory.d.ts +16 -0
- package/dist/core/factory.d.ts.map +1 -1
- package/dist/core/factory.js +143 -0
- package/dist/core/factory.js.map +1 -1
- package/dist/core/fsx.d.ts +20 -2
- package/dist/core/fsx.d.ts.map +1 -1
- package/dist/core/fsx.js +10 -6
- package/dist/core/fsx.js.map +1 -1
- package/dist/core/gates.d.ts +23 -1
- package/dist/core/gates.d.ts.map +1 -1
- package/dist/core/gates.js +83 -8
- package/dist/core/gates.js.map +1 -1
- package/dist/core/leases.d.ts.map +1 -1
- package/dist/core/leases.js +4 -1
- package/dist/core/leases.js.map +1 -1
- package/dist/core/mesa.d.ts +1 -6
- package/dist/core/mesa.d.ts.map +1 -1
- package/dist/core/mesa.js +1 -6
- package/dist/core/mesa.js.map +1 -1
- package/dist/core/office.d.ts +3 -29
- package/dist/core/office.d.ts.map +1 -1
- package/dist/core/office.js +77 -90
- package/dist/core/office.js.map +1 -1
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +6 -1
- package/dist/core/paths.js.map +1 -1
- package/dist/core/retry.d.ts +2 -8
- package/dist/core/retry.d.ts.map +1 -1
- package/dist/core/retry.js +3 -34
- package/dist/core/retry.js.map +1 -1
- package/dist/core/roster.js +3 -3
- package/dist/core/roster.js.map +1 -1
- package/dist/core/sandbox.d.ts +38 -1
- package/dist/core/sandbox.d.ts.map +1 -1
- package/dist/core/sandbox.js +119 -15
- package/dist/core/sandbox.js.map +1 -1
- package/dist/core/state.d.ts +2 -2
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +5 -33
- package/dist/core/state.js.map +1 -1
- package/dist/core/stores.d.ts +3 -13
- package/dist/core/stores.d.ts.map +1 -1
- package/dist/core/stores.js +8 -32
- package/dist/core/stores.js.map +1 -1
- package/dist/core/systemPrompt.js +1 -1
- package/dist/core/systemPrompt.js.map +1 -1
- package/dist/core/tripwire.d.ts +22 -8
- package/dist/core/tripwire.d.ts.map +1 -1
- package/dist/core/tripwire.js +71 -26
- package/dist/core/tripwire.js.map +1 -1
- package/dist/core/types.d.ts +6 -14
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +11 -3
- package/dist/core/types.js.map +1 -1
- package/dist/hooks/scopeGuard.d.ts +15 -1
- package/dist/hooks/scopeGuard.d.ts.map +1 -1
- package/dist/hooks/scopeGuard.js +88 -73
- package/dist/hooks/scopeGuard.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -59
- package/dist/tools/index.js.map +1 -1
- package/dist/v1.d.ts.map +1 -1
- package/dist/v1.js +30 -36
- package/dist/v1.js.map +1 -1
- package/dist/v2.d.ts.map +1 -1
- package/dist/v2.js +22 -41
- package/dist/v2.js.map +1 -1
- package/docs/GARANTIAS.md +2 -2
- package/docs/PRUEBA-E2E.md +4 -4
- package/docs/QUE-ES.md +4 -5
- package/docs/SEGURIDAD-REPO.md +83 -0
- package/docs/assets/banner.svg +42 -0
- package/docs/catalog-facts.json +3 -3
- package/docs/superpowers/specs/2026-10-29-factory-skill-creator-and-remove-budget.md +182 -0
- 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
|
|
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": ">=
|
|
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": "
|
|
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.
|
|
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": "^
|
|
98
|
+
"@vitest/coverage-v8": "^5.0.5",
|
|
98
99
|
"tsx": "^4.20.3",
|
|
99
100
|
"typescript": "^5.8.2",
|
|
100
|
-
"vitest": "^
|
|
101
|
+
"vitest": "^5.0.5"
|
|
102
|
+
},
|
|
103
|
+
"overrides": {
|
|
104
|
+
"toml": "^5.0.1",
|
|
105
|
+
"effect": "^4.0.0-rc.118"
|
|
101
106
|
}
|
|
102
107
|
}
|