@untangle-code/cli 0.0.0-stage → 0.1.1

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 (571) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +451 -2
  4. package/THIRD_PARTY_LICENSES.md +152 -0
  5. package/dist/cli/args.d.ts +48 -0
  6. package/dist/cli/args.d.ts.map +1 -0
  7. package/dist/cli/args.js +167 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/command.d.ts +69 -0
  10. package/dist/cli/command.d.ts.map +1 -0
  11. package/dist/cli/command.js +82 -0
  12. package/dist/cli/command.js.map +1 -0
  13. package/dist/cli/deadline.d.ts +33 -0
  14. package/dist/cli/deadline.d.ts.map +1 -0
  15. package/dist/cli/deadline.js +49 -0
  16. package/dist/cli/deadline.js.map +1 -0
  17. package/dist/cli/embedder-deadline.d.ts +72 -0
  18. package/dist/cli/embedder-deadline.d.ts.map +1 -0
  19. package/dist/cli/embedder-deadline.js +117 -0
  20. package/dist/cli/embedder-deadline.js.map +1 -0
  21. package/dist/cli/exit.d.ts +71 -0
  22. package/dist/cli/exit.d.ts.map +1 -0
  23. package/dist/cli/exit.js +81 -0
  24. package/dist/cli/exit.js.map +1 -0
  25. package/dist/cli/graphs.d.ts +65 -0
  26. package/dist/cli/graphs.d.ts.map +1 -0
  27. package/dist/cli/graphs.js +108 -0
  28. package/dist/cli/graphs.js.map +1 -0
  29. package/dist/cli/index-freshness.d.ts +13 -0
  30. package/dist/cli/index-freshness.d.ts.map +1 -0
  31. package/dist/cli/index-freshness.js +226 -0
  32. package/dist/cli/index-freshness.js.map +1 -0
  33. package/dist/cli/index-refresh.d.ts +10 -0
  34. package/dist/cli/index-refresh.d.ts.map +1 -0
  35. package/dist/cli/index-refresh.js +76 -0
  36. package/dist/cli/index-refresh.js.map +1 -0
  37. package/dist/cli/index-state.d.ts +184 -0
  38. package/dist/cli/index-state.d.ts.map +1 -0
  39. package/dist/cli/index-state.js +852 -0
  40. package/dist/cli/index-state.js.map +1 -0
  41. package/dist/cli/io.d.ts +29 -0
  42. package/dist/cli/io.d.ts.map +1 -0
  43. package/dist/cli/io.js +42 -0
  44. package/dist/cli/io.js.map +1 -0
  45. package/dist/cli/language-support.d.ts +77 -0
  46. package/dist/cli/language-support.d.ts.map +1 -0
  47. package/dist/cli/language-support.js +152 -0
  48. package/dist/cli/language-support.js.map +1 -0
  49. package/dist/cli/renewing-lease.d.ts +26 -0
  50. package/dist/cli/renewing-lease.d.ts.map +1 -0
  51. package/dist/cli/renewing-lease.js +102 -0
  52. package/dist/cli/renewing-lease.js.map +1 -0
  53. package/dist/cli/search-graph-enrichment.d.ts +16 -0
  54. package/dist/cli/search-graph-enrichment.d.ts.map +1 -0
  55. package/dist/cli/search-graph-enrichment.js +428 -0
  56. package/dist/cli/search-graph-enrichment.js.map +1 -0
  57. package/dist/cli/system.d.ts +34 -0
  58. package/dist/cli/system.d.ts.map +1 -0
  59. package/dist/cli/system.js +89 -0
  60. package/dist/cli/system.js.map +1 -0
  61. package/dist/cli/vector-store-policy.d.ts +116 -0
  62. package/dist/cli/vector-store-policy.d.ts.map +1 -0
  63. package/dist/cli/vector-store-policy.js +160 -0
  64. package/dist/cli/vector-store-policy.js.map +1 -0
  65. package/dist/cli/version.d.ts +3 -0
  66. package/dist/cli/version.d.ts.map +1 -0
  67. package/dist/cli/version.js +3 -0
  68. package/dist/cli/version.js.map +1 -0
  69. package/dist/cli/workspace.d.ts +105 -0
  70. package/dist/cli/workspace.d.ts.map +1 -0
  71. package/dist/cli/workspace.js +215 -0
  72. package/dist/cli/workspace.js.map +1 -0
  73. package/dist/commands/complexity.d.ts +72 -0
  74. package/dist/commands/complexity.d.ts.map +1 -0
  75. package/dist/commands/complexity.js +580 -0
  76. package/dist/commands/complexity.js.map +1 -0
  77. package/dist/commands/doctor.d.ts +66 -0
  78. package/dist/commands/doctor.d.ts.map +1 -0
  79. package/dist/commands/doctor.js +764 -0
  80. package/dist/commands/doctor.js.map +1 -0
  81. package/dist/commands/doctor.languages.d.ts +37 -0
  82. package/dist/commands/doctor.languages.d.ts.map +1 -0
  83. package/dist/commands/doctor.languages.js +143 -0
  84. package/dist/commands/doctor.languages.js.map +1 -0
  85. package/dist/commands/doctor.storage.d.ts +17 -0
  86. package/dist/commands/doctor.storage.d.ts.map +1 -0
  87. package/dist/commands/doctor.storage.js +91 -0
  88. package/dist/commands/doctor.storage.js.map +1 -0
  89. package/dist/commands/extensions/add.d.ts +10 -0
  90. package/dist/commands/extensions/add.d.ts.map +1 -0
  91. package/dist/commands/extensions/add.js +213 -0
  92. package/dist/commands/extensions/add.js.map +1 -0
  93. package/dist/commands/extensions/configure.d.ts +5 -0
  94. package/dist/commands/extensions/configure.d.ts.map +1 -0
  95. package/dist/commands/extensions/configure.js +58 -0
  96. package/dist/commands/extensions/configure.js.map +1 -0
  97. package/dist/commands/extensions/container.d.ts +15 -0
  98. package/dist/commands/extensions/container.d.ts.map +1 -0
  99. package/dist/commands/extensions/container.js +135 -0
  100. package/dist/commands/extensions/container.js.map +1 -0
  101. package/dist/commands/extensions/context.d.ts +37 -0
  102. package/dist/commands/extensions/context.d.ts.map +1 -0
  103. package/dist/commands/extensions/context.js +72 -0
  104. package/dist/commands/extensions/context.js.map +1 -0
  105. package/dist/commands/extensions/enable.d.ts +6 -0
  106. package/dist/commands/extensions/enable.d.ts.map +1 -0
  107. package/dist/commands/extensions/enable.js +180 -0
  108. package/dist/commands/extensions/enable.js.map +1 -0
  109. package/dist/commands/extensions/environment.d.ts +74 -0
  110. package/dist/commands/extensions/environment.d.ts.map +1 -0
  111. package/dist/commands/extensions/environment.js +168 -0
  112. package/dist/commands/extensions/environment.js.map +1 -0
  113. package/dist/commands/extensions/feature-scan.d.ts +48 -0
  114. package/dist/commands/extensions/feature-scan.d.ts.map +1 -0
  115. package/dist/commands/extensions/feature-scan.js +156 -0
  116. package/dist/commands/extensions/feature-scan.js.map +1 -0
  117. package/dist/commands/extensions/invoke.d.ts +60 -0
  118. package/dist/commands/extensions/invoke.d.ts.map +1 -0
  119. package/dist/commands/extensions/invoke.js +275 -0
  120. package/dist/commands/extensions/invoke.js.map +1 -0
  121. package/dist/commands/extensions/list.d.ts +5 -0
  122. package/dist/commands/extensions/list.d.ts.map +1 -0
  123. package/dist/commands/extensions/list.js +125 -0
  124. package/dist/commands/extensions/list.js.map +1 -0
  125. package/dist/commands/extensions/logs.d.ts +5 -0
  126. package/dist/commands/extensions/logs.d.ts.map +1 -0
  127. package/dist/commands/extensions/logs.js +74 -0
  128. package/dist/commands/extensions/logs.js.map +1 -0
  129. package/dist/commands/extensions/provision.d.ts +36 -0
  130. package/dist/commands/extensions/provision.d.ts.map +1 -0
  131. package/dist/commands/extensions/provision.js +137 -0
  132. package/dist/commands/extensions/provision.js.map +1 -0
  133. package/dist/commands/extensions/remove.d.ts +5 -0
  134. package/dist/commands/extensions/remove.d.ts.map +1 -0
  135. package/dist/commands/extensions/remove.js +77 -0
  136. package/dist/commands/extensions/remove.js.map +1 -0
  137. package/dist/commands/extensions/render.d.ts +16 -0
  138. package/dist/commands/extensions/render.d.ts.map +1 -0
  139. package/dist/commands/extensions/render.js +25 -0
  140. package/dist/commands/extensions/render.js.map +1 -0
  141. package/dist/commands/extensions/run.d.ts +30 -0
  142. package/dist/commands/extensions/run.d.ts.map +1 -0
  143. package/dist/commands/extensions/run.js +292 -0
  144. package/dist/commands/extensions/run.js.map +1 -0
  145. package/dist/commands/extensions/secret-store.d.ts +15 -0
  146. package/dist/commands/extensions/secret-store.d.ts.map +1 -0
  147. package/dist/commands/extensions/secret-store.js +164 -0
  148. package/dist/commands/extensions/secret-store.js.map +1 -0
  149. package/dist/commands/extensions/setup.d.ts +17 -0
  150. package/dist/commands/extensions/setup.d.ts.map +1 -0
  151. package/dist/commands/extensions/setup.js +94 -0
  152. package/dist/commands/extensions/setup.js.map +1 -0
  153. package/dist/commands/extensions/source.d.ts +47 -0
  154. package/dist/commands/extensions/source.d.ts.map +1 -0
  155. package/dist/commands/extensions/source.js +142 -0
  156. package/dist/commands/extensions/source.js.map +1 -0
  157. package/dist/commands/extensions/state.d.ts +62 -0
  158. package/dist/commands/extensions/state.d.ts.map +1 -0
  159. package/dist/commands/extensions/state.js +177 -0
  160. package/dist/commands/extensions/state.js.map +1 -0
  161. package/dist/commands/extensions/status.d.ts +9 -0
  162. package/dist/commands/extensions/status.d.ts.map +1 -0
  163. package/dist/commands/extensions/status.js +239 -0
  164. package/dist/commands/extensions/status.js.map +1 -0
  165. package/dist/commands/extensions.d.ts +3 -0
  166. package/dist/commands/extensions.d.ts.map +1 -0
  167. package/dist/commands/extensions.js +223 -0
  168. package/dist/commands/extensions.js.map +1 -0
  169. package/dist/commands/flow/index.d.ts +3 -0
  170. package/dist/commands/flow/index.d.ts.map +1 -0
  171. package/dist/commands/flow/index.js +295 -0
  172. package/dist/commands/flow/index.js.map +1 -0
  173. package/dist/commands/flow/limits.d.ts +12 -0
  174. package/dist/commands/flow/limits.d.ts.map +1 -0
  175. package/dist/commands/flow/limits.js +13 -0
  176. package/dist/commands/flow/limits.js.map +1 -0
  177. package/dist/commands/flow/output.d.ts +8 -0
  178. package/dist/commands/flow/output.d.ts.map +1 -0
  179. package/dist/commands/flow/output.js +11 -0
  180. package/dist/commands/flow/output.js.map +1 -0
  181. package/dist/commands/flow/render.d.ts +51 -0
  182. package/dist/commands/flow/render.d.ts.map +1 -0
  183. package/dist/commands/flow/render.js +220 -0
  184. package/dist/commands/flow/render.js.map +1 -0
  185. package/dist/commands/flow/select.d.ts +31 -0
  186. package/dist/commands/flow/select.d.ts.map +1 -0
  187. package/dist/commands/flow/select.js +62 -0
  188. package/dist/commands/flow/select.js.map +1 -0
  189. package/dist/commands/graph/boundaries-input.d.ts +26 -0
  190. package/dist/commands/graph/boundaries-input.d.ts.map +1 -0
  191. package/dist/commands/graph/boundaries-input.js +54 -0
  192. package/dist/commands/graph/boundaries-input.js.map +1 -0
  193. package/dist/commands/graph/boundaries.d.ts +4 -0
  194. package/dist/commands/graph/boundaries.d.ts.map +1 -0
  195. package/dist/commands/graph/boundaries.js +141 -0
  196. package/dist/commands/graph/boundaries.js.map +1 -0
  197. package/dist/commands/graph/bounds.d.ts +16 -0
  198. package/dist/commands/graph/bounds.d.ts.map +1 -0
  199. package/dist/commands/graph/bounds.js +22 -0
  200. package/dist/commands/graph/bounds.js.map +1 -0
  201. package/dist/commands/graph/category-clusters.d.ts +20 -0
  202. package/dist/commands/graph/category-clusters.d.ts.map +1 -0
  203. package/dist/commands/graph/category-clusters.js +158 -0
  204. package/dist/commands/graph/category-clusters.js.map +1 -0
  205. package/dist/commands/graph/feature-3d.d.ts +22 -0
  206. package/dist/commands/graph/feature-3d.d.ts.map +1 -0
  207. package/dist/commands/graph/feature-3d.js +114 -0
  208. package/dist/commands/graph/feature-3d.js.map +1 -0
  209. package/dist/commands/graph/feature-clusters.d.ts +17 -0
  210. package/dist/commands/graph/feature-clusters.d.ts.map +1 -0
  211. package/dist/commands/graph/feature-clusters.js +94 -0
  212. package/dist/commands/graph/feature-clusters.js.map +1 -0
  213. package/dist/commands/graph/feature-html.d.ts +26 -0
  214. package/dist/commands/graph/feature-html.d.ts.map +1 -0
  215. package/dist/commands/graph/feature-html.js +314 -0
  216. package/dist/commands/graph/feature-html.js.map +1 -0
  217. package/dist/commands/graph/feature-map.d.ts +31 -0
  218. package/dist/commands/graph/feature-map.d.ts.map +1 -0
  219. package/dist/commands/graph/feature-map.js +217 -0
  220. package/dist/commands/graph/feature-map.js.map +1 -0
  221. package/dist/commands/graph/feature-model.d.ts +55 -0
  222. package/dist/commands/graph/feature-model.d.ts.map +1 -0
  223. package/dist/commands/graph/feature-model.js +167 -0
  224. package/dist/commands/graph/feature-model.js.map +1 -0
  225. package/dist/commands/graph/feature-untangle-motion.d.ts +33 -0
  226. package/dist/commands/graph/feature-untangle-motion.d.ts.map +1 -0
  227. package/dist/commands/graph/feature-untangle-motion.js +155 -0
  228. package/dist/commands/graph/feature-untangle-motion.js.map +1 -0
  229. package/dist/commands/graph/index.d.ts +3 -0
  230. package/dist/commands/graph/index.d.ts.map +1 -0
  231. package/dist/commands/graph/index.js +414 -0
  232. package/dist/commands/graph/index.js.map +1 -0
  233. package/dist/commands/graph/render.d.ts +63 -0
  234. package/dist/commands/graph/render.d.ts.map +1 -0
  235. package/dist/commands/graph/render.js +352 -0
  236. package/dist/commands/graph/render.js.map +1 -0
  237. package/dist/commands/graph/select.d.ts +34 -0
  238. package/dist/commands/graph/select.d.ts.map +1 -0
  239. package/dist/commands/graph/select.js +55 -0
  240. package/dist/commands/graph/select.js.map +1 -0
  241. package/dist/commands/index/index.d.ts +6 -0
  242. package/dist/commands/index/index.d.ts.map +1 -0
  243. package/dist/commands/index/index.js +461 -0
  244. package/dist/commands/index/index.js.map +1 -0
  245. package/dist/commands/index/render.d.ts +53 -0
  246. package/dist/commands/index/render.d.ts.map +1 -0
  247. package/dist/commands/index/render.js +205 -0
  248. package/dist/commands/index/render.js.map +1 -0
  249. package/dist/commands/index/target.d.ts +34 -0
  250. package/dist/commands/index/target.d.ts.map +1 -0
  251. package/dist/commands/index/target.js +97 -0
  252. package/dist/commands/index/target.js.map +1 -0
  253. package/dist/commands/index-watch.d.ts +30 -0
  254. package/dist/commands/index-watch.d.ts.map +1 -0
  255. package/dist/commands/index-watch.js +138 -0
  256. package/dist/commands/index-watch.js.map +1 -0
  257. package/dist/commands/init/command.d.ts +25 -0
  258. package/dist/commands/init/command.d.ts.map +1 -0
  259. package/dist/commands/init/command.js +198 -0
  260. package/dist/commands/init/command.js.map +1 -0
  261. package/dist/commands/init/config-draft.d.ts +48 -0
  262. package/dist/commands/init/config-draft.d.ts.map +1 -0
  263. package/dist/commands/init/config-draft.js +201 -0
  264. package/dist/commands/init/config-draft.js.map +1 -0
  265. package/dist/commands/init/diff.d.ts +33 -0
  266. package/dist/commands/init/diff.d.ts.map +1 -0
  267. package/dist/commands/init/diff.js +109 -0
  268. package/dist/commands/init/diff.js.map +1 -0
  269. package/dist/commands/init/http-probe.d.ts +26 -0
  270. package/dist/commands/init/http-probe.d.ts.map +1 -0
  271. package/dist/commands/init/http-probe.js +144 -0
  272. package/dist/commands/init/http-probe.js.map +1 -0
  273. package/dist/commands/init/ignore-rules.d.ts +70 -0
  274. package/dist/commands/init/ignore-rules.d.ts.map +1 -0
  275. package/dist/commands/init/ignore-rules.js +146 -0
  276. package/dist/commands/init/ignore-rules.js.map +1 -0
  277. package/dist/commands/init/index.d.ts +33 -0
  278. package/dist/commands/init/index.d.ts.map +1 -0
  279. package/dist/commands/init/index.js +32 -0
  280. package/dist/commands/init/index.js.map +1 -0
  281. package/dist/commands/init/integrations-apply.d.ts +50 -0
  282. package/dist/commands/init/integrations-apply.d.ts.map +1 -0
  283. package/dist/commands/init/integrations-apply.js +452 -0
  284. package/dist/commands/init/integrations-apply.js.map +1 -0
  285. package/dist/commands/init/integrations-plan.d.ts +68 -0
  286. package/dist/commands/init/integrations-plan.d.ts.map +1 -0
  287. package/dist/commands/init/integrations-plan.js +515 -0
  288. package/dist/commands/init/integrations-plan.js.map +1 -0
  289. package/dist/commands/init/integrations.d.ts +5 -0
  290. package/dist/commands/init/integrations.d.ts.map +1 -0
  291. package/dist/commands/init/integrations.js +4 -0
  292. package/dist/commands/init/integrations.js.map +1 -0
  293. package/dist/commands/init/languages.d.ts +55 -0
  294. package/dist/commands/init/languages.d.ts.map +1 -0
  295. package/dist/commands/init/languages.js +245 -0
  296. package/dist/commands/init/languages.js.map +1 -0
  297. package/dist/commands/init/product-context.d.ts +63 -0
  298. package/dist/commands/init/product-context.d.ts.map +1 -0
  299. package/dist/commands/init/product-context.js +390 -0
  300. package/dist/commands/init/product-context.js.map +1 -0
  301. package/dist/commands/init/render.d.ts +38 -0
  302. package/dist/commands/init/render.d.ts.map +1 -0
  303. package/dist/commands/init/render.js +501 -0
  304. package/dist/commands/init/render.js.map +1 -0
  305. package/dist/commands/init/report.d.ts +24 -0
  306. package/dist/commands/init/report.d.ts.map +1 -0
  307. package/dist/commands/init/report.js +163 -0
  308. package/dist/commands/init/report.js.map +1 -0
  309. package/dist/commands/init/run.d.ts +71 -0
  310. package/dist/commands/init/run.d.ts.map +1 -0
  311. package/dist/commands/init/run.js +253 -0
  312. package/dist/commands/init/run.js.map +1 -0
  313. package/dist/commands/init/services.d.ts +82 -0
  314. package/dist/commands/init/services.d.ts.map +1 -0
  315. package/dist/commands/init/services.js +209 -0
  316. package/dist/commands/init/services.js.map +1 -0
  317. package/dist/commands/init/storage.d.ts +8 -0
  318. package/dist/commands/init/storage.d.ts.map +1 -0
  319. package/dist/commands/init/storage.js +102 -0
  320. package/dist/commands/init/storage.js.map +1 -0
  321. package/dist/commands/init/toml.d.ts +65 -0
  322. package/dist/commands/init/toml.d.ts.map +1 -0
  323. package/dist/commands/init/toml.js +159 -0
  324. package/dist/commands/init/toml.js.map +1 -0
  325. package/dist/commands/init/topology.d.ts +54 -0
  326. package/dist/commands/init/topology.d.ts.map +1 -0
  327. package/dist/commands/init/topology.js +146 -0
  328. package/dist/commands/init/topology.js.map +1 -0
  329. package/dist/commands/init/types.d.ts +334 -0
  330. package/dist/commands/init/types.d.ts.map +1 -0
  331. package/dist/commands/init/types.js +31 -0
  332. package/dist/commands/init/types.js.map +1 -0
  333. package/dist/commands/init/wizard-terminal.d.ts +36 -0
  334. package/dist/commands/init/wizard-terminal.d.ts.map +1 -0
  335. package/dist/commands/init/wizard-terminal.js +163 -0
  336. package/dist/commands/init/wizard-terminal.js.map +1 -0
  337. package/dist/commands/init/wizard.d.ts +25 -0
  338. package/dist/commands/init/wizard.d.ts.map +1 -0
  339. package/dist/commands/init/wizard.js +358 -0
  340. package/dist/commands/init/wizard.js.map +1 -0
  341. package/dist/commands/mcp.d.ts +4 -0
  342. package/dist/commands/mcp.d.ts.map +1 -0
  343. package/dist/commands/mcp.js +111 -0
  344. package/dist/commands/mcp.js.map +1 -0
  345. package/dist/commands/product-test-runner.d.ts +4 -0
  346. package/dist/commands/product-test-runner.d.ts.map +1 -0
  347. package/dist/commands/product-test-runner.js +85 -0
  348. package/dist/commands/product-test-runner.js.map +1 -0
  349. package/dist/commands/product.d.ts +16 -0
  350. package/dist/commands/product.d.ts.map +1 -0
  351. package/dist/commands/product.js +262 -0
  352. package/dist/commands/product.js.map +1 -0
  353. package/dist/commands/query.d.ts +114 -0
  354. package/dist/commands/query.d.ts.map +1 -0
  355. package/dist/commands/query.js +783 -0
  356. package/dist/commands/query.js.map +1 -0
  357. package/dist/commands/scan.d.ts +10 -0
  358. package/dist/commands/scan.d.ts.map +1 -0
  359. package/dist/commands/scan.js +302 -0
  360. package/dist/commands/scan.js.map +1 -0
  361. package/dist/commands/sdd.d.ts +24 -0
  362. package/dist/commands/sdd.d.ts.map +1 -0
  363. package/dist/commands/sdd.js +195 -0
  364. package/dist/commands/sdd.js.map +1 -0
  365. package/dist/commands/unavailable.d.ts +40 -0
  366. package/dist/commands/unavailable.d.ts.map +1 -0
  367. package/dist/commands/unavailable.js +73 -0
  368. package/dist/commands/unavailable.js.map +1 -0
  369. package/dist/commands/watch/analyze.d.ts +69 -0
  370. package/dist/commands/watch/analyze.d.ts.map +1 -0
  371. package/dist/commands/watch/analyze.js +402 -0
  372. package/dist/commands/watch/analyze.js.map +1 -0
  373. package/dist/commands/watch/cli.d.ts +8 -0
  374. package/dist/commands/watch/cli.d.ts.map +1 -0
  375. package/dist/commands/watch/cli.js +97 -0
  376. package/dist/commands/watch/cli.js.map +1 -0
  377. package/dist/commands/watch/delta.d.ts +46 -0
  378. package/dist/commands/watch/delta.d.ts.map +1 -0
  379. package/dist/commands/watch/delta.js +170 -0
  380. package/dist/commands/watch/delta.js.map +1 -0
  381. package/dist/commands/watch/events.d.ts +214 -0
  382. package/dist/commands/watch/events.d.ts.map +1 -0
  383. package/dist/commands/watch/events.js +13 -0
  384. package/dist/commands/watch/events.js.map +1 -0
  385. package/dist/commands/watch/index.d.ts +19 -0
  386. package/dist/commands/watch/index.d.ts.map +1 -0
  387. package/dist/commands/watch/index.js +15 -0
  388. package/dist/commands/watch/index.js.map +1 -0
  389. package/dist/commands/watch/options.d.ts +43 -0
  390. package/dist/commands/watch/options.d.ts.map +1 -0
  391. package/dist/commands/watch/options.js +193 -0
  392. package/dist/commands/watch/options.js.map +1 -0
  393. package/dist/commands/watch/render.d.ts +26 -0
  394. package/dist/commands/watch/render.d.ts.map +1 -0
  395. package/dist/commands/watch/render.js +175 -0
  396. package/dist/commands/watch/render.js.map +1 -0
  397. package/dist/commands/watch/run.d.ts +14 -0
  398. package/dist/commands/watch/run.d.ts.map +1 -0
  399. package/dist/commands/watch/run.js +460 -0
  400. package/dist/commands/watch/run.js.map +1 -0
  401. package/dist/commands/watch/runtime.d.ts +67 -0
  402. package/dist/commands/watch/runtime.d.ts.map +1 -0
  403. package/dist/commands/watch/runtime.js +149 -0
  404. package/dist/commands/watch/runtime.js.map +1 -0
  405. package/dist/commands/watch-command.d.ts +3 -0
  406. package/dist/commands/watch-command.d.ts.map +1 -0
  407. package/dist/commands/watch-command.js +273 -0
  408. package/dist/commands/watch-command.js.map +1 -0
  409. package/dist/entry-point.d.ts +11 -0
  410. package/dist/entry-point.d.ts.map +1 -0
  411. package/dist/entry-point.js +65 -0
  412. package/dist/entry-point.js.map +1 -0
  413. package/dist/index.d.ts +38 -0
  414. package/dist/index.d.ts.map +1 -0
  415. package/dist/index.js +245 -0
  416. package/dist/index.js.map +1 -0
  417. package/dist/mcp/boundaries-schema.d.ts +262 -0
  418. package/dist/mcp/boundaries-schema.d.ts.map +1 -0
  419. package/dist/mcp/boundaries-schema.js +183 -0
  420. package/dist/mcp/boundaries-schema.js.map +1 -0
  421. package/dist/mcp/default-runtime.d.ts +16 -0
  422. package/dist/mcp/default-runtime.d.ts.map +1 -0
  423. package/dist/mcp/default-runtime.js +718 -0
  424. package/dist/mcp/default-runtime.js.map +1 -0
  425. package/dist/mcp/envelope.d.ts +13 -0
  426. package/dist/mcp/envelope.d.ts.map +1 -0
  427. package/dist/mcp/envelope.js +29 -0
  428. package/dist/mcp/envelope.js.map +1 -0
  429. package/dist/mcp/index.d.ts +8 -0
  430. package/dist/mcp/index.d.ts.map +1 -0
  431. package/dist/mcp/index.js +8 -0
  432. package/dist/mcp/index.js.map +1 -0
  433. package/dist/mcp/output-schemas.d.ts +5928 -0
  434. package/dist/mcp/output-schemas.d.ts.map +1 -0
  435. package/dist/mcp/output-schemas.js +2814 -0
  436. package/dist/mcp/output-schemas.js.map +1 -0
  437. package/dist/mcp/path-sandbox.d.ts +35 -0
  438. package/dist/mcp/path-sandbox.d.ts.map +1 -0
  439. package/dist/mcp/path-sandbox.js +128 -0
  440. package/dist/mcp/path-sandbox.js.map +1 -0
  441. package/dist/mcp/server.d.ts +155 -0
  442. package/dist/mcp/server.d.ts.map +1 -0
  443. package/dist/mcp/server.js +257 -0
  444. package/dist/mcp/server.js.map +1 -0
  445. package/dist/mcp/stdio.d.ts +20 -0
  446. package/dist/mcp/stdio.d.ts.map +1 -0
  447. package/dist/mcp/stdio.js +71 -0
  448. package/dist/mcp/stdio.js.map +1 -0
  449. package/dist/mcp/tools.d.ts +355 -0
  450. package/dist/mcp/tools.d.ts.map +1 -0
  451. package/dist/mcp/tools.js +319 -0
  452. package/dist/mcp/tools.js.map +1 -0
  453. package/dist/mcp/types.d.ts +15 -0
  454. package/dist/mcp/types.d.ts.map +1 -0
  455. package/dist/mcp/types.js +45 -0
  456. package/dist/mcp/types.js.map +1 -0
  457. package/package.json +99 -3
  458. package/src/cli/args.ts +231 -0
  459. package/src/cli/command.ts +146 -0
  460. package/src/cli/deadline.ts +56 -0
  461. package/src/cli/embedder-deadline.ts +187 -0
  462. package/src/cli/exit.ts +94 -0
  463. package/src/cli/graphs.ts +191 -0
  464. package/src/cli/index-freshness.ts +303 -0
  465. package/src/cli/index-refresh.ts +125 -0
  466. package/src/cli/index-state.ts +1217 -0
  467. package/src/cli/io.ts +56 -0
  468. package/src/cli/language-support.ts +203 -0
  469. package/src/cli/renewing-lease.ts +121 -0
  470. package/src/cli/search-graph-enrichment.ts +639 -0
  471. package/src/cli/system.ts +94 -0
  472. package/src/cli/vector-store-policy.ts +213 -0
  473. package/src/cli/version.ts +2 -0
  474. package/src/cli/workspace.ts +324 -0
  475. package/src/commands/complexity.ts +776 -0
  476. package/src/commands/doctor.languages.ts +187 -0
  477. package/src/commands/doctor.storage.ts +124 -0
  478. package/src/commands/doctor.ts +946 -0
  479. package/src/commands/extensions/add.ts +312 -0
  480. package/src/commands/extensions/configure.ts +82 -0
  481. package/src/commands/extensions/container.ts +209 -0
  482. package/src/commands/extensions/context.ts +109 -0
  483. package/src/commands/extensions/enable.ts +237 -0
  484. package/src/commands/extensions/environment.ts +218 -0
  485. package/src/commands/extensions/feature-scan.ts +232 -0
  486. package/src/commands/extensions/invoke.ts +368 -0
  487. package/src/commands/extensions/list.ts +158 -0
  488. package/src/commands/extensions/logs.ts +104 -0
  489. package/src/commands/extensions/provision.ts +206 -0
  490. package/src/commands/extensions/remove.ts +110 -0
  491. package/src/commands/extensions/render.ts +32 -0
  492. package/src/commands/extensions/run.ts +386 -0
  493. package/src/commands/extensions/secret-store.ts +223 -0
  494. package/src/commands/extensions/setup.ts +140 -0
  495. package/src/commands/extensions/source.ts +189 -0
  496. package/src/commands/extensions/state.ts +252 -0
  497. package/src/commands/extensions/status.ts +320 -0
  498. package/src/commands/extensions.ts +280 -0
  499. package/src/commands/flow/index.ts +402 -0
  500. package/src/commands/flow/limits.ts +14 -0
  501. package/src/commands/flow/output.ts +16 -0
  502. package/src/commands/flow/render.ts +318 -0
  503. package/src/commands/flow/select.ts +101 -0
  504. package/src/commands/graph/boundaries-input.ts +63 -0
  505. package/src/commands/graph/boundaries.ts +182 -0
  506. package/src/commands/graph/bounds.ts +25 -0
  507. package/src/commands/graph/category-clusters.ts +194 -0
  508. package/src/commands/graph/feature-3d.ts +141 -0
  509. package/src/commands/graph/feature-clusters.ts +125 -0
  510. package/src/commands/graph/feature-html.ts +336 -0
  511. package/src/commands/graph/feature-map.ts +270 -0
  512. package/src/commands/graph/feature-model.ts +234 -0
  513. package/src/commands/graph/feature-untangle-motion.ts +192 -0
  514. package/src/commands/graph/index.ts +562 -0
  515. package/src/commands/graph/render.ts +503 -0
  516. package/src/commands/graph/select.ts +77 -0
  517. package/src/commands/index/index.ts +595 -0
  518. package/src/commands/index/render.ts +325 -0
  519. package/src/commands/index/target.ts +136 -0
  520. package/src/commands/index-watch.ts +206 -0
  521. package/src/commands/init/command.ts +238 -0
  522. package/src/commands/init/config-draft.ts +235 -0
  523. package/src/commands/init/diff.ts +117 -0
  524. package/src/commands/init/http-probe.ts +150 -0
  525. package/src/commands/init/ignore-rules.ts +170 -0
  526. package/src/commands/init/index.ts +63 -0
  527. package/src/commands/init/integrations-apply.ts +618 -0
  528. package/src/commands/init/integrations-plan.ts +634 -0
  529. package/src/commands/init/integrations.ts +8 -0
  530. package/src/commands/init/languages.ts +320 -0
  531. package/src/commands/init/product-context.ts +576 -0
  532. package/src/commands/init/render.ts +598 -0
  533. package/src/commands/init/report.ts +204 -0
  534. package/src/commands/init/run.ts +349 -0
  535. package/src/commands/init/services.ts +271 -0
  536. package/src/commands/init/storage.ts +136 -0
  537. package/src/commands/init/toml.ts +174 -0
  538. package/src/commands/init/topology.ts +192 -0
  539. package/src/commands/init/types.ts +366 -0
  540. package/src/commands/init/wizard-terminal.ts +206 -0
  541. package/src/commands/init/wizard.ts +450 -0
  542. package/src/commands/mcp.ts +123 -0
  543. package/src/commands/product-test-runner.ts +80 -0
  544. package/src/commands/product.ts +331 -0
  545. package/src/commands/query.ts +1032 -0
  546. package/src/commands/scan.ts +360 -0
  547. package/src/commands/sdd.ts +243 -0
  548. package/src/commands/unavailable.ts +92 -0
  549. package/src/commands/watch/README.md +160 -0
  550. package/src/commands/watch/analyze.ts +600 -0
  551. package/src/commands/watch/cli.ts +108 -0
  552. package/src/commands/watch/delta.ts +186 -0
  553. package/src/commands/watch/events.ts +235 -0
  554. package/src/commands/watch/index.ts +53 -0
  555. package/src/commands/watch/options.ts +234 -0
  556. package/src/commands/watch/render.ts +240 -0
  557. package/src/commands/watch/run.ts +553 -0
  558. package/src/commands/watch/runtime.ts +167 -0
  559. package/src/commands/watch-command.ts +294 -0
  560. package/src/entry-point.ts +67 -0
  561. package/src/index.ts +291 -0
  562. package/src/mcp/boundaries-schema.ts +193 -0
  563. package/src/mcp/default-runtime.ts +1034 -0
  564. package/src/mcp/envelope.ts +57 -0
  565. package/src/mcp/index.ts +28 -0
  566. package/src/mcp/output-schemas.ts +3071 -0
  567. package/src/mcp/path-sandbox.ts +156 -0
  568. package/src/mcp/server.ts +358 -0
  569. package/src/mcp/stdio.ts +92 -0
  570. package/src/mcp/tools.ts +563 -0
  571. package/src/mcp/types.ts +66 -0
@@ -0,0 +1,206 @@
1
+ import { emitKeypressEvents, type Key } from "node:readline";
2
+
3
+ import { OperationalError } from "../../cli/exit.js";
4
+
5
+ export interface WizardChoice<T extends string> {
6
+ value: T;
7
+ label: string;
8
+ detail?: string;
9
+ }
10
+
11
+ export interface WizardTerminal {
12
+ readonly interactive: boolean;
13
+ choose<T extends string>(question: string, choices: readonly WizardChoice<T>[]): Promise<T>;
14
+ input(question: string, initial?: string): Promise<string>;
15
+ message(text: string): void;
16
+ }
17
+
18
+ export interface WizardInput {
19
+ isTTY?: boolean;
20
+ isRaw?: boolean;
21
+ setRawMode(mode: boolean): unknown;
22
+ isPaused(): boolean;
23
+ resume(): unknown;
24
+ pause(): unknown;
25
+ on(event: "keypress", listener: (text: string | undefined, key: Key) => void): unknown;
26
+ on(event: "end" | "close", listener: () => void): unknown;
27
+ removeListener(
28
+ event: "keypress",
29
+ listener: (text: string | undefined, key: Key) => void,
30
+ ): unknown;
31
+ removeListener(event: "end" | "close", listener: () => void): unknown;
32
+ }
33
+
34
+ /** Project strings never get to send control sequences to the terminal. */
35
+ export function terminalText(text: string): string {
36
+ return text.replace(/\p{Cc}/gu, " ");
37
+ }
38
+
39
+ function cancelled(): Error {
40
+ return new DOMException("Setup cancelled before the next action.", "AbortError");
41
+ }
42
+
43
+ const graphemes = new Intl.Segmenter("en", { granularity: "grapheme" });
44
+ const wideCell =
45
+ /\p{Extended_Pictographic}|[\u1100-\u115f\u2329\u232a\u2e80-\ua4cf\uac00-\ud7a3\uf900-\ufaff\ufe10-\ufe19\ufe30-\ufe6f\uff00-\uff60\uffe0-\uffe6\u{20000}-\u{3fffd}]/u;
46
+
47
+ /** Keep grapheme clusters intact and account for ordinary double-width terminal cells. */
48
+ export function wrapTerminalFrame(frame: string, columns: number): string {
49
+ return frame
50
+ .split("\n")
51
+ .map((line) => {
52
+ const rows: string[] = [];
53
+ let current = "",
54
+ width = 0;
55
+ for (const { segment } of graphemes.segment(line)) {
56
+ const cells = /^\p{Mark}+$/u.test(segment) ? 0 : wideCell.test(segment) ? 2 : 1;
57
+ if (width + cells > columns && current) {
58
+ rows.push(current);
59
+ current = "";
60
+ width = 0;
61
+ }
62
+ current += segment;
63
+ width += cells;
64
+ }
65
+ rows.push(current);
66
+ return rows.join("\n");
67
+ })
68
+ .join("\n");
69
+ }
70
+
71
+ /** Each prompt owns its listeners/raw mode only until a choice is made. */
72
+ export function createWizardTerminal(options: {
73
+ input?: WizardInput;
74
+ write: (text: string) => void;
75
+ signal: AbortSignal;
76
+ columns?: number;
77
+ }): WizardTerminal {
78
+ const input: WizardInput = options.input ?? process.stdin;
79
+ const write = options.write;
80
+ if (input === process.stdin) emitKeypressEvents(process.stdin);
81
+
82
+ async function prompt<T>(
83
+ render: () => string,
84
+ handle: (text: string | undefined, key: Key) => { value: T } | undefined,
85
+ ): Promise<T> {
86
+ options.signal.throwIfAborted();
87
+ const wasRaw = input.isRaw === true;
88
+ const wasPaused = input.isPaused();
89
+ let rows = 0;
90
+ const redraw = (): void => {
91
+ if (rows > 0) write(`\x1b[${String(rows)}A\r\x1b[J`);
92
+ const available = options.columns ?? process.stderr.columns;
93
+ const columns = Math.max(8, available !== undefined && available > 0 ? available : 80) - 1;
94
+ const display = wrapTerminalFrame(render(), columns);
95
+ rows = display.split("\n").length - 1;
96
+ write(display);
97
+ };
98
+ return new Promise<T>((resolve, reject) => {
99
+ let finished = false;
100
+ const cleanup = (): void => {
101
+ input.removeListener("keypress", onKey);
102
+ input.removeListener("end", onEnd);
103
+ input.removeListener("close", onEnd);
104
+ options.signal.removeEventListener("abort", onAbort);
105
+ try {
106
+ input.setRawMode(wasRaw);
107
+ } finally {
108
+ if (wasPaused) input.pause();
109
+ }
110
+ };
111
+ const finish = (result: { value: T } | { error: unknown }): void => {
112
+ if (finished) return;
113
+ finished = true;
114
+ try {
115
+ cleanup();
116
+ } catch (error) {
117
+ reject(
118
+ new OperationalError(
119
+ "Could not restore the terminal after setup.",
120
+ "Run `stty sane` in this terminal.",
121
+ { cause: error },
122
+ ),
123
+ );
124
+ return;
125
+ }
126
+ if ("error" in result) reject(result.error);
127
+ else resolve(result.value);
128
+ };
129
+ const onEnd = (): void => finish({ error: cancelled() });
130
+ const onAbort = (): void => finish({ error: options.signal.reason ?? cancelled() });
131
+ const onKey = (text: string | undefined, key: Key): void => {
132
+ if (key.name === "escape" || (key.ctrl && (key.name === "c" || key.name === "d"))) {
133
+ finish({ error: cancelled() });
134
+ return;
135
+ }
136
+ try {
137
+ const result = handle(text, key);
138
+ if (result !== undefined) finish(result);
139
+ else redraw();
140
+ } catch (error) {
141
+ finish({ error });
142
+ }
143
+ };
144
+ try {
145
+ input.on("keypress", onKey);
146
+ input.on("end", onEnd);
147
+ input.on("close", onEnd);
148
+ options.signal.addEventListener("abort", onAbort, { once: true });
149
+ input.setRawMode(true);
150
+ input.resume();
151
+ if (options.signal.aborted) onAbort();
152
+ else redraw();
153
+ } catch (error) {
154
+ finish({ error });
155
+ }
156
+ });
157
+ }
158
+
159
+ return {
160
+ interactive: input.isTTY === true,
161
+ message(text) {
162
+ write(`${text.split("\n").map(terminalText).join("\n")}\n`);
163
+ },
164
+ choose<T extends string>(question: string, choices: readonly WizardChoice<T>[]): Promise<T> {
165
+ if (choices.length === 0) throw new Error("A setup choice requires at least one option.");
166
+ let selected = 0;
167
+ return prompt(
168
+ () =>
169
+ `\n${terminalText(question)}\n` +
170
+ choices
171
+ .map(
172
+ (choice, i) =>
173
+ `${i === selected ? ">" : " "} ${terminalText(choice.label)}\n` +
174
+ (i === selected && choice.detail ? ` ${terminalText(choice.detail)}\n` : ""),
175
+ )
176
+ .join("") +
177
+ "Up/Down or j/k, Enter to select, Esc to cancel.\n",
178
+ (_text, key) => {
179
+ if (key.name === "return" || key.name === "enter") {
180
+ return { value: choices[selected]!.value };
181
+ }
182
+ if (key.name === "up" || key.name === "k")
183
+ selected = (selected + choices.length - 1) % choices.length;
184
+ if (key.name === "down" || key.name === "j") selected = (selected + 1) % choices.length;
185
+ return undefined;
186
+ },
187
+ );
188
+ },
189
+ input(question, initial = ""): Promise<string> {
190
+ let value = terminalText(initial);
191
+ return prompt(
192
+ () =>
193
+ `\n${terminalText(question)}\n> ${value}\nEnter to accept, Ctrl-U to clear, Esc to cancel.\n`,
194
+ (text, key) => {
195
+ if (key.name === "return" || key.name === "enter") return { value: value.trim() };
196
+ if (key.ctrl && key.name === "u") value = "";
197
+ else if (key.name === "backspace") value = Array.from(value).slice(0, -1).join("");
198
+ else if (!key.ctrl && !key.meta && text !== undefined && !/\p{Cc}/u.test(text)) {
199
+ if (value.length + text.length <= 4096) value += text;
200
+ }
201
+ return undefined;
202
+ },
203
+ );
204
+ },
205
+ };
206
+ }
@@ -0,0 +1,450 @@
1
+ /** Terminal-only setup orchestration; the library also supports scriptable backend selection. */
2
+ import { spawn } from "node:child_process";
3
+ import { pathToFileURL } from "node:url";
4
+
5
+ import { discoverSddArtifacts, type SddConnectionReportV1 } from "@untangle-code/core";
6
+ import { NodeFileSystem } from "@untangle-code/scanner/node-fs";
7
+
8
+ import type { CommandContext } from "../../cli/command.js";
9
+ import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
10
+ import { note } from "../../cli/io.js";
11
+ import { MANAGED_QDRANT_URL } from "../../cli/vector-store-policy.js";
12
+ import { writeFeatureMap } from "../graph/feature-map.js";
13
+ import { writeSddConnection } from "../sdd.js";
14
+
15
+ import {
16
+ applyIntegrationSetup,
17
+ integrationCatalog,
18
+ planIntegrationSetup,
19
+ type IntegrationSelectionV1,
20
+ type IntegrationSetupPlanV1,
21
+ } from "./integrations.js";
22
+ import { runInit, type InitDepsV1, type InitOptionsV1 } from "./run.js";
23
+ import { inspectInitStorage } from "./storage.js";
24
+ import type { InitResultV1 } from "./types.js";
25
+ import type { WizardTerminal } from "./wizard-terminal.js";
26
+
27
+ export interface InitWizardDepsV1 {
28
+ terminal: WizardTerminal;
29
+ initialize?: typeof runInit;
30
+ planIntegrations?: typeof planIntegrationSetup;
31
+ applyIntegrations?: typeof applyIntegrationSetup;
32
+ writeMap?: typeof writeFeatureMap;
33
+ openBrowser?: (filePath: string, signal: AbortSignal) => Promise<void>;
34
+ discoverSdd?: typeof discoverSddArtifacts;
35
+ writeSdd?: typeof writeSddConnection;
36
+ }
37
+
38
+ /** Open only a generated local file URL; no shell or project-supplied executable. */
39
+ export async function openSetupMap(filePath: string, signal: AbortSignal): Promise<void> {
40
+ signal.throwIfAborted();
41
+ const url = pathToFileURL(filePath).href;
42
+ const [command, ...args] =
43
+ process.platform === "darwin"
44
+ ? ["open", url]
45
+ : process.platform === "win32"
46
+ ? ["rundll32.exe", "url.dll,FileProtocolHandler", url]
47
+ : ["xdg-open", url];
48
+ await new Promise<void>((resolve, reject) => {
49
+ const child = spawn(command!, args, { stdio: "ignore", signal });
50
+ const timeout = setTimeout(() => {
51
+ child.kill();
52
+ reject(new Error("Browser launcher timed out; open the saved HTML file directly."));
53
+ }, 10_000);
54
+ child.once("error", (error) => {
55
+ clearTimeout(timeout);
56
+ reject(error);
57
+ });
58
+ child.once("close", (code) => {
59
+ clearTimeout(timeout);
60
+ if (code === 0) resolve();
61
+ else reject(new Error(`Browser launcher exited with ${String(code)}.`));
62
+ });
63
+ });
64
+ }
65
+
66
+ async function optionalPath(
67
+ terminal: WizardTerminal,
68
+ label: string,
69
+ current?: string,
70
+ ): Promise<string | undefined> {
71
+ return (
72
+ (
73
+ await terminal.input(`${label} (relative path; leave blank to use discovery)`, current)
74
+ ).trim() || undefined
75
+ );
76
+ }
77
+
78
+ async function collectSelections(
79
+ terminal: WizardTerminal,
80
+ backend: "lancedb" | "qdrant",
81
+ ): Promise<IntegrationSelectionV1[]> {
82
+ const selections: IntegrationSelectionV1[] = [];
83
+ const offers = integrationCatalog();
84
+ for (;;) {
85
+ const sonarSelected = selections.some(
86
+ (selection) => selection.id === "sonarqube-local" || selection.id === "sonarqube-existing",
87
+ );
88
+ const remaining = offers.filter(
89
+ (offer) =>
90
+ !selections.some((selection) => selection.id === offer.id) &&
91
+ (backend === "qdrant" || offer.id !== "local-search") &&
92
+ !(sonarSelected && (offer.id === "sonarqube-local" || offer.id === "sonarqube-existing")),
93
+ );
94
+ if (remaining.length === 0) return selections;
95
+ const id = await terminal.choose("Add an analyzer or local search service?", [
96
+ {
97
+ value: "done",
98
+ label:
99
+ selections.length === 0
100
+ ? "Continue without external tools"
101
+ : "Continue with these selections",
102
+ },
103
+ ...remaining.map((offer) => ({
104
+ value: offer.id,
105
+ label: offer.label,
106
+ detail: offer.description,
107
+ })),
108
+ ]);
109
+ if (id === "done") return selections;
110
+ const offer = offers.find((candidate) => candidate.id === id)!;
111
+ terminal.message(`${offer.licenseSummary}\n${offer.documentation}`);
112
+ const selection: IntegrationSelectionV1 = { id: offer.id };
113
+ if (offer.id === "sonarqube-local" || offer.id === "sonarqube-existing") {
114
+ if (offer.id === "sonarqube-existing")
115
+ selection.endpoint = await terminal.input("SonarQube server URL", "http://127.0.0.1:9000");
116
+ selection.projectKey = await terminal.input(
117
+ "Sonar project key (blank: configure after server setup)",
118
+ );
119
+ selection.tokenEnvVar = await terminal.input(
120
+ "Environment variable containing the Sonar token (name only)",
121
+ "SONAR_TOKEN",
122
+ );
123
+ }
124
+ if (offer.id === "custom") {
125
+ selection.manifestPath = await terminal.input(
126
+ "Reviewed extension manifest path or HTTPS URL",
127
+ );
128
+ const digest = await terminal.input(
129
+ "Manifest sha256 digest (required for HTTPS; blank for local file)",
130
+ );
131
+ if (digest) selection.manifestDigest = digest;
132
+ selection.allowProjectLocal =
133
+ (await terminal.choose("Allow this explicitly selected project-local manifest?", [
134
+ { value: "no", label: "No — preserve the existing project trust boundary" },
135
+ {
136
+ value: "yes",
137
+ label: "Yes — I reviewed this manifest and trust its executable/endpoint",
138
+ },
139
+ ])) === "yes";
140
+ }
141
+ if (offer.requiresLicenseAcknowledgment) {
142
+ selection.acknowledgeLicense =
143
+ (await terminal.choose("Acknowledge the displayed license terms for this selected tool?", [
144
+ { value: "no", label: "No — leave this tool unacknowledged" },
145
+ { value: "yes", label: "Yes — I reviewed the applicable terms" },
146
+ ])) === "yes";
147
+ }
148
+ selections.push(selection);
149
+ }
150
+ }
151
+
152
+ function showPlan(
153
+ terminal: WizardTerminal,
154
+ plan: IntegrationSetupPlanV1,
155
+ result: InitResultV1,
156
+ map: boolean,
157
+ ): void {
158
+ terminal.message(
159
+ `\nSetup review\nProject: ${result.findings.root}\nConfiguration: ${result.configPath}\nConfiguration action: ${result.outcome}\nSearch storage: ${result.findings.storage?.backend ?? "qdrant"}${result.findings.storage?.directory === undefined ? "" : ` at ${result.findings.storage.directory}`}\nFeature/code map: ${map ? "create locally under .untangle/feature-map" : "skip"}`,
160
+ );
161
+ for (const item of plan.items) {
162
+ terminal.message(`\n${item.label}`);
163
+ for (const file of item.files) terminal.message(`Write/preserve: ${file.relativePath}`);
164
+ for (const download of item.downloads)
165
+ terminal.message(`Download only if executed: ${download.url}\nSHA256: ${download.sha256}`);
166
+ for (const command of item.commands)
167
+ terminal.message(
168
+ `Action only if executed: ${[command.command, ...command.args].map((part) => JSON.stringify(part)).join(" ")}\n${command.purpose}`,
169
+ );
170
+ for (const blocker of item.blockers) terminal.message(`Needs attention: ${blocker}`);
171
+ }
172
+ terminal.message(
173
+ "No tests will run. Feature ownership remains declared; missing evidence remains visible.",
174
+ );
175
+ }
176
+
177
+ export async function runInitWizard(
178
+ ctx: CommandContext,
179
+ initialOptions: InitOptionsV1,
180
+ initDeps: InitDepsV1,
181
+ deps: InitWizardDepsV1,
182
+ ): Promise<{ result: InitResultV1 | null; exitCode: number }> {
183
+ const terminal = deps.terminal;
184
+ if (!terminal.interactive)
185
+ throw new UsageError(
186
+ "Interactive setup needs a terminal on stdin and stderr.",
187
+ "Use `untangle init --no-interactive` for pipes or agents.",
188
+ );
189
+ const mode = await terminal.choose("How do you want to start?", [
190
+ {
191
+ value: "quick",
192
+ label: "Quick setup — local code, feature map and optional tools",
193
+ detail:
194
+ "Start without a spec or external services; add declared feature boundaries when ready.",
195
+ },
196
+ {
197
+ value: "spec",
198
+ label: "Spec-driven setup — select intent and feature declarations",
199
+ detail:
200
+ "Link existing vision/specification documents and an explicitly declared feature map.",
201
+ },
202
+ ]);
203
+ let options = { ...initialOptions };
204
+ const storage = await inspectInitStorage(
205
+ initDeps.fs ?? new NodeFileSystem(),
206
+ options.root,
207
+ options.storageBackend,
208
+ initDeps.env ?? ctx.env,
209
+ ctx.signal,
210
+ );
211
+ if (options.storageBackend === undefined) {
212
+ const choices = [
213
+ {
214
+ value: "lancedb",
215
+ label: "LanceDB — embedded local index (recommended)",
216
+ detail: "Local files in the configured index directory; no Docker or database service.",
217
+ },
218
+ {
219
+ value: "qdrant",
220
+ label: "Qdrant — owned local service",
221
+ detail: "Use or explicitly prepare isolated Qdrant/Ollama services.",
222
+ },
223
+ {
224
+ value: "qdrant-external",
225
+ label: "Qdrant — connect an existing server",
226
+ detail: "Choose your server URL explicitly; Untangle does not provision it.",
227
+ },
228
+ ];
229
+ const current =
230
+ storage.backend === "lancedb"
231
+ ? "lancedb"
232
+ : storage.qdrantMode === "external"
233
+ ? "qdrant-external"
234
+ : "qdrant";
235
+ choices.sort((left, right) => Number(right.value === current) - Number(left.value === current));
236
+ const choice = await terminal.choose("Where should the search index live?", choices);
237
+ options = { ...options, storageBackend: choice === "lancedb" ? "lancedb" : "qdrant" };
238
+ if (choice !== "lancedb") {
239
+ const external = choice === "qdrant-external";
240
+ const url = external
241
+ ? await terminal.input("Qdrant server URL", storage.qdrantUrl ?? "http://127.0.0.1:6333")
242
+ : MANAGED_QDRANT_URL;
243
+ initDeps = {
244
+ ...initDeps,
245
+ env: {
246
+ ...(initDeps.env ?? ctx.env),
247
+ UNTANGLE_STORAGE_BACKEND: "qdrant",
248
+ UNTANGLE_QDRANT_MODE: external ? "external" : "managed",
249
+ UNTANGLE_QDRANT_URL: url,
250
+ },
251
+ };
252
+ }
253
+ }
254
+ if (mode === "spec") {
255
+ const visionPath = await optionalPath(terminal, "Vision document", options.visionPath);
256
+ const specPath = await optionalPath(terminal, "Specification document", options.specPath);
257
+ const featureManifestPath = await optionalPath(
258
+ terminal,
259
+ "Feature manifest",
260
+ options.featureManifestPath,
261
+ );
262
+ delete options.visionPath;
263
+ delete options.specPath;
264
+ delete options.featureManifestPath;
265
+ options = {
266
+ ...options,
267
+ ...(visionPath ? { visionPath } : {}),
268
+ ...(specPath ? { specPath } : {}),
269
+ ...(featureManifestPath ? { featureManifestPath } : {}),
270
+ };
271
+ }
272
+ let sdd: SddConnectionReportV1 | undefined;
273
+ if (mode === "spec" && options.featureManifestPath === undefined) {
274
+ const discover = deps.discoverSdd ?? discoverSddArtifacts;
275
+ const discoveryOptions = {
276
+ root: options.root,
277
+ signal: ctx.signal,
278
+ ...(initDeps.fs === undefined ? {} : { fs: initDeps.fs }),
279
+ };
280
+ const detected = await discover({ ...discoveryOptions, framework: "auto" });
281
+ ctx.signal.throwIfAborted();
282
+ if (detected.frameworks.length > 0) {
283
+ const framework = await terminal.choose("Connect detected spec-driven artifacts?", [
284
+ { value: "none", label: "Keep manual context; do not create a connector draft" },
285
+ ...detected.frameworks.map((id) => ({
286
+ value: id,
287
+ label:
288
+ id === "spec-kit"
289
+ ? "Spec Kit — inspect specs, plans and tasks"
290
+ : "OpenSpec — inspect capabilities and changes",
291
+ })),
292
+ ...(detected.frameworks.length > 1
293
+ ? [
294
+ {
295
+ value: "auto",
296
+ label: "Connect both frameworks with separate proposed feature identities",
297
+ },
298
+ ]
299
+ : []),
300
+ ]);
301
+ if (framework !== "none") {
302
+ sdd =
303
+ framework === "auto"
304
+ ? detected
305
+ : await discover({
306
+ ...discoveryOptions,
307
+ framework: framework as "spec-kit" | "openspec",
308
+ });
309
+ ctx.signal.throwIfAborted();
310
+ terminal.message(
311
+ `SDD preview: ${sdd.status}; ${String(sdd.features.length)} proposed features. After confirmation, save a source-bound draft under .untangle/sdd/. No framework commands or tests will run. Implementation and ownership remain unconfirmed.`,
312
+ );
313
+ for (const issue of sdd.issues)
314
+ terminal.message(`${issue.code}: ${issue.path}: ${issue.message}`);
315
+ if (sdd.status === "stale")
316
+ throw new OperationalError(
317
+ "SDD sources changed during preview; restart setup before applying any actions.",
318
+ );
319
+ }
320
+ }
321
+ }
322
+ terminal.message("Inspecting local sources and declared context; nothing has been written.");
323
+ const initialize = deps.initialize ?? runInit;
324
+ const preview = await initialize({ ...options, dryRun: true }, initDeps);
325
+ ctx.signal.throwIfAborted();
326
+ if (preview.configErrors.length > 0) {
327
+ for (const error of preview.configErrors) terminal.message(error);
328
+ return { result: preview, exitCode: EXIT.operational };
329
+ }
330
+ terminal.message(
331
+ `Project: ${preview.findings.projectId}\nLanguages: ${preview.findings.languages.entries.map((entry) => entry.languageId).join(", ") || "none recognized"}\nProduct context: ${preview.findings.productContext?.status ?? "not assessed"}\nFeature evidence: ${preview.findings.featureAlignment?.status ?? "not assessed"}`,
332
+ );
333
+ if (preview.outcome === "would-overwrite" && !options.force) {
334
+ terminal.message(`Existing configuration differs: ${preview.configPath}`);
335
+ for (const change of preview.changes)
336
+ terminal.message(`${change.kind === "added" ? "+" : "-"} ${change.line}`);
337
+ const replace = await terminal.choose("Keep or replace the existing configuration?", [
338
+ { value: "keep", label: "Keep existing configuration and stop without writes" },
339
+ { value: "replace", label: "Replace it with the displayed detection result" },
340
+ ]);
341
+ if (replace === "keep") return { result: null, exitCode: EXIT.ok };
342
+ options = { ...options, force: true };
343
+ }
344
+ const selections = await collectSelections(terminal, options.storageBackend ?? storage.backend);
345
+ const map =
346
+ (await terminal.choose("Create a local feature/code map?", [
347
+ {
348
+ value: "yes",
349
+ label: "Yes — interactive 3D local HTML and JSON evidence",
350
+ detail:
351
+ "Declared features, code/tests, ownership and gaps; no index or cloud service needed.",
352
+ },
353
+ { value: "no", label: "Skip the map for now" },
354
+ ])) === "yes";
355
+ const openMap =
356
+ map &&
357
+ (await terminal.choose("Open the feature/code map after setup?", [
358
+ { value: "no", label: "Save the map; I will open it when ready" },
359
+ { value: "yes", label: "Open the generated local map in my browser" },
360
+ ])) === "yes";
361
+ const plan = (deps.planIntegrations ?? planIntegrationSetup)({
362
+ root: preview.findings.root,
363
+ selections,
364
+ offline: options.offline,
365
+ });
366
+ showPlan(terminal, plan, preview, map);
367
+ if (sdd !== undefined)
368
+ terminal.message(
369
+ `SDD review draft: ${sdd.frameworks.join(", ")} → .untangle/sdd/ (${String(sdd.features.length)} proposed features). Existing feature declarations are preserved. The selected draft will be used for this setup's feature report and map.`,
370
+ );
371
+ const actions =
372
+ plan.items.length > 0 && !options.offline
373
+ ? [
374
+ { value: "prepare", label: "Prepare config and recipes only; download/start nothing" },
375
+ { value: "execute", label: "Apply config and execute the displayed tool setup" },
376
+ { value: "cancel", label: "Cancel without writes" },
377
+ ]
378
+ : [
379
+ { value: "prepare", label: "Apply this local setup" },
380
+ { value: "cancel", label: "Cancel without writes" },
381
+ ];
382
+ const action = await terminal.choose("Apply this setup?", actions);
383
+ if (action === "cancel") return { result: null, exitCode: EXIT.cancelled };
384
+ ctx.signal.throwIfAborted();
385
+ // Children run only after prompt cleanup restored the original terminal mode.
386
+ const integrations = await (deps.applyIntegrations ?? applyIntegrationSetup)(plan, {
387
+ execute: action === "execute",
388
+ signal: ctx.signal,
389
+ env: ctx.env,
390
+ });
391
+ note(ctx.io, `Setup evidence: ${integrations.reportPath}`);
392
+ for (const item of integrations.items) {
393
+ note(ctx.io, `${item.id}: ${item.status}`);
394
+ for (const next of item.nextSteps) note(ctx.io, next);
395
+ }
396
+ if (integrations.items.some((item) => item.status === "failed"))
397
+ throw new OperationalError(
398
+ "A selected tool setup failed; configuration was not changed.",
399
+ `Inspect ${integrations.reportPath} before retrying; completed files and services were preserved.`,
400
+ );
401
+ if (sdd !== undefined) {
402
+ const connected = await (deps.writeSdd ?? writeSddConnection)(sdd, { signal: ctx.signal });
403
+ ctx.signal.throwIfAborted();
404
+ if (connected.manifestPath !== null) {
405
+ options = { ...options, featureManifestPath: connected.manifestPath };
406
+ note(ctx.io, `SDD review manifest: ${connected.manifestPath}`);
407
+ note(ctx.io, `SDD source evidence: ${connected.reportPath!}`);
408
+ } else
409
+ note(ctx.io, "No SDD feature draft was saved; inspect the connector's missing evidence.");
410
+ }
411
+ const localSearchInstalled = integrations.items.some(
412
+ (item) => item.id === "local-search" && item.status === "installed",
413
+ );
414
+ const configuredDeps = localSearchInstalled
415
+ ? {
416
+ ...initDeps,
417
+ env: {
418
+ ...(initDeps.env ?? ctx.env),
419
+ UNTANGLE_QDRANT_URL: "http://127.0.0.1:16333",
420
+ UNTANGLE_OLLAMA_URL: "http://127.0.0.1:11435",
421
+ },
422
+ }
423
+ : initDeps;
424
+ const result = await initialize({ ...options, dryRun: false }, configuredDeps);
425
+ if (result.exitCode !== EXIT.ok) return { result, exitCode: result.exitCode };
426
+ if (map) {
427
+ terminal.message("Building the local feature/code map from current sources.");
428
+ const artifact = await (deps.writeMap ?? writeFeatureMap)({
429
+ root: preview.findings.root,
430
+ ...(options.featureManifestPath ? { manifestPath: options.featureManifestPath } : {}),
431
+ signal: ctx.signal,
432
+ });
433
+ note(ctx.io, `Feature/code map: ${artifact.htmlPath}`);
434
+ note(ctx.io, `Map evidence: ${artifact.jsonPath}`);
435
+ note(ctx.io, `Feature evidence: ${artifact.summary.status}; no semantic conformance inferred.`);
436
+ if (openMap) {
437
+ try {
438
+ await (deps.openBrowser ?? openSetupMap)(artifact.htmlPath, ctx.signal);
439
+ } catch (error) {
440
+ if (ctx.signal.aborted) throw error;
441
+ note(
442
+ ctx.io,
443
+ `Map saved; browser could not be opened: ${error instanceof Error ? error.message : String(error)}. Open the HTML path above directly.`,
444
+ );
445
+ }
446
+ }
447
+ }
448
+ ctx.signal.throwIfAborted();
449
+ return { result, exitCode: EXIT.ok };
450
+ }