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.
- package/README.en.md +306 -300
- package/README.md +469 -301
- package/package.json +97 -81
- package/scripts/publish.js +268 -0
- package/scripts/simple-publish.js +59 -0
- package/src/index.js +12 -0
- package/test/enhanced-main-alignment.test.js +298 -0
- package/test/hook-system-integration-test.js +307 -0
- package/test/natural-language-skills-test.js +320 -0
- package/test/nl-integration-test.js +179 -0
- package/test/parameter-parsing-test.js +143 -0
- package/test/real-test.js +435 -0
- package/test/system-compatibility-test.js +447 -0
- package/test/tdd-fixes-test.js +211 -0
- package/test/third-party-skills-test.js +321 -0
- package/test/tool-selection-integration-test.js +157 -0
- package/test/unit/cli-scanner.test.js +291 -0
- package/test/unit/cross-cli-executor.test.js +399 -0
- package/src/adapters/claude/__init__.py +0 -13
- package/src/adapters/claude/claude_skills_integration.py +0 -609
- package/src/adapters/claude/hook_adapter.py +0 -663
- package/src/adapters/claude/install_claude_integration.py +0 -265
- package/src/adapters/claude/skills_hook_adapter.py +0 -841
- package/src/adapters/claude/standalone_claude_adapter.py +0 -384
- package/src/adapters/cline/__init__.py +0 -20
- package/src/adapters/cline/config.py +0 -108
- package/src/adapters/cline/install_cline_integration.py +0 -617
- package/src/adapters/cline/mcp_server.py +0 -713
- package/src/adapters/cline/standalone_cline_adapter.py +0 -459
- package/src/adapters/codebuddy/__init__.py +0 -13
- package/src/adapters/codebuddy/buddy_adapter.py +0 -1125
- package/src/adapters/codebuddy/install_codebuddy_integration.py +0 -279
- package/src/adapters/codebuddy/skills_hook_adapter.py +0 -672
- package/src/adapters/codebuddy/skills_integration.py +0 -395
- package/src/adapters/codebuddy/standalone_codebuddy_adapter.py +0 -403
- package/src/adapters/codex/__init__.py +0 -11
- package/src/adapters/codex/base.py +0 -46
- package/src/adapters/codex/install_codex_integration.py +0 -311
- package/src/adapters/codex/mcp_server.py +0 -493
- package/src/adapters/codex/natural_language_parser.py +0 -82
- package/src/adapters/codex/slash_command_adapter.py +0 -326
- package/src/adapters/codex/standalone_codex_adapter.py +0 -362
- package/src/adapters/copilot/__init__.py +0 -13
- package/src/adapters/copilot/install_copilot_integration.py +0 -564
- package/src/adapters/copilot/mcp_adapter.py +0 -772
- package/src/adapters/copilot/mcp_server.py +0 -168
- package/src/adapters/copilot/standalone_copilot_adapter.py +0 -114
- package/src/adapters/gemini/__init__.py +0 -13
- package/src/adapters/gemini/extension_adapter.py +0 -690
- package/src/adapters/gemini/install_gemini_integration.py +0 -257
- package/src/adapters/gemini/standalone_gemini_adapter.py +0 -366
- package/src/adapters/iflow/__init__.py +0 -7
- package/src/adapters/iflow/hook_adapter.py +0 -1038
- package/src/adapters/iflow/hook_installer.py +0 -536
- package/src/adapters/iflow/install_iflow_integration.py +0 -271
- package/src/adapters/iflow/official_hook_adapter.py +0 -1272
- package/src/adapters/iflow/standalone_iflow_adapter.py +0 -48
- package/src/adapters/iflow/workflow_adapter.py +0 -793
- package/src/adapters/qoder/hook_installer.py +0 -732
- package/src/adapters/qoder/install_qoder_integration.py +0 -265
- package/src/adapters/qoder/notification_hook_adapter.py +0 -863
- package/src/adapters/qoder/standalone_qoder_adapter.py +0 -48
- package/src/adapters/qwen/__init__.py +0 -17
- package/src/adapters/qwencode/__init__.py +0 -13
- package/src/adapters/qwencode/inheritance_adapter.py +0 -818
- package/src/adapters/qwencode/install_qwencode_integration.py +0 -276
- package/src/adapters/qwencode/standalone_qwencode_adapter.py +0 -399
- package/src/atomic_collaboration_handler.py +0 -461
- package/src/cli_collaboration_agent.py +0 -697
- package/src/collaboration/hooks.py +0 -315
- package/src/core/__init__.py +0 -21
- package/src/core/ai_environment_scanner.py +0 -331
- package/src/core/base_adapter.py +0 -220
- package/src/core/cli_hook_integration.py +0 -406
- package/src/core/cross_cli_executor.py +0 -713
- package/src/core/cross_cli_mapping.py +0 -1165
- package/src/core/cross_platform_encoding.py +0 -365
- package/src/core/cross_platform_safe_cli.py +0 -894
- package/src/core/direct_cli_executor.py +0 -805
- package/src/core/direct_cli_hook_system.py +0 -958
- package/src/core/enhanced_init_processor.py +0 -467
- package/src/core/graceful_cli_executor.py +0 -912
- package/src/core/md_enhancer.py +0 -342
- package/src/core/md_generator.py +0 -619
- package/src/core/models.py +0 -218
- package/src/core/parser.py +0 -108
- package/src/core/real_cli_hook_system.py +0 -852
- package/src/core/real_cross_cli_system.py +0 -925
- package/src/core/verified_cross_cli_system.py +0 -961
- package/src/deploy.js +0 -737
- package/src/enhanced-main.js +0 -626
- package/src/enhanced_deploy.js +0 -303
- package/src/enhanced_universal_cli_setup.py +0 -930
- package/src/kimi_wrapper.py +0 -104
- package/src/main.js +0 -1309
- package/src/shell_integration.py +0 -398
- package/src/simple-main.js +0 -315
- package/src/smart_router_creator.py +0 -323
- package/src/universal_cli_setup.py +0 -1289
- package/src/utils/__init__.py +0 -12
- package/src/utils/cli_detector.py +0 -445
- package/src/utils/file_utils.py +0 -246
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* System Compatibility Test
|
|
5
|
+
* Identifies actual issues and limitations of the current system
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { spawnSync } = require('child_process');
|
|
11
|
+
|
|
12
|
+
class SystemCompatibilityTest {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.issues = [];
|
|
15
|
+
this.capabilities = [];
|
|
16
|
+
this.testResults = [];
|
|
17
|
+
this.projectRoot = process.cwd();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async runTests() {
|
|
21
|
+
console.log('==============================================');
|
|
22
|
+
console.log('SYSTEM COMPATIBILITY TEST REPORT');
|
|
23
|
+
console.log('==============================================');
|
|
24
|
+
console.log('');
|
|
25
|
+
|
|
26
|
+
// Test 1: Tool Selection Issues
|
|
27
|
+
await this.testToolSelection();
|
|
28
|
+
|
|
29
|
+
// Test 2: AI Tool Availability
|
|
30
|
+
await this.testAIToolAvailability();
|
|
31
|
+
|
|
32
|
+
// Test 3: Hook Integration
|
|
33
|
+
await this.testHookIntegration();
|
|
34
|
+
|
|
35
|
+
// Test 4: Skills System Functionality
|
|
36
|
+
await this.testSkillsSystem();
|
|
37
|
+
|
|
38
|
+
// Test 5: Cross-Platform Compatibility
|
|
39
|
+
await this.testCrossPlatformCompatibility();
|
|
40
|
+
|
|
41
|
+
// Test 6: Real-world Scenarios
|
|
42
|
+
await this.testRealWorldScenarios();
|
|
43
|
+
|
|
44
|
+
this.generateReport();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async testToolSelection() {
|
|
48
|
+
console.log('TEST 1: Tool Selection Issues');
|
|
49
|
+
console.log('-----------------------------');
|
|
50
|
+
|
|
51
|
+
// Issue: Tool selection not working properly
|
|
52
|
+
console.log('🔍 Identified Issue: Tool selection logic problems');
|
|
53
|
+
console.log(' - Specified --tool=claude but system uses default tool');
|
|
54
|
+
console.log(' - Need to fix handleSkillsCommand parameter parsing');
|
|
55
|
+
console.log('');
|
|
56
|
+
|
|
57
|
+
this.issues.push({
|
|
58
|
+
severity: 'HIGH',
|
|
59
|
+
category: 'BUG',
|
|
60
|
+
description: 'Tool selection not working - uses default instead of specified tool',
|
|
61
|
+
component: 'handleSkillsCommand in main.js'
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async testAIToolAvailability() {
|
|
66
|
+
console.log('TEST 2: AI Tool Availability');
|
|
67
|
+
console.log('-----------------------------');
|
|
68
|
+
|
|
69
|
+
const tools = [
|
|
70
|
+
{ name: 'claude', command: 'claude' },
|
|
71
|
+
{ name: 'gemini', command: 'gemini' },
|
|
72
|
+
{ name: 'qwen', command: 'qwen' },
|
|
73
|
+
{ name: 'iflow', command: 'iflow' },
|
|
74
|
+
{ name: 'codebuddy', command: 'codebuddy' },
|
|
75
|
+
{ name: 'copilot', command: 'gh copilot' }
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
console.log('Checking AI tool availability:');
|
|
79
|
+
let availableTools = 0;
|
|
80
|
+
let totalTools = tools.length;
|
|
81
|
+
|
|
82
|
+
for (const tool of tools) {
|
|
83
|
+
try {
|
|
84
|
+
let result;
|
|
85
|
+
if (process.platform === 'win32') {
|
|
86
|
+
result = spawnSync('where', [tool.command], { stdio: 'pipe' });
|
|
87
|
+
} else {
|
|
88
|
+
result = spawnSync('which', [tool.command], { stdio: 'pipe' });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (result.status === 0) {
|
|
92
|
+
console.log(` ✅ ${tool.name}: Available`);
|
|
93
|
+
availableTools++;
|
|
94
|
+
} else {
|
|
95
|
+
console.log(` ❌ ${tool.name}: Not found`);
|
|
96
|
+
}
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.log(` ❓ ${tool.name}: Check failed - ${error.message}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(`Available AI Tools: ${availableTools}/${totalTools}`);
|
|
104
|
+
|
|
105
|
+
if (availableTools < totalTools) {
|
|
106
|
+
this.issues.push({
|
|
107
|
+
severity: 'MEDIUM',
|
|
108
|
+
category: 'LIMITATION',
|
|
109
|
+
description: `Only ${availableTools}/${totalTools} AI tools are available`,
|
|
110
|
+
impact: 'Reduced functionality for missing tools'
|
|
111
|
+
});
|
|
112
|
+
} else {
|
|
113
|
+
this.capabilities.push({
|
|
114
|
+
category: 'AI_TOOLS',
|
|
115
|
+
description: `All ${totalTools} AI tools are available`
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async testHookIntegration() {
|
|
121
|
+
console.log('TEST 3: Hook Integration');
|
|
122
|
+
console.log('---------------------');
|
|
123
|
+
|
|
124
|
+
// Check if hooks are properly installed
|
|
125
|
+
const hookDirectories = ['.claude/hooks', '.gemini/hooks', '.qwen/hooks', '.iflow/hooks', '.codebuddy/hooks'];
|
|
126
|
+
|
|
127
|
+
let installedHooks = 0;
|
|
128
|
+
for (const hookDir of hookDirectories) {
|
|
129
|
+
if (fs.existsSync(hookDir)) {
|
|
130
|
+
const files = fs.readdirSync(hookDir);
|
|
131
|
+
const hookFiles = files.filter(file =>
|
|
132
|
+
file.includes('skill-forced-eval') || file.includes('hook')
|
|
133
|
+
);
|
|
134
|
+
if (hookFiles.length > 0) {
|
|
135
|
+
console.log(` ✅ ${hookDir}: ${hookFiles.length} hook files found`);
|
|
136
|
+
installedHooks++;
|
|
137
|
+
} else {
|
|
138
|
+
console.log(` ⚠️ ${hookDir}: No hook files found`);
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
console.log(` ❌ ${hookDir}: Directory does not exist`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
console.log(`Installed hooks: ${installedHooks}/${hookDirectories.length}`);
|
|
146
|
+
|
|
147
|
+
// Check hook execution simulation
|
|
148
|
+
try {
|
|
149
|
+
const testHook = path.join('.claude/hooks', 'skill-forced-eval-hook.sh');
|
|
150
|
+
if (fs.existsSync(testHook)) {
|
|
151
|
+
console.log(' ✅ Hook files are executable');
|
|
152
|
+
console.log(' ⚠️ Note: Hooks are in simulation mode, not real AI tool integration');
|
|
153
|
+
this.issues.push({
|
|
154
|
+
severity: 'LOW',
|
|
155
|
+
category: 'LIMITATION',
|
|
156
|
+
description: 'Hooks are in simulation mode, not real AI tool integration',
|
|
157
|
+
component: 'Hook execution'
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.log(` ❌ Hook execution test failed: ${error.message}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (installedHooks > 0) {
|
|
165
|
+
this.capabilities.push({
|
|
166
|
+
category: 'HOOK_SYSTEM',
|
|
167
|
+
description: `Hook system installed for ${installedHooks} AI tools`
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async testSkillsSystem() {
|
|
173
|
+
console.log('TEST 4: Skills System Functionality');
|
|
174
|
+
console.log('------------------------------');
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
// Test skills list
|
|
178
|
+
console.log('Testing skills list functionality...');
|
|
179
|
+
const skillsResult = spawnSync('node', ['package/src/main.js', 'skills', 'list'], {
|
|
180
|
+
cwd: this.projectRoot,
|
|
181
|
+
stdio: 'pipe',
|
|
182
|
+
encoding: 'utf8'
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
if (skillsResult.status === 0) {
|
|
186
|
+
console.log(' ✅ Skills list command works');
|
|
187
|
+
const output = skillsResult.stdout;
|
|
188
|
+
const skillCount = (output.match(/📝.*?\(/g) || []).length;
|
|
189
|
+
console.log(` ✅ Skills listed: ${skillCount} skills found`);
|
|
190
|
+
} else {
|
|
191
|
+
console.log(' ❌ Skills list command failed');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Test skills execution
|
|
195
|
+
console.log('Testing skills execution...');
|
|
196
|
+
const execResult = spawnSync('node', ['package/src/main.js', 'skills', 'execute', 'translation', '--text=hello', '--to=zh'], {
|
|
197
|
+
cwd: this.projectRoot,
|
|
198
|
+
stdio: 'pipe',
|
|
199
|
+
encoding: 'utf8'
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
if (execResult.status === 0) {
|
|
203
|
+
console.log(' ✅ Skills execution works (simulation mode)');
|
|
204
|
+
this.capabilities.push({
|
|
205
|
+
category: 'SKILLS_SYSTEM',
|
|
206
|
+
description: 'Skills system functional with 6 built-in skills'
|
|
207
|
+
});
|
|
208
|
+
} else {
|
|
209
|
+
console.log(' ❌ Skills execution failed');
|
|
210
|
+
this.issues.push({
|
|
211
|
+
severity: 'HIGH',
|
|
212
|
+
category: 'BUG',
|
|
213
|
+
description: 'Skills execution command failed',
|
|
214
|
+
component: 'skills system'
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.log(` ❌ Skills system test failed: ${error.message}`);
|
|
220
|
+
this.issues.push({
|
|
221
|
+
severity: 'HIGH',
|
|
222
|
+
category: 'ERROR',
|
|
223
|
+
description: `Skills system test error: ${error.message}`,
|
|
224
|
+
component: 'skills system'
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async testCrossPlatformCompatibility() {
|
|
230
|
+
console.log('TEST 5: Cross-Platform Compatibility');
|
|
231
|
+
console.log('-----------------------------------');
|
|
232
|
+
|
|
233
|
+
const platform = process.platform;
|
|
234
|
+
console.log(`Current platform: ${platform}`);
|
|
235
|
+
|
|
236
|
+
// Check file encoding
|
|
237
|
+
const skillsFiles = [
|
|
238
|
+
'package/src/skills/skills-manager.js',
|
|
239
|
+
'package/src/main.js',
|
|
240
|
+
'hooks/install-hooks.js'
|
|
241
|
+
];
|
|
242
|
+
|
|
243
|
+
let encodingIssues = 0;
|
|
244
|
+
for (const file of skillsFiles) {
|
|
245
|
+
if (fs.existsSync(file)) {
|
|
246
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
247
|
+
// Check for non-ANSI characters
|
|
248
|
+
if (/[^\x00-\x7F]/.test(content)) {
|
|
249
|
+
console.log(` ⚠️ ${file}: Contains non-ANSI characters`);
|
|
250
|
+
encodingIssues++;
|
|
251
|
+
} else {
|
|
252
|
+
console.log(` ✅ ${file}: Pure ANSI encoding`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (encodingIssues > 0) {
|
|
258
|
+
this.issues.push({
|
|
259
|
+
severity: 'LOW',
|
|
260
|
+
category: 'COMPATIBILITY',
|
|
261
|
+
description: `${encodingIssues} files contain non-ANSI characters`,
|
|
262
|
+
recommendation: 'Use pure ANSI for international compatibility'
|
|
263
|
+
});
|
|
264
|
+
} else {
|
|
265
|
+
this.capabilities.push({
|
|
266
|
+
category: 'ENCODING',
|
|
267
|
+
description: 'All files use pure ANSI encoding'
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Check Node.js module system compatibility
|
|
272
|
+
try {
|
|
273
|
+
require('./package/src/skills/skills-manager.js');
|
|
274
|
+
console.log(' ✅ ES6 modules work correctly');
|
|
275
|
+
} catch (error) {
|
|
276
|
+
console.log(` ❌ ES6 module import failed: ${error.message}`);
|
|
277
|
+
this.issues.push({
|
|
278
|
+
severity: 'HIGH',
|
|
279
|
+
category: 'COMPATIBILITY',
|
|
280
|
+
description: `ES6 module import failed: ${error.message}`,
|
|
281
|
+
component: 'module system'
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async testRealWorldScenarios() {
|
|
287
|
+
console.log('TEST 6: Real-World Scenarios');
|
|
288
|
+
console.log('---------------------------');
|
|
289
|
+
|
|
290
|
+
// Scenario 1: Code review workflow
|
|
291
|
+
console.log('Scenario 1: Code Review Workflow');
|
|
292
|
+
console.log(' User: "Please review this React component for security issues"');
|
|
293
|
+
console.log(' Expected: Hook should detect code-analysis need');
|
|
294
|
+
console.log(' Current: ❌ Hook system not integrated with real AI tools');
|
|
295
|
+
console.log('');
|
|
296
|
+
|
|
297
|
+
// Scenario 2: Translation workflow
|
|
298
|
+
console.log('Scenario 2: Translation Workflow');
|
|
299
|
+
console.log(' User: "Translate this comment to English"');
|
|
300
|
+
console.log(' Expected: Should trigger translation skill suggestion');
|
|
301
|
+
console.log(' Current: ❌ No real AI tool integration for automatic triggering');
|
|
302
|
+
console.log('');
|
|
303
|
+
|
|
304
|
+
// Scenario 3: Skills marketplace
|
|
305
|
+
console.log('Scenario 3: Skills Marketplace');
|
|
306
|
+
console.log(' Action: Install new skill from community repository');
|
|
307
|
+
console.log(' Expected: Should load external skills');
|
|
308
|
+
console.log(' Current: ✅ External skill loading simulation works');
|
|
309
|
+
console.log('');
|
|
310
|
+
|
|
311
|
+
this.issues.push({
|
|
312
|
+
severity: 'HIGH',
|
|
313
|
+
category: 'INTEGRATION',
|
|
314
|
+
description: 'Hooks are not actually integrated with real AI tools',
|
|
315
|
+
impact: 'System doesn\'t automatically intercept real AI tool usage'
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
this.issues.push({
|
|
319
|
+
severity: 'MEDIUM',
|
|
320
|
+
category: 'LIMITATION',
|
|
321
|
+
description: 'No automatic triggering of skills based on AI tool usage',
|
|
322
|
+
impact: 'Users must manually switch to skills system'
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
generateReport() {
|
|
327
|
+
console.log('');
|
|
328
|
+
console.log('==============================================');
|
|
329
|
+
console.log('COMPATIBILITY TEST REPORT');
|
|
330
|
+
console.log('==============================================');
|
|
331
|
+
console.log('');
|
|
332
|
+
|
|
333
|
+
console.log('📊 CURRENT STATUS:');
|
|
334
|
+
console.log('');
|
|
335
|
+
|
|
336
|
+
// Capabilities
|
|
337
|
+
if (this.capabilities.length > 0) {
|
|
338
|
+
console.log('✅ WORKING FEATURES:');
|
|
339
|
+
this.capabilities.forEach(cap => {
|
|
340
|
+
console.log(` • ${cap.category}: ${cap.description}`);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
console.log('');
|
|
345
|
+
|
|
346
|
+
// Issues
|
|
347
|
+
if (this.issues.length > 0) {
|
|
348
|
+
console.log('❌ IDENTIFIED ISSUES:');
|
|
349
|
+
console.log('');
|
|
350
|
+
|
|
351
|
+
// Group by severity
|
|
352
|
+
const highSeverity = this.issues.filter(i => i.severity === 'HIGH');
|
|
353
|
+
const mediumSeverity = this.issues.filter(i => i.severity === 'MEDIUM');
|
|
354
|
+
const lowSeverity = this.issues.filter(i => i.severity === 'LOW');
|
|
355
|
+
|
|
356
|
+
if (highSeverity.length > 0) {
|
|
357
|
+
console.log('🔴 HIGH SEVERITY:');
|
|
358
|
+
highSeverity.forEach(issue => {
|
|
359
|
+
console.log(` • ${issue.description} (${issue.component})`);
|
|
360
|
+
});
|
|
361
|
+
console.log('');
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (mediumSeverity.length > 0) {
|
|
365
|
+
console.log('🟡 MEDIUM SEVERITY:');
|
|
366
|
+
mediumSeverity.forEach(issue => {
|
|
367
|
+
console.log(` • ${issue.description} (${issue.component})`);
|
|
368
|
+
if (issue.impact) {
|
|
369
|
+
console.log(` Impact: ${issue.impact}`);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
console.log('');
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (lowSeverity.length > 0) {
|
|
376
|
+
console.log('🟡 LOW SEVERITY:');
|
|
377
|
+
lowSeverity.forEach(issue => {
|
|
378
|
+
console.log(` • ${issue.description} (${issue.component})`);
|
|
379
|
+
if (issue.recommendation) {
|
|
380
|
+
console.log(` Recommendation: ${issue.recommendation}`);
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
console.log('');
|
|
384
|
+
}
|
|
385
|
+
} else {
|
|
386
|
+
console.log('🎉 NO CRITICAL ISSUES FOUND');
|
|
387
|
+
console.log('');
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
console.log('📋 ASSESSMENT:');
|
|
391
|
+
console.log('');
|
|
392
|
+
|
|
393
|
+
// Overall assessment
|
|
394
|
+
const criticalIssues = this.issues.filter(i => i.severity === 'HIGH');
|
|
395
|
+
const totalIssues = this.issues.length;
|
|
396
|
+
|
|
397
|
+
if (criticalIssues.length > 0) {
|
|
398
|
+
console.log(`❌ SYSTEM NOT READY FOR PRODUCTION`);
|
|
399
|
+
console.log(` ${criticalIssues.length} critical issues must be resolved`);
|
|
400
|
+
console.log(` System requires fixes before deployment`);
|
|
401
|
+
} else if (totalIssues > 3) {
|
|
402
|
+
console.log('⚠️ SYSTEM READY WITH LIMITATIONS');
|
|
403
|
+
console.log(` ${totalIssues} issues found, but system is functional`);
|
|
404
|
+
console.log(` Consider addressing issues for better experience`);
|
|
405
|
+
} else {
|
|
406
|
+
console.log('✅ SYSTEM READY FOR TESTING');
|
|
407
|
+
console.log(` ${totalIssues} minor issues found, system is functional`);
|
|
408
|
+
console.log(` Suitable for development and demonstration`);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
console.log('');
|
|
412
|
+
console.log('🎯 RECOMMENDATIONS:');
|
|
413
|
+
console.log('');
|
|
414
|
+
|
|
415
|
+
if (criticalIssues.length > 0) {
|
|
416
|
+
console.log('1. FIX CRITICAL ISSUES FIRST:');
|
|
417
|
+
criticalIssues.forEach((issue, index) => {
|
|
418
|
+
console.log(` ${index + 1}. ${issue.description}`);
|
|
419
|
+
if (issue.component) {
|
|
420
|
+
console.log(` - Fix in ${issue.component}`);
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
console.log('');
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
console.log('2. ENHANCE USER EXPERIENCE:');
|
|
427
|
+
console.log(' • Fix tool selection logic in handleSkillsCommand');
|
|
428
|
+
console.log(' • Integrate hooks with real AI tool execution');
|
|
429
|
+
console.log(' • Add automatic skill triggering for common patterns');
|
|
430
|
+
console.log(' • Implement real AI tool calling (remove simulation mode)');
|
|
431
|
+
console.log('');
|
|
432
|
+
|
|
433
|
+
console.log('3. EXPAND THIRD-PARTY INTEGRATION:');
|
|
434
|
+
console.log(' • Implement actual GitHub repository cloning for skills');
|
|
435
|
+
console.log(' • Add skill validation and security checking');
|
|
436
|
+
console.log(' • Create skill marketplace with rating system');
|
|
437
|
+
console.log(' • Support skill version management and updates');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Run tests
|
|
442
|
+
if (require.main === module) {
|
|
443
|
+
const test = new SystemCompatibilityTest();
|
|
444
|
+
test.runTests();
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
module.exports = SystemCompatibilityTest;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* TDD Test Suite for Critical Issues
|
|
5
|
+
* Tests that will initially fail, then drive fixes
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const assert = require('assert');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
// Test 1: Tool Selection Logic
|
|
12
|
+
function testToolSelection() {
|
|
13
|
+
console.log('TEST 1: Tool Selection Logic');
|
|
14
|
+
console.log('-------------------------------');
|
|
15
|
+
|
|
16
|
+
// This test will fail initially because tool selection is broken
|
|
17
|
+
const testCases = [
|
|
18
|
+
{
|
|
19
|
+
args: ['skills', 'execute', 'translation', '--text=hello', '--to=zh', '--tool=claude'],
|
|
20
|
+
expectedTool: 'claude',
|
|
21
|
+
description: 'Should parse --tool=claude parameter'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
args: ['skills', 'execute', 'code-analysis', '--file=app.js', '--tool=gemini'],
|
|
25
|
+
expectedTool: 'gemini',
|
|
26
|
+
description: 'Should parse --tool=gemini parameter'
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
return testCases;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Test 2: Module Import
|
|
34
|
+
function testModuleImport() {
|
|
35
|
+
console.log('TEST 2: Module Import');
|
|
36
|
+
console.log('------------------------');
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
// Use CommonJS version to fix ES6 module issues
|
|
40
|
+
const SkillsManager = require('../package/src/skills/skills-manager.cjs');
|
|
41
|
+
const manager = new SkillsManager();
|
|
42
|
+
|
|
43
|
+
assert(typeof manager.init === 'function', 'Manager should have init method');
|
|
44
|
+
assert(typeof manager.listSkills === 'function', 'Manager should have listSkills method');
|
|
45
|
+
assert(typeof manager.executeSkill === 'function', 'Manager should have executeSkill method');
|
|
46
|
+
assert(typeof manager.buildCommand === 'function', 'Manager should have buildCommand method');
|
|
47
|
+
|
|
48
|
+
console.log('✅ Module import test passed');
|
|
49
|
+
return true;
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.log(`❌ Module import test failed: ${error.message}`);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Test 3: Skills Registry Loading
|
|
57
|
+
function testSkillsRegistryLoading() {
|
|
58
|
+
console.log('TEST 3: Skills Registry Loading');
|
|
59
|
+
console.log('---------------------------------');
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const fs = require('fs');
|
|
63
|
+
const registryPath = path.join(__dirname, '../package/src/skills/skills/skills-registry.json');
|
|
64
|
+
|
|
65
|
+
if (!fs.existsSync(registryPath)) {
|
|
66
|
+
throw new Error(`Skills registry not found at ${registryPath}`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const registry = JSON.parse(fs.readFileSync(registryPath, 'utf8'));
|
|
70
|
+
|
|
71
|
+
// Validate registry structure
|
|
72
|
+
assert(typeof registry === 'object', 'Registry should be an object');
|
|
73
|
+
assert(Object.keys(registry).length > 0, 'Registry should contain skills');
|
|
74
|
+
|
|
75
|
+
// Validate each skill structure
|
|
76
|
+
for (const [skillId, skill] of Object.entries(registry)) {
|
|
77
|
+
assert(skill.name, `Skill ${skillId} should have a name`);
|
|
78
|
+
assert(skill.description, `Skill ${skillId} should have a description`);
|
|
79
|
+
assert(skill.category, `Skill ${skillId} should have a category`);
|
|
80
|
+
assert(Array.isArray(skill.tools), `Skill ${skillId} should have tools array`);
|
|
81
|
+
assert(skill.template, `Skill ${skillId} should have a template`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
console.log(`✅ Skills registry test passed - ${Object.keys(registry).length} skills loaded`);
|
|
85
|
+
return true;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.log(`❌ Skills registry test failed: ${error.message}`);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Test 4: Skills Execution
|
|
93
|
+
async function testSkillsExecution() {
|
|
94
|
+
console.log('TEST 4: Skills Execution');
|
|
95
|
+
console.log('-------------------------');
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
const SkillsManager = require('../package/src/skills/skills-manager.cjs');
|
|
99
|
+
const manager = new SkillsManager();
|
|
100
|
+
|
|
101
|
+
// Initialize manager
|
|
102
|
+
await manager.init();
|
|
103
|
+
|
|
104
|
+
// Test skill execution
|
|
105
|
+
const result = await manager.executeSkill('translation', {
|
|
106
|
+
text: 'hello world',
|
|
107
|
+
to: 'zh'
|
|
108
|
+
}, 'claude');
|
|
109
|
+
|
|
110
|
+
assert(result.skillId === 'translation', 'Should execute translation skill');
|
|
111
|
+
assert(result.tool === 'claude', 'Should use specified tool');
|
|
112
|
+
assert(result.command.includes('claude'), 'Command should include tool name');
|
|
113
|
+
assert(result.result.success, 'Execution should succeed');
|
|
114
|
+
|
|
115
|
+
console.log('✅ Skills execution test passed');
|
|
116
|
+
return true;
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.log(`❌ Skills execution test failed: ${error.message}`);
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Test 5: Parameter Parsing
|
|
124
|
+
function testParameterParsing() {
|
|
125
|
+
console.log('TEST 5: Parameter Parsing');
|
|
126
|
+
console.log('---------------------------');
|
|
127
|
+
|
|
128
|
+
const testCases = [
|
|
129
|
+
{
|
|
130
|
+
args: ['--text=hello', '--to=zh', '--tool=claude'],
|
|
131
|
+
expected: {
|
|
132
|
+
text: 'hello',
|
|
133
|
+
to: 'zh',
|
|
134
|
+
tool: 'claude'
|
|
135
|
+
},
|
|
136
|
+
description: 'Should parse key=value parameters'
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
args: ['--file', 'app.js', '--line', '10'],
|
|
140
|
+
expected: {
|
|
141
|
+
file: 'app.js',
|
|
142
|
+
line: '10'
|
|
143
|
+
},
|
|
144
|
+
description: 'Should handle space-separated parameters'
|
|
145
|
+
}
|
|
146
|
+
];
|
|
147
|
+
|
|
148
|
+
return testCases;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Main test runner
|
|
152
|
+
async function runTests() {
|
|
153
|
+
console.log('==============================================');
|
|
154
|
+
console.log('TDD DRIVEN DEVELOPMENT - CRITICAL ISSUES');
|
|
155
|
+
console.log('==============================================');
|
|
156
|
+
console.log('');
|
|
157
|
+
|
|
158
|
+
const results = [];
|
|
159
|
+
|
|
160
|
+
// Test 1: Tool selection (will be implemented in main.js)
|
|
161
|
+
console.log('Test 1: Tool Selection Logic');
|
|
162
|
+
console.log('⚠️ TODO: This test drives handleSkillsCommand fixes');
|
|
163
|
+
console.log('');
|
|
164
|
+
|
|
165
|
+
// Test 2: Module import
|
|
166
|
+
results.push(testModuleImport());
|
|
167
|
+
console.log('');
|
|
168
|
+
|
|
169
|
+
// Test 3: Skills registry
|
|
170
|
+
results.push(testSkillsRegistryLoading());
|
|
171
|
+
console.log('');
|
|
172
|
+
|
|
173
|
+
// Test 4: Skills execution
|
|
174
|
+
results.push(await testSkillsExecution());
|
|
175
|
+
console.log('');
|
|
176
|
+
|
|
177
|
+
// Test 5: Parameter parsing
|
|
178
|
+
console.log('Test 5: Parameter Parsing');
|
|
179
|
+
console.log('⚠️ TODO: This test drives parameter parsing fixes');
|
|
180
|
+
console.log('');
|
|
181
|
+
|
|
182
|
+
// Summary
|
|
183
|
+
const passed = results.filter(r => r === true).length;
|
|
184
|
+
const total = results.length;
|
|
185
|
+
|
|
186
|
+
console.log('==============================================');
|
|
187
|
+
console.log('TDD TEST SUMMARY');
|
|
188
|
+
console.log('==============================================');
|
|
189
|
+
console.log(`Tests passed: ${passed}/${total}`);
|
|
190
|
+
|
|
191
|
+
if (passed === total) {
|
|
192
|
+
console.log('🎉 All tests passed! Critical issues are fixed.');
|
|
193
|
+
} else {
|
|
194
|
+
console.log('⚠️ Some tests failed. Time to implement fixes!');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return passed === total;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Run tests if called directly
|
|
201
|
+
if (require.main === module) {
|
|
202
|
+
runTests();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
module.exports = {
|
|
206
|
+
testToolSelection,
|
|
207
|
+
testModuleImport,
|
|
208
|
+
testSkillsRegistryLoading,
|
|
209
|
+
testParameterParsing,
|
|
210
|
+
runTests
|
|
211
|
+
};
|