oficina-opencode 0.0.0-stage → 2.0.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 (117) hide show
  1. package/DESIGN.md +145 -0
  2. package/LICENSE +21 -0
  3. package/README.md +670 -2
  4. package/agents/oficina-architect.md +72 -0
  5. package/agents/oficina-commander.md +108 -0
  6. package/agents/oficina-critico.md +148 -0
  7. package/agents/oficina-director.md +160 -0
  8. package/agents/oficina-guardian.md +128 -0
  9. package/agents/oficina-integrator.md +98 -0
  10. package/agents/oficina-verificador.md +88 -0
  11. package/commands/oficina.md +36 -0
  12. package/dist/cli.d.ts +12 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +394 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/core/briefing.d.ts +115 -0
  17. package/dist/core/briefing.d.ts.map +1 -0
  18. package/dist/core/briefing.js +410 -0
  19. package/dist/core/briefing.js.map +1 -0
  20. package/dist/core/bus.d.ts +132 -0
  21. package/dist/core/bus.d.ts.map +1 -0
  22. package/dist/core/bus.js +250 -0
  23. package/dist/core/bus.js.map +1 -0
  24. package/dist/core/catalog.d.ts +303 -0
  25. package/dist/core/catalog.d.ts.map +1 -0
  26. package/dist/core/catalog.js +816 -0
  27. package/dist/core/catalog.js.map +1 -0
  28. package/dist/core/dispatch.d.ts +110 -0
  29. package/dist/core/dispatch.d.ts.map +1 -0
  30. package/dist/core/dispatch.js +301 -0
  31. package/dist/core/dispatch.js.map +1 -0
  32. package/dist/core/factory.d.ts +74 -0
  33. package/dist/core/factory.d.ts.map +1 -0
  34. package/dist/core/factory.js +243 -0
  35. package/dist/core/factory.js.map +1 -0
  36. package/dist/core/fsx.d.ts +39 -0
  37. package/dist/core/fsx.d.ts.map +1 -0
  38. package/dist/core/fsx.js +113 -0
  39. package/dist/core/fsx.js.map +1 -0
  40. package/dist/core/gates.d.ts +97 -0
  41. package/dist/core/gates.d.ts.map +1 -0
  42. package/dist/core/gates.js +467 -0
  43. package/dist/core/gates.js.map +1 -0
  44. package/dist/core/leases.d.ts +46 -0
  45. package/dist/core/leases.d.ts.map +1 -0
  46. package/dist/core/leases.js +94 -0
  47. package/dist/core/leases.js.map +1 -0
  48. package/dist/core/log.d.ts +30 -0
  49. package/dist/core/log.d.ts.map +1 -0
  50. package/dist/core/log.js +43 -0
  51. package/dist/core/log.js.map +1 -0
  52. package/dist/core/mesa.d.ts +82 -0
  53. package/dist/core/mesa.d.ts.map +1 -0
  54. package/dist/core/mesa.js +178 -0
  55. package/dist/core/mesa.js.map +1 -0
  56. package/dist/core/office.d.ts +208 -0
  57. package/dist/core/office.d.ts.map +1 -0
  58. package/dist/core/office.js +618 -0
  59. package/dist/core/office.js.map +1 -0
  60. package/dist/core/paths.d.ts +67 -0
  61. package/dist/core/paths.d.ts.map +1 -0
  62. package/dist/core/paths.js +136 -0
  63. package/dist/core/paths.js.map +1 -0
  64. package/dist/core/retry.d.ts +41 -0
  65. package/dist/core/retry.d.ts.map +1 -0
  66. package/dist/core/retry.js +86 -0
  67. package/dist/core/retry.js.map +1 -0
  68. package/dist/core/roster.d.ts +47 -0
  69. package/dist/core/roster.d.ts.map +1 -0
  70. package/dist/core/roster.js +146 -0
  71. package/dist/core/roster.js.map +1 -0
  72. package/dist/core/router.d.ts +67 -0
  73. package/dist/core/router.d.ts.map +1 -0
  74. package/dist/core/router.js +186 -0
  75. package/dist/core/router.js.map +1 -0
  76. package/dist/core/state.d.ts +89 -0
  77. package/dist/core/state.d.ts.map +1 -0
  78. package/dist/core/state.js +303 -0
  79. package/dist/core/state.js.map +1 -0
  80. package/dist/core/types.d.ts +333 -0
  81. package/dist/core/types.d.ts.map +1 -0
  82. package/dist/core/types.js +27 -0
  83. package/dist/core/types.js.map +1 -0
  84. package/dist/hooks/compacting.d.ts +18 -0
  85. package/dist/hooks/compacting.d.ts.map +1 -0
  86. package/dist/hooks/compacting.js +72 -0
  87. package/dist/hooks/compacting.js.map +1 -0
  88. package/dist/hooks/scopeGuard.d.ts +39 -0
  89. package/dist/hooks/scopeGuard.d.ts.map +1 -0
  90. package/dist/hooks/scopeGuard.js +114 -0
  91. package/dist/hooks/scopeGuard.js.map +1 -0
  92. package/dist/hooks/sessionIdle.d.ts +35 -0
  93. package/dist/hooks/sessionIdle.d.ts.map +1 -0
  94. package/dist/hooks/sessionIdle.js +110 -0
  95. package/dist/hooks/sessionIdle.js.map +1 -0
  96. package/dist/hooks/systemTransform.d.ts +18 -0
  97. package/dist/hooks/systemTransform.d.ts.map +1 -0
  98. package/dist/hooks/systemTransform.js +63 -0
  99. package/dist/hooks/systemTransform.js.map +1 -0
  100. package/dist/index.d.ts +36 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +103 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/tools/index.d.ts +22 -0
  105. package/dist/tools/index.d.ts.map +1 -0
  106. package/dist/tools/index.js +854 -0
  107. package/dist/tools/index.js.map +1 -0
  108. package/docs/ARCHITECTURE.md +258 -0
  109. package/docs/QUE-ES.md +337 -0
  110. package/examples/opencode.json +7 -0
  111. package/package.json +81 -4
  112. package/skills/oficina/README.md +120 -0
  113. package/skills/oficina/SKILL.md +251 -0
  114. package/skills/oficina/reference/mesh.md +345 -0
  115. package/skills/oficina/reference/protocol.md +342 -0
  116. package/skills/oficina/reference/roles.md +171 -0
  117. package/skills/oficina/reference/templates.md +278 -0
@@ -0,0 +1,98 @@
1
+ ---
2
+ description: "INTEGRADOR de la OFICINA. Dominio: DAG, leases, gates, calidad y presupuesto. Decide quién tiene cada tarea, aprueba o rechaza spawns, detecta deadlocks y starvation, y dictamina el estado final de cada card. Responde '¿quién tiene T-07?' y '¿pasó el gate?'. Úsalo como el coordinador de dominio de flujo."
3
+ mode: subagent
4
+ permissions:
5
+ - { action: "read", resource: "*", effect: "allow" }
6
+ - { action: "read", resource: "*.env", effect: "deny" }
7
+ - { action: "read", resource: "*.env.*", effect: "deny" }
8
+ - { action: "read", resource: "*.env.example", effect: "allow" }
9
+ - { action: "glob", resource: "*", effect: "allow" }
10
+ - { action: "grep", resource: "*", effect: "allow" }
11
+ - { action: "edit", resource: "*", effect: "allow" }
12
+ - { action: "write", resource: "*", effect: "allow" }
13
+ - { action: "task", resource: "*", effect: "allow" }
14
+ - { action: "bash", resource: "*", effect: "allow" }
15
+ ---
16
+
17
+ # INTEGRADOR — DAG, Leases, Gates y Calidad
18
+
19
+ Sos el **Integrador** de la OFICINA. Tu dominio es **el flujo**: qué corre cuándo, quién lo tiene, si pasó el gate, y si el presupuesto aguanta.
20
+
21
+ ## Tu dominio
22
+
23
+ | Pregunta | Quién responde |
24
+ |---|---|
25
+ | ¿quién tiene T-07? | **Vos** |
26
+ | ¿pasó el gate? | **Vos** |
27
+ | ¿este spawn tiene sentido? | **Vos** |
28
+ | ¿esto está en el objetivo? | Comandante |
29
+ | ¿qué patrón usamos? | Arquitecto |
30
+
31
+ ## Qué hacés
32
+
33
+ ### 1. Aprobar o rechazar spawns
34
+
35
+ Un especialista pide desplegar un agente nuevo (mensaje `SPAWN_REQUEST` en `coord-flow`). **Vos** decidís.
36
+
37
+ Rechazá si:
38
+ - La capacidad ya la cubre un peer desplegado → respondé con **a quién preguntar**.
39
+ - El rol no sale del catálogo de agency-agents con cobertura ≥ 60% y no hay factory habilitada.
40
+ - El presupuesto de spawns (20 por corrida) no da.
41
+ - Ya hay 10 agentes concurrentes (hard cap 14).
42
+
43
+ Aprobá si el rol es genuinamente nuevo y el presupuesto da. Respondé siempre por el bus: `SPAWN_APPROVED` o `SPAWN_REJECTED` con la razón.
44
+
45
+ **Nunca dejes un spawn sin respuesta.** Un especialista esperando una respuesta es un especialista quemado.
46
+
47
+ ### 2. Vigilar el DAG
48
+
49
+ - **Deadlock**: dos cards se esperan mutuamente. Rompé el ciclo: una cede, o partí una.
50
+ - **Starvation**: una card espera hace demasiado. Priorizá o avisá al Comandante.
51
+ - **Doble claim**: el lease lo previene. Si dos agentes discuten por la misma card, el lease decide — no la discusión.
52
+ - **Agente muerto**: sin heartbeat en 3× `heartbeat_sec`, su card se reasigna.
53
+
54
+ ### 3. Dictaminar el estado de las cards
55
+
56
+ Una card pasa a DONE solo si:
57
+ 1. El Crítico (distinto del owner) dio APROBADO.
58
+ 2. `gates.md` tiene **Gate técnico: PASS** y **Gate seguridad: PASS**.
59
+ 3. Los invariantes duros se cumplen.
60
+
61
+ Si algo falla:
62
+ - **Rechazo 1** → REWORK, mismo owner, con el feedback literal del review.
63
+ - **Rechazo 2** → REPLAN: rehacé la card. Si el owner ya falló dos veces, **rotá el owner** — el problema puede ser el agente, no el código.
64
+ - **Rechazo 3** → ESCALADA al usuario, con opciones.
65
+
66
+ ### 4. Cuidar el presupuesto
67
+
68
+ Presupuesto por corrida: 20 cards, 40 invocaciones de subagente, 20 spawns.
69
+
70
+ Cuando se acerca al límite, **decílo antes** de que se agote. Un informe parcial honesto al 90% vale más que un corte al 100%.
71
+
72
+ ### 5. Distribuir la carga
73
+
74
+ Cuando el pool tiene agentes libres y hay cards sin owner, distribuí. El claim proactivo (`oficina_assign` con `cardId`) existe para eso: un agente que terminó toma trabajo del que quedó sin dueño, en vez de esperar.
75
+
76
+ ## Lo que nunca hacés
77
+
78
+ - Escribir código.
79
+ - Aprobar sin gates en verde (el motor te lo va a impedir, y está bien).
80
+ - Resolver un conflicto de alcance (eso es del Comandante) o de patrón (Arquitecto).
81
+
82
+ ## Reportes
83
+
84
+ Cada 3 cards, informe con:
85
+ - Cards DONE / en curso / en review
86
+ - Gates rojos y por qué
87
+ - Agentes libres vs..cards sin owner
88
+ - Consumo de presupuesto
89
+ - Deadlocks o starvation detectados
90
+
91
+ ## Escalación
92
+
93
+ Escalá con `oficina_escalate` si:
94
+ - Se agotó el presupuesto.
95
+ - Hay un bloqueo externo (credencial, API caída).
96
+ - Un agente está en loop y rotarlo no lo arregla.
97
+
98
+ Con 2-3 opciones concretas y tu recomendación. Nunca un monólogo.
@@ -0,0 +1,88 @@
1
+ ---
2
+ description: "Gate técnico de la Oficina de Agents. Ejecuta build, type check, lint, tests con coverage, security grep y diff review, y dictamina PASS o FAIL con la salida real pegada en .oficina/artifacts/<card-id>/gates.md. Lo invoca el Director de la skill 'oficina'. No opines: ejecutá y reportá."
3
+ mode: subagent
4
+ permissions:
5
+ - { action: "read", resource: "*", effect: "allow" }
6
+ - { action: "read", resource: "*.env", effect: "deny" }
7
+ - { action: "read", resource: "*.env.*", effect: "deny" }
8
+ - { action: "read", resource: "*.env.example", effect: "allow" }
9
+ - { action: "glob", resource: "*", effect: "allow" }
10
+ - { action: "grep", resource: "*", effect: "allow" }
11
+ - { action: "edit", resource: "*", effect: "allow" }
12
+ - { action: "write", resource: "*", effect: "allow" }
13
+ - { action: "bash", resource: "*", effect: "allow" }
14
+ ---
15
+
16
+ # Verificador de la Oficina
17
+
18
+ Sos el gate técnico. **Ejecutás, no opinás.**
19
+
20
+ Un gate que dice "debería compilar" no es un gate. Un gate que pega la salida real de `tsc --noEmit` es un gate.
21
+
22
+ ## Las 6 fases
23
+
24
+ Detectá el tooling del proyecto vos mismo si no te lo dan. Mirá `package.json`, `pyproject.toml`, `Makefile`, `Cargo.toml`, `go.mod`, `pom.xml`.
25
+
26
+ | # | Fase | Node/TS | Python | Go | Rust |
27
+ |---|---|---|---|---|---|
28
+ | 1 | Build | `npm run build` | `python -m build` | `go build ./...` | `cargo build` |
29
+ | 2 | Type check | `npx tsc --noEmit` | `mypy .` | `go vet ./...` | `cargo check` |
30
+ | 3 | Lint | `npx eslint .` | `ruff check .` | `golangci-lint run` | `cargo clippy` |
31
+ | 4 | Tests + cov | `npm test` | `pytest --cov` | `go test -cover ./...` | `cargo test` |
32
+ | 5 | Security grep | ver abajo | ver abajo | `govulncheck ./...` | `cargo audit` |
33
+ | 6 | Diff review | `git diff <base>` | `git diff <base>` | `git diff <base>` | `git diff <base>` |
34
+
35
+ **Fase 5 — security grep.** Corré algo como:
36
+ ```bash
37
+ grep -rnE "(api[_-]?key|secret|password|token)\s*[:=]\s*['\"][^'\"]{8,}" <scope>
38
+ grep -rnE "AKIA[0-9A-Z]{16}|-----BEGIN.*PRIVATE KEY-----" <scope>
39
+ ```
40
+ Adaptá a lo que corresponda al proyecto. Pegá la salida.
41
+
42
+ **Fase 6 — diff review.** Compará contra el baseline de la card:
43
+ ```bash
44
+ git diff <baseline> -- <scope>
45
+ ```
46
+ Buscá: archivos tocados fuera del scope, cambios no solicitados, código muerto, debug statements (`console.log`, `print`, `debugger`), TODOs sin ticket, secrets.
47
+
48
+ ## Reglas de honestidad
49
+
50
+ Estas reglas son el valor de tu rol. No las negocies.
51
+
52
+ 1. **Nunca pongas PASS en una fase que no corriste.** Si no la corriste, es `NOT RUN` y eso hace fallar el gate.
53
+ 2. **Nunca pegues output inventado.** Si un comando no da salida, pegá `(sin salida)` y marcá el resultado real.
54
+ 3. **N/A es con motivo.** "N/A — el proyecto no tiene type checker (es JS puro)". Nunca N/A silencioso.
55
+ 4. **Una fase aplicable en FAIL = gate FAIL.** No promediés ni ponderes. Si el lint falla, el gate falla.
56
+ 5. **No arregles el código.** Reportá. Que lo arregle el owner.
57
+ 6. **Compará contra el baseline, no contra el ideal.** Si el lint ya fallaba antes de la card, no es de la card. Anotá la distinción.
58
+
59
+ ## Output
60
+
61
+ Escribí en `.oficina/artifacts/<card-id>/gates.md`, sección Técnico:
62
+
63
+ ```markdown
64
+ ## Técnico
65
+
66
+ **Baseline:** <commit/branch contra el que se comparó>
67
+ **Tooling detectado:** <package.json / pyproject.toml / ...>
68
+
69
+ | # | Fase | Comando | Resultado | Detalle |
70
+ |---|------|---------|-----------|---------|
71
+ | 1 | Build | `npm run build` | PASS | exit 0, 2.1s |
72
+ | 2 | Type check | `npx tsc --noEmit` | PASS | 0 errores |
73
+ | 3 | Lint | `npx eslint .` | FAIL | 3 errores nuevos (baseline: 0) |
74
+ | 4 | Tests | `npm test` | PASS | 23/23, coverage 87% |
75
+ | 5 | Security grep | `grep -rnE ...` | PASS | 0 hallazgos |
76
+ | 6 | Diff review | `git diff <base>` | FAIL | `console.log` en src/auth/login.ts:31 |
77
+
78
+ ### Output de los comandos
79
+
80
+ #### 3. Lint
81
+ ```
82
+ <salida real>
83
+ ```
84
+
85
+ **Gate técnico:** PASS | FAIL
86
+ ```
87
+
88
+ Si el gate es FAIL, enumerá en el bloque final qué tiene que arreglar el owner, con el comando que falla y el output. Eso es lo que va a ir en el feedback del REWORK.
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Abrir la Oficina de Agents para trabajar un objetivo de punta a punta con delegation, auto-revisión y gates de calidad
3
+ subtask: false
4
+ ---
5
+
6
+ Cargá la skill `oficina` y seguí su protocolo exactamente. Si sus instrucciones no están ya en contexto, cargála primero.
7
+
8
+ **Vos sos el Director.** Leé el agente `oficina-director` en `~/.config/opencode/agents/oficina-director.md` y adoptá su rol: planificás, delegás, decidís, escalás. **No escribas código de producción vos** — eso lo hacen los especialistas que delegás.
9
+
10
+ **Objetivo de la corrida:** $ARGUMENTS
11
+
12
+ Si el objetivo está vacío, tomá el pedido más reciente del usuario en esta conversación como objetivo.
13
+
14
+ ## Arrancá así — sin preguntar permiso
15
+
16
+ 1. Leé `reference/protocol.md` y `reference/roles.md` de la skill `oficina`.
17
+ 2. **Resolvé PROJECT_ROOT** siguiendo el Paso 0 del protocolo (buscá markers de proyecto; no asumas que el cwd es el proyecto). `OFFICE_DIR = PROJECT_ROOT/.oficina/`. Usá paths ABSOLUTOS en todo lo que escribas y en todos los prompts de delegación.
18
+ 3. Creá `OFFICE_DIR/` con `board.md`, `state.json` y `context.md` (templates en `reference/templates.md`).
19
+ 4. Descomponé el objetivo en cards con acceptance criteria **verificables** y gate explícito. Si el objetivo es vago, hacé las inferencias razonables y anotá cuáles son — no frenes por ambigüedad menor. Ordená las cards por **causa**: si el fix de B rompe el gate de A, B va primero.
20
+ 5. Delegá por la **tabla de enrutado** de `reference/roles.md`. El Crítico nunca es el owner. El Verificador nunca es el Implementador. Cada subagente es stateless: el prompt lleva TODO el contexto, y los paths absolutos del PROJECT_ROOT.
21
+ 6. Corré el ciclo: TRABAJO → AUTO-REVIEW → GATES → DONE, o REWORK/REPLAN/ESCALADA.
22
+ 7. Checkpoint al usuario cada 3 cards — **informa y seguí**, no pidas permiso.
23
+ 8. Escalá solo con el formato de 2-3 opciones concretas + recomendación.
24
+
25
+ ## Presupuesto
26
+
27
+ 20 cards, 40 invocaciones de subagente por corrida. Si se agota, entregá informe parcial con lo alcanzado y preguntá.
28
+
29
+ ## Lo que esta oficina garantiza
30
+
31
+ - Ninguna card se marca DONE sin `gates.md` en PASS
32
+ - Ningún trabajo se auto-aprueba
33
+ - Nada se pierde: todo está en `.oficina/artifacts/`
34
+ - El objetivo se trabaja hasta cumplirlo o hasta un bloqueo real
35
+
36
+ Arrancá ya. Reportá el plan de cards en 5-8 líneas y seguí con la primera.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI de la OFICINA.
4
+ *
5
+ * Operaciones: init, status, resume, audit, reset, catalog.
6
+ *
7
+ * El CLI es la superficie de operación: listar corridas atascadas, auditar el
8
+ * bus, forzar el cierre de una card, promover roles de factory a skill. Si
9
+ * un operador no puede ver qué está pasando, el sistema no es operable.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
package/dist/cli.js ADDED
@@ -0,0 +1,394 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI de la OFICINA.
4
+ *
5
+ * Operaciones: init, status, resume, audit, reset, catalog.
6
+ *
7
+ * El CLI es la superficie de operación: listar corridas atascadas, auditar el
8
+ * bus, forzar el cierre de una card, promover roles de factory a skill. Si
9
+ * un operador no puede ver qué está pasando, el sistema no es operable.
10
+ */
11
+ import path from "node:path";
12
+ import process from "node:process";
13
+ import fs from "node:fs/promises";
14
+ import { existsSync } from "node:fs";
15
+ import { homedir } from "node:os";
16
+ import { fileURLToPath } from "node:url";
17
+ import { Office } from "./core/office.js";
18
+ import { logger, configureLogging } from "./core/log.js";
19
+ import { listFiles, readJson, ensureDir, writeJsonAtomic } from "./core/fsx.js";
20
+ import { cardDir } from "./core/paths.js";
21
+ import { scanCatalog } from "./core/catalog.js";
22
+ const log = logger("oficina:cli");
23
+ function arg(name) {
24
+ const index = process.argv.indexOf(`--${name}`);
25
+ if (index === -1)
26
+ return undefined;
27
+ return process.argv[index + 1];
28
+ }
29
+ function flag(name) {
30
+ return process.argv.includes(`--${name}`);
31
+ }
32
+ function usage() {
33
+ process.stdout.write(`
34
+ OFICINA — CLI de la Oficina de Agents
35
+
36
+ Uso: oficina <comando> [opciones]
37
+
38
+ Comandos:
39
+ init [objetivo] Crea la estructura .oficina/ en el proyecto
40
+ status Muestra el estado de la corrida
41
+ board Muestra el tablero Kanban
42
+ bus Muestra estadísticas del bus
43
+ audit [cardId] Audita una card: artefactos, gates, review
44
+ verify Corre los gates de todas las cards en review
45
+ install Instala skill, agentes y comando en un directorio de OpenCode
46
+ catalog Lista el catálogo de roles disponible
47
+ reset [--force] Borra el estado de la corrida
48
+
49
+ Opciones:
50
+ --directory <path> Directorio del proyecto (default: cwd)
51
+ --agency-root <path> Raíz del repo agency-agents
52
+ --target <path> Destino de install (default: ~/.config/opencode)
53
+ --json Salida en JSON
54
+ --force No pedir confirmación
55
+ `);
56
+ }
57
+ async function main() {
58
+ const command = process.argv[2];
59
+ const cwd = path.resolve(arg("directory") ?? process.cwd());
60
+ const json = flag("json");
61
+ if (!command || command === "help" || command === "--help") {
62
+ usage();
63
+ return 0;
64
+ }
65
+ configureLogging({ level: flag("quiet") ? "error" : "warn" });
66
+ const office = new Office({
67
+ cwd,
68
+ agencyRoot: arg("agency-root"),
69
+ });
70
+ await office.init();
71
+ switch (command) {
72
+ case "init": {
73
+ const objective = process.argv.slice(3).filter((a) => !a.startsWith("--")).join(" ");
74
+ const state = await office.loadState(objective || "(sin objetivo)");
75
+ state.objective = objective || state.objective;
76
+ await office.saveState(state);
77
+ const roster = await office.loadRoster(state.runId);
78
+ await office.saveRoster(roster);
79
+ emit(json, {
80
+ ok: true,
81
+ officeDir: office.paths.officeDir,
82
+ projectRoot: office.paths.projectRoot,
83
+ runId: state.runId,
84
+ fallback: office.paths.fallback,
85
+ });
86
+ return 0;
87
+ }
88
+ case "status": {
89
+ const state = await office.loadState();
90
+ const roster = await office.loadRoster(state.runId);
91
+ const cards = Object.values(state.cards);
92
+ const done = cards.filter((c) => c.state === "done");
93
+ const pending = cards.filter((c) => c.state !== "done");
94
+ const blocked = cards.filter((c) => c.state === "blocked" || c.state === "escalated");
95
+ const dead = office.rosterStore.deadAgents(roster, office.limits.heartbeatSec * 3);
96
+ const payload = {
97
+ objective: state.objective,
98
+ status: state.status,
99
+ iteration: state.iteration,
100
+ progress: `${done.length}/${cards.length}`,
101
+ budget: state.budget,
102
+ pending: pending.map((c) => `${c.id} [${c.state}] ${c.title}`),
103
+ blocked: blocked.map((c) => `${c.id}: ${c.result ?? "sin motivo"}`),
104
+ deadAgents: dead.map((a) => `${a.id} (${a.role})`),
105
+ agents: Object.values(roster.agents).map((a) => ({
106
+ id: a.id,
107
+ role: a.role,
108
+ state: a.state,
109
+ card: a.currentCard,
110
+ })),
111
+ escalations: state.escalations.filter((e) => e.status === "open"),
112
+ };
113
+ if (json) {
114
+ emit(true, payload);
115
+ return 0;
116
+ }
117
+ process.stdout.write(`\n🏢 OFICINA — ${state.objective}\n\n`);
118
+ process.stdout.write(`Estado: ${state.status}\n`);
119
+ process.stdout.write(`Progreso: ${payload.progress} cards DONE\n`);
120
+ process.stdout.write(`Presupuesto: ${state.budget.cardsUsed}/${state.budget.maxCards} cards · ${state.budget.agentCallsUsed}/${state.budget.maxAgentCalls} agentes · ${state.budget.spawnsUsed}/${state.budget.maxSpawnsTotal} spawns\n\n`);
121
+ if (payload.pending.length) {
122
+ process.stdout.write("Pendientes:\n");
123
+ for (const p of payload.pending)
124
+ process.stdout.write(` - ${p}\n`);
125
+ process.stdout.write("\n");
126
+ }
127
+ if (payload.blocked.length) {
128
+ process.stdout.write("Bloqueadas:\n");
129
+ for (const b of payload.blocked)
130
+ process.stdout.write(` - ${b}\n`);
131
+ process.stdout.write("\n");
132
+ }
133
+ if (payload.deadAgents.length) {
134
+ process.stdout.write(`Sin heartbeat: ${payload.deadAgents.join(", ")}\n\n`);
135
+ }
136
+ if (payload.escalations.length) {
137
+ process.stdout.write("Escalaciones abiertas:\n");
138
+ for (const e of payload.escalations) {
139
+ process.stdout.write(` - ${e.cardId}: ${e.cause}\n`);
140
+ process.stdout.write(` recomendación: ${e.recommendation}\n`);
141
+ }
142
+ process.stdout.write("\n");
143
+ }
144
+ return 0;
145
+ }
146
+ case "board": {
147
+ const state = await office.loadState();
148
+ const lines = [`# Tablero — ${state.objective}`, ""];
149
+ const groups = {
150
+ TODO: [],
151
+ IN_PROGRESS: [],
152
+ REVIEW: [],
153
+ DONE: [],
154
+ BLOCKED: [],
155
+ ESCALATED: [],
156
+ };
157
+ for (const id of state.order) {
158
+ const card = state.cards[id];
159
+ if (!card)
160
+ continue;
161
+ const key = card.state.toUpperCase();
162
+ if (groups[key])
163
+ groups[key].push(id);
164
+ }
165
+ for (const [name, ids] of Object.entries(groups)) {
166
+ if (ids.length === 0)
167
+ continue;
168
+ lines.push(`## ${name}`);
169
+ for (const id of ids) {
170
+ const c = state.cards[id];
171
+ lines.push(`- **${id}** ${c.title} · owner=${c.owner ?? "—"} · ${c.result ?? ""}`);
172
+ }
173
+ lines.push("");
174
+ }
175
+ const text = lines.join("\n");
176
+ if (json)
177
+ emit(true, { board: text });
178
+ else
179
+ process.stdout.write(`\n${text}\n`);
180
+ return 0;
181
+ }
182
+ case "bus": {
183
+ const stats = await office.bus.stats();
184
+ const channels = await listFiles(office.paths.busDir);
185
+ const detail = {};
186
+ for (const channel of channels) {
187
+ const messages = await office.bus.readChannel(channel);
188
+ detail[channel] = messages.slice(-5).map((m) => ({
189
+ id: m.id,
190
+ seq: m.seq,
191
+ from: m.from,
192
+ kind: m.kind,
193
+ subject: m.subject,
194
+ at: m.createdAt,
195
+ }));
196
+ }
197
+ if (json)
198
+ emit(true, { stats, detail });
199
+ else {
200
+ process.stdout.write("\n📬 Bus de mensajes\n\n");
201
+ for (const [channel, count] of Object.entries(stats)) {
202
+ process.stdout.write(` ${channel}: ${count} mensajes\n`);
203
+ }
204
+ process.stdout.write("\n");
205
+ }
206
+ return 0;
207
+ }
208
+ case "audit": {
209
+ const cardId = process.argv[3];
210
+ if (!cardId) {
211
+ process.stderr.write("Falta el id de la card.\n");
212
+ return 1;
213
+ }
214
+ const state = await office.loadState();
215
+ const card = state.cards[cardId];
216
+ if (!card) {
217
+ process.stderr.write(`No existe la card ${cardId}.\n`);
218
+ return 1;
219
+ }
220
+ const dir = cardDir(office.paths, cardId);
221
+ const files = await listFiles(dir);
222
+ const gates = await readJson(path.join(dir, "gates.md"));
223
+ const payload = {
224
+ card: {
225
+ id: card.id,
226
+ title: card.title,
227
+ state: card.state,
228
+ owner: card.owner,
229
+ reviewer: card.reviewer,
230
+ attempts: card.attempts,
231
+ rejections: card.rejections,
232
+ result: card.result,
233
+ },
234
+ artifacts: files,
235
+ hasHandoff: files.includes("handoff.md"),
236
+ hasEvidence: files.includes("evidence.md"),
237
+ hasReview: files.includes("review.md"),
238
+ hasGates: files.includes("gates.md"),
239
+ gates: gates ?? null,
240
+ };
241
+ if (json)
242
+ emit(true, payload);
243
+ else {
244
+ process.stdout.write(`\n🔍 Auditoría — ${card.id}: ${card.title}\n\n`);
245
+ process.stdout.write(`Estado: ${card.state} · owner=${card.owner} reviewer=${card.reviewer}\n`);
246
+ process.stdout.write(`Intentos: ${card.attempts} · rechazos: ${card.rejections}\n`);
247
+ process.stdout.write(`Resultado: ${card.result ?? "—"}\n\n`);
248
+ process.stdout.write("Artefactos:\n");
249
+ for (const f of files)
250
+ process.stdout.write(` ${files.includes(f) ? "✓" : "·"} ${f}\n`);
251
+ process.stdout.write("\n");
252
+ }
253
+ return 0;
254
+ }
255
+ case "verify": {
256
+ const state = await office.loadState();
257
+ const inReview = state.order.filter((id) => state.cards[id]?.state === "review");
258
+ const results = {};
259
+ for (const id of inReview) {
260
+ const gates = await office.runGates(state, id);
261
+ results[id] = {
262
+ passed: gates.passed,
263
+ technical: gates.technicalOutcome,
264
+ security: gates.securityOutcome,
265
+ };
266
+ }
267
+ if (json)
268
+ emit(true, { results });
269
+ else {
270
+ process.stdout.write("\n🔬 Gates\n\n");
271
+ for (const [id, r] of Object.entries(results)) {
272
+ process.stdout.write(` ${id}: ${r.passed ? "PASS" : "FAIL"}\n`);
273
+ }
274
+ process.stdout.write("\n");
275
+ }
276
+ return 0;
277
+ }
278
+ case "catalog": {
279
+ const root = arg("agency-root");
280
+ if (!root) {
281
+ process.stderr.write("Falta --agency-root.\n");
282
+ return 1;
283
+ }
284
+ const catalog = await scanCatalog({ root });
285
+ if (json) {
286
+ emit(true, { count: catalog.length, agents: catalog.map((a) => ({ slug: a.slug, division: a.division, capabilities: a.capabilities })) });
287
+ return 0;
288
+ }
289
+ process.stdout.write(`\n📚 Catálogo — ${catalog.length} agentes\n\n`);
290
+ for (const agent of catalog) {
291
+ process.stdout.write(` ${agent.division}/${agent.slug}\n`);
292
+ process.stdout.write(` ${agent.displayName} — ${agent.capabilities.slice(0, 8).join(", ")}\n`);
293
+ }
294
+ process.stdout.write("\n");
295
+ return 0;
296
+ }
297
+ case "install": {
298
+ // Instala los assets del protocolo (skill + agentes + comando) en el
299
+ // directorio de configuración de OpenCode.
300
+ const target = path.resolve(arg("target") ?? path.join(homedir(), ".config", "opencode"));
301
+ const packageRoot = path.resolve(fileURLToPath(import.meta.url), "..", "..");
302
+ const installed = [];
303
+ const skipped = [];
304
+ // Skill
305
+ const skillSrc = path.join(packageRoot, "skills", "oficina");
306
+ const skillDst = path.join(target, "skills", "oficina");
307
+ if (existsSync(skillSrc)) {
308
+ await fs.cp(skillSrc, skillDst, { recursive: true, force: true });
309
+ installed.push(path.join(target, "skills", "oficina"));
310
+ }
311
+ else {
312
+ skipped.push("skills/oficina (no encontrado en el paquete)");
313
+ }
314
+ // Agentes
315
+ const agentsSrc = path.join(packageRoot, "agents");
316
+ const agentsDst = path.join(target, "agents");
317
+ if (existsSync(agentsSrc)) {
318
+ await fs.mkdir(agentsDst, { recursive: true });
319
+ const files = (await fs.readdir(agentsSrc)).filter((f) => f.endsWith(".md"));
320
+ for (const file of files) {
321
+ await fs.copyFile(path.join(agentsSrc, file), path.join(agentsDst, file));
322
+ }
323
+ installed.push(`${agentsDst} (${files.length} agentes)`);
324
+ }
325
+ else {
326
+ skipped.push("agents/ (no encontrado en el paquete)");
327
+ }
328
+ // Comando
329
+ const cmdSrc = path.join(packageRoot, "commands", "oficina.md");
330
+ const cmdDst = path.join(target, "commands", "oficina.md");
331
+ if (existsSync(cmdSrc)) {
332
+ await fs.mkdir(path.dirname(cmdDst), { recursive: true });
333
+ await fs.copyFile(cmdSrc, cmdDst);
334
+ installed.push(cmdDst);
335
+ }
336
+ else {
337
+ skipped.push("commands/oficina.md (no encontrado en el paquete)");
338
+ }
339
+ // Entry point del plugin
340
+ const pluginDir = path.join(target, "plugins");
341
+ await fs.mkdir(pluginDir, { recursive: true });
342
+ const pluginEntry = path.join(pluginDir, "oficina.js");
343
+ await fs.writeFile(pluginEntry, 'export { OficinaPlugin, default } from "oficina-opencode"\n', "utf8");
344
+ installed.push(pluginEntry);
345
+ emit(json, { ok: true, target, installed, skipped });
346
+ if (!json) {
347
+ process.stdout.write(`\n✅ Instalado en ${target}\n\n`);
348
+ for (const item of installed)
349
+ process.stdout.write(` + ${item}\n`);
350
+ for (const item of skipped)
351
+ process.stdout.write(` - ${item} (omitido)\n`);
352
+ process.stdout.write(`\nRecordá setear \`experimental.subagent_depth: 3\` en ${path.join(target, "opencode.json")}\n\n`);
353
+ }
354
+ return 0;
355
+ }
356
+ case "reset": {
357
+ if (!flag("force")) {
358
+ process.stdout.write(`Esto borra el estado de la corrida en ${office.paths.officeDir}.\nRe-ejecutá con --force para confirmar.\n`);
359
+ return 1;
360
+ }
361
+ const state = await office.loadState();
362
+ await writeJsonAtomic(office.paths.statePath, {
363
+ ...state,
364
+ status: "abandoned",
365
+ cards: {},
366
+ order: [],
367
+ sessions: {},
368
+ });
369
+ await ensureDir(office.paths.officeDir);
370
+ emit(json, { ok: true, reset: true });
371
+ return 0;
372
+ }
373
+ default:
374
+ process.stderr.write(`Comando desconocido: ${command}\n\n`);
375
+ usage();
376
+ return 1;
377
+ }
378
+ }
379
+ function emit(json, payload) {
380
+ if (json) {
381
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
382
+ }
383
+ else {
384
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
385
+ }
386
+ }
387
+ main()
388
+ .then((code) => process.exit(code))
389
+ .catch((err) => {
390
+ log.error("fallo en el CLI", { error: String(err) });
391
+ process.stderr.write(`${String(err)}\n`);
392
+ process.exit(1);
393
+ });
394
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}