@skillsmith/mcp-server 0.1.0

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 (306) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/src/__tests__/get-skill.test.d.ts +6 -0
  3. package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
  4. package/dist/src/__tests__/get-skill.test.js +88 -0
  5. package/dist/src/__tests__/get-skill.test.js.map +1 -0
  6. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
  7. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
  8. package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
  9. package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
  10. package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
  11. package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/middleware/license.test.js +500 -0
  13. package/dist/src/__tests__/middleware/license.test.js.map +1 -0
  14. package/dist/src/__tests__/search.test.d.ts +6 -0
  15. package/dist/src/__tests__/search.test.d.ts.map +1 -0
  16. package/dist/src/__tests__/search.test.js +86 -0
  17. package/dist/src/__tests__/search.test.js.map +1 -0
  18. package/dist/src/__tests__/test-utils.d.ts +19 -0
  19. package/dist/src/__tests__/test-utils.d.ts.map +1 -0
  20. package/dist/src/__tests__/test-utils.js +87 -0
  21. package/dist/src/__tests__/test-utils.js.map +1 -0
  22. package/dist/src/context/index.d.ts +19 -0
  23. package/dist/src/context/index.d.ts.map +1 -0
  24. package/dist/src/context/index.js +25 -0
  25. package/dist/src/context/index.js.map +1 -0
  26. package/dist/src/context/project-detector.d.ts +145 -0
  27. package/dist/src/context/project-detector.d.ts.map +1 -0
  28. package/dist/src/context/project-detector.js +321 -0
  29. package/dist/src/context/project-detector.js.map +1 -0
  30. package/dist/src/context.d.ts +100 -0
  31. package/dist/src/context.d.ts.map +1 -0
  32. package/dist/src/context.js +157 -0
  33. package/dist/src/context.js.map +1 -0
  34. package/dist/src/core-shim.d.ts +7 -0
  35. package/dist/src/core-shim.d.ts.map +1 -0
  36. package/dist/src/core-shim.js +9 -0
  37. package/dist/src/core-shim.js.map +1 -0
  38. package/dist/src/health/healthCheck.d.ts +88 -0
  39. package/dist/src/health/healthCheck.d.ts.map +1 -0
  40. package/dist/src/health/healthCheck.js +117 -0
  41. package/dist/src/health/healthCheck.js.map +1 -0
  42. package/dist/src/health/index.d.ts +21 -0
  43. package/dist/src/health/index.d.ts.map +1 -0
  44. package/dist/src/health/index.js +21 -0
  45. package/dist/src/health/index.js.map +1 -0
  46. package/dist/src/health/readinessCheck.d.ts +139 -0
  47. package/dist/src/health/readinessCheck.d.ts.map +1 -0
  48. package/dist/src/health/readinessCheck.js +266 -0
  49. package/dist/src/health/readinessCheck.js.map +1 -0
  50. package/dist/src/index.d.ts +8 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +178 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/dist/src/index.test.d.ts +2 -0
  55. package/dist/src/index.test.d.ts.map +1 -0
  56. package/dist/src/index.test.js +43 -0
  57. package/dist/src/index.test.js.map +1 -0
  58. package/dist/src/logger.d.ts +26 -0
  59. package/dist/src/logger.d.ts.map +1 -0
  60. package/dist/src/logger.js +179 -0
  61. package/dist/src/logger.js.map +1 -0
  62. package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
  63. package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
  64. package/dist/src/middleware/__tests__/csp.test.js +389 -0
  65. package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
  66. package/dist/src/middleware/csp.d.ts +87 -0
  67. package/dist/src/middleware/csp.d.ts.map +1 -0
  68. package/dist/src/middleware/csp.js +273 -0
  69. package/dist/src/middleware/csp.js.map +1 -0
  70. package/dist/src/middleware/degradation.d.ts +99 -0
  71. package/dist/src/middleware/degradation.d.ts.map +1 -0
  72. package/dist/src/middleware/degradation.js +315 -0
  73. package/dist/src/middleware/degradation.js.map +1 -0
  74. package/dist/src/middleware/errorFormatter.d.ts +119 -0
  75. package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
  76. package/dist/src/middleware/errorFormatter.js +294 -0
  77. package/dist/src/middleware/errorFormatter.js.map +1 -0
  78. package/dist/src/middleware/index.d.ts +10 -0
  79. package/dist/src/middleware/index.d.ts.map +1 -0
  80. package/dist/src/middleware/index.js +14 -0
  81. package/dist/src/middleware/index.js.map +1 -0
  82. package/dist/src/middleware/license.d.ts +161 -0
  83. package/dist/src/middleware/license.d.ts.map +1 -0
  84. package/dist/src/middleware/license.js +281 -0
  85. package/dist/src/middleware/license.js.map +1 -0
  86. package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
  87. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
  88. package/dist/src/middleware/toolFeatureMapping.js +90 -0
  89. package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
  90. package/dist/src/onboarding/first-run.d.ts +64 -0
  91. package/dist/src/onboarding/first-run.d.ts.map +1 -0
  92. package/dist/src/onboarding/first-run.js +77 -0
  93. package/dist/src/onboarding/first-run.js.map +1 -0
  94. package/dist/src/onboarding/index.d.ts +7 -0
  95. package/dist/src/onboarding/index.d.ts.map +1 -0
  96. package/dist/src/onboarding/index.js +7 -0
  97. package/dist/src/onboarding/index.js.map +1 -0
  98. package/dist/src/suggestions/index.d.ts +21 -0
  99. package/dist/src/suggestions/index.d.ts.map +1 -0
  100. package/dist/src/suggestions/index.js +20 -0
  101. package/dist/src/suggestions/index.js.map +1 -0
  102. package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
  103. package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
  104. package/dist/src/suggestions/suggestion-engine.js +352 -0
  105. package/dist/src/suggestions/suggestion-engine.js.map +1 -0
  106. package/dist/src/suggestions/types.d.ts +88 -0
  107. package/dist/src/suggestions/types.d.ts.map +1 -0
  108. package/dist/src/suggestions/types.js +21 -0
  109. package/dist/src/suggestions/types.js.map +1 -0
  110. package/dist/src/tools/analyze.d.ts +151 -0
  111. package/dist/src/tools/analyze.d.ts.map +1 -0
  112. package/dist/src/tools/analyze.js +205 -0
  113. package/dist/src/tools/analyze.js.map +1 -0
  114. package/dist/src/tools/compare.d.ts +149 -0
  115. package/dist/src/tools/compare.d.ts.map +1 -0
  116. package/dist/src/tools/compare.js +464 -0
  117. package/dist/src/tools/compare.js.map +1 -0
  118. package/dist/src/tools/get-skill.d.ts +116 -0
  119. package/dist/src/tools/get-skill.d.ts.map +1 -0
  120. package/dist/src/tools/get-skill.js +224 -0
  121. package/dist/src/tools/get-skill.js.map +1 -0
  122. package/dist/src/tools/index.d.ts +20 -0
  123. package/dist/src/tools/index.d.ts.map +1 -0
  124. package/dist/src/tools/index.js +20 -0
  125. package/dist/src/tools/index.js.map +1 -0
  126. package/dist/src/tools/install.d.ts +122 -0
  127. package/dist/src/tools/install.d.ts.map +1 -0
  128. package/dist/src/tools/install.js +314 -0
  129. package/dist/src/tools/install.js.map +1 -0
  130. package/dist/src/tools/recommend.d.ts +171 -0
  131. package/dist/src/tools/recommend.d.ts.map +1 -0
  132. package/dist/src/tools/recommend.js +325 -0
  133. package/dist/src/tools/recommend.js.map +1 -0
  134. package/dist/src/tools/search.d.ts +121 -0
  135. package/dist/src/tools/search.d.ts.map +1 -0
  136. package/dist/src/tools/search.js +249 -0
  137. package/dist/src/tools/search.js.map +1 -0
  138. package/dist/src/tools/suggest.d.ts +181 -0
  139. package/dist/src/tools/suggest.d.ts.map +1 -0
  140. package/dist/src/tools/suggest.js +342 -0
  141. package/dist/src/tools/suggest.js.map +1 -0
  142. package/dist/src/tools/uninstall.d.ts +123 -0
  143. package/dist/src/tools/uninstall.d.ts.map +1 -0
  144. package/dist/src/tools/uninstall.js +250 -0
  145. package/dist/src/tools/uninstall.js.map +1 -0
  146. package/dist/src/tools/validate.d.ts +122 -0
  147. package/dist/src/tools/validate.d.ts.map +1 -0
  148. package/dist/src/tools/validate.js +497 -0
  149. package/dist/src/tools/validate.js.map +1 -0
  150. package/dist/src/utils/installed-skills.d.ts +101 -0
  151. package/dist/src/utils/installed-skills.d.ts.map +1 -0
  152. package/dist/src/utils/installed-skills.js +220 -0
  153. package/dist/src/utils/installed-skills.js.map +1 -0
  154. package/dist/src/utils/validation.d.ts +76 -0
  155. package/dist/src/utils/validation.d.ts.map +1 -0
  156. package/dist/src/utils/validation.js +153 -0
  157. package/dist/src/utils/validation.js.map +1 -0
  158. package/dist/src/webhooks/index.d.ts +8 -0
  159. package/dist/src/webhooks/index.d.ts.map +1 -0
  160. package/dist/src/webhooks/index.js +9 -0
  161. package/dist/src/webhooks/index.js.map +1 -0
  162. package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
  163. package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
  164. package/dist/src/webhooks/webhook-endpoint.js +339 -0
  165. package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
  166. package/dist/tests/compare.test.d.ts +6 -0
  167. package/dist/tests/compare.test.d.ts.map +1 -0
  168. package/dist/tests/compare.test.js +225 -0
  169. package/dist/tests/compare.test.js.map +1 -0
  170. package/dist/tests/context/project-detector.test.d.ts +6 -0
  171. package/dist/tests/context/project-detector.test.d.ts.map +1 -0
  172. package/dist/tests/context/project-detector.test.js +719 -0
  173. package/dist/tests/context/project-detector.test.js.map +1 -0
  174. package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
  175. package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
  176. package/dist/tests/e2e/compare.e2e.test.js +286 -0
  177. package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
  178. package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
  179. package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
  180. package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
  181. package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
  182. package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
  183. package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
  184. package/dist/tests/e2e/recommend.e2e.test.js +347 -0
  185. package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
  186. package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
  187. package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
  188. package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
  189. package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
  190. package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
  191. package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
  192. package/dist/tests/e2e/suggest.e2e.test.js +347 -0
  193. package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
  194. package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
  195. package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
  196. package/dist/tests/e2e/utils/baseline-collector.js +211 -0
  197. package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
  198. package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
  199. package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
  200. package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
  201. package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
  202. package/dist/tests/e2e/utils/index.d.ts +7 -0
  203. package/dist/tests/e2e/utils/index.d.ts.map +1 -0
  204. package/dist/tests/e2e/utils/index.js +7 -0
  205. package/dist/tests/e2e/utils/index.js.map +1 -0
  206. package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
  207. package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
  208. package/dist/tests/e2e/utils/linear-reporter.js +232 -0
  209. package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
  210. package/dist/tests/health.test.d.ts +9 -0
  211. package/dist/tests/health.test.d.ts.map +1 -0
  212. package/dist/tests/health.test.js +308 -0
  213. package/dist/tests/health.test.js.map +1 -0
  214. package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
  215. package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
  216. package/dist/tests/integration/analyze.integration.test.js +244 -0
  217. package/dist/tests/integration/analyze.integration.test.js.map +1 -0
  218. package/dist/tests/integration/compare.integration.test.d.ts +2 -0
  219. package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
  220. package/dist/tests/integration/compare.integration.test.js +120 -0
  221. package/dist/tests/integration/compare.integration.test.js.map +1 -0
  222. package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
  223. package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
  224. package/dist/tests/integration/fixtures/test-skills.js +644 -0
  225. package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
  226. package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
  227. package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
  228. package/dist/tests/integration/get-skill.integration.test.js +203 -0
  229. package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
  230. package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
  231. package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
  232. package/dist/tests/integration/github-api.integration.test.js +190 -0
  233. package/dist/tests/integration/github-api.integration.test.js.map +1 -0
  234. package/dist/tests/integration/install.integration.test.d.ts +6 -0
  235. package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
  236. package/dist/tests/integration/install.integration.test.js +282 -0
  237. package/dist/tests/integration/install.integration.test.js.map +1 -0
  238. package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
  239. package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
  240. package/dist/tests/integration/recommend.integration.test.js +215 -0
  241. package/dist/tests/integration/recommend.integration.test.js.map +1 -0
  242. package/dist/tests/integration/search.integration.test.d.ts +6 -0
  243. package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
  244. package/dist/tests/integration/search.integration.test.js +229 -0
  245. package/dist/tests/integration/search.integration.test.js.map +1 -0
  246. package/dist/tests/integration/setup.d.ts +71 -0
  247. package/dist/tests/integration/setup.d.ts.map +1 -0
  248. package/dist/tests/integration/setup.js +124 -0
  249. package/dist/tests/integration/setup.js.map +1 -0
  250. package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
  251. package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
  252. package/dist/tests/integration/uninstall.integration.test.js +296 -0
  253. package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
  254. package/dist/tests/integration/validate.integration.test.d.ts +2 -0
  255. package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
  256. package/dist/tests/integration/validate.integration.test.js +181 -0
  257. package/dist/tests/integration/validate.integration.test.js.map +1 -0
  258. package/dist/tests/onboarding/first-run.test.d.ts +7 -0
  259. package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
  260. package/dist/tests/onboarding/first-run.test.js +258 -0
  261. package/dist/tests/onboarding/first-run.test.js.map +1 -0
  262. package/dist/tests/performance/search-performance.test.d.ts +10 -0
  263. package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
  264. package/dist/tests/performance/search-performance.test.js +218 -0
  265. package/dist/tests/performance/search-performance.test.js.map +1 -0
  266. package/dist/tests/recommend.test.d.ts +6 -0
  267. package/dist/tests/recommend.test.d.ts.map +1 -0
  268. package/dist/tests/recommend.test.js +208 -0
  269. package/dist/tests/recommend.test.js.map +1 -0
  270. package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
  271. package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
  272. package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
  273. package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
  274. package/dist/tests/test-utils.d.ts +74 -0
  275. package/dist/tests/test-utils.d.ts.map +1 -0
  276. package/dist/tests/test-utils.js +98 -0
  277. package/dist/tests/test-utils.js.map +1 -0
  278. package/dist/tests/tools.test.d.ts +5 -0
  279. package/dist/tests/tools.test.d.ts.map +1 -0
  280. package/dist/tests/tools.test.js +138 -0
  281. package/dist/tests/tools.test.js.map +1 -0
  282. package/dist/tests/unit/installed-skills.test.d.ts +6 -0
  283. package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
  284. package/dist/tests/unit/installed-skills.test.js +285 -0
  285. package/dist/tests/unit/installed-skills.test.js.map +1 -0
  286. package/dist/tests/unit/logger.test.d.ts +6 -0
  287. package/dist/tests/unit/logger.test.d.ts.map +1 -0
  288. package/dist/tests/unit/logger.test.js +281 -0
  289. package/dist/tests/unit/logger.test.js.map +1 -0
  290. package/dist/tests/validate.test.d.ts +5 -0
  291. package/dist/tests/validate.test.d.ts.map +1 -0
  292. package/dist/tests/validate.test.js +303 -0
  293. package/dist/tests/validate.test.js.map +1 -0
  294. package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
  295. package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
  296. package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
  297. package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
  298. package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
  299. package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
  300. package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
  301. package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
  302. package/dist/vitest.config.d.ts +6 -0
  303. package/dist/vitest.config.d.ts.map +1 -0
  304. package/dist/vitest.config.js +13 -0
  305. package/dist/vitest.config.js.map +1 -0
  306. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../tests/tools.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Tests for MCP Tools (SMI-586, SMI-588)
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ import * as os from 'os';
8
+ // Mock the file operations for testing
9
+ const TEST_SKILLS_DIR = path.join(os.tmpdir(), 'test-claude-skills-' + Date.now());
10
+ const TEST_MANIFEST_DIR = path.join(os.tmpdir(), 'test-skillsmith-' + Date.now());
11
+ describe('installSkill', () => {
12
+ beforeEach(async () => {
13
+ await fs.mkdir(TEST_SKILLS_DIR, { recursive: true });
14
+ await fs.mkdir(TEST_MANIFEST_DIR, { recursive: true });
15
+ });
16
+ afterEach(async () => {
17
+ try {
18
+ await fs.rm(TEST_SKILLS_DIR, { recursive: true, force: true });
19
+ await fs.rm(TEST_MANIFEST_DIR, { recursive: true, force: true });
20
+ }
21
+ catch {
22
+ // Directories may not exist, ignore cleanup errors
23
+ }
24
+ });
25
+ it('should parse GitHub URLs correctly', () => {
26
+ // This would test the parseSkillId function
27
+ const testCases = [
28
+ {
29
+ input: 'anthropics/claude-skills/commit',
30
+ expected: { owner: 'anthropics', repo: 'claude-skills', path: 'commit' },
31
+ },
32
+ {
33
+ input: 'https://github.com/anthropics/claude-skills',
34
+ expected: { owner: 'anthropics', repo: 'claude-skills', path: '' },
35
+ },
36
+ ];
37
+ for (const { input, expected } of testCases) {
38
+ // Test parseSkillId logic
39
+ if (input.startsWith('https://github.com/')) {
40
+ const url = new URL(input);
41
+ const parts = url.pathname.split('/').filter(Boolean);
42
+ expect(parts[0]).toBe(expected.owner);
43
+ expect(parts[1]).toBe(expected.repo);
44
+ }
45
+ else if (input.includes('/')) {
46
+ const [owner, ...rest] = input.split('/');
47
+ expect(owner).toBe(expected.owner);
48
+ expect(rest[0]).toBe(expected.repo);
49
+ expect(rest.slice(1).join('/')).toBe(expected.path);
50
+ }
51
+ }
52
+ });
53
+ it('should validate SKILL.md content', () => {
54
+ const validateSkillMd = (content) => {
55
+ const errors = [];
56
+ if (!content.includes('# ')) {
57
+ errors.push('Missing title');
58
+ }
59
+ if (content.length < 100) {
60
+ errors.push('Too short');
61
+ }
62
+ return { valid: errors.length === 0, errors };
63
+ };
64
+ expect(validateSkillMd('# My Skill\n\nThis is a valid skill with enough content to pass the minimum length requirement for validation.')).toEqual({
65
+ valid: true,
66
+ errors: [],
67
+ });
68
+ expect(validateSkillMd('Too short')).toEqual({
69
+ valid: false,
70
+ errors: ['Missing title', 'Too short'],
71
+ });
72
+ });
73
+ });
74
+ describe('uninstallSkill', () => {
75
+ beforeEach(async () => {
76
+ await fs.mkdir(TEST_SKILLS_DIR, { recursive: true });
77
+ await fs.mkdir(TEST_MANIFEST_DIR, { recursive: true });
78
+ });
79
+ afterEach(async () => {
80
+ try {
81
+ await fs.rm(TEST_SKILLS_DIR, { recursive: true, force: true });
82
+ await fs.rm(TEST_MANIFEST_DIR, { recursive: true, force: true });
83
+ }
84
+ catch {
85
+ // Directories may not exist, ignore cleanup errors
86
+ }
87
+ });
88
+ it('should detect modified skills', async () => {
89
+ const skillPath = path.join(TEST_SKILLS_DIR, 'test-skill');
90
+ await fs.mkdir(skillPath, { recursive: true });
91
+ await fs.writeFile(path.join(skillPath, 'SKILL.md'), '# Test Skill');
92
+ const installedAt = new Date(Date.now() - 10000).toISOString(); // 10 seconds ago
93
+ // Modify the file
94
+ await fs.writeFile(path.join(skillPath, 'SKILL.md'), '# Modified Skill');
95
+ const stats = await fs.stat(path.join(skillPath, 'SKILL.md'));
96
+ const installDate = new Date(installedAt);
97
+ expect(stats.mtime > installDate).toBe(true);
98
+ });
99
+ it('should clean up skill directory', async () => {
100
+ const skillPath = path.join(TEST_SKILLS_DIR, 'to-remove');
101
+ await fs.mkdir(skillPath, { recursive: true });
102
+ await fs.writeFile(path.join(skillPath, 'SKILL.md'), '# Test');
103
+ await fs.rm(skillPath, { recursive: true, force: true });
104
+ await expect(fs.access(skillPath)).rejects.toThrow();
105
+ });
106
+ });
107
+ describe('MCP Tool Schemas', () => {
108
+ it('should have valid search input schema', () => {
109
+ // Test that the schema validates correctly
110
+ const validInput = {
111
+ query: 'react testing',
112
+ limit: 20,
113
+ offset: 0,
114
+ };
115
+ expect(validInput.query.length).toBeGreaterThan(0);
116
+ expect(validInput.limit).toBeLessThanOrEqual(100);
117
+ expect(validInput.offset).toBeGreaterThanOrEqual(0);
118
+ });
119
+ it('should have valid install input schema', () => {
120
+ const validInput = {
121
+ skillId: 'owner/repo/skill',
122
+ force: false,
123
+ skipScan: false,
124
+ };
125
+ expect(validInput.skillId.length).toBeGreaterThan(0);
126
+ expect(typeof validInput.force).toBe('boolean');
127
+ expect(typeof validInput.skipScan).toBe('boolean');
128
+ });
129
+ it('should have valid uninstall input schema', () => {
130
+ const validInput = {
131
+ skillName: 'my-skill',
132
+ force: false,
133
+ };
134
+ expect(validInput.skillName.length).toBeGreaterThan(0);
135
+ expect(typeof validInput.force).toBe('boolean');
136
+ });
137
+ });
138
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../tests/tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Unit tests for SMI-906: Auto-detect installed skills from ~/.claude/skills/
3
+ * Tests the installed-skills utility functions
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=installed-skills.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-skills.test.d.ts","sourceRoot":"","sources":["../../../tests/unit/installed-skills.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Unit tests for SMI-906: Auto-detect installed skills from ~/.claude/skills/
3
+ * Tests the installed-skills utility functions
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import * as os from 'node:os';
9
+ import { parseSkillMd, getSkillIdFromDir, getInstalledSkills, getInstalledSkillsSync, getInstalledSkillsDetailed, } from '../../src/utils/installed-skills.js';
10
+ // Create a temp directory for testing
11
+ const TEST_TEMP_DIR = path.join(os.tmpdir(), 'skillsmith-test-skills-' + Date.now());
12
+ /**
13
+ * Create a test skill directory with optional SKILL.md
14
+ */
15
+ function createTestSkill(name, skillMdContent) {
16
+ const skillDir = path.join(TEST_TEMP_DIR, name);
17
+ fs.mkdirSync(skillDir, { recursive: true });
18
+ if (skillMdContent) {
19
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), skillMdContent);
20
+ }
21
+ return skillDir;
22
+ }
23
+ /**
24
+ * Clean up test directory
25
+ */
26
+ function cleanupTestDir() {
27
+ if (fs.existsSync(TEST_TEMP_DIR)) {
28
+ fs.rmSync(TEST_TEMP_DIR, { recursive: true, force: true });
29
+ }
30
+ }
31
+ describe('installed-skills utility', () => {
32
+ beforeEach(() => {
33
+ cleanupTestDir();
34
+ fs.mkdirSync(TEST_TEMP_DIR, { recursive: true });
35
+ });
36
+ afterEach(() => {
37
+ cleanupTestDir();
38
+ });
39
+ describe('parseSkillMd', () => {
40
+ it('should parse valid frontmatter with name', () => {
41
+ const content = `---
42
+ name: docker
43
+ description: Docker development skill
44
+ ---
45
+ # Docker Skill
46
+
47
+ Some content here.`;
48
+ const result = parseSkillMd(content);
49
+ expect(result.id).toBe('docker');
50
+ expect(result.name).toBe('docker');
51
+ expect(result.description).toBe('Docker development skill');
52
+ });
53
+ it('should parse multiline description', () => {
54
+ const content = `---
55
+ name: varlock
56
+ description: Secure environment variable management with Varlock.
57
+ ---
58
+ # Varlock`;
59
+ const result = parseSkillMd(content);
60
+ expect(result.id).toBe('varlock');
61
+ expect(result.description).toBe('Secure environment variable management with Varlock.');
62
+ });
63
+ it('should return null values for missing frontmatter', () => {
64
+ const content = `# Docker Skill
65
+
66
+ No frontmatter here.`;
67
+ const result = parseSkillMd(content);
68
+ expect(result.id).toBeNull();
69
+ expect(result.name).toBeNull();
70
+ expect(result.description).toBeNull();
71
+ });
72
+ it('should return null values for unclosed frontmatter', () => {
73
+ const content = `---
74
+ name: docker
75
+ description: Missing closing delimiter`;
76
+ const result = parseSkillMd(content);
77
+ expect(result.id).toBeNull();
78
+ });
79
+ it('should handle empty frontmatter', () => {
80
+ const content = `---
81
+ ---
82
+ # Empty frontmatter`;
83
+ const result = parseSkillMd(content);
84
+ expect(result.id).toBeNull();
85
+ expect(result.name).toBeNull();
86
+ expect(result.description).toBeNull();
87
+ });
88
+ it('should handle frontmatter with only name', () => {
89
+ const content = `---
90
+ name: simple-skill
91
+ ---
92
+ # Simple Skill`;
93
+ const result = parseSkillMd(content);
94
+ expect(result.id).toBe('simple-skill');
95
+ expect(result.name).toBe('simple-skill');
96
+ expect(result.description).toBeNull();
97
+ });
98
+ it('should be case-insensitive for keys', () => {
99
+ const content = `---
100
+ NAME: test-skill
101
+ Description: Test description
102
+ ---
103
+ # Test`;
104
+ const result = parseSkillMd(content);
105
+ expect(result.id).toBe('test-skill');
106
+ expect(result.description).toBe('Test description');
107
+ });
108
+ });
109
+ describe('getSkillIdFromDir', () => {
110
+ it('should extract ID from SKILL.md', () => {
111
+ const content = `---
112
+ name: custom-id
113
+ description: Test skill
114
+ ---
115
+ # Custom Skill`;
116
+ createTestSkill('my-folder', content);
117
+ const skillDir = path.join(TEST_TEMP_DIR, 'my-folder');
118
+ const result = getSkillIdFromDir(skillDir, 'my-folder');
119
+ expect(result).toBe('custom-id');
120
+ });
121
+ it('should fall back to directory name when no SKILL.md', () => {
122
+ createTestSkill('folder-name');
123
+ const skillDir = path.join(TEST_TEMP_DIR, 'folder-name');
124
+ const result = getSkillIdFromDir(skillDir, 'folder-name');
125
+ expect(result).toBe('folder-name');
126
+ });
127
+ it('should fall back to directory name when SKILL.md has no name', () => {
128
+ const content = `---
129
+ description: No name field
130
+ ---
131
+ # Missing Name`;
132
+ createTestSkill('fallback-folder', content);
133
+ const skillDir = path.join(TEST_TEMP_DIR, 'fallback-folder');
134
+ const result = getSkillIdFromDir(skillDir, 'fallback-folder');
135
+ expect(result).toBe('fallback-folder');
136
+ });
137
+ it('should fall back to directory name when SKILL.md is invalid', () => {
138
+ createTestSkill('invalid-md');
139
+ // Write invalid content (not valid frontmatter)
140
+ fs.writeFileSync(path.join(TEST_TEMP_DIR, 'invalid-md', 'SKILL.md'), 'Not valid frontmatter content');
141
+ const skillDir = path.join(TEST_TEMP_DIR, 'invalid-md');
142
+ const result = getSkillIdFromDir(skillDir, 'invalid-md');
143
+ expect(result).toBe('invalid-md');
144
+ });
145
+ });
146
+ describe('getInstalledSkills', () => {
147
+ it('should return empty array for non-existent directory', async () => {
148
+ const result = await getInstalledSkills('/non/existent/path');
149
+ expect(result).toEqual([]);
150
+ });
151
+ it('should return empty array for empty directory', async () => {
152
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
153
+ expect(result).toEqual([]);
154
+ });
155
+ it('should detect skills with SKILL.md', async () => {
156
+ createTestSkill('docker', `---
157
+ name: docker
158
+ description: Docker skill
159
+ ---
160
+ # Docker`);
161
+ createTestSkill('varlock', `---
162
+ name: varlock
163
+ description: Varlock skill
164
+ ---
165
+ # Varlock`);
166
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
167
+ expect(result).toEqual(['docker', 'varlock']);
168
+ });
169
+ it('should fall back to folder names when no SKILL.md', async () => {
170
+ createTestSkill('my-skill');
171
+ createTestSkill('another-skill');
172
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
173
+ expect(result).toEqual(['another-skill', 'my-skill']);
174
+ });
175
+ it('should mix SKILL.md IDs and folder names', async () => {
176
+ createTestSkill('has-skillmd', `---
177
+ name: custom-name
178
+ ---
179
+ # Custom`);
180
+ createTestSkill('no-skillmd');
181
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
182
+ expect(result).toEqual(['custom-name', 'no-skillmd']);
183
+ });
184
+ it('should skip hidden directories', async () => {
185
+ createTestSkill('.hidden-skill', `---
186
+ name: hidden
187
+ ---
188
+ # Hidden`);
189
+ createTestSkill('visible-skill', `---
190
+ name: visible
191
+ ---
192
+ # Visible`);
193
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
194
+ expect(result).toEqual(['visible']);
195
+ });
196
+ it('should skip files (only process directories)', async () => {
197
+ // Create a file at the root level
198
+ fs.writeFileSync(path.join(TEST_TEMP_DIR, 'some-file.txt'), 'content');
199
+ createTestSkill('real-skill', `---
200
+ name: real
201
+ ---
202
+ # Real`);
203
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
204
+ expect(result).toEqual(['real']);
205
+ });
206
+ it('should return sorted results', async () => {
207
+ createTestSkill('zebra');
208
+ createTestSkill('alpha');
209
+ createTestSkill('beta');
210
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
211
+ expect(result).toEqual(['alpha', 'beta', 'zebra']);
212
+ });
213
+ });
214
+ describe('getInstalledSkillsSync', () => {
215
+ it('should return empty array for non-existent directory', () => {
216
+ const result = getInstalledSkillsSync('/non/existent/path');
217
+ expect(result).toEqual([]);
218
+ });
219
+ it('should detect skills synchronously', () => {
220
+ createTestSkill('sync-skill', `---
221
+ name: sync-test
222
+ ---
223
+ # Sync`);
224
+ const result = getInstalledSkillsSync(TEST_TEMP_DIR);
225
+ expect(result).toEqual(['sync-test']);
226
+ });
227
+ });
228
+ describe('getInstalledSkillsDetailed', () => {
229
+ it('should return empty array for non-existent directory', async () => {
230
+ const result = await getInstalledSkillsDetailed('/non/existent/path');
231
+ expect(result).toEqual([]);
232
+ });
233
+ it('should return detailed skill information', async () => {
234
+ createTestSkill('detailed-skill', `---
235
+ name: detailed
236
+ description: A detailed skill description
237
+ ---
238
+ # Detailed Skill`);
239
+ createTestSkill('simple-skill');
240
+ const result = await getInstalledSkillsDetailed(TEST_TEMP_DIR);
241
+ expect(result).toHaveLength(2);
242
+ // Check detailed skill (has SKILL.md)
243
+ const detailed = result.find((s) => s.id === 'detailed');
244
+ expect(detailed).toBeDefined();
245
+ expect(detailed?.directory).toBe('detailed-skill');
246
+ expect(detailed?.hasSkillMd).toBe(true);
247
+ expect(detailed?.description).toBe('A detailed skill description');
248
+ // Check simple skill (no SKILL.md)
249
+ const simple = result.find((s) => s.id === 'simple-skill');
250
+ expect(simple).toBeDefined();
251
+ expect(simple?.directory).toBe('simple-skill');
252
+ expect(simple?.hasSkillMd).toBe(false);
253
+ expect(simple?.description).toBeNull();
254
+ });
255
+ it('should include full path in result', async () => {
256
+ createTestSkill('path-test');
257
+ const result = await getInstalledSkillsDetailed(TEST_TEMP_DIR);
258
+ expect(result).toHaveLength(1);
259
+ expect(result[0].path).toBe(path.join(TEST_TEMP_DIR, 'path-test'));
260
+ });
261
+ });
262
+ describe('integration with real ~/.claude/skills/ directory', () => {
263
+ it('should work with default skills directory', async () => {
264
+ // This test verifies the function works with real filesystem
265
+ // It should not fail even if the directory doesn't exist
266
+ const result = await getInstalledSkills();
267
+ expect(Array.isArray(result)).toBe(true);
268
+ });
269
+ it('should handle real SKILL.md format', async () => {
270
+ // Test with content that matches real SKILL.md format
271
+ const realContent = `---
272
+ name: docker
273
+ description: Container-based development for isolated, reproducible environments. Use when running npm commands, installing packages, executing code, or managing project dependencies. Trigger phrases include "npm install", "run the build", "start the server", "install package", or any code execution request.
274
+ ---
275
+
276
+ # Docker Development Skill
277
+
278
+ Execute all package installations and code execution inside Docker containers.`;
279
+ createTestSkill('real-format-test', realContent);
280
+ const result = await getInstalledSkills(TEST_TEMP_DIR);
281
+ expect(result).toEqual(['docker']);
282
+ });
283
+ });
284
+ });
285
+ //# sourceMappingURL=installed-skills.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-skills.test.js","sourceRoot":"","sources":["../../../tests/unit/installed-skills.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SMI-883: Tests for logger sensitive data redaction
3
+ * Ensures API keys, tokens, passwords, and secrets are never written to disk
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=logger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../../tests/unit/logger.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}