sdl-mcp 0.6.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 (496) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/config/benchmark.ci.config.json +86 -0
  4. package/config/benchmark.ci.windows.config.json +86 -0
  5. package/config/benchmark.config.example.json +86 -0
  6. package/config/benchmark.config.json +86 -0
  7. package/config/sdlmcp.config.example.json +139 -0
  8. package/config/sdlmcp.config.json +48 -0
  9. package/config/sdlmcp.config.schema.json +381 -0
  10. package/dist/agent/evidence.d.ts +18 -0
  11. package/dist/agent/evidence.d.ts.map +1 -0
  12. package/dist/agent/evidence.js +107 -0
  13. package/dist/agent/evidence.js.map +1 -0
  14. package/dist/agent/executor.d.ts +28 -0
  15. package/dist/agent/executor.d.ts.map +1 -0
  16. package/dist/agent/executor.js +261 -0
  17. package/dist/agent/executor.js.map +1 -0
  18. package/dist/agent/index.d.ts +6 -0
  19. package/dist/agent/index.d.ts.map +1 -0
  20. package/dist/agent/index.js +6 -0
  21. package/dist/agent/index.js.map +1 -0
  22. package/dist/agent/orchestrator.d.ts +14 -0
  23. package/dist/agent/orchestrator.d.ts.map +1 -0
  24. package/dist/agent/orchestrator.js +108 -0
  25. package/dist/agent/orchestrator.js.map +1 -0
  26. package/dist/agent/planner.d.ts +21 -0
  27. package/dist/agent/planner.d.ts.map +1 -0
  28. package/dist/agent/planner.js +153 -0
  29. package/dist/agent/planner.js.map +1 -0
  30. package/dist/agent/types.d.ts +86 -0
  31. package/dist/agent/types.d.ts.map +1 -0
  32. package/dist/agent/types.js +2 -0
  33. package/dist/agent/types.js.map +1 -0
  34. package/dist/benchmark/index.d.ts +4 -0
  35. package/dist/benchmark/index.d.ts.map +1 -0
  36. package/dist/benchmark/index.js +4 -0
  37. package/dist/benchmark/index.js.map +1 -0
  38. package/dist/benchmark/regression.d.ts +40 -0
  39. package/dist/benchmark/regression.d.ts.map +1 -0
  40. package/dist/benchmark/regression.js +199 -0
  41. package/dist/benchmark/regression.js.map +1 -0
  42. package/dist/benchmark/smoothing.d.ts +40 -0
  43. package/dist/benchmark/smoothing.d.ts.map +1 -0
  44. package/dist/benchmark/smoothing.js +121 -0
  45. package/dist/benchmark/smoothing.js.map +1 -0
  46. package/dist/benchmark/threshold.d.ts +64 -0
  47. package/dist/benchmark/threshold.d.ts.map +1 -0
  48. package/dist/benchmark/threshold.js +173 -0
  49. package/dist/benchmark/threshold.js.map +1 -0
  50. package/dist/cli/argParsing.d.ts +34 -0
  51. package/dist/cli/argParsing.d.ts.map +1 -0
  52. package/dist/cli/argParsing.js +329 -0
  53. package/dist/cli/argParsing.js.map +1 -0
  54. package/dist/cli/commands/benchmark.d.ts +16 -0
  55. package/dist/cli/commands/benchmark.d.ts.map +1 -0
  56. package/dist/cli/commands/benchmark.js +412 -0
  57. package/dist/cli/commands/benchmark.js.map +1 -0
  58. package/dist/cli/commands/doctor.d.ts +3 -0
  59. package/dist/cli/commands/doctor.d.ts.map +1 -0
  60. package/dist/cli/commands/doctor.js +218 -0
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/export.d.ts +12 -0
  63. package/dist/cli/commands/export.d.ts.map +1 -0
  64. package/dist/cli/commands/export.js +70 -0
  65. package/dist/cli/commands/export.js.map +1 -0
  66. package/dist/cli/commands/import.d.ts +10 -0
  67. package/dist/cli/commands/import.d.ts.map +1 -0
  68. package/dist/cli/commands/import.js +40 -0
  69. package/dist/cli/commands/import.js.map +1 -0
  70. package/dist/cli/commands/index.d.ts +3 -0
  71. package/dist/cli/commands/index.d.ts.map +1 -0
  72. package/dist/cli/commands/index.js +89 -0
  73. package/dist/cli/commands/index.js.map +1 -0
  74. package/dist/cli/commands/init.d.ts +3 -0
  75. package/dist/cli/commands/init.d.ts.map +1 -0
  76. package/dist/cli/commands/init.js +221 -0
  77. package/dist/cli/commands/init.js.map +1 -0
  78. package/dist/cli/commands/pull.d.ts +11 -0
  79. package/dist/cli/commands/pull.d.ts.map +1 -0
  80. package/dist/cli/commands/pull.js +47 -0
  81. package/dist/cli/commands/pull.js.map +1 -0
  82. package/dist/cli/commands/serve.d.ts +3 -0
  83. package/dist/cli/commands/serve.d.ts.map +1 -0
  84. package/dist/cli/commands/serve.js +72 -0
  85. package/dist/cli/commands/serve.js.map +1 -0
  86. package/dist/cli/commands/version.d.ts +3 -0
  87. package/dist/cli/commands/version.d.ts.map +1 -0
  88. package/dist/cli/commands/version.js +24 -0
  89. package/dist/cli/commands/version.js.map +1 -0
  90. package/dist/cli/index.d.ts +3 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +213 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/logging.d.ts +10 -0
  95. package/dist/cli/logging.d.ts.map +1 -0
  96. package/dist/cli/logging.js +48 -0
  97. package/dist/cli/logging.js.map +1 -0
  98. package/dist/cli/transport/http.d.ts +3 -0
  99. package/dist/cli/transport/http.d.ts.map +1 -0
  100. package/dist/cli/transport/http.js +106 -0
  101. package/dist/cli/transport/http.js.map +1 -0
  102. package/dist/cli/transport/stdio.d.ts +3 -0
  103. package/dist/cli/transport/stdio.d.ts.map +1 -0
  104. package/dist/cli/transport/stdio.js +6 -0
  105. package/dist/cli/transport/stdio.js.map +1 -0
  106. package/dist/cli/types.d.ts +41 -0
  107. package/dist/cli/types.d.ts.map +1 -0
  108. package/dist/cli/types.js +2 -0
  109. package/dist/cli/types.js.map +1 -0
  110. package/dist/code/gate.d.ts +11 -0
  111. package/dist/code/gate.d.ts.map +1 -0
  112. package/dist/code/gate.js +134 -0
  113. package/dist/code/gate.js.map +1 -0
  114. package/dist/code/hotpath.d.ts +17 -0
  115. package/dist/code/hotpath.d.ts.map +1 -0
  116. package/dist/code/hotpath.js +200 -0
  117. package/dist/code/hotpath.js.map +1 -0
  118. package/dist/code/redact.d.ts +19 -0
  119. package/dist/code/redact.d.ts.map +1 -0
  120. package/dist/code/redact.js +92 -0
  121. package/dist/code/redact.js.map +1 -0
  122. package/dist/code/skeleton.d.ts +32 -0
  123. package/dist/code/skeleton.d.ts.map +1 -0
  124. package/dist/code/skeleton.js +610 -0
  125. package/dist/code/skeleton.js.map +1 -0
  126. package/dist/code/windows.d.ts +18 -0
  127. package/dist/code/windows.d.ts.map +1 -0
  128. package/dist/code/windows.js +236 -0
  129. package/dist/code/windows.js.map +1 -0
  130. package/dist/config/constants.d.ts +340 -0
  131. package/dist/config/constants.d.ts.map +1 -0
  132. package/dist/config/constants.js +379 -0
  133. package/dist/config/constants.js.map +1 -0
  134. package/dist/config/loadConfig.d.ts +3 -0
  135. package/dist/config/loadConfig.d.ts.map +1 -0
  136. package/dist/config/loadConfig.js +71 -0
  137. package/dist/config/loadConfig.js.map +1 -0
  138. package/dist/config/types.d.ts +509 -0
  139. package/dist/config/types.d.ts.map +1 -0
  140. package/dist/config/types.js +139 -0
  141. package/dist/config/types.js.map +1 -0
  142. package/dist/db/db.d.ts +4 -0
  143. package/dist/db/db.d.ts.map +1 -0
  144. package/dist/db/db.js +47 -0
  145. package/dist/db/db.js.map +1 -0
  146. package/dist/db/migrations.d.ts +15 -0
  147. package/dist/db/migrations.d.ts.map +1 -0
  148. package/dist/db/migrations.js +81 -0
  149. package/dist/db/migrations.js.map +1 -0
  150. package/dist/db/queries.d.ts +440 -0
  151. package/dist/db/queries.d.ts.map +1 -0
  152. package/dist/db/queries.js +1054 -0
  153. package/dist/db/queries.js.map +1 -0
  154. package/dist/db/schema.d.ts +132 -0
  155. package/dist/db/schema.d.ts.map +1 -0
  156. package/dist/db/schema.js +2 -0
  157. package/dist/db/schema.js.map +1 -0
  158. package/dist/delta/blastRadius.d.ts +24 -0
  159. package/dist/delta/blastRadius.d.ts.map +1 -0
  160. package/dist/delta/blastRadius.js +239 -0
  161. package/dist/delta/blastRadius.js.map +1 -0
  162. package/dist/delta/diff.d.ts +16 -0
  163. package/dist/delta/diff.d.ts.map +1 -0
  164. package/dist/delta/diff.js +236 -0
  165. package/dist/delta/diff.js.map +1 -0
  166. package/dist/delta/versioning.d.ts +11 -0
  167. package/dist/delta/versioning.d.ts.map +1 -0
  168. package/dist/delta/versioning.js +68 -0
  169. package/dist/delta/versioning.js.map +1 -0
  170. package/dist/graph/buildGraph.d.ts +12 -0
  171. package/dist/graph/buildGraph.d.ts.map +1 -0
  172. package/dist/graph/buildGraph.js +81 -0
  173. package/dist/graph/buildGraph.js.map +1 -0
  174. package/dist/graph/cache.d.ts +111 -0
  175. package/dist/graph/cache.d.ts.map +1 -0
  176. package/dist/graph/cache.js +237 -0
  177. package/dist/graph/cache.js.map +1 -0
  178. package/dist/graph/metrics.d.ts +12 -0
  179. package/dist/graph/metrics.d.ts.map +1 -0
  180. package/dist/graph/metrics.js +253 -0
  181. package/dist/graph/metrics.js.map +1 -0
  182. package/dist/graph/minHeap.d.ts +91 -0
  183. package/dist/graph/minHeap.d.ts.map +1 -0
  184. package/dist/graph/minHeap.js +159 -0
  185. package/dist/graph/minHeap.js.map +1 -0
  186. package/dist/graph/overview.d.ts +22 -0
  187. package/dist/graph/overview.d.ts.map +1 -0
  188. package/dist/graph/overview.js +379 -0
  189. package/dist/graph/overview.js.map +1 -0
  190. package/dist/graph/score.d.ts +27 -0
  191. package/dist/graph/score.d.ts.map +1 -0
  192. package/dist/graph/score.js +214 -0
  193. package/dist/graph/score.js.map +1 -0
  194. package/dist/graph/slice.d.ts +51 -0
  195. package/dist/graph/slice.d.ts.map +1 -0
  196. package/dist/graph/slice.js +1047 -0
  197. package/dist/graph/slice.js.map +1 -0
  198. package/dist/graph/sliceCache.d.ts +33 -0
  199. package/dist/graph/sliceCache.d.ts.map +1 -0
  200. package/dist/graph/sliceCache.js +140 -0
  201. package/dist/graph/sliceCache.js.map +1 -0
  202. package/dist/indexer/adapter/BaseAdapter.d.ts +29 -0
  203. package/dist/indexer/adapter/BaseAdapter.d.ts.map +1 -0
  204. package/dist/indexer/adapter/BaseAdapter.js +97 -0
  205. package/dist/indexer/adapter/BaseAdapter.js.map +1 -0
  206. package/dist/indexer/adapter/LanguageAdapter.d.ts +20 -0
  207. package/dist/indexer/adapter/LanguageAdapter.d.ts.map +1 -0
  208. package/dist/indexer/adapter/LanguageAdapter.js +2 -0
  209. package/dist/indexer/adapter/LanguageAdapter.js.map +1 -0
  210. package/dist/indexer/adapter/adapters.d.ts +57 -0
  211. package/dist/indexer/adapter/adapters.d.ts.map +1 -0
  212. package/dist/indexer/adapter/adapters.js +129 -0
  213. package/dist/indexer/adapter/adapters.js.map +1 -0
  214. package/dist/indexer/adapter/c.d.ts +18 -0
  215. package/dist/indexer/adapter/c.d.ts.map +1 -0
  216. package/dist/indexer/adapter/c.js +443 -0
  217. package/dist/indexer/adapter/c.js.map +1 -0
  218. package/dist/indexer/adapter/cpp.d.ts +18 -0
  219. package/dist/indexer/adapter/cpp.d.ts.map +1 -0
  220. package/dist/indexer/adapter/cpp.js +493 -0
  221. package/dist/indexer/adapter/cpp.js.map +1 -0
  222. package/dist/indexer/adapter/csharp.d.ts +48 -0
  223. package/dist/indexer/adapter/csharp.d.ts.map +1 -0
  224. package/dist/indexer/adapter/csharp.js +638 -0
  225. package/dist/indexer/adapter/csharp.js.map +1 -0
  226. package/dist/indexer/adapter/go.d.ts +14 -0
  227. package/dist/indexer/adapter/go.d.ts.map +1 -0
  228. package/dist/indexer/adapter/go.js +400 -0
  229. package/dist/indexer/adapter/go.js.map +1 -0
  230. package/dist/indexer/adapter/index.d.ts +14 -0
  231. package/dist/indexer/adapter/index.d.ts.map +1 -0
  232. package/dist/indexer/adapter/index.js +13 -0
  233. package/dist/indexer/adapter/index.js.map +1 -0
  234. package/dist/indexer/adapter/java.d.ts +14 -0
  235. package/dist/indexer/adapter/java.d.ts.map +1 -0
  236. package/dist/indexer/adapter/java.js +391 -0
  237. package/dist/indexer/adapter/java.js.map +1 -0
  238. package/dist/indexer/adapter/kotlin.d.ts +18 -0
  239. package/dist/indexer/adapter/kotlin.d.ts.map +1 -0
  240. package/dist/indexer/adapter/kotlin.js +599 -0
  241. package/dist/indexer/adapter/kotlin.js.map +1 -0
  242. package/dist/indexer/adapter/php.d.ts +18 -0
  243. package/dist/indexer/adapter/php.d.ts.map +1 -0
  244. package/dist/indexer/adapter/php.js +574 -0
  245. package/dist/indexer/adapter/php.js.map +1 -0
  246. package/dist/indexer/adapter/plugin/index.d.ts +3 -0
  247. package/dist/indexer/adapter/plugin/index.d.ts.map +1 -0
  248. package/dist/indexer/adapter/plugin/index.js +3 -0
  249. package/dist/indexer/adapter/plugin/index.js.map +1 -0
  250. package/dist/indexer/adapter/plugin/loader.d.ts +13 -0
  251. package/dist/indexer/adapter/plugin/loader.d.ts.map +1 -0
  252. package/dist/indexer/adapter/plugin/loader.js +154 -0
  253. package/dist/indexer/adapter/plugin/loader.js.map +1 -0
  254. package/dist/indexer/adapter/plugin/types.d.ts +76 -0
  255. package/dist/indexer/adapter/plugin/types.d.ts.map +1 -0
  256. package/dist/indexer/adapter/plugin/types.js +47 -0
  257. package/dist/indexer/adapter/plugin/types.js.map +1 -0
  258. package/dist/indexer/adapter/python.d.ts +14 -0
  259. package/dist/indexer/adapter/python.d.ts.map +1 -0
  260. package/dist/indexer/adapter/python.js +511 -0
  261. package/dist/indexer/adapter/python.js.map +1 -0
  262. package/dist/indexer/adapter/registry.d.ts +17 -0
  263. package/dist/indexer/adapter/registry.d.ts.map +1 -0
  264. package/dist/indexer/adapter/registry.js +134 -0
  265. package/dist/indexer/adapter/registry.js.map +1 -0
  266. package/dist/indexer/adapter/rust.d.ts +18 -0
  267. package/dist/indexer/adapter/rust.d.ts.map +1 -0
  268. package/dist/indexer/adapter/rust.js +709 -0
  269. package/dist/indexer/adapter/rust.js.map +1 -0
  270. package/dist/indexer/adapter/shell.d.ts +18 -0
  271. package/dist/indexer/adapter/shell.d.ts.map +1 -0
  272. package/dist/indexer/adapter/shell.js +345 -0
  273. package/dist/indexer/adapter/shell.js.map +1 -0
  274. package/dist/indexer/adapter/typescript.d.ts +14 -0
  275. package/dist/indexer/adapter/typescript.d.ts.map +1 -0
  276. package/dist/indexer/adapter/typescript.js +31 -0
  277. package/dist/indexer/adapter/typescript.js.map +1 -0
  278. package/dist/indexer/configEdges.d.ts +30 -0
  279. package/dist/indexer/configEdges.d.ts.map +1 -0
  280. package/dist/indexer/configEdges.js +260 -0
  281. package/dist/indexer/configEdges.js.map +1 -0
  282. package/dist/indexer/fileScanner.d.ts +16 -0
  283. package/dist/indexer/fileScanner.d.ts.map +1 -0
  284. package/dist/indexer/fileScanner.js +90 -0
  285. package/dist/indexer/fileScanner.js.map +1 -0
  286. package/dist/indexer/fingerprints.d.ts +23 -0
  287. package/dist/indexer/fingerprints.d.ts.map +1 -0
  288. package/dist/indexer/fingerprints.js +97 -0
  289. package/dist/indexer/fingerprints.js.map +1 -0
  290. package/dist/indexer/indexer.d.ts +58 -0
  291. package/dist/indexer/indexer.d.ts.map +1 -0
  292. package/dist/indexer/indexer.js +1229 -0
  293. package/dist/indexer/indexer.js.map +1 -0
  294. package/dist/indexer/summaries.d.ts +5 -0
  295. package/dist/indexer/summaries.d.ts.map +1 -0
  296. package/dist/indexer/summaries.js +331 -0
  297. package/dist/indexer/summaries.js.map +1 -0
  298. package/dist/indexer/treesitter/extractCalls.d.ts +40 -0
  299. package/dist/indexer/treesitter/extractCalls.d.ts.map +1 -0
  300. package/dist/indexer/treesitter/extractCalls.js +561 -0
  301. package/dist/indexer/treesitter/extractCalls.js.map +1 -0
  302. package/dist/indexer/treesitter/extractImports.d.ts +12 -0
  303. package/dist/indexer/treesitter/extractImports.d.ts.map +1 -0
  304. package/dist/indexer/treesitter/extractImports.js +184 -0
  305. package/dist/indexer/treesitter/extractImports.js.map +1 -0
  306. package/dist/indexer/treesitter/extractSymbols.d.ts +24 -0
  307. package/dist/indexer/treesitter/extractSymbols.d.ts.map +1 -0
  308. package/dist/indexer/treesitter/extractSymbols.js +389 -0
  309. package/dist/indexer/treesitter/extractSymbols.js.map +1 -0
  310. package/dist/indexer/treesitter/grammarLoader.d.ts +6 -0
  311. package/dist/indexer/treesitter/grammarLoader.d.ts.map +1 -0
  312. package/dist/indexer/treesitter/grammarLoader.js +125 -0
  313. package/dist/indexer/treesitter/grammarLoader.js.map +1 -0
  314. package/dist/indexer/treesitter/symbolUtils.d.ts +4 -0
  315. package/dist/indexer/treesitter/symbolUtils.d.ts.map +1 -0
  316. package/dist/indexer/treesitter/symbolUtils.js +26 -0
  317. package/dist/indexer/treesitter/symbolUtils.js.map +1 -0
  318. package/dist/indexer/treesitter/tsTreesitter.d.ts +9 -0
  319. package/dist/indexer/treesitter/tsTreesitter.d.ts.map +1 -0
  320. package/dist/indexer/treesitter/tsTreesitter.js +54 -0
  321. package/dist/indexer/treesitter/tsTreesitter.js.map +1 -0
  322. package/dist/indexer/treesitter/types.d.ts +19 -0
  323. package/dist/indexer/treesitter/types.d.ts.map +1 -0
  324. package/dist/indexer/treesitter/types.js +7 -0
  325. package/dist/indexer/treesitter/types.js.map +1 -0
  326. package/dist/indexer/ts/tsParser.d.ts +20 -0
  327. package/dist/indexer/ts/tsParser.d.ts.map +1 -0
  328. package/dist/indexer/ts/tsParser.js +114 -0
  329. package/dist/indexer/ts/tsParser.js.map +1 -0
  330. package/dist/indexer/worker.d.ts +2 -0
  331. package/dist/indexer/worker.d.ts.map +1 -0
  332. package/dist/indexer/worker.js +59 -0
  333. package/dist/indexer/worker.js.map +1 -0
  334. package/dist/indexer/workerPool.d.ts +20 -0
  335. package/dist/indexer/workerPool.d.ts.map +1 -0
  336. package/dist/indexer/workerPool.js +93 -0
  337. package/dist/indexer/workerPool.js.map +1 -0
  338. package/dist/main.d.ts +2 -0
  339. package/dist/main.d.ts.map +1 -0
  340. package/dist/main.js +111 -0
  341. package/dist/main.js.map +1 -0
  342. package/dist/mcp/errors.d.ts +40 -0
  343. package/dist/mcp/errors.d.ts.map +1 -0
  344. package/dist/mcp/errors.js +66 -0
  345. package/dist/mcp/errors.js.map +1 -0
  346. package/dist/mcp/resources.d.ts +24 -0
  347. package/dist/mcp/resources.d.ts.map +1 -0
  348. package/dist/mcp/resources.js +140 -0
  349. package/dist/mcp/resources.js.map +1 -0
  350. package/dist/mcp/telemetry.d.ts +67 -0
  351. package/dist/mcp/telemetry.d.ts.map +1 -0
  352. package/dist/mcp/telemetry.js +128 -0
  353. package/dist/mcp/telemetry.js.map +1 -0
  354. package/dist/mcp/tools/agent.d.ts +241 -0
  355. package/dist/mcp/tools/agent.d.ts.map +1 -0
  356. package/dist/mcp/tools/agent.js +113 -0
  357. package/dist/mcp/tools/agent.js.map +1 -0
  358. package/dist/mcp/tools/code.d.ts +32 -0
  359. package/dist/mcp/tools/code.d.ts.map +1 -0
  360. package/dist/mcp/tools/code.js +388 -0
  361. package/dist/mcp/tools/code.js.map +1 -0
  362. package/dist/mcp/tools/delta.d.ts +12 -0
  363. package/dist/mcp/tools/delta.d.ts.map +1 -0
  364. package/dist/mcp/tools/delta.js +82 -0
  365. package/dist/mcp/tools/delta.js.map +1 -0
  366. package/dist/mcp/tools/index.d.ts +3 -0
  367. package/dist/mcp/tools/index.d.ts.map +1 -0
  368. package/dist/mcp/tools/index.js +35 -0
  369. package/dist/mcp/tools/index.js.map +1 -0
  370. package/dist/mcp/tools/policy.d.ts +20 -0
  371. package/dist/mcp/tools/policy.d.ts.map +1 -0
  372. package/dist/mcp/tools/policy.js +67 -0
  373. package/dist/mcp/tools/policy.js.map +1 -0
  374. package/dist/mcp/tools/prRisk.d.ts +34 -0
  375. package/dist/mcp/tools/prRisk.d.ts.map +1 -0
  376. package/dist/mcp/tools/prRisk.js +304 -0
  377. package/dist/mcp/tools/prRisk.js.map +1 -0
  378. package/dist/mcp/tools/repo.d.ts +46 -0
  379. package/dist/mcp/tools/repo.d.ts.map +1 -0
  380. package/dist/mcp/tools/repo.js +224 -0
  381. package/dist/mcp/tools/repo.js.map +1 -0
  382. package/dist/mcp/tools/slice.d.ts +44 -0
  383. package/dist/mcp/tools/slice.d.ts.map +1 -0
  384. package/dist/mcp/tools/slice.js +688 -0
  385. package/dist/mcp/tools/slice.js.map +1 -0
  386. package/dist/mcp/tools/symbol.d.ts +21 -0
  387. package/dist/mcp/tools/symbol.d.ts.map +1 -0
  388. package/dist/mcp/tools/symbol.js +416 -0
  389. package/dist/mcp/tools/symbol.js.map +1 -0
  390. package/dist/mcp/tools.d.ts +6003 -0
  391. package/dist/mcp/tools.d.ts.map +1 -0
  392. package/dist/mcp/tools.js +932 -0
  393. package/dist/mcp/tools.js.map +1 -0
  394. package/dist/mcp/types.d.ts +500 -0
  395. package/dist/mcp/types.d.ts.map +1 -0
  396. package/dist/mcp/types.js +2 -0
  397. package/dist/mcp/types.js.map +1 -0
  398. package/dist/policy/engine.d.ts +21 -0
  399. package/dist/policy/engine.d.ts.map +1 -0
  400. package/dist/policy/engine.js +477 -0
  401. package/dist/policy/engine.js.map +1 -0
  402. package/dist/policy/types.d.ts +73 -0
  403. package/dist/policy/types.d.ts.map +1 -0
  404. package/dist/policy/types.js +12 -0
  405. package/dist/policy/types.js.map +1 -0
  406. package/dist/server.d.ts +17 -0
  407. package/dist/server.d.ts.map +1 -0
  408. package/dist/server.js +136 -0
  409. package/dist/server.js.map +1 -0
  410. package/dist/sync/pull.d.ts +4 -0
  411. package/dist/sync/pull.d.ts.map +1 -0
  412. package/dist/sync/pull.js +113 -0
  413. package/dist/sync/pull.js.map +1 -0
  414. package/dist/sync/sync.d.ts +6 -0
  415. package/dist/sync/sync.d.ts.map +1 -0
  416. package/dist/sync/sync.js +244 -0
  417. package/dist/sync/sync.js.map +1 -0
  418. package/dist/sync/types.d.ts +136 -0
  419. package/dist/sync/types.d.ts.map +1 -0
  420. package/dist/sync/types.js +2 -0
  421. package/dist/sync/types.js.map +1 -0
  422. package/dist/ts/diagnostics.d.ts +61 -0
  423. package/dist/ts/diagnostics.d.ts.map +1 -0
  424. package/dist/ts/diagnostics.js +259 -0
  425. package/dist/ts/diagnostics.js.map +1 -0
  426. package/dist/ts/mapping.d.ts +27 -0
  427. package/dist/ts/mapping.d.ts.map +1 -0
  428. package/dist/ts/mapping.js +68 -0
  429. package/dist/ts/mapping.js.map +1 -0
  430. package/dist/util/asyncFs.d.ts +103 -0
  431. package/dist/util/asyncFs.d.ts.map +1 -0
  432. package/dist/util/asyncFs.js +133 -0
  433. package/dist/util/asyncFs.js.map +1 -0
  434. package/dist/util/concurrency.d.ts +77 -0
  435. package/dist/util/concurrency.d.ts.map +1 -0
  436. package/dist/util/concurrency.js +146 -0
  437. package/dist/util/concurrency.js.map +1 -0
  438. package/dist/util/depLabels.d.ts +3 -0
  439. package/dist/util/depLabels.d.ts.map +1 -0
  440. package/dist/util/depLabels.js +19 -0
  441. package/dist/util/depLabels.js.map +1 -0
  442. package/dist/util/findPackageRoot.d.ts +7 -0
  443. package/dist/util/findPackageRoot.d.ts.map +1 -0
  444. package/dist/util/findPackageRoot.js +21 -0
  445. package/dist/util/findPackageRoot.js.map +1 -0
  446. package/dist/util/hashing.d.ts +9 -0
  447. package/dist/util/hashing.d.ts.map +1 -0
  448. package/dist/util/hashing.js +37 -0
  449. package/dist/util/hashing.js.map +1 -0
  450. package/dist/util/logger.d.ts +14 -0
  451. package/dist/util/logger.d.ts.map +1 -0
  452. package/dist/util/logger.js +51 -0
  453. package/dist/util/logger.js.map +1 -0
  454. package/dist/util/paths.d.ts +6 -0
  455. package/dist/util/paths.d.ts.map +1 -0
  456. package/dist/util/paths.js +79 -0
  457. package/dist/util/paths.js.map +1 -0
  458. package/dist/util/time.d.ts +4 -0
  459. package/dist/util/time.d.ts.map +1 -0
  460. package/dist/util/time.js +20 -0
  461. package/dist/util/time.js.map +1 -0
  462. package/dist/util/tokenize.d.ts +5 -0
  463. package/dist/util/tokenize.d.ts.map +1 -0
  464. package/dist/util/tokenize.js +30 -0
  465. package/dist/util/tokenize.js.map +1 -0
  466. package/dist/util/truncation.d.ts +38 -0
  467. package/dist/util/truncation.d.ts.map +1 -0
  468. package/dist/util/truncation.js +259 -0
  469. package/dist/util/truncation.js.map +1 -0
  470. package/migrations/.gitkeep +1 -0
  471. package/migrations/0001_init.sql +61 -0
  472. package/migrations/0002_edges_indexes.sql +2 -0
  473. package/migrations/0003_versions.sql +22 -0
  474. package/migrations/0004_metrics_audit.sql +23 -0
  475. package/migrations/0005_slice_handles.sql +15 -0
  476. package/migrations/0006_content_addressed.sql +29 -0
  477. package/migrations/0007_add_language_to_symbols.sql +28 -0
  478. package/migrations/0008_performance_indexes.sql +21 -0
  479. package/migrations/0009_fix_edge_fks.sql +37 -0
  480. package/migrations/0010_standardize_fks.sql +35 -0
  481. package/migrations/0011_add_directory_column.sql +20 -0
  482. package/migrations/0012_symbol_references.sql +16 -0
  483. package/migrations/0013_sync_artifacts.sql +17 -0
  484. package/package.json +107 -0
  485. package/templates/CLAUDE.md.template +179 -0
  486. package/templates/README.md +228 -0
  487. package/templates/claude-code.json +54 -0
  488. package/templates/codex.json +55 -0
  489. package/templates/gemini.json +66 -0
  490. package/templates/opencode.json +90 -0
  491. package/templates/plugin-template/LICENSE +21 -0
  492. package/templates/plugin-template/README.md +309 -0
  493. package/templates/plugin-template/index.ts +160 -0
  494. package/templates/plugin-template/package.json +31 -0
  495. package/templates/plugin-template/test/plugin.test.ts +186 -0
  496. package/templates/plugin-template/tsconfig.json +21 -0
@@ -0,0 +1,412 @@
1
+ #!/usr/bin/env node
2
+ import { writeFileSync, mkdirSync, existsSync } from "fs";
3
+ import { dirname, resolve } from "path";
4
+ import { getDb } from "../../db/db.js";
5
+ import { runMigrations } from "../../db/migrations.js";
6
+ import { loadConfig } from "../../config/loadConfig.js";
7
+ import * as db from "../../db/queries.js";
8
+ import { indexRepo } from "../../indexer/indexer.js";
9
+ import { buildSlice } from "../../graph/slice.js";
10
+ import { generateSymbolSkeleton } from "../../code/skeleton.js";
11
+ import { ThresholdEvaluator, loadThresholdConfig, loadBaselineMetrics, saveBaselineMetrics, } from "../../benchmark/threshold.js";
12
+ import { RegressionReportGenerator } from "../../benchmark/regression.js";
13
+ import { runBenchmarkWithSmoothing, } from "../../benchmark/smoothing.js";
14
+ function formatNumber(n) {
15
+ return n.toLocaleString();
16
+ }
17
+ function formatPercent(n) {
18
+ return `${n.toFixed(1)}%`;
19
+ }
20
+ function estimateTokens(text) {
21
+ return Math.ceil(text.length / 4);
22
+ }
23
+ function buildCardFromSymbol(repoId, symbol) {
24
+ const file = db.getFile(symbol.file_id);
25
+ if (!file)
26
+ return null;
27
+ const latestVersion = db.getLatestVersion(repoId);
28
+ const edgesFrom = db.getEdgesFrom(symbol.symbol_id);
29
+ const metrics = db.getMetrics(symbol.symbol_id);
30
+ const signature = symbol.signature_json
31
+ ? JSON.parse(symbol.signature_json)
32
+ : undefined;
33
+ const invariants = symbol.invariants_json
34
+ ? JSON.parse(symbol.invariants_json)
35
+ : undefined;
36
+ const sideEffects = symbol.side_effects_json
37
+ ? JSON.parse(symbol.side_effects_json)
38
+ : undefined;
39
+ const deps = {
40
+ imports: edgesFrom
41
+ .filter((e) => e.type === "import")
42
+ .map((e) => e.to_symbol_id),
43
+ calls: edgesFrom
44
+ .filter((e) => e.type === "call")
45
+ .map((e) => e.to_symbol_id),
46
+ };
47
+ const cardMetrics = metrics
48
+ ? {
49
+ fanIn: metrics.fan_in,
50
+ fanOut: metrics.fan_out,
51
+ churn30d: metrics.churn_30d,
52
+ testRefs: metrics.test_refs_json
53
+ ? JSON.parse(metrics.test_refs_json)
54
+ : undefined,
55
+ }
56
+ : undefined;
57
+ const card = {
58
+ symbolId: symbol.symbol_id,
59
+ repoId: symbol.repo_id,
60
+ file: file.rel_path,
61
+ range: {
62
+ startLine: symbol.range_start_line,
63
+ startCol: symbol.range_start_col,
64
+ endLine: symbol.range_end_line,
65
+ endCol: symbol.range_end_col,
66
+ },
67
+ kind: symbol.kind,
68
+ name: symbol.name,
69
+ exported: symbol.exported === 1,
70
+ visibility: symbol.visibility,
71
+ signature,
72
+ summary: symbol.summary ?? undefined,
73
+ invariants,
74
+ sideEffects,
75
+ deps,
76
+ metrics: cardMetrics,
77
+ version: {
78
+ ledgerVersion: latestVersion?.version_id ?? "current",
79
+ astFingerprint: symbol.ast_fingerprint,
80
+ },
81
+ };
82
+ const tokens = estimateTokens(JSON.stringify(card));
83
+ return { card, tokens };
84
+ }
85
+ async function collectBenchmarkMetrics(repoId, _repoPath, skipIndexing) {
86
+ const config = loadConfig();
87
+ const database = getDb(config.dbPath);
88
+ runMigrations(database);
89
+ let indexTimeMs = 0;
90
+ let filesIndexed = 0;
91
+ if (!skipIndexing) {
92
+ const indexStart = performance.now();
93
+ const indexResult = await indexRepo(repoId, "full");
94
+ indexTimeMs = performance.now() - indexStart;
95
+ filesIndexed = indexResult.filesProcessed;
96
+ }
97
+ const allSymbols = db.getSymbolsByRepo(repoId);
98
+ const edges = db.getEdgesByRepo(repoId);
99
+ const filesById = new Map(db.getFilesByRepo(repoId).map((file) => [file.file_id, file.rel_path]));
100
+ // Ensure benchmark symbol sampling is deterministic across platforms/runs.
101
+ const sortedSymbols = [...allSymbols].sort((a, b) => {
102
+ const pathA = filesById.get(a.file_id) ?? "";
103
+ const pathB = filesById.get(b.file_id) ?? "";
104
+ return (pathA.localeCompare(pathB) ||
105
+ a.range_start_line - b.range_start_line ||
106
+ a.range_start_col - b.range_start_col ||
107
+ a.kind.localeCompare(b.kind) ||
108
+ a.name.localeCompare(b.name) ||
109
+ a.symbol_id.localeCompare(b.symbol_id));
110
+ });
111
+ const srcSymbols = sortedSymbols.filter((symbol) => (filesById.get(symbol.file_id) ?? "").startsWith("src/"));
112
+ const samplingPool = srcSymbols.length > 0 ? srcSymbols : sortedSymbols;
113
+ const sampleSize = Math.min(20, samplingPool.length);
114
+ const sampleSymbols = samplingPool.slice(0, sampleSize);
115
+ let totalCardTokens = 0;
116
+ let totalSkeletonTokens = 0;
117
+ let skeletonCount = 0;
118
+ let skeletonTimeMs = 0;
119
+ for (const symbol of sampleSymbols) {
120
+ try {
121
+ const cardResult = buildCardFromSymbol(repoId, symbol);
122
+ if (cardResult) {
123
+ totalCardTokens += cardResult.tokens;
124
+ }
125
+ if (symbol.kind === "function" || symbol.kind === "method") {
126
+ const skelStart = performance.now();
127
+ try {
128
+ const skeleton = generateSymbolSkeleton(repoId, symbol.symbol_id);
129
+ skeletonTimeMs += performance.now() - skelStart;
130
+ if (skeleton?.skeleton) {
131
+ totalSkeletonTokens += estimateTokens(skeleton.skeleton);
132
+ skeletonCount++;
133
+ }
134
+ }
135
+ catch {
136
+ skeletonTimeMs += performance.now() - skelStart;
137
+ }
138
+ }
139
+ }
140
+ catch {
141
+ // Skip problematic symbols
142
+ }
143
+ }
144
+ const avgCardTokens = sampleSize > 0 ? totalCardTokens / sampleSize : 0;
145
+ const avgSkeletonTokens = skeletonCount > 0 ? totalSkeletonTokens / skeletonCount : 0;
146
+ let sliceBuildTimeMs = 0;
147
+ if (sortedSymbols.length > 0) {
148
+ const outDegreeBySymbol = edges.reduce((counts, edge) => {
149
+ counts.set(edge.from_symbol_id, (counts.get(edge.from_symbol_id) ?? 0) + 1);
150
+ return counts;
151
+ }, new Map());
152
+ const srcFunctionSymbols = srcSymbols.filter((s) => s.kind === "function" || s.kind === "method");
153
+ const allFunctionSymbols = sortedSymbols.filter((s) => s.kind === "function" || s.kind === "method");
154
+ const seedCandidates = srcFunctionSymbols.length > 0 ? srcFunctionSymbols : allFunctionSymbols;
155
+ const seedSymbol = seedCandidates.find((sym) => {
156
+ const outDegree = outDegreeBySymbol.get(sym.symbol_id) ?? 0;
157
+ return outDegree >= 3 && outDegree <= 40;
158
+ }) ??
159
+ seedCandidates[0] ??
160
+ sortedSymbols[0];
161
+ const latestVersion = db.getLatestVersion(repoId);
162
+ const versionId = latestVersion?.version_id ?? "current";
163
+ try {
164
+ const sliceStart = performance.now();
165
+ await buildSlice({
166
+ repoId,
167
+ versionId,
168
+ entrySymbols: [seedSymbol.symbol_id],
169
+ taskText: "understand implementation",
170
+ budget: { maxCards: 20, maxEstimatedTokens: 4000 },
171
+ });
172
+ sliceBuildTimeMs = performance.now() - sliceStart;
173
+ }
174
+ catch {
175
+ // Slice build errors are non-critical for metrics
176
+ }
177
+ }
178
+ const exportedCount = allSymbols.filter((s) => s.exported === 1).length;
179
+ const functionMethodCount = allSymbols.filter((s) => s.kind === "function" || s.kind === "method").length;
180
+ const indexedSymbolIds = new Set(allSymbols.map((s) => s.symbol_id));
181
+ const symbolsWithInternalEdges = new Set(edges
182
+ .flatMap((e) => [e.from_symbol_id, e.to_symbol_id])
183
+ .filter((id) => indexedSymbolIds.has(id))).size;
184
+ const graphConnectivity = allSymbols.length > 0 ? symbolsWithInternalEdges / allSymbols.length : 0;
185
+ const edgeTypes = edges.reduce((acc, e) => {
186
+ acc[e.type] = (acc[e.type] || 0) + 1;
187
+ return acc;
188
+ }, {});
189
+ if (filesIndexed === 0) {
190
+ filesIndexed = filesById.size;
191
+ }
192
+ const totalSymbols = allSymbols.length;
193
+ const totalFiles = filesIndexed > 0 ? filesIndexed : 1;
194
+ return {
195
+ indexTimePerFile: totalFiles > 0 ? indexTimeMs / totalFiles : 0,
196
+ indexTimePerSymbol: totalSymbols > 0 ? indexTimeMs / totalSymbols : 0,
197
+ symbolsPerFile: totalFiles > 0 ? totalSymbols / totalFiles : 0,
198
+ edgesPerSymbol: totalSymbols > 0 ? edges.length / totalSymbols : 0,
199
+ graphConnectivity,
200
+ exportedSymbolRatio: totalSymbols > 0 ? exportedCount / totalSymbols : 0,
201
+ sliceBuildTimeMs,
202
+ avgSkeletonTimeMs: skeletonCount > 0 ? skeletonTimeMs / skeletonCount : 0,
203
+ avgCardTokens,
204
+ avgSkeletonTokens,
205
+ functionMethodRatio: totalSymbols > 0 ? functionMethodCount / totalSymbols : 0,
206
+ avgDepsPerSymbol: totalSymbols > 0 ? edges.length / totalSymbols : 0,
207
+ callEdgeCount: edgeTypes.call ?? 0,
208
+ importEdgeCount: edgeTypes.import ?? 0,
209
+ totalSymbols,
210
+ totalFiles,
211
+ };
212
+ }
213
+ export async function benchmarkCICommand(options) {
214
+ console.log("Benchmark CI: Running benchmark guardrails...\n");
215
+ const config = loadConfig();
216
+ const repoConfig = options.repoId
217
+ ? config.repos.find((r) => r.repoId === options.repoId)
218
+ : config.repos[0];
219
+ if (!repoConfig) {
220
+ console.error(`Repository not found: ${options.repoId || "default"}`);
221
+ return 1;
222
+ }
223
+ const repoId = repoConfig.repoId;
224
+ const configuredRepoPath = resolve(repoConfig.rootPath);
225
+ const repoPath = existsSync(configuredRepoPath)
226
+ ? configuredRepoPath
227
+ : process.cwd();
228
+ if (!existsSync(configuredRepoPath)) {
229
+ console.warn(`[WARN] Configured repository path does not exist: ${configuredRepoPath}`);
230
+ console.warn(`[WARN] Falling back to current working directory: ${repoPath}`);
231
+ }
232
+ const database = getDb(config.dbPath);
233
+ runMigrations(database);
234
+ const repoRuntimeConfigJson = JSON.stringify({
235
+ ignore: repoConfig.ignore,
236
+ languages: repoConfig.languages,
237
+ maxFileBytes: repoConfig.maxFileBytes,
238
+ packageJsonPath: repoConfig.packageJsonPath,
239
+ tsconfigPath: repoConfig.tsconfigPath,
240
+ workspaceGlobs: repoConfig.workspaceGlobs,
241
+ });
242
+ const persistedRepo = db.getRepo(repoId);
243
+ if (!persistedRepo) {
244
+ db.createRepo({
245
+ repo_id: repoId,
246
+ root_path: repoPath,
247
+ config_json: repoRuntimeConfigJson,
248
+ created_at: new Date().toISOString(),
249
+ });
250
+ }
251
+ else {
252
+ const repoUpdates = {};
253
+ if (persistedRepo.root_path !== repoPath) {
254
+ repoUpdates.root_path = repoPath;
255
+ }
256
+ if (persistedRepo.config_json !== repoRuntimeConfigJson) {
257
+ repoUpdates.config_json = repoRuntimeConfigJson;
258
+ }
259
+ if (Object.keys(repoUpdates).length > 0) {
260
+ db.updateRepo(repoId, repoUpdates);
261
+ }
262
+ }
263
+ const thresholdPath = options.thresholdPath ??
264
+ resolve(process.cwd(), "config/benchmark.config.json");
265
+ const outputPath = options.outputPath ?? resolve(process.cwd(), ".benchmark/latest.json");
266
+ let thresholds;
267
+ try {
268
+ thresholds = loadThresholdConfig(thresholdPath);
269
+ console.log(`✓ Loaded threshold config from: ${thresholdPath}`);
270
+ }
271
+ catch (error) {
272
+ console.warn(`⚠ Could not load threshold config: ${error}`);
273
+ console.warn(" Continuing without threshold evaluation...");
274
+ }
275
+ const baselinePath = options.baselinePath ??
276
+ resolve(process.cwd(), thresholds?.baseline.filePath ?? ".benchmark/baseline.json");
277
+ console.log(`\nBenchmarking repository: ${repoId}`);
278
+ console.log(`Repository path: ${repoPath}`);
279
+ if (thresholds) {
280
+ console.log(`\nSmoothing config: ${thresholds.smoothing.sampleRuns} sample runs, ${thresholds.smoothing.warmupRuns} warmup runs`);
281
+ }
282
+ let benchmarkMetrics;
283
+ if (thresholds) {
284
+ console.log(`\nRunning benchmark with smoothing...`);
285
+ const { smoothed } = await runBenchmarkWithSmoothing(thresholds.smoothing, () => collectBenchmarkMetrics(repoId, repoPath, options.skipIndexing ?? false).then((m) => m));
286
+ benchmarkMetrics = smoothed;
287
+ console.log(`✓ Benchmark complete with smoothing`);
288
+ }
289
+ else {
290
+ console.log(`\nRunning benchmark (single run)...`);
291
+ benchmarkMetrics = await collectBenchmarkMetrics(repoId, repoPath, options.skipIndexing ?? false);
292
+ console.log(`✓ Benchmark complete`);
293
+ }
294
+ console.log("\n=== Benchmark Metrics ===");
295
+ console.log(`Indexing:`);
296
+ console.log(` Time per file: ${formatNumber(benchmarkMetrics.indexTimePerFile)}ms`);
297
+ console.log(` Time per symbol: ${formatNumber(benchmarkMetrics.indexTimePerSymbol)}ms`);
298
+ console.log(`Quality:`);
299
+ console.log(` Symbols per file: ${formatNumber(benchmarkMetrics.symbolsPerFile)}`);
300
+ console.log(` Edges per symbol: ${formatNumber(benchmarkMetrics.edgesPerSymbol)}`);
301
+ console.log(` Graph connectivity: ${formatPercent(benchmarkMetrics.graphConnectivity * 100)}`);
302
+ console.log(` Exported ratio: ${formatPercent(benchmarkMetrics.exportedSymbolRatio * 100)}`);
303
+ console.log(`Performance:`);
304
+ console.log(` Slice build: ${formatNumber(benchmarkMetrics.sliceBuildTimeMs)}ms`);
305
+ console.log(` Skeleton time: ${formatNumber(benchmarkMetrics.avgSkeletonTimeMs)}ms`);
306
+ console.log(`Token Efficiency:`);
307
+ console.log(` Avg card tokens: ${formatNumber(benchmarkMetrics.avgCardTokens)}`);
308
+ console.log(` Avg skeleton tokens:${formatNumber(benchmarkMetrics.avgSkeletonTokens)}`);
309
+ console.log(`Coverage:`);
310
+ console.log(` Call edges: ${formatNumber(benchmarkMetrics.callEdgeCount)}`);
311
+ console.log(` Import edges: ${formatNumber(benchmarkMetrics.importEdgeCount)}`);
312
+ let baselineMetrics;
313
+ try {
314
+ baselineMetrics = loadBaselineMetrics(baselinePath);
315
+ if (baselineMetrics) {
316
+ console.log(`\n✓ Loaded baseline from: ${baselinePath}`);
317
+ }
318
+ else {
319
+ console.log(`\n⚠ No baseline found at: ${baselinePath}`);
320
+ console.log(` Use --update-baseline to create one`);
321
+ }
322
+ }
323
+ catch (error) {
324
+ console.warn(`\n⚠ Could not load baseline: ${error}`);
325
+ }
326
+ let thresholdResult;
327
+ let regressionReport;
328
+ if (thresholds) {
329
+ const evaluator = new ThresholdEvaluator(thresholds);
330
+ const currentMetrics = {
331
+ indexTimePerFile: benchmarkMetrics.indexTimePerFile,
332
+ indexTimePerSymbol: benchmarkMetrics.indexTimePerSymbol,
333
+ symbolsPerFile: benchmarkMetrics.symbolsPerFile,
334
+ edgesPerSymbol: benchmarkMetrics.edgesPerSymbol,
335
+ graphConnectivity: benchmarkMetrics.graphConnectivity,
336
+ exportedSymbolRatio: benchmarkMetrics.exportedSymbolRatio,
337
+ sliceBuildTimeMs: benchmarkMetrics.sliceBuildTimeMs,
338
+ avgSkeletonTimeMs: benchmarkMetrics.avgSkeletonTimeMs,
339
+ avgCardTokens: benchmarkMetrics.avgCardTokens,
340
+ avgSkeletonTokens: benchmarkMetrics.avgSkeletonTokens,
341
+ };
342
+ thresholdResult = evaluator.evaluate(currentMetrics, baselineMetrics);
343
+ console.log(`\n=== Threshold Evaluation ===`);
344
+ console.log(`Status: ${thresholdResult.passed ? "✅ PASSED" : "❌ FAILED"}`);
345
+ console.log(`Total: ${thresholdResult.summary.total}`);
346
+ console.log(`Passed: ${thresholdResult.summary.passed}`);
347
+ console.log(`Failed: ${thresholdResult.summary.failed}`);
348
+ const failed = thresholdResult.evaluations.filter((e) => !e.passed);
349
+ if (failed.length > 0) {
350
+ console.log(`\nFailed thresholds:`);
351
+ for (const evaluation of failed) {
352
+ console.log(` - ${evaluation.category}.${evaluation.metricName}: ${evaluation.message}`);
353
+ }
354
+ }
355
+ if (baselineMetrics) {
356
+ const reportGenerator = new RegressionReportGenerator();
357
+ regressionReport = reportGenerator.generate({
358
+ timestamp: new Date().toISOString(),
359
+ repoId,
360
+ currentMetrics,
361
+ baselineMetrics,
362
+ thresholds: thresholds.thresholds,
363
+ evaluations: thresholdResult.evaluations,
364
+ });
365
+ console.log(`\n=== Regression Summary ===`);
366
+ console.log(`Status: ${regressionReport.summary.passed ? "✅ PASSED" : "❌ FAILED"}`);
367
+ console.log(`Improved: ${regressionReport.summary.improved}`);
368
+ console.log(`Degraded: ${regressionReport.summary.degraded}`);
369
+ console.log(`Neutral: ${regressionReport.summary.neutral}`);
370
+ if (regressionReport.recommendations.length > 0) {
371
+ console.log(`\nRecommendations:`);
372
+ for (const rec of regressionReport.recommendations) {
373
+ console.log(` ${rec}`);
374
+ }
375
+ }
376
+ }
377
+ }
378
+ const result = {
379
+ timestamp: new Date().toISOString(),
380
+ repoId,
381
+ repoPath,
382
+ metrics: benchmarkMetrics,
383
+ thresholdResult,
384
+ regressionReport,
385
+ config: {
386
+ thresholdPath,
387
+ baselinePath,
388
+ smoothing: thresholds?.smoothing ?? {
389
+ warmupRuns: 0,
390
+ sampleRuns: 1,
391
+ outlierMethod: "none",
392
+ iqrMultiplier: 1.5,
393
+ },
394
+ },
395
+ };
396
+ const outputDir = dirname(outputPath);
397
+ if (!existsSync(outputDir)) {
398
+ mkdirSync(outputDir, { recursive: true });
399
+ }
400
+ writeFileSync(outputPath, JSON.stringify(result, null, 2), "utf-8");
401
+ console.log(`\n✓ Results saved to: ${outputPath}`);
402
+ if (options.jsonOutput) {
403
+ console.log(`\n${JSON.stringify(result, null, 2)}`);
404
+ }
405
+ if (options.updateBaseline) {
406
+ saveBaselineMetrics(baselinePath, result);
407
+ console.log(`\n✓ Baseline updated: ${baselinePath}`);
408
+ }
409
+ const exitCode = thresholdResult?.passed !== false ? 0 : 1;
410
+ return exitCode;
411
+ }
412
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../src/cli/commands/benchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { DoctorOptions } from "../types.js";
2
+ export declare function doctorCommand(options: DoctorOptions): Promise<void>;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5C,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCzE"}
@@ -0,0 +1,218 @@
1
+ import { access, constants, existsSync } from "fs";
2
+ import { resolve } from "path";
3
+ import { getDb } from "../../db/db.js";
4
+ import { NODE_MIN_MAJOR_VERSION } from "../../config/constants.js";
5
+ import Parser from "tree-sitter";
6
+ import TypeScript from "tree-sitter-typescript";
7
+ import C from "tree-sitter-c";
8
+ import Cpp from "tree-sitter-cpp";
9
+ import PHP from "tree-sitter-php";
10
+ import Rust from "tree-sitter-rust";
11
+ import Kotlin from "tree-sitter-kotlin";
12
+ import Bash from "tree-sitter-bash";
13
+ const DOCTOR_CHECKS = [
14
+ { name: "Node.js version", check: checkNodeVersion },
15
+ { name: "Config file exists", check: checkConfigExists },
16
+ { name: "Config file readable", check: checkConfigReadable },
17
+ { name: "Database path writable", check: checkDatabaseWritable },
18
+ { name: "Tree-sitter grammars available", check: checkTreeSitterGrammar },
19
+ { name: "Repo paths accessible", check: checkRepoPaths },
20
+ ];
21
+ export async function doctorCommand(options) {
22
+ console.log("Running SDL-MCP environment checks...\n");
23
+ const results = [];
24
+ for (const { name, check } of DOCTOR_CHECKS) {
25
+ try {
26
+ const result = await check(options);
27
+ results.push({ name, ...result });
28
+ }
29
+ catch (error) {
30
+ results.push({
31
+ name,
32
+ status: "fail",
33
+ message: error instanceof Error ? error.message : String(error),
34
+ });
35
+ }
36
+ }
37
+ displayResults(results);
38
+ const failed = results.filter((r) => r.status === "fail").length;
39
+ if (failed > 0) {
40
+ console.log(`\n✗ ${failed} check(s) failed. Please fix the issues above.`);
41
+ process.exit(1);
42
+ }
43
+ const warned = results.filter((r) => r.status === "warn").length;
44
+ if (warned > 0) {
45
+ console.log(`\n⚠ ${warned} warning(s). SDL-MCP may work but with limitations.`);
46
+ }
47
+ else {
48
+ console.log("\n✓ All checks passed!");
49
+ }
50
+ }
51
+ async function checkNodeVersion(_options) {
52
+ const version = process.version;
53
+ const major = parseInt(version.slice(1).split(".")[0], 10);
54
+ if (major >= NODE_MIN_MAJOR_VERSION) {
55
+ return {
56
+ status: "pass",
57
+ message: `Node.js ${version} (>= ${NODE_MIN_MAJOR_VERSION}.0.0)`,
58
+ };
59
+ }
60
+ return {
61
+ status: "fail",
62
+ message: `Node.js ${version} (requires >= ${NODE_MIN_MAJOR_VERSION}.0.0)`,
63
+ };
64
+ }
65
+ async function checkConfigExists(options) {
66
+ const configPath = options.config ?? resolve("./config/sdlmcp.config.json");
67
+ process.env.SDL_CONFIG = configPath;
68
+ if (existsSync(configPath)) {
69
+ return { status: "pass", message: configPath };
70
+ }
71
+ return {
72
+ status: "fail",
73
+ message: `Config not found: ${configPath}\n Run: sdl-mcp init`,
74
+ };
75
+ }
76
+ async function checkConfigReadable(options) {
77
+ const configPath = options.config ?? resolve("./config/sdlmcp.config.json");
78
+ if (!existsSync(configPath)) {
79
+ return { status: "warn", message: "Config file not found (skip)" };
80
+ }
81
+ try {
82
+ await new Promise((resolve_, reject) => {
83
+ access(configPath, constants.R_OK, (err) => {
84
+ if (err)
85
+ reject(err);
86
+ else
87
+ resolve_();
88
+ });
89
+ });
90
+ return { status: "pass", message: configPath };
91
+ }
92
+ catch (error) {
93
+ return {
94
+ status: "fail",
95
+ message: `Cannot read config: ${configPath}`,
96
+ };
97
+ }
98
+ }
99
+ async function checkDatabaseWritable(_options) {
100
+ try {
101
+ const db = getDb(":memory:");
102
+ db.close();
103
+ return { status: "pass", message: "SQLite database initialization works" };
104
+ }
105
+ catch (error) {
106
+ return {
107
+ status: "fail",
108
+ message: `SQLite error: ${error instanceof Error ? error.message : String(error)}`,
109
+ };
110
+ }
111
+ }
112
+ async function checkTreeSitterGrammar(_options) {
113
+ const grammars = [
114
+ { name: "TypeScript", module: TypeScript, langProp: "typescript" },
115
+ { name: "C", module: C, langProp: null },
116
+ { name: "C++", module: Cpp, langProp: null },
117
+ { name: "PHP", module: PHP, langProp: "php" },
118
+ { name: "Rust", module: Rust, langProp: null },
119
+ { name: "Kotlin", module: Kotlin, langProp: null },
120
+ { name: "Bash", module: Bash, langProp: null },
121
+ ];
122
+ const results = [];
123
+ try {
124
+ for (const grammar of grammars) {
125
+ try {
126
+ let language;
127
+ if (grammar.langProp) {
128
+ language = grammar.module[grammar.langProp];
129
+ }
130
+ else {
131
+ language = grammar.module;
132
+ }
133
+ const parser = new Parser();
134
+ parser.setLanguage(language);
135
+ results.push({ name: grammar.name, success: true });
136
+ }
137
+ catch (error) {
138
+ results.push({
139
+ name: grammar.name,
140
+ success: false,
141
+ error: error instanceof Error ? error.message : String(error),
142
+ });
143
+ }
144
+ }
145
+ const failed = results.filter((r) => !r.success);
146
+ if (failed.length === 0) {
147
+ return {
148
+ status: "pass",
149
+ message: `All ${grammars.length} grammars loaded (${grammars.map((g) => g.name).join(", ")})`,
150
+ };
151
+ }
152
+ const failedList = failed.map((f) => `${f.name}: ${f.error}`).join("\n ");
153
+ const failedPkgs = failed
154
+ .map((f) => {
155
+ const grammar = grammars.find((g) => g.name === f.name);
156
+ const pkgMap = {
157
+ TypeScript: "tree-sitter-typescript",
158
+ C: "tree-sitter-c",
159
+ "C++": "tree-sitter-cpp",
160
+ PHP: "tree-sitter-php",
161
+ Rust: "tree-sitter-rust",
162
+ Kotlin: "tree-sitter-kotlin",
163
+ Bash: "tree-sitter-bash",
164
+ };
165
+ return grammar ? pkgMap[grammar.name] : "";
166
+ })
167
+ .filter(Boolean);
168
+ return {
169
+ status: "fail",
170
+ message: `Failed to load ${failed.length} grammar(s):\n ${failedList}\n\n Install missing grammars: npm install ${failedPkgs.join(" ")}`,
171
+ };
172
+ }
173
+ catch (error) {
174
+ return {
175
+ status: "fail",
176
+ message: `Cannot load tree-sitter: ${error instanceof Error ? error.message : String(error)}`,
177
+ };
178
+ }
179
+ }
180
+ async function checkRepoPaths(options) {
181
+ const configPath = options.config ?? resolve("./config/sdlmcp.config.json");
182
+ if (!existsSync(configPath)) {
183
+ return { status: "warn", message: "Config not found (skip repo checks)" };
184
+ }
185
+ try {
186
+ const { loadConfig } = await import("../../config/loadConfig.js");
187
+ const config = loadConfig(configPath);
188
+ const inaccessible = [];
189
+ for (const repo of config.repos) {
190
+ if (!existsSync(repo.rootPath)) {
191
+ inaccessible.push(repo.rootPath);
192
+ }
193
+ }
194
+ if (inaccessible.length === 0) {
195
+ return {
196
+ status: "pass",
197
+ message: `All ${config.repos.length} repo(s) accessible`,
198
+ };
199
+ }
200
+ return {
201
+ status: "fail",
202
+ message: `Inaccessible repos:\n${inaccessible.map((p) => ` - ${p}`).join("\n")}`,
203
+ };
204
+ }
205
+ catch (error) {
206
+ return {
207
+ status: "warn",
208
+ message: `Cannot verify repo paths: ${error instanceof Error ? error.message : String(error)}`,
209
+ };
210
+ }
211
+ }
212
+ function displayResults(results) {
213
+ for (const result of results) {
214
+ const icon = result.status === "pass" ? "✓" : result.status === "fail" ? "✗" : "⚠";
215
+ console.log(`${icon} ${result.name}: ${result.message}`);
216
+ }
217
+ }
218
+ //# sourceMappingURL=doctor.js.map