oficina-opencode 0.0.0-stage → 2.0.1
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/DESIGN.md +145 -0
- package/LICENSE +21 -0
- package/README.md +670 -2
- package/agents/oficina-architect.md +72 -0
- package/agents/oficina-commander.md +108 -0
- package/agents/oficina-critico.md +148 -0
- package/agents/oficina-director.md +160 -0
- package/agents/oficina-guardian.md +128 -0
- package/agents/oficina-integrator.md +98 -0
- package/agents/oficina-verificador.md +88 -0
- package/commands/oficina.md +36 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +394 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/briefing.d.ts +115 -0
- package/dist/core/briefing.d.ts.map +1 -0
- package/dist/core/briefing.js +410 -0
- package/dist/core/briefing.js.map +1 -0
- package/dist/core/bus.d.ts +132 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +250 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/catalog.d.ts +303 -0
- package/dist/core/catalog.d.ts.map +1 -0
- package/dist/core/catalog.js +816 -0
- package/dist/core/catalog.js.map +1 -0
- package/dist/core/dispatch.d.ts +110 -0
- package/dist/core/dispatch.d.ts.map +1 -0
- package/dist/core/dispatch.js +301 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/factory.d.ts +74 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +243 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/fsx.d.ts +39 -0
- package/dist/core/fsx.d.ts.map +1 -0
- package/dist/core/fsx.js +113 -0
- package/dist/core/fsx.js.map +1 -0
- package/dist/core/gates.d.ts +97 -0
- package/dist/core/gates.d.ts.map +1 -0
- package/dist/core/gates.js +467 -0
- package/dist/core/gates.js.map +1 -0
- package/dist/core/leases.d.ts +46 -0
- package/dist/core/leases.d.ts.map +1 -0
- package/dist/core/leases.js +94 -0
- package/dist/core/leases.js.map +1 -0
- package/dist/core/log.d.ts +30 -0
- package/dist/core/log.d.ts.map +1 -0
- package/dist/core/log.js +43 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/mesa.d.ts +82 -0
- package/dist/core/mesa.d.ts.map +1 -0
- package/dist/core/mesa.js +178 -0
- package/dist/core/mesa.js.map +1 -0
- package/dist/core/office.d.ts +208 -0
- package/dist/core/office.d.ts.map +1 -0
- package/dist/core/office.js +618 -0
- package/dist/core/office.js.map +1 -0
- package/dist/core/paths.d.ts +67 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +136 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/retry.d.ts +41 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +86 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/roster.d.ts +47 -0
- package/dist/core/roster.d.ts.map +1 -0
- package/dist/core/roster.js +146 -0
- package/dist/core/roster.js.map +1 -0
- package/dist/core/router.d.ts +67 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +186 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/state.d.ts +89 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +303 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/types.d.ts +333 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +27 -0
- package/dist/core/types.js.map +1 -0
- package/dist/hooks/compacting.d.ts +18 -0
- package/dist/hooks/compacting.d.ts.map +1 -0
- package/dist/hooks/compacting.js +72 -0
- package/dist/hooks/compacting.js.map +1 -0
- package/dist/hooks/scopeGuard.d.ts +39 -0
- package/dist/hooks/scopeGuard.d.ts.map +1 -0
- package/dist/hooks/scopeGuard.js +114 -0
- package/dist/hooks/scopeGuard.js.map +1 -0
- package/dist/hooks/sessionIdle.d.ts +35 -0
- package/dist/hooks/sessionIdle.d.ts.map +1 -0
- package/dist/hooks/sessionIdle.js +110 -0
- package/dist/hooks/sessionIdle.js.map +1 -0
- package/dist/hooks/systemTransform.d.ts +18 -0
- package/dist/hooks/systemTransform.d.ts.map +1 -0
- package/dist/hooks/systemTransform.js +63 -0
- package/dist/hooks/systemTransform.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +854 -0
- package/dist/tools/index.js.map +1 -0
- package/docs/ARCHITECTURE.md +258 -0
- package/docs/QUE-ES.md +337 -0
- package/examples/opencode.json +7 -0
- package/package.json +81 -4
- package/skills/oficina/README.md +120 -0
- package/skills/oficina/SKILL.md +251 -0
- package/skills/oficina/reference/mesh.md +345 -0
- package/skills/oficina/reference/protocol.md +342 -0
- package/skills/oficina/reference/roles.md +171 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|