@intentius/chant 0.124.12 → 0.124.14

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 (928) hide show
  1. package/bin/chant +11 -0
  2. package/dist/agents/checks.js +326 -0
  3. package/dist/agents/discover.js +885 -0
  4. package/dist/agents/importer.js +17 -0
  5. package/dist/agents/index.js +12 -0
  6. package/dist/agents/types.js +19 -0
  7. package/dist/apply.js +151 -0
  8. package/dist/attrref.js +70 -0
  9. package/dist/audit/catalog.js +350 -0
  10. package/dist/audit/core.js +252 -0
  11. package/dist/audit/discover.js +633 -0
  12. package/dist/audit/fetch.js +666 -0
  13. package/dist/audit/lineage.js +91 -0
  14. package/dist/audit/nginx.js +366 -0
  15. package/dist/audit/prior-art.js +132 -0
  16. package/dist/audit/proof.js +321 -0
  17. package/dist/audit/report-html.js +194 -0
  18. package/dist/audit/report-model.js +198 -0
  19. package/dist/audit/report.js +102 -0
  20. package/dist/audit/rules-doc.js +144 -0
  21. package/dist/audit/secrets.js +405 -0
  22. package/dist/audit/terraform-state.js +140 -0
  23. package/dist/audit/wrangler.js +262 -0
  24. package/dist/behaviour-delta.js +401 -0
  25. package/dist/behaviour-engine.js +357 -0
  26. package/dist/behaviour-graph.js +83 -0
  27. package/dist/behaviour-http.js +188 -0
  28. package/dist/behaviour-kinds.js +172 -0
  29. package/dist/behaviour-overlay.js +50 -0
  30. package/dist/behaviour-predict.js +188 -0
  31. package/dist/behaviour-request.js +194 -0
  32. package/dist/behaviour.js +1325 -0
  33. package/dist/build-params.js +108 -0
  34. package/dist/build.js +668 -0
  35. package/dist/builder.js +44 -0
  36. package/dist/cdk/advise.js +30 -0
  37. package/dist/cdk/assembly.js +122 -0
  38. package/dist/cdk/graph.js +444 -0
  39. package/dist/cdk/tier-map.js +64 -0
  40. package/dist/cdk/types.js +24 -0
  41. package/dist/change-set.js +312 -0
  42. package/dist/child-project.js +21 -0
  43. package/dist/claimed-fields.js +135 -0
  44. package/dist/cli/build-options.js +70 -0
  45. package/dist/cli/build-params-cli.js +139 -0
  46. package/dist/cli/command-group.js +123 -0
  47. package/dist/cli/commands/audit-agents.js +326 -0
  48. package/dist/cli/commands/audit.js +571 -0
  49. package/dist/cli/commands/build.js +920 -0
  50. package/dist/cli/commands/carve-apply.js +153 -0
  51. package/dist/cli/commands/carve-bridge.js +201 -0
  52. package/dist/cli/commands/carve-emit.js +332 -0
  53. package/dist/cli/commands/carve-status.js +119 -0
  54. package/dist/cli/commands/carve.js +204 -0
  55. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  56. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  57. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  58. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  59. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  60. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  61. package/dist/cli/commands/check-lexicon.js +766 -0
  62. package/dist/cli/commands/describe.js +85 -0
  63. package/dist/cli/commands/diff.js +175 -0
  64. package/dist/cli/commands/doctor.js +350 -0
  65. package/dist/cli/commands/import-agents.js +155 -0
  66. package/dist/cli/commands/import.js +670 -0
  67. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  68. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  69. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  70. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  71. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  72. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  73. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  74. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  75. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  76. package/dist/cli/commands/init-lexicon.js +172 -0
  77. package/dist/cli/commands/init.js +381 -0
  78. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  79. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  80. package/dist/cli/commands/licenses.js +125 -0
  81. package/dist/cli/commands/lint.d.ts.map +1 -1
  82. package/dist/cli/commands/lint.js +948 -0
  83. package/dist/cli/commands/list.js +63 -0
  84. package/dist/cli/commands/migrate.d.ts.map +1 -1
  85. package/dist/cli/commands/migrate.js +423 -0
  86. package/dist/cli/commands/onboard.js +403 -0
  87. package/dist/cli/commands/pinned-upgrade.js +191 -0
  88. package/dist/cli/commands/update.js +194 -0
  89. package/dist/cli/commands/vendor.js +217 -0
  90. package/dist/cli/conflict-check.js +104 -0
  91. package/dist/cli/debug.js +8 -0
  92. package/dist/cli/format.js +104 -0
  93. package/dist/cli/handlers/build.js +267 -0
  94. package/dist/cli/handlers/carve-apply.js +30 -0
  95. package/dist/cli/handlers/carve-bridge.js +28 -0
  96. package/dist/cli/handlers/carve-emit.js +50 -0
  97. package/dist/cli/handlers/carve-status.js +26 -0
  98. package/dist/cli/handlers/carve.js +40 -0
  99. package/dist/cli/handlers/change-set.js +46 -0
  100. package/dist/cli/handlers/components.js +730 -0
  101. package/dist/cli/handlers/dev.js +113 -0
  102. package/dist/cli/handlers/emulator.js +233 -0
  103. package/dist/cli/handlers/explain.js +54 -0
  104. package/dist/cli/handlers/fan-out.js +422 -0
  105. package/dist/cli/handlers/gate-resume.js +275 -0
  106. package/dist/cli/handlers/generate.js +84 -0
  107. package/dist/cli/handlers/graph.js +969 -0
  108. package/dist/cli/handlers/init.js +102 -0
  109. package/dist/cli/handlers/lifecycle.js +1727 -0
  110. package/dist/cli/handlers/lint.js +62 -0
  111. package/dist/cli/handlers/migrate.js +48 -0
  112. package/dist/cli/handlers/misc.js +391 -0
  113. package/dist/cli/handlers/operator.js +1162 -0
  114. package/dist/cli/handlers/override-approve.js +102 -0
  115. package/dist/cli/handlers/pr.js +503 -0
  116. package/dist/cli/handlers/promote.js +342 -0
  117. package/dist/cli/handlers/run-generate.js +206 -0
  118. package/dist/cli/handlers/run-wave.js +66 -0
  119. package/dist/cli/handlers/run.js +1191 -0
  120. package/dist/cli/handlers/scenario.js +325 -0
  121. package/dist/cli/handlers/search.js +924 -0
  122. package/dist/cli/handlers/serve.js +32 -0
  123. package/dist/cli/handlers/vendor.js +154 -0
  124. package/dist/cli/index.js +3 -0
  125. package/dist/cli/is-entry-point.js +23 -0
  126. package/dist/cli/lsp/capabilities.js +28 -0
  127. package/dist/cli/lsp/diagnostics.js +34 -0
  128. package/dist/cli/lsp/server.js +329 -0
  129. package/dist/cli/main.d.ts.map +1 -1
  130. package/dist/cli/main.js +2540 -0
  131. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  132. package/dist/cli/mcp/op-tools.js +306 -0
  133. package/dist/cli/mcp/resource-handlers.js +258 -0
  134. package/dist/cli/mcp/resources/context.js +85 -0
  135. package/dist/cli/mcp/server.js +353 -0
  136. package/dist/cli/mcp/tools/build.js +111 -0
  137. package/dist/cli/mcp/tools/composites.js +95 -0
  138. package/dist/cli/mcp/tools/explain.js +166 -0
  139. package/dist/cli/mcp/tools/import.js +49 -0
  140. package/dist/cli/mcp/tools/lint.js +41 -0
  141. package/dist/cli/mcp/tools/scaffold.js +111 -0
  142. package/dist/cli/mcp/tools/search.js +112 -0
  143. package/dist/cli/mcp/types.js +1 -0
  144. package/dist/cli/mcp/workspace-plugins.js +91 -0
  145. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  146. package/dist/cli/mcp/workspace-tools.js +564 -0
  147. package/dist/cli/mcp-config.js +70 -0
  148. package/dist/cli/plugins.js +313 -0
  149. package/dist/cli/registry.js +23 -0
  150. package/dist/cli/reporters/stylish.js +329 -0
  151. package/dist/cli/version.js +15 -0
  152. package/dist/cli/watch.js +79 -0
  153. package/dist/codegen/bound-property-types.js +82 -0
  154. package/dist/codegen/coverage.js +119 -0
  155. package/dist/codegen/docs-file-markers.js +60 -0
  156. package/dist/codegen/docs-pages.js +115 -0
  157. package/dist/codegen/docs-rule-scanning.js +164 -0
  158. package/dist/codegen/docs-rules.js +76 -0
  159. package/dist/codegen/docs-sections.js +117 -0
  160. package/dist/codegen/docs-sidebar.js +65 -0
  161. package/dist/codegen/docs-types.js +4 -0
  162. package/dist/codegen/docs.js +356 -0
  163. package/dist/codegen/fetch.js +340 -0
  164. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  165. package/dist/codegen/generate-registry.js +71 -0
  166. package/dist/codegen/generate-runtime-index.js +56 -0
  167. package/dist/codegen/generate-typescript.js +119 -0
  168. package/dist/codegen/generate.js +115 -0
  169. package/dist/codegen/json-patch.js +141 -0
  170. package/dist/codegen/json-schema-to-ts.js +344 -0
  171. package/dist/codegen/json-schema.js +246 -0
  172. package/dist/codegen/lexicon-regen.js +412 -0
  173. package/dist/codegen/naming.js +217 -0
  174. package/dist/codegen/okf-lexicon.js +245 -0
  175. package/dist/codegen/package.js +150 -0
  176. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  177. package/dist/codegen/pinned-upgrade.js +494 -0
  178. package/dist/codegen/registry.js +60 -0
  179. package/dist/codegen/rehype-base-url.mjs +68 -0
  180. package/dist/codegen/rolling-upgrade.js +217 -0
  181. package/dist/codegen/surface-snapshot.js +537 -0
  182. package/dist/codegen/testdata/postgres-tags.json +242 -0
  183. package/dist/codegen/topo-sort.js +36 -0
  184. package/dist/codegen/typecheck.js +115 -0
  185. package/dist/codegen/validate.js +200 -0
  186. package/dist/codegen/version-bump.js +35 -0
  187. package/dist/components/auto-release.js +143 -0
  188. package/dist/components/builders.js +47 -0
  189. package/dist/components/capability-plugin-loader.js +175 -0
  190. package/dist/components/capability-plugin-schema.js +46 -0
  191. package/dist/components/capability-plugin.js +99 -0
  192. package/dist/components/capability.js +60 -0
  193. package/dist/components/changed-files.js +72 -0
  194. package/dist/components/cli-support.js +427 -0
  195. package/dist/components/component.js +120 -0
  196. package/dist/components/component.schema.json +271 -0
  197. package/dist/components/config-defaults.js +130 -0
  198. package/dist/components/deploy-units.js +60 -0
  199. package/dist/components/discover.d.ts.map +1 -1
  200. package/dist/components/discover.js +189 -0
  201. package/dist/components/driver-output.js +86 -0
  202. package/dist/components/driver.js +728 -0
  203. package/dist/components/fan-out-output.js +165 -0
  204. package/dist/components/fan-out-record.js +94 -0
  205. package/dist/components/fan-out-run.js +373 -0
  206. package/dist/components/fan-out-support.js +60 -0
  207. package/dist/components/fan-out.js +273 -0
  208. package/dist/components/gate-plan.js +41 -0
  209. package/dist/components/gated-wave-pipeline.js +46 -0
  210. package/dist/components/index.js +24 -0
  211. package/dist/components/layers.js +28 -0
  212. package/dist/components/manifest-persistence.js +108 -0
  213. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  214. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  215. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  216. package/dist/components/pilots/lambda.pilot.js +52 -0
  217. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  218. package/dist/components/pilots/project.js +12 -0
  219. package/dist/components/pr-pipeline.js +134 -0
  220. package/dist/components/pr-run.js +363 -0
  221. package/dist/components/presets/ecs-fargate.js +72 -0
  222. package/dist/components/presets/index.js +28 -0
  223. package/dist/components/presets/lambda.js +34 -0
  224. package/dist/components/presets/single-host-compose.js +41 -0
  225. package/dist/components/promote.js +549 -0
  226. package/dist/components/registry.js +34 -0
  227. package/dist/components/run-progress.js +33 -0
  228. package/dist/components/sandbox/driver.d.ts.map +1 -1
  229. package/dist/components/sandbox/driver.js +93 -0
  230. package/dist/components/sandbox/run.js +115 -0
  231. package/dist/components/starter-plugin.js +104 -0
  232. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  233. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  234. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  235. package/dist/components/verbs/bom-writer.js +287 -0
  236. package/dist/components/verbs/build-archive.js +188 -0
  237. package/dist/components/verbs/build.js +142 -0
  238. package/dist/components/verbs/cloud-executor.js +110 -0
  239. package/dist/components/verbs/component-bom.js +125 -0
  240. package/dist/components/verbs/ensure-secret.js +50 -0
  241. package/dist/components/verbs/index.js +61 -0
  242. package/dist/components/verbs/license-policy.js +75 -0
  243. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  244. package/dist/components/verbs/process-runner.js +78 -0
  245. package/dist/components/verbs/r2-sync.js +93 -0
  246. package/dist/components/verbs/reproducibility.js +62 -0
  247. package/dist/components/verbs/run-agent.js +577 -0
  248. package/dist/components/verbs/sbom-generator.js +119 -0
  249. package/dist/components/verbs/sbom.js +97 -0
  250. package/dist/components/verbs/shell.js +32 -0
  251. package/dist/components/verbs/sign.js +221 -0
  252. package/dist/components/verbs/stub.js +28 -0
  253. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  254. package/dist/components/verbs/verify.js +112 -0
  255. package/dist/components/verbs/vex.js +131 -0
  256. package/dist/components/verbs/vuln-gate.js +152 -0
  257. package/dist/components/verbs/vuln-scan.js +288 -0
  258. package/dist/components/verbs/wait-verify.js +106 -0
  259. package/dist/components/verbs/wrangler.js +179 -0
  260. package/dist/components/wave-plan.js +102 -0
  261. package/dist/composite.js +305 -0
  262. package/dist/config-import.d.ts.map +1 -1
  263. package/dist/config-import.js +22 -0
  264. package/dist/config-sandbox.js +122 -0
  265. package/dist/config-static.js +206 -0
  266. package/dist/config.js +605 -0
  267. package/dist/content-digest.js +23 -0
  268. package/dist/declarable.js +114 -0
  269. package/dist/deep-observation.js +437 -0
  270. package/dist/detectLexicon.js +54 -0
  271. package/dist/discovery/cache.js +70 -0
  272. package/dist/discovery/collect.js +208 -0
  273. package/dist/discovery/cycles.js +95 -0
  274. package/dist/discovery/entity-wire-codec.js +391 -0
  275. package/dist/discovery/entity-wire.js +42 -0
  276. package/dist/discovery/files.js +121 -0
  277. package/dist/discovery/fold-import.d.ts.map +1 -1
  278. package/dist/discovery/fold-import.js +4178 -0
  279. package/dist/discovery/fold-rank.js +292 -0
  280. package/dist/discovery/graph.js +115 -0
  281. package/dist/discovery/import.d.ts.map +1 -1
  282. package/dist/discovery/import.js +65 -0
  283. package/dist/discovery/index.js +333 -0
  284. package/dist/discovery/param-deps.js +487 -0
  285. package/dist/discovery/resolve.js +39 -0
  286. package/dist/discovery/sandbox/bundle.js +214 -0
  287. package/dist/discovery/sandbox/child-errors.js +26 -0
  288. package/dist/discovery/sandbox/config-run.js +100 -0
  289. package/dist/discovery/sandbox/config-wire.js +183 -0
  290. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  291. package/dist/discovery/sandbox/driver.js +333 -0
  292. package/dist/discovery/sandbox/fork.js +229 -0
  293. package/dist/discovery/sandbox/policy-run.js +142 -0
  294. package/dist/discovery/sandbox/policy-wire.js +152 -0
  295. package/dist/discovery/sandbox/run.js +77 -0
  296. package/dist/discovery/specifier-resolve.js +320 -0
  297. package/dist/discovery/walk.js +284 -0
  298. package/dist/effect-receipt.js +340 -0
  299. package/dist/env.js +55 -0
  300. package/dist/errors.js +62 -0
  301. package/dist/fold/fold.js +1434 -0
  302. package/dist/fold/foldable-helpers.js +229 -0
  303. package/dist/fold/subset.js +696 -0
  304. package/dist/fold-provenance.js +414 -0
  305. package/dist/gate-decision.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. package/src/workspace/principal-classes.ts +5 -30
@@ -0,0 +1,730 @@
1
+ /**
2
+ * `chant components` handlers — release ledger + status surface (#568, epic
3
+ * #551 "Build & deploy observability").
4
+ *
5
+ * Two subcommands:
6
+ * - `chant components release record` — append one immutable release record
7
+ * to the `chant/lifecycle` orphan branch (../../lifecycle/release-ledger.ts).
8
+ * A deploy composition calls this (typically from a `Verify` phase, or the
9
+ * CI job that ran `chant build --components --generate <lexicon>`) once
10
+ * the artifact digest, git sha, and run id are known.
11
+ * - `chant components status [env]` — the status surface: joins the release
12
+ * ledger against live evidence (`lifecycle diff --live` + ownership,
13
+ * reused via `buildChangeSet`) by digest, and reports what's built vs
14
+ * what's deployed where, flagging unrecorded deploys and drift.
15
+ *
16
+ * `componentBom`/`build.reproducibility` (#614) resolve to real data as of
17
+ * #609: for every recorded digest in an environment's ledger, this handler
18
+ * looks up the persisted `BuildArchiveManifest` that produced it
19
+ * (`findBuildManifestByArtifactDigest`, ../../lifecycle/build-ledger-
20
+ * store.ts) and derives `buildsByDigest`/`componentBomByDigest` from it via
21
+ * `buildLedgerEntries`/`componentBomSummary` — the same derivation
22
+ * `build-ledger.test.ts` already exercises directly, now fed by a real
23
+ * manifest instead of a hand-built one. A digest with no persisted manifest
24
+ * (predates #609, or was recorded via `chant components release` alone with
25
+ * no corresponding build) simply has no entry in either map, so `build`/
26
+ * `componentBom` fall back to `null` exactly as before — no regression for
27
+ * ledgers with no persisted manifests at all.
28
+ */
29
+ import { resolve, join, dirname } from "node:path";
30
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
31
+ import { getHeadCommit, fetchLifecycle, pushLifecycle, readSnapshot, snapshotStorageKey, StaleLifecycleBranchError } from "../../lifecycle/git.js";
32
+ import { appendReleaseRecord, readReleaseLedger, listReleaseEnvironments, latestPerComponent, resolveRunId, InvalidReleaseRecordError, } from "../../lifecycle/release-ledger.js";
33
+ import { persistReleasePlan, InvalidReleasePlanError } from "../../lifecycle/plan-ledger.js";
34
+ import { reconcileStatus, liveEvidenceFromChangeSet, compareAcrossEnvironments, mergeLiveEvidence } from "../../lifecycle/status.js";
35
+ import { commandBuildParams } from "../build-params-cli.js";
36
+ import { buildChangeSet } from "../../lifecycle/change-set.js";
37
+ import { buildLedgerEntries, componentBomSummary } from "../../lifecycle/build-ledger.js";
38
+ import { findBuildManifestByArtifactDigest, readBuildManifest } from "../../lifecycle/build-ledger-store.js";
39
+ import { loadChantConfig } from "../../config.js";
40
+ import { applyLiveEndpoint } from "../../live-endpoint.js";
41
+ import { isObservableDeclarable } from "../../declarable.js";
42
+ import { build } from "../../build.js";
43
+ import { discoverComponents } from "../../components/discover.js";
44
+ import { formatError, formatWarning, formatSuccess, formatBold } from "../format.js";
45
+ import { normalizeObservation, mergeObservations, unobservedAll } from "../../observation.js";
46
+ import { deployUnits } from "../../components/deploy-units.js";
47
+ import { sortedJsonReplacer } from "../../utils.js";
48
+ import { withoutReadFlags } from "../../lifecycle/legacy-digest.js";
49
+ /**
50
+ * chant components release <env> --component <name> --digest <sha256:...>
51
+ * [--git-sha <sha>] [--run-id <id>] [--actor <name>]
52
+ *
53
+ * `--git-sha` defaults to the current HEAD commit (`git rev-parse HEAD`);
54
+ * `--run-id` defaults to common CI run-id env vars
55
+ * (`GITHUB_RUN_ID`/`CI_PIPELINE_ID`) or a locally generated id; `--actor`
56
+ * defaults to common CI actor env vars
57
+ * (`GITHUB_ACTOR`/`GITLAB_USER_LOGIN`/`USER`) but must resolve to *something*
58
+ * — an unattributed release record defeats the point of a release ledger, so
59
+ * this is the one field with no silent fallback to a placeholder.
60
+ *
61
+ * The timestamp is always a real `new Date()` taken here, at record time —
62
+ * never threaded in from elsewhere and never mocked in production code, per
63
+ * #568: "the session cannot call Date.now() in some contexts; take the
64
+ * timestamp from the environment/CLI at record time."
65
+ *
66
+ * `--release-plan <file>` (ws-055, #2733) takes `--digest`'s place: the file is a
67
+ * release plan JSON object naming its own `digest` field, persisted
68
+ * content-addressed to `_plans/<digest>.json` (../../lifecycle/plan-
69
+ * ledger.ts) before the release record is appended, so the record's digest
70
+ * always names a plan this checkout can resolve. Passing both requires them
71
+ * to agree — a plan is content-addressed by its own digest, so a caller
72
+ * naming a different one is a mistake, not an override.
73
+ */
74
+ export async function runComponentsReleaseRecord(ctx) {
75
+ const { args } = ctx;
76
+ const environment = args.extraPositional;
77
+ if (!environment) {
78
+ console.error(formatError({
79
+ message: "Environment is required: chant components release <env> --component <name> --digest <sha256:...>",
80
+ }));
81
+ return 1;
82
+ }
83
+ const component = args.component;
84
+ let digest = args.digest;
85
+ let plan;
86
+ if (args.releasePlanFile) {
87
+ let raw;
88
+ try {
89
+ raw = await readFile(args.releasePlanFile, "utf-8");
90
+ }
91
+ catch (err) {
92
+ console.error(formatError({ message: `Could not read --release-plan ${args.releasePlanFile}: ${err instanceof Error ? err.message : String(err)}` }));
93
+ return 1;
94
+ }
95
+ let parsed;
96
+ try {
97
+ parsed = JSON.parse(raw);
98
+ }
99
+ catch (err) {
100
+ console.error(formatError({ message: `--release-plan ${args.releasePlanFile} is not valid JSON: ${err instanceof Error ? err.message : String(err)}` }));
101
+ return 1;
102
+ }
103
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
104
+ console.error(formatError({ message: `--release-plan ${args.releasePlanFile} must be a JSON object` }));
105
+ return 1;
106
+ }
107
+ plan = parsed;
108
+ if (typeof plan.digest !== "string" || plan.digest.length === 0) {
109
+ console.error(formatError({ message: `--release-plan ${args.releasePlanFile} is missing its own "digest" field — a release plan is content-addressed by its own digest` }));
110
+ return 1;
111
+ }
112
+ if (digest !== undefined && digest !== plan.digest) {
113
+ console.error(formatError({ message: `--digest ${digest} does not match --release-plan ${args.releasePlanFile}'s own digest ${plan.digest}` }));
114
+ return 1;
115
+ }
116
+ digest = plan.digest;
117
+ }
118
+ if (!component || !digest) {
119
+ console.error(formatError({
120
+ message: "--component and --digest are required",
121
+ hint: "chant components release <env> --component <name> --digest <sha256:...> [--release-plan <file>] [--git-sha <sha>] [--run-id <id>] [--actor <name>] [--approver <name>]",
122
+ }));
123
+ return 1;
124
+ }
125
+ const gitSha = args.gitSha ?? (await getHeadCommit().catch(() => undefined));
126
+ // Id + origin resolved together from the same environment (#2045), so the
127
+ // recorded runId always says which id space it lives in and how to reach it.
128
+ const { runId, runOrigin } = resolveRunId(args.runId);
129
+ const actor = args.actor ?? process.env.GITHUB_ACTOR ?? process.env.GITLAB_USER_LOGIN ?? process.env.USER;
130
+ // Who approved a gated change (#1035). Optional — omitted for an ungated
131
+ // change, and never defaulted to `actor`, since recording the approver as the
132
+ // triggerer would defeat the separation-of-duties the field exists to attest.
133
+ const approver = args.approver;
134
+ if (!gitSha) {
135
+ console.error(formatError({ message: "Could not resolve --git-sha (not in a git repo?) — pass it explicitly." }));
136
+ return 1;
137
+ }
138
+ if (!actor) {
139
+ console.error(formatError({
140
+ message: "Could not resolve --actor from the environment",
141
+ hint: "Pass --actor explicitly, or set GITHUB_ACTOR / GITLAB_USER_LOGIN / USER.",
142
+ }));
143
+ return 1;
144
+ }
145
+ const timestamp = new Date().toISOString();
146
+ try {
147
+ if (plan)
148
+ await persistReleasePlan(plan);
149
+ const { commit, record } = await appendReleaseRecord({
150
+ component,
151
+ env: environment,
152
+ digest,
153
+ gitSha,
154
+ runId,
155
+ ...(runOrigin ? { runOrigin } : {}),
156
+ timestamp,
157
+ actor,
158
+ ...(approver ? { approver } : {}),
159
+ });
160
+ await pushLifecycle();
161
+ if (args.json) {
162
+ console.log(JSON.stringify(record, null, 2));
163
+ }
164
+ else {
165
+ console.error(formatSuccess(`Recorded release: ${formatBold(component)}@${environment} -> ${digest} (commit ${commit.slice(0, 7)})`));
166
+ }
167
+ return 0;
168
+ }
169
+ catch (err) {
170
+ if (err instanceof InvalidReleaseRecordError || err instanceof InvalidReleasePlanError) {
171
+ console.error(formatError({ message: err.message }));
172
+ return 1;
173
+ }
174
+ if (err instanceof StaleLifecycleBranchError) {
175
+ console.error(formatError({
176
+ message: err.message,
177
+ hint: `Pull and retry: \`git fetch origin chant/lifecycle:chant/lifecycle\` && \`chant components release ${environment} --component ${component} --digest ${digest}\`.`,
178
+ }));
179
+ return 1;
180
+ }
181
+ throw err;
182
+ }
183
+ }
184
+ /**
185
+ * chant components export <env> --component <name> [--digest <manifestDigest>]
186
+ * -o <dir> [--json]
187
+ *
188
+ * Materializes a persisted `BuildArchiveManifest` (#609,
189
+ * ../../lifecycle/build-ledger-store.ts) to a portable directory: every
190
+ * `image`/`template`/`asset`/`sbom` entry is copied byte-for-byte from where
191
+ * the build that produced it left it on disk (its `path`, resolved against
192
+ * the current working directory — the same directory a component's
193
+ * `docker-build`/`addArchiveTemplate`/etc. step wrote it into) under that
194
+ * same archive-relative path in `-o <dir>`, plus a `manifest.json` so the
195
+ * directory is self-describing without chant. No re-synthesis: this reads
196
+ * bytes a prior `chant build`/`run --components` already produced, never
197
+ * regenerates them (#929) — the "byte-identical, promote-by-digest" contract
198
+ * the build archive is built on (see ../../components/verbs/build-archive.ts).
199
+ *
200
+ * Manifest resolution:
201
+ * - `--digest <manifestDigest>` reads it directly (`readBuildManifest`),
202
+ * independent of any environment/release record.
203
+ * - Otherwise resolves "the manifest behind this component's most recent
204
+ * successful run" in `<env>`: the latest release record's own
205
+ * `manifestDigest` when it was recorded, else a reverse lookup by its
206
+ * promoted artifact digest (`findBuildManifestByArtifactDigest`) — the
207
+ * same join `chant components status` already performs.
208
+ *
209
+ * A source file missing on disk (the build that produced the manifest ran
210
+ * somewhere else, or its output was since cleaned) is reported per entry
211
+ * rather than silently dropped; the command exits non-zero so an incomplete
212
+ * export is never mistaken for a complete one.
213
+ */
214
+ export async function runComponentsExport(ctx) {
215
+ const { args } = ctx;
216
+ const environment = args.extraPositional;
217
+ const component = args.component;
218
+ const outDir = args.output;
219
+ const usage = "chant components export <env> --component <name> [--digest <manifestDigest>] -o <dir>";
220
+ if (!outDir) {
221
+ console.error(formatError({ message: "-o/--output <dir> is required", hint: usage }));
222
+ return 1;
223
+ }
224
+ await fetchLifecycle();
225
+ let manifest;
226
+ if (args.digest) {
227
+ const resolved = await readBuildManifest(args.digest);
228
+ if (!resolved) {
229
+ console.error(formatError({ message: `No persisted build manifest found for digest ${args.digest}` }));
230
+ return 1;
231
+ }
232
+ if (component && resolved.component !== component) {
233
+ console.error(formatWarning({
234
+ message: `--component ${component} does not match the resolved manifest's component (${resolved.component}) — exporting the manifest at --digest ${args.digest} anyway`,
235
+ }));
236
+ }
237
+ manifest = resolved;
238
+ }
239
+ else {
240
+ if (!environment || !component) {
241
+ console.error(formatError({
242
+ message: "Environment and --component are required unless --digest <manifestDigest> is given",
243
+ hint: usage,
244
+ }));
245
+ return 1;
246
+ }
247
+ const ledger = await readReleaseLedger(environment);
248
+ const latest = latestPerComponent(ledger.records).get(component);
249
+ if (!latest) {
250
+ console.error(formatError({
251
+ message: `No release record for component "${component}" in environment "${environment}"`,
252
+ }));
253
+ return 1;
254
+ }
255
+ const resolved = latest.manifestDigest
256
+ ? await readBuildManifest(latest.manifestDigest)
257
+ : await findBuildManifestByArtifactDigest(latest.digest);
258
+ if (!resolved) {
259
+ console.error(formatError({
260
+ message: `No persisted build manifest found for ${component}@${environment}'s recorded digest ${latest.digest}`,
261
+ hint: "The build predates #609, or was recorded via `chant components release` alone with no corresponding `chant build`/`run --components`.",
262
+ }));
263
+ return 1;
264
+ }
265
+ manifest = resolved;
266
+ }
267
+ const targetDir = resolve(outDir);
268
+ const sourceRoot = resolve(".");
269
+ await mkdir(targetDir, { recursive: true });
270
+ const entries = [...manifest.contents].sort((a, b) => a.path.localeCompare(b.path));
271
+ const results = [];
272
+ for (const entry of entries) {
273
+ try {
274
+ const bytes = await readFile(resolve(sourceRoot, entry.path));
275
+ const target = join(targetDir, entry.path);
276
+ await mkdir(dirname(target), { recursive: true });
277
+ await writeFile(target, bytes);
278
+ results.push({ kind: entry.kind, path: entry.path, digest: entry.digest, status: "materialized" });
279
+ }
280
+ catch (err) {
281
+ results.push({
282
+ kind: entry.kind,
283
+ path: entry.path,
284
+ digest: entry.digest,
285
+ status: "missing",
286
+ reason: err instanceof Error ? err.message : String(err),
287
+ });
288
+ }
289
+ }
290
+ // The exported manifest is the recorded one; read-side flags (#2514) stay out of it.
291
+ await writeFile(join(targetDir, "manifest.json"), JSON.stringify(withoutReadFlags(manifest), sortedJsonReplacer, 2));
292
+ const missing = results.filter((r) => r.status === "missing");
293
+ if (args.json) {
294
+ console.log(JSON.stringify({
295
+ component: manifest.component,
296
+ manifestDigest: manifest.manifestDigest,
297
+ ...(manifest.flags ? { flags: manifest.flags } : {}),
298
+ outDir: targetDir,
299
+ entries: results,
300
+ }, null, 2));
301
+ }
302
+ else {
303
+ console.log(formatBold(`${manifest.component} (${manifest.manifestDigest}) -> ${targetDir}`));
304
+ for (const r of results) {
305
+ const status = r.status === "materialized" ? formatSuccess("ok") : formatError({ message: r.reason ?? "missing" });
306
+ console.log(` ${r.kind.padEnd(10)}${r.path.padEnd(40)}${status}`);
307
+ }
308
+ console.log(` ${"manifest".padEnd(10)}${"manifest.json".padEnd(40)}${formatSuccess("ok")}`);
309
+ }
310
+ if (missing.length > 0) {
311
+ console.error(formatError({
312
+ message: `${missing.length} of ${results.length} archive entr${missing.length === 1 ? "y" : "ies"} not found on disk — export incomplete`,
313
+ hint: `Run this from the checkout where the build that produced ${manifest.manifestDigest} still has its output on disk.`,
314
+ }));
315
+ return 1;
316
+ }
317
+ console.error(formatSuccess(`Exported ${results.length} entr${results.length === 1 ? "y" : "ies"} + manifest.json to ${targetDir}`));
318
+ return 0;
319
+ }
320
+ /**
321
+ * chant components status [env] [--live] [--json] [--compare-to <env>]
322
+ *
323
+ * Answers "what's built" and "what's deployed where," joined by digest.
324
+ * Without `--live`, reports the release ledger alone (recorded vs unrecorded
325
+ * is meaningless without live evidence, so every recorded row reports
326
+ * `unknown` reconciliation — still useful as a pure ledger read). With
327
+ * `--live`, joins against `lifecycle diff --live` + ownership (reusing
328
+ * `buildChangeSet`, the same classification `lifecycle plan` already
329
+ * trusts) to flag unrecorded deploys and drift.
330
+ *
331
+ * Omitting `<env>` reports every environment that has release records.
332
+ * `--compare-to <env>` answers the single-query cross-environment question
333
+ * the epic names explicitly: "which build is in `<env>`, and is it the one
334
+ * tested in `<compare-to>`."
335
+ */
336
+ /** Every distinct `cfn-deploy` stack name a component's deploy phases target. A
337
+ * step may itself be a nested `Phase`, so walk recursively; a resolved component
338
+ * carries the stack as a concrete string.
339
+ *
340
+ * Exported for `chant graph --live` (../handlers/graph.ts's `runGraphLive`,
341
+ * #57): the same per-component stack resolution this file uses for `chant
342
+ * components status --live` is also how the live graph learns which stacks to
343
+ * observe on a multi-stack, per-component project (`describeResources`'s
344
+ * single-stack-named-after-the-environment convention never matches one). */
345
+ export function cfnDeployStacks(deploy) {
346
+ // The CloudFormation slice of the generic deploy-unit walk (#1495) — kept
347
+ // because `chant graph --live`'s stack enrichment is genuinely CFN-shaped.
348
+ return deployUnits(deploy)
349
+ .filter((u) => u.lexicon === "aws")
350
+ .map((u) => u.unit);
351
+ }
352
+ /**
353
+ * Per-component stack presence for `--live`: resolve each component's own
354
+ * `cfn-deploy` stack(s) and observe them directly via a lexicon's
355
+ * `describeStackStatus`. This is the multi-stack component signal that
356
+ * `describeResources` (entity-keyed, single-stack-per-env) misses (#57): a
357
+ * component whose stack is present reconciles as live/owned, joined to the DAG
358
+ * by component name. Components with no `cfn-deploy` stack — or where the
359
+ * observer can't determine any of theirs — are omitted, so the change-set
360
+ * evidence still governs them.
361
+ */
362
+ async function observeComponentStacks(components, plugins, environment) {
363
+ // Observer per unit's own lexicon (#1495): a component's kubectl-apply unit
364
+ // is read by the k8s lexicon, its cfn-deploy stack by aws. A unit whose
365
+ // lexicon ships no describeStackStatus is skipped — the same absent-observer
366
+ // degradation as before, per unit instead of per project.
367
+ const observerFor = (lexicon) => plugins.find((p) => p.name === lexicon && p.describeStackStatus);
368
+ const evidence = new Map();
369
+ for (const [name, { component }] of components) {
370
+ const units = deployUnits(component.deploy).filter((u) => observerFor(u.lexicon));
371
+ const stacks = units.map((u) => u.unit);
372
+ if (stacks.length === 0)
373
+ continue;
374
+ const observed = await Promise.all(units.map((u) => observerFor(u.lexicon).describeStackStatus({ environment, stack: u.unit }).catch(() => null)));
375
+ const determinate = observed.filter((o) => o !== null);
376
+ if (determinate.length === 0) {
377
+ // Every stack read came back indeterminate (the lexicon's own "I cannot
378
+ // tell" — see describeStackStatus). Record the hole rather than dropping
379
+ // the component, which would leave a recorded component reading `stale`
380
+ // (#1089).
381
+ evidence.set(name, {
382
+ live: false,
383
+ unobserved: {
384
+ reason: "read-failed",
385
+ detail: `no determinate status for stack(s): ${stacks.join(", ")}`,
386
+ },
387
+ });
388
+ continue;
389
+ }
390
+ const present = determinate.every((o) => o.present);
391
+ // Surface the (first present, else first) stack's raw status for a richer
392
+ // palette than the reconciliation verdict. One cfn-deploy stack per component
393
+ // is the norm; a multi-stack component reports its representative unit.
394
+ const repr = determinate.find((o) => o.present) ?? determinate[0];
395
+ // Some-but-not-all present is its own answer (#1528): `live` stays false —
396
+ // deployed means all of it — but the split and the missing unit names ride
397
+ // along, so the row can say "half up" instead of "nothing observed live"
398
+ // while its own `stack` field shows a healthy unit.
399
+ const presentCount = determinate.filter((o) => o.present).length;
400
+ const missing = determinate.filter((o) => !o.present).map((o) => o.stack);
401
+ evidence.set(name, {
402
+ live: present,
403
+ ownership: present ? "owned" : undefined,
404
+ stack: { name: repr.stack, status: repr.status, healthy: repr.healthy },
405
+ ...(presentCount > 0 && !present ? { partial: { present: presentCount, total: determinate.length, missing } } : {}),
406
+ });
407
+ }
408
+ return evidence;
409
+ }
410
+ /**
411
+ * The last lifecycle snapshot(s) for one lexicon, as `components status --live`
412
+ * reads them for its drift baseline (#2513). Reads the stack-keyed snapshot for
413
+ * each stack the status read targets and the unstacked one `lifecycle plan`
414
+ * reads, merging resources (a stack's own snapshot wins) and remembering, per
415
+ * entity, which snapshot's timestamp it came from. A missing or unreadable
416
+ * snapshot is no baseline, never an error: with none, nothing can have changed
417
+ * since, and the status falls back to identity and presence.
418
+ */
419
+ async function readStatusBaseline(environment, lexicon, stacks) {
420
+ const keys = [...new Set([...stacks.filter((s) => !!s).map((s) => snapshotStorageKey(lexicon, s)), snapshotStorageKey(lexicon)])];
421
+ let resources;
422
+ const timestamps = new Map();
423
+ for (const key of keys) {
424
+ let snap;
425
+ try {
426
+ const content = await readSnapshot(environment, key);
427
+ snap = content ? JSON.parse(content) : undefined;
428
+ }
429
+ catch {
430
+ snap = undefined;
431
+ }
432
+ if (!snap?.resources)
433
+ continue;
434
+ resources ?? (resources = {});
435
+ for (const [name, meta] of Object.entries(snap.resources)) {
436
+ if (Object.prototype.hasOwnProperty.call(resources, name))
437
+ continue;
438
+ resources[name] = meta;
439
+ if (snap.timestamp)
440
+ timestamps.set(name, snap.timestamp);
441
+ }
442
+ }
443
+ return { resources, timestamps };
444
+ }
445
+ export async function runComponentsStatus(ctx) {
446
+ const { args, plugins, serializers } = ctx;
447
+ const requestedEnv = args.extraPositional;
448
+ await fetchLifecycle();
449
+ const environments = requestedEnv ? [requestedEnv] : await listReleaseEnvironments();
450
+ if (environments.length === 0) {
451
+ console.error(formatWarning({
452
+ message: requestedEnv
453
+ ? `No release records found for environment "${requestedEnv}"`
454
+ : "No release records found in any environment",
455
+ }));
456
+ return args.json ? (console.log(JSON.stringify([])), 0) : 0;
457
+ }
458
+ // Discover components (best-effort) so a live/owned-but-never-recorded
459
+ // component still gets a row, not just those that appear in the ledger.
460
+ const { config } = await loadChantConfig(resolve("."));
461
+ const discovery = await discoverComponents(resolve(args.src ?? config.sourceDir ?? "."), {
462
+ sandbox: args.sandbox,
463
+ });
464
+ const allComponents = [...discovery.components.keys()];
465
+ // Component -> live entity/resource name(s) it owns (#598), when declared
466
+ // explicitly via `Component.liveNames`. Components with no `liveNames`
467
+ // simply have no entry here, so `liveEvidenceFromChangeSet` falls back to
468
+ // the name == entity join — no regression for the pilot components.
469
+ const liveNameMapping = new Map();
470
+ for (const [name, discovered] of discovery.components) {
471
+ if (discovered.component.liveNames?.length) {
472
+ liveNameMapping.set(name, discovered.component.liveNames);
473
+ }
474
+ }
475
+ const allRows = [];
476
+ const ledgerByEnv = new Map();
477
+ for (const environment of environments) {
478
+ const ledger = await readReleaseLedger(environment);
479
+ ledgerByEnv.set(environment, ledger);
480
+ if (ledger.malformed > 0) {
481
+ console.error(formatWarning({ message: `${environment}: skipped ${ledger.malformed} malformed ledger line(s)` }));
482
+ }
483
+ let liveEvidence;
484
+ if (args.live) {
485
+ // #1166 — an environment can declare its own endpoint (a local emulator
486
+ // like Floci), applied here unless the ambient shell already set it, so
487
+ // `--live` status doesn't silently read the wrong account per environment.
488
+ const endpointResult = applyLiveEndpoint(config.environments, environment, plugins.filter((p) => p.describeResources || p.describeStackStatus));
489
+ if (endpointResult.notice)
490
+ console.error(formatWarning({ message: endpointResult.notice }));
491
+ try {
492
+ const targetSerializers = serializers;
493
+ // With this invocation's parameters (#1483). Built on defaults, the
494
+ // declared half of the comparison is a different estate from the one
495
+ // deployed, and every resource the real parameter declares reads as
496
+ // absent.
497
+ const statusParams = await commandBuildParams(config.buildParams, args);
498
+ if (!statusParams)
499
+ return 1;
500
+ const buildResult = await build(resolve(args.src ?? config.sourceDir ?? "."), targetSerializers, undefined, {
501
+ buildParams: statusParams,
502
+ });
503
+ // Which deployed stack(s) to read the change set from (behold#100).
504
+ //
505
+ // `describeResources` defaults to the single-stack convention — the
506
+ // stack named after the environment — which is wrong for exactly the
507
+ // projects this command exists for: a component project deploys the
508
+ // stack its own `cfn-deploy` names, and that is almost never the env
509
+ // name. Every declared resource then came back absent, so the rollup
510
+ // #1300 computes read `present: 0` over a healthy estate. That was
511
+ // invisible while nothing consumed the rollup; behold#100 paints from
512
+ // it, so it has to be right.
513
+ //
514
+ // The components' own `cfn-deploy` stacks are the authority (the same
515
+ // ones `observeComponentStacks` reads below), with `config.stacks` as
516
+ // the declared override for a project whose stacks aren't derivable
517
+ // from a deploy step. `[undefined]` keeps the old single-read
518
+ // behaviour for a project with neither.
519
+ const componentStackNames = new Set();
520
+ for (const { component } of discovery.components.values()) {
521
+ for (const stack of cfnDeployStacks(component.deploy))
522
+ componentStackNames.add(stack);
523
+ }
524
+ for (const stack of config.stacks ?? [])
525
+ componentStackNames.add(stack.name);
526
+ const readTargets = componentStackNames.size ? [...componentStackNames] : [undefined];
527
+ const merged = { env: environment, entries: [] };
528
+ const observations = new Map();
529
+ for (const plugin of plugins) {
530
+ if (!plugin.describeResources)
531
+ continue;
532
+ const declared = new Set();
533
+ const entities = new Map();
534
+ for (const [name, entity] of buildResult.entities) {
535
+ // Resource declarables only (see lifecycle/observe.ts).
536
+ if (entity.lexicon === plugin.name && isObservableDeclarable(entity)) {
537
+ declared.add(name);
538
+ entities.set(name, {
539
+ entityType: entity.entityType,
540
+ props: (entity.props != null ? entity.props : {}),
541
+ });
542
+ }
543
+ }
544
+ let observed;
545
+ try {
546
+ observed = mergeObservations(await Promise.all(readTargets.map(async (stack) => normalizeObservation(await plugin.describeResources({
547
+ environment,
548
+ buildOutput: "",
549
+ entityNames: Array.from(declared),
550
+ entities,
551
+ ...(stack ? { stack } : {}),
552
+ })))));
553
+ }
554
+ catch (err) {
555
+ // A failed read is not an empty environment (#1089): mark every
556
+ // declared entity NOT-OBSERVED so the status rows say "unknown"
557
+ // rather than "stale" (recorded, and nothing live).
558
+ const message = err instanceof Error ? err.message : String(err);
559
+ console.error(formatWarning({ message: `${plugin.name}: describeResources failed — ${message} (components in this lexicon report unknown, not stale)` }));
560
+ observed = { resources: {}, unobserved: unobservedAll(declared, "read-failed", message, entities), queried: {}, sources: {}, notes: [] };
561
+ }
562
+ // The last lifecycle snapshot is the prior observation drift is
563
+ // measured against (#2513) — the same one `lifecycle plan` reads, so
564
+ // `drifted` here means what `update` means there. Without it every
565
+ // live, declared entity classified `noop` and `drifted` could not be
566
+ // reached. Each entity remembers its snapshot's timestamp so the
567
+ // status join can ignore a change made before the release.
568
+ const baseline = await readStatusBaseline(environment, plugin.name, readTargets);
569
+ const cs = buildChangeSet(environment, {
570
+ declared,
571
+ observedNow: observed.resources,
572
+ observedThen: baseline.resources,
573
+ unobserved: observed.unobserved,
574
+ }, { lexicon: plugin.name });
575
+ merged.entries.push(...cs.entries);
576
+ for (const entry of cs.entries) {
577
+ observations.set(entry.name, {
578
+ now: observed.resources[entry.name],
579
+ then: baseline.resources?.[entry.name],
580
+ thenAt: baseline.timestamps.get(entry.name),
581
+ });
582
+ }
583
+ }
584
+ liveEvidence = liveEvidenceFromChangeSet(merged, liveNameMapping, { observations });
585
+ // Multi-stack component projects (each component owns its own stack) are
586
+ // invisible to the entity-keyed, single-stack `describeResources` above —
587
+ // observe each component's own cfn-deploy stack directly and overlay it as
588
+ // the authoritative presence signal (#57).
589
+ const anyObserver = plugins.some((p) => p.describeStackStatus);
590
+ if (anyObserver) {
591
+ const stackEvidence = await observeComponentStacks(discovery.components, plugins, environment);
592
+ liveEvidence = mergeLiveEvidence(liveEvidence, stackEvidence);
593
+ }
594
+ }
595
+ finally {
596
+ endpointResult.restore();
597
+ }
598
+ }
599
+ // #609: resolve the persisted build manifest behind each recorded digest
600
+ // (if any) so `build`/`componentBom` are real queries, not always null.
601
+ const buildsByDigest = new Map();
602
+ const componentBomByDigest = new Map();
603
+ const recordedDigests = new Set(ledger.records.map((r) => r.digest));
604
+ for (const digest of recordedDigests) {
605
+ const manifest = await findBuildManifestByArtifactDigest(digest);
606
+ if (!manifest)
607
+ continue;
608
+ const bom = componentBomSummary(manifest);
609
+ if (bom)
610
+ componentBomByDigest.set(digest, bom);
611
+ const ledgerEntries = await buildLedgerEntries(manifest);
612
+ const entry = ledgerEntries.find((e) => e.digest === digest);
613
+ if (entry)
614
+ buildsByDigest.set(digest, entry);
615
+ }
616
+ const rows = reconcileStatus(environment, ledger.records, {
617
+ liveEvidence,
618
+ allComponents,
619
+ buildsByDigest,
620
+ componentBomByDigest,
621
+ });
622
+ for (const row of rows) {
623
+ allRows.push({
624
+ component: row.component,
625
+ env: row.env,
626
+ recorded: row.recorded
627
+ ? {
628
+ digest: row.recorded.digest,
629
+ gitSha: row.recorded.gitSha,
630
+ runId: row.recorded.runId,
631
+ timestamp: row.recorded.timestamp,
632
+ actor: row.recorded.actor,
633
+ ...(row.recorded.flags ? { flags: row.recorded.flags } : {}),
634
+ }
635
+ : null,
636
+ build: row.build
637
+ ? {
638
+ manifestDigest: row.build.manifestDigest,
639
+ referrers: row.build.referrers.map((r) => r.kind),
640
+ sbom: row.build.sbom
641
+ ? {
642
+ mediaType: row.build.sbom.mediaType,
643
+ packageCount: row.build.sbom.packageCount,
644
+ generator: row.build.sbom.generator,
645
+ source: row.build.sbom.source,
646
+ }
647
+ : null,
648
+ reproducibility: row.build.reproducibility
649
+ ? { basis: row.build.reproducibility.basis, verifyBy: row.build.reproducibility.verifyBy }
650
+ : null,
651
+ }
652
+ : null,
653
+ componentBom: row.componentBom
654
+ ? {
655
+ leaves: row.componentBom.leaves.map((l) => ({
656
+ path: l.path,
657
+ bomKind: l.bomKind,
658
+ subjectDigest: l.subjectDigest,
659
+ mediaType: l.mediaType,
660
+ packageCount: l.packageCount,
661
+ generator: l.generator,
662
+ })),
663
+ totalPackageCount: row.componentBom.totalPackageCount,
664
+ isAssembly: row.componentBom.isAssembly,
665
+ }
666
+ : null,
667
+ reconciliation: row.reconciliation,
668
+ detail: row.detail,
669
+ ...(row.live !== undefined ? { live: row.live } : {}),
670
+ ...(row.unobserved ? { unobserved: row.unobserved } : {}),
671
+ ...(row.stack ? { stack: row.stack } : {}),
672
+ ...(row.resources ? { resources: row.resources } : {}),
673
+ });
674
+ }
675
+ }
676
+ // `--compare-to` — single-query cross-env digest comparison, per component.
677
+ let comparisons;
678
+ if (args.compareTo && requestedEnv) {
679
+ const otherLedger = ledgerByEnv.get(args.compareTo) ?? (await readReleaseLedger(args.compareTo));
680
+ const componentsToCompare = new Set([...allRows.map((r) => r.component)]);
681
+ comparisons = [...componentsToCompare].sort().map((component) => compareAcrossEnvironments(component, { name: requestedEnv, records: ledgerByEnv.get(requestedEnv)?.records ?? [] }, { name: args.compareTo, records: otherLedger.records }));
682
+ }
683
+ if (args.json) {
684
+ console.log(JSON.stringify(comparisons ? { rows: allRows, comparisons } : allRows, null, 2));
685
+ return 0;
686
+ }
687
+ console.log(formatBold("COMPONENT".padEnd(24)) +
688
+ formatBold("ENV".padEnd(12)) +
689
+ formatBold("DIGEST".padEnd(20)) +
690
+ formatBold("STATUS".padEnd(14)) +
691
+ formatBold("DETAIL"));
692
+ console.log("-".repeat(110));
693
+ for (const row of allRows) {
694
+ const digestShort = row.recorded ? row.recorded.digest.slice(0, 19) : "-";
695
+ console.log(row.component.padEnd(24) +
696
+ row.env.padEnd(12) +
697
+ digestShort.padEnd(20) +
698
+ row.reconciliation.padEnd(14) +
699
+ row.detail +
700
+ (row.recorded?.flags?.length ? ` [${row.recorded.flags.join(", ")}]` : ""));
701
+ }
702
+ if (comparisons) {
703
+ console.log(`\n${formatBold(`Cross-check: ${requestedEnv} vs ${args.compareTo}`)}`);
704
+ for (const c of comparisons) {
705
+ const verdict = c.same
706
+ ? "same build"
707
+ : c.mixedDigestForms
708
+ ? "different digests, one recorded before real SHA-256 (legacy-digest), so this cannot tell"
709
+ : "DIFFERENT builds";
710
+ console.log(` ${c.component}: ${c.digestA ?? "(none)"} vs ${c.digestB ?? "(none)"} — ${verdict}`);
711
+ }
712
+ }
713
+ const unrecordedCount = allRows.filter((r) => r.reconciliation === "unrecorded").length;
714
+ const driftedCount = allRows.filter((r) => r.reconciliation === "drifted").length;
715
+ if (unrecordedCount === 0 && driftedCount === 0) {
716
+ console.error(formatSuccess(`No unrecorded deploys or drift across ${allRows.length} row(s)`));
717
+ }
718
+ else {
719
+ console.error(formatWarning({ message: `${unrecordedCount} unrecorded, ${driftedCount} drifted` }));
720
+ }
721
+ return 0;
722
+ }
723
+ /** Fallback for `chant components` with no/unknown subcommand. */
724
+ export async function runComponentsUnknown(ctx) {
725
+ console.error(formatError({
726
+ message: `Unknown components subcommand: ${ctx.args.path}`,
727
+ hint: "Available: chant components status [env], chant components release <env>, chant components export <env>",
728
+ }));
729
+ return 1;
730
+ }