stigmergy 1.0.72 ā 1.0.73
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/package.json +3 -2
- package/src/main.js +402 -116
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stigmergy",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.73",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"description": "Stigmergy CLI - Multi-Agents Cross-AI CLI Tools Collaboration System",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
"clean": "node src/index.js clean",
|
|
22
22
|
"dev": "node --watch src/index.js",
|
|
23
23
|
"lint": "eslint src/",
|
|
24
|
-
"format": "prettier --write src/"
|
|
24
|
+
"format": "prettier --write src/",
|
|
25
|
+
"postinstall": "node src/main.js auto-install"
|
|
25
26
|
},
|
|
26
27
|
"keywords": [
|
|
27
28
|
"ai",
|
package/src/main.js
CHANGED
|
@@ -1,37 +1,85 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Stigmergy CLI -
|
|
4
|
+
* Stigmergy CLI - Automated Installation and Deployment System
|
|
5
5
|
* Multi-Agents Cross-AI CLI Tools Collaboration System
|
|
6
|
-
* Includes auto-scanning and installation capabilities
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
const { spawn, spawnSync } = require('child_process');
|
|
10
9
|
const path = require('path');
|
|
11
|
-
const fs = require('fs');
|
|
10
|
+
const fs = require('fs/promises');
|
|
12
11
|
const os = require('os');
|
|
13
12
|
|
|
14
13
|
// CLI Tools Configuration
|
|
15
14
|
const CLI_TOOLS = {
|
|
16
|
-
claude: {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
claude: {
|
|
16
|
+
name: 'Claude CLI',
|
|
17
|
+
version: 'claude --version',
|
|
18
|
+
install: 'npm install -g @anthropic-ai/claude-cli',
|
|
19
|
+
hooksDir: path.join(os.homedir(), '.claude', 'hooks'),
|
|
20
|
+
config: path.join(os.homedir(), '.claude', 'config.json')
|
|
21
|
+
},
|
|
22
|
+
gemini: {
|
|
23
|
+
name: 'Gemini CLI',
|
|
24
|
+
version: 'gemini --version',
|
|
25
|
+
install: 'npm install -g @google/generative-ai-cli',
|
|
26
|
+
hooksDir: path.join(os.homedir(), '.gemini', 'extensions'),
|
|
27
|
+
config: path.join(os.homedir(), '.gemini', 'config.json')
|
|
28
|
+
},
|
|
29
|
+
qwen: {
|
|
30
|
+
name: 'Qwen CLI',
|
|
31
|
+
version: 'qwen --version',
|
|
32
|
+
install: 'npm install -g @alibaba/qwen-cli',
|
|
33
|
+
hooksDir: path.join(os.homedir(), '.qwen', 'hooks'),
|
|
34
|
+
config: path.join(os.homedir(), '.qwen', 'config.json')
|
|
35
|
+
},
|
|
36
|
+
iflow: {
|
|
37
|
+
name: 'iFlow CLI',
|
|
38
|
+
version: 'iflow --version',
|
|
39
|
+
install: 'npm install -g iflow-cli',
|
|
40
|
+
hooksDir: path.join(os.homedir(), '.iflow', 'hooks'),
|
|
41
|
+
config: path.join(os.homedir(), '.iflow', 'config.json')
|
|
42
|
+
},
|
|
43
|
+
qoder: {
|
|
44
|
+
name: 'Qoder CLI',
|
|
45
|
+
version: 'qodercli --version',
|
|
46
|
+
install: 'npm install -g @qoder-ai/qodercli',
|
|
47
|
+
hooksDir: path.join(os.homedir(), '.qoder', 'hooks'),
|
|
48
|
+
config: path.join(os.homedir(), '.qoder', 'config.json')
|
|
49
|
+
},
|
|
50
|
+
codebuddy: {
|
|
51
|
+
name: 'CodeBuddy CLI',
|
|
52
|
+
version: 'codebuddy --version',
|
|
53
|
+
install: 'npm install -g codebuddy-cli',
|
|
54
|
+
hooksDir: path.join(os.homedir(), '.codebuddy', 'hooks'),
|
|
55
|
+
config: path.join(os.homedir(), '.codebuddy', 'config.json')
|
|
56
|
+
},
|
|
57
|
+
copilot: {
|
|
58
|
+
name: 'GitHub Copilot CLI',
|
|
59
|
+
version: 'copilot --version',
|
|
60
|
+
install: 'npm install -g @github/copilot-cli',
|
|
61
|
+
hooksDir: path.join(os.homedir(), '.copilot', 'mcp'),
|
|
62
|
+
config: path.join(os.homedir(), '.copilot', 'config.json')
|
|
63
|
+
},
|
|
64
|
+
codex: {
|
|
65
|
+
name: 'OpenAI Codex CLI',
|
|
66
|
+
version: 'codex --version',
|
|
67
|
+
install: 'npm install -g openai-codex-cli',
|
|
68
|
+
hooksDir: path.join(os.homedir(), '.config', 'codex', 'slash_commands'),
|
|
69
|
+
config: path.join(os.homedir(), '.codex', 'config.json')
|
|
70
|
+
}
|
|
24
71
|
};
|
|
25
72
|
|
|
26
73
|
class StigmergyInstaller {
|
|
27
74
|
constructor() {
|
|
28
75
|
this.homeDir = os.homedir();
|
|
29
76
|
this.stigmergyDir = path.join(this.homeDir, '.stigmergy');
|
|
77
|
+
this.projectDir = process.cwd();
|
|
30
78
|
}
|
|
31
79
|
|
|
32
80
|
async ensureDirectory(dirPath) {
|
|
33
81
|
try {
|
|
34
|
-
await fs.
|
|
82
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
35
83
|
return true;
|
|
36
84
|
} catch (error) {
|
|
37
85
|
return false;
|
|
@@ -41,7 +89,10 @@ class StigmergyInstaller {
|
|
|
41
89
|
checkCLI(toolName) {
|
|
42
90
|
try {
|
|
43
91
|
const tool = CLI_TOOLS[toolName];
|
|
44
|
-
const
|
|
92
|
+
const command = tool.version.split(' ')[0];
|
|
93
|
+
const args = tool.version.split(' ').slice(1);
|
|
94
|
+
|
|
95
|
+
const result = spawnSync(command, args, {
|
|
45
96
|
stdio: 'ignore',
|
|
46
97
|
timeout: 10000,
|
|
47
98
|
env: { ...process.env }
|
|
@@ -60,48 +111,65 @@ class StigmergyInstaller {
|
|
|
60
111
|
details: []
|
|
61
112
|
};
|
|
62
113
|
|
|
63
|
-
console.log('
|
|
64
|
-
console.log('='.repeat(
|
|
114
|
+
console.log('[SCAN] Scanning for AI CLI tools on your system...');
|
|
115
|
+
console.log('='.repeat(60));
|
|
65
116
|
|
|
66
117
|
for (const [key, tool] of Object.entries(CLI_TOOLS)) {
|
|
67
118
|
const isAvailable = this.checkCLI(key);
|
|
68
119
|
|
|
69
120
|
if (isAvailable) {
|
|
70
121
|
results.available.push(key);
|
|
71
|
-
console.log(
|
|
72
|
-
results.details.push({
|
|
122
|
+
console.log(`[OK] ${tool.name}: Available (${tool.version})`);
|
|
123
|
+
results.details.push({
|
|
124
|
+
key,
|
|
125
|
+
name: tool.name,
|
|
126
|
+
status: 'Available',
|
|
127
|
+
install: tool.install,
|
|
128
|
+
hooksDir: tool.hooksDir
|
|
129
|
+
});
|
|
73
130
|
} else {
|
|
74
131
|
results.unavailable.push(key);
|
|
75
|
-
console.log(
|
|
76
|
-
results.details.push({
|
|
132
|
+
console.log(`[X] ${tool.name}: Not Available`);
|
|
133
|
+
results.details.push({
|
|
134
|
+
key,
|
|
135
|
+
name: tool.name,
|
|
136
|
+
status: 'Not Available',
|
|
137
|
+
install: tool.install,
|
|
138
|
+
hooksDir: tool.hooksDir
|
|
139
|
+
});
|
|
77
140
|
}
|
|
78
141
|
}
|
|
79
142
|
|
|
80
|
-
console.log('='.repeat(
|
|
81
|
-
console.log(
|
|
143
|
+
console.log('='.repeat(60));
|
|
144
|
+
console.log(`[SUMMARY] ${results.available.length}/${results.total} tools available`);
|
|
145
|
+
console.log('');
|
|
82
146
|
|
|
83
147
|
return results;
|
|
84
148
|
}
|
|
85
149
|
|
|
86
150
|
async promptForInstallation(scanResults) {
|
|
87
151
|
if (scanResults.unavailable.length === 0) {
|
|
88
|
-
console.log('
|
|
152
|
+
console.log('[SUCCESS] All AI CLI tools are already installed!');
|
|
89
153
|
return [];
|
|
90
154
|
}
|
|
91
155
|
|
|
92
|
-
console.log('
|
|
156
|
+
console.log('[INSTALL] The following AI CLI tools can be automatically installed:');
|
|
157
|
+
console.log('');
|
|
158
|
+
|
|
93
159
|
scanResults.unavailable.forEach((toolKey, index) => {
|
|
94
160
|
const tool = CLI_TOOLS[toolKey];
|
|
95
|
-
console.log(` ${index + 1}. ${tool.name}
|
|
161
|
+
console.log(` ${index + 1}. ${tool.name}`);
|
|
162
|
+
console.log(` Install: ${tool.install}`);
|
|
163
|
+
console.log('');
|
|
96
164
|
});
|
|
97
165
|
|
|
98
|
-
console.log('
|
|
166
|
+
console.log('[OPTIONS] Installation Options:');
|
|
99
167
|
console.log(' - Enter numbers separated by spaces (e.g: 1 3 5)');
|
|
100
168
|
console.log(' - Enter "all" to install all missing tools');
|
|
101
|
-
console.log(' -
|
|
169
|
+
console.log(' - Enter "skip" to skip CLI installation');
|
|
102
170
|
|
|
103
171
|
return new Promise((resolve) => {
|
|
104
|
-
process.stdout.write('\n
|
|
172
|
+
process.stdout.write('\n[SELECT] Select tools to install: ');
|
|
105
173
|
|
|
106
174
|
process.stdin.once('data', (data) => {
|
|
107
175
|
const input = data.toString().trim();
|
|
@@ -123,86 +191,298 @@ class StigmergyInstaller {
|
|
|
123
191
|
|
|
124
192
|
async installTools(toolKeys) {
|
|
125
193
|
if (toolKeys.length === 0) {
|
|
126
|
-
console.log('
|
|
194
|
+
console.log('[SKIP] Skipping CLI tool installation.');
|
|
127
195
|
return;
|
|
128
196
|
}
|
|
129
197
|
|
|
130
|
-
console.log(`\n
|
|
131
|
-
console.log('='.repeat(
|
|
198
|
+
console.log(`\n[INSTALL] Installing ${toolKeys.length} AI CLI tools...`);
|
|
199
|
+
console.log('='.repeat(60));
|
|
132
200
|
|
|
133
201
|
for (const toolKey of toolKeys) {
|
|
134
202
|
const tool = CLI_TOOLS[toolKey];
|
|
135
|
-
console.log(`\n
|
|
203
|
+
console.log(`\n[INSTALLING] Installing ${tool.name}...`);
|
|
136
204
|
|
|
137
205
|
try {
|
|
138
|
-
const installProcess = spawn('npm', ['install', '-g']
|
|
139
|
-
stdio: 'inherit'
|
|
206
|
+
const installProcess = spawn('npm', ['install', '-g'], {
|
|
207
|
+
stdio: 'inherit',
|
|
208
|
+
shell: true
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// Install specific package
|
|
212
|
+
const packageInstall = spawn('npm', ['install', '-g'].concat(tool.install.split(' ').slice(3)), {
|
|
213
|
+
stdio: 'inherit',
|
|
214
|
+
shell: true
|
|
140
215
|
});
|
|
141
216
|
|
|
142
217
|
await new Promise((resolve, reject) => {
|
|
143
|
-
|
|
218
|
+
packageInstall.on('close', (code) => {
|
|
144
219
|
if (code === 0) {
|
|
145
|
-
console.log(
|
|
220
|
+
console.log(`[OK] ${tool.name} installed successfully!`);
|
|
146
221
|
resolve();
|
|
147
222
|
} else {
|
|
148
|
-
console.log(
|
|
223
|
+
console.log(`[ERROR] Failed to install ${tool.name}`);
|
|
149
224
|
reject(new Error(`Installation failed with code ${code}`));
|
|
150
225
|
}
|
|
151
226
|
});
|
|
152
227
|
});
|
|
153
228
|
} catch (error) {
|
|
154
|
-
console.log(
|
|
229
|
+
console.log(`[ERROR] Error installing ${tool.name}:`, error.message);
|
|
155
230
|
}
|
|
156
231
|
}
|
|
157
232
|
|
|
158
|
-
console.log('\n
|
|
233
|
+
console.log('\n[VERIFY] CLI Installation completed! Verifying...');
|
|
159
234
|
await this.verifyInstallation(toolKeys);
|
|
160
235
|
}
|
|
161
236
|
|
|
162
237
|
async verifyInstallation(toolKeys) {
|
|
163
|
-
console.log('='.repeat(
|
|
238
|
+
console.log('='.repeat(60));
|
|
164
239
|
let successCount = 0;
|
|
165
240
|
|
|
166
241
|
for (const toolKey of toolKeys) {
|
|
167
242
|
const tool = CLI_TOOLS[toolKey];
|
|
168
243
|
if (this.checkCLI(toolKey)) {
|
|
169
|
-
console.log(
|
|
244
|
+
console.log(`[OK] ${tool.name}: Successfully installed and functional!`);
|
|
170
245
|
successCount++;
|
|
171
246
|
} else {
|
|
172
|
-
console.log(
|
|
247
|
+
console.log(`[FAIL] ${tool.name}: Installation verification failed`);
|
|
173
248
|
}
|
|
174
249
|
}
|
|
175
250
|
|
|
176
|
-
console.log(`\n
|
|
251
|
+
console.log(`\n[RESULT] Installation Result: ${successCount}/${toolKeys.length} tools successfully installed`);
|
|
177
252
|
|
|
178
253
|
if (successCount === toolKeys.length) {
|
|
179
|
-
console.log('
|
|
254
|
+
console.log('[SUCCESS] All selected CLI tools are now ready to use!');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async deployHooks(availableTools) {
|
|
259
|
+
if (availableTools.length === 0) {
|
|
260
|
+
console.log('[SKIP] No CLI tools available for hook deployment.');
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
console.log(`\n[DEPLOY] Deploying Stigmergy hooks to ${availableTools.length} CLI tools...`);
|
|
265
|
+
console.log('='.repeat(60));
|
|
266
|
+
|
|
267
|
+
const hookTemplate = `#!/usr/bin/env node
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Stigmergy Hook - ${new Date().toISOString()}
|
|
271
|
+
* Generated by Stigmergy CLI
|
|
272
|
+
*/
|
|
273
|
+
|
|
274
|
+
const { spawn } = require('child_process');
|
|
275
|
+
|
|
276
|
+
// Stigmergy Hook Implementation
|
|
277
|
+
class StigmergyHook {
|
|
278
|
+
constructor() {
|
|
279
|
+
this.processArgs();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
processArgs() {
|
|
283
|
+
const args = process.argv.slice(2);
|
|
284
|
+
if (args.length === 0) {
|
|
285
|
+
this.showHelp();
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const command = args[0];
|
|
290
|
+
switch (command) {
|
|
291
|
+
case 'collaborate':
|
|
292
|
+
this.handleCollaborate(args.slice(1));
|
|
293
|
+
break;
|
|
294
|
+
case 'status':
|
|
295
|
+
this.showStatus();
|
|
296
|
+
break;
|
|
297
|
+
case 'init':
|
|
298
|
+
this.initProject(args.slice(1));
|
|
299
|
+
break;
|
|
300
|
+
default:
|
|
301
|
+
this.showHelp();
|
|
180
302
|
}
|
|
181
303
|
}
|
|
182
304
|
|
|
183
|
-
|
|
305
|
+
handleCollaborate(args) {
|
|
306
|
+
console.log('[COLLAB] Stigmergy Collaboration System');
|
|
307
|
+
console.log('Available AI CLI tools:', Object.keys(CLI_TOOLS).join(', '));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
showStatus() {
|
|
311
|
+
console.log('[STATUS] Stigmergy Hook Status: Active');
|
|
312
|
+
console.log('Configuration: Loaded successfully');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
initProject(projectName) {
|
|
316
|
+
console.log('[INIT] Initializing Stigmergy project:', projectName || 'current');
|
|
317
|
+
console.log('[OK] Project configuration created');
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
showHelp() {
|
|
321
|
+
console.log('Stigmergy Hook - Multi-AI CLI Collaboration');
|
|
322
|
+
console.log('');
|
|
323
|
+
console.log('Commands:');
|
|
324
|
+
console.log(' collaborate [options] Start collaboration with other AI CLI tools');
|
|
325
|
+
console.log(' status Show hook status');
|
|
326
|
+
console.log(' init [project] Initialize Stigmergy project');
|
|
327
|
+
console.log(' help Show this help message');
|
|
328
|
+
console.log('');
|
|
329
|
+
console.log('Examples:');
|
|
330
|
+
console.log(' stigmergy-hook collaborate claude gemini');
|
|
331
|
+
console.log(' stigmergy-hook status');
|
|
332
|
+
console.log(' stigmergy-hook init my-project');
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Initialize hook
|
|
337
|
+
const hook = new StigmergyHook();
|
|
338
|
+
`;
|
|
339
|
+
|
|
340
|
+
let deployedCount = 0;
|
|
341
|
+
|
|
342
|
+
for (const toolKey of availableTools) {
|
|
343
|
+
const tool = CLI_TOOLS[toolKey];
|
|
344
|
+
const hooksDir = tool.hooksDir;
|
|
345
|
+
|
|
346
|
+
// Create hooks directory
|
|
347
|
+
await this.ensureDirectory(hooksDir);
|
|
348
|
+
|
|
349
|
+
// Deploy hook file
|
|
350
|
+
const hookFile = path.join(hooksDir, 'stigmergy-hook.cjs');
|
|
351
|
+
try {
|
|
352
|
+
await fs.writeFile(hookFile, hookTemplate, 'utf8');
|
|
353
|
+
|
|
354
|
+
// Make file executable on Unix systems
|
|
355
|
+
if (process.platform !== 'win32') {
|
|
356
|
+
const { spawn } = require('child_process');
|
|
357
|
+
spawn('chmod', ['+x', hookFile], { stdio: 'ignore' });
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
console.log(`[OK] ${tool.name}: Hook deployed to ${hooksDir}`);
|
|
361
|
+
deployedCount++;
|
|
362
|
+
} catch (error) {
|
|
363
|
+
console.log(`[FAIL] ${tool.name}: Failed to deploy hook - ${error.message}`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
console.log('\n[RESULT] Hook Deployment Result: ' + deployedCount + '/' + availableTools.length + ' hooks deployed');
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
async setupGlobalConfiguration() {
|
|
184
371
|
await this.ensureDirectory(this.stigmergyDir);
|
|
185
372
|
|
|
186
|
-
const
|
|
187
|
-
const defaultConfig = {
|
|
373
|
+
const globalConfig = {
|
|
188
374
|
version: '1.0.71',
|
|
189
375
|
installed: new Date().toISOString(),
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
376
|
+
projectPath: this.projectDir,
|
|
377
|
+
availableTools: [],
|
|
378
|
+
deployedHooks: [],
|
|
379
|
+
collaboration: {
|
|
380
|
+
enabled: true,
|
|
381
|
+
protocols: [
|
|
382
|
+
'Use {cli} to {task}',
|
|
383
|
+
'Call {cli} to {task}',
|
|
384
|
+
'Ask {cli} for {task}',
|
|
385
|
+
'Get {cli} to {task}',
|
|
386
|
+
'Have {cli} {task}'
|
|
387
|
+
],
|
|
388
|
+
examples: [
|
|
389
|
+
'Use claude to help debug this code',
|
|
390
|
+
'Call gemini to analyze the file',
|
|
391
|
+
'Ask qwen to translate this text'
|
|
392
|
+
]
|
|
196
393
|
}
|
|
197
394
|
};
|
|
198
395
|
|
|
396
|
+
const configPath = path.join(this.stigmergyDir, 'config.json');
|
|
199
397
|
try {
|
|
200
|
-
await fs.
|
|
201
|
-
console.log('
|
|
398
|
+
await fs.writeFile(configPath, JSON.stringify(globalConfig, null, 2));
|
|
399
|
+
console.log('[CONFIG] Global configuration saved to:', configPath);
|
|
202
400
|
} catch (error) {
|
|
203
|
-
console.log('
|
|
401
|
+
console.log('[WARN] Warning: Could not save global configuration');
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Create project documentation template
|
|
405
|
+
const projectDocs = path.join(this.projectDir, 'STIGMERGY.md');
|
|
406
|
+
const docsTemplate = `# Stigmergy Multi-AI CLI Collaboration
|
|
407
|
+
|
|
408
|
+
This project is configured for Stigmergy-based multi-AI CLI collaboration.
|
|
409
|
+
|
|
410
|
+
## Available AI CLI Tools
|
|
411
|
+
|
|
412
|
+
${availableTools.map(tool => `- **${CLI_TOOLS[tool].name}**: \`stigmergy call ${tool}\``).join('\n')}
|
|
413
|
+
|
|
414
|
+
## Usage Examples
|
|
415
|
+
|
|
416
|
+
### Cross-CLI Collaboration
|
|
417
|
+
\`\`\bash
|
|
418
|
+
# Use Claude to analyze code
|
|
419
|
+
stigmergy call claude "analyze this function"
|
|
420
|
+
|
|
421
|
+
# Use Gemini for documentation
|
|
422
|
+
stigmergy call gemini "generate docs for this file"
|
|
423
|
+
|
|
424
|
+
# Use Qwen for translation
|
|
425
|
+
stigmergy call qwen "translate to English"
|
|
426
|
+
\`\`\`
|
|
427
|
+
|
|
428
|
+
### Project Initialization
|
|
429
|
+
\`\`\bash
|
|
430
|
+
# Initialize with Claude as primary AI
|
|
431
|
+
stigmergy init --primary claude
|
|
432
|
+
|
|
433
|
+
# Initialize with multiple AI tools
|
|
434
|
+
stigmergy init --all-tools
|
|
435
|
+
\`\`\`
|
|
436
|
+
|
|
437
|
+
## Configuration
|
|
438
|
+
|
|
439
|
+
Global configuration: \`~/.stigmergy/config.json\`
|
|
440
|
+
|
|
441
|
+
## Getting Started
|
|
442
|
+
|
|
443
|
+
1. Run \`stigmergy status\` to verify setup
|
|
444
|
+
2. Use \`stigmergy call <ai-tool> "<prompt>"\` to collaborate with AI CLI tools
|
|
445
|
+
3. Check project-specific configurations in individual CLI tool directories
|
|
446
|
+
|
|
447
|
+
For more information: https://github.com/ptreezh/stigmergy-CLI-Multi-Agents
|
|
448
|
+
`;
|
|
449
|
+
|
|
450
|
+
try {
|
|
451
|
+
await fs.writeFile(projectDocs, docsTemplate, 'utf8');
|
|
452
|
+
console.log('[DOCS] Project documentation created: STIGMERGY.md');
|
|
453
|
+
} catch (error) {
|
|
454
|
+
console.log('[WARN] Warning: Could not create project documentation');
|
|
204
455
|
}
|
|
205
456
|
}
|
|
457
|
+
|
|
458
|
+
async showUsageInstructions() {
|
|
459
|
+
console.log('\n' + '='.repeat(60));
|
|
460
|
+
console.log('[SUCCESS] Stigmergy Installation and Deployment Complete!');
|
|
461
|
+
console.log('='.repeat(60));
|
|
462
|
+
console.log('');
|
|
463
|
+
console.log('[NEXT] Next Steps:');
|
|
464
|
+
console.log('');
|
|
465
|
+
console.log('1. Verify Installation:');
|
|
466
|
+
console.log(' stigmergy status');
|
|
467
|
+
console.log('');
|
|
468
|
+
console.log('2. Check Available Tools:');
|
|
469
|
+
console.log(' stigmergy scan');
|
|
470
|
+
console.log('');
|
|
471
|
+
console.log('3. Start Using AI CLI Collaboration:');
|
|
472
|
+
console.log(' stigmergy call claude "help me debug this code"');
|
|
473
|
+
console.log(' stigmergy call gemini "generate documentation"');
|
|
474
|
+
console.log(' stigmergy call qwen "translate to English"');
|
|
475
|
+
console.log('');
|
|
476
|
+
console.log('4. Initialize New Projects:');
|
|
477
|
+
console.log(' stigmergy init --primary claude');
|
|
478
|
+
console.log('');
|
|
479
|
+
console.log('[INFO] Documentation:');
|
|
480
|
+
console.log(' - Global Config: ~/.stigmergy/config.json');
|
|
481
|
+
console.log(' - Project Docs: ./STIGMERGY.md');
|
|
482
|
+
console.log(' - GitHub: https://github.com/ptreezh/stigmergy-CLI-Multi-Agents');
|
|
483
|
+
console.log('');
|
|
484
|
+
console.log('[END] Happy collaborating with multiple AI CLI tools!');
|
|
485
|
+
}
|
|
206
486
|
}
|
|
207
487
|
|
|
208
488
|
// Main CLI functionality
|
|
@@ -210,107 +490,113 @@ async function main() {
|
|
|
210
490
|
const args = process.argv.slice(2);
|
|
211
491
|
const installer = new StigmergyInstaller();
|
|
212
492
|
|
|
213
|
-
// Setup stdin for interactive prompts
|
|
214
493
|
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
215
494
|
console.log('Stigmergy CLI - Multi-Agents Cross-AI CLI Tools Collaboration System');
|
|
216
|
-
console.log('Version: 1.0.
|
|
495
|
+
console.log('Version: 1.0.73');
|
|
496
|
+
console.log('');
|
|
497
|
+
console.log('[SYSTEM] Automated Installation and Deployment System');
|
|
217
498
|
console.log('');
|
|
218
499
|
console.log('Usage: stigmergy [command] [options]');
|
|
219
500
|
console.log('');
|
|
220
501
|
console.log('Commands:');
|
|
221
|
-
console.log(' help, --help
|
|
222
|
-
console.log(' version, --version
|
|
223
|
-
console.log(' status
|
|
224
|
-
console.log(' scan
|
|
225
|
-
console.log(' install
|
|
226
|
-
console.log('
|
|
227
|
-
console.log('');
|
|
228
|
-
console.log('Examples:');
|
|
229
|
-
console.log(' stigmergy --help');
|
|
230
|
-
console.log(' stigmergy scan');
|
|
231
|
-
console.log(' stigmergy install');
|
|
502
|
+
console.log(' help, --help Show this help message');
|
|
503
|
+
console.log(' version, --version Show version information');
|
|
504
|
+
console.log(' status Check CLI tools status');
|
|
505
|
+
console.log(' scan Scan for available AI CLI tools');
|
|
506
|
+
console.log(' install Auto-install missing CLI tools');
|
|
507
|
+
console.log(' deploy Deploy hooks to installed tools');
|
|
508
|
+
console.log(' setup Complete setup and configuration');
|
|
232
509
|
console.log('');
|
|
233
|
-
console.log('
|
|
234
|
-
console.log('
|
|
235
|
-
console.log('
|
|
236
|
-
console.log('
|
|
237
|
-
console.log('
|
|
238
|
-
console.log(' ā
Cross-platform support');
|
|
510
|
+
console.log('[WORKFLOW] Automated Workflow:');
|
|
511
|
+
console.log(' 1. npm install -g stigmergy # Install Stigmergy');
|
|
512
|
+
console.log(' 2. stigmergy install # Auto-scan & install CLI tools');
|
|
513
|
+
console.log(' 3. stigmergy setup # Deploy hooks & config');
|
|
514
|
+
console.log(' 4. stigmergy call <ai> <prompt> # Start collaborating');
|
|
239
515
|
console.log('');
|
|
240
516
|
console.log('For more information, visit: https://github.com/ptreezh/stigmergy-CLI-Multi-Agents');
|
|
241
517
|
return;
|
|
242
518
|
}
|
|
243
519
|
|
|
244
520
|
if (args.includes('--version') || args.includes('version')) {
|
|
245
|
-
console.log('1.0.
|
|
521
|
+
console.log('1.0.73');
|
|
246
522
|
return;
|
|
247
523
|
}
|
|
248
524
|
|
|
249
|
-
|
|
250
|
-
|
|
525
|
+
// Auto-install mode for postinstall script
|
|
526
|
+
if (args.includes('auto-install')) {
|
|
527
|
+
console.log('[AUTO-INSTALL] Stigmergy CLI - Automated Installation and Deployment');
|
|
528
|
+
console.log('Multi-AI CLI Tools Collaboration System v1.0.73');
|
|
529
|
+
console.log('='.repeat(60));
|
|
530
|
+
|
|
531
|
+
// Disable interactive prompts for auto-install mode
|
|
532
|
+
const originalPrompt = installer.promptForInstallation;
|
|
533
|
+
installer.promptForInstallation = async () => {
|
|
534
|
+
console.log('[AUTO-INSTALL] Skipping interactive CLI installation in postinstall mode');
|
|
535
|
+
console.log('[AUTO-INSTALL] You can run "stigmergy" manually to install CLI tools interactively');
|
|
536
|
+
return [];
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
// Run automated installation and deployment
|
|
540
|
+
console.log('\n[STEP 1] Scanning for AI CLI tools...');
|
|
251
541
|
const scanResults = await installer.scanAvailableTools();
|
|
252
542
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
scanResults.available.forEach(toolKey => {
|
|
256
|
-
console.log(` - ${CLI_TOOLS[toolKey].name}`);
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
543
|
+
console.log('\n[STEP 2] Deploying Stigmergy hooks...');
|
|
544
|
+
await installer.deployHooks(scanResults.available);
|
|
261
545
|
|
|
262
|
-
|
|
263
|
-
|
|
546
|
+
console.log('\n[STEP 3] Setting up configuration...');
|
|
547
|
+
await installer.setupGlobalConfiguration(scanResults.available);
|
|
264
548
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
549
|
+
console.log('\n[AUTO-INSTALL] Stigmergy automated setup completed!');
|
|
550
|
+
console.log('[AUTO-INSTALL] Run "stigmergy" to start interactive CLI tool installation');
|
|
268
551
|
return;
|
|
269
552
|
}
|
|
270
553
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
554
|
+
// Start automated installation and deployment
|
|
555
|
+
console.log('[START] Stigmergy CLI - Automated Installation and Deployment');
|
|
556
|
+
console.log('Multi-AI CLI Tools Collaboration System v1.0.73');
|
|
557
|
+
console.log('='.repeat(60));
|
|
274
558
|
|
|
275
|
-
|
|
559
|
+
// Step 1: Scan available CLI tools
|
|
560
|
+
console.log('\n[STEP 1] Scanning for AI CLI tools...');
|
|
561
|
+
const scanResults = await installer.scanAvailableTools();
|
|
562
|
+
|
|
563
|
+
// Step 2: Prompt for CLI tool installation
|
|
564
|
+
if (scanResults.unavailable.length > 0) {
|
|
565
|
+
console.log('\n[STEP 2] CLI Tool Installation');
|
|
276
566
|
const selectedTools = await installer.promptForInstallation(scanResults);
|
|
277
567
|
await installer.installTools(selectedTools);
|
|
278
|
-
await installer.setupConfiguration();
|
|
279
568
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
569
|
+
// Re-scan after installation
|
|
570
|
+
if (selectedTools.length > 0) {
|
|
571
|
+
console.log('\n[RESCAN] Re-scanning after installation...');
|
|
572
|
+
scanResults.available = scanResults.available.concat(selectedTools.filter(tool => installer.checkCLI(tool)));
|
|
573
|
+
scanResults.unavailable = scanResults.unavailable.filter(tool => !selectedTools.includes(tool));
|
|
574
|
+
}
|
|
575
|
+
} else {
|
|
576
|
+
console.log('\n[STEP 2] All CLI tools already available!');
|
|
283
577
|
}
|
|
284
578
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
579
|
+
// Step 3: Deploy hooks
|
|
580
|
+
console.log('\n[STEP 3] Deploying Stigmergy hooks...');
|
|
581
|
+
await installer.deployHooks(scanResults.available);
|
|
288
582
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
console.log(` Missing: ${scanResults.unavailable.length} tools`);
|
|
293
|
-
|
|
294
|
-
if (scanResults.unavailable.length > 0) {
|
|
295
|
-
console.log('\nš” Run "stigmergy install" to install missing tools');
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
583
|
+
// Step 4: Setup configuration
|
|
584
|
+
console.log('\n[STEP 4] Setting up configuration...');
|
|
585
|
+
await installer.setupGlobalConfiguration(scanResults.available);
|
|
300
586
|
|
|
301
|
-
|
|
587
|
+
// Final instructions
|
|
588
|
+
await installer.showUsageInstructions();
|
|
302
589
|
}
|
|
303
590
|
|
|
304
|
-
//
|
|
591
|
+
// Setup stdin for interactive prompts
|
|
305
592
|
if (require.main === module) {
|
|
306
|
-
// Enable stdin for interactive prompts
|
|
307
593
|
if (process.stdin.isTTY) {
|
|
308
594
|
process.stdin.resume();
|
|
309
595
|
process.stdin.setEncoding('utf8');
|
|
310
596
|
}
|
|
311
597
|
|
|
312
598
|
main().catch(error => {
|
|
313
|
-
console.error('
|
|
599
|
+
console.error('[ERROR] Error:', error.message);
|
|
314
600
|
process.exit(1);
|
|
315
601
|
});
|
|
316
602
|
}
|