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
package/cli/main.js CHANGED
@@ -1,26 +1,37 @@
1
+ import { scanOptionsFromFlags } from './scanOptions.js';
1
2
  // argv → command. `bin/onboarder.js` is a one-line trampoline into `main`; all
2
3
  // parsing and dispatch lives here so the tests can call it directly.
3
4
  //
4
5
  // Flags use node's util.parseArgs — still zero dependencies, still strict about
5
6
  // unknown flags, which is what a tool that writes a config file should be.
6
-
7
7
  import fs from 'node:fs';
8
8
  import { parseArgs } from 'node:util';
9
-
10
- import {
11
- runSetup, runStart, runStartBackground, runStartup, runLogs, runStatus, runStop, runRestart,
12
- runConfig, runConfigKey, runConfigReset, runDoctor, runTunnel, runHttps,
13
- } from './commands.js';
9
+ import { runSetup, runStart, runStartBackground, runStartup, runLogs, runStatus, runStop, runRestart, runConfig, runConfigKey, runConfigReset, runDoctor, runTunnel, runHttps, } from './commands.js';
14
10
  import { runExplore } from './explorer/app.js';
15
-
11
+ import { openRepoOrClone, closeRemote } from './explorer/session.js';
12
+ import { createReport, formatReport } from './explorer/report.js';
13
+ import { setColorEnabled } from './ui.js';
14
+ import { runReview } from '../server/review.js';
15
+ import { reviewMarkdown, reviewProfile, SEVERITY_RANK } from '../shared/review/review.js';
16
+ import { expandHome } from '../server/paths.js';
16
17
  const PACKAGE = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
17
-
18
18
  const HELP = `
19
19
  🧭 Onboarder — drop a path, get a map.
20
20
 
21
+ Scan options for report and explore
22
+ --max-files <count> Maximum files to walk (default: 4000)
23
+ --max-file-size <bytes> Maximum UTF-8 file size (default: 204800)
24
+ --read-concurrency <n> Concurrent reads, 1–32 (default: 8)
25
+
21
26
  Usage
22
27
  onboarder Explore a codebase here, interactively
23
- onboarder explore [folder] The same, pointed somewhere else (alias: tui)
28
+ onboarder explore [folder|url] Choose a source, or open one directly (alias: tui)
29
+ onboarder report [folder|url] One-shot summary for terminals and scripts (--json)
30
+ onboarder review [folder] Review local changes (--json for scripts)
31
+ --base <ref> --head <ref> Compare branches from their merge base
32
+ --staged Review only staged changes
33
+ --profile focused|balanced|thorough
34
+ --fail-on high|medium|low|critical|info Exit 1 for findings at this level or above
24
35
  onboarder start Start the web UI in the foreground (Ctrl-C stops it)
25
36
  onboarder start background Start detached — keeps running after you close the terminal
26
37
  onboarder start startup Run automatically at login [install|remove|status]
@@ -36,11 +47,20 @@ const HELP = `
36
47
 
37
48
  In the explorer
38
49
  map tour explain what this is, where to start, and why
39
- tree find show deps browse it, search it, read it, trace it
50
+ tree find show inspect deps browse it, search it, read it, trace it
51
+ graph blast symbols the dependency tree, the blast radius, the outline
40
52
  health hubs layers patterns the analysis, in the same words the site uses
41
- stats security stack entry numbers, findings, dependencies
42
- cd rescan web switch repo, reload, open the web UI
53
+ coupling clusters risks the heat grid, the module groups, what is wrong
54
+ log hotspots blame git history, hot files, who wrote a line
55
+ diagram atlas docs Mermaid source, diagram index, and prose
56
+ workflows sbom CI jobs and dependency/license inventory
57
+ diff engines deep Changed files, analyzer status, optional deep scan
58
+ ask <question> Optional AI answer grounded in the loaded repo
59
+ pick cd rescan web choose a source, switch repo, reload, open the web UI
60
+ github what GitHub says about this repo — stars, issues, license
61
+ !<command> run a shell command without leaving
43
62
  help exit everything, and the way out
63
+ Tab completes commands, then file paths
44
64
 
45
65
  Setup flags (interactive wizard skips what they answer)
46
66
  --mode local|self-hosted --host <addr> --port <n> --domain <name>
@@ -68,6 +88,9 @@ const HELP = `
68
88
  Examples
69
89
  onboarder # explore the repo you are standing in
70
90
  onboarder explore ~/code/my-app # explore somewhere else
91
+ onboarder explore # choose a local folder or paste a Git URL
92
+ onboarder explore https://github.com/expressjs/express # clone one and read it
93
+ onboarder report . --json # analyze once and print machine-readable JSON
71
94
  onboarder start background # leave the web UI running, close the terminal
72
95
  onboarder logs -f # watch what it is doing
73
96
  onboarder start startup install # also start it every time you log in
@@ -75,144 +98,218 @@ const HELP = `
75
98
  onboarder setup --non-interactive --mode self-hosted --domain map.example.com --https --start
76
99
  onboarder config set tunnel.cloudflare true && onboarder tunnel cloudflare
77
100
  `;
78
-
79
101
  const OPTIONS = {
80
- help: { type: 'boolean', short: 'h' },
81
- version: { type: 'boolean', short: 'v' },
82
- json: { type: 'boolean' },
83
- yes: { type: 'boolean', short: 'y' },
84
- 'non-interactive': { type: 'boolean' },
85
- reveal: { type: 'boolean' },
86
- verbose: { type: 'boolean' },
87
- start: { type: 'boolean' },
88
- color: { type: 'boolean' }, // --no-color falls out of parseArgs for free
89
- config: { type: 'string' },
90
- mode: { type: 'string' },
91
- host: { type: 'string' },
92
- port: { type: 'string' },
93
- domain: { type: 'string' },
94
- https: { type: 'boolean' },
95
- 'access-key': { type: 'string' },
96
- name: { type: 'string' },
97
- email: { type: 'string' },
98
- provider: { type: 'string' },
99
- 'base-url': { type: 'string' },
100
- model: { type: 'string' },
101
- cloudflare: { type: 'boolean' },
102
- tailscale: { type: 'boolean' },
103
- 'auto-open': { type: 'boolean' },
104
- lines: { type: 'string', short: 'n' },
105
- follow: { type: 'boolean', short: 'f' },
106
- timeout: { type: 'string' },
107
- server: { type: 'boolean' },
102
+ help: { type: 'boolean', short: 'h' },
103
+ version: { type: 'boolean', short: 'v' },
104
+ json: { type: 'boolean' },
105
+ yes: { type: 'boolean', short: 'y' },
106
+ 'non-interactive': { type: 'boolean' },
107
+ reveal: { type: 'boolean' },
108
+ verbose: { type: 'boolean' },
109
+ start: { type: 'boolean' },
110
+ color: { type: 'boolean' }, // `--no-color` is lifted out by extractNegatedFlags; --color forces it on
111
+ config: { type: 'string' },
112
+ mode: { type: 'string' },
113
+ host: { type: 'string' },
114
+ port: { type: 'string' },
115
+ domain: { type: 'string' },
116
+ https: { type: 'boolean' },
117
+ 'access-key': { type: 'string' },
118
+ name: { type: 'string' },
119
+ email: { type: 'string' },
120
+ provider: { type: 'string' },
121
+ 'base-url': { type: 'string' },
122
+ model: { type: 'string' },
123
+ cloudflare: { type: 'boolean' },
124
+ tailscale: { type: 'boolean' },
125
+ 'auto-open': { type: 'boolean' },
126
+ lines: { type: 'string', short: 'n' },
127
+ follow: { type: 'boolean', short: 'f' },
128
+ timeout: { type: 'string' },
129
+ server: { type: 'boolean' },
130
+ 'max-files': { type: 'string' },
131
+ 'max-file-size': { type: 'string' },
132
+ 'read-concurrency': { type: 'string' },
133
+ base: { type: 'string' },
134
+ head: { type: 'string' },
135
+ staged: { type: 'boolean' },
136
+ profile: { type: 'string' },
137
+ 'fail-on': { type: 'string' },
108
138
  };
109
-
110
139
  // parseArgs speaks kebab-case; the wizard's flags speak camelCase.
111
140
  function normalizeFlags(values) {
112
- const out = {};
113
- for (const [k, v] of Object.entries(values)) {
114
- const key = k.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
115
- out[key] = v;
116
- }
117
- return out;
141
+ const out = {};
142
+ for (const [k, v] of Object.entries(values)) {
143
+ const key = k.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
144
+ out[key] = v;
145
+ }
146
+ return out;
147
+ }
148
+ // `parseArgs` cannot express a negated boolean. `--color=false` is rejected
149
+ // outright, `--color false` sets `color: true` and leaves `false` behind as a
150
+ // positional, and `--no-color` is an unknown option — so the documented flag
151
+ // had never worked, for any command, and `--no-color status` would try to run a
152
+ // command called `no-color`.
153
+ //
154
+ // There is no parser-level spelling for "this boolean is false", so the flag is
155
+ // lifted out of argv before parsing and applied to the parsed flags after. That
156
+ // keeps `parseArgs` strict about genuinely unknown options (which is the point
157
+ // of a tool that writes a config file) while making the one negation the CLI
158
+ // documents actually work.
159
+ function extractNegatedFlags(argv) {
160
+ const rest = [];
161
+ let noColor = false;
162
+ for (const arg of argv) {
163
+ if (arg === '--no-color')
164
+ noColor = true;
165
+ else
166
+ rest.push(arg);
167
+ }
168
+ return { argv: rest, noColor };
118
169
  }
119
-
120
170
  export async function main(argv = process.argv.slice(2)) {
121
- let parsed;
122
- try {
123
- parsed = parseArgs({ args: argv, options: OPTIONS, allowPositionals: true });
124
- } catch (e) {
125
- console.error(' ' + e.message + '\n' + HELP);
126
- return 2;
127
- }
128
- const { values, positionals } = parsed;
129
- const flags = normalizeFlags(values);
130
-
131
- if (flags.help) { console.log(HELP); return 0; }
132
- if (flags.version) { console.log(PACKAGE.version); return 0; }
133
-
134
- const [cmd, sub, ...rest] = positionals;
135
- try {
136
- switch (cmd) {
137
- case 'help':
171
+ const { argv: argsIn, noColor } = extractNegatedFlags(argv);
172
+ let parsed;
173
+ try {
174
+ parsed = parseArgs({ args: argsIn, options: OPTIONS, allowPositionals: true });
175
+ }
176
+ catch (e) {
177
+ console.error(' ' + e.message + '\n' + HELP);
178
+ return 2;
179
+ }
180
+ const { values, positionals } = parsed;
181
+ const flags = normalizeFlags(values);
182
+ // Color is decided here, after the flags exist and before anything is
183
+ // painted. An explicit `--no-color` wins over `FORCE_COLOR`: a person who
184
+ // typed the flag meant it, and a stray `FORCE_COLOR` inherited from a CI
185
+ // profile should not override the thing they just asked for.
186
+ if (noColor) {
187
+ flags.color = false;
188
+ setColorEnabled(false);
189
+ }
190
+ else if (flags.color === true) {
191
+ // `--color` was accepted by the parser and then ignored, which is the same
192
+ // lie in the other direction. It is the documented way to keep ANSI in a
193
+ // captured log, so it has to actually turn color on.
194
+ setColorEnabled(true);
195
+ }
196
+ if (flags.help) {
138
197
  console.log(HELP);
139
198
  return 0;
140
- case undefined:
141
- // The entry point. On a terminal, bare `onboarder` explores the repo you
142
- // are standing in — the thing people actually want from this tool, and
143
- // what the name promises. Everywhere else (a pipe, CI, a script) it
144
- // still starts the server, because an interactive session with no input
145
- // source is a hang, and nothing about a background job wants a prompt.
146
- // `--server` forces the old behavior even on a terminal.
147
- if (!flags.server && process.stdin.isTTY && process.stdout.isTTY) {
148
- return codeOf(await runExplore({ flags, target: '.' }));
149
- }
150
- return codeOf(await runStart({ flags }));
151
- case 'explore':
152
- case 'tui':
153
- case 'shell':
154
- return codeOf(await runExplore({ flags, target: sub || '.' }));
155
- case 'web':
156
- case 'site':
157
- return codeOf(await runStart({ flags }));
158
- case 'start':
159
- // `onboarder start [background|fg|startup [action]]`. The sub-verb is a
160
- // positional, not a flag, because `onboarder start` has to keep working
161
- // exactly as it did and `startup install` is a different verb from
162
- // `start`.
163
- if (sub === 'background' || sub === 'bg' || sub === 'daemon' || sub === 'detached') {
164
- return codeOf(await runStartBackground({ flags }));
165
- }
166
- if (sub === 'startup' || sub === 'login' || sub === 'autostart') {
167
- return codeOf(await runStartup(rest[0] || 'status', { flags }));
168
- }
169
- if (sub === 'fg' || sub === 'foreground') return codeOf(await runStart({ flags }));
170
- if (sub === 'status') return codeOf(await runStatus({ flags }));
171
- if (sub === 'stop') return codeOf(await runStop({ flags }));
172
- if (sub === 'logs') return codeOf(await runLogs({ flags }));
173
- if (sub) {
174
- console.error(' Unknown start mode: ' + sub + '\n' + HELP);
175
- return 2;
199
+ }
200
+ if (flags.version) {
201
+ console.log(PACKAGE.version);
202
+ return 0;
203
+ }
204
+ const [cmd, sub, ...rest] = positionals;
205
+ try {
206
+ switch (cmd) {
207
+ case 'help':
208
+ console.log(HELP);
209
+ return 0;
210
+ case undefined:
211
+ // The entry point. On a terminal, bare `onboarder` explores the repo you
212
+ // are standing in — the thing people actually want from this tool, and
213
+ // what the name promises. Everywhere else (a pipe, CI, a script) it
214
+ // still starts the server, because an interactive session with no input
215
+ // source is a hang, and nothing about a background job wants a prompt.
216
+ // `--server` forces the old behavior even on a terminal.
217
+ if (!flags.server && process.stdin.isTTY && process.stdout.isTTY) {
218
+ return codeOf(await runExplore({ flags }));
219
+ }
220
+ return codeOf(await runStart({ flags }));
221
+ case 'explore':
222
+ case 'tui':
223
+ case 'shell':
224
+ return codeOf(await runExplore({ flags, target: sub }));
225
+ case 'report': {
226
+ const repo = await openRepoOrClone(sub || '.', scanOptionsFromFlags(flags));
227
+ try {
228
+ const report = createReport(repo);
229
+ console.log(flags.json ? JSON.stringify(report, null, 2) : formatReport(report));
230
+ return 0;
231
+ }
232
+ finally {
233
+ await closeRemote(repo);
234
+ }
235
+ }
236
+ case 'review': {
237
+ if (flags.staged && flags.head)
238
+ throw new Error('Choose either --staged or --head.');
239
+ if (flags.failOn && !Object.hasOwn(SEVERITY_RANK, flags.failOn))
240
+ throw new Error('Choose a valid --fail-on severity: critical, high, medium, low, or info.');
241
+ const report = await runReview(expandHome(sub || '.'), { base: flags.base || 'HEAD', head: flags.head || '', mode: flags.staged ? 'staged' : flags.head ? 'range' : 'working', profile: flags.profile ? reviewProfile(flags.profile) : undefined });
242
+ console.log(flags.json ? JSON.stringify(report, null, 2) : reviewMarkdown(report));
243
+ return flags.failOn && report.findings.some(f => SEVERITY_RANK[f.severity] >= SEVERITY_RANK[flags.failOn]) || report.checks.some(c => c.id === 'conflicts' && c.status === 'fail') ? 1 : 0;
244
+ }
245
+ case 'web':
246
+ case 'site':
247
+ return codeOf(await runStart({ flags }));
248
+ case 'start':
249
+ // `onboarder start [background|fg|startup [action]]`. The sub-verb is a
250
+ // positional, not a flag, because `onboarder start` has to keep working
251
+ // exactly as it did and `startup install` is a different verb from
252
+ // `start`.
253
+ if (sub === 'background' || sub === 'bg' || sub === 'daemon' || sub === 'detached') {
254
+ return codeOf(await runStartBackground({ flags }));
255
+ }
256
+ if (sub === 'startup' || sub === 'login' || sub === 'autostart') {
257
+ return codeOf(await runStartup(rest[0] || 'status', { flags }));
258
+ }
259
+ if (sub === 'fg' || sub === 'foreground')
260
+ return codeOf(await runStart({ flags }));
261
+ if (sub === 'status')
262
+ return codeOf(await runStatus({ flags }));
263
+ if (sub === 'stop')
264
+ return codeOf(await runStop({ flags }));
265
+ if (sub === 'logs')
266
+ return codeOf(await runLogs({ flags }));
267
+ if (sub) {
268
+ console.error(' Unknown start mode: ' + sub + '\n' + HELP);
269
+ return 2;
270
+ }
271
+ return codeOf(await runStart({ flags }));
272
+ case 'logs':
273
+ case 'log':
274
+ return codeOf(await runLogs({ flags }));
275
+ case 'startup':
276
+ case 'autostart':
277
+ return codeOf(await runStartup(sub || 'status', { flags }));
278
+ case 'status':
279
+ return codeOf(await runStatus({ flags }));
280
+ case 'stop':
281
+ return codeOf(await runStop({ flags }));
282
+ case 'restart':
283
+ return codeOf(await runRestart({ flags }));
284
+ case 'setup':
285
+ case 'onboard':
286
+ case 'init':
287
+ return codeOf(await runSetup({ flags, version: PACKAGE.version }));
288
+ case 'config':
289
+ if (sub === 'key')
290
+ return codeOf(await runConfigKey(rest[0], rest.slice(1), { flags }));
291
+ if (sub === 'reset')
292
+ return codeOf(await runConfigReset({ flags }));
293
+ return codeOf(await runConfig(sub || 'show', rest, { flags }));
294
+ case 'tunnel':
295
+ return codeOf(await runTunnel(sub, { flags }));
296
+ case 'https':
297
+ return codeOf(await runHttps(sub || 'status', { flags }));
298
+ case 'doctor':
299
+ return codeOf(await runDoctor({ flags }));
300
+ default:
301
+ console.error(' Unknown command: ' + cmd + '\n' + HELP);
302
+ return 2;
176
303
  }
177
- return codeOf(await runStart({ flags }));
178
- case 'logs':
179
- case 'log':
180
- return codeOf(await runLogs({ flags }));
181
- case 'startup':
182
- case 'autostart':
183
- return codeOf(await runStartup(sub || 'status', { flags }));
184
- case 'status':
185
- return codeOf(await runStatus({ flags }));
186
- case 'stop':
187
- return codeOf(await runStop({ flags }));
188
- case 'restart':
189
- return codeOf(await runRestart({ flags }));
190
- case 'setup':
191
- case 'onboard':
192
- case 'init':
193
- return codeOf(await runSetup({ flags, version: PACKAGE.version }));
194
- case 'config':
195
- if (sub === 'key') return codeOf(await runConfigKey(rest[0], rest.slice(1), { flags }));
196
- if (sub === 'reset') return codeOf(await runConfigReset({ flags }));
197
- return codeOf(await runConfig(sub || 'show', rest, { flags }));
198
- case 'tunnel':
199
- return codeOf(await runTunnel(sub, { flags }));
200
- case 'https':
201
- return codeOf(await runHttps(sub || 'status', { flags }));
202
- case 'doctor':
203
- return codeOf(await runDoctor({ flags }));
204
- default:
205
- console.error(' Unknown command: ' + cmd + '\n' + HELP);
206
- return 2;
207
304
  }
208
- } catch (e) {
209
- console.error(' ' + (e.message || e));
210
- return 1;
211
- }
305
+ catch (e) {
306
+ console.error(' ' + (e.message || e));
307
+ return 1;
308
+ }
212
309
  }
213
-
214
310
  // Commands return an exit code or, for `start`, an object carrying the live
215
311
  // server. Both collapse to "what code should the process eventually use".
216
312
  function codeOf(result) {
217
- return typeof result === 'number' ? result : result?.code ?? 0;
313
+ return typeof result === 'number' ? result : result?.code ?? 0;
218
314
  }
315
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { scanOptionsFromFlags } from './scanOptions.js';\n// argv → command. `bin/onboarder.js` is a one-line trampoline into `main`; all\n// parsing and dispatch lives here so the tests can call it directly.\n//\n// Flags use node's util.parseArgs — still zero dependencies, still strict about\n// unknown flags, which is what a tool that writes a config file should be.\n\nimport fs from 'node:fs';\nimport { parseArgs } from 'node:util';\n\nimport {\n runSetup, runStart, runStartBackground, runStartup, runLogs, runStatus, runStop, runRestart,\n runConfig, runConfigKey, runConfigReset, runDoctor, runTunnel, runHttps,\n} from './commands.js';\nimport { runExplore } from './explorer/app.js';\nimport { openRepoOrClone, closeRemote } from './explorer/session.js';\nimport { createReport, formatReport } from './explorer/report.js';\nimport { setColorEnabled } from './ui.js';\nimport { runReview } from '../server/review.js';\nimport { reviewMarkdown, reviewProfile, SEVERITY_RANK } from '../shared/review/review.js';\nimport { expandHome } from '../server/paths.js';\n\nconst PACKAGE = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'));\n\nconst HELP = `\n 🧭 Onboarder — drop a path, get a map.\n\n Scan options for report and explore\n --max-files <count> Maximum files to walk (default: 4000)\n --max-file-size <bytes> Maximum UTF-8 file size (default: 204800)\n --read-concurrency <n> Concurrent reads, 1–32 (default: 8)\n\n Usage\n onboarder Explore a codebase here, interactively\n onboarder explore [folder|url] Choose a source, or open one directly (alias: tui)\n onboarder report [folder|url] One-shot summary for terminals and scripts (--json)\n onboarder review [folder] Review local changes (--json for scripts)\n --base <ref> --head <ref> Compare branches from their merge base\n --staged Review only staged changes\n --profile focused|balanced|thorough\n --fail-on high|medium|low|critical|info Exit 1 for findings at this level or above\n onboarder start Start the web UI in the foreground (Ctrl-C stops it)\n onboarder start background Start detached — keeps running after you close the terminal\n onboarder start startup Run automatically at login [install|remove|status]\n onboarder web Alias for \\`onboarder start\\`\n onboarder logs Show recent log lines (-n <count>, -f to follow)\n onboarder status Show whether the web UI is running\n onboarder stop Stop the running web UI\n onboarder restart Stop and start again\n onboarder config [<…>] show | get <key> | set <key> <value> | path | reset | key <rotate|show|set>\n onboarder tunnel <name> cloudflare | tailscale\n onboarder https <action> check | setup | start | stop | status\n onboarder doctor Check the machine and the config\n\n In the explorer\n map tour explain what this is, where to start, and why\n tree find show inspect deps browse it, search it, read it, trace it\n graph blast symbols the dependency tree, the blast radius, the outline\n health hubs layers patterns the analysis, in the same words the site uses\n coupling clusters risks the heat grid, the module groups, what is wrong\n log hotspots blame git history, hot files, who wrote a line\n diagram atlas docs Mermaid source, diagram index, and prose\n workflows sbom CI jobs and dependency/license inventory\n diff engines deep Changed files, analyzer status, optional deep scan\n ask <question> Optional AI answer grounded in the loaded repo\n pick cd rescan web choose a source, switch repo, reload, open the web UI\n github what GitHub says about this repo — stars, issues, license\n !<command> run a shell command without leaving\n help exit everything, and the way out\n Tab completes commands, then file paths\n\n Setup flags (interactive wizard skips what they answer)\n --mode local|self-hosted --host <addr> --port <n> --domain <name>\n --https Set up automatic HTTPS through Caddy\n --access-key generate|<k> --name <n> --email <e>\n --provider none|openai-compatible|ollama|openrouter|custom\n --base-url <url> --model <m> --cloudflare --tailscale\n\n General flags\n --config <file> Use this config file (or ONBOARDER_CONFIG)\n --server With bare \\`onboarder\\`, start the web UI instead of exploring\n --non-interactive Never prompt; flags + defaults are the answers\n -y, --yes Answer yes to confirmations\n --json Machine-readable output\n --reveal config show prints the full access key\n --no-color Plain output (NO_COLOR works too)\n -h, --help This text -v, --version Print the version\n\n Also accepted\n help | --help onboarder help | onboarder --help\n config | config show\n bg | detached alias for start background\n fg | foreground alias for start\n\n Examples\n onboarder # explore the repo you are standing in\n onboarder explore ~/code/my-app # explore somewhere else\n onboarder explore # choose a local folder or paste a Git URL\n onboarder explore https://github.com/expressjs/express # clone one and read it\n onboarder report . --json # analyze once and print machine-readable JSON\n onboarder start background # leave the web UI running, close the terminal\n onboarder logs -f # watch what it is doing\n onboarder start startup install # also start it every time you log in\n onboarder setup --non-interactive --mode local --port 4310\n onboarder setup --non-interactive --mode self-hosted --domain map.example.com --https --start\n onboarder config set tunnel.cloudflare true && onboarder tunnel cloudflare\n`;\n\nconst OPTIONS: NonNullable<import('node:util').ParseArgsConfig['options']> = {\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n json: { type: 'boolean' },\n yes: { type: 'boolean', short: 'y' },\n 'non-interactive': { type: 'boolean' },\n reveal: { type: 'boolean' },\n verbose: { type: 'boolean' },\n start: { type: 'boolean' },\n color: { type: 'boolean' }, // `--no-color` is lifted out by extractNegatedFlags; --color forces it on\n config: { type: 'string' },\n mode: { type: 'string' },\n host: { type: 'string' },\n port: { type: 'string' },\n domain: { type: 'string' },\n https: { type: 'boolean' },\n 'access-key': { type: 'string' },\n name: { type: 'string' },\n email: { type: 'string' },\n provider: { type: 'string' },\n 'base-url': { type: 'string' },\n model: { type: 'string' },\n cloudflare: { type: 'boolean' },\n tailscale: { type: 'boolean' },\n 'auto-open': { type: 'boolean' },\n lines: { type: 'string', short: 'n' },\n follow: { type: 'boolean', short: 'f' },\n timeout: { type: 'string' },\n server: { type: 'boolean' },\n 'max-files': { type: 'string' },\n 'max-file-size': { type: 'string' },\n 'read-concurrency': { type: 'string' },\n base: { type: 'string' },\n head: { type: 'string' },\n staged: { type: 'boolean' },\n profile: { type: 'string' },\n 'fail-on': { type: 'string' },\n};\n\n// parseArgs speaks kebab-case; the wizard's flags speak camelCase.\nfunction normalizeFlags(values) {\n const out: Record<string, any> = {};\n for (const [k, v] of Object.entries(values)) {\n const key = k.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n out[key] = v;\n }\n return out;\n}\n\n// `parseArgs` cannot express a negated boolean. `--color=false` is rejected\n// outright, `--color false` sets `color: true` and leaves `false` behind as a\n// positional, and `--no-color` is an unknown option — so the documented flag\n// had never worked, for any command, and `--no-color status` would try to run a\n// command called `no-color`.\n//\n// There is no parser-level spelling for \"this boolean is false\", so the flag is\n// lifted out of argv before parsing and applied to the parsed flags after. That\n// keeps `parseArgs` strict about genuinely unknown options (which is the point\n// of a tool that writes a config file) while making the one negation the CLI\n// documents actually work.\nfunction extractNegatedFlags(argv) {\n const rest = [];\n let noColor = false;\n for (const arg of argv) {\n if (arg === '--no-color') noColor = true;\n else rest.push(arg);\n }\n return { argv: rest, noColor };\n}\n\nexport async function main(argv = process.argv.slice(2)) {\n const { argv: argsIn, noColor } = extractNegatedFlags(argv);\n let parsed;\n try {\n parsed = parseArgs({ args: argsIn, options: OPTIONS, allowPositionals: true });\n } catch (e) {\n console.error(' ' + e.message + '\\n' + HELP);\n return 2;\n }\n const { values, positionals } = parsed;\n const flags = normalizeFlags(values);\n\n // Color is decided here, after the flags exist and before anything is\n // painted. An explicit `--no-color` wins over `FORCE_COLOR`: a person who\n // typed the flag meant it, and a stray `FORCE_COLOR` inherited from a CI\n // profile should not override the thing they just asked for.\n if (noColor) {\n flags.color = false;\n setColorEnabled(false);\n } else if (flags.color === true) {\n // `--color` was accepted by the parser and then ignored, which is the same\n // lie in the other direction. It is the documented way to keep ANSI in a\n // captured log, so it has to actually turn color on.\n setColorEnabled(true);\n }\n\n if (flags.help) { console.log(HELP); return 0; }\n if (flags.version) { console.log(PACKAGE.version); return 0; }\n\n const [cmd, sub, ...rest] = positionals;\n try {\n switch (cmd) {\n case 'help':\n console.log(HELP);\n return 0;\n case undefined:\n // The entry point. On a terminal, bare `onboarder` explores the repo you\n // are standing in — the thing people actually want from this tool, and\n // what the name promises. Everywhere else (a pipe, CI, a script) it\n // still starts the server, because an interactive session with no input\n // source is a hang, and nothing about a background job wants a prompt.\n // `--server` forces the old behavior even on a terminal.\n if (!flags.server && process.stdin.isTTY && process.stdout.isTTY) {\n return codeOf(await runExplore({ flags }));\n }\n return codeOf(await runStart({ flags }));\n case 'explore':\n case 'tui':\n case 'shell':\n return codeOf(await runExplore({ flags, target: sub }));\n case 'report': {\n const repo = await openRepoOrClone(sub || '.', scanOptionsFromFlags(flags));\n try {\n const report = createReport(repo);\n console.log(flags.json ? JSON.stringify(report, null, 2) : formatReport(report));\n return 0;\n } finally {\n await closeRemote(repo);\n }\n }\n case 'review': {\n if (flags.staged && flags.head) throw new Error('Choose either --staged or --head.');\n if (flags.failOn && !Object.hasOwn(SEVERITY_RANK, flags.failOn)) throw new Error('Choose a valid --fail-on severity: critical, high, medium, low, or info.');\n const report = await runReview(expandHome(sub || '.'), { base: flags.base || 'HEAD', head: flags.head || '', mode: flags.staged ? 'staged' : flags.head ? 'range' : 'working', profile: flags.profile ? reviewProfile(flags.profile) : undefined });\n console.log(flags.json ? JSON.stringify(report, null, 2) : reviewMarkdown(report));\n return flags.failOn && report.findings.some(f => SEVERITY_RANK[f.severity] >= SEVERITY_RANK[flags.failOn]) || report.checks.some(c => c.id === 'conflicts' && c.status === 'fail') ? 1 : 0;\n }\n case 'web':\n case 'site':\n return codeOf(await runStart({ flags }));\n case 'start':\n // `onboarder start [background|fg|startup [action]]`. The sub-verb is a\n // positional, not a flag, because `onboarder start` has to keep working\n // exactly as it did and `startup install` is a different verb from\n // `start`.\n if (sub === 'background' || sub === 'bg' || sub === 'daemon' || sub === 'detached') {\n return codeOf(await runStartBackground({ flags }));\n }\n if (sub === 'startup' || sub === 'login' || sub === 'autostart') {\n return codeOf(await runStartup(rest[0] || 'status', { flags }));\n }\n if (sub === 'fg' || sub === 'foreground') return codeOf(await runStart({ flags }));\n if (sub === 'status') return codeOf(await runStatus({ flags }));\n if (sub === 'stop') return codeOf(await runStop({ flags }));\n if (sub === 'logs') return codeOf(await runLogs({ flags }));\n if (sub) {\n console.error(' Unknown start mode: ' + sub + '\\n' + HELP);\n return 2;\n }\n return codeOf(await runStart({ flags }));\n case 'logs':\n case 'log':\n return codeOf(await runLogs({ flags }));\n case 'startup':\n case 'autostart':\n return codeOf(await runStartup(sub || 'status', { flags }));\n case 'status':\n return codeOf(await runStatus({ flags }));\n case 'stop':\n return codeOf(await runStop({ flags }));\n case 'restart':\n return codeOf(await runRestart({ flags }));\n case 'setup':\n case 'onboard':\n case 'init':\n return codeOf(await runSetup({ flags, version: PACKAGE.version }));\n case 'config':\n if (sub === 'key') return codeOf(await runConfigKey(rest[0], rest.slice(1), { flags }));\n if (sub === 'reset') return codeOf(await runConfigReset({ flags }));\n return codeOf(await runConfig(sub || 'show', rest, { flags }));\n case 'tunnel':\n return codeOf(await runTunnel(sub, { flags }));\n case 'https':\n return codeOf(await runHttps(sub || 'status', { flags }));\n case 'doctor':\n return codeOf(await runDoctor({ flags }));\n default:\n console.error(' Unknown command: ' + cmd + '\\n' + HELP);\n return 2;\n }\n } catch (e) {\n console.error(' ' + (e.message || e));\n return 1;\n }\n}\n\n// Commands return an exit code or, for `start`, an object carrying the live\n// server. Both collapse to \"what code should the process eventually use\".\nfunction codeOf(result) {\n return typeof result === 'number' ? result : result?.code ?? 0;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare class WizardCancelled extends Error {
2
+ code: string;
3
+ constructor();
4
+ }
5
+ export declare function runSteps(steps: any, answers?: Record<string, any>, io?: Record<string, any>): Promise<Record<string, any>>;