@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,129 @@
1
+ /**
2
+ * Release plan store (ws-055, #2733, part of the chud retirement epic
3
+ * #2715): persists a release plan — the work items and evidence a release
4
+ * ships — to the `chant/lifecycle` orphan branch, content-addressed by the
5
+ * plan's own digest.
6
+ *
7
+ * **Why this exists.** ws-055 (docs/design/decisions/ws-055-dev-model-
8
+ * ledgers.md) decided where a development model's plans live: "a release
9
+ * plan is written content-addressed to `_plans/<digest>.json` on
10
+ * chant/lifecycle, and the release ledger record already names that
11
+ * digest." A `ReleaseRecord.digest` (../lifecycle/release-ledger.ts) is
12
+ * ordinarily an artifact digest; for a release a runner (the studio kit
13
+ * today, chud before it) plans work-item by work-item, that same field
14
+ * *is* the plan's own digest — the release ledger needs no new field to
15
+ * point at it, it already names the plan. Reading a release through the
16
+ * read contract (../workspace/status.ts) resolves that digest to the plan
17
+ * exactly the way it already resolves a build archive digest to a
18
+ * `BuildArchiveManifest` (./build-ledger-store.ts) — this module is that
19
+ * store's plan-shaped sibling, same plumbing, same directory-per-kind
20
+ * convention on the one orphan branch.
21
+ *
22
+ * **Storage.** Reuses `writeBlobToPath`/`readBlobFromPath` (./git.ts) —
23
+ * the identical hash-object -> mktree -> commit-tree -> update-ref
24
+ * pipeline `writeSnapshot`/`persistBuildManifest` already use. Plans live
25
+ * under a fixed top-level `_plans/` directory, a peer of `_builds/` and the
26
+ * per-env directories, never nested inside one — a plan is not env-scoped,
27
+ * it is named by its own content. Per #2524 D7 / #2538, `writeBlobToPath`'s
28
+ * `ledgerDir` already folds a workspace member's own `_members/<member>/`
29
+ * prefix in ahead of `_plans/`, so a member's plans live at
30
+ * `_members/<member>/_plans/<digest>.json` the same way its build records
31
+ * live at `_members/<member>/_builds/` — this module does nothing itself
32
+ * to earn that; it falls out of reusing the shared plumbing.
33
+ *
34
+ * **Content-addressed, keyed by the plan's own `digest`.** One file per
35
+ * plan, `_plans/<digest-with-":"->"_">.json` (`:` is not usable in a git
36
+ * tree entry name the way `readBlobFromPath`'s `<ref>:<path>` spelling
37
+ * reads it back, the same reason `./build-ledger-store.ts` substitutes it
38
+ * for `_builds/`). The digest is computed by whoever plans the release —
39
+ * the release Op, or a runner like the studio kit — not by chant; this
40
+ * module only trusts and stores it, exactly as `persistBuildManifest`
41
+ * trusts a manifest's own `manifestDigest`.
42
+ *
43
+ * **A plan already written is never rewritten (#2733 acceptance).**
44
+ * Unlike `persistBuildManifest`, which writes unconditionally every call
45
+ * (safe only because identical content produces an identical blob and,
46
+ * usually, an identical tree — but still a new, redundant commit on the
47
+ * branch each time), `persistReleasePlan` reads the path first and returns
48
+ * without writing when a plan is already stored under that digest. A plan
49
+ * is immutable by construction (it is named by a hash of its own content),
50
+ * so there is never a reason to overwrite one — only ever a reason to skip
51
+ * the write.
52
+ */
53
+ import { sortedJsonReplacer } from "../utils.js";
54
+ import { writeBlobToPath, readBlobFromPath, RefCASConflictError } from "./git.js";
55
+ /** Fixed top-level directory on the `chant/lifecycle` orphan branch that holds every persisted release plan — a peer of `_builds/` and the per-env directories, never nested inside one (see module doc for why). */
56
+ const PLANS_DIR = "_plans";
57
+ /** Thrown by `persistReleasePlan` when the plan carries no usable `digest` — a plan can't be content-addressed without one. */
58
+ export class InvalidReleasePlanError extends Error {
59
+ constructor(message) {
60
+ super(message);
61
+ this.name = "InvalidReleasePlanError";
62
+ }
63
+ }
64
+ /** Turn a `sha256:...`-style digest into a filesystem/git-tree-safe filename stem. */
65
+ function digestToFilenameStem(digest) {
66
+ return digest.replace(/:/g, "_");
67
+ }
68
+ function planFilename(digest) {
69
+ return `${digestToFilenameStem(digest)}.json`;
70
+ }
71
+ /**
72
+ * Persist a release plan to the orphan branch, keyed by its own `digest`.
73
+ * Does not push to the remote — call `pushLifecycle` (./git.ts) afterward,
74
+ * the same two-step (`write` then `push`) shape `appendReleaseRecord`/
75
+ * `persistBuildManifest` use, so a caller persisting a plan alongside the
76
+ * release record it names can batch both into one push.
77
+ *
78
+ * Never rewrites a plan already stored under `plan.digest` (#2733
79
+ * acceptance) — reads the path first, and returns `{ commit: null, written:
80
+ * false }` without writing when it is already there. A `RefCASConflictError`
81
+ * from a genuine race (another writer persisted the same digest's plan
82
+ * between this call's read and its write) is treated the same way: the
83
+ * plan is content-addressed, so whatever is already at that path under this
84
+ * digest is authoritative, never overwritten.
85
+ */
86
+ export async function persistReleasePlan(plan, opts) {
87
+ if (typeof plan.digest !== "string" || plan.digest.length === 0) {
88
+ throw new InvalidReleasePlanError("release plan is missing its own \"digest\" field — a release plan is content-addressed by its own digest");
89
+ }
90
+ const filename = planFilename(plan.digest);
91
+ const existing = await readBlobFromPath(PLANS_DIR, filename, opts);
92
+ if (existing !== null)
93
+ return { commit: null, written: false };
94
+ const json = JSON.stringify(plan, sortedJsonReplacer);
95
+ try {
96
+ const commit = await writeBlobToPath(PLANS_DIR, filename, json, "Release plan", { ...opts, expectPriorPathSha: null });
97
+ return { commit, written: true };
98
+ }
99
+ catch (err) {
100
+ if (err instanceof RefCASConflictError)
101
+ return { commit: null, written: false };
102
+ throw err;
103
+ }
104
+ }
105
+ /**
106
+ * Read a persisted release plan back by its own digest — the same digest a
107
+ * `ReleaseRecord.digest` names. Returns `null` when no plan was ever
108
+ * persisted under that digest (never throws — most releases carry no plan
109
+ * at all, and reading one for status is a normal, expected miss), and when
110
+ * the stored blob fails to parse as JSON.
111
+ *
112
+ * `prefix` lets a multi-member reader (../workspace/status.ts) resolve a
113
+ * specific member's plan directory directly, the same way
114
+ * `readReleaseLedgerLines` is handed an already-member-prefixed path there
115
+ * — `cwd` alone can't do it, since one status read walks every member from
116
+ * one process without changing directory per member.
117
+ */
118
+ export async function readReleasePlan(digest, opts) {
119
+ const dir = `${opts?.prefix ?? ""}${PLANS_DIR}`;
120
+ const content = await readBlobFromPath(dir, planFilename(digest), opts);
121
+ if (!content)
122
+ return null;
123
+ try {
124
+ return JSON.parse(content);
125
+ }
126
+ catch {
127
+ return null;
128
+ }
129
+ }
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Receipt planning (#1832, epic #1703) — the plan half of the effect-receipt
3
+ * contract.
4
+ *
5
+ * A receipt is declared, diffed, and observed like any resource, but it is
6
+ * OBSERVE-ONLY to the generic apply path: the `effect()` step (#1834) is the
7
+ * sole writer, on success, last (epic decision log, item 3). The plan's job is
8
+ * therefore not "create the receipt" — it is "say whether the effect will
9
+ * fire". This module compares each declared receipt's live value against its
10
+ * resolved expectation and classifies:
11
+ *
12
+ * - absent or differing → an `effect` entry ("effect will fire") — including
13
+ * the crash-between-effect-and-write case, where a stale or missing receipt
14
+ * re-proposes the fire on the next plan. That re-proposal is the whole
15
+ * at-least-once guarantee; anything that stamps the receipt on the generic
16
+ * path silently converts it into never.
17
+ * - equal → `noop` — the effect has run for these inputs; the plan is clean.
18
+ * - unobservable → `unobserved`, loudly. A receipt nobody could read is a
19
+ * hole in the plan, never a clean row.
20
+ * - a reference input that cannot resolve at plan time → an `effect` entry
21
+ * with an "unresolved input" note, never a guessed digest. The effect step
22
+ * resolves again at run and decides there.
23
+ *
24
+ * A receipt name is also stripped out of whatever the generic change-set
25
+ * classification proposed for it ({@link mergeReceiptEntries}): a receipt is
26
+ * never a `create`, never an `update`, and never a `delete`/`adopt` prune
27
+ * candidate — the entries built here are the only rows a receipt gets.
28
+ *
29
+ * Pure: no I/O. Live state arrives as {@link ReceiptReading}s the caller
30
+ * built from its observations; reference inputs resolve through the
31
+ * caller-supplied resolver ({@link observedValueResolver} builds one over the
32
+ * plan's merged observed values).
33
+ */
34
+ import { AttrRef } from "../attrref.js";
35
+ import { EXISTENCE_EXPECTATION, resolveReceiptExpectation, } from "../effect-receipt.js";
36
+ /**
37
+ * The attribute a materialized receipt's live value is read from. A lexicon
38
+ * receipt row's observation (#1835) maps the stored value onto
39
+ * `attributes[RECEIPT_VALUE_ATTRIBUTE]`; `Value` is accepted as a fallback for
40
+ * observations that keep the provider's own casing (SSM's `Value`).
41
+ */
42
+ export const RECEIPT_VALUE_ATTRIBUTE = "value";
43
+ /** Read a live receipt's stored value off an observation's attributes. */
44
+ export function readReceiptValue(attributes) {
45
+ if (!attributes)
46
+ return undefined;
47
+ if (RECEIPT_VALUE_ATTRIBUTE in attributes)
48
+ return attributes[RECEIPT_VALUE_ATTRIBUTE];
49
+ return attributes["Value"];
50
+ }
51
+ /**
52
+ * A {@link ReceiptInputResolver} over the plan's merged observed values: an
53
+ * attr-ref resolves to the referenced entity's observed attribute. Anything
54
+ * that is not among the observed values throws — which `planReceipts` renders
55
+ * as an effect-will-fire entry with an "unresolved input" note rather than a
56
+ * guessed expectation.
57
+ */
58
+ export function observedValueResolver(resources) {
59
+ return (ref, path) => {
60
+ if (ref instanceof AttrRef) {
61
+ const entity = ref.getLogicalName();
62
+ if (!entity) {
63
+ throw new Error(`unresolved input at ${path}: attr-ref carries no logical name`);
64
+ }
65
+ const attrs = resources[entity]?.attributes;
66
+ if (!attrs || !(ref.attribute in attrs)) {
67
+ throw new Error(`unresolved input at ${path}: ${entity}.${ref.attribute} is not among the observed values`);
68
+ }
69
+ return attrs[ref.attribute];
70
+ }
71
+ throw new Error(`unresolved input at ${path}: reference cannot resolve at plan time`);
72
+ };
73
+ }
74
+ /**
75
+ * Classify every declared receipt into its change-set entry. See the module
76
+ * doc for the classification; entries come back sorted by name.
77
+ */
78
+ export function planReceipts(receipts, readings, resolver) {
79
+ const entries = [];
80
+ for (const [name, receipt] of receipts) {
81
+ const reading = readings.get(name);
82
+ const base = {
83
+ name,
84
+ type: reading?.type ?? receipt.entityType,
85
+ ...(reading?.lexicon ? { lexicon: reading.lexicon } : {}),
86
+ ...(reading?.physicalId ? { physicalId: reading.physicalId } : {}),
87
+ effect: receipt.effect,
88
+ ownership: "unknown",
89
+ };
90
+ const evidence = {
91
+ declared: true,
92
+ inSnapshot: false,
93
+ live: reading?.present ?? false,
94
+ observed: reading?.observed ?? false,
95
+ };
96
+ if (!reading) {
97
+ // No loaded lexicon materializes or observes this receipt — a hole,
98
+ // said loudly, never a silently clean row (#1089's tri-state).
99
+ entries.push({
100
+ ...base,
101
+ action: "unobserved",
102
+ evidence,
103
+ unobservedReason: "unsupported-kind",
104
+ unobservedDetail: `no loaded lexicon materializes or observes this receipt — ` +
105
+ `whether effect "${receipt.effect}" has run is unknown, not clean`,
106
+ });
107
+ continue;
108
+ }
109
+ if (!reading.observed) {
110
+ entries.push({
111
+ ...base,
112
+ action: "unobserved",
113
+ evidence,
114
+ unobservedReason: reading.unobservedReason ?? "read-failed",
115
+ ...(reading.unobservedDetail ? { unobservedDetail: reading.unobservedDetail } : {}),
116
+ });
117
+ continue;
118
+ }
119
+ // Resolve the expectation. A reference that cannot resolve at plan time
120
+ // is never guessed around: the fire is proposed with the note, and the
121
+ // effect step resolves again at run (epic decision log, item 5).
122
+ let expectation;
123
+ let unresolved;
124
+ try {
125
+ expectation = resolveReceiptExpectation(receipt, resolver);
126
+ }
127
+ catch (err) {
128
+ unresolved = err instanceof Error ? err.message : String(err);
129
+ }
130
+ if (!reading.present) {
131
+ entries.push({
132
+ ...base,
133
+ action: "effect",
134
+ evidence,
135
+ effectReason: "receipt-absent",
136
+ effectDetail: `receipt confirmed absent — no run of "${receipt.effect}" is recorded` +
137
+ (unresolved ? ` (${unresolved})` : ""),
138
+ });
139
+ continue;
140
+ }
141
+ if (expectation === undefined) {
142
+ entries.push({
143
+ ...base,
144
+ action: "effect",
145
+ evidence,
146
+ effectReason: "unresolved-input",
147
+ effectDetail: unresolved,
148
+ });
149
+ continue;
150
+ }
151
+ if (reading.value === expectation) {
152
+ entries.push({ ...base, action: "noop", evidence });
153
+ continue;
154
+ }
155
+ entries.push({
156
+ ...base,
157
+ action: "effect",
158
+ evidence,
159
+ effectReason: "receipt-stale",
160
+ effectDetail: receipt.flavor === "existence"
161
+ ? `live value ${fmtValue(reading.value)} is not the existence marker "${EXISTENCE_EXPECTATION}"`
162
+ : `live value ${fmtValue(reading.value)} differs from expected ${expectation}`,
163
+ });
164
+ }
165
+ entries.sort((a, b) => a.name.localeCompare(b.name));
166
+ return entries;
167
+ }
168
+ /**
169
+ * Replace whatever the generic classification proposed for the receipts with
170
+ * the receipt entries built by {@link planReceipts}, in place.
171
+ *
172
+ * This is the plan-side write-exclusion (#1832): the generic change set,
173
+ * knowing nothing about receipts, classifies a declared-but-absent receipt as
174
+ * `create` and an undeclared-but-live one as `delete`/`adopt` — proposals the
175
+ * generic apply path must never act on for a receipt, and prune candidacy a
176
+ * receipt must never have. Every entry named like a receipt is dropped and
177
+ * the receipt's own entries stand in.
178
+ */
179
+ export function mergeReceiptEntries(cs, receipts, receiptEntries) {
180
+ if (receipts.size === 0)
181
+ return cs;
182
+ cs.entries = cs.entries.filter((e) => !receipts.has(e.name));
183
+ cs.entries.push(...receiptEntries);
184
+ cs.entries.sort((a, b) => a.name.localeCompare(b.name));
185
+ return cs;
186
+ }
187
+ function fmtValue(v) {
188
+ if (v === undefined)
189
+ return "<unset>";
190
+ const s = typeof v === "string" ? v : JSON.stringify(v);
191
+ return s.length > 72 ? `${s.slice(0, 69)}...` : s;
192
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Release ledger — the recorded half of build & deploy observability (#568,
3
+ * epic #551 "Build & deploy observability").
4
+ *
5
+ * chant already has the *live-truth* half: ownership markers stamp stack/env
6
+ * identity on live resources, `lifecycle diff --live` / `lifecycle plan`
7
+ * compare declared vs live, and snapshots on `chant/lifecycle` give a
8
+ * forensic timeline (see ./snapshot.ts, ./live-diff.ts, ./change-set.ts).
9
+ * What was missing is the *record* half: "what we recorded deploying",
10
+ * independent of whether the thing is still running.
11
+ *
12
+ * A release record is immutable and append-only: each deploy appends one line
13
+ * to `<env>/releases.jsonl` on the `chant/lifecycle` orphan branch (see
14
+ * ./git.ts's `appendReleaseRecord`/`readReleaseLedger`) — never rewritten,
15
+ * never replaced in place, mirroring how the snapshot branch itself is
16
+ * treated as observational evidence rather than a mutable state file. The
17
+ * append-only property is what makes "which build was in staging on
18
+ * Tuesday" answerable months later even after staging has moved on to a
19
+ * dozen newer digests.
20
+ *
21
+ * The binding key is the artifact **digest** (`sha256:...`), the same
22
+ * identity `BuildArchive` manifests and `publish-image`/`load-image-on-host`
23
+ * promote by (see ../components/verbs/build-archive.ts,
24
+ * ../components/verbs/publish.ts). Because publish promotes by digest never
25
+ * rebuilding, the same identity threads build → dev → staging → prod, so
26
+ * "which build is in prod, and is it the one tested in staging" is a
27
+ * straightforward digest comparison over this ledger — never a guess through
28
+ * CI logs.
29
+ */
30
+ import { sortedJsonReplacer } from "../utils.js";
31
+ import { warnOnLegacyDigests, withoutReadFlags } from "./legacy-digest.js";
32
+ import { appendReleaseRecordLine, readReleaseLedgerLines, listLedgerEnvironments as gitListLedgerEnvironments } from "./git.js";
33
+ import { parseReleaseLedger, validateReleaseRecord } from "./release-read.js";
34
+ // The pure readers live apart, so a bundle can import them without git (#3865).
35
+ export { validateReleaseRecord, parseReleaseLedger, releaseLedgerLines, readReleaseRecords, listReleaseEnvironmentsOn } from "./release-read.js";
36
+ /** Thrown by `appendReleaseRecord` when the record is missing a required field — a release record can never be recorded partially, since it is never editable afterward. */
37
+ export class InvalidReleaseRecordError extends Error {
38
+ constructor(missing) {
39
+ super(`release record is missing required field(s): ${missing.join(", ")}`);
40
+ this.missing = missing;
41
+ this.name = "InvalidReleaseRecordError";
42
+ }
43
+ }
44
+ /**
45
+ * Resolve a run id and its origin from the same environment, in one step, so
46
+ * the two cannot skew (#2045). Resolution order mirrors what
47
+ * `chant components release` always did — explicit id, then
48
+ * `GITHUB_RUN_ID`, then `CI_PIPELINE_ID`, then a locally minted
49
+ * `local-<ms>` — but now each source also names its id space:
50
+ *
51
+ * - the GitHub path records `repo` (`GITHUB_REPOSITORY`) and builds the run
52
+ * `url` from `GITHUB_SERVER_URL` — which also makes a Forgejo instance's
53
+ * runs resolvable, since Forgejo Actions implements the same env contract;
54
+ * - the GitLab path records `repo` (`CI_PROJECT_PATH`) and takes
55
+ * `CI_PIPELINE_URL` verbatim;
56
+ * - the local mint says `local` in a field instead of only in the id's
57
+ * spelling.
58
+ *
59
+ * An explicit id still gets an origin when it matches the id the environment
60
+ * itself is advertising (a CI job passing `--run-id $GITHUB_RUN_ID`);
61
+ * otherwise the caller's id is recorded without one — guessing an origin the
62
+ * caller did not state would be exactly the inference this field exists to
63
+ * remove.
64
+ */
65
+ export function resolveRunId(explicit, env = process.env) {
66
+ const githubOrigin = (id) => ({
67
+ forge: "github",
68
+ ...(env.GITHUB_REPOSITORY ? { repo: env.GITHUB_REPOSITORY } : {}),
69
+ ...(env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY
70
+ ? { url: `${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}/actions/runs/${id}` }
71
+ : {}),
72
+ });
73
+ const gitlabOrigin = () => ({
74
+ forge: "gitlab",
75
+ ...(env.CI_PROJECT_PATH ? { repo: env.CI_PROJECT_PATH } : {}),
76
+ ...(env.CI_PIPELINE_URL ? { url: env.CI_PIPELINE_URL } : {}),
77
+ });
78
+ if (explicit) {
79
+ if (env.GITHUB_RUN_ID && explicit === env.GITHUB_RUN_ID)
80
+ return { runId: explicit, runOrigin: githubOrigin(explicit) };
81
+ if (env.CI_PIPELINE_ID && explicit === env.CI_PIPELINE_ID)
82
+ return { runId: explicit, runOrigin: gitlabOrigin() };
83
+ return { runId: explicit };
84
+ }
85
+ if (env.GITHUB_RUN_ID)
86
+ return { runId: env.GITHUB_RUN_ID, runOrigin: githubOrigin(env.GITHUB_RUN_ID) };
87
+ if (env.CI_PIPELINE_ID)
88
+ return { runId: env.CI_PIPELINE_ID, runOrigin: gitlabOrigin() };
89
+ return { runId: `local-${Date.now()}`, runOrigin: { forge: "local" } };
90
+ }
91
+ /**
92
+ * Append one immutable release record to the `<env>` ledger on the
93
+ * `chant/lifecycle` orphan branch. Throws `InvalidReleaseRecordError` before
94
+ * any git operation runs if a required field is missing — never partially
95
+ * records, since nothing about a release record is editable after the fact.
96
+ *
97
+ * Does not push to the remote; call `pushLifecycle` (./git.ts) afterward, the
98
+ * same two-step (`write` then `push`) shape `takeSnapshot` (./snapshot.ts)
99
+ * uses, so a caller recording several releases in one run can batch the push.
100
+ */
101
+ export async function appendReleaseRecord(input, opts) {
102
+ const missing = validateReleaseRecord(input);
103
+ if (missing.length > 0)
104
+ throw new InvalidReleaseRecordError(missing);
105
+ // `flags` are read-side only (#2514); a record passed back in never persists them.
106
+ const record = { version: 1, ...withoutReadFlags(input) };
107
+ const json = JSON.stringify(record, sortedJsonReplacer);
108
+ const commit = await appendReleaseRecordLine(record.env, json, opts);
109
+ return { commit, record };
110
+ }
111
+ /**
112
+ * Read every release record for `environment`, oldest first. Malformed lines
113
+ * (a hand-edited or corrupted ledger) are skipped rather than throwing, since
114
+ * a status query should degrade gracefully rather than fail outright on one
115
+ * bad line — but each skip is reported so callers/tests can surface it.
116
+ */
117
+ export async function readReleaseLedger(environment, opts) {
118
+ const { records, malformed } = parseReleaseLedger(await readReleaseLedgerLines(environment, opts));
119
+ // chant #2514 — say once that this ledger holds values in the old form.
120
+ warnOnLegacyDigests(records.flatMap((r) => [r.digest, r.manifestDigest, r.inputDigest]), "release ledger", opts?.cwd);
121
+ return { records, malformed };
122
+ }
123
+ /**
124
+ * List every environment that has release records on the orphan branch. With
125
+ * `member` or `ledgerPrefix` (#3865) it lists that workspace member's, from
126
+ * wherever `cwd` is; without either, the member `cwd` resolves to.
127
+ */
128
+ export async function listReleaseEnvironments(opts) {
129
+ return gitListLedgerEnvironments(opts);
130
+ }
131
+ /**
132
+ * The latest release record per component in `records` — "what we recorded
133
+ * deploying" reduces to one row per component by taking the most recent
134
+ * `timestamp` (ties broken by ledger order, i.e. later append wins), since
135
+ * a component may have many historical records in one environment's ledger.
136
+ */
137
+ export function latestPerComponent(records) {
138
+ const latest = new Map();
139
+ for (const record of records) {
140
+ const current = latest.get(record.component);
141
+ if (!current || record.timestamp >= current.timestamp) {
142
+ latest.set(record.component, record);
143
+ }
144
+ }
145
+ return latest;
146
+ }
147
+ /**
148
+ * Find every release record across `records` that references `digest` — the
149
+ * cross-environment query "is the build in prod the one tested in staging"
150
+ * reduces to: read both envs' ledgers, then check whether the same digest
151
+ * appears in each. Sorted oldest first, matching ledger order.
152
+ */
153
+ export function recordsForDigest(records, digest) {
154
+ return records.filter((r) => r.digest === digest);
155
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Reading release records without git (#3865). The parsing and the
3
+ * environment listing of `release-ledger.ts`, over a {@link LedgerReadPort}
4
+ * instead of a checkout, so a product bundles them in one file
5
+ * (`release-read-bundle.test.ts` holds the import graph). Pass
6
+ * `gitLedgerReadPort({ member })` from `./git.ts` to read a workspace member's
7
+ * ledger from a checkout, or a port of your own.
8
+ *
9
+ * `release-ledger.ts` reads through these too; its `readReleaseLedger` and
10
+ * `listReleaseEnvironments` also take `member` or `ledgerPrefix`.
11
+ */
12
+ import { flagLegacyDigest } from "./legacy-digest.js";
13
+ /** Required, non-empty-string fields every `ReleaseRecord` must carry. */
14
+ const REQUIRED_STRING_FIELDS = ["component", "env", "digest", "gitSha", "runId", "timestamp", "actor"];
15
+ /** The required fields a release record lacks as non-empty strings. */
16
+ export function validateReleaseRecord(record) {
17
+ const missing = [];
18
+ for (const field of REQUIRED_STRING_FIELDS) {
19
+ const value = record[field];
20
+ if (typeof value !== "string" || value.length === 0)
21
+ missing.push(field);
22
+ }
23
+ return missing;
24
+ }
25
+ /** The lines of a `releases.jsonl` file: trimmed, blanks dropped. */
26
+ export function releaseLedgerLines(text) {
27
+ return text ? text.split("\n").map((line) => line.trim()).filter(Boolean) : [];
28
+ }
29
+ /**
30
+ * Parse release ledger lines, oldest first. A malformed line is counted and
31
+ * skipped; a digest recorded by the old 32-bit hash reads back flagged
32
+ * (#2514), never re-keyed.
33
+ */
34
+ export function parseReleaseLedger(lines) {
35
+ const records = [];
36
+ let malformed = 0;
37
+ for (const line of lines) {
38
+ try {
39
+ const parsed = JSON.parse(line);
40
+ if (parsed === null || typeof parsed !== "object" || validateReleaseRecord(parsed).length > 0) {
41
+ malformed++;
42
+ continue;
43
+ }
44
+ records.push(flagLegacyDigest(parsed, [parsed.digest, parsed.manifestDigest, parsed.inputDigest]));
45
+ }
46
+ catch {
47
+ malformed++;
48
+ }
49
+ }
50
+ return { records, malformed };
51
+ }
52
+ /** Every release record of `environment` the port holds, oldest first. */
53
+ export async function readReleaseRecords(port, environment) {
54
+ return parseReleaseLedger(releaseLedgerLines(await port.read(environment, "releases.jsonl")));
55
+ }
56
+ /** The environments with a `releases.jsonl`, sorted: the port's root directories that hold one. */
57
+ export async function listReleaseEnvironmentsOn(port) {
58
+ const envs = [];
59
+ for (const name of await port.trees()) {
60
+ if (await port.read(name, "releases.jsonl"))
61
+ envs.push(name);
62
+ }
63
+ return envs.sort();
64
+ }