@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,58 @@
1
+ /** User-private credential configuration; values never appear in output or argv. */
2
+ import { readFile } from "node:fs/promises";
3
+ import { stringFlag } from "../../cli/args.js";
4
+ import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
5
+ import { line } from "../../cli/io.js";
6
+ import { explainMissing, findExtension, loadExtensionContext } from "./context.js";
7
+ import { resolveUserPath } from "./environment.js";
8
+ import { emitJson } from "./render.js";
9
+ import { parseSecretValues, readStoredSecrets, secretStorePath, withSecretLock, writeStoredSecrets, } from "./secret-store.js";
10
+ export async function runConfigure(environment, args, io, format) {
11
+ const id = args.positionals[1];
12
+ if (!id || args.positionals.length !== 2)
13
+ throw new UsageError("configure needs exactly one extension id.", "untangle extensions configure <id> [--from=<private-json-file>]");
14
+ const context = await loadExtensionContext(environment);
15
+ const extension = findExtension(context, id);
16
+ if (!extension)
17
+ throw new OperationalError(explainMissing(context, id), "Install the extension first.");
18
+ const manifest = extension.manifest;
19
+ const source = stringFlag(args, "from");
20
+ let imported = {};
21
+ if (source !== undefined) {
22
+ let content;
23
+ try {
24
+ content = JSON.parse(await readFile(resolveUserPath(environment.cwd, source), "utf8"));
25
+ }
26
+ catch {
27
+ throw new UsageError("Cannot read credential JSON; its contents were withheld.", "Use a JSON object keyed by the secret names declared in the manifest.");
28
+ }
29
+ imported = parseSecretValues(content, manifest);
30
+ }
31
+ const values = await withSecretLock(environment, id, async () => {
32
+ const stored = await readStoredSecrets(environment, manifest);
33
+ const values = {
34
+ ...Object.fromEntries(manifest.secrets.map((secret) => [secret.name, ""])),
35
+ ...stored,
36
+ ...imported,
37
+ };
38
+ await writeStoredSecrets(environment, manifest, values);
39
+ return values;
40
+ });
41
+ const path = secretStorePath(environment, id);
42
+ const secrets = manifest.secrets.map((secret) => ({
43
+ name: secret.name,
44
+ envVar: secret.envVar,
45
+ configured: Boolean(values[secret.name]),
46
+ setupOnly: secret.setupOnly ?? false,
47
+ }));
48
+ if (format === "json")
49
+ emitJson(io, { command: "extensions configure", extensionId: id, path, secrets });
50
+ else {
51
+ line(io, `Private credential configuration (0600): ${path}`);
52
+ for (const secret of secrets)
53
+ line(io, ` ${secret.name}: ${secret.configured ? "configured" : "not set"}; environment override: ${secret.envVar}${secret.setupOnly ? " (setup only)" : ""}`);
54
+ line(io, `Edit the secrets object in that file, then run: untangle extensions setup ${id} --yes`);
55
+ }
56
+ return EXIT.ok;
57
+ }
58
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/commands/extensions/configure.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAmB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAW,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,eAAe,EAA+B,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmC,EACnC,IAAgB,EAChB,EAAM,EACN,MAAuB;IAEvB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;QACtC,MAAM,IAAI,UAAU,CAClB,2CAA2C,EAC3C,iEAAiE,CAClE,CAAC;IACJ,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,gBAAgB,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,QAAQ,GAA2B,EAAE,CAAC;IAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACzF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,UAAU,CAClB,0DAA0D,EAC1D,uEAAuE,CACxE,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG;YACb,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1E,GAAG,MAAM;YACT,GAAG,QAAQ;SACZ,CAAC;QACF,MAAM,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;KACrC,CAAC,CAAC,CAAC;IACJ,IAAI,MAAM,KAAK,MAAM;QACnB,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;SAC/E,CAAC;QACJ,IAAI,CAAC,EAAE,EAAE,4CAA4C,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,MAAM,IAAI,OAAO;YAC1B,IAAI,CACF,EAAE,EACF,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,2BAA2B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CACtJ,CAAC;QACJ,IAAI,CACF,EAAE,EACF,6EAA6E,EAAE,QAAQ,CACxF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type ContainerRuntimePort } from "@untangle-code/extension-runtime";
2
+ import type { ProcessLimitsV1, ProcessRunnerPort } from "@untangle-code/extension-runtime";
3
+ /** Vorgabe des Kommandos; ueberschreibbar mit `UNTANGLE_CONTAINER_CLI`. */
4
+ export declare const DEFAULT_CONTAINER_CLI = "docker";
5
+ /** Name des Containers einer Extension — bewusst vorhersagbar, nie geraten. */
6
+ export declare function containerNameFor(extensionId: string): string;
7
+ export interface ContainerCliOptions {
8
+ processRunner: ProcessRunnerPort;
9
+ limits: ProcessLimitsV1;
10
+ /** Kommando der Container-Runtime; kommt aus der Umgebung, nicht aus dem Quelltext. */
11
+ command?: string;
12
+ env?: Readonly<Record<string, string>>;
13
+ }
14
+ export declare function createContainerCli(options: ContainerCliOptions): ContainerRuntimePort;
15
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/container.ts"],"names":[],"mappings":"AAuBA,OAAO,EAQL,KAAK,oBAAoB,EAG1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE3F,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAOD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,iBAAiB,CAAC;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,oBAAoB,CAsJrF"}
@@ -0,0 +1,135 @@
1
+ import { composeProjectName, EXTENSION_LABEL, MANAGED_LABEL, } from "@untangle-code/extension-runtime";
2
+ /** Vorgabe des Kommandos; ueberschreibbar mit `UNTANGLE_CONTAINER_CLI`. */
3
+ export const DEFAULT_CONTAINER_CLI = "docker";
4
+ /** Name des Containers einer Extension — bewusst vorhersagbar, nie geraten. */
5
+ export function containerNameFor(extensionId) {
6
+ return `untangle-ext-${extensionId}`;
7
+ }
8
+ const INSPECT_FORMAT = `{{index .Config.Labels "${MANAGED_LABEL}"}}\t` +
9
+ `{{index .Config.Labels "${EXTENSION_LABEL}"}}\t` +
10
+ `{{.State.Running}}\t{{.Config.Image}}`;
11
+ export function createContainerCli(options) {
12
+ const command = options.command ?? DEFAULT_CONTAINER_CLI;
13
+ const run = async (args, signal) => {
14
+ const result = await options.processRunner.run({
15
+ command,
16
+ args: [...args],
17
+ ...(options.env === undefined ? {} : { env: options.env }),
18
+ }, options.limits, signal === undefined ? {} : { signal });
19
+ const ok = result.outcome === "completed" && (result.exitCode ?? 1) === 0;
20
+ return {
21
+ ok,
22
+ stdout: result.stdout,
23
+ stderr: result.stderr,
24
+ detail: ok
25
+ ? `${command} ${args[0] ?? ""} succeeded`
26
+ : `${command} ${args.join(" ")} failed (${result.outcome}, exit ${String(result.exitCode)})` +
27
+ `${result.stderr.trim() === "" ? "" : `: ${result.stderr.trim().slice(0, 300)}`}`,
28
+ };
29
+ };
30
+ return {
31
+ async available(opts = {}) {
32
+ const result = await run(["version", "--format", "{{.Server.Version}}"], opts.signal);
33
+ if (!result.ok) {
34
+ return {
35
+ available: false,
36
+ detail: `no container runtime answered: ${result.detail}. Untangle neither ships nor starts ` +
37
+ `one; set UNTANGLE_CONTAINER_CLI if the command is named differently.`,
38
+ };
39
+ }
40
+ const version = result.stdout.trim();
41
+ return {
42
+ available: true,
43
+ detail: `container runtime ${version} answered on "${command}"`,
44
+ ...(version === "" ? {} : { version }),
45
+ };
46
+ },
47
+ async inspect(manifest, opts = {}) {
48
+ const name = containerNameFor(manifest.id);
49
+ const result = await run(["inspect", name, "--format", INSPECT_FORMAT], opts.signal);
50
+ if (!result.ok) {
51
+ return {
52
+ exists: false,
53
+ running: false,
54
+ ownedByUntangle: false,
55
+ detail: `no container named "${name}" exists`,
56
+ };
57
+ }
58
+ const [managed, extensionId, running, image] = result.stdout.trim().split("\t");
59
+ const owned = managed === "true" && extensionId === manifest.id;
60
+ if (!owned) {
61
+ // Der Name allein beweist nichts. Ohne beide Labels ist der Container
62
+ // fremd, und fremde Container fasst Untangle nicht an (spec.md §3.2).
63
+ return {
64
+ exists: true,
65
+ running: running === "true",
66
+ ownedByUntangle: false,
67
+ detail: `a container named "${name}" exists but does not carry ${MANAGED_LABEL}=true and ` +
68
+ `${EXTENSION_LABEL}=${manifest.id}; Untangle does not touch containers it did not create`,
69
+ };
70
+ }
71
+ const digest = /@(sha256:[0-9a-f]{64})$/.exec(image ?? "")?.[1];
72
+ return {
73
+ exists: true,
74
+ running: running === "true",
75
+ ownedByUntangle: true,
76
+ ...(digest === undefined ? {} : { imageDigest: digest }),
77
+ detail: `container "${name}" is ${running === "true" ? "running" : "stopped"}`,
78
+ };
79
+ },
80
+ async up(input, opts = {}) {
81
+ const state = await this.inspect(input.manifest, opts);
82
+ if (state.exists && !state.ownedByUntangle) {
83
+ return { ok: false, detail: state.detail };
84
+ }
85
+ const result = await run([
86
+ "compose",
87
+ "--project-name",
88
+ composeProjectName(input.manifest.id),
89
+ "--file",
90
+ input.composeFilePath,
91
+ "up",
92
+ "--detach",
93
+ ], opts.signal);
94
+ return { ok: result.ok, detail: result.detail };
95
+ },
96
+ async down(input, opts = {}) {
97
+ const state = await this.inspect(input.manifest, opts);
98
+ if (state.exists && !state.ownedByUntangle) {
99
+ return { ok: false, detail: state.detail };
100
+ }
101
+ const result = await run([
102
+ "compose",
103
+ "--project-name",
104
+ composeProjectName(input.manifest.id),
105
+ "--file",
106
+ input.composeFilePath,
107
+ "down",
108
+ ...(input.removeVolumes ? ["--volumes"] : []),
109
+ ], opts.signal);
110
+ return { ok: result.ok, detail: result.detail };
111
+ },
112
+ async logs(input, opts = {}) {
113
+ const state = await this.inspect(input.manifest, opts);
114
+ if (state.exists && !state.ownedByUntangle) {
115
+ return { ok: false, text: "", detail: state.detail };
116
+ }
117
+ if (!state.exists) {
118
+ return { ok: false, text: "", detail: state.detail };
119
+ }
120
+ const result = await run([
121
+ "compose",
122
+ "--project-name",
123
+ composeProjectName(input.manifest.id),
124
+ "--file",
125
+ input.composeFilePath,
126
+ "logs",
127
+ "--no-color",
128
+ "--tail",
129
+ String(input.tail),
130
+ ], opts.signal);
131
+ return { ok: result.ok, text: result.stdout, detail: result.detail };
132
+ },
133
+ };
134
+ }
135
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/commands/extensions/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The shared read path of the extension commands.
3
+ *
4
+ * Every command starts from the same picture: which manifests were found in
5
+ * the user roots, which were rejected and why, which were deliberately
6
+ * ignored and why, which acknowledgments exist, and what the CLI recorded
7
+ * about earlier runs. Building that once keeps `list`, `run` and `enable`
8
+ * from drifting apart in what they consider "installed".
9
+ */
10
+ import { type ExtensionDiscoveryResultV1, type LicenseAcknowledgmentV1, type LicenseGateDecisionV1, type LoadedExtensionV1 } from "@untangle-code/extension-runtime";
11
+ import type { ExtensionEnvironmentV1 } from "./environment.js";
12
+ import { type CliStateV1 } from "./state.js";
13
+ export interface ExtensionContextV1 {
14
+ discovery: ExtensionDiscoveryResultV1;
15
+ acknowledgments: LicenseAcknowledgmentV1[];
16
+ state: CliStateV1;
17
+ /** Everything that was skipped, unreadable or ignored, with its reason (E4). */
18
+ warnings: string[];
19
+ }
20
+ /** Reads discovery, acknowledgments and CLI state in one go. */
21
+ export declare function loadExtensionContext(environment: ExtensionEnvironmentV1): Promise<ExtensionContextV1>;
22
+ /** Finds a loaded extension by id, or null. */
23
+ export declare function findExtension(context: ExtensionContextV1, extensionId: string): LoadedExtensionV1 | null;
24
+ /**
25
+ * Evaluates both gates for one extension against the stored acknowledgments.
26
+ *
27
+ * `ruleset` is the effective ruleset of the intended run; without one the
28
+ * manifest's `defaultRuleset` applies, which is what the runtime would use.
29
+ */
30
+ export declare function gateFor(context: ExtensionContextV1, extension: LoadedExtensionV1, ruleset?: string): LicenseGateDecisionV1;
31
+ /**
32
+ * Explains why an id is not installed, naming the manifests that were
33
+ * rejected or ignored for it. "Not found" without a reason is exactly the
34
+ * silent skip E4 forbids.
35
+ */
36
+ export declare function explainMissing(context: ExtensionContextV1, extensionId: string): string;
37
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAIL,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,0BAA0B,CAAC;IACtC,eAAe,EAAE,uBAAuB,EAAE,CAAC;IAC3C,KAAK,EAAE,UAAU,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,gEAAgE;AAChE,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,sBAAsB,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAgB7B;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAC3B,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,MAAM,GAClB,iBAAiB,GAAG,IAAI,CAE1B;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,iBAAiB,EAC5B,OAAO,CAAC,EAAE,MAAM,GACf,qBAAqB,CAOvB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyBvF"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The shared read path of the extension commands.
3
+ *
4
+ * Every command starts from the same picture: which manifests were found in
5
+ * the user roots, which were rejected and why, which were deliberately
6
+ * ignored and why, which acknowledgments exist, and what the CLI recorded
7
+ * about earlier runs. Building that once keeps `list`, `run` and `enable`
8
+ * from drifting apart in what they consider "installed".
9
+ */
10
+ import { discoverExtensions, evaluateLicenseGate, loadLicenseAcknowledgments, } from "@untangle-code/extension-runtime";
11
+ import { loadCliState } from "./state.js";
12
+ /** Reads discovery, acknowledgments and CLI state in one go. */
13
+ export async function loadExtensionContext(environment) {
14
+ const discovery = await discoverExtensions(environment.fs, {
15
+ roots: environment.roots,
16
+ projectRoots: environment.projectRoots,
17
+ });
18
+ const acknowledgments = await loadLicenseAcknowledgments(environment.fs, {
19
+ userDataDirectory: environment.userDataDir,
20
+ projectRoots: environment.projectRoots,
21
+ });
22
+ const state = await loadCliState(environment.fs, environment.userDataDir);
23
+ return {
24
+ discovery,
25
+ acknowledgments: acknowledgments.acknowledgments,
26
+ state: state.state,
27
+ warnings: [...acknowledgments.warnings, ...state.warnings],
28
+ };
29
+ }
30
+ /** Finds a loaded extension by id, or null. */
31
+ export function findExtension(context, extensionId) {
32
+ return context.discovery.extensions.find((entry) => entry.manifest.id === extensionId) ?? null;
33
+ }
34
+ /**
35
+ * Evaluates both gates for one extension against the stored acknowledgments.
36
+ *
37
+ * `ruleset` is the effective ruleset of the intended run; without one the
38
+ * manifest's `defaultRuleset` applies, which is what the runtime would use.
39
+ */
40
+ export function gateFor(context, extension, ruleset) {
41
+ const effective = ruleset ?? extension.manifest.defaultRuleset;
42
+ return evaluateLicenseGate({
43
+ extension,
44
+ acknowledgments: context.acknowledgments,
45
+ ...(effective === undefined ? {} : { ruleset: effective }),
46
+ });
47
+ }
48
+ /**
49
+ * Explains why an id is not installed, naming the manifests that were
50
+ * rejected or ignored for it. "Not found" without a reason is exactly the
51
+ * silent skip E4 forbids.
52
+ */
53
+ export function explainMissing(context, extensionId) {
54
+ const rejected = context.discovery.rejected.filter((entry) => entry.directoryName === extensionId || entry.manifestPath.includes(`/${extensionId}/`));
55
+ if (rejected.length > 0) {
56
+ const reasons = rejected
57
+ .flatMap((entry) => entry.issues.map((issue) => `${issue.field}: ${issue.message}`))
58
+ .join("; ");
59
+ return `extension "${extensionId}" has a manifest but it was rejected — ${reasons}`;
60
+ }
61
+ const ignored = context.discovery.ignored.filter((entry) => entry.manifestPath.includes(`/${extensionId}/`));
62
+ if (ignored.length > 0) {
63
+ const reasons = ignored.map((entry) => `${entry.reason}: ${entry.detail}`).join("; ");
64
+ return `extension "${extensionId}" was found but not loaded — ${reasons}`;
65
+ }
66
+ const roots = context.discovery.rootsScanned
67
+ .map((entry) => `${entry.root}${entry.exists ? "" : " (does not exist)"}`)
68
+ .join(", ");
69
+ return (`no extension "${extensionId}" is installed; searched: ${roots}. ` +
70
+ `Install one with: untangle extensions add --from <path-or-url>`);
71
+ }
72
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/commands/extensions/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ParsedArgs } from "../../cli/args.js";
2
+ import { type Io } from "../../cli/io.js";
3
+ import type { ExtensionEnvironmentV1 } from "./environment.js";
4
+ export declare function runEnable(environment: ExtensionEnvironmentV1, args: ParsedArgs, io: Io, format: "text" | "json"): Promise<number>;
5
+ export declare function runDisable(environment: ExtensionEnvironmentV1, args: ParsedArgs, io: Io, format: "text" | "json"): Promise<number>;
6
+ //# sourceMappingURL=enable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/enable.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAc,KAAK,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAItD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAU/D,wBAAsB,SAAS,CAC7B,WAAW,EAAE,sBAAsB,EACnC,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAkGjB;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,sBAAsB,EACnC,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAuFjB"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * `untangle extensions enable <id>` / `disable <id>`
3
+ *
4
+ * These exist because the runtime's license gate prints them. When a gate is
5
+ * unacknowledged the runtime hands back the exact command that would grant
6
+ * the acknowledgment (extensions.md §9.5), and a printed command that does
7
+ * not exist is worse than no hint at all.
8
+ *
9
+ * `enable` records the opt-in and, with the acknowledgment flags, the
10
+ * personal license declaration. It starts nothing: no process, no pull, no
11
+ * container (X1). `disable` reverses the opt-in and, with `--revoke-license`,
12
+ * the declaration (§9.3).
13
+ *
14
+ * The tool gate and the ruleset gate are separate. `--acknowledge-license`
15
+ * covers the tool ONLY; a restricted ruleset still needs its own
16
+ * `--acknowledge-ruleset=<id>`, which is repeatable.
17
+ */
18
+ import { buildAcknowledgment, createNodeProcessRunner, defaultProcessLimits, } from "@untangle-code/extension-runtime";
19
+ import { boolFlag, listFlag } from "../../cli/args.js";
20
+ import { EXIT, OperationalError, UsageError } from "../../cli/exit.js";
21
+ import { line, note } from "../../cli/io.js";
22
+ import { createContainerCli } from "./container.js";
23
+ import { explainMissing, findExtension, gateFor, loadExtensionContext } from "./context.js";
24
+ import { composeFilePath } from "./provision.js";
25
+ import { emitJson } from "./render.js";
26
+ import { revokeAcknowledgments, saveAcknowledgments, saveCliState, upsertAcknowledgment, } from "./state.js";
27
+ export async function runEnable(environment, args, io, format) {
28
+ const extensionId = args.positionals[1];
29
+ if (extensionId === undefined) {
30
+ throw new UsageError("`untangle extensions enable` needs an extension id.", "Run `untangle extensions list` to see the installed ids.");
31
+ }
32
+ const context = await loadExtensionContext(environment);
33
+ const extension = findExtension(context, extensionId);
34
+ if (extension === null) {
35
+ throw new OperationalError(explainMissing(context, extensionId), "Install it first: untangle extensions add --from=<path-or-url>");
36
+ }
37
+ let acknowledgments = context.acknowledgments;
38
+ const acknowledgedNow = [];
39
+ if (boolFlag(args, "acknowledge-license")) {
40
+ acknowledgments = upsertAcknowledgment(acknowledgments, buildAcknowledgment({
41
+ manifest: extension.manifest,
42
+ acknowledgedAt: environment.clock.nowIso(),
43
+ acknowledgedBy: environment.userName,
44
+ }));
45
+ acknowledgedNow.push(`tool:${extensionId}`);
46
+ }
47
+ for (const ruleset of listFlag(args, "acknowledge-ruleset")) {
48
+ acknowledgments = upsertAcknowledgment(acknowledgments, buildAcknowledgment({
49
+ manifest: extension.manifest,
50
+ ruleset,
51
+ acknowledgedAt: environment.clock.nowIso(),
52
+ acknowledgedBy: environment.userName,
53
+ }));
54
+ acknowledgedNow.push(`ruleset:${ruleset}`);
55
+ }
56
+ let acknowledgmentFile;
57
+ if (acknowledgedNow.length > 0) {
58
+ acknowledgmentFile = await saveAcknowledgments(environment.fs, environment.userDataDir, acknowledgments);
59
+ }
60
+ const enabled = context.state.enabled.includes(extensionId)
61
+ ? context.state.enabled
62
+ : [...context.state.enabled, extensionId];
63
+ const statePath = await saveCliState(environment.fs, environment.userDataDir, {
64
+ ...context.state,
65
+ enabled,
66
+ });
67
+ const gate = gateFor({ ...context, acknowledgments }, extension);
68
+ if (format === "json") {
69
+ emitJson(io, {
70
+ command: "extensions enable",
71
+ extensionId,
72
+ enabled: true,
73
+ started: false,
74
+ stateFile: statePath,
75
+ acknowledgedNow,
76
+ acknowledgmentFile,
77
+ licenseGate: {
78
+ allowed: gate.allowed,
79
+ tool: { status: gate.tool.status, reason: gate.tool.reason },
80
+ rulesets: gate.rulesets.map((entry) => ({
81
+ ruleset: entry.ruleset,
82
+ status: entry.status,
83
+ reason: entry.reason,
84
+ })),
85
+ acknowledgeCommands: gate.acknowledgeCommands,
86
+ },
87
+ });
88
+ }
89
+ else {
90
+ line(io, `enabled "${extensionId}" — nothing was started (X1).`);
91
+ line(io, ` state ${statePath}`);
92
+ line(io, ` license ${gate.tool.status} — ${gate.tool.reason}`);
93
+ for (const entry of gate.rulesets) {
94
+ line(io, ` ruleset ${entry.ruleset}: ${entry.status} — ${entry.reason}`);
95
+ }
96
+ }
97
+ if (!gate.allowed) {
98
+ note(io, "The license gate is still open; run:");
99
+ for (const command of gate.acknowledgeCommands) {
100
+ note(io, ` ${command}`);
101
+ }
102
+ return EXIT.environment;
103
+ }
104
+ return EXIT.ok;
105
+ }
106
+ export async function runDisable(environment, args, io, format) {
107
+ const extensionId = args.positionals[1];
108
+ if (extensionId === undefined) {
109
+ throw new UsageError("`untangle extensions disable` needs an extension id.", "Run `untangle extensions list` to see the installed ids.");
110
+ }
111
+ // Die Flag-Pruefung steht VOR jeder Zustandsaenderung. Zuvor lag sie danach:
112
+ // ein Aufruf, den die CLI im selben Atemzug als Aufruffehler zurueckwies,
113
+ // hatte die Extension bereits deaktiviert. Ein abgelehnter Befehl darf nichts
114
+ // getan haben.
115
+ const removeContainer = boolFlag(args, "remove-container");
116
+ const removeVolumes = boolFlag(args, "remove-volumes");
117
+ if (removeVolumes && !removeContainer) {
118
+ throw new UsageError("--remove-volumes only applies together with --remove-container.", `Run untangle extensions disable ${extensionId} --remove-container --remove-volumes`);
119
+ }
120
+ const context = await loadExtensionContext(environment);
121
+ const statePath = await saveCliState(environment.fs, environment.userDataDir, {
122
+ ...context.state,
123
+ enabled: context.state.enabled.filter((id) => id !== extensionId),
124
+ });
125
+ // `--remove-container` fasst NUR den eigenen Container an; die Besitzprobe
126
+ // liegt im Adapter und laesst einen fremden gleichen Namens unberuehrt.
127
+ // Volumes bleiben ohne die zweite, ausdrueckliche Anweisung erhalten: ein
128
+ // geloeschtes Volume ist die einzige hier moegliche Handlung, die Arbeit
129
+ // vernichtet, die niemand wiederherstellen kann.
130
+ let containerDetail;
131
+ if (removeContainer) {
132
+ const installed = findExtension(context, extensionId);
133
+ const manifest = installed?.manifest;
134
+ if (manifest?.container === undefined) {
135
+ containerDetail = `"${extensionId}" declares no container; nothing to remove`;
136
+ }
137
+ else {
138
+ const containerCli = createContainerCli({
139
+ processRunner: createNodeProcessRunner(environment.clock),
140
+ limits: { ...defaultProcessLimits(), timeoutMs: 120_000 },
141
+ ...(environment.env["UNTANGLE_CONTAINER_CLI"] === undefined
142
+ ? {}
143
+ : { command: environment.env["UNTANGLE_CONTAINER_CLI"] }),
144
+ });
145
+ const down = await containerCli.down({
146
+ manifest,
147
+ composeFilePath: composeFilePath(environment.userDataDir, manifest.id),
148
+ removeVolumes,
149
+ });
150
+ containerDetail = down.detail;
151
+ }
152
+ }
153
+ let acknowledgmentFile;
154
+ const revoked = boolFlag(args, "revoke-license");
155
+ if (revoked) {
156
+ acknowledgmentFile = await saveAcknowledgments(environment.fs, environment.userDataDir, revokeAcknowledgments(context.acknowledgments, extensionId, environment.clock.nowIso()));
157
+ }
158
+ if (format === "json") {
159
+ emitJson(io, {
160
+ command: "extensions disable",
161
+ extensionId,
162
+ enabled: false,
163
+ stateFile: statePath,
164
+ licenseAcknowledgment: revoked ? "revoked" : "kept",
165
+ acknowledgmentFile,
166
+ ...(containerDetail === undefined ? {} : { container: containerDetail }),
167
+ });
168
+ }
169
+ else {
170
+ line(io, `disabled "${extensionId}".`);
171
+ line(io, revoked
172
+ ? ` license acknowledgment revoked in ${String(acknowledgmentFile)}`
173
+ : " license acknowledgment kept (use --revoke-license to drop it)");
174
+ if (containerDetail !== undefined) {
175
+ line(io, ` container ${containerDetail}`);
176
+ }
177
+ }
178
+ return EXIT.ok;
179
+ }
180
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/commands/extensions/enable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { Clock, FileSystemPort, Random } from "@untangle-code/domain";
2
+ export interface ExtensionEnvironmentV1 {
3
+ fs: FileSystemPort;
4
+ clock: Clock;
5
+ random: Random;
6
+ /** Directory the user invoked the CLI from, canonicalized where possible. */
7
+ cwd: string;
8
+ /** Search roots for user-installed extensions; `roots[0]` is the install target. */
9
+ roots: string[];
10
+ /** OS-specific user data directory (holds the acknowledgment file). */
11
+ userDataDir: string;
12
+ /** Directories that MUST NOT be scanned for manifests. */
13
+ projectRoots: string[];
14
+ /** OS user name — an acknowledgment is a personal declaration. */
15
+ userName: string;
16
+ env: Readonly<Record<string, string | undefined>>;
17
+ }
18
+ export interface CreateExtensionEnvironmentOptions {
19
+ cwd: string;
20
+ env: Readonly<Record<string, string | undefined>>;
21
+ fs?: FileSystemPort;
22
+ clock?: Clock;
23
+ random?: Random;
24
+ homeDir?: string;
25
+ platform?: string;
26
+ userName?: string;
27
+ }
28
+ export declare function createExtensionEnvironment(options: CreateExtensionEnvironmentOptions): Promise<ExtensionEnvironmentV1>;
29
+ /**
30
+ * Determines which directories must be treated as project directories.
31
+ *
32
+ * Walks from `start` up to the filesystem root and collects every directory
33
+ * carrying a project marker; if at least one is found, `start` itself joins
34
+ * the list, because the working directory inside a project is part of that
35
+ * project.
36
+ *
37
+ * Two deliberate exclusions:
38
+ *
39
+ * - **The home directory is never a project root.** A dotfiles repository in
40
+ * `$HOME` is ordinary, and treating `$HOME` as a project would put
41
+ * `~/.untangle/extensions` inside a project directory — which would make the
42
+ * user's own extension root unscannable the moment they ran the CLI from
43
+ * their home directory. The boundary is meant to keep a stranger's
44
+ * repository out, not to lock people out of their own profile.
45
+ * - **A directory with no marker anywhere above it yields no project roots at
46
+ * all.** Without a marker there is no project to protect, and a bare
47
+ * directory the user made themselves is theirs. The consequence is stated
48
+ * openly: `add --from ./manifest.toml` in such a directory is NOT refused.
49
+ * A cloned repository always carries `.git`, so the case the boundary exists
50
+ * for is still covered.
51
+ */
52
+ export declare function discoverProjectRoots(fs: FileSystemPort, start: string, homeDir?: string): Promise<string[]>;
53
+ /** True when `candidate` lies inside any of `roots`. */
54
+ export declare function isInsideAnyRoot(candidate: string, roots: readonly string[]): boolean;
55
+ /** Resolves a user-supplied path against the working directory. */
56
+ export declare function resolveUserPath(cwd: string, path: string): string;
57
+ /**
58
+ * Canonical form of a path, with symlinks resolved.
59
+ *
60
+ * This is not cosmetic. `isProjectLocalManifest` and `isInsideDirectory`
61
+ * compare LEXICALLY and say so: they never resolve symlinks, and the caller is
62
+ * expected to hand them canonical paths. Skipping this step would leave the
63
+ * project boundary trivially escapable — a symlink, or on macOS merely the
64
+ * `/var` → `/private/var` alias, is enough to make a path inside a project
65
+ * compare as if it were outside one.
66
+ *
67
+ * A path that does not exist yet still gets canonicalized as far as it does
68
+ * exist: the deepest existing ancestor is resolved and the remaining segments
69
+ * are re-appended. Failing the whole command over a not-yet-created file would
70
+ * be worse than a partially canonical answer, and the ancestor is the part
71
+ * that decides containment.
72
+ */
73
+ export declare function canonicalize(fs: FileSystemPort, path: string): Promise<string>;
74
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/environment.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAW3E,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,cAAc,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iCAAiC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAClD,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,sBAAsB,CAAC,CAsBjC;AAUD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAWD,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEpF;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBpF"}