@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
package/NOTICE ADDED
@@ -0,0 +1,90 @@
1
+ # NOTICE
2
+
3
+ Copyright (C) 2026 Luke Bölling and contributors.
4
+
5
+ This attribution covers original Untangle work. Contributors retain copyright in
6
+ their contributions. Third-party packages, grammars and other materials retain
7
+ their own copyright holders, licenses and notices; this line does not replace them.
8
+
9
+ ## License — binding decision
10
+
11
+ Untangle is licensed under the **GNU Affero General Public License, Version 3
12
+ (AGPL-3.0-only)**. See [`LICENSE`](./LICENSE).
13
+
14
+ This decision is **final, not provisional**, and was explicitly instructed by
15
+ the project owner. No contributor, agent or tool may change it without a new
16
+ explicit instruction.
17
+
18
+ The repository-wide license covers Untangle's first-party source code, scripts,
19
+ tests, fixtures, configuration, documentation, website and brand artwork, including
20
+ the logo and 3D yarn illustrations. Every workspace `package.json` declares
21
+ `"license": "AGPL-3.0-only"`. There is no separately licensed enterprise component
22
+ or separate permissive license for documentation or brand assets.
23
+
24
+ Third-party code, embedded grammars, dependency assets and their notices retain
25
+ their original licenses. Their inclusion does not relicense those works. The
26
+ repository license does not grant trademark rights or change the license of a
27
+ repository analyzed with Untangle. See the repository's `docs/LICENSING.md` for
28
+ scope and verification details.
29
+
30
+ This resolves the license question left open in `vision.md` §14 and completes
31
+ `product.md` §16, item 2.
32
+
33
+ ## Rationale
34
+
35
+ - **Network copyleft fits the intended product model.** AGPL §13 sets source
36
+ availability requirements for modified versions used through a computer network.
37
+ The current local CLI/stdio-MCP entry and future shared-server modes share the
38
+ same license.
39
+ - **Local-first analysis has a clear boundary.** Running Untangle against a codebase
40
+ does not replace that codebase's own license with Untangle's license.
41
+ - **First-party components share one license.** Implemented components and future
42
+ official plugins use this repository's licensing policy. Planned integrations do
43
+ not establish implemented or published products.
44
+
45
+ ## Deliberately accepted consequence
46
+
47
+ The project deliberately chooses AGPL rather than a permissive embedding license.
48
+ Redistribution, modifications and combined works must be assessed against the
49
+ actual terms in `LICENSE`, including applicable Corresponding Source requirements.
50
+ No permissive exception, commercial dual license or special contract-only package
51
+ license is granted or promised by this notice.
52
+
53
+ ## Dependencies
54
+
55
+ Third-party runtime dependencies are checked against the allowlist in
56
+ `scripts/check-licenses.mjs`. Their licenses and copyright notices remain unchanged
57
+ and traceable through package `THIRD_PARTY_LICENSES.md` files, grammar provenance,
58
+ the lockfile and release SBOM. The allowlist includes MIT / Apache-2.0 / BSD / ISC
59
+ and other explicitly listed licenses; it is not a license grant for dependencies.
60
+
61
+ The allowlist in `scripts/check-licenses.mjs` applies to **dependencies**, not
62
+ workspace packages. Untangle's own packages carry AGPL-3.0-only and are excluded
63
+ from that check.
64
+
65
+ ## Clean room
66
+
67
+ Untangle is an independent implementation with its own data models, APIs, tool
68
+ names, tests and sources. Feature ideas may be derived from publicly observable
69
+ behavior and generally known techniques. Third-party source code is not copied,
70
+ including from AGPL projects even where the license would permit it.
71
+
72
+ ## Contribution terms
73
+
74
+ Pull requests are welcome under the repository's existing AGPL-3.0-only license.
75
+ No separate CLA, copyright assignment or DCO sign-off is required. Contributors
76
+ must have the right to submit their work under those terms. See CONTRIBUTING.md.
77
+
78
+ ## Release decisions
79
+
80
+ - [x] Copyright attribution: Luke Bölling, with contributors retaining their rights.
81
+ - [x] Contributions use AGPL-3.0-only without an additional CLA or DCO gate.
82
+
83
+ ## Open legal items before public beta
84
+
85
+ - [ ] Trademark search for the product name `Untangle`.
86
+ - [ ] Registration and legal review of the npm scope `@untangle-code`.
87
+ - [ ] Verify source availability and notices for each released network daemon/server
88
+ mode (WP-59). The current stdio MCP `untangle_about` already reports the license,
89
+ source repository and build commit when supplied; metadata alone does not prove
90
+ that a concrete deployed version's source is available.
package/README.md CHANGED
@@ -1,3 +1,452 @@
1
- # Temporary Holding Version
1
+ # @untangle-code/cli
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Untangle's CLI and MCP entry point: the **`untangle`** binary. It connects local search,
4
+ code complexity and declared feature responsibility. Requires Node.js **`^22.13.0 || >=24.0.0`**.
5
+
6
+ The [agent workflow](https://github.com/lboel/untangle/blob/main/docs/AGENT_WORKFLOW.md)
7
+ connects MCP, search, complete feature scopes and real tests, with a copyable task brief for
8
+ spec-driven development and agentic engineering.
9
+
10
+ ## Install in an npm project
11
+
12
+ From the directory containing your project's `package.json`, add Untangle as a pinned
13
+ development dependency and run a first analysis.
14
+
15
+ ```bash
16
+ npm install --save-dev --save-exact @untangle-code/cli@0.1.1
17
+ npm exec -- untangle --version
18
+ npm exec -- untangle complexity --top=10
19
+ ```
20
+
21
+ Direct complexity analysis runs on the current project without an index or search services.
22
+ Commit the manifest and lockfile changes to share the version with your team.
23
+
24
+ Preview the project setup, then create `untangle.toml` when you're ready.
25
+
26
+ ```bash
27
+ npm exec -- untangle init --offline --dry-run
28
+ npm exec -- untangle init --offline
29
+ ```
30
+
31
+ Offline init inspects local files and skips network probes. Dry-run previews the
32
+ configuration. The second command creates it in a new project and reports any differences
33
+ with an existing configuration.
34
+
35
+ ## Try it in any repository
36
+
37
+ Run a one-off analysis from a project directory, including repositories without a `package.json`.
38
+
39
+ ```bash
40
+ npm exec --yes --package=@untangle-code/cli@0.1.1 -- untangle complexity --top=10
41
+ ```
42
+
43
+ `npm exec` fetches the package into the npm cache if needed. To preview setup the same way,
44
+ replace `complexity --top=10` with `init --offline --dry-run`.
45
+
46
+ ## Install once for multiple projects
47
+
48
+ Install the npm preview globally if you prefer to run `untangle` directly from each project.
49
+
50
+ ```bash
51
+ npm install --global @untangle-code/cli@next
52
+ untangle --version
53
+ cd /path/to/your/project
54
+ untangle complexity --top=10
55
+ ```
56
+
57
+ For a project installation, prefix the `untangle` examples below with `npm exec --`.
58
+
59
+ ## Build from a source checkout
60
+
61
+ From the checkout root with **pnpm 10.34.5**:
62
+
63
+ ```bash
64
+ pnpm setup:local --project=/absolute/path/to/your/project
65
+ ```
66
+
67
+ This explicit helper checks pnpm, installs frozen dependencies, builds the checkout and
68
+ measures the target directly. The first report needs no index, Qdrant, Ollama, LLM or feature
69
+ map. Without `--project` it analyzes Untangle. Unanalyzed sources/reasons remain visible.
70
+ It writes no target configuration, feature declarations or ignore rules; registers no host,
71
+ changes no shell profile and starts no tests, global install or services. It prints follow-up
72
+ commands and an MCP template using actual absolute Node/CLI/project paths.
73
+
74
+ ```bash
75
+ pnpm setup:local --project=/absolute/path/to/project --dry-run
76
+ pnpm setup:local --project=/absolute/path/to/project --skip-build --format=json
77
+ ```
78
+
79
+ Dry-run executes nothing. Skip-build uses existing Dist files without proving they match
80
+ edited sources. JSON includes plan, executed steps, analysis, next commands and MCP template.
81
+ The helper targets Linux/macOS and belongs to the checkout, not the installed CLI package.
82
+ For later calls in the same shell:
83
+
84
+ ```bash
85
+ UNTANGLE_CLI="$PWD/apps/cli/dist/index.js"
86
+ untangle() { node "$UNTANGLE_CLI" "$@"; }
87
+ cd /path/to/your/project
88
+ untangle --help
89
+ ```
90
+
91
+ An agent host uses the MCP template rather than this shell function. Standalone `changes`
92
+ and `gate` commands are not implemented; `complexity --max-*` thresholds are available.
93
+
94
+ ## Workflow
95
+
96
+ ```bash
97
+ untangle complexity # Direct AST analysis, no services/index
98
+ untangle init --offline --dry-run # Inspect local context without writing
99
+ untangle product # Declared features, ownership and code/test metrics
100
+ untangle scan # Own metrics and explicitly enabled extensions
101
+ untangle init --interactive # Guided configuration and optional tool setup
102
+ untangle product connect auto --dry-run --format=json
103
+ untangle graph features # Local interactive 3D feature/code map
104
+ untangle doctor # Inspect config, parsers, services and index
105
+ untangle index # Index/graphs; selected storage and embedder
106
+ untangle query "..." # Hybrid, lexical, symbol, semantic or grep-like
107
+ untangle graph visualize --out=graph.html
108
+ untangle mcp --stdio # Local server for agent hosts
109
+ ```
110
+
111
+ New projects store their index in LanceDB under `.untangle/index/lancedb`, without a database
112
+ service. `init --storage=qdrant` selects Qdrant; existing Qdrant configurations keep that backend.
113
+ Lexical/symbol retrieval needs a compatible index but no query embedding.
114
+ `index --embedder=offline` builds one without Ollama; its deterministic vectors have no
115
+ language-model semantics. Semantic retrieval needs its configured embedding provider.
116
+ Noninteractive init starts no services/models. Explicit scan can run enabled analyzers;
117
+ container provisioning requires separate consent.
118
+
119
+ Guided init previews its file/command plan and separates preparation from execution. Offers
120
+ include embedded LanceDB (default), local Qdrant/Ollama, local/existing SonarQube, a hash-verified Sentrux binary/MCP
121
+ template and custom SARIF/JUnit/JSON extensions. Tokens use environment-variable names, not
122
+ project-stored values. Existing files and foreign containers are preserved. Tool installation
123
+ is not scan evidence.
124
+
125
+ The map stores HTML/JSON under `<project>/.untangle/feature-map/`. Its 3D positions, perspective,
126
+ rotation, zoom, filters, neighbor selection and accessible list inspect declared relationships.
127
+ Complete feature metrics and gaps stay visible independently of rendering caps. Missing
128
+ features are not invented. Spatial distance is not semantic proof. Controls are English;
129
+ inspected names/source content are preserved. JSON, pipes and dry-run never open a TUI;
130
+ `init --no-interactive --offline --format=json` remains scriptable.
131
+
132
+ ## Product context in init
133
+
134
+ Init inspects candidates for vision, specification and product descriptions from the accepted
135
+ scan. Filename roles are provisional; ambiguity remains open. Select other paths explicitly:
136
+
137
+ ```bash
138
+ untangle init /path/to/project --vision=docs/vision.md --spec=docs/requirements.md --offline --dry-run --format=json
139
+ ```
140
+
141
+ Paths are project-relative. Offline suppresses network probes; document inspection needs no
142
+ provider/LLM/embeddings. `findings.productContext` contains paths, content hashes, sections,
143
+ selection reasons and local references, with `needs_context`, `needs_selection`,
144
+ `ready_for_review` or `incomplete`. Vision/specification are required; product description is
145
+ optional. Ignore/security/read limits still apply and missing/unassessed sources are explicit.
146
+
147
+ After 256 references, `referencesTruncated: true` marks incomplete inspection. Parse limits
148
+ are 16,384 UTF-16 units per line, 4,096 `[` openings and 2,048 heading candidates per document.
149
+ Exceeded budgets retain the hash but mark `not_assessed`/`incomplete`.
150
+
151
+ Even `ready_for_review` leaves `alignment.status: unverified` and empty feature/ownership
152
+ review drafts. A `present` reference proves only its accepted path/hash, not anchors, behavior
153
+ or ownership. Selected readable documents become markdown `[[contextArtifacts]]` in the TOML
154
+ proposal. Ordinary Markdown search works after indexing; independent artifact search remains
155
+ unimplemented in CLI/MCP.
156
+
157
+ Configuration-only init writes no documents/Journey data; dry-run writes nothing. Differing
158
+ configuration needs `--force` or explicit guided replacement. `--feature-map=docs/features.json`
159
+ selects an existing declared map; otherwise init looks for `untangle.features.json`. That
160
+ inspection neither writes nor confirms declarations and leaves document-context assessment
161
+ independent. It adds no MCP init tool.
162
+
163
+ ## Concrete SDD connectors
164
+
165
+ ```bash
166
+ untangle product connect auto --dry-run --format=json
167
+ untangle product connect spec-kit --format=json
168
+ untangle product connect openspec --format=json
169
+ ```
170
+
171
+ Spec Kit/OpenSpec adapters read supported local specs, plans, tasks and change artifacts.
172
+ They record actual requirement/task identities, checked state and explicit file-reference
173
+ provenance/hashes without running framework scripts. An explicit connection saves versioned
174
+ `.untangle/sdd/` report/manifest files after source revalidation; dry-run writes nothing.
175
+ Drafts stay `planned`/`proposed`, without invented owners, dependencies or passing-test claims.
176
+ Inspect and complete the returned manifest, then pass its real path to `product --manifest`
177
+ and `graph features --feature-map`. Existing declarations are never silently merged/replaced.
178
+ The spec-driven TUI offers detected workspaces when no explicit feature manifest is selected,
179
+ and writes only after final confirmation.
180
+ [Supported artifact layouts and limits](https://github.com/lboel/untangle/blob/main/docs/SDD_CONNECTORS.md).
181
+
182
+ ## Declared feature alignment
183
+
184
+ ```bash
185
+ untangle product --root=/path/to/project --format=json
186
+ untangle product --path=src/accounts/lookup.ts
187
+ untangle product --draft --feature=accounts.lookup --path=src/accounts/lookup.ts --format=json
188
+ untangle product --path=src/accounts/lookup.ts --run-tests -- pnpm exec vitest run src/accounts/lookup.test.ts
189
+ untangle product --test-evidence=.untangle/product-tests.json --max-cognitive=15 --require-complete --format=json
190
+ ```
191
+
192
+ The default map is `untangle.features.json`; `--manifest` selects another in-root path.
193
+ The index-free report connects declared IDs to exact vision/spec headings, owners and full
194
+ code/test scopes. Code/tests stay separate, shared sources count once in the overall union,
195
+ and missing/partial sources remain gaps.
196
+
197
+ `--path` accepts a literal search hit. `selection.matches` reports every feature association
198
+ as code/test/intent/ownership while retaining complete measurements, including helpers.
199
+ MCP exposes `untangle_product({path: "src/accounts/lookup.ts"})`.
200
+
201
+ With a missing map, `--draft --feature=ID --path=PATH` supplies an unreviewed **`report.draft`**,
202
+ not an entire-report manifest. Review/extend all code, tests, intent and owners before saving;
203
+ the command writes nothing and invents no owner.
204
+
205
+ Default analysis executes no tests. `--test-evidence` reads a real report bound to the entire
206
+ accepted inventory before/after execution; `testNames` can identify exact criteria cases.
207
+ Only explicit `--run-tests -- <argv>` executes a Vitest-compatible command without a shell
208
+ inside the target. The runner must exist; Untangle installs none. Reporter/output arguments
209
+ are supplied by Untangle and caller overrides rejected; other test frameworks are unsupported.
210
+
211
+ `testRun.receiptPath` records inventories, actual argv/exit, original reports and hashes in an
212
+ exclusive OS-temporary directory; archive it for durable evidence. Timeout defaults to 120s,
213
+ with `--test-timeout` at most one hour. stdout/stderr share 16 MiB; JSON has another 16 MiB.
214
+ Timeout/abort stop the child tree. Changed sources are `stale`, failures `bound_failed`, skips
215
+ satisfy no criterion. Failing tests exit 5; runner errors exit 1. Binding authenticates neither
216
+ external toolchain nor runner. `--run-tests` and `--test-evidence` are mutually exclusive;
217
+ MCP remains read-only.
218
+
219
+ Default `--max-cognitive=15` is per execution unit. Normal report exit 0 can include open
220
+ review; `--require-complete` exits 5 except for `evidence_consistent`. Missing maps yield
221
+ `needs_manifest`. Consistent declarations prove neither semantic behavior nor owner identity.
222
+ The [feature contract](https://github.com/lboel/untangle/blob/main/docs/FEATURE_ALIGNMENT.md)
223
+ details source binding, scopes and budgets. Untangle's own map has proposed reviews/declared
224
+ roles, not human approval or an objective feature-richness score.
225
+
226
+ ## Command status
227
+
228
+ | Command | Status and scope |
229
+ |---|---|
230
+ | `init` | Implemented: commented configuration, context inventory, optional guided setup. |
231
+ | `query` | Implemented: hybrid/lexical/symbol/semantic/pattern retrieval; scoped profile auto-selection. |
232
+ | `complexity` | Implemented: direct measurements without services/index, threshold exit 5. |
233
+ | `product` | Implemented: declared alignment, separate metrics, source-bound evidence and optional gate. |
234
+ | `product connect` | Implemented: native local Spec Kit/OpenSpec imports into proposed manifests. |
235
+ | `scan` | Implemented: own analysis, enabled extensions and explained failures; explicit container consent. |
236
+ | `doctor` | Implemented: read-only checks, exactly one next step per failed check. |
237
+ | `watch` | Implemented: complexity deltas; optional serialized index refresh. |
238
+ | `extensions` | Implemented: analyzer manifest/import/activation/execution. |
239
+ | `index` | Implemented: complete core pipeline, incremental/dry-run/offline modes. |
240
+ | `graph` | Implemented: file/symbol context, frontend/FastAPI boundaries, offline explorers/3D feature map. |
241
+ | `flow` | Implemented: symbol paths, impact, entry points and confidence. |
242
+ | `mcp` | Implemented: stdio runtime; specified unbuilt capabilities explicitly unavailable. |
243
+
244
+ Command specifications/`--help` are executable truth. Registered but unbuilt MCP tools return
245
+ `FEATURE_UNAVAILABLE`. For a project installation, configure the MCP host with the absolute
246
+ paths to your Node executable, installed CLI and project root.
247
+
248
+ ```json
249
+ {
250
+ "mcpServers": {
251
+ "untangle": {
252
+ "command": "/absolute/path/to/node",
253
+ "args": [
254
+ "/path/to/your/project/node_modules/@untangle-code/cli/dist/index.js",
255
+ "mcp",
256
+ "--stdio",
257
+ "--root=/path/to/your/project"
258
+ ]
259
+ }
260
+ }
261
+ }
262
+ ```
263
+
264
+ ## Exit codes and streams
265
+
266
+ | Code | Meaning |
267
+ |---|---|
268
+ | 0 | Success/report produced; inspect report status. |
269
+ | 1 | Operational error: unreadable file, invalid configuration, adapter/runner failure. |
270
+ | 2 | Invalid arguments, command or option. |
271
+ | 3 | Capability unimplemented, not a user error. |
272
+ | 4 | Environment/index unavailable, unconfirmed required freshness or incomplete retrieval. |
273
+ | 5 | Analysis/evidence threshold or explicit tests failed. |
274
+ | 130 | Cancelled by SIGINT/SIGTERM. |
275
+
276
+ Unavailable capability, environment and quality-gate failures stay distinct without parsing
277
+ stderr. MCP tool errors remain structured on a live connection rather than terminating its
278
+ server. Scan can exit 0 with individual extension failures in its report.
279
+
280
+ **Payload to stdout, human diagnostics to stderr.** JSON also contains structured warnings,
281
+ freshness and skipped data. JSONL begins with a header; hits are under `hit`:
282
+
283
+ ```bash
284
+ untangle query "retry" --format=jsonl | jq -r 'select(.kind == "hit") | .hit.filePath'
285
+ ```
286
+
287
+ Inspect the search exit code too; `set -o pipefail` prevents jq from hiding it.
288
+
289
+ ## Query
290
+
291
+ ```bash
292
+ untangle query "where is a payment triggered" # hybrid
293
+ untangle query "charge" --mode=symbol --explain
294
+ untangle query "user id" --mode=lexical --require-fresh
295
+ untangle query "renew a token" --mode=semantic
296
+ untangle query "charge" --context --linked
297
+ untangle query --regex "await\s+fetch\(" -C 2 --path='src/**' --exclude='**/*.test.ts'
298
+ ```
299
+
300
+ `--explain` exposes raw score values, weights and contributions, helping investigate both
301
+ high and missing rankings. Auto embedding selection reads bounded `.untangle/index-states-v1/`
302
+ records scoped to workspace/repository/ref/profile and generation-bound current pointers.
303
+ Multiple refs/profiles/logical repositories on one physical root remain separate. Incompatible
304
+ selected spaces require explicit `service`/`offline` rather than silently searching a subset.
305
+ The old `.untangle/index-state.json` is read-only migration fallback.
306
+
307
+ Every query checks content hashes and reports freshness/time/reasons per repository.
308
+ `--require-fresh` requires confirmed currency; `--refresh` updates stale checked-out refs first,
309
+ with stderr progress. `watch --index` repeats serially at its reconciliation interval.
310
+ Historical unchecked-out refs remain `unknown`; refresh cannot assign them the current tree.
311
+ MCP exposes the same freshness and read-only `requireFresh`.
312
+
313
+ Lexical uses sparse/BM25, symbol uses symbols, semantic uses dense retrieval. The first two
314
+ need no query embedding but do need a compatible index. Offline indexing needs no Ollama and
315
+ claims no model semantics. Hybrid fuses independent paths, with a ten-second per-branch budget
316
+ preventing a hung service from hiding ready hits. Partial failures preserve hits/warnings on
317
+ stdout and exit 4. Versioned identifier tokenization requires legacy migration/reindex;
318
+ refresh handles this. Stale/incomplete contexts are not complete Journey measurements.
319
+
320
+ Strict abstention is default: insufficient evidence clears hits. `--abstention=evidence`
321
+ retains candidates/verdict for inspection without overriding warnings/freshness/exit status.
322
+ MCP partial errors retain data under `error.details.data`.
323
+
324
+ ## Observe search effort through MCP
325
+
326
+ An explicitly started Search Journey connects a caller-declared feature ID to actual
327
+ attempts and a confirmed target. Effort remains separate from complexity; it proves neither
328
+ semantic correctness nor causes of findability and produces no combined score.
329
+
330
+ ```jsonc
331
+ // Send to untangle_search_session; retain session.sessionId.
332
+ {
333
+ "action": "start",
334
+ "goal": "Find profile card rendering and its tests",
335
+ "featureId": "profile.cards.presentation",
336
+ "executionContext": {
337
+ "agentModel": "model-with-exact-version",
338
+ "harness": "my-harness-v2",
339
+ "searchStrategy": "hybrid-then-symbol-and-graph-v1",
340
+ "taskClass": "find-feature-code-and-tests",
341
+ "taskMix": "fixed-eight-task-suite-v1",
342
+ "priorContext": "fresh-session-no-open-files"
343
+ }
344
+ }
345
+ // Send to untangle_search.
346
+ { "query": "profile card component", "session": { "id": "<session-id>", "step": 1 } }
347
+ // Confirm the actual target through untangle_search_session.
348
+ { "action": "complete", "sessionId": "<session-id>", "target": { "filePath": "src/profile/ProfileCard.tsx" } }
349
+ { "action": "report" }
350
+ ```
351
+
352
+ Optional `executionContext` is entirely caller-declared. When present it requires model,
353
+ harness, strategy and task class; task mix/prior context are optional. Values are trimmed
354
+ identifiers of at most 256 UTF-16 units. No hidden environment inference occurs. Different
355
+ contexts create separate cohorts; absent conditions remain `not-recorded`/`uncontrolledDimensions`.
356
+ Even complete declarations do not independently prove controlled conditions.
357
+
358
+ Actions are `start`, `get`, `observe`, `complete`, `abandon`, `report`. Observe records explicit
359
+ `open-file`, `open-symbol`, `graph-query`, `other-tool` steps. Completion needs at least one
360
+ search attempt and an explicit file/chunk/symbol target. `acceptedAttemptId` can bind a specific
361
+ attempt. Steps are positive integers ≤128; numbered/unnumbered attempts cannot mix. Identical
362
+ repeated steps are idempotent; differing data conflicts. Limits: 128 attempts and 512 navigation
363
+ events per Journey.
364
+
365
+ Successful recording returns `searchObservation.status: recorded` and `attemptId`. Optional
366
+ recording failure preserves search with `not_recorded`/`SEARCH_SESSION_RECORDING_FAILED`.
367
+ Stale/failed/incomplete retrieval is not full evidence. Cohorts separate ranker, ranking
368
+ context, hit/candidate limits, profile, generation and immutable corpus revision. Legacy
369
+ incomplete revisions remain readable/insufficient; fewer than three compatible completions
370
+ set `sufficientEvidence: false`, without independently confirming caller conditions.
371
+
372
+ `cohorts`/feature search mappings retain completed-task views. `outcomeCohorts` adds active,
373
+ completed and abandoned sessions with effort/reasons. `terminalCompletionRate` uses completed
374
+ plus abandoned as denominator and is null without terminals. Active sessions stay separate;
375
+ easy successes do not hide abandoned effort. Feature mappings require explicit IDs/unambiguous
376
+ target evidence and do not average incompatible metric versions.
377
+
378
+ Recording is local/opt-in. Default `retainText: false` uses separate workspace HMAC domains
379
+ for goals, feature IDs, queries and context. Candidate paths, ranks/scores and declared tool
380
+ metadata/reason codes remain; source/chunk content and free error/abort text are not retained.
381
+ `retainText: true` additionally retains those texts. The separate key is
382
+ `.untangle/product-complexity/fingerprint.key`. This is neither encryption nor anonymity;
383
+ access to full local state permits testing guessed values.
384
+ [Context, denominators and privacy](https://github.com/lboel/untangle/blob/main/docs/SEARCH-JOURNEY-CONTEXT.md)
385
+ do not imply automatic time trends, ROI or productivity measurement.
386
+
387
+ ## Decisions
388
+
389
+ - The custom closed argument parser rejects unknown options instead of silently treating
390
+ typos as positional inputs. Help is generated from the option specification.
391
+ - Doctor has a per-check deadline (`--timeout`, default 15s). Adapter retry/backoff suited
392
+ to indexing must not leave diagnosis hanging. Deadline is a failed check; outer abort is
393
+ whole-command exit 130/MCP `CANCELLED`.
394
+ - A failed retrieval target is a failure, not empty success. Provider-unavailable data stays
395
+ visible in warnings/ledger and query exits 4.
396
+ - Query has its own default 60s deadline, allowing model warm-up without indefinite hanging.
397
+ - Main explicitly exits after flushing streams; it does not wait for lingering adapter work
398
+ once the final outcome is known.
399
+ - MCP is another interface to the same analysis, not a second implementation. The public
400
+ CLI export owns runtime; private MCP app only re-exports it. Canonical roots, JSON-RPC-only
401
+ stdout, validated inputs/envelopes/data, disjoint success/failure, explicit availability,
402
+ hard graph/flow/impact/visualization budgets and in-flight cancellation have contract tests.
403
+
404
+ ## Known limits
405
+
406
+ - Each search requires compatible embedding spaces; explicit profiles search their own
407
+ collection. Profile changes need a matching index.
408
+ - Query searches the index, not disk; absent indexes exit 4 rather than claim no hits.
409
+ - Complexity measures only available deep adapters; other sources remain explained skips.
410
+ - Graph context is generation-bound. Context/linked data uses direct/exact resolved edges
411
+ from the same generation without changing rank/count. New payloads include `generation_id`
412
+ and `metrics_version`; missing legacy values remain `unknown`, requiring one deliberate
413
+ `index --no-incremental --no-resume`, without attaching an unrelated current graph.
414
+ - Damaged syntax trees contribute no complexity numbers because unreliable scopes/hotspots
415
+ are worse than explicitly incomplete coverage.
416
+ - Retrieval depends on parsers, chunks, model and ranking. Missing hits do not prove absent
417
+ implementation. Real acceptance covers targeted identifier/language/freshness/migration/
418
+ outage cases, not complete recall.
419
+ - Ownership and feature richness are not automatically proven. Declared IDs and confirmed
420
+ target observations remain caller evidence. The general capability/reduce-complexity loop
421
+ is unimplemented; embedding similarity is not behavior equivalence.
422
+
423
+ ## Combined analysis report
424
+
425
+ ```bash
426
+ untangle scan --root=/path/to/project --format=json
427
+ untangle scan --feature=accounts.lookup --format=json
428
+ ```
429
+
430
+ Scan runs own analysis and enabled extensions, separating own metrics, external evidence and
431
+ explained omissions. Without `--yes`, no container provisioning occurs; with it, resources are
432
+ shown on stderr first and license gates remain. Exit 0 means report produced, even if some
433
+ extensions failed. JSON retains run status, provenance, findings and diagnostics.
434
+
435
+ `--feature` adds `featureAlignment`, not a smaller repository/analyzer scan. Explicit
436
+ `--manifest`/`--test-evidence` require a feature and execute no tests. Sentrux/Sonar/other tools
437
+ use reviewed definitions in the user profile. Repository metrics stay `repository_context`;
438
+ file/symbol findings attach only through real paths. Values are neither summed with own metrics
439
+ nor apportioned into features. Sonar retrieval proves no analysis of the current commit.
440
+ [Provider boundaries](https://github.com/lboel/untangle/blob/main/docs/ANALYZER-FEATURE-WORKFLOW.md).
441
+
442
+ Complexity/scan totals use `totalsReading: execution_unit`: inclusive outer functions plus
443
+ self contributions outside them, without re-adding nested functions. `executionUnits` counts
444
+ all functions; `executionUnitRoots` counts outer ones. Legacy double-counted totals require a
445
+ new measured baseline.
446
+
447
+ ## License
448
+
449
+ **AGPL-3.0-only.** The tarball includes [`LICENSE`](./LICENSE), [`NOTICE`](./NOTICE),
450
+ [`THIRD_PARTY_LICENSES.md`](./THIRD_PARTY_LICENSES.md) and corresponding TypeScript under `src/`.
451
+ A README is not a substitute for the full license copy. Repository:
452
+ <https://github.com/lboel/untangle>.