oficina-opencode 3.0.4 → 3.0.5

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 CHANGED
@@ -16,7 +16,7 @@
16
16
  <!-- BEGIN GENERATED: facts -->
17
17
  | | |
18
18
  |---|---|
19
- | **Paquete** | `oficina-opencode` v3.0.4 |
19
+ | **Paquete** | `oficina-opencode` v3.0.5 |
20
20
  | **Tools** | 16 |
21
21
  | **Hooks** | 7 |
22
22
  | **API de plugin** | `@opencode/plugin@2.1.2` |
@@ -30,7 +30,7 @@
30
30
  > **¿Preferís la versión en humano?** → [`docs/QUE-ES.md`](https://github.com/SOCRAMbt/AI-OFFICE/blob/main/docs/QUE-ES.md) — qué es, qué hace y por qué, sin jerga.
31
31
  > **¿Preferís el porqué técnico?** → [`docs/ARCHITECTURE.md`](https://github.com/SOCRAMbt/AI-OFFICE/blob/main/docs/ARCHITECTURE.md)
32
32
 
33
- [Documentación](#arquitectura) · [Garantías](https://github.com/SOCRAMbt/AI-OFFICE/blob/main/docs/GARANTIAS.md) · [Compatibilidad](https://github.com/SOCRAMbt/AI-OFFICE/blob/main/docs/COMPATIBILITY.md) · [Instalación](#instalación) · [Uso](#uso) · [CLI](#cli-operación)
33
+ [Documentación](#arquitectura) · [Garantías](https://github.com/SOCRAMbt/AI-OFFICE/blob/main/docs/GARANTIAS.md) · [Compatibilidad](https://github.com/SOCRAMbt/AI-OFFICE/blob/main/docs/COMPATIBILITY.md) · [Prueba E2E](https://github.com/SOCRAMbt/AI-OFFICE/blob/main/docs/PRUEBA-E2E.md) · [Instalación](#instalación) · [Uso](#uso) · [CLI](#cli-operación)
34
34
 
35
35
  </div>
36
36
 
@@ -0,0 +1,479 @@
1
+ # Prueba end-to-end de AI-OFFICE
2
+
3
+ Runbook ejecutable. Cada nivel dice **qué hacer**, **qué escribir**, **qué esperás** y
4
+ **cómo lo verificás**.
5
+
6
+ Podés parar en cualquier nivel: cada uno es independiente. El veredicto final sale del
7
+ Nivel 7, que corre un solo comando.
8
+
9
+ **Tiempo total estimado:** 45-70 minutos (la mayor parte es la corrida real, Nivel 3).
10
+
11
+ ---
12
+
13
+ ## Antes de empezar
14
+
15
+ ### La regla que más importa
16
+
17
+ > **Abrí OpenCode en `C:\prueba-oficina`.**
18
+
19
+ No en `C:\Users\Marcos`. El motivo es concreto y no es obvio:
20
+
21
+ `C:\Users\Marcos` **no** es un proyecto (no tiene `package.json` ni `.git`), pero tiene
22
+ **14 subdirectorios que sí lo son**. `resolveProjectRoot` busca en los subdirectorios y,
23
+ como hay varios candidatos, elige por peso de fuentes. El resultado es aleatorio: podés
24
+ terminar en `C:\Users\Marcos\oficina-plugin` escribiendo la corrida en el repo.
25
+
26
+ Verificá dónde estás antes de abrir OpenCode:
27
+
28
+ ```powershell
29
+ cd C:\prueba-oficina
30
+ ```
31
+
32
+ ### Variables para las sesiones de PowerShell
33
+
34
+ Copiá esto en la terminal y dejalo abierto:
35
+
36
+ ```powershell
37
+ $OFICINA = "$env:USERPROFILE\.config\opencode\node_modules\.bin\oficina.cmd"
38
+ $REPO = "C:\Users\Marcos\oficina-plugin"
39
+ $PROY = "C:\prueba-oficina"
40
+ ```
41
+
42
+ > `oficina` **no está en el PATH**. Por eso la variable `$OFICINA`. Si lo querés en el
43
+ > PATH: `setx PATH "$env:PATH;$env:USERPROFILE\.config\opencode\node_modules\.bin"`.
44
+
45
+ ### Reinstalar el plugin
46
+
47
+ ```powershell
48
+ $cfg = "$env:USERPROFILE\.config\opencode"
49
+ Set-Location $cfg
50
+ npm install oficina-opencode@3.0.4 --no-audit --no-fund --prefer-online
51
+ node ".\node_modules\oficina-opencode\dist\cli.js" install --target $cfg --json
52
+ ```
53
+
54
+ **Cerrá OpenCode y volvé a abrirlo.** El plugin se carga al arrancar la sesión: si lo
55
+ reinstalás con OpenCode abierto, la sesión actual sigue con la versión vieja.
56
+
57
+ ### El proyecto de prueba ya está armado
58
+
59
+ `C:\prueba-oficina` contiene:
60
+
61
+ ```
62
+ package.json → "test": "node test/run.js"
63
+ src/ → vacío
64
+ test/run.js → runner que falla si no corrió ningún test
65
+ ```
66
+
67
+ **Por qué el runner y no `node --test` directo:** `node --test` sale con **exit 0**
68
+ aunque no encuentre un solo archivo de test:
69
+
70
+ ```
71
+ $ node --test "test/**/*.test.js"
72
+ # tests 0
73
+ exit code: 0
74
+ ```
75
+
76
+ Un gate así está **verde antes de que exista el trabajo**. `test/run.js` corrige eso:
77
+
78
+ | Escenario | Exit |
79
+ |---|---|
80
+ | sin ningún test | **1** (gate rojo) |
81
+ | test que pasa | 0 |
82
+ | test que falla | 1 |
83
+
84
+ ---
85
+
86
+ ## Nivel 0 — Salud del repo (3 min, no necesita OpenCode)
87
+
88
+ ```powershell
89
+ Set-Location $REPO
90
+ npm run typecheck
91
+ npm test
92
+ npm run build
93
+ npm run docs:check
94
+ npm run bench:selection
95
+ npm pack --dry-run
96
+ ```
97
+
98
+ | Comando | Esperado |
99
+ |---|---|
100
+ | `typecheck` | 0 errores |
101
+ | `test` | `Test Files 26 passed (26)` · `Tests 419 passed (419)` |
102
+ | `build` | sin errores |
103
+ | `docs:check` | `README.md: al dia` · `docs/QUE-ES.md: al dia` |
104
+ | `bench:selection` | `completo 71%` y le gana a `keywords 48%` y `solo-nombre 52%` |
105
+ | `pack --dry-run` | 173 archivos, ~328 KB |
106
+
107
+ > **El `docs:check` es una trampa real.** Si bumpeás la versión y no corrés
108
+ > `npm run docs:sync`, falla. Es el mecanismo de doc autogenerada funcionando.
109
+
110
+ ---
111
+
112
+ ## Nivel 1 — ¿Cargó el plugin? (2 min)
113
+
114
+ Abrí OpenCode **en `C:\prueba-oficina`** y escribí:
115
+
116
+ ```
117
+ Usá la tool `oficina_board` y mostrame el tablero de la oficina.
118
+ ```
119
+
120
+ | Respuesta | Significado |
121
+ |---|---|
122
+ | Devuelve un tablero | ✅ el plugin cargó |
123
+ | "No tengo la tool `oficina_board`" | ❌ el plugin no cargó |
124
+
125
+ Verificación en el log:
126
+
127
+ ```powershell
128
+ Get-Content "$env:USERPROFILE\.local\share\opencode\log\opencode.log" -Tail 400 |
129
+ Select-String "oficina" | Select-Object -Last 5
130
+ ```
131
+
132
+ Buscá esta línea:
133
+
134
+ ```
135
+ INFO oficina:v2: plugin inicializado {"directory":"C:\\prueba-oficina",...,"tools":16}
136
+ ```
137
+
138
+ Si aparece `failed to load plugin target=oficina`, el problema es la versión: OpenCode
139
+ v2 necesita `@opencode/plugin`, no `@opencode-ai/plugin`.
140
+
141
+ ---
142
+
143
+ ## Nivel 2 — El CLI (3 min, en un directorio aparte)
144
+
145
+ ```powershell
146
+ $scratch = "C:\scratch-oficina"
147
+ Remove-Item $scratch -Recurse -Force -ErrorAction SilentlyContinue
148
+ mkdir $scratch -Force
149
+ Set-Content "$scratch\package.json" '{ "name": "scratch" }'
150
+
151
+ & $OFICINA init "Prueba del CLI" --directory $scratch
152
+ & $OFICINA status --directory $scratch
153
+ & $OFICINA board --directory $scratch
154
+ & $OFICINA bus --directory $scratch
155
+ & $OFICINA catalog --agency-root "$env:USERPROFILE\agency-agents" | Select-Object -First 10
156
+ & $OFICINA audit T-99 --directory $scratch
157
+ & $OFICINA verify --directory $scratch
158
+ & $OFICINA reset --directory $scratch
159
+ & $OFICINA reset --directory $scratch --force
160
+ ```
161
+
162
+ | Comando | Esperado |
163
+ |---|---|
164
+ | `init` | JSON con `"ok": true`, `officeDir`, `projectRoot`, `runId` |
165
+ | `status` | `Estado: planning` · `Presupuesto: 0/20 cards` |
166
+ | `board` | tabla vacía, sin error |
167
+ | `bus` | 4 canales en 0 mensajes |
168
+ | `catalog` | lista los agentes. **Necesita `--agency-root`** (si no, "Falta --agency-root.") |
169
+ | `audit T-99` | sale con error: `No existe la card T-99.` (exit 1) |
170
+ | `verify` | sección de gates vacía, sin error |
171
+ | `reset` | **pide confirmación**: "Re-ejecutá con --force para confirmar." |
172
+ | `reset --force` | borra |
173
+
174
+ ---
175
+
176
+ ## Nivel 3 — La corrida real (el evento principal)
177
+
178
+ ### 3.1 Abrí la sesión
179
+
180
+ ```powershell
181
+ cd C:\prueba-oficina
182
+ ```
183
+
184
+ Abrí OpenCode **ahí**. En una segunda terminal dejá `$OFICINA` y `$PROY` definidos, para
185
+ poder mirar la mesa mientras corre.
186
+
187
+ ### 3.2 El objetivo — copiá esto tal cual
188
+
189
+ ```
190
+ /oficina Crear un modulo de utilidades de texto en src/texto.js con dos funciones: slugify(texto), que convierte un titulo en un slug (minusculas, sin acentos, con guiones), y contarPalabras(texto), que cuenta las palabras separadas por espacios. Los tests van en test/texto.test.js y la documentacion de la API en docs/API.md.
191
+ ```
192
+
193
+ ### 3.3 Qué mirar en los primeros 60 segundos
194
+
195
+ **a) El plan.** Tiene que ser un desglose de **3 cards**: implementación, tests,
196
+ documentación. Cada una con criteria de aceptación verificables, scope y gate. Si el
197
+ plan sale con una sola card gigante, no es un error — pero anotá que el plan fue de 1.
198
+
199
+ **b) El rol que eligió el dispatch.** Este es **el chequeo clave**.
200
+
201
+ Mirá la salida del dispatch. El rol tiene que ser coherente con las capabilities de la
202
+ card. Un rol de otro dominio es exactamente el bug que arreglé en 3.0.3 (a una card de
203
+ "utilidades de texto" le tocaba un *ServiceNow Developer Mentor*).
204
+
205
+ Si ves un rol absurdo:
206
+
207
+ ```
208
+ /oficina-stop
209
+ ```
210
+
211
+ o pedí que frene: `oficina_stop` con `action="halt"`.
212
+
213
+ Un rol **fabricado** (que no viene del catálogo) también es válido — siempre que el
214
+ despacho lo diga explícitamente. Un rol del catálogo con cobertura baja **también**,
215
+ mientras lo diga.
216
+
217
+ ### 3.4 Mientras corre — mirá la mesa
218
+
219
+ ```powershell
220
+ & $OFICINA board --directory $PROY
221
+ & $OFICINA status --directory $PROY
222
+ ```
223
+
224
+ Los estados de card posibles: `todo`, `in_progress`, `review`, `done`, `blocked`,
225
+ `escalated`.
226
+
227
+ ### 3.5 Cuando termine — el checklist
228
+
229
+ La corrida dejó esto:
230
+
231
+ ```
232
+ C:\prueba-oficina\.oficina\
233
+ state.json
234
+ roster.json
235
+ cost.json
236
+ artifacts\T-00\handoff.md
237
+ artifacts\T-00\gates.md
238
+ artifacts\T-00\evidence.md
239
+ evidence\T-00.json
240
+ ```
241
+
242
+ Y los entregables:
243
+
244
+ ```
245
+ C:\prueba-oficina\src\texto.js
246
+ C:\prueba-oficina\test\texto.test.js
247
+ C:\prueba-oficina\docs\API.md
248
+ ```
249
+
250
+ **Los 5 criterios que tiene que cumplir:**
251
+
252
+ | # | Criterio | Cómo lo verificás |
253
+ |---|---|---|
254
+ | 1 | `src/texto.js` existe y exporta las dos funciones | `node -e "console.log(Object.keys(require('C:/prueba-oficina/src/texto.js')))"` |
255
+ | 2 | `slugify` saca acentos, pasa a minúsculas y une con guiones | `node -e "const {slugify}=require('C:/prueba-oficina/src/texto.js'); console.log(slugify('Hola Mundo Ávil'))"` → `hola-mundo-avil` |
256
+ | 3 | `contarPalabras` cuenta palabras separadas por espacios | `node -e "const {contarPalabras}=require('C:/prueba-oficina/src/texto.js'); console.log(contarPalabras('uno dos tres'))"` → `3` |
257
+ | 4 | `npm test` corre la suite y sale con exit 0 | `cd C:\prueba-oficina; npm test; echo $LASTEXITCODE` → `0` |
258
+ | 5 | La evidencia incluye la **verificación negativa** | abrir `.oficina\artifacts\T-00\evidence.md` |
259
+
260
+ El punto 5 es el que más dice: la oficina tiene que **romper el código a propósito** y
261
+ comprobar que el test lo detecta. Si la evidencia solo dice "npm test pasó", la card
262
+ cerró sin probar que el test sirva.
263
+
264
+ ### 3.6 El veredicto automático
265
+
266
+ ```powershell
267
+ Set-Location $REPO
268
+ npx tsx scripts\diagnose-run.ts C:\prueba-oficina
269
+ ```
270
+
271
+ Esperado: **0 fallas**. Si hay fallas, son invariantes rotos (mirá abajo).
272
+
273
+ ---
274
+
275
+ ## Nivel 4 — Adversarial (10 min, mismo proyecto)
276
+
277
+ Cada prueba es un mensaje para OpenCode. Todas tienen una respuesta **correcta** clara.
278
+
279
+ ### 4.1 El scope se respeta de verdad
280
+
281
+ En la misma sesión (o una nueva abierta en `C:\prueba-oficina`), escribí:
282
+
283
+ ```
284
+ Toma la card T-00 con oficina_assign y despues intentá escribir un archivo nuevo README.md en la raiz del proyecto, que esta fuera del scope de la card. Decime exactamente que responde el motor.
285
+ ```
286
+
287
+ | Correcto | Incorrecto |
288
+ |---|---|
289
+ | La escritura se **rechaza** con un error de scope | El archivo `README.md` aparece en el proyecto |
290
+
291
+ Verificalo en disco:
292
+
293
+ ```powershell
294
+ Test-Path C:\prueba-oficina\README.md # tiene que dar False
295
+ ```
296
+
297
+ ### 4.2 Nadie se auto-aprueba
298
+
299
+ ```
300
+ Intentá registrar el review de la card T-00 con tu propio agentId, o sea revisarte a vos mismo. Decime que responde el motor.
301
+ ```
302
+
303
+ | Correcto | Incorrecto |
304
+ |---|---|
305
+ | El motor **rechaza**: el owner no puede ser su propio reviewer | El review queda registrado con owner == reviewer |
306
+
307
+ ### 4.3 El gate es real (rompé el código)
308
+
309
+ ```
310
+ Rompe src/texto.js a proposito, de modo que slugify devuelva siempre la cadena vacia, y corré el gate de esa card. Decime que paso.
311
+ ```
312
+
313
+ | Correcto | Incorrecto |
314
+ |---|---|
315
+ | El gate **falla** y la card vuelve a trabajo | El gate pasa en verde |
316
+
317
+ **Restaurá el código después** (o volvé a correr `/oficina` para que la oficina lo arregle).
318
+
319
+ ### 4.4 El freno de emergencia
320
+
321
+ ```
322
+ Frená la corrida con oficina_stop, y despues reanudala con action resume.
323
+ ```
324
+
325
+ | Correcto | Incorrecto |
326
+ |---|---|
327
+ | `state.json` muestra `halt` con motivo, y después queda en `null` | El freno no hace nada |
328
+
329
+ ### 4.5 El costo se lleva
330
+
331
+ ```
332
+ Mostrame el costo de la corrida con oficina_cost.
333
+ ```
334
+
335
+ Esperado: el total en USD, las llamadas y los tokens. Con tu modelo (MiniMax M3.1 Flash
336
+ Free) el USD va a ser **$0.0000** — eso es correcto, no un bug. Lo que tiene que estar
337
+ bien es el conteo de llamadas y tokens.
338
+
339
+ ---
340
+
341
+ ## Nivel 5 — Recuperación (5 min, proyecto aparte)
342
+
343
+ Esta es la prueba de **durabilidad**: que la oficina sobreviva a una muerte.
344
+
345
+ ### 5.1 Preparar y arrancar
346
+
347
+ ```powershell
348
+ $adv = "C:\prueba-oficina-adv"
349
+ Remove-Item $adv -Recurse -Force -ErrorAction SilentlyContinue
350
+ mkdir "$adv\src" -Force
351
+ mkdir "$adv\test" -Force
352
+ Copy-Item "C:\prueba-oficina\package.json" $adv
353
+ Copy-Item "C:\prueba-oficina\test\run.js" "$adv\test\run.js" -Force
354
+ cd $adv
355
+ ```
356
+
357
+ Abrí OpenCode en `C:\prueba-oficina-adv` y:
358
+
359
+ ```
360
+ /oficina Crear un archivo src/saludo.js que exporte una funcion saludo(nombre) que devuelva "Hola, <nombre>!". Con su test en test/saludo.test.js.
361
+ ```
362
+
363
+ ### 5.2 Matarla en caliente
364
+
365
+ Cuando veas que empezó a trabajar (**mientras la card está `in_progress`**), cerrá la
366
+ ventana de OpenCode de golpe. No dejes que termine.
367
+
368
+ ### 5.3 Reanimarla
369
+
370
+ Abrí OpenCode de nuevo **en el mismo directorio** y escribí:
371
+
372
+ ```
373
+ Revisá el estado de la oficina y decime si la corrida quedó consistente o hay algo roto.
374
+ ```
375
+
376
+ | Correcto | Incorrecto |
377
+ |---|---|
378
+ | La oficina detecta la inconsistencia y la reporta | Dice "todo bien" con una card colgada |
379
+
380
+ Y desde la terminal:
381
+
382
+ ```powershell
383
+ & $OFICINA board --directory $adv
384
+ & $OFICINA status --directory $adv
385
+ Set-Location $REPO
386
+ npx tsx scripts\diagnose-run.ts C:\prueba-oficina-adv
387
+ ```
388
+
389
+ Lo que tiene que aparecer: la card con su estado real, y el diagnóstico reportando
390
+ inconsistencias (por ejemplo, el owner fantasma) en vez de un "todo bien" falso.
391
+
392
+ ---
393
+
394
+ ## Nivel 6 — Cerrar y limpiar
395
+
396
+ ```powershell
397
+ & $OFICINA reset --directory $PROY --force
398
+ & $OFICINA reset --directory $adv --force
399
+ Remove-Item C:\scratch-oficina -Recurse -Force -ErrorAction SilentlyContinue
400
+ ```
401
+
402
+ Los artefactos de la corrida se borran con `reset`. Si querés conservarlos para
403
+ analizarlos, **no corras `reset` todavía**: el Nivel 7 los necesita.
404
+
405
+ ---
406
+
407
+ ## Nivel 7 — Veredicto final (1 min)
408
+
409
+ ```powershell
410
+ Set-Location $REPO
411
+ npx tsx scripts\diagnose-run.ts C:\prueba-oficina
412
+ ```
413
+
414
+ Salida con exit code **0** = todos los invariantes se sostienen. Exit 1 = hay al menos
415
+ uno roto.
416
+
417
+ Los 7 invariantes que verifica:
418
+
419
+ | # | Invariante | Cómo se viola |
420
+ |---|---|---|
421
+ | 1 | Ninguna card cerrada sin gates en PASS | El gate estaba en FAIL pero la card se cerró |
422
+ | 2 | Ninguna card cerrada sin evidencia para **cada** criterio | Falta evidencia para un criterio de aceptación |
423
+ | 3 | Nadie se auto-aprueba | `owner == reviewer` |
424
+ | 4 | Ninguna card sin owner | Cardcolgada sin nadie que la tome |
425
+ | 5 | Todo owner existe en el roster | El agente murió o el roster se perdió |
426
+ | 6 | Presupuesto respetado | Más cards / llamadas / spawns que los permitidos |
427
+ | 7 | Todo gate `NA` explica por qué | Una fase que nadie corrió, sin motivo |
428
+
429
+ Las secciones del diagnóstico:
430
+
431
+ ```
432
+ 1. ESTADO objetivo, run, presupuesto, freno
433
+ 2. CARDS cada card con su scope, gate, acceptance, owner, reviewer
434
+ 3. EL EQUIPO qué rol se eligió y si es coherente con la card
435
+ 4. ARTEFACTOS gates, handoff, evidencia por card
436
+ 5. EL BUS mensajes entre agentes
437
+ 6. COSTO USD, llamadas, tokens
438
+ 7. RECONCILIACIÓN estado vs artefactos vs filesystem
439
+ 8. INVARIANTES ← el veredicto
440
+ 9. VEREDICTO
441
+ ```
442
+
443
+ ---
444
+
445
+ ## Tarjeta de resultados
446
+
447
+ | Nivel | Qué verificaba | Resultado |
448
+ |---|---|---|
449
+ | 0 | Repo sano | ☐ |
450
+ | 1 | El plugin carga | ☐ |
451
+ | 2 | El CLI responde | ☐ |
452
+ | 3 | La corrida real completa | ☐ |
453
+ | 3.5 | Los 5 criterios del entregable | ☐ |
454
+ | 4.1 | El scope bloquea | ☐ |
455
+ | 4.2 | Nadie se auto-aprueba | ☐ |
456
+ | 4.3 | El gate falla si el código está roto | ☐ |
457
+ | 4.4 | El freno funciona | ☐ |
458
+ | 4.5 | El costo se lleva | ☐ |
459
+ | 5 | La oficina sobrevive a una muerte | ☐ |
460
+ | 7 | 0 fallas en los invariantes | ☐ |
461
+
462
+ **Si algo falla**, el lugar exacto para mirar es
463
+ `C:\prueba-oficina\.oficina\artifacts\<card>\gates.md` (la salida real de cada comando)
464
+ y `C:\prueba-oficina\.oficina\evidence\<card>.json` (el grafo de evidencia).
465
+
466
+ ---
467
+
468
+ ## Lo que NO se testea acá
469
+
470
+ - **La suite automatizada** (419 tests) ya cubre: sandbox, guard de scope, herencia de
471
+ scope en subagentes, concurrencia, atomicidad, evidencia, gates, costo, recovery,
472
+ matcher, dispatch, router, state machine, CLI, docsync.
473
+ Corré `npm test` para eso.
474
+ - **El catálogo de 258 agentes**: `oficina catalog --agency-root ...` los lista, y el
475
+ benchmark mide la calidad del matching (71% hit@1).
476
+ - **La carga bajo OpenCode v1**: el entry `./v1` existe y tiene sus tests, pero tu
477
+ OpenCode es v2. No es una prioridad.
478
+ - **Multi-proyecto / concurrencia real entre corridas**: el motor lo soporta
479
+ (`withLock`, leases), pero probarlo requiere dos sesiones simultáneas.
package/docs/QUE-ES.md CHANGED
@@ -3,7 +3,7 @@
3
3
  <!-- BEGIN GENERATED: facts -->
4
4
  | | |
5
5
  |---|---|
6
- | **Paquete** | `oficina-opencode` v3.0.4 |
6
+ | **Paquete** | `oficina-opencode` v3.0.5 |
7
7
  | **Tools** | 16 |
8
8
  | **Hooks** | 7 |
9
9
  | **API de plugin** | `@opencode/plugin@2.1.2` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oficina-opencode",
3
- "version": "3.0.4",
3
+ "version": "3.0.5",
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",