stigmergy 1.0.68 → 1.0.70

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 (102) hide show
  1. package/README.en.md +306 -300
  2. package/README.md +469 -301
  3. package/package.json +97 -81
  4. package/scripts/publish.js +268 -0
  5. package/scripts/simple-publish.js +59 -0
  6. package/src/index.js +12 -0
  7. package/test/enhanced-main-alignment.test.js +298 -0
  8. package/test/hook-system-integration-test.js +307 -0
  9. package/test/natural-language-skills-test.js +320 -0
  10. package/test/nl-integration-test.js +179 -0
  11. package/test/parameter-parsing-test.js +143 -0
  12. package/test/real-test.js +435 -0
  13. package/test/system-compatibility-test.js +447 -0
  14. package/test/tdd-fixes-test.js +211 -0
  15. package/test/third-party-skills-test.js +321 -0
  16. package/test/tool-selection-integration-test.js +157 -0
  17. package/test/unit/cli-scanner.test.js +291 -0
  18. package/test/unit/cross-cli-executor.test.js +399 -0
  19. package/src/adapters/claude/__init__.py +0 -13
  20. package/src/adapters/claude/claude_skills_integration.py +0 -609
  21. package/src/adapters/claude/hook_adapter.py +0 -663
  22. package/src/adapters/claude/install_claude_integration.py +0 -265
  23. package/src/adapters/claude/skills_hook_adapter.py +0 -841
  24. package/src/adapters/claude/standalone_claude_adapter.py +0 -384
  25. package/src/adapters/cline/__init__.py +0 -20
  26. package/src/adapters/cline/config.py +0 -108
  27. package/src/adapters/cline/install_cline_integration.py +0 -617
  28. package/src/adapters/cline/mcp_server.py +0 -713
  29. package/src/adapters/cline/standalone_cline_adapter.py +0 -459
  30. package/src/adapters/codebuddy/__init__.py +0 -13
  31. package/src/adapters/codebuddy/buddy_adapter.py +0 -1125
  32. package/src/adapters/codebuddy/install_codebuddy_integration.py +0 -279
  33. package/src/adapters/codebuddy/skills_hook_adapter.py +0 -672
  34. package/src/adapters/codebuddy/skills_integration.py +0 -395
  35. package/src/adapters/codebuddy/standalone_codebuddy_adapter.py +0 -403
  36. package/src/adapters/codex/__init__.py +0 -11
  37. package/src/adapters/codex/base.py +0 -46
  38. package/src/adapters/codex/install_codex_integration.py +0 -311
  39. package/src/adapters/codex/mcp_server.py +0 -493
  40. package/src/adapters/codex/natural_language_parser.py +0 -82
  41. package/src/adapters/codex/slash_command_adapter.py +0 -326
  42. package/src/adapters/codex/standalone_codex_adapter.py +0 -362
  43. package/src/adapters/copilot/__init__.py +0 -13
  44. package/src/adapters/copilot/install_copilot_integration.py +0 -564
  45. package/src/adapters/copilot/mcp_adapter.py +0 -772
  46. package/src/adapters/copilot/mcp_server.py +0 -168
  47. package/src/adapters/copilot/standalone_copilot_adapter.py +0 -114
  48. package/src/adapters/gemini/__init__.py +0 -13
  49. package/src/adapters/gemini/extension_adapter.py +0 -690
  50. package/src/adapters/gemini/install_gemini_integration.py +0 -257
  51. package/src/adapters/gemini/standalone_gemini_adapter.py +0 -366
  52. package/src/adapters/iflow/__init__.py +0 -7
  53. package/src/adapters/iflow/hook_adapter.py +0 -1038
  54. package/src/adapters/iflow/hook_installer.py +0 -536
  55. package/src/adapters/iflow/install_iflow_integration.py +0 -271
  56. package/src/adapters/iflow/official_hook_adapter.py +0 -1272
  57. package/src/adapters/iflow/standalone_iflow_adapter.py +0 -48
  58. package/src/adapters/iflow/workflow_adapter.py +0 -793
  59. package/src/adapters/qoder/hook_installer.py +0 -732
  60. package/src/adapters/qoder/install_qoder_integration.py +0 -265
  61. package/src/adapters/qoder/notification_hook_adapter.py +0 -863
  62. package/src/adapters/qoder/standalone_qoder_adapter.py +0 -48
  63. package/src/adapters/qwen/__init__.py +0 -17
  64. package/src/adapters/qwencode/__init__.py +0 -13
  65. package/src/adapters/qwencode/inheritance_adapter.py +0 -818
  66. package/src/adapters/qwencode/install_qwencode_integration.py +0 -276
  67. package/src/adapters/qwencode/standalone_qwencode_adapter.py +0 -399
  68. package/src/atomic_collaboration_handler.py +0 -461
  69. package/src/cli_collaboration_agent.py +0 -697
  70. package/src/collaboration/hooks.py +0 -315
  71. package/src/core/__init__.py +0 -21
  72. package/src/core/ai_environment_scanner.py +0 -331
  73. package/src/core/base_adapter.py +0 -220
  74. package/src/core/cli_hook_integration.py +0 -406
  75. package/src/core/cross_cli_executor.py +0 -713
  76. package/src/core/cross_cli_mapping.py +0 -1165
  77. package/src/core/cross_platform_encoding.py +0 -365
  78. package/src/core/cross_platform_safe_cli.py +0 -894
  79. package/src/core/direct_cli_executor.py +0 -805
  80. package/src/core/direct_cli_hook_system.py +0 -958
  81. package/src/core/enhanced_init_processor.py +0 -467
  82. package/src/core/graceful_cli_executor.py +0 -912
  83. package/src/core/md_enhancer.py +0 -342
  84. package/src/core/md_generator.py +0 -619
  85. package/src/core/models.py +0 -218
  86. package/src/core/parser.py +0 -108
  87. package/src/core/real_cli_hook_system.py +0 -852
  88. package/src/core/real_cross_cli_system.py +0 -925
  89. package/src/core/verified_cross_cli_system.py +0 -961
  90. package/src/deploy.js +0 -737
  91. package/src/enhanced-main.js +0 -626
  92. package/src/enhanced_deploy.js +0 -303
  93. package/src/enhanced_universal_cli_setup.py +0 -930
  94. package/src/kimi_wrapper.py +0 -104
  95. package/src/main.js +0 -1309
  96. package/src/shell_integration.py +0 -398
  97. package/src/simple-main.js +0 -315
  98. package/src/smart_router_creator.py +0 -323
  99. package/src/universal_cli_setup.py +0 -1289
  100. package/src/utils/__init__.py +0 -12
  101. package/src/utils/cli_detector.py +0 -445
  102. package/src/utils/file_utils.py +0 -246
package/package.json CHANGED
@@ -1,81 +1,97 @@
1
- {
2
- "name": "stigmergy",
3
- "version": "1.0.68",
4
- "type": "module",
5
- "description": "Stigmergy CLI - Multi-AgentsAI CLI工具协作系统",
6
- "main": "src/main.js",
7
- "bin": {
8
- "stigmergy": "src/main.js"
9
- },
10
- "scripts": {
11
- "start": "node src/main.js",
12
- "deploy": "node src/deploy.js",
13
- "deploy-tools": "node deployment/deploy.js",
14
- "deploy-tools-all": "node deployment/deploy-with-install.js",
15
- "status": "node src/main.js status",
16
- "scan": "node src/main.js scan",
17
- "init": "node src/main.js init",
18
- "check-project": "node src/main.js check-project",
19
- "validate": "node src/main.js validate",
20
- "clean": "node src/main.js clean",
21
- "build": "node src/build.js",
22
- "build-only": "node src/deploy.js --build",
23
- "quick-install": "node src/quick_install.js",
24
- "quick-deploy": "node src/main.js quick-deploy",
25
- "publish-to-npm": "node publish.js",
26
- "unpublish": "npm unpublish",
27
- "version": "npm version patch",
28
- "test": "npm run validate"
29
- },
30
- "keywords": [
31
- "ai",
32
- "cli",
33
- "router",
34
- "collaboration",
35
- "smart-cli",
36
- "claude-cli",
37
- "gemini-cli",
38
- "qwen-cli",
39
- "iflow-cli",
40
- "qoder-cli",
41
- "codebuddy-cli",
42
- "copilot-cli",
43
- "cross-platform",
44
- "automation",
45
- "tools",
46
- "stigmergy",
47
- "multi-agents"
48
- ],
49
- "files": [
50
- "src/**/*.js",
51
- "src/**/*.py",
52
- "config/**/*.json",
53
- "templates/**/*.md",
54
- "bin/**/*.bat",
55
- "adapters/**/*"
56
- ],
57
- "repository": {
58
- "type": "git",
59
- "url": "git+https://github.com/ptreezh/stigmergy-CLI-Multi-Agents.git"
60
- },
61
- "author": "Stigmergy CLI Team",
62
- "license": "MIT",
63
- "engines": {
64
- "node": ">=16.0.0"
65
- },
66
- "dependencies": {
67
- "commander": "^12.0.0",
68
- "inquirer": "^9.0.0",
69
- "chalk": "^5.0.0",
70
- "js-yaml": "^4.1.0",
71
- "node-fetch": "^3.3.2"
72
- },
73
- "devDependencies": {},
74
- "npx": {
75
- "stigmergy": "src/main.js"
76
- },
77
- "homepage": "https://github.com/ptreezh/stigmergy-CLI-Multi-Agents#readme",
78
- "bugs": {
79
- "url": "https://github.com/ptreezh/stigmergy-CLI-Multi-Agents/issues"
80
- }
81
- }
1
+ {
2
+ "name": "stigmergy",
3
+ "version": "1.0.70",
4
+ "type": "commonjs",
5
+ "description": "Stigmergy CLI - Multi-Agents Cross-AI CLI Tools Collaboration System",
6
+ "main": "src/main.js",
7
+ "bin": {
8
+ "stigmergy": "src/main.js"
9
+ },
10
+ "scripts": {
11
+ "start": "node src/main.js",
12
+ "test": "node test/real-test.js",
13
+ "test:all": "node test/test-all-clis.js",
14
+ "test:cross-cli": "node test/cross-cli-real-test.js",
15
+ "build": "node scripts/build.js",
16
+ "deploy": "node src/deploy.js",
17
+ "status": "node src/index.js status",
18
+ "scan": "node src/index.js scan",
19
+ "init": "node src/index.js init",
20
+ "validate": "node src/index.js validate",
21
+ "clean": "node src/index.js clean",
22
+ "dev": "node --watch src/index.js",
23
+ "lint": "eslint src/",
24
+ "format": "prettier --write src/"
25
+ },
26
+ "keywords": [
27
+ "ai",
28
+ "cli",
29
+ "collaboration",
30
+ "multi-agents",
31
+ "nodejs-first",
32
+ "ansi-encoding",
33
+ "cross-cli",
34
+ "claude-cli",
35
+ "gemini-cli",
36
+ "qwen-cli",
37
+ "iflow-cli",
38
+ "real-testing",
39
+ "python-free"
40
+ ],
41
+ "files": [
42
+ "src/**/*.js",
43
+ "config/**/*.json",
44
+ "templates/**/*.md",
45
+ "bin/**/*.cmd",
46
+ "test/**/*.js",
47
+ "scripts/**/*.js"
48
+ ],
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/ptreezh/stigmergy-CLI-Multi-Agents.git"
52
+ },
53
+ "author": "Stigmergy CLI Team",
54
+ "license": "MIT",
55
+ "engines": {
56
+ "node": ">=16.0.0"
57
+ },
58
+ "dependencies": {
59
+ "commander": "^12.0.0",
60
+ "inquirer": "^8.2.6",
61
+ "chalk": "^4.1.2",
62
+ "js-yaml": "^4.1.0",
63
+ "node-fetch": "^2.6.7",
64
+ "child_process": "^1.0.2",
65
+ "fs-extra": "^11.1.1",
66
+ "path": "^0.12.7",
67
+ "os": "^0.1.2",
68
+ "crypto": "^1.0.1",
69
+ "events": "^3.3.0",
70
+ "util": "^0.12.5",
71
+ "semver": "^7.5.4",
72
+ "glob": "^10.3.10",
73
+ "chokidar": "^3.5.3",
74
+ "table": "^6.8.1",
75
+ "figures": "^3.2.0",
76
+ "ora": "^5.4.1"
77
+ },
78
+ "devDependencies": {
79
+ "eslint": "^8.50.0",
80
+ "prettier": "^3.0.3",
81
+ "nodemon": "^3.0.1"
82
+ },
83
+ "config": {
84
+ "encoding": "ansi",
85
+ "platform": "nodejs-first",
86
+ "python-free": true,
87
+ "real-testing": true,
88
+ "unicode-free": true
89
+ },
90
+ "npx": {
91
+ "stigmergy": "src/main.js"
92
+ },
93
+ "homepage": "https://github.com/ptreezh/stigmergy-CLI-Multi-Agents#readme",
94
+ "bugs": {
95
+ "url": "https://github.com/ptreezh/stigmergy-CLI-Multi-Agents/issues"
96
+ }
97
+ }
@@ -0,0 +1,268 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Stigmergy CLI 发布脚本
5
+ * 自动化发布流程到npm
6
+ */
7
+
8
+ import { execSync } from 'child_process';
9
+ import { readFile, writeFile } from 'fs/promises';
10
+ import { join } from 'path';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = join(__filename, '..');
15
+
16
+ class NPMPublisher {
17
+ constructor() {
18
+ this.rootDir = __dirname;
19
+ this.packagePath = join(this.rootDir, 'package.json');
20
+ }
21
+
22
+ log(message, type = 'info') {
23
+ const timestamp = new Date().toISOString();
24
+ const prefix = {
25
+ 'info': '📦 ',
26
+ 'success': '✅ ',
27
+ 'error': '❌ ',
28
+ 'warning': '⚠️ '
29
+ }[type] || '📦 ';
30
+
31
+ console.log(`${timestamp} ${prefix}${message}`);
32
+ }
33
+
34
+ async readPackage() {
35
+ try {
36
+ const content = await readFile(this.packagePath, 'utf8');
37
+ return JSON.parse(content);
38
+ } catch (error) {
39
+ this.log(`读取package.json失败: ${error.message}`, 'error');
40
+ throw error;
41
+ }
42
+ }
43
+
44
+ async checkRequirements() {
45
+ this.log('检查发布要求...', 'info');
46
+
47
+ const pkg = await this.readPackage();
48
+
49
+ // 检查必要字段
50
+ const required = ['name', 'version', 'description', 'main', 'bin', 'repository'];
51
+ for (const field of required) {
52
+ if (!pkg[field]) {
53
+ throw new Error(`缺少必要字段: ${field}`);
54
+ }
55
+ }
56
+
57
+ // 检查版本格式
58
+ if (!/^\d+\.\d+\.\d+$/.test(pkg.version)) {
59
+ throw new Error(`版本格式不正确: ${pkg.version}`);
60
+ }
61
+
62
+ // 检查仓库URL
63
+ if (!pkg.repository?.url) {
64
+ throw new Error('缺少repository.url');
65
+ }
66
+
67
+ this.log('所有检查通过', 'success');
68
+ }
69
+
70
+ async buildProject() {
71
+ this.log('构建项目...', 'info');
72
+
73
+ try {
74
+ // 清理之前的构建
75
+ execSync('rm -rf dist', { cwd: this.rootDir });
76
+
77
+ // 创建dist目录
78
+ execSync('mkdir -p dist', { cwd: this.rootDir });
79
+
80
+ // 复制必要文件
81
+ const filesToCopy = [
82
+ 'src/main.js',
83
+ 'src/adapters/',
84
+ 'src/templates/',
85
+ 'package.json',
86
+ 'README.md',
87
+ 'LICENSE'
88
+ ];
89
+
90
+ for (const file of filesToCopy) {
91
+ if (file.endsWith('/')) {
92
+ execSync(`cp -r ${file} dist/`, { cwd: this.rootDir });
93
+ } else {
94
+ execSync(`cp ${file} dist/`, { cwd: this.rootDir });
95
+ }
96
+ }
97
+
98
+ // 复制bin文件
99
+ execSync('mkdir -p dist/bin', { cwd: this.rootDir });
100
+ execSync('cp bin/* dist/bin/', { cwd: this.rootDir });
101
+
102
+ // 生成package.json用于发布
103
+ const publishPackage = await this.readPackage();
104
+ const publishConfig = {
105
+ ...publishPackage,
106
+ files: [
107
+ 'src/main.js',
108
+ 'src/adapters/**',
109
+ 'src/templates/**',
110
+ 'bin/**',
111
+ 'README.md',
112
+ 'LICENSE'
113
+ ],
114
+ main: 'src/main.js',
115
+ bin: {
116
+ 'stigmergy-cli': 'src/main.js'
117
+ }
118
+ };
119
+
120
+ await writeFile(
121
+ join(this.rootDir, 'dist/package.json'),
122
+ JSON.stringify(publishConfig, null, 2),
123
+ 'utf8'
124
+ );
125
+
126
+ this.log('构建完成', 'success');
127
+ } catch (error) {
128
+ this.log(`构建失败: ${error.message}`, 'error');
129
+ throw error;
130
+ }
131
+ }
132
+
133
+ async runTests() {
134
+ this.log('运行测试...', 'info');
135
+
136
+ try {
137
+ execSync('npm test', { cwd: this.rootDir, stdio: 'inherit' });
138
+ this.log('测试通过', 'success');
139
+ } catch (error) {
140
+ this.log(`测试失败: ${error.message}`, 'error');
141
+ throw error;
142
+ }
143
+ }
144
+
145
+ async publishToNPM(dryRun = false) {
146
+ this.log('准备发布到npm...', 'info');
147
+
148
+ try {
149
+ // 检查是否已登录npm
150
+ try {
151
+ execSync('npm whoami', { stdio: 'pipe' });
152
+ this.log('npm登录状态: 已登录', 'success');
153
+ } catch {
154
+ this.log('请先登录npm: npm login', 'warning');
155
+ throw new Error('需要先登录npm');
156
+ }
157
+
158
+ // 检查包名是否可用
159
+ const pkg = await this.readPackage();
160
+ try {
161
+ execSync(`npm view ${pkg.name}`, { stdio: 'pipe' });
162
+ this.log(`包名 ${pkg.name} 已存在,将覆盖发布`, 'warning');
163
+ } catch {
164
+ this.log(`包名 ${pkg.name} 可用`, 'success');
165
+ }
166
+
167
+ // 发布命令
168
+ const publishCmd = dryRun ? 'npm publish --dry-run' : 'npm publish --access public';
169
+
170
+ if (dryRun) {
171
+ this.log('模拟发布中...', 'info');
172
+ execSync(publishCmd, { cwd: join(this.rootDir, 'dist'), stdio: 'inherit' });
173
+ this.log('模拟发布完成', 'success');
174
+ } else {
175
+ this.log('发布到npm...', 'info');
176
+ execSync(publishCmd, { cwd: join(this.rootDir, 'dist'), stdio: 'inherit' });
177
+ this.log('发布成功!', 'success');
178
+ }
179
+
180
+ } catch (error) {
181
+ this.log(`发布失败: ${error.message}`, 'error');
182
+ throw error;
183
+ }
184
+ }
185
+
186
+ async versionUpdate(type = 'patch') {
187
+ this.log(`更新版本 (${type})...`, 'info');
188
+
189
+ try {
190
+ execSync(`npm version ${type}`, { cwd: this.rootDir, stdio: 'inherit' });
191
+ this.log('版本更新完成', 'success');
192
+ } catch (error) {
193
+ this.log(`版本更新失败: ${error.message}`, 'error');
194
+ throw error;
195
+ }
196
+ }
197
+
198
+ async showHelp() {
199
+ console.log(`
200
+ 🚀 Stigmergy CLI 发布工具
201
+
202
+ 用法: node scripts/publish.js [选项]
203
+
204
+ 选项:
205
+ --dry-run 模拟发布,不实际上传到npm
206
+ --patch 更新补丁版本 (默认)
207
+ --minor 更新次版本
208
+ --major 更新主版本
209
+ --help, -h 显示帮助信息
210
+
211
+ 示例:
212
+ node scripts/publish.js # 发布到npm
213
+ node scripts/publish.js --dry-run # 模拟发布
214
+ node scripts/publish.js --minor # 更新次版本并发布
215
+ node scripts/publish.js --help # 显示帮助
216
+
217
+ 工作流程:
218
+ 1. 检查发布要求
219
+ 2. 运行测试
220
+ 3. 构建项目
221
+ 4. 更新版本 (可选)
222
+ 5. 发布到npm
223
+ `);
224
+ }
225
+ }
226
+
227
+ async function main() {
228
+ const publisher = new NPMPublisher();
229
+ const args = process.argv.slice(2);
230
+
231
+ // 显示帮助
232
+ if (args.includes('--help') || args.includes('-h')) {
233
+ publisher.showHelp();
234
+ return;
235
+ }
236
+
237
+ try {
238
+ // 检查发布要求
239
+ await publisher.checkRequirements();
240
+
241
+ // 运行测试
242
+ await publisher.runTests();
243
+
244
+ // 构建项目
245
+ await publisher.buildProject();
246
+
247
+ // 处理版本更新
248
+ let versionType = 'patch';
249
+ if (args.includes('--minor')) versionType = 'minor';
250
+ if (args.includes('--major')) versionType = 'major';
251
+
252
+ if (versionType !== 'patch') {
253
+ await publisher.versionUpdate(versionType);
254
+ }
255
+
256
+ // 发布到npm
257
+ const dryRun = args.includes('--dry-run');
258
+ await publisher.publishToNPM(dryRun);
259
+
260
+ } catch (error) {
261
+ console.error('发布失败:', error.message);
262
+ process.exit(1);
263
+ }
264
+ }
265
+
266
+ if (import.meta.url === `file://${process.argv[1]}`) {
267
+ main();
268
+ }
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Stigmergy CLI 简化发布脚本
5
+ */
6
+
7
+ const { execSync } = 'child_process';
8
+ const { readFile } from 'fs/promises';
9
+ const { join, dirname } from 'path';
10
+ const { fileURLToPath } from 'url';
11
+
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = dirname(__filename);
14
+
15
+ console.log('🚀 Stigmergy CLI 发布工具');
16
+
17
+ async function main() {
18
+ try {
19
+ // 读取package.json
20
+ const packagePath = join(__dirname, 'package.json');
21
+ const pkg = JSON.parse(await readFile(packagePath, 'utf8'));
22
+
23
+ console.log(`📦 包名: ${pkg.name}`);
24
+ console.log(`📦 版本: ${pkg.version}`);
25
+ console.log(`📦 描述: ${pkg.description}`);
26
+
27
+ // 检查必要文件
28
+ const requiredFiles = ['src/main.js', 'package.json', 'README.md', 'LICENSE'];
29
+ console.log('📍 检查必要文件...');
30
+
31
+ for (const file of requiredFiles) {
32
+ try {
33
+ execSync(`test -f ${file}`, { cwd: __dirname });
34
+ console.log(`✅ ${file} 存在`);
35
+ } catch {
36
+ console.log(`❌ ${file} 不存在`);
37
+ throw new Error(`缺少必要文件: ${file}`);
38
+ }
39
+ }
40
+
41
+ // 模拟npm发布
42
+ console.log('📤 模拟npm发布...');
43
+ console.log('⚠️ 注意: 这是模拟发布,实际发布需要:');
44
+ console.log(' 1. npm login');
45
+ console.log(' 2. node scripts/simple-publish.js');
46
+ console.log(' 3. npm publish');
47
+
48
+ console.log('✅ 模拟发布完成!');
49
+ console.log('📦 包准备就绪,可以实际发布');
50
+
51
+ } catch (error) {
52
+ console.error('❌ 发布过程失败:', error.message);
53
+ process.exit(1);
54
+ }
55
+ }
56
+
57
+ if (import.meta.url === `file://${process.argv[1]}`) {
58
+ main();
59
+ }
package/src/index.js ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Stigmergy CLI - Main Entry Point
5
+ * This file serves as the main entry point for the Stigmergy CLI system
6
+ */
7
+
8
+ // Import and export the main functionality from main.js
9
+ import('./main.js').catch(error => {
10
+ console.error('❌ Error loading main module:', error.message);
11
+ process.exit(1);
12
+ });