@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.
- package/README.md +56 -0
- package/dist/src/commands/agent/agent.js +62 -0
- package/dist/src/commands/agent/index.js +1 -1
- package/dist/src/commands/model/model.js +9 -5
- package/dist/src/commands/orchestrate/index.js +2 -2
- package/dist/src/commands/orchestrate/orchestrate.js +12 -627
- package/dist/src/commands/tasks/index.js +1 -1
- package/dist/src/commands/tasks/tasks.js +8 -3
- package/dist/src/commands/team/index.js +2 -2
- package/dist/src/commands/team/team.js +12 -589
- package/dist/src/commands/timeline/index.js +8 -0
- package/dist/src/commands/timeline/timeline.js +194 -0
- package/dist/src/commands/workspace/workspace.js +3 -3
- package/dist/src/commands.js +2 -6
- package/dist/src/components/AgentActivitySidebar.js +50 -0
- package/dist/src/components/AgentProgressLine.js +5 -5
- package/dist/src/components/ModelPicker.js +252 -441
- package/dist/src/components/PromptInput/Notifications.js +1 -1
- package/dist/src/components/PromptInput/PromptInput.js +7 -3
- package/dist/src/components/PromptInput/PromptInputFooter.js +10 -29
- package/dist/src/components/Spinner/TeammateSpinnerLine.js +20 -62
- package/dist/src/components/Spinner/TeammateSpinnerTree.js +16 -258
- package/dist/src/components/Spinner/teammateSelectHint.js +1 -1
- package/dist/src/components/Spinner/utils.js +3 -6
- package/dist/src/components/ThemeBrowser.js +120 -0
- package/dist/src/components/ThemePicker.js +113 -321
- package/dist/src/components/design-system/ThemeProvider.js +3 -0
- package/dist/src/components/mcp/MCPListPanel.js +138 -444
- package/dist/src/components/permissions/SandboxPermissionRequest.js +5 -5
- package/dist/src/components/teams/TeamStatus.js +7 -71
- package/dist/src/constants/spinnerVerbs.js +80 -180
- package/dist/src/context/modalStackContext.js +12 -0
- package/dist/src/hooks/useTextInput.js +28 -18
- package/dist/src/main.js +12 -0
- package/dist/src/screens/REPL.js +386 -320
- package/dist/src/services/api/errors.js +1 -1
- package/dist/src/services/api/openai.js +70 -22
- package/dist/src/services/api/withRetry.js +3 -2
- package/dist/src/skills/loadSkillsDir.js +1 -0
- package/dist/src/tools/AgentTool/UI.js +8 -8
- package/dist/src/tools/AgentTool/loadAgentsDir.js +9 -4
- package/dist/src/tools/AgentTool/providerAgents.js +71 -0
- package/dist/src/tools/BashTool/bashSecurity.js +1 -1
- package/dist/src/utils/handlePromptSubmit.js +12 -2
- package/dist/src/utils/processUserInput/processSlashCommand.js +9 -5
- package/dist/src/utils/sembleMcp/common.js +5 -0
- package/dist/src/utils/sembleMcp/setup.js +119 -0
- package/dist/src/utils/theme.js +24 -3
- package/dist/src/utils/themes/bootstrap.js +109 -0
- package/dist/src/utils/themes/builtin/opencode/_index.json +41 -0
- package/dist/src/utils/themes/builtin/opencode/amoled.json +49 -0
- package/dist/src/utils/themes/builtin/opencode/aura.json +51 -0
- package/dist/src/utils/themes/builtin/opencode/ayu.json +51 -0
- package/dist/src/utils/themes/builtin/opencode/carbonfox.json +53 -0
- package/dist/src/utils/themes/builtin/opencode/catppuccin-frappe.json +85 -0
- package/dist/src/utils/themes/builtin/opencode/catppuccin-macchiato.json +85 -0
- package/dist/src/utils/themes/builtin/opencode/catppuccin.json +45 -0
- package/dist/src/utils/themes/builtin/opencode/cobalt2.json +87 -0
- package/dist/src/utils/themes/builtin/opencode/cursor.json +91 -0
- package/dist/src/utils/themes/builtin/opencode/dracula.json +49 -0
- package/dist/src/utils/themes/builtin/opencode/everforest.json +89 -0
- package/dist/src/utils/themes/builtin/opencode/flexoki.json +86 -0
- package/dist/src/utils/themes/builtin/opencode/github.json +85 -0
- package/dist/src/utils/themes/builtin/opencode/gruvbox.json +45 -0
- package/dist/src/utils/themes/builtin/opencode/kanagawa.json +89 -0
- package/dist/src/utils/themes/builtin/opencode/lucent-orng.json +87 -0
- package/dist/src/utils/themes/builtin/opencode/material.json +87 -0
- package/dist/src/utils/themes/builtin/opencode/matrix.json +91 -0
- package/dist/src/utils/themes/builtin/opencode/mercury.json +86 -0
- package/dist/src/utils/themes/builtin/opencode/monokai.json +49 -0
- package/dist/src/utils/themes/builtin/opencode/nightowl.json +46 -0
- package/dist/src/utils/themes/builtin/opencode/nord.json +46 -0
- package/dist/src/utils/themes/builtin/opencode/oc-2.json +88 -0
- package/dist/src/utils/themes/builtin/opencode/one-dark.json +89 -0
- package/dist/src/utils/themes/builtin/opencode/onedarkpro.json +45 -0
- package/dist/src/utils/themes/builtin/opencode/opencode.json +89 -0
- package/dist/src/utils/themes/builtin/opencode/orng.json +87 -0
- package/dist/src/utils/themes/builtin/opencode/osaka-jade.json +88 -0
- package/dist/src/utils/themes/builtin/opencode/palenight.json +85 -0
- package/dist/src/utils/themes/builtin/opencode/rosepine.json +85 -0
- package/dist/src/utils/themes/builtin/opencode/shadesofpurple.json +51 -0
- package/dist/src/utils/themes/builtin/opencode/solarized.json +49 -0
- package/dist/src/utils/themes/builtin/opencode/synthwave84.json +87 -0
- package/dist/src/utils/themes/builtin/opencode/tokyonight.json +47 -0
- package/dist/src/utils/themes/builtin/opencode/vercel.json +90 -0
- package/dist/src/utils/themes/builtin/opencode/vesper.json +51 -0
- package/dist/src/utils/themes/builtin/opencode/zenburn.json +87 -0
- package/dist/src/utils/themes/index.js +4 -0
- package/dist/src/utils/themes/loader.js +147 -0
- package/dist/src/utils/themes/opencodeMapper.js +124 -0
- package/dist/src/utils/themes/resolver.js +66 -0
- package/dist/src/utils/themes/types.js +1 -0
- package/docs/MCP_SERVERS.md +27 -1
- package/docs/comandos.md +16 -4
- 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] =
|
|
121
|
-
$[16] =
|
|
123
|
+
$[15] = onDone;
|
|
124
|
+
$[16] = t3;
|
|
125
|
+
$[17] = t4;
|
|
122
126
|
}
|
|
123
127
|
else {
|
|
124
|
-
t4 = $[
|
|
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: '
|
|
5
|
-
argumentHint: '
|
|
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;
|