@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.
Files changed (250) hide show
  1. package/dist/Agent/backoff.d.ts +7 -0
  2. package/dist/Agent/backoff.js +21 -0
  3. package/dist/Agent/backoff.js.map +1 -0
  4. package/dist/Agent/index.d.ts +2 -0
  5. package/dist/Agent/index.js +3 -0
  6. package/dist/Agent/index.js.map +1 -0
  7. package/dist/Agent/parseJsonFromMarkdown.d.ts +8 -0
  8. package/dist/Agent/parseJsonFromMarkdown.js +34 -0
  9. package/dist/Agent/parseJsonFromMarkdown.js.map +1 -0
  10. package/dist/Agent/parseJsonFromMarkdown.test.d.ts +1 -0
  11. package/dist/Agent/parseJsonFromMarkdown.test.js +70 -0
  12. package/dist/Agent/parseJsonFromMarkdown.test.js.map +1 -0
  13. package/dist/Agent/prompts.d.ts +9 -0
  14. package/dist/Agent/prompts.js +107 -0
  15. package/dist/Agent/prompts.js.map +1 -0
  16. package/dist/UsageMeter.d.ts +101 -0
  17. package/dist/UsageMeter.js +299 -0
  18. package/dist/UsageMeter.js.map +1 -0
  19. package/dist/UsageMeter.test.d.ts +4 -0
  20. package/dist/UsageMeter.test.js +556 -0
  21. package/dist/UsageMeter.test.js.map +1 -0
  22. package/dist/config/base.d.ts +68 -0
  23. package/dist/config/base.js +56 -0
  24. package/dist/config/base.js.map +1 -0
  25. package/dist/config/memory.d.ts +24 -0
  26. package/dist/config/memory.js +36 -0
  27. package/dist/config/memory.js.map +1 -0
  28. package/dist/config.d.ts +236 -0
  29. package/dist/config.js +184 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/errors/base.d.ts +31 -0
  32. package/dist/errors/base.js +60 -0
  33. package/dist/errors/base.js.map +1 -0
  34. package/dist/errors/index.d.ts +1 -0
  35. package/dist/errors/index.js +3 -0
  36. package/dist/errors/index.js.map +1 -0
  37. package/dist/fs/index.d.ts +2 -0
  38. package/dist/fs/index.js +3 -0
  39. package/dist/fs/index.js.map +1 -0
  40. package/dist/fs/node-provider.d.ts +16 -0
  41. package/dist/fs/node-provider.js +47 -0
  42. package/dist/fs/node-provider.js.map +1 -0
  43. package/dist/fs/provider.d.ts +61 -0
  44. package/dist/fs/provider.js +3 -0
  45. package/dist/fs/provider.js.map +1 -0
  46. package/dist/index.d.ts +20 -191
  47. package/dist/index.js +21 -4123
  48. package/dist/index.js.map +1 -0
  49. package/dist/memory/index.d.ts +1 -0
  50. package/dist/memory/index.js +2 -0
  51. package/dist/memory/index.js.map +1 -0
  52. package/dist/memory/types.d.ts +136 -0
  53. package/dist/memory/types.js +2 -0
  54. package/dist/memory/types.js.map +1 -0
  55. package/dist/path.d.ts +9 -0
  56. package/dist/path.js +68 -0
  57. package/dist/path.js.map +1 -0
  58. package/dist/path.test.d.ts +1 -0
  59. package/dist/path.test.js +82 -0
  60. package/dist/path.test.js.map +1 -0
  61. package/dist/pricing/converter.d.ts +6 -0
  62. package/dist/pricing/converter.js +13 -0
  63. package/dist/pricing/converter.js.map +1 -0
  64. package/dist/pricing/converter.test.d.ts +1 -0
  65. package/dist/pricing/converter.test.js +54 -0
  66. package/dist/pricing/converter.test.js.map +1 -0
  67. package/dist/pricing/index.d.ts +2 -0
  68. package/dist/pricing/index.js +2 -0
  69. package/dist/pricing/index.js.map +1 -0
  70. package/dist/pricing/portkey-client.d.ts +2 -0
  71. package/dist/pricing/portkey-client.js +57 -0
  72. package/dist/pricing/portkey-client.js.map +1 -0
  73. package/dist/pricing/pricing-service.d.ts +6 -0
  74. package/dist/pricing/pricing-service.js +125 -0
  75. package/dist/pricing/pricing-service.js.map +1 -0
  76. package/dist/pricing/pricing-service.test.d.ts +1 -0
  77. package/dist/pricing/pricing-service.test.js +141 -0
  78. package/dist/pricing/pricing-service.test.js.map +1 -0
  79. package/dist/pricing/types.d.ts +24 -0
  80. package/dist/pricing/types.js +2 -0
  81. package/dist/pricing/types.js.map +1 -0
  82. package/dist/skills/__tests__/discovery.test.d.ts +1 -0
  83. package/dist/skills/__tests__/discovery.test.js +254 -0
  84. package/dist/skills/__tests__/discovery.test.js.map +1 -0
  85. package/dist/skills/__tests__/validation.test.d.ts +1 -0
  86. package/dist/skills/__tests__/validation.test.js +221 -0
  87. package/dist/skills/__tests__/validation.test.js.map +1 -0
  88. package/dist/skills/constants.d.ts +32 -0
  89. package/dist/skills/constants.js +50 -0
  90. package/dist/skills/constants.js.map +1 -0
  91. package/dist/skills/discovery.d.ts +56 -0
  92. package/dist/skills/discovery.js +392 -0
  93. package/dist/skills/discovery.js.map +1 -0
  94. package/dist/skills/index.d.ts +4 -0
  95. package/dist/skills/index.js +6 -0
  96. package/dist/skills/index.js.map +1 -0
  97. package/dist/skills/tools/index.d.ts +3 -0
  98. package/dist/skills/tools/index.js +5 -0
  99. package/dist/skills/tools/index.js.map +1 -0
  100. package/dist/skills/tools/listSkills.d.ts +54 -0
  101. package/dist/skills/tools/listSkills.js +52 -0
  102. package/dist/skills/tools/listSkills.js.map +1 -0
  103. package/dist/skills/tools/loadSkill.d.ts +52 -0
  104. package/dist/skills/tools/loadSkill.js +86 -0
  105. package/dist/skills/tools/loadSkill.js.map +1 -0
  106. package/dist/skills/tools/readSkillFile.d.ts +43 -0
  107. package/dist/skills/tools/readSkillFile.js +68 -0
  108. package/dist/skills/tools/readSkillFile.js.map +1 -0
  109. package/dist/skills/types.d.ts +83 -0
  110. package/dist/skills/types.js +42 -0
  111. package/dist/skills/types.js.map +1 -0
  112. package/dist/skills/validation.d.ts +30 -0
  113. package/dist/skills/validation.js +133 -0
  114. package/dist/skills/validation.js.map +1 -0
  115. package/dist/tool.d.ts +51 -0
  116. package/dist/tool.js +2 -0
  117. package/dist/tool.js.map +1 -0
  118. package/dist/tools/askFollowupQuestion.d.ts +35 -0
  119. package/dist/tools/askFollowupQuestion.js +105 -0
  120. package/dist/tools/askFollowupQuestion.js.map +1 -0
  121. package/dist/tools/askFollowupQuestion.test.d.ts +1 -0
  122. package/dist/tools/askFollowupQuestion.test.js +80 -0
  123. package/dist/tools/askFollowupQuestion.test.js.map +1 -0
  124. package/dist/tools/executeCommand.d.ts +29 -0
  125. package/dist/tools/executeCommand.js +82 -0
  126. package/dist/tools/executeCommand.js.map +1 -0
  127. package/dist/tools/executeCommand.test.d.ts +1 -0
  128. package/dist/tools/executeCommand.test.js +60 -0
  129. package/dist/tools/executeCommand.test.js.map +1 -0
  130. package/dist/tools/fetchUrl.d.ts +26 -0
  131. package/dist/tools/fetchUrl.js +85 -0
  132. package/dist/tools/fetchUrl.js.map +1 -0
  133. package/dist/tools/index.d.ts +15 -0
  134. package/dist/tools/index.js +17 -0
  135. package/dist/tools/index.js.map +1 -0
  136. package/dist/tools/listFiles.d.ts +35 -0
  137. package/dist/tools/listFiles.js +61 -0
  138. package/dist/tools/listFiles.js.map +1 -0
  139. package/dist/tools/listFiles.test.d.ts +1 -0
  140. package/dist/tools/listFiles.test.js +59 -0
  141. package/dist/tools/listFiles.test.js.map +1 -0
  142. package/dist/tools/provider.d.ts +76 -0
  143. package/dist/tools/provider.js +60 -0
  144. package/dist/tools/provider.js.map +1 -0
  145. package/dist/tools/readBinaryFile.d.ts +26 -0
  146. package/dist/tools/readBinaryFile.js +52 -0
  147. package/dist/tools/readBinaryFile.js.map +1 -0
  148. package/dist/tools/readFile.d.ts +35 -0
  149. package/dist/tools/readFile.js +128 -0
  150. package/dist/tools/readFile.js.map +1 -0
  151. package/dist/tools/readFile.test.d.ts +1 -0
  152. package/dist/tools/readFile.test.js +37 -0
  153. package/dist/tools/readFile.test.js.map +1 -0
  154. package/dist/tools/removeFile.d.ts +26 -0
  155. package/dist/tools/removeFile.js +49 -0
  156. package/dist/tools/removeFile.js.map +1 -0
  157. package/dist/tools/removeFile.test.d.ts +1 -0
  158. package/dist/tools/removeFile.test.js +32 -0
  159. package/dist/tools/removeFile.test.js.map +1 -0
  160. package/dist/tools/renameFile.d.ts +29 -0
  161. package/dist/tools/renameFile.js +48 -0
  162. package/dist/tools/renameFile.js.map +1 -0
  163. package/dist/tools/renameFile.test.d.ts +1 -0
  164. package/dist/tools/renameFile.test.js +53 -0
  165. package/dist/tools/renameFile.test.js.map +1 -0
  166. package/dist/tools/replaceInFile.d.ts +29 -0
  167. package/dist/tools/replaceInFile.js +233 -0
  168. package/dist/tools/replaceInFile.js.map +1 -0
  169. package/dist/tools/replaceInFile.test.d.ts +1 -0
  170. package/dist/tools/replaceInFile.test.js +79 -0
  171. package/dist/tools/replaceInFile.test.js.map +1 -0
  172. package/dist/tools/response-builders.d.ts +64 -0
  173. package/dist/tools/response-builders.js +88 -0
  174. package/dist/tools/response-builders.js.map +1 -0
  175. package/dist/tools/search.d.ts +26 -0
  176. package/dist/tools/search.js +56 -0
  177. package/dist/tools/search.js.map +1 -0
  178. package/dist/tools/search.test.d.ts +1 -0
  179. package/dist/tools/search.test.js +22 -0
  180. package/dist/tools/search.test.js.map +1 -0
  181. package/dist/tools/searchFiles.d.ts +32 -0
  182. package/dist/tools/searchFiles.js +86 -0
  183. package/dist/tools/searchFiles.js.map +1 -0
  184. package/dist/tools/todo.d.ts +37 -0
  185. package/dist/tools/todo.js +41 -0
  186. package/dist/tools/todo.js.map +1 -0
  187. package/dist/tools/utils/index.d.ts +1 -0
  188. package/dist/tools/utils/index.js +2 -0
  189. package/dist/tools/utils/index.js.map +1 -0
  190. package/dist/tools/utils/replaceInFile.d.ts +7 -0
  191. package/dist/tools/utils/replaceInFile.js +133 -0
  192. package/dist/tools/utils/replaceInFile.js.map +1 -0
  193. package/dist/tools/utils/replaceInFile.test.d.ts +1 -0
  194. package/dist/tools/utils/replaceInFile.test.js +308 -0
  195. package/dist/tools/utils/replaceInFile.test.js.map +1 -0
  196. package/dist/tools/utils.d.ts +10 -0
  197. package/dist/tools/utils.js +27 -0
  198. package/dist/tools/utils.js.map +1 -0
  199. package/dist/tools/writeToFile.d.ts +29 -0
  200. package/dist/tools/writeToFile.js +85 -0
  201. package/dist/tools/writeToFile.js.map +1 -0
  202. package/dist/tools/writeToFile.test.d.ts +1 -0
  203. package/dist/tools/writeToFile.test.js +46 -0
  204. package/dist/tools/writeToFile.test.js.map +1 -0
  205. package/dist/utils/index.d.ts +1 -0
  206. package/dist/utils/index.js +3 -0
  207. package/dist/utils/index.js.map +1 -0
  208. package/dist/utils/merge.d.ts +26 -0
  209. package/dist/utils/merge.js +45 -0
  210. package/dist/utils/merge.js.map +1 -0
  211. package/dist/workflow/agent.workflow.d.ts +39 -0
  212. package/dist/workflow/agent.workflow.js +166 -0
  213. package/dist/workflow/agent.workflow.js.map +1 -0
  214. package/dist/workflow/agent.workflow.test.d.ts +1 -0
  215. package/dist/workflow/agent.workflow.test.js +175 -0
  216. package/dist/workflow/agent.workflow.test.js.map +1 -0
  217. package/dist/workflow/control-flow.test.d.ts +1 -0
  218. package/dist/workflow/control-flow.test.js +323 -0
  219. package/dist/workflow/control-flow.test.js.map +1 -0
  220. package/dist/workflow/dynamic-edge-cases.test.d.ts +1 -0
  221. package/dist/workflow/dynamic-edge-cases.test.js +486 -0
  222. package/dist/workflow/dynamic-edge-cases.test.js.map +1 -0
  223. package/dist/workflow/dynamic-types.d.ts +124 -0
  224. package/dist/workflow/dynamic-types.js +105 -0
  225. package/dist/workflow/dynamic-types.js.map +1 -0
  226. package/dist/workflow/dynamic.d.ts +118 -0
  227. package/dist/workflow/dynamic.js +999 -0
  228. package/dist/workflow/dynamic.js.map +1 -0
  229. package/dist/workflow/index.d.ts +6 -0
  230. package/dist/workflow/index.js +8 -0
  231. package/dist/workflow/index.js.map +1 -0
  232. package/dist/workflow/json-ai-types.d.ts +122 -0
  233. package/dist/workflow/json-ai-types.js +144 -0
  234. package/dist/workflow/json-ai-types.js.map +1 -0
  235. package/dist/workflow/json-schema-conversion.test.d.ts +1 -0
  236. package/dist/workflow/json-schema-conversion.test.js +371 -0
  237. package/dist/workflow/json-schema-conversion.test.js.map +1 -0
  238. package/dist/workflow/try-catch.test.d.ts +1 -0
  239. package/dist/workflow/try-catch.test.js +443 -0
  240. package/dist/workflow/try-catch.test.js.map +1 -0
  241. package/dist/workflow/types.d.ts +103 -0
  242. package/dist/workflow/types.js +17 -0
  243. package/dist/workflow/types.js.map +1 -0
  244. package/dist/workflow/workflow.d.ts +29 -0
  245. package/dist/workflow/workflow.js +57 -0
  246. package/dist/workflow/workflow.js.map +1 -0
  247. package/dist/workflow/workflow.test.d.ts +1 -0
  248. package/dist/workflow/workflow.test.js +189 -0
  249. package/dist/workflow/workflow.test.js.map +1 -0
  250. 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":"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"}
@@ -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
+ }