@iaforged/context-code 1.1.7 → 1.2.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.
Files changed (95) hide show
  1. package/README.md +56 -0
  2. package/dist/src/commands/agent/agent.js +62 -0
  3. package/dist/src/commands/agent/index.js +1 -1
  4. package/dist/src/commands/model/model.js +9 -5
  5. package/dist/src/commands/orchestrate/index.js +2 -2
  6. package/dist/src/commands/orchestrate/orchestrate.js +12 -627
  7. package/dist/src/commands/tasks/index.js +1 -1
  8. package/dist/src/commands/tasks/tasks.js +8 -3
  9. package/dist/src/commands/team/index.js +2 -2
  10. package/dist/src/commands/team/team.js +12 -589
  11. package/dist/src/commands/timeline/index.js +8 -0
  12. package/dist/src/commands/timeline/timeline.js +194 -0
  13. package/dist/src/commands/workspace/workspace.js +3 -3
  14. package/dist/src/commands.js +2 -6
  15. package/dist/src/components/AgentActivitySidebar.js +50 -0
  16. package/dist/src/components/AgentProgressLine.js +5 -5
  17. package/dist/src/components/ModelPicker.js +252 -441
  18. package/dist/src/components/PromptInput/Notifications.js +1 -1
  19. package/dist/src/components/PromptInput/PromptInput.js +7 -3
  20. package/dist/src/components/PromptInput/PromptInputFooter.js +10 -29
  21. package/dist/src/components/Spinner/TeammateSpinnerLine.js +20 -62
  22. package/dist/src/components/Spinner/TeammateSpinnerTree.js +16 -258
  23. package/dist/src/components/Spinner/teammateSelectHint.js +1 -1
  24. package/dist/src/components/Spinner/utils.js +3 -6
  25. package/dist/src/components/ThemeBrowser.js +120 -0
  26. package/dist/src/components/ThemePicker.js +113 -321
  27. package/dist/src/components/design-system/ThemeProvider.js +3 -0
  28. package/dist/src/components/mcp/MCPListPanel.js +138 -444
  29. package/dist/src/components/permissions/SandboxPermissionRequest.js +5 -5
  30. package/dist/src/components/teams/TeamStatus.js +7 -71
  31. package/dist/src/constants/spinnerVerbs.js +80 -180
  32. package/dist/src/context/modalStackContext.js +12 -0
  33. package/dist/src/hooks/useTextInput.js +28 -18
  34. package/dist/src/main.js +12 -0
  35. package/dist/src/screens/REPL.js +386 -320
  36. package/dist/src/services/api/errors.js +1 -1
  37. package/dist/src/services/api/openai.js +70 -22
  38. package/dist/src/services/api/withRetry.js +3 -2
  39. package/dist/src/skills/loadSkillsDir.js +1 -0
  40. package/dist/src/tools/AgentTool/UI.js +8 -8
  41. package/dist/src/tools/AgentTool/loadAgentsDir.js +9 -4
  42. package/dist/src/tools/AgentTool/providerAgents.js +71 -0
  43. package/dist/src/tools/BashTool/bashSecurity.js +1 -1
  44. package/dist/src/utils/handlePromptSubmit.js +12 -2
  45. package/dist/src/utils/processUserInput/processSlashCommand.js +9 -5
  46. package/dist/src/utils/sembleMcp/common.js +5 -0
  47. package/dist/src/utils/sembleMcp/setup.js +119 -0
  48. package/dist/src/utils/theme.js +24 -3
  49. package/dist/src/utils/themes/bootstrap.js +109 -0
  50. package/dist/src/utils/themes/builtin/opencode/_index.json +41 -0
  51. package/dist/src/utils/themes/builtin/opencode/amoled.json +49 -0
  52. package/dist/src/utils/themes/builtin/opencode/aura.json +51 -0
  53. package/dist/src/utils/themes/builtin/opencode/ayu.json +51 -0
  54. package/dist/src/utils/themes/builtin/opencode/carbonfox.json +53 -0
  55. package/dist/src/utils/themes/builtin/opencode/catppuccin-frappe.json +85 -0
  56. package/dist/src/utils/themes/builtin/opencode/catppuccin-macchiato.json +85 -0
  57. package/dist/src/utils/themes/builtin/opencode/catppuccin.json +45 -0
  58. package/dist/src/utils/themes/builtin/opencode/cobalt2.json +87 -0
  59. package/dist/src/utils/themes/builtin/opencode/cursor.json +91 -0
  60. package/dist/src/utils/themes/builtin/opencode/dracula.json +49 -0
  61. package/dist/src/utils/themes/builtin/opencode/everforest.json +89 -0
  62. package/dist/src/utils/themes/builtin/opencode/flexoki.json +86 -0
  63. package/dist/src/utils/themes/builtin/opencode/github.json +85 -0
  64. package/dist/src/utils/themes/builtin/opencode/gruvbox.json +45 -0
  65. package/dist/src/utils/themes/builtin/opencode/kanagawa.json +89 -0
  66. package/dist/src/utils/themes/builtin/opencode/lucent-orng.json +87 -0
  67. package/dist/src/utils/themes/builtin/opencode/material.json +87 -0
  68. package/dist/src/utils/themes/builtin/opencode/matrix.json +91 -0
  69. package/dist/src/utils/themes/builtin/opencode/mercury.json +86 -0
  70. package/dist/src/utils/themes/builtin/opencode/monokai.json +49 -0
  71. package/dist/src/utils/themes/builtin/opencode/nightowl.json +46 -0
  72. package/dist/src/utils/themes/builtin/opencode/nord.json +46 -0
  73. package/dist/src/utils/themes/builtin/opencode/oc-2.json +88 -0
  74. package/dist/src/utils/themes/builtin/opencode/one-dark.json +89 -0
  75. package/dist/src/utils/themes/builtin/opencode/onedarkpro.json +45 -0
  76. package/dist/src/utils/themes/builtin/opencode/opencode.json +89 -0
  77. package/dist/src/utils/themes/builtin/opencode/orng.json +87 -0
  78. package/dist/src/utils/themes/builtin/opencode/osaka-jade.json +88 -0
  79. package/dist/src/utils/themes/builtin/opencode/palenight.json +85 -0
  80. package/dist/src/utils/themes/builtin/opencode/rosepine.json +85 -0
  81. package/dist/src/utils/themes/builtin/opencode/shadesofpurple.json +51 -0
  82. package/dist/src/utils/themes/builtin/opencode/solarized.json +49 -0
  83. package/dist/src/utils/themes/builtin/opencode/synthwave84.json +87 -0
  84. package/dist/src/utils/themes/builtin/opencode/tokyonight.json +47 -0
  85. package/dist/src/utils/themes/builtin/opencode/vercel.json +90 -0
  86. package/dist/src/utils/themes/builtin/opencode/vesper.json +51 -0
  87. package/dist/src/utils/themes/builtin/opencode/zenburn.json +87 -0
  88. package/dist/src/utils/themes/index.js +4 -0
  89. package/dist/src/utils/themes/loader.js +147 -0
  90. package/dist/src/utils/themes/opencodeMapper.js +124 -0
  91. package/dist/src/utils/themes/resolver.js +66 -0
  92. package/dist/src/utils/themes/types.js +1 -0
  93. package/docs/MCP_SERVERS.md +27 -1
  94. package/docs/comandos.md +16 -4
  95. package/package.json +1 -1
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.
@@ -46,6 +78,30 @@ Comportamiento por defecto:
46
78
  - el idioma por defecto del dictado es espanol (`es`);
47
79
  - si quieres otro idioma o autodeteccion, puedes ajustarlo en la configuracion.
48
80
 
81
+ ## MCP integrados
82
+
83
+ Context Code soporta MCP externos, pero tambien incluye MCP integrados para ciertos flujos del runtime.
84
+
85
+ MCP integrados principales:
86
+
87
+ - `database`: expone herramientas de base de datos con prefijo `mcp__database__*` para operaciones como conexion, consultas, esquema, indices y transacciones sobre `Oracle`, `SQL Server`, `PostgreSQL` y `MySQL`.
88
+ - `semble`: expone herramientas de busqueda de codigo con prefijo `mcp__semble__*`, en particular `mcp__semble__search` y `mcp__semble__find_related`.
89
+
90
+ Comportamiento de `semble`:
91
+
92
+ - en el primer arranque, el CLI instala `semble` automaticamente si hace falta;
93
+ - si `uv` no existe, intenta instalarlo en una carpeta administrada por la aplicacion;
94
+ - despues instala `semble`, hace un warmup inicial y descarga el modelo local que usa para embeddings.
95
+
96
+ MCP opcionales o dependientes de plataforma/features:
97
+
98
+ - `claude-in-chrome`: integracion MCP para automatizacion y contexto desde navegadores Chromium compatibles cuando esa capacidad esta habilitada.
99
+ - `computer-use`: MCP orientado a interaccion asistida con interfaz grafica; su disponibilidad depende de plataforma y gates internos.
100
+
101
+ Para registrar servidores MCP externos y ver mas detalle sobre esta arquitectura:
102
+
103
+ - [Guia de MCP](docs/MCP_SERVERS.md)
104
+
49
105
  ## Documentacion
50
106
 
51
107
  Hemos organizado toda la documentacion tecnica, guias operativas y arquitectura en la carpeta `docs/`.
@@ -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;
@@ -111,17 +111,21 @@ export function ModelPickerWrapper(t0) {
111
111
  t3 = $[10];
112
112
  }
113
113
  let t4;
114
- if ($[11] !== handleCancel || $[12] !== handleSelect || $[13] !== mainLoopModel || $[14] !== mainLoopModelForSession || $[15] !== t3) {
115
- t4 = _jsx(ModelPicker, { initial: mainLoopModel, sessionModel: mainLoopModelForSession, onSelect: handleSelect, onCancel: handleCancel, isStandaloneCommand: true, showFastModeNotice: t3 });
114
+ if ($[11] !== handleCancel || $[12] !== handleSelect || $[13] !== mainLoopModel || $[14] !== mainLoopModelForSession || $[15] !== onDone || $[16] !== t3) {
115
+ t4 = _jsx(ModelPicker, { initial: mainLoopModel, sessionModel: mainLoopModelForSession, onSelect: handleSelect, onCancel: handleCancel, isStandaloneCommand: true, showFastModeNotice: t3, onOpenProvider: () => onDone('Abriendo selector de proveedor...', {
116
+ nextInput: '/provider',
117
+ submitNextInput: true
118
+ }) });
116
119
  $[11] = handleCancel;
117
120
  $[12] = handleSelect;
118
121
  $[13] = mainLoopModel;
119
122
  $[14] = mainLoopModelForSession;
120
- $[15] = t3;
121
- $[16] = t4;
123
+ $[15] = onDone;
124
+ $[16] = t3;
125
+ $[17] = t4;
122
126
  }
123
127
  else {
124
- t4 = $[16];
128
+ t4 = $[17];
125
129
  }
126
130
  return t4;
127
131
  }
@@ -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;