@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,244 @@
1
+ /**
2
+ * SMI-756: Integration tests for analyze MCP tool
3
+ * Tests codebase analysis with real filesystem
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { createTestFilesystem } from './setup.js';
9
+ import { executeAnalyze, formatAnalysisResults } from '../../src/tools/analyze.js';
10
+ describe('Analyze Tool Integration', () => {
11
+ let ctx;
12
+ beforeEach(async () => {
13
+ ctx = await createTestFilesystem();
14
+ });
15
+ afterEach(async () => {
16
+ await ctx.cleanup();
17
+ });
18
+ /**
19
+ * Helper to create test project files
20
+ */
21
+ async function createTestProject(files) {
22
+ const projectDir = path.join(ctx.tempDir, 'test-project');
23
+ await fs.mkdir(projectDir, { recursive: true });
24
+ for (const [filePath, content] of Object.entries(files)) {
25
+ const fullPath = path.join(projectDir, filePath);
26
+ await fs.mkdir(path.dirname(fullPath), { recursive: true });
27
+ await fs.writeFile(fullPath, content);
28
+ }
29
+ return projectDir;
30
+ }
31
+ describe('executeAnalyze', () => {
32
+ it('should analyze a TypeScript project', async () => {
33
+ const projectDir = await createTestProject({
34
+ 'package.json': JSON.stringify({
35
+ name: 'test-project',
36
+ dependencies: {
37
+ react: '^18.0.0',
38
+ typescript: '^5.0.0',
39
+ },
40
+ }),
41
+ 'src/index.ts': `
42
+ import React from 'react';
43
+ import { useState } from 'react';
44
+
45
+ export function App() {
46
+ const [count, setCount] = useState(0);
47
+ return <div>{count}</div>;
48
+ }
49
+ `,
50
+ 'src/utils.ts': `
51
+ export function add(a: number, b: number): number {
52
+ return a + b;
53
+ }
54
+
55
+ export const multiply = (a: number, b: number) => a * b;
56
+ `,
57
+ });
58
+ const result = await executeAnalyze({
59
+ path: projectDir,
60
+ });
61
+ expect(result.stats.total_files).toBeGreaterThan(0);
62
+ expect(result.stats.file_types['.ts']).toBeGreaterThan(0);
63
+ expect(result.imports.length).toBeGreaterThan(0);
64
+ expect(result.imports).toContain('react');
65
+ });
66
+ it('should detect React framework', async () => {
67
+ const projectDir = await createTestProject({
68
+ 'package.json': JSON.stringify({
69
+ dependencies: {
70
+ react: '^18.0.0',
71
+ 'react-dom': '^18.0.0',
72
+ },
73
+ }),
74
+ 'App.tsx': `
75
+ import React from 'react';
76
+ export const App = () => <div>Hello</div>;
77
+ `,
78
+ });
79
+ const result = await executeAnalyze({
80
+ path: projectDir,
81
+ });
82
+ const reactFramework = result.frameworks.find((f) => f.name === 'React');
83
+ expect(reactFramework).toBeDefined();
84
+ expect(reactFramework?.confidence).toBeGreaterThan(0);
85
+ });
86
+ it('should detect Express framework', async () => {
87
+ const projectDir = await createTestProject({
88
+ 'package.json': JSON.stringify({
89
+ dependencies: {
90
+ express: '^4.18.0',
91
+ },
92
+ }),
93
+ 'server.ts': `
94
+ import express from 'express';
95
+ const app = express();
96
+ app.get('/', (req, res) => res.send('Hello'));
97
+ `,
98
+ });
99
+ const result = await executeAnalyze({
100
+ path: projectDir,
101
+ });
102
+ const expressFramework = result.frameworks.find((f) => f.name === 'Express');
103
+ expect(expressFramework).toBeDefined();
104
+ });
105
+ it('should detect Vitest framework', async () => {
106
+ const projectDir = await createTestProject({
107
+ 'package.json': JSON.stringify({
108
+ devDependencies: {
109
+ vitest: '^1.0.0',
110
+ },
111
+ }),
112
+ 'test.ts': `
113
+ import { describe, it, expect } from 'vitest';
114
+ describe('test', () => {
115
+ it('works', () => expect(true).toBe(true));
116
+ });
117
+ `,
118
+ });
119
+ const result = await executeAnalyze({
120
+ path: projectDir,
121
+ include_dev_deps: true,
122
+ });
123
+ const vitestFramework = result.frameworks.find((f) => f.name === 'Vitest');
124
+ expect(vitestFramework).toBeDefined();
125
+ });
126
+ it('should extract dependencies', async () => {
127
+ const projectDir = await createTestProject({
128
+ 'package.json': JSON.stringify({
129
+ dependencies: {
130
+ lodash: '^4.17.0',
131
+ axios: '^1.0.0',
132
+ },
133
+ devDependencies: {
134
+ typescript: '^5.0.0',
135
+ },
136
+ }),
137
+ 'index.ts': 'export const x = 1;',
138
+ });
139
+ const result = await executeAnalyze({
140
+ path: projectDir,
141
+ include_dev_deps: true,
142
+ });
143
+ expect(result.dependencies.length).toBeGreaterThan(0);
144
+ const prodDeps = result.dependencies.filter((d) => !d.is_dev);
145
+ const devDeps = result.dependencies.filter((d) => d.is_dev);
146
+ expect(prodDeps.some((d) => d.name === 'lodash')).toBe(true);
147
+ expect(devDeps.some((d) => d.name === 'typescript')).toBe(true);
148
+ });
149
+ it('should respect max_files option', async () => {
150
+ const files = {};
151
+ for (let i = 0; i < 20; i++) {
152
+ files[`file${i}.ts`] = `export const x${i} = ${i};`;
153
+ }
154
+ const projectDir = await createTestProject(files);
155
+ const result = await executeAnalyze({
156
+ path: projectDir,
157
+ max_files: 5,
158
+ });
159
+ expect(result.stats.total_files).toBe(5);
160
+ });
161
+ it('should exclude specified directories', async () => {
162
+ const projectDir = await createTestProject({
163
+ 'src/app.ts': 'export const app = 1;',
164
+ 'tests/test.ts': 'export const test = 1;',
165
+ 'build/out.ts': 'export const out = 1;',
166
+ });
167
+ const result = await executeAnalyze({
168
+ path: projectDir,
169
+ exclude_dirs: ['tests', 'build'],
170
+ });
171
+ expect(result.stats.total_files).toBe(1);
172
+ });
173
+ it('should generate summary', async () => {
174
+ const projectDir = await createTestProject({
175
+ 'package.json': JSON.stringify({
176
+ dependencies: { react: '^18.0.0' },
177
+ }),
178
+ 'app.tsx': `import React from 'react';`,
179
+ });
180
+ const result = await executeAnalyze({
181
+ path: projectDir,
182
+ });
183
+ expect(result.summary).toBeDefined();
184
+ expect(result.summary.length).toBeGreaterThan(0);
185
+ });
186
+ it('should track timing information', async () => {
187
+ const projectDir = await createTestProject({
188
+ 'index.ts': 'export const x = 1;',
189
+ });
190
+ const result = await executeAnalyze({
191
+ path: projectDir,
192
+ });
193
+ expect(result.timing.duration_ms).toBeGreaterThanOrEqual(0);
194
+ });
195
+ it('should handle empty directory', async () => {
196
+ const emptyDir = path.join(ctx.tempDir, 'empty-project');
197
+ await fs.mkdir(emptyDir, { recursive: true });
198
+ const result = await executeAnalyze({
199
+ path: emptyDir,
200
+ });
201
+ expect(result.stats.total_files).toBe(0);
202
+ expect(result.imports).toHaveLength(0);
203
+ expect(result.frameworks).toHaveLength(0);
204
+ });
205
+ it('should throw for non-existent path', async () => {
206
+ await expect(executeAnalyze({
207
+ path: '/non/existent/path',
208
+ })).rejects.toThrow();
209
+ });
210
+ });
211
+ describe('formatAnalysisResults', () => {
212
+ it('should format analysis for terminal display', async () => {
213
+ const projectDir = await createTestProject({
214
+ 'package.json': JSON.stringify({
215
+ dependencies: { react: '^18.0.0' },
216
+ }),
217
+ 'app.tsx': `import React from 'react';`,
218
+ });
219
+ const result = await executeAnalyze({
220
+ path: projectDir,
221
+ });
222
+ const formatted = formatAnalysisResults(result);
223
+ expect(formatted).toContain('Codebase Analysis');
224
+ expect(formatted).toContain('Files:');
225
+ expect(formatted).toContain('Duration:');
226
+ });
227
+ it('should display frameworks', async () => {
228
+ const projectDir = await createTestProject({
229
+ 'package.json': JSON.stringify({
230
+ dependencies: { react: '^18.0.0' },
231
+ }),
232
+ 'app.tsx': `import React from 'react';`,
233
+ });
234
+ const result = await executeAnalyze({
235
+ path: projectDir,
236
+ });
237
+ const formatted = formatAnalysisResults(result);
238
+ if (result.frameworks.length > 0) {
239
+ expect(formatted).toContain('Frameworks detected');
240
+ }
241
+ });
242
+ });
243
+ });
244
+ //# sourceMappingURL=analyze.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.integration.test.js","sourceRoot":"","sources":["../../../tests/integration/analyze.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compare.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.integration.test.d.ts","sourceRoot":"","sources":["../../../tests/integration/compare.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * SMI-756: Integration tests for compare MCP tool
3
+ * Tests skill comparison with real database
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { createTestDatabase } from './setup.js';
7
+ import { executeCompare, formatComparisonResults } from '../../src/tools/compare.js';
8
+ describe('Compare Tool Integration', () => {
9
+ let ctx;
10
+ beforeEach(async () => {
11
+ ctx = await createTestDatabase();
12
+ });
13
+ afterEach(async () => {
14
+ await ctx.cleanup();
15
+ });
16
+ describe('executeCompare', () => {
17
+ it('should compare two existing skills', async () => {
18
+ // Note: These skills are seeded in createTestDatabase
19
+ const result = await executeCompare({
20
+ skill_a: 'anthropic/commit',
21
+ skill_b: 'anthropic/review-pr',
22
+ }, ctx);
23
+ expect(result.comparison.a).toBeDefined();
24
+ expect(result.comparison.b).toBeDefined();
25
+ expect(result.comparison.a.id).toBe('anthropic/commit');
26
+ expect(result.comparison.b.id).toBe('anthropic/review-pr');
27
+ });
28
+ it('should include quality scores in comparison', async () => {
29
+ const result = await executeCompare({
30
+ skill_a: 'anthropic/commit',
31
+ skill_b: 'community/jest-helper',
32
+ }, ctx);
33
+ expect(result.comparison.a.quality_score).toBeDefined();
34
+ expect(result.comparison.b.quality_score).toBeDefined();
35
+ expect(result.comparison.a.quality_score).toBeGreaterThanOrEqual(0);
36
+ expect(result.comparison.b.quality_score).toBeGreaterThanOrEqual(0);
37
+ });
38
+ it('should include trust tiers in comparison', async () => {
39
+ const result = await executeCompare({
40
+ skill_a: 'anthropic/commit',
41
+ skill_b: 'community/docker-compose',
42
+ }, ctx);
43
+ expect(result.comparison.a.trust_tier).toBe('verified');
44
+ expect(result.comparison.b.trust_tier).toBe('community');
45
+ });
46
+ it('should list differences between skills', async () => {
47
+ const result = await executeCompare({
48
+ skill_a: 'anthropic/commit',
49
+ skill_b: 'community/jest-helper',
50
+ }, ctx);
51
+ expect(result.differences).toBeDefined();
52
+ expect(Array.isArray(result.differences)).toBe(true);
53
+ // Should have at least some differences
54
+ for (const diff of result.differences) {
55
+ expect(diff.field).toBeDefined();
56
+ expect(diff.a_value).toBeDefined();
57
+ expect(diff.b_value).toBeDefined();
58
+ }
59
+ });
60
+ it('should provide a recommendation', async () => {
61
+ const result = await executeCompare({
62
+ skill_a: 'anthropic/commit',
63
+ skill_b: 'community/vitest-helper',
64
+ }, ctx);
65
+ expect(result.recommendation).toBeDefined();
66
+ expect(typeof result.recommendation).toBe('string');
67
+ expect(result.recommendation.length).toBeGreaterThan(0);
68
+ });
69
+ it('should include tags in summaries', async () => {
70
+ const result = await executeCompare({
71
+ skill_a: 'anthropic/commit',
72
+ skill_b: 'anthropic/review-pr',
73
+ }, ctx);
74
+ expect(result.comparison.a.tags).toBeDefined();
75
+ expect(result.comparison.b.tags).toBeDefined();
76
+ expect(Array.isArray(result.comparison.a.tags)).toBe(true);
77
+ expect(Array.isArray(result.comparison.b.tags)).toBe(true);
78
+ });
79
+ it('should track timing information', async () => {
80
+ const result = await executeCompare({
81
+ skill_a: 'anthropic/commit',
82
+ skill_b: 'anthropic/review-pr',
83
+ }, ctx);
84
+ expect(result.timing.totalMs).toBeGreaterThanOrEqual(0);
85
+ });
86
+ it('should throw for non-existent skill', async () => {
87
+ await expect(executeCompare({
88
+ skill_a: 'non-existent/skill',
89
+ skill_b: 'anthropic/commit',
90
+ }, ctx)).rejects.toThrow();
91
+ });
92
+ it('should throw when both skills are the same', async () => {
93
+ await expect(executeCompare({
94
+ skill_a: 'anthropic/commit',
95
+ skill_b: 'anthropic/commit',
96
+ }, ctx)).rejects.toThrow();
97
+ });
98
+ });
99
+ describe('formatComparisonResults', () => {
100
+ it('should format comparison for terminal display', async () => {
101
+ const result = await executeCompare({
102
+ skill_a: 'anthropic/commit',
103
+ skill_b: 'anthropic/review-pr',
104
+ }, ctx);
105
+ const formatted = formatComparisonResults(result);
106
+ expect(formatted).toContain('Skill Comparison');
107
+ expect(formatted).toContain('commit');
108
+ expect(formatted).toContain('review-pr');
109
+ });
110
+ it('should display recommendation', async () => {
111
+ const result = await executeCompare({
112
+ skill_a: 'anthropic/commit',
113
+ skill_b: 'community/docker-compose',
114
+ }, ctx);
115
+ const formatted = formatComparisonResults(result);
116
+ expect(formatted).toContain('Recommendation');
117
+ });
118
+ });
119
+ });
120
+ //# sourceMappingURL=compare.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.integration.test.js","sourceRoot":"","sources":["../../../tests/integration/compare.integration.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAA4B,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AAEpF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,GAAwB,CAAA;IAE5B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,sDAAsD;YACtD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,qBAAqB;aAC/B,EACD,GAAG,CACJ,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,uBAAuB;aACjC,EACD,GAAG,CACJ,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YACnE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,0BAA0B;aACpC,EACD,GAAG,CACJ,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,uBAAuB;aACjC,EACD,GAAG,CACJ,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEpD,wCAAwC;YACxC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;gBAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;gBAClC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;YACpC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,yBAAyB;aACnC,EACD,GAAG,CACJ,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3C,MAAM,CAAC,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,qBAAqB;aAC/B,EACD,GAAG,CACJ,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;YAC9C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;YAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC1D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,qBAAqB;aAC/B,EACD,GAAG,CACJ,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,CACV,cAAc,CACZ;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,OAAO,EAAE,kBAAkB;aAC5B,EACD,GAAG,CACJ,CACF,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QACrB,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,CACV,cAAc,CACZ;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,kBAAkB;aAC5B,EACD,GAAG,CACJ,CACF,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QACrB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,qBAAqB;aAC/B,EACD,GAAG,CACJ,CAAA;YAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAEjD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;YAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YACrC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,0BAA0B;aACpC,EACD,GAAG,CACJ,CAAA;YAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAEjD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * SMI-903: Comprehensive test skill fixtures
3
+ * Provides 50+ skills across all categories and trust tiers for realistic testing
4
+ */
5
+ import type { SkillRepository } from '@skillsmith/core';
6
+ /**
7
+ * Test skill data structure matching SkillRepository.createBatch expectations
8
+ */
9
+ interface TestSkillData {
10
+ id: string;
11
+ name: string;
12
+ description: string;
13
+ author: string;
14
+ repoUrl: string;
15
+ qualityScore: number;
16
+ trustTier: 'verified' | 'community' | 'experimental' | 'unknown';
17
+ tags: string[];
18
+ }
19
+ /**
20
+ * Comprehensive test skills covering all categories and trust tiers
21
+ * Total: 58 skills (updated for SMI-907)
22
+ * - Categories: development, testing, documentation, devops, database, security, productivity, integration, ai-ml, other
23
+ * - Trust tiers: verified (8), community (26), experimental (16), unknown (8)
24
+ */
25
+ export declare const TEST_SKILLS: TestSkillData[];
26
+ /**
27
+ * Seed all test skills into the repository
28
+ */
29
+ export declare function seedTestSkills(repo: SkillRepository): void;
30
+ /**
31
+ * Get skills by category for targeted testing
32
+ */
33
+ export declare function getSkillsByCategory(category: string): TestSkillData[];
34
+ /**
35
+ * Get skills by trust tier for targeted testing
36
+ */
37
+ export declare function getSkillsByTrustTier(tier: 'verified' | 'community' | 'experimental' | 'unknown'): TestSkillData[];
38
+ /**
39
+ * Summary statistics for test data validation
40
+ */
41
+ export declare const TEST_SKILLS_STATS: {
42
+ total: number;
43
+ byTrustTier: {
44
+ verified: number;
45
+ community: number;
46
+ experimental: number;
47
+ unknown: number;
48
+ };
49
+ byCategory: {
50
+ development: number;
51
+ testing: number;
52
+ documentation: number;
53
+ devops: number;
54
+ database: number;
55
+ security: number;
56
+ productivity: number;
57
+ integration: number;
58
+ 'ai-ml': number;
59
+ };
60
+ };
61
+ export {};
62
+ //# sourceMappingURL=test-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-skills.d.ts","sourceRoot":"","sources":["../../../../tests/integration/fixtures/test-skills.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD;;GAEG;AACH,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,SAAS,CAAA;IAChE,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,EAulBtC,CAAA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAErE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,SAAS,GAC1D,aAAa,EAAE,CAEjB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;CAmB7B,CAAA"}