attocode 0.1.2 → 0.1.3
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/CHANGELOG.md +33 -1
- package/README.md +124 -0
- package/dist/src/agent.d.ts +73 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +443 -26
- package/dist/src/agent.js.map +1 -1
- package/dist/src/commands/agents-commands.d.ts +24 -0
- package/dist/src/commands/agents-commands.d.ts.map +1 -0
- package/dist/src/commands/agents-commands.js +284 -0
- package/dist/src/commands/agents-commands.js.map +1 -0
- package/dist/src/commands/handler.d.ts.map +1 -1
- package/dist/src/commands/handler.js +135 -19
- package/dist/src/commands/handler.js.map +1 -1
- package/dist/src/commands/init-commands.d.ts +35 -0
- package/dist/src/commands/init-commands.d.ts.map +1 -0
- package/dist/src/commands/init-commands.js +187 -0
- package/dist/src/commands/init-commands.js.map +1 -0
- package/dist/src/commands/skills-commands.d.ts +26 -0
- package/dist/src/commands/skills-commands.d.ts.map +1 -0
- package/dist/src/commands/skills-commands.js +309 -0
- package/dist/src/commands/skills-commands.js.map +1 -0
- package/dist/src/commands/types.d.ts +13 -2
- package/dist/src/commands/types.d.ts.map +1 -1
- package/dist/src/defaults.d.ts +21 -1
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +44 -0
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/integrations/agent-registry.d.ts +68 -2
- package/dist/src/integrations/agent-registry.d.ts.map +1 -1
- package/dist/src/integrations/agent-registry.js +230 -23
- package/dist/src/integrations/agent-registry.js.map +1 -1
- package/dist/src/integrations/cancellation.d.ts +5 -0
- package/dist/src/integrations/cancellation.d.ts.map +1 -1
- package/dist/src/integrations/cancellation.js +7 -0
- package/dist/src/integrations/cancellation.js.map +1 -1
- package/dist/src/integrations/capabilities.d.ts +160 -0
- package/dist/src/integrations/capabilities.d.ts.map +1 -0
- package/dist/src/integrations/capabilities.js +426 -0
- package/dist/src/integrations/capabilities.js.map +1 -0
- package/dist/src/integrations/context-engineering.d.ts +6 -1
- package/dist/src/integrations/context-engineering.d.ts.map +1 -1
- package/dist/src/integrations/context-engineering.js +7 -0
- package/dist/src/integrations/context-engineering.js.map +1 -1
- package/dist/src/integrations/index.d.ts +6 -2
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +10 -2
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/skill-executor.d.ts +113 -0
- package/dist/src/integrations/skill-executor.d.ts.map +1 -0
- package/dist/src/integrations/skill-executor.js +270 -0
- package/dist/src/integrations/skill-executor.js.map +1 -0
- package/dist/src/integrations/skills.d.ts +98 -7
- package/dist/src/integrations/skills.d.ts.map +1 -1
- package/dist/src/integrations/skills.js +210 -11
- package/dist/src/integrations/skills.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +131 -14
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/index.d.ts +1 -0
- package/dist/src/tui/index.d.ts.map +1 -1
- package/dist/src/tui/index.js +2 -0
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/transparency-aggregator.d.ts +100 -0
- package/dist/src/tui/transparency-aggregator.d.ts.map +1 -0
- package/dist/src/tui/transparency-aggregator.js +234 -0
- package/dist/src/tui/transparency-aggregator.js.map +1 -0
- package/dist/src/types.d.ts +94 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agents Management Commands
|
|
3
|
+
*
|
|
4
|
+
* Handles all /agents sub-commands for managing agents:
|
|
5
|
+
* - /agents - List all agents with enhanced formatting
|
|
6
|
+
* - /agents new <name> - Create a new agent scaffold
|
|
7
|
+
* - /agents info <name> - Show detailed agent information
|
|
8
|
+
* - /agents edit <name> - Open agent file in $EDITOR
|
|
9
|
+
*/
|
|
10
|
+
import { exec } from 'child_process';
|
|
11
|
+
import { promisify } from 'util';
|
|
12
|
+
import { getAgentLocationDisplay, getAgentStats, createAgentScaffold, } from '../integrations/index.js';
|
|
13
|
+
const execAsync = promisify(exec);
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// ANSI COLOR UTILITIES
|
|
16
|
+
// =============================================================================
|
|
17
|
+
const colors = {
|
|
18
|
+
reset: '\x1b[0m',
|
|
19
|
+
bold: '\x1b[1m',
|
|
20
|
+
dim: '\x1b[2m',
|
|
21
|
+
red: '\x1b[31m',
|
|
22
|
+
green: '\x1b[32m',
|
|
23
|
+
yellow: '\x1b[33m',
|
|
24
|
+
blue: '\x1b[34m',
|
|
25
|
+
magenta: '\x1b[35m',
|
|
26
|
+
cyan: '\x1b[36m',
|
|
27
|
+
white: '\x1b[37m',
|
|
28
|
+
};
|
|
29
|
+
function c(text, color) {
|
|
30
|
+
return `${colors[color]}${text}${colors.reset}`;
|
|
31
|
+
}
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// MODEL DISPLAY HELPERS
|
|
34
|
+
// =============================================================================
|
|
35
|
+
function formatModel(model) {
|
|
36
|
+
switch (model) {
|
|
37
|
+
case 'fast':
|
|
38
|
+
return c('haiku', 'cyan');
|
|
39
|
+
case 'balanced':
|
|
40
|
+
return c('sonnet', 'green');
|
|
41
|
+
case 'quality':
|
|
42
|
+
return c('opus', 'magenta');
|
|
43
|
+
default:
|
|
44
|
+
return c(model || 'default', 'dim');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// ENHANCED AGENT LIST FORMATTER
|
|
49
|
+
// =============================================================================
|
|
50
|
+
/**
|
|
51
|
+
* Format agents list with categorization and usage hints.
|
|
52
|
+
*/
|
|
53
|
+
export function formatEnhancedAgentList(agents) {
|
|
54
|
+
if (agents.length === 0) {
|
|
55
|
+
return `${c('No agents loaded.', 'dim')}
|
|
56
|
+
|
|
57
|
+
${c('To add agents:', 'bold')}
|
|
58
|
+
/agents new <name> Create a new agent in .attocode/agents/
|
|
59
|
+
|
|
60
|
+
${c('Agent Locations:', 'dim')}
|
|
61
|
+
~/.attocode/agents/ User-level agents (shared across projects)
|
|
62
|
+
.attocode/agents/ Project-level agents
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
const lines = [];
|
|
66
|
+
const stats = getAgentStats(agents);
|
|
67
|
+
const customCount = stats.user + stats.project + stats.legacy;
|
|
68
|
+
lines.push(`${c(`Agents (${agents.length} loaded: ${stats.builtin} built-in, ${customCount} custom)`, 'bold')}`);
|
|
69
|
+
lines.push('');
|
|
70
|
+
// Built-in agents
|
|
71
|
+
const builtIn = agents.filter(a => a.source === 'builtin');
|
|
72
|
+
if (builtIn.length > 0) {
|
|
73
|
+
lines.push(` ${c('BUILT-IN:', 'cyan')}`);
|
|
74
|
+
lines.push(` ${c('─'.repeat(60), 'dim')}`);
|
|
75
|
+
for (const agent of builtIn) {
|
|
76
|
+
const model = formatModel(agent.model);
|
|
77
|
+
const desc = agent.description.split('.')[0].slice(0, 40);
|
|
78
|
+
lines.push(` ${c(agent.name.padEnd(14), 'cyan')} ${desc.padEnd(42)} ${model}`);
|
|
79
|
+
}
|
|
80
|
+
lines.push('');
|
|
81
|
+
}
|
|
82
|
+
// User-defined agents
|
|
83
|
+
const userDefined = agents.filter(a => a.source === 'user' || a.source === 'project');
|
|
84
|
+
if (userDefined.length > 0) {
|
|
85
|
+
lines.push(` ${c('USER-DEFINED:', 'yellow')}`);
|
|
86
|
+
lines.push(` ${c('─'.repeat(60), 'dim')}`);
|
|
87
|
+
for (const agent of userDefined) {
|
|
88
|
+
const model = formatModel(agent.model);
|
|
89
|
+
const location = getAgentLocationDisplay(agent);
|
|
90
|
+
const desc = agent.description.split('.')[0].slice(0, 35);
|
|
91
|
+
lines.push(` ${c(agent.name.padEnd(14), 'yellow')} ${desc.padEnd(37)} ${model}`);
|
|
92
|
+
lines.push(` ${c(' '.repeat(14), 'dim')} ${c(`Source: ${location}`, 'dim')}`);
|
|
93
|
+
}
|
|
94
|
+
lines.push('');
|
|
95
|
+
}
|
|
96
|
+
// Legacy agents
|
|
97
|
+
const legacy = agents.filter(a => a.source === 'legacy');
|
|
98
|
+
if (legacy.length > 0) {
|
|
99
|
+
lines.push(` ${c('LEGACY (.agents/):', 'dim')}`);
|
|
100
|
+
lines.push(` ${c('─'.repeat(60), 'dim')}`);
|
|
101
|
+
for (const agent of legacy) {
|
|
102
|
+
const model = formatModel(agent.model);
|
|
103
|
+
const desc = agent.description.split('.')[0].slice(0, 40);
|
|
104
|
+
lines.push(` ${c(agent.name.padEnd(14), 'dim')} ${desc.padEnd(42)} ${model}`);
|
|
105
|
+
}
|
|
106
|
+
lines.push('');
|
|
107
|
+
}
|
|
108
|
+
// Commands
|
|
109
|
+
lines.push(` ${c('COMMANDS:', 'bold')}`);
|
|
110
|
+
lines.push(` ${c('/agents new <name>', 'cyan').padEnd(35)} Create new agent in .attocode/agents/`);
|
|
111
|
+
lines.push(` ${c('/agents info <name>', 'cyan').padEnd(35)} Show agent details`);
|
|
112
|
+
lines.push(` ${c('/agents edit <name>', 'cyan').padEnd(35)} Edit agent definition`);
|
|
113
|
+
lines.push(` ${c('/spawn <name> <task>', 'cyan').padEnd(35)} Spawn an agent with a task`);
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format detailed agent information.
|
|
118
|
+
*/
|
|
119
|
+
export function formatAgentInfo(agent) {
|
|
120
|
+
const lines = [];
|
|
121
|
+
lines.push(`${c(`Agent: ${agent.name}`, 'bold')}`);
|
|
122
|
+
lines.push(c('─'.repeat(60), 'dim'));
|
|
123
|
+
lines.push(` ${c('Description:', 'cyan').padEnd(20)} ${agent.description}`);
|
|
124
|
+
lines.push(` ${c('Source:', 'cyan').padEnd(20)} ${getAgentLocationDisplay(agent)}`);
|
|
125
|
+
if (agent.filePath) {
|
|
126
|
+
lines.push(` ${c('File:', 'cyan').padEnd(20)} ${agent.filePath}`);
|
|
127
|
+
}
|
|
128
|
+
lines.push(` ${c('Model:', 'cyan').padEnd(20)} ${formatModel(agent.model)}`);
|
|
129
|
+
if (agent.maxIterations) {
|
|
130
|
+
lines.push(` ${c('Max Iterations:', 'cyan').padEnd(20)} ${agent.maxIterations}`);
|
|
131
|
+
}
|
|
132
|
+
if (agent.maxTokenBudget) {
|
|
133
|
+
lines.push(` ${c('Token Budget:', 'cyan').padEnd(20)} ${agent.maxTokenBudget.toLocaleString()}`);
|
|
134
|
+
}
|
|
135
|
+
if (agent.capabilities && agent.capabilities.length > 0) {
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push(` ${c('Capabilities:', 'bold')}`);
|
|
138
|
+
lines.push(` ${agent.capabilities.join(', ')}`);
|
|
139
|
+
}
|
|
140
|
+
if (agent.tools && agent.tools.length > 0) {
|
|
141
|
+
lines.push('');
|
|
142
|
+
lines.push(` ${c('Tools Available:', 'bold')}`);
|
|
143
|
+
lines.push(` ${agent.tools.join(', ')}`);
|
|
144
|
+
}
|
|
145
|
+
if (agent.tags && agent.tags.length > 0) {
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push(` ${c('Tags:', 'bold')} ${agent.tags.join(', ')}`);
|
|
148
|
+
}
|
|
149
|
+
lines.push('');
|
|
150
|
+
lines.push(` ${c('Usage:', 'bold')}`);
|
|
151
|
+
lines.push(` /spawn ${agent.name} "<your task here>"`);
|
|
152
|
+
return lines.join('\n');
|
|
153
|
+
}
|
|
154
|
+
// =============================================================================
|
|
155
|
+
// COMMAND HANDLERS
|
|
156
|
+
// =============================================================================
|
|
157
|
+
/**
|
|
158
|
+
* Handle /agents command and sub-commands.
|
|
159
|
+
*/
|
|
160
|
+
export async function handleAgentsCommand(args, ctx, agentRegistry) {
|
|
161
|
+
const { output } = ctx;
|
|
162
|
+
if (args.length === 0) {
|
|
163
|
+
// List all agents
|
|
164
|
+
const agents = agentRegistry.getAllAgents();
|
|
165
|
+
output.log(formatEnhancedAgentList(agents));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const subCmd = args[0].toLowerCase();
|
|
169
|
+
switch (subCmd) {
|
|
170
|
+
case 'new': {
|
|
171
|
+
if (args.length < 2) {
|
|
172
|
+
output.log(c('Usage: /agents new <name> [--model fast|balanced|quality] [--description "..."]', 'yellow'));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const name = args[1];
|
|
176
|
+
// Parse optional flags
|
|
177
|
+
let model = 'balanced';
|
|
178
|
+
let description;
|
|
179
|
+
const capabilities = [];
|
|
180
|
+
const tools = [];
|
|
181
|
+
for (let i = 2; i < args.length; i++) {
|
|
182
|
+
if (args[i] === '--model' && args[i + 1]) {
|
|
183
|
+
const m = args[++i].toLowerCase();
|
|
184
|
+
if (m === 'fast' || m === 'balanced' || m === 'quality') {
|
|
185
|
+
model = m;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (args[i] === '--description' && args[i + 1]) {
|
|
189
|
+
description = args[++i];
|
|
190
|
+
}
|
|
191
|
+
else if (args[i] === '--capability' && args[i + 1]) {
|
|
192
|
+
capabilities.push(args[++i]);
|
|
193
|
+
}
|
|
194
|
+
else if (args[i] === '--tool' && args[i + 1]) {
|
|
195
|
+
tools.push(args[++i]);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
output.log(c(`Creating agent: ${name}...`, 'cyan'));
|
|
199
|
+
const result = await createAgentScaffold(name, {
|
|
200
|
+
model,
|
|
201
|
+
description,
|
|
202
|
+
capabilities: capabilities.length > 0 ? capabilities : undefined,
|
|
203
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
204
|
+
});
|
|
205
|
+
if (result.success) {
|
|
206
|
+
output.log(c(`+ Created agent: ${result.path}`, 'green'));
|
|
207
|
+
output.log('');
|
|
208
|
+
output.log(c('Edit the file to customize:', 'dim'));
|
|
209
|
+
output.log(c(' - Update the system prompt', 'dim'));
|
|
210
|
+
output.log(c(' - Add capabilities for NL matching', 'dim'));
|
|
211
|
+
output.log(c(' - Configure tools and iteration limits', 'dim'));
|
|
212
|
+
output.log('');
|
|
213
|
+
output.log(c(`Open in editor: /agents edit ${name}`, 'cyan'));
|
|
214
|
+
// Reload agents
|
|
215
|
+
await agentRegistry.loadUserAgents();
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
output.log(c(`x ${result.error}`, 'red'));
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case 'info': {
|
|
223
|
+
if (args.length < 2) {
|
|
224
|
+
output.log(c('Usage: /agents info <name>', 'yellow'));
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const name = args[1];
|
|
228
|
+
const agent = agentRegistry.getAgent(name);
|
|
229
|
+
if (!agent) {
|
|
230
|
+
output.log(c(`Agent not found: ${name}`, 'red'));
|
|
231
|
+
output.log(c('Use /agents to see available agents.', 'dim'));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
output.log(formatAgentInfo(agent));
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
case 'edit': {
|
|
238
|
+
if (args.length < 2) {
|
|
239
|
+
output.log(c('Usage: /agents edit <name>', 'yellow'));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const name = args[1];
|
|
243
|
+
const agent = agentRegistry.getAgent(name);
|
|
244
|
+
if (!agent) {
|
|
245
|
+
output.log(c(`Agent not found: ${name}`, 'red'));
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (!agent.filePath) {
|
|
249
|
+
output.log(c(`Cannot edit built-in agent: ${name}`, 'yellow'));
|
|
250
|
+
output.log(c('Create a custom version with: /agents new ' + name + '-custom', 'dim'));
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const editor = process.env.EDITOR || process.env.VISUAL || 'vim';
|
|
254
|
+
output.log(c(`Opening ${agent.filePath} in ${editor}...`, 'cyan'));
|
|
255
|
+
try {
|
|
256
|
+
await execAsync(`${editor} "${agent.filePath}"`);
|
|
257
|
+
output.log(c('+ Editor closed. Reloading agents...', 'green'));
|
|
258
|
+
// Reload agents after edit
|
|
259
|
+
await agentRegistry.loadUserAgents();
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
output.log(c(`Failed to open editor: ${error.message}`, 'red'));
|
|
263
|
+
output.log(c(`File path: ${agent.filePath}`, 'dim'));
|
|
264
|
+
}
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
case 'reload': {
|
|
268
|
+
output.log(c('Reloading agents...', 'cyan'));
|
|
269
|
+
await agentRegistry.loadUserAgents();
|
|
270
|
+
const count = agentRegistry.getAllAgents().length;
|
|
271
|
+
output.log(c(`+ Loaded ${count} agent(s)`, 'green'));
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
default:
|
|
275
|
+
output.log(c(`Unknown sub-command: ${subCmd}`, 'yellow'));
|
|
276
|
+
output.log(c('Usage:', 'bold'));
|
|
277
|
+
output.log(c(' /agents - List all agents', 'dim'));
|
|
278
|
+
output.log(c(' /agents new <name> - Create a new agent', 'dim'));
|
|
279
|
+
output.log(c(' /agents info <name> - Show agent details', 'dim'));
|
|
280
|
+
output.log(c(' /agents edit <name> - Open agent in $EDITOR', 'dim'));
|
|
281
|
+
output.log(c(' /agents reload - Reload all agents', 'dim'));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=agents-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-commands.js","sourceRoot":"","sources":["../../../src/commands/agents-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/commands/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/commands/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAwJhE;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,aAAa,CAAC,CA0xCxB;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,YAAY,EAAE,aAAa,CAMxE"}
|
|
@@ -5,8 +5,11 @@
|
|
|
5
5
|
* Uses CommandContext.output for all output, making it mode-agnostic.
|
|
6
6
|
*/
|
|
7
7
|
import { persistenceDebug, saveCheckpointToStore, } from '../integrations/persistence.js';
|
|
8
|
-
import { formatServerList, getContextUsage, formatCompactionResult } from '../integrations/index.js';
|
|
8
|
+
import { formatServerList, getContextUsage, formatCompactionResult, formatCapabilitiesSummary, formatCapabilitiesList, formatSearchResults, } from '../integrations/index.js';
|
|
9
9
|
import { formatSessionsTable } from '../session-picker.js';
|
|
10
|
+
import { handleSkillsCommand } from './skills-commands.js';
|
|
11
|
+
import { handleAgentsCommand } from './agents-commands.js';
|
|
12
|
+
import { handleInitCommand } from './init-commands.js';
|
|
10
13
|
// =============================================================================
|
|
11
14
|
// ANSI COLOR UTILITIES
|
|
12
15
|
// =============================================================================
|
|
@@ -103,8 +106,22 @@ ${c('PERMISSIONS & SECURITY', 'bold')}
|
|
|
103
106
|
${c('/grants', 'cyan')} Show active permission grants
|
|
104
107
|
${c('/audit', 'cyan')} Show security audit log
|
|
105
108
|
|
|
106
|
-
${c('
|
|
107
|
-
${c('/skills', 'cyan')} List
|
|
109
|
+
${c('SKILLS & AGENTS', 'bold')}
|
|
110
|
+
${c('/skills', 'cyan')} List all skills with usage hints
|
|
111
|
+
${c('/skills new <name>', 'cyan')} Create a new skill in .attocode/skills/
|
|
112
|
+
${c('/skills info <name>', 'cyan')} Show detailed skill information
|
|
113
|
+
${c('/skills enable/disable', 'cyan')} Activate or deactivate a skill
|
|
114
|
+
${c('/agents', 'cyan')} List all available agents
|
|
115
|
+
${c('/agents new <name>', 'cyan')} Create a new agent in .attocode/agents/
|
|
116
|
+
${c('/agents info <name>', 'cyan')} Show detailed agent information
|
|
117
|
+
|
|
118
|
+
${c('INITIALIZATION', 'bold')}
|
|
119
|
+
${c('/init', 'cyan')} Initialize .attocode/ directory structure
|
|
120
|
+
|
|
121
|
+
${c('CAPABILITIES & DEBUGGING', 'bold')}
|
|
122
|
+
${c('/powers', 'cyan')} Show all agent capabilities
|
|
123
|
+
${c('/powers <type>', 'cyan')} List by type (tools, skills, agents, mcp, commands)
|
|
124
|
+
${c('/powers search <q>', 'cyan')} Search capabilities
|
|
108
125
|
${c('/sandbox', 'cyan')} Show sandbox modes available
|
|
109
126
|
${c('/shell', 'cyan')} Show PTY shell integration info
|
|
110
127
|
${c('/lsp', 'cyan')} Show LSP integration status
|
|
@@ -129,7 +146,33 @@ ${c('━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
129
146
|
*/
|
|
130
147
|
export async function handleCommand(cmd, args, ctx) {
|
|
131
148
|
const { agent, sessionId, output, integrations } = ctx;
|
|
132
|
-
const { sessionStore, mcpClient, compactor } = integrations;
|
|
149
|
+
const { sessionStore, mcpClient, compactor, skillExecutor } = integrations;
|
|
150
|
+
// Check for skill invocation before built-in commands
|
|
151
|
+
if (skillExecutor) {
|
|
152
|
+
const skillName = skillExecutor.isSkillInvocation(cmd);
|
|
153
|
+
if (skillName) {
|
|
154
|
+
const result = await skillExecutor.executeSkill(skillName, args, {
|
|
155
|
+
cwd: process.cwd(),
|
|
156
|
+
sessionId,
|
|
157
|
+
});
|
|
158
|
+
if (result.success) {
|
|
159
|
+
if (result.injectedPrompt) {
|
|
160
|
+
output.log(c(`Invoking skill: /${skillName}`, 'cyan'));
|
|
161
|
+
// Return skill invocation for the caller to handle
|
|
162
|
+
return {
|
|
163
|
+
type: 'skill',
|
|
164
|
+
skillName,
|
|
165
|
+
injectedPrompt: result.injectedPrompt,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
output.log(c(result.output, 'green'));
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
output.log(c(`Skill error: ${result.error}`, 'red'));
|
|
172
|
+
}
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
133
176
|
switch (cmd) {
|
|
134
177
|
// =========================================================================
|
|
135
178
|
// GENERAL COMMANDS
|
|
@@ -655,9 +698,16 @@ ${c('Progress:', 'bold')}
|
|
|
655
698
|
// =========================================================================
|
|
656
699
|
case '/agents':
|
|
657
700
|
try {
|
|
658
|
-
const
|
|
659
|
-
|
|
660
|
-
|
|
701
|
+
const { agentRegistry } = integrations;
|
|
702
|
+
if (agentRegistry) {
|
|
703
|
+
await handleAgentsCommand(args, ctx, agentRegistry);
|
|
704
|
+
}
|
|
705
|
+
else {
|
|
706
|
+
// Fallback to legacy display if no agentRegistry
|
|
707
|
+
const agentList = agent.formatAgentList();
|
|
708
|
+
output.log(c('\nAvailable Agents:', 'bold'));
|
|
709
|
+
output.log(agentList);
|
|
710
|
+
}
|
|
661
711
|
}
|
|
662
712
|
catch (error) {
|
|
663
713
|
output.log(c(`Error: ${error.message}`, 'red'));
|
|
@@ -1168,20 +1218,25 @@ ${c('Note:', 'dim')} Theme switching is visual in TUI mode. REPL mode uses fixed
|
|
|
1168
1218
|
// =========================================================================
|
|
1169
1219
|
case '/skills':
|
|
1170
1220
|
try {
|
|
1171
|
-
const
|
|
1172
|
-
if (
|
|
1173
|
-
|
|
1174
|
-
output.log(c('Add .md files to .skills/ directory to create skills.', 'dim'));
|
|
1221
|
+
const { skillManager } = integrations;
|
|
1222
|
+
if (skillManager) {
|
|
1223
|
+
await handleSkillsCommand(args, ctx, skillManager);
|
|
1175
1224
|
}
|
|
1176
1225
|
else {
|
|
1177
|
-
|
|
1178
|
-
skills.
|
|
1179
|
-
|
|
1180
|
-
output.log(
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1226
|
+
// Fallback to legacy display if no skillManager
|
|
1227
|
+
const skills = agent.getSkills();
|
|
1228
|
+
if (skills.length === 0) {
|
|
1229
|
+
output.log(c('No skills loaded.', 'dim'));
|
|
1230
|
+
output.log(c('Add .md files to .attocode/skills/ directory to create skills.', 'dim'));
|
|
1231
|
+
}
|
|
1232
|
+
else {
|
|
1233
|
+
output.log(c('\nLoaded Skills:', 'bold'));
|
|
1234
|
+
skills.forEach((skill) => {
|
|
1235
|
+
const active = skill.active ? c('+', 'green') : c('o', 'dim');
|
|
1236
|
+
const invokable = skill.invokable ? c('[/]', 'magenta') : ' ';
|
|
1237
|
+
output.log(` ${active} ${invokable} ${c(skill.name, 'cyan')} - ${skill.description || 'No description'}`);
|
|
1238
|
+
});
|
|
1239
|
+
}
|
|
1185
1240
|
}
|
|
1186
1241
|
}
|
|
1187
1242
|
catch (error) {
|
|
@@ -1296,6 +1351,67 @@ ${c('Test it:', 'dim')}
|
|
|
1296
1351
|
`);
|
|
1297
1352
|
break;
|
|
1298
1353
|
// =========================================================================
|
|
1354
|
+
// CAPABILITIES DISCOVERY
|
|
1355
|
+
// =========================================================================
|
|
1356
|
+
case '/powers': {
|
|
1357
|
+
const capRegistry = agent.getCapabilitiesRegistry?.();
|
|
1358
|
+
if (!capRegistry) {
|
|
1359
|
+
output.log(c('Capabilities registry not available.', 'dim'));
|
|
1360
|
+
break;
|
|
1361
|
+
}
|
|
1362
|
+
capRegistry.refresh();
|
|
1363
|
+
const counts = capRegistry.getCounts();
|
|
1364
|
+
if (args.length === 0) {
|
|
1365
|
+
// Show summary
|
|
1366
|
+
output.log(c('\n' + formatCapabilitiesSummary(counts), 'reset'));
|
|
1367
|
+
output.log(c('\nUsage:', 'bold'));
|
|
1368
|
+
output.log(c(' /powers tools - List all tools', 'dim'));
|
|
1369
|
+
output.log(c(' /powers skills - List all skills', 'dim'));
|
|
1370
|
+
output.log(c(' /powers agents - List all agents', 'dim'));
|
|
1371
|
+
output.log(c(' /powers mcp - List MCP tools', 'dim'));
|
|
1372
|
+
output.log(c(' /powers commands - List commands', 'dim'));
|
|
1373
|
+
output.log(c(' /powers search <q> - Search all capabilities', 'dim'));
|
|
1374
|
+
}
|
|
1375
|
+
else if (args[0] === 'search' && args.length > 1) {
|
|
1376
|
+
const query = args.slice(1).join(' ');
|
|
1377
|
+
const results = capRegistry.search(query);
|
|
1378
|
+
output.log(c(`\nSearch: "${query}"\n`, 'cyan'));
|
|
1379
|
+
output.log(formatSearchResults(results));
|
|
1380
|
+
}
|
|
1381
|
+
else {
|
|
1382
|
+
// List by type
|
|
1383
|
+
const typeMap = {
|
|
1384
|
+
tools: 'tool',
|
|
1385
|
+
tool: 'tool',
|
|
1386
|
+
skills: 'skill',
|
|
1387
|
+
skill: 'skill',
|
|
1388
|
+
agents: 'agent',
|
|
1389
|
+
agent: 'agent',
|
|
1390
|
+
mcp: 'mcp_tool',
|
|
1391
|
+
'mcp-tools': 'mcp_tool',
|
|
1392
|
+
'mcp_tools': 'mcp_tool',
|
|
1393
|
+
commands: 'command',
|
|
1394
|
+
command: 'command',
|
|
1395
|
+
};
|
|
1396
|
+
const capType = typeMap[args[0]];
|
|
1397
|
+
if (capType) {
|
|
1398
|
+
const capabilities = capRegistry.getByType(capType);
|
|
1399
|
+
output.log(c('\n' + formatCapabilitiesList(capabilities, capType), 'reset'));
|
|
1400
|
+
}
|
|
1401
|
+
else {
|
|
1402
|
+
output.log(c(`Unknown capability type: ${args[0]}`, 'yellow'));
|
|
1403
|
+
output.log(c('Valid types: tools, skills, agents, mcp, commands', 'dim'));
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
break;
|
|
1407
|
+
}
|
|
1408
|
+
// =========================================================================
|
|
1409
|
+
// INITIALIZATION
|
|
1410
|
+
// =========================================================================
|
|
1411
|
+
case '/init':
|
|
1412
|
+
await handleInitCommand(args, ctx);
|
|
1413
|
+
break;
|
|
1414
|
+
// =========================================================================
|
|
1299
1415
|
// UNKNOWN COMMAND
|
|
1300
1416
|
// =========================================================================
|
|
1301
1417
|
default:
|