@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,151 @@
1
+ /**
2
+ * @fileoverview MCP analyze_codebase Tool
3
+ * @module @skillsmith/mcp-server/tools/analyze
4
+ * @see SMI-600: Implement analyze_codebase MCP tool
5
+ *
6
+ * Analyzes a codebase to extract context for skill recommendations.
7
+ * Uses TypeScript/JavaScript analysis per ADR-010.
8
+ *
9
+ * @example
10
+ * // Analyze current directory
11
+ * const result = await executeAnalyze({ path: '.' });
12
+ * console.log(result.frameworks);
13
+ *
14
+ * @example
15
+ * // Analyze with options
16
+ * const result = await executeAnalyze({
17
+ * path: '/path/to/project',
18
+ * max_files: 500,
19
+ * include_dev_deps: false
20
+ * });
21
+ */
22
+ import { z } from 'zod';
23
+ /**
24
+ * Zod schema for analyze tool input validation
25
+ */
26
+ export declare const analyzeInputSchema: z.ZodObject<{
27
+ /** Path to analyze (default: current directory) */
28
+ path: z.ZodDefault<z.ZodString>;
29
+ /** Maximum files to analyze (default: 1000) */
30
+ max_files: z.ZodDefault<z.ZodNumber>;
31
+ /** Directories to exclude */
32
+ exclude_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
33
+ /** Include dev dependencies in analysis */
34
+ include_dev_deps: z.ZodDefault<z.ZodBoolean>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ path: string;
37
+ max_files: number;
38
+ include_dev_deps: boolean;
39
+ exclude_dirs?: string[] | undefined;
40
+ }, {
41
+ path?: string | undefined;
42
+ max_files?: number | undefined;
43
+ exclude_dirs?: string[] | undefined;
44
+ include_dev_deps?: boolean | undefined;
45
+ }>;
46
+ /**
47
+ * Input type for analyze tool
48
+ */
49
+ export type AnalyzeInput = z.input<typeof analyzeInputSchema>;
50
+ /**
51
+ * Simplified framework info for response
52
+ */
53
+ export interface AnalyzeFramework {
54
+ /** Framework name */
55
+ name: string;
56
+ /** Confidence level (0-100) */
57
+ confidence: number;
58
+ }
59
+ /**
60
+ * Simplified dependency info for response
61
+ */
62
+ export interface AnalyzeDependency {
63
+ /** Package name */
64
+ name: string;
65
+ /** Whether this is a dev dependency */
66
+ is_dev: boolean;
67
+ }
68
+ /**
69
+ * Analysis response with codebase context
70
+ */
71
+ export interface AnalyzeResponse {
72
+ /** Detected frameworks */
73
+ frameworks: AnalyzeFramework[];
74
+ /** Top dependencies */
75
+ dependencies: AnalyzeDependency[];
76
+ /** Unique import modules */
77
+ imports: string[];
78
+ /** File statistics */
79
+ stats: {
80
+ total_files: number;
81
+ total_lines: number;
82
+ file_types: Record<string, number>;
83
+ };
84
+ /** Summary for skill matching */
85
+ summary: string;
86
+ /** Analysis timing */
87
+ timing: {
88
+ duration_ms: number;
89
+ };
90
+ }
91
+ /**
92
+ * MCP tool schema definition for analyze_codebase
93
+ */
94
+ export declare const analyzeToolSchema: {
95
+ name: string;
96
+ description: string;
97
+ inputSchema: {
98
+ type: "object";
99
+ properties: {
100
+ path: {
101
+ type: string;
102
+ description: string;
103
+ default: string;
104
+ };
105
+ max_files: {
106
+ type: string;
107
+ description: string;
108
+ minimum: number;
109
+ maximum: number;
110
+ default: number;
111
+ };
112
+ exclude_dirs: {
113
+ type: string;
114
+ items: {
115
+ type: string;
116
+ };
117
+ description: string;
118
+ };
119
+ include_dev_deps: {
120
+ type: string;
121
+ description: string;
122
+ default: boolean;
123
+ };
124
+ };
125
+ required: never[];
126
+ };
127
+ };
128
+ /**
129
+ * Execute codebase analysis.
130
+ *
131
+ * Scans the specified directory for TypeScript/JavaScript files,
132
+ * extracts imports, detects frameworks, and returns context
133
+ * suitable for skill recommendations.
134
+ *
135
+ * @param input - Analysis parameters
136
+ * @returns Promise resolving to analysis response
137
+ * @throws {Error} When path doesn't exist or analysis fails
138
+ *
139
+ * @example
140
+ * const response = await executeAnalyze({
141
+ * path: './my-project',
142
+ * max_files: 500
143
+ * });
144
+ * console.log('Detected:', response.frameworks.map(f => f.name).join(', '));
145
+ */
146
+ export declare function executeAnalyze(input: AnalyzeInput): Promise<AnalyzeResponse>;
147
+ /**
148
+ * Format analysis results for terminal display
149
+ */
150
+ export declare function formatAnalysisResults(response: AnalyzeResponse): string;
151
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;GAEG;AACH,eAAO,MAAM,kBAAkB;IAC7B,mDAAmD;;IAEnD,+CAA+C;;IAE/C,6BAA6B;;IAE7B,2CAA2C;;;;;;;;;;;;EAE3C,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC9B,uBAAuB;IACvB,YAAY,EAAE,iBAAiB,EAAE,CAAA;IACjC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,sBAAsB;IACtB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACnC,CAAA;IACD,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC7B,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAclF;AAsDD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoEvE"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * @fileoverview MCP analyze_codebase Tool
3
+ * @module @skillsmith/mcp-server/tools/analyze
4
+ * @see SMI-600: Implement analyze_codebase MCP tool
5
+ *
6
+ * Analyzes a codebase to extract context for skill recommendations.
7
+ * Uses TypeScript/JavaScript analysis per ADR-010.
8
+ *
9
+ * @example
10
+ * // Analyze current directory
11
+ * const result = await executeAnalyze({ path: '.' });
12
+ * console.log(result.frameworks);
13
+ *
14
+ * @example
15
+ * // Analyze with options
16
+ * const result = await executeAnalyze({
17
+ * path: '/path/to/project',
18
+ * max_files: 500,
19
+ * include_dev_deps: false
20
+ * });
21
+ */
22
+ import { z } from 'zod';
23
+ import { CodebaseAnalyzer } from '@skillsmith/core';
24
+ /**
25
+ * Zod schema for analyze tool input validation
26
+ */
27
+ export const analyzeInputSchema = z.object({
28
+ /** Path to analyze (default: current directory) */
29
+ path: z.string().default('.'),
30
+ /** Maximum files to analyze (default: 1000) */
31
+ max_files: z.number().min(1).max(10000).default(1000),
32
+ /** Directories to exclude */
33
+ exclude_dirs: z.array(z.string()).optional(),
34
+ /** Include dev dependencies in analysis */
35
+ include_dev_deps: z.boolean().default(true),
36
+ });
37
+ /**
38
+ * MCP tool schema definition for analyze_codebase
39
+ */
40
+ export const analyzeToolSchema = {
41
+ name: 'analyze_codebase',
42
+ description: 'Analyze a codebase to understand its structure, frameworks, and dependencies. ' +
43
+ 'Returns context useful for skill recommendations. ' +
44
+ 'Supports TypeScript, JavaScript, TSX, and JSX files.',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ path: {
49
+ type: 'string',
50
+ description: 'Path to the codebase to analyze (default: current directory)',
51
+ default: '.',
52
+ },
53
+ max_files: {
54
+ type: 'number',
55
+ description: 'Maximum files to analyze (default: 1000, max: 10000)',
56
+ minimum: 1,
57
+ maximum: 10000,
58
+ default: 1000,
59
+ },
60
+ exclude_dirs: {
61
+ type: 'array',
62
+ items: { type: 'string' },
63
+ description: 'Directories to exclude (default: node_modules, dist, .git, coverage)',
64
+ },
65
+ include_dev_deps: {
66
+ type: 'boolean',
67
+ description: 'Include dev dependencies in analysis (default: true)',
68
+ default: true,
69
+ },
70
+ },
71
+ required: [],
72
+ },
73
+ };
74
+ /**
75
+ * Execute codebase analysis.
76
+ *
77
+ * Scans the specified directory for TypeScript/JavaScript files,
78
+ * extracts imports, detects frameworks, and returns context
79
+ * suitable for skill recommendations.
80
+ *
81
+ * @param input - Analysis parameters
82
+ * @returns Promise resolving to analysis response
83
+ * @throws {Error} When path doesn't exist or analysis fails
84
+ *
85
+ * @example
86
+ * const response = await executeAnalyze({
87
+ * path: './my-project',
88
+ * max_files: 500
89
+ * });
90
+ * console.log('Detected:', response.frameworks.map(f => f.name).join(', '));
91
+ */
92
+ export async function executeAnalyze(input) {
93
+ // Validate input
94
+ const validated = analyzeInputSchema.parse(input);
95
+ const analyzer = new CodebaseAnalyzer();
96
+ const context = await analyzer.analyze(validated.path, {
97
+ maxFiles: validated.max_files,
98
+ excludeDirs: validated.exclude_dirs,
99
+ includeDevDeps: validated.include_dev_deps,
100
+ });
101
+ // Transform to response format
102
+ return transformContextToResponse(context, analyzer);
103
+ }
104
+ /**
105
+ * Transform CodebaseContext to AnalyzeResponse
106
+ */
107
+ function transformContextToResponse(context, analyzer) {
108
+ // Get unique import modules (external only)
109
+ const uniqueImports = new Set();
110
+ for (const imp of context.imports) {
111
+ // Skip relative imports
112
+ if (!imp.module.startsWith('.') && !imp.module.startsWith('/')) {
113
+ // Get base package name (e.g., '@scope/pkg' or 'pkg')
114
+ const parts = imp.module.split('/');
115
+ const basePkg = imp.module.startsWith('@') ? `${parts[0]}/${parts[1]}` : parts[0];
116
+ uniqueImports.add(basePkg);
117
+ }
118
+ }
119
+ // Transform frameworks
120
+ const frameworks = context.frameworks
121
+ .slice(0, 10)
122
+ .map((f) => ({
123
+ name: f.name,
124
+ confidence: Math.round(f.confidence * 100),
125
+ }));
126
+ // Transform dependencies (top 20)
127
+ const dependencies = context.dependencies.slice(0, 20).map((d) => ({
128
+ name: d.name,
129
+ is_dev: d.isDev,
130
+ }));
131
+ // Get summary
132
+ const summary = analyzer.getSummary(context);
133
+ return {
134
+ frameworks,
135
+ dependencies,
136
+ imports: Array.from(uniqueImports).slice(0, 50),
137
+ stats: {
138
+ total_files: context.stats.totalFiles,
139
+ total_lines: context.stats.totalLines,
140
+ file_types: context.stats.filesByExtension,
141
+ },
142
+ summary,
143
+ timing: {
144
+ duration_ms: context.metadata.durationMs,
145
+ },
146
+ };
147
+ }
148
+ /**
149
+ * Format analysis results for terminal display
150
+ */
151
+ export function formatAnalysisResults(response) {
152
+ const lines = [];
153
+ lines.push('\n=== Codebase Analysis ===\n');
154
+ // Stats
155
+ lines.push(`Files: ${response.stats.total_files} | Lines: ${response.stats.total_lines.toLocaleString()}`);
156
+ lines.push(`Duration: ${response.timing.duration_ms}ms`);
157
+ lines.push('');
158
+ // File types
159
+ const fileTypes = Object.entries(response.stats.file_types)
160
+ .sort((a, b) => b[1] - a[1])
161
+ .map(([ext, count]) => `${ext}: ${count}`)
162
+ .join(', ');
163
+ lines.push(`File types: ${fileTypes}`);
164
+ lines.push('');
165
+ // Frameworks
166
+ if (response.frameworks.length > 0) {
167
+ lines.push('Frameworks detected:');
168
+ for (const fw of response.frameworks.slice(0, 5)) {
169
+ lines.push(` • ${fw.name} (${fw.confidence}% confidence)`);
170
+ }
171
+ lines.push('');
172
+ }
173
+ // Dependencies
174
+ if (response.dependencies.length > 0) {
175
+ const prodDeps = response.dependencies.filter((d) => !d.is_dev);
176
+ const devDeps = response.dependencies.filter((d) => d.is_dev);
177
+ if (prodDeps.length > 0) {
178
+ lines.push(`Dependencies (${prodDeps.length}):`);
179
+ lines.push(` ${prodDeps
180
+ .slice(0, 10)
181
+ .map((d) => d.name)
182
+ .join(', ')}`);
183
+ if (prodDeps.length > 10) {
184
+ lines.push(` ... and ${prodDeps.length - 10} more`);
185
+ }
186
+ lines.push('');
187
+ }
188
+ if (devDeps.length > 0) {
189
+ lines.push(`Dev dependencies (${devDeps.length}):`);
190
+ lines.push(` ${devDeps
191
+ .slice(0, 10)
192
+ .map((d) => d.name)
193
+ .join(', ')}`);
194
+ if (devDeps.length > 10) {
195
+ lines.push(` ... and ${devDeps.length - 10} more`);
196
+ }
197
+ lines.push('');
198
+ }
199
+ }
200
+ // Summary
201
+ lines.push('---');
202
+ lines.push(`Summary: ${response.summary}`);
203
+ return lines.join('\n');
204
+ }
205
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * @fileoverview MCP Skill Compare Tool for comparing two skills
3
+ * @module @skillsmith/mcp-server/tools/compare
4
+ * @see SMI-743: Add MCP Tool skill_compare
5
+ * @see SMI-791: Wire compare tool to SkillRepository
6
+ *
7
+ * Compares two skills across multiple dimensions:
8
+ * - Quality scores
9
+ * - Trust tiers
10
+ * - Features and capabilities
11
+ * - Dependencies
12
+ * - Size and complexity
13
+ *
14
+ * @example
15
+ * // Compare two skills with context
16
+ * const result = await executeCompare({
17
+ * skill_a: 'community/jest-helper',
18
+ * skill_b: 'community/vitest-helper'
19
+ * }, context);
20
+ * console.log(result.recommendation);
21
+ */
22
+ import { z } from 'zod';
23
+ import { type MCPTrustTier as TrustTier, type ScoreBreakdown } from '@skillsmith/core';
24
+ import type { ToolContext } from '../context.js';
25
+ /**
26
+ * Zod schema for compare tool input validation
27
+ */
28
+ export declare const compareInputSchema: z.ZodObject<{
29
+ /** First skill ID to compare */
30
+ skill_a: z.ZodString;
31
+ /** Second skill ID to compare */
32
+ skill_b: z.ZodString;
33
+ }, "strip", z.ZodTypeAny, {
34
+ skill_a: string;
35
+ skill_b: string;
36
+ }, {
37
+ skill_a: string;
38
+ skill_b: string;
39
+ }>;
40
+ /**
41
+ * Input type derived from Zod schema
42
+ */
43
+ export type CompareInput = z.infer<typeof compareInputSchema>;
44
+ /**
45
+ * Summary of a skill for comparison
46
+ */
47
+ export interface SkillSummary {
48
+ /** Skill identifier */
49
+ id: string;
50
+ /** Skill name */
51
+ name: string;
52
+ /** Brief description */
53
+ description: string;
54
+ /** Author */
55
+ author: string;
56
+ /** Quality score (0-100) */
57
+ quality_score: number;
58
+ /** Score breakdown by category */
59
+ score_breakdown: ScoreBreakdown | null;
60
+ /** Trust tier */
61
+ trust_tier: TrustTier;
62
+ /** Category */
63
+ category: string;
64
+ /** Tags */
65
+ tags: string[];
66
+ /** Version if available */
67
+ version: string | null;
68
+ /** Dependencies */
69
+ dependencies: string[];
70
+ }
71
+ /**
72
+ * Difference between skills
73
+ */
74
+ export interface SkillDifference {
75
+ /** Field being compared */
76
+ field: string;
77
+ /** Value from skill A */
78
+ a_value: unknown;
79
+ /** Value from skill B */
80
+ b_value: unknown;
81
+ /** Winner if applicable */
82
+ winner?: 'a' | 'b' | 'tie';
83
+ }
84
+ /**
85
+ * Comparison response
86
+ */
87
+ export interface CompareResponse {
88
+ /** Summaries of both skills */
89
+ comparison: {
90
+ a: SkillSummary;
91
+ b: SkillSummary;
92
+ };
93
+ /** List of differences between skills */
94
+ differences: SkillDifference[];
95
+ /** Recommendation text */
96
+ recommendation: string;
97
+ /** Overall winner if determinable */
98
+ winner: 'a' | 'b' | 'tie';
99
+ /** Performance timing */
100
+ timing: {
101
+ totalMs: number;
102
+ };
103
+ }
104
+ /**
105
+ * MCP tool schema definition for skill_compare
106
+ */
107
+ export declare const compareToolSchema: {
108
+ name: string;
109
+ description: string;
110
+ inputSchema: {
111
+ type: "object";
112
+ properties: {
113
+ skill_a: {
114
+ type: string;
115
+ description: string;
116
+ };
117
+ skill_b: {
118
+ type: string;
119
+ description: string;
120
+ };
121
+ };
122
+ required: string[];
123
+ };
124
+ };
125
+ /**
126
+ * Execute skill comparison.
127
+ *
128
+ * Uses SkillRepository to fetch skills from the database and compares them
129
+ * across multiple dimensions including quality scores, trust tiers, features,
130
+ * and dependencies.
131
+ *
132
+ * @param input - Comparison parameters with two skill IDs
133
+ * @param context - Tool context with database and services
134
+ * @returns Promise resolving to comparison response
135
+ * @throws {SkillsmithError} When skill IDs are invalid or not found
136
+ *
137
+ * @example
138
+ * const response = await executeCompare({
139
+ * skill_a: 'community/jest-helper',
140
+ * skill_b: 'community/vitest-helper'
141
+ * }, context);
142
+ * console.log(response.recommendation);
143
+ */
144
+ export declare function executeCompare(input: CompareInput, context: ToolContext): Promise<CompareResponse>;
145
+ /**
146
+ * Format comparison results for terminal display
147
+ */
148
+ export declare function formatComparisonResults(response: CompareResponse): string;
149
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/tools/compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAEL,KAAK,YAAY,IAAI,SAAS,EAC9B,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;GAEG;AACH,eAAO,MAAM,kBAAkB;IAC7B,gCAAgC;;IAEhC,iCAAiC;;;;;;;;EAEjC,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa;IACb,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,eAAe,EAAE,cAAc,GAAG,IAAI,CAAA;IACtC,iBAAiB;IACjB,UAAU,EAAE,SAAS,CAAA;IACrB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,2BAA2B;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,mBAAmB;IACnB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,UAAU,EAAE;QACV,CAAC,EAAE,YAAY,CAAA;QACf,CAAC,EAAE,YAAY,CAAA;KAChB,CAAA;IACD,yCAAyC;IACzC,WAAW,EAAE,eAAe,EAAE,CAAA;IAC9B,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,qCAAqC;IACrC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAA;IACzB,yBAAyB;IACzB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAkB7B,CAAA;AAgSD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,CAAC,CAiF1B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoGzE"}