@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,375 @@
1
+ import { build as buildProject } from "../build.js";
2
+ import { resolve as resolvePath } from "node:path";
3
+ import { mergeObservations, normalizeObservation, unobservedAll, formatUnobserved, } from "../observation.js";
4
+ import { zeroResourcesWarning } from "../live-endpoint.js";
5
+ import { unqualifiedKey } from "./identity.js";
6
+ import { isObservableDeclarable } from "../declarable.js";
7
+ /**
8
+ * Re-key a normalized observation's entities by `${stack}::${id}` (#1162) so a
9
+ * bare LogicalResourceId shared across stacks (e.g. `vpc`) stays unambiguous
10
+ * once the per-stack results are merged. The declared canvas qualifies the same
11
+ * way (`buildDeclaredPerStack`), so the overlay join lines up. Applies to both
12
+ * the OBSERVED-PRESENT and NOT-OBSERVED maps of the tri-state (#1089).
13
+ */
14
+ function qualifyObservation(obs, stackName) {
15
+ const q = (m) => Object.fromEntries(Object.entries(m).map(([k, v]) => [`${stackName}::${k}`, v]));
16
+ return {
17
+ resources: q(obs.resources),
18
+ unobserved: q(obs.unobserved),
19
+ queried: q(obs.queried),
20
+ // Which read answered (#2267) is per entity, so it re-keys with them.
21
+ sources: q(obs.sources),
22
+ notes: obs.notes,
23
+ // Exports are already keyed by stack (#1279); nothing to qualify.
24
+ ...(obs.stackExports ? { stackExports: obs.stackExports } : {}),
25
+ };
26
+ }
27
+ /**
28
+ * Query every plugin that implements `describeResources` for its resources in
29
+ * `environment`. `owned` (default true for the managed-only diagram, epic #776)
30
+ * restricts to resources carrying chant's ownership marker; a lexicon with no
31
+ * marker channel logs and returns everything (its own contract). Plugins that
32
+ * throw are collected into `errors` — one failing lexicon never sinks the whole
33
+ * graph — and every entity they were asked about is recorded as NOT-OBSERVED
34
+ * (`read-failed`, #1089) rather than dropped, so a failed read is visibly a
35
+ * hole instead of a silent absence.
36
+ *
37
+ * `stacks` (#57) is for a multi-stack, per-component project, where there is no
38
+ * single stack named after the environment — AWS's single-stack convention
39
+ * (`lexicons/aws/src/plugin.ts`'s `describeResources`, absent an explicit
40
+ * `stack`) queries a stack that simply doesn't exist there,
41
+ * so the single-call path always observes zero nodes. When `stacks` is
42
+ * present and non-empty, each observing plugin's `describeResources` is
43
+ * called once per stack and the returned observations are merged. A stack entry
44
+ * may be a bare name or `{ name, region?, src? }` (#1162): `src` is built
45
+ * SCOPED so the deployed BARE LogicalResourceIds match (the whole-project build
46
+ * disambiguates colliding names to `UsWest1Src…`, which the live ids never
47
+ * carry), and a scoped stack's observed ids are qualified `${stack}::${id}` so
48
+ * the same bare id in two stacks stays distinct. A bare-string stack keeps its
49
+ * bare ids and the tri-state merge (#57). When `stacks` is absent or empty, behavior is
50
+ * exactly the single call of before (no `stack` key at all), so a single-stack
51
+ * project is unaffected.
52
+ */
53
+ export async function observeResources(environment, plugins, buildResult, opts) {
54
+ var _a;
55
+ const owned = opts?.owned ?? true;
56
+ const stacks = (opts?.stacks ?? []).map((st) => (typeof st === "string" ? { name: st } : st));
57
+ const includeAmbient = opts?.ambient ?? false;
58
+ // A stack's `src` (multi-stack, #1162) is built SCOPED to recover that stack's
59
+ // BARE entity names — the names it actually deploys. Matching deployed bare
60
+ // LogicalResourceIds against the whole-project build's DISAMBIGUATED names
61
+ // (UsWest1Src…) misses every colliding resource. Cached per src.
62
+ const serializers = plugins.map((p) => p.serializer);
63
+ const scopedBuildCache = new Map();
64
+ const scopedBuild = async (src) => {
65
+ const key = resolvePath(src);
66
+ let r = scopedBuildCache.get(key);
67
+ if (!r) {
68
+ r = await buildProject(key, serializers);
69
+ scopedBuildCache.set(key, r);
70
+ }
71
+ return r;
72
+ };
73
+ const observations = [];
74
+ const warnings = [];
75
+ const errors = [];
76
+ const notes = [];
77
+ for (const plugin of plugins) {
78
+ if (!plugin.describeResources)
79
+ continue;
80
+ // Serialized build output + declared entities for this lexicon — the scope
81
+ // describeResources needs to know what to look for.
82
+ const rawOutput = buildResult.outputs.get(plugin.name);
83
+ const buildOutput = rawOutput === undefined
84
+ ? ""
85
+ : typeof rawOutput === "string"
86
+ ? rawOutput
87
+ : rawOutput.primary;
88
+ const entityNames = [];
89
+ const entities = new Map();
90
+ for (const [name, entity] of buildResult.entities) {
91
+ if (entity.lexicon !== plugin.name)
92
+ continue;
93
+ // Only resource declarables have a live counterpart to observe. Outputs,
94
+ // parameters and serializer directives (gcp's `defaultAnnotations`) are
95
+ // build-time inputs — declared, but with nothing in any cloud to compare
96
+ // against, so keeping them in the universe makes every diff report a
97
+ // hole (or worse, a deletion) for a resource that cannot exist. A
98
+ // property-kind declarable is read as part of the resource holding it,
99
+ // never on its own (#3001).
100
+ if (!isObservableDeclarable(entity))
101
+ continue;
102
+ entityNames.push(name);
103
+ entities.set(name, {
104
+ entityType: entity.entityType,
105
+ props: (entity.props != null ? entity.props : {}),
106
+ });
107
+ }
108
+ try {
109
+ let observed;
110
+ if (stacks.length > 0) {
111
+ const parts = [];
112
+ for (const stack of stacks) {
113
+ // Use this stack's scoped build (bare entity names) when it has a src,
114
+ // so describeResources matches the deployed bare LogicalResourceIds.
115
+ let stackEntityNames = entityNames;
116
+ let stackBuildOutput = buildOutput;
117
+ let stackEntities = entities;
118
+ if (stack.src) {
119
+ const sb = await scopedBuild(stack.src);
120
+ stackEntityNames = [];
121
+ stackEntities = new Map();
122
+ for (const [name, entity] of sb.entities) {
123
+ if (entity.lexicon !== plugin.name || !isObservableDeclarable(entity))
124
+ continue;
125
+ stackEntityNames.push(name);
126
+ stackEntities.set(name, {
127
+ entityType: entity.entityType,
128
+ props: (entity.props != null ? entity.props : {}),
129
+ });
130
+ }
131
+ const raw = sb.outputs.get(plugin.name);
132
+ stackBuildOutput = raw === undefined ? "" : typeof raw === "string" ? raw : raw.primary;
133
+ }
134
+ const norm = normalizeObservation(await plugin.describeResources({
135
+ environment,
136
+ buildOutput: stackBuildOutput,
137
+ entityNames: stackEntityNames,
138
+ entities: stackEntities,
139
+ owned,
140
+ stack: stack.name,
141
+ region: stack.region,
142
+ ...(opts?.namespace ? { namespace: opts.namespace } : {}),
143
+ }));
144
+ // Qualify ids by stack ONLY for a scoped (`src`) stack (#1162): that
145
+ // is the multi-region case where the SAME bare LogicalResourceId
146
+ // (e.g. `vpc`) exists in every stack, so a bare union would collide.
147
+ // A bare-string stack (#57) has unique per-component ids and is asked
148
+ // the whole-project entity set, so it keeps the bare-id tri-state
149
+ // merge (present > not-observed > absent) that behold and other
150
+ // consumers read.
151
+ parts.push(stack.src ? qualifyObservation(norm, stack.name) : norm);
152
+ }
153
+ observed = mergeObservations(parts);
154
+ }
155
+ else {
156
+ observed = normalizeObservation(await plugin.describeResources({
157
+ environment,
158
+ buildOutput,
159
+ entityNames,
160
+ entities,
161
+ owned,
162
+ ...(opts?.namespace ? { namespace: opts.namespace } : {}),
163
+ }));
164
+ }
165
+ // Run-level notices (#1265): one line per distinct note per run,
166
+ // whatever the stack count. `mergeObservations` already folded the
167
+ // per-stack copies; this folds across lexicons.
168
+ for (const note of observed.notes) {
169
+ const line = `[${plugin.name}] ${note}`;
170
+ if (!notes.includes(line))
171
+ notes.push(line);
172
+ }
173
+ // What the estate depends on but does not declare (#1273). Read after the
174
+ // managed resources, because the declared observation is the closure's
175
+ // roots — there is nothing to reference out from until it exists.
176
+ const dependencies = await collectDependencies(plugin, {
177
+ environment,
178
+ entities,
179
+ observed: observed.resources,
180
+ stacks,
181
+ });
182
+ for (const message of dependencies.warnings)
183
+ warnings.push(message);
184
+ // Resources of a managed kind that nothing declares or references (#1278).
185
+ // Bounded by what this lexicon's declared entities actually are, so a
186
+ // project managing security groups is not made to enumerate the account.
187
+ const ambient = includeAmbient
188
+ ? await collectAmbient(plugin, {
189
+ environment,
190
+ kinds: [...new Set([...entities.values()].map((e) => e.entityType))],
191
+ observed: observed.resources,
192
+ stacks,
193
+ warnings,
194
+ })
195
+ : {};
196
+ // A resource can be reached as a dependency AND enumerated as ambient —
197
+ // the default VPC an instance sits in is both. It is one resource, and
198
+ // the dependency entry is the one carrying `referencedBy`, so it wins.
199
+ // Matched on physical id rather than on key, because ambient keys carry a
200
+ // region (#1416) and dependency keys do not, so the keys no longer
201
+ // collide even when the resource is the same one.
202
+ const dependedOn = new Set(Object.values(dependencies.resources)
203
+ .map((m) => m.physicalId)
204
+ .filter((id) => typeof id === "string"));
205
+ for (const [id, meta] of Object.entries(ambient)) {
206
+ if (meta.physicalId && dependedOn.has(meta.physicalId))
207
+ continue;
208
+ (_a = dependencies.resources)[id] ?? (_a[id] = meta);
209
+ }
210
+ pushObservation(observations, warnings, plugin.name, observed, environment, entityNames.length, dependencies);
211
+ }
212
+ catch (err) {
213
+ // A thrown read is the whole-lexicon failure: every declared entity is
214
+ // NOT-OBSERVED, not absent (#1089). Emitting nothing here is what made a
215
+ // failed read look like "none of these exist" to every consumer.
216
+ const message = err instanceof Error ? err.message : String(err);
217
+ errors.push(`${plugin.name}: ${message}`);
218
+ pushObservation(observations, warnings, plugin.name, {
219
+ resources: {},
220
+ unobserved: unobservedAll(entityNames, "read-failed", message, entities),
221
+ queried: {},
222
+ sources: {},
223
+ notes: [],
224
+ }, environment, entityNames.length);
225
+ }
226
+ }
227
+ return { observations, warnings, errors, notes };
228
+ }
229
+ /**
230
+ * The subset of an observation belonging to one stack.
231
+ *
232
+ * A scoped stack's ids are qualified `${stack}::${id}` (#1162), so the prefix is
233
+ * the whole test. An unqualified observation — single-stack, or a bare-string
234
+ * stack sharing one id space — has no way to be split and is returned whole,
235
+ * which is what it already was.
236
+ */
237
+ function scopeToStack(resources, stack) {
238
+ if (!stack)
239
+ return resources;
240
+ const prefix = `${stack}::`;
241
+ const scoped = Object.fromEntries(Object.entries(resources)
242
+ .filter(([id]) => id.startsWith(prefix))
243
+ .map(([id, meta]) => [id, meta]));
244
+ // No qualified ids at all means this observation was never stack-scoped.
245
+ return Object.keys(scoped).length > 0 ? scoped : resources;
246
+ }
247
+ /**
248
+ * Ask a lexicon what exists of the kinds it manages, beyond what is declared
249
+ * (#1278). Once per stack for the region, merged by physical id — the same
250
+ * ambient resource seen from two stacks is one resource.
251
+ *
252
+ * "The same" is per region (#1416). Two stacks in one region reporting the
253
+ * account's default security group is one group; two regions' default security
254
+ * groups are two, whatever their ids look like, so the merge key carries the
255
+ * region a resource records itself in.
256
+ */
257
+ export async function collectAmbient(plugin, opts) {
258
+ var _a;
259
+ if (!plugin.observeAmbient || opts.kinds.length === 0)
260
+ return {};
261
+ const found = {};
262
+ const refs = opts.stacks.length > 0 ? opts.stacks : [{ name: undefined, region: undefined }];
263
+ // Only a merge needs region-qualified keys, and one ref is not a merge. This
264
+ // is what keeps a single-region project's ids exactly what they were, and a
265
+ // recorded snapshot — always one stack, so always one ref — bare.
266
+ const merging = refs.length > 1;
267
+ for (const ref of refs) {
268
+ try {
269
+ const part = await plugin.observeAmbient({
270
+ environment: opts.environment,
271
+ kinds: opts.kinds,
272
+ observed: opts.observed,
273
+ ...(ref.name ? { stack: ref.name } : {}),
274
+ ...(ref.region ? { region: ref.region } : {}),
275
+ });
276
+ for (const [id, meta] of Object.entries(part)) {
277
+ found[_a = merging ? unqualifiedKey(id, meta) : id] ?? (found[_a] = meta);
278
+ }
279
+ }
280
+ catch (err) {
281
+ opts.warnings.push(`${plugin.name}: ambient resources not read${ref.name ? ` for stack "${ref.name}"` : ""} — ${err instanceof Error ? err.message : String(err)}`);
282
+ }
283
+ }
284
+ return found;
285
+ }
286
+ const NO_DEPENDENCIES = { resources: {}, edges: [], warnings: [] };
287
+ /**
288
+ * Ask a lexicon what its declared estate references but does not manage (#1273).
289
+ *
290
+ * Called once per stack, because the closure roots and the region differ per
291
+ * stack, and merged by key. Dependencies are keyed by physical id and are
292
+ * deliberately NOT stack-qualified: the account's default VPC route table is the
293
+ * same resource whichever stack routes through it, and qualifying it would
294
+ * produce one node per referrer and an edge to each.
295
+ *
296
+ * Best-effort. A lexicon that does not implement the hook, or one whose read
297
+ * fails, contributes nothing — the managed observation is already complete and
298
+ * useful on its own, and failing it because an ambient dependency could not be
299
+ * read would trade a whole answer for a partial one.
300
+ */
301
+ export async function collectDependencies(plugin, opts) {
302
+ if (!plugin.observeDependencies)
303
+ return NO_DEPENDENCIES;
304
+ const resources = {};
305
+ const edges = [];
306
+ const warnings = [];
307
+ const refs = opts.stacks.length > 0 ? opts.stacks : [{ name: undefined, region: undefined }];
308
+ for (const ref of refs) {
309
+ // Only this stack's resources are the closure's roots. Handing a lexicon
310
+ // the whole estate makes it resolve out from resources that live somewhere
311
+ // else — for AWS that means `describe-instances` in one region with another
312
+ // region's instance ids, which fails outright with InvalidInstanceID and
313
+ // takes the whole read down with it.
314
+ const roots = scopeToStack(opts.observed, ref.name);
315
+ if (Object.keys(roots).length === 0)
316
+ continue;
317
+ try {
318
+ const found = await plugin.observeDependencies({
319
+ environment: opts.environment,
320
+ entities: opts.entities,
321
+ observed: roots,
322
+ ...(ref.name ? { stack: ref.name } : {}),
323
+ ...(ref.region ? { region: ref.region } : {}),
324
+ });
325
+ for (const [id, meta] of Object.entries(found.resources)) {
326
+ // Merge referrers rather than overwrite: two stacks routing through the
327
+ // same table is one node reached twice, and the reason it is here is
328
+ // both of them.
329
+ const existing = resources[id];
330
+ resources[id] = existing
331
+ ? { ...existing, referencedBy: [...new Set([...(existing.referencedBy ?? []), ...(meta.referencedBy ?? [])])] }
332
+ : meta;
333
+ }
334
+ edges.push(...(found.edges ?? []));
335
+ }
336
+ catch (err) {
337
+ const message = err instanceof Error ? err.message : String(err);
338
+ warnings.push(`${plugin.name}: dependencies not read${ref.name ? ` for stack "${ref.name}"` : ""} — ${message}`);
339
+ }
340
+ }
341
+ return { resources, edges, warnings };
342
+ }
343
+ /** Record one lexicon's observation, warning once per unobserved entity. */
344
+ function pushObservation(observations, warnings, lexicon, observed, environment, declaredCount, dependencies = NO_DEPENDENCIES) {
345
+ const hasResources = Object.keys(observed.resources).length > 0;
346
+ const unobservedNames = Object.keys(observed.unobserved);
347
+ for (const name of unobservedNames) {
348
+ warnings.push(`${lexicon}: not observed — ${formatUnobserved(name, observed.unobserved[name])}`);
349
+ }
350
+ if (!hasResources && unobservedNames.length === 0) {
351
+ // #1166 — this is exactly the "wrong endpoint" shape (AWS's
352
+ // stackDoesNotExist branch returns an empty map with no #1089 hole): a
353
+ // declared entity list with nothing observed and nothing explained.
354
+ // Previously this fell straight through with neither an observation nor a
355
+ // warning — silently indistinguishable from "nothing is deployed yet".
356
+ const notice = zeroResourcesWarning(lexicon, environment, declaredCount, observed);
357
+ if (notice)
358
+ warnings.push(notice);
359
+ return;
360
+ }
361
+ // Dependencies ride alongside the managed resources so they become nodes, and
362
+ // carry `referencedBy` so every consumer can still tell the two apart.
363
+ const hasDependencies = Object.keys(dependencies.resources).length > 0;
364
+ observations.push({
365
+ lexicon,
366
+ resources: hasDependencies
367
+ ? { ...observed.resources, ...dependencies.resources }
368
+ : observed.resources,
369
+ ...(unobservedNames.length > 0 ? { unobserved: observed.unobserved } : {}),
370
+ ...(dependencies.edges.length > 0 ? { edges: dependencies.edges } : {}),
371
+ ...(observed.stackExports && Object.keys(observed.stackExports).length > 0
372
+ ? { stackExports: observed.stackExports }
373
+ : {}),
374
+ });
375
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Real `ReferrerLookup` backend (#610, epic #551 follow-up to #568's
3
+ * `ReferrerLookup` interface). Shells out to `oras discover --format json
4
+ * <digest>` — the OCI distribution spec's referrers API, as exposed by the
5
+ * `oras` CLI — through the same injectable `ProcessRunner`
6
+ * (../components/verbs/process-runner.ts) the deep-scan `SbomGenerator`
7
+ * backend (../components/verbs/tool-sbom-generator.ts) and `publish-image`'s
8
+ * referrer-attach step share, mirroring ../components/verbs/cloud-executor.ts's
9
+ * `CloudExecutor` pattern once more: production code shells out, tests inject
10
+ * a `MockProcessRunner` and never touch a real registry/`oras` binary.
11
+ *
12
+ * Not the process-wide default: ./build-ledger.ts's `noopReferrerLookup`
13
+ * remains that (reports no referrers, no network, no registry credentials
14
+ * required) for exactly the reason `notImplementedSbomGenerator` and
15
+ * `SbomGenerator`'s hermetic backend aren't `sbom-generator.ts`'s default
16
+ * either — a project opts into the real registry-backed lookup explicitly
17
+ * (`buildLedgerEntries(manifest, createOrasReferrerLookup())`) rather than
18
+ * every previously-network-free build-ledger query silently starting to hit
19
+ * a registry.
20
+ */
21
+ import { defaultProcessRunner, q, requireTool, } from "../components/verbs/process-runner.js";
22
+ /**
23
+ * Classify one oras-reported referrer manifest into a `ReferrerKind`, keyed
24
+ * off its `artifactType`/media type — the same three kinds
25
+ * ../components/verbs/build-ledger.ts's `Referrer.kind` already models
26
+ * (`sbom`, `provenance`, `signature`). An unrecognized artifact type is
27
+ * skipped (returns `undefined`) rather than guessed at, since a wrong
28
+ * classification (e.g. reporting a signature as an SBOM) would be worse than
29
+ * omitting it — the caller only ever sees referrers this module is confident
30
+ * about.
31
+ */
32
+ function classify(descriptor) {
33
+ const type = (descriptor.artifactType ?? descriptor.mediaType ?? "").toLowerCase();
34
+ if (type.includes("spdx") || type.includes("cyclonedx") || type.includes("sbom"))
35
+ return "sbom";
36
+ if (type.includes("in-toto") || type.includes("provenance") || type.includes("slsa"))
37
+ return "provenance";
38
+ if (type.includes("cosign") || type.includes("signature") || type.includes("sig."))
39
+ return "signature";
40
+ return undefined;
41
+ }
42
+ /**
43
+ * Build a real `ReferrerLookup` backed by `oras discover`. `discover(digest)`
44
+ * runs `oras discover --format json <repo>@<digest>` and maps every returned
45
+ * manifest into a `Referrer`, classified by `classify` above. Returns `[]`
46
+ * (never throws) when `oras` reports no referrers for a digest — an image
47
+ * with no attached SBOM/provenance/signature is a normal outcome, not an
48
+ * error. Throws `ToolNotAvailableError`
49
+ * (../components/verbs/process-runner.ts) if `oras` itself is not installed,
50
+ * so a misconfigured environment fails loudly rather than silently reporting
51
+ * "no referrers" for every digest.
52
+ */
53
+ export function createOrasReferrerLookup(options) {
54
+ const runner = options.runner ?? defaultProcessRunner();
55
+ return {
56
+ async discover(digest) {
57
+ await requireTool(runner, "oras", `discover OCI referrers for ${options.repo}@${digest}`);
58
+ const ref = `${options.repo.replace(/\/+$/, "")}@${digest}`;
59
+ const { stdout } = await runner.run(`oras discover --format json ${q(ref)}`);
60
+ let parsed;
61
+ try {
62
+ parsed = JSON.parse(stdout);
63
+ }
64
+ catch {
65
+ return []; // no referrers / unexpected output shape — degrade to "none known", never throw on a parse hiccup.
66
+ }
67
+ const referrers = [];
68
+ for (const descriptor of parsed.manifests ?? []) {
69
+ const kind = classify(descriptor);
70
+ if (!kind)
71
+ continue;
72
+ referrers.push({
73
+ kind,
74
+ mediaType: descriptor.artifactType ?? descriptor.mediaType,
75
+ digest: descriptor.digest,
76
+ location: `${options.repo}@${descriptor.digest}`,
77
+ });
78
+ }
79
+ return referrers;
80
+ },
81
+ };
82
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The override gate's lines on `chant/lifecycle` (#3760): read the denials,
3
+ * overrides and applied records, record a denial, and record that a run
4
+ * applied under an override, which spends it. The decision is
5
+ * `../override-gate.ts`'s, which bundles without this module's git code.
6
+ *
7
+ * Denials and overrides share `_gates/policy-override.jsonl` with the
8
+ * ordinary gate line shapes, so `chant approve`, `chant operator status` and
9
+ * the audit reader read them as they read any gate. Applied records live in
10
+ * `_gates/policy-override/applied.jsonl`, which no gate reader lists.
11
+ */
12
+ import { sortedJsonReplacer } from "../utils.js";
13
+ import { appendPendingGate, readGateLedger } from "./gate-ledger.js";
14
+ import { readBlobBySha, readBlobFromPath, readPathSha, RefCASConflictError, writeBlobToPath } from "./git.js";
15
+ import { OVERRIDE_OP, parseAppliedOverrides, overridePending, } from "../override-gate.js";
16
+ const APPLIED_DIR = `_gates/${OVERRIDE_OP}`;
17
+ const APPLIED_FILE = "applied.jsonl";
18
+ const APPEND_RETRY_ATTEMPTS = 5;
19
+ /** The override ledger and its applied records, oldest first. Empty when nothing is recorded. */
20
+ export async function readOverrideLedger(opts) {
21
+ const { resolutions, pending } = await readGateLedger(OVERRIDE_OP, opts);
22
+ const text = await readBlobFromPath(APPLIED_DIR, APPLIED_FILE, opts);
23
+ return { resolutions, pending, applied: text ? parseAppliedOverrides(text) : [] };
24
+ }
25
+ /** Append a denial's pending fact ({@link overridePending}). Does not push. */
26
+ export async function recordOverrideDenial(input, opts) {
27
+ const { version: _v, kind: _k, ...rest } = overridePending(input);
28
+ const { commit, record } = await appendPendingGate(rest, opts);
29
+ return { commit, record: record };
30
+ }
31
+ /** Append applied records, spending the overrides they name. Write them before applying; a write that fails should stop the run. Does not push. */
32
+ export async function recordOverridesApplied(records, opts) {
33
+ if (records.length === 0)
34
+ return undefined;
35
+ const lines = records.map((r) => JSON.stringify(r, sortedJsonReplacer)).join("\n");
36
+ let lastErr;
37
+ for (let attempt = 1; attempt <= APPEND_RETRY_ATTEMPTS; attempt++) {
38
+ try {
39
+ const priorSha = await readPathSha(APPLIED_DIR, APPLIED_FILE, opts);
40
+ const existing = priorSha ? await readBlobBySha(priorSha, opts) : null;
41
+ const content = `${existing ? `${existing.replace(/\n$/, "")}\n` : ""}${lines}\n`;
42
+ return await writeBlobToPath(APPLIED_DIR, APPLIED_FILE, content, `Applied under override: ${records.map((r) => r.gate).join(", ")}`, {
43
+ ...opts,
44
+ expectPriorPathSha: priorSha,
45
+ });
46
+ }
47
+ catch (err) {
48
+ if (!(err instanceof RefCASConflictError))
49
+ throw err;
50
+ lastErr = err;
51
+ }
52
+ }
53
+ throw lastErr;
54
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Plan identity for a gate (#2300, measured on INTENTIUS/choudoufu#1026).
3
+ *
4
+ * A gate resolution used to carry the op, the gate, the approver and a
5
+ * timestamp, and nothing about what was approved. Approve, edit the root,
6
+ * re-run, and the second run re-planned and applied: the resolution had
7
+ * authorised the *next run* of that op rather than the plan the approver
8
+ * read. This module is the missing half — one string that identifies a plan,
9
+ * written onto the pending fact the run records, onto the resolution `chant
10
+ * approve` appends, and compared by {@link latestResolutionForPlan} when a
11
+ * later run decides the gate.
12
+ *
13
+ * ## What a digest covers
14
+ *
15
+ * The change set, and only the change set: what a run proposes to create,
16
+ * update, replace or destroy, at which addresses, with which values. Two
17
+ * plans share a digest exactly when applying either one would do the same
18
+ * thing to the estate.
19
+ *
20
+ * ## What it deliberately does not cover
21
+ *
22
+ * - **When the plan was taken.** A plan file's own `timestamp`, and the
23
+ * resolution's. Re-planning an unchanged root a minute later must produce
24
+ * the same digest, or every approval would expire on the clock rather than
25
+ * on the content.
26
+ * - **Which run took it.** `runId`, the CI job number, the workflow attempt.
27
+ * Approving a plan and re-running the workflow is the whole loop; binding
28
+ * the run id would make the approval unusable by the run that consumes it.
29
+ * - **The tool that produced it.** The terraform/choudoufu version, the plan
30
+ * file's binary bytes and its path on disk. The digest is taken over the
31
+ * `show -json` rendering rather than the file, so a plan-format bump does
32
+ * not read as a changed plan.
33
+ * - **Who approved it, or where.** `resolvedBy`, `note`, `url` — those
34
+ * describe the approval, not the plan.
35
+ *
36
+ * The identity is therefore a claim about consequence, not about provenance.
37
+ * That is the claim an approver is actually making.
38
+ */
39
+ import { canonicalJson } from "../effect-receipt.js";
40
+ import { contentDigest } from "../content-digest.js";
41
+ /** The hash a plan digest is taken with. */
42
+ export const PLAN_DIGEST_ALGORITHM = "sha256";
43
+ /**
44
+ * The version prefix a plan digest is written with since #2547: `jcs1` names
45
+ * the input form (the RFC 8785 canonical JSON of `{ kind, subject }`, see
46
+ * `canonicalJson` in ../effect-receipt.ts) and `sha256` the hash. A later
47
+ * input form gets a new prefix, so a digest always says how it was made.
48
+ */
49
+ export const PLAN_DIGEST_PREFIX = "jcs1-sha256:";
50
+ /** The bare prefix every digest written before #2547 carries. Still read, never written for a plan. */
51
+ export const LEGACY_PLAN_DIGEST_PREFIX = "sha256:";
52
+ /** Shape of a well-formed digest: either prefix, then 64 lowercase hex characters. */
53
+ const PLAN_DIGEST_PATTERN = /^(?:jcs1-)?sha256:([0-9a-f]{64})$/;
54
+ /**
55
+ * Hash a plan's change set into a stable identity.
56
+ *
57
+ * `kind` names the shape `subject` is in (`"terraform-plan"`,
58
+ * `"lifecycle-diff"`), and is hashed alongside it so two different kinds of
59
+ * plan can never collide into the same digest by coincidence — a gate bound
60
+ * to a terraform plan must not be satisfiable by a lifecycle diff that
61
+ * happened to serialize identically.
62
+ *
63
+ * `subject` is put in canonical form by `canonicalJson` (../effect-receipt.ts)
64
+ * and hashed by `contentDigest` (../content-digest.ts), so object key order,
65
+ * which neither terraform's JSON writer nor `JSON.parse` guarantees across
66
+ * versions, does not change the answer. It is the caller's job to
67
+ * hand in a projection that already excludes the volatile fields this
68
+ * module's doc comment lists.
69
+ *
70
+ * The result is `jcs1-sha256:<hex>` (#2547). Before that it was
71
+ * `sha256:<hex>` over the same bytes, so the hex is unchanged and
72
+ * {@link samePlanDigest} treats the two spellings as one digest: a gate
73
+ * recorded under the old prefix still matches the plan it was approved for.
74
+ */
75
+ export function computePlanDigest(kind, subject) {
76
+ return PLAN_DIGEST_PREFIX + contentDigest(canonicalJson({ kind, subject })).slice(LEGACY_PLAN_DIGEST_PREFIX.length);
77
+ }
78
+ /**
79
+ * Whether `raw` is a digest this code produced, in either prefix. Used at the
80
+ * `chant approve --plan` boundary, so a typo, a truncated copy-paste or a plan
81
+ * *file* path is refused before it is written into an immutable resolution
82
+ * that would then never match anything.
83
+ */
84
+ export function isPlanDigest(raw) {
85
+ return typeof raw === "string" && PLAN_DIGEST_PATTERN.test(raw);
86
+ }
87
+ /**
88
+ * Whether two recorded or computed plan digests name the same plan. Two
89
+ * well-formed plan digests are the same when their hex is, whichever prefix
90
+ * each carries (read both, write new, #2547). Anything else, such as a
91
+ * release plan's own digest, is the same only when the strings are equal.
92
+ */
93
+ export function samePlanDigest(a, b) {
94
+ if (a === b)
95
+ return true;
96
+ if (a === undefined || b === undefined)
97
+ return false;
98
+ const x = PLAN_DIGEST_PATTERN.exec(a);
99
+ const y = PLAN_DIGEST_PATTERN.exec(b);
100
+ return x !== null && y !== null && x[1] === y[1];
101
+ }
102
+ /**
103
+ * A digest as it reads in a message, and the one place that decides how an
104
+ * absent one reads. Records written before #2300 carry no digest at all, and
105
+ * "(none — recorded before plan-bound gates)" is what a refusal has to say
106
+ * about them instead of printing `undefined`.
107
+ */
108
+ export function describePlanDigest(digest) {
109
+ return digest ?? "(none — recorded before plan-bound gates)";
110
+ }