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/prompt.js CHANGED
@@ -6,101 +6,105 @@
6
6
  //
7
7
  // Ctrl-C is a first-class answer ("cancelled"), not a stack trace: the wizard
8
8
  // has written nothing yet at any point it can be pressed, and it says so.
9
-
10
9
  import readline from 'node:readline/promises';
11
-
12
10
  import { bold, cyan, dim, bad, section } from './ui.js';
13
11
  import { defaultOf } from './wizard.js';
14
-
15
12
  export class WizardCancelled extends Error {
16
- constructor() {
17
- super('cancelled');
18
- this.code = 'CANCELLED';
19
- }
13
+ code;
14
+ constructor() {
15
+ super('cancelled');
16
+ this.code = 'CANCELLED';
17
+ }
20
18
  }
21
-
22
19
  // Run every pending step in order, collecting answers. `answers` is seeded
23
20
  // with flag answers by the caller, which is how --flags skip questions.
24
21
  export async function runSteps(steps, answers = {}, io = {}) {
25
- const input = io.input || process.stdin;
26
- const output = io.output || process.stdout;
27
- const rl = readline.createInterface({ input, output });
28
- // readline eats SIGINT when the terminal is in its raw-ish mode; route it to
29
- // the same cancellation path as anything else that would kill us mid-ask.
30
- const onSigint = () => rl.close();
31
- process.once('SIGINT', onSigint);
32
- try {
33
- let lastSection = null;
34
- for (const step of steps) {
35
- // `when` is evaluated here, one question at a time — never upfront.
36
- // Conditions read answers collected earlier in the same run ("ask about
37
- // the bind only when mode is self-hosted"), so filtering the list
38
- // before the first question would prune branches the answers reopen.
39
- if (step.when && !step.when(answers)) continue;
40
- if (step.section && step.section !== lastSection) {
41
- output.write(section(step.section) + '\n');
42
- lastSection = step.section;
43
- }
44
- answers[step.id] = await askOne(rl, output, step, answers);
22
+ const input = io.input || process.stdin;
23
+ const output = io.output || process.stdout;
24
+ const rl = readline.createInterface({ input, output });
25
+ // readline eats SIGINT when the terminal is in its raw-ish mode; route it to
26
+ // the same cancellation path as anything else that would kill us mid-ask.
27
+ const onSigint = () => rl.close();
28
+ process.once('SIGINT', onSigint);
29
+ try {
30
+ let lastSection = null;
31
+ for (const step of steps) {
32
+ // `when` is evaluated here, one question at a time — never upfront.
33
+ // Conditions read answers collected earlier in the same run ("ask about
34
+ // the bind only when mode is self-hosted"), so filtering the list
35
+ // before the first question would prune branches the answers reopen.
36
+ if (step.when && !step.when(answers))
37
+ continue;
38
+ if (step.section && step.section !== lastSection) {
39
+ output.write(section(step.section) + '\n');
40
+ lastSection = step.section;
41
+ }
42
+ answers[step.id] = await askOne(rl, output, step, answers);
43
+ }
44
+ return answers;
45
+ }
46
+ catch (err) {
47
+ throw new WizardCancelled();
48
+ }
49
+ finally {
50
+ process.removeListener('SIGINT', onSigint);
51
+ rl.close();
45
52
  }
46
- return answers;
47
- } catch (err) {
48
- throw new WizardCancelled();
49
- } finally {
50
- process.removeListener('SIGINT', onSigint);
51
- rl.close();
52
- }
53
53
  }
54
-
55
54
  async function askOne(rl, output, step, answers) {
56
- // Re-ask until the validator is happy; each failure prints the reason so the
57
- // next attempt is informed rather than punished.
58
- for (;;) {
59
- const value = step.type === 'choice'
60
- ? await askChoice(rl, output, step, answers)
61
- : step.type === 'confirm'
62
- ? await askConfirm(rl, step, answers)
63
- : await askText(rl, step, answers);
64
- const complaint = step.validate ? step.validate(value) : null;
65
- if (!complaint) return value;
66
- output.write(bad(' ' + complaint) + '\n');
67
- }
55
+ // Re-ask until the validator is happy; each failure prints the reason so the
56
+ // next attempt is informed rather than punished.
57
+ for (;;) {
58
+ const value = step.type === 'choice'
59
+ ? await askChoice(rl, output, step, answers)
60
+ : step.type === 'confirm'
61
+ ? await askConfirm(rl, step, answers)
62
+ : await askText(rl, step, answers);
63
+ const complaint = step.validate ? step.validate(value) : null;
64
+ if (!complaint)
65
+ return value;
66
+ output.write(bad(' ' + complaint) + '\n');
67
+ }
68
68
  }
69
-
70
69
  async function askText(rl, step, answers) {
71
- const fallback = defaultOf(step, answers);
72
- if (step.hint) rl.output.write(dim(' ' + step.hint) + '\n');
73
- const suffix = fallback ? dim(` (${fallback})`) : '';
74
- const typed = await rl.question(` ${bold(step.question)}${suffix}: `);
75
- const value = typed.trim() || String(fallback ?? '');
76
- return step.type === 'text' && /port/i.test(step.id) ? value : value;
70
+ const fallback = defaultOf(step, answers);
71
+ if (step.hint)
72
+ rl.output.write(dim(' ' + step.hint) + '\n');
73
+ const suffix = fallback ? dim(` (${fallback})`) : '';
74
+ const typed = await rl.question(` ${bold(step.question)}${suffix}: `);
75
+ const value = typed.trim() || String(fallback ?? '');
76
+ return step.type === 'text' && /port/i.test(step.id) ? value : value;
77
77
  }
78
-
79
78
  async function askConfirm(rl, step, answers) {
80
- const fallback = Boolean(defaultOf(step, answers));
81
- const typed = await rl.question(` ${bold(step.question)} ${dim(fallback ? '(Y/n)' : '(y/N)')} `);
82
- const v = typed.trim().toLowerCase();
83
- if (!v) return fallback;
84
- return v === 'y' || v === 'yes';
79
+ const fallback = Boolean(defaultOf(step, answers));
80
+ const typed = await rl.question(` ${bold(step.question)} ${dim(fallback ? '(Y/n)' : '(y/N)')} `);
81
+ const v = typed.trim().toLowerCase();
82
+ if (!v)
83
+ return fallback;
84
+ return v === 'y' || v === 'yes';
85
85
  }
86
-
87
86
  async function askChoice(rl, output, step, answers) {
88
- const fallback = defaultOf(step, answers);
89
- const choices = step.choices.filter((c) => !c.when || c.when(answers));
90
- output.write(` ${bold(step.question)}\n`);
91
- choices.forEach((c, i) => {
92
- const marker = c.value === fallback ? cyan('›') : ' ';
93
- const hint = c.hint ? dim(' ' + c.hint) : '';
94
- output.write(` ${marker} ${i + 1}. ${c.label}${hint}\n`);
95
- });
96
- if (step.hint) output.write(dim(' ' + step.hint) + '\n');
97
- const typed = await rl.question(dim(' Choose [1-' + choices.length + '] ') + '');
98
- const v = typed.trim();
99
- if (!v) return fallback;
100
- const byNumber = choices[Number(v) - 1];
101
- if (byNumber) return byNumber.value;
102
- const byValue = choices.find((c) => c.value === v.toLowerCase());
103
- if (byValue) return byValue.value;
104
- output.write(bad(' Pick a number from the list.') + '\n');
105
- return askChoice(rl, output, step, answers);
87
+ const fallback = defaultOf(step, answers);
88
+ const choices = step.choices.filter((c) => !c.when || c.when(answers));
89
+ output.write(` ${bold(step.question)}\n`);
90
+ choices.forEach((c, i) => {
91
+ const marker = c.value === fallback ? cyan('›') : ' ';
92
+ const hint = c.hint ? dim(' ' + c.hint) : '';
93
+ output.write(` ${marker} ${i + 1}. ${c.label}${hint}\n`);
94
+ });
95
+ if (step.hint)
96
+ output.write(dim(' ' + step.hint) + '\n');
97
+ const typed = await rl.question(dim(' Choose [1-' + choices.length + '] ') + '');
98
+ const v = typed.trim();
99
+ if (!v)
100
+ return fallback;
101
+ const byNumber = choices[Number(v) - 1];
102
+ if (byNumber)
103
+ return byNumber.value;
104
+ const byValue = choices.find((c) => c.value === v.toLowerCase());
105
+ if (byValue)
106
+ return byValue.value;
107
+ output.write(bad(' Pick a number from the list.') + '\n');
108
+ return askChoice(rl, output, step, answers);
106
109
  }
110
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/cli/prompt.ts"],"names":[],"mappings":"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","sourcesContent":["// The wizard's face: one readline interface that renders the pure steps from\n// `wizard.js`. Everything display-shaped lives here — numbered choices, hints\n// in gray, validation loops that re-ask with the reason — and nothing\n// decision-shaped does. A step asks, validates, returns; the engine decides\n// what the answer means.\n//\n// Ctrl-C is a first-class answer (\"cancelled\"), not a stack trace: the wizard\n// has written nothing yet at any point it can be pressed, and it says so.\n\nimport readline from 'node:readline/promises';\n\nimport { bold, cyan, dim, bad, section } from './ui.js';\nimport { defaultOf } from './wizard.js';\n\nexport class WizardCancelled extends Error {\n code: string;\n\n constructor() {\n super('cancelled');\n this.code = 'CANCELLED';\n }\n}\n\n// Run every pending step in order, collecting answers. `answers` is seeded\n// with flag answers by the caller, which is how --flags skip questions.\nexport async function runSteps(steps, answers: Record<string, any> = {}, io: Record<string, any> = {}) {\n const input = io.input || process.stdin;\n const output = io.output || process.stdout;\n const rl = readline.createInterface({ input, output });\n // readline eats SIGINT when the terminal is in its raw-ish mode; route it to\n // the same cancellation path as anything else that would kill us mid-ask.\n const onSigint = () => rl.close();\n process.once('SIGINT', onSigint);\n try {\n let lastSection = null;\n for (const step of steps) {\n // `when` is evaluated here, one question at a time — never upfront.\n // Conditions read answers collected earlier in the same run (\"ask about\n // the bind only when mode is self-hosted\"), so filtering the list\n // before the first question would prune branches the answers reopen.\n if (step.when && !step.when(answers)) continue;\n if (step.section && step.section !== lastSection) {\n output.write(section(step.section) + '\\n');\n lastSection = step.section;\n }\n answers[step.id] = await askOne(rl, output, step, answers);\n }\n return answers;\n } catch (err) {\n throw new WizardCancelled();\n } finally {\n process.removeListener('SIGINT', onSigint);\n rl.close();\n }\n}\n\nasync function askOne(rl, output, step, answers) {\n // Re-ask until the validator is happy; each failure prints the reason so the\n // next attempt is informed rather than punished.\n for (;;) {\n const value = step.type === 'choice'\n ? await askChoice(rl, output, step, answers)\n : step.type === 'confirm'\n ? await askConfirm(rl, step, answers)\n : await askText(rl, step, answers);\n const complaint = step.validate ? step.validate(value) : null;\n if (!complaint) return value;\n output.write(bad(' ' + complaint) + '\\n');\n }\n}\n\nasync function askText(rl, step, answers) {\n const fallback = defaultOf(step, answers);\n if (step.hint) rl.output.write(dim(' ' + step.hint) + '\\n');\n const suffix = fallback ? dim(` (${fallback})`) : '';\n const typed = await rl.question(` ${bold(step.question)}${suffix}: `);\n const value = typed.trim() || String(fallback ?? '');\n return step.type === 'text' && /port/i.test(step.id) ? value : value;\n}\n\nasync function askConfirm(rl, step, answers) {\n const fallback = Boolean(defaultOf(step, answers));\n const typed = await rl.question(` ${bold(step.question)} ${dim(fallback ? '(Y/n)' : '(y/N)')} `);\n const v = typed.trim().toLowerCase();\n if (!v) return fallback;\n return v === 'y' || v === 'yes';\n}\n\nasync function askChoice(rl, output, step, answers) {\n const fallback = defaultOf(step, answers);\n const choices = step.choices.filter((c) => !c.when || c.when(answers));\n output.write(` ${bold(step.question)}\\n`);\n choices.forEach((c, i) => {\n const marker = c.value === fallback ? cyan('›') : ' ';\n const hint = c.hint ? dim(' ' + c.hint) : '';\n output.write(` ${marker} ${i + 1}. ${c.label}${hint}\\n`);\n });\n if (step.hint) output.write(dim(' ' + step.hint) + '\\n');\n const typed = await rl.question(dim(' Choose [1-' + choices.length + '] ') + '');\n const v = typed.trim();\n if (!v) return fallback;\n const byNumber = choices[Number(v) - 1];\n if (byNumber) return byNumber.value;\n const byValue = choices.find((c) => c.value === v.toLowerCase());\n if (byValue) return byValue.value;\n output.write(bad(' Pick a number from the list.') + '\\n');\n return askChoice(rl, output, step, answers);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { ScanRequestOptions } from '../shared/contracts.js';
2
+ export declare function scanOptionsFromFlags(flags: Record<string, unknown>): ScanRequestOptions;
@@ -0,0 +1,11 @@
1
+ import { normalizeScanOptions } from '../shared/analyzer/scanControl.js';
2
+ export function scanOptionsFromFlags(flags) {
3
+ const options = {};
4
+ for (const key of ['maxFiles', 'maxFileSize', 'readConcurrency']) {
5
+ if (flags[key] !== undefined)
6
+ options[key] = Number(flags[key]);
7
+ }
8
+ normalizeScanOptions(options);
9
+ return options;
10
+ }
11
+ //# sourceMappingURL=scanOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanOptions.js","sourceRoot":"","sources":["../src/cli/scanOptions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,MAAM,UAAU,oBAAoB,CAAC,KAA8B;IACjE,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,iBAAiB,CAAU,EAAE,CAAC;QAC1E,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import type { ScanRequestOptions } from '../shared/contracts.js';\nimport { normalizeScanOptions } from '../shared/analyzer/scanControl.js';\n\nexport function scanOptionsFromFlags(flags: Record<string, unknown>): ScanRequestOptions {\n const options: ScanRequestOptions = {};\n for (const key of ['maxFiles', 'maxFileSize', 'readConcurrency'] as const) {\n if (flags[key] !== undefined) options[key] = Number(flags[key]);\n }\n normalizeScanOptions(options);\n return options;\n}\n"]}
package/cli/ui.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { PanelRow, PanelOptions } from '../server/layout.js';
2
+ export declare function setColorEnabled(on?: boolean): void;
3
+ export declare function colorEnabled(): boolean;
4
+ export declare function supportsColor(): boolean;
5
+ declare const CODES: {
6
+ reset: number;
7
+ bold: number;
8
+ dim: number;
9
+ italic: number;
10
+ red: number;
11
+ green: number;
12
+ yellow: number;
13
+ blue: number;
14
+ magenta: number;
15
+ cyan: number;
16
+ gray: number;
17
+ };
18
+ export declare function paint(text: unknown, ...styles: Array<keyof typeof CODES>): string;
19
+ export declare const ok: (s: unknown) => string;
20
+ export declare const warn: (s: unknown) => string;
21
+ export declare const bad: (s: unknown) => string;
22
+ export declare const dim: (s: unknown) => string;
23
+ export declare const bold: (s: unknown) => string;
24
+ export declare const cyan: (s: unknown) => string;
25
+ export declare function welcomeBanner(version: string, configFile: string): string;
26
+ export declare function section(title: string): string;
27
+ export declare function kv(label: string, value: unknown): string;
28
+ export declare const tick: string;
29
+ export declare const cross: string;
30
+ export declare const dash: string;
31
+ import { width, fit, termWidth, hint, row } from '../server/layout.js';
32
+ export { width, fit, termWidth, hint, row };
33
+ export declare function panel(title: string, rows: PanelRow[], options?: PanelOptions): string;
package/cli/ui.js CHANGED
@@ -3,71 +3,91 @@
3
3
  // Everything goes through `paint` so --no-color, NO_COLOR, and a piped stdout
4
4
  // all strip styling in one place. Nothing here is load-bearing — every message
5
5
  // has to read fine as plain text, because that is how logs and CI see it.
6
-
7
- export const supportsColor = process.stdout.isTTY && !process.env.NO_COLOR;
8
-
6
+ // Color resolution, in strict precedence order:
7
+ //
8
+ // 1. An explicit `--no-color` / `NO_COLOR` → off. A person who asked for plain
9
+ // text gets plain text, whatever the environment says.
10
+ // 2. An explicit `--color` / `FORCE_COLOR` → on. This is the documented way
11
+ // to keep ANSI in a captured log or a pipe, so it has to beat the TTY sniff.
12
+ // 3. Otherwise, a TTY → on.
13
+ // 4. Otherwise → off.
14
+ //
15
+ // Every step reads live rather than caching at import, because `main` parses
16
+ // flags *after* the module graph has loaded. The old `const supportsColor = ...`
17
+ // decided once, at import, which is before `--no-color` was knowable — so the
18
+ // documented flags were silently ignored everywhere.
19
+ let forced = null; // null = undecided, true = force on, false = force off
20
+ export function setColorEnabled(on) {
21
+ forced = on === undefined ? null : Boolean(on);
22
+ }
23
+ export function colorEnabled() {
24
+ if (forced === false)
25
+ return false;
26
+ if (forced === true)
27
+ return true;
28
+ if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== '')
29
+ return false;
30
+ if (process.env.FORCE_COLOR)
31
+ return true;
32
+ return Boolean(process.stdout.isTTY);
33
+ }
34
+ export function supportsColor() {
35
+ return colorEnabled();
36
+ }
9
37
  const CODES = {
10
- reset: 0, bold: 1, dim: 2, italic: 3,
11
- red: 31, green: 32, yellow: 33, blue: 34, magenta: 35, cyan: 36, gray: 90,
38
+ reset: 0, bold: 1, dim: 2, italic: 3,
39
+ red: 31, green: 32, yellow: 33, blue: 34, magenta: 35, cyan: 36, gray: 90,
12
40
  };
13
-
14
41
  export function paint(text, ...styles) {
15
- if (!supportsColor || !styles.length) return String(text);
16
- const open = styles.map((s) => `\x1b[${CODES[s]}m`).join('');
17
- return `${open}${text}\x1b[0m`;
42
+ if (!colorEnabled() || !styles.length)
43
+ return String(text);
44
+ const open = styles.map((s) => `\x1b[${CODES[s]}m`).join('');
45
+ return `${open}${text}\x1b[0m`;
18
46
  }
19
-
20
47
  export const ok = (s) => paint(s, 'green');
21
48
  export const warn = (s) => paint(s, 'yellow');
22
49
  export const bad = (s) => paint(s, 'red');
23
50
  export const dim = (s) => paint(s, 'gray');
24
51
  export const bold = (s) => paint(s, 'bold');
25
52
  export const cyan = (s) => paint(s, 'cyan');
26
-
27
53
  // The wizard's welcome — one screen, says what the tool is and what the wizard
28
54
  // is about to touch (one file), and how to leave. Modeled on the honesty of a
29
55
  // good installer: no art, no spinner, no mystery.
30
56
  export function welcomeBanner(version, configFile) {
31
- return [
32
- '',
33
- bold(' 🧭 Onboarder setup') + dim(` v${version}`),
34
- dim(' Drop a path. Get a map.'),
35
- '',
36
- ' This wizard asks a handful of questions and writes one file:',
37
- ' ' + cyan(configFile),
38
- dim(' Nothing is sent anywhere. Ctrl-C at any question cancels without writing.'),
39
- '',
40
- ].join('\n');
57
+ return [
58
+ '',
59
+ bold(' 🧭 Onboarder setup') + dim(` v${version}`),
60
+ dim(' Drop a path. Get a map.'),
61
+ '',
62
+ ' This wizard asks a handful of questions and writes one file:',
63
+ ' ' + cyan(configFile),
64
+ dim(' Nothing is sent anywhere. Ctrl-C at any question cancels without writing.'),
65
+ '',
66
+ ].join('\n');
41
67
  }
42
-
43
68
  export function section(title) {
44
- return '\n' + bold(` ── ${title} ` + '─'.repeat(Math.max(2, 46 - title.length)));
69
+ return '\n' + bold(` ── ${title} ` + '─'.repeat(Math.max(2, 46 - title.length)));
45
70
  }
46
-
47
71
  // Label/value rows, aligned — the banner, `config show`, and the doctor all
48
72
  // print in this shape so output greps the same everywhere.
49
73
  export function kv(label, value) {
50
- return ' ' + paint((label + ' ').padEnd(12), 'gray') + value;
74
+ return ' ' + paint((label + ' ').padEnd(12), 'gray') + value;
51
75
  }
52
-
53
76
  export const tick = ok(' ✓ ');
54
77
  export const cross = bad(' ✗ ');
55
78
  export const dash = dim(' – ');
56
-
57
79
  // The layout math (width, fit, panel) lives in `server/layout.js` so the server's
58
80
  // own startup banner can use the identical geometry without importing this file
59
81
  // and inverting the dependency. This module is only the *color* on top of it.
60
82
  import { width, fit, termWidth, panel as layoutPanel, hint, row } from '../server/layout.js';
61
-
62
83
  export { width, fit, termWidth, hint, row };
63
-
64
84
  // A titled block of rows that fits the terminal it is printed into. Same shape
65
85
  // the server banner uses; the difference is only that this one paints.
66
86
  export function panel(title, rows, options = {}) {
67
- const styles = { label: 'gray', frame: 'gray', hint: 'gray', title: 'bold' };
68
- return layoutPanel(title, rows, {
69
- ...options,
70
- paint: (text, style) => paint(text, styles[style] || 'gray'),
71
- });
87
+ const styles = { label: 'gray', frame: 'gray', hint: 'gray', title: 'bold' };
88
+ return layoutPanel(title, rows, {
89
+ ...options,
90
+ paint: (text, style) => paint(text, styles[style] || 'gray'),
91
+ });
72
92
  }
73
-
93
+ //# sourceMappingURL=ui.js.map
package/cli/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/cli/ui.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PanelRow, PanelOptions, PanelStyle } from '../server/layout.js';\n// Terminal paint: the few ANSI touches the CLI uses, all behind one flag.\n//\n// Everything goes through `paint` so --no-color, NO_COLOR, and a piped stdout\n// all strip styling in one place. Nothing here is load-bearing — every message\n// has to read fine as plain text, because that is how logs and CI see it.\n\n// Color resolution, in strict precedence order:\n//\n// 1. An explicit `--no-color` / `NO_COLOR` → off. A person who asked for plain\n// text gets plain text, whatever the environment says.\n// 2. An explicit `--color` / `FORCE_COLOR` → on. This is the documented way\n// to keep ANSI in a captured log or a pipe, so it has to beat the TTY sniff.\n// 3. Otherwise, a TTY → on.\n// 4. Otherwise → off.\n//\n// Every step reads live rather than caching at import, because `main` parses\n// flags *after* the module graph has loaded. The old `const supportsColor = ...`\n// decided once, at import, which is before `--no-color` was knowable — so the\n// documented flags were silently ignored everywhere.\nlet forced: boolean | null = null; // null = undecided, true = force on, false = force off\n\nexport function setColorEnabled(on?: boolean) {\n forced = on === undefined ? null : Boolean(on);\n}\n\nexport function colorEnabled() {\n if (forced === false) return false;\n if (forced === true) return true;\n if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== '') return false;\n if (process.env.FORCE_COLOR) return true;\n return Boolean(process.stdout.isTTY);\n}\n\nexport function supportsColor() {\n return colorEnabled();\n}\n\nconst CODES = {\n reset: 0, bold: 1, dim: 2, italic: 3,\n red: 31, green: 32, yellow: 33, blue: 34, magenta: 35, cyan: 36, gray: 90,\n};\n\nexport function paint(text: unknown, ...styles: Array<keyof typeof CODES>) {\n if (!colorEnabled() || !styles.length) return String(text);\n const open = styles.map((s) => `\\x1b[${CODES[s]}m`).join('');\n return `${open}${text}\\x1b[0m`;\n}\n\nexport const ok = (s: unknown) => paint(s, 'green');\nexport const warn = (s: unknown) => paint(s, 'yellow');\nexport const bad = (s: unknown) => paint(s, 'red');\nexport const dim = (s: unknown) => paint(s, 'gray');\nexport const bold = (s: unknown) => paint(s, 'bold');\nexport const cyan = (s: unknown) => paint(s, 'cyan');\n\n// The wizard's welcome — one screen, says what the tool is and what the wizard\n// is about to touch (one file), and how to leave. Modeled on the honesty of a\n// good installer: no art, no spinner, no mystery.\nexport function welcomeBanner(version: string, configFile: string) {\n return [\n '',\n bold(' 🧭 Onboarder setup') + dim(` v${version}`),\n dim(' Drop a path. Get a map.'),\n '',\n ' This wizard asks a handful of questions and writes one file:',\n ' ' + cyan(configFile),\n dim(' Nothing is sent anywhere. Ctrl-C at any question cancels without writing.'),\n '',\n ].join('\\n');\n}\n\nexport function section(title: string) {\n return '\\n' + bold(` ── ${title} ` + '─'.repeat(Math.max(2, 46 - title.length)));\n}\n\n// Label/value rows, aligned — the banner, `config show`, and the doctor all\n// print in this shape so output greps the same everywhere.\nexport function kv(label: string, value: unknown) {\n return ' ' + paint((label + ' ').padEnd(12), 'gray') + value;\n}\n\nexport const tick = ok(' ✓ ');\nexport const cross = bad(' ✗ ');\nexport const dash = dim(' – ');\n\n// The layout math (width, fit, panel) lives in `server/layout.js` so the server's\n// own startup banner can use the identical geometry without importing this file\n// and inverting the dependency. This module is only the *color* on top of it.\nimport { width, fit, termWidth, panel as layoutPanel, hint, row } from '../server/layout.js';\n\nexport { width, fit, termWidth, hint, row };\n\n// A titled block of rows that fits the terminal it is printed into. Same shape\n// the server banner uses; the difference is only that this one paints.\nexport function panel(title: string, rows: PanelRow[], options: PanelOptions = {}) {\n const styles: Record<PanelStyle, keyof typeof CODES> = { label: 'gray', frame: 'gray', hint: 'gray', title: 'bold' };\n return layoutPanel(title, rows, {\n ...options,\n paint: (text, style) => paint(text, styles[style] || 'gray'),\n });\n}\n\n"]}
@@ -0,0 +1,187 @@
1
+ import type { Settings } from '../shared/contracts.js';
2
+ export declare const PROVIDER_PRESETS: {
3
+ none: {
4
+ label: string;
5
+ baseUrl: string;
6
+ };
7
+ 'openai-compatible': {
8
+ label: string;
9
+ baseUrl: string;
10
+ };
11
+ ollama: {
12
+ label: string;
13
+ baseUrl: string;
14
+ };
15
+ openrouter: {
16
+ label: string;
17
+ baseUrl: string;
18
+ };
19
+ custom: {
20
+ label: string;
21
+ baseUrl: string;
22
+ };
23
+ };
24
+ export declare const TUNNEL_CHOICES: {
25
+ value: string;
26
+ label: string;
27
+ hint: string;
28
+ }[];
29
+ export declare function validPort(value: any): string;
30
+ export declare function validDomain(value: any): string;
31
+ export declare function validEmail(value: any): string;
32
+ export declare function buildSteps(current?: Settings): ({
33
+ id: string;
34
+ section: string;
35
+ type: string;
36
+ question: string;
37
+ hint: string;
38
+ default: string;
39
+ validate?: undefined;
40
+ choices?: undefined;
41
+ when?: undefined;
42
+ } | {
43
+ id: string;
44
+ section: string;
45
+ type: string;
46
+ question: string;
47
+ hint: string;
48
+ default: string;
49
+ validate: typeof validEmail;
50
+ choices?: undefined;
51
+ when?: undefined;
52
+ } | {
53
+ id: string;
54
+ section: string;
55
+ type: string;
56
+ question: string;
57
+ choices: {
58
+ value: string;
59
+ label: string;
60
+ hint: string;
61
+ }[];
62
+ default: (answers: any) => any;
63
+ when: (a: any) => boolean;
64
+ validate?: undefined;
65
+ hint?: undefined;
66
+ } | {
67
+ id: string;
68
+ section: string;
69
+ type: string;
70
+ question: string;
71
+ default: string;
72
+ validate: typeof validPort;
73
+ hint?: undefined;
74
+ choices?: undefined;
75
+ when?: undefined;
76
+ } | {
77
+ id: string;
78
+ section: string;
79
+ type: string;
80
+ question: string;
81
+ hint: string;
82
+ default: string;
83
+ validate: typeof validDomain;
84
+ when: (a: any) => boolean;
85
+ choices?: undefined;
86
+ } | {
87
+ id: string;
88
+ section: string;
89
+ type: string;
90
+ question: string;
91
+ hint: string;
92
+ default: boolean;
93
+ when: (a: any) => boolean;
94
+ validate?: undefined;
95
+ choices?: undefined;
96
+ } | {
97
+ id: string;
98
+ section: string;
99
+ type: string;
100
+ question: string;
101
+ choices: {
102
+ value: string;
103
+ label: string;
104
+ hint: string;
105
+ }[];
106
+ default: string;
107
+ when: (a: any) => boolean;
108
+ validate?: undefined;
109
+ hint?: undefined;
110
+ } | {
111
+ id: string;
112
+ section: string;
113
+ type: string;
114
+ question: string;
115
+ hint: string;
116
+ validate: (v: any) => string;
117
+ when: (a: any) => boolean;
118
+ choices?: undefined;
119
+ default?: undefined;
120
+ } | {
121
+ id: string;
122
+ section: string;
123
+ type: string;
124
+ question: string;
125
+ choices: {
126
+ value: string;
127
+ label: string;
128
+ hint: string;
129
+ }[];
130
+ default: string;
131
+ validate?: undefined;
132
+ hint?: undefined;
133
+ when?: undefined;
134
+ } | {
135
+ id: string;
136
+ section: string;
137
+ type: string;
138
+ question: string;
139
+ default: (a: any) => any;
140
+ validate: (v: any) => string;
141
+ when: (a: any) => boolean;
142
+ hint?: undefined;
143
+ choices?: undefined;
144
+ } | {
145
+ validate?: undefined;
146
+ id: string;
147
+ section: string;
148
+ type: string;
149
+ question: string;
150
+ hint: string;
151
+ default: string;
152
+ when: (a: any) => boolean;
153
+ choices?: undefined;
154
+ } | {
155
+ validate?: undefined;
156
+ id: string;
157
+ section: string;
158
+ type: string;
159
+ question: string;
160
+ hint: string;
161
+ choices: {
162
+ value: string;
163
+ label: string;
164
+ hint: string;
165
+ }[];
166
+ default: string;
167
+ when: (a: any) => boolean;
168
+ } | {
169
+ validate?: undefined;
170
+ hint?: undefined;
171
+ choices?: undefined;
172
+ when?: undefined;
173
+ id: string;
174
+ section: string;
175
+ type: string;
176
+ question: string;
177
+ default: boolean;
178
+ })[];
179
+ export declare function pendingSteps(steps: any, answers?: Record<string, any>): any;
180
+ export declare function unansweredSteps(steps: any, answers?: Record<string, any>): any;
181
+ export declare function defaultOf(step: any, answers: any): any;
182
+ export declare function answersToSettings(current: any, answers: any): Settings;
183
+ export declare function applyFlags(current: any, flags?: Record<string, any>): {
184
+ patch: Record<string, any>;
185
+ settings: Settings;
186
+ };
187
+ export declare function summaryLines(settings: any, { revealKey }?: Record<string, any>): any[][];