@intentius/chant 0.124.13 → 0.124.15

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 (991) 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.d.ts +6 -0
  35. package/dist/build.d.ts.map +1 -1
  36. package/dist/build.js +669 -0
  37. package/dist/builder.js +44 -0
  38. package/dist/cdk/advise.js +30 -0
  39. package/dist/cdk/assembly.js +122 -0
  40. package/dist/cdk/graph.js +444 -0
  41. package/dist/cdk/tier-map.js +64 -0
  42. package/dist/cdk/types.js +24 -0
  43. package/dist/change-set.d.ts +24 -2
  44. package/dist/change-set.d.ts.map +1 -1
  45. package/dist/change-set.js +361 -0
  46. package/dist/child-project.js +21 -0
  47. package/dist/ci-jobs.d.ts +227 -0
  48. package/dist/ci-jobs.d.ts.map +1 -0
  49. package/dist/ci-jobs.js +448 -0
  50. package/dist/claimed-fields.js +135 -0
  51. package/dist/cli/build-options.js +70 -0
  52. package/dist/cli/build-params-cli.js +139 -0
  53. package/dist/cli/command-group.js +123 -0
  54. package/dist/cli/commands/audit-agents.js +326 -0
  55. package/dist/cli/commands/audit.js +571 -0
  56. package/dist/cli/commands/build.js +920 -0
  57. package/dist/cli/commands/carve-apply.js +153 -0
  58. package/dist/cli/commands/carve-bridge.js +201 -0
  59. package/dist/cli/commands/carve-emit.js +332 -0
  60. package/dist/cli/commands/carve-status.js +119 -0
  61. package/dist/cli/commands/carve.js +204 -0
  62. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  63. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  64. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  65. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  66. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  67. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  68. package/dist/cli/commands/check-lexicon.js +766 -0
  69. package/dist/cli/commands/describe.js +85 -0
  70. package/dist/cli/commands/diff.js +175 -0
  71. package/dist/cli/commands/doctor.js +350 -0
  72. package/dist/cli/commands/import-agents.js +155 -0
  73. package/dist/cli/commands/import.js +670 -0
  74. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  75. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  76. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  77. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  78. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  79. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  80. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  81. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  82. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  83. package/dist/cli/commands/init-lexicon.js +172 -0
  84. package/dist/cli/commands/init.js +381 -0
  85. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  86. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  87. package/dist/cli/commands/licenses.js +125 -0
  88. package/dist/cli/commands/lint.d.ts.map +1 -1
  89. package/dist/cli/commands/lint.js +948 -0
  90. package/dist/cli/commands/list.js +63 -0
  91. package/dist/cli/commands/migrate.d.ts.map +1 -1
  92. package/dist/cli/commands/migrate.js +423 -0
  93. package/dist/cli/commands/onboard.js +403 -0
  94. package/dist/cli/commands/pinned-upgrade.js +191 -0
  95. package/dist/cli/commands/update.js +194 -0
  96. package/dist/cli/commands/vendor.js +217 -0
  97. package/dist/cli/conflict-check.js +104 -0
  98. package/dist/cli/debug.js +8 -0
  99. package/dist/cli/format.js +104 -0
  100. package/dist/cli/handlers/build.js +267 -0
  101. package/dist/cli/handlers/carve-apply.js +30 -0
  102. package/dist/cli/handlers/carve-bridge.js +28 -0
  103. package/dist/cli/handlers/carve-emit.js +50 -0
  104. package/dist/cli/handlers/carve-status.js +26 -0
  105. package/dist/cli/handlers/carve.js +40 -0
  106. package/dist/cli/handlers/change-set.js +46 -0
  107. package/dist/cli/handlers/components.js +730 -0
  108. package/dist/cli/handlers/dev.js +113 -0
  109. package/dist/cli/handlers/emulator.js +233 -0
  110. package/dist/cli/handlers/explain.js +54 -0
  111. package/dist/cli/handlers/fan-out.js +422 -0
  112. package/dist/cli/handlers/gate-resume.js +275 -0
  113. package/dist/cli/handlers/generate.js +84 -0
  114. package/dist/cli/handlers/graph.js +969 -0
  115. package/dist/cli/handlers/init.js +102 -0
  116. package/dist/cli/handlers/lifecycle.js +1727 -0
  117. package/dist/cli/handlers/lint.js +62 -0
  118. package/dist/cli/handlers/migrate.js +48 -0
  119. package/dist/cli/handlers/misc.js +391 -0
  120. package/dist/cli/handlers/operator.js +1162 -0
  121. package/dist/cli/handlers/override-approve.js +102 -0
  122. package/dist/cli/handlers/pr.js +503 -0
  123. package/dist/cli/handlers/promote.js +342 -0
  124. package/dist/cli/handlers/run-generate.js +206 -0
  125. package/dist/cli/handlers/run-wave.js +66 -0
  126. package/dist/cli/handlers/run.js +1191 -0
  127. package/dist/cli/handlers/scenario.js +325 -0
  128. package/dist/cli/handlers/search.js +924 -0
  129. package/dist/cli/handlers/serve.js +32 -0
  130. package/dist/cli/handlers/vendor.js +154 -0
  131. package/dist/cli/index.js +3 -0
  132. package/dist/cli/is-entry-point.js +23 -0
  133. package/dist/cli/lsp/capabilities.js +28 -0
  134. package/dist/cli/lsp/diagnostics.js +34 -0
  135. package/dist/cli/lsp/server.js +329 -0
  136. package/dist/cli/main.d.ts.map +1 -1
  137. package/dist/cli/main.js +2540 -0
  138. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  139. package/dist/cli/mcp/op-tools.js +306 -0
  140. package/dist/cli/mcp/resource-handlers.js +258 -0
  141. package/dist/cli/mcp/resources/context.js +85 -0
  142. package/dist/cli/mcp/server.js +353 -0
  143. package/dist/cli/mcp/tools/build.js +111 -0
  144. package/dist/cli/mcp/tools/composites.js +95 -0
  145. package/dist/cli/mcp/tools/explain.js +166 -0
  146. package/dist/cli/mcp/tools/import.js +49 -0
  147. package/dist/cli/mcp/tools/lint.js +41 -0
  148. package/dist/cli/mcp/tools/scaffold.js +111 -0
  149. package/dist/cli/mcp/tools/search.js +112 -0
  150. package/dist/cli/mcp/types.js +1 -0
  151. package/dist/cli/mcp/workspace-plugins.js +91 -0
  152. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  153. package/dist/cli/mcp/workspace-tools.js +564 -0
  154. package/dist/cli/mcp-config.js +70 -0
  155. package/dist/cli/plugins.js +313 -0
  156. package/dist/cli/registry.js +23 -0
  157. package/dist/cli/reporters/stylish.js +329 -0
  158. package/dist/cli/version.js +15 -0
  159. package/dist/cli/watch.js +79 -0
  160. package/dist/codegen/bound-property-types.js +82 -0
  161. package/dist/codegen/coverage.js +119 -0
  162. package/dist/codegen/docs-file-markers.js +60 -0
  163. package/dist/codegen/docs-pages.js +115 -0
  164. package/dist/codegen/docs-rule-scanning.js +164 -0
  165. package/dist/codegen/docs-rules.js +76 -0
  166. package/dist/codegen/docs-sections.js +117 -0
  167. package/dist/codegen/docs-sidebar.js +65 -0
  168. package/dist/codegen/docs-types.js +4 -0
  169. package/dist/codegen/docs.js +356 -0
  170. package/dist/codegen/fetch.js +340 -0
  171. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  172. package/dist/codegen/generate-registry.js +71 -0
  173. package/dist/codegen/generate-runtime-index.js +56 -0
  174. package/dist/codegen/generate-typescript.js +119 -0
  175. package/dist/codegen/generate.js +115 -0
  176. package/dist/codegen/json-patch.js +141 -0
  177. package/dist/codegen/json-schema-to-ts.js +344 -0
  178. package/dist/codegen/json-schema.js +246 -0
  179. package/dist/codegen/lexicon-regen.js +412 -0
  180. package/dist/codegen/naming.js +217 -0
  181. package/dist/codegen/okf-lexicon.js +245 -0
  182. package/dist/codegen/package.js +150 -0
  183. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  184. package/dist/codegen/pinned-upgrade.js +494 -0
  185. package/dist/codegen/registry.js +60 -0
  186. package/dist/codegen/rehype-base-url.mjs +68 -0
  187. package/dist/codegen/rolling-upgrade.js +217 -0
  188. package/dist/codegen/surface-snapshot.js +537 -0
  189. package/dist/codegen/testdata/postgres-tags.json +242 -0
  190. package/dist/codegen/topo-sort.js +36 -0
  191. package/dist/codegen/typecheck.js +115 -0
  192. package/dist/codegen/validate.js +200 -0
  193. package/dist/codegen/version-bump.js +35 -0
  194. package/dist/components/auto-release.js +143 -0
  195. package/dist/components/builders.js +47 -0
  196. package/dist/components/capability-plugin-loader.js +175 -0
  197. package/dist/components/capability-plugin-schema.js +46 -0
  198. package/dist/components/capability-plugin.js +99 -0
  199. package/dist/components/capability.js +60 -0
  200. package/dist/components/changed-files.js +72 -0
  201. package/dist/components/cli-support.js +427 -0
  202. package/dist/components/component.js +120 -0
  203. package/dist/components/component.schema.json +271 -0
  204. package/dist/components/config-defaults.js +130 -0
  205. package/dist/components/deploy-units.js +60 -0
  206. package/dist/components/discover.d.ts.map +1 -1
  207. package/dist/components/discover.js +189 -0
  208. package/dist/components/driver-output.js +86 -0
  209. package/dist/components/driver.js +728 -0
  210. package/dist/components/fan-out-output.js +165 -0
  211. package/dist/components/fan-out-record.js +94 -0
  212. package/dist/components/fan-out-run.js +373 -0
  213. package/dist/components/fan-out-support.js +60 -0
  214. package/dist/components/fan-out.js +273 -0
  215. package/dist/components/gate-plan.js +41 -0
  216. package/dist/components/gated-wave-pipeline.js +46 -0
  217. package/dist/components/index.js +24 -0
  218. package/dist/components/layers.js +28 -0
  219. package/dist/components/manifest-persistence.js +108 -0
  220. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  221. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  222. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  223. package/dist/components/pilots/lambda.pilot.js +52 -0
  224. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  225. package/dist/components/pilots/project.js +12 -0
  226. package/dist/components/pr-pipeline.d.ts.map +1 -1
  227. package/dist/components/pr-pipeline.js +135 -0
  228. package/dist/components/pr-run.js +363 -0
  229. package/dist/components/presets/ecs-fargate.js +72 -0
  230. package/dist/components/presets/index.js +28 -0
  231. package/dist/components/presets/lambda.js +34 -0
  232. package/dist/components/presets/single-host-compose.js +41 -0
  233. package/dist/components/promote.js +549 -0
  234. package/dist/components/registry.js +34 -0
  235. package/dist/components/run-progress.js +33 -0
  236. package/dist/components/sandbox/driver.d.ts.map +1 -1
  237. package/dist/components/sandbox/driver.js +93 -0
  238. package/dist/components/sandbox/run.js +115 -0
  239. package/dist/components/starter-plugin.js +104 -0
  240. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  241. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  242. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  243. package/dist/components/verbs/bom-writer.js +287 -0
  244. package/dist/components/verbs/build-archive.js +188 -0
  245. package/dist/components/verbs/build.js +142 -0
  246. package/dist/components/verbs/cloud-executor.js +110 -0
  247. package/dist/components/verbs/component-bom.js +125 -0
  248. package/dist/components/verbs/ensure-secret.js +50 -0
  249. package/dist/components/verbs/index.js +61 -0
  250. package/dist/components/verbs/license-policy.js +75 -0
  251. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  252. package/dist/components/verbs/process-runner.js +78 -0
  253. package/dist/components/verbs/r2-sync.js +93 -0
  254. package/dist/components/verbs/reproducibility.js +62 -0
  255. package/dist/components/verbs/run-agent.js +577 -0
  256. package/dist/components/verbs/sbom-generator.js +119 -0
  257. package/dist/components/verbs/sbom.js +97 -0
  258. package/dist/components/verbs/shell.js +32 -0
  259. package/dist/components/verbs/sign.js +221 -0
  260. package/dist/components/verbs/stub.js +28 -0
  261. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  262. package/dist/components/verbs/verify.js +112 -0
  263. package/dist/components/verbs/vex.js +131 -0
  264. package/dist/components/verbs/vuln-gate.js +152 -0
  265. package/dist/components/verbs/vuln-scan.js +288 -0
  266. package/dist/components/verbs/wait-verify.js +106 -0
  267. package/dist/components/verbs/wrangler.js +179 -0
  268. package/dist/components/wave-plan.js +102 -0
  269. package/dist/composite.d.ts +10 -2
  270. package/dist/composite.d.ts.map +1 -1
  271. package/dist/composite.js +313 -0
  272. package/dist/config-import.d.ts.map +1 -1
  273. package/dist/config-import.js +22 -0
  274. package/dist/config-sandbox.js +122 -0
  275. package/dist/config-static.js +206 -0
  276. package/dist/config.js +605 -0
  277. package/dist/content-digest.js +23 -0
  278. package/dist/declarable.js +114 -0
  279. package/dist/deep-observation.js +437 -0
  280. package/dist/detectLexicon.js +54 -0
  281. package/dist/discovery/cache.js +70 -0
  282. package/dist/discovery/collect.d.ts +2 -1
  283. package/dist/discovery/collect.d.ts.map +1 -1
  284. package/dist/discovery/collect.js +223 -0
  285. package/dist/discovery/cycles.js +95 -0
  286. package/dist/discovery/entity-wire-codec.js +391 -0
  287. package/dist/discovery/entity-wire.js +42 -0
  288. package/dist/discovery/files.js +121 -0
  289. package/dist/discovery/fold-import.d.ts.map +1 -1
  290. package/dist/discovery/fold-import.js +4073 -0
  291. package/dist/discovery/fold-rank.js +292 -0
  292. package/dist/discovery/graph.js +115 -0
  293. package/dist/discovery/host-composite.d.ts +35 -0
  294. package/dist/discovery/host-composite.d.ts.map +1 -0
  295. package/dist/discovery/host-composite.js +93 -0
  296. package/dist/discovery/import.d.ts.map +1 -1
  297. package/dist/discovery/import.js +65 -0
  298. package/dist/discovery/index.d.ts +9 -0
  299. package/dist/discovery/index.d.ts.map +1 -1
  300. package/dist/discovery/index.js +333 -0
  301. package/dist/discovery/param-deps.js +487 -0
  302. package/dist/discovery/resolve.js +39 -0
  303. package/dist/discovery/sandbox/bundle.js +214 -0
  304. package/dist/discovery/sandbox/child-errors.js +26 -0
  305. package/dist/discovery/sandbox/config-run.js +100 -0
  306. package/dist/discovery/sandbox/config-wire.js +183 -0
  307. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  308. package/dist/discovery/sandbox/driver.js +333 -0
  309. package/dist/discovery/sandbox/fork.js +229 -0
  310. package/dist/discovery/sandbox/policy-run.js +142 -0
  311. package/dist/discovery/sandbox/policy-wire.js +152 -0
  312. package/dist/discovery/sandbox/run.js +77 -0
  313. package/dist/discovery/specifier-resolve.js +320 -0
  314. package/dist/discovery/walk.js +284 -0
  315. package/dist/effect-receipt.js +340 -0
  316. package/dist/env.js +55 -0
  317. package/dist/errors.js +62 -0
  318. package/dist/fold/fold.js +1434 -0
  319. package/dist/fold/foldable-helpers.js +229 -0
  320. package/dist/fold/subset.js +696 -0
  321. package/dist/fold-provenance.js +414 -0
  322. package/dist/gate-decision.d.ts +20 -9
  323. package/dist/gate-decision.d.ts.map +1 -1
  324. package/dist/gate-decision.js +313 -0
  325. package/dist/gate-resume-run.js +154 -0
  326. package/dist/gated-waves.js +165 -0
  327. package/dist/governance.js +43 -0
  328. package/dist/graph-declared.js +45 -0
  329. package/dist/graph-detail.js +207 -0
  330. package/dist/graph-dot.js +54 -0
  331. package/dist/graph-effective.js +107 -0
  332. package/dist/graph-ir.js +623 -0
  333. package/dist/graph-layout.js +184 -0
  334. package/dist/graph-lens.js +105 -0
  335. package/dist/graph-mermaid.js +83 -0
  336. package/dist/graph-ops.js +39 -0
  337. package/dist/graph-refs.js +156 -0
  338. package/dist/held-elsewhere.js +87 -0
  339. package/dist/identity.js +251 -0
  340. package/dist/import/base-parser.js +34 -0
  341. package/dist/import/embedded.js +255 -0
  342. package/dist/import/generator.js +1 -0
  343. package/dist/import/ir-utils.js +85 -0
  344. package/dist/import/parser-options.js +45 -0
  345. package/dist/import/parser.js +1 -0
  346. package/dist/index.js +118 -0
  347. package/dist/intrinsic-interpolation.js +73 -0
  348. package/dist/intrinsic.js +31 -0
  349. package/dist/join-key.js +35 -0
  350. package/dist/kubectl-context.js +150 -0
  351. package/dist/lexicon-config.js +58 -0
  352. package/dist/lexicon-integrity.js +47 -0
  353. package/dist/lexicon-manifest.js +70 -0
  354. package/dist/lexicon-module.d.ts.map +1 -1
  355. package/dist/lexicon-module.js +241 -0
  356. package/dist/lexicon-output.js +218 -0
  357. package/dist/lexicon-plugin-helpers.js +104 -0
  358. package/dist/lexicon-schema.js +136 -0
  359. package/dist/lexicon.js +130 -0
  360. package/dist/lifecycle/affected.js +224 -0
  361. package/dist/lifecycle/assert-live.js +110 -0
  362. package/dist/lifecycle/build-ledger-store.js +160 -0
  363. package/dist/lifecycle/build-ledger.js +155 -0
  364. package/dist/lifecycle/change-set.js +356 -0
  365. package/dist/lifecycle/converge-ledger.js +161 -0
  366. package/dist/lifecycle/deep-diff.js +233 -0
  367. package/dist/lifecycle/deep-observe.js +147 -0
  368. package/dist/lifecycle/digest.js +143 -0
  369. package/dist/lifecycle/disruption.js +135 -0
  370. package/dist/lifecycle/gate-applied.js +113 -0
  371. package/dist/lifecycle/gate-audit.d.ts +69 -2
  372. package/dist/lifecycle/gate-audit.d.ts.map +1 -1
  373. package/dist/lifecycle/gate-audit.js +415 -0
  374. package/dist/lifecycle/gate-ledger-select.js +89 -0
  375. package/dist/lifecycle/gate-ledger.d.ts +24 -0
  376. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  377. package/dist/lifecycle/gate-ledger.js +201 -0
  378. package/dist/lifecycle/gate-origin.js +117 -0
  379. package/dist/lifecycle/gate-pending.js +58 -0
  380. package/dist/lifecycle/git.js +1182 -0
  381. package/dist/lifecycle/identity.js +58 -0
  382. package/dist/lifecycle/index.js +26 -0
  383. package/dist/lifecycle/lease.js +283 -0
  384. package/dist/lifecycle/ledger-port.js +1 -0
  385. package/dist/lifecycle/legacy-digest.js +91 -0
  386. package/dist/lifecycle/live-diff.js +274 -0
  387. package/dist/lifecycle/local-note.js +15 -0
  388. package/dist/lifecycle/member-ledger.js +122 -0
  389. package/dist/lifecycle/observation-baseline.js +155 -0
  390. package/dist/lifecycle/observe.js +375 -0
  391. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  392. package/dist/lifecycle/override-ledger.js +54 -0
  393. package/dist/lifecycle/plan-digest.js +110 -0
  394. package/dist/lifecycle/plan-ledger.js +129 -0
  395. package/dist/lifecycle/receipt-plan.js +192 -0
  396. package/dist/lifecycle/release-ledger.js +155 -0
  397. package/dist/lifecycle/release-read.js +64 -0
  398. package/dist/lifecycle/replay.js +193 -0
  399. package/dist/lifecycle/rollback.js +102 -0
  400. package/dist/lifecycle/run-ledger.js +183 -0
  401. package/dist/lifecycle/scenario-eval.js +204 -0
  402. package/dist/lifecycle/scenario.js +214 -0
  403. package/dist/lifecycle/snapshot.js +239 -0
  404. package/dist/lifecycle/status.js +447 -0
  405. package/dist/lifecycle/symptoms.js +117 -0
  406. package/dist/lifecycle/teardown.js +255 -0
  407. package/dist/lifecycle/types.js +1 -0
  408. package/dist/lifecycle/unobserved-gate.js +33 -0
  409. package/dist/lifecycle/wave-plans.js +68 -0
  410. package/dist/lifecycle/work-item-id.js +36 -0
  411. package/dist/lifecycle/work-lease.js +393 -0
  412. package/dist/lint/component-checks.js +87 -0
  413. package/dist/lint/config.js +483 -0
  414. package/dist/lint/declarative.js +122 -0
  415. package/dist/lint/discover.d.ts.map +1 -1
  416. package/dist/lint/discover.js +138 -0
  417. package/dist/lint/engine.js +246 -0
  418. package/dist/lint/knowledge-checks.js +64 -0
  419. package/dist/lint/named-checks.js +22 -0
  420. package/dist/lint/output-checks.js +87 -0
  421. package/dist/lint/output-docs.js +163 -0
  422. package/dist/lint/parser.js +33 -0
  423. package/dist/lint/pipeline-change-gate.js +70 -0
  424. package/dist/lint/policy-import.d.ts +1 -1
  425. package/dist/lint/policy-import.d.ts.map +1 -1
  426. package/dist/lint/policy-import.js +62 -0
  427. package/dist/lint/policy-sandbox.js +86 -0
  428. package/dist/lint/policy.js +122 -0
  429. package/dist/lint/post-synth.js +87 -0
  430. package/dist/lint/presets/relaxed.json +26 -0
  431. package/dist/lint/presets/strict.json +24 -24
  432. package/dist/lint/receipt-checks.js +83 -0
  433. package/dist/lint/rule-loader.d.ts.map +1 -1
  434. package/dist/lint/rule-loader.js +89 -0
  435. package/dist/lint/rule-registry.js +86 -0
  436. package/dist/lint/rule.js +1 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  441. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  442. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  443. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  444. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  445. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  446. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  447. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  448. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  449. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  450. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  451. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  452. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  453. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  454. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  455. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  456. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  457. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  458. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  459. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  460. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  461. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  462. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  463. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  464. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  465. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  466. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  467. package/dist/lint/rules/comp/index.js +33 -0
  468. package/dist/lint/rules/comp/support.js +129 -0
  469. package/dist/lint/rules/composite-scope.js +51 -0
  470. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  471. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  472. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  473. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  474. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  475. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  476. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  477. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  478. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  479. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  480. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  481. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  482. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  483. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  484. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  485. package/dist/lint/rules/export-required.js +115 -0
  486. package/dist/lint/rules/file-declarable-limit.js +88 -0
  487. package/dist/lint/rules/flat-declarations.js +62 -0
  488. package/dist/lint/rules/index.js +90 -0
  489. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  490. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  491. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  492. package/dist/lint/rules/no-string-ref.js +59 -0
  493. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  494. package/dist/lint/rules/no-unused-declarable.js +142 -0
  495. package/dist/lint/rules/op/index.js +28 -0
  496. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  497. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  498. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  499. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  500. package/dist/lint/rules/op/support.js +11 -0
  501. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  502. package/dist/lint/rules/property-kind.js +56 -0
  503. package/dist/lint/rules/single-concern-file.js +71 -0
  504. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  505. package/dist/lint/selectors.js +168 -0
  506. package/dist/lint/suppressions.js +129 -0
  507. package/dist/lint/typescript.js +17 -0
  508. package/dist/live-endpoint.js +113 -0
  509. package/dist/live-read-session.js +76 -0
  510. package/dist/lsp/lexicon-providers.js +163 -0
  511. package/dist/lsp/types.js +5 -0
  512. package/dist/managed-fields.js +293 -0
  513. package/dist/mcp/types.js +4 -0
  514. package/dist/notify-verify.js +0 -1
  515. package/dist/notify.js +0 -1
  516. package/dist/notify.schema.json +72 -0
  517. package/dist/observation.js +266 -0
  518. package/dist/okf-read.js +134 -0
  519. package/dist/okf.js +275 -0
  520. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  521. package/dist/op/activities/activity-contracts.d.ts +1 -1
  522. package/dist/op/activities/activity-contracts.js +313 -0
  523. package/dist/op/activities/apply.js +582 -0
  524. package/dist/op/activities/build.js +18 -0
  525. package/dist/op/activities/change-coverage.js +40 -0
  526. package/dist/op/activities/change-set.d.ts +8 -3
  527. package/dist/op/activities/change-set.d.ts.map +1 -1
  528. package/dist/op/activities/change-set.js +67 -0
  529. package/dist/op/activities/converge.js +492 -0
  530. package/dist/op/activities/decide.js +211 -0
  531. package/dist/op/activities/env-teardown.js +110 -0
  532. package/dist/op/activities/factory.js +591 -0
  533. package/dist/op/activities/forge-pull-request.js +82 -0
  534. package/dist/op/activities/gh-host.js +78 -0
  535. package/dist/op/activities/guard-validate.js +165 -0
  536. package/dist/op/activities/http-check.js +40 -0
  537. package/dist/op/activities/index.js +59 -0
  538. package/dist/op/activities/lexicon-upgrade.js +629 -0
  539. package/dist/op/activities/lifecycle.js +109 -0
  540. package/dist/op/activities/pipeline-audit.js +147 -0
  541. package/dist/op/activities/policy.js +26 -0
  542. package/dist/op/activities/predict-behaviour.js +341 -0
  543. package/dist/op/activities/propose-upgrade.js +165 -0
  544. package/dist/op/activities/reconcile.d.ts +28 -16
  545. package/dist/op/activities/reconcile.d.ts.map +1 -1
  546. package/dist/op/activities/reconcile.js +1011 -0
  547. package/dist/op/activities/shell.js +118 -0
  548. package/dist/op/activities/source-release.js +97 -0
  549. package/dist/op/activities/source-rollback.js +165 -0
  550. package/dist/op/activities/teardown.js +17 -0
  551. package/dist/op/activities/util.js +6 -0
  552. package/dist/op/activities/wait.js +51 -0
  553. package/dist/op/activities/work-evidence.js +35 -0
  554. package/dist/op/activities/workflow-audit.js +133 -0
  555. package/dist/op/activity-contract-registry.js +106 -0
  556. package/dist/op/activity-contract.js +232 -0
  557. package/dist/op/activity-failure.js +31 -0
  558. package/dist/op/activity-profiles.js +129 -0
  559. package/dist/op/activity-registry.js +105 -0
  560. package/dist/op/activity-runtime.js +28 -0
  561. package/dist/op/builders.d.ts +1 -1
  562. package/dist/op/builders.d.ts.map +1 -1
  563. package/dist/op/builders.js +801 -0
  564. package/dist/op/change-signal.js +118 -0
  565. package/dist/op/composites/apply-op.js +151 -0
  566. package/dist/op/composites/behaviour-op.js +65 -0
  567. package/dist/op/composites/converge-op.js +141 -0
  568. package/dist/op/composites/index.js +19 -0
  569. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  570. package/dist/op/composites/pipeline-audit-op.js +50 -0
  571. package/dist/op/composites/reconcile-op.js +84 -0
  572. package/dist/op/composites/watch-op.js +69 -0
  573. package/dist/op/composites/workflow-audit-op.js +57 -0
  574. package/dist/op/converge-rule.js +205 -0
  575. package/dist/op/cron.js +146 -0
  576. package/dist/op/decide-backend.js +181 -0
  577. package/dist/op/decide-config.js +68 -0
  578. package/dist/op/decide-read-inputs.js +141 -0
  579. package/dist/op/discover.d.ts.map +1 -1
  580. package/dist/op/discover.js +213 -0
  581. package/dist/op/duration.js +21 -0
  582. package/dist/op/emulator-freshness.js +80 -0
  583. package/dist/op/emulator-lifecycle.js +269 -0
  584. package/dist/op/factory.js +83 -0
  585. package/dist/op/gate-approval.js +172 -0
  586. package/dist/op/gate-name.js +86 -0
  587. package/dist/op/gate-plan-context.js +167 -0
  588. package/dist/op/gate-point-run.js +67 -0
  589. package/dist/op/gate-point.js +111 -0
  590. package/dist/op/gate-resume-plan.js +155 -0
  591. package/dist/op/gate-resume.js +31 -0
  592. package/dist/op/gate-review.js +290 -0
  593. package/dist/op/gate-run-locator.js +85 -0
  594. package/dist/op/gate-summary.js +100 -0
  595. package/dist/op/gate-wait.js +56 -0
  596. package/dist/op/gate.js +449 -0
  597. package/dist/op/generate-pipeline.js +124 -0
  598. package/dist/op/index.js +51 -0
  599. package/dist/op/lifecycle-receipt-store.js +45 -0
  600. package/dist/op/local-executor.js +1164 -0
  601. package/dist/op/local-output.js +140 -0
  602. package/dist/op/op-ir.js +317 -0
  603. package/dist/op/op-verb-class.js +131 -0
  604. package/dist/op/op-waves-notify.js +136 -0
  605. package/dist/op/op-waves-run.d.ts +1 -1
  606. package/dist/op/op-waves-run.d.ts.map +1 -1
  607. package/dist/op/op-waves-run.js +1657 -0
  608. package/dist/op/op-waves.js +409 -0
  609. package/dist/op/operator.js +743 -0
  610. package/dist/op/receipt-store.js +94 -0
  611. package/dist/op/resource.js +23 -0
  612. package/dist/op/run-context.js +28 -0
  613. package/dist/op/run-live.js +256 -0
  614. package/dist/op/runtime.js +21 -0
  615. package/dist/op/runtimes/local.js +195 -0
  616. package/dist/op/source-archive.js +131 -0
  617. package/dist/op/step-output-ref.js +397 -0
  618. package/dist/op/steward-beside.js +169 -0
  619. package/dist/op/steward-points.js +138 -0
  620. package/dist/op/steward-turn.js +59 -0
  621. package/dist/op/steward.js +317 -0
  622. package/dist/op/types.js +25 -0
  623. package/dist/op/work-lease-decl.js +81 -0
  624. package/dist/op/work-lease-run.js +393 -0
  625. package/dist/override-gate.js +284 -0
  626. package/dist/owner-chain.js +74 -0
  627. package/dist/ownership.js +92 -0
  628. package/dist/params.js +61 -0
  629. package/dist/plan-summary.js +711 -0
  630. package/dist/point-decision.js +211 -0
  631. package/dist/pr-forge.js +810 -0
  632. package/dist/pr-loop.js +203 -0
  633. package/dist/project-codegen.js +191 -0
  634. package/dist/project-root.js +74 -0
  635. package/dist/project-validation.js +50 -0
  636. package/dist/provenance.js +157 -0
  637. package/dist/pseudo-parameter.js +40 -0
  638. package/dist/reconcile.js +450 -0
  639. package/dist/resource-attributes.js +33 -0
  640. package/dist/runtime-adapter.js +77 -0
  641. package/dist/runtime.js +66 -0
  642. package/dist/secret-materialization.js +153 -0
  643. package/dist/secret-provenance.js +250 -0
  644. package/dist/serializer-walker.js +112 -0
  645. package/dist/serializer.js +1 -0
  646. package/dist/sort.js +45 -0
  647. package/dist/stack-output.js +115 -0
  648. package/dist/telemetry-attribution.js +149 -0
  649. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  650. package/dist/terraform/adopt-state.js +40 -0
  651. package/dist/terraform/aws-resources.js +384 -0
  652. package/dist/terraform/bridge.js +204 -0
  653. package/dist/terraform/carve-provider.js +155 -0
  654. package/dist/terraform/carve.js +138 -0
  655. package/dist/terraform/data-source-shape.js +57 -0
  656. package/dist/terraform/emit-source.js +36 -0
  657. package/dist/terraform/excise.js +123 -0
  658. package/dist/terraform/graduate.js +128 -0
  659. package/dist/terraform/graph.js +435 -0
  660. package/dist/terraform/hcl2json.js +60 -0
  661. package/dist/terraform/manifest.js +149 -0
  662. package/dist/terraform/parse.js +81 -0
  663. package/dist/terraform/providers/aws.js +146 -0
  664. package/dist/terraform/providers/gcp.js +294 -0
  665. package/dist/terraform/providers/index.js +17 -0
  666. package/dist/terraform/providers/kubernetes.js +253 -0
  667. package/dist/terraform/score.js +151 -0
  668. package/dist/terraform/state.js +67 -0
  669. package/dist/terraform/tier-map.js +74 -0
  670. package/dist/terraform/types.js +13 -0
  671. package/dist/terraform/unified-diff.js +132 -0
  672. package/dist/testing.js +295 -0
  673. package/dist/toml-emit.js +153 -0
  674. package/dist/toml-parse.js +355 -0
  675. package/dist/toml-utils.js +60 -0
  676. package/dist/toml.js +428 -0
  677. package/dist/ts-loader.d.ts +46 -0
  678. package/dist/ts-loader.d.ts.map +1 -0
  679. package/dist/ts-loader.js +103 -0
  680. package/dist/types.js +1 -0
  681. package/dist/utils.js +61 -0
  682. package/dist/validation.js +20 -0
  683. package/dist/vendor/js-yaml-load.js +1662 -0
  684. package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
  685. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  686. package/dist/workspace/__fixtures__/contract-repo.js +119 -0
  687. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  688. package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
  689. package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
  690. package/dist/workspace/__fixtures__/sessions.js +91 -0
  691. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  692. package/dist/workspace/agent-cli.js +99 -0
  693. package/dist/workspace/agent.schema.json +390 -0
  694. package/dist/workspace/answers-ledger.js +89 -0
  695. package/dist/workspace/box-cli.js +142 -0
  696. package/dist/workspace/box-factory-write.js +196 -0
  697. package/dist/workspace/box-factory-write.schema.json +342 -0
  698. package/dist/workspace/box-factory.js +88 -0
  699. package/dist/workspace/box-intent.js +126 -0
  700. package/dist/workspace/box-isolation.js +169 -0
  701. package/dist/workspace/box-listing-write.schema.json +204 -0
  702. package/dist/workspace/box-listing.js +298 -0
  703. package/dist/workspace/box-publish.js +352 -0
  704. package/dist/workspace/box-publish.schema.json +498 -0
  705. package/dist/workspace/box-services.js +39 -0
  706. package/dist/workspace/broker-protocol.js +359 -0
  707. package/dist/workspace/broker-protocol.schema.json +228 -0
  708. package/dist/workspace/change-set.schema.json +462 -0
  709. package/dist/workspace/changes-cli.js +56 -0
  710. package/dist/workspace/changes.js +446 -0
  711. package/dist/workspace/changes.schema.json +642 -0
  712. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  713. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  714. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  715. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  716. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  717. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  718. package/dist/workspace/chant-migrations.js +113 -0
  719. package/dist/workspace/check.schema.json +433 -0
  720. package/dist/workspace/checks/box-isolation.js +62 -0
  721. package/dist/workspace/checks/boxes.js +491 -0
  722. package/dist/workspace/checks/diagrams.js +104 -0
  723. package/dist/workspace/checks/generated.js +419 -0
  724. package/dist/workspace/checks/ledgers.js +212 -0
  725. package/dist/workspace/checks/links.js +191 -0
  726. package/dist/workspace/checks/live.js +100 -0
  727. package/dist/workspace/checks/pipelines.js +188 -0
  728. package/dist/workspace/checks/records.js +169 -0
  729. package/dist/workspace/checks.js +426 -0
  730. package/dist/workspace/ci-green-cli.js +125 -0
  731. package/dist/workspace/ci-green-forge.js +83 -0
  732. package/dist/workspace/ci-green-workflow.d.ts +3 -1
  733. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  734. package/dist/workspace/ci-green-workflow.js +202 -0
  735. package/dist/workspace/ci-green.js +325 -0
  736. package/dist/workspace/ci-last-green.schema.json +158 -0
  737. package/dist/workspace/class-data.d.ts +84 -0
  738. package/dist/workspace/class-data.d.ts.map +1 -0
  739. package/dist/workspace/class-data.js +238 -0
  740. package/dist/workspace/compose-graph.js +235 -0
  741. package/dist/workspace/compose-reports.js +146 -0
  742. package/dist/workspace/composites.js +264 -0
  743. package/dist/workspace/composites.schema.json +617 -0
  744. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  745. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  746. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  747. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  748. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  749. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  750. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  751. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  752. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  753. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  754. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  755. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  756. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  757. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  758. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  759. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  760. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  761. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  762. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  763. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  764. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  765. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  766. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  767. package/dist/workspace/conformance/broker.js +736 -0
  768. package/dist/workspace/conformance/index.js +673 -0
  769. package/dist/workspace/conformance/vitest.js +108 -0
  770. package/dist/workspace/conformance/writer.js +1080 -0
  771. package/dist/workspace/decide.js +879 -0
  772. package/dist/workspace/decision-points.schema.json +135 -135
  773. package/dist/workspace/declaration-write-cli.js +74 -0
  774. package/dist/workspace/declaration-write.js +238 -0
  775. package/dist/workspace/declaration.js +938 -0
  776. package/dist/workspace/declaration.schema.json +1413 -1413
  777. package/dist/workspace/declared-kinds.js +106 -0
  778. package/dist/workspace/environments.js +164 -0
  779. package/dist/workspace/evidence.schema.json +279 -0
  780. package/dist/workspace/export-cli.js +185 -0
  781. package/dist/workspace/export.js +499 -0
  782. package/dist/workspace/factory-rules.js +175 -0
  783. package/dist/workspace/generated-files.js +92 -0
  784. package/dist/workspace/glob.js +45 -0
  785. package/dist/workspace/graph-cache.js +352 -0
  786. package/dist/workspace/graph-cli.js +348 -0
  787. package/dist/workspace/graph.schema.json +1338 -0
  788. package/dist/workspace/identity-gate-rule.js +75 -0
  789. package/dist/workspace/identity.js +126 -0
  790. package/dist/workspace/import.js +283 -0
  791. package/dist/workspace/init.js +620 -0
  792. package/dist/workspace/intent-cli.js +263 -0
  793. package/dist/workspace/intent-joins.js +201 -0
  794. package/dist/workspace/intent-record.js +352 -0
  795. package/dist/workspace/intent-record.schema.json +864 -0
  796. package/dist/workspace/intent.js +1582 -0
  797. package/dist/workspace/intent.schema.json +2420 -0
  798. package/dist/workspace/json-edit.js +221 -0
  799. package/dist/workspace/jsonc.js +235 -0
  800. package/dist/workspace/kind-readers.js +103 -0
  801. package/dist/workspace/kinds.d.ts +3 -7
  802. package/dist/workspace/kinds.d.ts.map +1 -1
  803. package/dist/workspace/kinds.js +553 -0
  804. package/dist/workspace/lexicon-symbols.js +112 -0
  805. package/dist/workspace/lineage-adopt-cli.js +102 -0
  806. package/dist/workspace/lineage-adopt.js +360 -0
  807. package/dist/workspace/lineage-check.js +282 -0
  808. package/dist/workspace/lineage-cli.js +121 -0
  809. package/dist/workspace/lineage-hash-index.js +284 -0
  810. package/dist/workspace/lineage-init.js +507 -0
  811. package/dist/workspace/lineage-lock.js +387 -0
  812. package/dist/workspace/lineage-merge.js +45 -0
  813. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  814. package/dist/workspace/lineage-migrations.js +329 -0
  815. package/dist/workspace/lineage-provenance.js +36 -0
  816. package/dist/workspace/lineage-update.js +138 -0
  817. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  818. package/dist/workspace/lineage-upgrade.js +889 -0
  819. package/dist/workspace/lineage-vendor.js +171 -0
  820. package/dist/workspace/lineage-version.js +128 -0
  821. package/dist/workspace/lineage-versions.js +275 -0
  822. package/dist/workspace/links.js +330 -0
  823. package/dist/workspace/ls-generated.js +95 -0
  824. package/dist/workspace/ls.js +277 -0
  825. package/dist/workspace/ls.schema.json +333 -0
  826. package/dist/workspace/member-commands.js +508 -0
  827. package/dist/workspace/member-handles.js +216 -0
  828. package/dist/workspace/member-pipeline.js +258 -0
  829. package/dist/workspace/member-run.js +117 -0
  830. package/dist/workspace/member-write.schema.json +193 -0
  831. package/dist/workspace/nested-graph.js +156 -0
  832. package/dist/workspace/nesting.js +38 -0
  833. package/dist/workspace/patch.js +301 -0
  834. package/dist/workspace/patch.schema.json +321 -0
  835. package/dist/workspace/pin-cli.js +55 -0
  836. package/dist/workspace/pin-integrity.js +100 -0
  837. package/dist/workspace/plan-summary.schema.json +155 -0
  838. package/dist/workspace/point-answer.schema.json +129 -129
  839. package/dist/workspace/points-cli.js +291 -0
  840. package/dist/workspace/points-write.schema.json +660 -0
  841. package/dist/workspace/points.js +521 -0
  842. package/dist/workspace/points.schema.json +916 -0
  843. package/dist/workspace/pr-report.schema.json +108 -0
  844. package/dist/workspace/principal-classes.d.ts +4 -11
  845. package/dist/workspace/principal-classes.d.ts.map +1 -1
  846. package/dist/workspace/principal-classes.js +162 -0
  847. package/dist/workspace/reason-codes.js +326 -0
  848. package/dist/workspace/record-assets.js +151 -0
  849. package/dist/workspace/record-decided.js +105 -0
  850. package/dist/workspace/record-sessions.js +96 -0
  851. package/dist/workspace/record-source.js +114 -0
  852. package/dist/workspace/records-amend.schema.json +284 -0
  853. package/dist/workspace/records-checkout.js +76 -0
  854. package/dist/workspace/records-cli.js +707 -0
  855. package/dist/workspace/records-close.js +116 -0
  856. package/dist/workspace/records-close.schema.json +278 -0
  857. package/dist/workspace/records-new.schema.json +202 -0
  858. package/dist/workspace/records-review.schema.json +367 -0
  859. package/dist/workspace/records-since.js +317 -0
  860. package/dist/workspace/records-since.schema.json +218 -0
  861. package/dist/workspace/records-write.js +1229 -0
  862. package/dist/workspace/records.js +1345 -0
  863. package/dist/workspace/records.schema.json +604 -0
  864. package/dist/workspace/reference-kinds/app/package.json +10 -0
  865. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  866. package/dist/workspace/returns.js +303 -0
  867. package/dist/workspace/root-refusal.js +75 -0
  868. package/dist/workspace/run-statement.schema.json +622 -0
  869. package/dist/workspace/runs-cli.js +584 -0
  870. package/dist/workspace/runs-write.schema.json +994 -0
  871. package/dist/workspace/runs.js +708 -0
  872. package/dist/workspace/runs.schema.json +1257 -0
  873. package/dist/workspace/runtimes.js +76 -0
  874. package/dist/workspace/session-kinds.js +83 -0
  875. package/dist/workspace/signers.schema.json +206 -0
  876. package/dist/workspace/source-block.js +125 -0
  877. package/dist/workspace/squash.js +177 -0
  878. package/dist/workspace/status-gates.js +162 -0
  879. package/dist/workspace/status-stewards.js +330 -0
  880. package/dist/workspace/status.js +514 -0
  881. package/dist/workspace/status.schema.json +998 -0
  882. package/dist/workspace/steward-index.js +191 -0
  883. package/dist/workspace/symbols.js +188 -0
  884. package/dist/workspace/template-manifest.js +227 -0
  885. package/dist/workspace/template-pins.js +115 -0
  886. package/dist/workspace/trailer-joins.js +65 -0
  887. package/dist/workspace/trailers.js +111 -0
  888. package/dist/workspace/tree.js +136 -0
  889. package/dist/workspace/trust/attestor.js +63 -0
  890. package/dist/workspace/trust/dsse.js +108 -0
  891. package/dist/workspace/trust/evidence-cli.js +175 -0
  892. package/dist/workspace/trust/evidence.js +161 -0
  893. package/dist/workspace/trust/gate-seal.js +226 -0
  894. package/dist/workspace/trust/policy.js +190 -0
  895. package/dist/workspace/trust/provenance.js +180 -0
  896. package/dist/workspace/trust/rotation.js +298 -0
  897. package/dist/workspace/trust/run-commits.js +101 -0
  898. package/dist/workspace/trust/run-statement.js +182 -0
  899. package/dist/workspace/trust/seal.js +272 -0
  900. package/dist/workspace/trust/signers-cli.js +152 -0
  901. package/dist/workspace/trust/ssh-commit.js +178 -0
  902. package/dist/workspace/trust/test-repo.js +118 -0
  903. package/dist/workspace/trust/trust-files.js +193 -0
  904. package/dist/workspace/trust/verify-cli.js +63 -0
  905. package/dist/workspace/trust/verify.js +192 -0
  906. package/dist/workspace/which-chant.js +141 -0
  907. package/dist/workspace/wip-cli.js +95 -0
  908. package/dist/workspace/wip-write.schema.json +504 -0
  909. package/dist/workspace/wip.js +631 -0
  910. package/dist/workspace/wip.schema.json +334 -0
  911. package/dist/workspace/work-cli.js +448 -0
  912. package/dist/workspace/work-evidence.js +122 -0
  913. package/dist/workspace/work-evidence.schema.json +222 -0
  914. package/dist/workspace/work-history.schema.json +421 -0
  915. package/dist/workspace/work-lease.schema.json +246 -0
  916. package/dist/workspace/work-size.js +77 -0
  917. package/dist/workspace/work.js +283 -0
  918. package/dist/workspace/workspace-kinds.schema.json +259 -259
  919. package/dist/workspace/workspace-principals.schema.json +53 -53
  920. package/dist/workspace/write-lock-cli.js +105 -0
  921. package/dist/workspace/write-lock.js +424 -0
  922. package/dist/workspace/write-lock.schema.json +172 -0
  923. package/dist/workspace/write-scope.js +484 -0
  924. package/dist/yaml.js +459 -0
  925. package/package.json +2 -2
  926. package/src/build.ts +8 -0
  927. package/src/change-set.test.ts +48 -0
  928. package/src/change-set.ts +52 -2
  929. package/src/ci-jobs.test.ts +49 -0
  930. package/src/ci-jobs.ts +515 -0
  931. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  932. package/src/cli/commands/lint.ts +3 -0
  933. package/src/cli/commands/migrate.ts +2 -0
  934. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  935. package/src/cli/main.ts +121 -27
  936. package/src/cli/mcp/workspace-tools.ts +1 -1
  937. package/src/codegen/pinned-upgrade.ts +2 -0
  938. package/src/components/discover.ts +2 -0
  939. package/src/components/pr-pipeline.ts +3 -2
  940. package/src/components/sandbox/driver.ts +3 -1
  941. package/src/composite.ts +15 -3
  942. package/src/config-import.ts +3 -0
  943. package/src/discovery/collect.ts +15 -1
  944. package/src/discovery/fold-build-parity.test.ts +71 -0
  945. package/src/discovery/fold-import.ts +25 -127
  946. package/src/discovery/fold-project-provenance.test.ts +21 -4
  947. package/src/discovery/host-composite.ts +101 -0
  948. package/src/discovery/import.ts +2 -0
  949. package/src/discovery/index.ts +11 -1
  950. package/src/discovery/sandbox/driver.ts +3 -1
  951. package/src/gate-decision-bundle.test.ts +5 -4
  952. package/src/gate-decision-identity.test.ts +59 -6
  953. package/src/gate-decision.ts +81 -21
  954. package/src/lexicon-module.ts +3 -0
  955. package/src/lifecycle/gate-audit.test.ts +55 -1
  956. package/src/lifecycle/gate-audit.ts +116 -3
  957. package/src/lifecycle/gate-ledger.test.ts +20 -1
  958. package/src/lifecycle/gate-ledger.ts +33 -1
  959. package/src/lint/config.ts +1 -1
  960. package/src/lint/discover.ts +28 -8
  961. package/src/lint/policy-import.ts +4 -1
  962. package/src/lint/rule-loader.ts +2 -0
  963. package/src/op/activities/activity-contracts.ts +1 -1
  964. package/src/op/activities/change-set.ts +11 -3
  965. package/src/op/activities/lexicon-upgrade.test.ts +2 -0
  966. package/src/op/activities/reconcile.test.ts +62 -2
  967. package/src/op/activities/reconcile.ts +46 -22
  968. package/src/op/builders.ts +1 -1
  969. package/src/op/discover.ts +3 -0
  970. package/src/op/op-waves-run.ts +4 -3
  971. package/src/op/op-waves.test.ts +2 -0
  972. package/src/op/work-lease-run.test.ts +12 -4
  973. package/src/ts-loader.test.ts +23 -0
  974. package/src/ts-loader.ts +122 -0
  975. package/src/workspace/__fixtures__/contract-repo.ts +17 -1
  976. package/src/workspace/__fixtures__/sessions.ts +3 -3
  977. package/src/workspace/change-set.schema.json +5 -3
  978. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  979. package/src/workspace/ci-green-workflow.test.ts +4 -4
  980. package/src/workspace/ci-green-workflow.ts +5 -2
  981. package/src/workspace/class-data.test.ts +64 -0
  982. package/src/workspace/class-data.ts +236 -0
  983. package/src/workspace/declaration.ts +1 -1
  984. package/src/workspace/kinds.ts +7 -36
  985. package/src/workspace/lineage-migrations.ts +2 -0
  986. package/src/workspace/points.ts +1 -1
  987. package/src/workspace/principal-classes.ts +12 -95
  988. package/src/workspace/records-formats.test.ts +7 -2
  989. package/src/workspace/records-sessions-write.test.ts +3 -3
  990. package/src/workspace/status-contract.e2e.test.ts +37 -0
  991. package/src/workspace/status-contract.test.ts +23 -21
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Build-archive manifest store (#609, epic #551 follow-up to #564/#568/#606/
3
+ * #613/#614): persists a `BuildArchiveManifest`
4
+ * (../components/verbs/build-archive.ts) to a durable, content-addressed
5
+ * location so it survives past the in-process build/run that assembled it.
6
+ *
7
+ * **The gap this closes.** `docker-build` (../components/verbs/build.ts) and
8
+ * friends assemble a real `BuildArchiveManifest` in memory — complete with
9
+ * `sbom`/config-BOM entries (#606/#613) and per-artifact
10
+ * `reproducibility`/`provenance` (#614) — but nothing ever wrote it anywhere
11
+ * durable. `build-ledger.ts`'s `buildLedgerEntries`/`componentBomSummary` are
12
+ * unit-tested against a manifest handed to them directly, but
13
+ * `chant components status` (../cli/handlers/components.ts) had no manifest
14
+ * to hand them at all: `componentBom` and `build.reproducibility` were always
15
+ * `null` in that CLI path. This module is the missing durable layer — write
16
+ * once at build time, read back by digest at status time.
17
+ *
18
+ * **Storage choice: the `chant/lifecycle` orphan branch, a sibling namespace
19
+ * to the release ledger.** Reuses the exact git-plumbing
20
+ * `writeBlobToPath`/`readBlobFromPath`/`listFilesInDir` (./git.ts) that
21
+ * `writeSnapshot`/`appendReleaseRecordLine` already use — same hash-object →
22
+ * mktree → commit-tree → update-ref pipeline, same `--force-with-lease` push
23
+ * discipline (`pushLifecycle`), same "no checkout, no working tree changes"
24
+ * property. Rejected alternatives:
25
+ * - **A new on-disk directory in the working tree** — would need its own
26
+ * persistence/sync story (commit it? gitignore it? sync across CI
27
+ * runners?) that the orphan branch already solves for the release ledger;
28
+ * introducing a second mechanism for a manifest that is conceptually the
29
+ * same kind of durable, git-native record would be needless divergence.
30
+ * - **A path under `<env>/`** — a build archive is *not* env-scoped. The
31
+ * whole point of promote-by-digest (epic #551 "4. Build archive +
32
+ * deferred publish") is that one build's manifest is referenced from
33
+ * every environment it gets promoted to; writing it under a single env
34
+ * directory would either duplicate it per env (defeating "byte-identical
35
+ * across envs") or arbitrarily pick one env as "the" owner. Manifests
36
+ * instead live under a fixed top-level `_builds/` directory on the same
37
+ * orphan branch, keyed by `manifestDigest` — a peer of the per-env
38
+ * directories `writeSnapshot`/the release ledger already create there,
39
+ * never nested inside one.
40
+ *
41
+ * **Content-addressed, keyed by `manifestDigest`.** One file per manifest,
42
+ * `_builds/<manifestDigest-with-":"->"_">.json`, so a rebuild of
43
+ * byte-identical inputs (same `manifestDigest`, per
44
+ * ../components/verbs/build-archive.ts's module doc) overwrites its own
45
+ * entry with identical content rather than accumulating duplicates —
46
+ * `writeBlobToPath` already replaces-by-path, so this falls out for free.
47
+ * `findBuildManifestByArtifactDigest` additionally resolves "the manifest
48
+ * that produced artifact digest X" (the join key `chant components status`
49
+ * actually has on hand — a `ReleaseRecord.digest` is an *artifact* digest,
50
+ * not a manifest digest) by scanning every stored manifest's `contents` for
51
+ * a matching entry. This is a linear scan over however many manifests have
52
+ * been persisted; fine for the ledger's expected scale (one manifest per
53
+ * build), and avoids maintaining a second reverse-index file that could get
54
+ * out of sync with the manifests themselves.
55
+ */
56
+ import { sortedJsonReplacer } from "../utils.js";
57
+ import { flagLegacyDigest, warnOnLegacyDigests, withoutReadFlags } from "./legacy-digest.js";
58
+ import { writeBlobToPath, readBlobFromPath, listFilesInDir } from "./git.js";
59
+ /** Fixed top-level directory on the `chant/lifecycle` orphan branch that holds every persisted build manifest — a peer of the per-env directories, never nested inside one (see module doc for why). */
60
+ const BUILDS_DIR = "_builds";
61
+ /** Turn a `sha256:...`-style digest into a filesystem/git-tree-safe filename stem (`:` is not usable in a git tree entry name the way this plumbing constructs it). */
62
+ function digestToFilenameStem(digest) {
63
+ return digest.replace(/:/g, "_");
64
+ }
65
+ function manifestFilename(manifestDigest) {
66
+ return `${digestToFilenameStem(manifestDigest)}.json`;
67
+ }
68
+ /**
69
+ * Persist a `BuildArchiveManifest` to the orphan branch, keyed by its own
70
+ * `manifestDigest`. Does not push to the remote — call `pushLifecycle`
71
+ * (./git.ts) afterward, the same two-step (`write` then `push`) shape
72
+ * `appendReleaseRecord`/`takeSnapshot` use, so a caller persisting several
73
+ * manifests (or a manifest plus a release record) in one run can batch the
74
+ * push into one network round-trip.
75
+ *
76
+ * Idempotent: persisting the same manifest twice (identical `manifestDigest`)
77
+ * overwrites the same path with identical bytes — safe to call more than
78
+ * once for the same build.
79
+ */
80
+ export async function persistBuildManifest(manifest, opts) {
81
+ // `flags` are read-side only (#2514); a manifest read back and persisted again never keeps them.
82
+ const json = JSON.stringify(withoutReadFlags(manifest), sortedJsonReplacer);
83
+ const commit = await writeBlobToPath(BUILDS_DIR, manifestFilename(manifest.manifestDigest), json, "Build manifest", opts);
84
+ return { commit };
85
+ }
86
+ /**
87
+ * Read a persisted `BuildArchiveManifest` back by its own `manifestDigest`.
88
+ * Returns `null` when no manifest was ever persisted under that digest
89
+ * (never throws — a status query for a digest with no recorded build is a
90
+ * normal, expected state, matching `readSnapshot`'s null-on-missing
91
+ * convention).
92
+ */
93
+ export async function readBuildManifest(manifestDigest, opts) {
94
+ const content = await readBlobFromPath(BUILDS_DIR, manifestFilename(manifestDigest), opts);
95
+ if (!content)
96
+ return null;
97
+ let manifest;
98
+ try {
99
+ manifest = JSON.parse(content);
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ // chant #2514 — a manifest whose digests predate real SHA-256 is flagged
105
+ // legacy-digest, never re-keyed, and the project is warned once.
106
+ const digests = [
107
+ manifest.manifestDigest,
108
+ ...(Array.isArray(manifest.contents) ? manifest.contents.map((e) => e?.digest) : []),
109
+ ];
110
+ warnOnLegacyDigests(digests, "build manifests", opts?.cwd);
111
+ return flagLegacyDigest(manifest, digests);
112
+ }
113
+ /** List the `manifestDigest` of every build manifest persisted on the orphan branch. */
114
+ export async function listBuildManifestDigests(opts) {
115
+ const files = await listFilesInDir(BUILDS_DIR, opts);
116
+ return files
117
+ .filter((f) => f.endsWith(".json"))
118
+ .map((f) => f.replace(/\.json$/, "").replace(/_/g, ":"));
119
+ }
120
+ /**
121
+ * Read every persisted build manifest. Best-effort: a manifest file that
122
+ * fails to parse is skipped rather than failing the whole read (mirrors
123
+ * `readReleaseLedger`'s "skip malformed lines" degrade-gracefully
124
+ * convention) — the caller only gets the count implicitly via array length,
125
+ * since a corrupted manifest blob is a much rarer/more surprising event than
126
+ * a hand-edited ledger line and not expected to need the same "surfaced
127
+ * count" treatment.
128
+ */
129
+ export async function readAllBuildManifests(opts) {
130
+ const digests = await listBuildManifestDigests(opts);
131
+ const manifests = [];
132
+ for (const digest of digests) {
133
+ const manifest = await readBuildManifest(digest, opts);
134
+ if (manifest)
135
+ manifests.push(manifest);
136
+ }
137
+ return manifests;
138
+ }
139
+ /**
140
+ * Find the persisted manifest that carries an entry (any kind — image,
141
+ * template, asset, or sbom) whose `digest` equals `artifactDigest`. This is
142
+ * the lookup `chant components status` actually needs: a `ReleaseRecord`
143
+ * (../lifecycle/release-ledger.ts) records the *artifact* digest that was
144
+ * promoted/deployed, not the manifest's own aggregate `manifestDigest` — so
145
+ * resolving "the build behind this deployed digest" means searching
146
+ * manifest contents, not a direct keyed lookup. Returns `undefined` when no
147
+ * persisted manifest contains a matching entry (no build was ever persisted
148
+ * for that artifact digest — e.g. it predates #609, or was recorded via the
149
+ * standalone `chant components release` command with no corresponding
150
+ * `chant build`/`run` in this checkout).
151
+ *
152
+ * A `ReleaseRecord.manifestDigest`, when present (an optional field a caller
153
+ * may have supplied at record time), lets a caller skip this scan entirely
154
+ * via `readBuildManifest` directly — this function is the fallback for the
155
+ * common case where only the artifact digest is known.
156
+ */
157
+ export async function findBuildManifestByArtifactDigest(artifactDigest, opts) {
158
+ const manifests = await readAllBuildManifests(opts);
159
+ return manifests.find((m) => m.contents.some((entry) => entry.digest === artifactDigest));
160
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Build ledger — the "what's been built" half of build & deploy observability
3
+ * (#568, epic #551 "Build & deploy observability" / "4. Build archive +
4
+ * deferred publish"; SBOM consume/surface added in #606).
5
+ *
6
+ * The `BuildArchive` manifest (../components/verbs/build-archive.ts) is
7
+ * itself the build ledger: it is content-addressed by digest and enumerates
8
+ * every image/template/asset/sbom a build produced. What #568 adds on top is
9
+ * discovery of an image's **referrers** — the SBOM, SLSA provenance, and
10
+ * signature attached to the same digest by tooling like `oras discover
11
+ * <digest>` / `cosign tree` (epic #551's phrasing).
12
+ *
13
+ * This module only *surfaces and consumes* SBOM/provenance/signature
14
+ * evidence — generation is ../components/verbs/sbom.ts's `generate-sbom`
15
+ * capability (#606; SLSA provenance + signing remain out of scope, noted as
16
+ * fast-follow siblings). Two sources feed the same `sbom` summary below, and
17
+ * a caller gets *both* without special-casing which one exists:
18
+ *
19
+ * - **archive-carried** — an `sbom`-kind entry in the same
20
+ * `BuildArchiveManifest`, written directly by `generate-sbom`. This is
21
+ * the **universal home**: it works for every artifact type (image, jar,
22
+ * zip) and every publish backend, including the registry-less
23
+ * `load-image-on-host` path, with no registry/network access required to
24
+ * read it back.
25
+ * - **referrer-projected** — an OCI referrer of `kind: "sbom"` discovered
26
+ * via `ReferrerLookup`, the registry-side convenience for image
27
+ * artifacts (`oras discover <digest>`/`cosign tree`) that #568 already
28
+ * modeled. Not every artifact type has this projection (only images
29
+ * published to a registry do), and not every environment can query it
30
+ * (`ReferrerLookup` defaults to `noopReferrerLookup`, no network).
31
+ *
32
+ * `buildLedgerEntries` prefers the archive-carried copy when both exist
33
+ * (same digest either way, since both trace back to the same
34
+ * `generate-sbom` run — the archive is the source of truth; the referrer is
35
+ * a projection of it) and falls back to the referrer when only that is
36
+ * available (e.g. a manifest read that predates #606, or a third-party tool
37
+ * attached an SBOM directly to the registry outside chant's own build). The
38
+ * `ReferrerLookup` interface remains injectable for exactly the reason
39
+ * `CloudExecutor` is injectable elsewhere in ../components/verbs: no test and
40
+ * no default implementation shells out to a real `oras`/`cosign`/registry
41
+ * call.
42
+ *
43
+ * **#614 additions.** Two more things get surfaced per manifest, both
44
+ * derived from data the manifest already carries (no new generation, no
45
+ * re-parsing of BOM bytes):
46
+ *
47
+ * - Each `BuildLedgerEntry` (still one per image, matching this module's
48
+ * existing scope) now carries that image's own `reproducibility` — read
49
+ * straight off its `BuildArchiveEntry`, never inferred from a sibling
50
+ * artifact (see ../components/verbs/reproducibility.ts's module doc for
51
+ * why a blanket flag would misrepresent a multi-artifact component).
52
+ * `artifactReproducibilitySummary` below reports the same per-artifact
53
+ * honesty for *every* artifact entry in a manifest (image, template,
54
+ * asset alike) — the full per-artifact picture #614 asks for, not just
55
+ * the image-scoped slice `buildLedgerEntries` has always covered.
56
+ * - `componentBomSummary` reports the component-level BOM aggregation
57
+ * picture (../components/verbs/component-bom.ts): how many leaf BOMs
58
+ * (software SBOM + IaC config-BOM) the manifest carries, each one's
59
+ * `bomKind`/format/package count, and whether they'd compose into a
60
+ * single-artifact (1:1) or real multi-artifact assembly. This is a
61
+ * summary read off the manifest's existing `sbom`-kind entries — it does
62
+ * not regenerate or re-validate the aggregate document (that stays
63
+ * `aggregateComponentBom`'s job, given each leaf's `BomPackage[]`, which
64
+ * the manifest alone does not carry).
65
+ */
66
+ import { findSbomForSubject, imageEntries, sbomEntries, artifactEntries } from "../components/verbs/build-archive.js";
67
+ /** Default `ReferrerLookup`: reports no referrers. A real registry/`oras`-backed implementation is out of scope here (belongs with #564's signing follow-up) — this keeps build-ledger queries safe to run with no cloud/network access. */
68
+ export const noopReferrerLookup = {
69
+ async discover() {
70
+ return [];
71
+ },
72
+ };
73
+ /**
74
+ * Build the ledger view for one archive manifest: every `image`-kind entry,
75
+ * each paired with its OCI referrers via `lookup` and its SBOM summary (read
76
+ * from the archive-carried entry first, the referrer projection otherwise —
77
+ * see this module's doc comment). "What's built" becomes "what's built, from
78
+ * which commit, by what, when" once a release record (./release-ledger.ts)
79
+ * is joined onto this by `digest` — this function only produces the build
80
+ * side of that join.
81
+ */
82
+ export async function buildLedgerEntries(manifest, lookup = noopReferrerLookup) {
83
+ const images = imageEntries(manifest);
84
+ const entries = [];
85
+ for (const image of images) {
86
+ const referrers = await lookup.discover(image.digest);
87
+ const archiveSbom = findSbomForSubject(manifest, image.digest);
88
+ const referrerSbom = findReferrer(referrers, "sbom");
89
+ const sbom = archiveSbom
90
+ ? {
91
+ mediaType: archiveSbom.mediaType ?? "application/octet-stream",
92
+ packageCount: archiveSbom.packageCount,
93
+ generator: archiveSbom.generator,
94
+ source: "archive",
95
+ }
96
+ : referrerSbom
97
+ ? { mediaType: referrerSbom.mediaType, source: "referrer" }
98
+ : undefined;
99
+ entries.push({
100
+ component: manifest.component,
101
+ path: image.path,
102
+ digest: image.digest,
103
+ createdAt: manifest.createdAt,
104
+ manifestDigest: manifest.manifestDigest,
105
+ referrers,
106
+ sbom,
107
+ reproducibility: image.reproducibility,
108
+ });
109
+ }
110
+ return entries;
111
+ }
112
+ /** Find the referrer of a given kind for a digest, if any (a convenience for "does this build have a signature/SBOM/provenance"). */
113
+ export function findReferrer(referrers, kind) {
114
+ return referrers.find((r) => r.kind === kind);
115
+ }
116
+ /**
117
+ * Report every artifact entry's (`image`/`template`/`asset`) own
118
+ * reproducibility + provenance, honestly per-artifact — the full picture
119
+ * #614 asks for, wider than `buildLedgerEntries`'s image-only scope. Order
120
+ * matches `artifactEntries`' manifest insertion order; sort by `path`
121
+ * yourself for a stable display order (mirroring
122
+ * `computeManifestDigest`'s own path-sort convention).
123
+ */
124
+ export function artifactReproducibilitySummary(manifest) {
125
+ return artifactEntries(manifest).map((entry) => ({
126
+ path: entry.path,
127
+ kind: entry.kind,
128
+ digest: entry.digest,
129
+ reproducibility: entry.reproducibility,
130
+ sourceRef: entry.provenance?.sourceRef,
131
+ }));
132
+ }
133
+ /**
134
+ * Build the component BOM summary for one manifest, straight from its
135
+ * existing `sbom`-kind entries — no regeneration, no re-parsing of BOM
136
+ * bytes. `undefined` when the manifest carries no BOM at all (a component
137
+ * that composed neither `generate-sbom` nor `extract-config-bom` — skipping
138
+ * is structural, matching every other BOM consumer's convention in this
139
+ * codebase).
140
+ */
141
+ export function componentBomSummary(manifest) {
142
+ const boms = sbomEntries(manifest);
143
+ if (boms.length === 0)
144
+ return undefined;
145
+ const leaves = boms.map((entry) => ({
146
+ path: entry.path,
147
+ bomKind: entry.bomKind ?? "software",
148
+ subjectDigest: entry.subjectDigest,
149
+ mediaType: entry.mediaType ?? "application/octet-stream",
150
+ packageCount: entry.packageCount,
151
+ generator: entry.generator,
152
+ }));
153
+ const totalPackageCount = leaves.reduce((sum, l) => sum + (l.packageCount ?? 0), 0);
154
+ return { leaves, totalPackageCount, isAssembly: leaves.length > 1 };
155
+ }
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Change set: a typed, read-only projection of a live diff.
3
+ *
4
+ * `chant lifecycle diff --live` computes a three-way comparison — declared now /
5
+ * last snapshot / live now — and prints it. `buildChangeSet` promotes that
6
+ * same signal into a classified create/update/delete/adopt/runtime/noop set
7
+ * that other tooling (reconcile, apply) can act on.
8
+ *
9
+ * Strictly read-only and pure: no I/O, no mutation. The classification reads
10
+ * ownership from the live marker only (populated downstream); until ownership
11
+ * exists, an undeclared live resource is `adopt`, never `delete`. The snapshot
12
+ * is evidence, never the basis for a mutation decision — it must never become
13
+ * load-bearing.
14
+ */
15
+ import { diffLive } from "./live-diff.js";
16
+ import { unobservedReasonText } from "../observation.js";
17
+ import { renderDisruption, summarizeDisruption } from "./disruption.js";
18
+ export function buildChangeSet(env, input, options) {
19
+ const diff = diffLive(input);
20
+ const { declared, observedNow } = input;
21
+ const observedThen = input.observedThen ?? {};
22
+ const unobservedInput = input.unobserved ?? {};
23
+ const driftByName = new Map(diff.driftedSinceSnapshot.map((d) => [d.name, d.changes]));
24
+ const names = new Set([
25
+ ...declared,
26
+ ...Object.keys(observedNow),
27
+ ...Object.keys(observedThen),
28
+ ...Object.keys(unobservedInput),
29
+ ]);
30
+ const entries = [];
31
+ for (const name of names) {
32
+ const isDeclared = declared.has(name);
33
+ const live = Object.prototype.hasOwnProperty.call(observedNow, name);
34
+ const inSnapshot = Object.prototype.hasOwnProperty.call(observedThen, name);
35
+ // A returned resource was observed by definition; `unobserved` only counts
36
+ // for entities the lexicon did not return.
37
+ const unobservedEntry = live ? undefined : unobservedInput[name];
38
+ const type = observedNow[name]?.type ?? observedThen[name]?.type ?? unobservedEntry?.type;
39
+ const evidence = { declared: isDeclared, inSnapshot, live, observed: !unobservedEntry };
40
+ // Ownership comes from the LIVE marker only (carried on observedNow), never
41
+ // from the snapshot. This is the invariant that keeps the snapshot from
42
+ // becoming load-bearing: a mutation decision (delete) is never made from a
43
+ // record chant has to host.
44
+ const ownership = observedNow[name]?.ownership ?? "unknown";
45
+ // Owner-reference chain (#1077), same live-only provenance as ownership
46
+ // above. Only a `declared` root changes the classification; `unknown` is
47
+ // deliberately not escalated (#1168's tri-state precedent — an
48
+ // unconfirmed chain never earns the more confident verdict).
49
+ const runtimeOwner = !isDeclared && observedNow[name]?.ownerChain?.root === "declared"
50
+ ? observedNow[name].ownerChain.entity
51
+ : undefined;
52
+ let action;
53
+ let deltas;
54
+ if (unobservedEntry) {
55
+ // The lexicon never looked. Absence is not established, so neither a
56
+ // create (declared) nor a delete/adopt (undeclared) can be proposed —
57
+ // the entry exists to say the plan has a hole here.
58
+ action = "unobserved";
59
+ }
60
+ else if (isDeclared && !live) {
61
+ // Declared in source, and the provider confirmed it absent → create.
62
+ action = "create";
63
+ }
64
+ else if (isDeclared && live) {
65
+ const drift = driftByName.get(name);
66
+ if (drift && drift.length > 0) {
67
+ action = "update";
68
+ deltas = drift;
69
+ }
70
+ else {
71
+ action = "noop";
72
+ }
73
+ }
74
+ else if (live && runtimeOwner) {
75
+ // Live, undeclared, and its owner chain reaches a declared entity
76
+ // (#1077) — expected runtime, never a delete/adopt candidate, checked
77
+ // ahead of the ownership marker below: even a runtime child that
78
+ // happens to carry chant's own marker (label propagation from its
79
+ // owner's template) must never be proposed for deletion.
80
+ action = "runtime";
81
+ }
82
+ else if (live) {
83
+ // Live but undeclared. Only a chant-owned orphan is a safe delete; a
84
+ // foreign or unknown orphan can be adopted but never auto-deleted.
85
+ action = ownership === "owned" ? "delete" : "adopt";
86
+ }
87
+ else {
88
+ // Only in the snapshot: already gone, nothing to reconcile.
89
+ action = "noop";
90
+ }
91
+ // The address the read went to (#1620) — from the unobserved entry when
92
+ // there is one, else the observation's queried map. Diagnostic only; the
93
+ // classification above never reads it.
94
+ const queried = unobservedEntry?.queried ?? input.queried?.[name];
95
+ const definition = action === "create" ? input.definitions?.[name] : undefined;
96
+ // The provider's id for the row (#1674). Live first; the snapshot's only
97
+ // when the resource is no longer live (a snapshot-only noop).
98
+ const physicalId = observedNow[name]?.physicalId ?? observedThen[name]?.physicalId;
99
+ entries.push({
100
+ name,
101
+ type,
102
+ ...(options?.lexicon ? { lexicon: options.lexicon } : {}),
103
+ ...(physicalId ? { physicalId } : {}),
104
+ action,
105
+ evidence,
106
+ deltas,
107
+ ownership,
108
+ ...(unobservedEntry
109
+ ? {
110
+ unobservedReason: unobservedEntry.reason,
111
+ ...(unobservedEntry.detail ? { unobservedDetail: unobservedEntry.detail } : {}),
112
+ }
113
+ : {}),
114
+ ...(queried ? { queried } : {}),
115
+ ...(definition ? { definition } : {}),
116
+ ...(runtimeOwner ? { runtimeOwner } : {}),
117
+ });
118
+ }
119
+ entries.sort((a, b) => a.name.localeCompare(b.name));
120
+ return { env, entries };
121
+ }
122
+ const ACTION_ORDER = ["create", "update", "effect", "delete", "adopt", "runtime", "noop", "unobserved"];
123
+ /** Count entries per action. */
124
+ export function summarize(cs) {
125
+ const counts = {
126
+ create: 0,
127
+ update: 0,
128
+ effect: 0,
129
+ delete: 0,
130
+ adopt: 0,
131
+ runtime: 0,
132
+ noop: 0,
133
+ unobserved: 0,
134
+ };
135
+ for (const e of cs.entries)
136
+ counts[e.action]++;
137
+ return counts;
138
+ }
139
+ /** Project a change set onto the GitLab MR plan widget shape. Pure. */
140
+ export function gitlabMrReport(cs) {
141
+ const counts = summarize(cs);
142
+ return { create: counts.create, update: counts.update, delete: counts.delete };
143
+ }
144
+ /**
145
+ * Warning a plan should print when it carries a hole — a declared entity the
146
+ * lexicon could not observe (#1089). The `--json` and `--report gitlab-mr`
147
+ * shapes have no column for `unobserved`, so both the CLI (on stderr) and the
148
+ * `markdown` report (in the body, since a reviewer never sees a job's stderr)
149
+ * read this same wording rather than drifting apart. Empty when the plan has
150
+ * no hole. Same discipline as {@link disruptionNotices} in `./disruption`.
151
+ */
152
+ export function unobservedPlanNotice(cs) {
153
+ const count = summarize(cs).unobserved;
154
+ return count > 0
155
+ ? [
156
+ `${count} declared entity(ies) could not be observed — no create/update/delete is proposed for them. This plan is incomplete, not clean.`,
157
+ ]
158
+ : [];
159
+ }
160
+ /**
161
+ * Section heading text for one action group — shared between {@link renderChangeSet}
162
+ * and {@link renderChangeSetMarkdown} so the wording never drifts between the
163
+ * terminal render and the reviewer-facing one.
164
+ */
165
+ function actionSectionLabel(action, hasDisruption) {
166
+ switch (action) {
167
+ case "unobserved":
168
+ return "UNOBSERVED (declared; chant could not read live state — no action proposed)";
169
+ case "runtime":
170
+ return "RUNTIME (owned by a declared resource; not drift, never a delete/adopt candidate)";
171
+ case "effect":
172
+ return "EFFECT (receipt absent or stale; the effect step fires — the generic apply never writes a receipt)";
173
+ case "update":
174
+ return hasDisruption
175
+ ? "UPDATE (disruption from the lexicon that owns the spec; unknown means nobody could say, not that it is safe)"
176
+ : "UPDATE";
177
+ default:
178
+ return action.toUpperCase();
179
+ }
180
+ }
181
+ /** Human-readable render of a change set. Pure — returns a string. */
182
+ export function renderChangeSet(cs) {
183
+ const counts = summarize(cs);
184
+ const header = ACTION_ORDER.map((a) => `${counts[a]} ${a}`).join(", ");
185
+ const lines = [`Plan for ${cs.env}: ${header}`];
186
+ // Disruption (#1665) rides the header too, so the one number that says how
187
+ // much this plan hurts is visible without reading every row.
188
+ const disruption = summarizeDisruption(cs);
189
+ const disruptionParts = Object.entries(disruption)
190
+ .filter(([, n]) => n > 0)
191
+ .map(([level, n]) => `${n} ${level}`);
192
+ if (disruptionParts.length > 0) {
193
+ lines.push(`Disruption: ${disruptionParts.join(", ")}`);
194
+ }
195
+ for (const action of ACTION_ORDER) {
196
+ const group = cs.entries.filter((e) => e.action === action);
197
+ if (group.length === 0)
198
+ continue;
199
+ lines.push(`\n${actionSectionLabel(action, disruptionParts.length > 0)}:`);
200
+ for (const e of group) {
201
+ if (e.action === "effect") {
202
+ lines.push(` effect will fire: ${e.effect ?? e.name} — receipt ${e.name}${e.type ? ` (${e.type})` : ""}` +
203
+ `${e.effectDetail ? ` — ${e.effectDetail}` : ""}`);
204
+ continue;
205
+ }
206
+ const own = e.ownership === "unknown" ? "" : ` [${e.ownership}]`;
207
+ const why = e.unobservedReason
208
+ ? ` — ${unobservedReasonText(e.unobservedReason)}${e.unobservedDetail ? `: ${e.unobservedDetail}` : ""}`
209
+ : "";
210
+ const owner = e.runtimeOwner ? ` — owned by ${e.runtimeOwner}` : "";
211
+ lines.push(` ${e.name}${e.type ? ` (${e.type})` : ""}${own}${why}${owner}${renderDisruption(e)}`);
212
+ const forced = new Set(e.disruptionBecause ?? []);
213
+ for (const d of e.deltas ?? []) {
214
+ // A path the verdict rests on is marked, so a `replace` row says which
215
+ // of five changed properties caused it.
216
+ lines.push(` ${forced.has(d.path) ? "! " : ""}${d.path}: ${fmt(d.oldValue)} → ${fmt(d.newValue)}`);
217
+ }
218
+ }
219
+ }
220
+ if (cs.held && cs.held.length > 0) {
221
+ lines.push(`\n${heldSectionLabel()}:`);
222
+ for (const line of heldLines(cs.held))
223
+ lines.push(line);
224
+ }
225
+ return lines.join("\n");
226
+ }
227
+ /**
228
+ * Section heading for the held set (#2162) — shared between {@link renderChangeSet}
229
+ * and {@link renderChangeSetMarkdown}.
230
+ */
231
+ function heldSectionLabel() {
232
+ return "HELD (declared heldElsewhere(); not drift, never proposed for update)";
233
+ }
234
+ /** One held property's plain-text line, indented under its entity. */
235
+ function heldLines(held) {
236
+ const lines = [];
237
+ for (const entity of held) {
238
+ const lexicon = entity.lexicon ? ` ${entity.lexicon}` : "";
239
+ lines.push(` ${entity.name} (${entity.type})${lexicon}`);
240
+ for (const h of entity.held) {
241
+ const live = "live" in h ? fmt(h.live) : "<absent>";
242
+ const suspicious = h.suspicious
243
+ ? " [SUSPICIOUS: no live value ever showed up here]"
244
+ : "";
245
+ lines.push(` ${h.path}: held by ${h.by} — ${live} (${h.reason})${suspicious}`);
246
+ }
247
+ }
248
+ return lines;
249
+ }
250
+ /** One held property's markdown line, mirroring {@link renderMarkdownEntry}'s formatting. */
251
+ function heldLinesMarkdown(held) {
252
+ const lines = [];
253
+ for (const entity of held) {
254
+ const lexicon = entity.lexicon ? ` \`${entity.lexicon}\`` : "";
255
+ lines.push(`- \`${entity.name}\` (${entity.type})${lexicon}`);
256
+ if (entity.held.length > 0) {
257
+ lines.push(" ```");
258
+ for (const h of entity.held) {
259
+ const live = "live" in h ? fmt(h.live) : "<absent>";
260
+ const suspicious = h.suspicious ? " SUSPICIOUS: no live value ever showed up here" : "";
261
+ lines.push(` ${h.path}: held by ${h.by} — ${live} (${h.reason})${suspicious}`);
262
+ }
263
+ lines.push(" ```");
264
+ }
265
+ }
266
+ return lines;
267
+ }
268
+ /**
269
+ * Entries beyond this in one action group are collapsed into a `<details>`
270
+ * block in {@link renderChangeSetMarkdown} — a group's worth of rows is fine
271
+ * to read inline, a hundred-entry plan is not (#1983).
272
+ */
273
+ const MARKDOWN_FOLD_THRESHOLD = 20;
274
+ /** One entry's markdown, mirroring the rows {@link renderChangeSet} prints. */
275
+ function renderMarkdownEntry(e) {
276
+ if (e.action === "effect") {
277
+ return [
278
+ `- effect will fire: \`${e.effect ?? e.name}\` — receipt \`${e.name}\`${e.type ? ` (${e.type})` : ""}` +
279
+ `${e.effectDetail ? ` — ${e.effectDetail}` : ""}`,
280
+ ];
281
+ }
282
+ const lexicon = e.lexicon ? ` \`${e.lexicon}\`` : "";
283
+ const own = e.ownership === "unknown" ? "" : ` [${e.ownership}]`;
284
+ const why = e.unobservedReason
285
+ ? ` — ${unobservedReasonText(e.unobservedReason)}${e.unobservedDetail ? `: ${e.unobservedDetail}` : ""}`
286
+ : "";
287
+ const owner = e.runtimeOwner ? ` — owned by \`${e.runtimeOwner}\`` : "";
288
+ // Bolded rather than the plain-text render's bare " — destroy: ..." — a
289
+ // reviewer scanning a wall of "update" rows should see disruption without
290
+ // reading every one (#1665).
291
+ const disruption = e.disruption
292
+ ? ` — **${e.disruption}**${e.disruptionDetail ? `: ${e.disruptionDetail}` : ""}`
293
+ : "";
294
+ const lines = [`- \`${e.name}\`${e.type ? ` (${e.type})` : ""}${lexicon}${own}${why}${owner}${disruption}`];
295
+ if (e.deltas && e.deltas.length > 0) {
296
+ const forced = new Set(e.disruptionBecause ?? []);
297
+ lines.push(" ```");
298
+ for (const d of e.deltas) {
299
+ lines.push(` ${forced.has(d.path) ? "! " : " "}${d.path}: ${fmt(d.oldValue)} → ${fmt(d.newValue)}`);
300
+ }
301
+ lines.push(" ```");
302
+ }
303
+ return lines;
304
+ }
305
+ /**
306
+ * Markdown projection of a change set (#1983) — sized for a PR/MR comment
307
+ * rather than a terminal. A scannable counts header, entries grouped by
308
+ * action and attributed to their lexicon, deltas in a fenced block, and any
309
+ * group past {@link MARKDOWN_FOLD_THRESHOLD} folded into a `<details>` so a
310
+ * large plan doesn't bury the comment. Pure — no ANSI, no I/O — and
311
+ * deterministic: same entry ordering as {@link renderChangeSet}.
312
+ *
313
+ * Both a hole (#1089) and an expensive verdict (#1665) are surfaced IN the
314
+ * body, not left to stderr the way `--json` and `--report gitlab-mr` leave
315
+ * them: a reviewer reading a comment never sees the job's log, so a plan
316
+ * carrying either must not read as clean.
317
+ */
318
+ export function renderChangeSetMarkdown(cs) {
319
+ const counts = summarize(cs);
320
+ const lines = [`## Plan for \`${cs.env}\``, "", ACTION_ORDER.map((a) => `${counts[a]} ${a}`).join(", ")];
321
+ const disruption = summarizeDisruption(cs);
322
+ const disruptionParts = Object.entries(disruption)
323
+ .filter(([, n]) => n > 0)
324
+ .map(([level, n]) => `${n} ${level}`);
325
+ if (disruptionParts.length > 0) {
326
+ lines.push("", `**Disruption:** ${disruptionParts.join(", ")}`);
327
+ }
328
+ for (const notice of unobservedPlanNotice(cs)) {
329
+ lines.push("", `> **${notice}**`);
330
+ }
331
+ for (const action of ACTION_ORDER) {
332
+ const group = cs.entries.filter((e) => e.action === action);
333
+ if (group.length === 0)
334
+ continue;
335
+ lines.push("", `### ${actionSectionLabel(action, disruptionParts.length > 0)}`);
336
+ const body = group.flatMap((e) => renderMarkdownEntry(e));
337
+ if (group.length > MARKDOWN_FOLD_THRESHOLD) {
338
+ lines.push("", `<details><summary>${group.length} entries — click to expand</summary>`, "", ...body, "", "</details>");
339
+ }
340
+ else {
341
+ lines.push("", ...body);
342
+ }
343
+ }
344
+ if (cs.held && cs.held.length > 0) {
345
+ lines.push("", `### ${heldSectionLabel()}`, "", ...heldLinesMarkdown(cs.held));
346
+ }
347
+ return lines.join("\n").trimEnd() + "\n";
348
+ }
349
+ function fmt(v) {
350
+ if (v === undefined)
351
+ return "<unset>";
352
+ if (typeof v === "string")
353
+ return v.length > 60 ? v.slice(0, 57) + "..." : v;
354
+ const json = JSON.stringify(v);
355
+ return json.length > 60 ? json.slice(0, 57) + "..." : json;
356
+ }