@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,136 @@
1
+ /**
2
+ * Zod schemas for lexicon manifest and registry validation.
3
+ */
4
+ import { z } from "zod";
5
+ // ---------------------------------------------------------------------------
6
+ // Intrinsic definitions
7
+ // ---------------------------------------------------------------------------
8
+ export const IntrinsicDefSchema = z.object({
9
+ name: z.string().min(1, "intrinsic name must not be empty"),
10
+ description: z.string().optional(),
11
+ outputKey: z.string().optional(),
12
+ // Required (chant #1067) — no silent default for whether an intrinsic
13
+ // folds. See IntrinsicDef.isTag in ../lexicon.ts for the history.
14
+ isTag: z.boolean(),
15
+ // chant #1044 — optional and default-off on purpose: absent means "this
16
+ // intrinsic's plain-call form does not fold", which is what every
17
+ // registration written before #1044 means. Only an explicit `true` opts a
18
+ // call into folding. See IntrinsicDef.foldsAsCall in ../lexicon.ts.
19
+ foldsAsCall: z.boolean().optional(),
20
+ // chant #1966 — same default-off shape as foldsAsCall, for the EAGER
21
+ // call-form opt-in. See IntrinsicDef.foldsEagerly in ../lexicon.ts.
22
+ foldsEagerly: z.boolean().optional(),
23
+ });
24
+ // ---------------------------------------------------------------------------
25
+ // Lexicon manifest
26
+ // ---------------------------------------------------------------------------
27
+ const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$/;
28
+ export const LexiconManifestSchema = z.object({
29
+ name: z.string().min(1, "manifest name must not be empty"),
30
+ version: z.string().regex(semverRegex, "version must be valid semver (X.Y.Z)"),
31
+ chantVersion: z.string().optional(),
32
+ namespace: z.string().optional(),
33
+ intrinsics: z.array(IntrinsicDefSchema).optional(),
34
+ pseudoParameters: z.record(z.string(), z.string()).optional(),
35
+ });
36
+ // ---------------------------------------------------------------------------
37
+ // Extension constraint schema (matches ExtensionConstraint from lexicon packages)
38
+ // ---------------------------------------------------------------------------
39
+ const ExtensionConstraintSchema = z.object({
40
+ name: z.string(),
41
+ type: z.enum(["if_then", "dependent_excluded", "required_or", "required_xor"]),
42
+ condition: z.unknown().optional(),
43
+ requirement: z.unknown().optional(),
44
+ });
45
+ // ---------------------------------------------------------------------------
46
+ // Property constraints schema (matches PropertyConstraints from lexicon packages)
47
+ // ---------------------------------------------------------------------------
48
+ const PropertyConstraintsSchema = z.object({
49
+ pattern: z.string().optional(),
50
+ minLength: z.number().optional(),
51
+ maxLength: z.number().optional(),
52
+ minimum: z.number().optional(),
53
+ maximum: z.number().optional(),
54
+ format: z.string().optional(),
55
+ const: z.unknown().optional(),
56
+ default: z.unknown().optional(),
57
+ enum: z.array(z.string()).optional(),
58
+ });
59
+ // ---------------------------------------------------------------------------
60
+ // Lexicon entry (registry entry for a resource or property type)
61
+ // ---------------------------------------------------------------------------
62
+ export const LexiconEntrySchema = z.object({
63
+ resourceType: z.string(),
64
+ kind: z.enum(["resource", "property"]),
65
+ lexicon: z.string(),
66
+ attrs: z.record(z.string(), z.string()).optional(),
67
+ constraints: z.array(ExtensionConstraintSchema).optional(),
68
+ propertyConstraints: z.record(z.string(), PropertyConstraintsSchema).optional(),
69
+ createOnly: z.array(z.string()).optional(),
70
+ writeOnly: z.array(z.string()).optional(),
71
+ primaryIdentifier: z.array(z.string()).optional(),
72
+ deprecatedProperties: z.array(z.string()).optional(),
73
+ conditionalCreateOnly: z.array(z.string()).optional(),
74
+ replacementStrategy: z.enum(["delete_then_create", "create_then_delete"]).optional(),
75
+ tagging: z.object({
76
+ taggable: z.boolean(),
77
+ tagOnCreate: z.boolean(),
78
+ tagUpdatable: z.boolean(),
79
+ }).optional(),
80
+ runtimeDeprecations: z.record(z.string(), z.string()).optional(),
81
+ });
82
+ // ---------------------------------------------------------------------------
83
+ // Validation helpers
84
+ // ---------------------------------------------------------------------------
85
+ /**
86
+ * Validate a manifest from unknown input (object or JSON string).
87
+ * Throws a descriptive error on invalid input.
88
+ */
89
+ export function validateManifest(data) {
90
+ if (data === null || data === undefined) {
91
+ throw new Error("manifest data is empty");
92
+ }
93
+ if (typeof data === "string") {
94
+ try {
95
+ data = JSON.parse(data);
96
+ }
97
+ catch (err) {
98
+ const msg = err instanceof SyntaxError ? err.message : String(err);
99
+ throw new Error(`invalid JSON in manifest: ${msg}`);
100
+ }
101
+ }
102
+ if (typeof data !== "object" || data === null || Array.isArray(data)) {
103
+ throw new Error("manifest must be a JSON object");
104
+ }
105
+ const result = LexiconManifestSchema.safeParse(data);
106
+ if (!result.success) {
107
+ const issue = result.error.issues[0];
108
+ const path = issue.path.length > 0 ? issue.path.join(".") : undefined;
109
+ const prefix = path ? `manifest field ${path}` : "manifest";
110
+ throw new Error(`${prefix}: ${issue.message}`);
111
+ }
112
+ return result.data;
113
+ }
114
+ /**
115
+ * Validate a registry JSON string into a typed record.
116
+ * Throws a descriptive error on invalid input.
117
+ */
118
+ export function validateRegistry(json) {
119
+ let parsed;
120
+ try {
121
+ parsed = JSON.parse(json);
122
+ }
123
+ catch (err) {
124
+ const msg = err instanceof SyntaxError ? err.message : String(err);
125
+ throw new Error(`invalid JSON in registry: ${msg}`);
126
+ }
127
+ const schema = z.record(z.string(), LexiconEntrySchema);
128
+ const result = schema.safeParse(parsed);
129
+ if (!result.success) {
130
+ const issue = result.error.issues[0];
131
+ const path = issue.path.length > 0 ? issue.path.join(".") : undefined;
132
+ const prefix = path ? `registry[${path}]` : "registry";
133
+ throw new Error(`${prefix}: ${issue.message}`);
134
+ }
135
+ return result.data;
136
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Whether `chant build --fold` can ever fold a use of this intrinsic
3
+ * (chant #1062, epic #1019) — in EITHER authored form.
4
+ *
5
+ * Two disjoint ways to qualify, one per form:
6
+ *
7
+ * - a registered tagged-template intrinsic (`Sub\`...\``) folds because
8
+ * `foldTaggedTemplate` recognizes its tag and recurses into the interior
9
+ * ({@link intrinsicTagFolds});
10
+ * - a registered plain-call intrinsic (`Ref(...)`, `Concat(...)`) folds
11
+ * only when its lexicon opted it in with `foldsAsCall`
12
+ * ({@link intrinsicCallFolds}, chant #1044). Before #1044 no plain call
13
+ * folded at all, whatever it was named or registered as.
14
+ *
15
+ * This function is the single predicate the generated per-lexicon intrinsics
16
+ * page (`../codegen/docs-sections.ts`'s "Folds?" column) calls — never a
17
+ * restated copy that could silently drift from the code. `fold()` itself
18
+ * calls the two form-specific predicates below rather than this one, because
19
+ * it always knows which form it is looking at, and a tag must not fold as a
20
+ * call (or vice versa) merely because the other form was opted in.
21
+ *
22
+ * Takes a structural `{ isTag?, foldsAsCall? }` rather than
23
+ * `Pick<IntrinsicDef, ...>` deliberately: `IntrinsicDef.isTag` is required
24
+ * for new registrations (chant #1067), but these predicates also read off
25
+ * untrusted, possibly-older parsed JSON (`ManifestJSON` in
26
+ * `./codegen/docs-types.ts`, on disk as a published lexicon's
27
+ * `dist/manifest.json`) that may predate either field. `undefined` there
28
+ * means what it always did — not a tag, not opted in.
29
+ */
30
+ export function intrinsicFolds(def) {
31
+ return intrinsicTagFolds(def) || intrinsicCallFolds(def) || intrinsicCallFoldsEagerly(def);
32
+ }
33
+ /** True when this intrinsic's TAGGED-TEMPLATE form folds (`Sub\`...\``) — see {@link intrinsicFolds}. */
34
+ export function intrinsicTagFolds(def) {
35
+ return def.isTag === true;
36
+ }
37
+ /**
38
+ * True when this intrinsic's PLAIN-CALL form folds (`Ref(...)`) — i.e. the
39
+ * lexicon opted it in via {@link IntrinsicDef.foldsAsCall} (chant #1044).
40
+ *
41
+ * `isTag: true` disqualifies regardless: a tagged template is invoked as
42
+ * `` Name`...` ``, so a call to it isn't the registered authoring form at
43
+ * all. Keeping that here rather than trusting registrations means a lexicon
44
+ * that declares both flags cannot quietly widen `fold()`'s call case — and
45
+ * `chant dev check-lexicon` fails the registration outright.
46
+ */
47
+ export function intrinsicCallFolds(def) {
48
+ return def.isTag !== true && def.foldsAsCall === true;
49
+ }
50
+ /**
51
+ * True when this intrinsic's PLAIN-CALL form folds EAGERLY (chant #1966) —
52
+ * i.e. the lexicon opted it in via {@link IntrinsicDef.foldsEagerly}.
53
+ * `isTag: true` disqualifies, same as {@link intrinsicCallFolds}.
54
+ */
55
+ export function intrinsicCallFoldsEagerly(def) {
56
+ return def.isTag !== true && def.foldsEagerly === true;
57
+ }
58
+ /** `path` (relative to the member's directory) made relative to the repository root. Absolute paths pass through. */
59
+ export function memberRepoPath(member, path) {
60
+ if (path.startsWith("/") || member.dir === "." || member.dir === "")
61
+ return path;
62
+ const rest = path.replace(/^\.\/+/, "").replace(/\/+$/, "");
63
+ return rest === "" || rest === "." ? member.dir : `${member.dir}/${rest}`;
64
+ }
65
+ /**
66
+ * The path filter for a member's `push` or `pull_request` trigger in GitHub
67
+ * Actions syntax (also Forgejo's): the member's directory and the pipeline
68
+ * file. A member at
69
+ * `"."` gets every path, minus the other members' directories.
70
+ */
71
+ export function memberPathFilter(member, file = member.file) {
72
+ const paths = member.dir === "." || member.dir === ""
73
+ ? ["**", ...(member.exclude ?? []).map((d) => `!${d}/**`)]
74
+ : [`${member.dir}/**`];
75
+ if (file && !paths.includes(file))
76
+ paths.push(file);
77
+ return paths;
78
+ }
79
+ /**
80
+ * The `rules: changes:` list for a member's GitLab jobs, or undefined for a
81
+ * member at `"."`: GitLab's `changes` has no exclusions, so the root member's
82
+ * jobs run on every change.
83
+ */
84
+ export function memberGitlabChanges(member, file = member.file) {
85
+ if (member.dir === "." || member.dir === "")
86
+ return undefined;
87
+ return [`${member.dir}/**/*`, ...(file ? [file] : [])];
88
+ }
89
+ /** A shell word for `cd` into the member's directory. */
90
+ export function memberShellDir(member) {
91
+ return /^[A-Za-z0-9._\/-]+$/.test(member.dir) ? member.dir : `'${member.dir.replace(/'/g, `'\\''`)}'`;
92
+ }
93
+ /**
94
+ * Resolve a `ScheduledOpSpec`'s effective trigger, most specific first:
95
+ * `trigger` when given; else the backward-compatible `{ kind: "cron",
96
+ * schedule }` built from this spec's own `schedule` — every pre-#2084 caller
97
+ * (`WorkflowAuditOp`, `PipelineAuditOp`, `ReconcileOp`, …, and their tests)
98
+ * sets only that and keeps meaning cron unchanged; else the declaring Op's
99
+ * own `schedule.cron` (#2120), so an Op that already carries its cadence
100
+ * needs no second cron declaration on the CI side. Throws when none of the
101
+ * three is present — a `ScheduledOpSpec` needs exactly one trigger.
102
+ */
103
+ export function resolveOpTrigger(spec) {
104
+ if (spec.trigger)
105
+ return spec.trigger;
106
+ if (spec.schedule)
107
+ return { kind: "cron", schedule: spec.schedule };
108
+ if (spec.opSchedule)
109
+ return { kind: "cron", schedule: spec.opSchedule.cron };
110
+ throw new Error(`Scheduled Op "${spec.name}" has neither \`trigger\` nor \`schedule\`, and the Op itself declares no \`schedule\` — one is required.`);
111
+ }
112
+ /**
113
+ * Type guard to check if a value is a LexiconPlugin.
114
+ * Checks for required lifecycle methods in addition to name/serializer.
115
+ */
116
+ export function isLexiconPlugin(value) {
117
+ if (typeof value !== "object" ||
118
+ value === null ||
119
+ !("name" in value) ||
120
+ typeof value.name !== "string" ||
121
+ !("serializer" in value) ||
122
+ typeof value.serializer !== "object") {
123
+ return false;
124
+ }
125
+ const obj = value;
126
+ return (typeof obj.generate === "function" &&
127
+ typeof obj.validate === "function" &&
128
+ typeof obj.coverage === "function" &&
129
+ typeof obj.package === "function");
130
+ }
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Selective change-set scoping — which stacks does a change affect?
3
+ *
4
+ * "Affected" is two distinct things, because chant serializes cross-stack
5
+ * references symbolically:
6
+ * 1. **Directly changed** — the stack's built artifact differs between base
7
+ * and head. Caught by artifact diff over deterministic builds, so it
8
+ * ignores comment-only / refactor-with-no-output-change edits.
9
+ * 2. **Operationally affected (dependents)** — a stack whose own artifact is
10
+ * unchanged but which consumes an upstream export whose value changed. Its
11
+ * bytes don't move, yet it may need re-apply. Caught by walking the
12
+ * cross-stack graph (#200) from the directly-changed set; opt-in.
13
+ *
14
+ * A stack whose inputs come from outside synthesis (deploy-time params) cannot
15
+ * be judged from a source diff — reported as **indeterminate**, not silently
16
+ * included or excluded.
17
+ *
18
+ * ## What "stack" means here depends on the project
19
+ *
20
+ * A project that declares `stacks` in `chant.config.ts` gets each declared
21
+ * stack's own source built, and the answer names stacks. A single-root project
22
+ * has no such partition to build, so its answer names lexicon partitions, which
23
+ * is the only granularity it has. The difference matters downstream: a
24
+ * component's deploy step names a stack, so only the first kind of answer can
25
+ * be joined to components (#2420).
26
+ *
27
+ * This returns the set; it does not act. `chant components fan-out`
28
+ * (../cli/handlers/fan-out.ts) is the command that acts on it, and fanning
29
+ * `lifecycle plan` / `ApplyOp` over it by hand is still an Op the user
30
+ * composes.
31
+ */
32
+ import { execFile } from "node:child_process";
33
+ import { promisify } from "node:util";
34
+ import { mkdtempSync, rmSync, existsSync, symlinkSync, realpathSync } from "node:fs";
35
+ import { join, relative, resolve } from "node:path";
36
+ import { tmpdir } from "node:os";
37
+ import { build } from "../build.js";
38
+ import { getPrimaryOutput } from "../lint/post-synth.js";
39
+ const execFileAsync = promisify(execFile);
40
+ // ── Pure model ──────────────────────────────────────────────────────────────
41
+ /** Stacks whose serialized output differs between the two builds (added/removed count). */
42
+ export function changedStacks(base, head) {
43
+ const names = new Set([...base.keys(), ...head.keys()]);
44
+ const changed = [];
45
+ for (const name of names) {
46
+ if (base.get(name) !== head.get(name))
47
+ changed.push(name);
48
+ }
49
+ return changed.sort();
50
+ }
51
+ /**
52
+ * Walk the cross-stack graph backwards from `changed` to find every stack that
53
+ * (transitively) consumes a changed stack. Edge `from → to` means `from`
54
+ * depends on `to`, so a changed `to` makes `from` a dependent.
55
+ */
56
+ export function dependentStacks(changed, graph) {
57
+ const consumersOf = new Map();
58
+ for (const { from, to } of graph.edges) {
59
+ (consumersOf.get(to) ?? consumersOf.set(to, []).get(to)).push(from);
60
+ }
61
+ const seen = new Set(changed);
62
+ const queue = [...changed];
63
+ const dependents = new Set();
64
+ while (queue.length > 0) {
65
+ const node = queue.shift();
66
+ for (const consumer of consumersOf.get(node) ?? []) {
67
+ if (seen.has(consumer))
68
+ continue;
69
+ seen.add(consumer);
70
+ dependents.add(consumer);
71
+ queue.push(consumer);
72
+ }
73
+ }
74
+ return [...dependents].sort();
75
+ }
76
+ /**
77
+ * Compute the affected set from two per-stack artifact maps and the cross-stack
78
+ * graph. Pure — no builds, no git — so the model is independently testable.
79
+ */
80
+ export function computeAffected(base, head, graph, opts = {}) {
81
+ const changed = changedStacks(base, head);
82
+ const dependents = opts.includeDependents ? dependentStacks(changed, graph) : [];
83
+ const indeterminate = [...(opts.externalInput ?? [])].sort();
84
+ return { changed, dependents, indeterminate };
85
+ }
86
+ // ── Build + git plumbing ──────────────────────────────────────────────────────
87
+ /** A built BuildResult's per-stack (lexicon) primary output, keyed by stack. */
88
+ export function artifactMap(outputs) {
89
+ const map = new Map();
90
+ for (const [stack, output] of outputs)
91
+ map.set(stack, getPrimaryOutput(output));
92
+ return map;
93
+ }
94
+ /** Stacks (lexicons) that declare a deploy-time parameter — external input. */
95
+ export function externalInputStacks(entities) {
96
+ const stacks = new Set();
97
+ for (const [, entity] of entities) {
98
+ if ("parameterType" in entity && typeof entity.parameterType === "string") {
99
+ stacks.add(entity.lexicon);
100
+ }
101
+ }
102
+ return [...stacks].sort();
103
+ }
104
+ async function gitTopLevel(cwd) {
105
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], { cwd });
106
+ return stdout.trim();
107
+ }
108
+ /**
109
+ * Check out `ref` into a throwaway worktree, symlink the repo's node_modules so
110
+ * lexicon imports resolve, run `fn`, then remove the worktree. At most one
111
+ * worktree exists at a time.
112
+ */
113
+ async function withWorktree(repoRoot, ref, fn) {
114
+ const dir = mkdtempSync(join(tmpdir(), "chant-affected-"));
115
+ await execFileAsync("git", ["worktree", "add", "--detach", dir, ref], { cwd: repoRoot });
116
+ try {
117
+ const nm = join(repoRoot, "node_modules");
118
+ const linked = join(dir, "node_modules");
119
+ if (existsSync(nm) && !existsSync(linked))
120
+ symlinkSync(nm, linked, "dir");
121
+ return await fn(dir);
122
+ }
123
+ finally {
124
+ await execFileAsync("git", ["worktree", "remove", "--force", dir], { cwd: repoRoot }).catch(() => {
125
+ rmSync(dir, { recursive: true, force: true });
126
+ });
127
+ }
128
+ }
129
+ /**
130
+ * Build each declared stack's own source directory and key the result by
131
+ * **stack name**.
132
+ *
133
+ * Without this, one build of the project root produces a map keyed by lexicon
134
+ * partition, so an aws-only estate of fifteen stacks answers "aws changed" no
135
+ * matter which one moved. That answer cannot be joined to anything: a
136
+ * component's deploy step names a stack, not a lexicon, so
137
+ * `componentsForUnits` (../components/fan-out.ts) would claim none of it and
138
+ * a fan-out derived from it would be empty. The two halves have to speak the
139
+ * same names for either to be worth having.
140
+ *
141
+ * A stack that serializes through more than one lexicon folds its partitions
142
+ * into one artifact, because the unit being deployed is the stack.
143
+ */
144
+ async function stackArtifacts(root, serializers, stacks,
145
+ /**
146
+ * Whether a missing `src` is an error. True for the head side, where every
147
+ * declared stack must exist; false for the base side, where a stack added
148
+ * since then legitimately has no source yet and reads as an empty artifact,
149
+ * which is what makes it `changed`.
150
+ */
151
+ requireSrc) {
152
+ const artifacts = new Map();
153
+ const externalInput = [];
154
+ for (const stack of stacks) {
155
+ const src = resolve(root, stack.src);
156
+ // `build()` on a directory that is not there returns empty outputs rather
157
+ // than throwing, so a typo in `src` would make both sides build nothing,
158
+ // match, and report the stack as unchanged forever. A silent answer of
159
+ // exactly that shape is what this whole path exists to prevent.
160
+ if (requireSrc && !existsSync(src)) {
161
+ throw new Error(`stack "${stack.name}" declares src "${stack.src}", which does not exist under ${root}. ` +
162
+ `Fix chant.config.ts's stacks[] entry: a source directory that is not there builds to nothing, ` +
163
+ `and a stack that builds to nothing can never be reported as changed.`);
164
+ }
165
+ const built = await build(src, serializers);
166
+ artifacts.set(stack.name, [...built.outputs.entries()]
167
+ .sort(([a], [b]) => a.localeCompare(b))
168
+ .map(([lexicon, output]) => `${lexicon}\n${getPrimaryOutput(output)}`)
169
+ .join("\n"));
170
+ if (externalInputStacks(built.entities).length > 0)
171
+ externalInput.push(stack.name);
172
+ }
173
+ return { artifacts, externalInput: externalInput.sort() };
174
+ }
175
+ /**
176
+ * Compute the affected stacks for a change. Head is built in place (the working
177
+ * tree); base is built from `baseDir` if supplied, else from `baseRef` via a
178
+ * single throwaway worktree. Builds are deterministic, so a cached/supplied base
179
+ * is as trustworthy as a rebuild.
180
+ */
181
+ export async function affectedStacks(opts) {
182
+ const projectPath = resolve(opts.projectPath);
183
+ const needsWorktree = Boolean(opts.headRef) || Boolean(opts.baseRef && !opts.baseDir);
184
+ const repoRoot = needsWorktree ? await gitTopLevel(projectPath) : projectPath;
185
+ // Canonicalize via realpath so the worktree-relative path is correct even when
186
+ // the temp dir is a symlink (macOS /var → /private/var) and `git
187
+ // rev-parse --show-toplevel` reports the real path.
188
+ const relProject = needsWorktree ? relative(repoRoot, realpathSync(projectPath)) : "";
189
+ // Head: the in-place build of the working tree, unless an explicit headRef is
190
+ // given (then a throwaway worktree — removed before the base worktree, so at
191
+ // most one exists at a time).
192
+ const perStack = opts.stacks && opts.stacks.length > 0 ? opts.stacks : undefined;
193
+ // No cross-stack graph in per-stack mode, by construction: see `stacks` above.
194
+ const EMPTY_GRAPH = { nodes: [], edges: [], order: [], waves: [], cycles: [] };
195
+ /** One build root in, its artifact map and external-input set out, at whichever granularity applies. */
196
+ const readArtifacts = async (root, isHead) => {
197
+ if (perStack)
198
+ return { ...(await stackArtifacts(root, opts.serializers, perStack, isHead)), graph: EMPTY_GRAPH };
199
+ const built = await build(root, opts.serializers);
200
+ return {
201
+ artifacts: artifactMap(built.outputs),
202
+ externalInput: externalInputStacks(built.entities),
203
+ graph: built.manifest.stackGraph,
204
+ };
205
+ };
206
+ const head = opts.headRef
207
+ ? await withWorktree(repoRoot, opts.headRef, (dir) => readArtifacts(join(dir, relProject), true))
208
+ : await readArtifacts(projectPath, true);
209
+ // Base: caller-supplied dir (cheapest), else a single worktree at baseRef.
210
+ let baseMap;
211
+ if (opts.baseDir) {
212
+ baseMap = (await readArtifacts(resolve(opts.baseDir), false)).artifacts;
213
+ }
214
+ else if (opts.baseRef) {
215
+ baseMap = await withWorktree(repoRoot, opts.baseRef, async (dir) => (await readArtifacts(join(dir, relProject), false)).artifacts);
216
+ }
217
+ else {
218
+ throw new Error("affectedStacks requires either baseDir or baseRef");
219
+ }
220
+ return computeAffected(baseMap, head.artifacts, head.graph, {
221
+ includeDependents: opts.includeDependents,
222
+ externalInput: head.externalInput,
223
+ });
224
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * assertLive (#1857) — the read half of the test harness (#1224):
3
+ * observation-backed assertions against a live deploy, for exactly one
4
+ * declared entity at a time. Same primitive teardown.ts's fallback path
5
+ * uses — `describeResources` — turned into a pass/throw instead of a
6
+ * would-delete set.
7
+ *
8
+ * The observation contract (#1089) draws a hard line between OBSERVED-ABSENT
9
+ * and NOT-OBSERVED: a declared entity the read could not cover is never the
10
+ * same as one confirmed missing. `assertLiveEntity` preserves that line by
11
+ * construction — NOT-OBSERVED throws {@link UnobservedAssertionError}, a type
12
+ * distinct from the {@link LiveAssertionError} an observed-absent, foreign,
13
+ * or status-mismatched verdict throws, so a caller can tell "could not tell"
14
+ * from "confirmed wrong" without parsing a message.
15
+ *
16
+ * Marker verification is best-effort by the same logic {@link
17
+ * ResourceMetadata.marker}'s own contract states: a lexicon with no marker
18
+ * channel on this read path reports no marker at all, which is not the same
19
+ * claim as "foreign". Enforcing a match whenever the channel exists — a present
20
+ * mismatch, or `ownership: "foreign"` with no marker to show — catches the
21
+ * case the harness cares about (a same-named leftover from another env);
22
+ * an absent channel is passed through unverified rather than making every
23
+ * lexicon without one unusable.
24
+ */
25
+ import { normalizeObservation, unobservedAll, unobservedReasonText } from "../observation.js";
26
+ /**
27
+ * Thrown by {@link assertLiveEntity} for a confirmed failure: observed
28
+ * absent, a marker that names another stack/env, a resource confirmed
29
+ * foreign, or a status mismatch. Never thrown for NOT-OBSERVED — see {@link
30
+ * UnobservedAssertionError}.
31
+ */
32
+ export class LiveAssertionError extends Error {
33
+ constructor(message) {
34
+ super(message);
35
+ this.name = "LiveAssertionError";
36
+ }
37
+ }
38
+ /**
39
+ * Thrown when the entity is NOT-OBSERVED (#1089) rather than confirmed
40
+ * present or absent. Kept as its own type, not a flag on {@link
41
+ * LiveAssertionError}: a suite (or a CI policy) that wants to fail loudly on
42
+ * "could not tell" but treat it differently from a confirmed miss can catch
43
+ * this one specifically.
44
+ */
45
+ export class UnobservedAssertionError extends Error {
46
+ constructor(entity, reason, detail) {
47
+ super(`assertLive("${entity}") is NOT-OBSERVED — ${unobservedReasonText(reason)}` +
48
+ `${detail ? `: ${detail}` : ""}. An entity chant could not read is never the same as one confirmed absent.`);
49
+ this.entity = entity;
50
+ this.reason = reason;
51
+ this.detail = detail;
52
+ this.name = "UnobservedAssertionError";
53
+ }
54
+ }
55
+ /** True when `meta` names a different stack/env than `marker`, on whichever signal it carries. */
56
+ function isConfirmedForeign(meta, marker) {
57
+ if (meta.marker)
58
+ return meta.marker.stack !== marker.stack || meta.marker.env !== marker.env;
59
+ return meta.ownership === "foreign";
60
+ }
61
+ /**
62
+ * Assert one declared entity is live: observed present in `environment`, not
63
+ * a confirmed-foreign resource, and — when `status` is given — reporting
64
+ * that status. Resolves to the entity's {@link ResourceMetadata} on success.
65
+ *
66
+ * Throws {@link UnobservedAssertionError} for NOT-OBSERVED. Throws {@link
67
+ * LiveAssertionError} for observed-absent, a confirmed-foreign identity, or a
68
+ * status mismatch.
69
+ */
70
+ export async function assertLiveEntity(opts) {
71
+ const { plugin, name, entityType, props, buildOutput, environment, marker, status } = opts;
72
+ if (!plugin.describeResources) {
73
+ throw new UnobservedAssertionError(name, "unsupported-kind", `the "${plugin.name}" lexicon implements no describeResources`);
74
+ }
75
+ let observed;
76
+ try {
77
+ observed = normalizeObservation(await plugin.describeResources({
78
+ environment,
79
+ buildOutput,
80
+ entityNames: [name],
81
+ entities: new Map([[name, { entityType, props }]]),
82
+ }));
83
+ }
84
+ catch (err) {
85
+ const detail = err instanceof Error ? err.message : String(err);
86
+ observed = {
87
+ resources: {},
88
+ unobserved: unobservedAll([name], "read-failed", detail, { [name]: entityType }),
89
+ queried: {},
90
+ sources: {},
91
+ notes: [],
92
+ };
93
+ }
94
+ const unobserved = observed.unobserved[name];
95
+ if (unobserved)
96
+ throw new UnobservedAssertionError(name, unobserved.reason, unobserved.detail);
97
+ const meta = observed.resources[name];
98
+ if (!meta) {
99
+ throw new LiveAssertionError(`assertLive("${name}"): observed absent — chant looked and "${environment}" reported no such resource.`);
100
+ }
101
+ if (isConfirmedForeign(meta, marker)) {
102
+ const found = meta.marker ? `{ stack: "${meta.marker.stack}", env: "${meta.marker.env ?? ""}" }` : "no chant marker";
103
+ throw new LiveAssertionError(`assertLive("${name}"): observed, but it is not this deploy's — carries ${found}, not ` +
104
+ `{ stack: "${marker.stack}", env: "${marker.env ?? ""}" }. A same-named resource from another stack or env cannot satisfy this assertion.`);
105
+ }
106
+ if (status !== undefined && meta.status !== status) {
107
+ throw new LiveAssertionError(`assertLive("${name}", { status: "${status}" }): observed with status "${meta.status}".`);
108
+ }
109
+ return meta;
110
+ }