@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,634 @@
1
+ /** Opt-in onboarding offers. The extension runtime still consumes formats, not vendors. */
2
+ import { createHash } from "node:crypto";
3
+ import path from "node:path";
4
+
5
+ import { UsageError } from "../../cli/exit.js";
6
+
7
+ export type IntegrationId =
8
+ "local-search" | "sonarqube-local" | "sonarqube-existing" | "sentrux" | "custom";
9
+
10
+ export interface IntegrationOfferV1 {
11
+ id: IntegrationId;
12
+ label: string;
13
+ description: string;
14
+ documentation: string;
15
+ licenseSummary: string;
16
+ requiresLicenseAcknowledgment: boolean;
17
+ }
18
+
19
+ export interface IntegrationSelectionV1 {
20
+ id: IntegrationId;
21
+ endpoint?: string;
22
+ projectKey?: string;
23
+ tokenEnvVar?: string;
24
+ manifestPath?: string;
25
+ manifestDigest?: string;
26
+ acknowledgeLicense?: boolean;
27
+ allowProjectLocal?: boolean;
28
+ }
29
+
30
+ export interface IntegrationCommandV1 {
31
+ command: string;
32
+ args: readonly string[];
33
+ purpose: string;
34
+ kind: "process" | "extension";
35
+ }
36
+
37
+ export interface IntegrationFileV1 {
38
+ relativePath: string;
39
+ content: string;
40
+ }
41
+
42
+ export interface IntegrationDownloadV1 {
43
+ url: string;
44
+ sha256: string;
45
+ relativePath: string;
46
+ maxBytes: number;
47
+ }
48
+
49
+ export interface IntegrationPlanItemV1 {
50
+ id: IntegrationId;
51
+ label: string;
52
+ files: readonly IntegrationFileV1[];
53
+ commands: readonly IntegrationCommandV1[];
54
+ downloads: readonly IntegrationDownloadV1[];
55
+ blockers: readonly string[];
56
+ nextSteps: readonly string[];
57
+ licenseAcknowledged: boolean;
58
+ projectName?: string;
59
+ }
60
+
61
+ export interface IntegrationSetupOptionsV1 {
62
+ root: string;
63
+ selections: readonly IntegrationSelectionV1[];
64
+ offline?: boolean;
65
+ platform?: string;
66
+ arch?: string;
67
+ }
68
+
69
+ export interface IntegrationSetupPlanV1 {
70
+ schemaVersion: 1;
71
+ root: string;
72
+ selections: readonly IntegrationSelectionV1[];
73
+ offline: boolean;
74
+ platform: string;
75
+ arch: string;
76
+ items: readonly IntegrationPlanItemV1[];
77
+ }
78
+
79
+ export const SONAR_IMAGE =
80
+ "sonarqube@sha256:f95aaa9016dd4e92c7d70691167a6d96dbb5d8acffd61eba1cb4335d364a7840";
81
+ export const SENTRUX_VERSION = "0.5.7";
82
+
83
+ const OFFERS: readonly IntegrationOfferV1[] = [
84
+ {
85
+ id: "local-search",
86
+ label: "Local search — Qdrant and Ollama",
87
+ description:
88
+ "Prepare or start isolated loopback-only search services and explicitly pull the default nomic embedding model. No index is built automatically.",
89
+ documentation: "https://github.com/lboel/untangle/blob/main/docker/README.md",
90
+ licenseSummary:
91
+ "Qdrant: Apache-2.0; Ollama: MIT; review the selected embedding model's license.",
92
+ requiresLicenseAcknowledgment: false,
93
+ },
94
+ {
95
+ id: "sonarqube-local",
96
+ label: "SonarQube — local Docker installation",
97
+ description:
98
+ "Prepare or start a pinned, loopback-only evaluation server (4 GB RAM and 2 cores starting point). Account, project and scanner setup remain explicit; installing the server does not analyze code.",
99
+ documentation: "https://hub.docker.com/_/sonarqube/",
100
+ licenseSummary:
101
+ "Community server: LGPL-3.0; included analyzers can have additional, edition-specific terms. Review the selected distribution before starting it.",
102
+ requiresLicenseAcknowledgment: true,
103
+ },
104
+ {
105
+ id: "sonarqube-existing",
106
+ label: "SonarQube — existing project metrics",
107
+ description:
108
+ "Generate a declarative HTTP extension for an existing analyzed project. Remote metrics remain external evidence; source freshness is not inferred.",
109
+ documentation: "https://docs.sonarsource.com/sonarqube-server/extension-guide/web-api",
110
+ licenseSummary: "Review the server edition and analyzer terms before using the service.",
111
+ requiresLicenseAcknowledgment: true,
112
+ },
113
+ {
114
+ id: "sentrux",
115
+ label: "Sentrux — project-local binary and MCP template",
116
+ description:
117
+ "Install a hash-verified release binary below .untangle/tools and prepare its documented MCP configuration. This is a separate MCP tool, not a normalized Untangle metric adapter.",
118
+ documentation: "https://sentrux.dev/docs/installation/",
119
+ licenseSummary: "The public repository declares MIT; verify the chosen release terms.",
120
+ requiresLicenseAcknowledgment: false,
121
+ },
122
+ {
123
+ id: "custom",
124
+ label: "Other analyzer — trusted extension manifest",
125
+ description:
126
+ "Explicitly import a manifest for SARIF, JUnit XML, generic findings or generic metrics. The existing source-digest, project-trust and license gates remain active.",
127
+ documentation: "https://github.com/lboel/untangle/blob/main/extensions.md",
128
+ licenseSummary:
129
+ "Declared by the supplied manifest; restricted licenses need explicit acknowledgment.",
130
+ requiresLicenseAcknowledgment: false,
131
+ },
132
+ ];
133
+
134
+ export function integrationCatalog(): readonly IntegrationOfferV1[] {
135
+ return OFFERS.map((offer) => ({ ...offer }));
136
+ }
137
+
138
+ const RELEASES: Readonly<Record<string, { artifact: string; sha256: string }>> = {
139
+ "darwin:arm64": {
140
+ artifact: "sentrux-darwin-arm64",
141
+ sha256: "30ae1a44d4478adf294019fce6d65ce5686c25bc863eb715b320c5234927f6c2",
142
+ },
143
+ "linux:arm64": {
144
+ artifact: "sentrux-linux-aarch64",
145
+ sha256: "27e1b4a3e4716b341dd76e9736a5553c6737c24e165cc27e0dbc399cc5b4d786",
146
+ },
147
+ "linux:x64": {
148
+ artifact: "sentrux-linux-x86_64",
149
+ sha256: "3237f80fe20d54aad4deefa8a143f0d60543bb5d2d6ad891eb42432f155725a6",
150
+ },
151
+ "win32:x64": {
152
+ artifact: "sentrux-windows-x86_64.exe",
153
+ sha256: "40dd2e47804bf9f006015eb742abfe178a824f42d4a19eb00478a7d705697cac",
154
+ },
155
+ };
156
+
157
+ const json = (value: unknown): string => `${JSON.stringify(value, null, 2)}\n`;
158
+ const quote = (value: string): string => JSON.stringify(value);
159
+
160
+ function safeEndpoint(raw: string): string {
161
+ let endpoint: URL;
162
+ try {
163
+ endpoint = new URL(raw);
164
+ } catch {
165
+ throw new UsageError("The analyzer endpoint must be an absolute HTTP(S) URL.");
166
+ }
167
+ if (
168
+ !["http:", "https:"].includes(endpoint.protocol) ||
169
+ endpoint.username !== "" ||
170
+ endpoint.password !== "" ||
171
+ endpoint.search !== "" ||
172
+ endpoint.hash !== ""
173
+ ) {
174
+ throw new UsageError(
175
+ "Analyzer URLs cannot contain credentials, query parameters or fragments.",
176
+ );
177
+ }
178
+ return endpoint.href.replace(/\/$/u, "");
179
+ }
180
+
181
+ function sonarManifest(endpoint: string, key: string, tokenEnvVar: string): string {
182
+ const local = ["localhost", "127.0.0.1", "[::1]"].includes(new URL(endpoint).hostname);
183
+ return [
184
+ "# Generated only after an explicit init integration selection.",
185
+ "# Reads prior remote analysis, not the current local source revision.",
186
+ "schemaVersion = 1",
187
+ 'id = "sonarqube"',
188
+ 'displayName = "SonarQube project metrics"',
189
+ 'category = "quality-platform"',
190
+ 'invocation = ["http"]',
191
+ "languages = []",
192
+ 'outputFormat = "generic-metrics"',
193
+ `networkAccess = ${quote(local ? "loopback" : "internet")}`,
194
+ 'networkJustification = "Explicitly selected server endpoint; reads existing project metrics."',
195
+ "requiresLicenseAcknowledgment = true",
196
+ "",
197
+ "[http]",
198
+ `defaultUrl = ${quote(endpoint)}`,
199
+ 'authSecretName = "token"',
200
+ `analyzePath = ${quote(`/api/measures/component?component=${encodeURIComponent(key)}&metricKeys=cognitive_complexity%2Ccomplexity%2Cncloc%2Cduplicated_lines_density`)}`,
201
+ 'analyzeMethod = "GET"',
202
+ "",
203
+ "[resources]",
204
+ "minMemoryMb = 1",
205
+ "recommendedMemoryMb = 16",
206
+ "recommendedCpus = 1",
207
+ "",
208
+ "[license]",
209
+ 'spdxId = "NOASSERTION"',
210
+ 'usageRestriction = "restricted"',
211
+ 'restrictionSummary = "Review the selected server edition and analyzer terms."',
212
+ 'url = "https://www.sonarsource.com/legal/"',
213
+ "",
214
+ "[[secrets]]",
215
+ 'name = "token"',
216
+ `envVar = ${quote(tokenEnvVar)}`,
217
+ "required = true",
218
+ 'purpose = "Read existing project metrics; never saved in project configuration."',
219
+ "",
220
+ "[outputMapping]",
221
+ 'container = "component.measures"',
222
+ 'key = "metric"',
223
+ 'value = "value"',
224
+ "",
225
+ "[telemetry]",
226
+ "sendsTelemetry = true",
227
+ "disabledByDefault = false",
228
+ "",
229
+ ].join("\n");
230
+ }
231
+
232
+ function sonarItem(root: string, selection: IntegrationSelectionV1): IntegrationPlanItemV1 {
233
+ const isLocal = selection.id === "sonarqube-local";
234
+ const endpoint = safeEndpoint(selection.endpoint ?? "http://127.0.0.1:19000");
235
+ if (isLocal && endpoint !== "http://127.0.0.1:19000") {
236
+ throw new UsageError(
237
+ "The local installation uses http://127.0.0.1:19000; select an existing server for another endpoint.",
238
+ );
239
+ }
240
+ const tokenEnvVar = selection.tokenEnvVar ?? "UNTANGLE_EXT_SONAR_TOKEN";
241
+ if (!/^[A-Z_][A-Z0-9_]*$/u.test(tokenEnvVar)) {
242
+ throw new UsageError("Enter an environment-variable NAME, not a token value.");
243
+ }
244
+ const key = selection.projectKey?.trim();
245
+ const offer = OFFERS.find((candidate) => candidate.id === selection.id) as IntegrationOfferV1;
246
+ const folder = `.untangle/setup/integrations/${selection.id}`;
247
+ const files: IntegrationFileV1[] = [
248
+ {
249
+ relativePath: `${folder}/connection.json`,
250
+ content: json({
251
+ schemaVersion: 1,
252
+ endpoint,
253
+ projectKey: key,
254
+ tokenEnvVar,
255
+ remoteSourceFreshness: "not_verified",
256
+ scannerRun: "not_started",
257
+ }),
258
+ },
259
+ ];
260
+ const commands: IntegrationCommandV1[] = [];
261
+ let projectName: string | undefined;
262
+ if (isLocal) {
263
+ projectName = `untangle-init-sonar-${createHash("sha256").update(root).digest("hex").slice(0, 16)}`;
264
+ const composeFile = path.join(root, folder, "compose.yml");
265
+ files.push({
266
+ relativePath: `${folder}/compose.yml`,
267
+ content: [
268
+ "# Local evaluation server. Embedded H2 is not a production database.",
269
+ "services:",
270
+ " quality:",
271
+ ` image: ${SONAR_IMAGE}`,
272
+ " ports:",
273
+ ' - "127.0.0.1:19000:9000"',
274
+ " privileged: false",
275
+ " cap_drop: [ALL]",
276
+ " security_opt: [no-new-privileges:true]",
277
+ " environment:",
278
+ ' SONAR_TELEMETRY_ENABLE: "false"',
279
+ " labels:",
280
+ ' dev.untangle.init-managed: "true"',
281
+ ` dev.untangle.init-project: ${quote(projectName)}`,
282
+ " volumes:",
283
+ " - data:/opt/sonarqube/data",
284
+ " - logs:/opt/sonarqube/logs",
285
+ " - extensions:/opt/sonarqube/extensions",
286
+ "volumes:",
287
+ " data: {}",
288
+ " logs: {}",
289
+ " extensions: {}",
290
+ "",
291
+ ].join("\n"),
292
+ });
293
+ commands.push({
294
+ command: "docker",
295
+ args: ["compose", "-p", projectName, "-f", composeFile, "up", "--detach"],
296
+ kind: "process",
297
+ purpose: "Download and start the pinned local evaluation server; no source is uploaded.",
298
+ });
299
+ }
300
+ if (key !== undefined && key !== "") {
301
+ const manifest = path.join(root, folder, "manifest.toml");
302
+ files.push({
303
+ relativePath: `${folder}/manifest.toml`,
304
+ content: sonarManifest(endpoint, key, tokenEnvVar),
305
+ });
306
+ commands.push(
307
+ {
308
+ command: "untangle",
309
+ args: [
310
+ "extensions",
311
+ "add",
312
+ `--from=${manifest}`,
313
+ "--allow-project-local",
314
+ "--acknowledge-license",
315
+ ],
316
+ kind: "extension",
317
+ purpose:
318
+ "Import the explicitly selected generated manifest into the user extension profile.",
319
+ },
320
+ {
321
+ command: "untangle",
322
+ args: ["extensions", "enable", "sonarqube", "--acknowledge-license"],
323
+ kind: "extension",
324
+ purpose: "Enable the manifest; this does not run a scanner.",
325
+ },
326
+ );
327
+ if (!isLocal) {
328
+ commands.push({
329
+ command: "untangle",
330
+ args: [
331
+ "extensions",
332
+ "run",
333
+ "sonarqube",
334
+ `--workspace=${root}`,
335
+ "--timeout=30000",
336
+ "--max-output-bytes=4194304",
337
+ ],
338
+ kind: "extension",
339
+ purpose:
340
+ "Read and validate existing numeric project metrics using the configured token environment variable. This does not launch a scanner or verify remote source freshness.",
341
+ });
342
+ }
343
+ }
344
+ return {
345
+ id: selection.id,
346
+ label: offer.label,
347
+ files,
348
+ commands,
349
+ downloads: [],
350
+ licenseAcknowledged: selection.acknowledgeLicense === true,
351
+ ...(projectName === undefined ? {} : { projectName }),
352
+ blockers: selection.acknowledgeLicense === true ? [] : [offer.licenseSummary],
353
+ nextSteps: [
354
+ ...(isLocal
355
+ ? [
356
+ `Open ${endpoint}, finish account/password setup, create the selected project and run its scanner. This starts an evaluation server only.`,
357
+ ]
358
+ : []),
359
+ ...(key === undefined || key === ""
360
+ ? ["Supply a real project key to generate the metrics manifest."]
361
+ : []),
362
+ `Set ${tokenEnvVar} in your shell or private user credential store; never put its value in the project.`,
363
+ "Run untangle extensions run sonarqube --format=json after a successful scanner run. Remote source freshness remains unverified.",
364
+ ],
365
+ };
366
+ }
367
+
368
+ function sentruxItem(root: string, platform: string, arch: string): IntegrationPlanItemV1 {
369
+ const release = RELEASES[`${platform}:${arch}`];
370
+ const relativeBinary = `.untangle/tools/sentrux/${SENTRUX_VERSION}/sentrux${platform === "win32" ? ".exe" : ""}`;
371
+ const binary = path.join(root, relativeBinary);
372
+ return {
373
+ id: "sentrux",
374
+ label: "Sentrux — project-local binary and MCP template",
375
+ licenseAcknowledged: true,
376
+ files: [
377
+ {
378
+ relativePath: ".untangle/setup/integrations/sentrux/mcp.json",
379
+ content: json({ mcpServers: { sentrux: { command: binary, args: ["--mcp"] } } }),
380
+ },
381
+ ],
382
+ commands: [
383
+ {
384
+ command: binary,
385
+ args: ["--version"],
386
+ kind: "process",
387
+ purpose: "Verify the installed binary. No project scan or host configuration changes.",
388
+ },
389
+ ],
390
+ downloads:
391
+ release === undefined
392
+ ? []
393
+ : [
394
+ {
395
+ url: `https://github.com/sentrux/sentrux/releases/download/v${SENTRUX_VERSION}/${release.artifact}`,
396
+ sha256: release.sha256,
397
+ relativePath: relativeBinary,
398
+ maxBytes: 64 * 1024 * 1024,
399
+ },
400
+ ],
401
+ blockers:
402
+ release === undefined
403
+ ? [
404
+ `No verified ${platform}/${arch} release is offered; use the official source-build instructions.`,
405
+ ]
406
+ : [],
407
+ nextSteps: [
408
+ "Explicitly add the generated MCP entry to your host, then use Sentrux's own scan/check tools. No normalized Untangle adapter is claimed.",
409
+ "Review https://sentrux.dev/docs/installation/ before installing the pinned release.",
410
+ ],
411
+ };
412
+ }
413
+
414
+ function customItem(root: string, selection: IntegrationSelectionV1): IntegrationPlanItemV1 {
415
+ const source = selection.manifestPath?.trim();
416
+ if (source !== undefined && source.includes("://")) {
417
+ const endpoint = safeEndpoint(source);
418
+ if (!endpoint.startsWith("https://") || selection.manifestDigest === undefined) {
419
+ throw new UsageError(
420
+ "Remote manifests need HTTPS and an independently verified sha256 digest.",
421
+ );
422
+ }
423
+ }
424
+ if (
425
+ selection.manifestDigest !== undefined &&
426
+ !/^sha256:[a-f0-9]{64}$/u.test(selection.manifestDigest)
427
+ ) {
428
+ throw new UsageError("The manifest digest must be sha256:<64 lowercase hex>.");
429
+ }
430
+ const args =
431
+ source === undefined || source === ""
432
+ ? []
433
+ : [
434
+ "add",
435
+ `--from=${source.includes("://") ? source : path.resolve(root, source)}`,
436
+ ...(selection.manifestDigest === undefined
437
+ ? []
438
+ : [`--digest=${selection.manifestDigest}`]),
439
+ ...(selection.allowProjectLocal === true ? ["--allow-project-local"] : []),
440
+ ...(selection.acknowledgeLicense === true ? ["--acknowledge-license"] : []),
441
+ ];
442
+ return {
443
+ id: "custom",
444
+ label: "Other analyzer — trusted extension manifest",
445
+ licenseAcknowledged: selection.acknowledgeLicense === true,
446
+ files: [
447
+ {
448
+ relativePath: ".untangle/setup/integrations/custom/selection.json",
449
+ content: json({
450
+ schemaVersion: 1,
451
+ manifestSource: source,
452
+ expectedDigest: selection.manifestDigest,
453
+ allowProjectLocal: selection.allowProjectLocal === true,
454
+ formats: ["sarif", "junit-xml", "generic-findings", "generic-metrics"],
455
+ }),
456
+ },
457
+ ],
458
+ commands:
459
+ args.length === 0
460
+ ? []
461
+ : [
462
+ {
463
+ command: "untangle",
464
+ args: ["extensions", ...args],
465
+ kind: "extension",
466
+ purpose:
467
+ "Import the explicit manifest through the existing trust, integrity and license gates. No analyzer is started.",
468
+ },
469
+ ],
470
+ downloads: [],
471
+ blockers:
472
+ args.length === 0
473
+ ? ["Supply a trusted analyzer manifest path or a digest-pinned HTTPS URL."]
474
+ : [],
475
+ nextSteps: [
476
+ "Review the manifest, enable its declared ID, then run it explicitly. SARIF, JUnit XML and both generic JSON formats use the same runtime.",
477
+ "A cloned project's manifest is never automatically discovered or trusted.",
478
+ ],
479
+ };
480
+ }
481
+
482
+ function localSearchItem(root: string): IntegrationPlanItemV1 {
483
+ const projectName = `untangle-init-search-${createHash("sha256").update(root).digest("hex").slice(0, 16)}`;
484
+ const folder = ".untangle/setup/integrations/local-search";
485
+ const compose = path.join(root, folder, "compose.yml");
486
+ const common = [
487
+ " privileged: false",
488
+ " cap_drop: [ALL]",
489
+ " security_opt: [no-new-privileges:true]",
490
+ " labels:",
491
+ ' dev.untangle.init-managed: "true"',
492
+ ` dev.untangle.init-project: ${quote(projectName)}`,
493
+ ];
494
+ const health = (port: number): string[] => [
495
+ " healthcheck:",
496
+ ` test: ["CMD-SHELL", "bash -c 'echo -n > /dev/tcp/127.0.0.1/${String(port)}'"]`,
497
+ " interval: 3s",
498
+ " timeout: 3s",
499
+ " retries: 40",
500
+ ];
501
+ return {
502
+ id: "local-search",
503
+ label: "Local search — Qdrant and Ollama",
504
+ licenseAcknowledged: true,
505
+ projectName,
506
+ files: [
507
+ {
508
+ relativePath: `${folder}/compose.yml`,
509
+ content: [
510
+ "services:",
511
+ " vectors:",
512
+ " image: qdrant/qdrant@sha256:d774e7bb65744454984c6021637a0da89271f30df15e48601a9fafc926d26b1f",
513
+ " ports:",
514
+ ' - "127.0.0.1:16333:6333"',
515
+ ' - "127.0.0.1:16334:6334"',
516
+ " volumes:",
517
+ " - qdrant_data:/qdrant/storage",
518
+ ...common,
519
+ ...health(6333),
520
+ " embeddings:",
521
+ " image: ollama/ollama@sha256:18bfb1d605604fd53dcad20d0556df4c781e560ebebcd923454d627c994a0e37",
522
+ " ports:",
523
+ ' - "127.0.0.1:11435:11434"',
524
+ " volumes:",
525
+ " - ollama_models:/root/.ollama",
526
+ ...common,
527
+ ...health(11434),
528
+ "volumes:",
529
+ " qdrant_data: {}",
530
+ " ollama_models: {}",
531
+ "",
532
+ ].join("\n"),
533
+ },
534
+ {
535
+ relativePath: `${folder}/connection.json`,
536
+ content: json({
537
+ schemaVersion: 1,
538
+ qdrant: { mode: "external", url: "http://127.0.0.1:16333" },
539
+ embeddings: {
540
+ provider: "ollama",
541
+ mode: "external",
542
+ url: "http://127.0.0.1:11435",
543
+ model: "nomic-embed-text",
544
+ dimensions: 768,
545
+ contextLength: 2048,
546
+ },
547
+ indexBuilt: false,
548
+ }),
549
+ },
550
+ ],
551
+ commands: [
552
+ {
553
+ command: "docker",
554
+ args: [
555
+ "compose",
556
+ "-p",
557
+ projectName,
558
+ "-f",
559
+ compose,
560
+ "up",
561
+ "--detach",
562
+ "--wait",
563
+ "--wait-timeout",
564
+ "180",
565
+ ],
566
+ kind: "process",
567
+ purpose:
568
+ "Download and start the pinned loopback-only services; an occupied port fails without adopting a foreign container.",
569
+ },
570
+ {
571
+ command: "docker",
572
+ args: [
573
+ "compose",
574
+ "-p",
575
+ projectName,
576
+ "-f",
577
+ compose,
578
+ "exec",
579
+ "-T",
580
+ "embeddings",
581
+ "ollama",
582
+ "pull",
583
+ "nomic-embed-text",
584
+ ],
585
+ kind: "process",
586
+ purpose:
587
+ "Explicitly download the configured default model into this setup's own named volume.",
588
+ },
589
+ ],
590
+ downloads: [],
591
+ blockers: [],
592
+ nextSteps: [
593
+ "Use Qdrant http://127.0.0.1:16333 and Ollama http://127.0.0.1:11435 with nomic-embed-text/768/2048 in the project configuration.",
594
+ "Run untangle doctor, untangle index and a query with --require-fresh. Setup does not claim a fresh index.",
595
+ "If a configured service already occupies these ports, reuse it explicitly rather than stopping it; no existing service or volume is deleted.",
596
+ ],
597
+ };
598
+ }
599
+
600
+ /** Planning is deterministic and performs no filesystem, process or network operation. */
601
+ export function planIntegrationSetup(options: IntegrationSetupOptionsV1): IntegrationSetupPlanV1 {
602
+ const root = path.resolve(options.root);
603
+ const platform = options.platform ?? process.platform;
604
+ const arch = options.arch ?? process.arch;
605
+ const selections = options.selections.map((selection) => ({ ...selection }));
606
+ const ids = selections.map((selection) => selection.id);
607
+ if (
608
+ new Set(ids).size !== ids.length ||
609
+ (ids.includes("sonarqube-local") && ids.includes("sonarqube-existing"))
610
+ ) {
611
+ throw new UsageError("Select each integration once and only one SonarQube mode.");
612
+ }
613
+ for (const id of ids) {
614
+ if (!OFFERS.some((offer) => offer.id === id))
615
+ throw new UsageError("Unknown integration selection.");
616
+ }
617
+ return {
618
+ schemaVersion: 1,
619
+ root,
620
+ selections,
621
+ offline: options.offline ?? false,
622
+ platform,
623
+ arch,
624
+ items: selections.map((selection) =>
625
+ selection.id === "local-search"
626
+ ? localSearchItem(root)
627
+ : selection.id === "sentrux"
628
+ ? sentruxItem(root, platform, arch)
629
+ : selection.id === "custom"
630
+ ? customItem(root, selection)
631
+ : sonarItem(root, selection),
632
+ ),
633
+ };
634
+ }
@@ -0,0 +1,8 @@
1
+ /** Additive, explicitly selected init integration setup. */
2
+ export * from "./integrations-plan.js";
3
+ export { applyIntegrationSetup, IntegrationSetupCancelledError } from "./integrations-apply.js";
4
+ export type {
5
+ IntegrationSetupDepsV1,
6
+ IntegrationSetupReportV1,
7
+ IntegrationSetupItemResultV1,
8
+ } from "./integrations-apply.js";