codebase-onboarder 0.5.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 +196 -47
  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 +449 -0
  8. package/cli/explorer/advanced.js.map +1 -0
  9. package/cli/explorer/app.d.ts +1 -0
  10. package/cli/explorer/app.js +396 -229
  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 +400 -162
  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 +73 -0
  23. package/cli/explorer/github.js.map +1 -0
  24. package/cli/explorer/graphs.d.ts +7 -0
  25. package/cli/explorer/graphs.js +173 -0
  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 +184 -95
  35. package/cli/explorer/session.js.map +1 -0
  36. package/cli/explorer/views.d.ts +19 -0
  37. package/cli/explorer/views.js +496 -412
  38. package/cli/explorer/views.js.map +1 -0
  39. package/cli/explorer/wrap.d.ts +1 -0
  40. package/cli/explorer/wrap.js +33 -0
  41. package/cli/explorer/wrap.js.map +1 -0
  42. package/cli/main.d.ts +1 -0
  43. package/cli/main.js +235 -138
  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 +55 -35
  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 +165 -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 +60 -0
  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 -37
  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 +79 -0
  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":"commands.js","sourceRoot":"","sources":["../../src/cli/explorer/commands.ts"],"names":[],"mappings":"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","sourcesContent":["// The command table.\n//\n// One list, used three ways: to dispatch what someone typed, to build the `help`\n// screen, and to assert in the tests that every command is reachable, has a\n// summary, and is wired to a real view. A command that exists in one of those\n// places but not the others is the kind of thing nobody notices until a user\n// types it, so the table is the only place a command is defined at all.\n//\n// `run(ctx, args)` returns a string to print, or a marker the app layer acts on\n// (`EXIT`, `CLEAR`). `args` is an array of already-parsed words, so quoting is\n// handled once, in the tokenizer, and every command sees the same shape.\n\nimport * as V from './views.js';\nimport * as A from './advanced.js';\nimport { lineNumber, resolveTarget, fileFacts } from './session.js';\nimport { bold, cyan, dim, ok, fit, termWidth } from '../ui.js';\nimport { wrapText } from './wrap.js';\nimport { formatSbom, formatWorkflows, formatAtlas, formatInspector } from './featureViews.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst run = promisify(execFile);\n\nexport const EXIT = Symbol('exit');\nexport const CLEAR = Symbol('clear');\n\nexport const COMMANDS = [\n {\n name: 'help', aliases: ['?'], group: 'basics',\n usage: 'help [command]', summary: 'This list, or everything about one command.',\n // The topic is forwarded. `help find` used to ignore its argument and print\n // the whole list, which reads as the command not working.\n run: (ctx, args) => ctx.help(args.join(' ')),\n },\n {\n name: 'map', aliases: ['overview', 'home'], group: 'basics',\n usage: 'map', summary: 'What this repo is, and where to start.',\n run: (ctx) => V.overview(ctx.repo),\n },\n {\n name: 'tour', aliases: ['start', 'onboarding'], group: 'basics',\n usage: 'tour', summary: 'The reading order a new teammate should follow.',\n run: (ctx) => V.tour(ctx.repo),\n },\n {\n name: 'explain', aliases: ['why', 'what'], group: 'basics',\n usage: 'explain [file|folder]', summary: 'This repo, or one file/folder, in prose. No AI key needed.',\n run: (ctx, args) => V.explain(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'tree', aliases: ['ls', 'files'], group: 'navigate',\n usage: 'tree [folder] [depth]', summary: 'The file tree, with entries and hubs marked.',\n run: (ctx, args) => {\n // A lone number is the depth, not a folder called \"2\". `tree 3` is what\n // everyone types when they want to see more; making them spell\n // `tree . 3` would be pedantry in a tool built to be forgiving. `.` is the\n // root, so it must not be taken as a folder name either.\n const onlyDepth = args.length === 1 && /^\\d+$/.test(args[0]);\n const sub = onlyDepth ? '' : (args[0] || '');\n return V.tree(ctx.repo, {\n sub: sub === '.' ? '' : sub,\n depth: onlyDepth ? Number(args[0]) : (Number(args[1]) || 2),\n });\n },\n },\n {\n name: 'find', aliases: ['search', 'grep'], group: 'navigate',\n usage: 'find <query>', summary: 'Search. Supports ext:js, -exclude, \"phrases\", /regex/.',\n run: (ctx, args) => V.find(ctx.repo, { query: args.join(' ') }),\n },\n {\n name: 'show', aliases: ['open', 'cat', 'read', 'code'], group: 'navigate',\n usage: 'show <file> [from] [count]', summary: 'Read a file. Name it loosely: `show logger.js` works.',\n run: (ctx, args) => V.show(ctx.repo, {\n target: args[0] || '',\n from: lineNumber(args[1], 0),\n count: lineNumber(args[2], 0),\n }),\n },\n {\n name: 'deps', aliases: ['connections'], group: 'navigate',\n usage: 'deps <file>', summary: 'What a file imports, and what imports it.',\n run: (ctx, args) => V.deps(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'inspect', aliases: ['detail'], group: 'navigate',\n usage: 'inspect <file>', summary: 'One file’s role, links, exports, and findings.',\n run: (ctx, args) => {\n const target = args.join(' ');\n if (!target) return ' Name a file: inspect path/to/file.js';\n const found = resolveTarget(ctx.repo, target);\n if (found.error) return V.explain(ctx.repo, { target });\n if (found.folder) return V.explain(ctx.repo, { target });\n const file = found.file;\n return formatInspector({\n path: file.path,\n role: fileFacts(ctx.repo, file).role,\n loc: file.loc || 0,\n complexity: file.complexity || 0,\n risk: ctx.repo.health.perFile.find((item) => item.path === file.path)?.risk || 0,\n imports: ctx.repo.facts.importsOf[file.path] || [],\n importers: ctx.repo.facts.importers[file.path] || [],\n exports: file.exports || [],\n findings: file.findings || [],\n });\n },\n },\n {\n name: 'health', aliases: ['grade'], group: 'analyze',\n usage: 'health', summary: 'Health grade, riskiest files, debt.',\n run: (ctx) => V.health(ctx.repo),\n },\n {\n name: 'hubs', aliases: ['core'], group: 'analyze',\n usage: 'hubs', summary: 'The most depended-on files.',\n run: (ctx) => V.hubs(ctx.repo),\n },\n {\n name: 'layers', aliases: ['depth'], group: 'analyze',\n usage: 'layers', summary: 'Import depth, shallowest first.',\n run: (ctx) => V.layers(ctx.repo),\n },\n {\n name: 'patterns', aliases: ['architecture'], group: 'analyze',\n usage: 'patterns', summary: 'What the architecture looks like, in prose.',\n run: (ctx) => V.patterns(ctx.repo),\n },\n {\n name: 'stats', aliases: ['numbers'], group: 'analyze',\n usage: 'stats', summary: 'Languages, biggest folders and files, complexity.',\n run: (ctx) => V.stats(ctx.repo),\n },\n {\n name: 'security', aliases: ['audit'], group: 'analyze',\n usage: 'security', summary: 'Heuristic findings from the built-in rules.',\n run: (ctx) => V.security(ctx.repo),\n },\n {\n name: 'stack', aliases: ['packages', 'services'], group: 'analyze',\n usage: 'stack', summary: 'Declared dependencies and frameworks.',\n run: (ctx) => V.stack(ctx.repo),\n },\n {\n name: 'entry', aliases: ['entries'], group: 'analyze',\n usage: 'entry', summary: 'Recognized entry points and how far they reach.',\n run: (ctx) => V.entry(ctx.repo),\n },\n {\n name: 'externals', aliases: ['drift'], group: 'analyze',\n usage: 'externals', summary: 'External packages, plus dependency drift.',\n run: (ctx) => V.externals(ctx.repo),\n },\n {\n name: 'graph', aliases: ['tree-graph'], group: 'navigate',\n usage: 'graph <file> [depth]', summary: 'The dependency tree around a file, as arrows.',\n run: (ctx, args) => A.graph(ctx.repo, { target: args[0] || '', depth: Number(args[1]) || 2 }),\n },\n {\n name: 'blast', aliases: ['impact', 'radius'], group: 'navigate',\n usage: 'blast <file>', summary: 'What breaks if this file breaks, transitively.',\n run: (ctx, args) => A.blast(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'symbols', aliases: ['outline', 'functions'], group: 'navigate',\n usage: 'symbols <file>', summary: 'Functions, classes and exports in a file.',\n run: (ctx, args) => A.symbols(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'docs', aliases: ['document'], group: 'analyze',\n usage: 'docs [file|folder] | docs --write', summary: 'Prose docs for a file, or write ONBOARDER.md.',\n run: async (ctx, args) => {\n // `--write` is the one command here that touches the filesystem. It is\n // opt-in, explicit, and prints where it wrote — a map tool should never\n // leave a file behind just because someone asked what the docs say.\n if (args[0] === '--write') {\n const abs = await A.writeDocs(ctx.repo, args[1] || 'ONBOARDER.md');\n return ' ' + ok('Wrote ') + cyan(abs);\n }\n return A.docs(ctx.repo, { target: args.filter((a) => a !== '--write').join(' ') });\n },\n },\n {\n name: 'log', aliases: ['history', 'commits'], group: 'git',\n usage: 'log [count]', summary: 'Recent commits, and who wrote them.',\n run: (ctx, args) => A.log(ctx.repo, { limit: Number(args[0]) || 15 }),\n },\n {\n name: 'hotspots', aliases: ['churn'], group: 'git',\n usage: 'hotspots [count]', summary: 'Files that are both complex and frequently changed.',\n run: (ctx, args) => A.hotspots(ctx.repo, { limit: Number(args[0]) || 12 }),\n },\n {\n name: 'blame', aliases: ['authors'], group: 'git',\n usage: 'blame <file>', summary: 'Who wrote each line of a file.',\n run: (ctx, args) => A.blame(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'coupling', aliases: ['matrix', 'heatmap'], group: 'analyze',\n usage: 'coupling', summary: 'Folder-to-folder import traffic, as a heat grid.',\n run: (ctx) => A.coupling(ctx.repo),\n },\n {\n name: 'clusters', aliases: ['communities', 'modules'], group: 'analyze',\n usage: 'clusters', summary: 'Groups of files that import each other more than the rest.',\n run: (ctx) => A.clusters(ctx.repo),\n },\n {\n name: 'diagram', aliases: ['mermaid'], group: 'analyze',\n usage: 'diagram [file]', summary: 'Mermaid source for the repo, or one file.',\n run: (ctx, args) => A.diagram(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'layers-diagram', aliases: [], group: 'analyze',\n usage: 'layers-diagram', summary: 'Mermaid source for the layer stack.',\n run: (ctx) => A.layerDiagram(ctx.repo),\n },\n {\n name: 'risks', aliases: ['problems', 'smells', 'insights'], group: 'analyze',\n usage: 'risks', summary: 'Cycles, orphans, dead exports, drift — in one list.',\n run: (ctx) => A.risks(ctx.repo),\n },\n {\n name: 'workflows', aliases: ['ci', 'pipelines'], group: 'analyze',\n usage: 'workflows', summary: 'GitHub Actions triggers, jobs, and steps.',\n run: (ctx) => formatWorkflows(ctx.repo.scan.workflows || []),\n },\n {\n name: 'atlas', aliases: ['diagrams'], group: 'analyze',\n usage: 'atlas', summary: 'An index of useful repository and file diagrams.',\n run: (ctx) => formatAtlas(ctx.repo.facts.entries, ctx.repo.facts.hubs, ctx.repo.scan.folders),\n },\n {\n name: 'sbom', aliases: ['licenses', 'inventory'], group: 'analyze',\n usage: 'sbom [filter]', summary: 'Declared dependencies and inferred license inventory.',\n run: (ctx, args) => formatSbom(ctx.repo.scan.licenseReport, args.join(' ')),\n },\n {\n name: 'diff', aliases: ['changes'], group: 'git',\n usage: 'diff [base] [head] [file]', summary: 'Git changes, patch, and dependent-file impact.',\n run: (ctx, args) => ctx.diff(args[0] || 'HEAD', args[1] || '', args[2] || ''),\n },\n {\n name: 'engines', aliases: ['analyzers'], group: 'analyze',\n usage: 'engines', summary: 'Show available external analyzers and how to install them.',\n run: (ctx) => ctx.engines(),\n },\n {\n name: 'deep', aliases: ['deep-analysis'], group: 'analyze',\n usage: 'deep <engine|all>', summary: 'Run an optional analyzer and show its findings.',\n run: (ctx, args) => args[0] ? ctx.deep(args[0]) : ctx.engines(),\n },\n {\n name: 'ask', aliases: ['ai'], group: 'basics',\n usage: 'ask <question>', summary: 'Ask an optional OpenAI-compatible model about this repo.',\n run: (ctx, args) => ctx.ask(args.join(' ')),\n },\n {\n name: 'about', aliases: ['version'], group: 'session',\n usage: 'about', summary: 'Version, repo path, and what is indexed.',\n run: (ctx) => V.about(ctx.repo, ctx.version),\n },\n {\n name: 'rescan', aliases: ['reload'], group: 'session',\n usage: 'rescan', summary: 'Re-read the repo from disk.',\n run: (ctx) => ctx.rescan(),\n },\n {\n name: 'github', aliases: ['remote', 'repo'], group: 'session',\n usage: 'github', summary: \"What GitHub says about this repo — stars, issues, license.\",\n run: (ctx) => ctx.github(),\n },\n {\n name: 'cd', aliases: ['open-repo', 'use'], group: 'session',\n usage: 'cd [folder|url]', summary: 'Choose a folder, or load one by path or Git URL.',\n run: (ctx, args) => args.length ? ctx.loadRepo(args.join(' ')) : ctx.selectSource(),\n },\n {\n name: 'pick', aliases: ['browse'], group: 'session',\n usage: 'pick', summary: 'Browse device folders or paste a Git URL.',\n run: (ctx) => ctx.selectSource(),\n },\n {\n name: 'web', aliases: ['site', 'serve'], group: 'session',\n usage: 'web', summary: 'Start the web UI and print its URL.',\n run: (ctx) => ctx.web(),\n },\n {\n name: 'clear', aliases: ['cls'], group: 'session',\n usage: 'clear', summary: 'Clear the screen.',\n run: () => CLEAR,\n },\n {\n name: 'exit', aliases: ['quit', 'q'], group: 'session',\n usage: 'exit', summary: 'Leave. Ctrl-D does the same.',\n run: () => EXIT,\n },\n];\n\n// One lookup for every spelling a person might type, built once at import.\nconst BY_NAME = new Map();\nfor (const cmd of COMMANDS) {\n BY_NAME.set(cmd.name, cmd);\n for (const a of cmd.aliases) BY_NAME.set(a, cmd);\n}\n\nexport function lookup(word) {\n return BY_NAME.get(String(word || '').toLowerCase());\n}\n\n// Every canonical name, for \"did you mean\" matching. Aliases are deliberately\n// excluded: suggesting `open` when someone typed `sho` is less useful than\n// suggesting `show`, which is the word they were reaching for.\nexport function commandNames() {\n return COMMANDS.map((c) => c.name);\n}\n\n// `help <command>` answers about one command; bare `help` lists them, grouped so\n// the shape of the tool is visible rather than alphabetical. Every row is\n// fitted, because a long summary on a narrow terminal used to wrap into the\n// next row and make the list unreadable.\nexport function helpText(ctx, topic = '') {\n const w = termWidth();\n if (topic) {\n const cmd = lookup(topic);\n if (!cmd) return fit(` No command called \"${topic}\". Try \\`help\\`.`, Math.max(10, w - 2));\n const also = cmd.aliases.length ? ` (also: ${cmd.aliases.join(', ')})` : '';\n return [\n fit(' ' + cmd.usage + also, Math.max(10, w - 2)),\n wrapText(cmd.summary, ' '),\n ].join('\\n');\n }\n const groups = new Map();\n for (const cmd of COMMANDS) {\n if (!groups.has(cmd.group)) groups.set(cmd.group, []);\n groups.get(cmd.group).push(cmd);\n }\n // Two cells of indent, two of gap, and the summary gets whatever is left. The\n // usage column shrinks with the terminal rather than pushing the text off it.\n const longest = Math.max(...COMMANDS.map((c) => c.usage.length));\n const usageRoom = Math.max(8, Math.min(longest, Math.floor(w * 0.4)));\n const out = [];\n for (const [group, list] of groups) {\n out.push(fit(' ' + group.toUpperCase(), Math.max(10, w - 2)));\n for (const c of list) {\n const left = ' ' + fit(c.usage, usageRoom);\n const room = w - left.length - 2;\n out.push(room > 8 ? left + ' ' + fit(c.summary, room, { tail: false }) : left);\n }\n }\n out.push('');\n out.push(fit(' ' + (ctx?.repo ? ctx.repo.name : 'onboarder')\n + ' · Ctrl-D or `exit` to leave · Ctrl-C twice to quit', Math.max(10, w - 2)));\n return out.join('\\n');\n}\n\n// Split a typed line into words, honoring quotes so `find \"exact phrase\"` and\n// `show \"my file.js\"` arrive as one argument each. Done once, here, so no\n// command has to re-implement it.\nexport function tokenize(line) {\n const out = [];\n const re = /\"([^\"]*)\"|'([^']*)'|(\\S+)/g;\n let m;\n while ((m = re.exec(String(line || '')))) out.push(m[1] ?? m[2] ?? m[3]);\n return out;\n}\n\n// Tab completion, because a REPL where you retype `shared/analyzer/graph.js` one\n// letter at a time is not a REPL, it is a punishment.\n//\n// Two contexts, chosen by what is already typed. Before the first space, the line\n// is a command name, so it completes against the command table — including\n// aliases, because a person who types `ls` wants `tree` to finish. After a space,\n// it is an argument, so it completes against real file paths in the loaded repo,\n// which is the thing that is tedious to type and impossible to remember.\n//\n// `shellEscape` is the other half of a good REPL: `!git status` runs a shell\n// command and hands the output back, so nobody has to leave the session to run\n// one thing. It is deliberately the *only* way out to a shell, so the set of\n// things that can happen in a session stays legible.\nfunction completer(repo) {\n return function complete(line) {\n const trailingSpace = /\\s$/.test(line);\n const parts = line.split(/\\s+/);\n // Completing a command (no space yet, or trailing space after one word).\n if (parts.length <= 1 || (parts.length === 2 && trailingSpace)) {\n const hits = [...BY_NAME.keys()].filter((n) => n.startsWith(parts[0] || '')).sort();\n return [hits.length ? hits : parts, parts[0] || ''];\n }\n // Completing a path argument against the loaded repo. Matches at any depth,\n // not just from the root: `show rend` should find `src/render.js`, which is\n // the case the resolver's forgiving path lookup already handles — the\n // completer has to agree with it or Tab contradicts what the command does.\n const frag = parts[parts.length - 1] || '';\n const slash = frag.lastIndexOf('/');\n const dir = slash === -1 ? '' : frag.slice(0, slash + 1);\n const base = slash === -1 ? frag : frag.slice(slash + 1);\n const seen = new Set();\n const hits = [];\n for (const f of repo.scan.allFiles || repo.scan.files) {\n if (dir && !f.startsWith(dir)) continue;\n // With no directory typed, match the *last* segment so `rend` finds\n // `src/render.js`; with one typed, match the segment being completed.\n const name = dir ? f.slice(dir.length) : f.slice(f.lastIndexOf('/') + 1);\n if (!name.startsWith(base)) continue;\n if (seen.has(name)) continue;\n seen.add(name);\n hits.push(name);\n if (hits.length >= 200) break;\n }\n return [hits.length ? hits : [frag], frag];\n };\n}\n\n// Run a shell command and capture its output. A non-zero exit is not a crash —\n// `grep` that finds nothing is a normal answer — so the code is reported, not\n// thrown. There is no `shell: true`: the whole line is the argument vector, so\n// nothing in a filename can be interpreted as a second command.\nasync function shellEscape(line, cwd) {\n const parts = tokenize(line);\n if (!parts.length) return null;\n try {\n const { stdout, stderr } = await run(parts[0], parts.slice(1), { cwd, maxBuffer: 8 * 1024 * 1024 });\n const out = String(stdout || '').trimEnd();\n const err = String(stderr || '').trimEnd();\n return [out, err].filter(Boolean).join('\\n') || dim(' (no output)');\n } catch (e) {\n const code = e.code ?? e.status;\n const err = String(e.stderr || '').trimEnd() || String(e.message || '').trimEnd();\n return dim(' exit ' + (code ?? '?') + (err ? '\\n ' + err : ''));\n }\n}\n\nexport { completer, shellEscape };\n"]}
@@ -0,0 +1,124 @@
1
+ /** Terminal projections of data already used by the web views. */
2
+ interface WorkflowStep {
3
+ name: string;
4
+ uses?: string | null;
5
+ }
6
+ interface WorkflowJob {
7
+ name: string;
8
+ runsOn?: string;
9
+ needs?: string[];
10
+ steps?: WorkflowStep[];
11
+ }
12
+ interface Workflow {
13
+ name: string;
14
+ file: string;
15
+ triggers?: string[];
16
+ jobs?: WorkflowJob[];
17
+ }
18
+ interface License {
19
+ id: string;
20
+ name?: string;
21
+ type?: string;
22
+ }
23
+ interface Package {
24
+ name: string;
25
+ version: string;
26
+ ecosystem: string;
27
+ isDev: boolean;
28
+ license?: License;
29
+ }
30
+ interface LicenseReport {
31
+ projectLicense: License;
32
+ sbom: Package[];
33
+ counts: {
34
+ total: number;
35
+ permissive: number;
36
+ copyleft: number;
37
+ weakCopyleft: number;
38
+ unknown: number;
39
+ };
40
+ complianceStatus: string;
41
+ }
42
+ interface DiffLine {
43
+ type: 'add' | 'del' | 'context';
44
+ text: string;
45
+ }
46
+ interface DiffHunk {
47
+ header: string;
48
+ lines: DiffLine[];
49
+ }
50
+ interface DiffFile {
51
+ oldPath: string;
52
+ newPath: string;
53
+ status: string;
54
+ additions: number;
55
+ deletions: number;
56
+ hunks: DiffHunk[];
57
+ }
58
+ interface GitDiff {
59
+ files: DiffFile[];
60
+ stats: {
61
+ additions: number;
62
+ deletions: number;
63
+ };
64
+ }
65
+ interface ToolStatus {
66
+ label: string;
67
+ kind: string;
68
+ available: boolean;
69
+ how?: string | null;
70
+ reason?: string | null;
71
+ }
72
+ interface Finding {
73
+ path?: string;
74
+ file?: string;
75
+ line?: number;
76
+ severity?: string;
77
+ rule?: string;
78
+ message?: string;
79
+ tool?: string;
80
+ }
81
+ interface AnalysisPass {
82
+ id: string;
83
+ label: string;
84
+ ok: boolean;
85
+ available: boolean;
86
+ findings: Finding[];
87
+ reason?: string;
88
+ ms?: number;
89
+ }
90
+ interface AnalysisReport {
91
+ passes: AnalysisPass[];
92
+ findings: Finding[];
93
+ ms: number;
94
+ }
95
+ export declare function formatWorkflows(workflows: Workflow[]): string;
96
+ export declare function formatSbom(report: LicenseReport | null | undefined, filter?: string): string;
97
+ export declare function formatDiff(diff: GitDiff, importers: Record<string, string[]>, totalFiles: number, selectedPath?: string): string;
98
+ export declare function formatEngines(status: Record<string, ToolStatus>): string;
99
+ export declare function formatAtlas(entries: string[], hubs: Array<{
100
+ path: string;
101
+ }>, folders: Array<{
102
+ path: string;
103
+ }>): string;
104
+ interface FileInspector {
105
+ path: string;
106
+ role: string;
107
+ loc: number;
108
+ complexity: number;
109
+ risk: number;
110
+ imports: string[];
111
+ importers: string[];
112
+ exports: Array<{
113
+ name: string;
114
+ }>;
115
+ findings: Array<{
116
+ severity?: string;
117
+ rule?: string;
118
+ message?: string;
119
+ line?: number;
120
+ }>;
121
+ }
122
+ export declare function formatInspector(file: FileInspector): string;
123
+ export declare function formatDeepAnalysis(report: AnalysisReport): string;
124
+ export {};
@@ -0,0 +1,179 @@
1
+ /** Terminal projections of data already used by the web views. */
2
+ function columns() {
3
+ const env = Number(process.env.COLUMNS);
4
+ return Number.isInteger(env) && env > 0 ? env : process.stdout.columns || 80;
5
+ }
6
+ function fit(value, width = columns()) {
7
+ const text = String(value ?? '').replace(/[\r\n\t]/g, ' ');
8
+ if (width <= 0)
9
+ return '';
10
+ const points = [...text];
11
+ return points.length <= width ? text : points.slice(0, Math.max(0, width - 1)).join('') + (width > 1 ? '…' : '');
12
+ }
13
+ function screen(title, lines) {
14
+ const width = columns();
15
+ const rule = '─'.repeat(Math.max(0, Math.min(width - 2, 48)));
16
+ return ['', fit(` ${title.toUpperCase()}`), fit(` ${rule}`), ...lines.map((line) => fit(line)), ''].join('\n');
17
+ }
18
+ export function formatWorkflows(workflows) {
19
+ if (!workflows.length)
20
+ return screen('Workflows', [
21
+ ' No GitHub Actions workflows found in .github/workflows/.',
22
+ ]);
23
+ const lines = [` ${workflows.length} workflow${workflows.length === 1 ? '' : 's'}`];
24
+ for (const workflow of workflows) {
25
+ lines.push('', ` ${workflow.name} · ${workflow.file}`);
26
+ lines.push(` Triggers: ${(workflow.triggers || []).join(', ') || 'none detected'}`);
27
+ for (const job of workflow.jobs || []) {
28
+ lines.push(` ${job.name} ${job.runsOn || ''}`);
29
+ if (job.needs?.length)
30
+ lines.push(` After: ${job.needs.join(', ')}`);
31
+ for (const step of job.steps || [])
32
+ lines.push(` · ${step.name}${step.uses ? ` (${step.uses})` : ''}`);
33
+ }
34
+ if (!workflow.jobs?.length)
35
+ lines.push(' No jobs parsed.');
36
+ }
37
+ return screen('Workflows', lines);
38
+ }
39
+ export function formatSbom(report, filter = '') {
40
+ if (!report)
41
+ return screen('Software bill of materials', [' Dependency inventory is unavailable for this scan.']);
42
+ const packages = report.sbom || [];
43
+ const q = filter.toLowerCase().trim();
44
+ const selected = q ? packages.filter((item) => item.name.toLowerCase().includes(q) || item.ecosystem.toLowerCase().includes(q)
45
+ || item.license?.id.toLowerCase().includes(q)) : packages;
46
+ const lines = [
47
+ ` Project license ${report.projectLicense?.id || 'unknown'}`,
48
+ ` Dependencies ${report.counts.total} declared · ${report.counts.copyleft} copyleft · ${report.counts.unknown} unknown`,
49
+ ` License review ${report.complianceStatus}${report.counts.unknown ? ' (unknown licenses need checking)' : ''}`,
50
+ '',
51
+ ];
52
+ if (!selected.length)
53
+ lines.push(q ? ` No dependency matches "${filter}".` : ' No dependencies declared.');
54
+ else {
55
+ for (const item of selected.slice(0, 100)) {
56
+ lines.push(` ${item.name} ${item.version} ${item.ecosystem} ${item.isDev ? 'dev' : 'prod'} ${item.license?.id || 'unknown'}`);
57
+ }
58
+ if (selected.length > 100)
59
+ lines.push(` … ${selected.length - 100} more; use sbom <filter> to narrow the list.`);
60
+ }
61
+ lines.push('', ' Licenses for some packages are inferred; verify them before compliance decisions.');
62
+ return screen('Software bill of materials', lines);
63
+ }
64
+ export function formatDiff(diff, importers, totalFiles, selectedPath = '') {
65
+ const files = diff.files || [];
66
+ const changed = new Set(files.map((file) => file.newPath || file.oldPath));
67
+ const impacted = new Set();
68
+ const queue = [...changed];
69
+ for (let cursor = 0; cursor < queue.length; cursor++) {
70
+ for (const dependent of importers[queue[cursor]] || []) {
71
+ if (!changed.has(dependent) && !impacted.has(dependent)) {
72
+ impacted.add(dependent);
73
+ queue.push(dependent);
74
+ }
75
+ }
76
+ }
77
+ const lines = [
78
+ ` ${files.length} changed files · +${diff.stats.additions} / -${diff.stats.deletions}`,
79
+ ` ${impacted.size} dependent files may be affected (${Math.round(impacted.size / Math.max(1, totalFiles) * 100)}% of scanned files)`,
80
+ '',
81
+ ];
82
+ if (!files.length)
83
+ lines.push(' No tracked changes found for these refs.');
84
+ for (const file of files.slice(0, 100)) {
85
+ lines.push(` ${file.status.padEnd(8)} ${file.newPath || file.oldPath} +${file.additions}/-${file.deletions}`);
86
+ }
87
+ if (files.length > 100)
88
+ lines.push(` … ${files.length - 100} more files.`);
89
+ if (selectedPath) {
90
+ const file = files.find((item) => item.newPath === selectedPath || item.oldPath === selectedPath);
91
+ lines.push('');
92
+ if (!file)
93
+ lines.push(` ${selectedPath} is not in this diff.`);
94
+ else {
95
+ lines.push(` PATCH ${selectedPath}`);
96
+ let budget = 120;
97
+ for (const hunk of file.hunks) {
98
+ if (budget-- <= 0)
99
+ break;
100
+ lines.push(` ${hunk.header}`);
101
+ for (const line of hunk.lines) {
102
+ if (budget-- <= 0)
103
+ break;
104
+ const marker = line.type === 'add' ? '+' : line.type === 'del' ? '-' : ' ';
105
+ lines.push(` ${marker}${line.text}`);
106
+ }
107
+ }
108
+ if (budget <= 0)
109
+ lines.push(' … patch output limited to 120 lines.');
110
+ }
111
+ }
112
+ else if (files.length)
113
+ lines.push('', ' Use diff <base> <head> <file> to read a patch.');
114
+ return screen('Diff and blast radius', lines);
115
+ }
116
+ export function formatEngines(status) {
117
+ const lines = [];
118
+ for (const [id, tool] of Object.entries(status)) {
119
+ const state = !tool.available ? 'missing' : tool.how === 'path' ? 'installed' : 'runnable';
120
+ lines.push(` ${state} ${tool.label} (${id}) · ${tool.kind}`);
121
+ lines.push(` ${tool.available ? tool.how || 'available' : tool.reason || 'Not installed'}`);
122
+ }
123
+ lines.push('', ' Run: deep <engine> or deep all');
124
+ lines.push(' npx/uvx runners may fetch a tool when you run it.');
125
+ return screen('Deep analysis engines', lines);
126
+ }
127
+ export function formatAtlas(entries, hubs, folders) {
128
+ const paths = [...new Set([...entries, ...hubs.map((hub) => hub.path)])].slice(0, 12);
129
+ const lines = [
130
+ ' Whole repository diagram',
131
+ ' Architecture layers layers-diagram',
132
+ ' Folder traffic coupling',
133
+ ' Dependency impact graph <file> / blast <file>',
134
+ '',
135
+ ' SUGGESTED FILE DIAGRAMS',
136
+ ...paths.map((path) => ` ${path} → diagram ${path}`),
137
+ '',
138
+ ` ${folders.length} folders available; use tree <folder> or find <query> to navigate.`,
139
+ ];
140
+ return screen('Diagram atlas', lines);
141
+ }
142
+ export function formatInspector(file) {
143
+ const lines = [
144
+ ` Role ${file.role} · ${file.loc} lines · complexity ${file.complexity} · risk ${file.risk}/100`,
145
+ '',
146
+ ` IMPORTS (${file.imports.length})`,
147
+ ...file.imports.slice(0, 12).map((path) => ` → ${path}`),
148
+ ` IMPORTED BY (${file.importers.length})`,
149
+ ...file.importers.slice(0, 12).map((path) => ` ← ${path}`),
150
+ ` EXPORTS (${file.exports.length})`,
151
+ ...file.exports.slice(0, 12).map((symbol) => ` ${symbol.name}`),
152
+ ` HEURISTIC FINDINGS (${file.findings.length})`,
153
+ ...file.findings.slice(0, 8).map((finding) => ` ${finding.severity || 'info'}${finding.line ? ':' + finding.line : ''} ${finding.rule || finding.message || ''}`),
154
+ '',
155
+ ` Next: show ${file.path} · graph ${file.path} · blame ${file.path}`,
156
+ ];
157
+ return screen(`File inspector ${file.path}`, lines);
158
+ }
159
+ export function formatDeepAnalysis(report) {
160
+ const lines = [` ${report.passes.filter((pass) => pass.ok).length}/${report.passes.length} engines ran · ${report.findings.length} findings · ${report.ms} ms`];
161
+ for (const pass of report.passes) {
162
+ const state = pass.ok ? `${pass.findings.length} findings` : pass.available ? `failed: ${pass.reason || 'unknown error'}` : `unavailable: ${pass.reason || 'not installed'}`;
163
+ lines.push(` ${pass.label} ${state}`);
164
+ }
165
+ if (report.findings.length) {
166
+ lines.push('', ' FINDINGS');
167
+ for (const finding of report.findings.slice(0, 40)) {
168
+ const place = finding.path || finding.file || '(repository)';
169
+ lines.push(` ${finding.severity || 'info'} ${place}${finding.line ? `:${finding.line}` : ''} ${finding.rule || finding.message || ''}`);
170
+ }
171
+ if (report.findings.length > 40)
172
+ lines.push(` … ${report.findings.length - 40} more findings.`);
173
+ lines.push('', ' Findings are candidates; review test and vendored files before acting.');
174
+ }
175
+ if (!report.passes.some((pass) => pass.ok))
176
+ lines.push('', ' No external engine ran; built-in security remains available with `security`.');
177
+ return screen('Deep analysis', lines);
178
+ }
179
+ //# sourceMappingURL=featureViews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureViews.js","sourceRoot":"","sources":["../../src/cli/explorer/featureViews.ts"],"names":[],"mappings":"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","sourcesContent":["/** Terminal projections of data already used by the web views. */\n\ninterface WorkflowStep { name: string; uses?: string | null }\ninterface WorkflowJob { name: string; runsOn?: string; needs?: string[]; steps?: WorkflowStep[] }\ninterface Workflow { name: string; file: string; triggers?: string[]; jobs?: WorkflowJob[] }\n\ninterface License { id: string; name?: string; type?: string }\ninterface Package { name: string; version: string; ecosystem: string; isDev: boolean; license?: License }\ninterface LicenseReport {\n projectLicense: License;\n sbom: Package[];\n counts: { total: number; permissive: number; copyleft: number; weakCopyleft: number; unknown: number };\n complianceStatus: string;\n}\n\ninterface DiffLine { type: 'add' | 'del' | 'context'; text: string }\ninterface DiffHunk { header: string; lines: DiffLine[] }\ninterface DiffFile {\n oldPath: string; newPath: string; status: string;\n additions: number; deletions: number; hunks: DiffHunk[];\n}\ninterface GitDiff {\n files: DiffFile[];\n stats: { additions: number; deletions: number };\n}\n\ninterface ToolStatus {\n label: string; kind: string; available: boolean;\n how?: string | null; reason?: string | null;\n}\ninterface Finding {\n path?: string; file?: string; line?: number;\n severity?: string; rule?: string; message?: string; tool?: string;\n}\ninterface AnalysisPass {\n id: string; label: string; ok: boolean; available: boolean;\n findings: Finding[]; reason?: string; ms?: number;\n}\ninterface AnalysisReport { passes: AnalysisPass[]; findings: Finding[]; ms: number }\n\nfunction columns(): number {\n const env = Number(process.env.COLUMNS);\n return Number.isInteger(env) && env > 0 ? env : process.stdout.columns || 80;\n}\n\nfunction fit(value: unknown, width = columns()): string {\n const text = String(value ?? '').replace(/[\\r\\n\\t]/g, ' ');\n if (width <= 0) return '';\n const points = [...text];\n return points.length <= width ? text : points.slice(0, Math.max(0, width - 1)).join('') + (width > 1 ? '…' : '');\n}\n\nfunction screen(title: string, lines: string[]): string {\n const width = columns();\n const rule = '─'.repeat(Math.max(0, Math.min(width - 2, 48)));\n return ['', fit(` ${title.toUpperCase()}`), fit(` ${rule}`), ...lines.map((line) => fit(line)), ''].join('\\n');\n}\n\nexport function formatWorkflows(workflows: Workflow[]): string {\n if (!workflows.length) return screen('Workflows', [\n ' No GitHub Actions workflows found in .github/workflows/.',\n ]);\n const lines: string[] = [` ${workflows.length} workflow${workflows.length === 1 ? '' : 's'}`];\n for (const workflow of workflows) {\n lines.push('', ` ${workflow.name} · ${workflow.file}`);\n lines.push(` Triggers: ${(workflow.triggers || []).join(', ') || 'none detected'}`);\n for (const job of workflow.jobs || []) {\n lines.push(` ${job.name} ${job.runsOn || ''}`);\n if (job.needs?.length) lines.push(` After: ${job.needs.join(', ')}`);\n for (const step of job.steps || []) lines.push(` · ${step.name}${step.uses ? ` (${step.uses})` : ''}`);\n }\n if (!workflow.jobs?.length) lines.push(' No jobs parsed.');\n }\n return screen('Workflows', lines);\n}\n\nexport function formatSbom(report: LicenseReport | null | undefined, filter = ''): string {\n if (!report) return screen('Software bill of materials', [' Dependency inventory is unavailable for this scan.']);\n const packages = report.sbom || [];\n const q = filter.toLowerCase().trim();\n const selected = q ? packages.filter((item) =>\n item.name.toLowerCase().includes(q) || item.ecosystem.toLowerCase().includes(q)\n || item.license?.id.toLowerCase().includes(q)) : packages;\n const lines = [\n ` Project license ${report.projectLicense?.id || 'unknown'}`,\n ` Dependencies ${report.counts.total} declared · ${report.counts.copyleft} copyleft · ${report.counts.unknown} unknown`,\n ` License review ${report.complianceStatus}${report.counts.unknown ? ' (unknown licenses need checking)' : ''}`,\n '',\n ];\n if (!selected.length) lines.push(q ? ` No dependency matches \"${filter}\".` : ' No dependencies declared.');\n else {\n for (const item of selected.slice(0, 100)) {\n lines.push(` ${item.name} ${item.version} ${item.ecosystem} ${item.isDev ? 'dev' : 'prod'} ${item.license?.id || 'unknown'}`);\n }\n if (selected.length > 100) lines.push(` … ${selected.length - 100} more; use sbom <filter> to narrow the list.`);\n }\n lines.push('', ' Licenses for some packages are inferred; verify them before compliance decisions.');\n return screen('Software bill of materials', lines);\n}\n\nexport function formatDiff(diff: GitDiff, importers: Record<string, string[]>, totalFiles: number, selectedPath = ''): string {\n const files = diff.files || [];\n const changed = new Set(files.map((file) => file.newPath || file.oldPath));\n const impacted = new Set<string>();\n const queue = [...changed];\n for (let cursor = 0; cursor < queue.length; cursor++) {\n for (const dependent of importers[queue[cursor]] || []) {\n if (!changed.has(dependent) && !impacted.has(dependent)) {\n impacted.add(dependent);\n queue.push(dependent);\n }\n }\n }\n const lines = [\n ` ${files.length} changed files · +${diff.stats.additions} / -${diff.stats.deletions}`,\n ` ${impacted.size} dependent files may be affected (${Math.round(impacted.size / Math.max(1, totalFiles) * 100)}% of scanned files)`,\n '',\n ];\n if (!files.length) lines.push(' No tracked changes found for these refs.');\n for (const file of files.slice(0, 100)) {\n lines.push(` ${file.status.padEnd(8)} ${file.newPath || file.oldPath} +${file.additions}/-${file.deletions}`);\n }\n if (files.length > 100) lines.push(` … ${files.length - 100} more files.`);\n if (selectedPath) {\n const file = files.find((item) => item.newPath === selectedPath || item.oldPath === selectedPath);\n lines.push('');\n if (!file) lines.push(` ${selectedPath} is not in this diff.`);\n else {\n lines.push(` PATCH ${selectedPath}`);\n let budget = 120;\n for (const hunk of file.hunks) {\n if (budget-- <= 0) break;\n lines.push(` ${hunk.header}`);\n for (const line of hunk.lines) {\n if (budget-- <= 0) break;\n const marker = line.type === 'add' ? '+' : line.type === 'del' ? '-' : ' ';\n lines.push(` ${marker}${line.text}`);\n }\n }\n if (budget <= 0) lines.push(' … patch output limited to 120 lines.');\n }\n } else if (files.length) lines.push('', ' Use diff <base> <head> <file> to read a patch.');\n return screen('Diff and blast radius', lines);\n}\n\nexport function formatEngines(status: Record<string, ToolStatus>): string {\n const lines: string[] = [];\n for (const [id, tool] of Object.entries(status)) {\n const state = !tool.available ? 'missing' : tool.how === 'path' ? 'installed' : 'runnable';\n lines.push(` ${state} ${tool.label} (${id}) · ${tool.kind}`);\n lines.push(` ${tool.available ? tool.how || 'available' : tool.reason || 'Not installed'}`);\n }\n lines.push('', ' Run: deep <engine> or deep all');\n lines.push(' npx/uvx runners may fetch a tool when you run it.');\n return screen('Deep analysis engines', lines);\n}\n\nexport function formatAtlas(entries: string[], hubs: Array<{ path: string }>, folders: Array<{ path: string }>): string {\n const paths = [...new Set([...entries, ...hubs.map((hub) => hub.path)])].slice(0, 12);\n const lines = [\n ' Whole repository diagram',\n ' Architecture layers layers-diagram',\n ' Folder traffic coupling',\n ' Dependency impact graph <file> / blast <file>',\n '',\n ' SUGGESTED FILE DIAGRAMS',\n ...paths.map((path) => ` ${path} → diagram ${path}`),\n '',\n ` ${folders.length} folders available; use tree <folder> or find <query> to navigate.`,\n ];\n return screen('Diagram atlas', lines);\n}\n\ninterface FileInspector {\n path: string; role: string; loc: number; complexity: number; risk: number;\n imports: string[]; importers: string[];\n exports: Array<{ name: string }>;\n findings: Array<{ severity?: string; rule?: string; message?: string; line?: number }>;\n}\n\nexport function formatInspector(file: FileInspector): string {\n const lines = [\n ` Role ${file.role} · ${file.loc} lines · complexity ${file.complexity} · risk ${file.risk}/100`,\n '',\n ` IMPORTS (${file.imports.length})`,\n ...file.imports.slice(0, 12).map((path) => ` → ${path}`),\n ` IMPORTED BY (${file.importers.length})`,\n ...file.importers.slice(0, 12).map((path) => ` ← ${path}`),\n ` EXPORTS (${file.exports.length})`,\n ...file.exports.slice(0, 12).map((symbol) => ` ${symbol.name}`),\n ` HEURISTIC FINDINGS (${file.findings.length})`,\n ...file.findings.slice(0, 8).map((finding) => ` ${finding.severity || 'info'}${finding.line ? ':' + finding.line : ''} ${finding.rule || finding.message || ''}`),\n '',\n ` Next: show ${file.path} · graph ${file.path} · blame ${file.path}`,\n ];\n return screen(`File inspector ${file.path}`, lines);\n}\n\nexport function formatDeepAnalysis(report: AnalysisReport): string {\n const lines = [` ${report.passes.filter((pass) => pass.ok).length}/${report.passes.length} engines ran · ${report.findings.length} findings · ${report.ms} ms`];\n for (const pass of report.passes) {\n const state = pass.ok ? `${pass.findings.length} findings` : pass.available ? `failed: ${pass.reason || 'unknown error'}` : `unavailable: ${pass.reason || 'not installed'}`;\n lines.push(` ${pass.label} ${state}`);\n }\n if (report.findings.length) {\n lines.push('', ' FINDINGS');\n for (const finding of report.findings.slice(0, 40)) {\n const place = finding.path || finding.file || '(repository)';\n lines.push(` ${finding.severity || 'info'} ${place}${finding.line ? `:${finding.line}` : ''} ${finding.rule || finding.message || ''}`);\n }\n if (report.findings.length > 40) lines.push(` … ${report.findings.length - 40} more findings.`);\n lines.push('', ' Findings are candidates; review test and vendored files before acting.');\n }\n if (!report.passes.some((pass) => pass.ok)) lines.push('', ' No external engine ran; built-in security remains available with `security`.');\n return screen('Deep analysis', lines);\n}\n"]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Look up a GitHub repository's public facts.
3
+ *
4
+ * `fetchImpl` is a parameter so this is testable without a network, and so the
5
+ * caller can pass an already-aborted-aware fetch if it has one.
6
+ *
7
+ * Returns `{ ok: true, facts, repoPath }` or `{ ok: false, reason }`. Never
8
+ * throws — the reason is the return value, because every failure here is
9
+ * something to print, not something to crash a session over.
10
+ */
11
+ export declare function fetchRepoFacts(url: any, { fetchImpl }?: Record<string, any>): Promise<{
12
+ ok: boolean;
13
+ reason: string;
14
+ facts?: undefined;
15
+ repoPath?: undefined;
16
+ } | {
17
+ reason?: undefined;
18
+ ok: boolean;
19
+ facts: any;
20
+ repoPath: string;
21
+ }>;
@@ -0,0 +1,73 @@
1
+ // Asking GitHub what it knows about a repository — the terminal half of the
2
+ // feature the web app calls "From the remote".
3
+ //
4
+ // The `fetch` lives here rather than in `shared/analyzer/github.js` because it
5
+ // can only happen in one runtime at a time, and because this side can do
6
+ // something the browser cannot: send a token. `GITHUB_TOKEN` (or `GH_TOKEN`, the
7
+ // name the `gh` CLI uses) turns GitHub's 60-requests-an-hour guest allowance
8
+ // into 5,000. The browser has nowhere to keep a secret, which is precisely why
9
+ // this is better in a terminal than on the web.
10
+ //
11
+ // A failed lookup is never fatal. `github` on a repo with no remote, a private
12
+ // one, or a machine with no network is a normal thing to type, so every path
13
+ // returns the honest reason instead of throwing.
14
+ import { githubRepoPath, remoteError, remoteFacts } from '../../shared/analyzer/github.js';
15
+ const API = 'https://api.github.com/repos/';
16
+ const TIMEOUT_MS = 8000;
17
+ // The token is read per call rather than at import: a session that exports one
18
+ // mid-flight should not need to be restarted to pick it up.
19
+ function token() {
20
+ const t = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
21
+ return typeof t === 'string' && t.trim() ? t.trim() : '';
22
+ }
23
+ /**
24
+ * Look up a GitHub repository's public facts.
25
+ *
26
+ * `fetchImpl` is a parameter so this is testable without a network, and so the
27
+ * caller can pass an already-aborted-aware fetch if it has one.
28
+ *
29
+ * Returns `{ ok: true, facts, repoPath }` or `{ ok: false, reason }`. Never
30
+ * throws — the reason is the return value, because every failure here is
31
+ * something to print, not something to crash a session over.
32
+ */
33
+ export async function fetchRepoFacts(url, { fetchImpl = globalThis.fetch } = {}) {
34
+ const repoPath = githubRepoPath(url);
35
+ if (!repoPath) {
36
+ return { ok: false, reason: 'That is not a GitHub URL, so there are no remote facts to ask for.' };
37
+ }
38
+ if (typeof fetchImpl !== 'function') {
39
+ return { ok: false, reason: 'This runtime has no fetch, so GitHub cannot be asked.' };
40
+ }
41
+ const headers = { accept: 'application/vnd.github+json', 'user-agent': 'onboarder' };
42
+ const auth = token();
43
+ if (auth)
44
+ headers.authorization = 'Bearer ' + auth;
45
+ let res;
46
+ try {
47
+ res = await fetchImpl(API + repoPath, {
48
+ headers,
49
+ signal: AbortSignal.timeout(TIMEOUT_MS),
50
+ });
51
+ }
52
+ catch (err) {
53
+ // A timeout and a refused connection are the same thing to the person who
54
+ // typed the command: it did not come back. The message is kept because
55
+ // "GitHub could not be reached" and "the certificate is not trusted" are
56
+ // very different problems on very different machines.
57
+ const detail = /timeout|abort/i.test(err?.message || '') ? ' (it took too long)' : '';
58
+ return { ok: false, reason: 'Could not reach GitHub' + detail + ' — ' + (err?.message || err) };
59
+ }
60
+ if (!res.ok)
61
+ return { ok: false, reason: remoteError(res.status) };
62
+ let facts;
63
+ try {
64
+ facts = remoteFacts(await res.json());
65
+ }
66
+ catch {
67
+ return { ok: false, reason: 'GitHub sent something that is not JSON.' };
68
+ }
69
+ if (!facts)
70
+ return { ok: false, reason: 'GitHub sent no repository facts.' };
71
+ return { ok: true, facts, repoPath };
72
+ }
73
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/cli/explorer/github.ts"],"names":[],"mappings":"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","sourcesContent":["// Asking GitHub what it knows about a repository — the terminal half of the\n// feature the web app calls \"From the remote\".\n//\n// The `fetch` lives here rather than in `shared/analyzer/github.js` because it\n// can only happen in one runtime at a time, and because this side can do\n// something the browser cannot: send a token. `GITHUB_TOKEN` (or `GH_TOKEN`, the\n// name the `gh` CLI uses) turns GitHub's 60-requests-an-hour guest allowance\n// into 5,000. The browser has nowhere to keep a secret, which is precisely why\n// this is better in a terminal than on the web.\n//\n// A failed lookup is never fatal. `github` on a repo with no remote, a private\n// one, or a machine with no network is a normal thing to type, so every path\n// returns the honest reason instead of throwing.\n\nimport { githubRepoPath, remoteError, remoteFacts } from '../../shared/analyzer/github.js';\n\nconst API = 'https://api.github.com/repos/';\nconst TIMEOUT_MS = 8000;\n\n// The token is read per call rather than at import: a session that exports one\n// mid-flight should not need to be restarted to pick it up.\nfunction token() {\n const t = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n return typeof t === 'string' && t.trim() ? t.trim() : '';\n}\n\n/**\n * Look up a GitHub repository's public facts.\n *\n * `fetchImpl` is a parameter so this is testable without a network, and so the\n * caller can pass an already-aborted-aware fetch if it has one.\n *\n * Returns `{ ok: true, facts, repoPath }` or `{ ok: false, reason }`. Never\n * throws — the reason is the return value, because every failure here is\n * something to print, not something to crash a session over.\n */\nexport async function fetchRepoFacts(url, { fetchImpl = globalThis.fetch }: Record<string, any> = {}) {\n const repoPath = githubRepoPath(url);\n if (!repoPath) {\n return { ok: false, reason: 'That is not a GitHub URL, so there are no remote facts to ask for.' };\n }\n if (typeof fetchImpl !== 'function') {\n return { ok: false, reason: 'This runtime has no fetch, so GitHub cannot be asked.' };\n }\n\n const headers: Record<string, string> = { accept: 'application/vnd.github+json', 'user-agent': 'onboarder' };\n const auth = token();\n if (auth) headers.authorization = 'Bearer ' + auth;\n\n let res;\n try {\n res = await fetchImpl(API + repoPath, {\n headers,\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n } catch (err) {\n // A timeout and a refused connection are the same thing to the person who\n // typed the command: it did not come back. The message is kept because\n // \"GitHub could not be reached\" and \"the certificate is not trusted\" are\n // very different problems on very different machines.\n const detail = /timeout|abort/i.test(err?.message || '') ? ' (it took too long)' : '';\n return { ok: false, reason: 'Could not reach GitHub' + detail + ' — ' + (err?.message || err) };\n }\n\n if (!res.ok) return { ok: false, reason: remoteError(res.status) };\n\n let facts;\n try {\n facts = remoteFacts(await res.json());\n } catch {\n return { ok: false, reason: 'GitHub sent something that is not JSON.' };\n }\n if (!facts) return { ok: false, reason: 'GitHub sent no repository facts.' };\n return { ok: true, facts, repoPath };\n}"]}
@@ -0,0 +1,7 @@
1
+ export declare function labelled(marker: any, value: any, tail?: string, { pad }?: Record<string, any>): string;
2
+ declare function step(value: any, max: any): string;
3
+ export { step };
4
+ export declare function bar(value: any, max: any, room: any): string;
5
+ export declare function columns(items: any, { room, rows }?: Record<string, any>): any[];
6
+ export declare function couplingGrid(repo: any, { maxFolders, columns: cols }?: Record<string, any>): string[];
7
+ export declare function depTree(repo: any, rootPath: any, { depth, direction, room }?: Record<string, any>): any[];