@jmanuelcorral/openteam 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -178,10 +178,11 @@ Durante desarrollo puedes cargar un plugin local desde `.opencode/plugins/opente
|
|
|
178
178
|
|
|
179
179
|
## Quickstart: `openteam init`
|
|
180
180
|
|
|
181
|
-
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
|
|
181
|
+
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:
|
|
182
182
|
|
|
183
183
|
- `opencode.json` en la raíz: declara el plugin `@jmanuelcorral/openteam`, los `provider` locales OpenAI-compatible, el `model` frontier y el `small_model` local.
|
|
184
184
|
- `.opencode/openteam.json`: la configuración runtime validada de openteam (baseline, routing, runtimes locales y privacidad).
|
|
185
|
+
- `.opencode/agent/openteam.md`: el **agente primario `openteam`** (estilo Squad), visible en el Tab-switcher.
|
|
185
186
|
|
|
186
187
|
```powershell
|
|
187
188
|
# Con el paquete instalado como dependencia del proyecto
|
|
@@ -200,6 +201,12 @@ El asistente:
|
|
|
200
201
|
|
|
201
202
|
Tras `init`, autentica el provider frontier (`opencode auth login`), arranca tu runtime local si no estaba activo y abre opencode en el repositorio: openteam enruta local-first automáticamente. Puedes reajustar el baseline después con `openteam baseline set <provider/model>` o `openteam baseline auto`.
|
|
202
203
|
|
|
204
|
+
### El agente `openteam` (estilo Squad)
|
|
205
|
+
|
|
206
|
+
`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.
|
|
207
|
+
|
|
208
|
+
Ese orquestador funciona al estilo [Squad](https://bradygaster.github.io/squad/): **no trae subagentes precreados**. A partir de tu primer prompt analiza el objetivo y el repositorio, diseña el equipo mínimo de especialistas y **crea cada subagente a demanda** (escribiendo `.opencode/agent/<rol>.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.
|
|
209
|
+
|
|
203
210
|
## Configuración
|
|
204
211
|
|
|
205
212
|
La configuración runtime canónica vive en `.opencode/openteam.json`; este repositorio incluye `.opencode/openteam.example.json` como ejemplo completo. La forma validada por Zod es la de `src/config/schema.ts`. `telemetry` es una opción del plugin leída por `src/index.ts`, no parte del objeto `OpenTeamConfig` persistido.
|
package/dist/cli.js
CHANGED
|
@@ -905,6 +905,77 @@ async function writeOpenTeamConfigFile(config, path = DEFAULT_CONFIG_PATH, deps
|
|
|
905
905
|
await writeFileFn(path, serializeOpenTeamConfig(config), "utf8");
|
|
906
906
|
}
|
|
907
907
|
|
|
908
|
+
// src/commands/orchestratorAgent.ts
|
|
909
|
+
var ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
|
|
910
|
+
function buildOrchestratorAgent(frontier) {
|
|
911
|
+
const model = `${frontier.providerID}/${frontier.modelID}`;
|
|
912
|
+
const frontmatter = [
|
|
913
|
+
"---",
|
|
914
|
+
'description: "Orquestador openteam estilo Squad: analiza el objetivo, diseña y crea el equipo de subagentes a demanda, y coordina el trabajo con routing local-first."',
|
|
915
|
+
"mode: primary",
|
|
916
|
+
`model: ${model}`,
|
|
917
|
+
"temperature: 0.2",
|
|
918
|
+
"permission:",
|
|
919
|
+
" read: allow",
|
|
920
|
+
" glob: allow",
|
|
921
|
+
" grep: allow",
|
|
922
|
+
" list: allow",
|
|
923
|
+
" edit: allow",
|
|
924
|
+
" bash: ask",
|
|
925
|
+
" task: allow",
|
|
926
|
+
" webfetch: allow",
|
|
927
|
+
" websearch: ask",
|
|
928
|
+
" external_directory: deny",
|
|
929
|
+
"---"
|
|
930
|
+
].join(`
|
|
931
|
+
`);
|
|
932
|
+
const body = [
|
|
933
|
+
"Eres el orquestador de **openteam**, al estilo Squad. Eres el único agente",
|
|
934
|
+
"primario: no existe un equipo precreado. Tú **construyes el equipo de",
|
|
935
|
+
"subagentes a demanda** según el objetivo del usuario y del repositorio.",
|
|
936
|
+
"",
|
|
937
|
+
"## Primer arranque (primer prompt de la sesión)",
|
|
938
|
+
"",
|
|
939
|
+
"1. Analiza el objetivo y explora el repositorio (`read`/`glob`/`grep`) para",
|
|
940
|
+
" entender stack, dominio y alcance real.",
|
|
941
|
+
"2. Diseña el **equipo mínimo** necesario: define solo los roles que el",
|
|
942
|
+
" trabajo requiera (p. ej. `architect`, `backend`, `frontend`, `reviewer`,",
|
|
943
|
+
" `tester`, `docs`). No inventes roles que no vayas a usar.",
|
|
944
|
+
"3. Crea cada subagente **a demanda** escribiendo `.opencode/agent/<rol>.md`:",
|
|
945
|
+
" - Frontmatter: `description` (obligatorio), `mode: subagent`,",
|
|
946
|
+
" `temperature`, `permission` con lo mínimo necesario, y `model`",
|
|
947
|
+
" **opcional**.",
|
|
948
|
+
" - Deja `model` sin fijar para que herede el default y openteam lo enrute",
|
|
949
|
+
" local-first, o fija un modelo local para roles mecánicos/bulk. Reserva",
|
|
950
|
+
" frontier solo para arquitectura, seguridad o debugging ambiguo:",
|
|
951
|
+
" openteam ya enruta cheapest-capable automáticamente.",
|
|
952
|
+
" - Un prompt de rol enfocado y accionable.",
|
|
953
|
+
"",
|
|
954
|
+
"## Operación",
|
|
955
|
+
"",
|
|
956
|
+
"- Delega el trabajo con la herramienta `task` al subagente adecuado; tú te",
|
|
957
|
+
" mantienes como coordinador y no implementas lo que puede hacer un subagente.",
|
|
958
|
+
"- Crea subagentes **justo cuando el trabajo lo pide**, nunca “por si acaso”.",
|
|
959
|
+
" Revisa `.opencode/agent/` y reutiliza los subagentes existentes antes de",
|
|
960
|
+
" crear uno nuevo.",
|
|
961
|
+
"- Respeta el routing y la privacidad de openteam: no fuerces modelos premium",
|
|
962
|
+
" y no envíes datos sensibles a frontier si la política fuerza local.",
|
|
963
|
+
"- Resume al usuario qué equipo has creado y por qué, y mantén el roster ligero.",
|
|
964
|
+
"",
|
|
965
|
+
"## Límites",
|
|
966
|
+
"",
|
|
967
|
+
"- Un único primario (tú); todo lo demás son subagentes creados a demanda.",
|
|
968
|
+
"- No borres ni sobrescribas subagentes creados previamente sin confirmarlo.",
|
|
969
|
+
"- Los subagentes nuevos quedan disponibles para `@mención` y para la",
|
|
970
|
+
" herramienta `task` una vez opencode recarga los agentes del proyecto.",
|
|
971
|
+
""
|
|
972
|
+
].join(`
|
|
973
|
+
`);
|
|
974
|
+
return `${frontmatter}
|
|
975
|
+
|
|
976
|
+
${body}`;
|
|
977
|
+
}
|
|
978
|
+
|
|
908
979
|
// src/commands/init.ts
|
|
909
980
|
var OPENTEAM_PLUGIN_SPEC = "@jmanuelcorral/openteam";
|
|
910
981
|
var OPENCODE_CONFIG_PATH = "opencode.json";
|
|
@@ -1159,8 +1230,10 @@ async function runInit(deps) {
|
|
|
1159
1230
|
};
|
|
1160
1231
|
const openTeamConfig = buildOpenTeamConfig(answers);
|
|
1161
1232
|
const opencodeConfig = buildOpencodeConfig(answers);
|
|
1233
|
+
const orchestratorAgent = buildOrchestratorAgent(frontier);
|
|
1162
1234
|
const openTeamPath = join(deps.cwd, DEFAULT_CONFIG_PATH);
|
|
1163
1235
|
const opencodePath = join(deps.cwd, OPENCODE_CONFIG_PATH);
|
|
1236
|
+
const agentPath = join(deps.cwd, ORCHESTRATOR_AGENT_PATH);
|
|
1164
1237
|
const existing = [];
|
|
1165
1238
|
if (await deps.fileExists(openTeamPath)) {
|
|
1166
1239
|
existing.push(DEFAULT_CONFIG_PATH);
|
|
@@ -1168,6 +1241,9 @@ async function runInit(deps) {
|
|
|
1168
1241
|
if (await deps.fileExists(opencodePath)) {
|
|
1169
1242
|
existing.push(OPENCODE_CONFIG_PATH);
|
|
1170
1243
|
}
|
|
1244
|
+
if (await deps.fileExists(agentPath)) {
|
|
1245
|
+
existing.push(ORCHESTRATOR_AGENT_PATH);
|
|
1246
|
+
}
|
|
1171
1247
|
if (existing.length > 0) {
|
|
1172
1248
|
const overwrite = await prompt.confirm({
|
|
1173
1249
|
message: `Ya existe ${existing.join(" y ")}. ¿Sobrescribir?`,
|
|
@@ -1180,21 +1256,23 @@ async function runInit(deps) {
|
|
|
1180
1256
|
}
|
|
1181
1257
|
await deps.writeFile(openTeamPath, serializeOpenTeamConfig(openTeamConfig));
|
|
1182
1258
|
await deps.writeFile(opencodePath, serializeOpencodeConfig(opencodeConfig));
|
|
1259
|
+
await deps.writeFile(agentPath, orchestratorAgent);
|
|
1183
1260
|
const enabledSummary = runtimes.filter((runtime) => runtime.enabled).map((runtime) => `${runtime.id} (${runtime.defaultModelID})`).join(", ");
|
|
1184
1261
|
prompt.note([
|
|
1185
1262
|
`Baseline frontier: ${frontier.providerID}/${frontier.modelID}`,
|
|
1186
1263
|
`Runtimes locales: ${enabledSummary || "ninguno habilitado"}`,
|
|
1187
|
-
`Escrito: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}`,
|
|
1264
|
+
`Escrito: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}, ${ORCHESTRATOR_AGENT_PATH}`,
|
|
1188
1265
|
"",
|
|
1189
1266
|
"Siguientes pasos:",
|
|
1190
1267
|
` 1. Autentica el provider frontier: opencode auth login`,
|
|
1191
|
-
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"
|
|
1268
|
+
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",
|
|
1269
|
+
" 3. Pulsa Tab y elige el agente 'openteam': creará el equipo a demanda"
|
|
1192
1270
|
].join(`
|
|
1193
1271
|
`), "openteam configurado");
|
|
1194
|
-
prompt.outro("Listo. Abre opencode
|
|
1272
|
+
prompt.outro("Listo. Abre opencode y selecciona el agente 'openteam'.");
|
|
1195
1273
|
return {
|
|
1196
1274
|
exitCode: 0,
|
|
1197
|
-
stdout: `openteam init completado: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}`
|
|
1275
|
+
stdout: `openteam init completado: ${OPENCODE_CONFIG_PATH}, ${DEFAULT_CONFIG_PATH}, ${ORCHESTRATOR_AGENT_PATH}`
|
|
1198
1276
|
};
|
|
1199
1277
|
} catch (error) {
|
|
1200
1278
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,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;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FrontierChoice } from "./init";
|
|
2
|
+
/**
|
|
3
|
+
* Ruta relativa (al cwd) del agente primario que `openteam init` genera. El
|
|
4
|
+
* nombre del fichero (`openteam`) es el nombre del agente en opencode.
|
|
5
|
+
*/
|
|
6
|
+
export declare const ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
|
|
7
|
+
/**
|
|
8
|
+
* Construye el Markdown del agente primario `openteam` (estilo Squad): un
|
|
9
|
+
* orquestador que aparece en el Tab-switcher y que crea el equipo de
|
|
10
|
+
* subagentes a demanda. Pure: no I/O.
|
|
11
|
+
*
|
|
12
|
+
* `frontier` fija el `model` del orquestador (baseline cheapest-capable), un
|
|
13
|
+
* `provider/model` real y resoluble; el plugin de openteam sigue enrutando por
|
|
14
|
+
* mensaje, así que los subagentes que cree pueden heredar el default y ser
|
|
15
|
+
* enrutados local-first.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildOrchestratorAgent(frontier: FrontierChoice): string;
|
|
18
|
+
//# sourceMappingURL=orchestratorAgent.d.ts.map
|
|
@@ -0,0 +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;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAkEvE"}
|