codebase-onboarder 0.6.0 → 1.0.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 (526) hide show
  1. package/README.md +284 -53
  2. package/bin/build-if-source.js +23 -0
  3. package/bin/onboarder.js +0 -0
  4. package/cli/agent/command.d.ts +71 -0
  5. package/cli/agent/command.js +177 -0
  6. package/cli/agent/command.js.map +1 -0
  7. package/cli/agent/config.d.ts +31 -0
  8. package/cli/agent/config.js +98 -0
  9. package/cli/agent/config.js.map +1 -0
  10. package/cli/agent/contracts.d.ts +77 -0
  11. package/cli/agent/contracts.js +2 -0
  12. package/cli/agent/contracts.js.map +1 -0
  13. package/cli/agent/files.d.ts +19 -0
  14. package/cli/agent/files.js +109 -0
  15. package/cli/agent/files.js.map +1 -0
  16. package/cli/agent/gitSource.d.ts +18 -0
  17. package/cli/agent/gitSource.js +69 -0
  18. package/cli/agent/gitSource.js.map +1 -0
  19. package/cli/agent/github.d.ts +21 -0
  20. package/cli/agent/github.js +94 -0
  21. package/cli/agent/github.js.map +1 -0
  22. package/cli/agent/mcp.d.ts +15 -0
  23. package/cli/agent/mcp.js +78 -0
  24. package/cli/agent/mcp.js.map +1 -0
  25. package/cli/agent/process.d.ts +18 -0
  26. package/cli/agent/process.js +118 -0
  27. package/cli/agent/process.js.map +1 -0
  28. package/cli/agent/protocol.d.ts +3 -0
  29. package/cli/agent/protocol.js +26 -0
  30. package/cli/agent/protocol.js.map +1 -0
  31. package/cli/agent/runner.d.ts +34 -0
  32. package/cli/agent/runner.js +152 -0
  33. package/cli/agent/runner.js.map +1 -0
  34. package/cli/agent/stdio.d.ts +1 -0
  35. package/cli/agent/stdio.js +62 -0
  36. package/cli/agent/stdio.js.map +1 -0
  37. package/cli/agent/tools.d.ts +7 -0
  38. package/cli/agent/tools.js +201 -0
  39. package/cli/agent/tools.js.map +1 -0
  40. package/cli/chat/app.d.ts +16 -0
  41. package/cli/chat/app.js +345 -0
  42. package/cli/chat/app.js.map +1 -0
  43. package/cli/chat/commands.d.ts +11 -0
  44. package/cli/chat/commands.js +120 -0
  45. package/cli/chat/commands.js.map +1 -0
  46. package/cli/chat/composer.d.ts +75 -0
  47. package/cli/chat/composer.js +467 -0
  48. package/cli/chat/composer.js.map +1 -0
  49. package/cli/chat/controller.d.ts +60 -0
  50. package/cli/chat/controller.js +393 -0
  51. package/cli/chat/controller.js.map +1 -0
  52. package/cli/chat/logo.d.ts +3 -0
  53. package/cli/chat/logo.js +14 -0
  54. package/cli/chat/logo.js.map +1 -0
  55. package/cli/chat/models.d.ts +18 -0
  56. package/cli/chat/models.js +88 -0
  57. package/cli/chat/models.js.map +1 -0
  58. package/cli/chat/profile.d.ts +5 -0
  59. package/cli/chat/profile.js +98 -0
  60. package/cli/chat/profile.js.map +1 -0
  61. package/cli/chat/render.d.ts +40 -0
  62. package/cli/chat/render.js +259 -0
  63. package/cli/chat/render.js.map +1 -0
  64. package/cli/chat/screen.d.ts +26 -0
  65. package/cli/chat/screen.js +117 -0
  66. package/cli/chat/screen.js.map +1 -0
  67. package/cli/chat/source.d.ts +29 -0
  68. package/cli/chat/source.js +116 -0
  69. package/cli/chat/source.js.map +1 -0
  70. package/cli/chat/store.d.ts +43 -0
  71. package/cli/chat/store.js +94 -0
  72. package/cli/chat/store.js.map +1 -0
  73. package/cli/chat/text.d.ts +4 -0
  74. package/cli/chat/text.js +27 -0
  75. package/cli/chat/text.js.map +1 -0
  76. package/cli/commands.d.ts +26 -0
  77. package/cli/commands.js +836 -811
  78. package/cli/commands.js.map +1 -0
  79. package/cli/explorer/advanced.d.ts +14 -0
  80. package/cli/explorer/advanced.js +321 -329
  81. package/cli/explorer/advanced.js.map +1 -0
  82. package/cli/explorer/app.d.ts +2 -0
  83. package/cli/explorer/app.js +404 -314
  84. package/cli/explorer/app.js.map +1 -0
  85. package/cli/explorer/assistant.d.ts +9 -0
  86. package/cli/explorer/assistant.js +58 -0
  87. package/cli/explorer/assistant.js.map +1 -0
  88. package/cli/explorer/commands.d.ts +17 -0
  89. package/cli/explorer/commands.js +373 -302
  90. package/cli/explorer/commands.js.map +1 -0
  91. package/cli/explorer/featureViews.d.ts +124 -0
  92. package/cli/explorer/featureViews.js +179 -0
  93. package/cli/explorer/featureViews.js.map +1 -0
  94. package/cli/explorer/github.d.ts +21 -0
  95. package/cli/explorer/github.js +42 -44
  96. package/cli/explorer/github.js.map +1 -0
  97. package/cli/explorer/graphs.d.ts +7 -0
  98. package/cli/explorer/graphs.js +90 -95
  99. package/cli/explorer/graphs.js.map +1 -0
  100. package/cli/explorer/picker.d.ts +22 -0
  101. package/cli/explorer/picker.js +150 -0
  102. package/cli/explorer/picker.js.map +1 -0
  103. package/cli/explorer/report.d.ts +85 -0
  104. package/cli/explorer/report.js +60 -0
  105. package/cli/explorer/report.js.map +1 -0
  106. package/cli/explorer/session.d.ts +449 -0
  107. package/cli/explorer/session.js +143 -144
  108. package/cli/explorer/session.js.map +1 -0
  109. package/cli/explorer/views.d.ts +19 -0
  110. package/cli/explorer/views.js +465 -482
  111. package/cli/explorer/views.js.map +1 -0
  112. package/cli/explorer/wrap.d.ts +1 -0
  113. package/cli/explorer/wrap.js +28 -44
  114. package/cli/explorer/wrap.js.map +1 -0
  115. package/cli/main.d.ts +1 -0
  116. package/cli/main.js +251 -164
  117. package/cli/main.js.map +1 -0
  118. package/cli/prompt.d.ts +5 -0
  119. package/cli/prompt.js +84 -80
  120. package/cli/prompt.js.map +1 -0
  121. package/cli/scanOptions.d.ts +2 -0
  122. package/cli/scanOptions.js +11 -0
  123. package/cli/scanOptions.js.map +1 -0
  124. package/cli/ui.d.ts +33 -0
  125. package/cli/ui.js +35 -44
  126. package/cli/ui.js.map +1 -0
  127. package/cli/wizard.d.ts +187 -0
  128. package/cli/wizard.js +304 -284
  129. package/cli/wizard.js.map +1 -0
  130. package/docs/HERMES_RESEARCH.md +51 -0
  131. package/package.json +16 -4
  132. package/public/app.d.ts +1 -0
  133. package/public/app.js +1133 -1011
  134. package/public/app.js.map +1 -0
  135. package/public/assets/onboarder-mark.svg +11 -0
  136. package/public/browser.d.ts +71 -0
  137. package/public/browser.js +2 -0
  138. package/public/browser.js.map +1 -0
  139. package/public/index.html +54 -20
  140. package/public/js/about.d.ts +6 -0
  141. package/public/js/about.js +152 -172
  142. package/public/js/about.js.map +1 -0
  143. package/public/js/aiDraft.d.ts +4 -0
  144. package/public/js/aiDraft.js +166 -125
  145. package/public/js/aiDraft.js.map +1 -0
  146. package/public/js/analysisPanel.d.ts +7 -0
  147. package/public/js/analysisPanel.js +166 -166
  148. package/public/js/analysisPanel.js.map +1 -0
  149. package/public/js/analysisReport.d.ts +38 -0
  150. package/public/js/analysisReport.js +105 -110
  151. package/public/js/analysisReport.js.map +1 -0
  152. package/public/js/api.d.ts +29 -0
  153. package/public/js/api.js +198 -166
  154. package/public/js/api.js.map +1 -0
  155. package/public/js/atlas.d.ts +6 -0
  156. package/public/js/atlas.js +50 -58
  157. package/public/js/atlas.js.map +1 -0
  158. package/public/js/blameView.d.ts +2 -0
  159. package/public/js/blameView.js +36 -37
  160. package/public/js/blameView.js.map +1 -0
  161. package/public/js/codeTab.d.ts +3 -0
  162. package/public/js/codeTab.js +175 -180
  163. package/public/js/codeTab.js.map +1 -0
  164. package/public/js/codeViewer.d.ts +5 -0
  165. package/public/js/codeViewer.js +162 -150
  166. package/public/js/codeViewer.js.map +1 -0
  167. package/public/js/components/FileChip.d.ts +9 -0
  168. package/public/js/components/FileChip.js +45 -49
  169. package/public/js/components/FileChip.js.map +1 -0
  170. package/public/js/components/MetricSparkline.d.ts +7 -0
  171. package/public/js/components/MetricSparkline.js +35 -44
  172. package/public/js/components/MetricSparkline.js.map +1 -0
  173. package/public/js/components/RiskBadge.d.ts +9 -0
  174. package/public/js/components/RiskBadge.js +55 -63
  175. package/public/js/components/RiskBadge.js.map +1 -0
  176. package/public/js/deepAnalysisView.d.ts +99 -0
  177. package/public/js/deepAnalysisView.js +282 -302
  178. package/public/js/deepAnalysisView.js.map +1 -0
  179. package/public/js/diagramPane.d.ts +9 -0
  180. package/public/js/diagramPane.js +138 -135
  181. package/public/js/diagramPane.js.map +1 -0
  182. package/public/js/diffView.d.ts +6 -0
  183. package/public/js/diffView.js +222 -209
  184. package/public/js/diffView.js.map +1 -0
  185. package/public/js/docsView.d.ts +2 -0
  186. package/public/js/docsView.js +441 -442
  187. package/public/js/docsView.js.map +1 -0
  188. package/public/js/dom.d.ts +197 -0
  189. package/public/js/dom.js +5 -0
  190. package/public/js/dom.js.map +1 -0
  191. package/public/js/fileSourceBrowser.d.ts +5 -0
  192. package/public/js/fileSourceBrowser.js +33 -41
  193. package/public/js/fileSourceBrowser.js.map +1 -0
  194. package/public/js/flameGraph.d.ts +5 -0
  195. package/public/js/flameGraph.js +62 -72
  196. package/public/js/flameGraph.js.map +1 -0
  197. package/public/js/forceGraph.d.ts +10 -0
  198. package/public/js/forceGraph.js +581 -556
  199. package/public/js/forceGraph.js.map +1 -0
  200. package/public/js/heatmap.d.ts +4 -0
  201. package/public/js/heatmap.js +142 -164
  202. package/public/js/heatmap.js.map +1 -0
  203. package/public/js/highlight.d.ts +2 -0
  204. package/public/js/highlight.js +116 -107
  205. package/public/js/highlight.js.map +1 -0
  206. package/public/js/html.d.ts +2 -0
  207. package/public/js/html.js +14 -44
  208. package/public/js/html.js.map +1 -0
  209. package/public/js/insightsView.d.ts +5 -0
  210. package/public/js/insightsView.js +93 -111
  211. package/public/js/insightsView.js.map +1 -0
  212. package/public/js/inspector.d.ts +37 -0
  213. package/public/js/inspector.js +416 -445
  214. package/public/js/inspector.js.map +1 -0
  215. package/public/js/llm.d.ts +115 -0
  216. package/public/js/llm.js +246 -278
  217. package/public/js/llm.js.map +1 -0
  218. package/public/js/mapView.d.ts +3 -0
  219. package/public/js/mapView.js +121 -120
  220. package/public/js/mapView.js.map +1 -0
  221. package/public/js/markdown.d.ts +3 -0
  222. package/public/js/markdown.js +84 -91
  223. package/public/js/markdown.js.map +1 -0
  224. package/public/js/mindmap.d.ts +32 -0
  225. package/public/js/mindmap.js +244 -259
  226. package/public/js/mindmap.js.map +1 -0
  227. package/public/js/mobilePanels.d.ts +5 -0
  228. package/public/js/mobilePanels.js +50 -0
  229. package/public/js/mobilePanels.js.map +1 -0
  230. package/public/js/repoFiles.d.ts +12 -0
  231. package/public/js/repoFiles.js +29 -28
  232. package/public/js/repoFiles.js.map +1 -0
  233. package/public/js/reviewView.d.ts +28 -0
  234. package/public/js/reviewView.js +256 -0
  235. package/public/js/reviewView.js.map +1 -0
  236. package/public/js/sbomView.d.ts +3 -0
  237. package/public/js/sbomView.js +59 -67
  238. package/public/js/sbomView.js.map +1 -0
  239. package/public/js/scanCache.d.ts +16 -0
  240. package/public/js/scanCache.js +67 -65
  241. package/public/js/scanCache.js.map +1 -0
  242. package/public/js/search.d.ts +7 -0
  243. package/public/js/search.js +868 -800
  244. package/public/js/search.js.map +1 -0
  245. package/public/js/searchLocal.d.ts +42 -0
  246. package/public/js/searchLocal.js +87 -0
  247. package/public/js/searchLocal.js.map +1 -0
  248. package/public/js/serverSettings.d.ts +5 -0
  249. package/public/js/serverSettings.js +153 -164
  250. package/public/js/serverSettings.js.map +1 -0
  251. package/public/js/state.d.ts +798 -0
  252. package/public/js/state.js +114 -122
  253. package/public/js/state.js.map +1 -0
  254. package/public/js/tour.d.ts +6 -0
  255. package/public/js/tour.js +5 -7
  256. package/public/js/tour.js.map +1 -0
  257. package/public/js/transitions.d.ts +2 -0
  258. package/public/js/transitions.js +9 -10
  259. package/public/js/transitions.js.map +1 -0
  260. package/public/js/tree.d.ts +12 -0
  261. package/public/js/tree.js +157 -154
  262. package/public/js/tree.js.map +1 -0
  263. package/public/js/workflowsView.d.ts +3 -0
  264. package/public/js/workflowsView.js +15 -22
  265. package/public/js/workflowsView.js.map +1 -0
  266. package/public/search.css +495 -0
  267. package/public/styles.css +188 -346
  268. package/public/workbench.css +166 -0
  269. package/server/apiAuth.d.ts +3 -0
  270. package/server/apiAuth.js +18 -20
  271. package/server/apiAuth.js.map +1 -0
  272. package/server/apiDiff.d.ts +2 -0
  273. package/server/apiDiff.js +20 -18
  274. package/server/apiDiff.js.map +1 -0
  275. package/server/apiDocs.d.ts +2 -0
  276. package/server/apiDocs.js +38 -40
  277. package/server/apiDocs.js.map +1 -0
  278. package/server/apiFile.d.ts +1 -0
  279. package/server/apiFile.js +14 -17
  280. package/server/apiFile.js.map +1 -0
  281. package/server/apiGitBlame.d.ts +2 -0
  282. package/server/apiGitBlame.js +50 -51
  283. package/server/apiGitBlame.js.map +1 -0
  284. package/server/apiMcp.d.ts +4 -0
  285. package/server/apiMcp.js +64 -66
  286. package/server/apiMcp.js.map +1 -0
  287. package/server/apiReview.d.ts +2 -0
  288. package/server/apiReview.js +45 -0
  289. package/server/apiReview.js.map +1 -0
  290. package/server/apiScan.d.ts +5 -0
  291. package/server/apiScan.js +90 -71
  292. package/server/apiScan.js.map +1 -0
  293. package/server/apiSearch.d.ts +33 -0
  294. package/server/apiSearch.js +184 -200
  295. package/server/apiSearch.js.map +1 -0
  296. package/server/apiSettings.d.ts +4 -0
  297. package/server/apiSettings.js +84 -85
  298. package/server/apiSettings.js.map +1 -0
  299. package/server/apiTools.d.ts +3 -0
  300. package/server/apiTools.js +55 -56
  301. package/server/apiTools.js.map +1 -0
  302. package/server/auth.d.ts +5 -0
  303. package/server/auth.js +54 -51
  304. package/server/auth.js.map +1 -0
  305. package/server/config.d.ts +42 -0
  306. package/server/config.js +189 -194
  307. package/server/config.js.map +1 -0
  308. package/server/daemon.d.ts +12 -0
  309. package/server/daemon.js +124 -114
  310. package/server/daemon.js.map +1 -0
  311. package/server/fileSourceNode.d.ts +2 -0
  312. package/server/fileSourceNode.js +34 -36
  313. package/server/fileSourceNode.js.map +1 -0
  314. package/server/gitClone.d.ts +9 -0
  315. package/server/gitClone.js +59 -61
  316. package/server/gitClone.js.map +1 -0
  317. package/server/gitDiff.d.ts +36 -0
  318. package/server/gitDiff.js +271 -169
  319. package/server/gitDiff.js.map +1 -0
  320. package/server/gitHistory.d.ts +12 -0
  321. package/server/gitHistory.js +80 -80
  322. package/server/gitHistory.js.map +1 -0
  323. package/server/gitRemote.d.ts +12 -0
  324. package/server/gitRemote.js +37 -38
  325. package/server/gitRemote.js.map +1 -0
  326. package/server/hermesChat.d.ts +13 -0
  327. package/server/hermesChat.js +145 -0
  328. package/server/hermesChat.js.map +1 -0
  329. package/server/htmlText.d.ts +4 -0
  330. package/server/htmlText.js +16 -23
  331. package/server/htmlText.js.map +1 -0
  332. package/server/http.d.ts +6 -0
  333. package/server/http.js +27 -34
  334. package/server/http.js.map +1 -0
  335. package/server/httpGuards.d.ts +2 -0
  336. package/server/httpGuards.js +47 -43
  337. package/server/httpGuards.js.map +1 -0
  338. package/server/https.d.ts +34 -0
  339. package/server/https.js +121 -111
  340. package/server/https.js.map +1 -0
  341. package/server/index.d.ts +40 -0
  342. package/server/index.js +139 -147
  343. package/server/index.js.map +1 -0
  344. package/server/layout.d.ts +26 -0
  345. package/server/layout.js +59 -64
  346. package/server/layout.js.map +1 -0
  347. package/server/llmProxy.d.ts +3 -0
  348. package/server/llmProxy.js +137 -135
  349. package/server/llmProxy.js.map +1 -0
  350. package/server/logger.d.ts +38 -0
  351. package/server/logger.js +198 -211
  352. package/server/logger.js.map +1 -0
  353. package/server/mcp/analysis.d.ts +29 -0
  354. package/server/mcp/analysis.js +99 -120
  355. package/server/mcp/analysis.js.map +1 -0
  356. package/server/mcp/http.d.ts +9 -0
  357. package/server/mcp/http.js +128 -137
  358. package/server/mcp/http.js.map +1 -0
  359. package/server/mcp/runner.d.ts +68 -0
  360. package/server/mcp/runner.js +208 -218
  361. package/server/mcp/runner.js.map +1 -0
  362. package/server/mcp/server.d.ts +29 -0
  363. package/server/mcp/server.js +167 -180
  364. package/server/mcp/server.js.map +1 -0
  365. package/server/mcp/standalone.d.ts +1 -0
  366. package/server/mcp/standalone.js +8 -10
  367. package/server/mcp/standalone.js.map +1 -0
  368. package/server/mcp/tools.d.ts +2020 -0
  369. package/server/mcp/tools.js +523 -574
  370. package/server/mcp/tools.js.map +1 -0
  371. package/server/paths.d.ts +3 -0
  372. package/server/paths.js +17 -15
  373. package/server/paths.js.map +1 -0
  374. package/server/pidfile.d.ts +9 -0
  375. package/server/pidfile.js +43 -45
  376. package/server/pidfile.js.map +1 -0
  377. package/server/review.d.ts +5 -0
  378. package/server/review.js +35 -0
  379. package/server/review.js.map +1 -0
  380. package/server/router.d.ts +33 -0
  381. package/server/router.js +195 -197
  382. package/server/router.js.map +1 -0
  383. package/server/scanRequest.d.ts +3 -0
  384. package/server/scanRequest.js +36 -0
  385. package/server/scanRequest.js.map +1 -0
  386. package/server/searchIndex.d.ts +17 -0
  387. package/server/searchIndex.js +83 -80
  388. package/server/searchIndex.js.map +1 -0
  389. package/server/sessions.d.ts +14 -0
  390. package/server/sessions.js +62 -70
  391. package/server/sessions.js.map +1 -0
  392. package/server/startup.d.ts +118 -0
  393. package/server/startup.js +143 -148
  394. package/server/startup.js.map +1 -0
  395. package/server/static.d.ts +6 -0
  396. package/server/static.js +28 -31
  397. package/server/static.js.map +1 -0
  398. package/server/tools/install.d.ts +4 -0
  399. package/server/tools/install.js +176 -185
  400. package/server/tools/install.js.map +1 -0
  401. package/server/tools/parse.d.ts +8 -0
  402. package/server/tools/parse.js +112 -114
  403. package/server/tools/parse.js.map +1 -0
  404. package/server/tools/platform.d.ts +9 -0
  405. package/server/tools/platform.js +49 -47
  406. package/server/tools/platform.js.map +1 -0
  407. package/server/tools/registry.d.ts +137 -0
  408. package/server/tools/registry.js +173 -172
  409. package/server/tools/registry.js.map +1 -0
  410. package/server/tools/scan.d.ts +34 -0
  411. package/server/tools/scan.js +89 -98
  412. package/server/tools/scan.js.map +1 -0
  413. package/server/tools.d.ts +34 -0
  414. package/server/tools.js +94 -107
  415. package/server/tools.js.map +1 -0
  416. package/server/tunnel.d.ts +29 -0
  417. package/server/tunnel.js +61 -66
  418. package/server/tunnel.js.map +1 -0
  419. package/shared/analyzer/docs.d.ts +16 -0
  420. package/shared/analyzer/docs.js +99 -93
  421. package/shared/analyzer/docs.js.map +1 -0
  422. package/shared/analyzer/explainLocal.d.ts +4 -0
  423. package/shared/analyzer/explainLocal.js +122 -142
  424. package/shared/analyzer/explainLocal.js.map +1 -0
  425. package/shared/analyzer/github.d.ts +37 -0
  426. package/shared/analyzer/github.js +41 -43
  427. package/shared/analyzer/github.js.map +1 -0
  428. package/shared/analyzer/graph.d.ts +41 -0
  429. package/shared/analyzer/graph.js +393 -400
  430. package/shared/analyzer/graph.js.map +1 -0
  431. package/shared/analyzer/health.d.ts +33 -0
  432. package/shared/analyzer/health.js +197 -193
  433. package/shared/analyzer/health.js.map +1 -0
  434. package/shared/analyzer/history.d.ts +29 -0
  435. package/shared/analyzer/history.js +110 -111
  436. package/shared/analyzer/history.js.map +1 -0
  437. package/shared/analyzer/jsonConfig.d.ts +2 -0
  438. package/shared/analyzer/jsonConfig.js +61 -0
  439. package/shared/analyzer/jsonConfig.js.map +1 -0
  440. package/shared/analyzer/languages/csharp.d.ts +26 -0
  441. package/shared/analyzer/languages/csharp.js +83 -88
  442. package/shared/analyzer/languages/csharp.js.map +1 -0
  443. package/shared/analyzer/languages/generic.d.ts +23 -0
  444. package/shared/analyzer/languages/generic.js +94 -105
  445. package/shared/analyzer/languages/generic.js.map +1 -0
  446. package/shared/analyzer/languages/go.d.ts +24 -0
  447. package/shared/analyzer/languages/go.js +45 -54
  448. package/shared/analyzer/languages/go.js.map +1 -0
  449. package/shared/analyzer/languages/index.d.ts +6 -0
  450. package/shared/analyzer/languages/index.js +19 -20
  451. package/shared/analyzer/languages/index.js.map +1 -0
  452. package/shared/analyzer/languages/java.d.ts +20 -0
  453. package/shared/analyzer/languages/java.js +73 -78
  454. package/shared/analyzer/languages/java.js.map +1 -0
  455. package/shared/analyzer/languages/javascript.d.ts +12 -0
  456. package/shared/analyzer/languages/javascript.js +258 -209
  457. package/shared/analyzer/languages/javascript.js.map +1 -0
  458. package/shared/analyzer/languages/python.d.ts +23 -0
  459. package/shared/analyzer/languages/python.js +92 -100
  460. package/shared/analyzer/languages/python.js.map +1 -0
  461. package/shared/analyzer/languages/rust.d.ts +17 -0
  462. package/shared/analyzer/languages/rust.js +96 -98
  463. package/shared/analyzer/languages/rust.js.map +1 -0
  464. package/shared/analyzer/languages/typescript.d.ts +11 -0
  465. package/shared/analyzer/languages/typescript.js +117 -116
  466. package/shared/analyzer/languages/typescript.js.map +1 -0
  467. package/shared/analyzer/licenses.d.ts +18 -0
  468. package/shared/analyzer/licenses.js +130 -133
  469. package/shared/analyzer/licenses.js.map +1 -0
  470. package/shared/analyzer/metrics.d.ts +20 -0
  471. package/shared/analyzer/metrics.js +112 -104
  472. package/shared/analyzer/metrics.js.map +1 -0
  473. package/shared/analyzer/pathUtil.d.ts +10 -0
  474. package/shared/analyzer/pathUtil.js +29 -35
  475. package/shared/analyzer/pathUtil.js.map +1 -0
  476. package/shared/analyzer/patterns.d.ts +11 -0
  477. package/shared/analyzer/patterns.js +231 -253
  478. package/shared/analyzer/patterns.js.map +1 -0
  479. package/shared/analyzer/scan.d.ts +62 -0
  480. package/shared/analyzer/scan.js +451 -442
  481. package/shared/analyzer/scan.js.map +1 -0
  482. package/shared/analyzer/scanControl.d.ts +11 -0
  483. package/shared/analyzer/scanControl.js +62 -0
  484. package/shared/analyzer/scanControl.js.map +1 -0
  485. package/shared/analyzer/security.d.ts +18 -0
  486. package/shared/analyzer/security.js +159 -159
  487. package/shared/analyzer/security.js.map +1 -0
  488. package/shared/analyzer/services.d.ts +5 -0
  489. package/shared/analyzer/services.js +141 -138
  490. package/shared/analyzer/services.js.map +1 -0
  491. package/shared/analyzer/stack.d.ts +6 -0
  492. package/shared/analyzer/stack.js +134 -141
  493. package/shared/analyzer/stack.js.map +1 -0
  494. package/shared/analyzer/tour.d.ts +2 -0
  495. package/shared/analyzer/tour.js +45 -53
  496. package/shared/analyzer/tour.js.map +1 -0
  497. package/shared/analyzer/util.d.ts +8 -0
  498. package/shared/analyzer/util.js +130 -76
  499. package/shared/analyzer/util.js.map +1 -0
  500. package/shared/analyzer/workflows.d.ts +8 -0
  501. package/shared/analyzer/workflows.js +139 -134
  502. package/shared/analyzer/workflows.js.map +1 -0
  503. package/shared/contracts.d.ts +250 -0
  504. package/shared/contracts.js +2 -0
  505. package/shared/contracts.js.map +1 -0
  506. package/shared/diagram/aiFacts.d.ts +35 -0
  507. package/shared/diagram/aiFacts.js +102 -105
  508. package/shared/diagram/aiFacts.js.map +1 -0
  509. package/shared/diagram/aiMermaid.d.ts +5 -0
  510. package/shared/diagram/aiMermaid.js +50 -46
  511. package/shared/diagram/aiMermaid.js.map +1 -0
  512. package/shared/diagram/atlas.d.ts +16 -0
  513. package/shared/diagram/atlas.js +51 -60
  514. package/shared/diagram/atlas.js.map +1 -0
  515. package/shared/diagram/mermaid.d.ts +43 -0
  516. package/shared/diagram/mermaid.js +348 -370
  517. package/shared/diagram/mermaid.js.map +1 -0
  518. package/shared/review/contracts.d.ts +95 -0
  519. package/shared/review/contracts.js +2 -0
  520. package/shared/review/contracts.js.map +1 -0
  521. package/shared/review/review.d.ts +10 -0
  522. package/shared/review/review.js +184 -0
  523. package/shared/review/review.js.map +1 -0
  524. package/shared/search/query.d.ts +32 -0
  525. package/shared/search/query.js +395 -388
  526. package/shared/search/query.js.map +1 -0
@@ -1,138 +1,139 @@
1
1
  // TypeScript / TSX analyzer.
2
2
  // Extracts interfaces, type aliases, enums, decorators, and generic arities,
3
3
  // while preserving clause symbols and resolving imports according to tsconfig.json.
4
-
5
- import { blankComments, lineCounter, braceBodyEnd, uniqueBy } from '../util.js';
4
+ import { blankComments, jsCodeMask, lineCounter, braceBodyEnd, uniqueBy } from '../util.js';
6
5
  import { dirOf, joinPath, baseName } from '../pathUtil.js';
7
6
  import { resolveImport, packageNameOf } from './javascript.js';
8
-
9
7
  export const extensions = ['.ts', '.tsx'];
10
-
11
8
  const IMPORT_RES = [
12
- /\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
13
- /\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
14
- /(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g,
15
- /\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
16
- /(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
9
+ /\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
10
+ /\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g,
11
+ /(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g,
12
+ /\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
13
+ /(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g,
17
14
  ];
18
-
19
15
  const EXPORT_RES = [
20
- { re: /\bexport\s+(?:async\s+)?function\s*\*?\s*([\w$]+)/g, kind: 'function' },
21
- { re: /\bexport\s+(?:abstract\s+)?class\s+([\w$]+)/g, kind: 'class' },
22
- { re: /\bexport\s+(?:const|let|var)\s+([\w$]+)/g, kind: 'const' },
23
- { re: /\bexport\s+(?:interface|type|enum)\s+([\w$]+)/g, kind: 'type' },
24
- { re: /\bexport\s+default\b/g, kind: 'default', name: 'default' },
16
+ { re: /\bexport\s+(?:async\s+)?function\s*\*?\s*([\w$]+)/g, kind: 'function' },
17
+ { re: /\bexport\s+(?:abstract\s+)?class\s+([\w$]+)/g, kind: 'class' },
18
+ { re: /\bexport\s+(?:const|let|var)\s+([\w$]+)/g, kind: 'const' },
19
+ { re: /\bexport\s+(?:interface|type|enum)\s+([\w$]+)/g, kind: 'type' },
20
+ { re: /\bexport\s+default\b/g, kind: 'default', name: 'default' },
25
21
  ];
26
-
27
22
  const NAMED_EXPORT_RE = /\bexport\s*\{([^}]*)\}/g;
28
23
  const DECORATOR_RE = /@([\w$]+)(?:\s*\()?/g;
29
24
  const GENERIC_RE = /<([A-Za-z0-9_$,\s]+)>/;
30
-
31
25
  function extractClauseSymbols(clause) {
32
- const symbols = [];
33
- const c = clause.trim();
34
- if (!c) return symbols;
35
- if (c.startsWith('*')) return ['*'];
36
-
37
- const braceStart = c.indexOf('{');
38
- if (braceStart === -1) {
39
- const defMatch = c.match(/^[\w$]+/);
40
- if (defMatch && defMatch[0] !== 'type') return ['default'];
41
- return symbols;
42
- }
43
-
44
- const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();
45
- if (beforeBrace && beforeBrace !== 'type') {
46
- symbols.push('default');
47
- }
48
-
49
- const braceEnd = c.lastIndexOf('}');
50
- if (braceEnd > braceStart) {
51
- const inside = c.slice(braceStart + 1, braceEnd);
52
- for (const part of inside.split(',')) {
53
- let t = part.trim();
54
- if (!t) continue;
55
- if (t.startsWith('type ')) t = t.slice(5).trim();
56
- const asMatch = t.match(/^([\w$]+)\s+as\s+[\w$]+/);
57
- const name = asMatch ? asMatch[1] : (t.match(/^[\w$]+/) || [])[0];
58
- if (name) symbols.push(name);
26
+ const symbols = [];
27
+ const c = clause.trim();
28
+ if (!c)
29
+ return symbols;
30
+ if (c.startsWith('*'))
31
+ return ['*'];
32
+ const braceStart = c.indexOf('{');
33
+ if (braceStart === -1) {
34
+ const defMatch = c.match(/^[\w$]+/);
35
+ if (defMatch && defMatch[0] !== 'type')
36
+ return ['default'];
37
+ return symbols;
38
+ }
39
+ const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();
40
+ if (beforeBrace && beforeBrace !== 'type') {
41
+ symbols.push('default');
42
+ }
43
+ const braceEnd = c.lastIndexOf('}');
44
+ if (braceEnd > braceStart) {
45
+ const inside = c.slice(braceStart + 1, braceEnd);
46
+ for (const part of inside.split(',')) {
47
+ let t = part.trim();
48
+ if (!t)
49
+ continue;
50
+ if (t.startsWith('type '))
51
+ t = t.slice(5).trim();
52
+ const asMatch = t.match(/^([\w$]+)\s+as\s+[\w$]+/);
53
+ const name = asMatch ? asMatch[1] : (t.match(/^[\w$]+/) || [])[0];
54
+ if (name)
55
+ symbols.push(name);
56
+ }
59
57
  }
60
- }
61
- return symbols;
58
+ return symbols;
62
59
  }
63
-
64
60
  export function analyze(source, path) {
65
- const clean = blankComments(source);
66
- const lineAt = lineCounter(clean);
67
-
68
- const imports = [];
69
- for (const m of clean.matchAll(/\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
70
- imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
71
- }
72
- for (const m of clean.matchAll(/\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
73
- imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
74
- }
75
- for (const m of clean.matchAll(/(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g)) {
76
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
77
- }
78
- for (const m of clean.matchAll(/\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
79
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
80
- }
81
- for (const m of clean.matchAll(/(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
82
- imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
83
- }
84
-
85
- const exports = [];
86
- for (const { re, kind, name } of EXPORT_RES) {
87
- for (const m of clean.matchAll(re)) {
88
- exports.push({ name: name ?? m[1], kind });
61
+ const clean = blankComments(source);
62
+ const code = jsCodeMask(source);
63
+ const lineAt = lineCounter(clean);
64
+ const imports = [];
65
+ for (const m of source.matchAll(/\bimport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
66
+ if (code[m.index] === ' ')
67
+ continue;
68
+ imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
69
+ }
70
+ for (const m of source.matchAll(/\bexport\s+(?:type\s+)?([\w$*{}\s,]+?)\s+from\s*['"]([^'"\n]+)['"]/g)) {
71
+ if (code[m.index] === ' ')
72
+ continue;
73
+ imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });
74
+ }
75
+ for (const m of source.matchAll(/(?<!['"\w$])import\s*['"]([^'"\n]+)['"]/g)) {
76
+ if (code[m.index] === ' ')
77
+ continue;
78
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
79
+ }
80
+ for (const m of source.matchAll(/\brequire\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
81
+ if (code[m.index] === ' ')
82
+ continue;
83
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
84
+ }
85
+ for (const m of source.matchAll(/(?<!['"\w$])import\s*\(\s*['"]([^'"\n]+)['"]\s*\)/g)) {
86
+ if (code[m.index] === ' ')
87
+ continue;
88
+ imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });
89
+ }
90
+ const exports = [];
91
+ for (const { re, kind, name } of EXPORT_RES) {
92
+ for (const m of clean.matchAll(re)) {
93
+ exports.push({ name: name ?? m[1], kind });
94
+ }
95
+ }
96
+ for (const m of clean.matchAll(NAMED_EXPORT_RE)) {
97
+ for (const part of m[1].split(',')) {
98
+ const t = part.trim();
99
+ if (!t || (/^type\b/.test(t) && !/[\w$]/.test(t.replace(/^type\s+/, ''))))
100
+ continue;
101
+ const asMatch = t.match(/(?:^|\s)as\s+([\w$]+)$/);
102
+ const name = asMatch ? asMatch[1] : (t.match(/^([\w$]+)/) || [])[1];
103
+ if (name)
104
+ exports.push({ name, kind: 'named' });
105
+ }
106
+ }
107
+ const functions = [];
108
+ for (const m of clean.matchAll(/\bfunction\s+([\w$]+)/g)) {
109
+ functions.push({ name: m[1], kind: 'function', line: lineAt(m.index) });
89
110
  }
90
- }
91
- for (const m of clean.matchAll(NAMED_EXPORT_RE)) {
92
- for (const part of m[1].split(',')) {
93
- const t = part.trim();
94
- if (!t || (/^type\b/.test(t) && !/[\w$]/.test(t.replace(/^type\s+/, '')))) continue;
95
- const asMatch = t.match(/(?:^|\s)as\s+([\w$]+)$/);
96
- const name = asMatch ? asMatch[1] : (t.match(/^([\w$]+)/) || [])[1];
97
- if (name) exports.push({ name, kind: 'named' });
111
+ const classes = [];
112
+ for (const m of clean.matchAll(/\bclass\s+([\w$]+)([^{]*)\{/g)) {
113
+ const name = m[1];
114
+ const signature = m[2] || '';
115
+ const decs = [];
116
+ const beforeClass = clean.slice(Math.max(0, m.index - 200), m.index);
117
+ for (const dm of beforeClass.matchAll(DECORATOR_RE)) {
118
+ decs.push(dm[1]);
119
+ }
120
+ const genMatch = signature.match(GENERIC_RE);
121
+ const arity = genMatch ? genMatch[1].split(',').length : 0;
122
+ classes.push({ name, decorators: decs, genericArity: arity, line: lineAt(m.index) });
98
123
  }
99
- }
100
-
101
- const functions = [];
102
- for (const m of clean.matchAll(/\bfunction\s+([\w$]+)/g)) {
103
- functions.push({ name: m[1], kind: 'function', line: lineAt(m.index) });
104
- }
105
-
106
- const classes = [];
107
- for (const m of clean.matchAll(/\bclass\s+([\w$]+)([^{]*)\{/g)) {
108
- const name = m[1];
109
- const signature = m[2] || '';
110
- const decs = [];
111
- const beforeClass = clean.slice(Math.max(0, m.index - 200), m.index);
112
- for (const dm of beforeClass.matchAll(DECORATOR_RE)) {
113
- decs.push(dm[1]);
124
+ const interfaces = [];
125
+ for (const m of clean.matchAll(/\b(?:interface|type|enum)\s+([\w$]+)/g)) {
126
+ interfaces.push({ name: m[1], line: lineAt(m.index) });
114
127
  }
115
- const genMatch = signature.match(GENERIC_RE);
116
- const arity = genMatch ? genMatch[1].split(',').length : 0;
117
-
118
- classes.push({ name, decorators: decs, genericArity: arity, line: lineAt(m.index) });
119
- }
120
-
121
- const interfaces = [];
122
- for (const m of clean.matchAll(/\b(?:interface|type|enum)\s+([\w$]+)/g)) {
123
- interfaces.push({ name: m[1], line: lineAt(m.index) });
124
- }
125
-
126
- const hasMain = /if\s*\(\s*require\.main\s*===\s*module\s*\)|import\.meta\.main/g.test(clean);
127
-
128
- return {
129
- imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
130
- exports: uniqueBy(exports, (e) => e.name),
131
- functions,
132
- classes,
133
- interfaces,
134
- hasMain,
135
- };
128
+ const hasMain = /if\s*\(\s*require\.main\s*===\s*module\s*\)|import\.meta\.main/g.test(clean);
129
+ return {
130
+ imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),
131
+ exports: uniqueBy(exports, (e) => e.name),
132
+ functions,
133
+ classes,
134
+ interfaces,
135
+ hasMain,
136
+ };
136
137
  }
137
-
138
138
  export { resolveImport, packageNameOf };
139
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/shared/analyzer/languages/typescript.ts"],"names":[],"mappings":"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","sourcesContent":["// TypeScript / TSX analyzer.\n// Extracts interfaces, type aliases, enums, decorators, and generic arities,\n// while preserving clause symbols and resolving imports according to tsconfig.json.\n\nimport { blankComments, jsCodeMask, lineCounter, braceBodyEnd, uniqueBy } from '../util.js';\nimport { dirOf, joinPath, baseName } from '../pathUtil.js';\nimport { resolveImport, packageNameOf } from './javascript.js';\n\nexport const extensions = ['.ts', '.tsx'];\n\nconst IMPORT_RES = [\n /\\bimport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g,\n /\\bexport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g,\n /(?<!['\"\\w$])import\\s*['\"]([^'\"\\n]+)['\"]/g,\n /\\brequire\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g,\n /(?<!['\"\\w$])import\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g,\n];\n\nconst EXPORT_RES = [\n { re: /\\bexport\\s+(?:async\\s+)?function\\s*\\*?\\s*([\\w$]+)/g, kind: 'function' },\n { re: /\\bexport\\s+(?:abstract\\s+)?class\\s+([\\w$]+)/g, kind: 'class' },\n { re: /\\bexport\\s+(?:const|let|var)\\s+([\\w$]+)/g, kind: 'const' },\n { re: /\\bexport\\s+(?:interface|type|enum)\\s+([\\w$]+)/g, kind: 'type' },\n { re: /\\bexport\\s+default\\b/g, kind: 'default', name: 'default' },\n];\n\nconst NAMED_EXPORT_RE = /\\bexport\\s*\\{([^}]*)\\}/g;\nconst DECORATOR_RE = /@([\\w$]+)(?:\\s*\\()?/g;\nconst GENERIC_RE = /<([A-Za-z0-9_$,\\s]+)>/;\n\nfunction extractClauseSymbols(clause) {\n const symbols = [];\n const c = clause.trim();\n if (!c) return symbols;\n if (c.startsWith('*')) return ['*'];\n\n const braceStart = c.indexOf('{');\n if (braceStart === -1) {\n const defMatch = c.match(/^[\\w$]+/);\n if (defMatch && defMatch[0] !== 'type') return ['default'];\n return symbols;\n }\n\n const beforeBrace = c.slice(0, braceStart).trim().replace(/,$/, '').trim();\n if (beforeBrace && beforeBrace !== 'type') {\n symbols.push('default');\n }\n\n const braceEnd = c.lastIndexOf('}');\n if (braceEnd > braceStart) {\n const inside = c.slice(braceStart + 1, braceEnd);\n for (const part of inside.split(',')) {\n let t = part.trim();\n if (!t) continue;\n if (t.startsWith('type ')) t = t.slice(5).trim();\n const asMatch = t.match(/^([\\w$]+)\\s+as\\s+[\\w$]+/);\n const name = asMatch ? asMatch[1] : (t.match(/^[\\w$]+/) || [])[0];\n if (name) symbols.push(name);\n }\n }\n return symbols;\n}\n\nexport function analyze(source, path) {\n const clean = blankComments(source);\n const code = jsCodeMask(source);\n const lineAt = lineCounter(clean);\n\n const imports = [];\n for (const m of source.matchAll(/\\bimport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/\\bexport\\s+(?:type\\s+)?([\\w$*{}\\s,]+?)\\s+from\\s*['\"]([^'\"\\n]+)['\"]/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[2], symbols: extractClauseSymbols(m[1]), line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/(?<!['\"\\w$])import\\s*['\"]([^'\"\\n]+)['\"]/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/\\brequire\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });\n }\n for (const m of source.matchAll(/(?<!['\"\\w$])import\\s*\\(\\s*['\"]([^'\"\\n]+)['\"]\\s*\\)/g)) {\n if (code[m.index] === ' ') continue;\n imports.push({ spec: m[1], symbols: [], line: lineAt(m.index) });\n }\n\n const exports = [];\n for (const { re, kind, name } of EXPORT_RES) {\n for (const m of clean.matchAll(re)) {\n exports.push({ name: name ?? m[1], kind });\n }\n }\n for (const m of clean.matchAll(NAMED_EXPORT_RE)) {\n for (const part of m[1].split(',')) {\n const t = part.trim();\n if (!t || (/^type\\b/.test(t) && !/[\\w$]/.test(t.replace(/^type\\s+/, '')))) continue;\n const asMatch = t.match(/(?:^|\\s)as\\s+([\\w$]+)$/);\n const name = asMatch ? asMatch[1] : (t.match(/^([\\w$]+)/) || [])[1];\n if (name) exports.push({ name, kind: 'named' });\n }\n }\n\n const functions = [];\n for (const m of clean.matchAll(/\\bfunction\\s+([\\w$]+)/g)) {\n functions.push({ name: m[1], kind: 'function', line: lineAt(m.index) });\n }\n\n const classes = [];\n for (const m of clean.matchAll(/\\bclass\\s+([\\w$]+)([^{]*)\\{/g)) {\n const name = m[1];\n const signature = m[2] || '';\n const decs = [];\n const beforeClass = clean.slice(Math.max(0, m.index - 200), m.index);\n for (const dm of beforeClass.matchAll(DECORATOR_RE)) {\n decs.push(dm[1]);\n }\n const genMatch = signature.match(GENERIC_RE);\n const arity = genMatch ? genMatch[1].split(',').length : 0;\n \n classes.push({ name, decorators: decs, genericArity: arity, line: lineAt(m.index) });\n }\n\n const interfaces = [];\n for (const m of clean.matchAll(/\\b(?:interface|type|enum)\\s+([\\w$]+)/g)) {\n interfaces.push({ name: m[1], line: lineAt(m.index) });\n }\n\n const hasMain = /if\\s*\\(\\s*require\\.main\\s*===\\s*module\\s*\\)|import\\.meta\\.main/g.test(clean);\n\n return {\n imports: uniqueBy(imports, (i) => i.spec + ':' + i.line),\n exports: uniqueBy(exports, (e) => e.name),\n functions,\n classes,\n interfaces,\n hasMain,\n };\n}\n\nexport { resolveImport, packageNameOf };\n"]}
@@ -0,0 +1,18 @@
1
+ export declare function detectLicenseFromText(text: any): {
2
+ id: string;
3
+ name: string;
4
+ type: string;
5
+ };
6
+ export declare function classifyLicenseType(licenseId: any): "copyleft" | "custom" | "permissive" | "unknown" | "weak-copyleft";
7
+ export declare function analyzeLicenses(source: any, manifest?: Record<string, any>): Promise<{
8
+ projectLicense: any;
9
+ sbom: any[];
10
+ counts: {
11
+ permissive: number;
12
+ copyleft: number;
13
+ weakCopyleft: number;
14
+ unknown: number;
15
+ total: number;
16
+ };
17
+ complianceStatus: string;
18
+ }>;
@@ -1,151 +1,148 @@
1
1
  // License detection and Software Bill of Materials (SBOM) compliance analysis.
2
2
  // Pure isomorphic analyzer — works in Node and browser.
3
-
4
3
  const KNOWN_LICENSES = [
5
- { id: 'MIT', name: 'MIT License', type: 'permissive', rx: /\bMIT\b|Permission is hereby granted, free of charge/i },
6
- { id: 'Apache-2.0', name: 'Apache License 2.0', type: 'permissive', rx: /Apache License,\s*Version 2\.0|http:\/\/www\.apache\.org\/licenses\/LICENSE-2\.0/i },
7
- { id: 'BSD-3-Clause', name: 'BSD 3-Clause "New" or "Revised" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Neither the name of[\s\S]*?nor the names of its contributors/i },
8
- { id: 'BSD-2-Clause', name: 'BSD 2-Clause "Simplified" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Redistributions in binary form must reproduce the above copyright/i },
9
- { id: 'ISC', name: 'ISC License', type: 'permissive', rx: /Permission to use, copy, modify, and\/or distribute this software for any purpose/i },
10
- { id: 'GPL-3.0', name: 'GNU General Public License v3.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 3|GPL-3\.0/i },
11
- { id: 'GPL-2.0', name: 'GNU General Public License v2.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 2|GPL-2\.0/i },
12
- { id: 'AGPL-3.0', name: 'GNU Affero General Public License v3.0', type: 'copyleft', rx: /GNU AFFERO GENERAL PUBLIC LICENSE/i },
13
- { id: 'LGPL-3.0', name: 'GNU Lesser General Public License v3.0', type: 'weak-copyleft', rx: /GNU LESSER GENERAL PUBLIC LICENSE\s+Version 3/i },
14
- { id: 'MPL-2.0', name: 'Mozilla Public License 2.0', type: 'weak-copyleft', rx: /Mozilla Public License,?\s*v\.?\s*2\.0/i },
15
- { id: 'Unlicense', name: 'The Unlicense', type: 'public-domain', rx: /This is free and unencumbered software released into the public domain/i },
16
- { id: 'CC0-1.0', name: 'Creative Commons Zero v1.0 Universal', type: 'public-domain', rx: /CC0 1\.0 Universal|Public Domain Dedication/i },
4
+ { id: 'MIT', name: 'MIT License', type: 'permissive', rx: /\bMIT\b|Permission is hereby granted, free of charge/i },
5
+ { id: 'Apache-2.0', name: 'Apache License 2.0', type: 'permissive', rx: /Apache License,\s*Version 2\.0|http:\/\/www\.apache\.org\/licenses\/LICENSE-2\.0/i },
6
+ { id: 'BSD-3-Clause', name: 'BSD 3-Clause "New" or "Revised" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Neither the name of[\s\S]*?nor the names of its contributors/i },
7
+ { id: 'BSD-2-Clause', name: 'BSD 2-Clause "Simplified" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\s\S]*?Redistributions in binary form must reproduce the above copyright/i },
8
+ { id: 'ISC', name: 'ISC License', type: 'permissive', rx: /Permission to use, copy, modify, and\/or distribute this software for any purpose/i },
9
+ { id: 'GPL-3.0', name: 'GNU General Public License v3.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 3|GPL-3\.0/i },
10
+ { id: 'GPL-2.0', name: 'GNU General Public License v2.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\s+Version 2|GPL-2\.0/i },
11
+ { id: 'AGPL-3.0', name: 'GNU Affero General Public License v3.0', type: 'copyleft', rx: /GNU AFFERO GENERAL PUBLIC LICENSE/i },
12
+ { id: 'LGPL-3.0', name: 'GNU Lesser General Public License v3.0', type: 'weak-copyleft', rx: /GNU LESSER GENERAL PUBLIC LICENSE\s+Version 3/i },
13
+ { id: 'MPL-2.0', name: 'Mozilla Public License 2.0', type: 'weak-copyleft', rx: /Mozilla Public License,?\s*v\.?\s*2\.0/i },
14
+ { id: 'Unlicense', name: 'The Unlicense', type: 'public-domain', rx: /This is free and unencumbered software released into the public domain/i },
15
+ { id: 'CC0-1.0', name: 'Creative Commons Zero v1.0 Universal', type: 'public-domain', rx: /CC0 1\.0 Universal|Public Domain Dedication/i },
17
16
  ];
18
-
19
17
  export function detectLicenseFromText(text) {
20
- if (!text || typeof text !== 'string') return null;
21
- for (const lic of KNOWN_LICENSES) {
22
- if (lic.rx.test(text)) {
23
- return { id: lic.id, name: lic.name, type: lic.type };
18
+ if (!text || typeof text !== 'string')
19
+ return null;
20
+ for (const lic of KNOWN_LICENSES) {
21
+ if (lic.rx.test(text)) {
22
+ return { id: lic.id, name: lic.name, type: lic.type };
23
+ }
24
24
  }
25
- }
26
- return null;
25
+ return null;
27
26
  }
28
-
29
27
  export function classifyLicenseType(licenseId) {
30
- if (!licenseId || licenseId === 'UNKNOWN') return 'unknown';
31
- const id = String(licenseId).toUpperCase();
32
- if (/MIT|APACHE|BSD|ISC|UNLICENSE|CC0|ZLIB|WTFPL/.test(id)) return 'permissive';
33
- if (/LGPL|MPL|EPL/.test(id)) return 'weak-copyleft';
34
- if (/AGPL|GPL-2|GPL-3|GPLV2|GPLV3|GPL/.test(id)) return 'copyleft';
35
- return 'custom';
28
+ if (!licenseId || licenseId === 'UNKNOWN')
29
+ return 'unknown';
30
+ const id = String(licenseId).toUpperCase();
31
+ if (/MIT|APACHE|BSD|ISC|UNLICENSE|CC0|ZLIB|WTFPL/.test(id))
32
+ return 'permissive';
33
+ if (/LGPL|MPL|EPL/.test(id))
34
+ return 'weak-copyleft';
35
+ if (/AGPL|GPL-2|GPL-3|GPLV2|GPLV3|GPL/.test(id))
36
+ return 'copyleft';
37
+ return 'custom';
36
38
  }
37
-
38
39
  export async function analyzeLicenses(source, manifest = {}) {
39
- let projectLicense = null;
40
-
41
- // 1. Check root LICENSE / COPYING / LICENSE.md files
42
- const rootFiles = await source.list('').catch(() => []);
43
- const licFile = rootFiles.find((f) => /^LICENSE|^COPYING|^UNLICENSE/i.test(f.name));
44
- if (licFile) {
45
- const content = await source.read(licFile.path).catch(() => '');
46
- projectLicense = detectLicenseFromText(content) || {
47
- id: 'Custom',
48
- name: licFile.name,
49
- type: 'custom',
40
+ let projectLicense = null;
41
+ // 1. Check root LICENSE / COPYING / LICENSE.md files
42
+ const rootFiles = await source.list('').catch(() => []);
43
+ const licFile = rootFiles.find((f) => /^LICENSE|^COPYING|^UNLICENSE/i.test(f.name));
44
+ if (licFile) {
45
+ const content = await source.read(licFile.path).catch(() => '');
46
+ projectLicense = detectLicenseFromText(content) || {
47
+ id: 'Custom',
48
+ name: licFile.name,
49
+ type: 'custom',
50
+ };
51
+ }
52
+ // 2. Fallback to manifest.license from package.json
53
+ if (!projectLicense && manifest.license) {
54
+ const licId = manifest.license;
55
+ projectLicense = {
56
+ id: licId,
57
+ name: licId,
58
+ type: classifyLicenseType(licId),
59
+ };
60
+ }
61
+ // 3. Build SBOM entries from manifest dependencies
62
+ const sbom = [];
63
+ const addDep = (name, version, ecosystem, dev = false) => {
64
+ sbom.push({
65
+ name,
66
+ version: version || '*',
67
+ ecosystem,
68
+ isDev: dev,
69
+ license: inferKnownDepLicense(name, ecosystem),
70
+ });
50
71
  };
51
- }
52
-
53
- // 2. Fallback to manifest.license from package.json
54
- if (!projectLicense && manifest.license) {
55
- const licId = manifest.license;
56
- projectLicense = {
57
- id: licId,
58
- name: licId,
59
- type: classifyLicenseType(licId),
72
+ const npmDeps = manifest.deps?.npm || {};
73
+ for (const [name, ver] of Object.entries(npmDeps)) {
74
+ addDep(name, ver, 'npm', false);
75
+ }
76
+ const devDeps = manifest.deps?.dev || {};
77
+ for (const [name, ver] of Object.entries(devDeps)) {
78
+ addDep(name, ver, 'npm', true);
79
+ }
80
+ for (const name of manifest.deps?.pip || []) {
81
+ addDep(name, '*', 'pip', false);
82
+ }
83
+ for (const name of manifest.deps?.go || []) {
84
+ addDep(name, '*', 'go', false);
85
+ }
86
+ for (const name of manifest.deps?.cargo || []) {
87
+ addDep(name, '*', 'cargo', false);
88
+ }
89
+ const counts = { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };
90
+ for (const item of sbom) {
91
+ const type = item.license.type;
92
+ if (type === 'permissive')
93
+ counts.permissive++;
94
+ else if (type === 'copyleft')
95
+ counts.copyleft++;
96
+ else if (type === 'weak-copyleft')
97
+ counts.weakCopyleft++;
98
+ else
99
+ counts.unknown++;
100
+ }
101
+ const hasCopyleft = counts.copyleft > 0;
102
+ const complianceStatus = hasCopyleft && projectLicense?.type === 'permissive'
103
+ ? 'warning'
104
+ : 'clean';
105
+ return {
106
+ projectLicense: projectLicense || { id: 'UNLICENSED', name: 'None detected', type: 'unknown' },
107
+ sbom,
108
+ counts,
109
+ complianceStatus,
60
110
  };
61
- }
62
-
63
- // 3. Build SBOM entries from manifest dependencies
64
- const sbom = [];
65
- const addDep = (name, version, ecosystem, dev = false) => {
66
- sbom.push({
67
- name,
68
- version: version || '*',
69
- ecosystem,
70
- isDev: dev,
71
- license: inferKnownDepLicense(name, ecosystem),
72
- });
73
- };
74
-
75
- const npmDeps = manifest.deps?.npm || {};
76
- for (const [name, ver] of Object.entries(npmDeps)) {
77
- addDep(name, ver, 'npm', false);
78
- }
79
- const devDeps = manifest.deps?.dev || {};
80
- for (const [name, ver] of Object.entries(devDeps)) {
81
- addDep(name, ver, 'npm', true);
82
- }
83
- for (const name of manifest.deps?.pip || []) {
84
- addDep(name, '*', 'pip', false);
85
- }
86
- for (const name of manifest.deps?.go || []) {
87
- addDep(name, '*', 'go', false);
88
- }
89
- for (const name of manifest.deps?.cargo || []) {
90
- addDep(name, '*', 'cargo', false);
91
- }
92
-
93
- const counts = { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };
94
- for (const item of sbom) {
95
- const type = item.license.type;
96
- if (type === 'permissive') counts.permissive++;
97
- else if (type === 'copyleft') counts.copyleft++;
98
- else if (type === 'weak-copyleft') counts.weakCopyleft++;
99
- else counts.unknown++;
100
- }
101
-
102
- const hasCopyleft = counts.copyleft > 0;
103
- const complianceStatus = hasCopyleft && projectLicense?.type === 'permissive'
104
- ? 'warning'
105
- : 'clean';
106
-
107
- return {
108
- projectLicense: projectLicense || { id: 'UNLICENSED', name: 'None detected', type: 'unknown' },
109
- sbom,
110
- counts,
111
- complianceStatus,
112
- };
113
111
  }
114
-
115
112
  // Inferred licenses for standard popular open-source dependencies
116
113
  const POPULAR_LICENSES = {
117
- react: 'MIT',
118
- 'react-dom': 'MIT',
119
- vue: 'MIT',
120
- express: 'MIT',
121
- lodash: 'MIT',
122
- axios: 'MIT',
123
- typescript: 'Apache-2.0',
124
- next: 'MIT',
125
- tailwindcss: 'MIT',
126
- eslint: 'MIT',
127
- prettier: 'MIT',
128
- mocha: 'MIT',
129
- jest: 'MIT',
130
- vite: 'MIT',
131
- fastapi: 'MIT',
132
- django: 'BSD-3-Clause',
133
- flask: 'BSD-3-Clause',
134
- requests: 'Apache-2.0',
135
- pytest: 'MIT',
136
- numpy: 'BSD-3-Clause',
137
- pandas: 'BSD-3-Clause',
138
- tokio: 'MIT',
139
- serde: 'MIT / Apache-2.0',
140
- gin: 'MIT',
141
- fiber: 'MIT',
114
+ react: 'MIT',
115
+ 'react-dom': 'MIT',
116
+ vue: 'MIT',
117
+ express: 'MIT',
118
+ lodash: 'MIT',
119
+ axios: 'MIT',
120
+ typescript: 'Apache-2.0',
121
+ next: 'MIT',
122
+ tailwindcss: 'MIT',
123
+ eslint: 'MIT',
124
+ prettier: 'MIT',
125
+ mocha: 'MIT',
126
+ jest: 'MIT',
127
+ vite: 'MIT',
128
+ fastapi: 'MIT',
129
+ django: 'BSD-3-Clause',
130
+ flask: 'BSD-3-Clause',
131
+ requests: 'Apache-2.0',
132
+ pytest: 'MIT',
133
+ numpy: 'BSD-3-Clause',
134
+ pandas: 'BSD-3-Clause',
135
+ tokio: 'MIT',
136
+ serde: 'MIT / Apache-2.0',
137
+ gin: 'MIT',
138
+ fiber: 'MIT',
142
139
  };
143
-
144
140
  function inferKnownDepLicense(name, ecosystem) {
145
- const normName = name.toLowerCase().replace(/^@[^/]+\//, '');
146
- const id = POPULAR_LICENSES[name] || POPULAR_LICENSES[normName] || 'Permissive (Inferred)';
147
- return {
148
- id,
149
- type: classifyLicenseType(id),
150
- };
141
+ const normName = name.toLowerCase().replace(/^@[^/]+\//, '');
142
+ const id = POPULAR_LICENSES[name] || POPULAR_LICENSES[normName] || 'Permissive (Inferred)';
143
+ return {
144
+ id,
145
+ type: classifyLicenseType(id),
146
+ };
151
147
  }
148
+ //# sourceMappingURL=licenses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"licenses.js","sourceRoot":"","sources":["../../src/shared/analyzer/licenses.ts"],"names":[],"mappings":"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","sourcesContent":["// License detection and Software Bill of Materials (SBOM) compliance analysis.\n// Pure isomorphic analyzer — works in Node and browser.\n\nconst KNOWN_LICENSES = [\n { id: 'MIT', name: 'MIT License', type: 'permissive', rx: /\\bMIT\\b|Permission is hereby granted, free of charge/i },\n { id: 'Apache-2.0', name: 'Apache License 2.0', type: 'permissive', rx: /Apache License,\\s*Version 2\\.0|http:\\/\\/www\\.apache\\.org\\/licenses\\/LICENSE-2\\.0/i },\n { id: 'BSD-3-Clause', name: 'BSD 3-Clause \"New\" or \"Revised\" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\\s\\S]*?Neither the name of[\\s\\S]*?nor the names of its contributors/i },\n { id: 'BSD-2-Clause', name: 'BSD 2-Clause \"Simplified\" License', type: 'permissive', rx: /Redistribution and use in source and binary forms[\\s\\S]*?Redistributions in binary form must reproduce the above copyright/i },\n { id: 'ISC', name: 'ISC License', type: 'permissive', rx: /Permission to use, copy, modify, and\\/or distribute this software for any purpose/i },\n { id: 'GPL-3.0', name: 'GNU General Public License v3.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\\s+Version 3|GPL-3\\.0/i },\n { id: 'GPL-2.0', name: 'GNU General Public License v2.0', type: 'copyleft', rx: /GNU GENERAL PUBLIC LICENSE\\s+Version 2|GPL-2\\.0/i },\n { id: 'AGPL-3.0', name: 'GNU Affero General Public License v3.0', type: 'copyleft', rx: /GNU AFFERO GENERAL PUBLIC LICENSE/i },\n { id: 'LGPL-3.0', name: 'GNU Lesser General Public License v3.0', type: 'weak-copyleft', rx: /GNU LESSER GENERAL PUBLIC LICENSE\\s+Version 3/i },\n { id: 'MPL-2.0', name: 'Mozilla Public License 2.0', type: 'weak-copyleft', rx: /Mozilla Public License,?\\s*v\\.?\\s*2\\.0/i },\n { id: 'Unlicense', name: 'The Unlicense', type: 'public-domain', rx: /This is free and unencumbered software released into the public domain/i },\n { id: 'CC0-1.0', name: 'Creative Commons Zero v1.0 Universal', type: 'public-domain', rx: /CC0 1\\.0 Universal|Public Domain Dedication/i },\n];\n\nexport function detectLicenseFromText(text) {\n if (!text || typeof text !== 'string') return null;\n for (const lic of KNOWN_LICENSES) {\n if (lic.rx.test(text)) {\n return { id: lic.id, name: lic.name, type: lic.type };\n }\n }\n return null;\n}\n\nexport function classifyLicenseType(licenseId) {\n if (!licenseId || licenseId === 'UNKNOWN') return 'unknown';\n const id = String(licenseId).toUpperCase();\n if (/MIT|APACHE|BSD|ISC|UNLICENSE|CC0|ZLIB|WTFPL/.test(id)) return 'permissive';\n if (/LGPL|MPL|EPL/.test(id)) return 'weak-copyleft';\n if (/AGPL|GPL-2|GPL-3|GPLV2|GPLV3|GPL/.test(id)) return 'copyleft';\n return 'custom';\n}\n\nexport async function analyzeLicenses(source, manifest: Record<string, any> = {}) {\n let projectLicense = null;\n\n // 1. Check root LICENSE / COPYING / LICENSE.md files\n const rootFiles = await source.list('').catch(() => []);\n const licFile = rootFiles.find((f) => /^LICENSE|^COPYING|^UNLICENSE/i.test(f.name));\n if (licFile) {\n const content = await source.read(licFile.path).catch(() => '');\n projectLicense = detectLicenseFromText(content) || {\n id: 'Custom',\n name: licFile.name,\n type: 'custom',\n };\n }\n\n // 2. Fallback to manifest.license from package.json\n if (!projectLicense && manifest.license) {\n const licId = manifest.license;\n projectLicense = {\n id: licId,\n name: licId,\n type: classifyLicenseType(licId),\n };\n }\n\n // 3. Build SBOM entries from manifest dependencies\n const sbom = [];\n const addDep = (name, version, ecosystem, dev = false) => {\n sbom.push({\n name,\n version: version || '*',\n ecosystem,\n isDev: dev,\n license: inferKnownDepLicense(name, ecosystem),\n });\n };\n\n const npmDeps = manifest.deps?.npm || {};\n for (const [name, ver] of Object.entries(npmDeps)) {\n addDep(name, ver, 'npm', false);\n }\n const devDeps = manifest.deps?.dev || {};\n for (const [name, ver] of Object.entries(devDeps)) {\n addDep(name, ver, 'npm', true);\n }\n for (const name of manifest.deps?.pip || []) {\n addDep(name, '*', 'pip', false);\n }\n for (const name of manifest.deps?.go || []) {\n addDep(name, '*', 'go', false);\n }\n for (const name of manifest.deps?.cargo || []) {\n addDep(name, '*', 'cargo', false);\n }\n\n const counts = { permissive: 0, copyleft: 0, weakCopyleft: 0, unknown: 0, total: sbom.length };\n for (const item of sbom) {\n const type = item.license.type;\n if (type === 'permissive') counts.permissive++;\n else if (type === 'copyleft') counts.copyleft++;\n else if (type === 'weak-copyleft') counts.weakCopyleft++;\n else counts.unknown++;\n }\n\n const hasCopyleft = counts.copyleft > 0;\n const complianceStatus = hasCopyleft && projectLicense?.type === 'permissive'\n ? 'warning'\n : 'clean';\n\n return {\n projectLicense: projectLicense || { id: 'UNLICENSED', name: 'None detected', type: 'unknown' },\n sbom,\n counts,\n complianceStatus,\n };\n}\n\n// Inferred licenses for standard popular open-source dependencies\nconst POPULAR_LICENSES = {\n react: 'MIT',\n 'react-dom': 'MIT',\n vue: 'MIT',\n express: 'MIT',\n lodash: 'MIT',\n axios: 'MIT',\n typescript: 'Apache-2.0',\n next: 'MIT',\n tailwindcss: 'MIT',\n eslint: 'MIT',\n prettier: 'MIT',\n mocha: 'MIT',\n jest: 'MIT',\n vite: 'MIT',\n fastapi: 'MIT',\n django: 'BSD-3-Clause',\n flask: 'BSD-3-Clause',\n requests: 'Apache-2.0',\n pytest: 'MIT',\n numpy: 'BSD-3-Clause',\n pandas: 'BSD-3-Clause',\n tokio: 'MIT',\n serde: 'MIT / Apache-2.0',\n gin: 'MIT',\n fiber: 'MIT',\n};\n\nfunction inferKnownDepLicense(name, ecosystem) {\n const normName = name.toLowerCase().replace(/^@[^/]+\\//, '');\n const id = POPULAR_LICENSES[name] || POPULAR_LICENSES[normName] || 'Permissive (Inferred)';\n return {\n id,\n type: classifyLicenseType(id),\n };\n}\n"]}