stigmergy 1.2.6 → 1.2.10

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 (82) hide show
  1. package/README.md +69 -20
  2. package/STIGMERGY.md +26 -7
  3. package/docs/MULTI_USER_WIKI_COLLABORATION_SYSTEM.md +523 -0
  4. package/docs/PROMPT_BASED_SKILLS_SYSTEM_DESIGN.md +458 -0
  5. package/docs/SKILL_IMPLEMENTATION_CONSTRAINTS_AND_ALIGNMENT.md +423 -0
  6. package/docs/TECHNICAL_FEASIBILITY_ANALYSIS.md +308 -0
  7. package/examples/multilingual-hook-demo.js +125 -0
  8. package/package.json +30 -19
  9. package/scripts/dependency-analyzer.js +101 -0
  10. package/scripts/generate-cli-docs.js +64 -0
  11. package/scripts/postuninstall.js +46 -0
  12. package/scripts/preuninstall.js +85 -0
  13. package/scripts/run-layered-tests.js +3 -3
  14. package/src/adapters/claude/install_claude_integration.js +37 -37
  15. package/src/adapters/codebuddy/install_codebuddy_integration.js +66 -63
  16. package/src/adapters/codex/install_codex_integration.js +54 -55
  17. package/src/adapters/copilot/install_copilot_integration.js +46 -46
  18. package/src/adapters/gemini/install_gemini_integration.js +68 -68
  19. package/src/adapters/iflow/install_iflow_integration.js +77 -77
  20. package/src/adapters/qoder/install_qoder_integration.js +76 -76
  21. package/src/adapters/qwen/install_qwen_integration.js +23 -23
  22. package/src/cli/router.js +713 -163
  23. package/src/commands/skill-bridge.js +39 -0
  24. package/src/commands/skill-handler.js +150 -0
  25. package/src/commands/skill.js +127 -0
  26. package/src/core/cache_cleaner.js +767 -767
  27. package/src/core/cli_help_analyzer.js +680 -680
  28. package/src/core/cli_parameter_handler.js +132 -132
  29. package/src/core/cli_path_detector.js +573 -0
  30. package/src/core/cli_tools.js +160 -89
  31. package/src/core/coordination/index.js +16 -16
  32. package/src/core/coordination/nodejs/AdapterManager.js +130 -102
  33. package/src/core/coordination/nodejs/CLCommunication.js +132 -132
  34. package/src/core/coordination/nodejs/CLIIntegrationManager.js +272 -272
  35. package/src/core/coordination/nodejs/HealthChecker.js +76 -76
  36. package/src/core/coordination/nodejs/HookDeploymentManager.js +463 -274
  37. package/src/core/coordination/nodejs/StatisticsCollector.js +71 -71
  38. package/src/core/coordination/nodejs/index.js +90 -90
  39. package/src/core/coordination/nodejs/utils/Logger.js +29 -29
  40. package/src/core/directory_permission_manager.js +568 -0
  41. package/src/core/enhanced_cli_installer.js +609 -0
  42. package/src/core/error_handler.js +406 -406
  43. package/src/core/installer.js +263 -119
  44. package/src/core/memory_manager.js +83 -83
  45. package/src/core/multilingual/language-pattern-manager.js +200 -0
  46. package/src/core/persistent_shell_configurator.js +468 -0
  47. package/src/core/rest_client.js +160 -160
  48. package/src/core/skills/StigmergySkillManager.js +357 -0
  49. package/src/core/skills/__tests__/SkillInstaller.test.js +275 -0
  50. package/src/core/skills/__tests__/SkillParser.test.js +202 -0
  51. package/src/core/skills/__tests__/SkillReader.test.js +189 -0
  52. package/src/core/skills/cli-command-test.js +201 -0
  53. package/src/core/skills/comprehensive-e2e-test.js +473 -0
  54. package/src/core/skills/e2e-test.js +267 -0
  55. package/src/core/skills/embedded-openskills/SkillInstaller.js +438 -0
  56. package/src/core/skills/embedded-openskills/SkillParser.js +123 -0
  57. package/src/core/skills/embedded-openskills/SkillReader.js +143 -0
  58. package/src/core/skills/integration-test.js +248 -0
  59. package/src/core/skills/package.json +6 -0
  60. package/src/core/skills/regression-test.js +285 -0
  61. package/src/core/skills/run-all-tests.js +129 -0
  62. package/src/core/skills/sync-test.js +210 -0
  63. package/src/core/skills/test-runner.js +242 -0
  64. package/src/core/smart_router.js +261 -249
  65. package/src/core/upgrade_manager.js +48 -20
  66. package/src/index.js +30 -30
  67. package/src/test/cli-availability-checker.js +194 -194
  68. package/src/test/test-environment.js +289 -289
  69. package/src/utils/helpers.js +18 -35
  70. package/src/utils.js +921 -921
  71. package/src/weatherProcessor.js +228 -228
  72. package/test/multilingual/hook-deployment.test.js +91 -0
  73. package/test/multilingual/language-pattern-manager.test.js +140 -0
  74. package/test/multilingual/system-test.js +85 -0
  75. package/src/auth.js +0 -173
  76. package/src/auth_command.js +0 -208
  77. package/src/calculator.js +0 -313
  78. package/src/core/enhanced_installer.js +0 -479
  79. package/src/core/enhanced_uninstaller.js +0 -638
  80. package/src/data_encryption.js +0 -143
  81. package/src/data_structures.js +0 -440
  82. package/src/deploy.js +0 -55
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Simple Test Runner - TDD Verification
3
+ * No dependency on Jest, runs tests directly
4
+ */
5
+
6
+ import { SkillParser } from './embedded-openskills/SkillParser.js';
7
+ import { SkillReader } from './embedded-openskills/SkillReader.js';
8
+ import { SkillInstaller } from './embedded-openskills/SkillInstaller.js';
9
+ import fs from 'fs/promises';
10
+ import path from 'path';
11
+ import os from 'os';
12
+ import assert from 'assert';
13
+
14
+ class TestRunner {
15
+ constructor() {
16
+ this.passed = 0;
17
+ this.failed = 0;
18
+ this.tests = [];
19
+ }
20
+
21
+ async test(name, fn) {
22
+ try {
23
+ await fn();
24
+ this.passed++;
25
+ console.log(`[OK] ${name}`);
26
+ } catch (err) {
27
+ this.failed++;
28
+ console.error(`[X] ${name}`);
29
+ console.error(` Error: ${err.message}`);
30
+ if (err.stack) {
31
+ console.error(` ${err.stack.split('\n')[1]}`);
32
+ }
33
+ }
34
+ }
35
+
36
+ summary() {
37
+ console.log(`\n${'='.repeat(60)}`);
38
+ console.log(`Total: ${this.passed + this.failed} tests`);
39
+ console.log(`[OK] Passed: ${this.passed}`);
40
+ console.log(`[X] Failed: ${this.failed}`);
41
+ console.log('='.repeat(60));
42
+ return this.failed === 0;
43
+ }
44
+ }
45
+
46
+ async function runTests() {
47
+ const runner = new TestRunner();
48
+ let tempDir;
49
+
50
+ console.log('[LIST] Running TDD tests...\n');
51
+
52
+ // ===== SkillParser Tests =====
53
+ console.log('[LIST] SkillParser Tests\n');
54
+
55
+ await runner.test('parseMetadata - Parse valid YAML', () => {
56
+ const parser = new SkillParser();
57
+ const content = `---
58
+ name: test-skill
59
+ description: A test skill
60
+ version: 1.0.0
61
+ ---
62
+
63
+ # Content`;
64
+ const result = parser.parseMetadata(content);
65
+ assert.strictEqual(result.name, 'test-skill');
66
+ assert.strictEqual(result.description, 'A test skill');
67
+ });
68
+
69
+ await runner.test('parseMetadata - Handle arrays', () => {
70
+ const parser = new SkillParser();
71
+ const content = `---
72
+ name: skill
73
+ allowed-tools:
74
+ - bash
75
+ - text_editor
76
+ ---`;
77
+ const result = parser.parseMetadata(content);
78
+ assert.deepStrictEqual(result['allowed-tools'], ['bash', 'text_editor']);
79
+ });
80
+
81
+ await runner.test('extractContent - Extract body content', () => {
82
+ const parser = new SkillParser();
83
+ const content = `---
84
+ name: test
85
+ ---
86
+
87
+ # Instructions`;
88
+ const result = parser.extractContent(content);
89
+ assert(result.includes('# Instructions'));
90
+ assert(!result.includes('---'));
91
+ });
92
+
93
+ await runner.test('validateSkill - Detect missing name', () => {
94
+ const parser = new SkillParser();
95
+ const content = `---
96
+ description: No name
97
+ ---`;
98
+ const result = parser.validateSkill(content);
99
+ assert.strictEqual(result.valid, false);
100
+ assert(result.errors.some(e => e.includes('name')));
101
+ });
102
+
103
+ await runner.test('validateSkill - Detect invalid name format', () => {
104
+ const parser = new SkillParser();
105
+ const content = `---
106
+ name: Invalid_Name
107
+ description: Test
108
+ ---`;
109
+ const result = parser.validateSkill(content);
110
+ assert.strictEqual(result.valid, false);
111
+ assert(result.errors.some(e => e.includes('lowercase and hyphens')));
112
+ });
113
+
114
+ // ===== SkillReader Tests =====
115
+ console.log('\n[LIST] SkillReader Tests\n');
116
+
117
+ // Setup test environment
118
+ tempDir = path.join(os.tmpdir(), `test-skills-${Date.now()}`);
119
+ await fs.mkdir(tempDir, { recursive: true });
120
+
121
+ await runner.test('findSkill - Find existing skill', async () => {
122
+ const skillName = 'test-skill';
123
+ const skillDir = path.join(tempDir, skillName);
124
+ await fs.mkdir(skillDir, { recursive: true });
125
+ await fs.writeFile(
126
+ path.join(skillDir, 'SKILL.md'),
127
+ '---\nname: test-skill\n---\n# Test'
128
+ );
129
+
130
+ const reader = new SkillReader([tempDir]);
131
+ const result = await reader.findSkill(skillName);
132
+
133
+ assert.notStrictEqual(result, null);
134
+ assert.strictEqual(result.name, skillName);
135
+ });
136
+
137
+ await runner.test('findSkill - Non-existent skill returns null', async () => {
138
+ const reader = new SkillReader([tempDir]);
139
+ const result = await reader.findSkill('non-existent');
140
+ assert.strictEqual(result, null);
141
+ });
142
+
143
+ await runner.test('readSkill - Read skill content', async () => {
144
+ const skillName = 'readable-skill';
145
+ const skillDir = path.join(tempDir, skillName);
146
+ await fs.mkdir(skillDir);
147
+ const content = '---\nname: readable-skill\n---\n# Content';
148
+ await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
149
+
150
+ const reader = new SkillReader([tempDir]);
151
+ const result = await reader.readSkill(skillName);
152
+
153
+ assert.strictEqual(result.name, skillName);
154
+ assert.strictEqual(result.content, content);
155
+ });
156
+
157
+ await runner.test('listSkills - List all skills', async () => {
158
+ const skills = ['skill-1', 'skill-2'];
159
+ for (const name of skills) {
160
+ const dir = path.join(tempDir, name);
161
+ await fs.mkdir(dir);
162
+ await fs.writeFile(
163
+ path.join(dir, 'SKILL.md'),
164
+ `---\nname: ${name}\ndescription: ${name}\n---\n`
165
+ );
166
+ }
167
+
168
+ const reader = new SkillReader([tempDir]);
169
+ const result = await reader.listSkills();
170
+
171
+ assert(result.length >= skills.length);
172
+ const names = result.map(s => s.name);
173
+ skills.forEach(name => assert(names.includes(name)));
174
+ });
175
+
176
+ // ===== SkillInstaller Tests =====
177
+ console.log('\n[LIST] SkillInstaller Tests\n');
178
+
179
+ await runner.test('parseGitHubUrl - Parse standard URL', () => {
180
+ const installer = new SkillInstaller();
181
+ const result = installer.parseGitHubUrl('https://github.com/owner/repo');
182
+ assert.strictEqual(result.owner, 'owner');
183
+ assert.strictEqual(result.repo, 'repo');
184
+ });
185
+
186
+ await runner.test('parseGitHubUrl - Parse shorthand format', () => {
187
+ const installer = new SkillInstaller();
188
+ const result = installer.parseGitHubUrl('owner/repo');
189
+ assert.strictEqual(result.owner, 'owner');
190
+ assert.strictEqual(result.repo, 'repo');
191
+ });
192
+
193
+ await runner.test('parseGitHubUrl - Remove .git suffix', () => {
194
+ const installer = new SkillInstaller();
195
+ const result = installer.parseGitHubUrl('owner/repo.git');
196
+ assert.strictEqual(result.repo, 'repo');
197
+ });
198
+
199
+ await runner.test('scanSkills - Scan skill directory', async () => {
200
+ const scanDir = path.join(tempDir, 'scan-test');
201
+ await fs.mkdir(scanDir);
202
+
203
+ const skill1 = path.join(scanDir, 'skill-a');
204
+ await fs.mkdir(skill1);
205
+ await fs.writeFile(
206
+ path.join(skill1, 'SKILL.md'),
207
+ '---\nname: skill-a\n---\n'
208
+ );
209
+
210
+ const installer = new SkillInstaller();
211
+ const skills = await installer.scanSkills(scanDir);
212
+
213
+ assert(skills.length >= 1);
214
+ assert(skills.some(s => s.name === 'skill-a'));
215
+ });
216
+
217
+ await runner.test('calculateSize - Calculate directory size', async () => {
218
+ const sizeDir = path.join(tempDir, 'size-test');
219
+ await fs.mkdir(sizeDir);
220
+ await fs.writeFile(path.join(sizeDir, 'file.txt'), 'x'.repeat(100));
221
+
222
+ const installer = new SkillInstaller();
223
+ const size = await installer.calculateSize(sizeDir);
224
+
225
+ assert.strictEqual(size, 100);
226
+ });
227
+
228
+ // Cleanup
229
+ await fs.rm(tempDir, { recursive: true, force: true });
230
+
231
+ return runner.summary();
232
+ }
233
+
234
+ // Run tests
235
+ runTests()
236
+ .then(success => {
237
+ process.exit(success ? 0 : 1);
238
+ })
239
+ .catch(err => {
240
+ console.error('[X] Test execution failed:', err);
241
+ process.exit(1);
242
+ });