@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,414 @@
1
+ /**
2
+ * Fold provenance (#2161) — which composite parameter produced which emitted field.
3
+ *
4
+ * A composite is the one lossy thing chant emits. It takes a few typed
5
+ * arguments and expands to several resources, so a return leg that regenerates
6
+ * source from live produces flat typed resources and the composite is gone. The
7
+ * projection is not invertible from its output alone, which is the view-update
8
+ * problem landing on chant's record.
9
+ *
10
+ * chant can answer it where a general generator cannot, and for one reason: the
11
+ * evaluated subset is restricted on purpose. `discovery/fold-import.ts` already
12
+ * interprets an admissible factory body rather than calling it, so the
13
+ * expression each member property was WRITTEN as is in hand at build time. The
14
+ * same pass records where the field came from, in `discovery/param-deps.ts`'s
15
+ * {@link import("./discovery/param-deps.js").collectCompositeOrigins}.
16
+ *
17
+ * ## Four answers, and the fourth is a real one
18
+ *
19
+ * Every emitted path gets one of {@link FoldFieldOrigin}'s four kinds. Three of
20
+ * them are findings; `unknown` is the fourth, and it is a legal answer rather
21
+ * than a gap. A build that expanded a composite without interpreting its body
22
+ * (the run path, a factory outside the admissible subset, a sandboxed child
23
+ * whose provenance did not survive the wire) knows the field came from a
24
+ * composite and cannot say which parameter. Recording that is the whole point:
25
+ * an unknown must never fall through to `direct`, because `direct` licenses
26
+ * editing the field in the user's source and an unattributed composite field is
27
+ * exactly the case where that produces a flattened resource.
28
+ *
29
+ * `direct` is claimed only where the build has a provenance record AND that
30
+ * record says no composite expanded the entity. Absence of a record is
31
+ * `unknown`, never `direct`.
32
+ *
33
+ * ## Beside the output, never in it
34
+ *
35
+ * The record is build metadata, not declared configuration, and it must not
36
+ * reach the document an applier writes. It rides two channels, both outside the
37
+ * apply-bound document, and neither is a new mechanism:
38
+ *
39
+ * - per entity, the non-enumerable symbol-keyed side channel `./provenance.ts`
40
+ * already owns, invisible to every serializer and to every spread;
41
+ * - per build, {@link import("./build.js").BuildResult.foldProvenance}, a sibling
42
+ * of `buildParams` and `lexiconVersions`.
43
+ *
44
+ * Nothing is added to `SerializeContext`. That is the same posture
45
+ * `./effect-receipt.ts` takes at the same seam, one notch stricter: a receipt
46
+ * rides `SerializeContext.receipts` so a lexicon MAY render it outside
47
+ * `Resources`, whereas provenance has no rendering and is simply never handed
48
+ * to a serializer at all. `fold-provenance-exclusion.test.ts` drives a real
49
+ * build through a spy serializer and a mock applier to hold that line.
50
+ *
51
+ * ## The return leg
52
+ *
53
+ * {@link resolveDriftedField} is the consumer. #2160 has already ruled out the
54
+ * fields nobody declared, so a drifted field reaching it is one source actually
55
+ * declared, and the origin decides what may be proposed:
56
+ *
57
+ * - a composite parameter: propose changing that parameter, naming the file,
58
+ * the composite call and the parameter path. One line, composite intact.
59
+ * - a literal the composite fixes: refuse by name. The choice is to
60
+ * parameterize the field or stop using the composite there, and neither is
61
+ * something chant may pick.
62
+ * - a direct declaration: today's behaviour, unchanged.
63
+ * - unknown: today's behaviour, and say that is what happened.
64
+ *
65
+ * Proposing is as far as this goes. Rewriting a parameter in the user's source
66
+ * is a source-edit problem (the generator half of `chant import` emits whole
67
+ * files and nothing maps a property path back to a location in a `.ts` file),
68
+ * so a proposal here is a described action: it names the file, the composite
69
+ * call and the parameter path, and performs no edit.
70
+ */
71
+ import { isResourceDeclarable } from "./declarable.js";
72
+ import { relative, isAbsolute } from "node:path";
73
+ import { originOfPath, } from "./provenance.js";
74
+ /** True for an ordinary `{}`, false for an array, a class instance, an `AttrRef`. */
75
+ function isPlainObject(value) {
76
+ if (value === null || typeof value !== "object" || Array.isArray(value))
77
+ return false;
78
+ const proto = Object.getPrototypeOf(value);
79
+ return proto === Object.prototype || proto === null;
80
+ }
81
+ /**
82
+ * Every property path an entity's `props` emits, in `EntityProvenance.paths`'
83
+ * grammar: dotted names only, plain objects descended into, everything else
84
+ * attributed whole at its own path.
85
+ *
86
+ * Arrays are deliberately not indexed. An index-shaped key would not survive an
87
+ * element moving, and the recorder that produces origins cannot index either,
88
+ * so indexing here would manufacture paths nothing can ever attribute. The diff
89
+ * addresses array elements with `[#key]`/`[n]` and `originOfPath` resolves
90
+ * those against the dotted key that covers them, which is the join between the
91
+ * two grammars.
92
+ *
93
+ * An empty object is a value, and a leaf. An `undefined` value is not emitted
94
+ * and yields no path.
95
+ */
96
+ export function emittedFieldPaths(props) {
97
+ const out = [];
98
+ const walk = (value, prefix) => {
99
+ if (value === undefined)
100
+ return;
101
+ if (isPlainObject(value)) {
102
+ const keys = Object.keys(value).sort();
103
+ if (keys.length === 0) {
104
+ if (prefix)
105
+ out.push(prefix);
106
+ return;
107
+ }
108
+ for (const key of keys)
109
+ walk(value[key], prefix ? `${prefix}.${key}` : key);
110
+ return;
111
+ }
112
+ if (prefix)
113
+ out.push(prefix);
114
+ };
115
+ walk(props, "");
116
+ return out;
117
+ }
118
+ /**
119
+ * The four-way answer for one path, from the recorded {@link PathOrigin} and
120
+ * the entity's own provenance.
121
+ *
122
+ * `origin` is what {@link originOfPath} resolved for the path, so a coarse key
123
+ * recorded at an ancestor governs a leaf, exactly as it does everywhere else.
124
+ */
125
+ export function classifyFieldOrigin(origin, provenance) {
126
+ if (!provenance)
127
+ return { kind: "unknown", reason: "no-provenance" };
128
+ const instance = provenance.compositeInstance;
129
+ const call = provenance.compositeCall;
130
+ switch (origin?.kind) {
131
+ case "composite-parameter":
132
+ return {
133
+ kind: "composite-parameter",
134
+ composite: origin.composite,
135
+ ...(instance ? { instance } : {}),
136
+ parameters: [...origin.parameters],
137
+ ...(call ? { call: { ...call } } : {}),
138
+ ...(origin.arguments ? { arguments: origin.arguments.map((a) => ({ ...a })) } : {}),
139
+ };
140
+ case "composite-literal":
141
+ return {
142
+ kind: "composite-literal",
143
+ composite: origin.composite,
144
+ ...(instance ? { instance } : {}),
145
+ ...(call ? { call: { ...call } } : {}),
146
+ };
147
+ case "composite":
148
+ // The coarse kind: a composite expanded this, and nothing said which
149
+ // parameter. Not a parameter, not a fixed literal, and above all not a
150
+ // direct declaration.
151
+ return { kind: "unknown", reason: "composite-not-interpreted" };
152
+ case "authored":
153
+ // chant#3608 — `authored` is the file's own root record, and it reaches
154
+ // a path only when nothing finer did. On an entity a composite wrote (a
155
+ // member destructured from a composite the fold invoked) that means the
156
+ // fold could not attribute the path, which is `unknown`, never `direct`.
157
+ return provenance.composite
158
+ ? { kind: "unknown", reason: "composite-not-interpreted" }
159
+ : { kind: "direct" };
160
+ case "host":
161
+ // INTENTIUS/typescript-as-data#248 — host code produced the value, so
162
+ // editing the declaration edits a call, not the value it returned.
163
+ return { kind: "unknown", reason: origin.reason };
164
+ case "build-param":
165
+ // A build parameter governs the expression the AUTHOR wrote in their own
166
+ // source, so the declaration is still theirs to edit.
167
+ return { kind: "direct" };
168
+ case undefined:
169
+ return provenance.composite
170
+ ? { kind: "unknown", reason: "composite-not-interpreted" }
171
+ : { kind: "direct" };
172
+ }
173
+ }
174
+ /** One entity's fold provenance, or `undefined` when it emits no properties at all. */
175
+ export function foldProvenanceOfEntity(entity, provenance) {
176
+ if (!isResourceDeclarable(entity))
177
+ return undefined;
178
+ const paths = emittedFieldPaths(entity.props);
179
+ if (paths.length === 0)
180
+ return undefined;
181
+ const fields = {};
182
+ for (const path of paths) {
183
+ fields[path] = classifyFieldOrigin(originOfPath(provenance?.paths, path), provenance);
184
+ }
185
+ return {
186
+ ...(provenance?.sourceFile ? { sourceFile: provenance.sourceFile } : {}),
187
+ ...(provenance?.composite ? { composite: provenance.composite } : {}),
188
+ ...(provenance?.compositeInstance ? { instance: provenance.compositeInstance } : {}),
189
+ ...(provenance?.compositeCall ? { compositeCall: { ...provenance.compositeCall } } : {}),
190
+ fields,
191
+ };
192
+ }
193
+ /**
194
+ * A whole build's fold provenance.
195
+ *
196
+ * `provenanceOf` is injected rather than read off the entity here so the same
197
+ * function serves a build (where it is `getProvenance`) and a test with a
198
+ * hand-written record. Entities with no properties are absent; sorted, because
199
+ * a build's outputs are compared byte for byte.
200
+ */
201
+ export function foldProvenanceOfEntities(entities, provenanceOf) {
202
+ const out = {};
203
+ for (const name of [...entities.keys()].sort()) {
204
+ const entity = entities.get(name);
205
+ const record = foldProvenanceOfEntity(entity, provenanceOf(entity));
206
+ if (record)
207
+ out[name] = record;
208
+ }
209
+ return out;
210
+ }
211
+ /** One-line rendering of a field origin, for a report. */
212
+ export function describeFoldFieldOrigin(origin) {
213
+ switch (origin.kind) {
214
+ case "composite-parameter":
215
+ return `parameter ${origin.parameters.join(", ")} of ${compositeCall(origin.composite, origin.instance)}`;
216
+ case "composite-literal":
217
+ return `fixed by ${compositeCall(origin.composite, origin.instance)}`;
218
+ case "direct":
219
+ return "declared directly";
220
+ case "unknown":
221
+ return `origin unknown (${unknownOriginText(origin.reason)})`;
222
+ }
223
+ }
224
+ /** Why an origin could not be determined, in words a report can print. */
225
+ export function unknownOriginText(reason) {
226
+ switch (reason) {
227
+ case "composite-not-interpreted":
228
+ return "expanded by a composite whose factory this build did not interpret";
229
+ case "no-provenance":
230
+ return "this build recorded no provenance for the entity";
231
+ case "host-call":
232
+ return "the value is what a host call returned";
233
+ case "host-value":
234
+ return "the value is one a host package exports";
235
+ }
236
+ }
237
+ /** `AutoscaledService composite call \`api\``, or just the composite when the call has no name. */
238
+ function compositeCall(composite, instance) {
239
+ return instance ? `the \`${instance}\` call of composite ${composite}` : `composite ${composite}`;
240
+ }
241
+ /** A file as a report prints it: relative to `root` when it is inside it, otherwise as recorded. */
242
+ function displayFile(file, root) {
243
+ if (!root || !isAbsolute(file))
244
+ return file;
245
+ const rel = relative(root, file);
246
+ return rel && !rel.startsWith("..") && !isAbsolute(rel) ? rel : file;
247
+ }
248
+ /** `src/app.ts:12`, relative to `root` when it is inside it. */
249
+ export function formatSourceLocation(location, root) {
250
+ return `${displayFile(location.file, root)}:${location.line}`;
251
+ }
252
+ /** ` in src/app.infra.ts`, or nothing when the build recorded no file. */
253
+ function inFile(sourceFile, root) {
254
+ return sourceFile ? ` in ${displayFile(sourceFile, root)}` : "";
255
+ }
256
+ /**
257
+ * The composite call as the author wrote the arguments that govern a field:
258
+ * `WebApp({ replicas: 3 })`, or `WebApp({ iam: { path: "/service/" } })` for a
259
+ * nested parameter. Only arguments actually written at the call appear; when
260
+ * none is, the call is shown as `WebApp(...)`.
261
+ */
262
+ export function describeCompositeArguments(composite, locations) {
263
+ const written = locations.filter((a) => a.text !== undefined);
264
+ if (written.length === 0)
265
+ return `${composite}(...)`;
266
+ const parts = written.map((a) => {
267
+ const outer = a.parameter.split(".").slice(0, -1);
268
+ return outer.reduceRight((inner, key) => `${key}: { ${inner} }`, a.text);
269
+ });
270
+ return `${composite}({ ${parts.join(", ")} })`;
271
+ }
272
+ /**
273
+ * Where a composite-parameter field was set, as `at src/app.ts:12`: the first
274
+ * argument written at the call, else the call, else the declaring file.
275
+ */
276
+ function parameterSite(origin, sourceFile, root) {
277
+ const written = origin.arguments?.find((a) => a.text !== undefined);
278
+ const location = written ?? origin.call ?? origin.arguments?.[0];
279
+ if (location)
280
+ return ` at ${formatSourceLocation(location, root)}`;
281
+ return inFile(sourceFile, root);
282
+ }
283
+ /** ` at src/app.ts:10` for the composite call, else the declaring file. */
284
+ function callSite(call, sourceFile, root) {
285
+ return call ? ` at ${formatSourceLocation(call, root)}` : inFile(sourceFile, root);
286
+ }
287
+ /** A value as a report prints it. */
288
+ function renderValue(value) {
289
+ if (value === undefined)
290
+ return "unset";
291
+ try {
292
+ return JSON.stringify(value) ?? String(value);
293
+ }
294
+ catch {
295
+ return String(value);
296
+ }
297
+ }
298
+ /**
299
+ * Classify one drifted field by its origin.
300
+ *
301
+ * The caller has already established this is drift in #2160's sense: a path
302
+ * source declared, whose live value moved. Undeclared fields are held
303
+ * elsewhere and never reach here, so the only question left is which of the
304
+ * four origins produced the field.
305
+ *
306
+ * `entityType` names the resource in the summary line, and `root` (the
307
+ * project directory) makes the file names in it relative. Both are optional;
308
+ * without them the summary uses the entity name alone and absolute files.
309
+ */
310
+ export function resolveDriftedField(input) {
311
+ const origin = classifyFieldOrigin(input.origin, input.provenance);
312
+ const sourceFile = input.provenance?.sourceFile;
313
+ const root = input.root;
314
+ const move = `${renderValue(input.declared)} to ${renderValue(input.live)}`;
315
+ const subject = `${input.path} on ${input.entityType ? `${input.entityType} ` : ""}${input.entity}`;
316
+ const summary = (() => {
317
+ switch (origin.kind) {
318
+ case "composite-parameter":
319
+ return (`${subject} comes from ${describeCompositeArguments(origin.composite, origin.arguments ?? [])}` +
320
+ `${parameterSite(origin, sourceFile, root)}` +
321
+ (origin.arguments?.some((a) => a.text !== undefined)
322
+ ? ""
323
+ : ` (parameter ${origin.parameters.join(", ")}, not written at the call)`));
324
+ case "composite-literal":
325
+ return (`${subject} is fixed inside composite ${origin.composite}; ` +
326
+ `no argument to the call${callSite(origin.call, sourceFile, root)} moves it`);
327
+ case "direct":
328
+ return `${subject} is declared directly${inFile(sourceFile, root)}`;
329
+ case "unknown":
330
+ return `${subject} has an unknown origin: ${unknownOriginText(origin.reason)}`;
331
+ }
332
+ })();
333
+ const resolution = (() => {
334
+ switch (origin.kind) {
335
+ case "composite-parameter": {
336
+ const parameters = origin.parameters;
337
+ return {
338
+ kind: "propose-parameter",
339
+ composite: origin.composite,
340
+ ...(origin.instance ? { instance: origin.instance } : {}),
341
+ ...(sourceFile ? { sourceFile } : {}),
342
+ parameters: [...parameters],
343
+ description: `change ${parameters.length === 1 ? "parameter" : "parameters"} ` +
344
+ `${parameters.map((p) => `\`${p}\``).join(", ")} of ` +
345
+ `${compositeCall(origin.composite, origin.instance)}${parameterSite(origin, sourceFile, root)} ` +
346
+ `so \`${input.path}\` moves from ${move}. The composite stays.`,
347
+ };
348
+ }
349
+ case "composite-literal":
350
+ return {
351
+ kind: "refuse-fixed",
352
+ composite: origin.composite,
353
+ ...(origin.instance ? { instance: origin.instance } : {}),
354
+ ...(sourceFile ? { sourceFile } : {}),
355
+ description: `refused: \`${input.path}\` is fixed by ${compositeCall(origin.composite, origin.instance)}` +
356
+ `${callSite(origin.call, sourceFile, root)}, so no argument at the call site moves it. ` +
357
+ `Parameterize the field in composite ${origin.composite}, or stop using the composite here.`,
358
+ };
359
+ case "direct":
360
+ return {
361
+ kind: "edit-declaration",
362
+ ...(sourceFile ? { sourceFile } : {}),
363
+ description: `change the declared value of \`${input.path}\`${inFile(sourceFile, root)} from ${move}.`,
364
+ };
365
+ case "unknown":
366
+ return {
367
+ kind: "fall-back",
368
+ reason: origin.reason,
369
+ ...(sourceFile ? { sourceFile } : {}),
370
+ description: `origin unknown (${unknownOriginText(origin.reason)}), so falling back to changing the ` +
371
+ `declared value of \`${input.path}\`${inFile(sourceFile, root)} from ${move}.`,
372
+ };
373
+ }
374
+ })();
375
+ return {
376
+ entity: input.entity,
377
+ path: input.path,
378
+ ...("declared" in input ? { declared: input.declared } : {}),
379
+ ...("live" in input ? { live: input.live } : {}),
380
+ origin,
381
+ summary,
382
+ resolution,
383
+ };
384
+ }
385
+ /**
386
+ * Every drifted field in a deep diff, classified.
387
+ *
388
+ * Reads `drifted` only. `unclaimed` is somebody else's field and
389
+ * `accepted` is a difference the baseline holds back, and neither may become an
390
+ * update, so neither is offered a resolution.
391
+ *
392
+ * A drift row of kind `absent` has no live value: the field is declared and the
393
+ * cloud does not have it. That is still drift on a declared path, and the same
394
+ * four origins decide what may be proposed about it.
395
+ */
396
+ export function resolveDeepDrift(drifted, provenanceOf, options = {}) {
397
+ const out = [];
398
+ for (const entity of drifted) {
399
+ const provenance = provenanceOf(entity.name);
400
+ for (const change of entity.changes) {
401
+ out.push(resolveDriftedField({
402
+ entity: entity.name,
403
+ entityType: entity.type,
404
+ path: change.path,
405
+ ...("declared" in change ? { declared: change.declared } : {}),
406
+ ...("live" in change ? { live: change.live } : {}),
407
+ ...(change.origin ? { origin: change.origin } : {}),
408
+ ...(provenance ? { provenance } : {}),
409
+ ...(options.root ? { root: options.root } : {}),
410
+ }));
411
+ }
412
+ }
413
+ return out;
414
+ }
@@ -0,0 +1,260 @@
1
+ /**
2
+ * A gate's decision for a plan digest, and the seal check it needs, for a
3
+ * tool that runs from one bundled file (#3763, decision #3756).
4
+ *
5
+ * `@intentius/chant/gate-decision` holds what a tool needs to decide a
6
+ * plan-bound gate the way chant's own wave gate does (`chant run wave`,
7
+ * `./op/op-waves-run.ts`) under each approval mode:
8
+ *
9
+ * - `ledger`: an approval of this digest on `chant/lifecycle`, newer than the
10
+ * gate's newest pending fact ({@link decideGateApproval}).
11
+ * - `sealed`: the same, counting only an approval whose seal verifies for its
12
+ * approver against the signers file at base ({@link gateSignersAt},
13
+ * {@link gateSealRefusal}). The seal is checked with node:crypto, so the job
14
+ * needs no ssh-keygen.
15
+ * - `pr-review`: the same as `ledger`, or else the merged pull request's
16
+ * approving review, when its head planned this digest
17
+ * ({@link reviewApproval}).
18
+ *
19
+ * A gate the declaration at base names under `identity.gates` counts only a
20
+ * sealed approval from its class: {@link identityGateAdmissionAt} reads that
21
+ * rule from a bare clone at base and judges by `admitApprover`, the function
22
+ * chant's `gateAdmission` judges by (#3862); pass its `refuses` to
23
+ * {@link decideGateApproval}.
24
+ *
25
+ * With `spend` (#3784), an approval a wave already applied under is spent and
26
+ * counts for nothing, as terragucci's wave gate has it: the caller hands in
27
+ * the lines of `_gates/<op>/applied.jsonl` ({@link parseAppliedGateLines}).
28
+ *
29
+ * The module reads the ledger lines and the review it is handed; reading
30
+ * them is the caller's. It imports no TypeScript, esbuild, zod, lint, fold or
31
+ * codegen module, and none of chant's git ledger code, which
32
+ * `gate-decision-bundle.test.ts` holds it to. Its rules are chant's own:
33
+ * `./lifecycle/gate-ledger-select.ts` is what `evaluateGate` decides by, and
34
+ * `gate-decision.test.ts` decides the same ledgers both ways.
35
+ */
36
+ import { spawnSync } from "node:child_process";
37
+ import { isPendingGateExpired, latestPendingGate, latestResolutionForPlan, } from "./lifecycle/gate-ledger-select.js";
38
+ import { samePlanDigest } from "./lifecycle/plan-digest.js";
39
+ import { isApprovalSpent } from "./lifecycle/gate-applied.js";
40
+ import { gateSealRefusal } from "./workspace/trust/gate-seal.js";
41
+ import { DEFAULT_SIGNERS_PATH, TRUST_CONFIG_PATH, parseAllowedSigners, trustConfigProblems, } from "./workspace/trust/trust-files.js";
42
+ import { parseJsonText } from "./workspace/jsonc.js";
43
+ import { CORE_CLASSES, admitApprover } from "./workspace/identity-gate-rule.js";
44
+ export { GATE_APPROVAL_SOURCES } from "./op/op-waves.js";
45
+ export { isPendingGateExpired, latestPendingGate, latestResolutionForPlan, latestResolutionSince, } from "./lifecycle/gate-ledger-select.js";
46
+ export { GATE_SEAL_NAMESPACE, gateSealPayload, gateSealRefusal, sshKeyFingerprint, verifySshSignatureWith, } from "./workspace/trust/gate-seal.js";
47
+ export { DEFAULT_SIGNERS_PATH, TRUST_CONFIG_PATH, parseAllowedSigners, trustConfigProblems, } from "./workspace/trust/trust-files.js";
48
+ export { CORE_CLASSES, admitApprover, grantedClasses, } from "./workspace/identity-gate-rule.js";
49
+ export { appliedGateApplies, appliedGatePath, isApprovalSpent, parseAppliedGateLines, } from "./lifecycle/gate-applied.js";
50
+ // ── reading at base ──────────────────────────────────────────────────────
51
+ function git(repo, args) {
52
+ return spawnSync("git", args, { cwd: repo, encoding: "utf-8" });
53
+ }
54
+ /** A file's text at `base`, or undefined when `base` holds no file at `path`. */
55
+ function showAt(repo, base, path) {
56
+ const r = git(repo, ["cat-file", "blob", `${base}:${path}`]);
57
+ return r.status === 0 ? r.stdout : undefined;
58
+ }
59
+ /**
60
+ * The commit a gate's rule is read at when the default branch applies its
61
+ * own commit: the first parent of HEAD, the branch as it stood before the
62
+ * merge, so a merge that adds a signer or drops a gate does not judge its own
63
+ * apply. A shallow checkout fetches that one commit from `origin`. A root
64
+ * commit has no parent and is its own base. Throws when it cannot be read.
65
+ */
66
+ export function baseCommit(repo) {
67
+ const head = git(repo, ["rev-parse", "--verify", "-q", "HEAD^{commit}"]);
68
+ const sha = head.stdout.trim();
69
+ if (head.status !== 0 || !sha)
70
+ throw new Error(`${repo} has no commit checked out, so the gate cannot be decided`);
71
+ // The commit object's first `parent` line: a shallow clone keeps it even when it lacks the parent itself.
72
+ const header = git(repo, ["cat-file", "commit", sha]).stdout.split("\n\n")[0] ?? "";
73
+ const parent = /^parent ([0-9a-f]{40,64})$/m.exec(header)?.[1];
74
+ if (!parent)
75
+ return sha;
76
+ const has = () => git(repo, ["cat-file", "-e", `${parent}^{commit}`]).status === 0;
77
+ if (!has())
78
+ git(repo, ["fetch", "-q", "--depth=1", "origin", parent]);
79
+ if (!has())
80
+ throw new Error(`cannot fetch ${parent.slice(0, 12)}, the commit before this one, so the gate cannot be decided`);
81
+ return parent;
82
+ }
83
+ /** The signers and role grants at `base`, as chant's trust policy reads them. */
84
+ function trustAt(repo, base) {
85
+ const off = (problems) => ({ signers: { base, signersPath: DEFAULT_SIGNERS_PATH, active: false, signers: [], problems }, roles: {} });
86
+ const configText = showAt(repo, base, TRUST_CONFIG_PATH);
87
+ let signersPath = DEFAULT_SIGNERS_PATH;
88
+ let roles = {};
89
+ if (configText !== undefined) {
90
+ let raw;
91
+ try {
92
+ raw = JSON.parse(configText);
93
+ }
94
+ catch (err) {
95
+ return off([`${TRUST_CONFIG_PATH} is not JSON: ${err instanceof Error ? err.message : String(err)}`]);
96
+ }
97
+ const problems = trustConfigProblems(raw);
98
+ if (problems.length > 0)
99
+ return off([`${TRUST_CONFIG_PATH} is invalid: ${problems.join("; ")}`]);
100
+ signersPath = raw.signers ?? DEFAULT_SIGNERS_PATH;
101
+ roles = raw.roles ?? {};
102
+ }
103
+ const text = showAt(repo, base, signersPath);
104
+ return { signers: { base, signersPath, active: text !== undefined, signers: text === undefined ? [] : parseAllowedSigners(text).signers, problems: [] }, roles };
105
+ }
106
+ /**
107
+ * The signers at `base`: the file `.chant/trust.json` names there, else
108
+ * `.chant/allowed_signers`, read as chant's trust policy reads it. A
109
+ * trust.json that is not valid (`trustConfigProblems`) turns attestation
110
+ * off, as it does in chant, so a sealed gate passes nothing. `base` is a
111
+ * commit the repository holds, such as {@link baseCommit}'s answer.
112
+ */
113
+ export function gateSignersAt(repo, base) {
114
+ return trustAt(repo, base).signers;
115
+ }
116
+ /** The declaration at `base`, parsed, or null when there is none. Throws when it cannot be parsed. */
117
+ function declarationAt(repo, base) {
118
+ for (const file of ["chant.workspace.json", "chant.workspace.jsonc"]) {
119
+ const text = showAt(repo, base, file);
120
+ if (text === undefined)
121
+ continue;
122
+ const parsed = parseJsonText(text, { jsonc: file.endsWith(".jsonc") });
123
+ if (!parsed.ok)
124
+ throw new Error(`${file} at base is not valid JSON (${parsed.message}), so the gate cannot be decided`);
125
+ return { file, value: parsed.value };
126
+ }
127
+ return null;
128
+ }
129
+ function identityGatesOf(declaration) {
130
+ const gates = declaration?.identity?.gates ?? {};
131
+ return Object.entries(gates).map(([gate, entry]) => ({ gate, class: typeof entry?.class === "string" ? entry.class : null }));
132
+ }
133
+ /**
134
+ * The gates `chant.workspace.json` (or `.jsonc`) at `base` names under
135
+ * `identity.gates`: each counts only a sealed approval, from its class when
136
+ * it names one. {@link identityGateAdmissionAt} judges an approval by one.
137
+ * Empty when there is no declaration at base. Throws when the declaration
138
+ * there cannot be parsed, since the gate cannot be decided.
139
+ */
140
+ export function identityGatesAt(repo, base) {
141
+ const declaration = declarationAt(repo, base);
142
+ return declaration === null ? [] : identityGatesOf(declaration.value);
143
+ }
144
+ /**
145
+ * The `identity.gates` rule for `gate` at `base`, or null when the
146
+ * declaration there names none: what chant's `gateAdmission(cwd, gate, base)`
147
+ * answers, read from a bare clone. An approval counts when its seal verifies
148
+ * for its approver against the signers at base and, when the gate names a
149
+ * class, the role grants in `.chant/trust.json` at base put the approver in
150
+ * it. Both judge with the same function ({@link admitApprover}).
151
+ *
152
+ * The classes are the four core ones, then `classes`, the domain classes the
153
+ * caller read from the pinned packages (`./workspace-principals`), in pin
154
+ * order. This reader loads no package. A gate whose class is in neither
155
+ * refuses every approval, and when the declaration at base pins anything the
156
+ * reason says the pins were not read, since one of them may supply it.
157
+ * Throws when the declaration at base cannot be parsed.
158
+ */
159
+ export function identityGateAdmissionAt(repo, base, gate, opts = {}) {
160
+ const declaration = declarationAt(repo, base);
161
+ const requirement = declaration === null ? undefined : identityGatesOf(declaration.value).find((g) => g.gate === gate);
162
+ if (!requirement)
163
+ return null;
164
+ const { signers, roles } = trustAt(repo, base);
165
+ const pins = declaration.value.pins;
166
+ const rule = {
167
+ gate,
168
+ class: requirement.class,
169
+ signers,
170
+ roles,
171
+ classes: [...CORE_CLASSES, ...(opts.classes ?? [])],
172
+ ...(Array.isArray(pins) && pins.length > 0
173
+ ? { unknownClass: `is not a core class, and this reader does not load the classes the pinned packages in ${declaration.file} at base supply` }
174
+ : {}),
175
+ };
176
+ return { requirement, refuses: (a) => admitApprover(rule, a) };
177
+ }
178
+ /**
179
+ * Whether the merged pull request's review approves `digest` (#3684): a
180
+ * writer other than its author approved its head, and the head planned this
181
+ * digest (`headDigest`, from the plans `chant run wave --record-plans`
182
+ * recorded for the head; undefined when none were). Reading the review and
183
+ * the plans is the caller's; under `pr-review` the caller records the
184
+ * approval on the ledger when this approves.
185
+ */
186
+ export function reviewApproval(merged, headDigest, digest) {
187
+ const seen = { pr: merged.pr, head: merged.head, ...(merged.url ? { url: merged.url } : {}) };
188
+ if (merged.approvers.length === 0) {
189
+ const why = merged.refused.length > 0 ? merged.refused.join("; ") : "nobody approved it";
190
+ return { approved: false, review: { ...seen, reason: `no writer other than its author approved the head of #${merged.pr}: ${why}` } };
191
+ }
192
+ if (headDigest === undefined) {
193
+ return {
194
+ approved: false,
195
+ review: { ...seen, approvers: merged.approvers, reason: `no plans are recorded for the head ${merged.head.slice(0, 12)} of #${merged.pr} (its pipeline runs \`chant run wave --record-plans\`)` },
196
+ };
197
+ }
198
+ if (headDigest !== digest) {
199
+ return {
200
+ approved: false,
201
+ review: { ...seen, approvers: merged.approvers, reason: `the plan moved after the review: the head planned ${headDigest}, and the merge plans ${digest}` },
202
+ };
203
+ }
204
+ return { approved: true, review: { ...seen, approvers: merged.approvers } };
205
+ }
206
+ const EPOCH = new Date(0).toISOString();
207
+ /**
208
+ * Decide a plan-bound gate against its ledger lines, as chant's wave gate
209
+ * does: an approval counts when it names this gate and digest (and
210
+ * environment, when set), is newer than the gate's newest pending fact, and
211
+ * passes the mode's rule: any under `ledger` and `pr-review`, a verified seal
212
+ * under `sealed`. With none, `pr-review` takes the review's answer. Writes
213
+ * nothing: recording a pending fact, or the review's approval, is the
214
+ * caller's.
215
+ */
216
+ export function decideGateApproval(input) {
217
+ const { gate, planDigest, environment: env } = input;
218
+ const mode = input.mode ?? "ledger";
219
+ const pending = env === undefined ? input.ledger.pending : input.ledger.pending.filter((p) => p.environment === env);
220
+ const mine = (env === undefined ? input.ledger.resolutions : input.ledger.resolutions.filter((r) => r.environment === undefined || r.environment === env)).filter((r) => r.gate === gate);
221
+ const sealed = mode === "sealed";
222
+ const noSigners = { base: null, signersPath: DEFAULT_SIGNERS_PATH, active: false, signers: [], problems: ["no signers were read for this sealed gate"] };
223
+ const why = (r) => input.refuses?.(r) ?? (sealed ? gateSealRefusal(input.signers ?? noSigners, r) : null);
224
+ const standingFact = latestPendingGate(pending, gate);
225
+ const since = standingFact?.timestamp ?? EPOCH;
226
+ const counted = [];
227
+ const uncounted = [];
228
+ let spent;
229
+ for (const r of mine) {
230
+ if (input.spend && isApprovalSpent(input.ledger.applied ?? [], r)) {
231
+ if (new Date(r.timestamp).getTime() >= new Date(since).getTime() && (!spent || new Date(r.timestamp).getTime() >= new Date(spent.timestamp).getTime()))
232
+ spent = r;
233
+ continue;
234
+ }
235
+ const reason = why(r);
236
+ if (reason === null)
237
+ counted.push(r);
238
+ else if (samePlanDigest(r.planDigest, planDigest) && new Date(r.timestamp).getTime() >= new Date(since).getTime())
239
+ uncounted.push({ resolution: r, reason });
240
+ }
241
+ const found = latestResolutionForPlan(counted, gate, since, planDigest);
242
+ if (found.resolution)
243
+ return { status: "approved", via: "ledger", resolution: found.resolution };
244
+ const reviewSpent = input.spend === true && input.review?.approved === true &&
245
+ isApprovalSpent(input.ledger.applied ?? [], { gate, planDigest, review: { ...(input.review.review.head ? { head: input.review.review.head } : {}) } });
246
+ if (mode === "pr-review" && input.review?.approved && !reviewSpent)
247
+ return { status: "approved", via: "pr-review", review: input.review.review };
248
+ const now = input.now ?? new Date().toISOString();
249
+ const standing = standingFact && !isPendingGateExpired(standingFact, now) && samePlanDigest(standingFact.planDigest, planDigest) ? standingFact : undefined;
250
+ return {
251
+ status: "waiting",
252
+ ...(standing ? { standing } : {}),
253
+ ...(found.mismatched ? { mismatched: found.mismatched } : {}),
254
+ uncounted: uncounted.sort((a, b) => new Date(a.resolution.timestamp).getTime() - new Date(b.resolution.timestamp).getTime()),
255
+ ...(mode === "pr-review" && input.review
256
+ ? { review: reviewSpent ? { ...input.review.review, reason: `a wave already applied this digest under the review of ${input.review.review.head?.slice(0, 12) ?? "its head"}, so the review is spent` } : input.review.review }
257
+ : {}),
258
+ ...(spent ? { spent } : {}),
259
+ };
260
+ }