stigmergy 1.1.6 → 1.2.6

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.
Files changed (118) hide show
  1. package/LICENSE +18 -18
  2. package/README.md +28 -223
  3. package/STIGMERGY.md +61 -61
  4. package/docs/PROJECT_CONSTITUTION.md +433 -433
  5. package/docs/PROJECT_STRUCTURE_CURRENT.md +80 -80
  6. package/examples/calculator-example.js +72 -72
  7. package/examples/cline_usage_examples.md +364 -364
  8. package/examples/encryption-example.js +67 -67
  9. package/examples/json-parser-example.js +120 -120
  10. package/examples/json-validation-example.js +64 -64
  11. package/examples/rest-client-example.js +52 -52
  12. package/examples/rest_client_example.js +54 -54
  13. package/package.json +15 -7
  14. package/scripts/build.js +74 -74
  15. package/scripts/post-deployment-config.js +296 -296
  16. package/scripts/preinstall-check.js +173 -111
  17. package/scripts/publish.js +58 -268
  18. package/scripts/run-layered-tests.js +247 -0
  19. package/scripts/safe-install.js +139 -139
  20. package/scripts/simple-publish.js +57 -59
  21. package/src/adapters/claude/install_claude_integration.js +292 -0
  22. package/src/adapters/codebuddy/install_codebuddy_integration.js +349 -0
  23. package/src/adapters/codex/install_codex_integration.js +395 -0
  24. package/src/adapters/copilot/install_copilot_integration.js +716 -0
  25. package/src/adapters/gemini/install_gemini_integration.js +304 -0
  26. package/src/adapters/iflow/install_iflow_integration.js +304 -0
  27. package/src/adapters/qoder/install_qoder_integration.js +1090 -0
  28. package/src/adapters/qwen/install_qwen_integration.js +285 -0
  29. package/src/auth.js +173 -173
  30. package/src/auth_command.js +208 -208
  31. package/src/calculator.js +313 -313
  32. package/src/cli/router.js +792 -67
  33. package/src/core/cache_cleaner.js +767 -0
  34. package/src/core/cli_help_analyzer.js +680 -674
  35. package/src/core/cli_parameter_handler.js +132 -127
  36. package/src/core/cli_tools.js +89 -89
  37. package/src/core/coordination/index.js +16 -16
  38. package/src/core/coordination/nodejs/AdapterManager.js +102 -89
  39. package/src/core/coordination/nodejs/CLCommunication.js +132 -124
  40. package/src/core/coordination/nodejs/CLIIntegrationManager.js +272 -236
  41. package/src/core/coordination/nodejs/HealthChecker.js +76 -77
  42. package/src/core/coordination/nodejs/HookDeploymentManager.js +263 -190
  43. package/src/core/coordination/nodejs/StatisticsCollector.js +71 -71
  44. package/src/core/coordination/nodejs/index.js +90 -72
  45. package/src/core/coordination/nodejs/utils/Logger.js +29 -29
  46. package/src/core/enhanced_installer.js +479 -0
  47. package/src/core/enhanced_uninstaller.js +638 -0
  48. package/src/core/error_handler.js +406 -406
  49. package/src/core/installer.js +816 -294
  50. package/src/core/memory_manager.js +83 -83
  51. package/src/core/rest_client.js +160 -160
  52. package/src/core/smart_router.js +249 -146
  53. package/src/core/upgrade_manager.js +420 -0
  54. package/src/data_encryption.js +143 -143
  55. package/src/data_structures.js +440 -440
  56. package/src/deploy.js +55 -55
  57. package/src/index.js +30 -30
  58. package/src/test/cli-availability-checker.js +194 -0
  59. package/src/test/test-environment.js +289 -0
  60. package/src/utils/helpers.js +35 -35
  61. package/src/utils.js +921 -915
  62. package/src/weatherProcessor.js +228 -228
  63. package/test/calculator.test.js +0 -215
  64. package/test/collision-test.js +0 -26
  65. package/test/comprehensive-execution-test.js +0 -428
  66. package/test/conflict-prevention-test.js +0 -95
  67. package/test/cross-cli-detection-test.js +0 -33
  68. package/test/csv-processing-test.js +0 -36
  69. package/test/deploy-hooks-test.js +0 -250
  70. package/test/e2e/claude-cli-test.js +0 -128
  71. package/test/e2e/collaboration-test.js +0 -75
  72. package/test/e2e/comprehensive-test.js +0 -431
  73. package/test/e2e/error-handling-test.js +0 -90
  74. package/test/e2e/individual-tool-test.js +0 -143
  75. package/test/e2e/other-cli-test.js +0 -130
  76. package/test/e2e/qoder-cli-test.js +0 -128
  77. package/test/e2e/run-e2e-tests.js +0 -73
  78. package/test/e2e/test-data.js +0 -88
  79. package/test/e2e/test-utils.js +0 -222
  80. package/test/encryption-simple-test.js +0 -110
  81. package/test/encryption.test.js +0 -129
  82. package/test/enhanced-main-alignment.test.js +0 -298
  83. package/test/error-handling-test.js +0 -341
  84. package/test/fibonacci.test.js +0 -178
  85. package/test/final-deploy-test.js +0 -221
  86. package/test/final-install-test.js +0 -226
  87. package/test/hash-table-demo.js +0 -33
  88. package/test/hash-table-test.js +0 -26
  89. package/test/hash_table_test.js +0 -114
  90. package/test/hook-system-integration-test.js +0 -307
  91. package/test/iflow-integration-test.js +0 -292
  92. package/test/improved-install-test.js +0 -362
  93. package/test/install-command-test.js +0 -370
  94. package/test/json-parser-test.js +0 -161
  95. package/test/json-validation-test.js +0 -164
  96. package/test/natural-language-skills-test.js +0 -320
  97. package/test/nl-integration-test.js +0 -179
  98. package/test/parameter-parsing-test.js +0 -143
  99. package/test/plugin-deployment-test.js +0 -316
  100. package/test/postinstall-test.js +0 -269
  101. package/test/python-plugins-test.js +0 -259
  102. package/test/real-test.js +0 -435
  103. package/test/remaining-adapters-test.js +0 -256
  104. package/test/rest-client-test.js +0 -56
  105. package/test/rest_client.test.js +0 -85
  106. package/test/simple-iflow-hook-test.js +0 -137
  107. package/test/system-compatibility-test.js +0 -467
  108. package/test/tdd-deploy-fix-test.js +0 -324
  109. package/test/tdd-fixes-test.js +0 -211
  110. package/test/third-party-skills-test.js +0 -321
  111. package/test/tool-selection-integration-test.js +0 -158
  112. package/test/unit/calculator-full.test.js +0 -191
  113. package/test/unit/calculator-simple.test.js +0 -96
  114. package/test/unit/calculator.test.js +0 -97
  115. package/test/unit/cli-scanner.test.js +0 -291
  116. package/test/unit/cli_parameter_handler.test.js +0 -116
  117. package/test/unit/cross-cli-executor.test.js +0 -399
  118. package/test/weather-processor.test.js +0 -104
@@ -1,236 +1,272 @@
1
- // src/core/coordination/nodejs/CLIIntegrationManager.js
2
- const fs = require('fs');
3
- const path = require('path');
4
- const os = require('os');
5
- const { spawn, spawnSync } = require('child_process');
6
-
7
- class CLIIntegrationManager {
8
- constructor() {
9
- this.supportedCLIs = {
10
- 'claude': {
11
- name: 'Claude CLI',
12
- executable: 'claude',
13
- hooks: ['user_prompt_submit', 'tool_use_pre', 'tool_use_post', 'response_generated']
14
- },
15
- 'gemini': {
16
- name: 'Gemini CLI',
17
- executable: 'gemini',
18
- extensions: ['on_user_input', 'on_response_generated', 'on_tool_execution']
19
- },
20
- 'qwencode': {
21
- name: 'QwenCode CLI',
22
- executable: 'qwencode',
23
- inheritance: ['on_code_generation', 'on_analysis_request', 'on_refactor_request']
24
- },
25
- 'iflow': {
26
- name: 'iFlow CLI',
27
- executable: 'iflow',
28
- workflows: ['on_workflow_start', 'on_stage_complete', 'on_workflow_success']
29
- },
30
- 'qoder': {
31
- name: 'Qoder CLI',
32
- executable: 'qoder',
33
- notifications: ['on_user_notification', 'on_system_alert', 'on_task_completion']
34
- },
35
- 'codebuddy': {
36
- name: 'CodeBuddy CLI',
37
- executable: 'codebuddy',
38
- skills: ['on_skill_invocation', 'on_buddy_request', 'on_cross_cli_task']
39
- },
40
- 'codex': {
41
- name: 'Codex CLI',
42
- executable: 'codex',
43
- slashCommands: ['/x', '/cross-cli', '/delegate']
44
- },
45
- 'copilot': {
46
- name: 'Copilot CLI',
47
- executable: 'copilot',
48
- mcp: ['cross_cli_execute']
49
- }
50
- };
51
- }
52
-
53
- async checkCLIAvailability(cliName) {
54
- console.log(`[CLI_INTEGRATION] Checking availability of ${cliName}...`);
55
-
56
- const cliInfo = this.supportedCLIs[cliName.toLowerCase()];
57
- if (!cliInfo) {
58
- return { available: false, error: `Unsupported CLI: ${cliName}` };
59
- }
60
-
61
- try {
62
- // Check if CLI executable is available
63
- const result = spawnSync(cliInfo.executable, ['--version'], {
64
- timeout: 5000,
65
- stdio: ['pipe', 'pipe', 'pipe']
66
- });
67
-
68
- if (result.status === 0) {
69
- const version = result.stdout ? result.stdout.toString().trim() : 'Unknown';
70
- return {
71
- available: true,
72
- version: version,
73
- name: cliInfo.name
74
- };
75
- } else {
76
- return {
77
- available: false,
78
- error: `CLI returned non-zero exit code: ${result.status}`,
79
- stderr: result.stderr ? result.stderr.toString() : ''
80
- };
81
- }
82
- } catch (error) {
83
- return {
84
- available: false,
85
- error: `Failed to execute CLI: ${error.message}`
86
- };
87
- }
88
- }
89
-
90
- async listAvailableCLIs() {
91
- console.log('[CLI_INTEGRATION] Listing available CLIs...');
92
-
93
- const results = {};
94
- for (const [cliName, cliInfo] of Object.entries(this.supportedCLIs)) {
95
- results[cliName] = await this.checkCLIAvailability(cliName);
96
- }
97
-
98
- return results;
99
- }
100
-
101
- async getNodeJsIntegrationScript(cliName) {
102
- console.log(`[CLI_INTEGRATION] Generating Node.js integration script for ${cliName}...`);
103
-
104
- const cliInfo = this.supportedCLIs[cliName.toLowerCase()];
105
- if (!cliInfo) {
106
- throw new Error(`Unsupported CLI: ${cliName}`);
107
- }
108
-
109
- // Generate a Node.js integration script
110
- const script = `#!/usr/bin/env node
111
-
112
- /**
113
- * Node.js Integration Script for ${cliInfo.name}
114
- * Auto-generated by Stigmergy CLI Integration Manager
115
- */
116
-
117
- const { spawn } = require('child_process');
118
-
119
- class ${this.capitalize(cliName)}NodeJsIntegration {
120
- constructor() {
121
- this.cliName = '${cliName}';
122
- this.executable = '${cliInfo.executable}';
123
- }
124
-
125
- async executeCommand(command, args = [], options = {}) {
126
- return new Promise((resolve, reject) => {
127
- const cliProcess = spawn(this.executable, [command, ...args], {
128
- timeout: options.timeout || 30000,
129
- ...options
130
- });
131
-
132
- let stdout = '';
133
- let stderr = '';
134
-
135
- cliProcess.stdout.on('data', (data) => {
136
- stdout += data.toString();
137
- });
138
-
139
- cliProcess.stderr.on('data', (data) => {
140
- stderr += data.toString();
141
- });
142
-
143
- cliProcess.on('close', (code) => {
144
- if (code === 0) {
145
- resolve(stdout.trim());
146
- } else {
147
- reject(new Error(\`CLI process exited with code \${code}: \${stderr}\`));
148
- }
149
- });
150
-
151
- cliProcess.on('error', (error) => {
152
- reject(new Error(\`Failed to start CLI process: \${error.message}\`));
153
- });
154
- });
155
- }
156
-
157
- async getVersion() {
158
- try {
159
- const version = await this.executeCommand('--version');
160
- return version;
161
- } catch (error) {
162
- throw new Error(\`Failed to get ${cliName} version: \${error.message}\`);
163
- }
164
- }
165
-
166
- async executeTask(task, context = {}) {
167
- // This would depend on the specific CLI's interface
168
- // For demonstration, we'll simulate execution
169
- return \`[NODE.JS INTEGRATION] Simulated execution of task: \${task}\`;
170
- }
171
-
172
- capitalize(str) {
173
- return str.charAt(0).toUpperCase() + str.slice(1);
174
- }
175
- }
176
-
177
- module.exports = ${this.capitalize(cliName)}NodeJsIntegration;
178
-
179
- // If run directly, test the integration
180
- if (require.main === module) {
181
- const integration = new ${this.capitalize(cliName)}NodeJsIntegration();
182
-
183
- integration.getVersion()
184
- .then(version => {
185
- console.log('${cliInfo.name} version:', version);
186
- })
187
- .catch(error => {
188
- console.error('Failed to get version:', error.message);
189
- });
190
- }
191
- `;
192
-
193
- return script;
194
- }
195
-
196
- capitalize(str) {
197
- return str.charAt(0).toUpperCase() + str.slice(1);
198
- }
199
-
200
- async deployNodeJsIntegration(cliName, targetDir) {
201
- console.log(`[CLI_INTEGRATION] Deploying Node.js integration for ${cliName}...`);
202
-
203
- if (!fs.existsSync(targetDir)) {
204
- fs.mkdirSync(targetDir, { recursive: true });
205
- }
206
-
207
- const script = await this.getNodeJsIntegrationScript(cliName);
208
- const scriptPath = path.join(targetDir, `${cliName}_nodejs_integration.js`);
209
-
210
- fs.writeFileSync(scriptPath, script);
211
-
212
- // Make executable
213
- try {
214
- fs.chmodSync(scriptPath, 0o755);
215
- } catch (error) {
216
- console.warn(`[CLI_INTEGRATION] Failed to make script executable:`, error.message);
217
- }
218
-
219
- return scriptPath;
220
- }
221
-
222
- async getSupportedFeatures(cliName) {
223
- const cliInfo = this.supportedCLIs[cliName.toLowerCase()];
224
- if (!cliInfo) {
225
- return null;
226
- }
227
-
228
- return {
229
- name: cliInfo.name,
230
- executable: cliInfo.executable,
231
- features: Object.keys(cliInfo).filter(key => key !== 'name' && key !== 'executable')
232
- };
233
- }
234
- }
235
-
236
- module.exports = CLIIntegrationManager;
1
+ // src/core/coordination/nodejs/CLIIntegrationManager.js
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const os = require('os');
5
+ const { spawn, spawnSync } = require('child_process');
6
+
7
+ class CLIIntegrationManager {
8
+ constructor() {
9
+ this.supportedCLIs = {
10
+ claude: {
11
+ name: 'Claude CLI',
12
+ executable: 'claude',
13
+ hooks: [
14
+ 'user_prompt_submit',
15
+ 'tool_use_pre',
16
+ 'tool_use_post',
17
+ 'response_generated',
18
+ ],
19
+ },
20
+ gemini: {
21
+ name: 'Gemini CLI',
22
+ executable: 'gemini',
23
+ extensions: [
24
+ 'on_user_input',
25
+ 'on_response_generated',
26
+ 'on_tool_execution',
27
+ ],
28
+ },
29
+ qwencode: {
30
+ name: 'QwenCode CLI',
31
+ executable: 'qwencode',
32
+ inheritance: [
33
+ 'on_code_generation',
34
+ 'on_analysis_request',
35
+ 'on_refactor_request',
36
+ ],
37
+ },
38
+ iflow: {
39
+ name: 'iFlow CLI',
40
+ executable: 'iflow',
41
+ workflows: [
42
+ 'on_workflow_start',
43
+ 'on_stage_complete',
44
+ 'on_workflow_success',
45
+ ],
46
+ },
47
+ qoder: {
48
+ name: 'Qoder CLI',
49
+ executable: 'qoder',
50
+ notifications: [
51
+ 'on_user_notification',
52
+ 'on_system_alert',
53
+ 'on_task_completion',
54
+ ],
55
+ },
56
+ codebuddy: {
57
+ name: 'CodeBuddy CLI',
58
+ executable: 'codebuddy',
59
+ skills: [
60
+ 'on_skill_invocation',
61
+ 'on_buddy_request',
62
+ 'on_cross_cli_task',
63
+ ],
64
+ },
65
+ codex: {
66
+ name: 'Codex CLI',
67
+ executable: 'codex',
68
+ slashCommands: ['/x', '/cross-cli', '/delegate'],
69
+ },
70
+ copilot: {
71
+ name: 'Copilot CLI',
72
+ executable: 'copilot',
73
+ mcp: ['cross_cli_execute'],
74
+ },
75
+ };
76
+ }
77
+
78
+ async checkCLIAvailability(cliName) {
79
+ console.log(`[CLI_INTEGRATION] Checking availability of ${cliName}...`);
80
+
81
+ const cliInfo = this.supportedCLIs[cliName.toLowerCase()];
82
+ if (!cliInfo) {
83
+ return { available: false, error: `Unsupported CLI: ${cliName}` };
84
+ }
85
+
86
+ try {
87
+ // Check if CLI executable is available
88
+ const result = spawnSync(cliInfo.executable, ['--version'], {
89
+ timeout: 5000,
90
+ stdio: ['pipe', 'pipe', 'pipe'],
91
+ });
92
+
93
+ if (result.status === 0) {
94
+ const version = result.stdout
95
+ ? result.stdout.toString().trim()
96
+ : 'Unknown';
97
+ return {
98
+ available: true,
99
+ version: version,
100
+ name: cliInfo.name,
101
+ };
102
+ } else {
103
+ return {
104
+ available: false,
105
+ error: `CLI returned non-zero exit code: ${result.status}`,
106
+ stderr: result.stderr ? result.stderr.toString() : '',
107
+ };
108
+ }
109
+ } catch (error) {
110
+ return {
111
+ available: false,
112
+ error: `Failed to execute CLI: ${error.message}`,
113
+ };
114
+ }
115
+ }
116
+
117
+ async listAvailableCLIs() {
118
+ console.log('[CLI_INTEGRATION] Listing available CLIs...');
119
+
120
+ const results = {};
121
+ for (const [cliName, cliInfo] of Object.entries(this.supportedCLIs)) {
122
+ results[cliName] = await this.checkCLIAvailability(cliName);
123
+ }
124
+
125
+ return results;
126
+ }
127
+
128
+ async getNodeJsIntegrationScript(cliName) {
129
+ console.log(
130
+ `[CLI_INTEGRATION] Generating Node.js integration script for ${cliName}...`,
131
+ );
132
+
133
+ const cliInfo = this.supportedCLIs[cliName.toLowerCase()];
134
+ if (!cliInfo) {
135
+ throw new Error(`Unsupported CLI: ${cliName}`);
136
+ }
137
+
138
+ // Generate a Node.js integration script
139
+ const script = `#!/usr/bin/env node
140
+
141
+ /**
142
+ * Node.js Integration Script for ${cliInfo.name}
143
+ * Auto-generated by Stigmergy CLI Integration Manager
144
+ */
145
+
146
+ const { spawn } = require('child_process');
147
+
148
+ class ${this.capitalize(cliName)}NodeJsIntegration {
149
+ constructor() {
150
+ this.cliName = '${cliName}';
151
+ this.executable = '${cliInfo.executable}';
152
+ }
153
+
154
+ async executeCommand(command, args = [], options = {}) {
155
+ return new Promise((resolve, reject) => {
156
+ const cliProcess = spawn(this.executable, [command, ...args], {
157
+ timeout: options.timeout || 30000,
158
+ ...options
159
+ });
160
+
161
+ let stdout = '';
162
+ let stderr = '';
163
+
164
+ cliProcess.stdout.on('data', (data) => {
165
+ stdout += data.toString();
166
+ });
167
+
168
+ cliProcess.stderr.on('data', (data) => {
169
+ stderr += data.toString();
170
+ });
171
+
172
+ cliProcess.on('close', (code) => {
173
+ if (code === 0) {
174
+ resolve(stdout.trim());
175
+ } else {
176
+ reject(new Error(\`CLI process exited with code \${code}: \${stderr}\`));
177
+ }
178
+ });
179
+
180
+ cliProcess.on('error', (error) => {
181
+ reject(new Error(\`Failed to start CLI process: \${error.message}\`));
182
+ });
183
+ });
184
+ }
185
+
186
+ async getVersion() {
187
+ try {
188
+ const version = await this.executeCommand('--version');
189
+ return version;
190
+ } catch (error) {
191
+ throw new Error(\`Failed to get ${cliName} version: \${error.message}\`);
192
+ }
193
+ }
194
+
195
+ async executeTask(task, context = {}) {
196
+ // This would depend on the specific CLI's interface
197
+ // For demonstration, we'll simulate execution
198
+ return \`[NODE.JS INTEGRATION] Simulated execution of task: \${task}\`;
199
+ }
200
+
201
+ capitalize(str) {
202
+ return str.charAt(0).toUpperCase() + str.slice(1);
203
+ }
204
+ }
205
+
206
+ module.exports = ${this.capitalize(cliName)}NodeJsIntegration;
207
+
208
+ // If run directly, test the integration
209
+ if (require.main === module) {
210
+ const integration = new ${this.capitalize(cliName)}NodeJsIntegration();
211
+
212
+ integration.getVersion()
213
+ .then(version => {
214
+ console.log('${cliInfo.name} version:', version);
215
+ })
216
+ .catch(error => {
217
+ console.error('Failed to get version:', error.message);
218
+ });
219
+ }
220
+ `;
221
+
222
+ return script;
223
+ }
224
+
225
+ capitalize(str) {
226
+ return str.charAt(0).toUpperCase() + str.slice(1);
227
+ }
228
+
229
+ async deployNodeJsIntegration(cliName, targetDir) {
230
+ console.log(
231
+ `[CLI_INTEGRATION] Deploying Node.js integration for ${cliName}...`,
232
+ );
233
+
234
+ if (!fs.existsSync(targetDir)) {
235
+ fs.mkdirSync(targetDir, { recursive: true });
236
+ }
237
+
238
+ const script = await this.getNodeJsIntegrationScript(cliName);
239
+ const scriptPath = path.join(targetDir, `${cliName}_nodejs_integration.js`);
240
+
241
+ fs.writeFileSync(scriptPath, script);
242
+
243
+ // Make executable
244
+ try {
245
+ fs.chmodSync(scriptPath, 0o755);
246
+ } catch (error) {
247
+ console.warn(
248
+ '[CLI_INTEGRATION] Failed to make script executable:',
249
+ error.message,
250
+ );
251
+ }
252
+
253
+ return scriptPath;
254
+ }
255
+
256
+ async getSupportedFeatures(cliName) {
257
+ const cliInfo = this.supportedCLIs[cliName.toLowerCase()];
258
+ if (!cliInfo) {
259
+ return null;
260
+ }
261
+
262
+ return {
263
+ name: cliInfo.name,
264
+ executable: cliInfo.executable,
265
+ features: Object.keys(cliInfo).filter(
266
+ (key) => key !== 'name' && key !== 'executable',
267
+ ),
268
+ };
269
+ }
270
+ }
271
+
272
+ module.exports = CLIIntegrationManager;