@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,119 @@
1
+ /**
2
+ * SBOM document type + the injectable, artifact-type-keyed `SbomGenerator`
3
+ * boundary (#606, epic #551 "Build & deploy observability" follow-up to
4
+ * #564/#568). Mirrors ./cloud-executor.ts's `CloudExecutor` pattern: a real
5
+ * backend may shell out to `syft`/`docker buildx --sbom`/`cyclonedx-maven`,
6
+ * but no test and no default import ever does — every backend here is
7
+ * injected, and tests construct a `MockSbomGenerator`
8
+ * (./__tests__/mock-sbom-generator.ts) instead.
9
+ *
10
+ * **Format-agnostic by construction.** An SBOM is stored as an opaque typed
11
+ * doc: `{ format, mediaType, bytes }`. Nothing downstream (the build-archive
12
+ * manifest, the build ledger, `chant components status`) branches on
13
+ * `format` — every consumer keys off `mediaType`, the same convention
14
+ * `BuildArchiveEntry.mediaType` already uses for image/template/asset
15
+ * entries (./build-archive.ts). SPDX (`application/spdx+json`) and
16
+ * CycloneDX (`application/vnd.cyclonedx+json`) are both first-class; neither
17
+ * is hardcoded as *the* format anywhere in this module or its consumers.
18
+ *
19
+ * **Default format:** SPDX, matching the epic's refinement from the
20
+ * devops-cloud.news SBOM article — BuildKit natively emits SPDX attestations
21
+ * for images, so the image/BuildKit backend defaults to SPDX; the `syft`
22
+ * backend can emit either and defaults to SPDX here too, for one predictable
23
+ * default across artifact types. Override via `chant.config.ts`'s
24
+ * `sbom.format` (see ../../config.ts) and/or a component's own `build.sbom`
25
+ * (see ../component.ts's `BuildSpec`). Documented in
26
+ * docs/components/build-archive.mdx.
27
+ *
28
+ * **Artifact-type-keyed generation.** "Generate an SBOM" has a different
29
+ * real implementation per artifact type — an image asks BuildKit or scans
30
+ * the built image with `syft`; a JAR is scanned with `syft` or
31
+ * `cyclonedx-maven`; a zip/Lambda package is scanned with `syft`; a bare
32
+ * source directory is scanned with `syft`/`cdxgen`. `SbomGenerator` is one
33
+ * interface with one method per artifact type — analogous to
34
+ * `PublishImageBackend` being one interface satisfied by two backends
35
+ * (./publish.ts) — so the *capability* (./sbom.ts) stays artifact-type
36
+ * agnostic and simply calls the method matching the archive entry it was
37
+ * handed.
38
+ */
39
+ // `lockfileSbomGenerator` (#630's hermetic default, below) lives in
40
+ // ./lockfile-sbom-generator.ts, which itself imports `DEFAULT_SBOM_FORMAT`/
41
+ // `SbomGeneratorNotImplementedError` from *this* module — a deliberate
42
+ // circular import. Safe here because the only use of `lockfileSbomGenerator`
43
+ // in this file is inside `defaultSbomGenerator()`'s function body (evaluated
44
+ // lazily, on first call), never at this module's own top-level/import time,
45
+ // so it doesn't matter which module's evaluation finishes first.
46
+ import { lockfileSbomGenerator } from "./lockfile-sbom-generator.js";
47
+ /** Canonical media type per format, mirroring `BuildArchiveEntry.mediaType`'s convention (./build-archive.ts). */
48
+ export const SBOM_MEDIA_TYPES = {
49
+ spdx: "application/spdx+json",
50
+ cyclonedx: "application/vnd.cyclonedx+json",
51
+ };
52
+ /** Project-wide default SBOM format when neither `chant.config.ts`'s `sbom.format` nor a component's `build.sbom.format` says otherwise. Documented in docs/components/build-archive.mdx. */
53
+ export const DEFAULT_SBOM_FORMAT = "spdx";
54
+ /**
55
+ * Thrown by `NotImplementedSbomGenerator` — the "no real backend wired yet"
56
+ * signal, matching `CapabilityNotImplementedError`'s role for verb stubs
57
+ * (../capability.ts). Kept distinct from a generic `Error` so callers (and
58
+ * tests) can assert on it specifically.
59
+ */
60
+ export class SbomGeneratorNotImplementedError extends Error {
61
+ constructor(method) {
62
+ super(`SbomGenerator.${method} has no real implementation configured — inject a real generator ` +
63
+ `(shelling out to syft/buildx/cyclonedx-maven/cdxgen) or use a mock in tests`);
64
+ this.method = method;
65
+ this.name = "SbomGeneratorNotImplementedError";
66
+ }
67
+ }
68
+ /**
69
+ * All-throwing `SbomGenerator`: every method throws
70
+ * `SbomGeneratorNotImplementedError`. No longer the process-wide default (see
71
+ * `defaultSbomGenerator` below, #630) — kept exported for callers that
72
+ * deliberately want the loud, no-backend-at-all behavior (e.g. a test
73
+ * asserting on the thrown error itself, or a caller that wants to force
74
+ * "nothing is wired" rather than silently getting the hermetic backend).
75
+ */
76
+ export const notImplementedSbomGenerator = {
77
+ async forImage() {
78
+ throw new SbomGeneratorNotImplementedError("forImage");
79
+ },
80
+ async forJar() {
81
+ throw new SbomGeneratorNotImplementedError("forJar");
82
+ },
83
+ async forZip() {
84
+ throw new SbomGeneratorNotImplementedError("forZip");
85
+ },
86
+ async forDir() {
87
+ throw new SbomGeneratorNotImplementedError("forDir");
88
+ },
89
+ };
90
+ /** Lazily-constructed process-wide default, mirroring ./cloud-executor.ts's `defaultCloudExecutor`. */
91
+ let defaultGenerator;
92
+ /**
93
+ * The default `SbomGenerator` the `generate-sbom` capability falls back to
94
+ * when none is supplied.
95
+ *
96
+ * **Hermetic by default (#630).** This is `./lockfile-sbom-generator.ts`'s
97
+ * `lockfileSbomGenerator` — `forDir`/`forZip`/`forJar` parse a
98
+ * `package-lock.json`/`pom.xml` already on disk (no `syft`, no network, no
99
+ * external tool) and emit a real SPDX/CycloneDX document. That means a
100
+ * newcomer composing `generate-sbom` over a source directory, a zip/Lambda
101
+ * package, or a JAR gets a working SBOM the moment they `chant run
102
+ * --components`, with nothing to install first — the whole point of #630's
103
+ * "runnable proof" bar. `forImage` still throws
104
+ * `SbomGeneratorNotImplementedError`: no hermetic backend can see an image's
105
+ * base layers, so an image SBOM still needs the real deep-scan tool backend
106
+ * (`syft`/`docker buildx --sbom`/`cyclonedx-maven`/`cdxgen`, #610) — a
107
+ * documented, deliberate gap, not an oversight. This was previously
108
+ * `notImplementedSbomGenerator` (every method throwing); switching the
109
+ * default is intentional per #630 — the prior "loud failure by default"
110
+ * traded newcomer runnability for a default nobody exercised without opting
111
+ * in, which #613 already built a hermetic backend to fix but never wired up.
112
+ * A project that truly wants the old all-throwing behavior can construct
113
+ * `createGenerateSbomCapability(notImplementedSbomGenerator)` explicitly.
114
+ */
115
+ export function defaultSbomGenerator() {
116
+ if (!defaultGenerator)
117
+ defaultGenerator = lockfileSbomGenerator;
118
+ return defaultGenerator;
119
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `generate-sbom` capability (#606, epic #551 follow-up to #564's build
3
+ * archive / #568's build ledger — closes the "produce" side #568 explicitly
4
+ * deferred).
5
+ *
6
+ * One capability, artifact-type-keyed via the injectable `SbomGenerator`
7
+ * (./sbom-generator.ts — mirrors ./cloud-executor.ts's `CloudExecutor`
8
+ * pattern), so a build-producing component of *any* artifact type — image,
9
+ * JAR, zip/Lambda package, or a bare source directory for a config-only
10
+ * producer — generates its SBOM through the same verb. Never docker-only:
11
+ * dispatch is on `input.artifactType`, not on which build capability
12
+ * produced the artifact.
13
+ *
14
+ * Writes the result into the build-archive manifest as an `sbom`-kind entry
15
+ * (../verbs/build-archive.ts), content-addressed and linked to its subject
16
+ * artifact's digest via `subjectDigest` — the **universal home** for the
17
+ * SBOM regardless of artifact type or registry availability. Registering the
18
+ * SBOM as an OCI referrer for image artifacts at publish time is a separate,
19
+ * later concern (the publish step/registry tooling's job, see
20
+ * ../../lifecycle/build-ledger.ts's `ReferrerLookup` for the consume side);
21
+ * this capability only ever writes the archive-carried copy, so it works
22
+ * unconditionally — including the registry-less `load-image-on-host` path.
23
+ *
24
+ * Config-only / infra components have no built artifact and simply never
25
+ * compose this step into their `deploy`/`build` phase — "skips cleanly" is
26
+ * structural (no step to run), not a special case this module needs to
27
+ * detect. Opt-out is the same: a component that wants no SBOM omits the
28
+ * `generate-sbom` step from its composition.
29
+ */
30
+ import { addArchiveEntry, archiveRelativePath, contentDigest, createBuildArchiveManifest, } from "./build-archive.js";
31
+ import { defaultSbomGenerator, DEFAULT_SBOM_FORMAT, } from "./sbom-generator.js";
32
+ /** Default archive path for a generated SBOM when `into` is omitted: `<artifact path>.sbom.json`. */
33
+ function defaultSbomPath(artifactPath) {
34
+ return `${archiveRelativePath(artifactPath)}.sbom.json`;
35
+ }
36
+ /**
37
+ * Dispatch one `SbomGenerator` call by `artifactType` — the only place this
38
+ * capability branches on artifact type, matching how `selectPublishBackend`
39
+ * (./publish.ts) is the only place the publish family branches on backend
40
+ * kind. Never a component/cloud name, always an artifact shape.
41
+ */
42
+ async function generate(generator, input, artifactPath) {
43
+ switch (input.artifactType) {
44
+ case "image":
45
+ return generator.forImage({ imagePath: artifactPath, digest: input.digest ?? "", format: input.format });
46
+ case "jar":
47
+ return generator.forJar({ jarPath: artifactPath, digest: input.digest ?? "", format: input.format });
48
+ case "zip":
49
+ return generator.forZip({ zipPath: artifactPath, digest: input.digest ?? "", format: input.format });
50
+ case "dir":
51
+ return generator.forDir({ path: artifactPath, format: input.format });
52
+ }
53
+ }
54
+ /**
55
+ * Generate an SBOM for a build-producing component's artifact (image, JAR,
56
+ * zip, or source directory) via the artifact-type-keyed `SbomGenerator`, and
57
+ * fold the result into the build-archive manifest as an `sbom`-kind entry
58
+ * linked to the subject artifact's digest. Format defaults to
59
+ * `DEFAULT_SBOM_FORMAT` (SPDX) when neither `input.format` nor the injected
60
+ * generator overrides it — see ./sbom-generator.ts's module doc for the
61
+ * full default-resolution story. `chant.config.ts`'s `sbom.format` (see
62
+ * ../../config.ts's `ChantConfig.sbom` and `resolveSbomFormat`) is resolved
63
+ * by the caller/orchestrator into `input.format` before this capability
64
+ * runs, the same way env config is resolved before any other capability's
65
+ * `run` (this module never imports ../../config.ts directly, matching how
66
+ * no other verb module does either).
67
+ *
68
+ * No rollback: an already-generated SBOM sitting in the archive (or, later,
69
+ * projected as a registry referrer) is immutable, content-addressed
70
+ * evidence — nothing to compensate, the same opt-out `docker-build` and
71
+ * `publish-image` already take for their own no-mutable-remote-state reason.
72
+ */
73
+ export function createGenerateSbomCapability(generator = defaultSbomGenerator()) {
74
+ return {
75
+ kind: "generate-sbom",
76
+ async run(ctx, input) {
77
+ const artifactPath = archiveRelativePath(input.path);
78
+ const format = input.format ?? DEFAULT_SBOM_FORMAT;
79
+ const sbom = await generate(generator, { ...input, format }, artifactPath);
80
+ const into = input.into ?? defaultSbomPath(input.path);
81
+ const digest = contentDigest(sbom.bytes);
82
+ const base = input.manifest ?? createBuildArchiveManifest(ctx.component);
83
+ const manifest = addArchiveEntry(base, {
84
+ kind: "sbom",
85
+ path: into,
86
+ digest,
87
+ mediaType: sbom.mediaType,
88
+ subjectDigest: input.digest,
89
+ packageCount: sbom.packageCount,
90
+ generator: sbom.generator,
91
+ });
92
+ return { sbom, archivePath: into, digest, manifest };
93
+ },
94
+ };
95
+ }
96
+ /** Default `generate-sbom` capability, backed by the process-wide default `SbomGenerator` — the hermetic lockfile backend (#630), so `dir`/`zip`/`jar` work with no tool installed; only `forImage` throws until `toolSbomGenerator` is injected. See ./sbom-generator.ts's `defaultSbomGenerator`. */
97
+ export const generateSbomCapability = createGenerateSbomCapability();
@@ -0,0 +1,32 @@
1
+ /**
2
+ * escape hatch family — `shell`. Typed, but flagged: a raw shell step run by
3
+ * exactly one component is the "capability-per-component" smell the model
4
+ * exists to avoid (see docs/components/capabilities.mdx#the-discipline).
5
+ * `reason` is required so lint (COMP006) can flag an escape hatch used without
6
+ * a stated justification.
7
+ */
8
+ import { defaultProcessRunner, q } from "./process-runner.js";
9
+ import { releaseEnvironment } from "../../telemetry-attribution.js";
10
+ /**
11
+ * Run an arbitrary shell command through the injectable {@link ProcessRunner}.
12
+ * The escape hatch — typed, lint-flagged, and requires a `reason`. A non-zero
13
+ * exit rejects (with the command's own stderr), failing the step like any other
14
+ * capability error, so `onFailure`/rollback fires.
15
+ */
16
+ export function createShellCapability(processRunner = defaultProcessRunner()) {
17
+ return {
18
+ kind: "shell",
19
+ async run(ctx, input) {
20
+ // A release run exports its attributes (#3061, ws-081), so a `docker compose up` here fills the
21
+ // Compose file's `${CHANT_RELEASE_ATTRIBUTES:-}`. A value the step sets itself wins.
22
+ const env = { ...releaseEnvironment(ctx.release), ...(input.env ?? {}) };
23
+ const envPrefix = Object.keys(env).length > 0
24
+ ? `env ${Object.entries(env).map(([k, v]) => `${k}=${q(v)}`).join(" ")} `
25
+ : "";
26
+ const { stdout } = await processRunner.run(`${envPrefix}${input.cmd}`, { cwd: input.cwd });
27
+ return { stdout, exitCode: 0 };
28
+ },
29
+ };
30
+ }
31
+ /** Default `shell` capability, backed by the real process runner. */
32
+ export const shellCapability = createShellCapability();
@@ -0,0 +1,221 @@
1
+ /**
2
+ * `sign` capability — keyless cosign signing + SLSA provenance attestation
3
+ * (#622, epic #551 follow-up to #610's referrer-attach path and #614's
4
+ * reproducibility/provenance material). The companion gate is
5
+ * `./verify.ts`'s `verify` capability.
6
+ *
7
+ * **Beginner footgun #1 neutralized: sign the digest, never a tag.** `input`
8
+ * requires an already-resolved `sha256:` image reference (typically wired
9
+ * from a prior publish step, `"@Publish.uri"`, which is itself
10
+ * `repo@sha256:...` — see ./publish.ts) — never a bare tag. A tag is mutable;
11
+ * signing one says nothing about which bytes were actually signed by the
12
+ * time someone pulls it. `assertDigestRef` below throws before ever shelling
13
+ * out if a caller passes a tag-only reference.
14
+ *
15
+ * **Beginner footgun #2 neutralized: keyless by default.** Sign via cosign's
16
+ * keyless flow (a short-lived Fulcio cert bound to an OIDC identity, logged
17
+ * to the public Rekor transparency log) — `cosign sign --yes <ref>` with no
18
+ * `--key`. There is no private key file for a first-timer to generate, lose,
19
+ * leak, or forget to rotate. Key-based signing (`input.key`) is an opt-in
20
+ * override for teams with an existing KMS/file-based key policy, never the
21
+ * default — see `buildSignArgs`/`buildAttestArgs` below: `--key` is added
22
+ * only when `input.key` is explicitly supplied, and it is the *only* thing
23
+ * that changes about the invocation (still by digest, still attached the
24
+ * same way).
25
+ *
26
+ * **SLSA provenance.** `attestProvenance` builds an in-toto
27
+ * `https://slsa.dev/provenance/v1` statement from the same
28
+ * `ProvenanceLink`/`ArtifactReproducibility` material #614's
29
+ * ./reproducibility.ts already records per build-archive entry (source ref,
30
+ * artifact digest) plus a builder id and timestamp, then signs+attaches it
31
+ * via `cosign attest` (keyless by the same default). This reuses #614's
32
+ * provenance model rather than inventing a second one — the in-toto
33
+ * statement's `predicate.buildDefinition.resolvedDependencies` /
34
+ * `.internalParameters` are populated from the same source-ref/digest link a
35
+ * build archive entry already carries.
36
+ *
37
+ * Both `sign` and `attestProvenance` shell out to `cosign` through the
38
+ * injectable `ProcessRunner` (./process-runner.ts) — mirroring
39
+ * ./tool-sbom-generator.ts and ./publish.ts's referrer-attach step exactly:
40
+ * `requireTool` throws `ToolNotAvailableError` with an actionable message if
41
+ * `cosign` is absent, and no test here ever spawns a real process or talks
42
+ * to Rekor/Fulcio.
43
+ *
44
+ * **#1943 extension (`run-agent` interop).** `BuildProvenanceStatementInput`
45
+ * gained two optional merge fields, `externalParameters`/`internalParameters`
46
+ * — additive only, every existing call site's statement is byte-identical
47
+ * without them. `run-agent` (./run-agent.ts's `buildRunAgentProvenanceStatement`)
48
+ * is the first caller to use them, plus `buildType` (already overridable,
49
+ * unchanged here) set to a `run-agent`-specific recipe URI. `predicateType`
50
+ * stays `"https://slsa.dev/provenance/v1"` for every caller, `run-agent`
51
+ * included — see ./run-agent.ts's own doc comment ("Attestation interop")
52
+ * for why a turn is attested as an SLSA-shaped provenance predicate rather
53
+ * than under a minted `run-agent`-specific `predicateType`, and why that
54
+ * decision means `sign`/`attestProvenance`/`../verbs/verify.ts` needed zero
55
+ * changes to their `cosign` invocations to attest/verify a turn.
56
+ */
57
+ import { defaultProcessRunner, q, requireTool } from "./process-runner.js";
58
+ // ── shared: digest-only reference guard ─────────────────────────────────────
59
+ /**
60
+ * Thrown when a `sign`/`attest` input's image reference has no `@sha256:...`
61
+ * digest — refusing to sign a mutable tag (beginner footgun #1) rather than
62
+ * silently signing whatever the tag happens to resolve to right now.
63
+ */
64
+ export class SignTargetNotDigestError extends Error {
65
+ constructor(ref, verb) {
66
+ super(`${verb} "${ref}": expected a digest reference ("repo@sha256:...", e.g. from a prior publish step's "@Publish.uri") — ` +
67
+ `signing a mutable tag would not pin which bytes were signed. Pass the digest-qualified reference instead.`);
68
+ this.ref = ref;
69
+ this.verb = verb;
70
+ this.name = "SignTargetNotDigestError";
71
+ }
72
+ }
73
+ /** True if `ref` carries an `@sha256:<hex>` digest — the only form `sign`/`attest` accept. */
74
+ function isDigestRef(ref) {
75
+ return /@sha256:[0-9a-f]{64}$/i.test(ref);
76
+ }
77
+ /** Throw `SignTargetNotDigestError` unless `ref` is digest-qualified. */
78
+ function assertDigestRef(ref, verb) {
79
+ if (!isDigestRef(ref))
80
+ throw new SignTargetNotDigestError(ref, verb);
81
+ }
82
+ /** Append the shared keyless/key-based signing flags to a cosign argv, mutating `args` in place. Shared by `buildSignArgs` and `buildAttestArgs` so both stay in lockstep. */
83
+ function appendSigningFlags(args, opts) {
84
+ if (opts.key) {
85
+ args.push("--key", q(opts.key.key));
86
+ return;
87
+ }
88
+ // Keyless (default): no --key at all — cosign's own keyless flow (Fulcio + Rekor).
89
+ const k = opts.keyless;
90
+ if (k?.identityToken)
91
+ args.push("--identity-token", q(k.identityToken));
92
+ if (k?.oidcIssuer)
93
+ args.push("--oidc-issuer", q(k.oidcIssuer));
94
+ if (k?.oidcClientId)
95
+ args.push("--oidc-client-id", q(k.oidcClientId));
96
+ if (k?.fulcioUrl)
97
+ args.push("--fulcio-url", q(k.fulcioUrl));
98
+ if (k?.rekorUrl)
99
+ args.push("--rekor-url", q(k.rekorUrl));
100
+ }
101
+ /** Build the `cosign sign` argv (as a shell command string) for `input` — factored out so tests can assert on the exact invocation without needing a full mock run. */
102
+ export function buildSignArgs(input) {
103
+ const args = ["cosign", "sign", "--yes"];
104
+ appendSigningFlags(args, { keyless: input.keyless, key: input.key });
105
+ for (const [k, v] of Object.entries(input.annotations ?? {})) {
106
+ args.push("-a", q(`${k}=${v}`));
107
+ }
108
+ args.push(q(input.imageRef));
109
+ return args.join(" ");
110
+ }
111
+ /**
112
+ * Sign an artifact by digest via keyless cosign (default) or an opt-in
113
+ * key-based override, and attach the signature as an OCI referrer on that
114
+ * digest — `cosign sign` itself performs the attach (cosign's signatures are
115
+ * always stored as registry referrers/the legacy tag convention; no separate
116
+ * `oras attach` step is needed the way SBOM/BOM referrer attach in
117
+ * ./publish.ts requires one, since cosign natively pushes to the registry).
118
+ * Refuses to run at all against a non-digest reference (`SignTargetNotDigestError`)
119
+ * — sign is never invoked for a tag, by construction, before any process is spawned.
120
+ *
121
+ * No rollback: an already-signed, content-addressed image's signature is
122
+ * immutable evidence sitting in the registry — nothing to compensate, the
123
+ * same opt-out `publish-image`/`generate-sbom` already take for
124
+ * no-mutable-remote-state operations.
125
+ */
126
+ export function createSignCapability(processRunner = defaultProcessRunner()) {
127
+ return {
128
+ kind: "sign",
129
+ async run(_ctx, input) {
130
+ assertDigestRef(input.imageRef, "sign");
131
+ await requireTool(processRunner, "cosign", `sign ${input.imageRef}`);
132
+ await processRunner.run(buildSignArgs(input));
133
+ return { imageRef: input.imageRef, signed: true, method: input.key ? "key" : "keyless" };
134
+ },
135
+ };
136
+ }
137
+ /** Default `sign` capability, backed by the real `ProcessRunner`. */
138
+ export const signCapability = createSignCapability();
139
+ const DEFAULT_BUILD_TYPE = "https://chant.dev/build-archive/v1";
140
+ /** Extract the bare `sha256:...` digest out of a digest-qualified reference (`repo@sha256:...`). */
141
+ function digestOf(ref) {
142
+ const match = /sha256:([0-9a-f]{64})$/i.exec(ref);
143
+ if (!match)
144
+ throw new SignTargetNotDigestError(ref, "attest");
145
+ return match[1];
146
+ }
147
+ /**
148
+ * Build an in-toto SLSA provenance statement for `input.imageRef`, reusing
149
+ * #614's `ProvenanceLink` (source ref -> artifact digest) as the statement's
150
+ * `resolvedDependencies`/`internalParameters` material — the honest subset
151
+ * chant can actually attest to (which source commit, which builder, when),
152
+ * matching ./reproducibility.ts's "honesty over convenience" stance rather
153
+ * than fabricating a stronger provenance claim than the build system backs.
154
+ */
155
+ export function buildProvenanceStatement(input) {
156
+ const digest = digestOf(input.imageRef);
157
+ return {
158
+ _type: "https://in-toto.io/Statement/v1",
159
+ predicateType: "https://slsa.dev/provenance/v1",
160
+ subject: [{ name: input.imageRef, digest: { sha256: digest } }],
161
+ predicate: {
162
+ buildDefinition: {
163
+ buildType: input.buildType ?? DEFAULT_BUILD_TYPE,
164
+ // Reserved keys spread LAST so a caller-supplied key can never clobber
165
+ // them into a signed statement that disagrees with resolvedDependencies.
166
+ externalParameters: { ...input.externalParameters, sourceRef: input.provenance.sourceRef },
167
+ internalParameters: { ...input.internalParameters, artifactDigest: input.provenance.artifactDigest },
168
+ resolvedDependencies: [{ uri: input.provenance.sourceRef, digest: { sha256: digest } }],
169
+ },
170
+ runDetails: {
171
+ builder: { id: input.builderId },
172
+ metadata: {
173
+ ...(input.invocationId ? { invocationId: input.invocationId } : {}),
174
+ finishedOn: input.finishedOn ?? new Date().toISOString(),
175
+ },
176
+ },
177
+ },
178
+ };
179
+ }
180
+ /**
181
+ * Build the `cosign attest` argv (as a shell command string) for a
182
+ * predicate-type/payload pair. Factored out (like `buildSignArgs`) so tests
183
+ * can assert on the exact invocation. `--predicate` reads from a scratch
184
+ * file path (`cosign attest` does not accept the payload on stdin any more
185
+ * reliably than `oras attach` does — see ./publish.ts's `attachOneReferrer`
186
+ * for the same scratch-file convention) — the caller passes the path already
187
+ * written.
188
+ */
189
+ export function buildAttestArgs(input, predicatePath) {
190
+ const args = ["cosign", "attest", "--yes", "--type", "slsaprovenance1", "--predicate", q(predicatePath)];
191
+ appendSigningFlags(args, { keyless: input.keyless, key: input.key });
192
+ args.push(q(input.imageRef));
193
+ return args.join(" ");
194
+ }
195
+ /**
196
+ * Build an in-toto SLSA provenance statement for a digest-qualified artifact
197
+ * (reusing #614's `ProvenanceLink` material) and sign+attach it via keyless
198
+ * `cosign attest` (default) or an opt-in key-based override — attached as a
199
+ * referrer alongside the signature (`sign`) and SBOM (`generate-sbom`) on
200
+ * the same digest. Refuses a non-digest `imageRef` the same way `sign` does.
201
+ *
202
+ * No rollback: same reasoning as `sign` — an attached, content-addressed
203
+ * attestation is immutable evidence, nothing to compensate.
204
+ */
205
+ export function createAttestProvenanceCapability(processRunner = defaultProcessRunner()) {
206
+ return {
207
+ kind: "attest-provenance",
208
+ async run(_ctx, input) {
209
+ assertDigestRef(input.imageRef, "attest");
210
+ await requireTool(processRunner, "cosign", `attest SLSA provenance for ${input.imageRef}`);
211
+ const statement = buildProvenanceStatement(input);
212
+ const scratchFile = `/tmp/chant-provenance-attest/${digestOf(input.imageRef)}-${Date.now()}.json`;
213
+ await processRunner.run(`mkdir -p ${q("/tmp/chant-provenance-attest")}`);
214
+ await processRunner.run(`printf '%s' ${q(JSON.stringify(statement))} > ${q(scratchFile)}`);
215
+ await processRunner.run(buildAttestArgs(input, scratchFile));
216
+ return { imageRef: input.imageRef, statement, attested: true, method: input.key ? "key" : "keyless" };
217
+ },
218
+ };
219
+ }
220
+ /** Default `attest-provenance` capability, backed by the real `ProcessRunner`. */
221
+ export const attestProvenanceCapability = createAttestProvenanceCapability();
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared helper for building typed capability stubs.
3
+ *
4
+ * A stub is fully typed (`kind`, `In`, `Out`) so compositions can wire
5
+ * output -> input and lint can check the graph, but `run`/`rollback` throw
6
+ * `CapabilityNotImplementedError` — no cloud calls, no side effects. Cloud
7
+ * implementations land in a later phase (epic #551).
8
+ */
9
+ import { CapabilityNotImplementedError } from "../capability.js";
10
+ /**
11
+ * Build a stub `Capability<In, Out>` for `kind`. `supportsRollback` also
12
+ * attaches a `rollback` that throws the same error, so compositions can
13
+ * already reference `rollback` in typed code ahead of the real implementation.
14
+ */
15
+ export function stubCapability(kind, opts) {
16
+ const capability = {
17
+ kind,
18
+ async run() {
19
+ throw new CapabilityNotImplementedError(kind);
20
+ },
21
+ };
22
+ if (opts?.rollback) {
23
+ capability.rollback = async () => {
24
+ throw new CapabilityNotImplementedError(kind);
25
+ };
26
+ }
27
+ return capability;
28
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Real, deep-scan `SbomGenerator` backend (#610, epic #551's "deep external
3
+ * tool" half of the SBOM story — the counterpart to ./lockfile-sbom-generator.ts's
4
+ * hermetic, zero-dependency default from #613). Shells out to whichever
5
+ * external scanner fits the artifact type, through the injectable
6
+ * `ProcessRunner` (./process-runner.ts, itself mirroring
7
+ * ./cloud-executor.ts's `CloudExecutor` pattern):
8
+ *
9
+ * - `image` -> `docker buildx build --sbom=true` (BuildKit's native SPDX
10
+ * attestation) when a Dockerfile build context is available, otherwise a
11
+ * `syft <tarball>` scan of the already-built OCI-layout tarball;
12
+ * - `jar` -> `syft`, or `cyclonedx-maven` when the jar's project directory
13
+ * carries a `pom.xml` (a more Maven-native scan than a bytecode-level jar
14
+ * scan);
15
+ * - `zip` -> `syft <zip>`;
16
+ * - `dir` -> `syft <dir>`, falling back to `cdxgen <dir>` when `syft` is
17
+ * unavailable (`cdxgen`'s "wnat's on disk" mode covers ecosystems syft
18
+ * might not have detected).
19
+ *
20
+ * Every method resolves the specific tool it needs, checks availability via
21
+ * `ProcessRunner.available` first, and throws `ToolNotAvailableError`
22
+ * (./process-runner.ts) with an actionable install hint if the tool is
23
+ * missing — never a silent empty SBOM. Tests inject `MockProcessRunner`
24
+ * (./__tests__/mock-process-runner.ts) and assert on the constructed command
25
+ * line + parsed output; nothing here ever spawns a real process.
26
+ *
27
+ * This backend is **not** the process-wide default (see
28
+ * ./sbom-generator.ts's `notImplementedSbomGenerator` and
29
+ * ./lockfile-sbom-generator.ts's `lockfileSbomGenerator` module docs for why):
30
+ * a project opts in explicitly by constructing
31
+ * `createGenerateSbomCapability(createToolSbomGenerator())` when it wants the
32
+ * deeper, external-tool-backed scan (e.g. to see an image's base-layer OS
33
+ * packages, which no lockfile read can see).
34
+ */
35
+ import { basename, dirname, join } from "node:path";
36
+ import { existsSync } from "node:fs";
37
+ import { DEFAULT_SBOM_FORMAT, SBOM_MEDIA_TYPES, } from "./sbom-generator.js";
38
+ import { defaultProcessRunner, q, requireTool } from "./process-runner.js";
39
+ /** `syft`'s CycloneDX/SPDX JSON output format flags, keyed by `SbomFormat`. */
40
+ const SYFT_FORMAT = {
41
+ spdx: "spdx-json",
42
+ cyclonedx: "cyclonedx-json",
43
+ };
44
+ /** `cdxgen` only emits CycloneDX; SPDX is not one of its output formats. */
45
+ const CDXGEN_FORMAT = "cyclonedx";
46
+ /** Parse a package count out of a CycloneDX or SPDX JSON document, without requiring a full schema-aware parse — mirrors how ./lockfile-sbom-generator.ts's callers only need a count, not full re-validation. */
47
+ function countPackages(format, bytes) {
48
+ try {
49
+ const doc = JSON.parse(bytes);
50
+ if (format === "cyclonedx" && Array.isArray(doc.components))
51
+ return doc.components.length;
52
+ if (format === "spdx" && Array.isArray(doc.packages))
53
+ return doc.packages.length;
54
+ }
55
+ catch {
56
+ // Malformed/unexpected output — report no count rather than throwing;
57
+ // the SBOM bytes themselves are still returned to the caller as-is.
58
+ }
59
+ return undefined;
60
+ }
61
+ /** Build a per-call scratch output path so concurrent scans never collide. */
62
+ function scratchPath(workDir, subject, format) {
63
+ const dir = workDir ?? "/tmp/chant-sbom";
64
+ const safeName = basename(subject).replace(/[^a-zA-Z0-9_.-]/g, "_");
65
+ return join(dir, `${safeName}.${Date.now()}.${format}.json`);
66
+ }
67
+ /**
68
+ * Build a real, deep-scan `SbomGenerator` backend. Every method shells out
69
+ * through `options.runner` (default: the real `ProcessRunner`); tests should
70
+ * always pass a `MockProcessRunner` instead.
71
+ */
72
+ export function createToolSbomGenerator(options = {}) {
73
+ const runner = options.runner ?? defaultProcessRunner();
74
+ async function runSyft(target, format) {
75
+ await requireTool(runner, "syft", `scan ${target} for a software bill of materials`);
76
+ const out = scratchPath(options.workDir, target, format);
77
+ await runner.run(`syft ${q(target)} -o ${SYFT_FORMAT[format]}=${q(out)}`);
78
+ const { stdout } = await runner.run(`cat ${q(out)}`);
79
+ return { bytes: stdout, generator: "syft" };
80
+ }
81
+ return {
82
+ async forImage(input) {
83
+ const format = input.format ?? DEFAULT_SBOM_FORMAT;
84
+ // Prefer BuildKit's own attestation when the image was built from a
85
+ // context on disk right next to the tarball (the common docker-build ->
86
+ // generate-sbom composition); otherwise fall back to scanning the
87
+ // already-saved tarball with syft, which needs no rebuild.
88
+ const buildContext = dirname(input.imagePath);
89
+ const hasDockerfile = existsSync(join(buildContext, "Dockerfile"));
90
+ if (hasDockerfile && (await runner.available("docker"))) {
91
+ const out = scratchPath(options.workDir, input.imagePath, format);
92
+ await runner.run(`docker buildx build --sbom=true --output type=local,dest=${q(out)} ${q(buildContext)}`);
93
+ const { stdout } = await runner.run(`cat ${q(join(out, "sbom.spdx.json"))}`);
94
+ return {
95
+ format,
96
+ mediaType: SBOM_MEDIA_TYPES[format],
97
+ bytes: stdout,
98
+ packageCount: countPackages(format, stdout),
99
+ generator: "buildkit",
100
+ };
101
+ }
102
+ const { bytes, generator } = await runSyft(input.imagePath, format);
103
+ return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
104
+ },
105
+ async forJar(input) {
106
+ const format = input.format ?? DEFAULT_SBOM_FORMAT;
107
+ const projectDir = dirname(input.jarPath);
108
+ const hasPom = existsSync(join(projectDir, "pom.xml"));
109
+ if (hasPom && (await runner.available("mvn"))) {
110
+ await requireTool(runner, "mvn", `run cyclonedx-maven against ${projectDir}`);
111
+ const out = scratchPath(options.workDir, input.jarPath, "cyclonedx");
112
+ await runner.run(`mvn -f ${q(join(projectDir, "pom.xml"))} org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom -DoutputFormat=json -DoutputName=${q(basename(out, ".json"))}`, { cwd: projectDir });
113
+ const { stdout } = await runner.run(`cat ${q(out)}`);
114
+ return {
115
+ format: "cyclonedx",
116
+ mediaType: SBOM_MEDIA_TYPES.cyclonedx,
117
+ bytes: stdout,
118
+ packageCount: countPackages("cyclonedx", stdout),
119
+ generator: "cyclonedx-maven",
120
+ };
121
+ }
122
+ const { bytes, generator } = await runSyft(input.jarPath, format);
123
+ return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
124
+ },
125
+ async forZip(input) {
126
+ const format = input.format ?? DEFAULT_SBOM_FORMAT;
127
+ const { bytes, generator } = await runSyft(input.zipPath, format);
128
+ return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
129
+ },
130
+ async forDir(input) {
131
+ const format = input.format ?? DEFAULT_SBOM_FORMAT;
132
+ if (await runner.available("syft")) {
133
+ const { bytes, generator } = await runSyft(input.path, format);
134
+ return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
135
+ }
136
+ // syft absent — fall back to cdxgen (CycloneDX-only; requested SPDX is
137
+ // reported back as the CycloneDX doc's own format, never silently
138
+ // mislabeled as SPDX).
139
+ await requireTool(runner, "cdxgen", `scan ${input.path} for a software bill of materials (syft is also unavailable)`);
140
+ const out = scratchPath(options.workDir, input.path, CDXGEN_FORMAT);
141
+ await runner.run(`cdxgen -o ${q(out)} ${q(input.path)}`);
142
+ const { stdout } = await runner.run(`cat ${q(out)}`);
143
+ return {
144
+ format: CDXGEN_FORMAT,
145
+ mediaType: SBOM_MEDIA_TYPES[CDXGEN_FORMAT],
146
+ bytes: stdout,
147
+ packageCount: countPackages(CDXGEN_FORMAT, stdout),
148
+ generator: "cdxgen",
149
+ };
150
+ },
151
+ };
152
+ }
153
+ /** Process-wide, real-tool-backed `SbomGenerator`, ready to inject wherever a project opts into the deep-scan path over ./lockfile-sbom-generator.ts's hermetic default. Never constructed by a test. */
154
+ export const toolSbomGenerator = createToolSbomGenerator();