@jmanuelcorral/openteam 0.1.18 → 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/.opencode/command/openteam.md +3 -1
- package/README.md +19 -13
- package/dist/cli/{initAdapters.d.ts → setupAdapters.d.ts} +2 -2
- package/dist/cli/setupAdapters.d.ts.map +1 -0
- package/dist/cli.js +50 -18
- package/dist/commands/orchestratorAgent.d.ts +2 -2
- package/dist/commands/orchestratorAgent.d.ts.map +1 -1
- package/dist/commands/{init.d.ts → setup.d.ts} +7 -7
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/slashCommand.d.ts +15 -0
- package/dist/commands/slashCommand.d.ts.map +1 -0
- package/dist/index.js +118 -118
- package/package.json +1 -1
- package/dist/cli/initAdapters.d.ts.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Comandos runtime de openteam (baseline show|set|auto, doctor, report)
|
|
2
|
+
description: Comandos runtime de openteam (baseline show|set|auto, doctor, agents, dashboard, report)
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
Usa la herramienta `openteam` para ejecutar el comando indicado por el usuario: $ARGUMENTS
|
|
@@ -10,6 +10,8 @@ Interpreta los argumentos así y llama a la herramienta `openteam` una sola vez:
|
|
|
10
10
|
- `baseline set <provider/model>` → `action: "set"`, `model: "<provider/model>"`
|
|
11
11
|
- `baseline auto` → `action: "auto"`
|
|
12
12
|
- `doctor` → `action: "doctor"`
|
|
13
|
+
- `agents` → `action: "agents"`
|
|
14
|
+
- `dashboard` → `action: "dashboard"`
|
|
13
15
|
- `report` → `action: "report"`
|
|
14
16
|
|
|
15
17
|
Devuelve la salida de la herramienta tal cual, sin reinterpretarla.
|
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
|
|
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
|
|
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
|
|
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
|
|
191
|
+
bunx openteam setup
|
|
192
192
|
# o, si lo tienes global
|
|
193
|
-
openteam
|
|
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
|
|
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
|
|
242
|
+
openteam setup # global
|
|
241
243
|
# …o, si lo instalaste como dependencia del proyecto:
|
|
242
|
-
bunx openteam
|
|
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
|
|
281
|
-
- Vuelve a ejecutar `openteam
|
|
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,16 +347,20 @@ Los cambios de `set`/`auto` se persisten en `.opencode/openteam.json` y aplican
|
|
|
345
347
|
|
|
346
348
|
### 2. Slash command `/openteam`
|
|
347
349
|
|
|
348
|
-
|
|
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
|
|
352
354
|
/openteam baseline set anthropic/claude-sonnet-4-5
|
|
353
355
|
/openteam baseline auto
|
|
354
356
|
/openteam doctor
|
|
357
|
+
/openteam agents
|
|
358
|
+
/openteam dashboard
|
|
355
359
|
/openteam report
|
|
356
360
|
```
|
|
357
361
|
|
|
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.
|
|
363
|
+
|
|
358
364
|
### 3. CLI (`bin`)
|
|
359
365
|
|
|
360
366
|
El paquete expone el binario `openteam`. Con instalación global:
|
|
@@ -405,7 +411,7 @@ openteam yolo on # activa YOLO
|
|
|
405
411
|
openteam yolo off # desactiva YOLO
|
|
406
412
|
```
|
|
407
413
|
|
|
408
|
-
También puedes activarlo durante `openteam
|
|
414
|
+
También puedes activarlo durante `openteam setup` (te lo pregunta), o al vuelo con `opencode --auto` sin tocar la config.
|
|
409
415
|
|
|
410
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).
|
|
411
417
|
|
|
@@ -419,7 +425,7 @@ Segundo modo de operación: un **bucle externo** que invoca `opencode run` contr
|
|
|
419
425
|
|
|
420
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).
|
|
421
427
|
|
|
422
|
-
`openteam
|
|
428
|
+
`openteam setup` **te pregunta si quieres activarlo** (puerto 4599 por defecto). También puedes activarlo a mano en `.opencode/openteam.json`:
|
|
423
429
|
|
|
424
430
|
```json
|
|
425
431
|
{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ModelCapabilityProfile } from "../capabilities/types";
|
|
2
|
-
import type { DetectedRuntime, Prompter } from "../commands/
|
|
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=
|
|
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/
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
1672
|
+
// src/commands/setup.ts
|
|
1673
1673
|
import { join } from "node:path";
|
|
1674
1674
|
|
|
1675
1675
|
// src/config/persist.ts
|
|
@@ -1688,7 +1688,33 @@ async function writeOpenTeamConfigFile(config, path = DEFAULT_CONFIG_PATH, deps
|
|
|
1688
1688
|
await writeFileFn(path, serializeOpenTeamConfig(config), "utf8");
|
|
1689
1689
|
}
|
|
1690
1690
|
|
|
1691
|
-
// src/commands/
|
|
1691
|
+
// src/commands/slashCommand.ts
|
|
1692
|
+
var OPENTEAM_COMMAND_PATH = ".opencode/command/openteam.md";
|
|
1693
|
+
function buildOpenteamCommand() {
|
|
1694
|
+
return [
|
|
1695
|
+
"---",
|
|
1696
|
+
"description: Comandos runtime de openteam (baseline show|set|auto, doctor, agents, dashboard, report)",
|
|
1697
|
+
"---",
|
|
1698
|
+
"",
|
|
1699
|
+
"Usa la herramienta `openteam` para ejecutar el comando indicado por el usuario: $ARGUMENTS",
|
|
1700
|
+
"",
|
|
1701
|
+
"Interpreta los argumentos así y llama a la herramienta `openteam` una sola vez:",
|
|
1702
|
+
"",
|
|
1703
|
+
'- `baseline show` (o vacío) → `action: "show"`',
|
|
1704
|
+
'- `baseline set <provider/model>` → `action: "set"`, `model: "<provider/model>"`',
|
|
1705
|
+
'- `baseline auto` → `action: "auto"`',
|
|
1706
|
+
'- `doctor` → `action: "doctor"`',
|
|
1707
|
+
'- `agents` → `action: "agents"`',
|
|
1708
|
+
'- `dashboard` → `action: "dashboard"`',
|
|
1709
|
+
'- `report` → `action: "report"`',
|
|
1710
|
+
"",
|
|
1711
|
+
"Devuelve la salida de la herramienta tal cual, sin reinterpretarla.",
|
|
1712
|
+
""
|
|
1713
|
+
].join(`
|
|
1714
|
+
`);
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
// src/commands/setup.ts
|
|
1692
1718
|
var OPENTEAM_PLUGIN_SPEC = "@jmanuelcorral/openteam";
|
|
1693
1719
|
var OPENCODE_CONFIG_PATH = "opencode.json";
|
|
1694
1720
|
var KNOWN_RUNTIMES = [
|
|
@@ -1927,10 +1953,10 @@ async function chooseRuntimeModel(prompt, detected, meta) {
|
|
|
1927
1953
|
}
|
|
1928
1954
|
return prompt.select(opts);
|
|
1929
1955
|
}
|
|
1930
|
-
async function
|
|
1956
|
+
async function runSetup(deps) {
|
|
1931
1957
|
const { prompt } = deps;
|
|
1932
1958
|
try {
|
|
1933
|
-
prompt.intro("openteam
|
|
1959
|
+
prompt.intro("openteam setup — configura opencode con routing local-first");
|
|
1934
1960
|
const detected = await deps.detect();
|
|
1935
1961
|
const detectedById = new Map(detected.map((item) => [item.id, item]));
|
|
1936
1962
|
const reachableIds = detected.filter((item) => item.reachable).map((item) => item.id);
|
|
@@ -2035,9 +2061,11 @@ async function runInit(deps) {
|
|
|
2035
2061
|
const openTeamConfig = buildOpenTeamConfig(answers);
|
|
2036
2062
|
const opencodeConfig = buildOpencodeConfig(answers);
|
|
2037
2063
|
const orchestratorAgent = buildOrchestratorAgent(frontier, { yolo });
|
|
2064
|
+
const slashCommand = buildOpenteamCommand();
|
|
2038
2065
|
const openTeamPath = join(deps.cwd, DEFAULT_CONFIG_PATH);
|
|
2039
2066
|
const opencodePath = join(deps.cwd, OPENCODE_CONFIG_PATH);
|
|
2040
2067
|
const agentPath = join(deps.cwd, ORCHESTRATOR_AGENT_PATH);
|
|
2068
|
+
const commandPath = join(deps.cwd, OPENTEAM_COMMAND_PATH);
|
|
2041
2069
|
const existing = [];
|
|
2042
2070
|
if (await deps.fileExists(openTeamPath)) {
|
|
2043
2071
|
existing.push(DEFAULT_CONFIG_PATH);
|
|
@@ -2048,41 +2076,45 @@ async function runInit(deps) {
|
|
|
2048
2076
|
if (await deps.fileExists(agentPath)) {
|
|
2049
2077
|
existing.push(ORCHESTRATOR_AGENT_PATH);
|
|
2050
2078
|
}
|
|
2079
|
+
if (await deps.fileExists(commandPath)) {
|
|
2080
|
+
existing.push(OPENTEAM_COMMAND_PATH);
|
|
2081
|
+
}
|
|
2051
2082
|
if (existing.length > 0) {
|
|
2052
2083
|
const overwrite = await prompt.confirm({
|
|
2053
2084
|
message: `Ya existe ${existing.join(" y ")}. ¿Sobrescribir?`,
|
|
2054
2085
|
initial: false
|
|
2055
2086
|
});
|
|
2056
2087
|
if (!overwrite) {
|
|
2057
|
-
prompt.outro("
|
|
2058
|
-
return { exitCode: 1, stdout: "
|
|
2088
|
+
prompt.outro("setup cancelado: no se sobrescribió ninguna configuración.");
|
|
2089
|
+
return { exitCode: 1, stdout: "setup cancelado por el usuario" };
|
|
2059
2090
|
}
|
|
2060
2091
|
}
|
|
2061
2092
|
await deps.writeFile(openTeamPath, serializeOpenTeamConfig(openTeamConfig));
|
|
2062
2093
|
await deps.writeFile(opencodePath, serializeOpencodeConfig(opencodeConfig));
|
|
2063
2094
|
await deps.writeFile(agentPath, orchestratorAgent);
|
|
2095
|
+
await deps.writeFile(commandPath, slashCommand);
|
|
2064
2096
|
const enabledSummary = runtimes.filter((runtime) => runtime.enabled).map((runtime) => `${runtime.id} (${runtime.defaultModelID})`).join(", ");
|
|
2065
2097
|
prompt.note([
|
|
2066
2098
|
`Baseline frontier: ${frontier.providerID}/${frontier.modelID}`,
|
|
2067
2099
|
`Runtimes locales: ${enabledSummary || "ninguno habilitado"}`,
|
|
2068
2100
|
`Modo YOLO: ${yolo ? "activado (auto-aprueba permisos)" : "desactivado"}`,
|
|
2069
2101
|
`Dashboard web: ${dashboard ? "activado (http://127.0.0.1:4599 mientras opencode esté abierto)" : "desactivado"}`,
|
|
2070
|
-
`Escrito: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}, ${ORCHESTRATOR_AGENT_PATH}`,
|
|
2102
|
+
`Escrito: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}, ${ORCHESTRATOR_AGENT_PATH}, ${OPENTEAM_COMMAND_PATH}`,
|
|
2071
2103
|
"",
|
|
2072
2104
|
"Siguientes pasos:",
|
|
2073
2105
|
` 1. Autentica el provider frontier: opencode auth login`,
|
|
2074
2106
|
reachableIds.length === 0 ? " 2. Arranca tu runtime local (Ollama/LM Studio/Foundry) antes de usarlo" : " 2. Abre opencode en este repo; openteam enruta local-first automáticamente",
|
|
2075
|
-
" 3. Pulsa Tab y elige el agente 'openteam'
|
|
2107
|
+
" 3. Pulsa Tab y elige el agente 'openteam', o usa el slash command /openteam"
|
|
2076
2108
|
].join(`
|
|
2077
2109
|
`), "openteam configurado");
|
|
2078
2110
|
prompt.outro("Listo. Abre opencode y selecciona el agente 'openteam'.");
|
|
2079
2111
|
return {
|
|
2080
2112
|
exitCode: 0,
|
|
2081
|
-
stdout: `openteam
|
|
2113
|
+
stdout: `openteam setup completado: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}, ${ORCHESTRATOR_AGENT_PATH}, ${OPENTEAM_COMMAND_PATH}`
|
|
2082
2114
|
};
|
|
2083
2115
|
} catch (error) {
|
|
2084
2116
|
const message = error instanceof Error ? error.message : String(error);
|
|
2085
|
-
return { exitCode: 1, stdout: `Error en
|
|
2117
|
+
return { exitCode: 1, stdout: `Error en setup: ${message}` };
|
|
2086
2118
|
}
|
|
2087
2119
|
}
|
|
2088
2120
|
|
|
@@ -2236,7 +2268,7 @@ var deps = {
|
|
|
2236
2268
|
orchestratorAgentPath: ORCHESTRATOR_AGENT_PATH,
|
|
2237
2269
|
agentDir: AGENT_DIR
|
|
2238
2270
|
};
|
|
2239
|
-
function
|
|
2271
|
+
function createSetupDeps() {
|
|
2240
2272
|
return {
|
|
2241
2273
|
cwd: process.cwd(),
|
|
2242
2274
|
detect: createDetect(nodeExec),
|
|
@@ -2258,8 +2290,8 @@ function createInitDeps() {
|
|
|
2258
2290
|
}
|
|
2259
2291
|
async function main() {
|
|
2260
2292
|
const argv = process.argv.slice(2);
|
|
2261
|
-
if (argv[0] === "init") {
|
|
2262
|
-
const result2 = await
|
|
2293
|
+
if (argv[0] === "setup" || argv[0] === "init") {
|
|
2294
|
+
const result2 = await runSetup(createSetupDeps());
|
|
2263
2295
|
if (result2.stdout.length > 0) {
|
|
2264
2296
|
process.stdout.write(`${result2.stdout}
|
|
2265
2297
|
`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { FrontierChoice } from "./
|
|
1
|
+
import type { FrontierChoice } from "./setup";
|
|
2
2
|
/**
|
|
3
|
-
* Ruta relativa (al cwd) del agente primario que `openteam
|
|
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,
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
135
|
-
//# sourceMappingURL=
|
|
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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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ruta relativa (al cwd) del slash command `/openteam` que `openteam setup`
|
|
3
|
+
* genera. opencode descubre los slash commands leyendo `.opencode/command/*.md`
|
|
4
|
+
* (o `~/.config/opencode/command/`); el nombre del fichero (`openteam`) es el
|
|
5
|
+
* nombre del comando, invocable como `/openteam`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const OPENTEAM_COMMAND_PATH = ".opencode/command/openteam.md";
|
|
8
|
+
/**
|
|
9
|
+
* Construye el Markdown del slash command `/openteam`. Enseña al agente a mapear
|
|
10
|
+
* los argumentos del usuario a una única llamada de la herramienta `openteam`.
|
|
11
|
+
* Debe mantenerse alineado con las acciones de `commandArgv` en
|
|
12
|
+
* `src/plugin/commandTool.ts`. Pure/determinista: sin I/O.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildOpenteamCommand(): string;
|
|
15
|
+
//# sourceMappingURL=slashCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slashCommand.d.ts","sourceRoot":"","sources":["../../src/commands/slashCommand.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,kCAAkC,CAAC;AAErE;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAqB7C"}
|
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/
|
|
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
|
|
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
|
|
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
|
|
1236
|
+
stdout: `No existe ${opencodeConfigPath}. Ejecuta 'openteam setup' primero.`
|
|
1237
1237
|
};
|
|
1238
1238
|
}
|
|
1239
1239
|
if (sub === "status") {
|
package/package.json
CHANGED
|
@@ -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":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAKpE,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAE9D,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,cAAc,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAmBjD,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,cAAc,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,cAAc,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAoBF,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAEvE;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,GAAE,SAAS,sBAAsB,EAA8B,GACtE,cAAc,EAAE,CAKlB;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAC1C,MAAM,EAAE,CAIV;AAED,0EAA0E;AAC1E,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAC3C,UAAU,EAAE,MAAM,GACjB,sBAAsB,EAAE,CAI1B;AAgBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAwCxE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAiDxE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEtE;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,CAAC,CAAC;KACb,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACf,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACzC,oBAAoB,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD,CAAC;AA6IF,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAkNhE"}
|