@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,325 @@
1
+ /**
2
+ * Die Ausgabe von `untangle index`.
3
+ *
4
+ * ZWEI REGELN, die den Text tragen:
5
+ * 1. Fortschritt geht nach STDERR, der Bericht nach STDOUT. Nur so bleibt
6
+ * `untangle index --format=json | jq` benutzbar, waehrend man beim Laufen
7
+ * trotzdem etwas sieht.
8
+ * 2. Die Zahl „uebersprungen" steht IMMER da — auch wenn sie 0 ist. Eine Zahl,
9
+ * die nur bei Problemen erscheint, liest sich beim Fehlen wie „alles gut",
10
+ * und genau das ist der Unterschied zwischen „nichts uebersprungen" und
11
+ * „nicht nachgesehen".
12
+ */
13
+ import type { IndexPlanV1, IndexReportV1 } from "@untangle-code/core";
14
+ import { compareCodepoints, type JobEvent } from "@untangle-code/domain";
15
+
16
+ import { line, note, type Io } from "../../cli/io.js";
17
+
18
+ /**
19
+ * Der laufende Stand eines Indexlaufs — AUSSCHLIESSLICH fuer die Anzeige.
20
+ *
21
+ * Er zaehlt mit, was die Ereignisse melden, damit eine Fortschrittszeile
22
+ * „12 von 47 Dateien" sagen kann statt nur „Stapel 3". Diese Zahlen sind
23
+ * keine Ergebnisdaten: der Bericht am Ende zaehlt selbst (siehe
24
+ * `IndexCountsV1`), und beide muessen sich decken.
25
+ */
26
+ export interface IndexProgressV1 {
27
+ plannedFiles: number;
28
+ embeddedFiles: number;
29
+ storedPoints: number;
30
+ }
31
+
32
+ export function createIndexProgress(): IndexProgressV1 {
33
+ return { plannedFiles: 0, embeddedFiles: 0, storedPoints: 0 };
34
+ }
35
+
36
+ /**
37
+ * Die Kopfzeilen VOR dem ersten Ereignis.
38
+ *
39
+ * WP-227: Der Laeufer meldet eine Stufe erst, wenn sie FERTIG ist. Haengt die
40
+ * erste Stufe — und genau das tut sie, wenn der Einbettungsdienst nicht
41
+ * antwortet —, dann gibt es ohne diese Zeilen ueberhaupt keine Ausgabe. Der
42
+ * Nutzer sieht dann nicht einmal, WORAUF gewartet wird. Deshalb steht hier,
43
+ * was gleich passiert, bevor irgendetwas passiert.
44
+ */
45
+ export function renderRunHeader(
46
+ io: Io,
47
+ input: {
48
+ rootPath: string;
49
+ repoId: string;
50
+ refName: string;
51
+ collection: string;
52
+ embedder: string;
53
+ timeoutMs: number;
54
+ },
55
+ ): void {
56
+ note(io, `[ 0%] Target: ${input.rootPath}`);
57
+ note(
58
+ io,
59
+ ` Repository ${input.repoId}, Ref ${input.refName}, collection ${input.collection}.`,
60
+ );
61
+ note(
62
+ io,
63
+ ` Embedder ${input.embedder}, deadline ${String(input.timeoutMs)} ms per call ` +
64
+ "(--timeout). Five stages: check services, discover files, process, " +
65
+ "build graphs, commit.",
66
+ );
67
+ }
68
+
69
+ /** Eine Fortschrittszeile je Ereignis — kurz, und nie auf stdout. */
70
+ export function renderEvent(
71
+ io: Io,
72
+ event: JobEvent,
73
+ verbose: boolean,
74
+ progress: IndexProgressV1 = createIndexProgress(),
75
+ ): void {
76
+ switch (event.kind) {
77
+ case "job_queued":
78
+ note(io, `[ 1%] Job ${event.jobId} queued. Stage 1/5: embedding service and collection.`);
79
+ return;
80
+ case "infrastructure_ready":
81
+ note(
82
+ io,
83
+ `[ 10%] Ready: ${Object.entries(event.endpoints)
84
+ .sort(([a], [b]) => compareCodepoints(a, b))
85
+ .map(([key, value]) => `${key}=${value}`)
86
+ .join(" ")}`,
87
+ );
88
+ note(io, "[ 15%] Stage 2/5: discovering files …");
89
+ return;
90
+ case "files_discovered":
91
+ progress.plannedFiles = event.changedFiles;
92
+ note(
93
+ io,
94
+ `[ 20%] Found: ${String(event.totalFiles)} files, including ` +
95
+ `${String(event.changedFiles)} planned, ${String(event.unchangedFiles)} unchanged, ` +
96
+ `${String(event.ignoredFiles)} ignoriert.`,
97
+ );
98
+ note(
99
+ io,
100
+ event.changedFiles === 0
101
+ ? "[ 25%] Stage 3/5: nothing to process; every discovered file is unchanged."
102
+ : `[ 25%] Stage 3/5: ${String(event.changedFiles)} files to parse, embed and store …`,
103
+ );
104
+ return;
105
+ case "file_analyzed":
106
+ if (verbose) {
107
+ note(
108
+ io,
109
+ ` analysiert ${event.filePath} (${String(event.chunkCount)} Chunks, ` +
110
+ `${String(event.symbolCount)} symbols, parse=${event.parseQuality})`,
111
+ );
112
+ }
113
+ return;
114
+ case "embedding_batch_completed":
115
+ progress.embeddedFiles += event.batchSize;
116
+ note(
117
+ io,
118
+ `[${percentOfPipeline(progress)}] Batch ${String(event.batchIndex)}: ` +
119
+ `${String(event.batchSize)} files embedded ` +
120
+ `(${String(progress.embeddedFiles)} of ${String(progress.plannedFiles)}), ` +
121
+ `${String(event.cacheHits)} from cache, ` +
122
+ `${String(event.truncatedCount)} gekuerzt.`,
123
+ );
124
+ return;
125
+ case "points_stored":
126
+ progress.storedPoints += event.pointCount;
127
+ note(
128
+ io,
129
+ `[${percentOfPipeline(progress)}] Stored: ${String(event.pointCount)} points in ` +
130
+ `${event.collection} (${String(event.serializedBytes)} Bytes, ` +
131
+ `${String(progress.storedPoints)} total).`,
132
+ );
133
+ return;
134
+ case "checkpoint_saved":
135
+ if (verbose) {
136
+ note(io, ` Checkpoint at ${event.stage}: ${String(event.completedFileCount)} files.`);
137
+ }
138
+ return;
139
+ case "graph_updated":
140
+ note(
141
+ io,
142
+ `[ 85%] Stage 4/5 — graph ${event.graph}: ${String(event.nodeCount)} nodes, ` +
143
+ `${String(event.edgeCount)} edges.`,
144
+ );
145
+ return;
146
+ case "job_completed":
147
+ note(io, `[100%] Finished in ${String(event.durationMs)} ms.`);
148
+ return;
149
+ case "job_failed":
150
+ note(io, `[ !! ] Failed: ${event.errorCode} — ${event.message}`);
151
+ return;
152
+ case "job_cancelled":
153
+ note(io, `[ -- ] Cancelled. Checkpoint saved: ${event.checkpointSaved ? "ja" : "no"}.`);
154
+ return;
155
+ default:
156
+ return;
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Der Anteil der Verarbeitungsstufe am Ganzen: sie liegt zwischen 25 % und
162
+ * 80 %. Ohne bekannte Dateizahl bleibt es bei 50 % — eine erfundene
163
+ * Genauigkeit waere schlimmer als gar keine.
164
+ */
165
+ function percentOfPipeline(progress: IndexProgressV1): string {
166
+ if (progress.plannedFiles <= 0) return " 50%";
167
+ const done = Math.min(progress.embeddedFiles, progress.plannedFiles);
168
+ const percent = 25 + Math.floor((55 * done) / progress.plannedFiles);
169
+ return `${String(percent).padStart(3, " ")}%`;
170
+ }
171
+
172
+ /** Der Bericht als Text. */
173
+ export function renderReport(io: Io, report: IndexReportV1): void {
174
+ const c = report.counts;
175
+ line(io, `Outcome: ${report.outcome}`);
176
+ line(io, `Repository: ${report.repoId}`);
177
+ line(io, `Ref: ${report.refId}`);
178
+ line(io, `Generation: ${report.generationId ?? "(none)"}`);
179
+ line(io, `Collection: ${report.collection}`);
180
+ line(io, `Profile: ${report.embeddingProfileId}`);
181
+ line(io, "");
182
+ line(io, `Files discovered: ${String(c.filesSeen)}`);
183
+ line(io, ` planned: ${String(c.filesPlanned)}`);
184
+ line(io, ` unchanged: ${String(c.filesUnchanged)} (not recomputed)`);
185
+ line(io, ` ignoriert: ${String(c.filesIgnored)}`);
186
+ line(io, `Files analyzed: ${String(c.filesAnalyzed)}`);
187
+ line(io, `Files removed: ${String(c.filesRemoved)}`);
188
+ line(io, `Chunks: ${String(c.chunks)}`);
189
+ line(io, `Symbols: ${String(c.symbols)}`);
190
+ line(io, `Points stored: ${String(c.points)}`);
191
+ line(
192
+ io,
193
+ `Embeddings: ${String(c.embeddingsComputed)} computed, ` +
194
+ `${String(c.embeddingCacheHits)} from cache, ` +
195
+ `${String(c.truncated)} gekuerzt`,
196
+ );
197
+ line(io, analysisCacheLine(c));
198
+ line(
199
+ io,
200
+ `File graph: ${String(c.fileGraphNodes)} nodes, ${String(c.fileGraphEdges)} edges`,
201
+ );
202
+ line(
203
+ io,
204
+ `Symbol graph: ${String(c.symbolGraphNodes)} nodes, ${String(c.symbolGraphEdges)} edges`,
205
+ );
206
+ line(io, "");
207
+ renderSkips(
208
+ io,
209
+ report.skipped.length,
210
+ report.skippedByReason,
211
+ report.skippedByStage,
212
+ report.skippedTruncated,
213
+ );
214
+ if (report.failure !== undefined) {
215
+ line(io, "");
216
+ line(io, `FAILURE ${report.failure.code}: ${report.failure.message}`);
217
+ line(io, `Retryable: ${report.failure.retryable ? "ja" : "no"}`);
218
+ }
219
+ }
220
+
221
+ /** Der Trockenlauf als Text. */
222
+ export function renderPlan(io: Io, plan: IndexPlanV1, showFiles: number): void {
223
+ line(io, `Files discovered: ${String(plan.filesSeen)}`);
224
+ line(io, ` would plan: ${String(plan.planned.length)}`);
225
+ line(io, ` unchanged: ${String(plan.filesUnchanged)}`);
226
+ line(io, ` ignoriert: ${String(plan.filesIgnored)}`);
227
+ line(io, ` entfernt: ${String(plan.removedFileIds.length)}`);
228
+ if (plan.previousUnavailable !== undefined) {
229
+ line(io, "");
230
+ line(
231
+ io,
232
+ `Note: the previous generation could not be read (${plan.previousUnavailable}). ` +
233
+ "All files are therefore considered planned; this number is an upper bound, " +
234
+ "not a comparison.",
235
+ );
236
+ }
237
+ line(io, "");
238
+ renderSkips(
239
+ io,
240
+ plan.skipped.length,
241
+ plan.skippedByReason,
242
+ plan.skippedByStage,
243
+ plan.skippedTruncated,
244
+ );
245
+ if (showFiles > 0 && plan.planned.length > 0) {
246
+ line(io, "");
247
+ line(io, `Planned work (first ${String(Math.min(showFiles, plan.planned.length))}):`);
248
+ for (const file of plan.planned.slice(0, showFiles)) {
249
+ line(io, ` ${file.filePath}`);
250
+ }
251
+ if (plan.planned.length > showFiles) {
252
+ line(io, ` … and ${String(plan.planned.length - showFiles)} weitere.`);
253
+ }
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Stufen, die von DATEIEN handeln. Alles andere handelt von Kanten und
259
+ * Kandidaten — zwei Dinge, die in einer gemeinsamen Zahl nur verwirren:
260
+ * „9207 uebersprungen" liest sich wie ein kaputter Index, ist aber die
261
+ * normale Meldung des Symbolgraphen ueber Aufrufe nach ausserhalb.
262
+ */
263
+ const FILE_STAGES = new Set(["scan", "parse", "chunk", "embed", "store"]);
264
+
265
+ function renderSkips(
266
+ io: Io,
267
+ listed: number,
268
+ byReason: Readonly<Record<string, number | undefined>>,
269
+ byStage: Readonly<Record<string, number | undefined>>,
270
+ truncated: number,
271
+ ): void {
272
+ const total = Object.values(byReason).reduce<number>((sum, value) => sum + (value ?? 0), 0);
273
+ const fileTotal = Object.entries(byStage)
274
+ .filter(([stage]) => FILE_STAGES.has(stage))
275
+ .reduce<number>((sum, [, value]) => sum + (value ?? 0), 0);
276
+
277
+ line(io, `Skipped: ${String(total)} (each entry includes a reason)`);
278
+ line(io, ` files: ${String(fileTotal)}`);
279
+ line(io, ` graph/search: ${String(total - fileTotal)}`);
280
+ line(io, "");
281
+ line(io, " by stage:");
282
+ for (const stage of Object.keys(byStage).sort(compareCodepoints)) {
283
+ line(io, ` ${stage.padEnd(26)} ${String(byStage[stage] ?? 0)}`);
284
+ }
285
+ line(io, " by reason:");
286
+ for (const reason of Object.keys(byReason).sort(compareCodepoints)) {
287
+ line(io, ` ${reason.padEnd(26)} ${String(byReason[reason] ?? 0)}`);
288
+ }
289
+ if (truncated > 0) {
290
+ line(
291
+ io,
292
+ ` (${String(truncated)} entries are counted but omitted from the list ` +
293
+ `listed individually; ${String(listed)} appear in --format=json)`,
294
+ );
295
+ }
296
+ }
297
+
298
+ /**
299
+ * Die Trefferquote der drei inhaltsadressierten Analyse-Caches (WP-100).
300
+ *
301
+ * Sie steht IM BERICHT und nicht nur im Protokoll, weil ein Cache, ueber den
302
+ * niemand etwas erfaehrt, nicht ueberpruefbar ist: erst die Quote zeigt, ob
303
+ * der zweite Lauf wirklich gespart hat oder ob nur die Uhr guenstig stand.
304
+ */
305
+ function analysisCacheLine(c: {
306
+ parseCacheHits: number;
307
+ parseCacheMisses: number;
308
+ chunkCacheHits: number;
309
+ chunkCacheMisses: number;
310
+ metricsCacheHits: number;
311
+ metricsCacheMisses: number;
312
+ }): string {
313
+ const hits = c.parseCacheHits + c.chunkCacheHits + c.metricsCacheHits;
314
+ const lookups = hits + c.parseCacheMisses + c.chunkCacheMisses + c.metricsCacheMisses;
315
+ if (lookups === 0) {
316
+ return "Analysis cache: off (no cache connected)";
317
+ }
318
+ const rate = ((hits / lookups) * 100).toFixed(1);
319
+ return (
320
+ `Analysis cache: ${String(hits)}/${String(lookups)} hits (${rate} %) — ` +
321
+ `Parse ${String(c.parseCacheHits)}/${String(c.parseCacheHits + c.parseCacheMisses)}, ` +
322
+ `Chunk ${String(c.chunkCacheHits)}/${String(c.chunkCacheHits + c.chunkCacheMisses)}, ` +
323
+ `metric ${String(c.metricsCacheHits)}/${String(c.metricsCacheHits + c.metricsCacheMisses)}`
324
+ );
325
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Welches Repository und welcher Ref indiziert werden.
3
+ *
4
+ * ZWEI FAELLE, UND BEIDE MUESSEN EHRLICH SEIN:
5
+ *
6
+ * 1. Die Konfiguration nennt Repositories (spec.md §4.3). Dann wird genau
7
+ * eines davon gewaehlt — das mit `--repo` benannte, oder das einzige. Bei
8
+ * mehreren ohne Angabe wird NICHT geraten, sondern gefragt: ein falsch
9
+ * geratenes Repository indiziert stumm das falsche Projekt.
10
+ * 2. Die Konfiguration nennt keine (der haeufigste Fall beim ersten Aufruf).
11
+ * Dann ist das Zielverzeichnis selbst das Repository. Das steht in der
12
+ * Ausgabe, damit niemand glaubt, es sei konfiguriert worden.
13
+ *
14
+ * DER REFNAME wird aus `.git/HEAD` gelesen, wenn es ihn gibt. Steht dort ein
15
+ * losgeloester Commit oder gibt es kein Git, heisst der Ref
16
+ * `"working-tree"` — ein Name, der sagt, was er ist, statt „main" zu
17
+ * behaupten und damit zwei verschiedene Staende unter derselben Identitaet
18
+ * abzulegen.
19
+ */
20
+ import { readFileSync } from "node:fs";
21
+ import path from "node:path";
22
+
23
+ import type { EffectiveUntangleConfigV1 } from "@untangle-code/config";
24
+ import { buildRefId, buildRepoId, compareCodepoints } from "@untangle-code/domain";
25
+
26
+ import { UsageError } from "../../cli/exit.js";
27
+
28
+ /** Der Ref, der gemeint ist, wenn kein Git-Zweig lesbar ist. */
29
+ export const WORKING_TREE_REF = "working-tree";
30
+
31
+ export interface ResolvedTarget {
32
+ repoId: string;
33
+ refId: string;
34
+ refName: string;
35
+ repoLabel: string;
36
+ rootPath: string;
37
+ /** True, wenn das Repository nicht aus der Konfiguration stammt. */
38
+ synthesized: boolean;
39
+ /**
40
+ * `include`/`exclude` des gewaehlten Repositories (spec.md §4.3).
41
+ *
42
+ * SIE MUESSEN WEITERGEREICHT WERDEN. Werden sie es nicht, indiziert der Lauf
43
+ * stumm mehr, als die Konfiguration erlaubt — inklusive des eigenen
44
+ * Zustandsverzeichnisses `.untangle`, dessen Zwischenspeicherdateien sich
45
+ * bei jedem Lauf aendern und den naechsten Lauf jedes Mal Arbeit vortaeuschen
46
+ * lassen. Genau das ist beim ersten Bau dieses Befehls passiert.
47
+ */
48
+ include: readonly string[] | undefined;
49
+ exclude: readonly string[] | undefined;
50
+ }
51
+
52
+ export function resolveTarget(input: {
53
+ config: EffectiveUntangleConfigV1;
54
+ cwd: string;
55
+ rootFlag: string | undefined;
56
+ repoFlag: string | undefined;
57
+ refFlag: string | undefined;
58
+ configBaseDir: string;
59
+ }): ResolvedTarget {
60
+ const repositories = input.config.repositories ?? [];
61
+
62
+ if (repositories.length === 0) {
63
+ const rootPath = path.resolve(input.cwd, input.rootFlag ?? ".");
64
+ const refName = input.refFlag ?? detectRefName(rootPath);
65
+ const repoId = buildRepoId({ canonicalPath: rootPath });
66
+ return {
67
+ repoId,
68
+ refId: buildRefId(repoId, refName),
69
+ refName,
70
+ repoLabel: path.basename(rootPath),
71
+ rootPath,
72
+ synthesized: true,
73
+ include: undefined,
74
+ // Ohne Konfiguration gilt wenigstens die eine Regel, die immer stimmt:
75
+ // das eigene Zustandsverzeichnis ist kein Quelltext.
76
+ exclude: [".untangle"],
77
+ };
78
+ }
79
+
80
+ const chosen =
81
+ input.repoFlag === undefined
82
+ ? repositories.length === 1
83
+ ? repositories[0]
84
+ : undefined
85
+ : repositories.find((repo) => repo.id === input.repoFlag);
86
+
87
+ if (chosen === undefined) {
88
+ const names = repositories.map((repo) => repo.id).sort(compareCodepoints);
89
+ throw new UsageError(
90
+ input.repoFlag === undefined
91
+ ? `The configuration contains ${String(repositories.length)} repositories; which should be indexed?`
92
+ : `The configuration has no repository "${input.repoFlag}".`,
93
+ `Select one with --repo=<id>. Known IDs: ${names.join(", ")}.`,
94
+ );
95
+ }
96
+
97
+ const rootPath = path.resolve(input.configBaseDir, chosen.path);
98
+ const refName = input.refFlag ?? chosen.ref ?? detectRefName(rootPath);
99
+ const repoId = buildRepoId({
100
+ ...(chosen.id === "" ? {} : { explicitId: chosen.id }),
101
+ canonicalPath: rootPath,
102
+ });
103
+ return {
104
+ repoId,
105
+ refId: buildRefId(repoId, refName),
106
+ refName,
107
+ repoLabel: chosen.label ?? chosen.id,
108
+ rootPath,
109
+ synthesized: false,
110
+ include: chosen.include,
111
+ exclude:
112
+ chosen.exclude === undefined
113
+ ? [".untangle"]
114
+ : chosen.exclude.includes(".untangle")
115
+ ? chosen.exclude
116
+ : [...chosen.exclude, ".untangle"],
117
+ };
118
+ }
119
+
120
+ /** Zweigname aus `.git/HEAD`, sonst {@link WORKING_TREE_REF}. */
121
+ export function detectRefName(rootPath: string): string {
122
+ try {
123
+ let gitDir = path.join(rootPath, ".git");
124
+ try {
125
+ const pointer = /^gitdir:\s*(.+)$/u.exec(readFileSync(gitDir, "utf8").trim());
126
+ if (pointer?.[1] !== undefined) gitDir = path.resolve(rootPath, pointer[1]);
127
+ } catch {
128
+ /* A normal checkout has a .git directory. */
129
+ }
130
+ const head = readFileSync(path.join(gitDir, "HEAD"), "utf8").trim();
131
+ const match = /^ref:\s*refs\/heads\/(.+)$/u.exec(head);
132
+ return match?.[1] ?? WORKING_TREE_REF;
133
+ } catch {
134
+ return WORKING_TREE_REF;
135
+ }
136
+ }
@@ -0,0 +1,206 @@
1
+ import { setTimeout as wait } from "node:timers/promises";
2
+
3
+ import type { IndexFreshnessV1 } from "@untangle-code/domain";
4
+
5
+ import type { CommandContext } from "../cli/command.js";
6
+ import { EXIT, EnvironmentError, UsageError } from "../cli/exit.js";
7
+ import { inspectIndexFreshness } from "../cli/index-freshness.js";
8
+ import { refreshWorkspaceIndex } from "../cli/index-refresh.js";
9
+ import { resolveIndexState } from "../cli/index-state.js";
10
+ import { systemClock } from "../cli/system.js";
11
+ import { loadWorkspace, storageIndexScope, wireStorage } from "../cli/workspace.js";
12
+
13
+ import { detectRefName, resolveTarget } from "./index/target.js";
14
+ import { createStreamSink } from "./watch/runtime.js";
15
+
16
+ export interface IndexWatchOptions {
17
+ root: string;
18
+ repo?: string;
19
+ ref?: string;
20
+ embedder: "auto" | "offline";
21
+ intervalMs: number;
22
+ format: "text" | "json";
23
+ outPath: string | null;
24
+ once: boolean;
25
+ maxRefreshes: number | null;
26
+ }
27
+
28
+ export interface IndexWatchObservation {
29
+ workspaceId: string;
30
+ repoId: string;
31
+ refId: string;
32
+ freshness: IndexFreshnessV1;
33
+ /** Bound to exactly the repository/ref that was inspected. */
34
+ refresh(): Promise<void>;
35
+ }
36
+
37
+ export interface IndexWatchDependencies {
38
+ inspect(ctx: CommandContext, options: IndexWatchOptions): Promise<IndexWatchObservation>;
39
+ wait(intervalMs: number, signal: AbortSignal): Promise<void>;
40
+ }
41
+
42
+ const DEFAULT_DEPENDENCIES: IndexWatchDependencies = {
43
+ inspect: inspectIndexWatch,
44
+ wait: async (intervalMs, signal) => {
45
+ await wait(intervalMs, undefined, { signal });
46
+ },
47
+ };
48
+
49
+ /** One serialized loop: re-read configuration and hash sources, then refresh if necessary. */
50
+ export async function runIndexWatch(
51
+ ctx: CommandContext,
52
+ options: IndexWatchOptions,
53
+ deps: IndexWatchDependencies = DEFAULT_DEPENDENCIES,
54
+ ): Promise<number> {
55
+ const sink = createStreamSink({ stdout: (chunk) => ctx.io.out(chunk), outPath: options.outPath });
56
+ let refreshes = 0;
57
+ const emit = (
58
+ event: "checked" | "refresh_started" | "refreshed" | "failed" | "stopped",
59
+ observation?: IndexWatchObservation,
60
+ message?: string,
61
+ ): void => {
62
+ const record = {
63
+ schemaVersion: 1,
64
+ kind: "index_watch",
65
+ event,
66
+ checkedAt: observation?.freshness.checkedAt ?? systemClock.nowIso(),
67
+ refreshes,
68
+ ...(observation === undefined
69
+ ? {}
70
+ : {
71
+ workspaceId: observation.workspaceId,
72
+ repoId: observation.repoId,
73
+ refId: observation.refId,
74
+ indexFreshness: observation.freshness,
75
+ }),
76
+ ...(message === undefined ? {} : { message }),
77
+ };
78
+ sink.write(
79
+ options.format === "json"
80
+ ? JSON.stringify(record)
81
+ : `Search index: ${event}${observation === undefined ? "" : ` ${observation.repoId}/${observation.refId}: ${observation.freshness.status}`}${message === undefined ? "" : ` — ${message}`}`,
82
+ );
83
+ };
84
+ let observation: IndexWatchObservation | undefined;
85
+ try {
86
+ while (true) {
87
+ ctx.signal.throwIfAborted();
88
+ observation = await deps.inspect(ctx, options);
89
+ ctx.signal.throwIfAborted();
90
+ emit("checked", observation);
91
+ if (observation.freshness.status !== "fresh") {
92
+ emit("refresh_started", observation);
93
+ await observation.refresh();
94
+ ctx.signal.throwIfAborted();
95
+ refreshes++;
96
+ observation = await deps.inspect(ctx, options);
97
+ ctx.signal.throwIfAborted();
98
+ emit("refreshed", observation);
99
+ if (
100
+ observation.freshness.status === "unknown" ||
101
+ observation.freshness.status === "incompatible"
102
+ ) {
103
+ throw new EnvironmentError(
104
+ "Could not confirm a compatible search index after the update.",
105
+ "Check `untangle doctor` and the index report on stderr.",
106
+ );
107
+ }
108
+ }
109
+ if (options.once || (options.maxRefreshes !== null && refreshes >= options.maxRefreshes)) {
110
+ if (observation.freshness.status !== "fresh") {
111
+ throw new EnvironmentError(
112
+ "Sources changed again during indexing; the search index is still stale.",
113
+ "Keep watch --index running without --baseline-only/--exit-after, or repeat the update.",
114
+ );
115
+ }
116
+ emit("stopped", observation, "The requested number of checks/updates has been reached.");
117
+ return EXIT.ok;
118
+ }
119
+ await deps.wait(options.intervalMs, ctx.signal);
120
+ }
121
+ } catch (error) {
122
+ if (ctx.signal.aborted || (error instanceof Error && error.name === "AbortError")) {
123
+ emit("stopped", observation, "Cancelled; any running indexing job was stopped cleanly.");
124
+ return EXIT.cancelled;
125
+ }
126
+ emit("failed", observation, error instanceof Error ? error.message : String(error));
127
+ throw error;
128
+ } finally {
129
+ await sink.close();
130
+ }
131
+ }
132
+
133
+ /** Uses the same registry, scanner freshness check and refresh composition as query --refresh. */
134
+ export async function inspectIndexWatch(
135
+ ctx: CommandContext,
136
+ options: IndexWatchOptions,
137
+ ): Promise<IndexWatchObservation> {
138
+ const view = loadWorkspace({ cwd: options.root, env: ctx.env, strict: true });
139
+ if (options.repo !== undefined && (view.config.repositories ?? []).length === 0) {
140
+ throw new UsageError(
141
+ "--repo requires a configured repository.",
142
+ "Select the project tree with --root.",
143
+ );
144
+ }
145
+ const target = resolveTarget({
146
+ config: view.config,
147
+ cwd: options.root,
148
+ rootFlag: options.root,
149
+ repoFlag: options.repo,
150
+ refFlag: options.ref,
151
+ configBaseDir: view.load.sources.configBaseDir,
152
+ });
153
+ if (detectRefName(target.rootPath) !== target.refName) {
154
+ throw new UsageError(
155
+ `Ref ${target.refName} is not checked out in ${target.rootPath}.`,
156
+ "Switch to the matching worktree before watching the search index.",
157
+ );
158
+ }
159
+ const resolution = await resolveIndexState([target.rootPath], view.workspaceId, {
160
+ repoIds: [target.repoId],
161
+ refs: [target.refId],
162
+ ...storageIndexScope(wireStorage(view, ctx.env)),
163
+ });
164
+ ctx.signal.throwIfAborted();
165
+ if (resolution.kind === "invalid") {
166
+ throw new EnvironmentError(
167
+ `The local index state is invalid: ${resolution.diagnostics.map((entry) => `${entry.path}: ${entry.message}`).join("; ")}`,
168
+ "Rerun the affected indexing job before starting watch --index.",
169
+ );
170
+ }
171
+ if (resolution.kind === "ambiguous" && options.embedder === "auto") {
172
+ throw new UsageError(
173
+ "Current index profiles conflict.",
174
+ "Select --embedder=offline or repair the index registry.",
175
+ );
176
+ }
177
+ const current =
178
+ resolution.kind === "resolved"
179
+ ? resolution.current
180
+ : resolution.kind === "ambiguous"
181
+ ? resolution.found
182
+ : [];
183
+ const states =
184
+ options.embedder === "offline"
185
+ ? current.filter((entry) => entry.state.embedder === "offline")
186
+ : current;
187
+ const embedder =
188
+ options.embedder === "offline" ||
189
+ (resolution.kind === "resolved" && resolution.embedder === "offline")
190
+ ? "offline"
191
+ : "auto";
192
+ const freshness = await inspectIndexFreshness(view, states, { signal: ctx.signal });
193
+ return {
194
+ workspaceId: view.workspaceId,
195
+ repoId: target.repoId,
196
+ refId: target.refId,
197
+ freshness,
198
+ refresh: () =>
199
+ refreshWorkspaceIndex(ctx, {
200
+ view,
201
+ ...(target.synthesized ? {} : { repoIds: [target.repoId] }),
202
+ refIds: [target.refName],
203
+ embedder,
204
+ }),
205
+ };
206
+ }