@sowonai/crewx-cli 0.4.0-dev.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 +529 -0
- package/dist/ai-provider.service.d.ts +36 -0
- package/dist/ai-provider.service.js +191 -0
- package/dist/ai-provider.service.js.map +1 -0
- package/dist/ai.service.d.ts +57 -0
- package/dist/ai.service.js +628 -0
- package/dist/ai.service.js.map +1 -0
- package/dist/app.module.d.ts +5 -0
- package/dist/app.module.js +103 -0
- package/dist/app.module.js.map +1 -0
- package/dist/cli/agent.handler.d.ts +2 -0
- package/dist/cli/agent.handler.js +140 -0
- package/dist/cli/agent.handler.js.map +1 -0
- package/dist/cli/chat.handler.d.ts +19 -0
- package/dist/cli/chat.handler.js +431 -0
- package/dist/cli/chat.handler.js.map +1 -0
- package/dist/cli/cli.handler.d.ts +4 -0
- package/dist/cli/cli.handler.js +97 -0
- package/dist/cli/cli.handler.js.map +1 -0
- package/dist/cli/doctor.handler.d.ts +36 -0
- package/dist/cli/doctor.handler.js +382 -0
- package/dist/cli/doctor.handler.js.map +1 -0
- package/dist/cli/execute.handler.d.ts +2 -0
- package/dist/cli/execute.handler.js +319 -0
- package/dist/cli/execute.handler.js.map +1 -0
- package/dist/cli/help.handler.d.ts +2 -0
- package/dist/cli/help.handler.js +10 -0
- package/dist/cli/help.handler.js.map +1 -0
- package/dist/cli/init.handler.d.ts +26 -0
- package/dist/cli/init.handler.js +450 -0
- package/dist/cli/init.handler.js.map +1 -0
- package/dist/cli/mcp.handler.d.ts +3 -0
- package/dist/cli/mcp.handler.js +121 -0
- package/dist/cli/mcp.handler.js.map +1 -0
- package/dist/cli/query.handler.d.ts +2 -0
- package/dist/cli/query.handler.js +380 -0
- package/dist/cli/query.handler.js.map +1 -0
- package/dist/cli/templates.handler.d.ts +2 -0
- package/dist/cli/templates.handler.js +100 -0
- package/dist/cli/templates.handler.js.map +1 -0
- package/dist/cli-options.d.ts +29 -0
- package/dist/cli-options.js +234 -0
- package/dist/cli-options.js.map +1 -0
- package/dist/config/timeout.config.d.ts +14 -0
- package/dist/config/timeout.config.js +34 -0
- package/dist/config/timeout.config.js.map +1 -0
- package/dist/conversation/base-conversation-history.provider.d.ts +12 -0
- package/dist/conversation/base-conversation-history.provider.js +45 -0
- package/dist/conversation/base-conversation-history.provider.js.map +1 -0
- package/dist/conversation/cli-conversation-history.provider.d.ts +16 -0
- package/dist/conversation/cli-conversation-history.provider.js +111 -0
- package/dist/conversation/cli-conversation-history.provider.js.map +1 -0
- package/dist/conversation/conversation-provider.factory.d.ts +10 -0
- package/dist/conversation/conversation-provider.factory.js +50 -0
- package/dist/conversation/conversation-provider.factory.js.map +1 -0
- package/dist/conversation/index.d.ts +6 -0
- package/dist/conversation/index.js +27 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/conversation/slack-conversation-history.provider.d.ts +28 -0
- package/dist/conversation/slack-conversation-history.provider.js +278 -0
- package/dist/conversation/slack-conversation-history.provider.js.map +1 -0
- package/dist/crewx.tool.d.ts +332 -0
- package/dist/crewx.tool.js +1461 -0
- package/dist/crewx.tool.js.map +1 -0
- package/dist/guards/bearer-auth.guard.d.ts +7 -0
- package/dist/guards/bearer-auth.guard.js +44 -0
- package/dist/guards/bearer-auth.guard.js.map +1 -0
- package/dist/health.controller.d.ts +6 -0
- package/dist/health.controller.js +32 -0
- package/dist/health.controller.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +267 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp.controller.d.ts +8 -0
- package/dist/mcp.controller.js +62 -0
- package/dist/mcp.controller.js.map +1 -0
- package/dist/project.service.d.ts +44 -0
- package/dist/project.service.js +299 -0
- package/dist/project.service.js.map +1 -0
- package/dist/providers/base-ai.provider.d.ts +50 -0
- package/dist/providers/base-ai.provider.js +624 -0
- package/dist/providers/base-ai.provider.js.map +1 -0
- package/dist/providers/claude.provider.d.ts +25 -0
- package/dist/providers/claude.provider.js +362 -0
- package/dist/providers/claude.provider.js.map +1 -0
- package/dist/providers/codex.provider.d.ts +17 -0
- package/dist/providers/codex.provider.js +99 -0
- package/dist/providers/codex.provider.js.map +1 -0
- package/dist/providers/copilot.provider.d.ts +25 -0
- package/dist/providers/copilot.provider.js +266 -0
- package/dist/providers/copilot.provider.js.map +1 -0
- package/dist/providers/dynamic-provider.factory.d.ts +55 -0
- package/dist/providers/dynamic-provider.factory.js +586 -0
- package/dist/providers/dynamic-provider.factory.js.map +1 -0
- package/dist/providers/gemini.provider.d.ts +22 -0
- package/dist/providers/gemini.provider.js +147 -0
- package/dist/providers/gemini.provider.js.map +1 -0
- package/dist/services/agent-loader.service.d.ts +29 -0
- package/dist/services/agent-loader.service.js +370 -0
- package/dist/services/agent-loader.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +9 -0
- package/dist/services/auth.service.js +47 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/config-validator.service.d.ts +28 -0
- package/dist/services/config-validator.service.js +467 -0
- package/dist/services/config-validator.service.js.map +1 -0
- package/dist/services/config.service.d.ts +45 -0
- package/dist/services/config.service.js +180 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/context-enhancement.service.d.ts +13 -0
- package/dist/services/context-enhancement.service.js +169 -0
- package/dist/services/context-enhancement.service.js.map +1 -0
- package/dist/services/document-loader.service.d.ts +16 -0
- package/dist/services/document-loader.service.js +137 -0
- package/dist/services/document-loader.service.js.map +1 -0
- package/dist/services/help.service.d.ts +5 -0
- package/dist/services/help.service.js +117 -0
- package/dist/services/help.service.js.map +1 -0
- package/dist/services/intelligent-compression.service.d.ts +20 -0
- package/dist/services/intelligent-compression.service.js +179 -0
- package/dist/services/intelligent-compression.service.js.map +1 -0
- package/dist/services/mcp-client.service.d.ts +26 -0
- package/dist/services/mcp-client.service.js +81 -0
- package/dist/services/mcp-client.service.js.map +1 -0
- package/dist/services/parallel-processing.service.d.ts +108 -0
- package/dist/services/parallel-processing.service.js +268 -0
- package/dist/services/parallel-processing.service.js.map +1 -0
- package/dist/services/remote-agent.service.d.ts +49 -0
- package/dist/services/remote-agent.service.js +215 -0
- package/dist/services/remote-agent.service.js.map +1 -0
- package/dist/services/result-formatter.service.d.ts +27 -0
- package/dist/services/result-formatter.service.js +126 -0
- package/dist/services/result-formatter.service.js.map +1 -0
- package/dist/services/task-management.service.d.ts +63 -0
- package/dist/services/task-management.service.js +272 -0
- package/dist/services/task-management.service.js.map +1 -0
- package/dist/services/template.service.d.ts +36 -0
- package/dist/services/template.service.js +195 -0
- package/dist/services/template.service.js.map +1 -0
- package/dist/services/tool-call.service.d.ts +53 -0
- package/dist/services/tool-call.service.js +1061 -0
- package/dist/services/tool-call.service.js.map +1 -0
- package/dist/slack/formatters/message.formatter.d.ts +25 -0
- package/dist/slack/formatters/message.formatter.js +246 -0
- package/dist/slack/formatters/message.formatter.js.map +1 -0
- package/dist/slack/slack-bot.d.ts +24 -0
- package/dist/slack/slack-bot.js +467 -0
- package/dist/slack/slack-bot.js.map +1 -0
- package/dist/stderr.logger.d.ts +8 -0
- package/dist/stderr.logger.js +26 -0
- package/dist/stderr.logger.js.map +1 -0
- package/dist/utils/config-utils.d.ts +15 -0
- package/dist/utils/config-utils.js +69 -0
- package/dist/utils/config-utils.js.map +1 -0
- package/dist/utils/mcp-installer.d.ts +20 -0
- package/dist/utils/mcp-installer.js +199 -0
- package/dist/utils/mcp-installer.js.map +1 -0
- package/dist/utils/mention-parser.d.ts +18 -0
- package/dist/utils/mention-parser.js +136 -0
- package/dist/utils/mention-parser.js.map +1 -0
- package/dist/utils/simple-security.d.ts +3 -0
- package/dist/utils/simple-security.js +20 -0
- package/dist/utils/simple-security.js.map +1 -0
- package/dist/utils/stdin-utils.d.ts +27 -0
- package/dist/utils/stdin-utils.js +130 -0
- package/dist/utils/stdin-utils.js.map +1 -0
- package/dist/utils/template-processor.d.ts +32 -0
- package/dist/utils/template-processor.js +202 -0
- package/dist/utils/template-processor.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/package.json +122 -0
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.InitHandler = void 0;
|
|
13
|
+
exports.handleInit = handleInit;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const fs_1 = require("fs");
|
|
16
|
+
const path_1 = require("path");
|
|
17
|
+
const task_management_service_1 = require("../services/task-management.service");
|
|
18
|
+
const result_formatter_service_1 = require("../services/result-formatter.service");
|
|
19
|
+
const template_service_1 = require("../services/template.service");
|
|
20
|
+
let InitHandler = class InitHandler {
|
|
21
|
+
constructor(taskManagementService, resultFormatterService, templateService) {
|
|
22
|
+
this.taskManagementService = taskManagementService;
|
|
23
|
+
this.resultFormatterService = resultFormatterService;
|
|
24
|
+
this.templateService = templateService;
|
|
25
|
+
}
|
|
26
|
+
async handle(options = {}) {
|
|
27
|
+
const taskId = this.taskManagementService.createTask({
|
|
28
|
+
type: 'init',
|
|
29
|
+
command: 'crewx init',
|
|
30
|
+
options: options
|
|
31
|
+
});
|
|
32
|
+
try {
|
|
33
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
34
|
+
level: 'info',
|
|
35
|
+
message: 'Starting CrewX project initialization'
|
|
36
|
+
});
|
|
37
|
+
const workingDir = options.workingDirectory || process.cwd();
|
|
38
|
+
const configPath = options.config || 'crewx.yaml';
|
|
39
|
+
const fullConfigPath = (0, path_1.join)(workingDir, configPath);
|
|
40
|
+
const templateName = options.template || 'default';
|
|
41
|
+
const templateVersion = options.templateVersion || 'main';
|
|
42
|
+
if ((0, fs_1.existsSync)(fullConfigPath) && !options.force) {
|
|
43
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
44
|
+
level: 'warn',
|
|
45
|
+
message: `Configuration file already exists: ${fullConfigPath}`
|
|
46
|
+
});
|
|
47
|
+
const message = `⚠️ CrewX configuration already exists at ${configPath}\n\nUse --force to overwrite existing configuration.`;
|
|
48
|
+
this.taskManagementService.completeTask(taskId, { message }, false);
|
|
49
|
+
return { success: false, message, taskId };
|
|
50
|
+
}
|
|
51
|
+
const logDir = (0, path_1.join)(workingDir, '.crewx', 'logs');
|
|
52
|
+
if (!(0, fs_1.existsSync)(logDir)) {
|
|
53
|
+
(0, fs_1.mkdirSync)(logDir, { recursive: true });
|
|
54
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
55
|
+
level: 'info',
|
|
56
|
+
message: `Created logs directory: ${logDir}`
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const templatesDir = (0, path_1.join)(workingDir, '.crewx', 'templates');
|
|
60
|
+
if (!(0, fs_1.existsSync)(templatesDir)) {
|
|
61
|
+
(0, fs_1.mkdirSync)(templatesDir, { recursive: true });
|
|
62
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
63
|
+
level: 'info',
|
|
64
|
+
message: `Created templates directory: ${templatesDir}`
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
const { readFileSync, writeFileSync } = require('fs');
|
|
68
|
+
const templateSource = (0, path_1.join)(__dirname, '..', '..', 'documents', 'templates', 'conversation-history-default.hbs');
|
|
69
|
+
const templateDest = (0, path_1.join)(templatesDir, 'conversation-history-default.hbs');
|
|
70
|
+
if ((0, fs_1.existsSync)(templateSource)) {
|
|
71
|
+
const content = readFileSync(templateSource, 'utf8');
|
|
72
|
+
writeFileSync(templateDest, content);
|
|
73
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
74
|
+
level: 'info',
|
|
75
|
+
message: `Copied default conversation template`
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
81
|
+
level: 'warn',
|
|
82
|
+
message: `Could not copy default template (will use fallback): ${error instanceof Error ? error.message : String(error)}`
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const claudeCommandsDir = (0, path_1.join)(workingDir, '.claude', 'commands');
|
|
87
|
+
if (!(0, fs_1.existsSync)(claudeCommandsDir)) {
|
|
88
|
+
(0, fs_1.mkdirSync)(claudeCommandsDir, { recursive: true });
|
|
89
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
90
|
+
level: 'info',
|
|
91
|
+
message: `Created Claude commands directory: ${claudeCommandsDir}`
|
|
92
|
+
});
|
|
93
|
+
try {
|
|
94
|
+
const commandContent = this.generateClaudeCommand(workingDir);
|
|
95
|
+
const commandFile = (0, path_1.join)(claudeCommandsDir, 'crewx-user.md');
|
|
96
|
+
(0, fs_1.writeFileSync)(commandFile, commandContent, 'utf8');
|
|
97
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
98
|
+
level: 'info',
|
|
99
|
+
message: `Created Claude Code command: ${commandFile}`
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
104
|
+
level: 'warn',
|
|
105
|
+
message: `Could not create Claude command file: ${error instanceof Error ? error.message : String(error)}`
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
let configContent;
|
|
110
|
+
try {
|
|
111
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
112
|
+
level: 'info',
|
|
113
|
+
message: `Downloading template '${templateName}' from GitHub (${templateVersion})...`
|
|
114
|
+
});
|
|
115
|
+
configContent = await this.templateService.downloadTemplate(templateName, templateVersion);
|
|
116
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
117
|
+
level: 'info',
|
|
118
|
+
message: `✅ Successfully downloaded template from GitHub`
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (downloadError) {
|
|
122
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
123
|
+
level: 'warn',
|
|
124
|
+
message: `Failed to download template: ${downloadError?.message || downloadError}`
|
|
125
|
+
});
|
|
126
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
127
|
+
level: 'info',
|
|
128
|
+
message: 'Using local default template as fallback...'
|
|
129
|
+
});
|
|
130
|
+
configContent = this.generateDefaultAgentsConfig(workingDir);
|
|
131
|
+
}
|
|
132
|
+
(0, fs_1.writeFileSync)(fullConfigPath, configContent, 'utf8');
|
|
133
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
134
|
+
level: 'info',
|
|
135
|
+
message: `Created configuration file: ${fullConfigPath}`
|
|
136
|
+
});
|
|
137
|
+
const successMessage = this.formatSuccessMessage(configPath, workingDir, templateName);
|
|
138
|
+
this.taskManagementService.completeTask(taskId, { message: successMessage }, true);
|
|
139
|
+
return { success: true, message: successMessage, taskId };
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
const errorMessage = `Failed to initialize CrewX project: ${error instanceof Error ? error.message : String(error)}`;
|
|
143
|
+
this.taskManagementService.addTaskLog(taskId, {
|
|
144
|
+
level: 'error',
|
|
145
|
+
message: errorMessage
|
|
146
|
+
});
|
|
147
|
+
this.taskManagementService.completeTask(taskId, { error: errorMessage }, false);
|
|
148
|
+
return { success: false, message: errorMessage, taskId };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
generateDefaultAgentsConfig(workingDir) {
|
|
152
|
+
return `# CrewX Agents Configuration
|
|
153
|
+
# Generated by 'crewx init'
|
|
154
|
+
|
|
155
|
+
agents:
|
|
156
|
+
# CrewX Assistant - Your guide to using CrewX
|
|
157
|
+
- id: "crewx"
|
|
158
|
+
name: "CrewX Assistant"
|
|
159
|
+
role: "assistant"
|
|
160
|
+
team: "CrewX"
|
|
161
|
+
working_directory: "./"
|
|
162
|
+
options:
|
|
163
|
+
query:
|
|
164
|
+
- "--add-dir=."
|
|
165
|
+
inline:
|
|
166
|
+
type: "agent"
|
|
167
|
+
provider: "claude" # Will fallback to gemini → copilot if claude is unavailable
|
|
168
|
+
system_prompt: |
|
|
169
|
+
You are the CrewX Assistant, designed to help users with:
|
|
170
|
+
|
|
171
|
+
1. **Getting Started with CrewX**:
|
|
172
|
+
- Explain how to use crewx CLI commands (query, execute, init, doctor)
|
|
173
|
+
- Guide users through agent configuration in crewx.yaml
|
|
174
|
+
- Help with model selection using @agent:model syntax
|
|
175
|
+
|
|
176
|
+
2. **Agent Configuration**:
|
|
177
|
+
- Assist with creating custom agents in crewx.yaml
|
|
178
|
+
- Explain inline configuration (provider, model, system_prompt)
|
|
179
|
+
- Help configure options for query and execute modes
|
|
180
|
+
|
|
181
|
+
3. **Troubleshooting**:
|
|
182
|
+
- Diagnose CLI tool availability issues
|
|
183
|
+
- Explain error messages and suggest solutions
|
|
184
|
+
- Guide users through authentication setup for claude/gemini/copilot
|
|
185
|
+
|
|
186
|
+
4. **Best Practices**:
|
|
187
|
+
- Recommend which models to use for different tasks
|
|
188
|
+
- Suggest parallel vs sequential execution strategies
|
|
189
|
+
- Advise on cost-effective model selection
|
|
190
|
+
|
|
191
|
+
Always be helpful, concise, and provide practical examples.
|
|
192
|
+
Focus on CrewX-specific guidance and tool usage.
|
|
193
|
+
|
|
194
|
+
# Built-in AI Assistants (Ready to use)
|
|
195
|
+
- id: "claude"
|
|
196
|
+
name: "Claude AI"
|
|
197
|
+
role: "AI Assistant"
|
|
198
|
+
team: "AI Team"
|
|
199
|
+
working_directory: "./"
|
|
200
|
+
inline:
|
|
201
|
+
type: "agent"
|
|
202
|
+
provider: "claude"
|
|
203
|
+
system_prompt: |
|
|
204
|
+
Claude AI assistant for general tasks, code analysis, and writing assistance.
|
|
205
|
+
|
|
206
|
+
Specialties: General AI, Code Analysis, Writing, Problem Solving
|
|
207
|
+
Capabilities: general_assistance, code_analysis, writing
|
|
208
|
+
|
|
209
|
+
- id: "gemini"
|
|
210
|
+
name: "Gemini AI"
|
|
211
|
+
role: "AI Assistant"
|
|
212
|
+
team: "AI Team"
|
|
213
|
+
working_directory: "./"
|
|
214
|
+
inline:
|
|
215
|
+
type: "agent"
|
|
216
|
+
provider: "gemini"
|
|
217
|
+
system_prompt: |
|
|
218
|
+
Google Gemini AI assistant for analysis, development, and problem-solving.
|
|
219
|
+
|
|
220
|
+
Specialties: Code Analysis, Architecture Design, Performance Optimization
|
|
221
|
+
Capabilities: code_analysis, architecture_design, optimization
|
|
222
|
+
|
|
223
|
+
- id: "copilot"
|
|
224
|
+
name: "GitHub Copilot"
|
|
225
|
+
role: "AI Assistant"
|
|
226
|
+
team: "AI Team"
|
|
227
|
+
working_directory: "./"
|
|
228
|
+
inline:
|
|
229
|
+
type: "agent"
|
|
230
|
+
provider: "copilot"
|
|
231
|
+
system_prompt: |
|
|
232
|
+
GitHub Copilot AI assistant for code development and engineering tasks.
|
|
233
|
+
|
|
234
|
+
Specialties: Code Development, Best Practices, Testing
|
|
235
|
+
Capabilities: code_development, testing, best_practices
|
|
236
|
+
|
|
237
|
+
# Custom Project Agents (Example configurations)
|
|
238
|
+
# Uncomment and customize the sections below for your project needs
|
|
239
|
+
|
|
240
|
+
# - id: "backend_developer"
|
|
241
|
+
# name: "Backend Developer"
|
|
242
|
+
# role: "developer"
|
|
243
|
+
# team: "Development Team"
|
|
244
|
+
# working_directory: "${workingDir}"
|
|
245
|
+
# options:
|
|
246
|
+
# - "--allowedTools=Edit,Bash,Computer"
|
|
247
|
+
# - "--add-dir=."
|
|
248
|
+
# inline:
|
|
249
|
+
# type: "agent"
|
|
250
|
+
# provider: "claude"
|
|
251
|
+
# system_prompt: |
|
|
252
|
+
# You are a senior backend developer specializing in server-side development.
|
|
253
|
+
# Focus on API design, database architecture, and system performance.
|
|
254
|
+
#
|
|
255
|
+
# Your expertise includes:
|
|
256
|
+
# - RESTful API development
|
|
257
|
+
# - Database design and optimization
|
|
258
|
+
# - Server architecture and scalability
|
|
259
|
+
# - Security best practices
|
|
260
|
+
|
|
261
|
+
# - id: "frontend_developer"
|
|
262
|
+
# name: "Frontend Developer"
|
|
263
|
+
# role: "developer"
|
|
264
|
+
# team: "Development Team"
|
|
265
|
+
# working_directory: "${workingDir}"
|
|
266
|
+
# options:
|
|
267
|
+
# - "--allow-tool=terminal"
|
|
268
|
+
# - "--allow-tool=files"
|
|
269
|
+
# - "--add-dir=."
|
|
270
|
+
# inline:
|
|
271
|
+
# type: "agent"
|
|
272
|
+
# provider: "copilot"
|
|
273
|
+
# system_prompt: |
|
|
274
|
+
# You are a senior frontend developer specializing in user interface development.
|
|
275
|
+
# Focus on user experience, responsive design, and modern frontend frameworks.
|
|
276
|
+
#
|
|
277
|
+
# Your expertise includes:
|
|
278
|
+
# - React, Vue, Angular development
|
|
279
|
+
# - CSS/SCSS and responsive design
|
|
280
|
+
# - JavaScript/TypeScript best practices
|
|
281
|
+
# - Performance optimization
|
|
282
|
+
|
|
283
|
+
# - id: "devops_engineer"
|
|
284
|
+
# name: "DevOps Engineer"
|
|
285
|
+
# role: "engineer"
|
|
286
|
+
# team: "Infrastructure Team"
|
|
287
|
+
# working_directory: "${workingDir}"
|
|
288
|
+
# inline:
|
|
289
|
+
# type: "agent"
|
|
290
|
+
# provider: "gemini"
|
|
291
|
+
# system_prompt: |
|
|
292
|
+
# You are a DevOps engineer specializing in infrastructure and deployment.
|
|
293
|
+
# Focus on automation, monitoring, and system reliability.
|
|
294
|
+
#
|
|
295
|
+
# Your expertise includes:
|
|
296
|
+
# - CI/CD pipeline design
|
|
297
|
+
# - Container orchestration (Docker, Kubernetes)
|
|
298
|
+
# - Cloud infrastructure (AWS, GCP, Azure)
|
|
299
|
+
# - Monitoring and logging systems
|
|
300
|
+
|
|
301
|
+
# Usage Examples:
|
|
302
|
+
# crewx query "@claude analyze this codebase"
|
|
303
|
+
# crewx query "@claude @gemini @copilot review security practices"
|
|
304
|
+
# crewx execute "@backend_developer create user authentication API"
|
|
305
|
+
# crewx execute "@frontend_developer @backend_developer implement OAuth flow"
|
|
306
|
+
`;
|
|
307
|
+
}
|
|
308
|
+
generateClaudeCommand(workingDir) {
|
|
309
|
+
return `# CrewX 사용자 커맨드
|
|
310
|
+
|
|
311
|
+
당신은 CrewX 사용자 가이드 전문가입니다. CrewX를 처음 사용하는 분들이 쉽게 따라할 수 있도록 안내합니다.
|
|
312
|
+
|
|
313
|
+
## 🎯 주요 역할
|
|
314
|
+
|
|
315
|
+
### ✅ 도와줄 수 있는 일
|
|
316
|
+
- **CrewX 기본 사용법**: query, execute, init, doctor 명령어 가이드
|
|
317
|
+
- **에이전트 활용**: @claude, @gemini, @copilot 활용법
|
|
318
|
+
- **프로젝트 설정**: crewx.yaml 커스터마이징
|
|
319
|
+
- **문제 해결**: 일반적인 에러와 해결책
|
|
320
|
+
|
|
321
|
+
## 🚀 빠른 시작 가이드
|
|
322
|
+
|
|
323
|
+
### 1. 기본 명령어
|
|
324
|
+
\`\`\`bash
|
|
325
|
+
# 설치 확인
|
|
326
|
+
crewx doctor
|
|
327
|
+
|
|
328
|
+
# 간단한 질문
|
|
329
|
+
crewx query "@claude 이 코드를 설명해줘"
|
|
330
|
+
|
|
331
|
+
# 작업 실행
|
|
332
|
+
crewx execute "@claude 이 함수를 테스트 코드로 만들어줘"
|
|
333
|
+
\`\`\`
|
|
334
|
+
|
|
335
|
+
### 2. 에이전트 활용
|
|
336
|
+
\`\`\`bash
|
|
337
|
+
# 멀티 에이전트 활용
|
|
338
|
+
crewx query "@claude @gemini 이 아키텍처를 검토해줘"
|
|
339
|
+
|
|
340
|
+
# 특정 작업에 적합한 에이전트
|
|
341
|
+
crewx execute "@copilot React 컴포넌트를 만들어줘"
|
|
342
|
+
crewx query "@gemini 성능 최적화 방법을 분석해줘"
|
|
343
|
+
\`\`\`
|
|
344
|
+
|
|
345
|
+
### 3. 커스텀 에이전트
|
|
346
|
+
\`\`\`bash
|
|
347
|
+
# crewx.yaml에 추가한 커스텀 에이전트 활용
|
|
348
|
+
crewx query "@my_developer 이 기능을 구현해줘"
|
|
349
|
+
\`\`\`
|
|
350
|
+
|
|
351
|
+
## 🔧 일반적인 문제 해결
|
|
352
|
+
|
|
353
|
+
### 인증 문제
|
|
354
|
+
- **Claude**: ANTHROPIC_API_KEY 환경변수 설정
|
|
355
|
+
- **Gemini**: GOOGLE_API_KEY 환경변수 설정
|
|
356
|
+
- **Copilot**: GitHub 토큰 설정
|
|
357
|
+
|
|
358
|
+
### 명령어 오류
|
|
359
|
+
- \`crewx doctor\`로 상태 확인
|
|
360
|
+
- \`crewx --help\`로 전체 명령어 확인
|
|
361
|
+
|
|
362
|
+
## 📚 더 알아보기
|
|
363
|
+
|
|
364
|
+
### 심화 활용
|
|
365
|
+
- 병렬 처리: 여러 에이전트에게 동시에 작업 요청
|
|
366
|
+
- 커스텀 프롬프트: crewx.yaml에서 system_prompt 수정
|
|
367
|
+
- 템플릿 활용: 개발, 운영 등 특정 목적의 에이전트 설정
|
|
368
|
+
|
|
369
|
+
항상 친절하게 설명하고, 구체적인 예시를 들어주세요.
|
|
370
|
+
`;
|
|
371
|
+
}
|
|
372
|
+
formatSuccessMessage(configPath, workingDir, templateName) {
|
|
373
|
+
const templateInfo = templateName && templateName !== 'default'
|
|
374
|
+
? `\n**Template Used:** \`${templateName}\``
|
|
375
|
+
: '';
|
|
376
|
+
return `🎉 **CrewX Project Initialized Successfully!**
|
|
377
|
+
|
|
378
|
+
**Configuration File Created:** \`${configPath}\`
|
|
379
|
+
**Working Directory:** \`${workingDir}\`
|
|
380
|
+
**Logs Directory:** \`.crewx/logs\`
|
|
381
|
+
**Claude Commands:** \`.claude/commands/crewx-user.md\`${templateInfo}
|
|
382
|
+
|
|
383
|
+
**Available Agents:**
|
|
384
|
+
• \`@claude\` - Claude AI Assistant (General purpose)
|
|
385
|
+
• \`@gemini\` - Gemini AI Assistant (Analysis & Architecture)
|
|
386
|
+
• \`@copilot\` - GitHub Copilot (Code Development)
|
|
387
|
+
|
|
388
|
+
**Claude Code Integration:**
|
|
389
|
+
• Use \`@crewx-user\` for quick help and guidance
|
|
390
|
+
• Built-in command for CrewX usage assistance
|
|
391
|
+
|
|
392
|
+
**Next Steps:**
|
|
393
|
+
1. **Test your setup:**
|
|
394
|
+
\`crewx doctor\`
|
|
395
|
+
|
|
396
|
+
2. **Try Claude Code:**
|
|
397
|
+
In Claude Code: \`@crewx-user how do I start?\`
|
|
398
|
+
|
|
399
|
+
3. **Try a simple query:**
|
|
400
|
+
\`crewx query "@claude hello world"\`
|
|
401
|
+
|
|
402
|
+
4. **Customize your agents:**
|
|
403
|
+
Edit \`${configPath}\` to add project-specific agents
|
|
404
|
+
|
|
405
|
+
5. **Learn more:**
|
|
406
|
+
\`crewx --help\`
|
|
407
|
+
|
|
408
|
+
**Pro Tips:**
|
|
409
|
+
• Use multiple agents: \`crewx query "@claude @gemini analyze this code"\`
|
|
410
|
+
• Claude Code users: \`@crewx-user\` for instant guidance
|
|
411
|
+
• Add custom agents in \`${configPath}\` for specialized tasks
|
|
412
|
+
|
|
413
|
+
Happy coding with CrewX! 🚀`;
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
exports.InitHandler = InitHandler;
|
|
417
|
+
exports.InitHandler = InitHandler = __decorate([
|
|
418
|
+
(0, common_1.Injectable)(),
|
|
419
|
+
__metadata("design:paramtypes", [task_management_service_1.TaskManagementService,
|
|
420
|
+
result_formatter_service_1.ResultFormatterService,
|
|
421
|
+
template_service_1.TemplateService])
|
|
422
|
+
], InitHandler);
|
|
423
|
+
const common_2 = require("@nestjs/common");
|
|
424
|
+
const logger = new common_2.Logger('InitHandler');
|
|
425
|
+
async function handleInit(app, args) {
|
|
426
|
+
logger.log('Init command received');
|
|
427
|
+
try {
|
|
428
|
+
const initHandler = app.get(InitHandler);
|
|
429
|
+
console.log('🚀 Initializing CrewX project...');
|
|
430
|
+
const result = await initHandler.handle({
|
|
431
|
+
config: args.config,
|
|
432
|
+
workingDirectory: process.cwd(),
|
|
433
|
+
force: args.force || false,
|
|
434
|
+
template: args.template || 'default',
|
|
435
|
+
templateVersion: args.templateVersion || 'main',
|
|
436
|
+
});
|
|
437
|
+
console.log(result.message);
|
|
438
|
+
if (!result.success) {
|
|
439
|
+
process.exit(1);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
logger.error(`Init failed: ${error instanceof Error ? error.message : error}`);
|
|
444
|
+
console.log('❌ Failed to initialize CrewX project');
|
|
445
|
+
console.log(` Error: ${error instanceof Error ? error.message : error}`);
|
|
446
|
+
console.log(' Try running with --force or check file permissions');
|
|
447
|
+
process.exit(1);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=init.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.handler.js","sourceRoot":"","sources":["../../src/cli/init.handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleMcpCallTool = handleMcpCallTool;
|
|
4
|
+
exports.handleMcpListTools = handleMcpListTools;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const core_1 = require("@nestjs/core");
|
|
7
|
+
const app_module_1 = require("../app.module");
|
|
8
|
+
const stderr_logger_1 = require("../stderr.logger");
|
|
9
|
+
const tool_call_service_1 = require("../services/tool-call.service");
|
|
10
|
+
const config_service_1 = require("../services/config.service");
|
|
11
|
+
const ai_provider_service_1 = require("../ai-provider.service");
|
|
12
|
+
const logger = new common_1.Logger('McpCliHandler');
|
|
13
|
+
function parseToolParams(paramString) {
|
|
14
|
+
if (!paramString || !paramString.trim()) {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(paramString);
|
|
19
|
+
if (parsed === null || typeof parsed !== 'object') {
|
|
20
|
+
throw new Error('JSON root must be an object');
|
|
21
|
+
}
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw new Error(`Invalid JSON provided via --params: ${error.message || String(error)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function prepareApplicationContext(args) {
|
|
29
|
+
const app = await core_1.NestFactory.createApplicationContext(app_module_1.AppModule.forRoot(args), {
|
|
30
|
+
logger: args.log ? new stderr_logger_1.StderrLogger('CrewXMCP', { timestamp: true }) : false,
|
|
31
|
+
});
|
|
32
|
+
if (args.config) {
|
|
33
|
+
const configService = app.get(config_service_1.ConfigService);
|
|
34
|
+
const aiProviderService = app.get(ai_provider_service_1.AIProviderService);
|
|
35
|
+
configService.setConfigPath(args.config);
|
|
36
|
+
configService.loadAgentConfigs();
|
|
37
|
+
await aiProviderService.reloadPluginProviders();
|
|
38
|
+
}
|
|
39
|
+
return app;
|
|
40
|
+
}
|
|
41
|
+
async function handleMcpCallTool(args) {
|
|
42
|
+
if (!args.mcpToolName) {
|
|
43
|
+
console.error('❌ Missing tool name. Usage: crewx mcp call_tool "<tool_name>" --params \'{"key":"value"}\'');
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
let app;
|
|
47
|
+
let exitCode = 0;
|
|
48
|
+
try {
|
|
49
|
+
const input = parseToolParams(args.mcpParams);
|
|
50
|
+
app = await prepareApplicationContext(args);
|
|
51
|
+
const toolCallService = app.get(tool_call_service_1.ToolCallService);
|
|
52
|
+
logger.log(`Invoking MCP tool '${args.mcpToolName}'`);
|
|
53
|
+
const result = await toolCallService.execute(args.mcpToolName, input, {
|
|
54
|
+
agentId: 'cli:mcp',
|
|
55
|
+
threadId: args.thread,
|
|
56
|
+
});
|
|
57
|
+
if (result.success) {
|
|
58
|
+
console.log(`✅ Tool '${args.mcpToolName}' executed successfully`);
|
|
59
|
+
if (result.data !== undefined) {
|
|
60
|
+
const output = typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2);
|
|
61
|
+
console.log(output);
|
|
62
|
+
}
|
|
63
|
+
if (result.metadata) {
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log('ℹ️ Metadata:');
|
|
66
|
+
console.log(JSON.stringify(result.metadata, null, 2));
|
|
67
|
+
}
|
|
68
|
+
exitCode = 0;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.error(`❌ Tool '${args.mcpToolName}' execution failed`);
|
|
72
|
+
if (result.error) {
|
|
73
|
+
console.error(`Error: ${result.error}`);
|
|
74
|
+
}
|
|
75
|
+
if (result.data) {
|
|
76
|
+
console.error('Partial data:');
|
|
77
|
+
console.error(JSON.stringify(result.data, null, 2));
|
|
78
|
+
}
|
|
79
|
+
exitCode = 1;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error(`❌ Failed to execute tool '${args.mcpToolName}': ${error.message || error}`);
|
|
84
|
+
exitCode = 1;
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
if (app) {
|
|
88
|
+
await app.close();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return exitCode;
|
|
92
|
+
}
|
|
93
|
+
async function handleMcpListTools(args) {
|
|
94
|
+
let app;
|
|
95
|
+
let exitCode = 0;
|
|
96
|
+
try {
|
|
97
|
+
app = await prepareApplicationContext(args);
|
|
98
|
+
const toolCallService = app.get(tool_call_service_1.ToolCallService);
|
|
99
|
+
const tools = toolCallService.list();
|
|
100
|
+
if (!tools || tools.length === 0) {
|
|
101
|
+
console.log('ℹ️ No MCP tools are registered.');
|
|
102
|
+
return exitCode;
|
|
103
|
+
}
|
|
104
|
+
console.log(`🔧 Registered MCP tools (${tools.length}):`);
|
|
105
|
+
tools.forEach((tool) => {
|
|
106
|
+
console.log(`- ${tool.name}: ${tool.description}`);
|
|
107
|
+
});
|
|
108
|
+
exitCode = 0;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(`❌ Failed to list MCP tools: ${error.message || error}`);
|
|
112
|
+
exitCode = 1;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
if (app) {
|
|
116
|
+
await app.close();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return exitCode;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=mcp.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.handler.js","sourceRoot":"","sources":["../../src/cli/mcp.handler.ts"],"names":[],"mappings":"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"}
|