codebase-onboarder 0.6.0 → 0.7.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 (448) hide show
  1. package/README.md +174 -46
  2. package/bin/build-if-source.js +23 -0
  3. package/cli/commands.d.ts +26 -0
  4. package/cli/commands.js +836 -811
  5. package/cli/commands.js.map +1 -0
  6. package/cli/explorer/advanced.d.ts +14 -0
  7. package/cli/explorer/advanced.js +321 -329
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +384 -313
  11. package/cli/explorer/app.js.map +1 -0
  12. package/cli/explorer/assistant.d.ts +9 -0
  13. package/cli/explorer/assistant.js +58 -0
  14. package/cli/explorer/assistant.js.map +1 -0
  15. package/cli/explorer/commands.d.ts +17 -0
  16. package/cli/explorer/commands.js +368 -302
  17. package/cli/explorer/commands.js.map +1 -0
  18. package/cli/explorer/featureViews.d.ts +124 -0
  19. package/cli/explorer/featureViews.js +179 -0
  20. package/cli/explorer/featureViews.js.map +1 -0
  21. package/cli/explorer/github.d.ts +21 -0
  22. package/cli/explorer/github.js +42 -44
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +90 -95
  26. package/cli/explorer/graphs.js.map +1 -0
  27. package/cli/explorer/picker.d.ts +22 -0
  28. package/cli/explorer/picker.js +150 -0
  29. package/cli/explorer/picker.js.map +1 -0
  30. package/cli/explorer/report.d.ts +85 -0
  31. package/cli/explorer/report.js +60 -0
  32. package/cli/explorer/report.js.map +1 -0
  33. package/cli/explorer/session.d.ts +449 -0
  34. package/cli/explorer/session.js +143 -144
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +465 -482
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +28 -44
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +214 -161
  44. package/cli/main.js.map +1 -0
  45. package/cli/prompt.d.ts +5 -0
  46. package/cli/prompt.js +84 -80
  47. package/cli/prompt.js.map +1 -0
  48. package/cli/scanOptions.d.ts +2 -0
  49. package/cli/scanOptions.js +11 -0
  50. package/cli/scanOptions.js.map +1 -0
  51. package/cli/ui.d.ts +33 -0
  52. package/cli/ui.js +35 -44
  53. package/cli/ui.js.map +1 -0
  54. package/cli/wizard.d.ts +187 -0
  55. package/cli/wizard.js +304 -284
  56. package/cli/wizard.js.map +1 -0
  57. package/package.json +15 -4
  58. package/public/app.d.ts +1 -0
  59. package/public/app.js +1057 -1009
  60. package/public/app.js.map +1 -0
  61. package/public/browser.d.ts +68 -0
  62. package/public/browser.js +2 -0
  63. package/public/browser.js.map +1 -0
  64. package/public/index.html +30 -13
  65. package/public/js/about.d.ts +6 -0
  66. package/public/js/about.js +152 -172
  67. package/public/js/about.js.map +1 -0
  68. package/public/js/aiDraft.d.ts +3 -0
  69. package/public/js/aiDraft.js +116 -124
  70. package/public/js/aiDraft.js.map +1 -0
  71. package/public/js/analysisPanel.d.ts +7 -0
  72. package/public/js/analysisPanel.js +166 -166
  73. package/public/js/analysisPanel.js.map +1 -0
  74. package/public/js/analysisReport.d.ts +38 -0
  75. package/public/js/analysisReport.js +105 -110
  76. package/public/js/analysisReport.js.map +1 -0
  77. package/public/js/api.d.ts +26 -0
  78. package/public/js/api.js +176 -167
  79. package/public/js/api.js.map +1 -0
  80. package/public/js/atlas.d.ts +6 -0
  81. package/public/js/atlas.js +50 -58
  82. package/public/js/atlas.js.map +1 -0
  83. package/public/js/blameView.d.ts +2 -0
  84. package/public/js/blameView.js +36 -37
  85. package/public/js/blameView.js.map +1 -0
  86. package/public/js/codeTab.d.ts +3 -0
  87. package/public/js/codeTab.js +175 -180
  88. package/public/js/codeTab.js.map +1 -0
  89. package/public/js/codeViewer.d.ts +5 -0
  90. package/public/js/codeViewer.js +162 -150
  91. package/public/js/codeViewer.js.map +1 -0
  92. package/public/js/components/FileChip.d.ts +9 -0
  93. package/public/js/components/FileChip.js +45 -49
  94. package/public/js/components/FileChip.js.map +1 -0
  95. package/public/js/components/MetricSparkline.d.ts +7 -0
  96. package/public/js/components/MetricSparkline.js +35 -44
  97. package/public/js/components/MetricSparkline.js.map +1 -0
  98. package/public/js/components/RiskBadge.d.ts +9 -0
  99. package/public/js/components/RiskBadge.js +55 -63
  100. package/public/js/components/RiskBadge.js.map +1 -0
  101. package/public/js/deepAnalysisView.d.ts +99 -0
  102. package/public/js/deepAnalysisView.js +282 -302
  103. package/public/js/deepAnalysisView.js.map +1 -0
  104. package/public/js/diagramPane.d.ts +8 -0
  105. package/public/js/diagramPane.js +133 -135
  106. package/public/js/diagramPane.js.map +1 -0
  107. package/public/js/diffView.d.ts +6 -0
  108. package/public/js/diffView.js +222 -209
  109. package/public/js/diffView.js.map +1 -0
  110. package/public/js/docsView.d.ts +2 -0
  111. package/public/js/docsView.js +441 -442
  112. package/public/js/docsView.js.map +1 -0
  113. package/public/js/dom.d.ts +189 -0
  114. package/public/js/dom.js +5 -0
  115. package/public/js/dom.js.map +1 -0
  116. package/public/js/fileSourceBrowser.d.ts +5 -0
  117. package/public/js/fileSourceBrowser.js +33 -41
  118. package/public/js/fileSourceBrowser.js.map +1 -0
  119. package/public/js/flameGraph.d.ts +5 -0
  120. package/public/js/flameGraph.js +62 -72
  121. package/public/js/flameGraph.js.map +1 -0
  122. package/public/js/forceGraph.d.ts +10 -0
  123. package/public/js/forceGraph.js +581 -556
  124. package/public/js/forceGraph.js.map +1 -0
  125. package/public/js/heatmap.d.ts +4 -0
  126. package/public/js/heatmap.js +142 -164
  127. package/public/js/heatmap.js.map +1 -0
  128. package/public/js/highlight.d.ts +2 -0
  129. package/public/js/highlight.js +116 -107
  130. package/public/js/highlight.js.map +1 -0
  131. package/public/js/html.d.ts +2 -0
  132. package/public/js/html.js +14 -44
  133. package/public/js/html.js.map +1 -0
  134. package/public/js/insightsView.d.ts +5 -0
  135. package/public/js/insightsView.js +93 -111
  136. package/public/js/insightsView.js.map +1 -0
  137. package/public/js/inspector.d.ts +37 -0
  138. package/public/js/inspector.js +416 -445
  139. package/public/js/inspector.js.map +1 -0
  140. package/public/js/llm.d.ts +113 -0
  141. package/public/js/llm.js +233 -272
  142. package/public/js/llm.js.map +1 -0
  143. package/public/js/mapView.d.ts +3 -0
  144. package/public/js/mapView.js +121 -120
  145. package/public/js/mapView.js.map +1 -0
  146. package/public/js/markdown.d.ts +3 -0
  147. package/public/js/markdown.js +84 -91
  148. package/public/js/markdown.js.map +1 -0
  149. package/public/js/mindmap.d.ts +32 -0
  150. package/public/js/mindmap.js +244 -259
  151. package/public/js/mindmap.js.map +1 -0
  152. package/public/js/mobilePanels.d.ts +5 -0
  153. package/public/js/mobilePanels.js +50 -0
  154. package/public/js/mobilePanels.js.map +1 -0
  155. package/public/js/repoFiles.d.ts +12 -0
  156. package/public/js/repoFiles.js +28 -27
  157. package/public/js/repoFiles.js.map +1 -0
  158. package/public/js/reviewView.d.ts +28 -0
  159. package/public/js/reviewView.js +256 -0
  160. package/public/js/reviewView.js.map +1 -0
  161. package/public/js/sbomView.d.ts +3 -0
  162. package/public/js/sbomView.js +59 -67
  163. package/public/js/sbomView.js.map +1 -0
  164. package/public/js/scanCache.d.ts +16 -0
  165. package/public/js/scanCache.js +67 -65
  166. package/public/js/scanCache.js.map +1 -0
  167. package/public/js/search.d.ts +7 -0
  168. package/public/js/search.js +868 -800
  169. package/public/js/search.js.map +1 -0
  170. package/public/js/searchLocal.d.ts +42 -0
  171. package/public/js/searchLocal.js +87 -0
  172. package/public/js/searchLocal.js.map +1 -0
  173. package/public/js/serverSettings.d.ts +5 -0
  174. package/public/js/serverSettings.js +153 -164
  175. package/public/js/serverSettings.js.map +1 -0
  176. package/public/js/state.d.ts +798 -0
  177. package/public/js/state.js +114 -122
  178. package/public/js/state.js.map +1 -0
  179. package/public/js/tour.d.ts +6 -0
  180. package/public/js/tour.js +5 -7
  181. package/public/js/tour.js.map +1 -0
  182. package/public/js/transitions.d.ts +2 -0
  183. package/public/js/transitions.js +9 -10
  184. package/public/js/transitions.js.map +1 -0
  185. package/public/js/tree.d.ts +12 -0
  186. package/public/js/tree.js +157 -154
  187. package/public/js/tree.js.map +1 -0
  188. package/public/js/workflowsView.d.ts +3 -0
  189. package/public/js/workflowsView.js +15 -22
  190. package/public/js/workflowsView.js.map +1 -0
  191. package/public/search.css +495 -0
  192. package/public/styles.css +163 -346
  193. package/public/workbench.css +166 -0
  194. package/server/apiAuth.d.ts +3 -0
  195. package/server/apiAuth.js +18 -20
  196. package/server/apiAuth.js.map +1 -0
  197. package/server/apiDiff.d.ts +2 -0
  198. package/server/apiDiff.js +20 -18
  199. package/server/apiDiff.js.map +1 -0
  200. package/server/apiDocs.d.ts +2 -0
  201. package/server/apiDocs.js +38 -40
  202. package/server/apiDocs.js.map +1 -0
  203. package/server/apiFile.d.ts +1 -0
  204. package/server/apiFile.js +14 -17
  205. package/server/apiFile.js.map +1 -0
  206. package/server/apiGitBlame.d.ts +2 -0
  207. package/server/apiGitBlame.js +50 -51
  208. package/server/apiGitBlame.js.map +1 -0
  209. package/server/apiMcp.d.ts +4 -0
  210. package/server/apiMcp.js +64 -66
  211. package/server/apiMcp.js.map +1 -0
  212. package/server/apiReview.d.ts +2 -0
  213. package/server/apiReview.js +45 -0
  214. package/server/apiReview.js.map +1 -0
  215. package/server/apiScan.d.ts +5 -0
  216. package/server/apiScan.js +90 -71
  217. package/server/apiScan.js.map +1 -0
  218. package/server/apiSearch.d.ts +33 -0
  219. package/server/apiSearch.js +184 -200
  220. package/server/apiSearch.js.map +1 -0
  221. package/server/apiSettings.d.ts +4 -0
  222. package/server/apiSettings.js +84 -85
  223. package/server/apiSettings.js.map +1 -0
  224. package/server/apiTools.d.ts +3 -0
  225. package/server/apiTools.js +55 -56
  226. package/server/apiTools.js.map +1 -0
  227. package/server/auth.d.ts +5 -0
  228. package/server/auth.js +54 -51
  229. package/server/auth.js.map +1 -0
  230. package/server/config.d.ts +42 -0
  231. package/server/config.js +189 -194
  232. package/server/config.js.map +1 -0
  233. package/server/daemon.d.ts +12 -0
  234. package/server/daemon.js +124 -114
  235. package/server/daemon.js.map +1 -0
  236. package/server/fileSourceNode.d.ts +2 -0
  237. package/server/fileSourceNode.js +34 -36
  238. package/server/fileSourceNode.js.map +1 -0
  239. package/server/gitClone.d.ts +9 -0
  240. package/server/gitClone.js +59 -61
  241. package/server/gitClone.js.map +1 -0
  242. package/server/gitDiff.d.ts +36 -0
  243. package/server/gitDiff.js +271 -169
  244. package/server/gitDiff.js.map +1 -0
  245. package/server/gitHistory.d.ts +12 -0
  246. package/server/gitHistory.js +80 -80
  247. package/server/gitHistory.js.map +1 -0
  248. package/server/gitRemote.d.ts +12 -0
  249. package/server/gitRemote.js +37 -38
  250. package/server/gitRemote.js.map +1 -0
  251. package/server/htmlText.d.ts +4 -0
  252. package/server/htmlText.js +16 -23
  253. package/server/htmlText.js.map +1 -0
  254. package/server/http.d.ts +5 -0
  255. package/server/http.js +27 -30
  256. package/server/http.js.map +1 -0
  257. package/server/httpGuards.d.ts +2 -0
  258. package/server/httpGuards.js +47 -43
  259. package/server/httpGuards.js.map +1 -0
  260. package/server/https.d.ts +34 -0
  261. package/server/https.js +121 -111
  262. package/server/https.js.map +1 -0
  263. package/server/index.d.ts +40 -0
  264. package/server/index.js +139 -147
  265. package/server/index.js.map +1 -0
  266. package/server/layout.d.ts +26 -0
  267. package/server/layout.js +59 -64
  268. package/server/layout.js.map +1 -0
  269. package/server/llmProxy.d.ts +3 -0
  270. package/server/llmProxy.js +137 -135
  271. package/server/llmProxy.js.map +1 -0
  272. package/server/logger.d.ts +38 -0
  273. package/server/logger.js +198 -211
  274. package/server/logger.js.map +1 -0
  275. package/server/mcp/analysis.d.ts +29 -0
  276. package/server/mcp/analysis.js +99 -120
  277. package/server/mcp/analysis.js.map +1 -0
  278. package/server/mcp/http.d.ts +9 -0
  279. package/server/mcp/http.js +128 -137
  280. package/server/mcp/http.js.map +1 -0
  281. package/server/mcp/runner.d.ts +68 -0
  282. package/server/mcp/runner.js +208 -218
  283. package/server/mcp/runner.js.map +1 -0
  284. package/server/mcp/server.d.ts +29 -0
  285. package/server/mcp/server.js +166 -179
  286. package/server/mcp/server.js.map +1 -0
  287. package/server/mcp/standalone.d.ts +1 -0
  288. package/server/mcp/standalone.js +8 -10
  289. package/server/mcp/standalone.js.map +1 -0
  290. package/server/mcp/tools.d.ts +2020 -0
  291. package/server/mcp/tools.js +523 -574
  292. package/server/mcp/tools.js.map +1 -0
  293. package/server/paths.d.ts +3 -0
  294. package/server/paths.js +17 -15
  295. package/server/paths.js.map +1 -0
  296. package/server/pidfile.d.ts +9 -0
  297. package/server/pidfile.js +43 -45
  298. package/server/pidfile.js.map +1 -0
  299. package/server/review.d.ts +5 -0
  300. package/server/review.js +35 -0
  301. package/server/review.js.map +1 -0
  302. package/server/router.d.ts +33 -0
  303. package/server/router.js +191 -197
  304. package/server/router.js.map +1 -0
  305. package/server/scanRequest.d.ts +3 -0
  306. package/server/scanRequest.js +36 -0
  307. package/server/scanRequest.js.map +1 -0
  308. package/server/searchIndex.d.ts +17 -0
  309. package/server/searchIndex.js +83 -80
  310. package/server/searchIndex.js.map +1 -0
  311. package/server/sessions.d.ts +14 -0
  312. package/server/sessions.js +62 -70
  313. package/server/sessions.js.map +1 -0
  314. package/server/startup.d.ts +118 -0
  315. package/server/startup.js +143 -148
  316. package/server/startup.js.map +1 -0
  317. package/server/static.d.ts +6 -0
  318. package/server/static.js +28 -31
  319. package/server/static.js.map +1 -0
  320. package/server/tools/install.d.ts +4 -0
  321. package/server/tools/install.js +176 -185
  322. package/server/tools/install.js.map +1 -0
  323. package/server/tools/parse.d.ts +8 -0
  324. package/server/tools/parse.js +112 -114
  325. package/server/tools/parse.js.map +1 -0
  326. package/server/tools/platform.d.ts +9 -0
  327. package/server/tools/platform.js +49 -47
  328. package/server/tools/platform.js.map +1 -0
  329. package/server/tools/registry.d.ts +137 -0
  330. package/server/tools/registry.js +173 -172
  331. package/server/tools/registry.js.map +1 -0
  332. package/server/tools/scan.d.ts +34 -0
  333. package/server/tools/scan.js +89 -98
  334. package/server/tools/scan.js.map +1 -0
  335. package/server/tools.d.ts +34 -0
  336. package/server/tools.js +94 -107
  337. package/server/tools.js.map +1 -0
  338. package/server/tunnel.d.ts +29 -0
  339. package/server/tunnel.js +61 -66
  340. package/server/tunnel.js.map +1 -0
  341. package/shared/analyzer/docs.d.ts +16 -0
  342. package/shared/analyzer/docs.js +99 -93
  343. package/shared/analyzer/docs.js.map +1 -0
  344. package/shared/analyzer/explainLocal.d.ts +4 -0
  345. package/shared/analyzer/explainLocal.js +122 -142
  346. package/shared/analyzer/explainLocal.js.map +1 -0
  347. package/shared/analyzer/github.d.ts +37 -0
  348. package/shared/analyzer/github.js +41 -43
  349. package/shared/analyzer/github.js.map +1 -0
  350. package/shared/analyzer/graph.d.ts +41 -0
  351. package/shared/analyzer/graph.js +393 -400
  352. package/shared/analyzer/graph.js.map +1 -0
  353. package/shared/analyzer/health.d.ts +33 -0
  354. package/shared/analyzer/health.js +197 -193
  355. package/shared/analyzer/health.js.map +1 -0
  356. package/shared/analyzer/history.d.ts +29 -0
  357. package/shared/analyzer/history.js +110 -111
  358. package/shared/analyzer/history.js.map +1 -0
  359. package/shared/analyzer/jsonConfig.d.ts +2 -0
  360. package/shared/analyzer/jsonConfig.js +61 -0
  361. package/shared/analyzer/jsonConfig.js.map +1 -0
  362. package/shared/analyzer/languages/csharp.d.ts +26 -0
  363. package/shared/analyzer/languages/csharp.js +83 -88
  364. package/shared/analyzer/languages/csharp.js.map +1 -0
  365. package/shared/analyzer/languages/generic.d.ts +23 -0
  366. package/shared/analyzer/languages/generic.js +94 -105
  367. package/shared/analyzer/languages/generic.js.map +1 -0
  368. package/shared/analyzer/languages/go.d.ts +24 -0
  369. package/shared/analyzer/languages/go.js +45 -54
  370. package/shared/analyzer/languages/go.js.map +1 -0
  371. package/shared/analyzer/languages/index.d.ts +6 -0
  372. package/shared/analyzer/languages/index.js +19 -20
  373. package/shared/analyzer/languages/index.js.map +1 -0
  374. package/shared/analyzer/languages/java.d.ts +20 -0
  375. package/shared/analyzer/languages/java.js +73 -78
  376. package/shared/analyzer/languages/java.js.map +1 -0
  377. package/shared/analyzer/languages/javascript.d.ts +12 -0
  378. package/shared/analyzer/languages/javascript.js +258 -209
  379. package/shared/analyzer/languages/javascript.js.map +1 -0
  380. package/shared/analyzer/languages/python.d.ts +23 -0
  381. package/shared/analyzer/languages/python.js +92 -100
  382. package/shared/analyzer/languages/python.js.map +1 -0
  383. package/shared/analyzer/languages/rust.d.ts +17 -0
  384. package/shared/analyzer/languages/rust.js +96 -98
  385. package/shared/analyzer/languages/rust.js.map +1 -0
  386. package/shared/analyzer/languages/typescript.d.ts +11 -0
  387. package/shared/analyzer/languages/typescript.js +117 -116
  388. package/shared/analyzer/languages/typescript.js.map +1 -0
  389. package/shared/analyzer/licenses.d.ts +18 -0
  390. package/shared/analyzer/licenses.js +130 -133
  391. package/shared/analyzer/licenses.js.map +1 -0
  392. package/shared/analyzer/metrics.d.ts +20 -0
  393. package/shared/analyzer/metrics.js +112 -104
  394. package/shared/analyzer/metrics.js.map +1 -0
  395. package/shared/analyzer/pathUtil.d.ts +10 -0
  396. package/shared/analyzer/pathUtil.js +29 -35
  397. package/shared/analyzer/pathUtil.js.map +1 -0
  398. package/shared/analyzer/patterns.d.ts +11 -0
  399. package/shared/analyzer/patterns.js +231 -253
  400. package/shared/analyzer/patterns.js.map +1 -0
  401. package/shared/analyzer/scan.d.ts +62 -0
  402. package/shared/analyzer/scan.js +451 -442
  403. package/shared/analyzer/scan.js.map +1 -0
  404. package/shared/analyzer/scanControl.d.ts +11 -0
  405. package/shared/analyzer/scanControl.js +62 -0
  406. package/shared/analyzer/scanControl.js.map +1 -0
  407. package/shared/analyzer/security.d.ts +18 -0
  408. package/shared/analyzer/security.js +159 -159
  409. package/shared/analyzer/security.js.map +1 -0
  410. package/shared/analyzer/services.d.ts +5 -0
  411. package/shared/analyzer/services.js +141 -138
  412. package/shared/analyzer/services.js.map +1 -0
  413. package/shared/analyzer/stack.d.ts +6 -0
  414. package/shared/analyzer/stack.js +134 -141
  415. package/shared/analyzer/stack.js.map +1 -0
  416. package/shared/analyzer/tour.d.ts +2 -0
  417. package/shared/analyzer/tour.js +45 -53
  418. package/shared/analyzer/tour.js.map +1 -0
  419. package/shared/analyzer/util.d.ts +8 -0
  420. package/shared/analyzer/util.js +130 -76
  421. package/shared/analyzer/util.js.map +1 -0
  422. package/shared/analyzer/workflows.d.ts +8 -0
  423. package/shared/analyzer/workflows.js +139 -134
  424. package/shared/analyzer/workflows.js.map +1 -0
  425. package/shared/contracts.d.ts +250 -0
  426. package/shared/contracts.js +2 -0
  427. package/shared/contracts.js.map +1 -0
  428. package/shared/diagram/aiFacts.d.ts +35 -0
  429. package/shared/diagram/aiFacts.js +102 -105
  430. package/shared/diagram/aiFacts.js.map +1 -0
  431. package/shared/diagram/aiMermaid.d.ts +5 -0
  432. package/shared/diagram/aiMermaid.js +46 -45
  433. package/shared/diagram/aiMermaid.js.map +1 -0
  434. package/shared/diagram/atlas.d.ts +16 -0
  435. package/shared/diagram/atlas.js +51 -60
  436. package/shared/diagram/atlas.js.map +1 -0
  437. package/shared/diagram/mermaid.d.ts +43 -0
  438. package/shared/diagram/mermaid.js +348 -370
  439. package/shared/diagram/mermaid.js.map +1 -0
  440. package/shared/review/contracts.d.ts +95 -0
  441. package/shared/review/contracts.js +2 -0
  442. package/shared/review/contracts.js.map +1 -0
  443. package/shared/review/review.d.ts +10 -0
  444. package/shared/review/review.js +184 -0
  445. package/shared/review/review.js.map +1 -0
  446. package/shared/search/query.d.ts +32 -0
  447. package/shared/search/query.js +395 -388
  448. package/shared/search/query.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/server/mcp/tools.ts"],"names":[],"mappings":"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","sourcesContent":["// The tools. One entry per question an agent might ask about a repository, with\n// JSON Schema descriptions written for the model reading them rather than for a\n// person filling in a form.\n//\n// The division of labour follows what the app already knows how to answer:\n// * `onboarder_scan` is the door — everything else takes the path it returns.\n// * The read-only tools (`onboarder_overview`, `_architecture`, `_health`, …)\n// are projections of the one cached analysis, so they are cheap and mutually\n// consistent.\n// * `onboarder_read_file`, `_list_files` and `_search` are the three ways to get\n// at actual source, each with a size or result cap.\n// * `onboarder_deep_analysis` runs the optional external analyzers and is the\n// only tool that spawns a process.\n//\n// Every tool declares `path` in its schema, and every handler resolves it through\n// `analyzeRepository`, so a client that forgets the path gets a sentence that says\n// so rather than a validation error with no context.\n\nimport {\n analyzeRepository, cachedRoots, fileIn, readFileText, filesUnder, parsedFilesUnder,\n ToolError, scanIndex, baseName, explainFile, explainFolder,\n docFileRow, fileFactsLine, fileStaticDoc, folderStaticDoc, searchDocuments,\n} from './analysis.js';\nimport { buildTourStops } from '../../shared/analyzer/tour.js';\nimport { runExternalAnalysis, toolsStatus } from '../tools/scan.js';\nimport { TOOL_DEFS } from '../tools/registry.js';\n\nconst PATH_PROPERTY = {\n type: 'string',\n description:\n 'Absolute path to the repository on this machine (for example /Users/you/code/my-app). '\n + 'The path returned by onboarder_scan is the one to reuse. Omit it to use the last repository scanned.',\n};\n\nconst LIMIT_PROPERTY = {\n type: 'integer',\n description: 'Maximum number of results. Defaults to 20, capped at 200.',\n minimum: 1,\n maximum: 200,\n};\n\n// A client that never scans anything still gets a useful answer from the path it\n// happens to send, and a client that scanned something and then omits the path\n// gets the one it scanned. `lastRoot` is that memory.\nlet lastRoot = null;\n\nasync function resolve({ path: p }) {\n const root = String(p || '').trim() || lastRoot;\n if (!root) {\n throw new ToolError('No repository yet — call onboarder_scan with a path first.');\n }\n const analysis = await analyzeRepository(root);\n lastRoot = analysis.root;\n return analysis;\n}\n\n// Scans are expensive and the cache holds a few; a tool that takes a limit should\n// not be able to be talked into returning the whole repository.\nfunction limitOf(value, fallback = 20, max = 200) {\n const n = Number(value);\n if (!Number.isFinite(n)) return fallback;\n return Math.max(1, Math.min(max, Math.floor(n)));\n}\n\n// ---- the payloads -----------------------------------------------------------\n//\n// Each of these is a view's data, flattened into plain JSON. The point is that an\n// agent can act on the answer without knowing this codebase: a hub is a path and a\n// count, not an index into an array the tool kept to itself.\n\nfunction overviewPayload(a) {\n const { scan, facts, manifest, health, security } = a;\n return {\n root: a.root,\n name: scan.name,\n summary: a.overview,\n stats: {\n files: scan.stats.filesParsed,\n filesSeen: scan.stats.filesTotal,\n languages: scan.stats.languages,\n connections: scan.stats.edgeCount,\n importsResolved: scan.stats.imports?.confidence ?? null,\n },\n entryPoints: facts.entries.slice(0, 10),\n hubs: facts.hubs.slice(0, 10).map((h) => ({ path: h.path, dependents: h.fanIn, dependencies: h.fanOut })),\n cycles: facts.cycles.slice(0, 5),\n orphanCount: facts.orphans.length,\n deadExportCount: (facts.deadExports || []).length,\n services: (manifest.services || []).map((s) => ({ name: s.name, kind: s.kind, port: s.port ?? null })),\n // A repo's dependencies are a different fact from its services — `express` is\n // a library, not a thing this app runs — so they are named apart. They are\n // here, rather than only in `onboarder_dependencies`, because \"what does this\n // project use\" is a first-scan question and an extra round trip for it would\n // be a tool the agent has to learn exists.\n packageName: manifest.packageName || null,\n dependencies: Object.entries(manifest.deps?.npm || {})\n .map(([name, version]) => ({ name, version })),\n devDependencies: Object.keys(manifest.deps?.dev || {}),\n health: { score: health.score, grade: health.grade },\n security: { score: security.score, grade: security.grade, findings: security.total },\n caveats: a.caveats,\n };\n}\n\nfunction architecturePayload(a) {\n const { layersInfo, findings, coupling } = a.patterns;\n // `couplingMatrix` returns a folder list and a `Map` keyed `'from->to'`, not a\n // list of edges. Flattening it here means the agent gets pairs; leaving it raw\n // means it has to know this module's encoding — and a Map does not survive\n // `JSON.stringify`, so it would arrive as `{}` rather than as an error.\n const pairs = coupling.counts instanceof Map\n ? [...coupling.counts.entries()]\n : Object.entries(coupling.counts || {});\n const edges = pairs\n .map(([key, count]) => {\n const [from, to] = key.split('->');\n return { from, to, count };\n })\n .sort((x, y) => y.count - x.count);\n\n return {\n // A layer here is a list of paths, not an object: depth is the array's index.\n layers: layersInfo.layers.map((files, depth) => ({\n depth,\n fileCount: files.length,\n files: files.slice(0, 20),\n })),\n seeds: layersInfo.seeds,\n unreachable: (layersInfo.unreachable || []).slice(0, 20),\n patterns: findings.map((p) => ({\n id: p.id,\n tone: p.tone,\n severity: p.severity,\n title: p.title,\n detail: p.detail,\n paths: (p.paths || []).slice(0, 10),\n })),\n coupling: { folders: coupling.folders, edges: edges.slice(0, 30), max: coupling.max },\n services: (a.manifest.services || []).map((s) => ({ name: s.name, kind: s.kind, port: s.port ?? null })),\n };\n}\n\nfunction healthPayload(a, limit) {\n return {\n root: a.root,\n score: a.health.score,\n grade: a.health.grade,\n totals: a.health.totals,\n breakdown: a.health.breakdown,\n // `blast` is a transitive-dependency count, exact only on smaller repos;\n // `blastExact` says which, because a number that quietly changes meaning is\n // worse than no number.\n blastExact: a.health.blastExact,\n riskiestFiles: a.health.perFile.slice(0, limit).map((f) => ({\n path: f.path,\n risk: f.risk,\n blast: f.blast,\n complexity: f.complexity,\n loc: f.loc,\n fanIn: f.fanIn,\n fanOut: f.fanOut,\n inCycle: f.inCycle,\n })),\n };\n}\n\nfunction securityPayload(a, limit) {\n const s = a.security;\n // `summarizeSecurity` rolls up per file, keeping each file's own findings. The\n // flat list an agent wants is the concatenation, ordered worst-first by file.\n const findings = [];\n for (const file of s.files || []) {\n for (const f of file.findings || []) {\n findings.push({\n severity: f.severity,\n rule: f.rule,\n category: f.category,\n path: file.path,\n line: f.line ?? null,\n message: f.message,\n excerpt: f.excerpt,\n });\n }\n }\n return {\n root: a.root,\n score: s.score,\n grade: s.grade,\n total: s.total,\n bySeverity: s.counts,\n byCategory: s.byCat,\n filesWithFindings: (s.files || []).length,\n findings: findings.slice(0, limit),\n };\n}\n\nfunction historyPayload(a, limit) {\n const h = a.history;\n if (!h.available) return { available: false, reason: h.reason };\n return {\n available: true,\n commitCount: h.commitCount,\n totalCommits: h.totalCommits,\n truncated: h.truncated,\n firstCommitAt: h.firstCommitAt,\n lastCommitAt: h.lastCommitAt,\n contributors: (h.authors || []).slice(0, limit).map((c) => ({ name: c.name, commits: c.commits })),\n hotspots: (h.perFile || []).slice(0, limit).map((r) => ({\n path: r.path, churn: r.churn, authors: r.authors, complexity: r.complexity,\n hotspot: r.hotspot, firstSeen: r.firstSeen, lastTouched: r.lastTouched,\n })),\n soloFiles: h.soloFiles,\n // Files that keep changing together without importing each other — the\n // coupling the import graph cannot see.\n coChanged: (h.coChanged || []).slice(0, 15),\n pathsGone: h.pathsGone,\n };\n}\n\nfunction dependenciesPayload(a) {\n return {\n languages: a.stack.languages,\n packageManagers: a.stack.pm,\n dependencies: a.stack.items.map((d) => ({\n name: d.name, version: d.version, category: d.category, dev: d.dev, docs: d.docs,\n })),\n projectLicense: a.scan.licenseReport?.projectLicense || a.scan.license,\n licenseCounts: a.scan.licenseReport?.counts || null,\n workflows: (a.scan.workflows || []).map((w) => ({\n name: w.name, file: w.file || w.path, triggers: w.triggers, jobs: (w.jobs || []).map((j) => j.name),\n })),\n };\n}\n\n// The folder boundary crossing for one folder, derived from the real edge list.\n//\n// `facts.folderEdges` is a rollup over top-level folders only — the coupling\n// matrix the architecture view draws. That makes it the wrong source for\n// `onboarder_explain_folder` on a nested folder: asking about `server/mcp` and\n// getting nothing back looks exactly like \"this folder imports nothing\", which is\n// the opposite of true.\n//\n// So this walks the edges and asks the question the tool actually asked: for each\n// import that crosses the folder's boundary, who is on the other side? The other\n// side is named at the same depth as the folder, so a report about `server/mcp`\n// talks about its siblings rather than collapsing to `server`.\nfunction folderCrossings(a, folder) {\n const prefix = folder ? folder + '/' : '';\n const depth = folder ? folder.split('/').length : 1;\n const topFolder = (p) => p.split('/')[0];\n const other = (p) => (prefix && p.startsWith(prefix)\n ? p.slice(prefix.length).split('/').slice(0, depth).join('/')\n : p.split('/').slice(0, depth).join('/'));\n\n const out = new Map();\n const into = new Map();\n for (const e of a.scan.edges || []) {\n const fromIn = !prefix || e.from.startsWith(prefix);\n const toIn = !prefix || e.to.startsWith(prefix);\n // Every path is \"in\" the root, so with no prefix both flags are always true\n // and nothing counts as a crossing. The root's own coupling is the top-level\n // rollup, which is exactly the same question asked one level up.\n if (!prefix) {\n const from = topFolder(e.from);\n const to = topFolder(e.to);\n if (from !== to) out.set(to, (out.get(to) || 0) + 1);\n continue;\n }\n if (fromIn === toIn) continue; // an edge entirely inside the folder is not a crossing\n if (fromIn) {\n const key = other(e.to);\n out.set(key, (out.get(key) || 0) + 1);\n } else {\n const key = other(e.from);\n into.set(key, (into.get(key) || 0) + 1);\n }\n }\n const toList = (m) => [...m.entries()]\n .map(([name, count]) => ({ folder: name, count }))\n .sort((x, y) => y.count - x.count);\n return { imports: toList(out), importedBy: toList(into) };\n}\n\n// The tour is the app's \"read this first\" list. The ordering lives in\n// `shared/analyzer/tour.js` so the browser and this server cannot disagree about\n// which files a newcomer should read.\nfunction tourPayload(a) {\n return {\n root: a.root,\n summary: a.overview,\n stops: buildTourStops(a.scan, a.facts).map((s, i) => ({\n order: i + 1,\n path: s.path,\n name: baseName(s.path),\n why: s.why,\n dependents: a.facts.fanIn[s.path] || 0,\n dependencies: a.facts.fanOut[s.path] || 0,\n })),\n };\n}\n\n// ---- the tool table ---------------------------------------------------------\n\nexport const TOOLS = [\n {\n name: 'onboarder_scan',\n description:\n 'Scan a repository and return everything Onboarder knows about it: structure, entry points, '\n + 'hubs, cycles, dependencies, services, health, security, history and a written overview. '\n + 'Start here. The returned `root` is what every other tool takes as its `path`.',\n inputSchema: {\n type: 'object',\n properties: {\n path: PATH_PROPERTY,\n force: { type: 'boolean', description: 'Rescan even if this repository is already cached. Defaults to false.' },\n },\n required: [],\n },\n async run(args) {\n const a = await analyzeRepository(args.path, { force: !!args.force });\n lastRoot = a.root;\n return overviewPayload(a);\n },\n },\n\n {\n name: 'onboarder_rescan',\n description:\n 'Discard the cached analysis for a repository and scan it again. Use after changing files on disk, '\n + 'since every other tool answers from the cached scan.',\n inputSchema: { type: 'object', properties: { path: PATH_PROPERTY }, required: [] },\n async run(args) {\n const a = await analyzeRepository(args.path, { force: true });\n lastRoot = a.root;\n return overviewPayload(a);\n },\n },\n\n {\n name: 'onboarder_overview',\n description:\n 'The repository in one call: written summary, languages, entry points, the files everything depends '\n + 'on, dependency cycles, services, and what the scan is unsure about. Cheap, because it reads the '\n + 'cached analysis rather than scanning again.',\n inputSchema: { type: 'object', properties: { path: PATH_PROPERTY }, required: [] },\n async run(args) { return overviewPayload(await resolve(args)); },\n },\n\n {\n name: 'onboarder_architecture',\n description:\n 'How the code is arranged: the dependency layers and which files sit in each, files nothing '\n + 'reaches, the architectural patterns detected (hub-and-spoke, cycles, god objects, layer '\n + 'violations), which folders import each other, and the services detected.',\n inputSchema: { type: 'object', properties: { path: PATH_PROPERTY }, required: [] },\n async run(args) { return architecturePayload(await resolve(args)); },\n },\n\n {\n name: 'onboarder_tour',\n description:\n 'A guided reading order for a new contributor: the handful of files worth reading first, each with '\n + 'the reason it matters and how many files depend on it. The fastest way to understand an '\n + 'unfamiliar repository.',\n inputSchema: { type: 'object', properties: { path: PATH_PROPERTY }, required: [] },\n async run(args) { return tourPayload(await resolve(args)); },\n },\n\n {\n name: 'onboarder_health',\n description:\n 'Maintainability report: an overall score and letter grade, what the score is made of, and the '\n + 'riskiest files with their size, complexity, dependency counts and blast radius.',\n inputSchema: {\n type: 'object',\n properties: { path: PATH_PROPERTY, limit: LIMIT_PROPERTY },\n required: [],\n },\n async run(args) { return healthPayload(await resolve(args), limitOf(args.limit, 20)); },\n },\n\n {\n name: 'onboarder_security',\n description:\n 'Static security findings from the built-in rules: hardcoded secrets, unsafe calls, injection '\n + 'patterns and the rest, ordered by severity. These are the built-in rules only — use '\n + 'onboarder_deep_analysis for the external scanners.',\n inputSchema: {\n type: 'object',\n properties: { path: PATH_PROPERTY, limit: LIMIT_PROPERTY },\n required: [],\n },\n async run(args) { return securityPayload(await resolve(args), limitOf(args.limit, 50, 500)); },\n },\n\n {\n name: 'onboarder_history',\n description:\n 'What git knows: commit count, contributors, and the files with the highest churn weighted against '\n + 'complexity — the change-risk hotspots, plus files only one person has ever touched and files '\n + 'that keep changing together without importing each other.',\n inputSchema: {\n type: 'object',\n properties: { path: PATH_PROPERTY, limit: LIMIT_PROPERTY },\n required: [],\n },\n async run(args) { return historyPayload(await resolve(args), limitOf(args.limit, 25)); },\n },\n\n {\n name: 'onboarder_dependencies',\n description:\n 'The dependency inventory: languages, package managers, every declared dependency with version, '\n + 'category and documentation link, the project license with its compliance counts, and the CI '\n + 'workflows with their triggers and jobs.',\n inputSchema: { type: 'object', properties: { path: PATH_PROPERTY }, required: [] },\n async run(args) { return dependenciesPayload(await resolve(args)); },\n },\n {\n name: 'onboarder_explain_file',\n description:\n 'Explain one file: its role in the codebase, what it imports, what imports it, its exports, its '\n + 'metrics, and a written summary. Set includeSource to get the file text as well.',\n inputSchema: {\n type: 'object',\n properties: {\n path: PATH_PROPERTY,\n file: { type: 'string', description: 'Repository-relative path, for example server/router.js.' },\n includeSource: { type: 'boolean', description: 'Also return the full file text. Defaults to false.' },\n },\n required: ['file'],\n },\n async run(args) {\n const a = await resolve(args);\n const { rel, file } = fileIn(a, args.file);\n return {\n path: rel,\n role: fileFactsLine(rel, a.scan, a.facts),\n documentation: fileStaticDoc(rel, a.scan, a.facts),\n row: docFileRow(rel, a.scan, a.facts),\n imports: a.facts.importsOf[rel] || [],\n importedBy: a.facts.importers[rel] || [],\n metrics: {\n loc: file.loc,\n complexity: file.complexity,\n exports: (file.exports || []).length,\n functions: (file.functions || []).map((fn) => fn.name),\n },\n summary: explainFile(rel, file, a.facts),\n // Source last, and only when asked for: it is by far the largest part of\n // the answer, and a model that wanted the structure does not need it.\n ...(args.includeSource ? { source: (await readFileText(a, rel)).text } : {}),\n };\n },\n },\n\n {\n name: 'onboarder_explain_folder',\n\n description:\n 'Explain one folder: what lives in it, which folders it imports, its entry points and hubs, and a '\n + 'written summary of what the folder is for. Pass an empty string for the repository root.',\n inputSchema: {\n type: 'object',\n properties: {\n path: PATH_PROPERTY,\n folder: { type: 'string', description: 'Repository-relative folder, for example server/mcp. Use \"\" for the root.' },\n },\n required: ['folder'],\n },\n async run(args) {\n const a = await resolve(args);\n const folder = String(args.folder ?? '').trim();\n const paths = filesUnder(a, folder);\n if (!paths.length && folder) throw new ToolError(`No files under \"${folder}\".`);\n\n const parsed = parsedFilesUnder(a, folder);\n if (!parsed.length && folder) {\n throw new ToolError(`Nothing under \"${folder}\" was parsed as source — use onboarder_list_files instead.`);\n }\n // Subfolders are the directories directly inside `folder`, not every\n // directory beneath it: a tree two levels down is noise in a summary.\n const depth = folder ? folder.split('/').length : 0;\n const subfolders = [...new Set(paths\n .map((p) => p.split('/').slice(0, -1).join('/'))\n .filter((d) => d && d.split('/').length === depth + 1))];\n\n return {\n folder: folder || '.',\n fileCount: paths.length,\n parsedFileCount: parsed.length,\n subfolders: subfolders.slice(0, 40),\n files: parsed.map((f) => docFileRow(f.path, a.scan, a.facts)),\n // Which folders this one imports, and which import it. Counts are import\n // edges, so `server/mcp → shared/analyzer: 6` means six files in here\n // reach in there — not six files in there.\n ...folderCrossings(a, folder),\n documentation: folderStaticDoc(folder, a.scan, a.facts, subfolders.length),\n summary: explainFolder(folder, a.scan, a.facts),\n };\n },\n },\n\n {\n name: 'onboarder_read_file',\n description:\n 'The text of one file inside the repository. Paths outside the repository are refused, and files over '\n + '200 KB are refused rather than truncated — use onboarder_search to find the part you need.',\n inputSchema: {\n type: 'object',\n properties: {\n path: PATH_PROPERTY,\n file: { type: 'string', description: 'Repository-relative path.' },\n },\n required: ['file'],\n },\n async run(args) {\n const a = await resolve(args);\n return readFileText(a, args.file);\n },\n },\n\n {\n name: 'onboarder_list_files',\n description:\n 'List the files in the repository, or in one folder. Filter by a substring of the path, by extension, '\n + 'and by whether the file is a test.',\n inputSchema: {\n type: 'object',\n properties: {\n path: PATH_PROPERTY,\n folder: { type: 'string', description: 'Repository-relative folder. Use \"\" for the whole repository.' },\n contains: { type: 'string', description: 'Keep only paths containing this text.' },\n extension: { type: 'string', description: 'Keep only this extension, with or without the dot, e.g. \"js\".' },\n tests: { type: 'boolean', description: 'true keeps only test files, false excludes them.' },\n limit: LIMIT_PROPERTY,\n },\n required: [],\n },\n async run(args) {\n const a = await resolve(args);\n const limit = limitOf(args.limit, 200);\n const folder = String(args.folder ?? '').trim();\n const needle = String(args.contains || '').toLowerCase();\n const ext = String(args.extension || '').trim().replace(/^\\./, '').toLowerCase();\n const isTest = (p) => /(^|\\/)(tests?|__tests__)\\//i.test(p) || /\\.(test|spec)\\./i.test(p);\n\n // A folder listing spans subfolders and includes assets: \"what is in here\"\n // is a question about the repository, not about what the parser understood.\n let files = filesUnder(a, folder);\n if (needle) files = files.filter((p) => p.toLowerCase().includes(needle));\n if (ext) files = files.filter((p) => p.toLowerCase().endsWith('.' + ext));\n if (args.tests === true) files = files.filter(isTest);\n if (args.tests === false) files = files.filter((p) => !isTest(p));\n\n return {\n root: a.root,\n folder: folder || '.',\n total: files.length,\n truncated: files.length > limit,\n // `allFiles` rows are sometimes just a path string rather than a parsed\n // file object, so both are mapped to their path and nothing else.\n files: files.slice(0, limit).map((f) => (typeof f === 'string' ? f : f.path)),\n };\n },\n },\n\n {\n name: 'onboarder_search',\n description:\n \"Search the repository the way the app's search palette does: bare words rank by relevance, and the \"\n + 'full query language works too — path:, ext:, is:test, is:source, \"exact phrases\", -exclude, '\n + '/regex/, and case: for case sensitivity.',\n inputSchema: {\n type: 'object',\n properties: {\n path: PATH_PROPERTY,\n query: { type: 'string', description: 'The search query.' },\n limit: LIMIT_PROPERTY,\n caseSensitive: { type: 'boolean', description: 'Match case exactly. Defaults to false.' },\n },\n required: ['query'],\n },\n async run(args) {\n const a = await resolve(args);\n const out = searchDocuments(a.searchIndex, String(args.query || ''), {\n limit: limitOf(args.limit, 20),\n caseSensitive: !!args.caseSensitive,\n });\n // A regex that would not compile comes back as `error` with zero results.\n // Passing that through as-is would tell the agent the code is not there,\n // which is the one conclusion it must not draw from a typo in its own\n // query — so it is raised as a tool error the model can see and correct.\n if (out.error) throw new ToolError(out.error);\n return {\n query: out.query,\n total: out.total,\n indexed: out.indexed,\n results: out.results.map((r) => ({ path: r.path, line: r.line, snippet: r.snippet })),\n };\n },\n },\n\n {\n name: 'onboarder_deep_analysis',\n description:\n 'Run the optional external analyzers (semgrep, gitleaks, knip, and the rest) over the repository and '\n + 'return their findings normalized. Slower than the built-in tools, and it only covers the analyzers '\n + 'that are actually installed. Call onboarder_analyzer_status first to see which those are.',\n inputSchema: {\n type: 'object',\n properties: {\n path: PATH_PROPERTY,\n tools: {\n type: 'array',\n items: { type: 'string', enum: TOOL_DEFS.map((d) => d.id) },\n description: 'Which analyzers to run. Omit to run every installed one.',\n },\n kinds: {\n type: 'array',\n items: { type: 'string', enum: ['security', 'dead-code'] },\n description: 'Narrow to a purpose.',\n },\n },\n required: [],\n },\n async run(args) {\n const a = await resolve(args);\n return runExternalAnalysis(a.root, { tools: args.tools, kinds: args.kinds });\n },\n },\n\n {\n name: 'onboarder_analyzer_status',\n description:\n 'Which external analyzers are installed on this machine, what each one is for, and how to install the '\n + 'ones that are missing. Takes no arguments.',\n inputSchema: { type: 'object', properties: {}, required: [] },\n async run() {\n // `toolsStatus` is keyed by id — the shape the engines panel and the HTTP\n // route both expect. It becomes a list here so an agent does not have to\n // know that, but the same fields survive, so this and `/api/tools` cannot\n // disagree about whether semgrep is installed.\n return { analyzers: Object.values(toolsStatus()) };\n },\n },\n];\n\nconst BY_NAME = new Map(TOOLS.map((t) => [t.name, t]));\n\n// The MCP wire shape, which is not the same as the internal one: the handler\n// stays off the table, and the schema is named `inputSchema` exactly as the spec\n// requires.\nexport function toolDefinitions() {\n return TOOLS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n }));\n}\n\nexport function findTool(name) {\n return BY_NAME.get(name) || null;\n}\n\nexport async function callTool(name, args) {\n const tool = findTool(name);\n if (!tool) throw new ToolError(`No tool called \"${name}\".`);\n return await tool.run(args || {});\n}\n\n// What the top-bar button polls. The runner fills in `running`, `pid` and the\n// rest; this is the part that is the same either way.\nexport function mcpStatus() {\n return {\n transport: 'stdio',\n toolCount: TOOLS.length,\n tools: TOOLS.map((t) => t.name),\n cachedRepositories: cachedRoots(),\n lastRoot,\n analyzers: toolsStatus(),\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function isInside(rootAbs: string, abs: string): boolean;
2
+ export declare function resolveInside(rootAbs: string, relPath: string): string;
3
+ export declare function expandHome(p: string): string;
package/server/paths.js CHANGED
@@ -1,9 +1,7 @@
1
1
  // Path containment, in one place. Anything that turns a string the client sent
2
2
  // into a filesystem path goes through here first.
3
-
4
3
  import path from 'node:path';
5
4
  import os from 'node:os';
6
-
7
5
  // Is `abs` the root itself, or something inside it?
8
6
  //
9
7
  // The obvious `abs.startsWith(root)` is the wrong check: with a root of
@@ -11,12 +9,12 @@ import os from 'node:os';
11
9
  // the prefix matches before the separator does. The separator has to be part
12
10
  // of the comparison.
13
11
  export function isInside(rootAbs, abs) {
14
- const root = path.resolve(rootAbs);
15
- const target = path.resolve(abs);
16
- if (target === root) return true;
17
- return target.startsWith(root.endsWith(path.sep) ? root : root + path.sep);
12
+ const root = path.resolve(rootAbs);
13
+ const target = path.resolve(abs);
14
+ if (target === root)
15
+ return true;
16
+ return target.startsWith(root.endsWith(path.sep) ? root : root + path.sep);
18
17
  }
19
-
20
18
  // Resolve a repo-relative POSIX path (`src/app.js`) against a root, or return
21
19
  // null if it doesn't land inside that root.
22
20
  //
@@ -25,15 +23,19 @@ export function isInside(rootAbs, abs) {
25
23
  // `..` to outsmart, and a leading `/` becomes an empty segment instead of an
26
24
  // absolute path.
27
25
  export function resolveInside(rootAbs, relPath) {
28
- if (typeof relPath !== 'string' || relPath === '') return null;
29
- if (relPath.includes('\0')) return null; // fs throws on these; a 400 reads better
30
- const abs = path.join(rootAbs, ...relPath.split('/'));
31
- return isInside(rootAbs, abs) ? abs : null;
26
+ if (typeof relPath !== 'string' || relPath === '')
27
+ return null;
28
+ if (relPath.includes('\0'))
29
+ return null; // fs throws on these; a 400 reads better
30
+ const abs = path.join(rootAbs, ...relPath.split('/'));
31
+ return isInside(rootAbs, abs) ? abs : null;
32
32
  }
33
-
34
33
  // `~` and `~/code/thing` are what people actually type into the path box.
35
34
  export function expandHome(p) {
36
- if (p === '~') return os.homedir();
37
- if (p.startsWith('~/')) return path.join(os.homedir(), p.slice(2));
38
- return path.resolve(p);
35
+ if (p === '~')
36
+ return os.homedir();
37
+ if (p.startsWith('~/'))
38
+ return path.join(os.homedir(), p.slice(2));
39
+ return path.resolve(p);
39
40
  }
41
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/server/paths.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAElD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,oDAAoD;AACpD,EAAE;AACF,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,qBAAqB;AACrB,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,GAAW;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7E,CAAC;AAED,8EAA8E;AAC9E,4CAA4C;AAC5C,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,iBAAiB;AACjB,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe;IAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,yCAAyC;IAClF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC","sourcesContent":["// Path containment, in one place. Anything that turns a string the client sent\n// into a filesystem path goes through here first.\n\nimport path from 'node:path';\nimport os from 'node:os';\n\n// Is `abs` the root itself, or something inside it?\n//\n// The obvious `abs.startsWith(root)` is the wrong check: with a root of\n// `/home/me/repo` it also says yes to `/home/me/repo-secrets/.env`, because\n// the prefix matches before the separator does. The separator has to be part\n// of the comparison.\nexport function isInside(rootAbs: string, abs: string) {\n const root = path.resolve(rootAbs);\n const target = path.resolve(abs);\n if (target === root) return true;\n return target.startsWith(root.endsWith(path.sep) ? root : root + path.sep);\n}\n\n// Resolve a repo-relative POSIX path (`src/app.js`) against a root, or return\n// null if it doesn't land inside that root.\n//\n// `path.join` normalizes `..` away before we look, so this judges a path by\n// where it ends up rather than by what it looks like — there's no spelling of\n// `..` to outsmart, and a leading `/` becomes an empty segment instead of an\n// absolute path.\nexport function resolveInside(rootAbs: string, relPath: string) {\n if (typeof relPath !== 'string' || relPath === '') return null;\n if (relPath.includes('\\0')) return null; // fs throws on these; a 400 reads better\n const abs = path.join(rootAbs, ...relPath.split('/'));\n return isInside(rootAbs, abs) ? abs : null;\n}\n\n// `~` and `~/code/thing` are what people actually type into the path box.\nexport function expandHome(p: string) {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/')) return path.join(os.homedir(), p.slice(2));\n return path.resolve(p);\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export declare function pidPath(configFile: any): string;
2
+ export declare function readPidFile(configFile: any): number;
3
+ export declare function pidIsAlive(pid: any): boolean;
4
+ export declare function writePidFile(configFile: any): void;
5
+ export declare function removePidFile(configFile: any, pid?: number): void;
6
+ export declare function runInfoPath(configFile: any): string;
7
+ export declare function writeRunInfo(configFile: any, info?: Record<string, any>): void;
8
+ export declare function readRunInfo(configFile: any): any;
9
+ export declare function removeRunInfo(configFile: any): void;
package/server/pidfile.js CHANGED
@@ -6,81 +6,79 @@
6
6
  // `onboarder stop` kills it, and a busy-port error can say "that is us,
7
7
  // pid N" instead of shrugging. Writes are best-effort — a read-only config
8
8
  // dir must never stop the server from booting.
9
-
10
9
  import fs from 'node:fs';
11
10
  import path from 'node:path';
12
-
13
11
  export function pidPath(configFile) {
14
- return path.join(path.dirname(path.resolve(configFile)), 'onboarder.pid');
12
+ return path.join(path.dirname(path.resolve(configFile)), 'onboarder.pid');
15
13
  }
16
-
17
14
  // The pid in the file, or null when there is no file or it is garbage. A
18
15
  // garbage file is treated as absent rather than parsed charitably — it was
19
16
  // either written by us (one integer) or it is not ours to interpret.
20
17
  export function readPidFile(configFile) {
21
- try {
22
- const pid = Number(fs.readFileSync(pidPath(configFile), 'utf8').trim());
23
- return Number.isInteger(pid) && pid > 0 ? pid : null;
24
- } catch {
25
- return null;
26
- }
18
+ try {
19
+ const pid = Number(fs.readFileSync(pidPath(configFile), 'utf8').trim());
20
+ return Number.isInteger(pid) && pid > 0 ? pid : null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
27
25
  }
28
-
29
26
  // Signal 0 probes existence without delivering anything. EPERM means the
30
27
  // process exists but belongs to someone else — still alive, just not ours
31
28
  // to signal.
32
29
  export function pidIsAlive(pid) {
33
- try {
34
- process.kill(pid, 0);
35
- return true;
36
- } catch (e) {
37
- return e.code === 'EPERM';
38
- }
30
+ try {
31
+ process.kill(pid, 0);
32
+ return true;
33
+ }
34
+ catch (e) {
35
+ return e.code === 'EPERM';
36
+ }
39
37
  }
40
-
41
38
  export function writePidFile(configFile) {
42
- fs.writeFileSync(pidPath(configFile), String(process.pid) + '\n', { mode: 0o600 });
39
+ fs.writeFileSync(pidPath(configFile), String(process.pid) + '\n', { mode: 0o600 });
43
40
  }
44
-
45
41
  // Remove the file only when it still points at `pid` — a second server that
46
42
  // rewrote the file must not lose its record because the first one exited.
47
43
  export function removePidFile(configFile, pid = process.pid) {
48
- if (readPidFile(configFile) === pid) {
49
- fs.rmSync(pidPath(configFile), { force: true });
50
- removeRunInfo(configFile);
51
- }
44
+ if (readPidFile(configFile) === pid) {
45
+ fs.rmSync(pidPath(configFile), { force: true });
46
+ removeRunInfo(configFile);
47
+ }
52
48
  }
53
-
54
49
  // The pid answers "is it running?"; it cannot answer "how is it running?".
55
50
  // Which mode a live server was launched in (foreground, background, a login
56
51
  // item), where its log file is, and when it booted are all things `onboarder
57
52
  // status` should be able to print without guessing — so they are written
58
53
  // beside the pid, best effort, exactly like the pid itself.
59
54
  export function runInfoPath(configFile) {
60
- return path.join(path.dirname(path.resolve(configFile)), 'onboarder.run.json');
55
+ return path.join(path.dirname(path.resolve(configFile)), 'onboarder.run.json');
61
56
  }
62
-
63
57
  export function writeRunInfo(configFile, info = {}) {
64
- try {
65
- fs.writeFileSync(runInfoPath(configFile), JSON.stringify({
66
- pid: process.pid,
67
- startedAt: new Date().toISOString(),
68
- ...info,
69
- }, null, 2) + '\n', { mode: 0o600 });
70
- } catch {
71
- // A read-only config dir must never stop a server from booting.
72
- }
58
+ try {
59
+ fs.writeFileSync(runInfoPath(configFile), JSON.stringify({
60
+ pid: process.pid,
61
+ startedAt: new Date().toISOString(),
62
+ ...info,
63
+ }, null, 2) + '\n', { mode: 0o600 });
64
+ }
65
+ catch {
66
+ // A read-only config dir must never stop a server from booting.
67
+ }
73
68
  }
74
-
75
69
  export function readRunInfo(configFile) {
76
- try {
77
- const value = JSON.parse(fs.readFileSync(runInfoPath(configFile), 'utf8'));
78
- return value && typeof value === 'object' ? value : null;
79
- } catch {
80
- return null;
81
- }
70
+ try {
71
+ const value = JSON.parse(fs.readFileSync(runInfoPath(configFile), 'utf8'));
72
+ return value && typeof value === 'object' ? value : null;
73
+ }
74
+ catch {
75
+ return null;
76
+ }
82
77
  }
83
-
84
78
  export function removeRunInfo(configFile) {
85
- try { fs.rmSync(runInfoPath(configFile), { force: true }); } catch { /* nothing to clean */ }
79
+ try {
80
+ fs.rmSync(runInfoPath(configFile), { force: true });
81
+ }
82
+ catch { /* nothing to clean */ }
86
83
  }
84
+ //# sourceMappingURL=pidfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pidfile.js","sourceRoot":"","sources":["../src/server/pidfile.ts"],"names":[],"mappings":"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","sourcesContent":["// Who is serving? One small file next to the config: `onboarder.pid`.\n//\n// The auto-open flow starts the server detached from the terminal that asked\n// for it, which makes \"is it running?\" a question ps(1) answers badly. The\n// pidfile is the answer the CLI can act on: `onboarder status` reads it,\n// `onboarder stop` kills it, and a busy-port error can say \"that is us,\n// pid N\" instead of shrugging. Writes are best-effort — a read-only config\n// dir must never stop the server from booting.\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport function pidPath(configFile) {\n return path.join(path.dirname(path.resolve(configFile)), 'onboarder.pid');\n}\n\n// The pid in the file, or null when there is no file or it is garbage. A\n// garbage file is treated as absent rather than parsed charitably — it was\n// either written by us (one integer) or it is not ours to interpret.\nexport function readPidFile(configFile) {\n try {\n const pid = Number(fs.readFileSync(pidPath(configFile), 'utf8').trim());\n return Number.isInteger(pid) && pid > 0 ? pid : null;\n } catch {\n return null;\n }\n}\n\n// Signal 0 probes existence without delivering anything. EPERM means the\n// process exists but belongs to someone else — still alive, just not ours\n// to signal.\nexport function pidIsAlive(pid) {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return e.code === 'EPERM';\n }\n}\n\nexport function writePidFile(configFile) {\n fs.writeFileSync(pidPath(configFile), String(process.pid) + '\\n', { mode: 0o600 });\n}\n\n// Remove the file only when it still points at `pid` — a second server that\n// rewrote the file must not lose its record because the first one exited.\nexport function removePidFile(configFile, pid = process.pid) {\n if (readPidFile(configFile) === pid) {\n fs.rmSync(pidPath(configFile), { force: true });\n removeRunInfo(configFile);\n }\n}\n\n// The pid answers \"is it running?\"; it cannot answer \"how is it running?\".\n// Which mode a live server was launched in (foreground, background, a login\n// item), where its log file is, and when it booted are all things `onboarder\n// status` should be able to print without guessing — so they are written\n// beside the pid, best effort, exactly like the pid itself.\nexport function runInfoPath(configFile) {\n return path.join(path.dirname(path.resolve(configFile)), 'onboarder.run.json');\n}\n\nexport function writeRunInfo(configFile, info: Record<string, any> = {}) {\n try {\n fs.writeFileSync(runInfoPath(configFile), JSON.stringify({\n pid: process.pid,\n startedAt: new Date().toISOString(),\n ...info,\n }, null, 2) + '\\n', { mode: 0o600 });\n } catch {\n // A read-only config dir must never stop a server from booting.\n }\n}\n\nexport function readRunInfo(configFile) {\n try {\n const value = JSON.parse(fs.readFileSync(runInfoPath(configFile), 'utf8'));\n return value && typeof value === 'object' ? value : null;\n } catch {\n return null;\n }\n}\n\nexport function removeRunInfo(configFile) {\n try { fs.rmSync(runInfoPath(configFile), { force: true }); } catch { /* nothing to clean */ }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { DiffOptions } from './gitDiff.js';
2
+ import type { ReviewProfile } from '../shared/review/contracts.js';
3
+ export declare function runReview(root: string, options?: DiffOptions & {
4
+ profile?: ReviewProfile;
5
+ }): Promise<import("../shared/review/contracts.js").ReviewReport>;
@@ -0,0 +1,35 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lstat, readFile, realpath } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { getGitDiff, GitDiffError } from './gitDiff.js';
5
+ import { isInside } from './paths.js';
6
+ import { buildReview, DEFAULT_REVIEW_CONFIG, parseReviewConfig, reviewProfile } from '../shared/review/review.js';
7
+ export async function runReview(root, options = {}) {
8
+ const configPath = path.join(root, '.onboarder-review.json');
9
+ let config = DEFAULT_REVIEW_CONFIG;
10
+ try {
11
+ const st = await lstat(configPath);
12
+ if (!st.isFile() || st.isSymbolicLink() || st.size > 65536 || !isInside(await realpath(root), await realpath(configPath)))
13
+ throw new GitDiffError('Review configuration must be a regular JSON file inside the repository, under 64 KB.', 400);
14
+ const text = await readFile(configPath, 'utf8');
15
+ if (Buffer.byteLength(text) > 65536)
16
+ throw new GitDiffError('Review configuration exceeds 64 KB.', 400);
17
+ try {
18
+ config = parseReviewConfig(JSON.parse(text));
19
+ }
20
+ catch (error) {
21
+ throw new GitDiffError(`Invalid .onboarder-review.json: ${error instanceof Error ? error.message : 'Invalid JSON'}`, 400);
22
+ }
23
+ }
24
+ catch (error) {
25
+ if (error.code !== 'ENOENT')
26
+ throw error;
27
+ }
28
+ if (options.profile)
29
+ config = { ...config, profile: reviewProfile(options.profile) };
30
+ const diff = await getGitDiff(root, { ...options, includeUntracked: true });
31
+ const report = buildReview(diff, config);
32
+ report.fingerprint = createHash('sha256').update(diff.raw).update(JSON.stringify({ config, base: diff.base, head: diff.head, mode: diff.mode })).digest('hex');
33
+ return report;
34
+ }
35
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/server/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAIlH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,OAAO,GAA8C,EAAE;IACnG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC7D,IAAI,MAAM,GAAG,qBAAqB,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;YAAE,MAAM,IAAI,YAAY,CAAC,sFAAsF,EAAE,GAAG,CAAC,CAAC;QAC/O,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK;YAAE,MAAM,IAAI,YAAY,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QACxG,IAAI,CAAC;YAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;QACrD,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,YAAY,CAAC,mCAAmC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;IAC9I,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IAAC,CAAC;IACxF,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACrF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/J,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { createHash } from 'node:crypto';\nimport { lstat, readFile, realpath } from 'node:fs/promises';\nimport path from 'node:path';\nimport { getGitDiff, GitDiffError } from './gitDiff.js';\nimport { isInside } from './paths.js';\nimport { buildReview, DEFAULT_REVIEW_CONFIG, parseReviewConfig, reviewProfile } from '../shared/review/review.js';\nimport type { DiffOptions } from './gitDiff.js';\nimport type { ReviewProfile } from '../shared/review/contracts.js';\n\nexport async function runReview(root: string, options: DiffOptions & { profile?: ReviewProfile } = {}) {\n const configPath = path.join(root, '.onboarder-review.json');\n let config = DEFAULT_REVIEW_CONFIG;\n try {\n const st = await lstat(configPath);\n if (!st.isFile() || st.isSymbolicLink() || st.size > 65536 || !isInside(await realpath(root), await realpath(configPath))) throw new GitDiffError('Review configuration must be a regular JSON file inside the repository, under 64 KB.', 400);\n const text = await readFile(configPath, 'utf8');\n if (Buffer.byteLength(text) > 65536) throw new GitDiffError('Review configuration exceeds 64 KB.', 400);\n try { config = parseReviewConfig(JSON.parse(text)); }\n catch (error) { throw new GitDiffError(`Invalid .onboarder-review.json: ${error instanceof Error ? error.message : 'Invalid JSON'}`, 400); }\n } catch (error) { if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; }\n if (options.profile) config = { ...config, profile: reviewProfile(options.profile) };\n const diff = await getGitDiff(root, { ...options, includeUntracked: true });\n const report = buildReview(diff, config);\n report.fingerprint = createHash('sha256').update(diff.raw).update(JSON.stringify({ config, base: diff.base, head: diff.head, mode: diff.mode })).digest('hex');\n return report;\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { Settings } from '../shared/contracts.js';
3
+ interface RouteContext {
4
+ req: IncomingMessage;
5
+ res: ServerResponse;
6
+ url: URL;
7
+ body: any;
8
+ rest: string;
9
+ config: any;
10
+ settings: Settings;
11
+ }
12
+ interface Route {
13
+ method: string;
14
+ path?: string;
15
+ prefix?: string;
16
+ body?: boolean;
17
+ sameOrigin?: boolean;
18
+ run(context: RouteContext): unknown;
19
+ }
20
+ export declare const routes: readonly Readonly<{
21
+ method: string;
22
+ path?: string;
23
+ prefix?: string;
24
+ body?: boolean;
25
+ sameOrigin?: boolean;
26
+ run(context: RouteContext): unknown;
27
+ }>[];
28
+ export declare function matchRoute(method: any, pathname: any): {
29
+ route: Route;
30
+ rest: any;
31
+ };
32
+ export declare function createRouter(config: any): (req: any, res: any) => Promise<unknown>;
33
+ export {};