@intentius/chant 0.124.13 → 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 (907) 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.js +260 -0
  306. package/dist/gate-resume-run.js +154 -0
  307. package/dist/gated-waves.js +165 -0
  308. package/dist/governance.js +43 -0
  309. package/dist/graph-declared.js +45 -0
  310. package/dist/graph-detail.js +207 -0
  311. package/dist/graph-dot.js +54 -0
  312. package/dist/graph-effective.js +107 -0
  313. package/dist/graph-ir.js +623 -0
  314. package/dist/graph-layout.js +184 -0
  315. package/dist/graph-lens.js +105 -0
  316. package/dist/graph-mermaid.js +83 -0
  317. package/dist/graph-ops.js +39 -0
  318. package/dist/graph-refs.js +156 -0
  319. package/dist/held-elsewhere.js +87 -0
  320. package/dist/identity.js +251 -0
  321. package/dist/import/base-parser.js +34 -0
  322. package/dist/import/embedded.js +255 -0
  323. package/dist/import/generator.js +1 -0
  324. package/dist/import/ir-utils.js +85 -0
  325. package/dist/import/parser-options.js +45 -0
  326. package/dist/import/parser.js +1 -0
  327. package/dist/index.js +118 -0
  328. package/dist/intrinsic-interpolation.js +73 -0
  329. package/dist/intrinsic.js +31 -0
  330. package/dist/join-key.js +35 -0
  331. package/dist/kubectl-context.js +150 -0
  332. package/dist/lexicon-config.js +58 -0
  333. package/dist/lexicon-integrity.js +47 -0
  334. package/dist/lexicon-manifest.js +70 -0
  335. package/dist/lexicon-module.d.ts.map +1 -1
  336. package/dist/lexicon-module.js +241 -0
  337. package/dist/lexicon-output.js +218 -0
  338. package/dist/lexicon-plugin-helpers.js +104 -0
  339. package/dist/lexicon-schema.js +136 -0
  340. package/dist/lexicon.js +130 -0
  341. package/dist/lifecycle/affected.js +224 -0
  342. package/dist/lifecycle/assert-live.js +110 -0
  343. package/dist/lifecycle/build-ledger-store.js +160 -0
  344. package/dist/lifecycle/build-ledger.js +155 -0
  345. package/dist/lifecycle/change-set.js +356 -0
  346. package/dist/lifecycle/converge-ledger.js +161 -0
  347. package/dist/lifecycle/deep-diff.js +233 -0
  348. package/dist/lifecycle/deep-observe.js +147 -0
  349. package/dist/lifecycle/digest.js +143 -0
  350. package/dist/lifecycle/disruption.js +135 -0
  351. package/dist/lifecycle/gate-applied.js +113 -0
  352. package/dist/lifecycle/gate-audit.js +341 -0
  353. package/dist/lifecycle/gate-ledger-select.js +89 -0
  354. package/dist/lifecycle/gate-ledger.js +193 -0
  355. package/dist/lifecycle/gate-origin.js +117 -0
  356. package/dist/lifecycle/gate-pending.js +58 -0
  357. package/dist/lifecycle/git.js +1182 -0
  358. package/dist/lifecycle/identity.js +58 -0
  359. package/dist/lifecycle/index.js +26 -0
  360. package/dist/lifecycle/lease.js +283 -0
  361. package/dist/lifecycle/ledger-port.js +1 -0
  362. package/dist/lifecycle/legacy-digest.js +91 -0
  363. package/dist/lifecycle/live-diff.js +274 -0
  364. package/dist/lifecycle/local-note.js +15 -0
  365. package/dist/lifecycle/member-ledger.js +122 -0
  366. package/dist/lifecycle/observation-baseline.js +155 -0
  367. package/dist/lifecycle/observe.js +375 -0
  368. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  369. package/dist/lifecycle/override-ledger.js +54 -0
  370. package/dist/lifecycle/plan-digest.js +110 -0
  371. package/dist/lifecycle/plan-ledger.js +129 -0
  372. package/dist/lifecycle/receipt-plan.js +192 -0
  373. package/dist/lifecycle/release-ledger.js +155 -0
  374. package/dist/lifecycle/release-read.js +64 -0
  375. package/dist/lifecycle/replay.js +193 -0
  376. package/dist/lifecycle/rollback.js +102 -0
  377. package/dist/lifecycle/run-ledger.js +183 -0
  378. package/dist/lifecycle/scenario-eval.js +204 -0
  379. package/dist/lifecycle/scenario.js +214 -0
  380. package/dist/lifecycle/snapshot.js +239 -0
  381. package/dist/lifecycle/status.js +447 -0
  382. package/dist/lifecycle/symptoms.js +117 -0
  383. package/dist/lifecycle/teardown.js +255 -0
  384. package/dist/lifecycle/types.js +1 -0
  385. package/dist/lifecycle/unobserved-gate.js +33 -0
  386. package/dist/lifecycle/wave-plans.js +68 -0
  387. package/dist/lifecycle/work-item-id.js +36 -0
  388. package/dist/lifecycle/work-lease.js +393 -0
  389. package/dist/lint/component-checks.js +87 -0
  390. package/dist/lint/config.js +483 -0
  391. package/dist/lint/declarative.js +122 -0
  392. package/dist/lint/discover.d.ts.map +1 -1
  393. package/dist/lint/discover.js +138 -0
  394. package/dist/lint/engine.js +246 -0
  395. package/dist/lint/knowledge-checks.js +64 -0
  396. package/dist/lint/named-checks.js +22 -0
  397. package/dist/lint/output-checks.js +87 -0
  398. package/dist/lint/output-docs.js +163 -0
  399. package/dist/lint/parser.js +33 -0
  400. package/dist/lint/pipeline-change-gate.js +70 -0
  401. package/dist/lint/policy-import.d.ts +1 -1
  402. package/dist/lint/policy-import.d.ts.map +1 -1
  403. package/dist/lint/policy-import.js +62 -0
  404. package/dist/lint/policy-sandbox.js +86 -0
  405. package/dist/lint/policy.js +122 -0
  406. package/dist/lint/post-synth.js +87 -0
  407. package/dist/lint/presets/relaxed.json +26 -0
  408. package/dist/lint/presets/strict.json +24 -24
  409. package/dist/lint/receipt-checks.js +83 -0
  410. package/dist/lint/rule-loader.d.ts.map +1 -1
  411. package/dist/lint/rule-loader.js +89 -0
  412. package/dist/lint/rule-registry.js +86 -0
  413. package/dist/lint/rule.js +1 -0
  414. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  415. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  416. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  417. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  437. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  438. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  439. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  440. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  441. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  442. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  443. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  444. package/dist/lint/rules/comp/index.js +33 -0
  445. package/dist/lint/rules/comp/support.js +129 -0
  446. package/dist/lint/rules/composite-scope.js +51 -0
  447. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  448. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  449. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  450. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  451. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  452. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  453. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  454. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  455. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  456. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  457. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  458. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  459. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  460. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  461. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  462. package/dist/lint/rules/export-required.js +115 -0
  463. package/dist/lint/rules/file-declarable-limit.js +88 -0
  464. package/dist/lint/rules/flat-declarations.js +62 -0
  465. package/dist/lint/rules/index.js +90 -0
  466. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  467. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  468. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  469. package/dist/lint/rules/no-string-ref.js +59 -0
  470. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  471. package/dist/lint/rules/no-unused-declarable.js +142 -0
  472. package/dist/lint/rules/op/index.js +28 -0
  473. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  474. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  475. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  476. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  477. package/dist/lint/rules/op/support.js +11 -0
  478. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  479. package/dist/lint/rules/property-kind.js +56 -0
  480. package/dist/lint/rules/single-concern-file.js +71 -0
  481. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  482. package/dist/lint/selectors.js +168 -0
  483. package/dist/lint/suppressions.js +129 -0
  484. package/dist/lint/typescript.js +17 -0
  485. package/dist/live-endpoint.js +113 -0
  486. package/dist/live-read-session.js +76 -0
  487. package/dist/lsp/lexicon-providers.js +163 -0
  488. package/dist/lsp/types.js +5 -0
  489. package/dist/managed-fields.js +293 -0
  490. package/dist/mcp/types.js +4 -0
  491. package/dist/notify-verify.js +0 -1
  492. package/dist/notify.js +0 -1
  493. package/dist/notify.schema.json +72 -0
  494. package/dist/observation.js +266 -0
  495. package/dist/okf-read.js +134 -0
  496. package/dist/okf.js +275 -0
  497. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  498. package/dist/op/activities/activity-contracts.js +313 -0
  499. package/dist/op/activities/apply.js +582 -0
  500. package/dist/op/activities/build.js +18 -0
  501. package/dist/op/activities/change-coverage.js +40 -0
  502. package/dist/op/activities/change-set.js +64 -0
  503. package/dist/op/activities/converge.js +492 -0
  504. package/dist/op/activities/decide.js +211 -0
  505. package/dist/op/activities/env-teardown.js +110 -0
  506. package/dist/op/activities/factory.js +591 -0
  507. package/dist/op/activities/forge-pull-request.js +82 -0
  508. package/dist/op/activities/gh-host.js +78 -0
  509. package/dist/op/activities/guard-validate.js +165 -0
  510. package/dist/op/activities/http-check.js +40 -0
  511. package/dist/op/activities/index.js +59 -0
  512. package/dist/op/activities/lexicon-upgrade.js +629 -0
  513. package/dist/op/activities/lifecycle.js +109 -0
  514. package/dist/op/activities/pipeline-audit.js +147 -0
  515. package/dist/op/activities/policy.js +26 -0
  516. package/dist/op/activities/predict-behaviour.js +341 -0
  517. package/dist/op/activities/propose-upgrade.js +165 -0
  518. package/dist/op/activities/reconcile.js +997 -0
  519. package/dist/op/activities/shell.js +118 -0
  520. package/dist/op/activities/source-release.js +97 -0
  521. package/dist/op/activities/source-rollback.js +165 -0
  522. package/dist/op/activities/teardown.js +17 -0
  523. package/dist/op/activities/util.js +6 -0
  524. package/dist/op/activities/wait.js +51 -0
  525. package/dist/op/activities/work-evidence.js +35 -0
  526. package/dist/op/activities/workflow-audit.js +133 -0
  527. package/dist/op/activity-contract-registry.js +106 -0
  528. package/dist/op/activity-contract.js +232 -0
  529. package/dist/op/activity-failure.js +31 -0
  530. package/dist/op/activity-profiles.js +129 -0
  531. package/dist/op/activity-registry.js +105 -0
  532. package/dist/op/activity-runtime.js +28 -0
  533. package/dist/op/builders.js +801 -0
  534. package/dist/op/change-signal.js +118 -0
  535. package/dist/op/composites/apply-op.js +151 -0
  536. package/dist/op/composites/behaviour-op.js +65 -0
  537. package/dist/op/composites/converge-op.js +141 -0
  538. package/dist/op/composites/index.js +19 -0
  539. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  540. package/dist/op/composites/pipeline-audit-op.js +50 -0
  541. package/dist/op/composites/reconcile-op.js +84 -0
  542. package/dist/op/composites/watch-op.js +69 -0
  543. package/dist/op/composites/workflow-audit-op.js +57 -0
  544. package/dist/op/converge-rule.js +205 -0
  545. package/dist/op/cron.js +146 -0
  546. package/dist/op/decide-backend.js +181 -0
  547. package/dist/op/decide-config.js +68 -0
  548. package/dist/op/decide-read-inputs.js +141 -0
  549. package/dist/op/discover.d.ts.map +1 -1
  550. package/dist/op/discover.js +213 -0
  551. package/dist/op/duration.js +21 -0
  552. package/dist/op/emulator-freshness.js +80 -0
  553. package/dist/op/emulator-lifecycle.js +269 -0
  554. package/dist/op/factory.js +83 -0
  555. package/dist/op/gate-approval.js +172 -0
  556. package/dist/op/gate-name.js +86 -0
  557. package/dist/op/gate-plan-context.js +167 -0
  558. package/dist/op/gate-point-run.js +67 -0
  559. package/dist/op/gate-point.js +111 -0
  560. package/dist/op/gate-resume-plan.js +155 -0
  561. package/dist/op/gate-resume.js +31 -0
  562. package/dist/op/gate-review.js +290 -0
  563. package/dist/op/gate-run-locator.js +85 -0
  564. package/dist/op/gate-summary.js +100 -0
  565. package/dist/op/gate-wait.js +56 -0
  566. package/dist/op/gate.js +449 -0
  567. package/dist/op/generate-pipeline.js +124 -0
  568. package/dist/op/index.js +51 -0
  569. package/dist/op/lifecycle-receipt-store.js +45 -0
  570. package/dist/op/local-executor.js +1164 -0
  571. package/dist/op/local-output.js +140 -0
  572. package/dist/op/op-ir.js +317 -0
  573. package/dist/op/op-verb-class.js +131 -0
  574. package/dist/op/op-waves-notify.js +136 -0
  575. package/dist/op/op-waves-run.js +1657 -0
  576. package/dist/op/op-waves.js +409 -0
  577. package/dist/op/operator.js +743 -0
  578. package/dist/op/receipt-store.js +94 -0
  579. package/dist/op/resource.js +23 -0
  580. package/dist/op/run-context.js +28 -0
  581. package/dist/op/run-live.js +256 -0
  582. package/dist/op/runtime.js +21 -0
  583. package/dist/op/runtimes/local.js +195 -0
  584. package/dist/op/source-archive.js +131 -0
  585. package/dist/op/step-output-ref.js +397 -0
  586. package/dist/op/steward-beside.js +169 -0
  587. package/dist/op/steward-points.js +138 -0
  588. package/dist/op/steward-turn.js +59 -0
  589. package/dist/op/steward.js +317 -0
  590. package/dist/op/types.js +25 -0
  591. package/dist/op/work-lease-decl.js +81 -0
  592. package/dist/op/work-lease-run.js +393 -0
  593. package/dist/override-gate.js +284 -0
  594. package/dist/owner-chain.js +74 -0
  595. package/dist/ownership.js +92 -0
  596. package/dist/params.js +61 -0
  597. package/dist/plan-summary.js +711 -0
  598. package/dist/point-decision.js +211 -0
  599. package/dist/pr-forge.js +810 -0
  600. package/dist/pr-loop.js +203 -0
  601. package/dist/project-codegen.js +191 -0
  602. package/dist/project-root.js +74 -0
  603. package/dist/project-validation.js +50 -0
  604. package/dist/provenance.js +157 -0
  605. package/dist/pseudo-parameter.js +40 -0
  606. package/dist/reconcile.js +450 -0
  607. package/dist/resource-attributes.js +33 -0
  608. package/dist/runtime-adapter.js +77 -0
  609. package/dist/runtime.js +66 -0
  610. package/dist/secret-materialization.js +153 -0
  611. package/dist/secret-provenance.js +250 -0
  612. package/dist/serializer-walker.js +112 -0
  613. package/dist/serializer.js +1 -0
  614. package/dist/sort.js +45 -0
  615. package/dist/stack-output.js +115 -0
  616. package/dist/telemetry-attribution.js +149 -0
  617. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  618. package/dist/terraform/adopt-state.js +40 -0
  619. package/dist/terraform/aws-resources.js +384 -0
  620. package/dist/terraform/bridge.js +204 -0
  621. package/dist/terraform/carve-provider.js +155 -0
  622. package/dist/terraform/carve.js +138 -0
  623. package/dist/terraform/data-source-shape.js +57 -0
  624. package/dist/terraform/emit-source.js +36 -0
  625. package/dist/terraform/excise.js +123 -0
  626. package/dist/terraform/graduate.js +128 -0
  627. package/dist/terraform/graph.js +435 -0
  628. package/dist/terraform/hcl2json.js +60 -0
  629. package/dist/terraform/manifest.js +149 -0
  630. package/dist/terraform/parse.js +81 -0
  631. package/dist/terraform/providers/aws.js +146 -0
  632. package/dist/terraform/providers/gcp.js +294 -0
  633. package/dist/terraform/providers/index.js +17 -0
  634. package/dist/terraform/providers/kubernetes.js +253 -0
  635. package/dist/terraform/score.js +151 -0
  636. package/dist/terraform/state.js +67 -0
  637. package/dist/terraform/tier-map.js +74 -0
  638. package/dist/terraform/types.js +13 -0
  639. package/dist/terraform/unified-diff.js +132 -0
  640. package/dist/testing.js +295 -0
  641. package/dist/toml-emit.js +153 -0
  642. package/dist/toml-parse.js +355 -0
  643. package/dist/toml-utils.js +60 -0
  644. package/dist/toml.js +428 -0
  645. package/dist/ts-loader.d.ts +46 -0
  646. package/dist/ts-loader.d.ts.map +1 -0
  647. package/dist/ts-loader.js +103 -0
  648. package/dist/types.js +1 -0
  649. package/dist/utils.js +61 -0
  650. package/dist/validation.js +20 -0
  651. package/dist/vendor/js-yaml-load.js +1662 -0
  652. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  653. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  654. package/dist/workspace/__fixtures__/sessions.js +91 -0
  655. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  656. package/dist/workspace/agent-cli.js +99 -0
  657. package/dist/workspace/agent.schema.json +390 -0
  658. package/dist/workspace/answers-ledger.js +89 -0
  659. package/dist/workspace/box-cli.js +142 -0
  660. package/dist/workspace/box-factory-write.js +196 -0
  661. package/dist/workspace/box-factory-write.schema.json +342 -0
  662. package/dist/workspace/box-factory.js +88 -0
  663. package/dist/workspace/box-intent.js +126 -0
  664. package/dist/workspace/box-isolation.js +169 -0
  665. package/dist/workspace/box-listing-write.schema.json +204 -0
  666. package/dist/workspace/box-listing.js +298 -0
  667. package/dist/workspace/box-publish.js +352 -0
  668. package/dist/workspace/box-publish.schema.json +498 -0
  669. package/dist/workspace/box-services.js +39 -0
  670. package/dist/workspace/broker-protocol.js +359 -0
  671. package/dist/workspace/broker-protocol.schema.json +228 -0
  672. package/dist/workspace/change-set.schema.json +460 -0
  673. package/dist/workspace/changes-cli.js +56 -0
  674. package/dist/workspace/changes.js +446 -0
  675. package/dist/workspace/changes.schema.json +642 -0
  676. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  677. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  678. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  679. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  680. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  681. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  682. package/dist/workspace/chant-migrations.js +113 -0
  683. package/dist/workspace/check.schema.json +433 -0
  684. package/dist/workspace/checks/box-isolation.js +62 -0
  685. package/dist/workspace/checks/boxes.js +491 -0
  686. package/dist/workspace/checks/diagrams.js +104 -0
  687. package/dist/workspace/checks/generated.js +419 -0
  688. package/dist/workspace/checks/ledgers.js +212 -0
  689. package/dist/workspace/checks/links.js +191 -0
  690. package/dist/workspace/checks/live.js +100 -0
  691. package/dist/workspace/checks/pipelines.js +188 -0
  692. package/dist/workspace/checks/records.js +169 -0
  693. package/dist/workspace/checks.js +426 -0
  694. package/dist/workspace/ci-green-cli.js +125 -0
  695. package/dist/workspace/ci-green-forge.js +83 -0
  696. package/dist/workspace/ci-green-workflow.js +199 -0
  697. package/dist/workspace/ci-green.js +325 -0
  698. package/dist/workspace/ci-last-green.schema.json +158 -0
  699. package/dist/workspace/compose-graph.js +235 -0
  700. package/dist/workspace/compose-reports.js +146 -0
  701. package/dist/workspace/composites.js +264 -0
  702. package/dist/workspace/composites.schema.json +617 -0
  703. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  704. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  705. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  706. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  707. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  708. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  709. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  710. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  711. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  712. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  713. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  714. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  715. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  716. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  717. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  718. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  719. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  720. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  721. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  722. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  723. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  724. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  725. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  726. package/dist/workspace/conformance/broker.js +736 -0
  727. package/dist/workspace/conformance/index.js +673 -0
  728. package/dist/workspace/conformance/vitest.js +108 -0
  729. package/dist/workspace/conformance/writer.js +1080 -0
  730. package/dist/workspace/decide.js +879 -0
  731. package/dist/workspace/decision-points.schema.json +135 -135
  732. package/dist/workspace/declaration-write-cli.js +74 -0
  733. package/dist/workspace/declaration-write.js +238 -0
  734. package/dist/workspace/declaration.js +938 -0
  735. package/dist/workspace/declaration.schema.json +1413 -1413
  736. package/dist/workspace/declared-kinds.js +106 -0
  737. package/dist/workspace/environments.js +164 -0
  738. package/dist/workspace/evidence.schema.json +279 -0
  739. package/dist/workspace/export-cli.js +185 -0
  740. package/dist/workspace/export.js +499 -0
  741. package/dist/workspace/factory-rules.js +175 -0
  742. package/dist/workspace/generated-files.js +92 -0
  743. package/dist/workspace/glob.js +45 -0
  744. package/dist/workspace/graph-cache.js +352 -0
  745. package/dist/workspace/graph-cli.js +348 -0
  746. package/dist/workspace/graph.schema.json +1338 -0
  747. package/dist/workspace/identity-gate-rule.js +75 -0
  748. package/dist/workspace/identity.js +126 -0
  749. package/dist/workspace/import.js +283 -0
  750. package/dist/workspace/init.js +620 -0
  751. package/dist/workspace/intent-cli.js +263 -0
  752. package/dist/workspace/intent-joins.js +201 -0
  753. package/dist/workspace/intent-record.js +352 -0
  754. package/dist/workspace/intent-record.schema.json +864 -0
  755. package/dist/workspace/intent.js +1582 -0
  756. package/dist/workspace/intent.schema.json +2420 -0
  757. package/dist/workspace/json-edit.js +221 -0
  758. package/dist/workspace/jsonc.js +235 -0
  759. package/dist/workspace/kind-readers.js +103 -0
  760. package/dist/workspace/kinds.js +587 -0
  761. package/dist/workspace/lexicon-symbols.js +112 -0
  762. package/dist/workspace/lineage-adopt-cli.js +102 -0
  763. package/dist/workspace/lineage-adopt.js +360 -0
  764. package/dist/workspace/lineage-check.js +282 -0
  765. package/dist/workspace/lineage-cli.js +121 -0
  766. package/dist/workspace/lineage-hash-index.js +284 -0
  767. package/dist/workspace/lineage-init.js +507 -0
  768. package/dist/workspace/lineage-lock.js +387 -0
  769. package/dist/workspace/lineage-merge.js +45 -0
  770. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  771. package/dist/workspace/lineage-migrations.js +329 -0
  772. package/dist/workspace/lineage-provenance.js +36 -0
  773. package/dist/workspace/lineage-update.js +138 -0
  774. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  775. package/dist/workspace/lineage-upgrade.js +889 -0
  776. package/dist/workspace/lineage-vendor.js +171 -0
  777. package/dist/workspace/lineage-version.js +128 -0
  778. package/dist/workspace/lineage-versions.js +275 -0
  779. package/dist/workspace/links.js +330 -0
  780. package/dist/workspace/ls-generated.js +95 -0
  781. package/dist/workspace/ls.js +277 -0
  782. package/dist/workspace/ls.schema.json +333 -0
  783. package/dist/workspace/member-commands.js +508 -0
  784. package/dist/workspace/member-handles.js +216 -0
  785. package/dist/workspace/member-pipeline.js +258 -0
  786. package/dist/workspace/member-run.js +117 -0
  787. package/dist/workspace/member-write.schema.json +193 -0
  788. package/dist/workspace/nested-graph.js +156 -0
  789. package/dist/workspace/nesting.js +38 -0
  790. package/dist/workspace/patch.js +301 -0
  791. package/dist/workspace/patch.schema.json +321 -0
  792. package/dist/workspace/pin-cli.js +55 -0
  793. package/dist/workspace/pin-integrity.js +100 -0
  794. package/dist/workspace/plan-summary.schema.json +155 -0
  795. package/dist/workspace/point-answer.schema.json +129 -129
  796. package/dist/workspace/points-cli.js +291 -0
  797. package/dist/workspace/points-write.schema.json +660 -0
  798. package/dist/workspace/points.js +521 -0
  799. package/dist/workspace/points.schema.json +916 -0
  800. package/dist/workspace/pr-report.schema.json +108 -0
  801. package/dist/workspace/principal-classes.js +245 -0
  802. package/dist/workspace/reason-codes.js +326 -0
  803. package/dist/workspace/record-assets.js +151 -0
  804. package/dist/workspace/record-decided.js +105 -0
  805. package/dist/workspace/record-sessions.js +96 -0
  806. package/dist/workspace/record-source.js +114 -0
  807. package/dist/workspace/records-amend.schema.json +284 -0
  808. package/dist/workspace/records-checkout.js +76 -0
  809. package/dist/workspace/records-cli.js +707 -0
  810. package/dist/workspace/records-close.js +116 -0
  811. package/dist/workspace/records-close.schema.json +278 -0
  812. package/dist/workspace/records-new.schema.json +202 -0
  813. package/dist/workspace/records-review.schema.json +367 -0
  814. package/dist/workspace/records-since.js +317 -0
  815. package/dist/workspace/records-since.schema.json +218 -0
  816. package/dist/workspace/records-write.js +1229 -0
  817. package/dist/workspace/records.js +1345 -0
  818. package/dist/workspace/records.schema.json +604 -0
  819. package/dist/workspace/reference-kinds/app/package.json +10 -0
  820. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  821. package/dist/workspace/returns.js +303 -0
  822. package/dist/workspace/root-refusal.js +75 -0
  823. package/dist/workspace/run-statement.schema.json +622 -0
  824. package/dist/workspace/runs-cli.js +584 -0
  825. package/dist/workspace/runs-write.schema.json +994 -0
  826. package/dist/workspace/runs.js +708 -0
  827. package/dist/workspace/runs.schema.json +1257 -0
  828. package/dist/workspace/runtimes.js +76 -0
  829. package/dist/workspace/session-kinds.js +83 -0
  830. package/dist/workspace/signers.schema.json +206 -0
  831. package/dist/workspace/source-block.js +125 -0
  832. package/dist/workspace/squash.js +177 -0
  833. package/dist/workspace/status-gates.js +162 -0
  834. package/dist/workspace/status-stewards.js +330 -0
  835. package/dist/workspace/status.js +514 -0
  836. package/dist/workspace/status.schema.json +998 -0
  837. package/dist/workspace/steward-index.js +191 -0
  838. package/dist/workspace/symbols.js +188 -0
  839. package/dist/workspace/template-manifest.js +227 -0
  840. package/dist/workspace/template-pins.js +115 -0
  841. package/dist/workspace/trailer-joins.js +65 -0
  842. package/dist/workspace/trailers.js +111 -0
  843. package/dist/workspace/tree.js +136 -0
  844. package/dist/workspace/trust/attestor.js +63 -0
  845. package/dist/workspace/trust/dsse.js +108 -0
  846. package/dist/workspace/trust/evidence-cli.js +175 -0
  847. package/dist/workspace/trust/evidence.js +161 -0
  848. package/dist/workspace/trust/gate-seal.js +226 -0
  849. package/dist/workspace/trust/policy.js +190 -0
  850. package/dist/workspace/trust/provenance.js +180 -0
  851. package/dist/workspace/trust/rotation.js +298 -0
  852. package/dist/workspace/trust/run-commits.js +101 -0
  853. package/dist/workspace/trust/run-statement.js +182 -0
  854. package/dist/workspace/trust/seal.js +272 -0
  855. package/dist/workspace/trust/signers-cli.js +152 -0
  856. package/dist/workspace/trust/ssh-commit.js +178 -0
  857. package/dist/workspace/trust/test-repo.js +118 -0
  858. package/dist/workspace/trust/trust-files.js +193 -0
  859. package/dist/workspace/trust/verify-cli.js +63 -0
  860. package/dist/workspace/trust/verify.js +192 -0
  861. package/dist/workspace/which-chant.js +141 -0
  862. package/dist/workspace/wip-cli.js +95 -0
  863. package/dist/workspace/wip-write.schema.json +504 -0
  864. package/dist/workspace/wip.js +631 -0
  865. package/dist/workspace/wip.schema.json +334 -0
  866. package/dist/workspace/work-cli.js +448 -0
  867. package/dist/workspace/work-evidence.js +122 -0
  868. package/dist/workspace/work-evidence.schema.json +222 -0
  869. package/dist/workspace/work-history.schema.json +421 -0
  870. package/dist/workspace/work-lease.schema.json +246 -0
  871. package/dist/workspace/work-size.js +77 -0
  872. package/dist/workspace/work.js +283 -0
  873. package/dist/workspace/workspace-kinds.schema.json +259 -259
  874. package/dist/workspace/workspace-principals.schema.json +53 -53
  875. package/dist/workspace/write-lock-cli.js +105 -0
  876. package/dist/workspace/write-lock.js +424 -0
  877. package/dist/workspace/write-lock.schema.json +172 -0
  878. package/dist/workspace/write-scope.js +484 -0
  879. package/dist/yaml.js +459 -0
  880. package/package.json +2 -2
  881. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  882. package/src/cli/commands/lint.ts +3 -0
  883. package/src/cli/commands/migrate.ts +2 -0
  884. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  885. package/src/cli/main.ts +121 -27
  886. package/src/cli/mcp/workspace-tools.ts +1 -1
  887. package/src/codegen/pinned-upgrade.ts +2 -0
  888. package/src/components/discover.ts +2 -0
  889. package/src/components/sandbox/driver.ts +3 -1
  890. package/src/config-import.ts +3 -0
  891. package/src/discovery/fold-import.ts +23 -14
  892. package/src/discovery/import.ts +2 -0
  893. package/src/discovery/sandbox/driver.ts +3 -1
  894. package/src/lexicon-module.ts +3 -0
  895. package/src/lint/config.ts +1 -1
  896. package/src/lint/discover.ts +28 -8
  897. package/src/lint/policy-import.ts +4 -1
  898. package/src/lint/rule-loader.ts +2 -0
  899. package/src/op/discover.ts +3 -0
  900. package/src/ts-loader.test.ts +23 -0
  901. package/src/ts-loader.ts +122 -0
  902. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  903. package/src/workspace/declaration.ts +1 -1
  904. package/src/workspace/kinds.ts +1 -1
  905. package/src/workspace/lineage-migrations.ts +2 -0
  906. package/src/workspace/points.ts +1 -1
  907. package/src/workspace/principal-classes.ts +1 -1
@@ -0,0 +1,549 @@
1
+ /**
2
+ * Promote a release to another environment without rebuilding (#2530).
3
+ *
4
+ * `chant run --components <name> --env prod` runs the component's whole
5
+ * `deploy` composition, and a composition that builds (a `Build` phase with
6
+ * `docker-build`) builds again in prod. The release ledger already knows which
7
+ * digest staging is running, so a promote reads that record and deploys the
8
+ * same artifact to the target environment instead.
9
+ *
10
+ * The mechanism is a transform on the composition, not a change to the driver:
11
+ *
12
+ * - build-time steps (`BUILD_STEP_KINDS`) are removed, so nothing is built;
13
+ * - the publish step stays. It moves the archived bytes to the target
14
+ * environment, which is what "promote by digest" means in the build-archive
15
+ * model, and its output is checked against the recorded digest. A publish
16
+ * that produces any other digest fails the step, and so the component,
17
+ * before anything after it runs;
18
+ * - gates, apply, verify and every other step run exactly as a normal deploy
19
+ * to the target environment would run them, so the target's gates apply.
20
+ * A gate approval is bound to the target environment, the transformed
21
+ * composition and the digest being deployed (#2574), so an approval for a
22
+ * plain deploy or for another release does not pass it.
23
+ *
24
+ * A composition the transform cannot pin to one recorded digest is refused
25
+ * before anything runs: one with no publish step (nothing would carry the
26
+ * digest), one with more than one (the ledger records one digest per
27
+ * component), and one whose remaining steps read an output of a removed build
28
+ * step (it would resolve to nothing).
29
+ *
30
+ * A rollback (#2531) is the same run against one environment's own earlier
31
+ * release. There the publish step is replaced by the recorded digest rather
32
+ * than run, since the environment already received that artifact when the
33
+ * release was first deployed (see `withoutBuildSteps`'s `pinDigest`). A
34
+ * redeploy (#2604) is a rollback to the release the ledger already records as
35
+ * current, for an environment a failed deploy left running something else.
36
+ *
37
+ * The driver stays capability-agnostic. The two kind lists below are data, in
38
+ * the same spirit as `DEPLOY_UNIT_RULES` (./deploy-units.ts).
39
+ */
40
+ import { parseWiringRef } from "../lint/rules/comp/support.js";
41
+ import { latestPerComponent } from "../lifecycle/release-ledger.js";
42
+ import { CapabilityRegistry } from "./capability.js";
43
+ import { runInterpretDriver, DriverRunFailure, } from "./driver.js";
44
+ /**
45
+ * Step kinds that produce an artifact at build time: the build family, and the
46
+ * SBOM steps that read the freshly built archive. A promote removes them.
47
+ */
48
+ export const BUILD_STEP_KINDS = [
49
+ "docker-build",
50
+ "zip-package",
51
+ "jvm-build",
52
+ "generate-sbom",
53
+ "extract-config-bom",
54
+ ];
55
+ /**
56
+ * The publish family (the same set COMP001 recognises, plus the
57
+ * `publish-asset` alias). Its output digest is the one a release record binds.
58
+ */
59
+ export const PUBLISH_STEP_KINDS = [
60
+ "publish-image",
61
+ "publish-artifact",
62
+ "publish-asset",
63
+ "load-image-on-host",
64
+ ];
65
+ /**
66
+ * Pick one release of `component` out of an environment's records: the latest
67
+ * one, or, when `digest` is given, the latest one that recorded that digest.
68
+ * A digest the ledger never recorded for the component is an error.
69
+ */
70
+ export function selectRelease(records, component, env, digest) {
71
+ const own = records.filter((r) => r.component === component);
72
+ if (own.length === 0)
73
+ return { error: `no release of "${component}" is recorded in "${env}"` };
74
+ if (digest === undefined)
75
+ return { record: latestPerComponent(own).get(component) };
76
+ const matching = own.filter((r) => r.digest === digest);
77
+ if (matching.length === 0) {
78
+ return {
79
+ error: `digest ${digest} is not recorded for "${component}" in "${env}"; ` +
80
+ `its recorded digests are ${[...new Set(own.map((r) => r.digest))].join(", ")}`,
81
+ };
82
+ }
83
+ return { record: latestPerComponent(matching).get(component) };
84
+ }
85
+ /**
86
+ * Read `--digest <component>=<digest>` values (#2602) into a component-to-
87
+ * digest map. A value with no `=` is left to the single-component form
88
+ * (`--component <name> --digest <digest>`), so it is an error here. An empty
89
+ * digest is an error too: a generated promote job passes one when the job that
90
+ * deployed the component recorded no release, and promoting whatever is
91
+ * latest instead is the thing the pin is there to prevent.
92
+ */
93
+ export function parseDigestPins(values) {
94
+ const pins = {};
95
+ for (const value of values) {
96
+ const at = value.indexOf("=");
97
+ if (at < 0)
98
+ return { error: "--digest picks one release of one component, so it needs --component <name>, or the form <component>=<digest>" };
99
+ const component = value.slice(0, at);
100
+ const digest = value.slice(at + 1);
101
+ if (component === "")
102
+ return { error: `--digest ${value} names no component` };
103
+ if (digest === "") {
104
+ return { error: `--digest ${value} names no digest; the run that deployed "${component}" recorded no release for it` };
105
+ }
106
+ if (component in pins && pins[component] !== digest) {
107
+ return { error: `--digest pins "${component}" twice, to ${pins[component]} and ${digest}` };
108
+ }
109
+ pins[component] = digest;
110
+ }
111
+ return { pins };
112
+ }
113
+ /**
114
+ * Decide which releases a promote deploys. With `component`, exactly that
115
+ * component's latest source release (or the one recording `digest`). With
116
+ * `pins` (#2602), exactly the pinned components, each at the source release
117
+ * recording its pinned digest. Otherwise, the latest source release of every
118
+ * component this checkout declares; a recorded component the checkout no
119
+ * longer declares is reported and left alone, since there is no composition
120
+ * to deploy it with.
121
+ */
122
+ export function planPromotion(input) {
123
+ const { from, to, sourceRecords, declared, component, digest, pins } = input;
124
+ if (from === to)
125
+ return { error: `--from and --to name the same environment ("${from}")` };
126
+ if (digest !== undefined && component === undefined) {
127
+ return { error: "--digest picks one release of one component, so it needs --component <name>" };
128
+ }
129
+ if (pins !== undefined && Object.keys(pins).length > 0) {
130
+ if (component !== undefined) {
131
+ return { error: "--digest <component>=<digest> names its own component, so it does not take --component" };
132
+ }
133
+ const items = [];
134
+ for (const [name, pinned] of Object.entries(pins).sort(([a], [b]) => a.localeCompare(b))) {
135
+ if (!declared.includes(name))
136
+ return { error: `component "${name}" is not declared in this checkout` };
137
+ const picked = selectRelease(sourceRecords, name, from, pinned);
138
+ if ("error" in picked)
139
+ return picked;
140
+ items.push({ component: name, digest: picked.record.digest, source: picked.record });
141
+ }
142
+ return { from, to, items, notPromoted: [] };
143
+ }
144
+ if (component !== undefined) {
145
+ if (!declared.includes(component)) {
146
+ return { error: `component "${component}" is not declared in this checkout` };
147
+ }
148
+ const picked = selectRelease(sourceRecords, component, from, digest);
149
+ if ("error" in picked)
150
+ return picked;
151
+ return { from, to, items: [{ component, digest: picked.record.digest, source: picked.record }], notPromoted: [] };
152
+ }
153
+ const latest = latestPerComponent(sourceRecords);
154
+ const items = [];
155
+ const notPromoted = [];
156
+ for (const [name, record] of [...latest].sort(([a], [b]) => a.localeCompare(b))) {
157
+ if (declared.includes(name))
158
+ items.push({ component: name, digest: record.digest, source: record });
159
+ else
160
+ notPromoted.push({ component: name, reason: "recorded but not declared in this checkout" });
161
+ }
162
+ if (items.length === 0) {
163
+ return { error: `nothing to promote: no component declared here has a release recorded in "${from}"` };
164
+ }
165
+ return { from, to, items, notPromoted };
166
+ }
167
+ /**
168
+ * Decide which release a rollback restores: the release of `component` in
169
+ * `env` given by `digest`, or by default the most recent release whose digest
170
+ * differs from the current one. Restoring the release already current is
171
+ * refused, since there is nothing to roll back.
172
+ */
173
+ export function planRollback(input) {
174
+ const { env, records, declared, component, digest } = input;
175
+ if (!declared.includes(component)) {
176
+ return { error: `component "${component}" is not declared in this checkout` };
177
+ }
178
+ const own = records.filter((r) => r.component === component);
179
+ const current = latestPerComponent(own).get(component);
180
+ if (!current)
181
+ return { error: `no release of "${component}" is recorded in "${env}"` };
182
+ let target;
183
+ if (digest !== undefined) {
184
+ const picked = selectRelease(own, component, env, digest);
185
+ if ("error" in picked)
186
+ return picked;
187
+ target = picked.record;
188
+ }
189
+ else {
190
+ const earlier = own.filter((r) => r.digest !== current.digest);
191
+ if (earlier.length === 0) {
192
+ return { error: `"${component}" has no earlier release in "${env}" with a digest other than the current ${current.digest}` };
193
+ }
194
+ target = latestPerComponent(earlier).get(component);
195
+ }
196
+ if (target.digest === current.digest) {
197
+ return { error: `${target.digest} is already the current release of "${component}" in "${env}"; nothing to roll back` };
198
+ }
199
+ return { from: env, to: env, items: [{ component, digest: target.digest, source: target }], notPromoted: [] };
200
+ }
201
+ /**
202
+ * Decide what a redeploy deploys: the release of `component` the ledger in
203
+ * `env` records as current. A deploy that fails partway records nothing, so
204
+ * after one the ledger still names the last good release while the
205
+ * environment may be running part of the failed one. `digest`, when given,
206
+ * has to be that current digest. It guards against a deploy recorded since
207
+ * the caller last looked; any earlier release is a rollback.
208
+ */
209
+ export function planRedeploy(input) {
210
+ const { env, records, declared, component, digest } = input;
211
+ if (!declared.includes(component)) {
212
+ return { error: `component "${component}" is not declared in this checkout` };
213
+ }
214
+ const current = latestPerComponent(records.filter((r) => r.component === component)).get(component);
215
+ if (!current)
216
+ return { error: `no release of "${component}" is recorded in "${env}"` };
217
+ if (digest !== undefined && digest !== current.digest) {
218
+ return {
219
+ error: `${digest} is not the current release of "${component}" in "${env}" (that is ${current.digest}); ` +
220
+ `use \`chant components rollback ${env} --component ${component} --digest ${digest}\` to restore an earlier release`,
221
+ };
222
+ }
223
+ return { from: env, to: env, items: [{ component, digest: current.digest, source: current }], notPromoted: [] };
224
+ }
225
+ function isGate(step) {
226
+ return step.kind === "gate";
227
+ }
228
+ function isPhase(step) {
229
+ return typeof step.phase === "string" && Array.isArray(step.steps);
230
+ }
231
+ /**
232
+ * The build steps that write the archive a promote's publish step reads, each
233
+ * to its `into` path. The SBOM steps are left out: a promote refuses a step
234
+ * that reads their output, so it never needs it.
235
+ */
236
+ export const ARCHIVE_STEP_KINDS = ["docker-build", "zip-package", "jvm-build"];
237
+ /**
238
+ * The paths `component`'s build steps write its archive to, in composition
239
+ * order without repeats (#2575). A generated pipeline carries these files from
240
+ * the job that deployed to the source environment to the job that promotes,
241
+ * since a promote publishes from the archive on disk. Throws when an `into` is
242
+ * not a literal path, such as a wiring reference or an `$env.` value, because
243
+ * a generator cannot name a file that is only known at run time.
244
+ */
245
+ export function promoteArchivePaths(component) {
246
+ const paths = [];
247
+ const walk = (phases) => {
248
+ for (const phase of phases) {
249
+ for (const step of phase.steps) {
250
+ if (isPhase(step))
251
+ walk([step]);
252
+ else if (!isGate(step) && ARCHIVE_STEP_KINDS.includes(step.kind)) {
253
+ const into = step.into;
254
+ if (typeof into !== "string" || into === "" || into.startsWith("@") || into.startsWith("$")) {
255
+ throw new Error(`component "${component.name}": the ${step.kind} step in phase "${phase.phase}" writes to ` +
256
+ `${JSON.stringify(into)}, which is not a literal path, so a generated promote job cannot carry its archive`);
257
+ }
258
+ if (!paths.includes(into))
259
+ paths.push(into);
260
+ }
261
+ }
262
+ }
263
+ };
264
+ walk(component.deploy);
265
+ return paths;
266
+ }
267
+ /**
268
+ * Whether `component`'s deploy has a publish step (#2602). Only such a
269
+ * component records a release when it deploys, so only its release can be
270
+ * promoted; a generated pipeline pins exactly these components' digests.
271
+ */
272
+ export function hasPublishStep(component) {
273
+ const walk = (steps) => steps.some((step) => isPhase(step) ? walk(step.steps) : !isGate(step) && PUBLISH_STEP_KINDS.includes(step.kind));
274
+ return walk(component.deploy);
275
+ }
276
+ /**
277
+ * The step a rollback puts where the publish step was: it publishes nothing
278
+ * and returns the recorded digest, so `@Publish.digest` resolves to it.
279
+ */
280
+ export const RECORDED_DIGEST_KIND = "recorded-digest";
281
+ /** The capability behind {@link RECORDED_DIGEST_KIND}. */
282
+ export const recordedDigestCapability = {
283
+ kind: RECORDED_DIGEST_KIND,
284
+ rollbackPolicy: "none-by-design",
285
+ async run(_ctx, input) {
286
+ return { digest: input.digest };
287
+ },
288
+ };
289
+ /**
290
+ * Remove every build-time step from `component`'s `deploy` composition and
291
+ * check that what is left can be pinned to one recorded digest. A phase left
292
+ * with nothing to run is dropped. `rollback` phases are untouched.
293
+ *
294
+ * With `pinDigest` (a rollback, #2531, or a redeploy, #2604), the publish step is replaced too, by a
295
+ * {@link RECORDED_DIGEST_KIND} step carrying that digest: the environment
296
+ * already received the artifact when the release being restored was
297
+ * deployed, and the archive it came from is usually long gone. Only the
298
+ * digest is known then, so a step reading any other publish output (such as
299
+ * `@Publish.uri`) is refused.
300
+ */
301
+ export function withoutBuildSteps(component, opts = {}) {
302
+ const verb = opts.verb ?? (opts.pinDigest === undefined ? "a promote" : "a rollback");
303
+ const removed = [];
304
+ /** Phases a build step was removed from, and whether anything else is left in them. */
305
+ const emptied = new Map();
306
+ /** Phases a publish step was pinned in, and whether anything else is left in them. */
307
+ const pinned = new Map();
308
+ let publishSteps = 0;
309
+ const kept = [];
310
+ const strip = (phase) => {
311
+ const steps = [];
312
+ let lostBuildStep = false;
313
+ let pinnedHere = false;
314
+ for (const step of phase.steps) {
315
+ if (isGate(step)) {
316
+ steps.push(step);
317
+ }
318
+ else if (isPhase(step)) {
319
+ const nested = strip(step);
320
+ if (nested)
321
+ steps.push(nested);
322
+ }
323
+ else if (BUILD_STEP_KINDS.includes(step.kind)) {
324
+ removed.push(step.kind);
325
+ lostBuildStep = true;
326
+ }
327
+ else if (PUBLISH_STEP_KINDS.includes(step.kind)) {
328
+ publishSteps++;
329
+ if (opts.pinDigest === undefined) {
330
+ kept.push(step);
331
+ steps.push(step);
332
+ }
333
+ else {
334
+ removed.push(step.kind);
335
+ pinnedHere = true;
336
+ steps.push({
337
+ kind: RECORDED_DIGEST_KIND,
338
+ digest: opts.pinDigest,
339
+ replaces: step.kind,
340
+ noRollback: "publishes nothing; it hands on a digest the environment already received",
341
+ });
342
+ }
343
+ }
344
+ else {
345
+ kept.push(step);
346
+ steps.push(step);
347
+ }
348
+ }
349
+ const otherWork = steps.some((s) => !isGate(s) && s.kind !== RECORDED_DIGEST_KIND);
350
+ if (lostBuildStep)
351
+ emptied.set(phase.phase, !otherWork && !pinnedHere);
352
+ if (pinnedHere)
353
+ pinned.set(phase.phase, !otherWork);
354
+ // A phase holding only gates after the strip still decides them.
355
+ if (steps.length === 0)
356
+ return undefined;
357
+ return { ...phase, steps };
358
+ };
359
+ const deploy = component.deploy.map(strip).filter((p) => p !== undefined);
360
+ if (publishSteps === 0) {
361
+ return {
362
+ error: `component "${component.name}" has no publish step, so nothing in its deploy carries a recorded digest; ` +
363
+ `${verb} would deploy whatever its current source produces`,
364
+ };
365
+ }
366
+ if (publishSteps > 1) {
367
+ return {
368
+ error: `component "${component.name}" has ${publishSteps} publish steps, but its release record carries one digest`,
369
+ };
370
+ }
371
+ for (const step of kept) {
372
+ const { kind: _kind, ...fields } = step;
373
+ for (const ref of refsIn(fields)) {
374
+ if (ref.kind === "prior-step" && emptied.get(ref.phaseName) === true) {
375
+ return {
376
+ error: `component "${component.name}" reads "@${ref.phaseName}.${ref.field}", an output of a build step ` +
377
+ `${verb} does not run`,
378
+ };
379
+ }
380
+ const readsPinned = (ref.kind === "prior-step" && pinned.get(ref.phaseName) === true && ref.field !== "digest") ||
381
+ (ref.kind === "component-artifact" && ref.componentName === component.name && ref.field !== "digest" && pinned.size > 0);
382
+ if (readsPinned) {
383
+ const spelled = ref.kind === "prior-step" ? `@${ref.phaseName}.${ref.field}` : `@${ref.componentName}.publish.${ref.field}`;
384
+ return {
385
+ error: `component "${component.name}" reads "${spelled}", but ${verb} knows only the recorded digest; ` +
386
+ `wire the digest instead`,
387
+ };
388
+ }
389
+ }
390
+ }
391
+ return { component: { ...component, deploy }, removed };
392
+ }
393
+ /** Every same-project wiring reference anywhere in a step's fields (cross-stack `stackOutput` objects excluded). */
394
+ function refsIn(value) {
395
+ const refs = [];
396
+ const walk = (v) => {
397
+ if (typeof v === "string") {
398
+ const ref = parseWiringRef(v);
399
+ if (ref)
400
+ refs.push(ref);
401
+ }
402
+ else if (Array.isArray(v)) {
403
+ v.forEach(walk);
404
+ }
405
+ else if (v && typeof v === "object" && !("stackOutput" in v)) {
406
+ Object.values(v).forEach(walk);
407
+ }
408
+ };
409
+ walk(value);
410
+ return refs;
411
+ }
412
+ /**
413
+ * A registry whose publish-family capabilities check what they published
414
+ * against the digest being promoted for that component. A mismatch fails the
415
+ * step, which fails the component through the driver's ordinary path. Every
416
+ * other capability is passed through untouched, and the recorded-digest step a
417
+ * rollback's composition carries is added.
418
+ */
419
+ export function checkPublishedDigest(registry, expected) {
420
+ const checked = new CapabilityRegistry();
421
+ if (!registry.has(RECORDED_DIGEST_KIND))
422
+ checked.register(recordedDigestCapability);
423
+ for (const kind of registry.kinds()) {
424
+ const inner = registry.resolve(kind);
425
+ if (!PUBLISH_STEP_KINDS.includes(kind)) {
426
+ checked.register(inner);
427
+ continue;
428
+ }
429
+ const wrapped = {
430
+ kind,
431
+ ...(inner.rollbackPolicy ? { rollbackPolicy: inner.rollbackPolicy } : {}),
432
+ async run(ctx, input) {
433
+ let output;
434
+ try {
435
+ output = await inner.run(ctx, input);
436
+ }
437
+ catch (err) {
438
+ throw new Error(`${kind} could not publish from the build archive: ${err instanceof Error ? err.message : String(err)}. ` +
439
+ `A promote publishes the archive the source release was built from, so it has to run where that archive is on disk`);
440
+ }
441
+ const want = expected.get(ctx.component);
442
+ const got = output?.digest;
443
+ if (want !== undefined && got !== want) {
444
+ throw new Error(`${kind} published ${typeof got === "string" ? got : "no digest"}, but the release being promoted recorded ${want}; ` +
445
+ `the build archive on disk is not the one that release was built from`);
446
+ }
447
+ return output;
448
+ },
449
+ ...(inner.rollback
450
+ ? { rollback: (ctx, input, output) => inner.rollback(ctx, input, output) }
451
+ : {}),
452
+ };
453
+ checked.register(wrapped);
454
+ }
455
+ return checked;
456
+ }
457
+ /**
458
+ * Deploy the plan's components to `plan.to`, in dependency order. A
459
+ * `dependsOn` edge to a component outside the promotion is dropped, the same
460
+ * way a single-component `chant run --components` runs without its
461
+ * dependencies; their outputs come from `componentOutputs`. Returns the
462
+ * driver's result for every outcome, including a failure.
463
+ */
464
+ export async function runPromotion(options) {
465
+ const { plan } = options;
466
+ const names = new Set(plan.items.map((i) => i.component));
467
+ const targets = options.components
468
+ .filter((c) => names.has(c.name))
469
+ .map((c) => ({ ...c, dependsOn: (c.dependsOn ?? []).filter((d) => names.has(d)) }));
470
+ const expected = new Map(plan.items.map((i) => [i.component, i.digest]));
471
+ try {
472
+ return await runInterpretDriver(targets, checkPublishedDigest(options.registry, expected), {
473
+ env: plan.to,
474
+ componentOutputs: options.componentOutputs ?? {},
475
+ // #2574: a gate approval for this promote or rollback is bound to the
476
+ // release it deploys, as well as the environment and composition.
477
+ releases: expected,
478
+ // #3061: the workload's service.version and vcs.ref.head.revision are the earlier release's own.
479
+ releaseIdentity: (component) => {
480
+ const item = plan.items.find((i) => i.component === component);
481
+ return item ? { version: item.digest, revision: item.source.gitSha } : undefined;
482
+ },
483
+ ...(options.onProgress ? { onProgress: options.onProgress } : {}),
484
+ ...(options.gates ? { gates: options.gates } : {}),
485
+ ...(options.now ? { now: options.now } : {}),
486
+ });
487
+ }
488
+ catch (err) {
489
+ if (err instanceof DriverRunFailure)
490
+ return err.result;
491
+ throw err;
492
+ }
493
+ }
494
+ /** Who approved the last gate a component passed in this run, if any. */
495
+ export function gateApprover(result) {
496
+ let approver;
497
+ for (const record of result?.records ?? []) {
498
+ if (record.approval)
499
+ approver = record.approval.resolvedBy;
500
+ }
501
+ return approver;
502
+ }
503
+ /** The fields a promote, a rollback and a redeploy record share: the artifact is the earlier release's own. */
504
+ function sharedRecord(item, env, run) {
505
+ const { source } = item;
506
+ return {
507
+ component: item.component,
508
+ env,
509
+ digest: item.digest,
510
+ gitSha: source.gitSha,
511
+ runId: run.runId,
512
+ ...(run.runOrigin ? { runOrigin: run.runOrigin } : {}),
513
+ timestamp: run.timestamp,
514
+ actor: run.actor,
515
+ ...(run.approver ? { approver: run.approver } : {}),
516
+ ...(source.manifestDigest ? { manifestDigest: source.manifestDigest } : {}),
517
+ ...(source.inputDigest ? { inputDigest: source.inputDigest } : {}),
518
+ };
519
+ }
520
+ /** Name an earlier record the way `promotedFrom`, `restores` and `redeploys` do. */
521
+ function refTo(record) {
522
+ return { env: record.env, runId: record.runId, timestamp: record.timestamp };
523
+ }
524
+ /**
525
+ * The release record a successful promotion appends to the target ledger.
526
+ * The digest, git sha and archive identities are the source release's own,
527
+ * since the artifact is the one built there; `promotedFrom` names that
528
+ * release.
529
+ */
530
+ export function promotionRecord(item, to, run) {
531
+ return { ...sharedRecord(item, to, run), promotedFrom: refTo(item.source) };
532
+ }
533
+ /**
534
+ * The release record a successful rollback appends. Like a promotion's, it
535
+ * carries the restored release's artifact identities; `restores` names that
536
+ * release.
537
+ */
538
+ export function rollbackRecord(item, env, run) {
539
+ return { ...sharedRecord(item, env, run), restores: refTo(item.source) };
540
+ }
541
+ /**
542
+ * The release record a successful redeploy appends. It carries the current
543
+ * release's artifact identities, as a rollback's carries the restored one's;
544
+ * `redeploys` names that release. The environment's current digest does not
545
+ * change, and the record says when it was last put back.
546
+ */
547
+ export function redeployRecord(item, env, run) {
548
+ return { ...sharedRecord(item, env, run), redeploys: refTo(item.source) };
549
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The starter capability registry — one `CapabilityRegistry` pre-seeded with
3
+ * every verb in the starter set (epic #551, issue #554). All stubs; no cloud
4
+ * calls except for the #557/#558 AWS leaves (real implementations).
5
+ *
6
+ * Phase 2 (#559) promotes this convention to a first-class plugin contract
7
+ * (./capability-plugin.ts): the starter verb set now ships as
8
+ * `starterCapabilityPlugin` (./starter-plugin.ts), and `createCapabilityRegistry`
9
+ * below builds its registry from that plugin's `capabilities()` instead of
10
+ * registering each verb inline. This is a pure refactor — same kinds, same
11
+ * capability instances, same registration order — so every existing caller
12
+ * (the driver, the pilots, ./registry.test.ts) is unaffected. New code
13
+ * should prefer `buildCapabilityRegistry` (./capability-plugin-loader.ts),
14
+ * which additionally supports loading third-party capability plugins on top
15
+ * of this same starter set, the way lexicons are discovered today.
16
+ */
17
+ import { CapabilityRegistry } from "./capability.js";
18
+ import { starterCapabilityPlugin, STARTER_VERB_FAMILIES } from "./starter-plugin.js";
19
+ /** Build a fresh `CapabilityRegistry` containing every starter-set verb stub. */
20
+ export function createCapabilityRegistry() {
21
+ const registry = new CapabilityRegistry();
22
+ for (const capability of starterCapabilityPlugin.capabilities()) {
23
+ registry.register(capability);
24
+ }
25
+ return registry;
26
+ }
27
+ /**
28
+ * Every `kind` in the starter verb set, grouped by family — useful for tests
29
+ * and docs generation. Re-exported here (source of truth moved to
30
+ * ./starter-plugin.ts to avoid a module cycle with `starterCapabilityPlugin`)
31
+ * so every existing import of `STARTER_VERB_FAMILIES` from this module keeps
32
+ * working unchanged.
33
+ */
34
+ export { STARTER_VERB_FAMILIES };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Structured progress events for `chant run --components <sel> --progress-json`
3
+ * (behold roadmap M3: a consumer that renders live wave/phase/step progress
4
+ * instead of tailing raw logs).
5
+ *
6
+ * This is purely additive observation over the interpret driver's existing
7
+ * wave -> component -> phase -> step execution loop (./driver.ts): an
8
+ * optional `onProgress` callback, threaded through
9
+ * `runInterpretDriver`/`runComponentDeploy`/`runPhase` (and the CLI's
10
+ * single-component path, ./cli-support.ts's `runComponents`), that never
11
+ * changes run ordering, gating, `onFailure`, rollback, or exit codes — it
12
+ * only reports what already happened, as it happens. See ./driver.ts's
13
+ * module doc for what actually executes; streaming progress from a hosted
14
+ * runtime is a separate, later concern (`chant run status`/`log` already ask
15
+ * one for the run state it keeps).
16
+ *
17
+ * `RunProgressEvent` is a discriminated union on `type`, one JSON object per
18
+ * NDJSON line (see `ndjsonProgressSink` below and
19
+ * ../cli/handlers/run.ts's `--progress-json` wiring).
20
+ */
21
+ /**
22
+ * Build a sink that writes `JSON.stringify(event) + "\n"` to `write` (default:
23
+ * `process.stdout.write`), one line per event, as they happen — the
24
+ * `--progress-json` CLI wiring's sink (../cli/handlers/run.ts, for both the
25
+ * `--components` driver's `RunProgressEvent`s and the Op path's
26
+ * `StepRecord`s, chant #1676). Kept separate from `driver-output.ts`'s
27
+ * end-of-run renderers: this emits *during* the run, one line at a time;
28
+ * `renderDriverJson`/`renderDriverHuman` render the completed
29
+ * `DriverRunResult` once, after the run finishes.
30
+ */
31
+ export function ndjsonProgressSink(write = (s) => void process.stdout.write(s)) {
32
+ return (event) => write(JSON.stringify(event) + "\n");
33
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../src/components/sandbox/driver.ts"],"names":[],"mappings":"AAwCA,MAAM,WAAW,8BAA8B;IAC7C,+EAA+E;IAC/E,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAOD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,8BAA8B,GAAG,MAAM,CAqE7F"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../src/components/sandbox/driver.ts"],"names":[],"mappings":"AA0CA,MAAM,WAAW,8BAA8B;IAC7C,+EAA+E;IAC/E,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAOD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,8BAA8B,GAAG,MAAM,CAqE7F"}