@claude-flow/cli 3.0.0-alpha.2 → 3.0.0-alpha.21
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 +172 -6
- package/bin/cli.js +0 -0
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +43 -27
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.d.ts +19 -0
- package/dist/src/commands/analyze.d.ts.map +1 -0
- package/dist/src/commands/analyze.js +1823 -0
- package/dist/src/commands/analyze.js.map +1 -0
- package/dist/src/commands/claims.d.ts +10 -0
- package/dist/src/commands/claims.d.ts.map +1 -0
- package/dist/src/commands/claims.js +288 -0
- package/dist/src/commands/claims.js.map +1 -0
- package/dist/src/commands/completions.d.ts +10 -0
- package/dist/src/commands/completions.d.ts.map +1 -0
- package/dist/src/commands/completions.js +539 -0
- package/dist/src/commands/completions.js.map +1 -0
- package/dist/src/commands/config.js +2 -2
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.d.ts +8 -0
- package/dist/src/commands/daemon.d.ts.map +1 -0
- package/dist/src/commands/daemon.js +545 -0
- package/dist/src/commands/daemon.js.map +1 -0
- package/dist/src/commands/deployment.d.ts +10 -0
- package/dist/src/commands/deployment.d.ts.map +1 -0
- package/dist/src/commands/deployment.js +289 -0
- package/dist/src/commands/deployment.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +10 -0
- package/dist/src/commands/doctor.d.ts.map +1 -0
- package/dist/src/commands/doctor.js +429 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/embeddings.d.ts +18 -0
- package/dist/src/commands/embeddings.d.ts.map +1 -0
- package/dist/src/commands/embeddings.js +616 -0
- package/dist/src/commands/embeddings.js.map +1 -0
- package/dist/src/commands/hive-mind.d.ts.map +1 -1
- package/dist/src/commands/hive-mind.js +252 -35
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +326 -2
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +13 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +52 -1
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/mcp.js +4 -4
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +236 -170
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +1 -1
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.d.ts +10 -0
- package/dist/src/commands/neural.d.ts.map +1 -0
- package/dist/src/commands/neural.js +224 -0
- package/dist/src/commands/neural.js.map +1 -0
- package/dist/src/commands/performance.d.ts +10 -0
- package/dist/src/commands/performance.d.ts.map +1 -0
- package/dist/src/commands/performance.js +262 -0
- package/dist/src/commands/performance.js.map +1 -0
- package/dist/src/commands/plugins.d.ts +10 -0
- package/dist/src/commands/plugins.d.ts.map +1 -0
- package/dist/src/commands/plugins.js +280 -0
- package/dist/src/commands/plugins.js.map +1 -0
- package/dist/src/commands/process.d.ts.map +1 -1
- package/dist/src/commands/process.js +95 -20
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/providers.d.ts +10 -0
- package/dist/src/commands/providers.d.ts.map +1 -0
- package/dist/src/commands/providers.js +232 -0
- package/dist/src/commands/providers.js.map +1 -0
- package/dist/src/commands/route.d.ts +16 -0
- package/dist/src/commands/route.d.ts.map +1 -0
- package/dist/src/commands/route.js +603 -0
- package/dist/src/commands/route.js.map +1 -0
- package/dist/src/commands/security.d.ts +10 -0
- package/dist/src/commands/security.d.ts.map +1 -0
- package/dist/src/commands/security.js +261 -0
- package/dist/src/commands/security.js.map +1 -0
- package/dist/src/commands/start.js +2 -2
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +26 -2
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +6 -6
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +63 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/claudemd-generator.d.ts.map +1 -1
- package/dist/src/init/claudemd-generator.js +218 -362
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +5 -0
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +22 -12
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +17 -1
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp-server.js +5 -0
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +350 -14
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
- package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/analyze-tools.js +317 -0
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -0
- package/dist/src/mcp-tools/config-tools.d.ts +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +262 -15
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/hive-mind-tools.js +447 -0
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -0
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +80 -15
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +6 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +6 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +157 -9
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.d.ts +8 -0
- package/dist/src/mcp-tools/session-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/session-tools.js +315 -0
- package/dist/src/mcp-tools/session-tools.js.map +1 -0
- package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +37 -2
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts +8 -0
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/task-tools.js +302 -0
- package/dist/src/mcp-tools/task-tools.js.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.js +481 -0
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -0
- package/dist/src/output.d.ts +16 -0
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +42 -0
- package/dist/src/output.js.map +1 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/dist/src/ruvector/ast-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +277 -0
- package/dist/src/ruvector/ast-analyzer.js.map +1 -0
- package/dist/src/ruvector/coverage-router.d.ts +145 -0
- package/dist/src/ruvector/coverage-router.d.ts.map +1 -0
- package/dist/src/ruvector/coverage-router.js +451 -0
- package/dist/src/ruvector/coverage-router.js.map +1 -0
- package/dist/src/ruvector/coverage-tools.d.ts +33 -0
- package/dist/src/ruvector/coverage-tools.d.ts.map +1 -0
- package/dist/src/ruvector/coverage-tools.js +157 -0
- package/dist/src/ruvector/coverage-tools.js.map +1 -0
- package/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/dist/src/ruvector/diff-classifier.d.ts.map +1 -0
- package/dist/src/ruvector/diff-classifier.js +662 -0
- package/dist/src/ruvector/diff-classifier.js.map +1 -0
- package/dist/src/ruvector/graph-analyzer.d.ts +174 -0
- package/dist/src/ruvector/graph-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/graph-analyzer.js +878 -0
- package/dist/src/ruvector/graph-analyzer.js.map +1 -0
- package/dist/src/ruvector/index.d.ts +27 -0
- package/dist/src/ruvector/index.d.ts.map +1 -0
- package/dist/src/ruvector/index.js +49 -0
- package/dist/src/ruvector/index.js.map +1 -0
- package/dist/src/ruvector/q-learning-router.d.ts +211 -0
- package/dist/src/ruvector/q-learning-router.d.ts.map +1 -0
- package/dist/src/ruvector/q-learning-router.js +681 -0
- package/dist/src/ruvector/q-learning-router.js.map +1 -0
- package/dist/src/ruvector/vector-db.d.ts +69 -0
- package/dist/src/ruvector/vector-db.d.ts.map +1 -0
- package/dist/src/ruvector/vector-db.js +243 -0
- package/dist/src/ruvector/vector-db.js.map +1 -0
- package/dist/src/services/index.d.ts +7 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +6 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/worker-daemon.d.ts +153 -0
- package/dist/src/services/worker-daemon.d.ts.map +1 -0
- package/dist/src/services/worker-daemon.js +567 -0
- package/dist/src/services/worker-daemon.js.map +1 -0
- package/dist/src/suggest.d.ts +53 -0
- package/dist/src/suggest.d.ts.map +1 -0
- package/dist/src/suggest.js +200 -0
- package/dist/src/suggest.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +28 -6
- package/.agentic-flow/intelligence.json +0 -16
- package/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude-flow/metrics/performance.json +0 -87
- package/.claude-flow/metrics/task-metrics.json +0 -10
- package/__tests__/README.md +0 -140
- package/__tests__/TEST_SUMMARY.md +0 -144
- package/__tests__/cli.test.ts +0 -558
- package/__tests__/commands.test.ts +0 -726
- package/__tests__/config-adapter.test.ts +0 -362
- package/__tests__/config-loading.test.ts +0 -106
- package/__tests__/coverage/.tmp/coverage-0.json +0 -1
- package/__tests__/coverage/.tmp/coverage-1.json +0 -1
- package/__tests__/coverage/.tmp/coverage-2.json +0 -1
- package/__tests__/coverage/.tmp/coverage-3.json +0 -1
- package/__tests__/coverage/.tmp/coverage-4.json +0 -1
- package/__tests__/coverage/.tmp/coverage-5.json +0 -1
- package/__tests__/mcp-client.test.ts +0 -480
- package/__tests__/p1-commands.test.ts +0 -1064
- package/docs/CONFIG_LOADING.md +0 -236
- package/docs/IMPLEMENTATION_COMPLETE.md +0 -421
- package/docs/MCP_CLIENT_GUIDE.md +0 -620
- package/docs/REFACTORING_SUMMARY.md +0 -247
- package/src/commands/agent.ts +0 -941
- package/src/commands/config.ts +0 -452
- package/src/commands/hive-mind.ts +0 -762
- package/src/commands/hooks.ts +0 -2603
- package/src/commands/index.ts +0 -115
- package/src/commands/init.ts +0 -597
- package/src/commands/mcp.ts +0 -753
- package/src/commands/memory.ts +0 -1063
- package/src/commands/migrate.ts +0 -447
- package/src/commands/process.ts +0 -617
- package/src/commands/session.ts +0 -891
- package/src/commands/start.ts +0 -457
- package/src/commands/status.ts +0 -705
- package/src/commands/swarm.ts +0 -648
- package/src/commands/task.ts +0 -792
- package/src/commands/workflow.ts +0 -742
- package/src/config-adapter.ts +0 -210
- package/src/index.ts +0 -383
- package/src/infrastructure/in-memory-repositories.ts +0 -310
- package/src/init/claudemd-generator.ts +0 -631
- package/src/init/executor.ts +0 -756
- package/src/init/helpers-generator.ts +0 -628
- package/src/init/index.ts +0 -60
- package/src/init/mcp-generator.ts +0 -83
- package/src/init/settings-generator.ts +0 -274
- package/src/init/statusline-generator.ts +0 -211
- package/src/init/types.ts +0 -447
- package/src/mcp-client.ts +0 -227
- package/src/mcp-server.ts +0 -571
- package/src/mcp-tools/agent-tools.ts +0 -92
- package/src/mcp-tools/config-tools.ts +0 -88
- package/src/mcp-tools/hooks-tools.ts +0 -1819
- package/src/mcp-tools/index.ts +0 -12
- package/src/mcp-tools/memory-tools.ts +0 -89
- package/src/mcp-tools/swarm-tools.ts +0 -69
- package/src/mcp-tools/types.ts +0 -33
- package/src/output.ts +0 -593
- package/src/parser.ts +0 -417
- package/src/prompt.ts +0 -619
- package/src/types.ts +0 -287
- package/tmp.json +0 -0
- package/tsconfig.json +0 -16
- package/tsconfig.tsbuildinfo +0 -1
- package/vitest.config.ts +0 -13
package/src/commands/agent.ts
DELETED
|
@@ -1,941 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* V3 CLI Agent Command
|
|
3
|
-
* Agent management commands for spawning, listing, and controlling agents
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Command, CommandContext, CommandResult } from '../types.js';
|
|
7
|
-
import { output } from '../output.js';
|
|
8
|
-
import { select, confirm, input } from '../prompt.js';
|
|
9
|
-
import { callMCPTool, MCPClientError } from '../mcp-client.js';
|
|
10
|
-
|
|
11
|
-
// Available agent types with descriptions
|
|
12
|
-
const AGENT_TYPES = [
|
|
13
|
-
{ value: 'coder', label: 'Coder', hint: 'Code development with neural patterns' },
|
|
14
|
-
{ value: 'researcher', label: 'Researcher', hint: 'Research with web access and data analysis' },
|
|
15
|
-
{ value: 'tester', label: 'Tester', hint: 'Comprehensive testing with automation' },
|
|
16
|
-
{ value: 'reviewer', label: 'Reviewer', hint: 'Code review with security and quality checks' },
|
|
17
|
-
{ value: 'architect', label: 'Architect', hint: 'System design with enterprise patterns' },
|
|
18
|
-
{ value: 'coordinator', label: 'Coordinator', hint: 'Multi-agent orchestration and workflow' },
|
|
19
|
-
{ value: 'analyst', label: 'Analyst', hint: 'Performance analysis and optimization' },
|
|
20
|
-
{ value: 'optimizer', label: 'Optimizer', hint: 'Performance optimization and bottleneck analysis' },
|
|
21
|
-
{ value: 'security-architect', label: 'Security Architect', hint: 'Security architecture and threat modeling' },
|
|
22
|
-
{ value: 'security-auditor', label: 'Security Auditor', hint: 'CVE remediation and security testing' },
|
|
23
|
-
{ value: 'memory-specialist', label: 'Memory Specialist', hint: 'AgentDB unification (150x-12,500x faster)' },
|
|
24
|
-
{ value: 'swarm-specialist', label: 'Swarm Specialist', hint: 'Unified coordination engine' },
|
|
25
|
-
{ value: 'performance-engineer', label: 'Performance Engineer', hint: '2.49x-7.47x optimization targets' },
|
|
26
|
-
{ value: 'core-architect', label: 'Core Architect', hint: 'Domain-driven design restructure' },
|
|
27
|
-
{ value: 'test-architect', label: 'Test Architect', hint: 'TDD London School methodology' }
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
// Agent spawn subcommand
|
|
31
|
-
const spawnCommand: Command = {
|
|
32
|
-
name: 'spawn',
|
|
33
|
-
description: 'Spawn a new agent',
|
|
34
|
-
options: [
|
|
35
|
-
{
|
|
36
|
-
name: 'type',
|
|
37
|
-
short: 't',
|
|
38
|
-
description: 'Agent type to spawn',
|
|
39
|
-
type: 'string',
|
|
40
|
-
choices: AGENT_TYPES.map(a => a.value)
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
name: 'name',
|
|
44
|
-
short: 'n',
|
|
45
|
-
description: 'Agent name/identifier',
|
|
46
|
-
type: 'string'
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
name: 'provider',
|
|
50
|
-
short: 'p',
|
|
51
|
-
description: 'Provider to use (anthropic, openrouter, ollama)',
|
|
52
|
-
type: 'string',
|
|
53
|
-
default: 'anthropic'
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: 'model',
|
|
57
|
-
short: 'm',
|
|
58
|
-
description: 'Model to use',
|
|
59
|
-
type: 'string'
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
name: 'task',
|
|
63
|
-
description: 'Initial task for the agent',
|
|
64
|
-
type: 'string'
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
name: 'timeout',
|
|
68
|
-
description: 'Agent timeout in seconds',
|
|
69
|
-
type: 'number',
|
|
70
|
-
default: 300
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
name: 'auto-tools',
|
|
74
|
-
description: 'Enable automatic tool usage',
|
|
75
|
-
type: 'boolean',
|
|
76
|
-
default: true
|
|
77
|
-
}
|
|
78
|
-
],
|
|
79
|
-
examples: [
|
|
80
|
-
{ command: 'claude-flow agent spawn --type coder --name bot-1', description: 'Spawn a coder agent' },
|
|
81
|
-
{ command: 'claude-flow agent spawn -t researcher --task "Research React 19"', description: 'Spawn researcher with task' }
|
|
82
|
-
],
|
|
83
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
84
|
-
let agentType = ctx.flags.type as string;
|
|
85
|
-
let agentName = ctx.flags.name as string;
|
|
86
|
-
|
|
87
|
-
// Interactive mode if type not specified
|
|
88
|
-
if (!agentType && ctx.interactive) {
|
|
89
|
-
agentType = await select({
|
|
90
|
-
message: 'Select agent type:',
|
|
91
|
-
options: AGENT_TYPES
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (!agentType) {
|
|
96
|
-
output.printError('Agent type is required. Use --type or -t flag.');
|
|
97
|
-
return { success: false, exitCode: 1 };
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Generate name if not provided
|
|
101
|
-
if (!agentName) {
|
|
102
|
-
agentName = `${agentType}-${Date.now().toString(36)}`;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
output.printInfo(`Spawning ${agentType} agent: ${output.highlight(agentName)}`);
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
// Call MCP tool to spawn agent
|
|
109
|
-
const result = await callMCPTool<{
|
|
110
|
-
agentId: string;
|
|
111
|
-
agentType: string;
|
|
112
|
-
status: string;
|
|
113
|
-
createdAt: string;
|
|
114
|
-
}>('agent/spawn', {
|
|
115
|
-
agentType,
|
|
116
|
-
id: agentName,
|
|
117
|
-
config: {
|
|
118
|
-
provider: ctx.flags.provider || 'anthropic',
|
|
119
|
-
model: ctx.flags.model,
|
|
120
|
-
task: ctx.flags.task,
|
|
121
|
-
timeout: ctx.flags.timeout,
|
|
122
|
-
autoTools: ctx.flags.autoTools,
|
|
123
|
-
},
|
|
124
|
-
priority: 'normal',
|
|
125
|
-
metadata: {
|
|
126
|
-
name: agentName,
|
|
127
|
-
capabilities: getAgentCapabilities(agentType),
|
|
128
|
-
},
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
output.writeln();
|
|
132
|
-
output.printTable({
|
|
133
|
-
columns: [
|
|
134
|
-
{ key: 'property', header: 'Property', width: 15 },
|
|
135
|
-
{ key: 'value', header: 'Value', width: 40 }
|
|
136
|
-
],
|
|
137
|
-
data: [
|
|
138
|
-
{ property: 'ID', value: result.agentId },
|
|
139
|
-
{ property: 'Type', value: result.agentType },
|
|
140
|
-
{ property: 'Name', value: agentName },
|
|
141
|
-
{ property: 'Status', value: result.status },
|
|
142
|
-
{ property: 'Created', value: result.createdAt },
|
|
143
|
-
{ property: 'Capabilities', value: getAgentCapabilities(agentType).join(', ') }
|
|
144
|
-
]
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
output.writeln();
|
|
148
|
-
output.printSuccess(`Agent ${agentName} spawned successfully`);
|
|
149
|
-
|
|
150
|
-
if (ctx.flags.format === 'json') {
|
|
151
|
-
output.printJson(result);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return { success: true, data: result };
|
|
155
|
-
} catch (error) {
|
|
156
|
-
if (error instanceof MCPClientError) {
|
|
157
|
-
output.printError(`Failed to spawn agent: ${error.message}`);
|
|
158
|
-
} else {
|
|
159
|
-
output.printError(`Unexpected error: ${String(error)}`);
|
|
160
|
-
}
|
|
161
|
-
return { success: false, exitCode: 1 };
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
// Agent list subcommand
|
|
167
|
-
const listCommand: Command = {
|
|
168
|
-
name: 'list',
|
|
169
|
-
aliases: ['ls'],
|
|
170
|
-
description: 'List all active agents',
|
|
171
|
-
options: [
|
|
172
|
-
{
|
|
173
|
-
name: 'all',
|
|
174
|
-
short: 'a',
|
|
175
|
-
description: 'Include inactive agents',
|
|
176
|
-
type: 'boolean',
|
|
177
|
-
default: false
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
name: 'type',
|
|
181
|
-
short: 't',
|
|
182
|
-
description: 'Filter by agent type',
|
|
183
|
-
type: 'string'
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
name: 'status',
|
|
187
|
-
short: 's',
|
|
188
|
-
description: 'Filter by status',
|
|
189
|
-
type: 'string'
|
|
190
|
-
}
|
|
191
|
-
],
|
|
192
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
193
|
-
try {
|
|
194
|
-
// Call MCP tool to list agents
|
|
195
|
-
const result = await callMCPTool<{
|
|
196
|
-
agents: Array<{
|
|
197
|
-
id: string;
|
|
198
|
-
agentType: string;
|
|
199
|
-
status: 'active' | 'idle' | 'terminated';
|
|
200
|
-
createdAt: string;
|
|
201
|
-
lastActivityAt?: string;
|
|
202
|
-
}>;
|
|
203
|
-
total: number;
|
|
204
|
-
}>('agent/list', {
|
|
205
|
-
status: ctx.flags.all ? 'all' : ctx.flags.status || undefined,
|
|
206
|
-
agentType: ctx.flags.type || undefined,
|
|
207
|
-
limit: 100,
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
if (ctx.flags.format === 'json') {
|
|
211
|
-
output.printJson(result);
|
|
212
|
-
return { success: true, data: result };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
output.writeln();
|
|
216
|
-
output.writeln(output.bold('Active Agents'));
|
|
217
|
-
output.writeln();
|
|
218
|
-
|
|
219
|
-
if (result.agents.length === 0) {
|
|
220
|
-
output.printInfo('No agents found matching criteria');
|
|
221
|
-
return { success: true, data: result };
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Format for display
|
|
225
|
-
const displayAgents = result.agents.map(agent => ({
|
|
226
|
-
id: agent.id,
|
|
227
|
-
type: agent.agentType,
|
|
228
|
-
status: agent.status,
|
|
229
|
-
created: new Date(agent.createdAt).toLocaleTimeString(),
|
|
230
|
-
lastActivity: agent.lastActivityAt
|
|
231
|
-
? new Date(agent.lastActivityAt).toLocaleTimeString()
|
|
232
|
-
: 'N/A',
|
|
233
|
-
}));
|
|
234
|
-
|
|
235
|
-
output.printTable({
|
|
236
|
-
columns: [
|
|
237
|
-
{ key: 'id', header: 'ID', width: 20 },
|
|
238
|
-
{ key: 'type', header: 'Type', width: 15 },
|
|
239
|
-
{ key: 'status', header: 'Status', width: 12, format: formatStatus },
|
|
240
|
-
{ key: 'created', header: 'Created', width: 12 },
|
|
241
|
-
{ key: 'lastActivity', header: 'Last Activity', width: 12 }
|
|
242
|
-
],
|
|
243
|
-
data: displayAgents
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
output.writeln();
|
|
247
|
-
output.printInfo(`Total: ${result.total} agents`);
|
|
248
|
-
|
|
249
|
-
return { success: true, data: result };
|
|
250
|
-
} catch (error) {
|
|
251
|
-
if (error instanceof MCPClientError) {
|
|
252
|
-
output.printError(`Failed to list agents: ${error.message}`);
|
|
253
|
-
} else {
|
|
254
|
-
output.printError(`Unexpected error: ${String(error)}`);
|
|
255
|
-
}
|
|
256
|
-
return { success: false, exitCode: 1 };
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
// Agent status subcommand
|
|
262
|
-
const statusCommand: Command = {
|
|
263
|
-
name: 'status',
|
|
264
|
-
description: 'Show detailed status of an agent',
|
|
265
|
-
options: [
|
|
266
|
-
{
|
|
267
|
-
name: 'id',
|
|
268
|
-
description: 'Agent ID',
|
|
269
|
-
type: 'string'
|
|
270
|
-
}
|
|
271
|
-
],
|
|
272
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
273
|
-
let agentId = ctx.args[0] || ctx.flags.id as string;
|
|
274
|
-
|
|
275
|
-
if (!agentId && ctx.interactive) {
|
|
276
|
-
agentId = await input({
|
|
277
|
-
message: 'Enter agent ID:',
|
|
278
|
-
validate: (v) => v.length > 0 || 'Agent ID is required'
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
if (!agentId) {
|
|
283
|
-
output.printError('Agent ID is required');
|
|
284
|
-
return { success: false, exitCode: 1 };
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
try {
|
|
288
|
-
// Call MCP tool to get agent status
|
|
289
|
-
const status = await callMCPTool<{
|
|
290
|
-
id: string;
|
|
291
|
-
agentType: string;
|
|
292
|
-
status: 'active' | 'idle' | 'terminated';
|
|
293
|
-
createdAt: string;
|
|
294
|
-
lastActivityAt?: string;
|
|
295
|
-
config?: Record<string, unknown>;
|
|
296
|
-
metrics?: {
|
|
297
|
-
tasksCompleted: number;
|
|
298
|
-
tasksInProgress: number;
|
|
299
|
-
tasksFailed: number;
|
|
300
|
-
averageExecutionTime: number;
|
|
301
|
-
uptime: number;
|
|
302
|
-
};
|
|
303
|
-
}>('agent/status', {
|
|
304
|
-
agentId,
|
|
305
|
-
includeMetrics: true,
|
|
306
|
-
includeHistory: false,
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
if (ctx.flags.format === 'json') {
|
|
310
|
-
output.printJson(status);
|
|
311
|
-
return { success: true, data: status };
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
output.writeln();
|
|
315
|
-
output.printBox(
|
|
316
|
-
[
|
|
317
|
-
`Type: ${status.agentType}`,
|
|
318
|
-
`Status: ${formatStatus(status.status)}`,
|
|
319
|
-
`Created: ${new Date(status.createdAt).toLocaleString()}`,
|
|
320
|
-
`Last Activity: ${status.lastActivityAt ? new Date(status.lastActivityAt).toLocaleString() : 'N/A'}`
|
|
321
|
-
].join('\n'),
|
|
322
|
-
`Agent: ${status.id}`
|
|
323
|
-
);
|
|
324
|
-
|
|
325
|
-
if (status.metrics) {
|
|
326
|
-
output.writeln();
|
|
327
|
-
output.writeln(output.bold('Metrics'));
|
|
328
|
-
output.printTable({
|
|
329
|
-
columns: [
|
|
330
|
-
{ key: 'metric', header: 'Metric', width: 25 },
|
|
331
|
-
{ key: 'value', header: 'Value', width: 15, align: 'right' }
|
|
332
|
-
],
|
|
333
|
-
data: [
|
|
334
|
-
{ metric: 'Tasks Completed', value: status.metrics.tasksCompleted },
|
|
335
|
-
{ metric: 'Tasks In Progress', value: status.metrics.tasksInProgress },
|
|
336
|
-
{ metric: 'Tasks Failed', value: status.metrics.tasksFailed },
|
|
337
|
-
{ metric: 'Avg Execution Time', value: `${status.metrics.averageExecutionTime.toFixed(2)}ms` },
|
|
338
|
-
{ metric: 'Uptime', value: `${(status.metrics.uptime / 1000 / 60).toFixed(1)}m` }
|
|
339
|
-
]
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
return { success: true, data: status };
|
|
344
|
-
} catch (error) {
|
|
345
|
-
if (error instanceof MCPClientError) {
|
|
346
|
-
output.printError(`Failed to get agent status: ${error.message}`);
|
|
347
|
-
} else {
|
|
348
|
-
output.printError(`Unexpected error: ${String(error)}`);
|
|
349
|
-
}
|
|
350
|
-
return { success: false, exitCode: 1 };
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
// Agent stop subcommand
|
|
356
|
-
const stopCommand: Command = {
|
|
357
|
-
name: 'stop',
|
|
358
|
-
aliases: ['kill'],
|
|
359
|
-
description: 'Stop a running agent',
|
|
360
|
-
options: [
|
|
361
|
-
{
|
|
362
|
-
name: 'force',
|
|
363
|
-
short: 'f',
|
|
364
|
-
description: 'Force stop without graceful shutdown',
|
|
365
|
-
type: 'boolean',
|
|
366
|
-
default: false
|
|
367
|
-
},
|
|
368
|
-
{
|
|
369
|
-
name: 'timeout',
|
|
370
|
-
description: 'Graceful shutdown timeout in seconds',
|
|
371
|
-
type: 'number',
|
|
372
|
-
default: 30
|
|
373
|
-
}
|
|
374
|
-
],
|
|
375
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
376
|
-
const agentId = ctx.args[0];
|
|
377
|
-
|
|
378
|
-
if (!agentId) {
|
|
379
|
-
output.printError('Agent ID is required');
|
|
380
|
-
return { success: false, exitCode: 1 };
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
const force = ctx.flags.force as boolean;
|
|
384
|
-
|
|
385
|
-
if (!force && ctx.interactive) {
|
|
386
|
-
const confirmed = await confirm({
|
|
387
|
-
message: `Are you sure you want to stop agent ${agentId}?`,
|
|
388
|
-
default: false
|
|
389
|
-
});
|
|
390
|
-
|
|
391
|
-
if (!confirmed) {
|
|
392
|
-
output.printInfo('Operation cancelled');
|
|
393
|
-
return { success: true };
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
output.printInfo(`Stopping agent ${agentId}...`);
|
|
398
|
-
|
|
399
|
-
try {
|
|
400
|
-
// Call MCP tool to terminate agent
|
|
401
|
-
const result = await callMCPTool<{
|
|
402
|
-
agentId: string;
|
|
403
|
-
terminated: boolean;
|
|
404
|
-
terminatedAt: string;
|
|
405
|
-
}>('agent/terminate', {
|
|
406
|
-
agentId,
|
|
407
|
-
graceful: !force,
|
|
408
|
-
reason: 'Stopped by user via CLI',
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
if (!force) {
|
|
412
|
-
output.writeln(output.dim(' Completing current task...'));
|
|
413
|
-
output.writeln(output.dim(' Saving state...'));
|
|
414
|
-
output.writeln(output.dim(' Releasing resources...'));
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
output.printSuccess(`Agent ${agentId} stopped successfully`);
|
|
418
|
-
|
|
419
|
-
if (ctx.flags.format === 'json') {
|
|
420
|
-
output.printJson(result);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
return { success: true, data: result };
|
|
424
|
-
} catch (error) {
|
|
425
|
-
if (error instanceof MCPClientError) {
|
|
426
|
-
output.printError(`Failed to stop agent: ${error.message}`);
|
|
427
|
-
} else {
|
|
428
|
-
output.printError(`Unexpected error: ${String(error)}`);
|
|
429
|
-
}
|
|
430
|
-
return { success: false, exitCode: 1 };
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
// Agent metrics subcommand
|
|
436
|
-
const metricsCommand: Command = {
|
|
437
|
-
name: 'metrics',
|
|
438
|
-
description: 'Show agent performance metrics',
|
|
439
|
-
options: [
|
|
440
|
-
{
|
|
441
|
-
name: 'period',
|
|
442
|
-
short: 'p',
|
|
443
|
-
description: 'Time period (1h, 24h, 7d, 30d)',
|
|
444
|
-
type: 'string',
|
|
445
|
-
default: '24h'
|
|
446
|
-
}
|
|
447
|
-
],
|
|
448
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
449
|
-
const agentId = ctx.args[0];
|
|
450
|
-
const period = ctx.flags.period as string;
|
|
451
|
-
|
|
452
|
-
// Simulated metrics
|
|
453
|
-
const metrics = {
|
|
454
|
-
period,
|
|
455
|
-
summary: {
|
|
456
|
-
totalAgents: 4,
|
|
457
|
-
activeAgents: 3,
|
|
458
|
-
tasksCompleted: 127,
|
|
459
|
-
avgSuccessRate: '96.2%',
|
|
460
|
-
totalTokens: 1234567,
|
|
461
|
-
avgResponseTime: '1.45s'
|
|
462
|
-
},
|
|
463
|
-
byType: [
|
|
464
|
-
{ type: 'coder', count: 2, tasks: 45, successRate: '97%' },
|
|
465
|
-
{ type: 'researcher', count: 1, tasks: 32, successRate: '95%' },
|
|
466
|
-
{ type: 'tester', count: 1, tasks: 50, successRate: '98%' }
|
|
467
|
-
],
|
|
468
|
-
performance: {
|
|
469
|
-
flashAttention: '2.8x speedup',
|
|
470
|
-
memoryReduction: '52%',
|
|
471
|
-
searchImprovement: '150x faster'
|
|
472
|
-
}
|
|
473
|
-
};
|
|
474
|
-
|
|
475
|
-
if (ctx.flags.format === 'json') {
|
|
476
|
-
output.printJson(metrics);
|
|
477
|
-
return { success: true, data: metrics };
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
output.writeln();
|
|
481
|
-
output.writeln(output.bold(`Agent Metrics (${period})`));
|
|
482
|
-
output.writeln();
|
|
483
|
-
|
|
484
|
-
output.printTable({
|
|
485
|
-
columns: [
|
|
486
|
-
{ key: 'metric', header: 'Metric', width: 20 },
|
|
487
|
-
{ key: 'value', header: 'Value', width: 15, align: 'right' }
|
|
488
|
-
],
|
|
489
|
-
data: [
|
|
490
|
-
{ metric: 'Total Agents', value: metrics.summary.totalAgents },
|
|
491
|
-
{ metric: 'Active Agents', value: metrics.summary.activeAgents },
|
|
492
|
-
{ metric: 'Tasks Completed', value: metrics.summary.tasksCompleted },
|
|
493
|
-
{ metric: 'Success Rate', value: metrics.summary.avgSuccessRate },
|
|
494
|
-
{ metric: 'Total Tokens', value: metrics.summary.totalTokens.toLocaleString() },
|
|
495
|
-
{ metric: 'Avg Response Time', value: metrics.summary.avgResponseTime }
|
|
496
|
-
]
|
|
497
|
-
});
|
|
498
|
-
|
|
499
|
-
output.writeln();
|
|
500
|
-
output.writeln(output.bold('By Agent Type'));
|
|
501
|
-
output.printTable({
|
|
502
|
-
columns: [
|
|
503
|
-
{ key: 'type', header: 'Type', width: 12 },
|
|
504
|
-
{ key: 'count', header: 'Count', width: 8, align: 'right' },
|
|
505
|
-
{ key: 'tasks', header: 'Tasks', width: 8, align: 'right' },
|
|
506
|
-
{ key: 'successRate', header: 'Success', width: 10, align: 'right' }
|
|
507
|
-
],
|
|
508
|
-
data: metrics.byType
|
|
509
|
-
});
|
|
510
|
-
|
|
511
|
-
output.writeln();
|
|
512
|
-
output.writeln(output.bold('V3 Performance Gains'));
|
|
513
|
-
output.printList([
|
|
514
|
-
`Flash Attention: ${output.success(metrics.performance.flashAttention)}`,
|
|
515
|
-
`Memory Reduction: ${output.success(metrics.performance.memoryReduction)}`,
|
|
516
|
-
`Search: ${output.success(metrics.performance.searchImprovement)}`
|
|
517
|
-
]);
|
|
518
|
-
|
|
519
|
-
return { success: true, data: metrics };
|
|
520
|
-
}
|
|
521
|
-
};
|
|
522
|
-
|
|
523
|
-
// Agent pool subcommand
|
|
524
|
-
const poolCommand: Command = {
|
|
525
|
-
name: 'pool',
|
|
526
|
-
description: 'Manage agent pool for scaling',
|
|
527
|
-
options: [
|
|
528
|
-
{
|
|
529
|
-
name: 'size',
|
|
530
|
-
short: 's',
|
|
531
|
-
description: 'Pool size',
|
|
532
|
-
type: 'number'
|
|
533
|
-
},
|
|
534
|
-
{
|
|
535
|
-
name: 'min',
|
|
536
|
-
description: 'Minimum pool size',
|
|
537
|
-
type: 'number',
|
|
538
|
-
default: 1
|
|
539
|
-
},
|
|
540
|
-
{
|
|
541
|
-
name: 'max',
|
|
542
|
-
description: 'Maximum pool size',
|
|
543
|
-
type: 'number',
|
|
544
|
-
default: 10
|
|
545
|
-
},
|
|
546
|
-
{
|
|
547
|
-
name: 'auto-scale',
|
|
548
|
-
short: 'a',
|
|
549
|
-
description: 'Enable auto-scaling',
|
|
550
|
-
type: 'boolean',
|
|
551
|
-
default: true
|
|
552
|
-
}
|
|
553
|
-
],
|
|
554
|
-
examples: [
|
|
555
|
-
{ command: 'claude-flow agent pool --size 5', description: 'Set pool size' },
|
|
556
|
-
{ command: 'claude-flow agent pool --min 2 --max 15', description: 'Configure auto-scaling' }
|
|
557
|
-
],
|
|
558
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
559
|
-
try {
|
|
560
|
-
const result = await callMCPTool<{
|
|
561
|
-
poolId: string;
|
|
562
|
-
currentSize: number;
|
|
563
|
-
minSize: number;
|
|
564
|
-
maxSize: number;
|
|
565
|
-
autoScale: boolean;
|
|
566
|
-
utilization: number;
|
|
567
|
-
agents: Array<{ id: string; type: string; status: string }>;
|
|
568
|
-
}>('agent/pool', {
|
|
569
|
-
size: ctx.flags.size,
|
|
570
|
-
min: ctx.flags.min,
|
|
571
|
-
max: ctx.flags.max,
|
|
572
|
-
autoScale: ctx.flags.autoScale ?? true,
|
|
573
|
-
});
|
|
574
|
-
|
|
575
|
-
if (ctx.flags.format === 'json') {
|
|
576
|
-
output.printJson(result);
|
|
577
|
-
return { success: true, data: result };
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
output.writeln();
|
|
581
|
-
output.printBox(
|
|
582
|
-
[
|
|
583
|
-
`Pool ID: ${result.poolId}`,
|
|
584
|
-
`Current Size: ${result.currentSize}`,
|
|
585
|
-
`Min/Max: ${result.minSize}/${result.maxSize}`,
|
|
586
|
-
`Auto-Scale: ${result.autoScale ? 'Yes' : 'No'}`,
|
|
587
|
-
`Utilization: ${(result.utilization * 100).toFixed(1)}%`
|
|
588
|
-
].join('\n'),
|
|
589
|
-
'Agent Pool'
|
|
590
|
-
);
|
|
591
|
-
|
|
592
|
-
if (result.agents.length > 0) {
|
|
593
|
-
output.writeln();
|
|
594
|
-
output.writeln(output.bold('Pool Agents'));
|
|
595
|
-
output.printTable({
|
|
596
|
-
columns: [
|
|
597
|
-
{ key: 'id', header: 'ID', width: 20 },
|
|
598
|
-
{ key: 'type', header: 'Type', width: 15 },
|
|
599
|
-
{ key: 'status', header: 'Status', width: 12, format: formatStatus }
|
|
600
|
-
],
|
|
601
|
-
data: result.agents
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
return { success: true, data: result };
|
|
606
|
-
} catch (error) {
|
|
607
|
-
if (error instanceof MCPClientError) {
|
|
608
|
-
output.printError(`Pool error: ${error.message}`);
|
|
609
|
-
} else {
|
|
610
|
-
output.printError(`Unexpected error: ${String(error)}`);
|
|
611
|
-
}
|
|
612
|
-
return { success: false, exitCode: 1 };
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
};
|
|
616
|
-
|
|
617
|
-
// Agent health subcommand
|
|
618
|
-
const healthCommand: Command = {
|
|
619
|
-
name: 'health',
|
|
620
|
-
description: 'Show agent health and metrics',
|
|
621
|
-
options: [
|
|
622
|
-
{
|
|
623
|
-
name: 'id',
|
|
624
|
-
short: 'i',
|
|
625
|
-
description: 'Agent ID (all if not specified)',
|
|
626
|
-
type: 'string'
|
|
627
|
-
},
|
|
628
|
-
{
|
|
629
|
-
name: 'detailed',
|
|
630
|
-
short: 'd',
|
|
631
|
-
description: 'Show detailed health metrics',
|
|
632
|
-
type: 'boolean',
|
|
633
|
-
default: false
|
|
634
|
-
},
|
|
635
|
-
{
|
|
636
|
-
name: 'watch',
|
|
637
|
-
short: 'w',
|
|
638
|
-
description: 'Watch mode (refresh every 5s)',
|
|
639
|
-
type: 'boolean',
|
|
640
|
-
default: false
|
|
641
|
-
}
|
|
642
|
-
],
|
|
643
|
-
examples: [
|
|
644
|
-
{ command: 'claude-flow agent health', description: 'Show all agents health' },
|
|
645
|
-
{ command: 'claude-flow agent health -i agent-001 -d', description: 'Detailed health for specific agent' }
|
|
646
|
-
],
|
|
647
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
648
|
-
const agentId = ctx.args[0] || ctx.flags.id as string;
|
|
649
|
-
const detailed = ctx.flags.detailed as boolean;
|
|
650
|
-
|
|
651
|
-
try {
|
|
652
|
-
const result = await callMCPTool<{
|
|
653
|
-
agents: Array<{
|
|
654
|
-
id: string;
|
|
655
|
-
type: string;
|
|
656
|
-
health: 'healthy' | 'degraded' | 'unhealthy';
|
|
657
|
-
uptime: number;
|
|
658
|
-
memory: { used: number; limit: number };
|
|
659
|
-
cpu: number;
|
|
660
|
-
tasks: { active: number; queued: number; completed: number; failed: number };
|
|
661
|
-
latency: { avg: number; p99: number };
|
|
662
|
-
errors: { count: number; lastError?: string };
|
|
663
|
-
}>;
|
|
664
|
-
overall: {
|
|
665
|
-
healthy: number;
|
|
666
|
-
degraded: number;
|
|
667
|
-
unhealthy: number;
|
|
668
|
-
avgCpu: number;
|
|
669
|
-
avgMemory: number;
|
|
670
|
-
};
|
|
671
|
-
}>('agent/health', {
|
|
672
|
-
agentId,
|
|
673
|
-
detailed,
|
|
674
|
-
});
|
|
675
|
-
|
|
676
|
-
if (ctx.flags.format === 'json') {
|
|
677
|
-
output.printJson(result);
|
|
678
|
-
return { success: true, data: result };
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
output.writeln();
|
|
682
|
-
output.writeln(output.bold('Agent Health'));
|
|
683
|
-
output.writeln();
|
|
684
|
-
|
|
685
|
-
// Overall summary
|
|
686
|
-
output.printBox(
|
|
687
|
-
[
|
|
688
|
-
`Healthy: ${output.success(String(result.overall.healthy))}`,
|
|
689
|
-
`Degraded: ${output.warning(String(result.overall.degraded))}`,
|
|
690
|
-
`Unhealthy: ${output.error(String(result.overall.unhealthy))}`,
|
|
691
|
-
`Avg CPU: ${result.overall.avgCpu.toFixed(1)}%`,
|
|
692
|
-
`Avg Memory: ${(result.overall.avgMemory * 100).toFixed(1)}%`
|
|
693
|
-
].join(' | '),
|
|
694
|
-
'Overall Status'
|
|
695
|
-
);
|
|
696
|
-
|
|
697
|
-
output.writeln();
|
|
698
|
-
output.printTable({
|
|
699
|
-
columns: [
|
|
700
|
-
{ key: 'id', header: 'Agent ID', width: 18 },
|
|
701
|
-
{ key: 'type', header: 'Type', width: 12 },
|
|
702
|
-
{ key: 'health', header: 'Health', width: 10, format: formatHealthStatus },
|
|
703
|
-
{ key: 'cpu', header: 'CPU %', width: 8, align: 'right', format: (v) => `${Number(v).toFixed(1)}%` },
|
|
704
|
-
{ key: 'memory', header: 'Memory', width: 10, align: 'right', format: (v: unknown) => {
|
|
705
|
-
const mem = v as { used: number; limit: number };
|
|
706
|
-
return `${(mem.used / mem.limit * 100).toFixed(0)}%`;
|
|
707
|
-
}},
|
|
708
|
-
{ key: 'tasks', header: 'Tasks', width: 12, align: 'right', format: (v: unknown) => {
|
|
709
|
-
const t = v as { active: number; completed: number };
|
|
710
|
-
return `${t.active}/${t.completed}`;
|
|
711
|
-
}}
|
|
712
|
-
],
|
|
713
|
-
data: result.agents
|
|
714
|
-
});
|
|
715
|
-
|
|
716
|
-
if (detailed && result.agents.length > 0) {
|
|
717
|
-
output.writeln();
|
|
718
|
-
output.writeln(output.bold('Detailed Metrics'));
|
|
719
|
-
for (const agent of result.agents) {
|
|
720
|
-
output.writeln();
|
|
721
|
-
output.writeln(output.highlight(agent.id));
|
|
722
|
-
output.printList([
|
|
723
|
-
`Uptime: ${(agent.uptime / 1000 / 60).toFixed(1)} min`,
|
|
724
|
-
`Latency: avg ${agent.latency.avg.toFixed(1)}ms, p99 ${agent.latency.p99.toFixed(1)}ms`,
|
|
725
|
-
`Tasks: ${agent.tasks.completed} completed, ${agent.tasks.failed} failed, ${agent.tasks.queued} queued`,
|
|
726
|
-
`Errors: ${agent.errors.count}${agent.errors.lastError ? ` (${agent.errors.lastError})` : ''}`
|
|
727
|
-
]);
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
return { success: true, data: result };
|
|
732
|
-
} catch (error) {
|
|
733
|
-
if (error instanceof MCPClientError) {
|
|
734
|
-
output.printError(`Health check error: ${error.message}`);
|
|
735
|
-
} else {
|
|
736
|
-
output.printError(`Unexpected error: ${String(error)}`);
|
|
737
|
-
}
|
|
738
|
-
return { success: false, exitCode: 1 };
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
};
|
|
742
|
-
|
|
743
|
-
// Agent logs subcommand
|
|
744
|
-
const logsCommand: Command = {
|
|
745
|
-
name: 'logs',
|
|
746
|
-
description: 'Show agent activity logs',
|
|
747
|
-
options: [
|
|
748
|
-
{
|
|
749
|
-
name: 'id',
|
|
750
|
-
short: 'i',
|
|
751
|
-
description: 'Agent ID',
|
|
752
|
-
type: 'string'
|
|
753
|
-
},
|
|
754
|
-
{
|
|
755
|
-
name: 'tail',
|
|
756
|
-
short: 'n',
|
|
757
|
-
description: 'Number of recent entries',
|
|
758
|
-
type: 'number',
|
|
759
|
-
default: 50
|
|
760
|
-
},
|
|
761
|
-
{
|
|
762
|
-
name: 'level',
|
|
763
|
-
short: 'l',
|
|
764
|
-
description: 'Minimum log level',
|
|
765
|
-
type: 'string',
|
|
766
|
-
choices: ['debug', 'info', 'warn', 'error'],
|
|
767
|
-
default: 'info'
|
|
768
|
-
},
|
|
769
|
-
{
|
|
770
|
-
name: 'follow',
|
|
771
|
-
short: 'f',
|
|
772
|
-
description: 'Follow log output',
|
|
773
|
-
type: 'boolean',
|
|
774
|
-
default: false
|
|
775
|
-
},
|
|
776
|
-
{
|
|
777
|
-
name: 'since',
|
|
778
|
-
description: 'Show logs since (e.g., "1h", "30m")',
|
|
779
|
-
type: 'string'
|
|
780
|
-
}
|
|
781
|
-
],
|
|
782
|
-
examples: [
|
|
783
|
-
{ command: 'claude-flow agent logs -i agent-001', description: 'Show agent logs' },
|
|
784
|
-
{ command: 'claude-flow agent logs -i agent-001 -f', description: 'Follow agent logs' },
|
|
785
|
-
{ command: 'claude-flow agent logs -l error --since 1h', description: 'Show errors from last hour' }
|
|
786
|
-
],
|
|
787
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
788
|
-
const agentId = ctx.args[0] || ctx.flags.id as string;
|
|
789
|
-
const tail = ctx.flags.tail as number;
|
|
790
|
-
const level = ctx.flags.level as string;
|
|
791
|
-
|
|
792
|
-
if (!agentId) {
|
|
793
|
-
output.printError('Agent ID is required. Use --id or -i');
|
|
794
|
-
return { success: false, exitCode: 1 };
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
try {
|
|
798
|
-
const result = await callMCPTool<{
|
|
799
|
-
agentId: string;
|
|
800
|
-
entries: Array<{
|
|
801
|
-
timestamp: string;
|
|
802
|
-
level: 'debug' | 'info' | 'warn' | 'error';
|
|
803
|
-
message: string;
|
|
804
|
-
context?: Record<string, unknown>;
|
|
805
|
-
}>;
|
|
806
|
-
total: number;
|
|
807
|
-
}>('agent/logs', {
|
|
808
|
-
agentId,
|
|
809
|
-
tail,
|
|
810
|
-
level,
|
|
811
|
-
since: ctx.flags.since,
|
|
812
|
-
});
|
|
813
|
-
|
|
814
|
-
if (ctx.flags.format === 'json') {
|
|
815
|
-
output.printJson(result);
|
|
816
|
-
return { success: true, data: result };
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
output.writeln();
|
|
820
|
-
output.writeln(output.bold(`Logs for ${agentId}`));
|
|
821
|
-
output.writeln(output.dim(`Showing ${result.entries.length} of ${result.total} entries`));
|
|
822
|
-
output.writeln();
|
|
823
|
-
|
|
824
|
-
for (const entry of result.entries) {
|
|
825
|
-
const time = new Date(entry.timestamp).toLocaleTimeString();
|
|
826
|
-
const levelStr = formatLogLevel(entry.level);
|
|
827
|
-
output.writeln(`${output.dim(time)} ${levelStr} ${entry.message}`);
|
|
828
|
-
if (entry.context && Object.keys(entry.context).length > 0) {
|
|
829
|
-
output.writeln(output.dim(` ${JSON.stringify(entry.context)}`));
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
return { success: true, data: result };
|
|
834
|
-
} catch (error) {
|
|
835
|
-
if (error instanceof MCPClientError) {
|
|
836
|
-
output.printError(`Logs error: ${error.message}`);
|
|
837
|
-
} else {
|
|
838
|
-
output.printError(`Unexpected error: ${String(error)}`);
|
|
839
|
-
}
|
|
840
|
-
return { success: false, exitCode: 1 };
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
};
|
|
844
|
-
|
|
845
|
-
function formatHealthStatus(health: unknown): string {
|
|
846
|
-
const h = String(health);
|
|
847
|
-
switch (h) {
|
|
848
|
-
case 'healthy':
|
|
849
|
-
return output.success(h);
|
|
850
|
-
case 'degraded':
|
|
851
|
-
return output.warning(h);
|
|
852
|
-
case 'unhealthy':
|
|
853
|
-
return output.error(h);
|
|
854
|
-
default:
|
|
855
|
-
return h;
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
function formatLogLevel(level: string): string {
|
|
860
|
-
switch (level) {
|
|
861
|
-
case 'debug':
|
|
862
|
-
return output.dim('[DEBUG]');
|
|
863
|
-
case 'info':
|
|
864
|
-
return '[INFO] ';
|
|
865
|
-
case 'warn':
|
|
866
|
-
return output.warning('[WARN] ');
|
|
867
|
-
case 'error':
|
|
868
|
-
return output.error('[ERROR]');
|
|
869
|
-
default:
|
|
870
|
-
return `[${level.toUpperCase()}]`;
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
// Main agent command
|
|
875
|
-
export const agentCommand: Command = {
|
|
876
|
-
name: 'agent',
|
|
877
|
-
description: 'Agent management commands',
|
|
878
|
-
subcommands: [spawnCommand, listCommand, statusCommand, stopCommand, metricsCommand, poolCommand, healthCommand, logsCommand],
|
|
879
|
-
options: [],
|
|
880
|
-
examples: [
|
|
881
|
-
{ command: 'claude-flow agent spawn -t coder', description: 'Spawn a coder agent' },
|
|
882
|
-
{ command: 'claude-flow agent list', description: 'List all agents' },
|
|
883
|
-
{ command: 'claude-flow agent status agent-001', description: 'Show agent status' }
|
|
884
|
-
],
|
|
885
|
-
action: async (ctx: CommandContext): Promise<CommandResult> => {
|
|
886
|
-
// Show help if no subcommand
|
|
887
|
-
output.writeln();
|
|
888
|
-
output.writeln(output.bold('Agent Management Commands'));
|
|
889
|
-
output.writeln();
|
|
890
|
-
output.writeln('Usage: claude-flow agent <subcommand> [options]');
|
|
891
|
-
output.writeln();
|
|
892
|
-
output.writeln('Subcommands:');
|
|
893
|
-
output.printList([
|
|
894
|
-
`${output.highlight('spawn')} - Spawn a new agent`,
|
|
895
|
-
`${output.highlight('list')} - List all active agents`,
|
|
896
|
-
`${output.highlight('status')} - Show detailed agent status`,
|
|
897
|
-
`${output.highlight('stop')} - Stop a running agent`,
|
|
898
|
-
`${output.highlight('metrics')} - Show agent metrics`
|
|
899
|
-
]);
|
|
900
|
-
output.writeln();
|
|
901
|
-
output.writeln('Run "claude-flow agent <subcommand> --help" for subcommand help');
|
|
902
|
-
|
|
903
|
-
return { success: true };
|
|
904
|
-
}
|
|
905
|
-
};
|
|
906
|
-
|
|
907
|
-
// Helper functions
|
|
908
|
-
function getAgentCapabilities(type: string): string[] {
|
|
909
|
-
const capabilities: Record<string, string[]> = {
|
|
910
|
-
coder: ['code-generation', 'refactoring', 'debugging', 'testing'],
|
|
911
|
-
researcher: ['web-search', 'data-analysis', 'summarization', 'citation'],
|
|
912
|
-
tester: ['unit-testing', 'integration-testing', 'coverage-analysis', 'automation'],
|
|
913
|
-
reviewer: ['code-review', 'security-audit', 'quality-check', 'documentation'],
|
|
914
|
-
architect: ['system-design', 'pattern-analysis', 'scalability', 'documentation'],
|
|
915
|
-
coordinator: ['task-orchestration', 'agent-management', 'workflow-control'],
|
|
916
|
-
'security-architect': ['threat-modeling', 'security-patterns', 'compliance', 'audit'],
|
|
917
|
-
'memory-specialist': ['vector-search', 'agentdb', 'caching', 'optimization'],
|
|
918
|
-
'performance-engineer': ['benchmarking', 'profiling', 'optimization', 'monitoring']
|
|
919
|
-
};
|
|
920
|
-
|
|
921
|
-
return capabilities[type] || ['general'];
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
function formatStatus(status: unknown): string {
|
|
925
|
-
const statusStr = String(status);
|
|
926
|
-
switch (statusStr) {
|
|
927
|
-
case 'active':
|
|
928
|
-
return output.success(statusStr);
|
|
929
|
-
case 'idle':
|
|
930
|
-
return output.warning(statusStr);
|
|
931
|
-
case 'inactive':
|
|
932
|
-
case 'stopped':
|
|
933
|
-
return output.dim(statusStr);
|
|
934
|
-
case 'error':
|
|
935
|
-
return output.error(statusStr);
|
|
936
|
-
default:
|
|
937
|
-
return statusStr;
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
export default agentCommand;
|