@intentius/chant 0.124.45 → 0.124.48

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 (772) hide show
  1. package/dist/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  2. package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  3. package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  4. package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  5. package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  6. package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  7. package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
  8. package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
  9. package/dist/__golden__/wave-loop/op-denied.json +16 -0
  10. package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  11. package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  12. package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
  13. package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
  14. package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
  15. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  16. package/dist/__golden__/wave-loop/op-held-on.json +16 -0
  17. package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  18. package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  19. package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  20. package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  21. package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
  22. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  23. package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
  24. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  25. package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
  26. package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
  27. package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  28. package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  29. package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
  30. package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  31. package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  32. package/dist/__golden__/wave-loop/op-overridden.json +16 -0
  33. package/dist/__golden__/wave-loop/op-per-run.json +20 -0
  34. package/dist/__golden__/wave-loop/op-point.json +13 -0
  35. package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
  36. package/dist/__golden__/wave-loop/op-sealed.json +10 -0
  37. package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
  38. package/dist/__golden__/wave-loop/op-spend.json +10 -0
  39. package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
  40. package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
  41. package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
  42. package/dist/__golden__/wave-loop/op-wide.json +39 -0
  43. package/dist/action-pins.d.ts +61 -0
  44. package/dist/action-pins.d.ts.map +1 -0
  45. package/dist/action-pins.js +77 -0
  46. package/dist/capabilities/aws.paths +148 -0
  47. package/dist/capabilities/base-mappings.json +122 -0
  48. package/dist/capabilities/catalog.d.ts +89 -0
  49. package/dist/capabilities/catalog.d.ts.map +1 -0
  50. package/dist/capabilities/catalog.js +204 -0
  51. package/dist/capabilities/language.d.ts +103 -0
  52. package/dist/capabilities/language.d.ts.map +1 -0
  53. package/dist/capabilities/language.js +335 -0
  54. package/dist/capabilities/matcher.d.ts +65 -0
  55. package/dist/capabilities/matcher.d.ts.map +1 -0
  56. package/dist/capabilities/matcher.js +299 -0
  57. package/dist/capabilities/view.d.ts +207 -0
  58. package/dist/capabilities/view.d.ts.map +1 -0
  59. package/dist/capabilities/view.js +484 -0
  60. package/dist/cli/commands/carve.d.ts +3 -0
  61. package/dist/cli/commands/carve.d.ts.map +1 -1
  62. package/dist/cli/commands/carve.js +36 -7
  63. package/dist/cli/commands/import-report.d.ts +26 -0
  64. package/dist/cli/commands/import-report.d.ts.map +1 -0
  65. package/dist/cli/commands/import-report.js +65 -0
  66. package/dist/cli/commands/import.d.ts +11 -1
  67. package/dist/cli/commands/import.d.ts.map +1 -1
  68. package/dist/cli/commands/import.js +22 -3
  69. package/dist/cli/commands/lint.d.ts.map +1 -1
  70. package/dist/cli/commands/lint.js +1 -0
  71. package/dist/cli/commands/migrate.d.ts +13 -1
  72. package/dist/cli/commands/migrate.d.ts.map +1 -1
  73. package/dist/cli/commands/migrate.js +134 -10
  74. package/dist/cli/handlers/approve.d.ts.map +1 -1
  75. package/dist/cli/handlers/approve.js +21 -2
  76. package/dist/cli/handlers/build.d.ts.map +1 -1
  77. package/dist/cli/handlers/build.js +6 -1
  78. package/dist/cli/handlers/declared-graph.d.ts +44 -0
  79. package/dist/cli/handlers/declared-graph.d.ts.map +1 -0
  80. package/dist/cli/handlers/declared-graph.js +87 -0
  81. package/dist/cli/handlers/graph.d.ts +25 -0
  82. package/dist/cli/handlers/graph.d.ts.map +1 -1
  83. package/dist/cli/handlers/graph.js +93 -87
  84. package/dist/cli/handlers/ledger.d.ts +3 -0
  85. package/dist/cli/handlers/ledger.d.ts.map +1 -0
  86. package/dist/cli/handlers/ledger.js +55 -0
  87. package/dist/cli/handlers/migrate.d.ts.map +1 -1
  88. package/dist/cli/handlers/migrate.js +18 -11
  89. package/dist/cli/handlers/misc.d.ts.map +1 -1
  90. package/dist/cli/handlers/misc.js +12 -1
  91. package/dist/cli/handlers/pr-env.d.ts.map +1 -1
  92. package/dist/cli/handlers/pr-env.js +4 -3
  93. package/dist/cli/handlers/pr.d.ts +15 -1
  94. package/dist/cli/handlers/pr.d.ts.map +1 -1
  95. package/dist/cli/handlers/pr.js +143 -39
  96. package/dist/cli/handlers/query.d.ts +7 -2
  97. package/dist/cli/handlers/query.d.ts.map +1 -1
  98. package/dist/cli/handlers/query.js +16 -4
  99. package/dist/cli/handlers/release.d.ts.map +1 -1
  100. package/dist/cli/handlers/release.js +6 -3
  101. package/dist/cli/handlers/search-count.d.ts +89 -0
  102. package/dist/cli/handlers/search-count.d.ts.map +1 -0
  103. package/dist/cli/handlers/search-count.js +132 -0
  104. package/dist/cli/handlers/search.d.ts +356 -6
  105. package/dist/cli/handlers/search.d.ts.map +1 -1
  106. package/dist/cli/handlers/search.js +1039 -155
  107. package/dist/cli/main.d.ts.map +1 -1
  108. package/dist/cli/main.js +88 -17
  109. package/dist/cli/mcp/server.d.ts.map +1 -1
  110. package/dist/cli/mcp/server.js +3 -0
  111. package/dist/cli/mcp/tools/capabilities.d.ts +7 -0
  112. package/dist/cli/mcp/tools/capabilities.d.ts.map +1 -0
  113. package/dist/cli/mcp/tools/capabilities.js +27 -0
  114. package/dist/cli/mcp/workspace-tools.d.ts +3 -1
  115. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  116. package/dist/cli/mcp/workspace-tools.js +47 -2
  117. package/dist/cli/parse-args.d.ts.map +1 -1
  118. package/dist/cli/parse-args.js +100 -19
  119. package/dist/cli/registry.d.ts +36 -4
  120. package/dist/cli/registry.d.ts.map +1 -1
  121. package/dist/components/builders.d.ts +5 -1
  122. package/dist/components/builders.d.ts.map +1 -1
  123. package/dist/components/builders.js +5 -0
  124. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  125. package/dist/components/capability-plugin-loader.js +16 -1
  126. package/dist/components/capability-plugin.d.ts +14 -0
  127. package/dist/components/capability-plugin.d.ts.map +1 -1
  128. package/dist/components/pr-env-ports.d.ts +29 -0
  129. package/dist/components/pr-env-ports.d.ts.map +1 -0
  130. package/dist/components/pr-env-ports.js +77 -0
  131. package/dist/components/pr-env-run.d.ts +5 -21
  132. package/dist/components/pr-env-run.d.ts.map +1 -1
  133. package/dist/components/pr-env-run.js +6 -70
  134. package/dist/components/pr-environment.d.ts +2 -1
  135. package/dist/components/pr-environment.d.ts.map +1 -1
  136. package/dist/components/pr-environment.js +1 -1
  137. package/dist/components/pr-hooks.d.ts +21 -1
  138. package/dist/components/pr-hooks.d.ts.map +1 -1
  139. package/dist/components/pr-hooks.js +72 -4
  140. package/dist/components/pr-pipeline.d.ts +45 -10
  141. package/dist/components/pr-pipeline.d.ts.map +1 -1
  142. package/dist/components/pr-pipeline.js +47 -14
  143. package/dist/components/pr-policy.d.ts +36 -0
  144. package/dist/components/pr-policy.d.ts.map +1 -1
  145. package/dist/components/pr-policy.js +36 -0
  146. package/dist/components/starter-plugin.d.ts +1 -0
  147. package/dist/components/starter-plugin.d.ts.map +1 -1
  148. package/dist/components/starter-plugin.js +5 -1
  149. package/dist/components/verbs/index.d.ts +2 -0
  150. package/dist/components/verbs/index.d.ts.map +1 -1
  151. package/dist/components/verbs/index.js +2 -0
  152. package/dist/components/verbs/publish-artifact.d.ts +65 -0
  153. package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
  154. package/dist/components/verbs/publish-artifact.js +74 -0
  155. package/dist/components/verbs/publish-image.d.ts +129 -0
  156. package/dist/components/verbs/publish-image.d.ts.map +1 -0
  157. package/dist/components/verbs/publish-image.js +145 -0
  158. package/dist/config-environments.d.ts +112 -0
  159. package/dist/config-environments.d.ts.map +1 -0
  160. package/dist/config-environments.js +114 -0
  161. package/dist/config.d.ts +32 -84
  162. package/dist/config.d.ts.map +1 -1
  163. package/dist/config.js +13 -96
  164. package/dist/gate-decision.d.ts +11 -2
  165. package/dist/gate-decision.d.ts.map +1 -1
  166. package/dist/gate-decision.js +15 -3
  167. package/dist/graph-detail.d.ts.map +1 -1
  168. package/dist/graph-detail.js +15 -3
  169. package/dist/graph-effective.d.ts +33 -2
  170. package/dist/graph-effective.d.ts.map +1 -1
  171. package/dist/graph-effective.js +215 -68
  172. package/dist/graph-ir.d.ts +48 -0
  173. package/dist/graph-ir.d.ts.map +1 -1
  174. package/dist/graph-ir.js +130 -0
  175. package/dist/graph-sub-template.d.ts +11 -0
  176. package/dist/graph-sub-template.d.ts.map +1 -0
  177. package/dist/graph-sub-template.js +19 -0
  178. package/dist/graph-walk.d.ts +66 -0
  179. package/dist/graph-walk.d.ts.map +1 -0
  180. package/dist/graph-walk.js +70 -0
  181. package/dist/import/parser.d.ts +19 -0
  182. package/dist/import/parser.d.ts.map +1 -1
  183. package/dist/lexicon.d.ts +80 -6
  184. package/dist/lexicon.d.ts.map +1 -1
  185. package/dist/lifecycle/gate-ledger.d.ts +11 -0
  186. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  187. package/dist/lifecycle/git.d.ts +2 -5
  188. package/dist/lifecycle/git.d.ts.map +1 -1
  189. package/dist/lifecycle/ledger-read.d.ts +65 -0
  190. package/dist/lifecycle/ledger-read.d.ts.map +1 -0
  191. package/dist/lifecycle/ledger-read.js +160 -0
  192. package/dist/lifecycle/observe.d.ts +28 -0
  193. package/dist/lifecycle/observe.d.ts.map +1 -1
  194. package/dist/lifecycle/observe.js +23 -1
  195. package/dist/lifecycle/release-workstation.d.ts +7 -0
  196. package/dist/lifecycle/release-workstation.d.ts.map +1 -1
  197. package/dist/lifecycle/release-workstation.js +25 -0
  198. package/dist/lifecycle/run-ledger.d.ts +4 -3
  199. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  200. package/dist/lifecycle/run-ledger.js +1 -0
  201. package/dist/lint/discover.js +3 -1
  202. package/dist/lint/post-synth.d.ts +127 -1
  203. package/dist/lint/post-synth.d.ts.map +1 -1
  204. package/dist/lint/post-synth.js +84 -2
  205. package/dist/lint/rule.d.ts +6 -0
  206. package/dist/lint/rule.d.ts.map +1 -1
  207. package/dist/lint/rules/op/index.d.ts +1 -0
  208. package/dist/lint/rules/op/index.d.ts.map +1 -1
  209. package/dist/lint/rules/op/index.js +2 -0
  210. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
  211. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
  212. package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
  213. package/dist/live-endpoint.d.ts +1 -1
  214. package/dist/live-endpoint.d.ts.map +1 -1
  215. package/dist/live-endpoint.js +1 -1
  216. package/dist/observation.d.ts +48 -1
  217. package/dist/observation.d.ts.map +1 -1
  218. package/dist/observation.js +21 -5
  219. package/dist/op/activities/activity-contracts.d.ts +9 -6
  220. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  221. package/dist/op/activities/activity-contracts.js +5 -2
  222. package/dist/op/activities/index.d.ts +2 -2
  223. package/dist/op/activities/index.d.ts.map +1 -1
  224. package/dist/op/activities/index.js +1 -1
  225. package/dist/op/activities/review-agent.d.ts +90 -4
  226. package/dist/op/activities/review-agent.d.ts.map +1 -1
  227. package/dist/op/activities/review-agent.js +217 -19
  228. package/dist/op/activities/work-evidence.d.ts +8 -1
  229. package/dist/op/activities/work-evidence.d.ts.map +1 -1
  230. package/dist/op/activities/work-evidence.js +1 -0
  231. package/dist/op/builders.d.ts +9 -5
  232. package/dist/op/builders.d.ts.map +1 -1
  233. package/dist/op/builders.js +9 -5
  234. package/dist/op/composites/apply-op.d.ts +29 -2
  235. package/dist/op/composites/apply-op.d.ts.map +1 -1
  236. package/dist/op/composites/apply-op.js +20 -1
  237. package/dist/op/gate-approval.d.ts +11 -5
  238. package/dist/op/gate-approval.d.ts.map +1 -1
  239. package/dist/op/gate-approval.js +11 -6
  240. package/dist/op/gate-quorum.d.ts +100 -3
  241. package/dist/op/gate-quorum.d.ts.map +1 -1
  242. package/dist/op/gate-quorum.js +108 -6
  243. package/dist/op/gate-review.d.ts +9 -0
  244. package/dist/op/gate-review.d.ts.map +1 -1
  245. package/dist/op/gate-review.js +13 -0
  246. package/dist/op/gate.d.ts +44 -3
  247. package/dist/op/gate.d.ts.map +1 -1
  248. package/dist/op/gate.js +25 -4
  249. package/dist/op/index.d.ts +3 -3
  250. package/dist/op/index.d.ts.map +1 -1
  251. package/dist/op/index.js +1 -1
  252. package/dist/op/local-executor.d.ts +38 -3
  253. package/dist/op/local-executor.d.ts.map +1 -1
  254. package/dist/op/local-executor.js +48 -6
  255. package/dist/op/op-waves-run.d.ts +26 -1
  256. package/dist/op/op-waves-run.d.ts.map +1 -1
  257. package/dist/op/op-waves-run.js +259 -13
  258. package/dist/op/op-waves.d.ts +72 -5
  259. package/dist/op/op-waves.d.ts.map +1 -1
  260. package/dist/op/op-waves.js +110 -15
  261. package/dist/op/runtime.d.ts +11 -0
  262. package/dist/op/runtime.d.ts.map +1 -1
  263. package/dist/op/schedule-overdue.d.ts +16 -0
  264. package/dist/op/schedule-overdue.d.ts.map +1 -1
  265. package/dist/op/schedule-overdue.js +36 -0
  266. package/dist/op/stage-hooks.d.ts +9 -2
  267. package/dist/op/stage-hooks.d.ts.map +1 -1
  268. package/dist/op/stage-hooks.js +7 -5
  269. package/dist/op/workspace-run-env.d.ts +22 -0
  270. package/dist/op/workspace-run-env.d.ts.map +1 -0
  271. package/dist/op/workspace-run-env.js +21 -0
  272. package/dist/pr-forge.d.ts +24 -0
  273. package/dist/pr-forge.d.ts.map +1 -1
  274. package/dist/pr-forge.js +47 -0
  275. package/dist/pr-post.d.ts +42 -0
  276. package/dist/pr-post.d.ts.map +1 -1
  277. package/dist/pr-post.js +67 -1
  278. package/dist/read-filter.d.ts +65 -0
  279. package/dist/read-filter.d.ts.map +1 -0
  280. package/dist/read-filter.js +179 -0
  281. package/dist/run-event.d.ts +1 -1
  282. package/dist/run-event.d.ts.map +1 -1
  283. package/dist/terraform/carve.d.ts +24 -3
  284. package/dist/terraform/carve.d.ts.map +1 -1
  285. package/dist/terraform/carve.js +32 -14
  286. package/dist/terraform/cuts.d.ts +97 -0
  287. package/dist/terraform/cuts.d.ts.map +1 -0
  288. package/dist/terraform/cuts.js +138 -0
  289. package/dist/terraform/folds.d.ts +26 -0
  290. package/dist/terraform/folds.d.ts.map +1 -0
  291. package/dist/terraform/folds.js +38 -0
  292. package/dist/terraform/graph.d.ts.map +1 -1
  293. package/dist/terraform/graph.js +10 -0
  294. package/dist/terraform/reach.d.ts +140 -0
  295. package/dist/terraform/reach.d.ts.map +1 -0
  296. package/dist/terraform/reach.js +170 -0
  297. package/dist/terraform/score.d.ts +14 -0
  298. package/dist/terraform/score.d.ts.map +1 -1
  299. package/dist/terraform/score.js +14 -31
  300. package/dist/terraform/state.d.ts.map +1 -1
  301. package/dist/terraform/state.js +4 -2
  302. package/dist/terraform/types.d.ts +8 -0
  303. package/dist/terraform/types.d.ts.map +1 -1
  304. package/dist/wave-blocked.d.ts +10 -1
  305. package/dist/wave-blocked.d.ts.map +1 -1
  306. package/dist/wave-blocked.js +31 -3
  307. package/dist/wave-runtime.mjs +266 -256
  308. package/dist/workspace/capabilities-contract.d.ts +66 -0
  309. package/dist/workspace/capabilities-contract.d.ts.map +1 -0
  310. package/dist/workspace/capabilities-contract.js +107 -0
  311. package/dist/workspace/capabilities.schema.json +229 -0
  312. package/dist/workspace/check.schema.json +11 -2
  313. package/dist/workspace/checks/ci-branch.d.ts +44 -0
  314. package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
  315. package/dist/workspace/checks/ci-branch.js +133 -0
  316. package/dist/workspace/checks/links.d.ts +3 -0
  317. package/dist/workspace/checks/links.d.ts.map +1 -1
  318. package/dist/workspace/checks/links.js +12 -1
  319. package/dist/workspace/checks/org.d.ts +48 -0
  320. package/dist/workspace/checks/org.d.ts.map +1 -0
  321. package/dist/workspace/checks/org.js +156 -0
  322. package/dist/workspace/checks.d.ts +11 -1
  323. package/dist/workspace/checks.d.ts.map +1 -1
  324. package/dist/workspace/checks.js +59 -7
  325. package/dist/workspace/ci-branches.d.ts +16 -0
  326. package/dist/workspace/ci-branches.d.ts.map +1 -1
  327. package/dist/workspace/ci-branches.js +27 -0
  328. package/dist/workspace/ci-green-cli.js +7 -7
  329. package/dist/workspace/ci-green-workflow.d.ts +1 -1
  330. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  331. package/dist/workspace/ci-green-workflow.js +13 -8
  332. package/dist/workspace/ci-green.d.ts +14 -0
  333. package/dist/workspace/ci-green.d.ts.map +1 -1
  334. package/dist/workspace/ci-green.js +44 -11
  335. package/dist/workspace/ci-run.d.ts +9 -1
  336. package/dist/workspace/ci-run.d.ts.map +1 -1
  337. package/dist/workspace/ci-run.js +67 -6
  338. package/dist/workspace/ci-serve.d.ts +9 -0
  339. package/dist/workspace/ci-serve.d.ts.map +1 -1
  340. package/dist/workspace/ci-serve.js +114 -76
  341. package/dist/workspace/compose-graph.d.ts +23 -0
  342. package/dist/workspace/compose-graph.d.ts.map +1 -1
  343. package/dist/workspace/compose-graph.js +3 -1
  344. package/dist/workspace/composites.d.ts +4 -1
  345. package/dist/workspace/composites.d.ts.map +1 -1
  346. package/dist/workspace/composites.js +5 -2
  347. package/dist/workspace/composites.schema.json +22 -0
  348. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  349. package/dist/workspace/conformance/index.d.ts +1 -1
  350. package/dist/workspace/conformance/index.d.ts.map +1 -1
  351. package/dist/workspace/conformance/index.js +39 -2
  352. package/dist/workspace/cross-root-lint.d.ts +56 -0
  353. package/dist/workspace/cross-root-lint.d.ts.map +1 -0
  354. package/dist/workspace/cross-root-lint.js +111 -0
  355. package/dist/workspace/dbt-models-reader.d.ts +44 -0
  356. package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
  357. package/dist/workspace/dbt-models-reader.js +356 -0
  358. package/dist/workspace/dbt-project-common.d.ts +40 -0
  359. package/dist/workspace/dbt-project-common.d.ts.map +1 -0
  360. package/dist/workspace/dbt-project-common.js +106 -0
  361. package/dist/workspace/dbt-project-reader.d.ts +4 -3
  362. package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
  363. package/dist/workspace/dbt-project-reader.js +14 -108
  364. package/dist/workspace/decision-rank.d.ts +26 -0
  365. package/dist/workspace/decision-rank.d.ts.map +1 -0
  366. package/dist/workspace/decision-rank.js +16 -0
  367. package/dist/workspace/declaration.d.ts +43 -2
  368. package/dist/workspace/declaration.d.ts.map +1 -1
  369. package/dist/workspace/declaration.js +45 -11
  370. package/dist/workspace/declaration.schema.json +133 -24
  371. package/dist/workspace/environments.d.ts +26 -2
  372. package/dist/workspace/environments.d.ts.map +1 -1
  373. package/dist/workspace/environments.js +26 -2
  374. package/dist/workspace/flyway-dir.d.ts +39 -0
  375. package/dist/workspace/flyway-dir.d.ts.map +1 -0
  376. package/dist/workspace/flyway-dir.js +104 -0
  377. package/dist/workspace/flyway-layout.d.ts +96 -0
  378. package/dist/workspace/flyway-layout.d.ts.map +1 -0
  379. package/dist/workspace/flyway-layout.js +308 -0
  380. package/dist/workspace/graph-cache.d.ts +8 -0
  381. package/dist/workspace/graph-cache.d.ts.map +1 -1
  382. package/dist/workspace/graph-cache.js +27 -3
  383. package/dist/workspace/graph-cli.d.ts +39 -2
  384. package/dist/workspace/graph-cli.d.ts.map +1 -1
  385. package/dist/workspace/graph-cli.js +92 -32
  386. package/dist/workspace/graph.schema.json +182 -0
  387. package/dist/workspace/intent.d.ts +2 -3
  388. package/dist/workspace/intent.d.ts.map +1 -1
  389. package/dist/workspace/intent.js +5 -9
  390. package/dist/workspace/kind-link-readers.d.ts +59 -2
  391. package/dist/workspace/kind-link-readers.d.ts.map +1 -1
  392. package/dist/workspace/kind-link-readers.js +17 -1
  393. package/dist/workspace/kind-readers.d.ts +3 -0
  394. package/dist/workspace/kind-readers.d.ts.map +1 -1
  395. package/dist/workspace/kind-readers.js +7 -1
  396. package/dist/workspace/kinds.d.ts +66 -2
  397. package/dist/workspace/kinds.d.ts.map +1 -1
  398. package/dist/workspace/kinds.js +98 -4
  399. package/dist/workspace/ledger.schema.json +158 -0
  400. package/dist/workspace/lexicon-outputs.d.ts +20 -1
  401. package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
  402. package/dist/workspace/lexicon-outputs.js +102 -10
  403. package/dist/workspace/lineage-check.d.ts +3 -0
  404. package/dist/workspace/lineage-check.d.ts.map +1 -1
  405. package/dist/workspace/lineage-check.js +23 -4
  406. package/dist/workspace/links.d.ts +8 -1
  407. package/dist/workspace/links.d.ts.map +1 -1
  408. package/dist/workspace/links.js +25 -1
  409. package/dist/workspace/ls.d.ts +8 -0
  410. package/dist/workspace/ls.d.ts.map +1 -1
  411. package/dist/workspace/ls.js +7 -1
  412. package/dist/workspace/ls.schema.json +7 -0
  413. package/dist/workspace/member-commands.d.ts +10 -1
  414. package/dist/workspace/member-commands.d.ts.map +1 -1
  415. package/dist/workspace/member-commands.js +71 -6
  416. package/dist/workspace/migrate-links.d.ts +45 -0
  417. package/dist/workspace/migrate-links.d.ts.map +1 -0
  418. package/dist/workspace/migrate-links.js +100 -0
  419. package/dist/workspace/migration-dirs.d.ts +74 -0
  420. package/dist/workspace/migration-dirs.d.ts.map +1 -0
  421. package/dist/workspace/migration-dirs.js +254 -0
  422. package/dist/workspace/nested-graph.d.ts +2 -0
  423. package/dist/workspace/nested-graph.d.ts.map +1 -1
  424. package/dist/workspace/nested-graph.js +32 -1
  425. package/dist/workspace/reason-codes.d.ts +18 -0
  426. package/dist/workspace/reason-codes.d.ts.map +1 -1
  427. package/dist/workspace/reason-codes.js +23 -0
  428. package/dist/workspace/records-cli.d.ts +11 -0
  429. package/dist/workspace/records-cli.d.ts.map +1 -1
  430. package/dist/workspace/records-cli.js +57 -5
  431. package/dist/workspace/records.schema.json +5 -0
  432. package/dist/workspace/release-candidates.d.ts +2 -0
  433. package/dist/workspace/release-candidates.d.ts.map +1 -1
  434. package/dist/workspace/release-candidates.js +5 -2
  435. package/dist/workspace/release-train.d.ts +53 -0
  436. package/dist/workspace/release-train.d.ts.map +1 -0
  437. package/dist/workspace/release-train.js +134 -0
  438. package/dist/workspace/release-workflow.d.ts.map +1 -1
  439. package/dist/workspace/release-workflow.js +4 -3
  440. package/dist/workspace/repo-ref.d.ts +45 -0
  441. package/dist/workspace/repo-ref.d.ts.map +1 -0
  442. package/dist/workspace/repo-ref.js +114 -0
  443. package/dist/workspace/run-event.schema.json +2 -2
  444. package/dist/workspace/runs-cli.d.ts +9 -0
  445. package/dist/workspace/runs-cli.d.ts.map +1 -1
  446. package/dist/workspace/runs-cli.js +48 -3
  447. package/dist/workspace/runs.schema.json +7 -0
  448. package/dist/workspace/search-cli.d.ts +204 -0
  449. package/dist/workspace/search-cli.d.ts.map +1 -0
  450. package/dist/workspace/search-cli.js +466 -0
  451. package/dist/workspace/search-contract.d.ts +56 -0
  452. package/dist/workspace/search-contract.d.ts.map +1 -0
  453. package/dist/workspace/search-contract.js +70 -0
  454. package/dist/workspace/search.schema.json +822 -0
  455. package/dist/workspace/status-decisions.d.ts +37 -0
  456. package/dist/workspace/status-decisions.d.ts.map +1 -0
  457. package/dist/workspace/status-decisions.js +147 -0
  458. package/dist/workspace/status-gates.d.ts +9 -0
  459. package/dist/workspace/status-gates.d.ts.map +1 -1
  460. package/dist/workspace/status.d.ts +4 -0
  461. package/dist/workspace/status.d.ts.map +1 -1
  462. package/dist/workspace/status.js +14 -2
  463. package/dist/workspace/status.schema.json +6 -0
  464. package/dist/workspace/work-cli.d.ts.map +1 -1
  465. package/dist/workspace/work-cli.js +5 -3
  466. package/dist/workspace/work-evidence-ops.d.ts +83 -0
  467. package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
  468. package/dist/workspace/work-evidence-ops.js +169 -0
  469. package/dist/workspace/work-evidence.d.ts +12 -2
  470. package/dist/workspace/work-evidence.d.ts.map +1 -1
  471. package/dist/workspace/work-evidence.js +21 -3
  472. package/dist/workspace/work-evidence.schema.json +49 -2
  473. package/dist/workspace/workspace-gates.d.ts +110 -0
  474. package/dist/workspace/workspace-gates.d.ts.map +1 -0
  475. package/dist/workspace/workspace-gates.js +140 -0
  476. package/dist/workspace/workspace-kinds.schema.json +58 -3
  477. package/dist/workspace/workspace-ledger.d.ts +76 -0
  478. package/dist/workspace/workspace-ledger.d.ts.map +1 -0
  479. package/dist/workspace/workspace-ledger.js +91 -0
  480. package/dist/workspace/workspace-run.d.ts +112 -0
  481. package/dist/workspace/workspace-run.d.ts.map +1 -0
  482. package/dist/workspace/workspace-run.js +432 -0
  483. package/package.json +1 -1
  484. package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  485. package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  486. package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  487. package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  488. package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  489. package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  490. package/src/__golden__/wave-loop/op-cost-member.json +13 -0
  491. package/src/__golden__/wave-loop/op-denied-source.json +16 -0
  492. package/src/__golden__/wave-loop/op-denied.json +16 -0
  493. package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  494. package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  495. package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
  496. package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
  497. package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
  498. package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  499. package/src/__golden__/wave-loop/op-held-on.json +16 -0
  500. package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  501. package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  502. package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  503. package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  504. package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
  505. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  506. package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
  507. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  508. package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
  509. package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
  510. package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  511. package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  512. package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
  513. package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  514. package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  515. package/src/__golden__/wave-loop/op-overridden.json +16 -0
  516. package/src/__golden__/wave-loop/op-per-run.json +20 -0
  517. package/src/__golden__/wave-loop/op-point.json +13 -0
  518. package/src/__golden__/wave-loop/op-pr-review.json +10 -0
  519. package/src/__golden__/wave-loop/op-sealed.json +10 -0
  520. package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
  521. package/src/__golden__/wave-loop/op-spend.json +10 -0
  522. package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
  523. package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
  524. package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
  525. package/src/__golden__/wave-loop/op-wide.json +39 -0
  526. package/src/__snapshots__/okf.test.ts.snap +10 -0
  527. package/src/action-pins.test.ts +78 -0
  528. package/src/action-pins.ts +92 -0
  529. package/src/capabilities/aws.paths +148 -0
  530. package/src/capabilities/base-mappings.json +122 -0
  531. package/src/capabilities/catalog.ts +230 -0
  532. package/src/capabilities/language.test.ts +191 -0
  533. package/src/capabilities/language.ts +373 -0
  534. package/src/capabilities/matcher.ts +315 -0
  535. package/src/capabilities/view-compose.test.ts +76 -0
  536. package/src/capabilities/view.ts +631 -0
  537. package/src/cli/commands/carve-score-once.test.ts +99 -0
  538. package/src/cli/commands/carve.ts +37 -6
  539. package/src/cli/commands/check-lexicon.test.ts +2 -2
  540. package/src/cli/commands/import-report.ts +71 -0
  541. package/src/cli/commands/import.ts +33 -3
  542. package/src/cli/commands/lint.ts +1 -0
  543. package/src/cli/commands/migrate-dialect.test.ts +145 -0
  544. package/src/cli/commands/migrate.ts +132 -11
  545. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
  546. package/src/cli/handlers/approve.ts +23 -2
  547. package/src/cli/handlers/build.ts +7 -1
  548. package/src/cli/handlers/declared-graph.ts +99 -0
  549. package/src/cli/handlers/graph.test.ts +94 -3
  550. package/src/cli/handlers/graph.ts +123 -96
  551. package/src/cli/handlers/ledger.ts +54 -0
  552. package/src/cli/handlers/migrate.ts +21 -12
  553. package/src/cli/handlers/misc.ts +10 -1
  554. package/src/cli/handlers/pr-env.ts +3 -4
  555. package/src/cli/handlers/pr.ts +138 -36
  556. package/src/cli/handlers/query.ts +16 -4
  557. package/src/cli/handlers/release.ts +6 -3
  558. package/src/cli/handlers/search-build-roots.test.ts +144 -0
  559. package/src/cli/handlers/search-count.test.ts +191 -0
  560. package/src/cli/handlers/search-count.ts +165 -0
  561. package/src/cli/handlers/search-json.test.ts +333 -0
  562. package/src/cli/handlers/search-live.test.ts +387 -0
  563. package/src/cli/handlers/search-paths.test.ts +235 -0
  564. package/src/cli/handlers/search.ts +1291 -166
  565. package/src/cli/main.test.ts +43 -3
  566. package/src/cli/main.ts +88 -17
  567. package/src/cli/mcp/server.test.ts +3 -3
  568. package/src/cli/mcp/server.ts +3 -0
  569. package/src/cli/mcp/tools/capabilities.ts +32 -0
  570. package/src/cli/mcp/workspace-tools.e2e.test.ts +21 -1
  571. package/src/cli/mcp/workspace-tools.ts +47 -2
  572. package/src/cli/parse-args.ts +79 -15
  573. package/src/cli/registry.ts +36 -4
  574. package/src/components/builders.ts +8 -0
  575. package/src/components/capability-plugin-loader.ts +13 -1
  576. package/src/components/capability-plugin.ts +16 -0
  577. package/src/components/pr-env-ports.ts +89 -0
  578. package/src/components/pr-env-run-bundle.test.ts +54 -0
  579. package/src/components/pr-env-run.ts +5 -76
  580. package/src/components/pr-environment.ts +2 -1
  581. package/src/components/pr-hooks.test.ts +73 -5
  582. package/src/components/pr-hooks.ts +95 -5
  583. package/src/components/pr-pipeline.ts +64 -16
  584. package/src/components/pr-policy.test.ts +64 -1
  585. package/src/components/pr-policy.ts +53 -0
  586. package/src/components/registry.test.ts +1 -1
  587. package/src/components/starter-plugin.ts +6 -0
  588. package/src/components/verbs/index.ts +2 -0
  589. package/src/components/verbs/publish-artifact.test.ts +60 -0
  590. package/src/components/verbs/publish-artifact.ts +122 -0
  591. package/src/components/verbs/publish-image.test.ts +101 -0
  592. package/src/components/verbs/publish-image.ts +265 -0
  593. package/src/config-environments.ts +160 -0
  594. package/src/config.ts +44 -124
  595. package/src/gate-decision-bundle.test.ts +1 -0
  596. package/src/gate-decision-identity.test.ts +9 -0
  597. package/src/gate-decision.ts +26 -3
  598. package/src/graph-detail.ts +15 -3
  599. package/src/graph-effective.ts +226 -75
  600. package/src/graph-ir.test.ts +163 -0
  601. package/src/graph-ir.ts +174 -0
  602. package/src/graph-sub-template.ts +22 -0
  603. package/src/graph-walk.test.ts +44 -0
  604. package/src/graph-walk.ts +102 -0
  605. package/src/import/parser.ts +20 -0
  606. package/src/lexicon.ts +84 -6
  607. package/src/lifecycle/gate-ledger.ts +8 -0
  608. package/src/lifecycle/git.ts +2 -2
  609. package/src/lifecycle/ledger-read.test.ts +107 -0
  610. package/src/lifecycle/ledger-read.ts +195 -0
  611. package/src/lifecycle/observe.test.ts +27 -1
  612. package/src/lifecycle/observe.ts +43 -1
  613. package/src/lifecycle/release-workstation.ts +24 -0
  614. package/src/lifecycle/run-ledger.ts +5 -2
  615. package/src/lint/cross-root.test.ts +122 -0
  616. package/src/lint/discover.ts +3 -1
  617. package/src/lint/post-synth.ts +212 -2
  618. package/src/lint/rule.ts +6 -0
  619. package/src/lint/rules/op/index.ts +2 -0
  620. package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
  621. package/src/live-endpoint.ts +1 -1
  622. package/src/observation.test.ts +25 -0
  623. package/src/observation.ts +69 -5
  624. package/src/op/activities/activity-contracts.ts +5 -2
  625. package/src/op/activities/index.ts +2 -2
  626. package/src/op/activities/review-agent.test.ts +221 -4
  627. package/src/op/activities/review-agent.ts +265 -22
  628. package/src/op/activities/work-evidence.ts +9 -1
  629. package/src/op/builders.ts +9 -5
  630. package/src/op/composites/apply-op.test.ts +108 -0
  631. package/src/op/composites/apply-op.ts +37 -2
  632. package/src/op/gate-approval.test.ts +6 -1
  633. package/src/op/gate-approval.ts +12 -6
  634. package/src/op/gate-quorum-at-base.test.ts +211 -0
  635. package/src/op/gate-quorum.ts +156 -8
  636. package/src/op/gate-review.ts +14 -0
  637. package/src/op/gate.ts +67 -8
  638. package/src/op/index.ts +3 -2
  639. package/src/op/local-executor.ts +69 -9
  640. package/src/op/op-waves-depends-on.test.ts +81 -0
  641. package/src/op/op-waves-hook-targets.test.ts +4 -2
  642. package/src/op/op-waves-quorum-product.test.ts +158 -0
  643. package/src/op/op-waves-run.ts +288 -14
  644. package/src/op/op-waves.ts +143 -14
  645. package/src/op/runtime.ts +8 -0
  646. package/src/op/schedule-overdue.ts +33 -0
  647. package/src/op/stage-hooks.ts +13 -5
  648. package/src/op/workspace-run-env.ts +29 -0
  649. package/src/pr-forge-bundle.test.ts +2 -2
  650. package/src/pr-forge.test.ts +47 -0
  651. package/src/pr-forge.ts +68 -0
  652. package/src/pr-post-open.e2e.test.ts +36 -0
  653. package/src/pr-post.test.ts +102 -3
  654. package/src/pr-post.ts +89 -1
  655. package/src/read-filter.test.ts +54 -0
  656. package/src/read-filter.ts +193 -0
  657. package/src/run-event.ts +1 -1
  658. package/src/stage-hooks-bundle.test.ts +1 -0
  659. package/src/terraform/carve.ts +52 -15
  660. package/src/terraform/cuts.test.ts +173 -0
  661. package/src/terraform/cuts.ts +188 -0
  662. package/src/terraform/folds.ts +44 -0
  663. package/src/terraform/graph.ts +9 -0
  664. package/src/terraform/radius.test.ts +90 -0
  665. package/src/terraform/reach.test.ts +146 -0
  666. package/src/terraform/reach.ts +247 -0
  667. package/src/terraform/score.ts +27 -29
  668. package/src/terraform/state.ts +3 -1
  669. package/src/terraform/types.ts +8 -0
  670. package/src/wave-blocked.ts +28 -3
  671. package/src/wave-loop-golden.test.ts +4 -3
  672. package/src/workspace/behold-kinds.test.ts +1 -1
  673. package/src/workspace/capabilities-contract.test.ts +88 -0
  674. package/src/workspace/capabilities-contract.ts +132 -0
  675. package/src/workspace/capabilities.schema.json +229 -0
  676. package/src/workspace/check-contract.test.ts +7 -6
  677. package/src/workspace/check.schema.json +11 -2
  678. package/src/workspace/checks/ci-branch.test.ts +128 -0
  679. package/src/workspace/checks/ci-branch.ts +141 -0
  680. package/src/workspace/checks/links.ts +12 -1
  681. package/src/workspace/checks/org.ts +169 -0
  682. package/src/workspace/checks.ts +64 -7
  683. package/src/workspace/ci-branches.ts +31 -0
  684. package/src/workspace/ci-green-branches.test.ts +153 -0
  685. package/src/workspace/ci-green-cli.ts +7 -7
  686. package/src/workspace/ci-green-workflow.test.ts +4 -3
  687. package/src/workspace/ci-green-workflow.ts +13 -9
  688. package/src/workspace/ci-green.ts +49 -12
  689. package/src/workspace/ci-run.test.ts +72 -1
  690. package/src/workspace/ci-run.ts +68 -8
  691. package/src/workspace/ci-serve.test.ts +95 -0
  692. package/src/workspace/ci-serve.ts +106 -65
  693. package/src/workspace/component-environments.test.ts +25 -2
  694. package/src/workspace/compose-graph.ts +19 -3
  695. package/src/workspace/composites.schema.json +22 -0
  696. package/src/workspace/composites.test.ts +39 -8
  697. package/src/workspace/composites.ts +6 -2
  698. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  699. package/src/workspace/conformance/conformance.e2e.test.ts +14 -1
  700. package/src/workspace/conformance/index.ts +31 -2
  701. package/src/workspace/cross-root-lint.test.ts +90 -0
  702. package/src/workspace/cross-root-lint.ts +126 -0
  703. package/src/workspace/dbt-kind.test.ts +3 -2
  704. package/src/workspace/dbt-models-reader.ts +362 -0
  705. package/src/workspace/dbt-models.test.ts +248 -0
  706. package/src/workspace/dbt-project-common.ts +113 -0
  707. package/src/workspace/dbt-project-reader.ts +29 -112
  708. package/src/workspace/decision-rank.ts +40 -0
  709. package/src/workspace/declaration.schema.json +133 -24
  710. package/src/workspace/declaration.ts +84 -15
  711. package/src/workspace/environments.ts +40 -4
  712. package/src/workspace/flyway-dir.ts +113 -0
  713. package/src/workspace/flyway-layout.ts +337 -0
  714. package/src/workspace/graph-cache.ts +27 -3
  715. package/src/workspace/graph-cli.ts +119 -32
  716. package/src/workspace/graph-contract.test.ts +4 -2
  717. package/src/workspace/graph.schema.json +182 -0
  718. package/src/workspace/identity.test.ts +14 -2
  719. package/src/workspace/intent.ts +6 -14
  720. package/src/workspace/kind-link-readers.ts +68 -3
  721. package/src/workspace/kind-readers.e2e.test.ts +28 -0
  722. package/src/workspace/kind-readers.test.ts +1 -1
  723. package/src/workspace/kind-readers.ts +7 -1
  724. package/src/workspace/kinds.test.ts +12 -7
  725. package/src/workspace/kinds.ts +132 -7
  726. package/src/workspace/ledger.schema.json +158 -0
  727. package/src/workspace/lexicon-outputs.ts +132 -13
  728. package/src/workspace/lineage-check.ts +30 -7
  729. package/src/workspace/links.ts +24 -1
  730. package/src/workspace/ls-contract.test.ts +1 -1
  731. package/src/workspace/ls.schema.json +7 -0
  732. package/src/workspace/ls.ts +10 -1
  733. package/src/workspace/member-commands.ts +82 -3
  734. package/src/workspace/member-file-schema.test.ts +124 -0
  735. package/src/workspace/migrate-links.test.ts +99 -0
  736. package/src/workspace/migrate-links.ts +108 -0
  737. package/src/workspace/migration-dirs.test.ts +272 -0
  738. package/src/workspace/migration-dirs.ts +267 -0
  739. package/src/workspace/nested-graph.ts +32 -1
  740. package/src/workspace/org-scope.test.ts +238 -0
  741. package/src/workspace/reason-codes.test.ts +13 -1
  742. package/src/workspace/reason-codes.ts +23 -0
  743. package/src/workspace/records-cli.ts +58 -5
  744. package/src/workspace/records.schema.json +5 -0
  745. package/src/workspace/release-candidates.ts +7 -2
  746. package/src/workspace/release-train.ts +157 -0
  747. package/src/workspace/release-workflow.ts +4 -3
  748. package/src/workspace/repo-ref.ts +113 -0
  749. package/src/workspace/run-event.schema.json +2 -2
  750. package/src/workspace/runs-cli.ts +48 -4
  751. package/src/workspace/runs.schema.json +7 -0
  752. package/src/workspace/search-cli.e2e.test.ts +305 -0
  753. package/src/workspace/search-cli.ts +591 -0
  754. package/src/workspace/search-contract.ts +95 -0
  755. package/src/workspace/search.schema.json +822 -0
  756. package/src/workspace/status-contract.test.ts +46 -1
  757. package/src/workspace/status-decisions.test.ts +100 -0
  758. package/src/workspace/status-decisions.ts +151 -0
  759. package/src/workspace/status-gates.ts +9 -0
  760. package/src/workspace/status.schema.json +6 -0
  761. package/src/workspace/status.ts +17 -3
  762. package/src/workspace/where-filters.test.ts +39 -0
  763. package/src/workspace/work-cli.ts +5 -3
  764. package/src/workspace/work-evidence-ops.test.ts +176 -0
  765. package/src/workspace/work-evidence-ops.ts +189 -0
  766. package/src/workspace/work-evidence.schema.json +49 -2
  767. package/src/workspace/work-evidence.ts +22 -3
  768. package/src/workspace/workspace-gates.ts +200 -0
  769. package/src/workspace/workspace-kinds.schema.json +58 -3
  770. package/src/workspace/workspace-ledger.ts +130 -0
  771. package/src/workspace/workspace-run.test.ts +322 -0
  772. package/src/workspace/workspace-run.ts +461 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * `chant workspace search <query> [--member <name>] [--env <name>]
3
+ * [--snapshot <ref> | --live] [--at <rev>] [--explain] [--count-by ...]
4
+ * [--show a,b] [--json]` (#4374): `chant search` over every member of a
5
+ * declared workspace, as one `search` document of the read contract.
6
+ *
7
+ * Members are read the way `chant workspace graph` reads them, through the same
8
+ * fan-out (`readMembers` in `graph-cli.ts`): the same plan, each member under
9
+ * its own chant (ws-021), one process per toolchain, `--at <rev>` from an
10
+ * export of the tree at that commit, and a member of a package's kind in its
11
+ * reader project. Each member runs its own `chant search ... --json`, so the
12
+ * terms evaluate in the member, under the member's chant, over the graph that
13
+ * member's `chant graph` draws. Ids are then `<member>/<id>`, the rule
14
+ * `workspace graph` composes with (`composedId`), so a row names the node the
15
+ * graph names.
16
+ *
17
+ * Each member's answer stands alone: a path that crosses from one member into
18
+ * another is not walked, and every searched member says so with `alone: true`.
19
+ * A member that could not be searched is listed with a reason code and no
20
+ * answer, never as zero matches. Members are stamped by the rule of ws-059.
21
+ *
22
+ * A query with a capability term is the exception: its rules run once over
23
+ * the composed graph, each member mapped by its own chant (#4375, #4378;
24
+ * `composedCapabilitySearch` below).
25
+ *
26
+ * Two times stay apart. `--at <rev>` is the git revision, as for every
27
+ * contract read, and the document's `at` is that commit. `--snapshot <ref>`
28
+ * replays a recorded lifecycle snapshot, and `source.snapshot` names it. The
29
+ * two are not taken together, and `--at` given a snapshot ref such as
30
+ * `latest` is refused with a hint naming `--snapshot`.
31
+ */
32
+ import type { CommandContext, ParsedArgs } from "../cli/registry.js";
33
+ import type { Toolchain, UnitResult } from "./member-commands.js";
34
+ import { type SearchErrorCode, type SearchHead, type SearchMemberReasonCode, type WorkspaceSearchErrorCode } from "./search-contract.js";
35
+ /** The flags of `chant search` a member gets as they were given. */
36
+ type SearchFlags = Pick<Partial<ParsedArgs>, "env" | "snapshot" | "live" | "ambient" | "explain" | "countBy" | "show" | "checkLive" | "checkSnapshot" | "failOnDrift">;
37
+ export interface WorkspaceSearchQuery {
38
+ /** Where the walk up to the declaration starts. */
39
+ cwd: string;
40
+ query: string;
41
+ /** The git revision to search the source at (`--at`). */
42
+ at?: string;
43
+ /** Only these members. */
44
+ members?: string[];
45
+ flags?: SearchFlags;
46
+ /** The chant for members with none of their own; the running chant by default. */
47
+ reader?: Toolchain;
48
+ /** Called with each member's stderr. */
49
+ onStderr?: (text: string) => void;
50
+ }
51
+ /** A row as a member's `chant search --json` prints it. */
52
+ interface MemberMatch {
53
+ id: string;
54
+ displayId: string;
55
+ kind?: string;
56
+ physicalId?: string;
57
+ unobserved?: string;
58
+ show?: Record<string, unknown>;
59
+ paths: {
60
+ term: string;
61
+ dir: "out" | "in";
62
+ hops: {
63
+ from: string;
64
+ fromAttr?: string;
65
+ to: string;
66
+ toAttr?: string;
67
+ edge?: string;
68
+ }[];
69
+ /** On a `cap:` term (#4375): the sets the match relied on, each with its path. */
70
+ because?: {
71
+ capability: string;
72
+ id: string;
73
+ hops: {
74
+ from: string;
75
+ to: string;
76
+ }[];
77
+ }[];
78
+ }[];
79
+ }
80
+ /** The answer of one member's `chant search --json`, rows or groups. */
81
+ interface MemberAnswer {
82
+ query: string;
83
+ source: Record<string, unknown>;
84
+ matches?: MemberMatch[];
85
+ countBy?: string;
86
+ groups?: {
87
+ group: string;
88
+ count: number;
89
+ ids?: string[];
90
+ }[];
91
+ total?: number;
92
+ provenance?: string;
93
+ liveFailures?: string[];
94
+ explain?: {
95
+ universe: {
96
+ matched: number;
97
+ of: number;
98
+ kinds: string[];
99
+ };
100
+ evidence: {
101
+ id: string;
102
+ attr: string;
103
+ via: string;
104
+ }[];
105
+ nearMisses: {
106
+ id: string;
107
+ fails?: string;
108
+ }[];
109
+ moreExcluded: number;
110
+ };
111
+ drift?: Record<string, unknown>;
112
+ }
113
+ export interface SearchMember {
114
+ name: string;
115
+ dir: string;
116
+ kind: string;
117
+ /** `searched` when the member answered, `skipped` when its kind isn't run, `failed` when it has no answer. */
118
+ status: "searched" | "skipped" | "failed";
119
+ reason: {
120
+ code: SearchMemberReasonCode;
121
+ message: string;
122
+ } | null;
123
+ /** The chant version that read the member, when its toolchain said. */
124
+ chant: string | null;
125
+ /** The member's stamp, by the rule of ws-059, or null. */
126
+ stamp: string | null;
127
+ /** On a searched member: its terms and paths saw only its own graph. */
128
+ alone?: true;
129
+ source?: Record<string, unknown>;
130
+ /** The member's matched ids, `<member>/<id>`. */
131
+ matches?: string[];
132
+ groups?: {
133
+ group: string;
134
+ count: number;
135
+ ids?: string[];
136
+ }[];
137
+ total?: number;
138
+ provenance?: string;
139
+ liveFailures?: string[];
140
+ explain?: MemberAnswer["explain"];
141
+ drift?: Record<string, unknown>;
142
+ }
143
+ interface WorkspaceHead extends SearchHead {
144
+ workspace: {
145
+ name: string;
146
+ root: string;
147
+ };
148
+ /** The commit searched, or null for the working tree. */
149
+ at: string | null;
150
+ query: string;
151
+ /** Which observation answered: `declared`, `live` or `snapshot`, with `env` and the `snapshot` ref asked for. */
152
+ source: {
153
+ kind: "declared" | "live" | "snapshot";
154
+ env?: string;
155
+ snapshot?: string;
156
+ };
157
+ members: SearchMember[];
158
+ }
159
+ export type WorkspaceSearchDocument = (WorkspaceHead & {
160
+ matches: (MemberMatch & {
161
+ member: string;
162
+ })[];
163
+ }) | (WorkspaceHead & {
164
+ countBy: string;
165
+ groups: {
166
+ group: string;
167
+ count: number;
168
+ ids?: string[];
169
+ }[];
170
+ total: number;
171
+ }) | (SearchHead & {
172
+ query: string;
173
+ error: {
174
+ code: WorkspaceSearchErrorCode | SearchErrorCode;
175
+ message: string;
176
+ hint?: string;
177
+ };
178
+ });
179
+ export interface WorkspaceSearchResult {
180
+ doc: WorkspaceSearchDocument;
181
+ /** The search was refused, or a member failed, had a failed live read, or failed its drift check. */
182
+ failed: boolean;
183
+ }
184
+ /** The command line each member runs: its own `chant search`, the query after `--` so one opening with `-` stays a query. */
185
+ export declare function memberSearchArgv(query: string, flags?: SearchFlags): string[];
186
+ /**
187
+ * Read one member's run: its answer, or why it has none. A chant that prints
188
+ * no `search` document of the contract is `member-chant-too-old` when it
189
+ * predates `workspace member-run`, says it has no such command or flag, or
190
+ * prints `search --json` from before the contract (no `contract` field).
191
+ */
192
+ export declare function readMemberSearch(r: Pick<UnitResult, "exitCode" | "stdout" | "stderr" | "chant">): {
193
+ answer: MemberAnswer;
194
+ } | {
195
+ reason: {
196
+ code: SearchMemberReasonCode;
197
+ message: string;
198
+ };
199
+ };
200
+ /** Search every member and compose the document. Never throws a {@link WorkspaceReadError}. */
201
+ export declare function workspaceSearch(q: WorkspaceSearchQuery): Promise<WorkspaceSearchResult>;
202
+ export declare function runWorkspaceSearch(ctx: CommandContext): Promise<number>;
203
+ export {};
204
+ //# sourceMappingURL=search-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-cli.d.ts","sourceRoot":"","sources":["../../src/workspace/search-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,466 @@
1
+ /**
2
+ * `chant workspace search <query> [--member <name>] [--env <name>]
3
+ * [--snapshot <ref> | --live] [--at <rev>] [--explain] [--count-by ...]
4
+ * [--show a,b] [--json]` (#4374): `chant search` over every member of a
5
+ * declared workspace, as one `search` document of the read contract.
6
+ *
7
+ * Members are read the way `chant workspace graph` reads them, through the same
8
+ * fan-out (`readMembers` in `graph-cli.ts`): the same plan, each member under
9
+ * its own chant (ws-021), one process per toolchain, `--at <rev>` from an
10
+ * export of the tree at that commit, and a member of a package's kind in its
11
+ * reader project. Each member runs its own `chant search ... --json`, so the
12
+ * terms evaluate in the member, under the member's chant, over the graph that
13
+ * member's `chant graph` draws. Ids are then `<member>/<id>`, the rule
14
+ * `workspace graph` composes with (`composedId`), so a row names the node the
15
+ * graph names.
16
+ *
17
+ * Each member's answer stands alone: a path that crosses from one member into
18
+ * another is not walked, and every searched member says so with `alone: true`.
19
+ * A member that could not be searched is listed with a reason code and no
20
+ * answer, never as zero matches. Members are stamped by the rule of ws-059.
21
+ *
22
+ * A query with a capability term is the exception: its rules run once over
23
+ * the composed graph, each member mapped by its own chant (#4375, #4378;
24
+ * `composedCapabilitySearch` below).
25
+ *
26
+ * Two times stay apart. `--at <rev>` is the git revision, as for every
27
+ * contract read, and the document's `at` is that commit. `--snapshot <ref>`
28
+ * replays a recorded lifecycle snapshot, and `source.snapshot` names it. The
29
+ * two are not taken together, and `--at` given a snapshot ref such as
30
+ * `latest` is refused with a hint naming `--snapshot`.
31
+ */
32
+ import { existsSync } from "node:fs";
33
+ import { resolve } from "node:path";
34
+ import { formatError } from "../cli/format.js";
35
+ import { composedId } from "./compose-graph.js";
36
+ import { readerVersion, WorkspaceReadError } from "./declaration.js";
37
+ import { readMembers } from "./graph-cli.js";
38
+ import { SEARCH_CONTRACT_VERSION, SEARCH_ERROR_CODES, SEARCH_MEMBER_REASON_CODES, SEARCH_OUTPUT_SCHEMA_ID, } from "./search-contract.js";
39
+ import { handToRootChant } from "./which-chant.js";
40
+ const USAGE = 'chant workspace search "<query>" [--member <name>] [--env <name>] [--snapshot <ref> | --live] [--at <rev>] [--explain] [--count-by kind|module|attr:<name>] [--show a,b] [--json]';
41
+ /** The command line each member runs: its own `chant search`, the query after `--` so one opening with `-` stays a query. */
42
+ export function memberSearchArgv(query, flags = {}) {
43
+ return [
44
+ "search",
45
+ ...(flags.env ? ["--env", flags.env] : []),
46
+ ...(flags.snapshot ? ["--snapshot", flags.snapshot] : []),
47
+ ...(flags.live ? ["--live"] : []),
48
+ ...(flags.ambient ? ["--ambient"] : []),
49
+ ...(flags.explain ? ["--explain"] : []),
50
+ ...(flags.countBy ? ["--count-by", flags.countBy] : []),
51
+ ...(flags.show ? ["--show", flags.show] : []),
52
+ ...(flags.checkLive ? ["--check-live"] : []),
53
+ ...(flags.checkSnapshot ? ["--check-snapshot"] : []),
54
+ ...(flags.failOnDrift ? ["--fail-on-drift"] : []),
55
+ "--json",
56
+ "--",
57
+ query,
58
+ ];
59
+ }
60
+ /** The last line of `stdout` that parses as a JSON object, or undefined. */
61
+ function lastJsonObject(stdout) {
62
+ const lines = stdout.split("\n").map((l) => l.trim()).filter(Boolean);
63
+ for (let i = lines.length - 1; i >= 0; i--) {
64
+ if (!lines[i].startsWith("{"))
65
+ continue;
66
+ try {
67
+ const v = JSON.parse(lines[i]);
68
+ if (v && typeof v === "object" && !Array.isArray(v))
69
+ return v;
70
+ }
71
+ catch {
72
+ // Not this line.
73
+ }
74
+ }
75
+ return undefined;
76
+ }
77
+ const KNOWN_REFUSALS = new Set(SEARCH_ERROR_CODES);
78
+ /**
79
+ * Read one member's run: its answer, or why it has none. A chant that prints
80
+ * no `search` document of the contract is `member-chant-too-old` when it
81
+ * predates `workspace member-run`, says it has no such command or flag, or
82
+ * prints `search --json` from before the contract (no `contract` field).
83
+ */
84
+ export function readMemberSearch(r) {
85
+ const doc = lastJsonObject(r.stdout);
86
+ if (doc && doc.$schema === SEARCH_OUTPUT_SCHEMA_ID && doc.contract === SEARCH_CONTRACT_VERSION) {
87
+ const error = doc.error;
88
+ if (error && typeof error === "object") {
89
+ const code = String(error.code);
90
+ const message = `${String(error.message)}${typeof error.hint === "string" ? `; ${error.hint}` : ""}`;
91
+ return KNOWN_REFUSALS.has(code)
92
+ ? { reason: { code: code, message } }
93
+ : { reason: { code: "output-unreadable", message: `the member's search refused with ${code}, which this chant does not know: ${message}` } };
94
+ }
95
+ if (!Array.isArray(doc.matches) && !Array.isArray(doc.groups)) {
96
+ return { reason: { code: "output-unreadable", message: "the member's search document has neither matches nor groups" } };
97
+ }
98
+ return { answer: doc };
99
+ }
100
+ const version = r.chant ? `chant ${r.chant}` : "a chant older than workspace member-run";
101
+ const unknownSurface = /Unknown (command|flag)/i.test(r.stderr);
102
+ const preContract = doc !== undefined && doc.contract === undefined && ("matches" in doc || "groups" in doc || "error" in doc);
103
+ if (r.chant === null || unknownSurface || preContract) {
104
+ return {
105
+ reason: {
106
+ code: "member-chant-too-old",
107
+ message: `the member runs ${version}, which prints no search document of the read contract (#4374); install a newer @intentius/chant for this member`,
108
+ },
109
+ };
110
+ }
111
+ const tail = r.stderr.trim().split("\n").slice(-5).join("\n");
112
+ if (r.exitCode !== 0)
113
+ return { reason: { code: "command-failed", message: `chant search exited ${r.exitCode}${tail ? `: ${tail}` : ""}` } };
114
+ return { reason: { code: "output-unreadable", message: "the member's chant search printed no search document" } };
115
+ }
116
+ /** `ids` with each one prefixed by its member. */
117
+ const prefixAll = (member, ids) => (Array.isArray(ids) ? ids.map((id) => (typeof id === "string" ? composedId(member, id) : id)) : ids);
118
+ /** A member's drift, with every node id in it `<member>/<id>`. */
119
+ function prefixDrift(member, drift) {
120
+ const out = { ...drift };
121
+ for (const key of ["missing", "orphan", "disappeared", "newlyObserved"])
122
+ if (key in out)
123
+ out[key] = prefixAll(member, out[key]);
124
+ const rows = (key, fields) => {
125
+ if (!Array.isArray(out[key]))
126
+ return;
127
+ out[key] = out[key].map((row) => {
128
+ const copy = { ...row };
129
+ for (const f of fields)
130
+ if (typeof copy[f] === "string")
131
+ copy[f] = composedId(member, copy[f]);
132
+ return copy;
133
+ });
134
+ };
135
+ rows("drifted", ["id"]);
136
+ rows("unobserved", ["id"]);
137
+ rows("runtimeChildren", ["id", "owner"]);
138
+ return out;
139
+ }
140
+ /** A member's row, with its id and each hop's ends `<member>/<id>`, as `workspace graph` names them. */
141
+ function prefixMatch(member, m) {
142
+ return {
143
+ ...m,
144
+ id: composedId(member, m.id),
145
+ member,
146
+ paths: (m.paths ?? []).map((p) => ({
147
+ ...p,
148
+ hops: p.hops.map((h) => ({ ...h, from: composedId(member, h.from), to: composedId(member, h.to) })),
149
+ ...(p.because
150
+ ? { because: p.because.map((b) => ({ ...b, id: composedId(member, b.id), hops: b.hops.map((h) => ({ ...h, from: composedId(member, h.from), to: composedId(member, h.to) })) })) }
151
+ : {}),
152
+ })),
153
+ };
154
+ }
155
+ /**
156
+ * Sort groups by count, highest first, then by name: the order `--count-by`
157
+ * prints. A group carries `ids` (#4382) when every member that counted into it
158
+ * listed its own; a member on an older chant lists none, and then the merged
159
+ * group has a count and no ids, rather than ids that fall short of it.
160
+ */
161
+ function sortGroups(groups) {
162
+ return [...groups]
163
+ .map(([group, g]) => ({ group, count: g.count, ...(g.ids ? { ids: g.ids } : {}) }))
164
+ .sort((a, b) => b.count - a.count || (a.group < b.group ? -1 : a.group > b.group ? 1 : 0));
165
+ }
166
+ /** The source the document's top names, from the flags: which observation answered. */
167
+ function topSource(flags) {
168
+ if (flags.live)
169
+ return { kind: "live", ...(flags.env ? { env: flags.env } : {}) };
170
+ if (flags.snapshot)
171
+ return { kind: "snapshot", ...(flags.env ? { env: flags.env } : {}), snapshot: flags.snapshot };
172
+ return { kind: "declared" };
173
+ }
174
+ /** Search every member and compose the document. Never throws a {@link WorkspaceReadError}. */
175
+ export async function workspaceSearch(q) {
176
+ const head = { $schema: SEARCH_OUTPUT_SCHEMA_ID, contract: SEARCH_CONTRACT_VERSION, chant: readerVersion() };
177
+ const flags = q.flags ?? {};
178
+ const query = q.query.trim();
179
+ const refuse = (code, message, hint) => ({
180
+ doc: { ...head, query, error: { code, message, ...(hint ? { hint } : {}) } },
181
+ failed: true,
182
+ });
183
+ // The two times (#4374): --at is the git revision, --snapshot the recorded estate.
184
+ if (flags.snapshot !== undefined && q.at !== undefined) {
185
+ return refuse("snapshot-at-revision", `--snapshot ${flags.snapshot} replays a recorded snapshot over the source in the working tree, and --at ${q.at} reads the source at a revision; chant workspace search takes one of them`, "search the source at a commit with --at <rev>, or answer from a recorded snapshot with --snapshot <ref>");
186
+ }
187
+ if (flags.live && q.at !== undefined) {
188
+ return refuse("live-at-revision", "--live reads the account as it stands now, and --at reads the source at a revision; chant workspace search takes one of them");
189
+ }
190
+ // The query and flags are refused once, here, with the codes a member would give.
191
+ const { checkSearchArgs } = await import("../cli/handlers/search.js");
192
+ const checked = checkSearchArgs(flags, query, { ref: flags.snapshot, flag: "--snapshot" });
193
+ if ("error" in checked)
194
+ return refuse(checked.error.code, checked.error.message, checked.error.hint);
195
+ // Capability terms (#4375) run once, over the composed graph.
196
+ const { usesCapability } = await import("../cli/handlers/search.js");
197
+ if (checked.terms.some(usesCapability)) {
198
+ if (flags.live || flags.snapshot !== undefined || checked.countBy || flags.checkLive || flags.checkSnapshot) {
199
+ return refuse("usage-invalid", "a capability term over a workspace answers from the composed declared graph, so it takes no --live, --snapshot, --check-live, --check-snapshot or --count-by", "search a member's own project for a live answer: chant search \"cap:...\" --live --env <name>");
200
+ }
201
+ return composedCapabilitySearch(q, head, query, checked.terms);
202
+ }
203
+ try {
204
+ const read = await readMembers({ cwd: q.cwd, at: q.at, members: q.members, reader: q.reader, onStderr: q.onStderr, args: {} }, { cache: false, argvFor: () => memberSearchArgv(query, flags) });
205
+ const { located, declaration, plan, results, stamps } = read;
206
+ const byId = new Map(results.map((r) => [r.id, r]));
207
+ const members = [];
208
+ const matches = [];
209
+ const groups = new Map();
210
+ let failed = plan.unreadable.length > 0;
211
+ for (const m of declaration.members) {
212
+ if (q.members?.length && !q.members.includes(m.name))
213
+ continue;
214
+ const entry = { name: m.name, dir: m.dir, kind: m.kind, status: "skipped", reason: null, chant: null, stamp: stamps.get(m.name) ?? null };
215
+ const r = byId.get(m.name);
216
+ if (!r) {
217
+ const unreadable = plan.unreadable.find((s) => s.name === m.name);
218
+ const skipped = plan.skipped.find((s) => s.name === m.name);
219
+ const why = unreadable ?? skipped;
220
+ entry.status = unreadable ? "failed" : "skipped";
221
+ entry.reason = why ? { code: why.reason.code, message: why.reason.message } : null;
222
+ members.push(entry);
223
+ continue;
224
+ }
225
+ entry.chant = r.chant;
226
+ const got = readMemberSearch(r);
227
+ if ("reason" in got) {
228
+ failed = true;
229
+ entry.status = "failed";
230
+ entry.reason = got.reason;
231
+ members.push(entry);
232
+ continue;
233
+ }
234
+ const a = got.answer;
235
+ // A member that answered and still exited 1 had a failed live read, or failed --fail-on-drift.
236
+ if (r.exitCode !== 0)
237
+ failed = true;
238
+ entry.status = "searched";
239
+ entry.alone = true;
240
+ entry.source = a.source;
241
+ if (Array.isArray(a.matches)) {
242
+ const rows = a.matches.map((x) => prefixMatch(m.name, x));
243
+ matches.push(...rows);
244
+ entry.matches = rows.map((x) => x.id);
245
+ }
246
+ if (Array.isArray(a.groups)) {
247
+ // Each group's ids (#4382) as `workspace graph` gives the same nodes: `<member>/<id>`.
248
+ entry.groups = a.groups.map((g) => (Array.isArray(g.ids) ? { ...g, ids: g.ids.map((id) => composedId(m.name, id)) } : g));
249
+ entry.total = a.total ?? a.groups.reduce((n, g) => n + g.count, 0);
250
+ // A module is a member's own: `module.vpc` in two members is two modules.
251
+ for (const g of entry.groups) {
252
+ const name = checked.countBy?.by === "module" ? composedId(m.name, g.group) : g.group;
253
+ const was = groups.get(name);
254
+ const ids = Array.isArray(g.ids) && (!was || was.ids) ? [...(was?.ids ?? []), ...g.ids] : null;
255
+ groups.set(name, { count: (was?.count ?? 0) + g.count, ids });
256
+ }
257
+ }
258
+ if (a.provenance !== undefined)
259
+ entry.provenance = a.provenance;
260
+ if (a.liveFailures?.length)
261
+ entry.liveFailures = a.liveFailures;
262
+ if (a.explain) {
263
+ entry.explain = {
264
+ ...a.explain,
265
+ evidence: a.explain.evidence.map((e) => ({ ...e, id: composedId(m.name, e.id) })),
266
+ nearMisses: a.explain.nearMisses.map((n) => ({ ...n, id: composedId(m.name, n.id) })),
267
+ };
268
+ }
269
+ if (a.drift)
270
+ entry.drift = prefixDrift(m.name, a.drift);
271
+ members.push(entry);
272
+ }
273
+ const top = {
274
+ ...head,
275
+ workspace: { name: declaration.name, root: located.root },
276
+ at: located.at,
277
+ query,
278
+ source: topSource(flags),
279
+ members,
280
+ };
281
+ if (checked.countBy) {
282
+ const merged = sortGroups(groups);
283
+ return { doc: { ...top, countBy: flags.countBy.trim(), groups: merged, total: merged.reduce((n, g) => n + g.count, 0) }, failed };
284
+ }
285
+ matches.sort((a, b) => a.id.localeCompare(b.id));
286
+ return { doc: { ...top, matches }, failed };
287
+ }
288
+ catch (err) {
289
+ if (!(err instanceof WorkspaceReadError))
290
+ throw err;
291
+ // --at is a git revision here; a snapshot ref such as `latest` names no commit (#4374).
292
+ const hint = err.code === "revision-unknown" && q.at !== undefined
293
+ ? `--at is a git revision in the read contract; to answer from a recorded snapshot, use --snapshot ${q.at === "true" ? "latest" : q.at} --env <name>`
294
+ : undefined;
295
+ return refuse(err.code, err.message, hint);
296
+ }
297
+ }
298
+ /**
299
+ * A query with capability terms (#4375): the rules run once, under this
300
+ * chant, over the graph `chant workspace graph` composes, so a path may cross
301
+ * from one member into another wherever the composed graph has an edge.
302
+ *
303
+ * The lexicon-neutral view the rules read is not built here (#4378). Each
304
+ * member's own chant builds its part, through the mappings and adapters of
305
+ * the lexicons that member loads, and prints it with
306
+ * `chant graph --capability-view`; `workspace graph --capability-view`
307
+ * carries it on the member. This chant composes the parts, resolves ARNs one
308
+ * member names in another, and evaluates. A member whose chant printed no
309
+ * view is `member-chant-too-old`, never an empty answer. A member is
310
+ * `searched` without `alone`.
311
+ */
312
+ async function composedCapabilitySearch(q, head, query, terms) {
313
+ const { answerOverGraph } = await import("../cli/handlers/search.js");
314
+ const { workspaceGraph } = await import("./graph-cli.js");
315
+ const { composeViews, isViewDocument } = await import("../capabilities/view.js");
316
+ // Detail 3, each member's full property trees, and each member's capability
317
+ // view (#4378): its chant maps its own nodes through its own lexicons, as
318
+ // its own `chant search` would. Only the rules run here, once.
319
+ const { doc: graph, failed: graphFailed } = await workspaceGraph({
320
+ cwd: q.cwd,
321
+ at: q.at,
322
+ members: q.members,
323
+ reader: q.reader,
324
+ onStderr: q.onStderr,
325
+ args: { detail: 3, capabilityView: true },
326
+ });
327
+ if ("error" in graph) {
328
+ const e = graph.error;
329
+ return { doc: { ...head, query, error: { code: e.code, message: e.message } }, failed: true };
330
+ }
331
+ const g = graph;
332
+ const viewed = g.members.filter((m) => m.status === "composed" && isViewDocument(m.capabilityView));
333
+ const ir = { nodes: g.nodes, edges: g.edges, groups: {} };
334
+ const answer = answerOverGraph(ir, terms, query, composeViews(viewed.map((m) => m.capabilityView)));
335
+ if ("error" in answer) {
336
+ return { doc: { ...head, query, error: { code: "query-invalid", message: answer.error.message, ...(answer.error.hint ? { hint: answer.error.hint } : {}) } }, failed: true };
337
+ }
338
+ const known = new Set(SEARCH_MEMBER_REASON_CODES);
339
+ // A member whose chant printed no view was read, but nothing mapped its
340
+ // nodes, so it has no answer rather than an empty one.
341
+ const tooOld = (m) => ({
342
+ code: "member-chant-too-old",
343
+ message: `the member runs ${m.chant ? `chant ${m.chant}` : "a chant older than workspace member-run"}, which prints no capability view (#4378), so its nodes are not evaluated: a member's lexicon mappings run under its own chant; install a newer @intentius/chant for this member`,
344
+ });
345
+ const members = g.members.map((m) => {
346
+ const searched = m.status === "composed" && viewed.includes(m);
347
+ const reason = m.reason
348
+ ? { code: (known.has(m.reason.code) ? m.reason.code : "output-unreadable"), message: m.reason.message }
349
+ : m.status === "composed" && !searched
350
+ ? tooOld(m)
351
+ : null;
352
+ return {
353
+ name: m.name,
354
+ dir: m.dir,
355
+ kind: m.kind,
356
+ status: searched ? "searched" : reason && m.status !== "skipped" ? "failed" : "skipped",
357
+ reason,
358
+ chant: m.chant ?? null,
359
+ stamp: m.stamp ?? null,
360
+ ...(searched
361
+ ? {
362
+ source: { kind: "declared" },
363
+ matches: answer.matches.filter((x) => x.id.startsWith(`${m.name}/`)).map((x) => x.id),
364
+ provenance: "declared only · each member mapped by its own chant, capabilities evaluated once over the composed workspace graph",
365
+ }
366
+ : {}),
367
+ };
368
+ });
369
+ const matches = answer.matches
370
+ .map((x) => {
371
+ const member = x.id.slice(0, x.id.indexOf("/"));
372
+ return { ...x, member, displayId: x.id.slice(member.length + 1) };
373
+ })
374
+ .sort((a, b) => a.id.localeCompare(b.id));
375
+ const doc = {
376
+ ...head,
377
+ workspace: g.workspace,
378
+ at: g.at,
379
+ query,
380
+ source: { kind: "declared" },
381
+ members,
382
+ matches,
383
+ capabilities: answer.capabilities,
384
+ };
385
+ return { doc, failed: graphFailed || viewed.length < g.members.filter((m) => m.status === "composed").length };
386
+ }
387
+ /** The text form: one row per match, or the merged groups, then each member that has no answer. */
388
+ function printText(doc) {
389
+ if ("error" in doc)
390
+ return;
391
+ if ("groups" in doc) {
392
+ const width = String(doc.groups[0]?.count ?? 0).length;
393
+ for (const g of doc.groups)
394
+ console.log(`${String(g.count).padStart(width)} ${g.group}`);
395
+ console.log(`— ${doc.total} total · ${doc.groups.length} group${doc.groups.length === 1 ? "" : "s"} by ${doc.countBy}`);
396
+ }
397
+ else if (doc.matches.length === 0) {
398
+ console.log("(no matches)");
399
+ }
400
+ else {
401
+ for (const m of doc.matches) {
402
+ const show = Object.entries(m.show ?? {}).map(([k, v]) => `${k}=${typeof v === "object" ? JSON.stringify(v) : String(v)}`);
403
+ console.log([`${m.member}/${m.displayId}`, m.kind ?? "", ...(m.physicalId ? [m.physicalId] : []), ...show].join(" "));
404
+ }
405
+ }
406
+ const searched = doc.members.filter((m) => m.status === "searched").length;
407
+ // Capability terms (#4375) ran once over the composed graph, not per member.
408
+ const caps = doc.capabilities;
409
+ for (const c of caps ?? [])
410
+ if (c.notEvaluated.length > 0)
411
+ console.log(`— ${c.name} does not evaluate: ${c.notEvaluated.join("; ")}`);
412
+ const together = searched > 0 && doc.members.every((m) => m.status !== "searched" || !m.alone);
413
+ for (const m of doc.members)
414
+ if (m.status === "failed" && m.reason)
415
+ console.error(formatError({ message: `member ${m.name}: ${m.reason.code}: ${m.reason.message}` }));
416
+ const failed = doc.members.filter((m) => m.status === "failed").length;
417
+ const skipped = doc.members.filter((m) => m.status === "skipped").length;
418
+ console.error(`chant workspace search: ${searched} member${searched === 1 ? "" : "s"} searched, ${together ? "together over the composed graph" : "each alone"}; ${failed} failed; ${skipped} skipped`);
419
+ }
420
+ export async function runWorkspaceSearch(ctx) {
421
+ const { args } = ctx;
422
+ const cwd = resolve(".");
423
+ if (!existsSync(cwd)) {
424
+ console.error(formatError({ message: `${cwd} does not exist`, hint: USAGE }));
425
+ return 1;
426
+ }
427
+ // The root's chant reads the declaration (ws-021).
428
+ const handed = await handToRootChant(cwd, args.at);
429
+ if (handed !== undefined)
430
+ return handed;
431
+ // The capability catalog (#4375): rules run once, under the workspace's
432
+ // chant, so the catalog is this chant's, for every lexicon a member loads.
433
+ if (args.capabilities) {
434
+ const { printCapabilities } = await import("../cli/handlers/search.js");
435
+ const { workspaceLexicons } = await import("./capabilities-contract.js");
436
+ return printCapabilities(args, args.extraPositional ?? "", await workspaceLexicons(cwd));
437
+ }
438
+ const { doc, failed } = await workspaceSearch({
439
+ cwd,
440
+ query: args.extraPositional ?? "",
441
+ at: args.at,
442
+ members: args.members,
443
+ flags: {
444
+ env: args.env,
445
+ snapshot: args.snapshot,
446
+ live: args.live,
447
+ ambient: args.ambient,
448
+ explain: args.explain,
449
+ countBy: args.countBy,
450
+ show: args.show,
451
+ checkLive: args.checkLive,
452
+ checkSnapshot: args.checkSnapshot,
453
+ failOnDrift: args.failOnDrift,
454
+ },
455
+ onStderr: (text) => process.stderr.write(text),
456
+ });
457
+ if (args.json)
458
+ console.log(JSON.stringify(doc));
459
+ if ("error" in doc) {
460
+ console.error(formatError({ message: `${doc.error.code}: ${doc.error.message}`, hint: doc.error.hint ?? USAGE }));
461
+ return 1;
462
+ }
463
+ if (!args.json)
464
+ printText(doc);
465
+ return failed ? 1 : 0;
466
+ }