@iaforged/context-code 1.1.7 → 1.1.9

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
@@ -22,6 +22,38 @@ Luego abre tu proyecto y ejecuta:
22
22
  context
23
23
  ```
24
24
 
25
+ ## Flujo recomendado (Agent-First)
26
+
27
+ El flujo principal ahora se basa en `/agent`.
28
+
29
+ 1. Abre el gestor de agentes:
30
+
31
+ ```text
32
+ /agent
33
+ ```
34
+
35
+ 2. Crea agentes por rol (por ejemplo: `backend`, `frontend`, `qa`, `docs`).
36
+ 3. Pide tu objetivo directamente en el hilo principal para que el sistema delegue automaticamente.
37
+
38
+ Comandos utiles de `/agent`:
39
+
40
+ - `/agent list [proveedor]`
41
+ - `/agent create <proveedor> <name> [profile]`
42
+ - `/agent setup <proveedor> [model] [profile]`
43
+ - `/agent show <proveedor> <name>`
44
+ - `/agent set-role <proveedor> <name> <role>`
45
+ - `/agent set-orchestrator <proveedor> <name> <true|false>`
46
+ - `/agent set-model <proveedor> <name> <model|clear>`
47
+
48
+ Ejemplos rapidos:
49
+
50
+ ```text
51
+ /agent setup openai gpt-5
52
+ /agent setup claude opus
53
+ /agent setup zai
54
+ /agent list openai
55
+ ```
56
+
25
57
  ## Dictado local
26
58
 
27
59
  El CLI incluye dictado local con `whisper.cpp`, independiente del proveedor con el que estes logeado.
@@ -72,6 +72,7 @@ function getProviderLabel(provider) {
72
72
  function buildUsageMessage() {
73
73
  return [
74
74
  'Uso: /agent, /agent list [proveedor], /agent create <proveedor> <name> [profile],',
75
+ '/agent setup <proveedor> [model] [profile],',
75
76
  '/agent show <proveedor> <name>, /agent set-role <proveedor> <name> <role>,',
76
77
  '/agent set-orchestrator <proveedor> <name> <true|false>, /agent set-model <proveedor> <name> <model|clear>',
77
78
  ].join(' ');
@@ -170,6 +171,52 @@ function parseModelArgs(args) {
170
171
  const model = parseModelValue(tokens.slice(3));
171
172
  return { provider, name, model };
172
173
  }
174
+ const DEFAULT_BOOTSTRAP_SPECS = [
175
+ { name: 'orchestrator', role: 'orchestrator', isOrchestrator: true },
176
+ { name: 'backend', role: 'backend', isOrchestrator: false },
177
+ { name: 'frontend', role: 'frontend', isOrchestrator: false },
178
+ { name: 'qa', role: 'qa', isOrchestrator: false },
179
+ ];
180
+ function parseBootstrapArgs(args) {
181
+ const tokens = args.trim().split(/\s+/).filter(Boolean);
182
+ if (tokens[0]?.toLowerCase() !== 'setup') {
183
+ return null;
184
+ }
185
+ const provider = parseProvider(tokens[1]);
186
+ if (!provider) {
187
+ return null;
188
+ }
189
+ const modelToken = tokens[2];
190
+ const profileToken = tokens.slice(3).join(' ').trim();
191
+ const parsedModel = modelToken && !['-', 'none', 'clear'].includes(modelToken.toLowerCase())
192
+ ? modelToken.trim()
193
+ : null;
194
+ return {
195
+ provider,
196
+ model: parsedModel,
197
+ profileName: profileToken || undefined,
198
+ };
199
+ }
200
+ async function bootstrapProviderAgents(params) {
201
+ const lines = [];
202
+ for (const spec of DEFAULT_BOOTSTRAP_SPECS) {
203
+ const existing = await getAgent(params.provider, spec.name);
204
+ const current = existing ??
205
+ (await createAgent({
206
+ provider: params.provider,
207
+ name: spec.name,
208
+ profileName: params.profileName,
209
+ }));
210
+ const roleUpdated = await setAgentRoleByName(params.provider, current.name, spec.role);
211
+ const orchestratorUpdated = await setAgentOrchestratorByName(params.provider, current.name, spec.isOrchestrator);
212
+ const modelUpdated = await setAgentModelByName(params.provider, current.name, params.model);
213
+ lines.push(`${existing ? 'actualizado' : 'creado'} ${params.provider}/${current.name} role=${roleUpdated?.roleKind ?? spec.role} orchestrator=${orchestratorUpdated?.isOrchestrator ? 'true' : 'false'} model=${modelUpdated?.modelOverride ?? 'sin override'}`);
214
+ }
215
+ return [
216
+ `Setup completado para ${getProviderLabel(params.provider)} (${DEFAULT_BOOTSTRAP_SPECS.length} agentes):`,
217
+ ...lines,
218
+ ].join('\n');
219
+ }
173
220
  export const call = async (args, _context) => {
174
221
  const trimmed = args.trim();
175
222
  if (!trimmed || trimmed.toLowerCase() === 'list') {
@@ -213,6 +260,21 @@ export const call = async (args, _context) => {
213
260
  };
214
261
  }
215
262
  }
263
+ const setupArgs = parseBootstrapArgs(trimmed);
264
+ if (setupArgs) {
265
+ try {
266
+ return {
267
+ type: 'text',
268
+ value: await bootstrapProviderAgents(setupArgs),
269
+ };
270
+ }
271
+ catch (error) {
272
+ return {
273
+ type: 'text',
274
+ value: `No se pudo ejecutar setup: ${error instanceof Error ? error.message : String(error)}`,
275
+ };
276
+ }
277
+ }
216
278
  const showArgs = parseShowArgs(trimmed);
217
279
  if (showArgs) {
218
280
  const agent = await getAgent(showArgs.provider, showArgs.name);
@@ -3,7 +3,7 @@ const agent = {
3
3
  supportsNonInteractive: true,
4
4
  name: 'agent',
5
5
  description: 'Gestionar agentes por proveedor',
6
- argumentHint: '[list [proveedor]|create <proveedor> <name> [profile]|show <proveedor> <name>|set-role <proveedor> <name> <role>|set-orchestrator <proveedor> <name> <true|false>|set-model <proveedor> <name> <model|clear>]',
6
+ argumentHint: '[list [proveedor]|create <proveedor> <name> [profile]|setup <proveedor> [model] [profile]|show <proveedor> <name>|set-role <proveedor> <name> <role>|set-orchestrator <proveedor> <name> <true|false>|set-model <proveedor> <name> <model|clear>]',
7
7
  load: () => import('./agent.js'),
8
8
  };
9
9
  export default agent;
@@ -1,8 +1,8 @@
1
1
  const orchestrate = {
2
2
  type: 'local-jsx',
3
3
  name: 'orchestrate',
4
- description: 'Crear una ejecucion de orquestacion sobre un team',
5
- argumentHint: '<team> <objetivo>',
4
+ description: 'Transicion: el hilo principal ya orquesta en modo agent-first',
5
+ argumentHint: '[migrado a /agent + prompt directo]',
6
6
  load: () => import('./orchestrate.js'),
7
7
  };
8
8
  export default orchestrate;