@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,287 @@
1
+ /**
2
+ * Native JSON BOM writer (#613, epic #551 follow-up to #606). Pure
3
+ * TypeScript, no external binaries (no `syft`/`buildx --sbom`/`cyclonedx-maven`/
4
+ * `oras`/`cosign`), no network — every document below is assembled entirely
5
+ * from in-memory data and `JSON.stringify`.
6
+ *
7
+ * This module is the shared serialization core both real `SbomGenerator`
8
+ * backends in this directory build on: the software leaf
9
+ * (./lockfile-sbom-generator.ts, lockfile/manifest-derived package lists) and
10
+ * the IaC leaf (./config-bom.ts, synthesized-template-derived component
11
+ * lists). Neither backend hand-rolls its own SPDX/CycloneDX shape — both
12
+ * call `writeSpdx`/`writeCycloneDx` here so the two document standards have
13
+ * exactly one writer each in the whole codebase.
14
+ *
15
+ * **Why hand-write the JSON instead of a library.** No SPDX/CycloneDX SDK is
16
+ * a dependency of this package (matching ./cloud-executor.ts's stance on the
17
+ * AWS SDK: shell out or hand-roll rather than add a heavy dependency for a
18
+ * narrow need). Both standards' JSON forms are simple enough — a handful of
19
+ * required top-level fields plus an array of package/component records — that
20
+ * a ~100-line writer is more auditable than a dependency. Structural
21
+ * correctness (required fields, enum values) is verified in
22
+ * ./bom-writer.test.ts against each standard's own published JSON Schema
23
+ * (vendored as devDep test fixtures, the same convention #553 used for the
24
+ * Component contract schema — see ./__fixtures__/schemas/).
25
+ *
26
+ * **Format decisions, recorded for reviewers:**
27
+ * - SPDX **2.3** (not 2.2 or 3.0): 2.3 is what BuildKit's native `--sbom`
28
+ * attestation emits (referenced in ./sbom-generator.ts's module doc), so
29
+ * matching that version keeps a future BuildKit-backed `forImage` and this
30
+ * lockfile-backed backend speaking the same SPDX dialect. SPDX 3.0 is a
31
+ * substantially different (JSON-LD/RDF-shaped) model not yet the de facto
32
+ * tooling default as of this writing.
33
+ * - CycloneDX **1.5** (not 1.4 or 1.6): 1.5 is the version most broadly
34
+ * supported by consumer tooling (Dependency-Track, `cyclonedx-cli`) at
35
+ * time of writing and has a stable published JSON Schema; 1.6 adds fields
36
+ * this writer doesn't need yet.
37
+ * - `documentNamespace`/`serialNumber` are deterministic, derived from the
38
+ * subject's digest/path rather than a random UUID, so two BOM generations
39
+ * of byte-identical inputs produce byte-identical documents — the same
40
+ * content-addressing property ./build-archive.ts's `contentDigest`
41
+ * depends on for its "identical inputs -> identical manifest digest"
42
+ * guarantee (see ./sbom.test.ts's existing test of that property).
43
+ *
44
+ * **Assembly (#614).** `BomInput.subDocuments`, when present, projects each
45
+ * sub-document as a real nested unit rather than flattening its packages into
46
+ * the root's own list — CycloneDX's `metadata.component.components` +
47
+ * `compositions` (`aggregate: "incomplete"`, since a component BOM only
48
+ * composes the leaf BOMs it was given, never a closed-world claim over
49
+ * everything the artifact might contain), SPDX's `hasFiles`-style `CONTAINS`
50
+ * relationship from the root package to each sub-document's own root package
51
+ * plus that sub-document's own `DEPENDS_ON` edges. This is what
52
+ * ./component-bom.ts's `aggregateComponentBom` uses to compose a component's
53
+ * leaf BOMs (a software SBOM plus an IaC config-BOM) into one document
54
+ * without flattening away which packages came from which leaf — still one
55
+ * writer per standard, extended rather than duplicated.
56
+ */
57
+ import { SBOM_MEDIA_TYPES } from "./sbom-generator.js";
58
+ /** Deterministic, dependency-free short hash used to derive stable SPDX document namespaces / CycloneDX serial numbers from `BomInput.subjectId`. Not a security hash — just stable and collision-unlikely enough for a namespace suffix. */
59
+ function stableId(input) {
60
+ let hash = 0;
61
+ for (let i = 0; i < input.length; i++) {
62
+ hash = (Math.imul(hash, 31) + input.charCodeAt(i)) | 0;
63
+ }
64
+ return Math.abs(hash).toString(16).padStart(8, "0");
65
+ }
66
+ /** SPDX identifiers may only contain letters, digits, `.`, and `-` (SPDX-2.3 §2.2). */
67
+ function spdxSafeId(name) {
68
+ return name.replace(/[^a-zA-Z0-9.-]/g, "-");
69
+ }
70
+ // ── SPDX-2.3 JSON ────────────────────────────────────────────────────────────
71
+ /**
72
+ * Build one SPDX package record + its `DEPENDS_ON` relationship edges for a
73
+ * flat package list, with SPDX IDs namespaced under `idPrefix` so a
74
+ * sub-document's packages (#614 assembly) never collide with the root's own
75
+ * or another sub-document's, even when two leaf BOMs happen to enumerate a
76
+ * same-named package.
77
+ */
78
+ function spdxPackagesAndDeps(packages, idPrefix) {
79
+ const spdxId = (name) => `SPDXRef-Package-${idPrefix}${spdxSafeId(name)}`;
80
+ const pkgs = packages.map((pkg) => ({
81
+ name: pkg.name,
82
+ SPDXID: spdxId(pkg.name),
83
+ versionInfo: pkg.version ?? "NOASSERTION",
84
+ downloadLocation: pkg.downloadLocation ?? "NOASSERTION",
85
+ filesAnalyzed: false,
86
+ licenseConcluded: "NOASSERTION",
87
+ licenseDeclared: "NOASSERTION",
88
+ copyrightText: "NOASSERTION",
89
+ ...(pkg.purl
90
+ ? {
91
+ externalRefs: [
92
+ { referenceCategory: "PACKAGE-MANAGER", referenceType: "purl", referenceLocator: pkg.purl },
93
+ ],
94
+ }
95
+ : {}),
96
+ }));
97
+ const relationships = packages.flatMap((pkg) => (pkg.dependsOn ?? []).map((dep) => ({
98
+ spdxElementId: spdxId(pkg.name),
99
+ relationshipType: "DEPENDS_ON",
100
+ relatedSpdxElement: spdxId(dep),
101
+ })));
102
+ return { packages: pkgs, relationships };
103
+ }
104
+ /**
105
+ * Native SPDX-2.3 JSON writer. Emits the required top-level fields
106
+ * (`spdxVersion`, `dataLicense`, `SPDXID`, `name`, `documentNamespace`,
107
+ * `creationInfo`, `packages`) plus a `relationships` array recording the
108
+ * document's `DESCRIBES` edge to the subject package and each package's
109
+ * declared `DEPENDS_ON` edges — the "valid relationships section where
110
+ * applicable" #613 calls for.
111
+ *
112
+ * When `input.subDocuments` is present (#614 assembly), each sub-document's
113
+ * own root package is emitted alongside the top-level subject, linked from
114
+ * the top-level subject via a `CONTAINS` relationship, with that
115
+ * sub-document's own packages and `DEPENDS_ON` edges nested under an
116
+ * SPDX-ID namespace unique to it (`SPDXRef-Package-sub<n>-...`) so packages
117
+ * from different leaf BOMs never collide even if same-named.
118
+ */
119
+ export function writeSpdx(input, now = () => new Date()) {
120
+ const rootId = "SPDXRef-DOCUMENT";
121
+ const subjectSpdxId = `SPDXRef-Package-${spdxSafeId(input.subjectName)}`;
122
+ const { packages, relationships: packageRelationships } = spdxPackagesAndDeps(input.packages, "");
123
+ const relationships = [
124
+ { spdxElementId: rootId, relationshipType: "DESCRIBES", relatedSpdxElement: subjectSpdxId },
125
+ ...packageRelationships,
126
+ ];
127
+ const subDocumentPackages = [];
128
+ (input.subDocuments ?? []).forEach((sub, i) => {
129
+ const subRootId = `SPDXRef-Package-sub${i}-${spdxSafeId(sub.subjectName)}`;
130
+ subDocumentPackages.push({
131
+ name: sub.subjectName,
132
+ SPDXID: subRootId,
133
+ versionInfo: sub.subjectVersion ?? "NOASSERTION",
134
+ downloadLocation: "NOASSERTION",
135
+ filesAnalyzed: false,
136
+ licenseConcluded: "NOASSERTION",
137
+ licenseDeclared: "NOASSERTION",
138
+ copyrightText: "NOASSERTION",
139
+ comment: `subjectId: ${sub.subjectId}`,
140
+ });
141
+ relationships.push({
142
+ spdxElementId: subjectSpdxId,
143
+ relationshipType: "CONTAINS",
144
+ relatedSpdxElement: subRootId,
145
+ });
146
+ const { packages: subPkgs, relationships: subRels } = spdxPackagesAndDeps(sub.packages, `sub${i}-`);
147
+ subDocumentPackages.push(...subPkgs);
148
+ relationships.push(
149
+ // CONTAINS (not DEPENDS_ON): membership in this leaf BOM, not a
150
+ // literal dependency edge — the leaf's own DEPENDS_ON edges (from
151
+ // BomPackage.dependsOn) are `subRels`, pushed separately below.
152
+ ...subPkgs.map((p) => ({
153
+ spdxElementId: subRootId,
154
+ relationshipType: "CONTAINS",
155
+ relatedSpdxElement: p.SPDXID,
156
+ })), ...subRels);
157
+ });
158
+ const document = {
159
+ spdxVersion: "SPDX-2.3",
160
+ dataLicense: "CC0-1.0",
161
+ SPDXID: rootId,
162
+ name: input.subjectName,
163
+ documentNamespace: `https://chant.dev/spdxdocs/${spdxSafeId(input.subjectName)}-${stableId(input.subjectId)}`,
164
+ creationInfo: {
165
+ created: now().toISOString(),
166
+ creators: [`Tool: ${input.generator}`],
167
+ },
168
+ packages: [
169
+ {
170
+ name: input.subjectName,
171
+ SPDXID: subjectSpdxId,
172
+ versionInfo: input.subjectVersion ?? "NOASSERTION",
173
+ downloadLocation: "NOASSERTION",
174
+ filesAnalyzed: false,
175
+ licenseConcluded: "NOASSERTION",
176
+ licenseDeclared: "NOASSERTION",
177
+ copyrightText: "NOASSERTION",
178
+ },
179
+ ...packages,
180
+ ...subDocumentPackages,
181
+ ],
182
+ relationships,
183
+ };
184
+ return JSON.stringify(document, null, 2);
185
+ }
186
+ // ── CycloneDX-1.5 JSON ───────────────────────────────────────────────────────
187
+ /** Project a flat package list into CycloneDX `components`, with `bom-ref`s namespaced under `refPrefix` so a sub-document's components (#614 assembly) never collide with the root's own or another sub-document's. */
188
+ function cycloneDxComponents(packages, refPrefix) {
189
+ return packages.map((pkg) => ({
190
+ type: pkg.type === "config" ? "application" : "library",
191
+ "bom-ref": `${refPrefix}${pkg.name}`,
192
+ name: pkg.name,
193
+ ...(pkg.version ? { version: pkg.version } : {}),
194
+ ...(pkg.purl ? { purl: pkg.purl } : {}),
195
+ }));
196
+ }
197
+ /** Project a flat package list's `dependsOn` edges into CycloneDX `dependencies` entries, `bom-ref`s namespaced the same way `cycloneDxComponents` namespaces its components. */
198
+ function cycloneDxDependencies(packages, refPrefix) {
199
+ return packages
200
+ .filter((p) => (p.dependsOn?.length ?? 0) > 0)
201
+ .map((p) => ({ ref: `${refPrefix}${p.name}`, dependsOn: p.dependsOn.map((d) => `${refPrefix}${d}`) }));
202
+ }
203
+ /**
204
+ * Native CycloneDX-1.5 JSON writer. Emits the required top-level fields
205
+ * (`bomFormat`, `specVersion`, `serialNumber`, `version`, `metadata`,
206
+ * `components`) plus a `dependencies` array recording the root subject's
207
+ * direct dependencies and each component's own declared dependencies.
208
+ *
209
+ * When `input.subDocuments` is present (#614 assembly), each sub-document is
210
+ * projected as a real nested component under `metadata.component.components`
211
+ * (CycloneDX's own "hierarchical representation of component assemblies,
212
+ * similar to system -> subsystem -> parts" per its schema doc) — never
213
+ * flattened into the root's own `components` array — with a `compositions`
214
+ * entry recording the aggregate as `"incomplete"` (this document composes
215
+ * exactly the leaf BOMs it was given, not a closed-world claim over
216
+ * everything the artifact might contain) and a root `dependencies` edge from
217
+ * the top-level subject to each sub-document's root.
218
+ */
219
+ export function writeCycloneDx(input, now = () => new Date()) {
220
+ const rootRef = `subject:${input.subjectName}`;
221
+ const components = cycloneDxComponents(input.packages, "");
222
+ const subDocuments = input.subDocuments ?? [];
223
+ const subComponents = subDocuments.map((sub, i) => {
224
+ const refPrefix = `sub${i}:`;
225
+ const subRef = `${refPrefix}subject:${sub.subjectName}`;
226
+ return {
227
+ type: "application",
228
+ "bom-ref": subRef,
229
+ name: sub.subjectName,
230
+ ...(sub.subjectVersion ? { version: sub.subjectVersion } : {}),
231
+ properties: [{ name: "chant:subjectId", value: sub.subjectId }],
232
+ components: cycloneDxComponents(sub.packages, refPrefix),
233
+ };
234
+ });
235
+ const subDependencies = subDocuments.flatMap((sub, i) => {
236
+ const refPrefix = `sub${i}:`;
237
+ const subRef = `${refPrefix}subject:${sub.subjectName}`;
238
+ return [
239
+ { ref: subRef, dependsOn: sub.packages.map((p) => `${refPrefix}${p.name}`) },
240
+ ...cycloneDxDependencies(sub.packages, refPrefix),
241
+ ];
242
+ });
243
+ // Root subject depends on its own flat packages plus, when this is an
244
+ // assembly (#614), each sub-document's own root — one entry, not two, so
245
+ // the root ref never appears twice in `dependencies`.
246
+ const rootDependsOn = [...input.packages.map((p) => p.name), ...subComponents.map((c) => c["bom-ref"])];
247
+ const dependencies = [
248
+ { ref: rootRef, dependsOn: rootDependsOn },
249
+ ...cycloneDxDependencies(input.packages, ""),
250
+ ...subDependencies,
251
+ ];
252
+ const compositions = subDocuments.length > 0
253
+ ? [{ aggregate: "incomplete", assemblies: [rootRef, ...subComponents.map((c) => c["bom-ref"])] }]
254
+ : undefined;
255
+ const document = {
256
+ bomFormat: "CycloneDX",
257
+ specVersion: "1.5",
258
+ serialNumber: `urn:uuid:${toUuidLike(stableId(input.subjectId) + stableId(input.subjectName))}`,
259
+ version: 1,
260
+ metadata: {
261
+ timestamp: now().toISOString(),
262
+ tools: [{ name: input.generator }],
263
+ component: {
264
+ type: "application",
265
+ "bom-ref": rootRef,
266
+ name: input.subjectName,
267
+ ...(input.subjectVersion ? { version: input.subjectVersion } : {}),
268
+ ...(subComponents.length > 0 ? { components: subComponents } : {}),
269
+ },
270
+ },
271
+ components,
272
+ dependencies,
273
+ ...(compositions ? { compositions } : {}),
274
+ };
275
+ return JSON.stringify(document, null, 2);
276
+ }
277
+ /** Format an 8-hex-char stable id into a UUID-shaped (but not random/RFC-4122-compliant) string, since CycloneDX only requires `serialNumber` to match `urn:uuid:<uuid-form>` syntactically, not to be a real random UUID — determinism matters more here than entropy. */
278
+ function toUuidLike(seed) {
279
+ const padded = (seed + seed + seed + seed).slice(0, 32);
280
+ return `${padded.slice(0, 8)}-${padded.slice(8, 12)}-4${padded.slice(13, 16)}-8${padded.slice(17, 20)}-${padded.slice(20, 32)}`;
281
+ }
282
+ // ── format dispatch ──────────────────────────────────────────────────────────
283
+ /** Serialize `input` in the requested `format` and wrap it as the project-wide `{ format, mediaType, bytes }` doc shape (./sbom-generator.ts's `SbomDocument`, minus `generator`/`packageCount` which the caller fills in). */
284
+ export function writeBom(format, input, now) {
285
+ const bytes = format === "spdx" ? writeSpdx(input, now) : writeCycloneDx(input, now);
286
+ return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes };
287
+ }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * BuildArchive format — the self-contained bundle `docker-build` (and the
3
+ * other build-family verbs) write into (#564, epic #551 "4. Build archive +
4
+ * deferred publish"). See docs/components/build-archive.mdx.
5
+ *
6
+ * A build archive holds four kinds of contents, enumerated by one manifest:
7
+ * - `image` — an image tarball in OCI layout (as `docker save` produces),
8
+ * content-addressed by its digest.
9
+ * - `template` — a synthesized deploy template (e.g. a CloudFormation
10
+ * document) referenced by `cfn-deploy`'s `archive:<name>` convention
11
+ * (see ../verbs/apply.ts's `CfnDeployInput.template`). Per #613, a
12
+ * `template` entry is a first-class artifact with its own content
13
+ * digest — peer to `image`/`asset` — so it can itself be the
14
+ * `subjectDigest` a `sbom`-kind entry (specifically a config-BOM,
15
+ * `bomKind: "config"`) is attached to.
16
+ * - `asset` — any other published artifact (a jar, a zip) the `publish`
17
+ * family's non-image backends (`publish-artifact`) promote.
18
+ * - `sbom` — a Bill of Materials attached to another entry's digest (#606,
19
+ * #613, epic #551 follow-up to #564/#568), written by either the
20
+ * `generate-sbom` capability (./sbom.ts, a **software** BOM over an
21
+ * image/jar/zip/dir) or the `extract-config-bom` capability
22
+ * (./config-bom.ts, a **config-BOM** over a synthesized IaC template's
23
+ * declared resources/nested stacks/external references). `bomKind`
24
+ * distinguishes the two without introducing a separate entry kind — both
25
+ * are content-addressed, digest-linked BOM documents, and every existing
26
+ * `sbom`-kind consumer (`findSbomForSubject`, the build ledger) keeps
27
+ * working unmodified for either kind. The archive is the **universal
28
+ * home** for both: an image's SBOM may also be projected as an OCI
29
+ * referrer at publish time (a registry-side convenience for `oras
30
+ * discover`/`cosign tree`), but the archive-carried copy is what makes
31
+ * non-image artifacts (a jar in S3, a zip, a template) and registry-less
32
+ * deploys (`load-image-on-host`) work identically — no registry required
33
+ * to read a build's BOM back.
34
+ *
35
+ * The manifest is itself content-addressed (`manifestDigest`, a stable hash
36
+ * over its entries) so two builds of the same inputs produce the same
37
+ * archive identity, and so a promoted digest can be traced back to exactly
38
+ * the manifest that produced it. Nothing here shells out or touches a real
39
+ * filesystem/docker daemon — manifest assembly is pure data, which is what
40
+ * lets `docker-build` (./build.ts) and `publish-image`/`load-image-on-host`
41
+ * (./publish.ts) build and promote an archive entirely through the injectable
42
+ * `CloudExecutor`, exercised in tests via `MockCloudExecutor` with no real
43
+ * disk/docker/AWS involved. The same is true of `generate-sbom` (./sbom.ts)
44
+ * and the injectable `SbomGenerator` (./sbom-generator.ts).
45
+ *
46
+ * Per #614, every `image`/`template`/`asset` entry also carries an honest,
47
+ * per-artifact `reproducibility` record and an optional `provenance`
48
+ * source->output link (see ./reproducibility.ts) — never a single blanket
49
+ * flag hoisted to the component, since a component that builds more than one
50
+ * artifact type (an image plus a synthesized template, say) has a different
51
+ * true answer for each.
52
+ */
53
+ import { defaultReproducibility } from "./reproducibility.js";
54
+ import { contentDigest } from "../../content-digest.js";
55
+ import { canonicalJson } from "../../effect-receipt.js";
56
+ /**
57
+ * Fallback media type per entry `kind`, used only when a caller omits
58
+ * `mediaType` on `addArchiveEntry`. `sbom` has no single default here by
59
+ * design — SPDX and CycloneDX are both first-class (#606) and the actual
60
+ * media type always comes from the `SbomDocument` the `generate-sbom`
61
+ * capability produced (./sbom-generator.ts); this fallback exists only so a
62
+ * malformed/omitted call doesn't produce an entry with no media type at all.
63
+ */
64
+ const DEFAULT_MEDIA_TYPES = {
65
+ image: "application/vnd.oci.image.layout.v1.tar",
66
+ template: "application/json",
67
+ asset: "application/octet-stream",
68
+ sbom: "application/spdx+json",
69
+ };
70
+ /**
71
+ * The content digest every entry chant computes itself carries: real
72
+ * SHA-256 over the UTF-8 bytes of its input (../../content-digest.ts,
73
+ * chant #2514). Callers that digest content that never goes through the
74
+ * `CloudExecutor` (a synthesized template's serialized bytes, see ./build.ts's
75
+ * `addArchiveTemplate`, or an SBOM) use it. Production `image`/`asset`
76
+ * entries instead carry the digest their producing capability already
77
+ * computed (e.g. `docker-build`'s `executor.docker.build` digest).
78
+ */
79
+ export { contentDigest };
80
+ /**
81
+ * Compute the aggregate `manifestDigest` over a set of entries. Each entry
82
+ * contributes its `kind`, `path` and `digest`; entries are sorted by path
83
+ * (UTF-16 code units, the order `canonicalJson` sorts keys in) so entry order
84
+ * never changes the digest, only content does. The list is hashed as
85
+ * `canonicalJson`, so no path or digest can be read as a field separator.
86
+ */
87
+ export function computeManifestDigest(contents) {
88
+ const sorted = contents
89
+ .map((e) => ({ kind: e.kind, path: e.path, digest: e.digest }))
90
+ .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
91
+ return contentDigest(canonicalJson(sorted));
92
+ }
93
+ /** Start a new, empty manifest for `component`. Entries are added with `addArchiveEntry`. */
94
+ export function createBuildArchiveManifest(component, opts) {
95
+ const createdAt = (opts?.now ?? (() => new Date()))().toISOString();
96
+ return { version: 1, component, createdAt, contents: [], manifestDigest: computeManifestDigest([]) };
97
+ }
98
+ /**
99
+ * Add (or replace, by `path`) one entry and return a new manifest with
100
+ * `manifestDigest` recomputed. Pure/immutable so callers (and tests) can hold
101
+ * onto a manifest snapshot before/after a step without aliasing surprises.
102
+ *
103
+ * Assigns a kind-appropriate default `reproducibility` (#614,
104
+ * `defaultReproducibility`) when the caller omits one — `template` entries
105
+ * default to `deterministic-synthesis`, `image`/`asset` entries default to
106
+ * `best-effort`, and `sbom` entries get none. An explicit `entry.reproducibility`
107
+ * (e.g. a future reproducible-build-attested image) always wins over the
108
+ * default. `reproducibility`/`provenance` are never part of
109
+ * `computeManifestDigest`'s input — they describe the artifact, they are not
110
+ * content the artifact's identity depends on, so recording/correcting them
111
+ * later never perturbs `manifestDigest`.
112
+ */
113
+ export function addArchiveEntry(manifest, entry) {
114
+ const reproducibility = entry.reproducibility ??
115
+ (entry.kind === "image" || entry.kind === "template" || entry.kind === "asset" || entry.kind === "sbom"
116
+ ? defaultReproducibility(entry.kind)
117
+ : undefined);
118
+ const resolved = {
119
+ mediaType: DEFAULT_MEDIA_TYPES[entry.kind],
120
+ ...entry,
121
+ ...(reproducibility ? { reproducibility } : {}),
122
+ };
123
+ const contents = [...manifest.contents.filter((e) => e.path !== resolved.path), resolved];
124
+ return { ...manifest, contents, manifestDigest: computeManifestDigest(contents) };
125
+ }
126
+ /** Look up one entry by archive-relative path (the same path form `cfn-deploy`'s `archive:<path>` and `publish-image`'s `from` use). */
127
+ export function findArchiveEntry(manifest, path) {
128
+ return manifest.contents.find((e) => e.path === path);
129
+ }
130
+ /**
131
+ * Strip the `archive:` prefix chant's step wiring uses
132
+ * (e.g. `cfn-deploy`'s `template: "archive:search.template.json"`) down to
133
+ * the manifest-relative path. Returns the input unchanged when it carries no
134
+ * such prefix (a plain filesystem path outside the archive).
135
+ */
136
+ export function archiveRelativePath(ref) {
137
+ return ref.startsWith("archive:") ? ref.slice("archive:".length) : ref;
138
+ }
139
+ /** All `image`-kind entries in a manifest — what a publish backend has to choose from when `from` is ambiguous/omitted. */
140
+ export function imageEntries(manifest) {
141
+ return manifest.contents.filter((e) => e.kind === "image");
142
+ }
143
+ /** All `sbom`-kind entries in a manifest, regardless of which artifact they describe (#606). */
144
+ export function sbomEntries(manifest) {
145
+ return manifest.contents.filter((e) => e.kind === "sbom");
146
+ }
147
+ /**
148
+ * Find the archive-carried SBOM entry attached to a given artifact digest
149
+ * (an `image`/`asset` entry's `digest` elsewhere in the same manifest). This
150
+ * is the archive-native lookup ../../lifecycle/build-ledger.ts's
151
+ * `buildLedgerEntries` uses to surface "SBOM by digest" without any registry
152
+ * or `oras`/network access — the archive is the universal home for the SBOM
153
+ * regardless of artifact type (#606).
154
+ */
155
+ export function findSbomForSubject(manifest, subjectDigest) {
156
+ return manifest.contents.find((e) => e.kind === "sbom" && e.subjectDigest === subjectDigest);
157
+ }
158
+ /**
159
+ * Find the archive-carried **config-BOM** entry (`bomKind: "config"`)
160
+ * attached to a given template digest — the config-BOM analogue of
161
+ * `findSbomForSubject` (#613). A `template` entry's digest is computed the
162
+ * same way an `image`/`asset` entry's is (`contentDigest` over its bytes,
163
+ * see `addArchiveTemplate` in ./build.ts), so config-only/infra components
164
+ * with no software artifact still resolve a BOM by digest through the same
165
+ * lookup shape as every other artifact kind.
166
+ */
167
+ export function findConfigBomForSubject(manifest, subjectDigest) {
168
+ return manifest.contents.find((e) => e.kind === "sbom" && e.bomKind === "config" && e.subjectDigest === subjectDigest);
169
+ }
170
+ /** All `template`-kind entries in a manifest — every synthesized IaC document the archive carries, each a first-class artifact with its own content digest (#613). */
171
+ export function templateEntries(manifest) {
172
+ return manifest.contents.filter((e) => e.kind === "template");
173
+ }
174
+ /** All `asset`-kind entries in a manifest (non-image published artifacts — a jar, a zip). */
175
+ export function assetEntries(manifest) {
176
+ return manifest.contents.filter((e) => e.kind === "asset");
177
+ }
178
+ /**
179
+ * Every artifact entry in a manifest — `image`, `template`, and `asset`
180
+ * kinds, excluding `sbom` entries (which describe an artifact rather than
181
+ * being one) — the set #614's per-artifact reproducibility surface iterates
182
+ * over. Order is manifest insertion order; callers that need a stable order
183
+ * for display/JSON output sort by `path` themselves (mirroring
184
+ * `computeManifestDigest`'s own path-sort convention).
185
+ */
186
+ export function artifactEntries(manifest) {
187
+ return manifest.contents.filter((e) => e.kind !== "sbom");
188
+ }
@@ -0,0 +1,142 @@
1
+ /**
2
+ * build family — source -> BuildArchive, keyed by artifact type.
3
+ * Fully cloud-agnostic (see docs/components/cloud-boundary). `docker-build` is
4
+ * a real implementation (#557, epic #551) built over the injectable
5
+ * `CloudExecutor` (./cloud-executor.ts) so tests never shell out to a real
6
+ * `docker` daemon. `zip-package` (via `zip`) and `jvm-build` (via `mvn`/the
7
+ * gradle wrapper) are real, run through the injectable `ProcessRunner`.
8
+ *
9
+ * `docker-build` also assembles the component's `BuildArchiveManifest`
10
+ * (#564, epic #551 "4. Build archive + deferred publish" — see
11
+ * ./build-archive.ts): every build appends an `image`-kind entry recording
12
+ * the archive path and digest it just produced, so the archive is
13
+ * self-describing (content-addressed, with a manifest of contents) rather
14
+ * than a bare tarball. `addArchiveTemplate` lets a caller fold synthesized
15
+ * deploy templates (e.g. CloudFormation JSON, already written into the
16
+ * archive by chant's existing synthesis step) into the same manifest, so one
17
+ * document enumerates every content kind the archive holds.
18
+ *
19
+ * Per #614, both entry points accept an optional `sourceRef` (a git sha, or
20
+ * `"<sha>:<path>"` for a monorepo subpath) that becomes the entry's
21
+ * `provenance` link. `image`/`template` entries otherwise default to their
22
+ * kind-appropriate `reproducibility` basis via `addArchiveEntry` — see
23
+ * ./reproducibility.ts.
24
+ */
25
+ import { readFileSync } from "node:fs";
26
+ import { createHash } from "node:crypto";
27
+ import { defaultCloudExecutor } from "./cloud-executor.js";
28
+ import { defaultProcessRunner, q } from "./process-runner.js";
29
+ import { addArchiveEntry, contentDigest, createBuildArchiveManifest, } from "./build-archive.js";
30
+ /**
31
+ * Build a container image from a Dockerfile into the build archive: `docker
32
+ * build`, tagged with a build-local reference derived from `into`, then
33
+ * `docker save`d to the archive path (OCI layout, per `docker save`'s output
34
+ * format). Records the produced tarball as an `image` entry in the archive's
35
+ * manifest (extending `input.manifest` when the caller threads one through,
36
+ * so a component with more than one image build accumulates a single
37
+ * manifest for the whole archive). No rollback — a local build produces no
38
+ * remote/mutable state to compensate; the archive path is simply not consumed
39
+ * further if a later step fails.
40
+ */
41
+ export function createDockerBuildCapability(executor = defaultCloudExecutor()) {
42
+ return {
43
+ kind: "docker-build",
44
+ async run(ctx, input) {
45
+ const tag = `chant-build/${input.into.replace(/[^a-zA-Z0-9_.-]/g, "-")}:latest`;
46
+ const { digest } = await executor.docker.build({
47
+ context: input.context,
48
+ dockerfile: input.dockerfile,
49
+ buildArgs: input.buildArgs,
50
+ target: input.target,
51
+ tag,
52
+ });
53
+ await executor.docker.save({ image: tag, outFile: input.into });
54
+ const base = input.manifest ?? createBuildArchiveManifest(ctx.component);
55
+ const provenance = input.sourceRef
56
+ ? { sourceRef: input.sourceRef, artifactDigest: digest }
57
+ : undefined;
58
+ const manifest = addArchiveEntry(base, {
59
+ kind: "image",
60
+ path: input.into,
61
+ digest,
62
+ ...(provenance ? { provenance } : {}),
63
+ });
64
+ return { archivePath: input.into, digest, manifest };
65
+ },
66
+ };
67
+ }
68
+ /** Default `docker-build` capability, backed by the real `CloudExecutor`. */
69
+ export const dockerBuildCapability = createDockerBuildCapability();
70
+ /**
71
+ * Fold one synthesized deploy template (e.g. the CloudFormation JSON chant's
72
+ * existing synthesis already produces) into a build archive's manifest as a
73
+ * `template`-kind entry, alongside the image(s) `docker-build` recorded. Not
74
+ * a registered capability — template synthesis is chant's existing `build`
75
+ * pipeline (see ../../build.ts), not a new deploy-time verb — so this is a
76
+ * plain function a build orchestration step calls directly to keep one
77
+ * manifest across every content kind the archive holds (image + templates).
78
+ * Exported alongside the build-family capabilities since it is the other
79
+ * half of "what goes in the manifest" `docker-build` documents above.
80
+ */
81
+ export function addArchiveTemplate(input) {
82
+ const digest = contentDigest(input.content);
83
+ const base = input.manifest ?? createBuildArchiveManifest("unknown");
84
+ const provenance = input.sourceRef
85
+ ? { sourceRef: input.sourceRef, artifactDigest: digest }
86
+ : undefined;
87
+ const manifest = addArchiveEntry(base, {
88
+ kind: "template",
89
+ path: input.path,
90
+ digest,
91
+ ...(provenance ? { provenance } : {}),
92
+ });
93
+ return { digest, manifest };
94
+ }
95
+ /**
96
+ * Package a directory into a zip artifact (e.g. a Lambda deployment package)
97
+ * inside the build archive, via the `zip` CLI through the injectable
98
+ * `ProcessRunner`. Removes any prior `into` first so the archive is rebuilt from
99
+ * scratch (not appended to), then returns its content digest for
100
+ * promote-by-digest referencing.
101
+ */
102
+ export function createZipPackageCapability(processRunner = defaultProcessRunner()) {
103
+ return {
104
+ kind: "zip-package",
105
+ async run(_ctx, input) {
106
+ const excludes = (input.exclude ?? []).map((p) => `-x ${q(p)}`).join(" ");
107
+ // `-X` drops extra file attributes; `rm -f` first so a re-run rebuilds rather than updates in place.
108
+ await processRunner.run(`rm -f ${q(input.into)} && zip -r -X ${q(input.into)} ${q(input.source)}${excludes ? ` ${excludes}` : ""}`);
109
+ const digest = `sha256:${createHash("sha256").update(readFileSync(input.into)).digest("hex")}`;
110
+ return { archivePath: input.into, digest };
111
+ },
112
+ };
113
+ }
114
+ /** Default `zip-package` capability, backed by the real process runner. */
115
+ export const zipPackageCapability = createZipPackageCapability();
116
+ /**
117
+ * Compile and package a JVM project (Maven or Gradle) into a jar in the build
118
+ * archive, via the build tool through the injectable `ProcessRunner`. Runs the
119
+ * package goal, copies the produced jar (skipping `-sources`/`-javadoc`
120
+ * classifiers) to `into`, and returns its content digest.
121
+ */
122
+ export function createJvmBuildCapability(processRunner = defaultProcessRunner()) {
123
+ return {
124
+ kind: "jvm-build",
125
+ async run(_ctx, input) {
126
+ if (input.tool === "gradle") {
127
+ const tasks = (input.goals ?? ["build"]).join(" ");
128
+ await processRunner.run(`./gradlew -q ${tasks}`, { cwd: input.path });
129
+ await processRunner.run(`cp "$(ls ${q(input.path)}/build/libs/*.jar | head -1)" ${q(input.into)}`);
130
+ }
131
+ else {
132
+ const goals = (input.goals ?? ["package"]).join(" ");
133
+ await processRunner.run(`mvn -q -B -f ${q(`${input.path}/pom.xml`)} ${goals}`);
134
+ await processRunner.run(`cp "$(ls ${q(`${input.path}/target`)}/*.jar | grep -Ev '(-sources|-javadoc)\\.jar$' | head -1)" ${q(input.into)}`);
135
+ }
136
+ const digest = `sha256:${createHash("sha256").update(readFileSync(input.into)).digest("hex")}`;
137
+ return { archivePath: input.into, digest };
138
+ },
139
+ };
140
+ }
141
+ /** Default `jvm-build` capability, backed by the real process runner. */
142
+ export const jvmBuildCapability = createJvmBuildCapability();