@untangle-code/cli 0.0.0-stage → 0.1.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 (571) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +424 -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,562 @@
1
+ /**
2
+ * `untangle graph` — der Dateiabhaengigkeitsgraph als Oberflaeche.
3
+ *
4
+ * Er baut nichts. Er LIEST, was `untangle index` gebaut und abgelegt hat
5
+ * (Stufe `building_graphs`), und beantwortet damit vier Fragen:
6
+ *
7
+ * 1. Wovon haengt diese Datei ab, und wer haengt an ihr — transitiv, in
8
+ * beide Richtungen.
9
+ * 2. Wo hoert die Antwort auf? Jede Traversierung hat ein Budget, und ein
10
+ * abgeschnittenes Ergebnis sagt DASS und WARUM
11
+ * (`TRAVERSAL_TRUNCATION_REASONS`).
12
+ * 3. Wo laeuft es im Kreis? Zyklen werden GEMELDET, nie stillschweigend
13
+ * aufgebrochen.
14
+ * 4. Was liess sich nicht aufloesen? Jeder solche Import steht mit seinem
15
+ * ROHSTRING und einem benannten Grund da (E4).
16
+ *
17
+ * Und ueber allem die Monorepo-Ebene: welches Paket, welcher Container-Dienst,
18
+ * welche Kante ueberquert welche Grenze. Der Dateigraph traegt das bereits in
19
+ * `FileEdgeBoundaryV1` und in seiner Topologie; dieser Befehl zeigt es.
20
+ */
21
+ import path from "node:path";
22
+
23
+ import type { FileNodeV1, TraversalLimitsV1 } from "@untangle-code/domain";
24
+ import { DEFAULT_TRAVERSAL_LIMITS, type RestoredFileGraph } from "@untangle-code/file-graph";
25
+ import {
26
+ DEFAULT_MAX_EDGES,
27
+ DEFAULT_MAX_NODES,
28
+ MAX_MAX_EDGES,
29
+ MAX_MAX_NODES,
30
+ writeGraphExplorerHtml,
31
+ type GraphExplorerLayoutKind,
32
+ } from "@untangle-code/graph-explorer";
33
+
34
+ import {
35
+ enumFlag,
36
+ integerFlag,
37
+ stringFlag,
38
+ type FlagSpecs,
39
+ type ParsedArgs,
40
+ } from "../../cli/args.js";
41
+ import type { Command, CommandContext } from "../../cli/command.js";
42
+ import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
43
+ import { loadGraphs } from "../../cli/graphs.js";
44
+ import { line, note } from "../../cli/io.js";
45
+ import { MAX_GRAPH_QUERY_EDGES } from "../flow/limits.js";
46
+
47
+ import { runBoundaries } from "./boundaries.js";
48
+ import { boundDirectEdges } from "./bounds.js";
49
+ import { runFeatureMap } from "./feature-map.js";
50
+ import {
51
+ countBoundaries,
52
+ describeNode,
53
+ renderFileView,
54
+ renderIssues,
55
+ renderOverview,
56
+ type GraphDirectionChoice,
57
+ } from "./render.js";
58
+ import { selectFileNode } from "./select.js";
59
+
60
+ const FLAGS: FlagSpecs = {
61
+ "feature-map": {
62
+ kind: "string",
63
+ placeholder: "JSON",
64
+ describe: "graph features: explicit declared feature manifest; default untangle.features.json.",
65
+ },
66
+ "test-evidence": {
67
+ kind: "string",
68
+ placeholder: "JSON",
69
+ describe: "graph features: existing source-bound test evidence; does not run tests.",
70
+ },
71
+ services: {
72
+ kind: "string",
73
+ placeholder: "JSON",
74
+ describe:
75
+ "graph boundaries: explicit local HTTP service bindings; default .untangle/services.json.",
76
+ },
77
+ path: {
78
+ kind: "string",
79
+ placeholder: "FILE",
80
+ describe:
81
+ "graph boundaries: one repository-relative file; full route inventory is still analyzed.",
82
+ },
83
+ "max-relations": {
84
+ kind: "number",
85
+ placeholder: "N",
86
+ describe: "graph boundaries: output relations per section (1..1000).",
87
+ },
88
+ root: {
89
+ kind: "string",
90
+ placeholder: "PATH",
91
+ describe: "Project directory; configuration is discovered from here.",
92
+ defaultLabel: "current directory",
93
+ },
94
+ direction: {
95
+ kind: "string",
96
+ placeholder: "both|dependencies|dependents",
97
+ describe: "Dependencies, dependents, or both.",
98
+ defaultLabel: "both",
99
+ },
100
+ depth: {
101
+ kind: "number",
102
+ placeholder: "N",
103
+ describe: "Transitive depth. Output reports when the limit is reached (max_depth).",
104
+ defaultLabel: "3",
105
+ },
106
+ "max-nodes": {
107
+ kind: "number",
108
+ placeholder: "N",
109
+ describe: "Node budget for traversal or the offline explorer; truncation remains visible.",
110
+ defaultLabel: `${String(DEFAULT_TRAVERSAL_LIMITS.maxNodes)} (query), ${String(DEFAULT_MAX_NODES)} (Explorer)`,
111
+ },
112
+ "max-edges": {
113
+ kind: "number",
114
+ placeholder: "N",
115
+ describe: "Edge budget for a file query or the offline explorer; truncation remains visible.",
116
+ defaultLabel: `${String(MAX_GRAPH_QUERY_EDGES)} (query), ${String(DEFAULT_MAX_EDGES)} (Explorer)`,
117
+ },
118
+ layout: {
119
+ kind: "string",
120
+ placeholder: "repository-lanes|grid|circle",
121
+ describe: "Deterministic initial layout for the offline explorer.",
122
+ defaultLabel: "repository-lanes",
123
+ },
124
+ out: {
125
+ kind: "string",
126
+ placeholder: "FILE",
127
+ describe: "Explicit output target for `graph visualize`; no implicit write target.",
128
+ },
129
+ limit: {
130
+ kind: "number",
131
+ alias: "n",
132
+ placeholder: "N",
133
+ describe: "Maximum individually listed cycles, unresolved imports and ledger entries.",
134
+ defaultLabel: "20",
135
+ },
136
+ format: {
137
+ kind: "string",
138
+ placeholder: "text|json",
139
+ describe: "Output format. json contains the same information in machine-readable form.",
140
+ defaultLabel: "text",
141
+ },
142
+ };
143
+
144
+ export const graphCommand: Command = {
145
+ spec: {
146
+ name: "graph",
147
+ implementedBy: "commands/graph/index.js",
148
+ summary: "Show file dependencies",
149
+ usage:
150
+ "untangle graph [<file>] [--direction=both] [--depth=N] [--max-edges=N] [--format=text|json]\n untangle graph visualize --out=<FILE> [--layout=repository-lanes|grid|circle]\n untangle graph boundaries [--path=FILE] [--services=JSON] [--format=json]\n untangle graph features [--feature-map=JSON] [--test-evidence=JSON] [--format=json]",
151
+ details: [
152
+ "graph features writes a local interactive feature/code map and source-bound JSON under the target project's .untangle/feature-map directory. It reads current sources without an index or search services. Features, tests, intent, ownership and dependencies remain declarations with explicit evidence gaps. It runs no tests and opens no browser. Zoom, filters, node details and a keyboard-accessible list work offline.",
153
+ "graph boundaries reads current local sources without an index: Vue/TS/JS import context, HTTP requests, FastAPI route registration and declared feature ownership. Explicit service bindings prevent equal paths from silently joining unrelated services. Unknown and ambiguous transport dependencies remain visible; they are not synchronous call edges.",
154
+ "Without a file: overview of nodes, edges, import-resolution rate, monorepo topology (manifest packages, compose services and their edges), cycles, central files, unresolved imports and the graph-build skip ledger.",
155
+ "With a file: dependency and dependent trees in both directions. Each edge identifies its resolution mechanism and any package, repository or container boundary it crosses.",
156
+ "Limits remain visible: transitive depth is bounded (--depth, default 3). Reaching it reports the number of unvisited neighbors and the max_depth reason. Node, edge and time budgets behave likewise. A truncated result never appears complete.",
157
+ "Cycles are reported without breaking them: a closing path is marked at its location and shown in full at the end.",
158
+ "Unresolved imports remain visible with their raw string, reason and checked/rejected candidates.",
159
+ "Reads the stored graph, not the working tree. A missing graph produces exit code 4 and points to `untangle index`; it never claims there are no dependencies.",
160
+ "Offline explorer: `graph visualize` writes only the self-contained HTML artifact explicitly selected with --out. It contains graph metadata, no source text or network requests. Nothing is written without an explicit target.",
161
+ ],
162
+ flags: FLAGS,
163
+ examples: [
164
+ "untangle graph",
165
+ "untangle graph features --format=json",
166
+ "untangle graph packages/domain/src/index.ts --direction=dependents",
167
+ "untangle graph src/app.ts --depth=1",
168
+ "untangle graph --format=json",
169
+ "untangle graph visualize --out=artifacts/graph.html --layout=repository-lanes",
170
+ ],
171
+ exitCodes: [
172
+ [EXIT.ok, "The graph was read and displayed."],
173
+ [EXIT.operational, "Operational error, or the selected file is absent from the graph."],
174
+ [EXIT.usage, "Usage error, or the selected file is ambiguous."],
175
+ [EXIT.environment, "No graph is available; run `untangle index`."],
176
+ ],
177
+ },
178
+
179
+ async run(ctx: CommandContext, args: ParsedArgs): Promise<number> {
180
+ const format = enumFlag(args, "format", ["text", "json"] as const, "text");
181
+ const target = args.positionals[0];
182
+ if (args.positionals.length > 1) {
183
+ throw new UsageError(
184
+ `The graph command accepts at most one positional argument; received ${String(args.positionals.length)}.`,
185
+ "Use `untangle graph <file>` or `untangle graph visualize --out=<FILE>`.",
186
+ );
187
+ }
188
+ if (target === "boundaries") {
189
+ for (const flag of ["feature-map", "test-evidence"])
190
+ if (args.flags[flag] !== undefined)
191
+ throw new UsageError(`Option --${flag} requires graph features.`);
192
+ return runBoundaries(ctx, { ...args, positionals: [] });
193
+ }
194
+ if (target === "features") {
195
+ for (const flag of [
196
+ "services",
197
+ "path",
198
+ "max-relations",
199
+ "direction",
200
+ "depth",
201
+ "layout",
202
+ "out",
203
+ "limit",
204
+ ])
205
+ if (args.flags[flag] !== undefined)
206
+ throw new UsageError(`Option --${flag} is not supported by graph features.`);
207
+ return runFeatureMap(ctx, { ...args, positionals: [] });
208
+ }
209
+ for (const flag of ["feature-map", "test-evidence"])
210
+ if (args.flags[flag] !== undefined)
211
+ throw new UsageError(`Option --${flag} requires graph features.`);
212
+ for (const flag of ["services", "path", "max-relations"])
213
+ if (args.flags[flag] !== undefined)
214
+ throw new UsageError(`Option --${flag} requires graph boundaries.`);
215
+ const visualizing = target === "visualize";
216
+ validateModeSpecificFlags(args, visualizing, target !== undefined);
217
+ const visualization = visualizing ? readVisualizationOptions(args) : undefined;
218
+
219
+ const direction = enumFlag(
220
+ args,
221
+ "direction",
222
+ ["both", "dependencies", "dependents"] as const,
223
+ "both",
224
+ ) as GraphDirectionChoice;
225
+ const depth = integerFlag(args, "depth", 3);
226
+ if (depth < 1) {
227
+ throw new UsageError(
228
+ `Option "--depth" requires at least 1; received "${String(depth)}".`,
229
+ "Example: --depth=3",
230
+ );
231
+ }
232
+ const maxNodes = integerFlag(
233
+ args,
234
+ "max-nodes",
235
+ visualizing ? DEFAULT_MAX_NODES : DEFAULT_TRAVERSAL_LIMITS.maxNodes,
236
+ );
237
+ if (maxNodes < 1 || (visualizing && maxNodes > MAX_MAX_NODES)) {
238
+ throw new UsageError(
239
+ visualizing
240
+ ? `Option "--max-nodes" requires 1 to ${String(MAX_MAX_NODES)}; received "${String(maxNodes)}".`
241
+ : `Option "--max-nodes" requires at least 1; received "${String(maxNodes)}".`,
242
+ visualizing ? "Example: --max-nodes=600" : "Example: --max-nodes=1000",
243
+ );
244
+ }
245
+ const queryMaxEdges = visualizing ? undefined : readQueryMaxEdges(args);
246
+ const limit = integerFlag(args, "limit", 20);
247
+ const rootFlag = stringFlag(args, "root");
248
+
249
+ const loaded = await loadGraphs({
250
+ cwd: ctx.cwd,
251
+ env: ctx.env,
252
+ signal: ctx.signal,
253
+ ...(rootFlag === undefined ? {} : { root: path.resolve(ctx.cwd, rootFlag) }),
254
+ });
255
+ for (const issue of renderIssues(loaded.issues)) note(ctx.io, issue);
256
+
257
+ const graph = loaded.fileGraph;
258
+ if (visualization !== undefined) {
259
+ return writeVisualization(ctx, format, maxNodes, visualization, loaded);
260
+ }
261
+ const limits: Partial<TraversalLimitsV1> = {
262
+ maxDepth: depth,
263
+ maxNodes,
264
+ ...(queryMaxEdges === undefined ? {} : { maxEdges: queryMaxEdges }),
265
+ };
266
+
267
+ /* ------------------------------ Uebersicht ------------------------ */
268
+
269
+ if (target === undefined) {
270
+ if (format === "json") {
271
+ line(
272
+ ctx.io,
273
+ JSON.stringify(overviewJson(loaded.generationId, graph, loaded.issues), null, 2),
274
+ );
275
+ return EXIT.ok;
276
+ }
277
+ for (const text of renderOverview({
278
+ graph,
279
+ generationId: loaded.generationId,
280
+ issues: loaded.issues,
281
+ unresolvedLimit: limit,
282
+ })) {
283
+ line(ctx.io, text);
284
+ }
285
+ return EXIT.ok;
286
+ }
287
+
288
+ /* ------------------------------ Dateisicht ------------------------ */
289
+
290
+ const node = resolveNode(graph, target);
291
+ const dependencies =
292
+ direction === "dependents" ? undefined : graph.dependenciesOf(node.fileId, limits);
293
+ const dependents =
294
+ direction === "dependencies" ? undefined : graph.dependentsOf(node.fileId, limits);
295
+
296
+ if (format === "json") {
297
+ const directEdges = boundDirectEdges(
298
+ graph.snapshot.edges,
299
+ node.fileId,
300
+ queryMaxEdges ?? MAX_GRAPH_QUERY_EDGES,
301
+ );
302
+ line(
303
+ ctx.io,
304
+ JSON.stringify(
305
+ {
306
+ generationId: loaded.generationId,
307
+ workspaceId: graph.workspaceId,
308
+ node,
309
+ edges: directEdges.edges,
310
+ truncated: directEdges.truncated,
311
+ omittedCount: directEdges.omittedCount,
312
+ ...(dependencies === undefined ? {} : { dependencies: expand(graph, dependencies) }),
313
+ ...(dependents === undefined ? {} : { dependents: expand(graph, dependents) }),
314
+ issues: loaded.issues,
315
+ },
316
+ null,
317
+ 2,
318
+ ),
319
+ );
320
+ return EXIT.ok;
321
+ }
322
+
323
+ for (const text of renderFileView({
324
+ graph,
325
+ node,
326
+ direction,
327
+ ...(dependencies === undefined ? {} : { dependencies }),
328
+ ...(dependents === undefined ? {} : { dependents }),
329
+ })) {
330
+ line(ctx.io, text);
331
+ }
332
+ return EXIT.ok;
333
+ },
334
+ };
335
+
336
+ /* ------------------------------------------------------------------ */
337
+
338
+ async function writeVisualization(
339
+ ctx: CommandContext,
340
+ format: "text" | "json",
341
+ maxNodes: number,
342
+ options: {
343
+ out: string;
344
+ maxEdges: number;
345
+ layout: GraphExplorerLayoutKind;
346
+ },
347
+ loaded: Awaited<ReturnType<typeof loadGraphs>>,
348
+ ): Promise<number> {
349
+ const outputPath = path.resolve(ctx.cwd, options.out);
350
+ ctx.signal.throwIfAborted();
351
+
352
+ let artifact;
353
+ try {
354
+ artifact = await writeGraphExplorerHtml(
355
+ outputPath,
356
+ {
357
+ fileGraph: loaded.fileGraph.snapshot,
358
+ symbolGraph: loaded.symbolGraph?.graph ?? null,
359
+ workspace: {
360
+ workspaceId: loaded.view.workspaceId,
361
+ label: loaded.view.config.projectId ?? loaded.view.workspaceId,
362
+ generationId: loaded.generationId,
363
+ repositories: (loaded.view.config.repositories ?? []).map((repository) => ({
364
+ repoId: repository.id,
365
+ label: repository.label ?? repository.id,
366
+ ...(repository.ref === undefined ? {} : { refName: repository.ref }),
367
+ })),
368
+ },
369
+ },
370
+ { maxNodes, maxEdges: options.maxEdges, initialLayout: options.layout },
371
+ );
372
+ } catch (error) {
373
+ throw new OperationalError(
374
+ `Could not write the offline explorer to "${outputPath}": ${errorMessage(error)}`,
375
+ "Check the target directory and write permissions; Untangle does not create missing parent directories.",
376
+ { cause: error },
377
+ );
378
+ }
379
+
380
+ const result = {
381
+ generationId: loaded.generationId,
382
+ workspaceId: loaded.fileGraph.workspaceId,
383
+ artifact,
384
+ symbolGraph: {
385
+ available: loaded.symbolGraph !== null,
386
+ ...(loaded.symbolGraphMissingReason === undefined
387
+ ? {}
388
+ : { missingReason: loaded.symbolGraphMissingReason }),
389
+ },
390
+ issues: loaded.issues,
391
+ };
392
+ if (format === "json") {
393
+ line(ctx.io, JSON.stringify(result, null, 2));
394
+ return EXIT.ok;
395
+ }
396
+
397
+ line(ctx.io, `Offline explorer: ${artifact.path}`);
398
+ line(ctx.io, `Generation: ${loaded.generationId}`);
399
+ line(ctx.io, `SHA-256: ${artifact.sha256}`);
400
+ line(ctx.io, `Size: ${String(artifact.bytes)} Bytes`);
401
+ line(
402
+ ctx.io,
403
+ `File graph: ${String(artifact.views.file?.shownNodeCount ?? 0)} nodes, ${String(artifact.views.file?.shownLinkCount ?? 0)} visible edges`,
404
+ );
405
+ if (artifact.views.symbol === null) {
406
+ note(
407
+ ctx.io,
408
+ `Symbol graph missing: ${loaded.symbolGraphMissingReason ?? "no persisted snapshot"}`,
409
+ );
410
+ } else {
411
+ line(
412
+ ctx.io,
413
+ `Symbol graph: ${String(artifact.views.symbol.shownNodeCount)} nodes, ${String(artifact.views.symbol.shownLinkCount)} visible edges`,
414
+ );
415
+ }
416
+ return EXIT.ok;
417
+ }
418
+
419
+ function readVisualizationOptions(args: ParsedArgs): {
420
+ out: string;
421
+ maxEdges: number;
422
+ layout: GraphExplorerLayoutKind;
423
+ } {
424
+ const out = stringFlag(args, "out")?.trim();
425
+ if (out === undefined || out === "") {
426
+ throw new UsageError(
427
+ "`untangle graph visualize` requires an explicit --out target.",
428
+ "Example: untangle graph visualize --out=artifacts/graph.html",
429
+ );
430
+ }
431
+ const maxEdges = integerFlag(args, "max-edges", DEFAULT_MAX_EDGES);
432
+ if (maxEdges < 1 || maxEdges > MAX_MAX_EDGES) {
433
+ throw new UsageError(
434
+ `Option "--max-edges" requires 1 to ${String(MAX_MAX_EDGES)}; received "${String(maxEdges)}".`,
435
+ "Example: --max-edges=1200",
436
+ );
437
+ }
438
+ const layout = enumFlag(
439
+ args,
440
+ "layout",
441
+ ["repository-lanes", "grid", "circle"] as const,
442
+ "repository-lanes",
443
+ ) as GraphExplorerLayoutKind;
444
+ return { out, maxEdges, layout };
445
+ }
446
+
447
+ function readQueryMaxEdges(args: ParsedArgs): number {
448
+ const maxEdges = integerFlag(args, "max-edges", MAX_GRAPH_QUERY_EDGES);
449
+ if (maxEdges < 1 || maxEdges > MAX_GRAPH_QUERY_EDGES) {
450
+ throw new UsageError(
451
+ `Option "--max-edges" requires 1 to ${String(MAX_GRAPH_QUERY_EDGES)}; received "${String(maxEdges)}".`,
452
+ `Example: --max-edges=${String(DEFAULT_TRAVERSAL_LIMITS.maxEdges)}`,
453
+ );
454
+ }
455
+ return maxEdges;
456
+ }
457
+
458
+ function validateModeSpecificFlags(
459
+ args: ParsedArgs,
460
+ visualizing: boolean,
461
+ hasTarget: boolean,
462
+ ): void {
463
+ const visualizationOnly = ["out", "layout"] as const;
464
+ const queryOnly = ["direction", "depth", "limit"] as const;
465
+ const invalid: string[] = (visualizing ? queryOnly : visualizationOnly).filter(
466
+ (name) => args.flags[name] !== undefined,
467
+ );
468
+ if (!visualizing && !hasTarget && args.flags["max-edges"] !== undefined) {
469
+ invalid.push("max-edges");
470
+ }
471
+ if (invalid.length === 0) return;
472
+ const mode = visualizing ? "graph visualize" : "graph";
473
+ throw new UsageError(
474
+ `Option${invalid.length === 1 ? "" : "s"} ${invalid.map((name) => `--${name}`).join(", ")} ${invalid.length === 1 ? "does" : "do"} not apply to \`${mode}\`.`,
475
+ visualizing
476
+ ? "Explorer budgets use --max-nodes and --max-edges; --layout selects the initial layout."
477
+ : invalid.includes("max-edges")
478
+ ? "Use --max-edges with `untangle graph <file>` or `untangle graph visualize --out=<FILE>`."
479
+ : "Use these options only with `untangle graph visualize --out=<FILE>`.",
480
+ );
481
+ }
482
+
483
+ function errorMessage(error: unknown): string {
484
+ return error instanceof Error ? error.message : String(error);
485
+ }
486
+
487
+ /**
488
+ * Der Knoten zur Nutzereingabe — oder ein Abbruch, der die Kandidaten nennt.
489
+ *
490
+ * Mehrdeutigkeit wird NICHT aufgeloest: bei zwei passenden Dateien waehlt der
491
+ * Befehl keine aus, sondern zeigt beide und laesst den Nutzer entscheiden.
492
+ */
493
+ function resolveNode(graph: RestoredFileGraph, query: string): FileNodeV1 {
494
+ const selection = selectFileNode(graph.nodes(), query);
495
+ if (selection.status === "found") return selection.node;
496
+ if (selection.status === "ambiguous") {
497
+ throw new UsageError(
498
+ `"${query}" matches ${String(selection.candidates.length)} files: ` +
499
+ selection.candidates.map((node) => node.filePath).join(", "),
500
+ "Specify the complete repository-relative path.",
501
+ );
502
+ }
503
+ const near =
504
+ selection.near.length === 0
505
+ ? ""
506
+ : ` Similar names: ${selection.near.map((node) => node.filePath).join(", ")}.`;
507
+ throw new OperationalError(
508
+ `File "${query}" is absent from the file graph. Nothing was evaluated; ` +
509
+ `this does not mean there are no dependencies.${near}`,
510
+ "Check the path or run `untangle index` again. `untangle graph` without an argument lists the graph contents.",
511
+ );
512
+ }
513
+
514
+ /** Traversierungsergebnis mit Pfaden angereichert — JSON soll lesbar sein. */
515
+ function expand(
516
+ graph: RestoredFileGraph,
517
+ result: ReturnType<RestoredFileGraph["dependenciesOf"]>,
518
+ ): Record<string, unknown> {
519
+ return {
520
+ ...result,
521
+ visitedPaths: result.visitedFileIds.map((id) => graph.node(id)?.filePath ?? id),
522
+ cyclePaths: result.cycles.map((cycle) => cycle.map((id) => graph.node(id)?.filePath ?? id)),
523
+ };
524
+ }
525
+
526
+ function overviewJson(
527
+ generationId: string,
528
+ graph: RestoredFileGraph,
529
+ issues: unknown,
530
+ ): Record<string, unknown> {
531
+ const metrics = graph.metrics();
532
+ return {
533
+ generationId,
534
+ workspaceId: graph.workspaceId,
535
+ metrics,
536
+ boundaries: countBoundaries(graph),
537
+ topology: graph.topology,
538
+ cyclePaths: metrics.cycles.map((cycle) => cycle.map((id) => graph.node(id)?.filePath ?? id)),
539
+ unresolved: graph
540
+ .edges()
541
+ .filter((edge) => edge.resolution.status === "unresolved")
542
+ .map((edge) => ({
543
+ fromPath: edge.fromPath,
544
+ rawSpecifier: edge.rawSpecifier,
545
+ resolution: edge.resolution,
546
+ sites: edge.sites,
547
+ })),
548
+ orphanPaths: metrics.orphanFileIds.map((id) => graph.node(id)?.filePath ?? id),
549
+ nodes: graph.nodes().map((node) => ({
550
+ fileId: node.fileId,
551
+ filePath: node.filePath,
552
+ label: describeNode(node),
553
+ packageName: node.packageName ?? null,
554
+ containerService: node.containerService ?? null,
555
+ dependencies: node.dependencies.length,
556
+ dependents: node.dependents.length,
557
+ unresolvedImportCount: node.unresolvedImportCount,
558
+ })),
559
+ skipped: graph.skipLedger(),
560
+ issues,
561
+ };
562
+ }