@intentius/chant 0.80.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 (414) hide show
  1. package/dist/audit/discover.d.ts +8 -16
  2. package/dist/audit/discover.d.ts.map +1 -1
  3. package/dist/audit/report-html.d.ts +5 -0
  4. package/dist/audit/report-html.d.ts.map +1 -1
  5. package/dist/audit/report-model.d.ts +13 -0
  6. package/dist/audit/report-model.d.ts.map +1 -1
  7. package/dist/audit/terraform-state.d.ts +4 -5
  8. package/dist/audit/terraform-state.d.ts.map +1 -1
  9. package/dist/cli/commands/audit.d.ts +25 -9
  10. package/dist/cli/commands/audit.d.ts.map +1 -1
  11. package/dist/cli/commands/check-lexicon.d.ts +8 -0
  12. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  13. package/dist/cli/commands/doctor.d.ts.map +1 -1
  14. package/dist/cli/commands/import-agents.d.ts.map +1 -1
  15. package/dist/cli/commands/init.d.ts.map +1 -1
  16. package/dist/cli/commands/lint.d.ts.map +1 -1
  17. package/dist/cli/commands/update.d.ts +6 -0
  18. package/dist/cli/commands/update.d.ts.map +1 -1
  19. package/dist/cli/commands/vendor.d.ts +5 -0
  20. package/dist/cli/commands/vendor.d.ts.map +1 -1
  21. package/dist/cli/handlers/build.d.ts.map +1 -1
  22. package/dist/cli/handlers/components.d.ts.map +1 -1
  23. package/dist/cli/handlers/dev.d.ts.map +1 -1
  24. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  25. package/dist/cli/handlers/init.d.ts.map +1 -1
  26. package/dist/cli/handlers/operator.d.ts +7 -0
  27. package/dist/cli/handlers/operator.d.ts.map +1 -1
  28. package/dist/cli/handlers/promote.d.ts +7 -4
  29. package/dist/cli/handlers/promote.d.ts.map +1 -1
  30. package/dist/cli/handlers/run-generate.d.ts.map +1 -1
  31. package/dist/cli/handlers/run.d.ts +4 -1
  32. package/dist/cli/handlers/run.d.ts.map +1 -1
  33. package/dist/cli/handlers/vendor.d.ts +8 -3
  34. package/dist/cli/handlers/vendor.d.ts.map +1 -1
  35. package/dist/cli/main.d.ts +12 -0
  36. package/dist/cli/main.d.ts.map +1 -1
  37. package/dist/cli/plugins.d.ts +12 -7
  38. package/dist/cli/plugins.d.ts.map +1 -1
  39. package/dist/cli/registry.d.ts +32 -0
  40. package/dist/cli/registry.d.ts.map +1 -1
  41. package/dist/codegen/fetch.d.ts +10 -0
  42. package/dist/codegen/fetch.d.ts.map +1 -1
  43. package/dist/components/cli-support.d.ts +3 -1
  44. package/dist/components/cli-support.d.ts.map +1 -1
  45. package/dist/components/discover.d.ts.map +1 -1
  46. package/dist/components/driver.d.ts +16 -2
  47. package/dist/components/driver.d.ts.map +1 -1
  48. package/dist/components/gate-plan.d.ts +40 -0
  49. package/dist/components/gate-plan.d.ts.map +1 -0
  50. package/dist/components/promote.d.ts +60 -7
  51. package/dist/components/promote.d.ts.map +1 -1
  52. package/dist/components/sandbox/driver.d.ts.map +1 -1
  53. package/dist/components/sandbox/run.d.ts.map +1 -1
  54. package/dist/components/verbs/build-archive.d.ts +22 -11
  55. package/dist/components/verbs/build-archive.d.ts.map +1 -1
  56. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  57. package/dist/config-static.d.ts +59 -0
  58. package/dist/config-static.d.ts.map +1 -0
  59. package/dist/config.d.ts +32 -10
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/content-digest.d.ts +17 -0
  62. package/dist/content-digest.d.ts.map +1 -0
  63. package/dist/discovery/files.d.ts +10 -5
  64. package/dist/discovery/files.d.ts.map +1 -1
  65. package/dist/discovery/fold-import.d.ts +20 -4
  66. package/dist/discovery/fold-import.d.ts.map +1 -1
  67. package/dist/discovery/index.d.ts.map +1 -1
  68. package/dist/discovery/sandbox/driver.d.ts +20 -0
  69. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  70. package/dist/discovery/sandbox/fork.d.ts +20 -0
  71. package/dist/discovery/sandbox/fork.d.ts.map +1 -1
  72. package/dist/discovery/walk.d.ts +119 -0
  73. package/dist/discovery/walk.d.ts.map +1 -0
  74. package/dist/graph-ir.d.ts +4 -1
  75. package/dist/graph-ir.d.ts.map +1 -1
  76. package/dist/join-key.d.ts +31 -0
  77. package/dist/join-key.d.ts.map +1 -0
  78. package/dist/lexicon-module.d.ts +51 -6
  79. package/dist/lexicon-module.d.ts.map +1 -1
  80. package/dist/lexicon.d.ts +58 -1
  81. package/dist/lexicon.d.ts.map +1 -1
  82. package/dist/lifecycle/build-ledger-store.d.ts.map +1 -1
  83. package/dist/lifecycle/digest.d.ts +5 -1
  84. package/dist/lifecycle/digest.d.ts.map +1 -1
  85. package/dist/lifecycle/gate-ledger.d.ts +20 -5
  86. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  87. package/dist/lifecycle/git.d.ts +64 -0
  88. package/dist/lifecycle/git.d.ts.map +1 -1
  89. package/dist/lifecycle/lease.d.ts +8 -1
  90. package/dist/lifecycle/lease.d.ts.map +1 -1
  91. package/dist/lifecycle/legacy-digest.d.ts +41 -8
  92. package/dist/lifecycle/legacy-digest.d.ts.map +1 -1
  93. package/dist/lifecycle/member-ledger.d.ts +67 -0
  94. package/dist/lifecycle/member-ledger.d.ts.map +1 -0
  95. package/dist/lifecycle/plan-digest.d.ts +4 -3
  96. package/dist/lifecycle/plan-digest.d.ts.map +1 -1
  97. package/dist/lifecycle/release-ledger.d.ts +18 -2
  98. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  99. package/dist/lifecycle/status.d.ts +90 -5
  100. package/dist/lifecycle/status.d.ts.map +1 -1
  101. package/dist/op/activities/activity-contracts.d.ts +32 -0
  102. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  103. package/dist/op/activities/index.d.ts +2 -0
  104. package/dist/op/activities/index.d.ts.map +1 -1
  105. package/dist/op/activities/propose-upgrade.d.ts +75 -0
  106. package/dist/op/activities/propose-upgrade.d.ts.map +1 -0
  107. package/dist/op/discover.d.ts.map +1 -1
  108. package/dist/op/gate-name.d.ts +7 -0
  109. package/dist/op/gate-name.d.ts.map +1 -1
  110. package/dist/op/gate-summary.d.ts +16 -0
  111. package/dist/op/gate-summary.d.ts.map +1 -1
  112. package/dist/op/gate.d.ts +16 -2
  113. package/dist/op/gate.d.ts.map +1 -1
  114. package/dist/project-root.d.ts +26 -0
  115. package/dist/project-root.d.ts.map +1 -1
  116. package/dist/workspace/__fixtures__/contract-repo.d.ts +37 -0
  117. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -0
  118. package/dist/workspace/__fixtures__/two-member-workspace.d.ts +11 -0
  119. package/dist/workspace/__fixtures__/two-member-workspace.d.ts.map +1 -0
  120. package/dist/workspace/checks/generated.d.ts +156 -0
  121. package/dist/workspace/checks/generated.d.ts.map +1 -0
  122. package/dist/workspace/checks/ledgers.d.ts +78 -0
  123. package/dist/workspace/checks/ledgers.d.ts.map +1 -0
  124. package/dist/workspace/checks/links.d.ts +25 -0
  125. package/dist/workspace/checks/links.d.ts.map +1 -0
  126. package/dist/workspace/checks/pipelines.d.ts +76 -0
  127. package/dist/workspace/checks/pipelines.d.ts.map +1 -0
  128. package/dist/workspace/checks.d.ts +161 -0
  129. package/dist/workspace/checks.d.ts.map +1 -0
  130. package/dist/workspace/compose-graph.d.ts +115 -0
  131. package/dist/workspace/compose-graph.d.ts.map +1 -0
  132. package/dist/workspace/compose-reports.d.ts +68 -0
  133. package/dist/workspace/compose-reports.d.ts.map +1 -0
  134. package/dist/workspace/declaration.d.ts +220 -0
  135. package/dist/workspace/declaration.d.ts.map +1 -0
  136. package/dist/workspace/declaration.schema.json +434 -0
  137. package/dist/workspace/generated-files.d.ts +65 -0
  138. package/dist/workspace/generated-files.d.ts.map +1 -0
  139. package/dist/workspace/glob.d.ts +13 -0
  140. package/dist/workspace/glob.d.ts.map +1 -0
  141. package/dist/workspace/graph-cli.d.ts +75 -0
  142. package/dist/workspace/graph-cli.d.ts.map +1 -0
  143. package/dist/workspace/init.d.ts +96 -0
  144. package/dist/workspace/init.d.ts.map +1 -0
  145. package/dist/workspace/jsonc.d.ts +38 -0
  146. package/dist/workspace/jsonc.d.ts.map +1 -0
  147. package/dist/workspace/kinds.d.ts +192 -0
  148. package/dist/workspace/kinds.d.ts.map +1 -0
  149. package/dist/workspace/lineage-check.d.ts +84 -0
  150. package/dist/workspace/lineage-check.d.ts.map +1 -0
  151. package/dist/workspace/lineage-cli.d.ts +31 -0
  152. package/dist/workspace/lineage-cli.d.ts.map +1 -0
  153. package/dist/workspace/lineage-init.d.ts +101 -0
  154. package/dist/workspace/lineage-init.d.ts.map +1 -0
  155. package/dist/workspace/lineage-lock.d.ts +258 -0
  156. package/dist/workspace/lineage-lock.d.ts.map +1 -0
  157. package/dist/workspace/lineage-merge.d.ts +14 -0
  158. package/dist/workspace/lineage-merge.d.ts.map +1 -0
  159. package/dist/workspace/lineage-migrations.d.ts +178 -0
  160. package/dist/workspace/lineage-migrations.d.ts.map +1 -0
  161. package/dist/workspace/lineage-update.d.ts +59 -0
  162. package/dist/workspace/lineage-update.d.ts.map +1 -0
  163. package/dist/workspace/lineage-upgrade-cli.d.ts +40 -0
  164. package/dist/workspace/lineage-upgrade-cli.d.ts.map +1 -0
  165. package/dist/workspace/lineage-upgrade.d.ts +146 -0
  166. package/dist/workspace/lineage-upgrade.d.ts.map +1 -0
  167. package/dist/workspace/lineage-vendor.d.ts +63 -0
  168. package/dist/workspace/lineage-vendor.d.ts.map +1 -0
  169. package/dist/workspace/lineage-version.d.ts +32 -0
  170. package/dist/workspace/lineage-version.d.ts.map +1 -0
  171. package/dist/workspace/links.d.ts +150 -0
  172. package/dist/workspace/links.d.ts.map +1 -0
  173. package/dist/workspace/ls.d.ts +99 -0
  174. package/dist/workspace/ls.d.ts.map +1 -0
  175. package/dist/workspace/member-commands.d.ts +139 -0
  176. package/dist/workspace/member-commands.d.ts.map +1 -0
  177. package/dist/workspace/member-handles.d.ts +54 -0
  178. package/dist/workspace/member-handles.d.ts.map +1 -0
  179. package/dist/workspace/member-pipeline.d.ts +143 -0
  180. package/dist/workspace/member-pipeline.d.ts.map +1 -0
  181. package/dist/workspace/member-run.d.ts +67 -0
  182. package/dist/workspace/member-run.d.ts.map +1 -0
  183. package/dist/workspace/reason-codes.d.ts +65 -0
  184. package/dist/workspace/reason-codes.d.ts.map +1 -0
  185. package/dist/workspace/records-cli.d.ts +28 -4
  186. package/dist/workspace/records-cli.d.ts.map +1 -1
  187. package/dist/workspace/records.d.ts.map +1 -1
  188. package/dist/workspace/root-refusal.d.ts +53 -0
  189. package/dist/workspace/root-refusal.d.ts.map +1 -0
  190. package/dist/workspace/status.d.ts +150 -0
  191. package/dist/workspace/status.d.ts.map +1 -0
  192. package/dist/workspace/template-manifest.d.ts +90 -0
  193. package/dist/workspace/template-manifest.d.ts.map +1 -0
  194. package/dist/workspace/tree.d.ts +36 -0
  195. package/dist/workspace/tree.d.ts.map +1 -0
  196. package/dist/workspace/trust/attestor.d.ts +67 -0
  197. package/dist/workspace/trust/attestor.d.ts.map +1 -0
  198. package/dist/workspace/trust/policy.d.ts +111 -0
  199. package/dist/workspace/trust/policy.d.ts.map +1 -0
  200. package/dist/workspace/trust/provenance.d.ts +67 -0
  201. package/dist/workspace/trust/provenance.d.ts.map +1 -0
  202. package/dist/workspace/trust/ssh-commit.d.ts +43 -0
  203. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -0
  204. package/dist/workspace/trust/test-repo.d.ts +42 -0
  205. package/dist/workspace/trust/test-repo.d.ts.map +1 -0
  206. package/dist/workspace/trust/verify-cli.d.ts +9 -0
  207. package/dist/workspace/trust/verify-cli.d.ts.map +1 -0
  208. package/dist/workspace/trust/verify.d.ts +66 -0
  209. package/dist/workspace/trust/verify.d.ts.map +1 -0
  210. package/dist/workspace/which-chant.d.ts +58 -0
  211. package/dist/workspace/which-chant.d.ts.map +1 -0
  212. package/dist/workspace/workspace-kinds.schema.json +133 -0
  213. package/package.json +2 -1
  214. package/src/audit/discover.ts +66 -78
  215. package/src/audit/report-html.ts +3 -1
  216. package/src/audit/report-model.ts +14 -1
  217. package/src/audit/terraform-state.test.ts +4 -9
  218. package/src/audit/terraform-state.ts +4 -5
  219. package/src/cli/commands/audit-truncation.test.ts +167 -0
  220. package/src/cli/commands/audit.ts +89 -60
  221. package/src/cli/commands/check-lexicon.ts +24 -0
  222. package/src/cli/commands/doctor.test.ts +30 -0
  223. package/src/cli/commands/doctor.ts +18 -0
  224. package/src/cli/commands/import-agents.ts +6 -2
  225. package/src/cli/commands/init.ts +22 -3
  226. package/src/cli/commands/lint.test.ts +17 -23
  227. package/src/cli/commands/lint.ts +24 -84
  228. package/src/cli/commands/update.ts +13 -4
  229. package/src/cli/commands/vendor.ts +11 -6
  230. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +38 -0
  231. package/src/cli/handlers/build-member.test.ts +127 -0
  232. package/src/cli/handlers/build.ts +35 -1
  233. package/src/cli/handlers/components.test.ts +127 -0
  234. package/src/cli/handlers/components.ts +70 -8
  235. package/src/cli/handlers/dev.ts +5 -3
  236. package/src/cli/handlers/fan-out.ts +9 -2
  237. package/src/cli/handlers/init.ts +54 -1
  238. package/src/cli/handlers/operator.test.ts +68 -0
  239. package/src/cli/handlers/operator.ts +37 -9
  240. package/src/cli/handlers/promote.test.ts +118 -2
  241. package/src/cli/handlers/promote.ts +82 -16
  242. package/src/cli/handlers/run-generate-member.test.ts +83 -0
  243. package/src/cli/handlers/run-generate.test.ts +6 -8
  244. package/src/cli/handlers/run-generate.ts +36 -1
  245. package/src/cli/handlers/run.test.ts +47 -0
  246. package/src/cli/handlers/run.ts +28 -5
  247. package/src/cli/handlers/vendor.ts +147 -43
  248. package/src/cli/main.test.ts +105 -1
  249. package/src/cli/main.ts +230 -17
  250. package/src/cli/plugins.ts +17 -17
  251. package/src/cli/registry.ts +32 -0
  252. package/src/cli/static-config-read.test.ts +208 -0
  253. package/src/codegen/fetch.test.ts +63 -1
  254. package/src/codegen/fetch.ts +30 -1
  255. package/src/components/cli-support.ts +6 -1
  256. package/src/components/discover.test.ts +27 -57
  257. package/src/components/discover.ts +13 -68
  258. package/src/components/driver.test.ts +78 -1
  259. package/src/components/driver.ts +43 -7
  260. package/src/components/gate-plan.ts +53 -0
  261. package/src/components/promote.test.ts +276 -2
  262. package/src/components/promote.ts +119 -15
  263. package/src/components/sandbox/driver.ts +8 -8
  264. package/src/components/sandbox/run.ts +4 -1
  265. package/src/components/verbs/build-archive.ts +27 -21
  266. package/src/components/verbs/run-agent.ts +3 -5
  267. package/src/config-static.test.ts +136 -0
  268. package/src/config-static.ts +232 -0
  269. package/src/config.test.ts +2 -2
  270. package/src/config.ts +48 -15
  271. package/src/content-digest.test.ts +120 -0
  272. package/src/content-digest.ts +21 -0
  273. package/src/discovery/files.test.ts +10 -10
  274. package/src/discovery/files.ts +25 -81
  275. package/src/discovery/fold-import.ts +49 -5
  276. package/src/discovery/index.ts +1 -0
  277. package/src/discovery/sandbox/driver.ts +73 -35
  278. package/src/discovery/sandbox/fork-diagnostic.test.ts +136 -13
  279. package/src/discovery/sandbox/fork.ts +83 -43
  280. package/src/discovery/sandbox/path-lexicon-multifile.test.ts +285 -0
  281. package/src/discovery/walk.test.ts +263 -0
  282. package/src/discovery/walk.ts +334 -0
  283. package/src/effect-receipt.ts +2 -2
  284. package/src/graph-ir.ts +4 -1
  285. package/src/join-key.test.ts +25 -0
  286. package/src/join-key.ts +39 -0
  287. package/src/lexicon-module.ts +108 -10
  288. package/src/lexicon.ts +79 -1
  289. package/src/lifecycle/build-ledger-store.ts +11 -10
  290. package/src/lifecycle/digest.ts +9 -5
  291. package/src/lifecycle/gate-ledger.test.ts +20 -0
  292. package/src/lifecycle/gate-ledger.ts +28 -6
  293. package/src/lifecycle/git.test.ts +13 -1
  294. package/src/lifecycle/git.ts +221 -176
  295. package/src/lifecycle/lease.ts +25 -10
  296. package/src/lifecycle/legacy-digest.test.ts +115 -23
  297. package/src/lifecycle/legacy-digest.ts +60 -19
  298. package/src/lifecycle/member-ledger.test.ts +319 -0
  299. package/src/lifecycle/member-ledger.ts +145 -0
  300. package/src/lifecycle/plan-digest.ts +7 -7
  301. package/src/lifecycle/release-ledger.test.ts +20 -0
  302. package/src/lifecycle/release-ledger.ts +23 -7
  303. package/src/lifecycle/status.test.ts +151 -1
  304. package/src/lifecycle/status.ts +228 -7
  305. package/src/op/activities/activity-contracts.ts +37 -0
  306. package/src/op/activities/index.ts +10 -0
  307. package/src/op/activities/propose-upgrade.ts +206 -0
  308. package/src/op/discover.test.ts +14 -4
  309. package/src/op/discover.ts +19 -27
  310. package/src/op/gate-name.ts +8 -0
  311. package/src/op/gate-summary.test.ts +14 -0
  312. package/src/op/gate-summary.ts +25 -2
  313. package/src/op/gate.ts +36 -7
  314. package/src/op/generate-pipeline.test.ts +14 -5
  315. package/src/project-root.test.ts +66 -1
  316. package/src/project-root.ts +48 -0
  317. package/src/workspace/__fixtures__/contract-repo.ts +100 -0
  318. package/src/workspace/__fixtures__/two-member-workspace.ts +35 -0
  319. package/src/workspace/behold-kinds.test.ts +162 -0
  320. package/src/workspace/check-contract.test.ts +127 -0
  321. package/src/workspace/check.schema.json +347 -0
  322. package/src/workspace/checks/generated.test.ts +287 -0
  323. package/src/workspace/checks/generated.ts +475 -0
  324. package/src/workspace/checks/ledgers.test.ts +139 -0
  325. package/src/workspace/checks/ledgers.ts +246 -0
  326. package/src/workspace/checks/links.ts +183 -0
  327. package/src/workspace/checks/pipelines.test.ts +133 -0
  328. package/src/workspace/checks/pipelines.ts +225 -0
  329. package/src/workspace/checks-repo.test.ts +71 -0
  330. package/src/workspace/checks.test.ts +450 -0
  331. package/src/workspace/checks.ts +461 -0
  332. package/src/workspace/compose-graph.test.ts +146 -0
  333. package/src/workspace/compose-graph.ts +228 -0
  334. package/src/workspace/compose-reports.test.ts +109 -0
  335. package/src/workspace/compose-reports.ts +186 -0
  336. package/src/workspace/declaration.schema.json +434 -0
  337. package/src/workspace/declaration.test.ts +347 -0
  338. package/src/workspace/declaration.ts +623 -0
  339. package/src/workspace/generated-files.test.ts +114 -0
  340. package/src/workspace/generated-files.ts +94 -0
  341. package/src/workspace/glob.ts +49 -0
  342. package/src/workspace/graph-cli.ts +220 -0
  343. package/src/workspace/graph-contract.test.ts +204 -0
  344. package/src/workspace/graph.schema.json +662 -0
  345. package/src/workspace/init.test.ts +223 -0
  346. package/src/workspace/init.ts +585 -0
  347. package/src/workspace/jsonc.test.ts +65 -0
  348. package/src/workspace/jsonc.ts +231 -0
  349. package/src/workspace/kinds.test.ts +288 -0
  350. package/src/workspace/kinds.ts +506 -0
  351. package/src/workspace/lineage-check.ts +264 -0
  352. package/src/workspace/lineage-cli.ts +114 -0
  353. package/src/workspace/lineage-init.test.ts +231 -0
  354. package/src/workspace/lineage-init.ts +365 -0
  355. package/src/workspace/lineage-lock.test.ts +224 -0
  356. package/src/workspace/lineage-lock.ts +357 -0
  357. package/src/workspace/lineage-merge.ts +44 -0
  358. package/src/workspace/lineage-migrations.test.ts +178 -0
  359. package/src/workspace/lineage-migrations.ts +343 -0
  360. package/src/workspace/lineage-update.ts +160 -0
  361. package/src/workspace/lineage-upgrade-cli.ts +151 -0
  362. package/src/workspace/lineage-upgrade.test.ts +474 -0
  363. package/src/workspace/lineage-upgrade.ts +624 -0
  364. package/src/workspace/lineage-vendor.test.ts +126 -0
  365. package/src/workspace/lineage-vendor.ts +215 -0
  366. package/src/workspace/lineage-version.ts +127 -0
  367. package/src/workspace/links.test.ts +344 -0
  368. package/src/workspace/links.ts +331 -0
  369. package/src/workspace/ls-contract.test.ts +200 -0
  370. package/src/workspace/ls.schema.json +190 -0
  371. package/src/workspace/ls.ts +254 -0
  372. package/src/workspace/member-commands.e2e.test.ts +244 -0
  373. package/src/workspace/member-commands.test.ts +217 -0
  374. package/src/workspace/member-commands.ts +540 -0
  375. package/src/workspace/member-handles.test.ts +76 -0
  376. package/src/workspace/member-handles.ts +228 -0
  377. package/src/workspace/member-pipeline.test.ts +135 -0
  378. package/src/workspace/member-pipeline.ts +317 -0
  379. package/src/workspace/member-run.ts +146 -0
  380. package/src/workspace/read-contract.test.ts +129 -0
  381. package/src/workspace/reason-codes.test.ts +113 -0
  382. package/src/workspace/reason-codes.ts +81 -0
  383. package/src/workspace/records-cli.ts +86 -14
  384. package/src/workspace/records-contract.test.ts +5 -0
  385. package/src/workspace/records.schema.json +32 -2
  386. package/src/workspace/records.ts +3 -2
  387. package/src/workspace/root-refusal.ts +97 -0
  388. package/src/workspace/status-contract.test.ts +308 -0
  389. package/src/workspace/status.schema.json +210 -0
  390. package/src/workspace/status.ts +412 -0
  391. package/src/workspace/template-manifest.test.ts +79 -0
  392. package/src/workspace/template-manifest.ts +221 -0
  393. package/src/workspace/tree.ts +132 -0
  394. package/src/workspace/trust/attestor.ts +93 -0
  395. package/src/workspace/trust/policy.ts +306 -0
  396. package/src/workspace/trust/provenance.ts +181 -0
  397. package/src/workspace/trust/ssh-commit.ts +138 -0
  398. package/src/workspace/trust/test-repo.ts +138 -0
  399. package/src/workspace/trust/trust.test.ts +397 -0
  400. package/src/workspace/trust/verify-cli.ts +56 -0
  401. package/src/workspace/trust/verify.ts +194 -0
  402. package/src/workspace/which-chant.test.ts +117 -0
  403. package/src/workspace/which-chant.ts +151 -0
  404. package/src/workspace/workspace-kinds.schema.json +133 -0
  405. package/dist/components/unbound-gate-approval.d.ts +0 -24
  406. package/dist/components/unbound-gate-approval.d.ts.map +0 -1
  407. package/dist/discovery/convergence.d.ts +0 -97
  408. package/dist/discovery/convergence.d.ts.map +0 -1
  409. package/src/cli/commands/audit-walk-warnings.test.ts +0 -156
  410. package/src/components/unbound-gate-approval.test.ts +0 -82
  411. package/src/components/unbound-gate-approval.ts +0 -51
  412. package/src/discovery/convergence.test.ts +0 -231
  413. package/src/discovery/convergence.ts +0 -399
  414. package/src/op/discover-convergence.test.ts +0 -70
@@ -1,61 +1,165 @@
1
- import { resolve } from "node:path";
2
- import { vendorPull, vendorCheck } from "../commands/vendor";
1
+ import { existsSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { vendorPull, vendorCheck, MANIFEST_FILE } from "../commands/vendor";
3
4
  import { formatError, formatSuccess, formatWarning } from "../format";
4
5
  import type { CommandContext } from "../registry";
5
6
 
6
7
  /**
7
- * `chant vendor [pull|check]` — pull pinned, checksummed patterns into the repo,
8
- * or check vendored targets against their recorded pin. Defaults to `pull`.
8
+ * Where the lineage lock lives (`../../workspace/lineage-lock.ts` owns the
9
+ * constant). Repeated here so that finding out whether a lock exists loads no
10
+ * workspace module: a project with only `vendor.json` must see today's
11
+ * `chant vendor` exactly (#2525 rule 2).
12
+ */
13
+ const LOCK_FILE = ".chant/workspace.lock.json";
14
+
15
+ /**
16
+ * `chant vendor [pull|check|migrate]` — pull pinned, checksummed patterns into
17
+ * the repo, check vendored targets against their pin, or move `vendor.json`
18
+ * into the lineage lock. Defaults to `pull`.
9
19
  *
10
- * The manifest (`vendor.json`) lives in the current directory.
20
+ * `vendor.json` and the lock both live in the current directory. With no lock,
21
+ * `pull` and `check` read `vendor.json` exactly as before. With a lock, its
22
+ * vendor scopes are pulled file by file (local edits are kept, conflicts
23
+ * become manual steps), and any `vendor.json` entries not yet migrated are
24
+ * still pulled the old way (#2540).
11
25
  */
12
26
  export async function runVendor(ctx: CommandContext): Promise<number> {
13
27
  const { args } = ctx;
14
- // `chant vendor` → pull; `chant vendor pull|check [name]`.
28
+ // `chant vendor` → pull; `chant vendor pull|check|migrate [name]`.
15
29
  const sub = args.path === "." ? "pull" : args.path;
16
30
  const manifestDir = resolve(".");
17
31
 
18
- if (sub === "pull") {
19
- try {
20
- const result = await vendorPull(manifestDir, args.extraPositional);
21
- if (!result.success) {
22
- console.error(formatError({ message: result.output }));
23
- return 1;
24
- }
25
- console.log(result.output);
26
- console.error(formatSuccess(`Vendored ${result.pulled.length} artifact(s)`));
27
- return 0;
28
- } catch (err) {
29
- console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
30
- return 1;
31
- }
32
- }
33
-
34
- if (sub === "check") {
35
- try {
36
- const result = vendorCheck(manifestDir);
37
- console.log(result.output);
38
- if (!result.drift) {
39
- console.error(formatSuccess("All vendored artifacts match their pin"));
40
- return 0;
41
- }
42
- // Drift is allowed (you may edit vendored files); fail only in CI so a
43
- // pipeline catches unrecorded changes, warn locally.
44
- if (process.env.CI) {
45
- console.error(formatError({ message: "Vendored content drifted from the manifest pin" }));
46
- return 1;
47
- }
48
- console.error(formatWarning({ message: "Vendored content drifted from the manifest pin (run `chant vendor pull` to re-pin)" }));
49
- return 0;
50
- } catch (err) {
51
- console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
52
- return 1;
53
- }
32
+ try {
33
+ if (sub === "migrate") return await runMigrate(manifestDir);
34
+ const locked = await hasVendorScopes(manifestDir);
35
+ if (sub === "pull") return locked ? await runLockedPull(manifestDir, args.extraPositional) : await runPull(manifestDir, args.extraPositional);
36
+ if (sub === "check") return locked ? await runLockedCheck(manifestDir) : runCheck(manifestDir);
37
+ } catch (err) {
38
+ console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
39
+ return 1;
54
40
  }
55
41
 
56
42
  console.error(formatError({
57
43
  message: `Unknown vendor subcommand: ${sub}`,
58
- hint: "Available: chant vendor pull [name], chant vendor check",
44
+ hint: "Available: chant vendor pull [name], chant vendor check, chant vendor migrate",
59
45
  }));
60
46
  return 1;
61
47
  }
48
+
49
+ /**
50
+ * Whether the lock holds any vendor scope. Without a lock file this loads
51
+ * nothing; a lock with no vendor scope (say, one `chant init --template`
52
+ * wrote) leaves `chant vendor` on `vendor.json` as before.
53
+ */
54
+ async function hasVendorScopes(root: string): Promise<boolean> {
55
+ if (!existsSync(join(root, LOCK_FILE))) return false;
56
+ const { readLock } = await import("../../workspace/lineage-lock");
57
+ const lock = readLock(root);
58
+ return !!lock && Object.values(lock.scopes).some((l) => l.kind === "vendor");
59
+ }
60
+
61
+ // ── vendor.json only: unchanged ──────────────────────────────────────────────
62
+
63
+ async function runPull(manifestDir: string, only?: string): Promise<number> {
64
+ const result = await vendorPull(manifestDir, only);
65
+ if (!result.success) {
66
+ console.error(formatError({ message: result.output }));
67
+ return 1;
68
+ }
69
+ console.log(result.output);
70
+ console.error(formatSuccess(`Vendored ${result.pulled.length} artifact(s)`));
71
+ return 0;
72
+ }
73
+
74
+ function runCheck(manifestDir: string): number {
75
+ const result = vendorCheck(manifestDir);
76
+ console.log(result.output);
77
+ if (!result.drift) {
78
+ console.error(formatSuccess("All vendored artifacts match their pin"));
79
+ return 0;
80
+ }
81
+ // Drift is allowed (you may edit vendored files); fail only in CI so a
82
+ // pipeline catches unrecorded changes, warn locally.
83
+ if (process.env.CI) {
84
+ console.error(formatError({ message: "Vendored content drifted from the manifest pin" }));
85
+ return 1;
86
+ }
87
+ console.error(formatWarning({ message: "Vendored content drifted from the manifest pin (run `chant vendor pull` to re-pin)" }));
88
+ return 0;
89
+ }
90
+
91
+ // ── With a lineage lock ──────────────────────────────────────────────────────
92
+
93
+ const MIGRATE_HINT = `${MANIFEST_FILE} entries are not in ${LOCK_FILE} yet, and pull still overwrites their targets. Run \`chant vendor migrate\` to move them.`;
94
+
95
+ async function runLockedPull(root: string, only?: string): Promise<number> {
96
+ const lv = await import("../../workspace/lineage-vendor");
97
+ const hasManifest = lv.manifestPresent(root);
98
+ const legacy = hasManifest ? (await import("../commands/vendor")).loadManifest(root).manifest.vendored : [];
99
+ const legacyMatch = only ? legacy.some((e) => e.name === only) : legacy.length > 0;
100
+
101
+ const pulled = await lv.pullLockedScopes(root, only);
102
+ if (only && pulled.length === 0 && !legacyMatch) {
103
+ console.error(formatError({ message: `no vendored entry named "${only}"` }));
104
+ return 1;
105
+ }
106
+ const lines = pulled.map(lv.formatLockedPull);
107
+ let count = pulled.length;
108
+ if (legacyMatch) {
109
+ const result = await vendorPull(root, only);
110
+ lines.push(result.output);
111
+ count += result.pulled.length;
112
+ }
113
+ if (lines.length > 0) console.log(lines.join("\n"));
114
+ if (legacyMatch) console.error(formatWarning({ message: MIGRATE_HINT }));
115
+
116
+ const steps = pulled.reduce((n, p) => n + p.manualSteps.length, 0);
117
+ if (steps > 0) {
118
+ console.error(formatWarning({
119
+ message: `Vendored ${count} artifact(s); ${steps} file(s) changed both here and upstream were left as they are`,
120
+ }));
121
+ console.error(" Merge each by hand, then run `chant workspace lineage resolve <path>`.");
122
+ return 0;
123
+ }
124
+ console.error(formatSuccess(`Vendored ${count} artifact(s)`));
125
+ return 0;
126
+ }
127
+
128
+ async function runLockedCheck(root: string): Promise<number> {
129
+ const lv = await import("../../workspace/lineage-vendor");
130
+ const checks = lv.checkLockedScopes(root);
131
+ const lines = checks.map(lv.formatLockedCheck);
132
+ let drift = checks.some(lv.lockedCheckFails);
133
+ if (lv.manifestPresent(root)) {
134
+ const legacy = vendorCheck(root);
135
+ if (legacy.output) lines.push(legacy.output);
136
+ drift ||= legacy.drift;
137
+ console.error(formatWarning({ message: MIGRATE_HINT }));
138
+ }
139
+ if (lines.length > 0) console.log(lines.join("\n"));
140
+ if (!drift) {
141
+ console.error(formatSuccess("All vendored artifacts match their pin, or carry local edits"));
142
+ return 0;
143
+ }
144
+ const message = "Vendored content has open manual steps or missing targets";
145
+ if (process.env.CI) {
146
+ console.error(formatError({ message }));
147
+ return 1;
148
+ }
149
+ console.error(formatWarning({ message: `${message} (see \`chant workspace lineage\`)` }));
150
+ return 0;
151
+ }
152
+
153
+ async function runMigrate(root: string): Promise<number> {
154
+ const { migrateVendorManifest } = await import("../../workspace/lineage-vendor");
155
+ const result = await migrateVendorManifest(root);
156
+ for (const m of result.migrated) {
157
+ console.log(` ${m.name} → ${m.target} (${m.pinned ? `${m.files} file(s)` : "unpinned"})`);
158
+ }
159
+ console.error(
160
+ formatSuccess(
161
+ `Moved ${result.migrated.length} vendored artifact(s) from ${MANIFEST_FILE} into ${LOCK_FILE}${result.lockCreated ? " (created)" : ""}; ${MANIFEST_FILE} removed`,
162
+ ),
163
+ );
164
+ return 0;
165
+ }
@@ -269,6 +269,18 @@ describe("parseArgs", () => {
269
269
  expect(result.actor).toBe("alice");
270
270
  });
271
271
 
272
+ test("--digest repeats for components promote, and --digest-file is parsed (#2602)", () => {
273
+ const promote = parseArgs([
274
+ "components", "promote", "--from", "staging", "--to", "prod",
275
+ "--digest", "api=sha256:a", "--digest", "web=sha256:w",
276
+ ]);
277
+ expect(promote.digests).toEqual(["api=sha256:a", "web=sha256:w"]);
278
+ expect(promote.digest).toBe("web=sha256:w");
279
+
280
+ const run = parseArgs(["run", "--components", "api", "--env", "staging", "--digest-file", "api.digest"]);
281
+ expect(run.digestFile).toBe("api.digest");
282
+ });
283
+
272
284
  test("parses --compare-to and --live for components status", () => {
273
285
  const result = parseArgs(["components", "status", "prod", "--compare-to", "staging", "--live", "--json"]);
274
286
  expect(result.command).toBe("components");
@@ -306,6 +318,17 @@ describe("parseArgs", () => {
306
318
  expect(() => parseArgs(["build", "--promote-to", "--env", "x"])).toThrow(/--promote-to needs an environment/);
307
319
  });
308
320
 
321
+ test("--promote-to outside build --components --generate is refused, naming the flags it needs (#2603)", () => {
322
+ const needs = /--promote-to needs build --components --generate <lexicon>/;
323
+ expect(() => parseArgs(["build", "--promote-to", "prod"])).toThrow(needs);
324
+ expect(() => parseArgs(["build", "--components", "--promote-to", "prod"])).toThrow(needs);
325
+ expect(() => parseArgs(["build", "--generate", "github", "--promote-to", "prod"])).toThrow(needs);
326
+ expect(() => parseArgs(["run", "--components", "all", "--generate", "github", "--promote-to", "prod"])).toThrow(needs);
327
+ expect(() => parseArgs(["components", "promote", "--from", "staging", "--promote-to", "prod"])).toThrow(needs);
328
+ // Flag order does not matter: the check runs once the whole line is parsed.
329
+ expect(parseArgs(["build", "--promote-to", "prod", "--generate", "gitlab", "--components"]).promoteTo).toBe("prod");
330
+ });
331
+
309
332
  test("parses --no-release-record for run --components", () => {
310
333
  const result = parseArgs(["run", "--components", "search-service", "--env", "staging", "--no-release-record"]);
311
334
  expect(result.components).toBe(true);
@@ -653,7 +676,7 @@ describe("workspace records (#2546)", () => {
653
676
 
654
677
  test("resolves to the records command, and anything else under workspace to its fallback", () => {
655
678
  expect(resolveCommand(parseArgs(["workspace", "records", "--kind", "k.mjs"]), commandRegistry)?.def.name).toBe("workspace records");
656
- expect(resolveCommand(parseArgs(["workspace", "ls"]), commandRegistry)?.def.name).toBe("workspace");
679
+ expect(resolveCommand(parseArgs(["workspace", "no-such-subcommand"]), commandRegistry)?.def.name).toBe("workspace");
657
680
  });
658
681
 
659
682
  // #2525 rule 5: the workspace code loads only when a workspace command runs.
@@ -665,6 +688,54 @@ describe("workspace records (#2546)", () => {
665
688
  });
666
689
  });
667
690
 
691
+ describe("workspace init and ls (#2534)", () => {
692
+ test("resolve to their commands in the one workspace group, with the directory as extra positional", () => {
693
+ const ls = parseArgs(["workspace", "ls", "examples", "--at", "HEAD", "--json"]);
694
+ expect(ls).toMatchObject({ command: "workspace", path: "ls", extraPositional: "examples", at: "HEAD", json: true });
695
+ expect(resolveCommand(ls, commandRegistry)?.def.name).toBe("workspace ls");
696
+ const init = parseArgs(["workspace", "init", "--name", "acme", "--yes"]);
697
+ expect(init).toMatchObject({ command: "workspace", path: "init", selectName: "acme", yes: true });
698
+ expect(resolveCommand(init, commandRegistry)?.def.name).toBe("workspace init");
699
+ expect(commandRegistry.filter((c) => c.name === "workspace" || c.name.startsWith("workspace ")).map((c) => c.name).sort()).toEqual([
700
+ "workspace",
701
+ "workspace audit",
702
+ "workspace build",
703
+ "workspace check",
704
+ "workspace graph",
705
+ "workspace init",
706
+ "workspace lineage",
707
+ "workspace lint",
708
+ "workspace ls",
709
+ "workspace member-run",
710
+ "workspace records",
711
+ "workspace status",
712
+ "workspace upgrade",
713
+ "workspace verify",
714
+ ]);
715
+ });
716
+
717
+ test("load their modules only when they run", () => {
718
+ const source = readFileSync(join(import.meta.dirname, "main.ts"), "utf-8");
719
+ expect(source).toMatch(/await import\("\.\.\/workspace\/init"\)/);
720
+ expect(source).toMatch(/await import\("\.\.\/workspace\/ls"\)/);
721
+ });
722
+ });
723
+
724
+ describe("workspace status (#2544)", () => {
725
+ test("takes the environment as extra positional, a directory after it, and --compare-to", () => {
726
+ const status = parseArgs(["workspace", "status", "staging", "apps", "--compare-to", "prod", "--json"]);
727
+ expect(status).toMatchObject({ command: "workspace", path: "status", extraPositional: "staging", extraPositional2: "apps", compareTo: "prod", json: true });
728
+ expect(resolveCommand(status, commandRegistry)?.def.name).toBe("workspace status");
729
+ // --compare-to --live parses, so the command can say live isn't read yet.
730
+ expect(parseArgs(["workspace", "status", "prod", "--compare-to", "--live"]).compareTo).toBe("--live");
731
+ });
732
+
733
+ test("loads its module only when it runs", () => {
734
+ const source = readFileSync(join(import.meta.dirname, "main.ts"), "utf-8");
735
+ expect(source).toMatch(/await import\("\.\.\/workspace\/status"\)/);
736
+ });
737
+ });
738
+
668
739
  describe("waitForStreamDrain", () => {
669
740
  // Minimal writable stub — just the surface waitForStreamDrain reads.
670
741
  function fakeStream(len: number): NodeJS.WriteStream & { writableLength: number } {
@@ -711,3 +782,36 @@ describe("waitForStreamDrain", () => {
711
782
  await expect(p).resolves.toBeUndefined();
712
783
  });
713
784
  });
785
+
786
+ describe("per-member commands and the root refusal (#2537)", () => {
787
+ test("--root-only is a boolean, and --member repeats and splits on commas", () => {
788
+ expect(parseArgs(["build", "--root-only"]).rootOnly).toBe(true);
789
+ expect(parseArgs(["lint", "src"]).rootOnly).toBeUndefined();
790
+ expect(() => parseArgs(["build", "--root-only=yes"])).toThrow();
791
+ const args = parseArgs(["workspace", "lint", "--member", "api,web", "--member", "examples", "--format", "sarif"]);
792
+ expect(args).toMatchObject({ command: "workspace", path: "lint", members: ["api", "web", "examples"], format: "sarif" });
793
+ expect(() => parseArgs(["workspace", "build", "--member"])).toThrow(/--member needs a member or group name/);
794
+ });
795
+
796
+ test("workspace build, lint, audit and graph resolve to their commands", () => {
797
+ for (const verb of ["build", "lint", "audit", "graph"]) {
798
+ expect(resolveCommand(parseArgs(["workspace", verb, "some/dir"]), commandRegistry)?.def.name).toBe(`workspace ${verb}`);
799
+ }
800
+ });
801
+
802
+ test("the refusal and the per-member code load only when used", () => {
803
+ const source = readFileSync(join(import.meta.dirname, "main.ts"), "utf-8");
804
+ expect(source).toMatch(/await import\("\.\.\/workspace\/root-refusal"\)/);
805
+ expect(source).toMatch(/await import\("\.\.\/workspace\/member-commands"\)/);
806
+ expect(source).toMatch(/await import\("\.\.\/workspace\/member-run"\)/);
807
+ });
808
+ });
809
+
810
+ describe("chant workspace check --generated (#2641)", () => {
811
+ test("is a boolean flag, distinct from --generate <lexicon>", () => {
812
+ expect(parseArgs(["workspace", "check", "--generated", "--json"])).toMatchObject({ command: "workspace", path: "check", generated: true, json: true });
813
+ expect(parseArgs(["workspace", "check"]).generated).toBeUndefined();
814
+ expect(parseArgs(["build", "--generate", "github"]).generated).toBeUndefined();
815
+ expect(() => parseArgs(["workspace", "check", "--generated=yes"])).toThrow();
816
+ });
817
+ });