@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,288 @@
1
+ /**
2
+ * Vulnerability scanning of an already-generated SBOM (#626, epic #551
3
+ * supply-chain follow-up to the SBOM stack #606/#613/#614/#609/#610). An SBOM
4
+ * says *what's in* an artifact; a scanner says *which of those have known
5
+ * CVEs*. This module produces findings; ./vex.ts suppresses the ones that
6
+ * don't matter and ./vuln-gate.ts fails the deploy on the ones that do.
7
+ *
8
+ * Prefer scanning the **SBOM** (already generated + persisted, keyed by
9
+ * digest) over re-scanning the image: deterministic (same SBOM -> same
10
+ * findings), fast, and reuses work already done. Real backends shell out to
11
+ * `grype`/`trivy` through the injectable `ProcessRunner` (./process-runner.ts),
12
+ * exactly like ./tool-sbom-generator.ts's deep-scan backend — tests inject an
13
+ * inline fake `VulnScanner` (an object literal with a canned `scan()`, see
14
+ * ./vuln-gate.test.ts) and never invoke a real scanner, network, or vuln DB.
15
+ * The scanner's vuln DB currency is the tool's job, not chant's.
16
+ *
17
+ * `createDatabaseVulnScanner` (ws-056, INTENTIUS/chant#2735) is the one
18
+ * hermetic exception: a `VulnScanner` matched against a local, offline
19
+ * advisory-database file instead of a real scanner binary — no `grype`/
20
+ * `trivy` required, deterministic, at the cost of covering only the
21
+ * advisories the database names. Ported from chud's `supply-chain.mjs`
22
+ * (`scanWithDatabase`/`sbomPackages`/`compareVersions`), which built its own
23
+ * copy of this because `scan-vulnerabilities` had no offline backend.
24
+ */
25
+ import { readFileSync, writeFileSync } from "node:fs";
26
+ import { tmpdir } from "node:os";
27
+ import { join } from "node:path";
28
+ import { createHash } from "node:crypto";
29
+ import { defaultProcessRunner, q, requireTool, ToolNotAvailableError } from "./process-runner.js";
30
+ /** Severity rank (higher = more severe) so a gate can ask "severity >= critical". */
31
+ export const SEVERITY_RANK = {
32
+ critical: 5,
33
+ high: 4,
34
+ medium: 3,
35
+ low: 2,
36
+ negligible: 1,
37
+ unknown: 0,
38
+ };
39
+ /** Normalize a scanner's free-form severity string ("High", "CRITICAL", "Negligible", …) to a `Severity`. Unrecognized -> `unknown`. */
40
+ export function normalizeSeverity(raw) {
41
+ const s = (raw ?? "").toLowerCase();
42
+ if (s === "critical" || s === "high" || s === "medium" || s === "low" || s === "negligible")
43
+ return s;
44
+ return "unknown";
45
+ }
46
+ /** Parse `grype -o json` stdout into findings. Exported for tests to assert parsing without a live tool. */
47
+ export function parseGrypeOutput(stdout) {
48
+ const doc = JSON.parse(stdout);
49
+ return (doc.matches ?? []).map((m) => {
50
+ const fixVersions = m.vulnerability?.fix?.versions ?? [];
51
+ const epss = m.vulnerability?.epss?.[0];
52
+ const kev = m.vulnerability?.knownExploited?.[0];
53
+ return {
54
+ cveId: m.vulnerability?.id ?? "UNKNOWN",
55
+ severity: normalizeSeverity(m.vulnerability?.severity),
56
+ package: m.artifact?.name ?? "unknown",
57
+ installedVersion: m.artifact?.version ?? "",
58
+ fixedVersion: fixVersions[0],
59
+ fixable: m.vulnerability?.fix?.state === "fixed" || fixVersions.length > 0,
60
+ epss: epss?.epss,
61
+ epssPercentile: epss?.percentile,
62
+ // grype omits `knownExploited` for a non-KEV vuln, so `undefined` here
63
+ // means "no KEV annotation reported" — never coerced to `false`.
64
+ inKev: kev ? true : undefined,
65
+ kevDateAdded: kev?.dateAdded,
66
+ kevDueDate: kev?.dueDate,
67
+ // KEV's ransomware field is "known"/"unknown" — "unknown" is not "no",
68
+ // so only an explicit "known" becomes `true`; everything else stays unset.
69
+ kevRansomware: kev?.knownRansomwareCampaignUse?.toLowerCase() === "known" ? true : undefined,
70
+ };
71
+ });
72
+ }
73
+ /** Parse `trivy sbom --format json` stdout into findings. */
74
+ export function parseTrivyOutput(stdout) {
75
+ const doc = JSON.parse(stdout);
76
+ const out = [];
77
+ for (const r of doc.Results ?? []) {
78
+ for (const v of r.Vulnerabilities ?? []) {
79
+ out.push({
80
+ cveId: v.VulnerabilityID ?? "UNKNOWN",
81
+ severity: normalizeSeverity(v.Severity),
82
+ package: v.PkgName ?? "unknown",
83
+ installedVersion: v.InstalledVersion ?? "",
84
+ fixedVersion: v.FixedVersion || undefined,
85
+ fixable: Boolean(v.FixedVersion),
86
+ });
87
+ }
88
+ }
89
+ return out;
90
+ }
91
+ /**
92
+ * The packages an SPDX or CycloneDX document lists, by purl (SPDX's
93
+ * `externalRefs` with `referenceType: "purl"`, CycloneDX's `components[].purl`),
94
+ * deduplicated by ecosystem/name/version. Parses `doc.bytes` (a string, as
95
+ * every `SbomDocument` carries it) rather than requiring a pre-parsed object,
96
+ * so a caller can pass a `scan-vulnerabilities` input's `sbom` straight
97
+ * through.
98
+ */
99
+ export function sbomPackages(doc) {
100
+ const parsed = JSON.parse(doc.bytes);
101
+ const purls = [
102
+ ...(parsed.packages ?? []).flatMap((p) => (p.externalRefs ?? []).filter((r) => r.referenceType === "purl").map((r) => r.referenceLocator ?? "")),
103
+ ...(parsed.components ?? []).map((c) => c.purl).filter((p) => Boolean(p)),
104
+ ];
105
+ const seen = new Map();
106
+ for (const purl of purls) {
107
+ const m = /^pkg:([^/]+)\/(.+)@([^?#]+)/.exec(purl);
108
+ if (!m)
109
+ continue;
110
+ const pkg = { ecosystem: m[1], name: decodeURIComponent(m[2]), version: decodeURIComponent(m[3]) };
111
+ seen.set(`${pkg.ecosystem}:${pkg.name}@${pkg.version}`, pkg);
112
+ }
113
+ return [...seen.values()];
114
+ }
115
+ /**
116
+ * Compare two dotted version strings numerically, a pre-release sorting
117
+ * before its release (`1.2.0-rc.1` < `1.2.0`). Not full semver (no build
118
+ * metadata, no ordering between differing pre-release labels beyond "a
119
+ * pre-release exists") — just enough to place an installed version between
120
+ * an advisory's `introduced` and `fixed`.
121
+ */
122
+ export function compareVersions(a, b) {
123
+ const parse = (v) => {
124
+ const [core, pre] = String(v).replace(/^v/, "").split("-", 2);
125
+ return { nums: core.split(".").map((n) => Number.parseInt(n, 10) || 0), pre };
126
+ };
127
+ const x = parse(a);
128
+ const y = parse(b);
129
+ for (let i = 0; i < Math.max(x.nums.length, y.nums.length); i++) {
130
+ const d = (x.nums[i] ?? 0) - (y.nums[i] ?? 0);
131
+ if (d)
132
+ return Math.sign(d);
133
+ }
134
+ if (x.pre && !y.pre)
135
+ return -1;
136
+ if (!x.pre && y.pre)
137
+ return 1;
138
+ if (x.pre === y.pre)
139
+ return 0;
140
+ return x.pre < y.pre ? -1 : 1;
141
+ }
142
+ /**
143
+ * Match an SBOM's packages against a local, offline advisory database —
144
+ * no scanner binary, no network, deterministic. A package is affected when
145
+ * `introduced <= installedVersion < fixed` (or unconditionally affected when
146
+ * the advisory names no `fixed`). Findings are `VulnFinding`-shaped, so they
147
+ * feed `vuln-gate` exactly like `grype`/`trivy` output does; every
148
+ * exploitability field (`epss`, `inKev`, …) an offline database can't supply
149
+ * is left `undefined`, never defaulted to a false negative.
150
+ */
151
+ export function scanWithDatabase(doc, db) {
152
+ const advisories = Array.isArray(db) ? db : (db.advisories ?? []);
153
+ const findings = [];
154
+ for (const pkg of sbomPackages(doc)) {
155
+ for (const a of advisories) {
156
+ if ((a.ecosystem ?? "npm") !== pkg.ecosystem || a.package !== pkg.name)
157
+ continue;
158
+ if (compareVersions(pkg.version, a.introduced ?? "0") < 0)
159
+ continue;
160
+ if (a.fixed && compareVersions(pkg.version, a.fixed) >= 0)
161
+ continue;
162
+ findings.push({
163
+ cveId: a.id,
164
+ severity: normalizeSeverity(a.severity),
165
+ package: pkg.name,
166
+ installedVersion: pkg.version,
167
+ ...(a.fixed ? { fixedVersion: a.fixed } : {}),
168
+ fixable: Boolean(a.fixed),
169
+ });
170
+ }
171
+ }
172
+ return findings;
173
+ }
174
+ /**
175
+ * A `VulnScanner` backed by a local, offline advisory database file (JSON:
176
+ * `{ "advisories": [...] }`, see `AdvisoryDatabase`) instead of a real
177
+ * scanner binary — the hermetic fallback `autoDetectVulnScanner`'s doc
178
+ * comment says a scan doesn't have ("there is no hermetic fallback, a scan
179
+ * needs a real vuln DB"): deterministic, offline, no `grype`/`trivy`
180
+ * install required, at the cost of covering only the advisories the
181
+ * database names. Reads the file once per call (a database pinned in the
182
+ * repo changes rarely; callers that scan repeatedly should cache the parsed
183
+ * `AdvisoryDatabase` and call `scanWithDatabase` directly instead).
184
+ */
185
+ export function createDatabaseVulnScanner(dbFile) {
186
+ return {
187
+ async scan(input) {
188
+ const db = JSON.parse(readFileSync(dbFile, "utf8"));
189
+ return scanWithDatabase(input.sbom, db);
190
+ },
191
+ };
192
+ }
193
+ /**
194
+ * A real `VulnScanner` that writes the SBOM to a temp file and scans it with
195
+ * `grype` (default) or `trivy`, through the injectable `ProcessRunner`.
196
+ * `requireTool` throws `ToolNotAvailableError` if the scanner is absent — a
197
+ * missing scanner is a hard stop (like ./verify.ts's missing `cosign`), never
198
+ * a silent "no vulns found," because that would let an unscanned artifact
199
+ * through a gate. Never used in tests.
200
+ */
201
+ export function createToolVulnScanner(tool = "grype", processRunner = defaultProcessRunner()) {
202
+ return {
203
+ async scan(input) {
204
+ await requireTool(processRunner, tool, `scan the SBOM for known vulnerabilities`);
205
+ // Content-address the temp file so concurrent scans never collide and we
206
+ // avoid Date.now()/Math.random() (blocked in some chant runtimes).
207
+ const hash = createHash("sha256").update(input.sbom.bytes).digest("hex").slice(0, 16);
208
+ const ext = input.sbom.format === "cyclonedx" ? "cdx.json" : "spdx.json";
209
+ const path = join(tmpdir(), `chant-scan-${hash}.${ext}`);
210
+ writeFileSync(path, input.sbom.bytes);
211
+ if (tool === "trivy") {
212
+ const { stdout } = await processRunner.run(`trivy sbom --quiet --format json ${q(path)}`);
213
+ return parseTrivyOutput(stdout);
214
+ }
215
+ const { stdout } = await processRunner.run(`grype sbom:${q(path)} -o json`);
216
+ return parseGrypeOutput(stdout);
217
+ },
218
+ };
219
+ }
220
+ /**
221
+ * Thrown by `notImplementedVulnScanner` — the "no real scanner wired yet"
222
+ * signal, mirroring `SbomGeneratorNotImplementedError` (./sbom-generator.ts).
223
+ * The default is loud-and-specific rather than a silent empty scan, so a
224
+ * caller that forgets to inject a scanner (or a mock in tests) fails obviously
225
+ * instead of appearing to find zero vulnerabilities.
226
+ */
227
+ export class VulnScannerNotImplementedError extends Error {
228
+ constructor() {
229
+ super(`VulnScanner has no real scanner configured — inject a real scanner ` +
230
+ `(createToolVulnScanner("grype"|"trivy")) or a mock in tests`);
231
+ this.name = "VulnScannerNotImplementedError";
232
+ }
233
+ }
234
+ /** Kept for tests and for a caller that wants the old loud "no scanner wired" behavior; no longer the registered default (#634). */
235
+ export const notImplementedVulnScanner = {
236
+ async scan() {
237
+ throw new VulnScannerNotImplementedError();
238
+ },
239
+ };
240
+ /**
241
+ * A `VulnScanner` that picks a real backend at scan time — `grype` if present,
242
+ * else `trivy`. Unlike SBOM generation there is no hermetic fallback (a scan
243
+ * needs a real vuln DB), so when neither tool is on `PATH` this throws a
244
+ * `ToolNotAvailableError` naming what to install — an error a config-only user
245
+ * can act on — rather than `VulnScannerNotImplementedError`, which told them to
246
+ * edit code. This is the vuln-side analog of #630's hermetic-by-default SBOM
247
+ * generator: the registered `scan-vulnerabilities`/`vuln-gate` capabilities now
248
+ * work the moment a scanner is installed, with no code wiring.
249
+ */
250
+ export function autoDetectVulnScanner(processRunner = defaultProcessRunner()) {
251
+ return {
252
+ async scan(input) {
253
+ const tool = (await processRunner.available("grype"))
254
+ ? "grype"
255
+ : (await processRunner.available("trivy"))
256
+ ? "trivy"
257
+ : undefined;
258
+ if (!tool) {
259
+ throw new ToolNotAvailableError("grype or trivy", "scan the SBOM for known vulnerabilities");
260
+ }
261
+ return createToolVulnScanner(tool, processRunner).scan(input);
262
+ },
263
+ };
264
+ }
265
+ let defaultScanner;
266
+ /** The default `VulnScanner` the `scan-vulnerabilities`/`vuln-gate` capabilities fall back to when none is supplied: auto-detects `grype`/`trivy` and throws `ToolNotAvailableError` if neither is installed (#634). */
267
+ export function defaultVulnScanner() {
268
+ if (!defaultScanner)
269
+ defaultScanner = autoDetectVulnScanner();
270
+ return defaultScanner;
271
+ }
272
+ /**
273
+ * `scan-vulnerabilities` capability — scan an SBOM for known CVEs via the
274
+ * injectable `VulnScanner`. Produces findings only; suppression (VEX) and the
275
+ * pass/fail decision live in ./vuln-gate.ts, so a composition can scan once
276
+ * and reuse the findings, or run the gate directly (which scans for you).
277
+ */
278
+ export function createScanVulnerabilitiesCapability(scanner = defaultVulnScanner()) {
279
+ return {
280
+ kind: "scan-vulnerabilities",
281
+ async run(_ctx, input) {
282
+ const findings = await scanner.scan({ sbom: input.sbom, digest: input.digest });
283
+ return { findings, digest: input.digest };
284
+ },
285
+ };
286
+ }
287
+ /** Default `scan-vulnerabilities` capability, backed by the not-implemented scanner (inject a real/mock one). */
288
+ export const scanVulnerabilitiesCapability = createScanVulnerabilitiesCapability();
@@ -0,0 +1,106 @@
1
+ /**
2
+ * wait / verify family — poll until a deploy reaches a terminal or healthy
3
+ * state. The *agnostic* members live here: `wait-cluster-healthy` (a Neo4j
4
+ * bolt/quorum probe over the core `CloudExecutor`), and the HTTP waits
5
+ * `wait-endpoint` / `health-gate` (over an injectable `fetch`). The
6
+ * cloud-specific members — `wait-for-stack` (CloudFormation),
7
+ * `wait-steady-state` (ECS), `wait-job` (EMR) — moved to the aws lexicon
8
+ * alongside their executor clients (see docs/components/cloud-boundary).
9
+ */
10
+ import { defaultCloudExecutor, sleep } from "./cloud-executor.js";
11
+ const defaultFetcher = (url) => fetch(url);
12
+ /**
13
+ * Poll a multi-node cluster (e.g. Neo4j) via a bolt-port TCP probe until it
14
+ * reports healthy: `size` members reachable (exact-count mode, used by a
15
+ * cluster's seed instance) or a majority of the expected member list
16
+ * (`quorum` mode, used once followers exist). No rollback: a health probe is
17
+ * read-only.
18
+ */
19
+ export function createWaitClusterHealthyCapability(executor = defaultCloudExecutor()) {
20
+ return {
21
+ kind: "wait-cluster-healthy",
22
+ async run(ctx, input) {
23
+ const cluster = input.cluster ?? ctx.vars?.clusterEndpoints ?? ctx.component;
24
+ const intervalMs = input.intervalMs ?? 5000;
25
+ const deadline = Date.now() + (input.timeoutMs ?? 5 * 60000);
26
+ while (true) {
27
+ const { healthyCount, total } = await executor.neo4j.probe({ cluster });
28
+ const required = input.quorum ? Math.floor(total / 2) + 1 : (input.size ?? total);
29
+ if (healthyCount >= required)
30
+ return { healthyCount };
31
+ if (Date.now() > deadline) {
32
+ throw new Error(`wait-cluster-healthy "${cluster}" timed out: ${healthyCount}/${total} healthy, needed ${required}`);
33
+ }
34
+ await sleep(intervalMs);
35
+ }
36
+ },
37
+ };
38
+ }
39
+ /** Default `wait-cluster-healthy` capability, backed by the real `CloudExecutor`. */
40
+ export const waitClusterHealthyCapability = createWaitClusterHealthyCapability();
41
+ /** Poll an HTTP(S) endpoint until it responds with an expected status. Cloud-agnostic. */
42
+ export function createWaitEndpointCapability(fetcher = defaultFetcher) {
43
+ return {
44
+ kind: "wait-endpoint",
45
+ async run(_ctx, input) {
46
+ const expect = input.expectStatus ?? [200];
47
+ const intervalMs = input.intervalMs ?? 5000;
48
+ const timeoutMs = input.timeoutMs ?? 5 * 60000;
49
+ const deadline = Date.now() + timeoutMs;
50
+ for (;;) {
51
+ try {
52
+ const res = await fetcher(input.url);
53
+ if (expect.includes(res.status))
54
+ return { status: res.status };
55
+ }
56
+ catch {
57
+ // not reachable yet — keep polling until the deadline
58
+ }
59
+ if (Date.now() >= deadline) {
60
+ throw new Error(`wait-endpoint: ${input.url} did not return ${expect.join("/")} within ${timeoutMs}ms`);
61
+ }
62
+ await sleep(intervalMs);
63
+ }
64
+ },
65
+ };
66
+ }
67
+ /** Default `wait-endpoint` capability, backed by the global `fetch`. */
68
+ export const waitEndpointCapability = createWaitEndpointCapability();
69
+ /** Compose the fetchable URL: `host` set → resolve `path` against it (bare host → `http://` prepended); else `path` as-is. */
70
+ function healthGateUrl(input) {
71
+ if (!input.host)
72
+ return input.path;
73
+ const base = /^https?:\/\//.test(input.host) ? input.host : `http://${input.host}`;
74
+ return new URL(input.path, base).toString();
75
+ }
76
+ /** Block progression until a health check passes — the generic post-deploy verification gate. Cloud-agnostic. */
77
+ export function createHealthGateCapability(fetcher = defaultFetcher) {
78
+ return {
79
+ kind: "health-gate",
80
+ async run(_ctx, input) {
81
+ const need = input.consecutiveSuccesses ?? 1;
82
+ const intervalMs = input.intervalMs ?? 5000;
83
+ // HealthGateInput has no timeout field; cap the wait so a never-healthy target fails rather than hangs.
84
+ const deadline = Date.now() + 5 * 60000;
85
+ let streak = 0;
86
+ for (;;) {
87
+ let ok = false;
88
+ try {
89
+ ok = (await fetcher(healthGateUrl(input))).ok;
90
+ }
91
+ catch {
92
+ ok = false;
93
+ }
94
+ streak = ok ? streak + 1 : 0;
95
+ if (streak >= need)
96
+ return { healthy: true };
97
+ if (Date.now() >= deadline) {
98
+ throw new Error(`health-gate: ${healthGateUrl(input)} did not reach ${need} consecutive healthy check(s) within 300000ms`);
99
+ }
100
+ await sleep(intervalMs);
101
+ }
102
+ },
103
+ };
104
+ }
105
+ /** Default `health-gate` capability, backed by the global `fetch`. */
106
+ export const healthGateCapability = createHealthGateCapability();
@@ -0,0 +1,179 @@
1
+ /**
2
+ * `wrangler-deploy` / `wrangler-versions-promote` — the Cloudflare Workers
3
+ * apply leaves (chant #1293, epic #1296). The epic cedes the Workers plane
4
+ * entirely to `wrangler` (first-party, schema-backed, already owns the
5
+ * config format, bindings model, local dev, and deploy) — these two verbs
6
+ * are a typed wrapper over that CLI, not a reimplementation of it.
7
+ *
8
+ * Placement: core, not a cloudflare lexicon. #1293's own analysis weighed
9
+ * three options — core (generic verb, fastest, costs a little conceptual
10
+ * tidiness since `wrangler-deploy` shells a specific vendor CLI), a
11
+ * capability-only cloudflare lexicon (the "correct" home, but `LexiconPlugin`
12
+ * tier-1 completeness — serializer, lint rules, post-synth, LSP, examples,
13
+ * docs — is heavy ceremony for three verbs and no resource types), or
14
+ * generalizing to a `cli-deploy` verb parameterised by tool (tempting, but
15
+ * premature and it re-opens the verb set the bounded-primitives thesis
16
+ * depends on staying closed). Core wins on the same precedent `sign`/
17
+ * `attest-provenance` (./sign.ts) already set: a specific vendor CLI
18
+ * (`cosign`) shelled out through the injectable `ProcessRunner`
19
+ * (./process-runner.ts), no cloud-specific SDK client needed the way AWS's
20
+ * `CloudExecutor` (./cloud-executor.ts) models CloudFormation/ECS/Lambda.
21
+ * `wrangler` fits that exact shape. Revisit if/when the zone-plane lexicon
22
+ * (#1294) lands and gives these three verbs a natural cloudflare-owned home.
23
+ *
24
+ * `wrangler-versions-promote` is also the direct evidence for #1296's
25
+ * "three new verbs cover a whole new cloud" claim: Cloudflare's native
26
+ * Worker version rollback maps onto the existing `RollbackPolicy: "native"`
27
+ * (../capability.ts) with no compensation code to hand-write — both verbs
28
+ * here declare a `rollback` (auto-derived "native" per ../capability.ts's
29
+ * `Capability.rollbackPolicy` doc) that re-promotes to whichever version was
30
+ * live before the step ran, the same best-effort captured-previous-state
31
+ * pattern lexicons/aws/src/components/apply.ts's `lambda-deploy` uses for
32
+ * its alias rollback.
33
+ *
34
+ * No real Cloudflare control-plane emulator exists yet (#1295, epic #1296),
35
+ * so — like ./sign.ts — every real path here shells out through the
36
+ * injectable `ProcessRunner` and every test substitutes `MockProcessRunner`
37
+ * (./__tests__/mock-process-runner.ts): no live `wrangler`, no network, ever,
38
+ * in a test run. CI coverage is plan-shape/invocation-shape assertions only,
39
+ * per #1293's own "Verification" section.
40
+ */
41
+ import { defaultProcessRunner, q, requireTool } from "./process-runner.js";
42
+ const WRANGLER_TOOL = "wrangler";
43
+ /** Distinguishes one deploy target (a wrangler config + optional named environment) from another, so the best-effort previous-version tracking below never conflates two different Workers sharing a process. */
44
+ function targetKey(config, env) {
45
+ return env ? `${config}#${env}` : config;
46
+ }
47
+ function buildWranglerDeployArgs(input) {
48
+ const args = ["wrangler", "deploy", "--config", q(input.config)];
49
+ if (input.env)
50
+ args.push("--env", q(input.env));
51
+ return args.join(" ");
52
+ }
53
+ function buildVersionsListArgs(config, env) {
54
+ const args = ["wrangler", "versions", "list", "--config", q(config), "--json"];
55
+ if (env)
56
+ args.push("--env", q(env));
57
+ return args.join(" ");
58
+ }
59
+ function buildVersionsPromoteArgs(config, versionId, percentage, env) {
60
+ const args = ["wrangler", "versions", "deploy", q(`${versionId}@${percentage}`), "--config", q(config), "--yes"];
61
+ if (env)
62
+ args.push("--env", q(env));
63
+ return args.join(" ");
64
+ }
65
+ /** Thrown when `wrangler deploy`'s stdout carries no parseable Version ID — fail-closed rather than returning a capability output downstream steps (`wrangler-versions-promote`, wired via `"@Deploy.versionId"`) would silently receive as `undefined`. */
66
+ export class WranglerVersionIdNotFoundError extends Error {
67
+ constructor(stdout) {
68
+ super(`wrangler-deploy: could not find a Version ID in wrangler's output. Got:\n${stdout}`);
69
+ this.stdout = stdout;
70
+ this.name = "WranglerVersionIdNotFoundError";
71
+ }
72
+ }
73
+ // wrangler's deploy/versions-upload output names the new version as e.g.
74
+ // "Version ID: 07bcb198-... " (gradual deployments) — accept either "Version
75
+ // ID:" or the bare "Version:" wording across wrangler versions, and require a
76
+ // UUID-shaped token so a stray "Version: 2" summary line can't be mistaken
77
+ // for it.
78
+ const VERSION_ID_RE = /Version(?: ID)?:\s*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})/;
79
+ /** Extract the deployed Worker version id from `wrangler deploy`'s stdout. Exported so tests can assert on it directly, mirroring ./sign.ts's `buildSignArgs`. */
80
+ export function parseWranglerVersionId(stdout) {
81
+ const match = VERSION_ID_RE.exec(stdout);
82
+ if (!match)
83
+ throw new WranglerVersionIdNotFoundError(stdout);
84
+ return match[1];
85
+ }
86
+ /**
87
+ * Best-effort: the currently-live (100%) version id, from `wrangler versions
88
+ * list --json` — `undefined` for a first deploy (no versions yet) or if
89
+ * listing fails/parses oddly. Never throws: capturing "what to roll back to"
90
+ * must not block the deploy/promote itself, the same fail-soft stance
91
+ * `lambda-deploy`'s alias-version capture takes.
92
+ */
93
+ async function currentLiveVersionId(runner, config, env) {
94
+ try {
95
+ const { stdout } = await runner.run(buildVersionsListArgs(config, env));
96
+ const entries = JSON.parse(stdout);
97
+ return entries.find((entry) => entry.percentage === 100)?.id;
98
+ }
99
+ catch {
100
+ return undefined;
101
+ }
102
+ }
103
+ /**
104
+ * Deploy a Worker from a `wrangler.jsonc`/`wrangler.toml` via `wrangler
105
+ * deploy`, and return the version id it published — the analogue of
106
+ * `lambda-deploy` (../../lexicons/aws/src/components/apply.ts) for the
107
+ * Workers plane.
108
+ *
109
+ * Rollback: `wrangler-versions-promote` back to whichever version was live
110
+ * before this step ran (captured up front via `wrangler versions list`, the
111
+ * same best-effort captured-previous pattern `lambda-deploy` uses for its
112
+ * alias). A no-op on a first deploy — nothing was live to restore.
113
+ */
114
+ export function createWranglerDeployCapability(processRunner = defaultProcessRunner()) {
115
+ const previousVersionByTarget = new Map();
116
+ return {
117
+ kind: "wrangler-deploy",
118
+ async run(_ctx, input) {
119
+ await requireTool(processRunner, WRANGLER_TOOL, `deploy the Worker in ${input.config}`);
120
+ const target = targetKey(input.config, input.env);
121
+ if (!previousVersionByTarget.has(target)) {
122
+ previousVersionByTarget.set(target, await currentLiveVersionId(processRunner, input.config, input.env));
123
+ }
124
+ const { stdout } = await processRunner.run(buildWranglerDeployArgs(input));
125
+ return { versionId: parseWranglerVersionId(stdout) };
126
+ },
127
+ async rollback(_ctx, input) {
128
+ const target = targetKey(input.config, input.env);
129
+ const previousVersionId = previousVersionByTarget.get(target);
130
+ if (!previousVersionId)
131
+ return; // first deploy — nothing was live before it.
132
+ await requireTool(processRunner, WRANGLER_TOOL, `roll back the Worker in ${input.config}`);
133
+ await processRunner.run(buildVersionsPromoteArgs(input.config, previousVersionId, 100, input.env));
134
+ },
135
+ };
136
+ }
137
+ /** Default `wrangler-deploy` capability, backed by the real `ProcessRunner`. */
138
+ export const wranglerDeployCapability = createWranglerDeployCapability();
139
+ /**
140
+ * Promote a Worker version to (some percentage of) live traffic via
141
+ * `wrangler versions deploy <version-id>@<percentage> --yes` — both the
142
+ * gradual-deployment lever (`percentage` < 100) and, at `percentage: 100`,
143
+ * the rollback mechanism: Cloudflare's native version rollback is a promote
144
+ * to a prior version id, not a redeploy, so this same verb composes as the
145
+ * explicit compensation step a component wires up (#1293's "verification"
146
+ * example: forced failure after `wrangler-deploy` -> `wrangler-versions-promote`
147
+ * back to the prior version, no hand-written compensation needed).
148
+ *
149
+ * Also declares its own `rollback` (native, no `rollbackPolicy` override
150
+ * needed — see ../capability.ts): re-promotes to whichever version was live
151
+ * before *this* promote call, for the case where the promote step itself is
152
+ * composed directly (not just as `wrangler-deploy`'s compensation).
153
+ */
154
+ export function createWranglerVersionsPromoteCapability(processRunner = defaultProcessRunner()) {
155
+ const previousVersionByTarget = new Map();
156
+ return {
157
+ kind: "wrangler-versions-promote",
158
+ async run(_ctx, input) {
159
+ await requireTool(processRunner, WRANGLER_TOOL, `promote version ${input.versionId} in ${input.config}`);
160
+ const percentage = input.percentage ?? 100;
161
+ const target = targetKey(input.config, input.env);
162
+ if (!previousVersionByTarget.has(target)) {
163
+ previousVersionByTarget.set(target, await currentLiveVersionId(processRunner, input.config, input.env));
164
+ }
165
+ await processRunner.run(buildVersionsPromoteArgs(input.config, input.versionId, percentage, input.env));
166
+ return { versionId: input.versionId, percentage };
167
+ },
168
+ async rollback(_ctx, input) {
169
+ const target = targetKey(input.config, input.env);
170
+ const previousVersionId = previousVersionByTarget.get(target);
171
+ if (!previousVersionId)
172
+ return; // nothing was live before this promote.
173
+ await requireTool(processRunner, WRANGLER_TOOL, `roll back version promotion in ${input.config}`);
174
+ await processRunner.run(buildVersionsPromoteArgs(input.config, previousVersionId, 100, input.env));
175
+ },
176
+ };
177
+ }
178
+ /** Default `wrangler-versions-promote` capability, backed by the real `ProcessRunner`. */
179
+ export const wranglerVersionsPromoteCapability = createWranglerVersionsPromoteCapability();
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Plan one wave of a gated-wave fan-out (#3049).
3
+ *
4
+ * Each component in the wave is asked what it would change: every deploy
5
+ * step whose capability has a `plan` (`Capability.plan`, ./capability.ts) is
6
+ * planned, with its wiring resolved against the outputs the earlier waves
7
+ * left behind. That is the point of planning at the wave rather than up
8
+ * front: a root that reads an upstream output plans against the value the
9
+ * upstream wave actually wrote.
10
+ *
11
+ * A component with no plannable step is still a member of the wave. Its plan
12
+ * digest is the composition digest a gate inside it would bind
13
+ * (`componentPlanDigest`, ./gate-plan.ts, #2574), so a wave mixing roots and
14
+ * other components still has one digest that moves when any of them does.
15
+ *
16
+ * Known limit: a step input that reads an earlier step of the same
17
+ * component (`@Phase.field`) has no value before the component runs, so it
18
+ * plans as `undefined`. Cross-component wiring (`stackOutput()`,
19
+ * `@<component>.publish.*`) resolves.
20
+ */
21
+ import { resolveStepInput } from "./driver.js";
22
+ import { componentPlanDigest } from "./gate-plan.js";
23
+ /** A part with no entries, for a member whose planner describes no changes. */
24
+ function emptyPart(member) {
25
+ return {
26
+ member: { member: member.member, lexicon: "chant", planner: "chant", status: "planned", planDigest: member.planDigest, holes: [] },
27
+ entries: [],
28
+ };
29
+ }
30
+ /** Every capability step in a composition, nested phases included, gates left out. */
31
+ function capabilitySteps(phases) {
32
+ const out = [];
33
+ const walk = (steps) => {
34
+ for (const step of steps) {
35
+ if (typeof step.phase === "string" && Array.isArray(step.steps)) {
36
+ walk(step.steps);
37
+ continue;
38
+ }
39
+ if (step.kind === "gate")
40
+ continue;
41
+ out.push(step);
42
+ }
43
+ };
44
+ for (const phase of phases)
45
+ walk(phase.steps);
46
+ return out;
47
+ }
48
+ /** Plan one component against the outputs earlier waves produced. Never throws: a failure comes back as `error`. */
49
+ export async function planWaveComponent(component, registry, ctx, componentOutputs) {
50
+ try {
51
+ const members = [];
52
+ const plans = {};
53
+ const parts = [];
54
+ for (const step of capabilitySteps(component.deploy)) {
55
+ const capability = registry.resolve(step.kind);
56
+ if (!capability.plan)
57
+ continue;
58
+ const { kind: _kind, ...rest } = step;
59
+ const input = resolveStepInput(rest, {}, componentOutputs);
60
+ const planned = await capability.plan(ctx, input);
61
+ const member = { member: planned.member, planDigest: planned.planDigest };
62
+ members.push(member);
63
+ parts.push(planned.changeSet ?? emptyPart(member));
64
+ if (planned.artifact !== undefined)
65
+ plans[planned.member] = planned.artifact;
66
+ }
67
+ if (members.length === 0) {
68
+ const member = {
69
+ member: component.name,
70
+ planDigest: componentPlanDigest({
71
+ environment: ctx.env,
72
+ component,
73
+ ...(ctx.vars ? { vars: ctx.vars } : {}),
74
+ }),
75
+ };
76
+ members.push(member);
77
+ parts.push(emptyPart(member));
78
+ }
79
+ return { component: component.name, members, plans, parts };
80
+ }
81
+ catch (err) {
82
+ return { component: component.name, error: err instanceof Error ? err.message : String(err) };
83
+ }
84
+ }
85
+ /**
86
+ * The outputs `component` exposes now, read from each step whose capability
87
+ * has `outputs` (#3183), merged the way the driver merges a run's outputs.
88
+ * `undefined` when no step can say. A pull request's plan reads these for
89
+ * the components a planned one depends on, before anything has applied.
90
+ */
91
+ export async function readComponentOutputs(component, registry, ctx, componentOutputs) {
92
+ let found;
93
+ for (const step of capabilitySteps(component.deploy)) {
94
+ const capability = registry.resolve(step.kind);
95
+ if (!capability.outputs)
96
+ continue;
97
+ const { kind: _kind, ...rest } = step;
98
+ const input = resolveStepInput(rest, {}, componentOutputs);
99
+ found = { ...found, ...(await capability.outputs(ctx, input)) };
100
+ }
101
+ return found;
102
+ }