@polka-codes/core 0.10.13 → 0.10.17
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/dist/Agent/backoff.d.ts +7 -0
- package/dist/Agent/backoff.js +21 -0
- package/dist/Agent/backoff.js.map +1 -0
- package/dist/Agent/index.d.ts +2 -0
- package/dist/Agent/index.js +3 -0
- package/dist/Agent/index.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.d.ts +8 -0
- package/dist/Agent/parseJsonFromMarkdown.js +34 -0
- package/dist/Agent/parseJsonFromMarkdown.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.d.ts +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js +70 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js.map +1 -0
- package/dist/Agent/prompts.d.ts +9 -0
- package/dist/Agent/prompts.js +107 -0
- package/dist/Agent/prompts.js.map +1 -0
- package/dist/UsageMeter.d.ts +101 -0
- package/dist/UsageMeter.js +299 -0
- package/dist/UsageMeter.js.map +1 -0
- package/dist/UsageMeter.test.d.ts +4 -0
- package/dist/UsageMeter.test.js +556 -0
- package/dist/UsageMeter.test.js.map +1 -0
- package/dist/config/base.d.ts +68 -0
- package/dist/config/base.js +56 -0
- package/dist/config/base.js.map +1 -0
- package/dist/config/memory.d.ts +24 -0
- package/dist/config/memory.js +36 -0
- package/dist/config/memory.js.map +1 -0
- package/dist/config.d.ts +236 -0
- package/dist/config.js +184 -0
- package/dist/config.js.map +1 -0
- package/dist/errors/base.d.ts +31 -0
- package/dist/errors/base.js +60 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/fs/index.d.ts +2 -0
- package/dist/fs/index.js +3 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/node-provider.d.ts +16 -0
- package/dist/fs/node-provider.js +47 -0
- package/dist/fs/node-provider.js.map +1 -0
- package/dist/fs/provider.d.ts +61 -0
- package/dist/fs/provider.js +3 -0
- package/dist/fs/provider.js.map +1 -0
- package/dist/index.d.ts +20 -191
- package/dist/index.js +21 -4123
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +136 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/path.d.ts +9 -0
- package/dist/path.js +68 -0
- package/dist/path.js.map +1 -0
- package/dist/path.test.d.ts +1 -0
- package/dist/path.test.js +82 -0
- package/dist/path.test.js.map +1 -0
- package/dist/pricing/converter.d.ts +6 -0
- package/dist/pricing/converter.js +13 -0
- package/dist/pricing/converter.js.map +1 -0
- package/dist/pricing/converter.test.d.ts +1 -0
- package/dist/pricing/converter.test.js +54 -0
- package/dist/pricing/converter.test.js.map +1 -0
- package/dist/pricing/index.d.ts +2 -0
- package/dist/pricing/index.js +2 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/portkey-client.d.ts +2 -0
- package/dist/pricing/portkey-client.js +57 -0
- package/dist/pricing/portkey-client.js.map +1 -0
- package/dist/pricing/pricing-service.d.ts +6 -0
- package/dist/pricing/pricing-service.js +125 -0
- package/dist/pricing/pricing-service.js.map +1 -0
- package/dist/pricing/pricing-service.test.d.ts +1 -0
- package/dist/pricing/pricing-service.test.js +141 -0
- package/dist/pricing/pricing-service.test.js.map +1 -0
- package/dist/pricing/types.d.ts +24 -0
- package/dist/pricing/types.js +2 -0
- package/dist/pricing/types.js.map +1 -0
- package/dist/skills/__tests__/discovery.test.d.ts +1 -0
- package/dist/skills/__tests__/discovery.test.js +254 -0
- package/dist/skills/__tests__/discovery.test.js.map +1 -0
- package/dist/skills/__tests__/validation.test.d.ts +1 -0
- package/dist/skills/__tests__/validation.test.js +221 -0
- package/dist/skills/__tests__/validation.test.js.map +1 -0
- package/dist/skills/constants.d.ts +32 -0
- package/dist/skills/constants.js +50 -0
- package/dist/skills/constants.js.map +1 -0
- package/dist/skills/discovery.d.ts +56 -0
- package/dist/skills/discovery.js +392 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/tools/index.d.ts +3 -0
- package/dist/skills/tools/index.js +5 -0
- package/dist/skills/tools/index.js.map +1 -0
- package/dist/skills/tools/listSkills.d.ts +54 -0
- package/dist/skills/tools/listSkills.js +52 -0
- package/dist/skills/tools/listSkills.js.map +1 -0
- package/dist/skills/tools/loadSkill.d.ts +52 -0
- package/dist/skills/tools/loadSkill.js +86 -0
- package/dist/skills/tools/loadSkill.js.map +1 -0
- package/dist/skills/tools/readSkillFile.d.ts +43 -0
- package/dist/skills/tools/readSkillFile.js +68 -0
- package/dist/skills/tools/readSkillFile.js.map +1 -0
- package/dist/skills/types.d.ts +83 -0
- package/dist/skills/types.js +42 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validation.d.ts +30 -0
- package/dist/skills/validation.js +133 -0
- package/dist/skills/validation.js.map +1 -0
- package/dist/tool.d.ts +51 -0
- package/dist/tool.js +2 -0
- package/dist/tool.js.map +1 -0
- package/dist/tools/askFollowupQuestion.d.ts +35 -0
- package/dist/tools/askFollowupQuestion.js +105 -0
- package/dist/tools/askFollowupQuestion.js.map +1 -0
- package/dist/tools/askFollowupQuestion.test.d.ts +1 -0
- package/dist/tools/askFollowupQuestion.test.js +80 -0
- package/dist/tools/askFollowupQuestion.test.js.map +1 -0
- package/dist/tools/executeCommand.d.ts +29 -0
- package/dist/tools/executeCommand.js +82 -0
- package/dist/tools/executeCommand.js.map +1 -0
- package/dist/tools/executeCommand.test.d.ts +1 -0
- package/dist/tools/executeCommand.test.js +60 -0
- package/dist/tools/executeCommand.test.js.map +1 -0
- package/dist/tools/fetchUrl.d.ts +26 -0
- package/dist/tools/fetchUrl.js +85 -0
- package/dist/tools/fetchUrl.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listFiles.d.ts +35 -0
- package/dist/tools/listFiles.js +61 -0
- package/dist/tools/listFiles.js.map +1 -0
- package/dist/tools/listFiles.test.d.ts +1 -0
- package/dist/tools/listFiles.test.js +59 -0
- package/dist/tools/listFiles.test.js.map +1 -0
- package/dist/tools/provider.d.ts +76 -0
- package/dist/tools/provider.js +60 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/readBinaryFile.d.ts +26 -0
- package/dist/tools/readBinaryFile.js +52 -0
- package/dist/tools/readBinaryFile.js.map +1 -0
- package/dist/tools/readFile.d.ts +35 -0
- package/dist/tools/readFile.js +128 -0
- package/dist/tools/readFile.js.map +1 -0
- package/dist/tools/readFile.test.d.ts +1 -0
- package/dist/tools/readFile.test.js +37 -0
- package/dist/tools/readFile.test.js.map +1 -0
- package/dist/tools/removeFile.d.ts +26 -0
- package/dist/tools/removeFile.js +49 -0
- package/dist/tools/removeFile.js.map +1 -0
- package/dist/tools/removeFile.test.d.ts +1 -0
- package/dist/tools/removeFile.test.js +32 -0
- package/dist/tools/removeFile.test.js.map +1 -0
- package/dist/tools/renameFile.d.ts +29 -0
- package/dist/tools/renameFile.js +48 -0
- package/dist/tools/renameFile.js.map +1 -0
- package/dist/tools/renameFile.test.d.ts +1 -0
- package/dist/tools/renameFile.test.js +53 -0
- package/dist/tools/renameFile.test.js.map +1 -0
- package/dist/tools/replaceInFile.d.ts +29 -0
- package/dist/tools/replaceInFile.js +233 -0
- package/dist/tools/replaceInFile.js.map +1 -0
- package/dist/tools/replaceInFile.test.d.ts +1 -0
- package/dist/tools/replaceInFile.test.js +79 -0
- package/dist/tools/replaceInFile.test.js.map +1 -0
- package/dist/tools/response-builders.d.ts +64 -0
- package/dist/tools/response-builders.js +88 -0
- package/dist/tools/response-builders.js.map +1 -0
- package/dist/tools/search.d.ts +26 -0
- package/dist/tools/search.js +56 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/search.test.d.ts +1 -0
- package/dist/tools/search.test.js +22 -0
- package/dist/tools/search.test.js.map +1 -0
- package/dist/tools/searchFiles.d.ts +32 -0
- package/dist/tools/searchFiles.js +86 -0
- package/dist/tools/searchFiles.js.map +1 -0
- package/dist/tools/todo.d.ts +37 -0
- package/dist/tools/todo.js +41 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/utils/index.d.ts +1 -0
- package/dist/tools/utils/index.js +2 -0
- package/dist/tools/utils/index.js.map +1 -0
- package/dist/tools/utils/replaceInFile.d.ts +7 -0
- package/dist/tools/utils/replaceInFile.js +133 -0
- package/dist/tools/utils/replaceInFile.js.map +1 -0
- package/dist/tools/utils/replaceInFile.test.d.ts +1 -0
- package/dist/tools/utils/replaceInFile.test.js +308 -0
- package/dist/tools/utils/replaceInFile.test.js.map +1 -0
- package/dist/tools/utils.d.ts +10 -0
- package/dist/tools/utils.js +27 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/writeToFile.d.ts +29 -0
- package/dist/tools/writeToFile.js +85 -0
- package/dist/tools/writeToFile.js.map +1 -0
- package/dist/tools/writeToFile.test.d.ts +1 -0
- package/dist/tools/writeToFile.test.js +46 -0
- package/dist/tools/writeToFile.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge.d.ts +26 -0
- package/dist/utils/merge.js +45 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/workflow/agent.workflow.d.ts +39 -0
- package/dist/workflow/agent.workflow.js +166 -0
- package/dist/workflow/agent.workflow.js.map +1 -0
- package/dist/workflow/agent.workflow.test.d.ts +1 -0
- package/dist/workflow/agent.workflow.test.js +175 -0
- package/dist/workflow/agent.workflow.test.js.map +1 -0
- package/dist/workflow/control-flow.test.d.ts +1 -0
- package/dist/workflow/control-flow.test.js +323 -0
- package/dist/workflow/control-flow.test.js.map +1 -0
- package/dist/workflow/dynamic-edge-cases.test.d.ts +1 -0
- package/dist/workflow/dynamic-edge-cases.test.js +486 -0
- package/dist/workflow/dynamic-edge-cases.test.js.map +1 -0
- package/dist/workflow/dynamic-types.d.ts +124 -0
- package/dist/workflow/dynamic-types.js +105 -0
- package/dist/workflow/dynamic-types.js.map +1 -0
- package/dist/workflow/dynamic.d.ts +118 -0
- package/dist/workflow/dynamic.js +999 -0
- package/dist/workflow/dynamic.js.map +1 -0
- package/dist/workflow/index.d.ts +6 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/json-ai-types.d.ts +122 -0
- package/dist/workflow/json-ai-types.js +144 -0
- package/dist/workflow/json-ai-types.js.map +1 -0
- package/dist/workflow/json-schema-conversion.test.d.ts +1 -0
- package/dist/workflow/json-schema-conversion.test.js +371 -0
- package/dist/workflow/json-schema-conversion.test.js.map +1 -0
- package/dist/workflow/try-catch.test.d.ts +1 -0
- package/dist/workflow/try-catch.test.js +443 -0
- package/dist/workflow/try-catch.test.js.map +1 -0
- package/dist/workflow/types.d.ts +103 -0
- package/dist/workflow/types.js +17 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/workflow.d.ts +29 -0
- package/dist/workflow/workflow.js +57 -0
- package/dist/workflow/workflow.js.map +1 -0
- package/dist/workflow/workflow.test.d.ts +1 -0
- package/dist/workflow/workflow.test.js +189 -0
- package/dist/workflow/workflow.test.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
// generated by polka.codes
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
3
|
+
import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { SkillDiscoveryService } from '../discovery';
|
|
6
|
+
import { SkillValidationError } from '../types';
|
|
7
|
+
import { validateSkillMetadata, validateSkillReferences, validateSkillSecurity } from '../validation';
|
|
8
|
+
describe('Skill Validation', () => {
|
|
9
|
+
const testDir = join(process.cwd(), 'test-skills-validation');
|
|
10
|
+
const skillsDir = join(testDir, 'skills');
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
16
|
+
});
|
|
17
|
+
function createTestSkill(name, content) {
|
|
18
|
+
const skillDir = join(skillsDir, name);
|
|
19
|
+
mkdirSync(skillDir, { recursive: true });
|
|
20
|
+
writeFileSync(join(skillDir, 'SKILL.md'), content);
|
|
21
|
+
return skillDir;
|
|
22
|
+
}
|
|
23
|
+
describe('validateSkillSecurity', () => {
|
|
24
|
+
it('should accept valid skills within size limits', async () => {
|
|
25
|
+
const content = `---
|
|
26
|
+
name: test-skill
|
|
27
|
+
description: A test skill
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
${'x'.repeat(1000)}
|
|
31
|
+
`;
|
|
32
|
+
createTestSkill('test', content);
|
|
33
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
34
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
35
|
+
expect(() => validateSkillSecurity(skill)).not.toThrow();
|
|
36
|
+
});
|
|
37
|
+
it('should reject skills with oversized main content', async () => {
|
|
38
|
+
const content = `---
|
|
39
|
+
name: test-skill
|
|
40
|
+
description: A test skill
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
${'x'.repeat(2 * 1024 * 1024)} // 2MB
|
|
44
|
+
`;
|
|
45
|
+
createTestSkill('test', content);
|
|
46
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
47
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
48
|
+
expect(() => validateSkillSecurity(skill)).toThrow(SkillValidationError);
|
|
49
|
+
expect(() => validateSkillSecurity(skill)).toThrow(/exceeds size limit/);
|
|
50
|
+
});
|
|
51
|
+
it('should reject skills with oversized supporting files', async () => {
|
|
52
|
+
const skillDir = createTestSkill('test', `---
|
|
53
|
+
name: test-skill
|
|
54
|
+
description: A test skill
|
|
55
|
+
---
|
|
56
|
+
`);
|
|
57
|
+
writeFileSync(join(skillDir, 'large.txt'), 'x'.repeat(2 * 1024 * 1024));
|
|
58
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
59
|
+
// File size is now checked during loadSkill, not during validation
|
|
60
|
+
await expect(service.loadSkill(join(skillsDir, 'test'), 'project')).rejects.toThrow('File size exceeds limit');
|
|
61
|
+
});
|
|
62
|
+
it('should reject skills with oversized total size', async () => {
|
|
63
|
+
const skillDir = createTestSkill('test', `---
|
|
64
|
+
name: test-skill
|
|
65
|
+
description: A test skill
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
${'x'.repeat(500 * 1024)}
|
|
69
|
+
`);
|
|
70
|
+
// Add multiple 900KB files to exceed 10MB total (but each file is under 1MB limit)
|
|
71
|
+
for (let i = 0; i < 11; i++) {
|
|
72
|
+
const fileName = `large${i}.txt`;
|
|
73
|
+
writeFileSync(join(skillDir, fileName), 'y'.repeat(900 * 1024));
|
|
74
|
+
}
|
|
75
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
76
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
77
|
+
expect(() => validateSkillSecurity(skill)).toThrow(SkillValidationError);
|
|
78
|
+
expect(() => validateSkillSecurity(skill)).toThrow(/total size exceeds limit/);
|
|
79
|
+
});
|
|
80
|
+
it('should detect suspicious script tags', async () => {
|
|
81
|
+
const content = `---
|
|
82
|
+
name: test-skill
|
|
83
|
+
description: A test skill
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
<script>alert('xss')</script>
|
|
87
|
+
`;
|
|
88
|
+
createTestSkill('test', content);
|
|
89
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
90
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
91
|
+
// First verify the skill has the script tag
|
|
92
|
+
expect(skill.content).toContain('<script>');
|
|
93
|
+
// Now check that validation throws
|
|
94
|
+
expect(() => validateSkillSecurity(skill)).toThrow(SkillValidationError);
|
|
95
|
+
});
|
|
96
|
+
it('should detect javascript: URLs', async () => {
|
|
97
|
+
const content = `---
|
|
98
|
+
name: test-skill
|
|
99
|
+
description: A test skill
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
Click [here](javascript:alert('xss'))
|
|
103
|
+
`;
|
|
104
|
+
createTestSkill('test', content);
|
|
105
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
106
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
107
|
+
expect(() => validateSkillSecurity(skill)).toThrow(SkillValidationError);
|
|
108
|
+
});
|
|
109
|
+
it('should detect event handlers', async () => {
|
|
110
|
+
const content = `---
|
|
111
|
+
name: test-skill
|
|
112
|
+
description: A test skill
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
<div onclick="malicious()">
|
|
116
|
+
`;
|
|
117
|
+
createTestSkill('test', content);
|
|
118
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
119
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
120
|
+
expect(() => validateSkillSecurity(skill)).toThrow(SkillValidationError);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('validateSkillReferences', () => {
|
|
124
|
+
it('should warn about external references without disclosure', async () => {
|
|
125
|
+
const content = `---
|
|
126
|
+
name: test-skill
|
|
127
|
+
description: A test skill
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
See https://example.com for more info.
|
|
131
|
+
`;
|
|
132
|
+
createTestSkill('test', content);
|
|
133
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
134
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
135
|
+
const warnings = validateSkillReferences(skill);
|
|
136
|
+
expect(warnings.length).toBeGreaterThan(0);
|
|
137
|
+
expect(warnings.some((w) => w.includes('external references'))).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
it('should not warn about external references if disclosed', async () => {
|
|
140
|
+
const content = `---
|
|
141
|
+
name: test-skill
|
|
142
|
+
description: A test skill with external documentation and network resources
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
See https://example.com for more info.
|
|
146
|
+
`;
|
|
147
|
+
createTestSkill('test', content);
|
|
148
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
149
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
150
|
+
const warnings = validateSkillReferences(skill);
|
|
151
|
+
expect(warnings.some((w) => w.includes('external references'))).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
it('should warn about missing referenced files', async () => {
|
|
154
|
+
const content = `---
|
|
155
|
+
name: test-skill
|
|
156
|
+
description: A test skill
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
See [reference](reference.md) for details.
|
|
160
|
+
`;
|
|
161
|
+
createTestSkill('test', content);
|
|
162
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
163
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
164
|
+
const warnings = validateSkillReferences(skill);
|
|
165
|
+
expect(warnings).toContain('Referenced file not found: reference.md');
|
|
166
|
+
});
|
|
167
|
+
it('should not warn about existing referenced files', async () => {
|
|
168
|
+
const skillDir = createTestSkill('test', `---
|
|
169
|
+
name: test-skill
|
|
170
|
+
description: A test skill
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
See [reference](reference.md) for details.
|
|
174
|
+
`);
|
|
175
|
+
writeFileSync(join(skillDir, 'reference.md'), '# Reference');
|
|
176
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
177
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
178
|
+
const warnings = validateSkillReferences(skill);
|
|
179
|
+
expect(warnings.some((w) => w.includes('reference.md'))).toBe(false);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('validateSkillMetadata', () => {
|
|
183
|
+
it('should accept valid metadata', async () => {
|
|
184
|
+
const content = `---
|
|
185
|
+
name: test-skill
|
|
186
|
+
description: A meaningful description for testing
|
|
187
|
+
---
|
|
188
|
+
`;
|
|
189
|
+
createTestSkill('test', content);
|
|
190
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
191
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
192
|
+
const errors = validateSkillMetadata(skill);
|
|
193
|
+
expect(errors).toHaveLength(0);
|
|
194
|
+
});
|
|
195
|
+
it('should reject descriptions that are too short', async () => {
|
|
196
|
+
const content = `---
|
|
197
|
+
name: test-skill
|
|
198
|
+
description: Too short
|
|
199
|
+
---
|
|
200
|
+
`;
|
|
201
|
+
createTestSkill('test', content);
|
|
202
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
203
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
204
|
+
const errors = validateSkillMetadata(skill);
|
|
205
|
+
expect(errors.some((e) => e.includes('too short'))).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
it('should accept descriptions that are exactly 20 characters', async () => {
|
|
208
|
+
const content = `---
|
|
209
|
+
name: test-skill
|
|
210
|
+
description: Exactly 20 chars long!
|
|
211
|
+
---
|
|
212
|
+
`;
|
|
213
|
+
createTestSkill('test', content);
|
|
214
|
+
const service = new SkillDiscoveryService({ cwd: testDir });
|
|
215
|
+
const skill = await service.loadSkill(join(skillsDir, 'test'), 'project');
|
|
216
|
+
const errors = validateSkillMetadata(skill);
|
|
217
|
+
expect(errors.some((e) => e.includes('too short'))).toBe(false);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
//# sourceMappingURL=validation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../src/skills/__tests__/validation.test.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAEzC,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,SAAS,eAAe,CAAC,IAAY,EAAE,OAAe;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACtC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACxC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;QAClD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,OAAO,GAAG;;;;;EAKpB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;CACjB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,OAAO,GAAG;;;;;EAKpB,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAC5B,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;YACxE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,QAAQ,GAAG,eAAe,CAC9B,MAAM,EACN;;;;CAIP,CACM,CAAA;YAED,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAA;YAEvE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAE3D,mEAAmE;YACnE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;QAChH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,QAAQ,GAAG,eAAe,CAC9B,MAAM,EACN;;;;;EAKN,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;CACvB,CACM,CAAA;YAED,mFAAmF;YACnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAA;gBAChC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAA;YACjE,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;YACxE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG;;;;;;CAMrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,4CAA4C;YAC5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAE3C,mCAAmC;YACnC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG;;;;;;CAMrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,OAAO,GAAG;;;;;;CAMrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,OAAO,GAAG;;;;;;CAMrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;YAE/C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,OAAO,GAAG;;;;;;CAMrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;YAE/C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,OAAO,GAAG;;;;;;CAMrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;YAE/C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAA;QACvE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,QAAQ,GAAG,eAAe,CAC9B,MAAM,EACN;;;;;;CAMP,CACM,CAAA;YAED,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,aAAa,CAAC,CAAA;YAE5D,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;YAE/C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,OAAO,GAAG;;;;CAIrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;YAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,OAAO,GAAG;;;;CAIrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;YAE3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,OAAO,GAAG;;;;CAIrB,CAAA;YAEK,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAEhC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAA;YAEzE,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;YAE3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for Agent Skills system
|
|
3
|
+
*/
|
|
4
|
+
export declare const SKILL_LIMITS: {
|
|
5
|
+
readonly MAX_FILE_SIZE: number;
|
|
6
|
+
readonly MAX_SKILL_SIZE: number;
|
|
7
|
+
readonly MAX_DEPTH: 10;
|
|
8
|
+
readonly MAX_FILES: 500;
|
|
9
|
+
readonly MIN_DESCRIPTION_LENGTH: 20;
|
|
10
|
+
readonly MAX_DESCRIPTION_LENGTH: 1024;
|
|
11
|
+
readonly MAX_NAME_LENGTH: 64;
|
|
12
|
+
};
|
|
13
|
+
export declare const IGNORED_DIRECTORIES: readonly [".git", "node_modules", ".next", ".turbo", "dist", "build", "coverage", ".cache", ".vscode", ".idea", "tmp", "temp", ".DS_Store"];
|
|
14
|
+
/**
|
|
15
|
+
* Security validation patterns to detect suspicious content
|
|
16
|
+
*
|
|
17
|
+
* Note: Patterns use case-insensitive flag (/i) but NOT global (/g) to avoid
|
|
18
|
+
* stateful lastIndex issues when RegExp.test() is called multiple times.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SUSPICIOUS_PATTERNS: readonly [RegExp, RegExp, RegExp];
|
|
21
|
+
export declare const SKILL_ERROR_MESSAGES: {
|
|
22
|
+
readonly MISSING_FRONTMATTER: "SKILL.md must begin with YAML frontmatter enclosed in ---";
|
|
23
|
+
readonly FRONTMATTER_INVALID: "Invalid frontmatter: {message}";
|
|
24
|
+
readonly SKILL_NOT_FOUND: "Skill not found";
|
|
25
|
+
readonly CONTEXT_NOT_INITIALIZED: "Skill context not initialized";
|
|
26
|
+
};
|
|
27
|
+
export declare const SOURCE_ICONS: {
|
|
28
|
+
readonly project: "📁";
|
|
29
|
+
readonly personal: "🏠";
|
|
30
|
+
readonly plugin: "🔌";
|
|
31
|
+
};
|
|
32
|
+
export type SkillSource = keyof typeof SOURCE_ICONS;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for Agent Skills system
|
|
3
|
+
*/
|
|
4
|
+
export const SKILL_LIMITS = {
|
|
5
|
+
MAX_FILE_SIZE: 1024 * 1024, // 1MB per file
|
|
6
|
+
MAX_SKILL_SIZE: 10 * 1024 * 1024, // 10MB total
|
|
7
|
+
MAX_DEPTH: 10, // Maximum directory recursion depth
|
|
8
|
+
MAX_FILES: 500, // Maximum files to load per skill
|
|
9
|
+
MIN_DESCRIPTION_LENGTH: 20, // Minimum description length
|
|
10
|
+
MAX_DESCRIPTION_LENGTH: 1024, // Maximum description length
|
|
11
|
+
MAX_NAME_LENGTH: 64, // Maximum skill name length
|
|
12
|
+
};
|
|
13
|
+
export const IGNORED_DIRECTORIES = [
|
|
14
|
+
'.git',
|
|
15
|
+
'node_modules',
|
|
16
|
+
'.next',
|
|
17
|
+
'.turbo',
|
|
18
|
+
'dist',
|
|
19
|
+
'build',
|
|
20
|
+
'coverage',
|
|
21
|
+
'.cache',
|
|
22
|
+
'.vscode',
|
|
23
|
+
'.idea',
|
|
24
|
+
'tmp',
|
|
25
|
+
'temp',
|
|
26
|
+
'.DS_Store',
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Security validation patterns to detect suspicious content
|
|
30
|
+
*
|
|
31
|
+
* Note: Patterns use case-insensitive flag (/i) but NOT global (/g) to avoid
|
|
32
|
+
* stateful lastIndex issues when RegExp.test() is called multiple times.
|
|
33
|
+
*/
|
|
34
|
+
export const SUSPICIOUS_PATTERNS = [
|
|
35
|
+
/<script[^>]*>[\s\S]*?<\/script>/i, // Script tags (with dotAll for multiline)
|
|
36
|
+
/javascript:/i, // JavaScript URLs
|
|
37
|
+
/on\w+\s*=/i, // Event handlers (onclick, onload, etc.)
|
|
38
|
+
];
|
|
39
|
+
export const SKILL_ERROR_MESSAGES = {
|
|
40
|
+
MISSING_FRONTMATTER: 'SKILL.md must begin with YAML frontmatter enclosed in ---',
|
|
41
|
+
FRONTMATTER_INVALID: 'Invalid frontmatter: {message}',
|
|
42
|
+
SKILL_NOT_FOUND: 'Skill not found',
|
|
43
|
+
CONTEXT_NOT_INITIALIZED: 'Skill context not initialized',
|
|
44
|
+
};
|
|
45
|
+
export const SOURCE_ICONS = {
|
|
46
|
+
project: '📁',
|
|
47
|
+
personal: '🏠',
|
|
48
|
+
plugin: '🔌',
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/skills/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa,EAAE,IAAI,GAAG,IAAI,EAAE,eAAe;IAC3C,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,aAAa;IAC/C,SAAS,EAAE,EAAE,EAAE,oCAAoC;IACnD,SAAS,EAAE,GAAG,EAAE,kCAAkC;IAClD,sBAAsB,EAAE,EAAE,EAAE,6BAA6B;IACzD,sBAAsB,EAAE,IAAI,EAAE,6BAA6B;IAC3D,eAAe,EAAE,EAAE,EAAE,4BAA4B;CACzC,CAAA;AAEV,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM;IACN,cAAc;IACd,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,KAAK;IACL,MAAM;IACN,WAAW;CACH,CAAA;AAEV;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,kCAAkC,EAAE,0CAA0C;IAC9E,cAAc,EAAE,kBAAkB;IAClC,YAAY,EAAE,yCAAyC;CAC/C,CAAA;AAEV,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,mBAAmB,EAAE,2DAA2D;IAChF,mBAAmB,EAAE,gCAAgC;IACrD,eAAe,EAAE,iBAAiB;IAClC,uBAAuB,EAAE,+BAA+B;CAChD,CAAA;AAEV,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;CACJ,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { FileSystemProvider } from '../fs';
|
|
2
|
+
import type { Skill, SkillContext, SkillReference } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Service for discovering and loading Agent Skills from filesystem
|
|
5
|
+
*
|
|
6
|
+
* Skills are discovered from three sources with priority:
|
|
7
|
+
* 1. Project skills at .claude/skills/ (highest priority)
|
|
8
|
+
* 2. Personal skills at ~/.claude/skills/
|
|
9
|
+
* 3. Plugin skills at node_modules (lowest priority)
|
|
10
|
+
*/
|
|
11
|
+
export declare class SkillDiscoveryService {
|
|
12
|
+
private fs;
|
|
13
|
+
private personalSkillsDir;
|
|
14
|
+
private projectSkillsDir;
|
|
15
|
+
private pluginSkillsDirs;
|
|
16
|
+
constructor(options: {
|
|
17
|
+
cwd: string;
|
|
18
|
+
personalSkillsDir?: string;
|
|
19
|
+
pluginSkillsDirs?: string[];
|
|
20
|
+
fs?: FileSystemProvider;
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Discover all available skills from all sources
|
|
24
|
+
* Removes duplicates (project skills take priority over personal/plugin)
|
|
25
|
+
*/
|
|
26
|
+
discoverAll(): Promise<SkillReference[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Discover skills in a specific directory
|
|
29
|
+
*/
|
|
30
|
+
discoverInDirectory(dir: string, source: 'personal' | 'project' | 'plugin'): Promise<SkillReference[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Discover skills from plugin directories (node_modules)
|
|
33
|
+
*/
|
|
34
|
+
discoverPlugins(): Promise<SkillReference[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Load a single skill from its directory
|
|
37
|
+
*/
|
|
38
|
+
loadSkill(skillPath: string, source: 'personal' | 'project' | 'plugin'): Promise<Skill>;
|
|
39
|
+
/**
|
|
40
|
+
* Parse SKILL.md content and extract frontmatter
|
|
41
|
+
*/
|
|
42
|
+
private parseSkillMd;
|
|
43
|
+
/**
|
|
44
|
+
* Parse and validate YAML frontmatter
|
|
45
|
+
*/
|
|
46
|
+
private parseMetadata;
|
|
47
|
+
/**
|
|
48
|
+
* Recursively load files from a directory into the files map
|
|
49
|
+
* @returns The total size of all files loaded (in bytes)
|
|
50
|
+
*/
|
|
51
|
+
private loadDirectoryFiles;
|
|
52
|
+
/**
|
|
53
|
+
* Create an initial skill context object
|
|
54
|
+
*/
|
|
55
|
+
createContext(): Promise<SkillContext>;
|
|
56
|
+
}
|