@jmanuelcorral/openteam 0.1.19 → 0.1.20

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
@@ -8,7 +8,7 @@
8
8
  - [Características](#características)
9
9
  - [Requisitos](#requisitos)
10
10
  - [Instalación](#instalación)
11
- - [Quickstart: `openteam init`](#quickstart-openteam-init)
11
+ - [Quickstart: `openteam setup`](#quickstart-openteam-setup)
12
12
  - [Probar en otra máquina](#probar-en-otra-máquina)
13
13
  - [Actualizar openteam](#actualizar-openteam)
14
14
  - [Configuración](#configuración)
@@ -178,9 +178,9 @@ Durante desarrollo puedes cargar un plugin local desde `.opencode/plugins/opente
178
178
  }
179
179
  ```
180
180
 
181
- ## Quickstart: `openteam init`
181
+ ## Quickstart: `openteam setup`
182
182
 
183
- La forma más rápida de dejar un repositorio listo para opencode + openteam es el comando interactivo `openteam init`. Detecta los runtimes locales instalados (Ollama, LM Studio, Foundry Local), te deja elegir los modelos locales y el modelo **frontier baseline** (ordenados de más barato-capaz a más caro), y genera tres ficheros:
183
+ La forma más rápida de dejar un repositorio listo para opencode + openteam es el comando interactivo `openteam setup`. Detecta los runtimes locales instalados (Ollama, LM Studio, Foundry Local), te deja elegir los modelos locales y el modelo **frontier baseline** (ordenados de más barato-capaz a más caro), y genera tres ficheros:
184
184
 
185
185
  - `opencode.json` en la raíz: declara el plugin `@jmanuelcorral/openteam`, los `provider` locales OpenAI-compatible, el `model` frontier y el `small_model` local.
186
186
  - `.opencode/openteam.json`: la configuración runtime validada de openteam (baseline, routing, runtimes locales y privacidad).
@@ -188,11 +188,13 @@ La forma más rápida de dejar un repositorio listo para opencode + openteam es
188
188
 
189
189
  ```powershell
190
190
  # Con el paquete instalado como dependencia del proyecto
191
- bunx openteam init
191
+ bunx openteam setup
192
192
  # o, si lo tienes global
193
- openteam init
193
+ openteam setup
194
194
  ```
195
195
 
196
+ > El antiguo comando `openteam init` sigue funcionando como **alias obsoleto** de `openteam setup`.
197
+
196
198
  El asistente:
197
199
 
198
200
  1. Sondea los runtimes locales y marca los detectados.
@@ -205,7 +207,7 @@ Tras `init`, autentica el provider frontier (`opencode auth login`), arranca tu
205
207
 
206
208
  ### El agente `openteam` (estilo Squad)
207
209
 
208
- `openteam init` genera un único **agente primario** llamado `openteam` (`.opencode/agent/openteam.md`). Pulsa **Tab** en opencode para seleccionarlo: así sabes explícitamente que estás en modo openteam, mientras el plugin sigue optimizando el modelo por debajo.
210
+ `openteam setup` genera un único **agente primario** llamado `openteam` (`.opencode/agent/openteam.md`). Pulsa **Tab** en opencode para seleccionarlo: así sabes explícitamente que estás en modo openteam, mientras el plugin sigue optimizando el modelo por debajo.
209
211
 
210
212
  Ese orquestador funciona al estilo [Squad](https://bradygaster.github.io/squad/): **no trae subagentes precreados**. En **cada petición** su primera acción es comprobar si ya existe equipo (`.opencode/openteam-roster.md` + subagentes en `.opencode/agent/`). Si **existe**, reparte el trabajo entre los especialistas adecuados; si **no existe**, entiende las tareas que implica tu petición, diseña el equipo mínimo y **lo crea a demanda** —sin que tengas que pedírselo explícitamente— antes de pasarle esas tareas (escribiendo `.opencode/agent/<nombre>.md` con `mode: subagent`), reutilizando los existentes antes de crear nuevos. Los roles mecánicos/bulk se dejan enrutar a modelos locales y solo se escala a frontier para arquitectura, seguridad o debugging ambiguo.
211
213
 
@@ -237,9 +239,9 @@ Para instalar y probar openteam en otro equipo que ya tenga [opencode](https://o
237
239
 
238
240
  ```powershell
239
241
  cd C:\ruta\a\tu\repo
240
- openteam init # global
242
+ openteam setup # global
241
243
  # …o, si lo instalaste como dependencia del proyecto:
242
- bunx openteam init
244
+ bunx openteam setup
243
245
  ```
244
246
 
245
247
  El asistente detecta Ollama / LM Studio / Foundry Local, te deja elegir los modelos locales y el frontier baseline, y escribe la configuración.
@@ -277,8 +279,8 @@ npm ls -g @jmanuelcorral/openteam # instalada globalmente (o `npm ls
277
279
 
278
280
  Notas al actualizar:
279
281
 
280
- - **No necesitas volver a ejecutar `openteam init`** para actualizar el plugin: opencode resuelve el paquete `@jmanuelcorral/openteam` declarado en `opencode.json` a la versión instalada. Reinicia opencode para que recargue el plugin.
281
- - Vuelve a ejecutar `openteam init` **solo** si quieres regenerar la configuración (cambiar runtimes, modelos o baseline). Pedirá confirmación antes de sobrescribir `opencode.json`, `.opencode/openteam.json` o `.opencode/agent/openteam.md`; **no toca los subagentes** que el orquestador haya creado a demanda.
282
+ - **No necesitas volver a ejecutar `openteam setup`** para actualizar el plugin: opencode resuelve el paquete `@jmanuelcorral/openteam` declarado en `opencode.json` a la versión instalada. Reinicia opencode para que recargue el plugin.
283
+ - Vuelve a ejecutar `openteam setup` **solo** si quieres regenerar la configuración (cambiar runtimes, modelos o baseline). Pedirá confirmación antes de sobrescribir `opencode.json`, `.opencode/openteam.json` o `.opencode/agent/openteam.md`; **no toca los subagentes** que el orquestador haya creado a demanda.
282
284
  - Ajustes puntuales sin reinit: `openteam baseline set <provider/model>` o `openteam baseline auto`.
283
285
 
284
286
  ## Configuración
@@ -345,7 +347,7 @@ Los cambios de `set`/`auto` se persisten en `.opencode/openteam.json` y aplican
345
347
 
346
348
  ### 2. Slash command `/openteam`
347
349
 
348
- `openteam init` **genera automáticamente** `.opencode/command/openteam.md`, así que el comando `/openteam` aparece en opencode sin pasos manuales. (Si vienes de una versión anterior, vuelve a ejecutar `openteam init` para crearlo, o cópialo a mano a tu proyecto o a `~/.config/opencode/command/`.) Después:
350
+ `openteam setup` **genera automáticamente** `.opencode/command/openteam.md`, así que el comando `/openteam` aparece en opencode sin pasos manuales. (Si vienes de una versión anterior, vuelve a ejecutar `openteam setup` para crearlo, o cópialo a mano a tu proyecto o a `~/.config/opencode/command/`.) Después:
349
351
 
350
352
  ```text
351
353
  /openteam baseline show
@@ -357,7 +359,7 @@ Los cambios de `set`/`auto` se persisten en `.opencode/openteam.json` y aplican
357
359
  /openteam report
358
360
  ```
359
361
 
360
- > ¿No ves `/openteam` en opencode? Asegúrate de que existe `.opencode/command/openteam.md` (lo crea `openteam init`) y **reinicia/recarga opencode** para que descubra el comando.
362
+ > ¿No ves `/openteam` en opencode? Asegúrate de que existe `.opencode/command/openteam.md` (lo crea `openteam setup`) y **reinicia/recarga opencode** para que descubra el comando.
361
363
 
362
364
  ### 3. CLI (`bin`)
363
365
 
@@ -409,7 +411,7 @@ openteam yolo on # activa YOLO
409
411
  openteam yolo off # desactiva YOLO
410
412
  ```
411
413
 
412
- También puedes activarlo durante `openteam init` (te lo pregunta), o al vuelo con `opencode --auto` sin tocar la config.
414
+ También puedes activarlo durante `openteam setup` (te lo pregunta), o al vuelo con `opencode --auto` sin tocar la config.
413
415
 
414
416
  > **Importante: el permiso del agente anula al global.** opencode fusiona el permiso del frontmatter de cada agente **después** del global y gana la última regla que casa; por eso `openteam yolo on/off` regenera `.opencode/agent/openteam.md` para que su `permission` coincida con el estado YOLO. Sin esto, un `bash: ask`/`external_directory: deny` en el agente seguiría pidiendo confirmación aunque el global fuese `"*": allow`. Tras cambiar el modo, **reinicia o recarga opencode** para que los agentes tomen los nuevos permisos, y crea los subagentes con el mismo comodín cuando YOLO esté activo (el orquestador ya lo hace).
415
417
 
@@ -423,7 +425,7 @@ Segundo modo de operación: un **bucle externo** que invoca `opencode run` contr
423
425
 
424
426
  openteam puede exponer un **panel web local** que se sirve **dentro del proceso de opencode** (hook `server()`), mientras la sesión está abierta. Muestra en vivo: ruteo reciente (coste/ahorro y modelo elegido, **solo hashes de prompt, nunca el texto**), progreso del backlog del loop, el equipo de agentes (LLM local/frontier de cada uno), últimos commits y actividad. Se actualiza por **SSE** (con *polling* de respaldo).
425
427
 
426
- `openteam init` **te pregunta si quieres activarlo** (puerto 4599 por defecto). También puedes activarlo a mano en `.opencode/openteam.json`:
428
+ `openteam setup` **te pregunta si quieres activarlo** (puerto 4599 por defecto). También puedes activarlo a mano en `.opencode/openteam.json`:
427
429
 
428
430
  ```json
429
431
  {
@@ -1,5 +1,5 @@
1
1
  import type { ModelCapabilityProfile } from "../capabilities/types";
2
- import type { DetectedRuntime, Prompter } from "../commands/init";
2
+ import type { DetectedRuntime, Prompter } from "../commands/setup";
3
3
  import { type ExecLike } from "../local/foundry-local";
4
4
  /** Prompter interactivo basado en @clack/prompts. */
5
5
  export declare const clackPrompter: Prompter;
@@ -9,4 +9,4 @@ export declare const clackPrompter: Prompter;
9
9
  */
10
10
  export declare function createLoadFrontierProfiles(): () => Promise<ModelCapabilityProfile[]>;
11
11
  export declare function createDetect(exec: ExecLike): () => Promise<DetectedRuntime[]>;
12
- //# sourceMappingURL=initAdapters.d.ts.map
12
+ //# sourceMappingURL=setupAdapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupAdapters.d.ts","sourceRoot":"","sources":["../../src/cli/setupAdapters.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EACV,eAAe,EAEf,QAAQ,EAET,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,QAAQ,EAEd,MAAM,wBAAwB,CAAC;AA2BhC,qDAAqD;AACrD,eAAO,MAAM,aAAa,EAAE,QA8D3B,CAAC;AAuBF;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,OAAO,CACzD,sBAAsB,EAAE,CACzB,CAcA;AACD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAuB7E"}
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import { access, mkdir as mkdir2, readdir, readFile as readFile2, writeFile as w
6
6
  import { dirname as dirname2, join as join2 } from "node:path";
7
7
  import { promisify } from "node:util";
8
8
 
9
- // src/cli/initAdapters.ts
9
+ // src/cli/setupAdapters.ts
10
10
  import {
11
11
  cancel,
12
12
  confirm,
@@ -670,7 +670,7 @@ class RuntimeRegistry {
670
670
  }
671
671
  }
672
672
 
673
- // src/cli/initAdapters.ts
673
+ // src/cli/setupAdapters.ts
674
674
  class PromptCancelledError extends Error {
675
675
  constructor() {
676
676
  super("prompt cancelado");
@@ -921,7 +921,7 @@ function modelText(classification) {
921
921
  function renderAgentList(classifications, context) {
922
922
  const lines = ["openteam agents — LLM por agente:", ""];
923
923
  if (classifications.length === 0) {
924
- lines.push(" (sin agentes en .opencode/agent/) — ejecuta 'openteam init' o pide al orquestador que cree el equipo.");
924
+ lines.push(" (sin agentes en .opencode/agent/) — ejecuta 'openteam setup' o pide al orquestador que cree el equipo.");
925
925
  return lines.join(`
926
926
  `);
927
927
  }
@@ -1454,7 +1454,7 @@ var HELP = [
1454
1454
  "openteam — comandos runtime",
1455
1455
  "",
1456
1456
  "Uso:",
1457
- " openteam init Configura opencode + openteam (interactivo)",
1457
+ " openteam setup Configura opencode + openteam (interactivo)",
1458
1458
  " openteam baseline show Muestra el baseline efectivo",
1459
1459
  " openteam baseline set <p/model> Fija el baseline (modo pinned)",
1460
1460
  " openteam baseline auto Baseline cheapest-capable (modo auto)",
@@ -1551,7 +1551,7 @@ ${HELP}`
1551
1551
  if (config === undefined) {
1552
1552
  return {
1553
1553
  exitCode: 1,
1554
- stdout: `No existe ${opencodeConfigPath}. Ejecuta 'openteam init' primero.`
1554
+ stdout: `No existe ${opencodeConfigPath}. Ejecuta 'openteam setup' primero.`
1555
1555
  };
1556
1556
  }
1557
1557
  if (sub === "status") {
@@ -1669,7 +1669,7 @@ ${HELP}`
1669
1669
  }
1670
1670
  }
1671
1671
 
1672
- // src/commands/init.ts
1672
+ // src/commands/setup.ts
1673
1673
  import { join } from "node:path";
1674
1674
 
1675
1675
  // src/config/persist.ts
@@ -1714,7 +1714,7 @@ function buildOpenteamCommand() {
1714
1714
  `);
1715
1715
  }
1716
1716
 
1717
- // src/commands/init.ts
1717
+ // src/commands/setup.ts
1718
1718
  var OPENTEAM_PLUGIN_SPEC = "@jmanuelcorral/openteam";
1719
1719
  var OPENCODE_CONFIG_PATH = "opencode.json";
1720
1720
  var KNOWN_RUNTIMES = [
@@ -1953,10 +1953,10 @@ async function chooseRuntimeModel(prompt, detected, meta) {
1953
1953
  }
1954
1954
  return prompt.select(opts);
1955
1955
  }
1956
- async function runInit(deps) {
1956
+ async function runSetup(deps) {
1957
1957
  const { prompt } = deps;
1958
1958
  try {
1959
- prompt.intro("openteam init — configura opencode con routing local-first");
1959
+ prompt.intro("openteam setup — configura opencode con routing local-first");
1960
1960
  const detected = await deps.detect();
1961
1961
  const detectedById = new Map(detected.map((item) => [item.id, item]));
1962
1962
  const reachableIds = detected.filter((item) => item.reachable).map((item) => item.id);
@@ -2085,8 +2085,8 @@ async function runInit(deps) {
2085
2085
  initial: false
2086
2086
  });
2087
2087
  if (!overwrite) {
2088
- prompt.outro("init cancelado: no se sobrescribió ninguna configuración.");
2089
- return { exitCode: 1, stdout: "init cancelado por el usuario" };
2088
+ prompt.outro("setup cancelado: no se sobrescribió ninguna configuración.");
2089
+ return { exitCode: 1, stdout: "setup cancelado por el usuario" };
2090
2090
  }
2091
2091
  }
2092
2092
  await deps.writeFile(openTeamPath, serializeOpenTeamConfig(openTeamConfig));
@@ -2110,11 +2110,11 @@ async function runInit(deps) {
2110
2110
  prompt.outro("Listo. Abre opencode y selecciona el agente 'openteam'.");
2111
2111
  return {
2112
2112
  exitCode: 0,
2113
- stdout: `openteam init completado: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}, ${ORCHESTRATOR_AGENT_PATH}, ${OPENTEAM_COMMAND_PATH}`
2113
+ stdout: `openteam setup completado: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}, ${ORCHESTRATOR_AGENT_PATH}, ${OPENTEAM_COMMAND_PATH}`
2114
2114
  };
2115
2115
  } catch (error) {
2116
2116
  const message = error instanceof Error ? error.message : String(error);
2117
- return { exitCode: 1, stdout: `Error en init: ${message}` };
2117
+ return { exitCode: 1, stdout: `Error en setup: ${message}` };
2118
2118
  }
2119
2119
  }
2120
2120
 
@@ -2268,7 +2268,7 @@ var deps = {
2268
2268
  orchestratorAgentPath: ORCHESTRATOR_AGENT_PATH,
2269
2269
  agentDir: AGENT_DIR
2270
2270
  };
2271
- function createInitDeps() {
2271
+ function createSetupDeps() {
2272
2272
  return {
2273
2273
  cwd: process.cwd(),
2274
2274
  detect: createDetect(nodeExec),
@@ -2290,8 +2290,8 @@ function createInitDeps() {
2290
2290
  }
2291
2291
  async function main() {
2292
2292
  const argv = process.argv.slice(2);
2293
- if (argv[0] === "init") {
2294
- const result2 = await runInit(createInitDeps());
2293
+ if (argv[0] === "setup" || argv[0] === "init") {
2294
+ const result2 = await runSetup(createSetupDeps());
2295
2295
  if (result2.stdout.length > 0) {
2296
2296
  process.stdout.write(`${result2.stdout}
2297
2297
  `);
@@ -1,6 +1,6 @@
1
- import type { FrontierChoice } from "./init";
1
+ import type { FrontierChoice } from "./setup";
2
2
  /**
3
- * Ruta relativa (al cwd) del agente primario que `openteam init` genera. El
3
+ * Ruta relativa (al cwd) del agente primario que `openteam setup` genera. El
4
4
  * nombre del fichero (`openteam`) es el nombre del agente en opencode.
5
5
  */
6
6
  export declare const ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
@@ -1 +1 @@
1
- {"version":3,"file":"orchestratorAgent.d.ts","sourceRoot":"","sources":["../../src/commands/orchestratorAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AAErE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,iCAAiC,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,MAAM,CAuLR"}
1
+ {"version":3,"file":"orchestratorAgent.d.ts","sourceRoot":"","sources":["../../src/commands/orchestratorAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AAErE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,iCAAiC,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,MAAM,CAuLR"}
@@ -14,7 +14,7 @@ export type KnownRuntime = {
14
14
  dynamicPort?: boolean;
15
15
  };
16
16
  /**
17
- * Runtimes locales que `openteam init` conoce y ofrece. El orden define el
17
+ * Runtimes locales que `openteam setup` conoce y ofrece. El orden define el
18
18
  * orden de las preguntas.
19
19
  */
20
20
  export declare const KNOWN_RUNTIMES: readonly KnownRuntime[];
@@ -36,7 +36,7 @@ export type FrontierChoice = {
36
36
  providerID: string;
37
37
  modelID: string;
38
38
  };
39
- export type InitAnswers = {
39
+ export type SetupAnswers = {
40
40
  runtimes: RuntimeChoice[];
41
41
  frontier: FrontierChoice;
42
42
  routerMode: RouterMode;
@@ -80,12 +80,12 @@ export declare function frontierModelsForProvider(profiles: readonly ModelCapabi
80
80
  * Construye y valida el OpenTeamConfig a partir de las respuestas del init.
81
81
  * Pure: no I/O.
82
82
  */
83
- export declare function buildOpenTeamConfig(answers: InitAnswers): OpenTeamConfig;
83
+ export declare function buildOpenTeamConfig(answers: SetupAnswers): OpenTeamConfig;
84
84
  /**
85
85
  * Construye el opencode.json: declara el plugin, los providers locales
86
86
  * OpenAI-compatible y el modelo por defecto (baseline frontier). Pure.
87
87
  */
88
- export declare function buildOpencodeConfig(answers: InitAnswers): OpencodeConfig;
88
+ export declare function buildOpencodeConfig(answers: SetupAnswers): OpencodeConfig;
89
89
  export declare function serializeOpencodeConfig(config: OpencodeConfig): string;
90
90
  export type SelectChoice<T> = {
91
91
  value: T;
@@ -123,7 +123,7 @@ export type Prompter = {
123
123
  initial?: string;
124
124
  }): Promise<string>;
125
125
  };
126
- export type InitDeps = {
126
+ export type SetupDeps = {
127
127
  cwd: string;
128
128
  detect: () => Promise<DetectedRuntime[]>;
129
129
  loadFrontierProfiles: () => Promise<ModelCapabilityProfile[]>;
@@ -131,5 +131,5 @@ export type InitDeps = {
131
131
  writeFile: (path: string, contents: string) => Promise<void>;
132
132
  fileExists: (path: string) => Promise<boolean>;
133
133
  };
134
- export declare function runInit(deps: InitDeps): Promise<CliResult>;
135
- //# sourceMappingURL=init.d.ts.map
134
+ export declare function runSetup(deps: SetupDeps): Promise<CliResult>;
135
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Ruta relativa (al cwd) del slash command `/openteam` que `openteam init`
2
+ * Ruta relativa (al cwd) del slash command `/openteam` que `openteam setup`
3
3
  * genera. opencode descubre los slash commands leyendo `.opencode/command/*.md`
4
4
  * (o `~/.config/opencode/command/`); el nombre del fichero (`openteam`) es el
5
5
  * nombre del comando, invocable como `/openteam`.
package/dist/index.js CHANGED
@@ -8,120 +8,6 @@ import {
8
8
  } from "node:fs/promises";
9
9
  import { dirname as dirname2, join } from "node:path";
10
10
 
11
- // src/config/persist.ts
12
- import { mkdir, writeFile } from "node:fs/promises";
13
- import { dirname } from "node:path";
14
-
15
- // src/config/schema.ts
16
- import { z } from "zod";
17
- var ModelRefSchema = z.object({
18
- providerID: z.string().min(1),
19
- modelID: z.string().min(1)
20
- });
21
- var RouterModeSchema = z.enum(["economy", "balanced", "quality"]);
22
- var PrivacyModeSchema = z.enum([
23
- "forceLocalOnSensitive",
24
- "consentBeforeFrontier",
25
- "off"
26
- ]);
27
- var BaselineModeSchema = z.enum(["auto", "pinned"]);
28
- var DashboardHostSchema = z.enum(["127.0.0.1", "localhost"]);
29
- var DashboardConfigSchema = z.object({
30
- enabled: z.boolean().default(false),
31
- host: DashboardHostSchema.default("127.0.0.1"),
32
- port: z.number().int().min(1024).max(65535).default(4599),
33
- autoPortFallback: z.boolean().default(true),
34
- refreshMs: z.number().int().min(250).default(2000),
35
- recentRoutes: z.number().int().positive().default(50),
36
- openBrowser: z.boolean().default(false)
37
- }).default({
38
- enabled: false,
39
- host: "127.0.0.1",
40
- port: 4599,
41
- autoPortFallback: true,
42
- refreshMs: 2000,
43
- recentRoutes: 50,
44
- openBrowser: false
45
- });
46
- var defaultLocalModel = {
47
- providerID: "ollama",
48
- modelID: "qwen3:8b"
49
- };
50
- var defaultFrontierModel = {
51
- providerID: "anthropic",
52
- modelID: "claude-sonnet-4-5"
53
- };
54
- var LocalRuntimeSchema = z.object({
55
- id: z.enum(["ollama", "lmstudio", "foundry-local"]),
56
- enabled: z.boolean().default(true),
57
- baseURL: z.string().url().optional(),
58
- discovery: z.enum(["cli", "sdk", "manual"]).optional(),
59
- defaultModel: ModelRefSchema
60
- });
61
- var OpenTeamConfigSchema = z.object({
62
- baseline: z.object({
63
- mode: BaselineModeSchema.default("auto"),
64
- pinnedModel: ModelRefSchema.nullable().default(null),
65
- hardDefault: ModelRefSchema.default(defaultFrontierModel)
66
- }).default({
67
- mode: "auto",
68
- pinnedModel: null,
69
- hardDefault: defaultFrontierModel
70
- }),
71
- router: z.object({
72
- mode: RouterModeSchema.default("balanced"),
73
- localDefault: ModelRefSchema.default(defaultLocalModel),
74
- trivialPromptMaxChars: z.number().int().positive().default(280),
75
- frontierPromptMinChars: z.number().int().positive().default(2000)
76
- }).default({
77
- mode: "balanced",
78
- localDefault: defaultLocalModel,
79
- trivialPromptMaxChars: 280,
80
- frontierPromptMinChars: 2000
81
- }),
82
- local: z.object({
83
- runtimes: z.array(LocalRuntimeSchema).min(1).default([
84
- {
85
- id: "ollama",
86
- enabled: true,
87
- baseURL: "http://localhost:11434/v1",
88
- defaultModel: { providerID: "ollama", modelID: "qwen3:8b" }
89
- }
90
- ])
91
- }).default({
92
- runtimes: [
93
- {
94
- id: "ollama",
95
- enabled: true,
96
- baseURL: "http://localhost:11434/v1",
97
- defaultModel: defaultLocalModel
98
- }
99
- ]
100
- }),
101
- budgets: z.object({
102
- sessionUSD: z.number().positive().optional(),
103
- monthlyUSD: z.number().positive().optional(),
104
- frontierTokensPerSession: z.number().int().positive().optional(),
105
- hardStopOnBudgetExhaustion: z.boolean().default(false)
106
- }).default({ hardStopOnBudgetExhaustion: false }),
107
- privacyMode: PrivacyModeSchema.default("forceLocalOnSensitive"),
108
- dashboard: DashboardConfigSchema
109
- });
110
-
111
- // src/config/persist.ts
112
- var DEFAULT_CONFIG_PATH = ".opencode/openteam.json";
113
- function serializeOpenTeamConfig(config) {
114
- const validated = OpenTeamConfigSchema.parse(config);
115
- return `${JSON.stringify(validated, null, 2)}
116
- `;
117
- }
118
- async function writeOpenTeamConfigFile(config, path = DEFAULT_CONFIG_PATH, deps = {}) {
119
- const mkdirFn = deps.mkdir ?? mkdir;
120
- const writeFileFn = deps.writeFile ?? writeFile;
121
- await mkdirFn(dirname(path), { recursive: true });
122
- await writeFileFn(path, serializeOpenTeamConfig(config), "utf8");
123
- }
124
-
125
11
  // src/commands/orchestratorAgent.ts
126
12
  var ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
127
13
  function buildOrchestratorAgent(frontier, options = {}) {
@@ -307,7 +193,121 @@ function buildOrchestratorAgent(frontier, options = {}) {
307
193
  ${body}`;
308
194
  }
309
195
 
310
- // src/commands/init.ts
196
+ // src/config/persist.ts
197
+ import { mkdir, writeFile } from "node:fs/promises";
198
+ import { dirname } from "node:path";
199
+
200
+ // src/config/schema.ts
201
+ import { z } from "zod";
202
+ var ModelRefSchema = z.object({
203
+ providerID: z.string().min(1),
204
+ modelID: z.string().min(1)
205
+ });
206
+ var RouterModeSchema = z.enum(["economy", "balanced", "quality"]);
207
+ var PrivacyModeSchema = z.enum([
208
+ "forceLocalOnSensitive",
209
+ "consentBeforeFrontier",
210
+ "off"
211
+ ]);
212
+ var BaselineModeSchema = z.enum(["auto", "pinned"]);
213
+ var DashboardHostSchema = z.enum(["127.0.0.1", "localhost"]);
214
+ var DashboardConfigSchema = z.object({
215
+ enabled: z.boolean().default(false),
216
+ host: DashboardHostSchema.default("127.0.0.1"),
217
+ port: z.number().int().min(1024).max(65535).default(4599),
218
+ autoPortFallback: z.boolean().default(true),
219
+ refreshMs: z.number().int().min(250).default(2000),
220
+ recentRoutes: z.number().int().positive().default(50),
221
+ openBrowser: z.boolean().default(false)
222
+ }).default({
223
+ enabled: false,
224
+ host: "127.0.0.1",
225
+ port: 4599,
226
+ autoPortFallback: true,
227
+ refreshMs: 2000,
228
+ recentRoutes: 50,
229
+ openBrowser: false
230
+ });
231
+ var defaultLocalModel = {
232
+ providerID: "ollama",
233
+ modelID: "qwen3:8b"
234
+ };
235
+ var defaultFrontierModel = {
236
+ providerID: "anthropic",
237
+ modelID: "claude-sonnet-4-5"
238
+ };
239
+ var LocalRuntimeSchema = z.object({
240
+ id: z.enum(["ollama", "lmstudio", "foundry-local"]),
241
+ enabled: z.boolean().default(true),
242
+ baseURL: z.string().url().optional(),
243
+ discovery: z.enum(["cli", "sdk", "manual"]).optional(),
244
+ defaultModel: ModelRefSchema
245
+ });
246
+ var OpenTeamConfigSchema = z.object({
247
+ baseline: z.object({
248
+ mode: BaselineModeSchema.default("auto"),
249
+ pinnedModel: ModelRefSchema.nullable().default(null),
250
+ hardDefault: ModelRefSchema.default(defaultFrontierModel)
251
+ }).default({
252
+ mode: "auto",
253
+ pinnedModel: null,
254
+ hardDefault: defaultFrontierModel
255
+ }),
256
+ router: z.object({
257
+ mode: RouterModeSchema.default("balanced"),
258
+ localDefault: ModelRefSchema.default(defaultLocalModel),
259
+ trivialPromptMaxChars: z.number().int().positive().default(280),
260
+ frontierPromptMinChars: z.number().int().positive().default(2000)
261
+ }).default({
262
+ mode: "balanced",
263
+ localDefault: defaultLocalModel,
264
+ trivialPromptMaxChars: 280,
265
+ frontierPromptMinChars: 2000
266
+ }),
267
+ local: z.object({
268
+ runtimes: z.array(LocalRuntimeSchema).min(1).default([
269
+ {
270
+ id: "ollama",
271
+ enabled: true,
272
+ baseURL: "http://localhost:11434/v1",
273
+ defaultModel: { providerID: "ollama", modelID: "qwen3:8b" }
274
+ }
275
+ ])
276
+ }).default({
277
+ runtimes: [
278
+ {
279
+ id: "ollama",
280
+ enabled: true,
281
+ baseURL: "http://localhost:11434/v1",
282
+ defaultModel: defaultLocalModel
283
+ }
284
+ ]
285
+ }),
286
+ budgets: z.object({
287
+ sessionUSD: z.number().positive().optional(),
288
+ monthlyUSD: z.number().positive().optional(),
289
+ frontierTokensPerSession: z.number().int().positive().optional(),
290
+ hardStopOnBudgetExhaustion: z.boolean().default(false)
291
+ }).default({ hardStopOnBudgetExhaustion: false }),
292
+ privacyMode: PrivacyModeSchema.default("forceLocalOnSensitive"),
293
+ dashboard: DashboardConfigSchema
294
+ });
295
+
296
+ // src/config/persist.ts
297
+ var DEFAULT_CONFIG_PATH = ".opencode/openteam.json";
298
+ function serializeOpenTeamConfig(config) {
299
+ const validated = OpenTeamConfigSchema.parse(config);
300
+ return `${JSON.stringify(validated, null, 2)}
301
+ `;
302
+ }
303
+ async function writeOpenTeamConfigFile(config, path = DEFAULT_CONFIG_PATH, deps = {}) {
304
+ const mkdirFn = deps.mkdir ?? mkdir;
305
+ const writeFileFn = deps.writeFile ?? writeFile;
306
+ await mkdirFn(dirname(path), { recursive: true });
307
+ await writeFileFn(path, serializeOpenTeamConfig(config), "utf8");
308
+ }
309
+
310
+ // src/commands/setup.ts
311
311
  var OPENCODE_CONFIG_PATH = "opencode.json";
312
312
 
313
313
  // src/config/load.ts
@@ -884,7 +884,7 @@ function modelText(classification) {
884
884
  function renderAgentList(classifications, context) {
885
885
  const lines = ["openteam agents — LLM por agente:", ""];
886
886
  if (classifications.length === 0) {
887
- lines.push(" (sin agentes en .opencode/agent/) — ejecuta 'openteam init' o pide al orquestador que cree el equipo.");
887
+ lines.push(" (sin agentes en .opencode/agent/) — ejecuta 'openteam setup' o pide al orquestador que cree el equipo.");
888
888
  return lines.join(`
889
889
  `);
890
890
  }
@@ -1136,7 +1136,7 @@ var HELP = [
1136
1136
  "openteam — comandos runtime",
1137
1137
  "",
1138
1138
  "Uso:",
1139
- " openteam init Configura opencode + openteam (interactivo)",
1139
+ " openteam setup Configura opencode + openteam (interactivo)",
1140
1140
  " openteam baseline show Muestra el baseline efectivo",
1141
1141
  " openteam baseline set <p/model> Fija el baseline (modo pinned)",
1142
1142
  " openteam baseline auto Baseline cheapest-capable (modo auto)",
@@ -1233,7 +1233,7 @@ ${HELP}`
1233
1233
  if (config === undefined) {
1234
1234
  return {
1235
1235
  exitCode: 1,
1236
- stdout: `No existe ${opencodeConfigPath}. Ejecuta 'openteam init' primero.`
1236
+ stdout: `No existe ${opencodeConfigPath}. Ejecuta 'openteam setup' primero.`
1237
1237
  };
1238
1238
  }
1239
1239
  if (sub === "status") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmanuelcorral/openteam",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "description": "Plugin opencode de routing coste-consciente local-first con orquestación Squad.",
5
5
  "license": "MIT",
6
6
  "author": "Jose Manuel Corral",
@@ -1 +0,0 @@
1
- {"version":3,"file":"initAdapters.d.ts","sourceRoot":"","sources":["../../src/cli/initAdapters.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EACV,eAAe,EAEf,QAAQ,EAET,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,QAAQ,EAEd,MAAM,wBAAwB,CAAC;AA2BhC,qDAAqD;AACrD,eAAO,MAAM,aAAa,EAAE,QA8D3B,CAAC;AAuBF;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,OAAO,CACzD,sBAAsB,EAAE,CACzB,CAcA;AACD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAuB7E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}