@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,60 @@
1
+ /**
2
+ * Discovery-to-plan wiring for `chant components fan-out` (#2420).
3
+ *
4
+ * `./cli-support.ts` does this for `chant run --components`: the CLI handler
5
+ * stays a thin dispatcher and the component-specific work lives beside the
6
+ * rest of the component subsystem. This is the same seam for the fan-out, and
7
+ * it exists mostly so the join can be tested against a real discovery result
8
+ * without a CLI, a git repo or a cloud.
9
+ *
10
+ * Nothing here decides anything. `componentsForUnits` joins the stack-level
11
+ * change signal to components, `planFanOut` derives the order, and both live
12
+ * in ./fan-out.ts. This finds the components those two need and hands them
13
+ * over.
14
+ */
15
+ import { lexiconNames } from "../lexicon-module.js";
16
+ import { resolveComponentTargets } from "./cli-support.js";
17
+ import { applyConfigDefaults } from "./config-defaults.js";
18
+ import { buildCapabilityRegistry } from "./capability-plugin-loader.js";
19
+ import { componentsForUnits, planFanOut } from "./fan-out.js";
20
+ import { loadChantConfig } from "../config.js";
21
+ const EMPTY_PLAN = { order: [], waves: [], skipped: [], seeds: [], indeterminate: [], digest: "" };
22
+ const EMPTY_SIGNAL = { changed: [], indeterminate: [], unclaimed: [] };
23
+ /**
24
+ * Discover the project's components and derive the fan-out for `units`.
25
+ *
26
+ * Selection is `"all"`'s, borrowed wholesale from `resolveComponentTargets`, so
27
+ * a component a build parameter turned off (`enabled: false`, chant #1522) sits
28
+ * out of a fan-out exactly as it sits out of `chant run --components all`. Two
29
+ * commands disagreeing about which components exist would be worse than either
30
+ * answer on its own.
31
+ *
32
+ * Resolves with `success: false` and an `error` rather than throwing on a
33
+ * discovery failure; a cycle or an unknown `dependsOn` still throws out of
34
+ * `planFanOut`, which is #2417's "refuse by name, before anything is selected".
35
+ */
36
+ export async function deriveFanOut(options) {
37
+ const resolved = await resolveComponentTargets(options.path, "all", options.sandbox, options.buildParams);
38
+ if (!resolved.success) {
39
+ return { success: false, components: [], signal: EMPTY_SIGNAL, plan: EMPTY_PLAN, error: resolved.error };
40
+ }
41
+ const { config } = options.config ? { config: options.config } : await loadChantConfig(options.path);
42
+ const components = resolved.targets.map((component) => applyConfigDefaults(component, config));
43
+ const signal = componentsForUnits(components, options.units);
44
+ const plan = planFanOut({
45
+ components,
46
+ changed: signal.changed,
47
+ ...(signal.indeterminate.length > 0 ? { indeterminate: signal.indeterminate } : {}),
48
+ ...(options.canary?.length ? { canary: options.canary } : {}),
49
+ });
50
+ return { success: true, components, signal, plan };
51
+ }
52
+ /**
53
+ * The capability registry a fan-out dispatches through — the project's own,
54
+ * built exactly the way `runComponents` builds it, so a fan-out and a
55
+ * `chant run --components` of the same component reach the same leaves.
56
+ */
57
+ export async function fanOutRegistry(path, config) {
58
+ const resolved = config ?? (await loadChantConfig(path)).config;
59
+ return buildCapabilityRegistry({ plugins: resolved.capabilities, lexicons: lexiconNames(resolved.lexicons) });
60
+ }
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Fan a change out downstream, in an order derived from the source (#2417).
3
+ *
4
+ * The order was never the missing piece. `resolveComponentGraph` (./driver.ts)
5
+ * already Kahn-layers a component set by `dependsOn` into parallel-safe waves,
6
+ * flattens to a topological order, refuses a cycle by name and refuses a
7
+ * `dependsOn` it has not been given. What it cannot do is order a *subset*:
8
+ * hand it the affected components alone and it throws `UnknownDependencyError`,
9
+ * because a selected component still names a dependency that is not in the set.
10
+ *
11
+ * That is what this module is. Given every component in the project and the
12
+ * ones whose inputs moved, it derives who else has to run, in what order, what
13
+ * has to be seeded because it is deliberately not running, and one digest that
14
+ * identifies the whole derivation so a single gate can be bound to it.
15
+ *
16
+ * ## Why derived rather than declared
17
+ *
18
+ * The competing shape is a registry where you write down that component B
19
+ * depends on component A. That registry is a second statement of a relationship
20
+ * the source already makes, and it is wrong the first time somebody adds a
21
+ * reference without updating it. `dependsOn` is in the component; the graph is
22
+ * a walk over it.
23
+ *
24
+ * ## Three outcomes, never two
25
+ *
26
+ * A component is selected, skipped as unaffected, or **indeterminate** — the
27
+ * same third answer `../lifecycle/affected.ts` already refuses to collapse. A
28
+ * component whose inputs arrive at deploy time cannot be judged from a source
29
+ * diff, so it is reported rather than guessed at in either direction. Fanning
30
+ * out to everything on any change is easy to build, worth nothing, and reads
31
+ * exactly like diligence in a log.
32
+ *
33
+ * This plans; it does not run. Executing the plan is ./driver.ts's job.
34
+ */
35
+ import { resolveComponentGraph } from "./driver.js";
36
+ import { deployUnits } from "./deploy-units.js";
37
+ import { computePlanDigest } from "../lifecycle/plan-digest.js";
38
+ import { layerWaves } from "../gated-waves.js";
39
+ /** Thrown when `changed` or `indeterminate` names a component the project does not have. */
40
+ export class UnknownComponentError extends Error {
41
+ constructor(field, component, known) {
42
+ super(`${field} names "${component}", which is not a component in this project ` +
43
+ `(known: ${known.join(", ") || "none"})`);
44
+ this.field = field;
45
+ this.component = component;
46
+ this.name = "UnknownComponentError";
47
+ }
48
+ }
49
+ /** Reverse the `dependsOn` edges: who has to re-run when this one moves. */
50
+ function consumersOf(components) {
51
+ const consumers = new Map();
52
+ for (const c of components) {
53
+ for (const dep of c.dependsOn ?? []) {
54
+ const existing = consumers.get(dep);
55
+ if (existing)
56
+ existing.push(c.name);
57
+ else
58
+ consumers.set(dep, [c.name]);
59
+ }
60
+ }
61
+ return consumers;
62
+ }
63
+ /**
64
+ * Derive the fan-out for a change.
65
+ *
66
+ * Refuses a cycle and an unknown `dependsOn` before selecting anything, by
67
+ * resolving the **full** graph first — a broken graph is a broken graph whether
68
+ * or not the change happens to touch the broken part, and finding out halfway
69
+ * through a fan-out is worse than finding out before it starts.
70
+ */
71
+ export function planFanOut(request) {
72
+ const { components, changed, indeterminate = [], inputDigests, canary = [] } = request;
73
+ // Refuses DependencyCycleError / UnknownDependencyError over the whole graph.
74
+ // Its `order` is deliberately not used: `topoSort` walks in declaration
75
+ // order, so two projects with the same graph and a different file layout
76
+ // would derive different-looking fan-outs and digest differently. The waves
77
+ // below are canonical, and this plan's order is their flattening.
78
+ resolveComponentGraph(components);
79
+ const byName = new Map(components.map((c) => [c.name, c]));
80
+ for (const name of changed) {
81
+ if (!byName.has(name))
82
+ throw new UnknownComponentError("changed", name, [...byName.keys()].sort());
83
+ }
84
+ for (const name of indeterminate) {
85
+ if (!byName.has(name))
86
+ throw new UnknownComponentError("indeterminate", name, [...byName.keys()].sort());
87
+ }
88
+ // Everything reachable downstream of a changed component, transitively. A
89
+ // component reached by two paths is added once, which is the diamond case.
90
+ const consumers = consumersOf(components);
91
+ const selected = new Set(changed);
92
+ const queue = [...changed];
93
+ while (queue.length > 0) {
94
+ const node = queue.shift();
95
+ for (const consumer of consumers.get(node) ?? []) {
96
+ if (selected.has(consumer))
97
+ continue;
98
+ selected.add(consumer);
99
+ queue.push(consumer);
100
+ }
101
+ }
102
+ // Waves over the selected subgraph only. An unselected dependency is already
103
+ // applied, so it is not a reason for its dependents to wait. The layering is
104
+ // the one terragucci calls without components (../gated-waves.ts).
105
+ // resolveComponentGraph already refused every cycle in the full graph, and a
106
+ // subgraph of an acyclic graph is acyclic, so it cannot stall.
107
+ const waves = layerWaves([...selected].map((name) => ({ name, dependsOn: byName.get(name).dependsOn ?? [] })), { canary, known: [...byName.keys()] });
108
+ // Every dependency lands in an earlier wave than its dependents, except
109
+ // where a canary list put a dependent first on purpose, so the flattening is
110
+ // a topological order, and a sorted one.
111
+ const order = waves.flat();
112
+ const seeds = [
113
+ ...new Set(order.flatMap((name) => (byName.get(name).dependsOn ?? []).filter((d) => !selected.has(d)))),
114
+ ].sort();
115
+ const unreachedIndeterminate = indeterminate.filter((name) => !selected.has(name)).sort();
116
+ const indeterminateSet = new Set(unreachedIndeterminate);
117
+ const skipped = [...byName.keys()]
118
+ .filter((name) => !selected.has(name))
119
+ .sort()
120
+ .map((component) => ({
121
+ component,
122
+ reason: indeterminateSet.has(component) ? "indeterminate" : "unaffected",
123
+ }));
124
+ // What the approver is approving: who runs, in what order, off which edges,
125
+ // and — when the caller knows it — what each one would apply. Never the run
126
+ // id or the moment, per ../lifecycle/plan-digest.ts's rules, so re-deriving
127
+ // an unchanged fan-out does not expire an approval.
128
+ const digest = computePlanDigest("component-fan-out", {
129
+ order,
130
+ waves,
131
+ seeds,
132
+ edges: order.map((name) => ({ component: name, dependsOn: [...(byName.get(name).dependsOn ?? [])].sort() })),
133
+ ...(inputDigests
134
+ ? { inputs: order.map((name) => ({ component: name, digest: inputDigests[name] ?? null })) }
135
+ : {}),
136
+ });
137
+ return { order, waves, skipped, seeds, indeterminate: unreachedIndeterminate, digest };
138
+ }
139
+ /**
140
+ * Join a stack-level change signal to the components that deploy those stacks.
141
+ *
142
+ * The key is `deployUnits` (./deploy-units.ts), which already answers "what
143
+ * live units does this component's composition target" for `chant components
144
+ * status --live`. Reusing it means a component's claim on a stack is stated
145
+ * once, by its deploy steps, rather than restated in a fan-out config — the
146
+ * same argument this module's doc makes about `dependsOn`.
147
+ *
148
+ * Changed beats indeterminate. A component deploying one stack that certainly
149
+ * moved and another that could not be judged is changed: the certainty already
150
+ * decides it, and reporting it as indeterminate would lose that.
151
+ */
152
+ export function componentsForUnits(components, units) {
153
+ const changedUnits = new Set(units.changed);
154
+ const indeterminateUnits = new Set(units.indeterminate ?? []);
155
+ const changed = [];
156
+ const indeterminate = [];
157
+ const claimed = new Set();
158
+ for (const component of components) {
159
+ const names = deployUnits(component.deploy).map((u) => u.unit);
160
+ let touchesChanged = false;
161
+ let touchesIndeterminate = false;
162
+ for (const name of names) {
163
+ if (changedUnits.has(name)) {
164
+ touchesChanged = true;
165
+ claimed.add(name);
166
+ }
167
+ if (indeterminateUnits.has(name)) {
168
+ touchesIndeterminate = true;
169
+ claimed.add(name);
170
+ }
171
+ }
172
+ if (touchesChanged)
173
+ changed.push(component.name);
174
+ else if (touchesIndeterminate)
175
+ indeterminate.push(component.name);
176
+ }
177
+ const unclaimed = [...changedUnits, ...indeterminateUnits].filter((u) => !claimed.has(u));
178
+ return {
179
+ changed: changed.sort(),
180
+ indeterminate: indeterminate.sort(),
181
+ unclaimed: [...new Set(unclaimed)].sort(),
182
+ };
183
+ }
184
+ /**
185
+ * Components inside `within` that are transitively downstream of any of
186
+ * `roots`, each mapped to the **root** it was reached from rather than to its
187
+ * immediate parent — so a report names the one thing to fix instead of the
188
+ * nearest consequence of it.
189
+ *
190
+ * `roots` is sorted before the walk, so a component downstream of two separate
191
+ * roots always names the same one. Unsorted, the answer would depend on the
192
+ * order the caller listed them in, which is not a fact about anything.
193
+ *
194
+ * Shared by {@link remainingFanOut}, which needs it over a whole plan, and by
195
+ * the runner in ./fan-out-run.ts, which needs it as failures accumulate.
196
+ */
197
+ export function downstreamWithin(components, within, roots) {
198
+ const inside = new Set(within);
199
+ const consumers = consumersOf(components);
200
+ const rootSet = new Set(roots);
201
+ const reached = new Map();
202
+ const queue = [...roots].sort();
203
+ while (queue.length > 0) {
204
+ const node = queue.shift();
205
+ const blamed = rootSet.has(node) ? node : reached.get(node);
206
+ for (const consumer of consumers.get(node) ?? []) {
207
+ if (!inside.has(consumer) || rootSet.has(consumer) || reached.has(consumer))
208
+ continue;
209
+ reached.set(consumer, blamed);
210
+ queue.push(consumer);
211
+ }
212
+ }
213
+ return reached;
214
+ }
215
+ /**
216
+ * Narrow a plan to what still has to run.
217
+ *
218
+ * **The digest does not change.** That is the whole point: an operator approved
219
+ * a fan-out, a component in the middle of it failed, and finishing the work
220
+ * they already approved must not ask them to approve it again. `remainingFanOut`
221
+ * returns the same `digest` the original derivation produced, so the standing
222
+ * resolution still satisfies the gate on the next attempt. Re-deriving with
223
+ * {@link planFanOut} would mint a new identity and invalidate the approval,
224
+ * which is why resume narrows a plan rather than recomputing one.
225
+ *
226
+ * **A component beneath a failure is `blocked`, never `failed`.** Nothing about
227
+ * it failed. It did not run because the value it would have read never landed,
228
+ * and the distinction is what makes the next attempt legible: an operator
229
+ * reading `blocked by "cluster-a"` knows to fix one thing, not fourteen.
230
+ *
231
+ * **Independent branches keep going.** The order was derived from the source,
232
+ * so a branch that shares no edge with the failure is *known* to be independent
233
+ * rather than assumed to be. Stopping it is the conservative-looking choice
234
+ * that throws away the reason for deriving the graph in the first place.
235
+ */
236
+ export function remainingFanOut(plan, components, progress) {
237
+ const byName = new Map(components.map((c) => [c.name, c]));
238
+ const planned = new Set(plan.order);
239
+ const completed = new Set((progress.completed ?? []).filter((n) => planned.has(n)));
240
+ const failed = new Set((progress.failed ?? []).filter((n) => planned.has(n)));
241
+ const blockedBy = downstreamWithin(components, planned, [...failed]);
242
+ const runnable = new Set(plan.order.filter((n) => !completed.has(n) && !failed.has(n) && !blockedBy.has(n)));
243
+ // Re-layer what is left. A dependency that already applied is satisfied, so
244
+ // it does not hold its dependents back — the same rule the original
245
+ // derivation applies to a dependency outside the selection.
246
+ const remaining = new Set(runnable);
247
+ const deps = new Map([...runnable].map((n) => [n, new Set((byName.get(n)?.dependsOn ?? []).filter((d) => runnable.has(d)))]));
248
+ const waves = [];
249
+ while (remaining.size > 0) {
250
+ const wave = [...remaining].filter((n) => [...deps.get(n)].every((d) => !remaining.has(d))).sort();
251
+ for (const n of wave)
252
+ remaining.delete(n);
253
+ waves.push(wave);
254
+ }
255
+ const order = waves.flat();
256
+ // A completed component's outputs have to be seeded for a reference to
257
+ // resolve, exactly like a component that was never selected.
258
+ const seeds = [
259
+ ...new Set([
260
+ ...plan.seeds,
261
+ ...order.flatMap((n) => (byName.get(n)?.dependsOn ?? []).filter((d) => !runnable.has(d))),
262
+ ]),
263
+ ].sort();
264
+ const carried = plan.skipped.filter((s) => !runnable.has(s.component));
265
+ const skipped = [
266
+ ...carried,
267
+ ...[...completed].sort().map((component) => ({ component, reason: "already-applied" })),
268
+ ...[...blockedBy.entries()]
269
+ .sort(([a], [b]) => a.localeCompare(b))
270
+ .map(([component, by]) => ({ component, reason: "blocked", blockedBy: by })),
271
+ ].sort((a, b) => a.component.localeCompare(b.component));
272
+ return { order, waves, skipped, seeds, indeterminate: plan.indeterminate, digest: plan.digest };
273
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The plan a component gate approval is bound to (#2574).
3
+ *
4
+ * An Op gate binds the digest of the change set its Plan phase produced
5
+ * (#2300). A component has no Plan phase: what it will do is its composition,
6
+ * run against one environment. So the digest is taken over that, with the
7
+ * same `computePlanDigest` Op gates use.
8
+ *
9
+ * ## What it covers
10
+ *
11
+ * - The environment. An approval for staging never answers prod.
12
+ * - The composition as this run executes it: `deploy` and `rollback` phases
13
+ * with every step's authored input. A promote and a rollback run a
14
+ * transformed composition (`./promote.ts`), and a rollback's pins the
15
+ * recorded digest into it, so each differs from a plain deploy's.
16
+ * - The release being deployed, when the caller names one. A promote checks
17
+ * its publish output against a recorded digest that is not in the
18
+ * composition, so it passes that digest here.
19
+ * - `vars`, the environment config the caller resolved ahead of the run.
20
+ *
21
+ * ## What it leaves out
22
+ *
23
+ * Anything decided during the run: outputs of earlier phases (a fresh build's
24
+ * digest differs on every build that is not reproducible, and binding it
25
+ * would make an approval unusable by the run that consumes it) and outputs of
26
+ * upstream components. The run id and the time are left out for the reasons
27
+ * `../lifecycle/plan-digest.ts` gives.
28
+ */
29
+ import { computePlanDigest } from "../lifecycle/plan-digest.js";
30
+ /** The plan digest a component gate records and approves. */
31
+ export function componentPlanDigest(plan) {
32
+ const { component } = plan;
33
+ return computePlanDigest("component-deploy", {
34
+ environment: plan.environment,
35
+ component: component.name,
36
+ deploy: component.deploy,
37
+ rollback: component.rollback ?? null,
38
+ vars: plan.vars ?? null,
39
+ release: plan.release ?? null,
40
+ });
41
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The jobs of a generated gated-wave pipeline (#3049): one CI job per wave.
3
+ *
4
+ * The ruling in #3347 puts gated waves on forge CI by default, a job per
5
+ * wave, with approvals on `chant/lifecycle`. Each forge's generator (the
6
+ * gitlab and github lexicons) takes these jobs and adds its own transport;
7
+ * the commands and the order live here so the two cannot disagree.
8
+ *
9
+ * Job `wave-k` runs `chant components fan-out --wave-gate <gate> --wave k`.
10
+ * It derives the fan-out from the change, plans wave k against the outputs
11
+ * the record holds, decides that wave's gate and applies it. The attempt
12
+ * record (`--resume`) is the artifact handed from job to job: it says which
13
+ * components applied and what they exposed. A gate nobody approved exits 3,
14
+ * which fails the job; after `chant approve fan-out <gate>-wave-<k> --plan
15
+ * <digest>`, re-running that job carries on.
16
+ *
17
+ * How many jobs: the waves of the whole component graph, with the canary list
18
+ * in front. A change selects a subset, and a subset never layers deeper than
19
+ * the graph it came from, so a job past the change's last wave finds nothing
20
+ * to run and exits 0.
21
+ */
22
+ import { layerWaves } from "../gated-waves.js";
23
+ /** Where each wave job keeps the attempt record it hands the next one. */
24
+ export const GATED_WAVE_RECORD = ".chant/fan-out.json";
25
+ /** One job per possible wave, in order, each needing the one before. */
26
+ export function gatedWaveJobs(components, env, options) {
27
+ const count = layerWaves(components.map((c) => ({ name: c.name, dependsOn: c.dependsOn ?? [] })), { ...(options.canary?.length ? { canary: options.canary } : {}) }).length;
28
+ const jobs = [];
29
+ for (let wave = 1; wave <= count; wave++) {
30
+ jobs.push({
31
+ wave,
32
+ jobName: `wave-${wave}`,
33
+ needs: wave > 1 ? [`wave-${wave - 1}`] : [],
34
+ command: [
35
+ "chant", "components", "fan-out",
36
+ "--base", options.base ?? "HEAD~1",
37
+ "--env", env,
38
+ "--wave-gate", options.gate,
39
+ ...(options.canary?.length ? ["--canary", options.canary.join(",")] : []),
40
+ "--wave", String(wave),
41
+ "--resume", GATED_WAVE_RECORD,
42
+ ],
43
+ });
44
+ }
45
+ return jobs;
46
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Component-native release orchestration — capability contract, starter verb
3
+ * set, and the thin interpret driver (epic #551, #554/#556). The pilot AWS
4
+ * leaves have real implementations over an injectable `CloudExecutor` (#557);
5
+ * every other verb remains a typed stub. See https://intentius.io/chant/components/orchestration/
6
+ */
7
+ export { phase, gate, stackOutput, inferArchetype, projectToJson, isComponent, } from "./component.js";
8
+ export { discoverComponents, } from "./discover.js";
9
+ export { listComponents, describeComponent, computeComponentGraph, generateComponentsPipeline, runComponents, findComponentGate, resolveComponentTargets, } from "./cli-support.js";
10
+ export { renderDriverHuman, renderDriverJson } from "./driver-output.js";
11
+ export { CapabilityRegistry, CapabilityNotImplementedError, } from "./capability.js";
12
+ export { createCapabilityRegistry, STARTER_VERB_FAMILIES } from "./registry.js";
13
+ export { isCapabilityPlugin, } from "./capability-plugin.js";
14
+ export { CapabilityManifestSchema, validateCapabilityManifest, } from "./capability-plugin-schema.js";
15
+ export { loadCapabilityPlugin, loadCapabilityPlugins, registerCapabilityPlugins, buildCapabilityRegistry, MalformedCapabilityPluginError, DuplicateCapabilityKindError, } from "./capability-plugin-loader.js";
16
+ export { starterCapabilityPlugin } from "./starter-plugin.js";
17
+ export * from "./verbs/index.js";
18
+ export * from "./builders.js";
19
+ export { resolveComponentGraph, resolveWiring, resolveStepInput, collectComponentOutputs, accumulateComponentOutputs, runComponentDeploy, runInterpretDriver, DependencyCycleError, UnknownDependencyError, DriverRunFailure, } from "./driver.js";
20
+ export { planFanOut, componentsForUnits, remainingFanOut, downstreamWithin, UnknownComponentError, } from "./fan-out.js";
21
+ export { runFanOut, } from "./fan-out-run.js";
22
+ export { renderFanOutPlan, renderFanOutHuman, renderFanOutJson, } from "./fan-out-output.js";
23
+ export { deriveFanOut, fanOutRegistry, } from "./fan-out-support.js";
24
+ export { EcsFargateComponent, LambdaComponent, SingleHostComposeComponent, } from "./presets/index.js";
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Kahn layering over a plain name graph: the wave computation
3
+ * `resolveComponentGraph` (./driver.ts) runs for `chant components fan-out`.
4
+ *
5
+ * It lives on its own, with no imports, so code that needs the same order
6
+ * without the driver can take it. The terraform lexicon's pin-bump rollout
7
+ * (#3189) orders roots with it, and that code has to bundle without the
8
+ * driver's gate and ledger modules (#3421).
9
+ */
10
+ /**
11
+ * Split `deps` (name -> the names it depends on) into waves. A name is ready
12
+ * once every dependency it names has been placed in an earlier wave. Names in
13
+ * one wave are sorted. A dependency that is not a key of `deps` is the caller's
14
+ * to refuse or drop first: here it never becomes ready, so it reads as a cycle.
15
+ */
16
+ export function kahnLayers(deps) {
17
+ const remaining = new Set(deps.keys());
18
+ const waves = [];
19
+ while (remaining.size > 0) {
20
+ const wave = [...remaining].filter((n) => [...deps.get(n)].every((d) => !remaining.has(d))).sort();
21
+ if (wave.length === 0)
22
+ return { cycle: [...remaining].sort() };
23
+ for (const n of wave)
24
+ remaining.delete(n);
25
+ waves.push(wave);
26
+ }
27
+ return { waves };
28
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Persist a component run's `BuildArchiveManifest` after a successful `chant
3
+ * run --components <name> --env <env>` (#609, epic #551 follow-up to
4
+ * #564/#568/#606/#613/#614). Mirrors ./auto-release.ts's shape exactly —
5
+ * same "extract from step records, then call a lifecycle-layer writer, then
6
+ * push, and never let a write failure fail an already-successful deploy"
7
+ * structure — because it is solving the same class of problem: the driver
8
+ * produces something worth recording durably, but the driver itself must
9
+ * stay capability-agnostic (../components/driver.ts takes no dependency on
10
+ * ../lifecycle/*), so the CLI performs the write as a post-run step.
11
+ *
12
+ * **Why here, not the driver.** Same reasoning as ./auto-release.ts's module
13
+ * doc: a manifest write is a git commit + push, a non-idempotent side effect
14
+ * with real-world I/O — exactly what `driver.ts` resists taking on (it is
15
+ * exercised in tests against a bare `CapabilityRegistry` with no lifecycle
16
+ * dependency at all). The CLI calls this after `runComponents` reports
17
+ * success, the same place `maybeRecordAutoRelease` is already called from
18
+ * (../cli/handlers/run.ts).
19
+ *
20
+ * **Extraction is duck-typed, not capability-specific.** `docker-build`,
21
+ * `generate-sbom`, `extract-config-bom`, and `addArchiveTemplate` (the
22
+ * build-family capabilities/helpers, ../components/verbs/build.ts,
23
+ * ./verbs/sbom.ts, ./verbs/config-bom.ts) all return `{ ..., manifest:
24
+ * BuildArchiveManifest }` — the accumulation convention documented on each of
25
+ * their inputs ("manifest to extend... same accumulation convention"). This
26
+ * module scans a run's step outputs for that shape, exactly the way
27
+ * ./auto-release.ts's `extractRunDigest` scans for a publish-shaped output,
28
+ * so a new build-family capability that follows the same `{ manifest }`
29
+ * output convention is picked up automatically — no branch here names a
30
+ * specific capability `kind`.
31
+ */
32
+ import { persistBuildManifest } from "../lifecycle/build-ledger-store.js";
33
+ import { pushLifecycle } from "../lifecycle/git.js";
34
+ /** A step output shaped like it carries a `BuildArchiveManifest` — duck-typed the same way ./auto-release.ts's `isPublishShaped` detects a publish result. */
35
+ function isManifestShaped(output) {
36
+ return (!!output &&
37
+ typeof output === "object" &&
38
+ "manifest" in output &&
39
+ !!output.manifest &&
40
+ typeof output.manifest === "object");
41
+ }
42
+ /**
43
+ * Find the most fully-accumulated `BuildArchiveManifest` a component run
44
+ * produced, by scanning its step records for the last manifest-bearing
45
+ * output — mirroring `extractRunDigest`'s "last wins" convention, which is
46
+ * also the correct one here: every build-family capability's `manifest`
47
+ * input/output accumulates onto whatever manifest came before it in the same
48
+ * phase (see ../components/verbs/build.ts's `DockerBuildInput.manifest`
49
+ * doc), so the *last* manifest-bearing step output in run order is always
50
+ * the fullest one — a template + SBOM + config-BOM composition's final step
51
+ * carries every earlier entry too, not just its own.
52
+ */
53
+ export function extractRunManifest(records) {
54
+ let found;
55
+ for (const record of records) {
56
+ if (record.status !== "ok")
57
+ continue;
58
+ if (isManifestShaped(record.output)) {
59
+ found = record.output.manifest;
60
+ }
61
+ }
62
+ return found;
63
+ }
64
+ /**
65
+ * After a successful `chant run --components <name> --env <env>` (local
66
+ * executor), persist the run's accumulated `BuildArchiveManifest` (if any)
67
+ * to the durable build-manifest store (../lifecycle/build-ledger-store.ts)
68
+ * and push it — or explain, without throwing, why it didn't. Never called
69
+ * for a failed run, matching `maybeRecordAutoRelease`'s contract exactly.
70
+ *
71
+ * Skips (returns `{ persisted: false, reason }`, never throws):
72
+ * - `options.disabled` — the opt-out flag/config was set.
73
+ * - `run.success` false — defensive; callers should not reach here on
74
+ * failure. A dry-run/failed deploy persists nothing, by construction —
75
+ * this is also what makes a dry run safe: `chant run --components` never
76
+ * calls this function at all unless the run actually completed.
77
+ * - no manifest found in the run's records — a component with no
78
+ * build-family step (an infra-only/apply-only component, or a
79
+ * build-less `Publish`-only producer that reused a prior archive) has
80
+ * nothing to persist. This is the expected common case for most deploys,
81
+ * not an error.
82
+ *
83
+ * Write/push failures (any error `persistBuildManifest`/`pushLifecycle`
84
+ * throw) are reported as `{ persisted: false, reason: "error", error }`
85
+ * rather than propagated — same "never turn a successful deploy into a
86
+ * failing CLI invocation" contract `maybeRecordAutoRelease` already
87
+ * establishes for release records.
88
+ */
89
+ export async function maybePersistBuildManifest(run, options = {}) {
90
+ if (options.disabled) {
91
+ return { persisted: false, reason: "opted-out" };
92
+ }
93
+ if (!run.success) {
94
+ return { persisted: false, reason: "run-not-successful" };
95
+ }
96
+ const manifest = run.manifest ?? extractRunManifest(run.records ?? []);
97
+ if (!manifest) {
98
+ return { persisted: false, reason: "no-manifest" };
99
+ }
100
+ try {
101
+ const { commit } = await persistBuildManifest(manifest, { cwd: options.cwd });
102
+ await pushLifecycle({ cwd: options.cwd });
103
+ return { persisted: true, commit, manifestDigest: manifest.manifestDigest };
104
+ }
105
+ catch (err) {
106
+ return { persisted: false, reason: "error", error: err instanceof Error ? err.message : String(err) };
107
+ }
108
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Pilot: ALB/ECS target (#555, epic #551).
3
+ *
4
+ * Exercises the build + cross-stack axes: `docker-build` →
5
+ * `publish-image` (promote by digest, deploy-time) → `cfn-deploy` (importing
6
+ * the shared ALB's listener/cluster/subnets as cross-stack outputs, resolved
7
+ * by `chant graph --stacks` rather than a `describe-stacks | jq` pipeline
8
+ * step — see composition-and-wiring.mdx#cross-stack-outputs) →
9
+ * `ecs-update-service` → `wait-steady-state` + `health-gate`.
10
+ *
11
+ * This is the direct component-native replacement for the hand-rolled GitLab
12
+ * pipeline in `examples/gitlab-aws-alb-services/src/pipeline.ts`: the
13
+ * `describe-stacks`/`jq` glue in that pipeline's `deployServices` job is
14
+ * exactly the cross-stack `stackOutput()` wiring below, and its
15
+ * `docker build`/`docker push` steps are the `docker-build` + `publish-image`
16
+ * capabilities. `service` archetype: build → publish → apply → verify, the
17
+ * fullest of the three archetypes.
18
+ *
19
+ * It declares no component-level `rollback` phase (#2576). It used to declare
20
+ * one holding a `rollback-previous` step with only `service` and `cluster`,
21
+ * which the aws capability turned into an `aws ecs update-service` with no
22
+ * changes. Taking an environment back to an earlier recorded release is
23
+ * `chant components rollback` (#2531).
24
+ *
25
+ * The JSON projection of this pilot is authoritative at
26
+ * ../__fixtures__/alb-ecs-service.json (already schema-validated by
27
+ * component-schema.test.ts) — this module is the real typed `Component`
28
+ * authoring form (#560, ../component.ts) that composes to that same
29
+ * document; see ./pilots.test.ts, which asserts the two never diverge.
30
+ */
31
+ import { phase, stackOutput } from "../component.js";
32
+ /** The shared ALB stack's exported outputs this service imports — the cross-stack wiring axis. */
33
+ const sharedAlbOutputs = {
34
+ listenerArn: stackOutput("shared-alb", "ListenerArn"),
35
+ clusterArn: stackOutput("shared-alb", "ClusterArn"),
36
+ subnets: stackOutput("shared-alb", "Subnets"),
37
+ };
38
+ export const searchService = {
39
+ name: "search-service",
40
+ archetype: "service",
41
+ dependsOn: ["shared-alb"],
42
+ build: { kind: "docker-build", context: ".", into: "archive" },
43
+ deploy: [
44
+ phase("Publish", [{ kind: "publish-image", from: "archive", to: "$env.registry" }]),
45
+ phase("Apply", [
46
+ {
47
+ kind: "cfn-deploy",
48
+ template: "archive:search.template.json",
49
+ imageRef: "@Publish.digest",
50
+ inputs: sharedAlbOutputs,
51
+ },
52
+ { kind: "ecs-update-service", cluster: "$env.cluster", service: "search" },
53
+ ]),
54
+ phase("Verify", [
55
+ { kind: "wait-steady-state", service: "search" },
56
+ { kind: "health-gate", path: "/healthz" },
57
+ ]),
58
+ ],
59
+ };