@untangle-code/cli 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +424 -2
  4. package/THIRD_PARTY_LICENSES.md +152 -0
  5. package/dist/cli/args.d.ts +48 -0
  6. package/dist/cli/args.d.ts.map +1 -0
  7. package/dist/cli/args.js +167 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/command.d.ts +69 -0
  10. package/dist/cli/command.d.ts.map +1 -0
  11. package/dist/cli/command.js +82 -0
  12. package/dist/cli/command.js.map +1 -0
  13. package/dist/cli/deadline.d.ts +33 -0
  14. package/dist/cli/deadline.d.ts.map +1 -0
  15. package/dist/cli/deadline.js +49 -0
  16. package/dist/cli/deadline.js.map +1 -0
  17. package/dist/cli/embedder-deadline.d.ts +72 -0
  18. package/dist/cli/embedder-deadline.d.ts.map +1 -0
  19. package/dist/cli/embedder-deadline.js +117 -0
  20. package/dist/cli/embedder-deadline.js.map +1 -0
  21. package/dist/cli/exit.d.ts +71 -0
  22. package/dist/cli/exit.d.ts.map +1 -0
  23. package/dist/cli/exit.js +81 -0
  24. package/dist/cli/exit.js.map +1 -0
  25. package/dist/cli/graphs.d.ts +65 -0
  26. package/dist/cli/graphs.d.ts.map +1 -0
  27. package/dist/cli/graphs.js +108 -0
  28. package/dist/cli/graphs.js.map +1 -0
  29. package/dist/cli/index-freshness.d.ts +13 -0
  30. package/dist/cli/index-freshness.d.ts.map +1 -0
  31. package/dist/cli/index-freshness.js +226 -0
  32. package/dist/cli/index-freshness.js.map +1 -0
  33. package/dist/cli/index-refresh.d.ts +10 -0
  34. package/dist/cli/index-refresh.d.ts.map +1 -0
  35. package/dist/cli/index-refresh.js +76 -0
  36. package/dist/cli/index-refresh.js.map +1 -0
  37. package/dist/cli/index-state.d.ts +184 -0
  38. package/dist/cli/index-state.d.ts.map +1 -0
  39. package/dist/cli/index-state.js +852 -0
  40. package/dist/cli/index-state.js.map +1 -0
  41. package/dist/cli/io.d.ts +29 -0
  42. package/dist/cli/io.d.ts.map +1 -0
  43. package/dist/cli/io.js +42 -0
  44. package/dist/cli/io.js.map +1 -0
  45. package/dist/cli/language-support.d.ts +77 -0
  46. package/dist/cli/language-support.d.ts.map +1 -0
  47. package/dist/cli/language-support.js +152 -0
  48. package/dist/cli/language-support.js.map +1 -0
  49. package/dist/cli/renewing-lease.d.ts +26 -0
  50. package/dist/cli/renewing-lease.d.ts.map +1 -0
  51. package/dist/cli/renewing-lease.js +102 -0
  52. package/dist/cli/renewing-lease.js.map +1 -0
  53. package/dist/cli/search-graph-enrichment.d.ts +16 -0
  54. package/dist/cli/search-graph-enrichment.d.ts.map +1 -0
  55. package/dist/cli/search-graph-enrichment.js +428 -0
  56. package/dist/cli/search-graph-enrichment.js.map +1 -0
  57. package/dist/cli/system.d.ts +34 -0
  58. package/dist/cli/system.d.ts.map +1 -0
  59. package/dist/cli/system.js +89 -0
  60. package/dist/cli/system.js.map +1 -0
  61. package/dist/cli/vector-store-policy.d.ts +116 -0
  62. package/dist/cli/vector-store-policy.d.ts.map +1 -0
  63. package/dist/cli/vector-store-policy.js +160 -0
  64. package/dist/cli/vector-store-policy.js.map +1 -0
  65. package/dist/cli/version.d.ts +3 -0
  66. package/dist/cli/version.d.ts.map +1 -0
  67. package/dist/cli/version.js +3 -0
  68. package/dist/cli/version.js.map +1 -0
  69. package/dist/cli/workspace.d.ts +105 -0
  70. package/dist/cli/workspace.d.ts.map +1 -0
  71. package/dist/cli/workspace.js +215 -0
  72. package/dist/cli/workspace.js.map +1 -0
  73. package/dist/commands/complexity.d.ts +72 -0
  74. package/dist/commands/complexity.d.ts.map +1 -0
  75. package/dist/commands/complexity.js +580 -0
  76. package/dist/commands/complexity.js.map +1 -0
  77. package/dist/commands/doctor.d.ts +66 -0
  78. package/dist/commands/doctor.d.ts.map +1 -0
  79. package/dist/commands/doctor.js +764 -0
  80. package/dist/commands/doctor.js.map +1 -0
  81. package/dist/commands/doctor.languages.d.ts +37 -0
  82. package/dist/commands/doctor.languages.d.ts.map +1 -0
  83. package/dist/commands/doctor.languages.js +143 -0
  84. package/dist/commands/doctor.languages.js.map +1 -0
  85. package/dist/commands/doctor.storage.d.ts +17 -0
  86. package/dist/commands/doctor.storage.d.ts.map +1 -0
  87. package/dist/commands/doctor.storage.js +91 -0
  88. package/dist/commands/doctor.storage.js.map +1 -0
  89. package/dist/commands/extensions/add.d.ts +10 -0
  90. package/dist/commands/extensions/add.d.ts.map +1 -0
  91. package/dist/commands/extensions/add.js +213 -0
  92. package/dist/commands/extensions/add.js.map +1 -0
  93. package/dist/commands/extensions/configure.d.ts +5 -0
  94. package/dist/commands/extensions/configure.d.ts.map +1 -0
  95. package/dist/commands/extensions/configure.js +58 -0
  96. package/dist/commands/extensions/configure.js.map +1 -0
  97. package/dist/commands/extensions/container.d.ts +15 -0
  98. package/dist/commands/extensions/container.d.ts.map +1 -0
  99. package/dist/commands/extensions/container.js +135 -0
  100. package/dist/commands/extensions/container.js.map +1 -0
  101. package/dist/commands/extensions/context.d.ts +37 -0
  102. package/dist/commands/extensions/context.d.ts.map +1 -0
  103. package/dist/commands/extensions/context.js +72 -0
  104. package/dist/commands/extensions/context.js.map +1 -0
  105. package/dist/commands/extensions/enable.d.ts +6 -0
  106. package/dist/commands/extensions/enable.d.ts.map +1 -0
  107. package/dist/commands/extensions/enable.js +180 -0
  108. package/dist/commands/extensions/enable.js.map +1 -0
  109. package/dist/commands/extensions/environment.d.ts +74 -0
  110. package/dist/commands/extensions/environment.d.ts.map +1 -0
  111. package/dist/commands/extensions/environment.js +168 -0
  112. package/dist/commands/extensions/environment.js.map +1 -0
  113. package/dist/commands/extensions/feature-scan.d.ts +48 -0
  114. package/dist/commands/extensions/feature-scan.d.ts.map +1 -0
  115. package/dist/commands/extensions/feature-scan.js +156 -0
  116. package/dist/commands/extensions/feature-scan.js.map +1 -0
  117. package/dist/commands/extensions/invoke.d.ts +60 -0
  118. package/dist/commands/extensions/invoke.d.ts.map +1 -0
  119. package/dist/commands/extensions/invoke.js +275 -0
  120. package/dist/commands/extensions/invoke.js.map +1 -0
  121. package/dist/commands/extensions/list.d.ts +5 -0
  122. package/dist/commands/extensions/list.d.ts.map +1 -0
  123. package/dist/commands/extensions/list.js +125 -0
  124. package/dist/commands/extensions/list.js.map +1 -0
  125. package/dist/commands/extensions/logs.d.ts +5 -0
  126. package/dist/commands/extensions/logs.d.ts.map +1 -0
  127. package/dist/commands/extensions/logs.js +74 -0
  128. package/dist/commands/extensions/logs.js.map +1 -0
  129. package/dist/commands/extensions/provision.d.ts +36 -0
  130. package/dist/commands/extensions/provision.d.ts.map +1 -0
  131. package/dist/commands/extensions/provision.js +137 -0
  132. package/dist/commands/extensions/provision.js.map +1 -0
  133. package/dist/commands/extensions/remove.d.ts +5 -0
  134. package/dist/commands/extensions/remove.d.ts.map +1 -0
  135. package/dist/commands/extensions/remove.js +77 -0
  136. package/dist/commands/extensions/remove.js.map +1 -0
  137. package/dist/commands/extensions/render.d.ts +16 -0
  138. package/dist/commands/extensions/render.d.ts.map +1 -0
  139. package/dist/commands/extensions/render.js +25 -0
  140. package/dist/commands/extensions/render.js.map +1 -0
  141. package/dist/commands/extensions/run.d.ts +30 -0
  142. package/dist/commands/extensions/run.d.ts.map +1 -0
  143. package/dist/commands/extensions/run.js +292 -0
  144. package/dist/commands/extensions/run.js.map +1 -0
  145. package/dist/commands/extensions/secret-store.d.ts +15 -0
  146. package/dist/commands/extensions/secret-store.d.ts.map +1 -0
  147. package/dist/commands/extensions/secret-store.js +164 -0
  148. package/dist/commands/extensions/secret-store.js.map +1 -0
  149. package/dist/commands/extensions/setup.d.ts +17 -0
  150. package/dist/commands/extensions/setup.d.ts.map +1 -0
  151. package/dist/commands/extensions/setup.js +94 -0
  152. package/dist/commands/extensions/setup.js.map +1 -0
  153. package/dist/commands/extensions/source.d.ts +47 -0
  154. package/dist/commands/extensions/source.d.ts.map +1 -0
  155. package/dist/commands/extensions/source.js +142 -0
  156. package/dist/commands/extensions/source.js.map +1 -0
  157. package/dist/commands/extensions/state.d.ts +62 -0
  158. package/dist/commands/extensions/state.d.ts.map +1 -0
  159. package/dist/commands/extensions/state.js +177 -0
  160. package/dist/commands/extensions/state.js.map +1 -0
  161. package/dist/commands/extensions/status.d.ts +9 -0
  162. package/dist/commands/extensions/status.d.ts.map +1 -0
  163. package/dist/commands/extensions/status.js +239 -0
  164. package/dist/commands/extensions/status.js.map +1 -0
  165. package/dist/commands/extensions.d.ts +3 -0
  166. package/dist/commands/extensions.d.ts.map +1 -0
  167. package/dist/commands/extensions.js +223 -0
  168. package/dist/commands/extensions.js.map +1 -0
  169. package/dist/commands/flow/index.d.ts +3 -0
  170. package/dist/commands/flow/index.d.ts.map +1 -0
  171. package/dist/commands/flow/index.js +295 -0
  172. package/dist/commands/flow/index.js.map +1 -0
  173. package/dist/commands/flow/limits.d.ts +12 -0
  174. package/dist/commands/flow/limits.d.ts.map +1 -0
  175. package/dist/commands/flow/limits.js +13 -0
  176. package/dist/commands/flow/limits.js.map +1 -0
  177. package/dist/commands/flow/output.d.ts +8 -0
  178. package/dist/commands/flow/output.d.ts.map +1 -0
  179. package/dist/commands/flow/output.js +11 -0
  180. package/dist/commands/flow/output.js.map +1 -0
  181. package/dist/commands/flow/render.d.ts +51 -0
  182. package/dist/commands/flow/render.d.ts.map +1 -0
  183. package/dist/commands/flow/render.js +220 -0
  184. package/dist/commands/flow/render.js.map +1 -0
  185. package/dist/commands/flow/select.d.ts +31 -0
  186. package/dist/commands/flow/select.d.ts.map +1 -0
  187. package/dist/commands/flow/select.js +62 -0
  188. package/dist/commands/flow/select.js.map +1 -0
  189. package/dist/commands/graph/boundaries-input.d.ts +26 -0
  190. package/dist/commands/graph/boundaries-input.d.ts.map +1 -0
  191. package/dist/commands/graph/boundaries-input.js +54 -0
  192. package/dist/commands/graph/boundaries-input.js.map +1 -0
  193. package/dist/commands/graph/boundaries.d.ts +4 -0
  194. package/dist/commands/graph/boundaries.d.ts.map +1 -0
  195. package/dist/commands/graph/boundaries.js +141 -0
  196. package/dist/commands/graph/boundaries.js.map +1 -0
  197. package/dist/commands/graph/bounds.d.ts +16 -0
  198. package/dist/commands/graph/bounds.d.ts.map +1 -0
  199. package/dist/commands/graph/bounds.js +22 -0
  200. package/dist/commands/graph/bounds.js.map +1 -0
  201. package/dist/commands/graph/category-clusters.d.ts +20 -0
  202. package/dist/commands/graph/category-clusters.d.ts.map +1 -0
  203. package/dist/commands/graph/category-clusters.js +158 -0
  204. package/dist/commands/graph/category-clusters.js.map +1 -0
  205. package/dist/commands/graph/feature-3d.d.ts +22 -0
  206. package/dist/commands/graph/feature-3d.d.ts.map +1 -0
  207. package/dist/commands/graph/feature-3d.js +114 -0
  208. package/dist/commands/graph/feature-3d.js.map +1 -0
  209. package/dist/commands/graph/feature-clusters.d.ts +17 -0
  210. package/dist/commands/graph/feature-clusters.d.ts.map +1 -0
  211. package/dist/commands/graph/feature-clusters.js +94 -0
  212. package/dist/commands/graph/feature-clusters.js.map +1 -0
  213. package/dist/commands/graph/feature-html.d.ts +26 -0
  214. package/dist/commands/graph/feature-html.d.ts.map +1 -0
  215. package/dist/commands/graph/feature-html.js +314 -0
  216. package/dist/commands/graph/feature-html.js.map +1 -0
  217. package/dist/commands/graph/feature-map.d.ts +31 -0
  218. package/dist/commands/graph/feature-map.d.ts.map +1 -0
  219. package/dist/commands/graph/feature-map.js +217 -0
  220. package/dist/commands/graph/feature-map.js.map +1 -0
  221. package/dist/commands/graph/feature-model.d.ts +55 -0
  222. package/dist/commands/graph/feature-model.d.ts.map +1 -0
  223. package/dist/commands/graph/feature-model.js +167 -0
  224. package/dist/commands/graph/feature-model.js.map +1 -0
  225. package/dist/commands/graph/feature-untangle-motion.d.ts +33 -0
  226. package/dist/commands/graph/feature-untangle-motion.d.ts.map +1 -0
  227. package/dist/commands/graph/feature-untangle-motion.js +155 -0
  228. package/dist/commands/graph/feature-untangle-motion.js.map +1 -0
  229. package/dist/commands/graph/index.d.ts +3 -0
  230. package/dist/commands/graph/index.d.ts.map +1 -0
  231. package/dist/commands/graph/index.js +414 -0
  232. package/dist/commands/graph/index.js.map +1 -0
  233. package/dist/commands/graph/render.d.ts +63 -0
  234. package/dist/commands/graph/render.d.ts.map +1 -0
  235. package/dist/commands/graph/render.js +352 -0
  236. package/dist/commands/graph/render.js.map +1 -0
  237. package/dist/commands/graph/select.d.ts +34 -0
  238. package/dist/commands/graph/select.d.ts.map +1 -0
  239. package/dist/commands/graph/select.js +55 -0
  240. package/dist/commands/graph/select.js.map +1 -0
  241. package/dist/commands/index/index.d.ts +6 -0
  242. package/dist/commands/index/index.d.ts.map +1 -0
  243. package/dist/commands/index/index.js +461 -0
  244. package/dist/commands/index/index.js.map +1 -0
  245. package/dist/commands/index/render.d.ts +53 -0
  246. package/dist/commands/index/render.d.ts.map +1 -0
  247. package/dist/commands/index/render.js +205 -0
  248. package/dist/commands/index/render.js.map +1 -0
  249. package/dist/commands/index/target.d.ts +34 -0
  250. package/dist/commands/index/target.d.ts.map +1 -0
  251. package/dist/commands/index/target.js +97 -0
  252. package/dist/commands/index/target.js.map +1 -0
  253. package/dist/commands/index-watch.d.ts +30 -0
  254. package/dist/commands/index-watch.d.ts.map +1 -0
  255. package/dist/commands/index-watch.js +138 -0
  256. package/dist/commands/index-watch.js.map +1 -0
  257. package/dist/commands/init/command.d.ts +25 -0
  258. package/dist/commands/init/command.d.ts.map +1 -0
  259. package/dist/commands/init/command.js +198 -0
  260. package/dist/commands/init/command.js.map +1 -0
  261. package/dist/commands/init/config-draft.d.ts +48 -0
  262. package/dist/commands/init/config-draft.d.ts.map +1 -0
  263. package/dist/commands/init/config-draft.js +201 -0
  264. package/dist/commands/init/config-draft.js.map +1 -0
  265. package/dist/commands/init/diff.d.ts +33 -0
  266. package/dist/commands/init/diff.d.ts.map +1 -0
  267. package/dist/commands/init/diff.js +109 -0
  268. package/dist/commands/init/diff.js.map +1 -0
  269. package/dist/commands/init/http-probe.d.ts +26 -0
  270. package/dist/commands/init/http-probe.d.ts.map +1 -0
  271. package/dist/commands/init/http-probe.js +144 -0
  272. package/dist/commands/init/http-probe.js.map +1 -0
  273. package/dist/commands/init/ignore-rules.d.ts +70 -0
  274. package/dist/commands/init/ignore-rules.d.ts.map +1 -0
  275. package/dist/commands/init/ignore-rules.js +146 -0
  276. package/dist/commands/init/ignore-rules.js.map +1 -0
  277. package/dist/commands/init/index.d.ts +33 -0
  278. package/dist/commands/init/index.d.ts.map +1 -0
  279. package/dist/commands/init/index.js +32 -0
  280. package/dist/commands/init/index.js.map +1 -0
  281. package/dist/commands/init/integrations-apply.d.ts +50 -0
  282. package/dist/commands/init/integrations-apply.d.ts.map +1 -0
  283. package/dist/commands/init/integrations-apply.js +452 -0
  284. package/dist/commands/init/integrations-apply.js.map +1 -0
  285. package/dist/commands/init/integrations-plan.d.ts +68 -0
  286. package/dist/commands/init/integrations-plan.d.ts.map +1 -0
  287. package/dist/commands/init/integrations-plan.js +515 -0
  288. package/dist/commands/init/integrations-plan.js.map +1 -0
  289. package/dist/commands/init/integrations.d.ts +5 -0
  290. package/dist/commands/init/integrations.d.ts.map +1 -0
  291. package/dist/commands/init/integrations.js +4 -0
  292. package/dist/commands/init/integrations.js.map +1 -0
  293. package/dist/commands/init/languages.d.ts +55 -0
  294. package/dist/commands/init/languages.d.ts.map +1 -0
  295. package/dist/commands/init/languages.js +245 -0
  296. package/dist/commands/init/languages.js.map +1 -0
  297. package/dist/commands/init/product-context.d.ts +63 -0
  298. package/dist/commands/init/product-context.d.ts.map +1 -0
  299. package/dist/commands/init/product-context.js +390 -0
  300. package/dist/commands/init/product-context.js.map +1 -0
  301. package/dist/commands/init/render.d.ts +38 -0
  302. package/dist/commands/init/render.d.ts.map +1 -0
  303. package/dist/commands/init/render.js +501 -0
  304. package/dist/commands/init/render.js.map +1 -0
  305. package/dist/commands/init/report.d.ts +24 -0
  306. package/dist/commands/init/report.d.ts.map +1 -0
  307. package/dist/commands/init/report.js +163 -0
  308. package/dist/commands/init/report.js.map +1 -0
  309. package/dist/commands/init/run.d.ts +71 -0
  310. package/dist/commands/init/run.d.ts.map +1 -0
  311. package/dist/commands/init/run.js +253 -0
  312. package/dist/commands/init/run.js.map +1 -0
  313. package/dist/commands/init/services.d.ts +82 -0
  314. package/dist/commands/init/services.d.ts.map +1 -0
  315. package/dist/commands/init/services.js +209 -0
  316. package/dist/commands/init/services.js.map +1 -0
  317. package/dist/commands/init/storage.d.ts +8 -0
  318. package/dist/commands/init/storage.d.ts.map +1 -0
  319. package/dist/commands/init/storage.js +102 -0
  320. package/dist/commands/init/storage.js.map +1 -0
  321. package/dist/commands/init/toml.d.ts +65 -0
  322. package/dist/commands/init/toml.d.ts.map +1 -0
  323. package/dist/commands/init/toml.js +159 -0
  324. package/dist/commands/init/toml.js.map +1 -0
  325. package/dist/commands/init/topology.d.ts +54 -0
  326. package/dist/commands/init/topology.d.ts.map +1 -0
  327. package/dist/commands/init/topology.js +146 -0
  328. package/dist/commands/init/topology.js.map +1 -0
  329. package/dist/commands/init/types.d.ts +334 -0
  330. package/dist/commands/init/types.d.ts.map +1 -0
  331. package/dist/commands/init/types.js +31 -0
  332. package/dist/commands/init/types.js.map +1 -0
  333. package/dist/commands/init/wizard-terminal.d.ts +36 -0
  334. package/dist/commands/init/wizard-terminal.d.ts.map +1 -0
  335. package/dist/commands/init/wizard-terminal.js +163 -0
  336. package/dist/commands/init/wizard-terminal.js.map +1 -0
  337. package/dist/commands/init/wizard.d.ts +25 -0
  338. package/dist/commands/init/wizard.d.ts.map +1 -0
  339. package/dist/commands/init/wizard.js +358 -0
  340. package/dist/commands/init/wizard.js.map +1 -0
  341. package/dist/commands/mcp.d.ts +4 -0
  342. package/dist/commands/mcp.d.ts.map +1 -0
  343. package/dist/commands/mcp.js +111 -0
  344. package/dist/commands/mcp.js.map +1 -0
  345. package/dist/commands/product-test-runner.d.ts +4 -0
  346. package/dist/commands/product-test-runner.d.ts.map +1 -0
  347. package/dist/commands/product-test-runner.js +85 -0
  348. package/dist/commands/product-test-runner.js.map +1 -0
  349. package/dist/commands/product.d.ts +16 -0
  350. package/dist/commands/product.d.ts.map +1 -0
  351. package/dist/commands/product.js +262 -0
  352. package/dist/commands/product.js.map +1 -0
  353. package/dist/commands/query.d.ts +114 -0
  354. package/dist/commands/query.d.ts.map +1 -0
  355. package/dist/commands/query.js +783 -0
  356. package/dist/commands/query.js.map +1 -0
  357. package/dist/commands/scan.d.ts +10 -0
  358. package/dist/commands/scan.d.ts.map +1 -0
  359. package/dist/commands/scan.js +302 -0
  360. package/dist/commands/scan.js.map +1 -0
  361. package/dist/commands/sdd.d.ts +24 -0
  362. package/dist/commands/sdd.d.ts.map +1 -0
  363. package/dist/commands/sdd.js +195 -0
  364. package/dist/commands/sdd.js.map +1 -0
  365. package/dist/commands/unavailable.d.ts +40 -0
  366. package/dist/commands/unavailable.d.ts.map +1 -0
  367. package/dist/commands/unavailable.js +73 -0
  368. package/dist/commands/unavailable.js.map +1 -0
  369. package/dist/commands/watch/analyze.d.ts +69 -0
  370. package/dist/commands/watch/analyze.d.ts.map +1 -0
  371. package/dist/commands/watch/analyze.js +402 -0
  372. package/dist/commands/watch/analyze.js.map +1 -0
  373. package/dist/commands/watch/cli.d.ts +8 -0
  374. package/dist/commands/watch/cli.d.ts.map +1 -0
  375. package/dist/commands/watch/cli.js +97 -0
  376. package/dist/commands/watch/cli.js.map +1 -0
  377. package/dist/commands/watch/delta.d.ts +46 -0
  378. package/dist/commands/watch/delta.d.ts.map +1 -0
  379. package/dist/commands/watch/delta.js +170 -0
  380. package/dist/commands/watch/delta.js.map +1 -0
  381. package/dist/commands/watch/events.d.ts +214 -0
  382. package/dist/commands/watch/events.d.ts.map +1 -0
  383. package/dist/commands/watch/events.js +13 -0
  384. package/dist/commands/watch/events.js.map +1 -0
  385. package/dist/commands/watch/index.d.ts +19 -0
  386. package/dist/commands/watch/index.d.ts.map +1 -0
  387. package/dist/commands/watch/index.js +15 -0
  388. package/dist/commands/watch/index.js.map +1 -0
  389. package/dist/commands/watch/options.d.ts +43 -0
  390. package/dist/commands/watch/options.d.ts.map +1 -0
  391. package/dist/commands/watch/options.js +193 -0
  392. package/dist/commands/watch/options.js.map +1 -0
  393. package/dist/commands/watch/render.d.ts +26 -0
  394. package/dist/commands/watch/render.d.ts.map +1 -0
  395. package/dist/commands/watch/render.js +175 -0
  396. package/dist/commands/watch/render.js.map +1 -0
  397. package/dist/commands/watch/run.d.ts +14 -0
  398. package/dist/commands/watch/run.d.ts.map +1 -0
  399. package/dist/commands/watch/run.js +460 -0
  400. package/dist/commands/watch/run.js.map +1 -0
  401. package/dist/commands/watch/runtime.d.ts +67 -0
  402. package/dist/commands/watch/runtime.d.ts.map +1 -0
  403. package/dist/commands/watch/runtime.js +149 -0
  404. package/dist/commands/watch/runtime.js.map +1 -0
  405. package/dist/commands/watch-command.d.ts +3 -0
  406. package/dist/commands/watch-command.d.ts.map +1 -0
  407. package/dist/commands/watch-command.js +273 -0
  408. package/dist/commands/watch-command.js.map +1 -0
  409. package/dist/entry-point.d.ts +11 -0
  410. package/dist/entry-point.d.ts.map +1 -0
  411. package/dist/entry-point.js +65 -0
  412. package/dist/entry-point.js.map +1 -0
  413. package/dist/index.d.ts +38 -0
  414. package/dist/index.d.ts.map +1 -0
  415. package/dist/index.js +245 -0
  416. package/dist/index.js.map +1 -0
  417. package/dist/mcp/boundaries-schema.d.ts +262 -0
  418. package/dist/mcp/boundaries-schema.d.ts.map +1 -0
  419. package/dist/mcp/boundaries-schema.js +183 -0
  420. package/dist/mcp/boundaries-schema.js.map +1 -0
  421. package/dist/mcp/default-runtime.d.ts +16 -0
  422. package/dist/mcp/default-runtime.d.ts.map +1 -0
  423. package/dist/mcp/default-runtime.js +718 -0
  424. package/dist/mcp/default-runtime.js.map +1 -0
  425. package/dist/mcp/envelope.d.ts +13 -0
  426. package/dist/mcp/envelope.d.ts.map +1 -0
  427. package/dist/mcp/envelope.js +29 -0
  428. package/dist/mcp/envelope.js.map +1 -0
  429. package/dist/mcp/index.d.ts +8 -0
  430. package/dist/mcp/index.d.ts.map +1 -0
  431. package/dist/mcp/index.js +8 -0
  432. package/dist/mcp/index.js.map +1 -0
  433. package/dist/mcp/output-schemas.d.ts +5928 -0
  434. package/dist/mcp/output-schemas.d.ts.map +1 -0
  435. package/dist/mcp/output-schemas.js +2814 -0
  436. package/dist/mcp/output-schemas.js.map +1 -0
  437. package/dist/mcp/path-sandbox.d.ts +35 -0
  438. package/dist/mcp/path-sandbox.d.ts.map +1 -0
  439. package/dist/mcp/path-sandbox.js +128 -0
  440. package/dist/mcp/path-sandbox.js.map +1 -0
  441. package/dist/mcp/server.d.ts +155 -0
  442. package/dist/mcp/server.d.ts.map +1 -0
  443. package/dist/mcp/server.js +257 -0
  444. package/dist/mcp/server.js.map +1 -0
  445. package/dist/mcp/stdio.d.ts +20 -0
  446. package/dist/mcp/stdio.d.ts.map +1 -0
  447. package/dist/mcp/stdio.js +71 -0
  448. package/dist/mcp/stdio.js.map +1 -0
  449. package/dist/mcp/tools.d.ts +355 -0
  450. package/dist/mcp/tools.d.ts.map +1 -0
  451. package/dist/mcp/tools.js +319 -0
  452. package/dist/mcp/tools.js.map +1 -0
  453. package/dist/mcp/types.d.ts +15 -0
  454. package/dist/mcp/types.d.ts.map +1 -0
  455. package/dist/mcp/types.js +45 -0
  456. package/dist/mcp/types.js.map +1 -0
  457. package/package.json +99 -3
  458. package/src/cli/args.ts +231 -0
  459. package/src/cli/command.ts +146 -0
  460. package/src/cli/deadline.ts +56 -0
  461. package/src/cli/embedder-deadline.ts +187 -0
  462. package/src/cli/exit.ts +94 -0
  463. package/src/cli/graphs.ts +191 -0
  464. package/src/cli/index-freshness.ts +303 -0
  465. package/src/cli/index-refresh.ts +125 -0
  466. package/src/cli/index-state.ts +1217 -0
  467. package/src/cli/io.ts +56 -0
  468. package/src/cli/language-support.ts +203 -0
  469. package/src/cli/renewing-lease.ts +121 -0
  470. package/src/cli/search-graph-enrichment.ts +639 -0
  471. package/src/cli/system.ts +94 -0
  472. package/src/cli/vector-store-policy.ts +213 -0
  473. package/src/cli/version.ts +2 -0
  474. package/src/cli/workspace.ts +324 -0
  475. package/src/commands/complexity.ts +776 -0
  476. package/src/commands/doctor.languages.ts +187 -0
  477. package/src/commands/doctor.storage.ts +124 -0
  478. package/src/commands/doctor.ts +946 -0
  479. package/src/commands/extensions/add.ts +312 -0
  480. package/src/commands/extensions/configure.ts +82 -0
  481. package/src/commands/extensions/container.ts +209 -0
  482. package/src/commands/extensions/context.ts +109 -0
  483. package/src/commands/extensions/enable.ts +237 -0
  484. package/src/commands/extensions/environment.ts +218 -0
  485. package/src/commands/extensions/feature-scan.ts +232 -0
  486. package/src/commands/extensions/invoke.ts +368 -0
  487. package/src/commands/extensions/list.ts +158 -0
  488. package/src/commands/extensions/logs.ts +104 -0
  489. package/src/commands/extensions/provision.ts +206 -0
  490. package/src/commands/extensions/remove.ts +110 -0
  491. package/src/commands/extensions/render.ts +32 -0
  492. package/src/commands/extensions/run.ts +386 -0
  493. package/src/commands/extensions/secret-store.ts +223 -0
  494. package/src/commands/extensions/setup.ts +140 -0
  495. package/src/commands/extensions/source.ts +189 -0
  496. package/src/commands/extensions/state.ts +252 -0
  497. package/src/commands/extensions/status.ts +320 -0
  498. package/src/commands/extensions.ts +280 -0
  499. package/src/commands/flow/index.ts +402 -0
  500. package/src/commands/flow/limits.ts +14 -0
  501. package/src/commands/flow/output.ts +16 -0
  502. package/src/commands/flow/render.ts +318 -0
  503. package/src/commands/flow/select.ts +101 -0
  504. package/src/commands/graph/boundaries-input.ts +63 -0
  505. package/src/commands/graph/boundaries.ts +182 -0
  506. package/src/commands/graph/bounds.ts +25 -0
  507. package/src/commands/graph/category-clusters.ts +194 -0
  508. package/src/commands/graph/feature-3d.ts +141 -0
  509. package/src/commands/graph/feature-clusters.ts +125 -0
  510. package/src/commands/graph/feature-html.ts +336 -0
  511. package/src/commands/graph/feature-map.ts +270 -0
  512. package/src/commands/graph/feature-model.ts +234 -0
  513. package/src/commands/graph/feature-untangle-motion.ts +192 -0
  514. package/src/commands/graph/index.ts +562 -0
  515. package/src/commands/graph/render.ts +503 -0
  516. package/src/commands/graph/select.ts +77 -0
  517. package/src/commands/index/index.ts +595 -0
  518. package/src/commands/index/render.ts +325 -0
  519. package/src/commands/index/target.ts +136 -0
  520. package/src/commands/index-watch.ts +206 -0
  521. package/src/commands/init/command.ts +238 -0
  522. package/src/commands/init/config-draft.ts +235 -0
  523. package/src/commands/init/diff.ts +117 -0
  524. package/src/commands/init/http-probe.ts +150 -0
  525. package/src/commands/init/ignore-rules.ts +170 -0
  526. package/src/commands/init/index.ts +63 -0
  527. package/src/commands/init/integrations-apply.ts +618 -0
  528. package/src/commands/init/integrations-plan.ts +634 -0
  529. package/src/commands/init/integrations.ts +8 -0
  530. package/src/commands/init/languages.ts +320 -0
  531. package/src/commands/init/product-context.ts +576 -0
  532. package/src/commands/init/render.ts +598 -0
  533. package/src/commands/init/report.ts +204 -0
  534. package/src/commands/init/run.ts +349 -0
  535. package/src/commands/init/services.ts +271 -0
  536. package/src/commands/init/storage.ts +136 -0
  537. package/src/commands/init/toml.ts +174 -0
  538. package/src/commands/init/topology.ts +192 -0
  539. package/src/commands/init/types.ts +366 -0
  540. package/src/commands/init/wizard-terminal.ts +206 -0
  541. package/src/commands/init/wizard.ts +450 -0
  542. package/src/commands/mcp.ts +123 -0
  543. package/src/commands/product-test-runner.ts +80 -0
  544. package/src/commands/product.ts +331 -0
  545. package/src/commands/query.ts +1032 -0
  546. package/src/commands/scan.ts +360 -0
  547. package/src/commands/sdd.ts +243 -0
  548. package/src/commands/unavailable.ts +92 -0
  549. package/src/commands/watch/README.md +160 -0
  550. package/src/commands/watch/analyze.ts +600 -0
  551. package/src/commands/watch/cli.ts +108 -0
  552. package/src/commands/watch/delta.ts +186 -0
  553. package/src/commands/watch/events.ts +235 -0
  554. package/src/commands/watch/index.ts +53 -0
  555. package/src/commands/watch/options.ts +234 -0
  556. package/src/commands/watch/render.ts +240 -0
  557. package/src/commands/watch/run.ts +553 -0
  558. package/src/commands/watch/runtime.ts +167 -0
  559. package/src/commands/watch-command.ts +294 -0
  560. package/src/entry-point.ts +67 -0
  561. package/src/index.ts +291 -0
  562. package/src/mcp/boundaries-schema.ts +193 -0
  563. package/src/mcp/default-runtime.ts +1034 -0
  564. package/src/mcp/envelope.ts +57 -0
  565. package/src/mcp/index.ts +28 -0
  566. package/src/mcp/output-schemas.ts +3071 -0
  567. package/src/mcp/path-sandbox.ts +156 -0
  568. package/src/mcp/server.ts +358 -0
  569. package/src/mcp/stdio.ts +92 -0
  570. package/src/mcp/tools.ts +563 -0
  571. package/src/mcp/types.ts +66 -0
@@ -0,0 +1,198 @@
1
+ /**
2
+ * `untangle init` as the CLI shell sees it.
3
+ *
4
+ * This is the ONLY file of the command that knows about argv, exit codes and
5
+ * a terminal. Everything else (`run.ts` and below) is a library over ports,
6
+ * which is why the whole detection pipeline is testable without a process,
7
+ * without a network and without `node:fs`.
8
+ */
9
+ import path from "node:path";
10
+ import { boolFlag, enumFlag, stringFlag } from "../../cli/args.js";
11
+ import { EXIT, UsageError } from "../../cli/exit.js";
12
+ import { line, note, processIo } from "../../cli/io.js";
13
+ import { formatTextReport } from "./report.js";
14
+ import { CONFIG_FILE_NAME, runInit } from "./run.js";
15
+ import { createWizardTerminal } from "./wizard-terminal.js";
16
+ import { runInitWizard } from "./wizard.js";
17
+ const FLAGS = {
18
+ interactive: {
19
+ kind: "boolean",
20
+ describe: "Guided terminal setup. --no-interactive keeps the scriptable config-only workflow.",
21
+ defaultLabel: "automatic only on an interactive terminal, text output and online mode",
22
+ },
23
+ root: {
24
+ kind: "string",
25
+ placeholder: "PATH",
26
+ describe: `Project directory where ${CONFIG_FILE_NAME} is written.`,
27
+ defaultLabel: "current directory",
28
+ },
29
+ force: {
30
+ kind: "boolean",
31
+ describe: `Overwrite an existing ${CONFIG_FILE_NAME}.`,
32
+ },
33
+ "dry-run": {
34
+ kind: "boolean",
35
+ describe: "Preview what would be created. Writes nothing.",
36
+ },
37
+ offline: {
38
+ kind: "boolean",
39
+ describe: "No network probes; local LanceDB setup remains available.",
40
+ },
41
+ storage: {
42
+ kind: "string",
43
+ placeholder: "lancedb|qdrant",
44
+ describe: "Search storage backend. LanceDB keeps the index in the project without a service; Qdrant is an explicit opt-in.",
45
+ defaultLabel: "lancedb for new projects; existing explicit backend is preserved",
46
+ },
47
+ "embedding-model": {
48
+ kind: "string",
49
+ placeholder: "NAME",
50
+ describe: "Select a specific embedding model instead of automatic discovery.",
51
+ defaultLabel: "largest context window",
52
+ },
53
+ vision: {
54
+ kind: "string",
55
+ placeholder: "PATH",
56
+ describe: "Vision for local document inspection; path relative to the project directory.",
57
+ },
58
+ spec: {
59
+ kind: "string",
60
+ placeholder: "PATH",
61
+ describe: "Specification for local document inspection; path relative to the project directory.",
62
+ },
63
+ "feature-map": {
64
+ kind: "string",
65
+ placeholder: "PATH",
66
+ describe: "Declared feature map for local evidence inspection; relative to the project directory.",
67
+ defaultLabel: "untangle.features.json",
68
+ },
69
+ format: {
70
+ kind: "string",
71
+ placeholder: "text|json",
72
+ describe: "Output format. `json` contains all findings, including the skip ledger.",
73
+ defaultLabel: "text",
74
+ },
75
+ };
76
+ /** argv → options. Rejects the ambiguous call rather than picking a winner. */
77
+ export function initOptionsFrom(args, cwd) {
78
+ if (args.positionals.length > 1) {
79
+ throw new UsageError(`init accepts at most one path; received ${String(args.positionals.length)}.`, "untangle init [PATH]");
80
+ }
81
+ const positional = args.positionals[0];
82
+ const flagRoot = stringFlag(args, "root");
83
+ if (positional !== undefined && flagRoot !== undefined) {
84
+ throw new UsageError("Specify the path as either an argument or --root, not both.", "untangle init /path/to/project");
85
+ }
86
+ const preferredModel = stringFlag(args, "embedding-model");
87
+ const visionPath = stringFlag(args, "vision");
88
+ const specPath = stringFlag(args, "spec");
89
+ const featureManifestPath = stringFlag(args, "feature-map");
90
+ const storageBackend = args.flags["storage"] === undefined
91
+ ? undefined
92
+ : enumFlag(args, "storage", ["lancedb", "qdrant"], "lancedb");
93
+ return {
94
+ root: path.resolve(cwd, flagRoot ?? positional ?? "."),
95
+ force: boolFlag(args, "force"),
96
+ dryRun: boolFlag(args, "dry-run"),
97
+ offline: boolFlag(args, "offline"),
98
+ ...(storageBackend === undefined ? {} : { storageBackend }),
99
+ ...(preferredModel === undefined ? {} : { preferredModel }),
100
+ ...(visionPath === undefined ? {} : { visionPath }),
101
+ ...(specPath === undefined ? {} : { specPath }),
102
+ ...(featureManifestPath === undefined ? {} : { featureManifestPath }),
103
+ };
104
+ }
105
+ export function createInitCommand(deps = {}) {
106
+ return {
107
+ spec: {
108
+ name: "init",
109
+ implementedBy: "commands/init/index.js",
110
+ summary: "Discover a project and write a commented untangle.toml",
111
+ usage: "untangle init [PATH] [--interactive|--no-interactive] [--storage=lancedb|qdrant] [--vision=PATH] [--spec=PATH] [--feature-map=PATH] [--force] [--dry-run] [--offline]",
112
+ details: [
113
+ "On a terminal, guided setup previews configuration, optional local search/analyzer installation and a local feature/code map. No file, download or service is changed before the final selection. Preparing recipes and executing the displayed setup are separate choices. Prompts stay on stderr. Escape and Ctrl-C cancel; raw terminal mode is restored before external tools run.",
114
+ "Pipes, agents, --format=json, --dry-run, --offline and --no-interactive retain config-only behavior. Explicit --interactive requires a terminal and cannot be combined with JSON or dry-run. Explicit offline interactive setup may prepare local files but cannot download or start tools.",
115
+ `Discovers project languages weighted by lines, identifying parsed and search-only languages; monorepo topology across workspace packages and container services; an available embedding provider with its reported model, vector width and context window; an available vector store; and .gitignore rules plus defaults.`,
116
+ `Writes a ${CONFIG_FILE_NAME} with comments explaining each value's evidence. Omitted values come from product defaults; the file includes only decisions made by init.`,
117
+ "New projects use embedded LanceDB at .untangle/index/lancedb. No Docker or Qdrant probe is needed. Select --storage=qdrant for an owned or explicitly configured server. Missing Ollama is not an error; local offline indexing remains available.",
118
+ "Vision and specification are inspected locally through filenames, readability, hashes and document references. --vision and --spec select sources relative to the project directory. The review draft confirms neither features nor ownership and does not claim semantic conformance.",
119
+ "A supplied --feature-map, or untangle.features.json when present, makes declared features, code/test evidence, ownership declarations and feature complexity visible. No tests are executed and semantic conformance is not independently proven. Noninteractive init writes no visual map; confirmed guided setup may save a separate HTML/JSON snapshot. No ownership or implementation is confirmed automatically.",
120
+ "Spec-driven setup can inspect detected local Spec Kit or OpenSpec artifacts when no explicit feature manifest was chosen. Only final confirmation saves a source-bound proposed manifest under .untangle/sdd/ and uses it for this setup's feature report/map. Existing declarations are preserved. No framework commands or tests run; imported features remain planned/proposed without invented owners. The same connector is available through `untangle product connect [auto|spec-kit|openspec]`.",
121
+ "Discovery reads service information with GET and probes /api/embed with a small POST. Noninteractive init does not start or modify foreign services. A foreign vector store's usual default port is deliberately not probed (spec.md §3.2); set UNTANGLE_QDRANT_URL to select it explicitly. Only a confirmed interactive tool selection can install/start prepared owned services.",
122
+ "A second identical run changes nothing. If an existing file differs, init displays line-by-line differences and preserves it unless --force is explicit.",
123
+ ],
124
+ flags: FLAGS,
125
+ examples: [
126
+ "untangle init",
127
+ "untangle init --interactive",
128
+ "untangle init --no-interactive --offline",
129
+ "untangle init /path/to/another/project --dry-run",
130
+ "untangle init --offline --force",
131
+ "untangle init --format=json",
132
+ "untangle init /path/to/project --vision=docs/vision.md --spec=docs/requirements.md",
133
+ ],
134
+ exitCodes: [
135
+ [EXIT.ok, `${CONFIG_FILE_NAME} written or already current.`],
136
+ [
137
+ EXIT.operational,
138
+ "An existing file differs and was preserved (use --force), or the generated configuration would be invalid.",
139
+ ],
140
+ [EXIT.usage, "Invalid arguments."],
141
+ ],
142
+ },
143
+ async run(ctx, args) {
144
+ const format = enumFlag(args, "format", ["text", "json"], "text");
145
+ const options = initOptionsFrom(args, ctx.cwd);
146
+ const explicit = args.flags["interactive"];
147
+ if (explicit === true && (format === "json" || options.dryRun))
148
+ throw new UsageError("--interactive cannot be combined with --format=json or --dry-run.", "Use --no-interactive for a machine-readable or write-free preview.");
149
+ const automatic = explicit === undefined &&
150
+ ctx.io === processIo &&
151
+ process.stdin.isTTY === true &&
152
+ process.stderr.isTTY === true &&
153
+ !ctx.env["CI"] &&
154
+ format === "text" &&
155
+ !options.dryRun &&
156
+ !options.offline;
157
+ const { wizard, ...ports } = deps;
158
+ const initDeps = {
159
+ env: ctx.env,
160
+ signal: ctx.signal,
161
+ ...ports,
162
+ };
163
+ let result;
164
+ if (explicit === true || automatic) {
165
+ if (wizard?.terminal === undefined &&
166
+ (process.stdin.isTTY !== true || process.stderr.isTTY !== true))
167
+ throw new UsageError("--interactive requires a terminal on stdin and stderr.", "Use `untangle init --no-interactive` in a pipe or coding agent.");
168
+ const terminal = wizard?.terminal ??
169
+ createWizardTerminal({ write: (text) => ctx.io.err(text), signal: ctx.signal });
170
+ if (!terminal.interactive ||
171
+ (wizard?.terminal === undefined && process.stderr.isTTY !== true))
172
+ throw new UsageError("--interactive requires a terminal on stdin and stderr.", "Use `untangle init --no-interactive` in a pipe or coding agent.");
173
+ const completed = await runInitWizard(ctx, options, initDeps, { ...wizard, terminal });
174
+ if (completed.result === null)
175
+ return completed.exitCode;
176
+ result = completed.result;
177
+ if (completed.exitCode !== result.exitCode)
178
+ return completed.exitCode;
179
+ }
180
+ else
181
+ result = await runInit(options, initDeps);
182
+ if (format === "json") {
183
+ line(ctx.io, JSON.stringify(result, null, 2));
184
+ return result.exitCode;
185
+ }
186
+ // The path goes to stdout — it is the payload of this command, the one
187
+ // thing a script would pipe. Everything else is diagnosis (cli/io.ts).
188
+ line(ctx.io, result.configPath);
189
+ for (const reportLine of formatTextReport(result)) {
190
+ note(ctx.io, reportLine);
191
+ }
192
+ return result.exitCode;
193
+ },
194
+ };
195
+ }
196
+ /** The command with production ports. */
197
+ export const initCommand = createInitCommand();
198
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/init/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Turning findings into a configuration.
3
+ *
4
+ * The shape written to disk is `UntangleConfigV1` from
5
+ * `@untangle-code/config` — not a private CLI dialect — and it is checked with
6
+ * that package's own validator before a byte reaches the file system. A first
7
+ * command that writes a configuration the rest of the product then rejects is
8
+ * a first command that has failed.
9
+ *
10
+ * WHICH SECTIONS GET WRITTEN: only the ones `init` actually DECIDED something
11
+ * about. Everything else is left to the product defaults, because a file that
12
+ * restates two hundred defaults verbatim tells the reader nothing about what
13
+ * was chosen. `defaultsFor` records the values that stay defaulted so the
14
+ * renderer can name them in prose instead.
15
+ */
16
+ import type { RawConfigLayer } from "@untangle-code/config";
17
+ import type { ProjectFindingsV1 } from "./types.js";
18
+ export interface ConfigDraftV1 {
19
+ /** Exactly what `init` decided — the layer that ends up in the file. */
20
+ layer: RawConfigLayer;
21
+ /** Validator warnings over the layer merged onto the product defaults. */
22
+ warnings: string[];
23
+ /** Validator errors. Non-empty means the file is NOT written. */
24
+ errors: string[];
25
+ }
26
+ /**
27
+ * Derives a project id from a directory name.
28
+ *
29
+ * Lowercase, non-alphanumerics collapsed to `-`, trimmed. A name that reduces
30
+ * to nothing (a directory called `...`) falls back to `project`, because an
31
+ * empty id would fail validation and an id derived from something random
32
+ * would not be reproducible.
33
+ */
34
+ export declare function deriveProjectId(directoryName: string): string;
35
+ export declare function buildConfigDraft(findings: ProjectFindingsV1): ConfigDraftV1;
36
+ /** `untangle_<projectId>_` — keeps two projects on one instance from colliding. */
37
+ export declare function collectionPrefixFor(findings: ProjectFindingsV1): string;
38
+ /**
39
+ * The single next step.
40
+ *
41
+ * EXACTLY ONE, in a fixed priority order, because a first command that ends
42
+ * in a list of five things is a first command the user closes. The order is
43
+ * "what blocks the next command first": no embedding provider blocks
44
+ * indexing; no model blocks it too; no vector store blocks it; otherwise
45
+ * nothing blocks it and the step is to index.
46
+ */
47
+ export declare function nextStepFor(findings: ProjectFindingsV1): string;
48
+ //# sourceMappingURL=config-draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-draft.d.ts","sourceRoot":"","sources":["../../../src/commands/init/config-draft.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,KAAK,EAAE,cAAc,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iEAAiE;IACjE,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,aAAa,CA0D3E;AA4CD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAEvE;AA8BD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAiC/D"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Turning findings into a configuration.
3
+ *
4
+ * The shape written to disk is `UntangleConfigV1` from
5
+ * `@untangle-code/config` — not a private CLI dialect — and it is checked with
6
+ * that package's own validator before a byte reaches the file system. A first
7
+ * command that writes a configuration the rest of the product then rejects is
8
+ * a first command that has failed.
9
+ *
10
+ * WHICH SECTIONS GET WRITTEN: only the ones `init` actually DECIDED something
11
+ * about. Everything else is left to the product defaults, because a file that
12
+ * restates two hundred defaults verbatim tells the reader nothing about what
13
+ * was chosen. `defaultsFor` records the values that stay defaulted so the
14
+ * renderer can name them in prose instead.
15
+ */
16
+ import { DEFAULT_EMBEDDING_CONFIG, DEFAULT_INDEX_CONFIG, PRODUCT_DEFAULT_CONFIG, mergeConfigLayers, validateEffectiveConfig, } from "@untangle-code/config";
17
+ import { sha256Hex, sortByCodepoints } from "@untangle-code/domain";
18
+ /**
19
+ * Derives a project id from a directory name.
20
+ *
21
+ * Lowercase, non-alphanumerics collapsed to `-`, trimmed. A name that reduces
22
+ * to nothing (a directory called `...`) falls back to `project`, because an
23
+ * empty id would fail validation and an id derived from something random
24
+ * would not be reproducible.
25
+ */
26
+ export function deriveProjectId(directoryName) {
27
+ const slug = directoryName
28
+ .toLowerCase()
29
+ .replace(/[^a-z0-9]+/gu, "-")
30
+ .replace(/^-+|-+$/gu, "");
31
+ return slug.length === 0 ? "project" : slug;
32
+ }
33
+ export function buildConfigDraft(findings) {
34
+ const contextArtifacts = productContextArtifacts(findings);
35
+ const layer = {
36
+ schemaVersion: 1,
37
+ projectId: findings.projectId,
38
+ repositories: [
39
+ {
40
+ id: findings.projectId,
41
+ // Relative to this configuration file — spec.md §4.3 allows exactly
42
+ // that, and a relative path keeps the file portable between checkouts.
43
+ path: ".",
44
+ label: findings.projectId,
45
+ exclude: sortByCodepoints([
46
+ ...findings.ignore.defaultExcludes,
47
+ ...findings.ignore.additionalExcludes,
48
+ ]),
49
+ },
50
+ ],
51
+ ...(findings.storage?.backend === "lancedb"
52
+ ? {
53
+ storage: {
54
+ backend: "lancedb",
55
+ ...(findings.storage.path === undefined ? {} : { path: findings.storage.path }),
56
+ },
57
+ }
58
+ : { storage: { backend: "qdrant" }, qdrant: buildQdrantSection(findings) }),
59
+ embeddings: buildEmbeddingSection(findings),
60
+ index: {
61
+ // The only index knob `init` moves: a project whose sources are wider
62
+ // than the default ceiling would otherwise lose them silently.
63
+ maxFileSizeMb: DEFAULT_INDEX_CONFIG.maxFileSizeMb,
64
+ watch: DEFAULT_INDEX_CONFIG.watch,
65
+ },
66
+ graph: {
67
+ // Both levels of the topology feed the graph; a single-package project
68
+ // gets the same setting, it simply has less to draw.
69
+ enabled: true,
70
+ },
71
+ telemetry: { enabled: false },
72
+ ...(contextArtifacts.length === 0 ? {} : { contextArtifacts }),
73
+ };
74
+ const merged = mergeConfigLayers([PRODUCT_DEFAULT_CONFIG, layer]);
75
+ const validation = validateEffectiveConfig(merged);
76
+ return {
77
+ layer,
78
+ warnings: [
79
+ ...validation.warnings.map((issue) => `${issue.path}: ${issue.message}`),
80
+ ...(findings.storage?.configurationWarnings ?? []),
81
+ ...(findings.storage?.directoryStatus === "not-directory" ||
82
+ findings.storage?.directoryStatus === "unreadable"
83
+ ? [
84
+ `Local storage ${findings.storage.directory}: ${findings.storage.directoryStatus}${findings.storage.detail === undefined ? "" : ` (${findings.storage.detail})`}. Indexing cannot use this path.`,
85
+ ]
86
+ : []),
87
+ ],
88
+ errors: validation.errors.map((issue) => `${issue.path}: ${issue.message} [${issue.code}]`),
89
+ };
90
+ }
91
+ function productContextArtifacts(findings) {
92
+ const descriptions = {
93
+ vision: "Provisional vision",
94
+ specification: "Provisional specification",
95
+ product: "Provisional product description",
96
+ };
97
+ return (findings.productContext?.sources ?? [])
98
+ .filter((source) => source.selected && source.status === "readable")
99
+ .map((source) => ({
100
+ name: `product-${source.role}-${sha256Hex(source.path).slice(0, 12)}`,
101
+ path: `./${source.path}`,
102
+ description: `${descriptions[source.role]}; local document inspection, features and ownership remain unconfirmed.`,
103
+ type: "markdown",
104
+ }));
105
+ }
106
+ /**
107
+ * Qdrant: `external` only when an endpoint actually answered. Otherwise
108
+ * `managed` with no URL — the mode that says "start your own instance", which
109
+ * is the correct answer both when nothing is running and when the only thing
110
+ * running is somebody else's (spec.md §3.2).
111
+ */
112
+ function buildQdrantSection(findings) {
113
+ if (findings.storage?.qdrantMode !== undefined) {
114
+ return {
115
+ mode: findings.storage.qdrantMode,
116
+ ...(findings.storage.qdrantUrl === undefined ? {} : { url: findings.storage.qdrantUrl }),
117
+ collectionPrefix: collectionPrefixFor(findings),
118
+ };
119
+ }
120
+ if (findings.qdrant.outcome === "reachable" && findings.qdrant.url !== undefined) {
121
+ return {
122
+ mode: "external",
123
+ url: findings.qdrant.url,
124
+ collectionPrefix: collectionPrefixFor(findings),
125
+ };
126
+ }
127
+ return { mode: "managed", collectionPrefix: collectionPrefixFor(findings) };
128
+ }
129
+ /** `untangle_<projectId>_` — keeps two projects on one instance from colliding. */
130
+ export function collectionPrefixFor(findings) {
131
+ return `untangle_${findings.projectId.replace(/-/gu, "_")}_`;
132
+ }
133
+ /**
134
+ * Embeddings: when a provider answered, the model AND its vector width and
135
+ * context window are taken from what the provider reported about itself. When
136
+ * none answered, the product default profile stands and `mode` stays `auto`,
137
+ * so the next run can still discover a provider without the user editing
138
+ * anything.
139
+ */
140
+ function buildEmbeddingSection(findings) {
141
+ const chosen = findings.ollama.chosenModel;
142
+ if (findings.ollama.outcome !== "reachable" || chosen === undefined) {
143
+ return {
144
+ provider: "ollama",
145
+ mode: "auto",
146
+ model: DEFAULT_EMBEDDING_CONFIG.model,
147
+ dimensions: DEFAULT_EMBEDDING_CONFIG.dimensions,
148
+ contextLength: DEFAULT_EMBEDDING_CONFIG.contextLength,
149
+ };
150
+ }
151
+ return {
152
+ provider: "ollama",
153
+ mode: "external",
154
+ url: findings.ollama.url,
155
+ model: chosen.name,
156
+ dimensions: chosen.dimensions ?? DEFAULT_EMBEDDING_CONFIG.dimensions,
157
+ contextLength: chosen.contextLength ?? DEFAULT_EMBEDDING_CONFIG.contextLength,
158
+ };
159
+ }
160
+ /**
161
+ * The single next step.
162
+ *
163
+ * EXACTLY ONE, in a fixed priority order, because a first command that ends
164
+ * in a list of five things is a first command the user closes. The order is
165
+ * "what blocks the next command first": no embedding provider blocks
166
+ * indexing; no model blocks it too; no vector store blocks it; otherwise
167
+ * nothing blocks it and the step is to index.
168
+ */
169
+ export function nextStepFor(findings) {
170
+ if (findings.storage?.backend === "lancedb") {
171
+ if (findings.storage.directoryStatus === "not-directory" ||
172
+ findings.storage.directoryStatus === "unreadable")
173
+ return `Local storage path ${JSON.stringify(findings.storage.directory)} is ${findings.storage.directoryStatus}. Next step: choose an accessible directory with UNTANGLE_LANCEDB_PATH and rerun \`untangle init\`.`;
174
+ if (findings.ollama.outcome !== "reachable" || findings.ollama.chosenModel === undefined)
175
+ return "Local LanceDB storage needs no service. Next step: `untangle index --embedder=offline` (local vectors without semantic embeddings).";
176
+ }
177
+ if (findings.ollama.outcome !== "reachable") {
178
+ return `No embedding provider at ${findings.ollama.url}. Next step: start \`ollama serve\` and rerun \`untangle init\`.`;
179
+ }
180
+ if (findings.ollama.chosenModel === undefined) {
181
+ return `${findings.ollama.url} is running but reports no embedding model. Next step: \`ollama pull ${DEFAULT_EMBEDDING_CONFIG.model}\`.`;
182
+ }
183
+ if (findings.storage?.backend !== "lancedb" && findings.qdrant.outcome !== "reachable") {
184
+ if (findings.storage?.qdrantMode === "external")
185
+ return `The selected Qdrant server ${JSON.stringify(findings.storage.qdrantUrl)} is unreachable. Next step: check that server's URL and availability, then rerun \`untangle doctor\`.`;
186
+ return "No vector store is reachable. Next step: start an owned instance with `docker run -d --name untangle-qdrant -p 16333:6333 -v untangle-qdrant-data:/qdrant/storage qdrant/qdrant`, then run `untangle index`.";
187
+ }
188
+ // WP-228: Der Anbieter laeuft, das Modell ist da, der Speicher steht — und
189
+ // trotzdem kann nicht indiziert werden, weil der Endpunkt, den der
190
+ // Indexlauf benutzt, nicht antwortet. Das ist ein eigener Fall und
191
+ // verdient einen eigenen naechsten Schritt; „alles vorhanden" waere hier
192
+ // schlicht falsch.
193
+ if (findings.ollama.embedProbe.outcome === "timeout") {
194
+ return `${findings.ollama.url} responds on /api/tags, but /api/embed did not respond within ${String(findings.ollama.embedProbe.timeoutMs)} ms, so embeddings are unavailable. Next step: \`untangle index --embedder=offline\` (local vectors without semantics).`;
195
+ }
196
+ if (findings.ollama.embedProbe.outcome === "failed") {
197
+ return `${findings.ollama.url} is running, but /api/embed failed (${findings.ollama.embedProbe.detail ?? "no details"}). Next step: \`untangle index --embedder=offline\` (local vectors without semantics).`;
198
+ }
199
+ return "Everything is available. Next step: `untangle index`.";
200
+ }
201
+ //# sourceMappingURL=config-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-draft.js","sourceRoot":"","sources":["../../../src/commands/init/config-draft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Idempotency: what a second run would change.
3
+ *
4
+ * `init` compares the RENDERED text against the file on disk rather than
5
+ * parsing the file back into a config object. That is a deliberate choice and
6
+ * it buys three things at once:
7
+ *
8
+ * - it needs no TOML parser, so there is no second grammar to keep in step
9
+ * with the writer;
10
+ * - it notices changes the user made BY HAND, including in the comments,
11
+ * which a value-level comparison would call "identical";
12
+ * - it is only meaningful because `renderUntangleToml` is pure and carries no
13
+ * clock — otherwise every run would differ and the check would be theatre.
14
+ *
15
+ * The comparison is a line diff, so the report says which lines would be
16
+ * added and which lost, not merely "the file differs".
17
+ */
18
+ import type { ConfigChangeV1 } from "./types.js";
19
+ /** Splits into lines, dropping the single trailing empty element of a final newline. */
20
+ export declare function toLines(text: string): string[];
21
+ /**
22
+ * Line diff, longest-common-subsequence based.
23
+ *
24
+ * The dynamic-programming table is O(n·m); both sides are a configuration
25
+ * file, so that is a few hundred by a few hundred. Above `LCS_LINE_BUDGET`
26
+ * the function falls back to a multiset comparison — less precise about
27
+ * ORDER, but still exact about which lines appear on only one side, and it
28
+ * cannot be made to allocate gigabytes by a pathological input.
29
+ */
30
+ export declare function diffLines(before: readonly string[], after: readonly string[]): ConfigChangeV1[];
31
+ /** True when the file on disk already IS what `init` would write. */
32
+ export declare function isUnchanged(existing: string, rendered: string): boolean;
33
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/init/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,wFAAwF;AACxF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,EAAE,CAgD/F;AAwBD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvE"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Idempotency: what a second run would change.
3
+ *
4
+ * `init` compares the RENDERED text against the file on disk rather than
5
+ * parsing the file back into a config object. That is a deliberate choice and
6
+ * it buys three things at once:
7
+ *
8
+ * - it needs no TOML parser, so there is no second grammar to keep in step
9
+ * with the writer;
10
+ * - it notices changes the user made BY HAND, including in the comments,
11
+ * which a value-level comparison would call "identical";
12
+ * - it is only meaningful because `renderUntangleToml` is pure and carries no
13
+ * clock — otherwise every run would differ and the check would be theatre.
14
+ *
15
+ * The comparison is a line diff, so the report says which lines would be
16
+ * added and which lost, not merely "the file differs".
17
+ */
18
+ /** Above this line count the diff degrades to a set comparison (see `diffLines`). */
19
+ const LCS_LINE_BUDGET = 2_000;
20
+ /** Splits into lines, dropping the single trailing empty element of a final newline. */
21
+ export function toLines(text) {
22
+ const lines = text.split("\n");
23
+ if (lines.length > 0 && lines[lines.length - 1] === "") {
24
+ lines.pop();
25
+ }
26
+ return lines;
27
+ }
28
+ /**
29
+ * Line diff, longest-common-subsequence based.
30
+ *
31
+ * The dynamic-programming table is O(n·m); both sides are a configuration
32
+ * file, so that is a few hundred by a few hundred. Above `LCS_LINE_BUDGET`
33
+ * the function falls back to a multiset comparison — less precise about
34
+ * ORDER, but still exact about which lines appear on only one side, and it
35
+ * cannot be made to allocate gigabytes by a pathological input.
36
+ */
37
+ export function diffLines(before, after) {
38
+ if (before.length > LCS_LINE_BUDGET || after.length > LCS_LINE_BUDGET) {
39
+ return multisetDiff(before, after);
40
+ }
41
+ const rows = before.length;
42
+ const columns = after.length;
43
+ // table[i][j] = length of the LCS of before[i…] and after[j…]
44
+ const table = Array.from({ length: rows + 1 }, () => new Array(columns + 1).fill(0));
45
+ for (let i = rows - 1; i >= 0; i -= 1) {
46
+ const row = table[i];
47
+ const nextRow = table[i + 1];
48
+ for (let j = columns - 1; j >= 0; j -= 1) {
49
+ row[j] =
50
+ before[i] === after[j]
51
+ ? nextRow[j + 1] + 1
52
+ : Math.max(nextRow[j], row[j + 1]);
53
+ }
54
+ }
55
+ const changes = [];
56
+ let i = 0;
57
+ let j = 0;
58
+ while (i < rows && j < columns) {
59
+ if (before[i] === after[j]) {
60
+ i += 1;
61
+ j += 1;
62
+ continue;
63
+ }
64
+ const row = table[i];
65
+ const nextRow = table[i + 1];
66
+ if (nextRow[j] >= row[j + 1]) {
67
+ changes.push({ kind: "removed", line: before[i].trimEnd() });
68
+ i += 1;
69
+ }
70
+ else {
71
+ changes.push({ kind: "added", line: after[j].trimEnd() });
72
+ j += 1;
73
+ }
74
+ }
75
+ for (; i < rows; i += 1) {
76
+ changes.push({ kind: "removed", line: before[i].trimEnd() });
77
+ }
78
+ for (; j < columns; j += 1) {
79
+ changes.push({ kind: "added", line: after[j].trimEnd() });
80
+ }
81
+ return changes;
82
+ }
83
+ function multisetDiff(before, after) {
84
+ const counts = new Map();
85
+ for (const line of before) {
86
+ counts.set(line, (counts.get(line) ?? 0) + 1);
87
+ }
88
+ const changes = [];
89
+ for (const line of after) {
90
+ const remaining = counts.get(line) ?? 0;
91
+ if (remaining > 0) {
92
+ counts.set(line, remaining - 1);
93
+ }
94
+ else {
95
+ changes.push({ kind: "added", line: line.trimEnd() });
96
+ }
97
+ }
98
+ for (const [line, remaining] of counts) {
99
+ for (let index = 0; index < remaining; index += 1) {
100
+ changes.push({ kind: "removed", line: line.trimEnd() });
101
+ }
102
+ }
103
+ return changes;
104
+ }
105
+ /** True when the file on disk already IS what `init` would write. */
106
+ export function isUnchanged(existing, rendered) {
107
+ return existing === rendered;
108
+ }
109
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/init/diff.ts"],"names":[],"mappings":"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"}