@intentius/chant 0.79.0 → 0.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/dist/audit/core.d.ts.map +1 -1
  2. package/dist/audit/discover.d.ts +30 -0
  3. package/dist/audit/discover.d.ts.map +1 -1
  4. package/dist/audit/report-html.d.ts +5 -0
  5. package/dist/audit/report-html.d.ts.map +1 -1
  6. package/dist/audit/report-model.d.ts +13 -0
  7. package/dist/audit/report-model.d.ts.map +1 -1
  8. package/dist/audit/terraform-state.d.ts +13 -0
  9. package/dist/audit/terraform-state.d.ts.map +1 -1
  10. package/dist/cli/command-group.d.ts +6 -0
  11. package/dist/cli/command-group.d.ts.map +1 -1
  12. package/dist/cli/commands/audit.d.ts +44 -3
  13. package/dist/cli/commands/audit.d.ts.map +1 -1
  14. package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
  15. package/dist/cli/commands/check-lexicon.d.ts +8 -0
  16. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  17. package/dist/cli/commands/doctor.d.ts.map +1 -1
  18. package/dist/cli/commands/import-agents.d.ts.map +1 -1
  19. package/dist/cli/commands/init.d.ts +6 -0
  20. package/dist/cli/commands/init.d.ts.map +1 -1
  21. package/dist/cli/commands/lint.d.ts.map +1 -1
  22. package/dist/cli/commands/onboard.d.ts.map +1 -1
  23. package/dist/cli/commands/update.d.ts +6 -0
  24. package/dist/cli/commands/update.d.ts.map +1 -1
  25. package/dist/cli/commands/vendor.d.ts +5 -0
  26. package/dist/cli/commands/vendor.d.ts.map +1 -1
  27. package/dist/cli/conflict-check.d.ts +6 -0
  28. package/dist/cli/conflict-check.d.ts.map +1 -1
  29. package/dist/cli/handlers/build.d.ts.map +1 -1
  30. package/dist/cli/handlers/components.d.ts.map +1 -1
  31. package/dist/cli/handlers/dev.d.ts.map +1 -1
  32. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  33. package/dist/cli/handlers/init.d.ts.map +1 -1
  34. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  35. package/dist/cli/handlers/misc.d.ts.map +1 -1
  36. package/dist/cli/handlers/operator.d.ts +7 -0
  37. package/dist/cli/handlers/operator.d.ts.map +1 -1
  38. package/dist/cli/handlers/promote.d.ts +20 -0
  39. package/dist/cli/handlers/promote.d.ts.map +1 -0
  40. package/dist/cli/handlers/run-generate.d.ts +39 -0
  41. package/dist/cli/handlers/run-generate.d.ts.map +1 -0
  42. package/dist/cli/handlers/run.d.ts +4 -1
  43. package/dist/cli/handlers/run.d.ts.map +1 -1
  44. package/dist/cli/handlers/vendor.d.ts +8 -3
  45. package/dist/cli/handlers/vendor.d.ts.map +1 -1
  46. package/dist/cli/main.d.ts +12 -0
  47. package/dist/cli/main.d.ts.map +1 -1
  48. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  49. package/dist/cli/plugins.d.ts +14 -0
  50. package/dist/cli/plugins.d.ts.map +1 -1
  51. package/dist/cli/registry.d.ts +46 -1
  52. package/dist/cli/registry.d.ts.map +1 -1
  53. package/dist/codegen/fetch.d.ts +10 -0
  54. package/dist/codegen/fetch.d.ts.map +1 -1
  55. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  56. package/dist/components/cli-support.d.ts +3 -1
  57. package/dist/components/cli-support.d.ts.map +1 -1
  58. package/dist/components/discover.d.ts.map +1 -1
  59. package/dist/components/driver.d.ts +16 -2
  60. package/dist/components/driver.d.ts.map +1 -1
  61. package/dist/components/fan-out-support.d.ts.map +1 -1
  62. package/dist/components/gate-plan.d.ts +40 -0
  63. package/dist/components/gate-plan.d.ts.map +1 -0
  64. package/dist/components/pilots/alb-ecs.pilot.d.ts +7 -1
  65. package/dist/components/pilots/alb-ecs.pilot.d.ts.map +1 -1
  66. package/dist/components/presets/ecs-fargate.d.ts +10 -4
  67. package/dist/components/presets/ecs-fargate.d.ts.map +1 -1
  68. package/dist/components/promote.d.ts +264 -0
  69. package/dist/components/promote.d.ts.map +1 -0
  70. package/dist/components/sandbox/driver.d.ts.map +1 -1
  71. package/dist/components/sandbox/run.d.ts.map +1 -1
  72. package/dist/components/verbs/build-archive.d.ts +22 -11
  73. package/dist/components/verbs/build-archive.d.ts.map +1 -1
  74. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  75. package/dist/config-static.d.ts +59 -0
  76. package/dist/config-static.d.ts.map +1 -0
  77. package/dist/config.d.ts +104 -5
  78. package/dist/config.d.ts.map +1 -1
  79. package/dist/content-digest.d.ts +17 -0
  80. package/dist/content-digest.d.ts.map +1 -0
  81. package/dist/discovery/files.d.ts +48 -4
  82. package/dist/discovery/files.d.ts.map +1 -1
  83. package/dist/discovery/fold-import.d.ts +32 -1
  84. package/dist/discovery/fold-import.d.ts.map +1 -1
  85. package/dist/discovery/index.d.ts.map +1 -1
  86. package/dist/discovery/sandbox/driver.d.ts +20 -0
  87. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  88. package/dist/discovery/sandbox/fork.d.ts +20 -0
  89. package/dist/discovery/sandbox/fork.d.ts.map +1 -1
  90. package/dist/discovery/walk.d.ts +119 -0
  91. package/dist/discovery/walk.d.ts.map +1 -0
  92. package/dist/graph-ir.d.ts +17 -1
  93. package/dist/graph-ir.d.ts.map +1 -1
  94. package/dist/join-key.d.ts +31 -0
  95. package/dist/join-key.d.ts.map +1 -0
  96. package/dist/lexicon-module.d.ts +110 -0
  97. package/dist/lexicon-module.d.ts.map +1 -0
  98. package/dist/lexicon.d.ts +82 -1
  99. package/dist/lexicon.d.ts.map +1 -1
  100. package/dist/lifecycle/build-ledger-store.d.ts.map +1 -1
  101. package/dist/lifecycle/digest.d.ts +5 -1
  102. package/dist/lifecycle/digest.d.ts.map +1 -1
  103. package/dist/lifecycle/gate-ledger.d.ts +20 -5
  104. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  105. package/dist/lifecycle/git.d.ts +64 -0
  106. package/dist/lifecycle/git.d.ts.map +1 -1
  107. package/dist/lifecycle/lease.d.ts +8 -1
  108. package/dist/lifecycle/lease.d.ts.map +1 -1
  109. package/dist/lifecycle/legacy-digest.d.ts +59 -0
  110. package/dist/lifecycle/legacy-digest.d.ts.map +1 -0
  111. package/dist/lifecycle/member-ledger.d.ts +67 -0
  112. package/dist/lifecycle/member-ledger.d.ts.map +1 -0
  113. package/dist/lifecycle/plan-digest.d.ts +4 -3
  114. package/dist/lifecycle/plan-digest.d.ts.map +1 -1
  115. package/dist/lifecycle/release-ledger.d.ts +42 -1
  116. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  117. package/dist/lifecycle/status.d.ts +90 -5
  118. package/dist/lifecycle/status.d.ts.map +1 -1
  119. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts +2 -3
  120. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts.map +1 -1
  121. package/dist/op/activities/activity-contracts.d.ts +32 -0
  122. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  123. package/dist/op/activities/index.d.ts +2 -0
  124. package/dist/op/activities/index.d.ts.map +1 -1
  125. package/dist/op/activities/propose-upgrade.d.ts +75 -0
  126. package/dist/op/activities/propose-upgrade.d.ts.map +1 -0
  127. package/dist/op/activity-contract-registry.d.ts.map +1 -1
  128. package/dist/op/activity-registry.d.ts.map +1 -1
  129. package/dist/op/discover.d.ts.map +1 -1
  130. package/dist/op/gate-approval.d.ts.map +1 -1
  131. package/dist/op/gate-name.d.ts +7 -0
  132. package/dist/op/gate-name.d.ts.map +1 -1
  133. package/dist/op/gate-summary.d.ts +16 -0
  134. package/dist/op/gate-summary.d.ts.map +1 -1
  135. package/dist/op/gate.d.ts +16 -2
  136. package/dist/op/gate.d.ts.map +1 -1
  137. package/dist/op/generate-pipeline.d.ts.map +1 -1
  138. package/dist/op/runtimes/local.d.ts.map +1 -1
  139. package/dist/project-root.d.ts +26 -0
  140. package/dist/project-root.d.ts.map +1 -1
  141. package/dist/workspace/__fixtures__/contract-repo.d.ts +37 -0
  142. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -0
  143. package/dist/workspace/__fixtures__/two-member-workspace.d.ts +11 -0
  144. package/dist/workspace/__fixtures__/two-member-workspace.d.ts.map +1 -0
  145. package/dist/workspace/checks/generated.d.ts +156 -0
  146. package/dist/workspace/checks/generated.d.ts.map +1 -0
  147. package/dist/workspace/checks/ledgers.d.ts +78 -0
  148. package/dist/workspace/checks/ledgers.d.ts.map +1 -0
  149. package/dist/workspace/checks/links.d.ts +25 -0
  150. package/dist/workspace/checks/links.d.ts.map +1 -0
  151. package/dist/workspace/checks/pipelines.d.ts +76 -0
  152. package/dist/workspace/checks/pipelines.d.ts.map +1 -0
  153. package/dist/workspace/checks.d.ts +161 -0
  154. package/dist/workspace/checks.d.ts.map +1 -0
  155. package/dist/workspace/compose-graph.d.ts +115 -0
  156. package/dist/workspace/compose-graph.d.ts.map +1 -0
  157. package/dist/workspace/compose-reports.d.ts +68 -0
  158. package/dist/workspace/compose-reports.d.ts.map +1 -0
  159. package/dist/workspace/declaration.d.ts +220 -0
  160. package/dist/workspace/declaration.d.ts.map +1 -0
  161. package/dist/workspace/declaration.schema.json +434 -0
  162. package/dist/workspace/generated-files.d.ts +65 -0
  163. package/dist/workspace/generated-files.d.ts.map +1 -0
  164. package/dist/workspace/glob.d.ts +13 -0
  165. package/dist/workspace/glob.d.ts.map +1 -0
  166. package/dist/workspace/graph-cli.d.ts +75 -0
  167. package/dist/workspace/graph-cli.d.ts.map +1 -0
  168. package/dist/workspace/init.d.ts +96 -0
  169. package/dist/workspace/init.d.ts.map +1 -0
  170. package/dist/workspace/jsonc.d.ts +38 -0
  171. package/dist/workspace/jsonc.d.ts.map +1 -0
  172. package/dist/workspace/kinds.d.ts +192 -0
  173. package/dist/workspace/kinds.d.ts.map +1 -0
  174. package/dist/workspace/lineage-check.d.ts +84 -0
  175. package/dist/workspace/lineage-check.d.ts.map +1 -0
  176. package/dist/workspace/lineage-cli.d.ts +31 -0
  177. package/dist/workspace/lineage-cli.d.ts.map +1 -0
  178. package/dist/workspace/lineage-init.d.ts +101 -0
  179. package/dist/workspace/lineage-init.d.ts.map +1 -0
  180. package/dist/workspace/lineage-lock.d.ts +258 -0
  181. package/dist/workspace/lineage-lock.d.ts.map +1 -0
  182. package/dist/workspace/lineage-merge.d.ts +14 -0
  183. package/dist/workspace/lineage-merge.d.ts.map +1 -0
  184. package/dist/workspace/lineage-migrations.d.ts +178 -0
  185. package/dist/workspace/lineage-migrations.d.ts.map +1 -0
  186. package/dist/workspace/lineage-update.d.ts +59 -0
  187. package/dist/workspace/lineage-update.d.ts.map +1 -0
  188. package/dist/workspace/lineage-upgrade-cli.d.ts +40 -0
  189. package/dist/workspace/lineage-upgrade-cli.d.ts.map +1 -0
  190. package/dist/workspace/lineage-upgrade.d.ts +146 -0
  191. package/dist/workspace/lineage-upgrade.d.ts.map +1 -0
  192. package/dist/workspace/lineage-vendor.d.ts +63 -0
  193. package/dist/workspace/lineage-vendor.d.ts.map +1 -0
  194. package/dist/workspace/lineage-version.d.ts +32 -0
  195. package/dist/workspace/lineage-version.d.ts.map +1 -0
  196. package/dist/workspace/links.d.ts +150 -0
  197. package/dist/workspace/links.d.ts.map +1 -0
  198. package/dist/workspace/ls.d.ts +99 -0
  199. package/dist/workspace/ls.d.ts.map +1 -0
  200. package/dist/workspace/member-commands.d.ts +139 -0
  201. package/dist/workspace/member-commands.d.ts.map +1 -0
  202. package/dist/workspace/member-handles.d.ts +54 -0
  203. package/dist/workspace/member-handles.d.ts.map +1 -0
  204. package/dist/workspace/member-pipeline.d.ts +143 -0
  205. package/dist/workspace/member-pipeline.d.ts.map +1 -0
  206. package/dist/workspace/member-run.d.ts +67 -0
  207. package/dist/workspace/member-run.d.ts.map +1 -0
  208. package/dist/workspace/reason-codes.d.ts +65 -0
  209. package/dist/workspace/reason-codes.d.ts.map +1 -0
  210. package/dist/workspace/record-source.d.ts +22 -0
  211. package/dist/workspace/record-source.d.ts.map +1 -0
  212. package/dist/workspace/records-cli.d.ts +81 -0
  213. package/dist/workspace/records-cli.d.ts.map +1 -0
  214. package/dist/workspace/records.d.ts +118 -0
  215. package/dist/workspace/records.d.ts.map +1 -0
  216. package/dist/workspace/root-refusal.d.ts +53 -0
  217. package/dist/workspace/root-refusal.d.ts.map +1 -0
  218. package/dist/workspace/status.d.ts +150 -0
  219. package/dist/workspace/status.d.ts.map +1 -0
  220. package/dist/workspace/template-manifest.d.ts +90 -0
  221. package/dist/workspace/template-manifest.d.ts.map +1 -0
  222. package/dist/workspace/tree.d.ts +36 -0
  223. package/dist/workspace/tree.d.ts.map +1 -0
  224. package/dist/workspace/trust/attestor.d.ts +67 -0
  225. package/dist/workspace/trust/attestor.d.ts.map +1 -0
  226. package/dist/workspace/trust/policy.d.ts +111 -0
  227. package/dist/workspace/trust/policy.d.ts.map +1 -0
  228. package/dist/workspace/trust/provenance.d.ts +67 -0
  229. package/dist/workspace/trust/provenance.d.ts.map +1 -0
  230. package/dist/workspace/trust/ssh-commit.d.ts +43 -0
  231. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -0
  232. package/dist/workspace/trust/test-repo.d.ts +42 -0
  233. package/dist/workspace/trust/test-repo.d.ts.map +1 -0
  234. package/dist/workspace/trust/verify-cli.d.ts +9 -0
  235. package/dist/workspace/trust/verify-cli.d.ts.map +1 -0
  236. package/dist/workspace/trust/verify.d.ts +66 -0
  237. package/dist/workspace/trust/verify.d.ts.map +1 -0
  238. package/dist/workspace/which-chant.d.ts +58 -0
  239. package/dist/workspace/which-chant.d.ts.map +1 -0
  240. package/dist/workspace/workspace-kinds.schema.json +133 -0
  241. package/package.json +4 -3
  242. package/src/audit/core.ts +13 -2
  243. package/src/audit/discover.ts +102 -36
  244. package/src/audit/report-html.ts +3 -1
  245. package/src/audit/report-model.ts +14 -1
  246. package/src/audit/terraform-state.test.ts +81 -1
  247. package/src/audit/terraform-state.ts +25 -0
  248. package/src/cli/command-group.ts +7 -0
  249. package/src/cli/commands/audit-truncation.test.ts +167 -0
  250. package/src/cli/commands/audit.ts +132 -29
  251. package/src/cli/commands/check-lexicon-examples.ts +2 -1
  252. package/src/cli/commands/check-lexicon.ts +24 -0
  253. package/src/cli/commands/doctor.test.ts +30 -0
  254. package/src/cli/commands/doctor.ts +21 -0
  255. package/src/cli/commands/import-agents.ts +15 -4
  256. package/src/cli/commands/init.ts +76 -25
  257. package/src/cli/commands/lint.test.ts +52 -1
  258. package/src/cli/commands/lint.ts +41 -71
  259. package/src/cli/commands/onboard.ts +15 -0
  260. package/src/cli/commands/update.ts +18 -5
  261. package/src/cli/commands/vendor.ts +11 -6
  262. package/src/cli/conflict-check.test.ts +18 -1
  263. package/src/cli/conflict-check.ts +13 -0
  264. package/src/cli/discovery-skip.test.ts +168 -0
  265. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +38 -0
  266. package/src/cli/handlers/build-member.test.ts +127 -0
  267. package/src/cli/handlers/build.test.ts +11 -0
  268. package/src/cli/handlers/build.ts +35 -1
  269. package/src/cli/handlers/components.test.ts +127 -0
  270. package/src/cli/handlers/components.ts +70 -8
  271. package/src/cli/handlers/dev.ts +6 -1
  272. package/src/cli/handlers/fan-out.ts +9 -2
  273. package/src/cli/handlers/graph.test.ts +20 -0
  274. package/src/cli/handlers/graph.ts +4 -2
  275. package/src/cli/handlers/init.ts +54 -1
  276. package/src/cli/handlers/lifecycle.ts +2 -1
  277. package/src/cli/handlers/misc.ts +16 -0
  278. package/src/cli/handlers/operator.test.ts +68 -0
  279. package/src/cli/handlers/operator.ts +39 -10
  280. package/src/cli/handlers/promote.test.ts +377 -0
  281. package/src/cli/handlers/promote.ts +391 -0
  282. package/src/cli/handlers/run-generate-member.test.ts +83 -0
  283. package/src/cli/handlers/run-generate.test.ts +158 -0
  284. package/src/cli/handlers/run-generate.ts +168 -0
  285. package/src/cli/handlers/run.test.ts +47 -0
  286. package/src/cli/handlers/run.ts +41 -6
  287. package/src/cli/handlers/vendor.ts +147 -43
  288. package/src/cli/main.test.ts +137 -1
  289. package/src/cli/main.ts +290 -24
  290. package/src/cli/mcp/op-tools.ts +2 -1
  291. package/src/cli/path-lexicon-messages.test.ts +152 -0
  292. package/src/cli/plugins.ts +43 -5
  293. package/src/cli/registry.ts +46 -1
  294. package/src/cli/static-config-read.test.ts +208 -0
  295. package/src/codegen/fetch.test.ts +63 -1
  296. package/src/codegen/fetch.ts +30 -1
  297. package/src/components/__fixtures__/alb-ecs-service.json +0 -8
  298. package/src/components/capability-plugin-loader.ts +3 -1
  299. package/src/components/cli-support.ts +9 -3
  300. package/src/components/discover.test.ts +27 -57
  301. package/src/components/discover.ts +20 -51
  302. package/src/components/driver.test.ts +90 -12
  303. package/src/components/driver.ts +43 -5
  304. package/src/components/fan-out-support.ts +2 -1
  305. package/src/components/gate-plan.ts +53 -0
  306. package/src/components/pilots/README.md +1 -1
  307. package/src/components/pilots/alb-ecs.pilot.ts +7 -7
  308. package/src/components/presets/ecs-fargate.ts +10 -5
  309. package/src/components/promote.test.ts +645 -0
  310. package/src/components/promote.ts +641 -0
  311. package/src/components/sandbox/driver.ts +8 -8
  312. package/src/components/sandbox/run.ts +4 -1
  313. package/src/components/verbs/build-archive.ts +27 -21
  314. package/src/components/verbs/run-agent.ts +3 -5
  315. package/src/config-static.test.ts +136 -0
  316. package/src/config-static.ts +232 -0
  317. package/src/config.test.ts +40 -0
  318. package/src/config.ts +161 -11
  319. package/src/content-digest.test.ts +120 -0
  320. package/src/content-digest.ts +21 -0
  321. package/src/discovery/files.test.ts +127 -1
  322. package/src/discovery/files.ts +91 -59
  323. package/src/discovery/fold-import.ts +127 -9
  324. package/src/discovery/index.ts +1 -0
  325. package/src/discovery/sandbox/driver.ts +73 -35
  326. package/src/discovery/sandbox/fork-diagnostic.test.ts +136 -13
  327. package/src/discovery/sandbox/fork.ts +83 -43
  328. package/src/discovery/sandbox/path-lexicon-multifile.test.ts +285 -0
  329. package/src/discovery/sandbox/path-lexicon-parity.test.ts +162 -0
  330. package/src/discovery/walk.test.ts +263 -0
  331. package/src/discovery/walk.ts +334 -0
  332. package/src/effect-receipt.ts +2 -2
  333. package/src/graph-ir.ts +18 -1
  334. package/src/join-key.test.ts +25 -0
  335. package/src/join-key.ts +39 -0
  336. package/src/lexicon-module.test.ts +203 -0
  337. package/src/lexicon-module.ts +215 -0
  338. package/src/lexicon.ts +105 -1
  339. package/src/lifecycle/build-ledger-store.ts +13 -2
  340. package/src/lifecycle/digest.ts +9 -5
  341. package/src/lifecycle/gate-ledger.test.ts +20 -0
  342. package/src/lifecycle/gate-ledger.ts +28 -6
  343. package/src/lifecycle/git.test.ts +13 -1
  344. package/src/lifecycle/git.ts +221 -176
  345. package/src/lifecycle/lease.ts +25 -10
  346. package/src/lifecycle/legacy-digest.test.ts +206 -0
  347. package/src/lifecycle/legacy-digest.ts +103 -0
  348. package/src/lifecycle/member-ledger.test.ts +319 -0
  349. package/src/lifecycle/member-ledger.ts +145 -0
  350. package/src/lifecycle/plan-digest.ts +7 -7
  351. package/src/lifecycle/release-ledger.test.ts +20 -0
  352. package/src/lifecycle/release-ledger.ts +53 -3
  353. package/src/lifecycle/status.test.ts +151 -1
  354. package/src/lifecycle/status.ts +228 -7
  355. package/src/lint/rules/comp/comp003-mutating-no-rollback.ts +2 -3
  356. package/src/op/activities/activity-contracts.ts +37 -0
  357. package/src/op/activities/index.ts +10 -0
  358. package/src/op/activities/propose-upgrade.ts +206 -0
  359. package/src/op/activity-contract-registry.ts +18 -4
  360. package/src/op/activity-registry.ts +26 -0
  361. package/src/op/discover.test.ts +14 -4
  362. package/src/op/discover.ts +19 -23
  363. package/src/op/gate-approval.ts +3 -1
  364. package/src/op/gate-name.ts +8 -0
  365. package/src/op/gate-summary.test.ts +14 -0
  366. package/src/op/gate-summary.ts +25 -2
  367. package/src/op/gate.ts +36 -7
  368. package/src/op/generate-pipeline.test.ts +14 -5
  369. package/src/op/generate-pipeline.ts +2 -1
  370. package/src/op/runtimes/local.ts +2 -1
  371. package/src/project-root.test.ts +66 -1
  372. package/src/project-root.ts +48 -0
  373. package/src/workspace/__fixtures__/contract-repo.ts +100 -0
  374. package/src/workspace/__fixtures__/two-member-workspace.ts +35 -0
  375. package/src/workspace/behold-kinds.test.ts +162 -0
  376. package/src/workspace/check-contract.test.ts +127 -0
  377. package/src/workspace/check.schema.json +347 -0
  378. package/src/workspace/checks/generated.test.ts +287 -0
  379. package/src/workspace/checks/generated.ts +475 -0
  380. package/src/workspace/checks/ledgers.test.ts +139 -0
  381. package/src/workspace/checks/ledgers.ts +246 -0
  382. package/src/workspace/checks/links.ts +183 -0
  383. package/src/workspace/checks/pipelines.test.ts +133 -0
  384. package/src/workspace/checks/pipelines.ts +225 -0
  385. package/src/workspace/checks-repo.test.ts +71 -0
  386. package/src/workspace/checks.test.ts +450 -0
  387. package/src/workspace/checks.ts +461 -0
  388. package/src/workspace/compose-graph.test.ts +146 -0
  389. package/src/workspace/compose-graph.ts +228 -0
  390. package/src/workspace/compose-reports.test.ts +109 -0
  391. package/src/workspace/compose-reports.ts +186 -0
  392. package/src/workspace/declaration.schema.json +434 -0
  393. package/src/workspace/declaration.test.ts +347 -0
  394. package/src/workspace/declaration.ts +623 -0
  395. package/src/workspace/generated-files.test.ts +114 -0
  396. package/src/workspace/generated-files.ts +94 -0
  397. package/src/workspace/glob.ts +49 -0
  398. package/src/workspace/graph-cli.ts +220 -0
  399. package/src/workspace/graph-contract.test.ts +204 -0
  400. package/src/workspace/graph.schema.json +662 -0
  401. package/src/workspace/init.test.ts +223 -0
  402. package/src/workspace/init.ts +585 -0
  403. package/src/workspace/jsonc.test.ts +65 -0
  404. package/src/workspace/jsonc.ts +231 -0
  405. package/src/workspace/kinds.test.ts +288 -0
  406. package/src/workspace/kinds.ts +506 -0
  407. package/src/workspace/lineage-check.ts +264 -0
  408. package/src/workspace/lineage-cli.ts +114 -0
  409. package/src/workspace/lineage-init.test.ts +231 -0
  410. package/src/workspace/lineage-init.ts +365 -0
  411. package/src/workspace/lineage-lock.test.ts +224 -0
  412. package/src/workspace/lineage-lock.ts +357 -0
  413. package/src/workspace/lineage-merge.ts +44 -0
  414. package/src/workspace/lineage-migrations.test.ts +178 -0
  415. package/src/workspace/lineage-migrations.ts +343 -0
  416. package/src/workspace/lineage-update.ts +160 -0
  417. package/src/workspace/lineage-upgrade-cli.ts +151 -0
  418. package/src/workspace/lineage-upgrade.test.ts +474 -0
  419. package/src/workspace/lineage-upgrade.ts +624 -0
  420. package/src/workspace/lineage-vendor.test.ts +126 -0
  421. package/src/workspace/lineage-vendor.ts +215 -0
  422. package/src/workspace/lineage-version.ts +127 -0
  423. package/src/workspace/links.test.ts +344 -0
  424. package/src/workspace/links.ts +331 -0
  425. package/src/workspace/ls-contract.test.ts +200 -0
  426. package/src/workspace/ls.schema.json +190 -0
  427. package/src/workspace/ls.ts +254 -0
  428. package/src/workspace/member-commands.e2e.test.ts +244 -0
  429. package/src/workspace/member-commands.test.ts +217 -0
  430. package/src/workspace/member-commands.ts +540 -0
  431. package/src/workspace/member-handles.test.ts +76 -0
  432. package/src/workspace/member-handles.ts +228 -0
  433. package/src/workspace/member-pipeline.test.ts +135 -0
  434. package/src/workspace/member-pipeline.ts +317 -0
  435. package/src/workspace/member-run.ts +146 -0
  436. package/src/workspace/read-contract.test.ts +129 -0
  437. package/src/workspace/reason-codes.test.ts +113 -0
  438. package/src/workspace/reason-codes.ts +81 -0
  439. package/src/workspace/record-source.ts +117 -0
  440. package/src/workspace/records-cli.ts +198 -0
  441. package/src/workspace/records-contract.test.ts +93 -0
  442. package/src/workspace/records.schema.json +150 -0
  443. package/src/workspace/records.test.ts +243 -0
  444. package/src/workspace/records.ts +384 -0
  445. package/src/workspace/root-refusal.ts +97 -0
  446. package/src/workspace/status-contract.test.ts +308 -0
  447. package/src/workspace/status.schema.json +210 -0
  448. package/src/workspace/status.ts +412 -0
  449. package/src/workspace/template-manifest.test.ts +79 -0
  450. package/src/workspace/template-manifest.ts +221 -0
  451. package/src/workspace/tree.ts +132 -0
  452. package/src/workspace/trust/attestor.ts +93 -0
  453. package/src/workspace/trust/policy.ts +306 -0
  454. package/src/workspace/trust/provenance.ts +181 -0
  455. package/src/workspace/trust/ssh-commit.ts +138 -0
  456. package/src/workspace/trust/test-repo.ts +138 -0
  457. package/src/workspace/trust/trust.test.ts +397 -0
  458. package/src/workspace/trust/verify-cli.ts +56 -0
  459. package/src/workspace/trust/verify.ts +194 -0
  460. package/src/workspace/which-chant.test.ts +117 -0
  461. package/src/workspace/which-chant.ts +151 -0
  462. package/src/workspace/workspace-kinds.schema.json +133 -0
@@ -1,9 +1,11 @@
1
- import { formatError } from "../format";
1
+ import { formatError, formatSuccess, formatWarning } from "../format";
2
2
  import type { CommandContext } from "../registry";
3
3
 
4
4
  export async function runInit(ctx: CommandContext): Promise<number> {
5
5
  const { args } = ctx;
6
6
 
7
+ if (args.migrateFrom !== undefined) return runInitFrom(ctx);
8
+
7
9
  if (!args.lexicon) {
8
10
  console.error(formatError({
9
11
  message: "Missing --lexicon flag",
@@ -47,3 +49,54 @@ export async function runInitLexicon(ctx: CommandContext): Promise<number> {
47
49
  await printInitLexiconResult(result);
48
50
  return result.success ? 0 : 1;
49
51
  }
52
+
53
+ /**
54
+ * `chant init --from <repo>@<ref>[#<member>] [--param <name>=<value>]... [path]`
55
+ * (#2540, #2627): copy a template repository at a ref, substitute the
56
+ * parameters its `chant.template.json` declares, and record its lineage.
57
+ * The template brings its own lexicons and configuration, so `--lexicon` and
58
+ * `--template` do not apply.
59
+ */
60
+ async function runInitFrom(ctx: CommandContext): Promise<number> {
61
+ const { args } = ctx;
62
+ const usage = "Usage: chant init --from <repo>@<ref>[#<member>] [--param <name>=<value>]... [path]";
63
+ if (!args.migrateFrom) {
64
+ console.error(formatError({ message: "--from needs a template: <repo>@<ref>[#<member>]", hint: usage }));
65
+ return 1;
66
+ }
67
+ if (args.lexicon || args.template) {
68
+ console.error(formatError({ message: "--from cannot be combined with --lexicon or --template", hint: usage }));
69
+ return 1;
70
+ }
71
+ if (args.paramsFile) {
72
+ console.error(formatError({ message: "--params-file does not apply to init --from; pass each value with --param <name>=<value>", hint: usage }));
73
+ return 1;
74
+ }
75
+ const { parseParamArgs } = await import("../../workspace/template-manifest");
76
+ let params: Record<string, string>;
77
+ try {
78
+ params = parseParamArgs(args.param ?? []);
79
+ } catch (err) {
80
+ console.error(formatError({ message: (err as Error).message, hint: usage }));
81
+ return 1;
82
+ }
83
+ const { initFromCommand } = await import("../../workspace/lineage-init");
84
+ const result = await initFromCommand({
85
+ from: args.migrateFrom,
86
+ path: args.path === "." ? undefined : args.path,
87
+ force: args.force,
88
+ params,
89
+ });
90
+ if (!result.success) {
91
+ console.error(formatError({ message: result.error ?? "init --from failed", hint: usage }));
92
+ return 1;
93
+ }
94
+ for (const warning of result.warnings) console.error(formatWarning({ message: warning }));
95
+ console.log(formatSuccess("Created:"));
96
+ for (const file of result.createdFiles) console.log(` ${file}`);
97
+ console.log("");
98
+ console.log(`Lineage: ${result.spec!.id} at ${result.spec!.ref} (${result.commit!.slice(0, 12)}), recorded in .chant/workspace.lock.json`);
99
+ const parameters = Object.entries(result.parameters ?? {});
100
+ if (parameters.length > 0) console.log(`Parameters: ${parameters.map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(", ")}`);
101
+ return 0;
102
+ }
@@ -1,3 +1,4 @@
1
+ import { lexiconNames } from "../../lexicon-module";
1
2
  import { resolve } from "node:path";
2
3
  import { commandBuildParams } from "../build-params-cli";
3
4
  import { build } from "../../build";
@@ -559,7 +560,7 @@ interface BetweenDiffArgs {
559
560
  async function runLifecycleDiffBetween(args: BetweenDiffArgs): Promise<number> {
560
561
  await fetchLifecycle();
561
562
  const { config } = await loadChantConfig(resolve("."));
562
- const lexicons = args.lexiconFilter ? [args.lexiconFilter] : config.lexicons ?? [];
563
+ const lexicons = args.lexiconFilter ? [args.lexiconFilter] : lexiconNames(config.lexicons ?? []);
563
564
  if (lexicons.length === 0) {
564
565
  console.error(formatError({ message: "No lexicons to diff — pass a lexicon or declare `lexicons` in chant.config." }));
565
566
  return 1;
@@ -114,6 +114,21 @@ export async function runAudit(ctx: CommandContext): Promise<number> {
114
114
  return result.exitCode;
115
115
  }
116
116
 
117
+ // `--max-files` (#2528) only means something to the local walk. A URL audit
118
+ // fetches through the host's tree API with its own caps, so the flag is
119
+ // refused there rather than silently ignored.
120
+ const maxFiles = args.maxFiles;
121
+ if (maxFiles !== undefined) {
122
+ if (!Number.isInteger(maxFiles) || maxFiles < 1) {
123
+ console.error(formatError({ message: `--max-files must be a positive integer (got "${maxFiles}")` }));
124
+ return 1;
125
+ }
126
+ if (/^https?:\/\//.test(args.path)) {
127
+ console.error(formatError({ message: "--max-files applies to a local path; a repository URL is fetched with its own limits." }));
128
+ return 1;
129
+ }
130
+ }
131
+
117
132
  // HTML report customization: --template <file> (full override) + --theme <file> (JSON knobs).
118
133
  let template: string | undefined;
119
134
  let theme: ReportTheme | undefined;
@@ -146,6 +161,7 @@ export async function runAudit(ctx: CommandContext): Promise<number> {
146
161
  template,
147
162
  theme,
148
163
  toolVersion: CHANT_VERSION,
164
+ maxFiles,
149
165
  });
150
166
  printAuditResult(result);
151
167
  return result.exitCode;
@@ -897,6 +897,74 @@ describe("runApprove — the resolution names the plan it approves (#2300)", ()
897
897
  });
898
898
  });
899
899
 
900
+ /**
901
+ * #2574 — a component's gate ledger holds every environment's pending facts.
902
+ * The approval records the environment it answers, and `--env` picks it.
903
+ */
904
+ describe("runApprove — a component gate approval names its environment (#2574)", () => {
905
+ const PLAN_STAGING = `sha256:${"c".repeat(64)}`;
906
+ const PLAN_PROD = `sha256:${"d".repeat(64)}`;
907
+ function seedTwoEnvironments(): void {
908
+ readGateLedgerMock.mockResolvedValue({
909
+ resolutions: [],
910
+ pending: [
911
+ {
912
+ version: 1, kind: "pending", op: "search-service", gate: "release",
913
+ timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
914
+ planDigest: PLAN_STAGING, environment: "staging",
915
+ },
916
+ {
917
+ version: 1, kind: "pending", op: "search-service", gate: "release",
918
+ timestamp: "2026-01-02T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
919
+ planDigest: PLAN_PROD, environment: "prod",
920
+ },
921
+ ],
922
+ malformed: 0,
923
+ });
924
+ appendGateResolutionMock.mockImplementation(async (input: object) => ({ commit: "sha", record: { version: 1, ...input } }));
925
+ }
926
+
927
+ test("without --env it approves the newest pending fact and records its environment", async () => {
928
+ seedTwoEnvironments();
929
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
930
+
931
+ expect(await runApprove(ctx({ path: "search-service", extraPositional: "release", actor: "alex" }))).toBe(0);
932
+ expect(appendGateResolutionMock).toHaveBeenCalledWith(expect.objectContaining({ planDigest: PLAN_PROD, environment: "prod" }));
933
+ expect(errSpy.mock.calls.map((c) => String(c[0])).join("\n")).toContain(`approves the plan ${PLAN_PROD} in environment "prod"`);
934
+ errSpy.mockRestore();
935
+ });
936
+
937
+ test("--env picks that environment's pending fact", async () => {
938
+ seedTwoEnvironments();
939
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
940
+
941
+ expect(await runApprove(ctx({ path: "search-service", extraPositional: "release", actor: "alex", env: "staging" }))).toBe(0);
942
+ expect(appendGateResolutionMock).toHaveBeenCalledWith(expect.objectContaining({ planDigest: PLAN_STAGING, environment: "staging" }));
943
+ errSpy.mockRestore();
944
+ });
945
+
946
+ test("--env with no pending fact there refuses and writes nothing", async () => {
947
+ seedTwoEnvironments();
948
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
949
+
950
+ expect(await runApprove(ctx({ path: "search-service", extraPositional: "release", actor: "alex", env: "dev" }))).toBe(1);
951
+ expect(appendGateResolutionMock).not.toHaveBeenCalled();
952
+ expect(errSpy.mock.calls.map((c) => String(c[0])).join("\n")).toContain('no pending fact in environment "dev"');
953
+ errSpy.mockRestore();
954
+ });
955
+
956
+ test("--env is ignored for a gate whose pending facts record no environment", async () => {
957
+ seedPending("fountain-apply", "rollout-gate", PLAN_A);
958
+ appendGateResolutionMock.mockImplementation(async (input: object) => ({ commit: "sha", record: { version: 1, ...input } }));
959
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
960
+
961
+ expect(await runApprove(ctx({ path: "fountain-apply", extraPositional: "rollout-gate", actor: "alex", env: "prod" }))).toBe(0);
962
+ expect(appendGateResolutionMock.mock.calls[0][0]).toMatchObject({ planDigest: PLAN_A });
963
+ expect(appendGateResolutionMock.mock.calls[0][0]).not.toHaveProperty("environment");
964
+ errSpy.mockRestore();
965
+ });
966
+ });
967
+
900
968
  describe("runApprove — the ledger branch is read before it is appended to (#2303)", () => {
901
969
  test("reads the branch before recording the resolution", async () => {
902
970
  seedPending("fountain-apply", "rollout-gate", PLAN_A);
@@ -6,6 +6,7 @@
6
6
  * `run.ts`'s `runOpLocal` shape (SIGINT → AbortController, `loadActivities`/
7
7
  * `loadProfiles` from the project's configured lexicons).
8
8
  */
9
+ import { lexiconNames } from "../../lexicon-module";
9
10
  import { loadChantConfig } from "../../config";
10
11
  import { build } from "../../build";
11
12
  import { isResourceDeclarable } from "../../declarable";
@@ -43,7 +44,7 @@ import {
43
44
  type GateApprover, type GatePolicyDecision, type GatePolicyEvaluator, type ResolvedGateApproval,
44
45
  } from "../../op/gate-approval";
45
46
  import { approverOf, tallyGateApprovals } from "../../op/gate";
46
- import { FAN_OUT_GATE_OP } from "../../op/gate-name";
47
+ import { FAN_OUT_GATE_OP, WORKSPACE_UPGRADE_GATE_OP } from "../../op/gate-name";
47
48
  import { pushLifecycle, requireLifecycleLedger } from "../../lifecycle/git";
48
49
  import { formatError, formatWarning, formatSuccess, formatBold, formatInfo } from "../format";
49
50
  import type { CommandContext } from "../registry";
@@ -52,7 +53,7 @@ import type { CommandContext } from "../registry";
52
53
  async function loadOperatorActivities() {
53
54
  let lexicons: string[] = [];
54
55
  try {
55
- lexicons = (await loadChantConfig(process.cwd())).config.lexicons ?? [];
56
+ lexicons = lexiconNames((await loadChantConfig(process.cwd())).config.lexicons ?? []);
56
57
  } catch {
57
58
  // No/invalid chant.config — fall back to base activities only.
58
59
  }
@@ -688,7 +689,9 @@ export async function runApprove(ctx: CommandContext): Promise<number> {
688
689
  console.error(formatInfo(
689
690
  opName === FAN_OUT_GATE_OP
690
691
  ? `The next \`chant components fan-out\` decides this gate from scratch and records a fresh pending fact.`
691
- : `The next \`chant run ${opName}\` decides this gate from scratch and records a fresh pending fact.`,
692
+ : opName === WORKSPACE_UPGRADE_GATE_OP
693
+ ? `The next \`chant workspace upgrade ${gate}\` decides this gate from scratch and records a fresh pending fact.`
694
+ : `The next \`chant run ${opName}\` decides this gate from scratch and records a fresh pending fact.`,
692
695
  ));
693
696
  return 0;
694
697
  }
@@ -702,6 +705,7 @@ export async function runApprove(ctx: CommandContext): Promise<number> {
702
705
  note: ctx.args.note,
703
706
  url: ctx.args.url,
704
707
  plan: ctx.args.plan,
708
+ ...(ctx.args.env !== undefined ? { environment: ctx.args.env } : {}),
705
709
  allowSameOrigin: ctx.args.allowSameOrigin,
706
710
  ...(ctx.args.roles ? { roles: ctx.args.roles } : {}),
707
711
  ...(ctx.args.agent ? { agent: true } : {}),
@@ -712,7 +716,9 @@ export async function runApprove(ctx: CommandContext): Promise<number> {
712
716
  `This records the resolution as a fact; it does not itself re-run anything. ` +
713
717
  (opName === FAN_OUT_GATE_OP
714
718
  ? `Repeat the \`chant components fan-out\` command and it walks through gate "${gate}".`
715
- : `Run \`chant run ${opName}\` and it walks through gate "${gate}".`),
719
+ : opName === WORKSPACE_UPGRADE_GATE_OP
720
+ ? `Repeat \`chant workspace upgrade ${gate}\` with the same target, and it applies the patch this approval names.`
721
+ : `Run \`chant run ${opName}\` and it walks through gate "${gate}".`),
716
722
  ));
717
723
  return 0;
718
724
  }
@@ -746,6 +752,13 @@ export interface GateApprovalOptions {
746
752
  * stays one command: run, read what it planned, approve it.
747
753
  */
748
754
  plan?: string;
755
+ /**
756
+ * `--env <env>` (#2574) — which environment's pending fact a component gate
757
+ * approval answers. A component's gate ledger holds every environment's
758
+ * facts, so without it the newest one is approved. Ignored for a gate whose
759
+ * pending facts record no environment (every Op gate).
760
+ */
761
+ environment?: string;
749
762
  /** `--role` (#2508) — roles the approver claims. */
750
763
  roles?: string[];
751
764
  /**
@@ -785,7 +798,7 @@ export async function recordGateApproval(
785
798
  // `fan-out` is the op name every `chant components fan-out` gate is recorded
786
799
  // under (../handlers/fan-out.ts). It is a command rather than a declaration,
787
800
  // so there is no `*.op.ts` to find and nothing is wrong when none is there.
788
- if (!ops.has(opName) && opName !== FAN_OUT_GATE_OP) {
801
+ if (!ops.has(opName) && opName !== FAN_OUT_GATE_OP && opName !== WORKSPACE_UPGRADE_GATE_OP) {
789
802
  console.error(formatWarning({
790
803
  message: `Op "${opName}" was not found among discovered *.op.ts declarations — recording the resolution anyway`,
791
804
  }));
@@ -825,6 +838,18 @@ export async function recordGateApproval(
825
838
  // third fallback: approving with no plan in sight is the behaviour
826
839
  // INTENTIUS/choudoufu#1026 measured, where the resolution authorised the
827
840
  // next run rather than anything anyone had seen.
841
+ // #2574: a component gate's pending facts carry the environment they were
842
+ // recorded in, and an approval answers one environment. `--env` picks it;
843
+ // without it, the newest standing fact decides, and the success line below
844
+ // names the environment it chose.
845
+ const ledgerBefore = await readGateLedger(opName);
846
+ const pendingFor = (all: PendingGateRecord[]): PendingGateRecord[] => {
847
+ const bound = all.some((p) => p.gate === gate && p.environment !== undefined);
848
+ return bound && opts.environment !== undefined ? all.filter((p) => p.environment === opts.environment) : all;
849
+ };
850
+ const standing = latestPendingGate(pendingFor(ledgerBefore.pending), gate);
851
+ const environment = standing?.environment;
852
+
828
853
  let planDigest: string | undefined;
829
854
  if (opts.plan !== undefined) {
830
855
  if (!isPlanDigest(opts.plan)) {
@@ -836,10 +861,12 @@ export async function recordGateApproval(
836
861
  }
837
862
  planDigest = opts.plan;
838
863
  } else {
839
- const standing = latestPendingGate((await readGateLedger(opName)).pending, gate);
840
864
  if (!standing) {
841
865
  console.error(formatError({
842
- message: `Gate "${gate}" on "${opName}" has no pending fact, so there is no plan to approve`,
866
+ message:
867
+ opts.environment !== undefined && ledgerBefore.pending.some((p) => p.gate === gate && p.environment !== undefined)
868
+ ? `Gate "${gate}" on "${opName}" has no pending fact in environment "${opts.environment}", so there is no plan to approve`
869
+ : `Gate "${gate}" on "${opName}" has no pending fact, so there is no plan to approve`,
843
870
  hint:
844
871
  `Run \`chant run ${opName}\` first — it plans, stops at the gate, and records the plan this ` +
845
872
  `approval would be for. To approve a plan you already have the digest for, pass ` +
@@ -858,7 +885,7 @@ export async function recordGateApproval(
858
885
  // the way #2300 refuses a plan nobody approved.
859
886
  const origin = opts.origin ?? currentGateOrigin();
860
887
  const ledger = await readGateLedger(opName);
861
- const standingForOrigin = latestPendingGate(ledger.pending, gate);
888
+ const standingForOrigin = latestPendingGate(pendingFor(ledger.pending), gate);
862
889
  const refusal = sameOriginRefusal(standingForOrigin?.origin, origin);
863
890
  if (refusal && !opts.allowSameOrigin) {
864
891
  console.error(formatError({
@@ -934,6 +961,7 @@ export async function recordGateApproval(
934
961
  ...(opts.note ? { note: opts.note } : {}),
935
962
  ...(url ? { url } : {}),
936
963
  ...(planDigest !== undefined ? { planDigest } : {}),
964
+ ...(environment !== undefined ? { environment } : {}),
937
965
  origin,
938
966
  ...(refusal && opts.allowSameOrigin ? { sameOriginOverride: true } : {}),
939
967
  });
@@ -949,8 +977,9 @@ export async function recordGateApproval(
949
977
  ));
950
978
  if (record.planDigest) {
951
979
  console.error(formatInfo(
952
- `This approves the plan ${record.planDigest}, and only that plan. A run whose fresh plan ` +
953
- "differs refuses rather than applying it.",
980
+ `This approves the plan ${record.planDigest}` +
981
+ (record.environment !== undefined ? ` in environment "${record.environment}"` : "") +
982
+ ", and only that plan. A run whose fresh plan differs refuses rather than applying it.",
954
983
  ));
955
984
  }
956
985
  if (approval) {