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.
- package/README.md +69 -20
- package/STIGMERGY.md +26 -7
- package/docs/MULTI_USER_WIKI_COLLABORATION_SYSTEM.md +523 -0
- package/docs/PROMPT_BASED_SKILLS_SYSTEM_DESIGN.md +458 -0
- package/docs/SKILL_IMPLEMENTATION_CONSTRAINTS_AND_ALIGNMENT.md +423 -0
- package/docs/TECHNICAL_FEASIBILITY_ANALYSIS.md +308 -0
- package/examples/multilingual-hook-demo.js +125 -0
- package/package.json +30 -19
- package/scripts/dependency-analyzer.js +101 -0
- package/scripts/generate-cli-docs.js +64 -0
- package/scripts/postuninstall.js +46 -0
- package/scripts/preuninstall.js +85 -0
- package/scripts/run-layered-tests.js +3 -3
- package/src/adapters/claude/install_claude_integration.js +37 -37
- package/src/adapters/codebuddy/install_codebuddy_integration.js +66 -63
- package/src/adapters/codex/install_codex_integration.js +54 -55
- package/src/adapters/copilot/install_copilot_integration.js +46 -46
- package/src/adapters/gemini/install_gemini_integration.js +68 -68
- package/src/adapters/iflow/install_iflow_integration.js +77 -77
- package/src/adapters/qoder/install_qoder_integration.js +76 -76
- package/src/adapters/qwen/install_qwen_integration.js +23 -23
- package/src/cli/router.js +713 -163
- package/src/commands/skill-bridge.js +39 -0
- package/src/commands/skill-handler.js +150 -0
- package/src/commands/skill.js +127 -0
- package/src/core/cache_cleaner.js +767 -767
- package/src/core/cli_help_analyzer.js +680 -680
- package/src/core/cli_parameter_handler.js +132 -132
- package/src/core/cli_path_detector.js +573 -0
- package/src/core/cli_tools.js +160 -89
- package/src/core/coordination/index.js +16 -16
- package/src/core/coordination/nodejs/AdapterManager.js +130 -102
- package/src/core/coordination/nodejs/CLCommunication.js +132 -132
- package/src/core/coordination/nodejs/CLIIntegrationManager.js +272 -272
- package/src/core/coordination/nodejs/HealthChecker.js +76 -76
- package/src/core/coordination/nodejs/HookDeploymentManager.js +463 -274
- package/src/core/coordination/nodejs/StatisticsCollector.js +71 -71
- package/src/core/coordination/nodejs/index.js +90 -90
- package/src/core/coordination/nodejs/utils/Logger.js +29 -29
- package/src/core/directory_permission_manager.js +568 -0
- package/src/core/enhanced_cli_installer.js +609 -0
- package/src/core/error_handler.js +406 -406
- package/src/core/installer.js +263 -119
- package/src/core/memory_manager.js +83 -83
- package/src/core/multilingual/language-pattern-manager.js +200 -0
- package/src/core/persistent_shell_configurator.js +468 -0
- package/src/core/rest_client.js +160 -160
- package/src/core/skills/StigmergySkillManager.js +357 -0
- package/src/core/skills/__tests__/SkillInstaller.test.js +275 -0
- package/src/core/skills/__tests__/SkillParser.test.js +202 -0
- package/src/core/skills/__tests__/SkillReader.test.js +189 -0
- package/src/core/skills/cli-command-test.js +201 -0
- package/src/core/skills/comprehensive-e2e-test.js +473 -0
- package/src/core/skills/e2e-test.js +267 -0
- package/src/core/skills/embedded-openskills/SkillInstaller.js +438 -0
- package/src/core/skills/embedded-openskills/SkillParser.js +123 -0
- package/src/core/skills/embedded-openskills/SkillReader.js +143 -0
- package/src/core/skills/integration-test.js +248 -0
- package/src/core/skills/package.json +6 -0
- package/src/core/skills/regression-test.js +285 -0
- package/src/core/skills/run-all-tests.js +129 -0
- package/src/core/skills/sync-test.js +210 -0
- package/src/core/skills/test-runner.js +242 -0
- package/src/core/smart_router.js +261 -249
- package/src/core/upgrade_manager.js +48 -20
- package/src/index.js +30 -30
- package/src/test/cli-availability-checker.js +194 -194
- package/src/test/test-environment.js +289 -289
- package/src/utils/helpers.js +18 -35
- package/src/utils.js +921 -921
- package/src/weatherProcessor.js +228 -228
- package/test/multilingual/hook-deployment.test.js +91 -0
- package/test/multilingual/language-pattern-manager.test.js +140 -0
- package/test/multilingual/system-test.js +85 -0
- package/src/auth.js +0 -173
- package/src/auth_command.js +0 -208
- package/src/calculator.js +0 -313
- package/src/core/enhanced_installer.js +0 -479
- package/src/core/enhanced_uninstaller.js +0 -638
- package/src/data_encryption.js +0 -143
- package/src/data_structures.js +0 -440
- 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
|
+
});
|