@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,109 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { computePlanDigest } from "../../lifecycle/plan-digest.js";
4
+ const execAsync = promisify(exec);
5
+ /**
6
+ * Take a chant lifecycle snapshot for the given environment.
7
+ * Uses fastIdempotent profile — 5m timeout, 3 retries.
8
+ */
9
+ export async function lifecycleSnapshot(args, signal) {
10
+ const { stdout, stderr } = await execAsync(`chant lifecycle snapshot ${args.env}`, { signal });
11
+ if (stdout)
12
+ console.log(stdout);
13
+ if (stderr)
14
+ console.error(stderr);
15
+ }
16
+ /**
17
+ * The change set half of a `chant lifecycle diff` render, canonicalised for
18
+ * digesting (#2300).
19
+ *
20
+ * The diff render is line-oriented: section headers and the resource rows
21
+ * under them. Two runs over an unchanged environment print the same lines, so
22
+ * the lines are the change set. Normalising is deliberately minimal — CRLF to
23
+ * LF, trailing whitespace off each line, blank lines dropped — because
24
+ * anything more aggressive would start discarding rows, and a digest that
25
+ * discards rows is a digest that approves changes nobody saw.
26
+ *
27
+ * Unlike a terraform plan there is no timestamp to strip: the diff render
28
+ * carries none. If one is ever added it has to be dropped here, or every
29
+ * approval would be stale the moment it was written.
30
+ */
31
+ export function normalizeDiffChangeSet(output) {
32
+ return output
33
+ .replace(/\r\n/g, "\n")
34
+ .split("\n")
35
+ .map((line) => line.replace(/\s+$/, ""))
36
+ .filter((line) => line !== "");
37
+ }
38
+ /**
39
+ * Section headers emitted by `chant lifecycle diff --live` that indicate a
40
+ * non-empty drift category. See packages/core/src/cli/handlers/state.ts.
41
+ */
42
+ const DRIFT_HEADERS = [
43
+ "MISSING",
44
+ "ORPHAN",
45
+ "DISAPPEARED",
46
+ "DRIFTED",
47
+ // An owned resource whose live properties differ from its declaration (the
48
+ // deep read): a sql table's TTL changed out of band, say (#3642).
49
+ "PROPERTY DRIFT",
50
+ // A change an apply would make that no declared property shows: a
51
+ // privilege granted by hand on a Postgres table (#3706).
52
+ "PENDING",
53
+ "ARTIFACTS ADDED",
54
+ "ARTIFACTS REMOVED",
55
+ "ARTIFACTS CHANGED",
56
+ ];
57
+ /** True when a `chant lifecycle diff` render carries any of {@link DRIFT_HEADERS}' sections. */
58
+ export function detectDrift(output) {
59
+ return DRIFT_HEADERS.some((h) => output.includes(`${h} (`) || output.includes(`\n${h}`));
60
+ }
61
+ /**
62
+ * The identity of one `chant lifecycle diff` result (#2300). The environment
63
+ * and the `--live` flag are hashed alongside the change set because they say
64
+ * what the change set is *of*: the same rows against `staging` are not an
65
+ * approval to apply against `prod`.
66
+ */
67
+ export function lifecycleDiffDigest(args, output) {
68
+ return computePlanDigest("lifecycle-diff", {
69
+ env: args.env,
70
+ live: args.live === true,
71
+ changeSet: normalizeDiffChangeSet(output),
72
+ });
73
+ }
74
+ /**
75
+ * Run `chant lifecycle diff <env>` and return the output + structured drift
76
+ * flag. Read-only; intended for use inside watch/observation Ops.
77
+ * Uses fastIdempotent profile.
78
+ *
79
+ * The `drifted` field is computed by scanning the output for any of the
80
+ * MISSING / ORPHAN / DRIFTED / DISAPPEARED / PROPERTY DRIFT section headers documented in
81
+ * cli/state.mdx. Pair with `outcomeAttribute: { name: "Drift", from: "drifted" }`
82
+ * on a WatchOp activity step to surface drift as the run's `Drift` outcome.
83
+ *
84
+ * A diff that exits non-zero (#3712) fails the step and yields no digest.
85
+ * Its output is an error, not a change set: every failed run printed the
86
+ * same lines, so a digest over them was one an approval matched whatever
87
+ * the declarations had become since.
88
+ */
89
+ export async function lifecycleDiff(args, signal) {
90
+ const liveFlag = args.live ? " --live" : "";
91
+ const command = `chant lifecycle diff ${args.env}${liveFlag}`;
92
+ let stdout;
93
+ let stderr;
94
+ try {
95
+ ({ stdout, stderr } = await execAsync(command, { signal }));
96
+ }
97
+ catch (err) {
98
+ const e = err;
99
+ const output = `${e.stdout ?? ""}${e.stderr ?? ""}`.trim();
100
+ if (output)
101
+ console.error(output);
102
+ const message = `${command} failed (exit ${String(e.code ?? 1)}); no plan to digest${output ? `:\n${output}` : ""}`;
103
+ throw new Error(message);
104
+ }
105
+ const output = `${stdout}${stderr}`.trim();
106
+ if (output)
107
+ console.log(output);
108
+ return { output, exitCode: 0, drifted: detectDrift(output), planDigest: lifecycleDiffDigest(args, output) };
109
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * pipelineSupplyChainAudit — the live counterpart to the gitlab post-synth
3
+ * include/component/image checks (#297).
4
+ *
5
+ * Some include/component checks can only be answered against a moving external
6
+ * truth: whether a pinned component/include ref still resolves upstream, whether
7
+ * the upstream project was archived or moved, or whether a new advisory now
8
+ * covers a component/image already in use. These change independent of the
9
+ * source, so they cannot live in the deterministic build — this activity owns
10
+ * *only* the checks that require live resolution.
11
+ *
12
+ * Dependency-free and primitives-only: it reads the emitted `.gitlab-ci.yml`
13
+ * (passed as a string) and resolves references through an injectable
14
+ * `GitlabRefResolver`, so `chant run` can schedule it and tests can run
15
+ * it against recorded responses with no live network.
16
+ */
17
+ /**
18
+ * Collect `include:project` (+ ref), `component:` (with @version), and `image:`
19
+ * references from a `.gitlab-ci.yml`.
20
+ */
21
+ export function collectPipelineRefs(yaml) {
22
+ const out = [];
23
+ // include:\n - project: group/proj\n ref: main
24
+ const projectRe = /-\s+project:\s*['"]?([^\s'"]+)['"]?[\s\S]*?ref:\s*['"]?([^\s'"]+)['"]?/g;
25
+ let m;
26
+ while ((m = projectRe.exec(yaml)) !== null) {
27
+ out.push({ refKind: "include", identifier: m[1], ref: m[2] });
28
+ }
29
+ // - component: host/group/comp@1.0.0
30
+ const componentRe = /-\s+component:\s*['"]?([^\s'"@]+)@([^\s'"]+)['"]?/g;
31
+ while ((m = componentRe.exec(yaml)) !== null) {
32
+ out.push({ refKind: "component", identifier: m[1], ref: m[2] });
33
+ }
34
+ // Images: inline `image: name` or block `image:\n name: ...` (and services).
35
+ const lines = yaml.split("\n");
36
+ const imgSeen = new Set();
37
+ const addImage = (raw) => {
38
+ const image = raw.trim().replace(/^['"]|['"]$/g, "");
39
+ if (!image || image.includes("$") || imgSeen.has(image))
40
+ return;
41
+ imgSeen.add(image);
42
+ const at = image.lastIndexOf("@");
43
+ const colon = image.lastIndexOf(":");
44
+ const ref = at !== -1 ? image.slice(at + 1) : colon > image.lastIndexOf("/") ? image.slice(colon + 1) : "latest";
45
+ out.push({ refKind: "image", identifier: image, ref });
46
+ };
47
+ for (let i = 0; i < lines.length; i++) {
48
+ const inline = lines[i].match(/^\s+image:[ \t]+(\S.*)$/);
49
+ if (inline) {
50
+ addImage(inline[1]);
51
+ continue;
52
+ }
53
+ if (/^\s+image:\s*$/.test(lines[i]) || /^\s+-\s+name:[ \t]+(\S.*)$/.test(lines[i])) {
54
+ const svcName = lines[i].match(/^\s+-\s+name:[ \t]+(\S.*)$/);
55
+ if (svcName) {
56
+ addImage(svcName[1]);
57
+ continue;
58
+ }
59
+ const nameLine = lines.slice(i + 1, i + 4).find((l) => /^\s+name:[ \t]+/.test(l));
60
+ if (nameLine)
61
+ addImage(nameLine.replace(/^\s+name:[ \t]+/, ""));
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ /**
67
+ * Default resolver: query the GitLab REST API for project existence / archive /
68
+ * move status. Best-effort and resilient — errors yield an "unknown" resolution
69
+ * (exists=true, no findings) rather than a false positive. Component/image
70
+ * advisory lookups are left to a configured resolver.
71
+ */
72
+ export const defaultGitlabRefResolver = async (kind, identifier) => {
73
+ const unknown = { exists: true, archived: false, advisories: [] };
74
+ if (kind === "image")
75
+ return unknown; // image advisory feeds are resolver-specific
76
+ const host = "https://gitlab.com";
77
+ const project = kind === "component" ? identifier.split("/").slice(1, 3).join("/") : identifier;
78
+ try {
79
+ const resp = await fetch(`${host}/api/v4/projects/${encodeURIComponent(project)}`, {
80
+ headers: process.env.GITLAB_TOKEN ? { "PRIVATE-TOKEN": process.env.GITLAB_TOKEN } : {},
81
+ });
82
+ if (resp.status === 404)
83
+ return { exists: false, archived: false, advisories: [] };
84
+ if (!resp.ok)
85
+ return unknown;
86
+ const p = (await resp.json());
87
+ return { exists: true, archived: !!p.archived, advisories: [] };
88
+ }
89
+ catch {
90
+ return unknown;
91
+ }
92
+ };
93
+ function renderSummary(findings) {
94
+ if (findings.length === 0)
95
+ return "## Pipeline include/component audit\n\nNo live drift detected against upstream references.\n";
96
+ let out = `## Pipeline include/component audit\n\n${findings.length} finding(s) against live upstream truth:\n\n`;
97
+ out += "| Reference | Ref | Finding | Detail |\n|---|---|---|---|\n";
98
+ for (const f of findings)
99
+ out += `| ${f.identifier} (${f.refKind}) | ${f.ref} | ${f.kind} | ${f.detail} |\n`;
100
+ return out;
101
+ }
102
+ async function readFileBestEffort(path) {
103
+ try {
104
+ const { readFile } = await import("node:fs/promises");
105
+ return [await readFile(path, "utf-8")];
106
+ }
107
+ catch {
108
+ return [];
109
+ }
110
+ }
111
+ /**
112
+ * Resolve each include/component/image reference in the emitted pipeline against
113
+ * live upstreams and report drift.
114
+ */
115
+ export async function pipelineSupplyChainAudit(args) {
116
+ const resolver = args.resolver ?? defaultGitlabRefResolver;
117
+ const mode = args.mode ?? "report";
118
+ let yamls = args.yamls ?? (args.yaml ? [args.yaml] : []);
119
+ if (yamls.length === 0) {
120
+ yamls = await readFileBestEffort(args.pipelineFile ?? ".gitlab-ci.yml");
121
+ }
122
+ const findings = [];
123
+ const seen = new Set();
124
+ for (const yaml of yamls) {
125
+ for (const { refKind, identifier, ref } of collectPipelineRefs(yaml)) {
126
+ const key = `${refKind}:${identifier}@${ref}`;
127
+ if (seen.has(key))
128
+ continue;
129
+ seen.add(key);
130
+ const res = await resolver(refKind, identifier, ref);
131
+ if (!res.exists) {
132
+ findings.push({ kind: "unresolved", refKind, identifier, ref, detail: `${refKind} "${identifier}@${ref}" no longer resolves upstream` });
133
+ continue;
134
+ }
135
+ if (res.archived) {
136
+ findings.push({ kind: "archived", refKind, identifier, ref, detail: `${identifier} has been archived upstream` });
137
+ }
138
+ if (res.movedTo) {
139
+ findings.push({ kind: "moved", refKind, identifier, ref, detail: `${identifier} moved to ${res.movedTo}` });
140
+ }
141
+ for (const adv of res.advisories) {
142
+ findings.push({ kind: "advisory", refKind, identifier, ref, detail: `disclosed advisory ${adv} covers ${identifier}` });
143
+ }
144
+ }
145
+ }
146
+ return { mode, findings, summary: renderSummary(findings) };
147
+ }
@@ -0,0 +1,26 @@
1
+ import { nonRetryableFailure } from "../activity-failure.js";
2
+ import { evaluateProjectPolicies } from "../../lint/policy.js";
3
+ /**
4
+ * Gate an apply on organizational policy: build the project, run its
5
+ * `lint.policies` over the resolved resources, and **block** on any violation.
6
+ * Place it as a step before the apply phase — a violation fails the run
7
+ * (non-retryable; the `policyCheck` profile is single-attempt) so nothing is
8
+ * applied. A clean evaluation passes through.
9
+ *
10
+ * A plain activity on every runtime, not a `gate` step.
11
+ */
12
+ export async function policyGate(args, _signal) {
13
+ const { violations, suppressed, env } = await evaluateProjectPolicies({ path: args.path ?? ".", env: args.env });
14
+ if (violations.length > 0) {
15
+ const summary = violations
16
+ .map((v) => `[${v.checkId}]${v.entity ? ` ${v.entity}:` : ""} ${v.message}`)
17
+ .join("; ");
18
+ throw nonRetryableFailure(`Organizational policy blocked the apply — ${violations.length} violation(s): ${summary}`, "PolicyViolation");
19
+ }
20
+ // chant #1138 — a check `lint.rules` turned "off" is counted here rather
21
+ // than vanishing silently, mirroring `chant build`'s own suppressed-count line.
22
+ if (suppressed.length > 0) {
23
+ console.log(`[policy] ${suppressed.length} finding(s) suppressed via lint.rules`);
24
+ }
25
+ console.log(`[policy] ${env ? `env=${env}: ` : ""}no violations — apply may proceed`);
26
+ }
@@ -0,0 +1,341 @@
1
+ /**
2
+ * The `predictBehaviour` activity and the pull-request finding built on it
3
+ * (#2358, epic #2355).
4
+ *
5
+ * Two activities, because they answer two questions:
6
+ *
7
+ * - {@link predictBehaviour} asks the project's predicting lexicon what the
8
+ * declared estate would do at a stated traffic level, and returns the
9
+ * {@link BehaviourResult} as the contract defines it — a report, or a named
10
+ * refusal. It builds the project in-process, assembles the request from the
11
+ * build the way `lifecycle plan` assembles a deep read's, and hands it to
12
+ * the one configured lexicon that implements the fourth observation method.
13
+ * `isBehaviourRefusalReport` is the branch every consumer of its result
14
+ * takes first.
15
+ * - {@link behaviourFinding} runs that prediction twice — once on the
16
+ * checkout the run is in (the pull request's head) and once on the base
17
+ * branch it targets — differences the two under the rules in
18
+ * `../../behaviour-delta.ts`, and posts the finding in `comment` mode
19
+ * through {@link reconcilePr}. Same sticky comment on GitHub and Forgejo,
20
+ * same merge-request note on GitLab, same marker recipe: nothing here
21
+ * posts anything itself.
22
+ *
23
+ * ## The base side is a checkout, not a snapshot
24
+ *
25
+ * The finding is declared-versus-declared: the graph the pull request
26
+ * proposes against the graph its base branch already holds. Both sides are
27
+ * built from source, so the base branch is checked out into a detached git
28
+ * worktree under the repository's own root (module resolution walks up from
29
+ * there to the same `node_modules` the head build uses) and removed again
30
+ * whether the prediction succeeded or not. A shallow CI clone does not carry
31
+ * the base branch, so it is fetched at depth one first — the same reason
32
+ * `converge.ts` fetches `chant/lifecycle` before reading it.
33
+ *
34
+ * The base branch name comes off the run's own event, the way the pull
35
+ * request itself does in `reconcile.ts`: `GITHUB_BASE_REF` on a GitHub
36
+ * Actions or Forgejo Actions `pull_request` job, `CI_MERGE_REQUEST_TARGET_BRANCH_NAME`
37
+ * on a GitLab `merge_request_event` pipeline. A run with neither and no
38
+ * explicit `base` fails by name rather than guessing `main`.
39
+ *
40
+ * ## What the marker names
41
+ *
42
+ * The comment's hidden marker names the Op and the env together
43
+ * ({@link behaviourFindingMarker}), for #2319's reason: a `comment`-mode
44
+ * `reconcilePr` step on the same pull request keys its marker on the env
45
+ * alone, and a behaviour finding over `prod` sharing a marker with a plan
46
+ * finding over `prod` would edit the wrong comment on every push.
47
+ *
48
+ * ## Edge coverage on the declared path
49
+ *
50
+ * `buildGraphIr` produces reference edges and is exhaustive for them. It
51
+ * produces no containment — a subnet's membership of a VPC is not a reference
52
+ * — and #2360's third comment records that nothing on the declared path does
53
+ * yet. So the request never claims `complete`: that would be a true claim
54
+ * about references and a false one about the graph. It cannot honestly claim
55
+ * `partial` either, because `partial` has to name a gap as `dangling` or
56
+ * `unresolvedKinds`, and the gap here is neither — every reference resolved,
57
+ * and the generic builder has no vocabulary for "this kind is a boundary
58
+ * whose containment is missing" (the request fixture names its boundary
59
+ * kinds by hand, which is lexicon knowledge core does not have). An earlier
60
+ * draft named every kind no reference touched, and named a queue nobody
61
+ * references as "unresolved", which it is not. So the claim is `unknown`,
62
+ * which the contract tells a consumer to treat exactly as it treats
63
+ * `partial`, and the finding shows each side's coverage and does not compare
64
+ * resilience verdicts across it — see `renderBehaviourFinding`.
65
+ */
66
+ import { exec } from "node:child_process";
67
+ import { mkdtemp, rm } from "node:fs/promises";
68
+ import { join, resolve } from "node:path";
69
+ import { promisify } from "node:util";
70
+ import { isBehaviourRefusalReport, } from "../../behaviour.js";
71
+ import { behaviourDelta, renderBehaviourFinding, validateBehaviourResult, } from "../../behaviour-delta.js";
72
+ import { createBehaviourPredict } from "../../behaviour-predict.js";
73
+ import { markerSlug, reconcilePr, suppliedMarker } from "./reconcile.js";
74
+ const execAsync = promisify(exec);
75
+ function shellQuote(s) {
76
+ return `'${s.replace(/'/g, "'\\''")}'`;
77
+ }
78
+ /**
79
+ * What the activity says when nothing has contributed coverage rows.
80
+ *
81
+ * Not an error and not a refusal: the prediction runs, every declared entity
82
+ * is withheld as `unknown-type`, and this is what the report's own detail says
83
+ * one level down. Kept as a message rather than a throw because an estate
84
+ * whose lexicons contribute no rows is a real state with a real answer — "no
85
+ * row says what any of these are" — and a throw would turn it into a broken
86
+ * command (#2382).
87
+ */
88
+ export function noContributedRowsMessage(lexicons) {
89
+ const configured = lexicons.length > 0 ? lexicons.join(", ") : "(none)";
90
+ return ("predictBehaviour has the estate to predict and no coverage rows to read it with: none of the " +
91
+ `configured lexicons (${configured}) contributes \`behaviourKinds\`. Every entity will be reported ` +
92
+ "unpredicted as `unknown-type`. Set CHANT_BEHAVIOUR_ENGINE to the engine's address, and add rows " +
93
+ "in the lexicon that owns the entity types you expect priced.");
94
+ }
95
+ /**
96
+ * The declared path's honest coverage claim. See the module doc: reference
97
+ * edges are exhaustive and containment is absent, and the contract has a
98
+ * field for a missing reference and none for missing containment, so the
99
+ * claim is `unknown`. Never `complete`, and not `partial` naming a kind the
100
+ * generic builder has no basis to name. A function rather than a constant so
101
+ * the day the declared path produces containment edges (#2360), the claim
102
+ * changes here and nowhere else.
103
+ */
104
+ export function declaredEdgeCoverage() {
105
+ return { verdict: "unknown" };
106
+ }
107
+ /**
108
+ * Predict the estate declared under `projectPath`. The in-process half of
109
+ * {@link predictBehaviour}, taking the project root explicitly so the
110
+ * finding can run it on the base checkout too.
111
+ *
112
+ * Imports are dynamic so this module carries no load-time edge into the CLI
113
+ * or the build: `cli/plugins` reaches back into the root index, and the
114
+ * activity registry imports this module statically.
115
+ */
116
+ export async function predictDeclared(projectPath, args) {
117
+ const { loadChantConfigUpward } = await import("../../config.js");
118
+ const { loadPlugins, resolveProjectLexicons } = await import("../../cli/plugins.js");
119
+ const { build } = await import("../../build.js");
120
+ const { buildGraphIr } = await import("../../graph-ir.js");
121
+ const { config } = await loadChantConfigUpward(projectPath);
122
+ const lexicons = await resolveProjectLexicons(projectPath);
123
+ const plugins = (await loadPlugins(lexicons));
124
+ // Rows, not a predictor. Since #2382 core predicts and each lexicon says
125
+ // only what its own entity types mean, so there is nothing to choose between
126
+ // and nothing to refuse when two lexicons both answer — they are additive.
127
+ const kinds = plugins.map((p) => p.behaviourKinds).filter((k) => k !== undefined);
128
+ const sourceDir = resolve(projectPath, config.sourceDir ?? ".");
129
+ const result = await build(sourceDir, plugins.map((p) => p.serializer));
130
+ if (result.errors.length > 0) {
131
+ const messages = result.errors.map((e) => (typeof e === "string" ? e : e.message ?? String(e)));
132
+ throw new Error(`predictBehaviour: the project under ${projectPath} did not build: ${messages.join("; ")}`);
133
+ }
134
+ // Every declared entity with a type. The contributed rows decide what
135
+ // reaches the engine and what is declared unmapped, and they can only decide
136
+ // about what they are handed: filtering here to "resources" would silently
137
+ // drop the kinds the coverage rows exist to name.
138
+ const entities = new Map();
139
+ for (const [name, entity] of result.entities) {
140
+ const declarable = entity;
141
+ if (typeof declarable.entityType !== "string")
142
+ continue;
143
+ entities.set(name, {
144
+ entityType: declarable.entityType,
145
+ props: (declarable.props != null ? declarable.props : {}),
146
+ });
147
+ }
148
+ const edges = buildGraphIr(result.entities, sourceDir).edges;
149
+ // The build output the other three reads are handed — a string, not a path
150
+ // (cli/handlers/lifecycle.ts). Nothing on this path reads it; the mirror is
151
+ // kept so the four methods take the same shape. With no predicting lexicon
152
+ // to take it from, it is the first output the build produced, or empty.
153
+ const raw = [...result.outputs.values()][0];
154
+ const buildOutput = raw === undefined ? "" : typeof raw === "string" ? raw : raw.primary;
155
+ const options = {
156
+ environment: args.environment,
157
+ buildOutput,
158
+ entityNames: [...entities.keys()],
159
+ entities,
160
+ ...(args.stack ? { stack: args.stack } : {}),
161
+ ...(args.region ? { region: args.region } : {}),
162
+ ...(args.owned !== undefined ? { owned: args.owned } : {}),
163
+ traffic: args.traffic,
164
+ edges,
165
+ edgeCoverage: declaredEdgeCoverage(),
166
+ // This activity builds from `discover` + `build`, never from an account —
167
+ // it is the declared estate by construction, on whichever checkout it runs.
168
+ from: "declared",
169
+ };
170
+ const answer = await createBehaviourPredict({ kinds })(options);
171
+ // On arrival, with the names that were asked — `behaviourReport` checks the
172
+ // ordinary route and says a consumer that needs the guarantee checks again.
173
+ return validateBehaviourResult(answer, options.entityNames);
174
+ }
175
+ /**
176
+ * Predict the declared estate in the working directory at `args.traffic`.
177
+ * Returns the contract's result as it is; a refusal is a result, not a
178
+ * thrown error, and `isBehaviourRefusalReport` is the branch to take first.
179
+ * Uses the `fastIdempotent` profile: the build is offline and the engine call
180
+ * is read-only.
181
+ */
182
+ export async function predictBehaviour(args) {
183
+ return predictDeclared(resolve("."), args);
184
+ }
185
+ /**
186
+ * The hidden marker a behaviour finding is found by across re-runs. Keyed on
187
+ * the Op *and* the env, both slugified the same way `reconcilePr`'s markers
188
+ * are, and distinct from both of those by its prefix: a `comment`-mode
189
+ * `reconcilePr` step and this step on one pull request must never match each
190
+ * other's comment.
191
+ */
192
+ export function behaviourFindingMarker(op, env) {
193
+ return `<!-- chant-behaviour:${markerSlug(op)}/${markerSlug(env)} -->`;
194
+ }
195
+ /** What the finding says when the run names no base branch to predict against. */
196
+ export function noBaseRefMessage() {
197
+ return ("behaviourFinding predicts the pull request's declared estate against its base branch's, and this run " +
198
+ "names no base branch. On GitHub Actions and Forgejo Actions a pull_request event sets GITHUB_BASE_REF; on " +
199
+ "GitLab CI a merge_request_event pipeline sets CI_MERGE_REQUEST_TARGET_BRANCH_NAME. Trigger the Op from " +
200
+ "one of those, or pass `base` with the branch name.");
201
+ }
202
+ /** Where the base branch name comes from, most specific first. Pure — exported for testing. */
203
+ export function baseRefFrom(env, explicit) {
204
+ const fromArgs = explicit?.trim();
205
+ if (fromArgs)
206
+ return fromArgs;
207
+ for (const source of ["GITHUB_BASE_REF", "CI_MERGE_REQUEST_TARGET_BRANCH_NAME"]) {
208
+ const value = env[source]?.trim();
209
+ if (value)
210
+ return value;
211
+ }
212
+ return undefined;
213
+ }
214
+ /** What the head side is called in the finding: the source branch when the run names one, else the short commit. */
215
+ export function headRefFrom(env, shortSha) {
216
+ for (const source of ["GITHUB_HEAD_REF", "CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"]) {
217
+ const value = env[source]?.trim();
218
+ if (value)
219
+ return value;
220
+ }
221
+ return shortSha?.trim() || "head";
222
+ }
223
+ /**
224
+ * Check `base` out into a detached worktree beside the repository. Fetches it
225
+ * at depth one first, because a CI clone carries only the pull request's own
226
+ * ref; a branch already present locally (a full clone, a developer's own
227
+ * checkout) is used as it stands after the fetch fails.
228
+ */
229
+ export async function checkoutBase(base, signal) {
230
+ const { stdout: rootOut } = await execAsync("git rev-parse --show-toplevel", { signal });
231
+ const { stdout: prefixOut } = await execAsync("git rev-parse --show-prefix", { signal });
232
+ const root = rootOut.trim();
233
+ const prefix = prefixOut.trim();
234
+ let commitish = "FETCH_HEAD";
235
+ try {
236
+ await execAsync(`git fetch --depth=1 origin ${shellQuote(base)}`, { signal });
237
+ }
238
+ catch {
239
+ // No remote, or no such branch there: a local branch of that name is
240
+ // the only other thing `base` can honestly mean.
241
+ commitish = base;
242
+ }
243
+ const dir = await mkdtemp(join(root, ".chant-behaviour-base-"));
244
+ try {
245
+ await execAsync(`git worktree add --detach ${shellQuote(dir)} ${shellQuote(commitish)}`, { signal });
246
+ }
247
+ catch (err) {
248
+ await rm(dir, { recursive: true, force: true });
249
+ throw new Error(`behaviourFinding could not check out base branch ${JSON.stringify(base)}: ${err.message}`);
250
+ }
251
+ return {
252
+ projectPath: prefix ? join(dir, prefix) : dir,
253
+ async cleanup() {
254
+ try {
255
+ await execAsync(`git worktree remove --force ${shellQuote(dir)}`);
256
+ }
257
+ catch {
258
+ await rm(dir, { recursive: true, force: true });
259
+ }
260
+ },
261
+ };
262
+ }
263
+ async function defaultShortSha() {
264
+ try {
265
+ const { stdout } = await execAsync("git rev-parse --short HEAD");
266
+ return stdout.trim();
267
+ }
268
+ catch {
269
+ return undefined;
270
+ }
271
+ }
272
+ /**
273
+ * Build the finding activity, with its four side effects injected so a test
274
+ * can drive the whole thing — predict twice, difference, render, post —
275
+ * against fixtures and a stubbed poster.
276
+ */
277
+ export function createBehaviourFinding(deps = {}) {
278
+ const predict = deps.predict ?? predictDeclared;
279
+ const checkout = deps.checkout ?? checkoutBase;
280
+ const post = deps.post ?? reconcilePr;
281
+ const env = deps.env ?? process.env;
282
+ const shortSha = deps.shortSha ?? defaultShortSha;
283
+ return async function behaviourFinding(args, signal) {
284
+ const mode = args.mode ?? "comment";
285
+ if (typeof args.op !== "string" || args.op.trim() === "") {
286
+ throw new Error("behaviourFinding needs `op`, the name of the Op this step belongs to: it keys the comment's marker " +
287
+ "together with `environment`, and an env alone is not unique across Ops (#2319).");
288
+ }
289
+ const base = baseRefFrom(env, args.base);
290
+ if (!base)
291
+ throw new Error(noBaseRefMessage());
292
+ const head = headRefFrom(env, await shortSha());
293
+ const predictArgs = {
294
+ environment: args.environment,
295
+ traffic: args.traffic,
296
+ ...(args.stack ? { stack: args.stack } : {}),
297
+ ...(args.region ? { region: args.region } : {}),
298
+ ...(args.owned !== undefined ? { owned: args.owned } : {}),
299
+ };
300
+ // Head first: it is the checkout the run is already in, and a build error
301
+ // there is the pull request's own and should surface before any worktree
302
+ // is created.
303
+ const headResult = await predict(resolve("."), predictArgs);
304
+ const baseCheckout = await checkout(base, signal);
305
+ let baseResult;
306
+ try {
307
+ baseResult = await predict(baseCheckout.projectPath, predictArgs);
308
+ }
309
+ finally {
310
+ await baseCheckout.cleanup();
311
+ }
312
+ const finding = behaviourDelta({ label: "base", ref: base, result: baseResult }, { label: "head", ref: head, result: headResult });
313
+ const summary = renderBehaviourFinding(finding, { env: args.environment, op: args.op });
314
+ const refused = isBehaviourRefusalReport(baseResult) || isBehaviourRefusalReport(headResult);
315
+ const result = { mode, base, head, finding, refused, summary };
316
+ if (mode === "report")
317
+ return result;
318
+ const posted = await post({
319
+ env: args.environment,
320
+ op: args.op,
321
+ mode: "comment",
322
+ marker: suppliedMarker(behaviourFindingMarker(args.op, args.environment)),
323
+ body: summary,
324
+ title: args.title ?? `Predicted behaviour for ${args.environment} at ${args.traffic}`,
325
+ }, signal);
326
+ return {
327
+ ...result,
328
+ ...(posted.commentUrl ? { commentUrl: posted.commentUrl } : {}),
329
+ ...(posted.pullRequest ? { pullRequest: posted.pullRequest } : {}),
330
+ ...(posted.mergeRequest ? { mergeRequest: posted.mergeRequest } : {}),
331
+ };
332
+ };
333
+ }
334
+ /**
335
+ * Predict the pull request's declared estate and its base branch's, and post
336
+ * the delta as one sticky comment on the pull request — or one note on the
337
+ * merge request — that triggered the run. Needs a pull-request-triggered
338
+ * run; fails by name without one, the same way `reconcilePr`'s `comment`
339
+ * mode does, because that is the function that posts.
340
+ */
341
+ export const behaviourFinding = createBehaviourFinding();