@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,598 @@
1
+ /**
2
+ * Rendering `untangle.toml`.
3
+ *
4
+ * The file is the deliverable of `untangle init`, and its comments are not
5
+ * decoration: they are the record of what was decided and on what evidence.
6
+ * A user opening this file must be able to answer "why is `dimensions` 1024?"
7
+ * without reading the source of the tool that wrote it.
8
+ *
9
+ * DETERMINISM: this function is pure over `ProjectFindingsV1` and
10
+ * `ConfigDraftV1`. No clock, no random, no environment. That is what makes
11
+ * the idempotency check a real comparison — a second run over an unchanged
12
+ * project renders byte-identical text, so any difference the diff reports is
13
+ * a difference in the PROJECT or in the file, never in the writer.
14
+ */
15
+
16
+ import { PRODUCT_DEFAULT_CONFIG } from "@untangle-code/config";
17
+ import type { RawConfigLayer } from "@untangle-code/config";
18
+
19
+ import type { ConfigDraftV1 } from "./config-draft.js";
20
+ import { TomlWriter } from "./toml.js";
21
+ import type { InitLimitsV1, LanguageCensusEntryV1, ProjectFindingsV1 } from "./types.js";
22
+
23
+ const RULE = "-".repeat(72);
24
+
25
+ /** Formats a share as a percentage with one decimal, e.g. `62.4 %`. */
26
+ export function formatShare(share: number): string {
27
+ return `${(share * 100).toFixed(1)} %`;
28
+ }
29
+
30
+ /** `12345` → `12.345` (dot as thousands separator, the German convention). */
31
+ export function formatCount(value: number): string {
32
+ return value.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/gu, ".");
33
+ }
34
+
35
+ /**
36
+ * Der Befund ueber `/api/embed` in der Sprache der Datei (WP-228).
37
+ *
38
+ * Getrennt vom Terminalbericht, weil die Datei laenger lebt als das
39
+ * Terminal: hier steht auch die Frist, gegen die geprueft wurde, damit ein
40
+ * spaeterer Leser den Befund einordnen kann.
41
+ */
42
+ export function describeEmbedProbeForFile(ollama: ProjectFindingsV1["ollama"]): string {
43
+ const probe = ollama.embedProbe;
44
+ switch (probe.outcome) {
45
+ case "ok":
46
+ return `Embedding endpoint /api/embed checked: responded${probe.dimensions === undefined ? "" : ` (${formatCount(probe.dimensions)} dimensions)`}, deadline ${formatCount(probe.timeoutMs)} ms.`;
47
+ case "timeout":
48
+ return `Embedding endpoint /api/embed did not respond within ${formatCount(probe.timeoutMs)} ms. "Reachable" above refers only to /api/tags; indexing cannot use it. Alternative: untangle index --embedder=offline.`;
49
+ case "failed":
50
+ return `Embedding endpoint /api/embed failed: ${probe.detail ?? "no details"}. Alternative: untangle index --embedder=offline.`;
51
+ default:
52
+ return `Embedding endpoint /api/embed not checked: ${probe.detail ?? "no details"}.`;
53
+ }
54
+ }
55
+
56
+ function describeLanguage(entry: LanguageCensusEntryV1): string {
57
+ // WP-240: steht hier eine widerlegte Behauptung, wird sie BENANNT statt
58
+ // ersetzt. "Parser: text" allein liesse den Leser glauben, diese Sprache
59
+ // sei nie mehr gewesen als Text; sie war als "deep" angekuendigt, und dass
60
+ // sie es hier nicht ist, ist die Nachricht.
61
+ const coverage =
62
+ entry.declaredSupportLevel === undefined
63
+ ? entry.hasParserAdapter
64
+ ? `Parser: ${entry.supportLevel ?? "available"}`
65
+ : "no parser; text search only"
66
+ : `Parser: ${entry.supportLevel ?? "text"} — "${entry.declaredSupportLevel}" declared, ` +
67
+ "grammar unavailable here";
68
+ return `${entry.languageId.padEnd(12)} ${formatShare(entry.lineShare).padStart(7)} ${formatCount(entry.lineCount).padStart(9)} Lines ${formatCount(entry.fileCount).padStart(6)} files (${coverage})`;
69
+ }
70
+
71
+ export interface RenderInput {
72
+ findings: ProjectFindingsV1;
73
+ draft: ConfigDraftV1;
74
+ limits: InitLimitsV1;
75
+ nextStep: string;
76
+ }
77
+
78
+ export function renderUntangleToml(input: RenderInput): string {
79
+ const { findings, draft, limits, nextStep } = input;
80
+ const writer = new TomlWriter();
81
+
82
+ renderHeader(writer, findings, limits);
83
+ renderIdentity(writer, draft.layer);
84
+ renderRepositories(writer, findings, draft.layer);
85
+ renderStorage(writer, findings, draft.layer);
86
+ renderQdrant(writer, findings, draft.layer);
87
+ renderEmbeddings(writer, findings, draft.layer);
88
+ renderIndex(writer, draft.layer);
89
+ renderGraph(writer, findings, draft.layer);
90
+ renderTelemetry(writer, draft.layer);
91
+ renderContextArtifacts(writer, draft.layer);
92
+ renderFooter(writer, nextStep);
93
+
94
+ return writer.render();
95
+ }
96
+
97
+ function renderHeader(writer: TomlWriter, findings: ProjectFindingsV1, limits: InitLimitsV1): void {
98
+ writer.comments([
99
+ RULE,
100
+ "untangle.toml — written by `untangle init`.",
101
+ "",
102
+ "This file is a proposal, not a mandate. Every value may be edited by hand.",
103
+ "`untangle init` overwrites it only with --force and first reports",
104
+ "what would differ. Omitted settings come from product defaults",
105
+ "(spec.md §4.1, lowest layer). This file deliberately lists only",
106
+ "decisions made by init, rather than every default.",
107
+ RULE,
108
+ "",
109
+ "FINDING 1 — LANGUAGES (weighted by lines)",
110
+ ]);
111
+
112
+ const languages = findings.languages;
113
+ if (languages.entries.length === 0) {
114
+ writer.comment(" no analyzable files found");
115
+ } else {
116
+ for (const entry of languages.entries.slice(0, limits.reportedLanguages)) {
117
+ writer.comment(` ${describeLanguage(entry)}`);
118
+ }
119
+ const rest = languages.entries.length - limits.reportedLanguages;
120
+ if (rest > 0) {
121
+ writer.comment(` … and ${formatCount(rest)} additional languages`);
122
+ }
123
+ }
124
+ writer.comment(
125
+ ` Total: ${formatCount(languages.totalFiles)} files, ${formatCount(languages.totalLines)} lines; ${formatShare(languages.parsedLineShare)} have a parser (symbols, imports, complexity); the rest support text search only.`,
126
+ );
127
+ if (languages.truncated) {
128
+ writer.comment(
129
+ ` Warning: stopped after ${formatCount(limits.maxFilesScanned)} files; the proportions above describe only this subset.`,
130
+ );
131
+ }
132
+ for (const exclusion of languages.excluded) {
133
+ writer.comment(` skipped (${exclusion.reason}): ${formatCount(exclusion.count)}`);
134
+ }
135
+
136
+ writer.comment("");
137
+ writer.comment("FINDING 2 — TOPOLOGY");
138
+ const topology = findings.topology;
139
+ if (topology.workspaceGlobs.length > 0) {
140
+ writer.comment(` Workspace-Globs: ${topology.workspaceGlobs.join(", ")}`);
141
+ }
142
+ if (topology.packages.length === 0) {
143
+ writer.comment(" no workspace packages; a single project");
144
+ } else {
145
+ writer.comment(
146
+ ` ${formatCount(topology.packages.length)} packages, ${formatCount(topology.packageEdgeCount)} edges between them:`,
147
+ );
148
+ for (const pkg of topology.packages) {
149
+ writer.comment(` ${pkg.name} — ${pkg.directory === "" ? "." : pkg.directory}`);
150
+ }
151
+ }
152
+ if (topology.services.length > 0) {
153
+ writer.comment(
154
+ ` ${formatCount(topology.services.length)} container services, ${formatCount(topology.serviceEdgeCount)} edges; the coarser layer above packages:`,
155
+ );
156
+ for (const service of topology.services) {
157
+ const target = service.buildContext ?? service.image ?? "?";
158
+ writer.comment(` ${service.name} — ${service.composeFile} → ${target}`);
159
+ }
160
+ }
161
+ if (topology.managers.markerFiles.length > 0) {
162
+ writer.comment(` Tool markers: ${topology.managers.markerFiles.join(", ")}`);
163
+ }
164
+ for (const uncovered of topology.managers.uncoveredByTopology) {
165
+ writer.comment(
166
+ ` GAP: ${uncovered} declares a package layout missing from the discovered topology; those subprojects are absent above.`,
167
+ );
168
+ }
169
+
170
+ writer.comment("");
171
+ writer.comment("FINDING 3 — INFRASTRUCTURE");
172
+ const ollama = findings.ollama;
173
+ writer.comment(
174
+ ollama.outcome === "reachable"
175
+ ? ` Embedding provider: reachable at ${ollama.url}${ollama.version === undefined ? "" : ` (version ${ollama.version})`}, ${formatCount(ollama.embeddingModels.length)} embedding models`
176
+ : ` Embedding provider: unreachable at ${ollama.url}; configuration is still available.`,
177
+ );
178
+ for (const model of ollama.embeddingModels) {
179
+ const marker = model.name === ollama.chosenModel?.name ? "→" : " ";
180
+ writer.comment(
181
+ ` ${marker} ${model.name} (${model.dimensions === undefined ? "unknown width" : `${formatCount(model.dimensions)} dimensions`}, ${model.contextLength === undefined ? "unknown context" : `${formatCount(model.contextLength)} context`})`,
182
+ );
183
+ }
184
+ if (ollama.chosenReason !== undefined) {
185
+ writer.comment(` selected because: ${ollama.chosenReason}`);
186
+ }
187
+ // WP-228: Der Befund ueber den Endpunkt, den der Indexlauf wirklich
188
+ // benutzt. Er steht auch dann in der Datei, wenn er gut ausfiel — sonst
189
+ // liesse sich spaeter nicht unterscheiden, ob er gut ausfiel oder fehlte.
190
+ writer.comment(` ${describeEmbedProbeForFile(ollama)}`);
191
+ if (findings.storage?.backend === "lancedb") {
192
+ writer.comment(
193
+ ` Vector store: embedded LanceDB at ${findings.storage.directory} (directory ${findings.storage.directoryStatus}).`,
194
+ );
195
+ writer.comment(" No database was opened or created. Docker and Qdrant were not probed.");
196
+ } else {
197
+ const qdrant = findings.qdrant;
198
+ writer.comment(
199
+ qdrant.outcome === "reachable"
200
+ ? ` Vector store: reachable at ${qdrant.url ?? "?"}`
201
+ : ` Vector store: unreachable (checked: ${qdrant.probedUrls.join(", ")}); this is not an error.`,
202
+ );
203
+ for (const skipped of qdrant.skippedUrls) {
204
+ writer.comment(` DELIBERATELY NOT CHECKED: ${skipped.url}`);
205
+ writer.comment(` ${skipped.reason}`);
206
+ }
207
+ }
208
+
209
+ writer.comment("");
210
+ writer.comment("FINDING 4 — IGNORE RULES");
211
+ const ignore = findings.ignore;
212
+ writer.comment(
213
+ ignore.gitignorePresent
214
+ ? ` .gitignore: ${formatCount(ignore.gitignoreRuleCount)} rules. The scanner evaluates them on every run (spec.md §6.2); they are not duplicated here, avoiding divergence.`
215
+ : " .gitignore: none found. Only the defaults below apply.",
216
+ );
217
+ if (ignore.gitignoreNegationCount > 0) {
218
+ writer.comment(
219
+ ` ${formatCount(ignore.gitignoreNegationCount)} negation rules (!…) deliberately remain there; removing their original ordering would reverse their meaning.`,
220
+ );
221
+ }
222
+ if (ignore.untangleIgnorePresent) {
223
+ writer.comment(" .untangleignore found; takes precedence over .gitignore.");
224
+ }
225
+
226
+ renderProductContextFinding(writer, findings);
227
+ renderFeatureAlignmentFinding(writer, findings);
228
+
229
+ if (findings.skipped.entries.length > 0) {
230
+ writer.comment("");
231
+ writer.comment(
232
+ `FINDING 5 — SKIPPED WITH REASONS (${formatCount(findings.skipped.entries.length)} entries)`,
233
+ );
234
+ for (const entry of findings.skipped.entries.slice(0, 20)) {
235
+ writer.comment(
236
+ ` [${entry.reason}] ${entry.path ?? entry.subjectId ?? "-"}: ${entry.detail}`,
237
+ );
238
+ }
239
+ if (findings.skipped.entries.length > 20) {
240
+ writer.comment(
241
+ ` … ${formatCount(findings.skipped.entries.length - 20)} more; complete list in \`untangle init --format json\`.`,
242
+ );
243
+ }
244
+ }
245
+
246
+ writer.comment(RULE);
247
+ writer.blank();
248
+ }
249
+
250
+ function renderFeatureAlignmentFinding(writer: TomlWriter, findings: ProjectFindingsV1): void {
251
+ const alignment = findings.featureAlignment;
252
+ if (alignment === undefined) return;
253
+ writer.comments([
254
+ "",
255
+ "FEATURE EVIDENCE — DECLARED PRODUCT BOUNDARIES",
256
+ ` Status: ${alignment.status}; manifest ${JSON.stringify(alignment.manifest.path)} (${alignment.manifest.status}).`,
257
+ ` Semantic conformance: ${alignment.semanticConformance}; ownership authority: ${alignment.ownershipAuthority}.`,
258
+ " Full report and agent hints: untangle product --format=json. No feature map is written.",
259
+ ]);
260
+ for (const feature of alignment.features) {
261
+ writer.comment(
262
+ ` ${JSON.stringify(feature.id)}: ${feature.status}; review ${feature.review}; test evidence ${feature.testEvidence.status}.`,
263
+ );
264
+ writer.comment(
265
+ ` Ownership: ${feature.ownership.map((owner) => `${JSON.stringify(owner.id)}:${owner.status}`).join(", ") || "none"}.`,
266
+ );
267
+ if (feature.code.metrics !== null) {
268
+ const cognitive = feature.code.metrics.cognitive;
269
+ writer.comment(
270
+ ` Code cognitive: execution_unit=${String(cognitive.execution_unit)}, self=${String(cognitive.self)}, top_level=${String(cognitive.top_level)}.`,
271
+ );
272
+ }
273
+ for (const hint of feature.agentHints) {
274
+ writer.comment(` Hint ${hint.code}: ${hint.message.replace(/[\r\n]/gu, " ")}`);
275
+ }
276
+ }
277
+ for (const limitation of alignment.limitations) {
278
+ writer.comment(` Limit: ${limitation.replace(/[\r\n]/gu, " ")}`);
279
+ }
280
+ }
281
+
282
+ function renderProductContextFinding(writer: TomlWriter, findings: ProjectFindingsV1): void {
283
+ const productContext = findings.productContext;
284
+ if (productContext === undefined) return;
285
+ writer.comments([
286
+ "",
287
+ "PRODUCT CONTEXT — LOCAL DOCUMENT INSPECTION",
288
+ ` Status: ${productContext.status}; features and ownership remain unconfirmed.`,
289
+ ]);
290
+ for (const source of productContext.sources) {
291
+ writer.comment(
292
+ ` ${source.role}: ${JSON.stringify(source.path)} — ${source.status}${source.selected ? ", selected" : ", not selected"}; SHA-256: ${source.contentHash ?? "unavailable"}`,
293
+ );
294
+ }
295
+ for (const warning of productContextWarnings(findings)) {
296
+ writer.comment(` WARNING: ${warning}`);
297
+ }
298
+ writer.comment(" Review draft: no confirmed features or ownership.");
299
+ for (const question of productContext.reviewDraft.questions) {
300
+ writer.comment(` Open question: ${question.replace(/[\r\n]/gu, " ")}`);
301
+ }
302
+ }
303
+
304
+ /** Same bounded findings in the configuration comments and terminal report. */
305
+ export function productContextWarnings(findings: ProjectFindingsV1): string[] {
306
+ const productContext = findings.productContext;
307
+ if (productContext === undefined) return [];
308
+ const warnings = ["Semantic conformance unverified; features and ownership unconfirmed."];
309
+ if (productContext.missingRoles.length > 0) {
310
+ warnings.push(`Missing product sources: ${productContext.missingRoles.join(", ")}.`);
311
+ }
312
+ if (productContext.ambiguousRoles.length > 0) {
313
+ warnings.push(`Ambiguous source selection: ${productContext.ambiguousRoles.join(", ")}.`);
314
+ }
315
+ if (productContext.status === "incomplete") {
316
+ warnings.push("Product evidence incomplete; inspect read errors, limits and changed sources.");
317
+ }
318
+ for (const limitation of productContext.limitations) {
319
+ warnings.push(limitation.replace(/[\r\n]/gu, " "));
320
+ }
321
+ return warnings;
322
+ }
323
+
324
+ function renderIdentity(writer: TomlWriter, layer: RawConfigLayer): void {
325
+ writer.comments([
326
+ "This file's schema version. `untangle` reads it and migrates older",
327
+ "versions automatically; manual version increments are never required.",
328
+ ]);
329
+ writer.scalar("schemaVersion", 1);
330
+ writer.comment("Derived from the directory name. Editable; it only identifies this project.");
331
+ writer.scalar("projectId", layer.projectId ?? "project");
332
+ writer.blank();
333
+ }
334
+
335
+ function renderRepositories(
336
+ writer: TomlWriter,
337
+ findings: ProjectFindingsV1,
338
+ layer: RawConfigLayer,
339
+ ): void {
340
+ const repository = layer.repositories?.[0];
341
+ if (repository === undefined) {
342
+ return;
343
+ }
344
+ writer.comments([
345
+ RULE,
346
+ "REPOSITORIES",
347
+ "",
348
+ "One entry per Git repository, not per package: the packages and services in",
349
+ "finding 2 all belong to this repository and are rediscovered",
350
+ "automatically during indexing. Add a second repository (a neighboring project or",
351
+ "a shared library repository) as another [[repositories]] block;",
352
+ "as another entry; `path` is relative to this file or absolute.",
353
+ RULE,
354
+ ]);
355
+ writer.arrayTable(["repositories"]);
356
+ writer.scalar("id", repository.id ?? findings.projectId);
357
+ writer.scalar("path", repository.path ?? ".");
358
+ if (repository.label !== undefined) {
359
+ writer.scalar("label", repository.label);
360
+ }
361
+ writer.blank();
362
+ writer.comments([
363
+ "Content excluded from indexing. The list is explicit because",
364
+ "defaults may be wrong for a project whose authored",
365
+ "sources live in build/; such a project must be able to remove this entry.",
366
+ ]);
367
+ const additional = findings.ignore.additionalExcludes;
368
+ if (additional.length > 0) {
369
+ writer.comment(
370
+ `Added from .gitignore because product defaults could not know them: ${additional.join(", ")}`,
371
+ );
372
+ }
373
+ writer.array("exclude", repository.exclude ?? []);
374
+ writer.blank();
375
+ }
376
+
377
+ function renderStorage(
378
+ writer: TomlWriter,
379
+ findings: ProjectFindingsV1,
380
+ layer: RawConfigLayer,
381
+ ): void {
382
+ const storage = layer.storage;
383
+ if (storage === undefined) return;
384
+ const backend = storage.backend ?? "lancedb";
385
+ writer.comments([
386
+ RULE,
387
+ "SEARCH STORAGE",
388
+ backend === "lancedb"
389
+ ? "Embedded LanceDB stores local search data without Docker or a running service."
390
+ : "Qdrant was explicitly selected; its server configuration follows below.",
391
+ "Changing backend selects a separate index. Rebuild it with `untangle index`.",
392
+ RULE,
393
+ ]);
394
+ writer.table(["storage"]);
395
+ writer.scalar("backend", backend);
396
+ if (backend === "lancedb" && storage.path !== undefined) {
397
+ writer.comment(
398
+ "Relative to this project root. The directory is created only when indexing writes data.",
399
+ );
400
+ writer.scalar("path", storage.path);
401
+ writer.comment(
402
+ `Inspection: ${findings.storage?.directoryStatus ?? "not inspected"}; no database was opened.`,
403
+ );
404
+ }
405
+ writer.blank();
406
+ }
407
+
408
+ function renderQdrant(
409
+ writer: TomlWriter,
410
+ findings: ProjectFindingsV1,
411
+ layer: RawConfigLayer,
412
+ ): void {
413
+ const qdrant = layer.qdrant;
414
+ if (qdrant === undefined) {
415
+ return;
416
+ }
417
+ writer.comments([
418
+ RULE,
419
+ "VECTOR STORE",
420
+ "",
421
+ qdrant.mode === "external"
422
+ ? "An external Qdrant endpoint was selected at the address below."
423
+ : "An owned Qdrant endpoint was selected. Plain init starts no containers.",
424
+ qdrant.mode === "external"
425
+ ? findings.qdrant.outcome === "reachable"
426
+ ? "The server responded during discovery. Untangle writes only owned collections."
427
+ : "The server is not currently reachable; selecting it does not start a service."
428
+ : "Guided setup can prepare or explicitly execute an isolated service recipe.",
429
+ qdrant.mode === "external"
430
+ ? "Only collections with the configured prefix belong to this project."
431
+ : "A foreign instance is never taken over (spec.md §3.2).",
432
+ RULE,
433
+ ]);
434
+ writer.table(["qdrant"]);
435
+ writer.scalar("mode", qdrant.mode ?? "managed");
436
+ if (qdrant.url !== undefined) {
437
+ writer.scalar("url", qdrant.url);
438
+ } else {
439
+ writer.comment('url = "http://127.0.0.1:16333" # owned instance, once running');
440
+ }
441
+ writer.comment("Separates this project from others on the same instance.");
442
+ writer.scalar("collectionPrefix", qdrant.collectionPrefix ?? "untangle_");
443
+ writer.comment("API keys are never stored here; only the environment variable name:");
444
+ writer.comment('apiKeyEnv = "UNTANGLE_QDRANT_API_KEY"');
445
+ if (findings.qdrant.skippedUrls.length > 0) {
446
+ writer.blank();
447
+ for (const skipped of findings.qdrant.skippedUrls) {
448
+ writer.comment(`Not checked: ${skipped.url} — ${skipped.reason}`);
449
+ }
450
+ }
451
+ writer.blank();
452
+ }
453
+
454
+ function renderEmbeddings(
455
+ writer: TomlWriter,
456
+ findings: ProjectFindingsV1,
457
+ layer: RawConfigLayer,
458
+ ): void {
459
+ const embeddings = layer.embeddings;
460
+ if (embeddings === undefined) {
461
+ return;
462
+ }
463
+ const reachable =
464
+ findings.ollama.outcome === "reachable" && findings.ollama.chosenModel !== undefined;
465
+ writer.comments([
466
+ RULE,
467
+ "EMBEDDINGS",
468
+ "",
469
+ reachable
470
+ ? "The model, vector width and context window come from the provider's"
471
+ : "No provider responded, so this uses the default profile and",
472
+ reachable
473
+ ? "own report (/api/tags), rather than guesses."
474
+ : '`mode = "auto"`: the next run discovers a provider automatically.',
475
+ "",
476
+ "Important: `dimensions` determines the collection width. If the model is",
477
+ "changed later, reindexing is required; `untangle` detects the",
478
+ "conflict before the first write and aborts instead of mixing incompatible data.",
479
+ RULE,
480
+ ]);
481
+ writer.table(["embeddings"]);
482
+ writer.scalar("provider", embeddings.provider ?? "ollama");
483
+ writer.scalar("mode", embeddings.mode ?? "auto");
484
+ if (embeddings.url !== undefined) {
485
+ writer.scalar("url", embeddings.url);
486
+ }
487
+ if (findings.ollama.chosenReason !== undefined) {
488
+ writer.comment(`Selected because: ${findings.ollama.chosenReason}.`);
489
+ }
490
+ if (findings.ollama.embeddingModels.length > 1) {
491
+ writer.comment(
492
+ `Also available: ${findings.ollama.embeddingModels
493
+ .filter((model) => model.name !== findings.ollama.chosenModel?.name)
494
+ .map((model) => model.name)
495
+ .join(", ")}`,
496
+ );
497
+ }
498
+ writer.scalar("model", embeddings.model ?? "");
499
+ writer.comment(
500
+ reachable
501
+ ? "Provider-reported vector width (embedding_length), not an assumption."
502
+ : "Product default, replaced on the next run with an available provider.",
503
+ );
504
+ writer.scalar("dimensions", embeddings.dimensions ?? 0);
505
+ writer.comment(
506
+ reachable ? "Provider-reported context window (context_length)." : "Product default.",
507
+ );
508
+ writer.scalar("contextLength", embeddings.contextLength ?? 0);
509
+ writer.blank();
510
+ }
511
+
512
+ function renderIndex(writer: TomlWriter, layer: RawConfigLayer): void {
513
+ const index = layer.index;
514
+ if (index === undefined) {
515
+ return;
516
+ }
517
+ const defaults = PRODUCT_DEFAULT_CONFIG.index;
518
+ writer.comments([
519
+ RULE,
520
+ "INDEX",
521
+ "",
522
+ "Only the two settings that commonly need a decision. Other settings",
523
+ `(chunk sizes, concurrency, checkpoint interval, for example`,
524
+ `targetChunkTokens = ${String(defaults?.targetChunkTokens ?? 0)}, scanConcurrency = ${String(defaults?.scanConcurrency ?? 0)})`,
525
+ "come from product defaults and may be added here.",
526
+ RULE,
527
+ ]);
528
+ writer.table(["index"]);
529
+ writer.comment("Larger files are not read and receive a skip-ledger entry.");
530
+ writer.scalar("maxFileSizeMb", index.maxFileSizeMb ?? 5);
531
+ writer.comment("Track filesystem changes rather than waiting for the next run.");
532
+ writer.scalar("watch", index.watch ?? true);
533
+ writer.blank();
534
+ }
535
+
536
+ function renderGraph(writer: TomlWriter, findings: ProjectFindingsV1, layer: RawConfigLayer): void {
537
+ const graph = layer.graph;
538
+ if (graph === undefined) {
539
+ return;
540
+ }
541
+ writer.comments([
542
+ RULE,
543
+ "GRAPH",
544
+ "",
545
+ findings.topology.isMonorepo
546
+ ? `This project contains several subprojects (${String(findings.topology.packages.length)} packages, ${String(findings.topology.services.length)} services); the graph`
547
+ : "A single project also has a dependency graph; it is simply",
548
+ findings.topology.isMonorepo
549
+ ? "also identifies dependencies between subprojects."
550
+ : "shallower. It answers which dependents may break when this file changes.",
551
+ RULE,
552
+ ]);
553
+ writer.table(["graph"]);
554
+ writer.scalar("enabled", graph.enabled ?? true);
555
+ writer.blank();
556
+ }
557
+
558
+ function renderTelemetry(writer: TomlWriter, layer: RawConfigLayer): void {
559
+ const telemetry = layer.telemetry;
560
+ if (telemetry === undefined) {
561
+ return;
562
+ }
563
+ writer.comments([
564
+ RULE,
565
+ "TELEMETRY",
566
+ "",
567
+ "Disabled. Listed explicitly so it is clear that",
568
+ "nothing leaves the device (spec.md §24).",
569
+ RULE,
570
+ ]);
571
+ writer.table(["telemetry"]);
572
+ writer.scalar("enabled", telemetry.enabled ?? false);
573
+ writer.blank();
574
+ }
575
+
576
+ function renderFooter(writer: TomlWriter, nextStep: string): void {
577
+ writer.comments([RULE, `NEXT STEP: ${nextStep}`, RULE]);
578
+ }
579
+
580
+ function renderContextArtifacts(writer: TomlWriter, layer: RawConfigLayer): void {
581
+ const artifacts = layer.contextArtifacts ?? [];
582
+ if (artifacts.length === 0) return;
583
+ writer.comments([
584
+ RULE,
585
+ "PRODUKTQUELLEN",
586
+ "Selected readable documents for provisional product context.",
587
+ "Paths are relative to this file; this entry confirms no features.",
588
+ RULE,
589
+ ]);
590
+ for (const artifact of artifacts) {
591
+ writer.arrayTable(["contextArtifacts"]);
592
+ writer.scalar("name", artifact.name ?? "");
593
+ writer.scalar("path", artifact.path ?? "");
594
+ writer.scalar("description", artifact.description ?? "Provisional product context.");
595
+ writer.scalar("type", artifact.type ?? "markdown");
596
+ writer.blank();
597
+ }
598
+ }