@intentius/chant 0.124.12 → 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 (928) 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.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. package/src/workspace/principal-classes.ts +5 -30
@@ -0,0 +1,969 @@
1
+ import { dirname, resolve } from "node:path";
2
+ import { discoverOps } from "../../op/discover.js";
3
+ import { discover } from "../../discovery/index.js";
4
+ import { partitionByLexicon, computeStackGraph, build, mergeBuildRootEntities } from "../../build.js";
5
+ import { buildGraphIr, buildLiveGraphIr, collectUnobserved, overlayGraphs, sourceOverlayGraphs, GRAPH_IR_VERSION } from "../../graph-ir.js";
6
+ import { behaviourOverlay } from "../../behaviour-overlay.js";
7
+ import { applyBehaviourOverlay, behaviourRequestFromIr } from "../../behaviour-graph.js";
8
+ import { buildDeclaredPerStack } from "../../graph-declared.js";
9
+ import { mergeProjectOps } from "../../graph-ops.js";
10
+ import { reconstructEdges, mergeCatalogs, containmentGroups } from "../../graph-refs.js";
11
+ import { observeResources } from "../../lifecycle/observe.js";
12
+ import { withLiveReadSession } from "../../live-read-session.js";
13
+ import { replaySnapshots, hasSnapshot } from "../../lifecycle/replay.js";
14
+ import { loadChantConfig, environmentNames, matchesDeclaredEnvironment, loadChantConfigUpward } from "../../config.js";
15
+ import { applyLiveEndpoint } from "../../live-endpoint.js";
16
+ import { applyDetail, detailInertNotice } from "../../graph-detail.js";
17
+ import { applyLens, parseLens } from "../../graph-lens.js";
18
+ import { toMermaid } from "../../graph-mermaid.js";
19
+ import { toDot } from "../../graph-dot.js";
20
+ import { getLayoutEngine, toLayoutInput } from "../../graph-layout.js";
21
+ import { lintCommand } from "../commands/lint.js";
22
+ import { loadPlugins, resolveProjectLexicons, collectBuildRootContributors } from "../plugins.js";
23
+ import { isNoLexiconDetected } from "../../detectLexicon.js";
24
+ import { readFileSync } from "node:fs";
25
+ import { formatError, formatWarning, formatBold } from "../format.js";
26
+ import { computeComponentGraph, generateComponentsPipeline } from "../../components/cli-support.js";
27
+ import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli.js";
28
+ import { discoverComponents } from "../../components/discover.js";
29
+ import { cfnDeployStacks } from "./components.js";
30
+ /**
31
+ * The project's lexicons, or none for a project that declares none and imports
32
+ * none (an Ops-only member, `lexicons: []`): detection's NO_LEXICON_DETECTED
33
+ * sentinel means "no lexicon", as `chant lint` reads it, not a failed graph (#2841).
34
+ */
35
+ async function projectLexiconsOrNone(projectPath) {
36
+ try {
37
+ return await resolveProjectLexicons(projectPath);
38
+ }
39
+ catch (err) {
40
+ if (isNoLexiconDetected(err))
41
+ return [];
42
+ throw err;
43
+ }
44
+ }
45
+ /**
46
+ * Resolve this invocation's declared build-time parameters, the same way
47
+ * `chant build` does, so `discover()` sees the values the source will read.
48
+ *
49
+ * Without this `chant graph` discovered source with `params.*` empty, so every
50
+ * declaration conditioned on a parameter took its default — a project whose
51
+ * tier is a `buildParams` entry graphed as one tier whatever `--param tier=`
52
+ * or the declared `env:` mapping said, while `chant build` on the same source
53
+ * and the same environment emitted a different resource set. Two commands
54
+ * disagreeing about what the source says.
55
+ *
56
+ * Returns `undefined` when resolution failed, having printed why — the caller
57
+ * should stop rather than graph something that will not build.
58
+ */
59
+ async function graphBuildParams(ctx, projectPath) {
60
+ const { config } = await loadChantConfigUpward(projectPath).catch(() => ({ config: {} }));
61
+ const resolution = resolveCliBuildParams(config.buildParams, {
62
+ cli: parseParamFlags(ctx.args.param),
63
+ paramsFile: ctx.args.paramsFile,
64
+ verbose: ctx.args.verbose,
65
+ });
66
+ if (!resolution.success) {
67
+ for (const message of resolution.errors)
68
+ console.error(message);
69
+ return undefined;
70
+ }
71
+ return resolution.provenance;
72
+ }
73
+ /**
74
+ * The build-root contributors this invocation's project configures (#1626) —
75
+ * the same closures `chant build` and the lifecycle handlers hand to
76
+ * `BuildOptions.buildRoots`, bound here for the graph command's
77
+ * discover-based paths, which never run `build()` and so never ran the hook:
78
+ * a `k8s.kustomize.roots` estate graphed only its typed source while its
79
+ * built (and deployed) output carried the rendered manifests too.
80
+ *
81
+ * `graph` is not `requiresPlugins` (Op/source-graph modes must work without a
82
+ * lexicon), so plugins are loaded here when `ctx.plugins` is empty, mirroring
83
+ * `runGraphLive`. Rooted at the config's own directory, like
84
+ * `cli/commands/build.ts` — a relative kustomize root resolves against where
85
+ * it was declared, not against a sourceDir-scoped graph path. A project that
86
+ * fails to load plugins degrades to no contributors with a warning rather
87
+ * than failing modes that never needed plugins at all.
88
+ */
89
+ async function graphBuildRootContributors(ctx, projectPath) {
90
+ const { config, configPath } = await loadChantConfigUpward(projectPath).catch(() => ({ config: {}, configPath: undefined }));
91
+ let plugins = ctx.plugins;
92
+ if (plugins.length === 0) {
93
+ try {
94
+ plugins = await loadPlugins(await resolveProjectLexicons(projectPath));
95
+ }
96
+ catch (err) {
97
+ console.error(formatWarning({
98
+ message: `could not load the project's lexicons — build-root entities (kustomize roots) will be missing from the graph (${err instanceof Error ? err.message : String(err)})`,
99
+ }));
100
+ return [];
101
+ }
102
+ }
103
+ return collectBuildRootContributors(plugins, config, configPath ? dirname(configPath) : projectPath);
104
+ }
105
+ /**
106
+ * Merge build-root contributions into a discovered entity set — the exact
107
+ * merge `build()` performs (one implementation: `mergeBuildRootEntities`,
108
+ * ../../build.ts), surfaced in the graph command's error style. Returns false
109
+ * when a contributor failed or a name collided; the caller stops, matching
110
+ * how the discover-based paths treat discovery errors — a graph missing the
111
+ * entities the build would refuse over must not be emitted as if complete.
112
+ */
113
+ async function mergeGraphBuildRoots(entities, contributors) {
114
+ if (contributors.length === 0)
115
+ return true;
116
+ const merged = await mergeBuildRootEntities(entities, contributors);
117
+ for (const w of merged.warnings)
118
+ console.error(formatWarning({ message: w }));
119
+ if (merged.errors.length > 0) {
120
+ for (const message of merged.errors)
121
+ console.error(formatError({ message }));
122
+ return false;
123
+ }
124
+ return true;
125
+ }
126
+ /** #1675 — join git-root ops into a discovered entity map; op-discovery
127
+ * errors are warnings here (the lint gate never saw those files). */
128
+ async function mergeGraphOps(entities, sourceFiles, projectPath) {
129
+ const { errors } = await mergeProjectOps(entities, sourceFiles, projectPath);
130
+ for (const e of errors)
131
+ console.error(formatWarning({ message: e }));
132
+ }
133
+ /**
134
+ * `chant graph` — the Op dependency graph by default; `--stacks` renders the
135
+ * cross-stack apply-ordering graph (edges, order, waves) chant computes from
136
+ * cross-lexicon references; `--components` (#560) renders the same
137
+ * order/waves shape for discovered `Component` declarations, from their
138
+ * `dependsOn`; `--format ir|mermaid` emits the lint-gated entity-graph IR (or
139
+ * a Mermaid flowchart of it) for diagrams (#493/#496). `--components` with a
140
+ * `--format` projects the component DAG itself into that format (nodes =
141
+ * components, wave groups, `dependsOn` edges) — the graph behold renders.
142
+ */
143
+ /**
144
+ * One `chant graph` is one read of the account (chant #2498): the live
145
+ * observation and the `--traffic` prediction are two plugin methods that
146
+ * each read a live root, and inside this session a read one of them made
147
+ * is the read the other gets.
148
+ */
149
+ export function runGraph(ctx) {
150
+ return withLiveReadSession(() => runGraphCommand(ctx));
151
+ }
152
+ async function runGraphCommand(ctx) {
153
+ const viewFormats = ["ir", "mermaid", "dot", "layout"];
154
+ const isViewFormat = viewFormats.includes(ctx.args.format);
155
+ // `--projection <lexicon>` (#989) only means anything for the component
156
+ // graph's IR — it adds the CI/pipeline shape to `GraphIR.pipeline`, a field
157
+ // the other view formats' emitters (mermaid/dot/layout) don't read, and the
158
+ // plain (non-`--format`) `--components` text/`--json` modes don't build an
159
+ // IR at all. Reject every other combination up front rather than silently
160
+ // ignoring the flag.
161
+ if (ctx.args.projection && !(ctx.args.components && ctx.args.format === "ir")) {
162
+ console.error(formatError({
163
+ message: "--projection needs --components --format ir — the CI/pipeline projection extends the component-graph IR, the only mode that carries it.",
164
+ }));
165
+ return 1;
166
+ }
167
+ // `--at` graphs a recorded observation instead of reading the estate (#1279).
168
+ // Two different observations with no rule for which wins, so not both.
169
+ if (ctx.args.at && ctx.args.live) {
170
+ console.error(formatError({
171
+ message: "chant graph takes --live or --at, not both",
172
+ hint: "--live reads the estate now; --at graphs a recorded snapshot",
173
+ }));
174
+ return 1;
175
+ }
176
+ // `--live` graphs the provisioned (observed) infrastructure, not the declared
177
+ // source (epic #776). It only makes sense as a view format; default to `ir`.
178
+ if (ctx.args.live || ctx.args.at) {
179
+ return runGraphLive(ctx, isViewFormat ? ctx.args.format : "ir");
180
+ }
181
+ if (isViewFormat) {
182
+ // `--components` projects the component DAG (nodes = components, wave groups,
183
+ // dependsOn edges) into the same view formats; without it, the entity graph.
184
+ if (ctx.args.components) {
185
+ return runComponentGraphView(ctx, ctx.args.format);
186
+ }
187
+ return runGraphView(ctx, ctx.args.format);
188
+ }
189
+ if (ctx.args.components)
190
+ return runComponentGraph(ctx);
191
+ if (ctx.args.stacks)
192
+ return runStackGraph(ctx);
193
+ return runOpGraph();
194
+ }
195
+ /**
196
+ * `chant graph --live --env <name> [--format ir|mermaid|dot|layout]` — the
197
+ * **provisioned** graph (C1 of epic #776). Queries each lexicon's
198
+ * `describeResources()` for the environment (managed-only: `owned`) and projects
199
+ * the observed resources into IR nodes. Nodes only — edges are reconstructed by
200
+ * the reference resolver (#778), containment by #779. No lint gate: this reads
201
+ * the cloud, not source.
202
+ */
203
+ async function runGraphLive(ctx, format) {
204
+ const { args } = ctx;
205
+ const environment = args.env;
206
+ if (!environment) {
207
+ console.error(formatError({ message: "chant graph --live needs an environment: --live --env <name>" }));
208
+ return 1;
209
+ }
210
+ const projectPath = resolve(".");
211
+ const { config } = await loadChantConfig(projectPath);
212
+ // `graph` is not `requiresPlugins` (Op/source-graph modes must work without a
213
+ // lexicon), so `ctx.plugins` is empty. The live path needs the project's
214
+ // observation plugins — load them here, mirroring the lifecycle handlers.
215
+ const plugins = ctx.plugins.length > 0 ? ctx.plugins : await loadPlugins(await projectLexiconsOrNone(projectPath));
216
+ const declaredEnvNames = environmentNames(config.environments);
217
+ if (declaredEnvNames && !matchesDeclaredEnvironment(config.environments, environment)) {
218
+ console.error(formatError({
219
+ message: `Unknown environment "${environment}"`,
220
+ hint: `Defined environments: ${declaredEnvNames.join(", ")}`,
221
+ }));
222
+ return 1;
223
+ }
224
+ // Build to get each lexicon's entity names + output (the scope
225
+ // describeResources needs), mirroring `chant lifecycle snapshot`.
226
+ //
227
+ // With the same build params the source graph resolves (#1483). Without
228
+ // them this build ran on defaults while the declared overlay below ran on
229
+ // the caller's, so a project whose parameters choose *which resources
230
+ // exist* — a tier, a size, a profile — observed one estate and compared it
231
+ // against another. Every resource the real parameter declares read as
232
+ // absent and every resource the default declares read as pending, which is
233
+ // a confidently wrong overlay rather than an empty one.
234
+ const liveBuildParams = await graphBuildParams(ctx, projectPath);
235
+ if (!liveBuildParams)
236
+ return 1;
237
+ // #1626 — the same build-root contributors `chant build` runs (kustomize
238
+ // roots rendered into entities), so the scope handed to describeResources
239
+ // includes the rendered objects and the live read observes them like any
240
+ // declared entity. Without this the built estate carried them but the graph
241
+ // build here didn't, and the overlay called every one of them foreign.
242
+ const buildRoots = collectBuildRootContributors(plugins, config, projectPath);
243
+ const buildResult = await build(resolve(args.src ?? config.sourceDir ?? "."), plugins.map((p) => p.serializer), undefined, { buildParams: liveBuildParams, buildRoots });
244
+ if (buildResult.errors.length > 0) {
245
+ console.error(formatError({ message: "Build failed — fix errors before graphing live state" }));
246
+ return 1;
247
+ }
248
+ const observing = plugins.filter((p) => p.describeResources);
249
+ if (observing.length === 0) {
250
+ console.error(formatError({ message: "No lexicons implement describeResources — nothing to observe live." }));
251
+ return 1;
252
+ }
253
+ // Multi-stack, per-component projects (#57): AWS's single-stack convention
254
+ // (`describeResources` defaults to a stack named after the environment,
255
+ // lexicons/aws/src/plugin.ts) never matches a per-component layout (e.g.
256
+ // `loom-local-a-<component>`), so the plain single call always observes zero
257
+ // nodes. Resolve every discovered component's `cfn-deploy` stack(s) — the
258
+ // same walk `chant components status --live` uses (`cfnDeployStacks`,
259
+ // ./components.ts) — and hand them to `observeResources`, which queries
260
+ // `describeResources` once per stack and unions the results. A project with
261
+ // no components (or whose discovery errors) yields no stacks, so
262
+ // `observeResources` falls back to its original single-stack call —
263
+ // unchanged.
264
+ const componentsDiscovery = await discoverComponents(resolve(args.src ?? config.sourceDir ?? "."), {
265
+ sandbox: args.sandbox,
266
+ });
267
+ const stacks = [];
268
+ const seenStacks = new Set();
269
+ if (componentsDiscovery.errors.length === 0) {
270
+ for (const { component } of componentsDiscovery.components.values()) {
271
+ for (const stack of cfnDeployStacks(component.deploy)) {
272
+ if (!seenStacks.has(stack)) {
273
+ seenStacks.add(stack);
274
+ stacks.push({ name: stack });
275
+ }
276
+ }
277
+ }
278
+ }
279
+ else {
280
+ console.error(formatWarning({ message: "component discovery failed — observing the single-stack convention instead" }));
281
+ }
282
+ // ChantConfig.stacks (with optional per-stack region) — multi-region estates.
283
+ for (const declared of config.stacks ?? []) {
284
+ if (!seenStacks.has(declared.name)) {
285
+ seenStacks.add(declared.name);
286
+ stacks.push({ name: declared.name, region: declared.region, src: declared.src });
287
+ }
288
+ }
289
+ // #1166 — an environment can declare its own endpoint (a local emulator like
290
+ // Floci), so this read is self-sufficient even when the ambient shell never
291
+ // exported e.g. AWS_ENDPOINT_URL. Ambient always wins when it's already set.
292
+ // Scoped to just this describe/enrich pass — restored in `finally` so it
293
+ // never leaks into a later invocation in the same process.
294
+ const endpointResult = applyLiveEndpoint(config.environments, environment, observing);
295
+ if (endpointResult.notice)
296
+ console.error(formatWarning({ message: endpointResult.notice }));
297
+ let ir;
298
+ let observations;
299
+ // A replay is a graph of what was recorded, so it must not reach the provider
300
+ // at all — not for observation and not for enrichment. Anything that quietly
301
+ // called out would make `--at` a live read with an older label on it.
302
+ const replaying = !!args.at && !args.live;
303
+ try {
304
+ if (replaying) {
305
+ const scoped = new Set(stacks.filter((st) => st.src).map((st) => st.name));
306
+ const replay = await replaySnapshots(environment, String(args.at), scoped);
307
+ if ("error" in replay) {
308
+ console.error(formatError({ message: replay.error, ...(replay.hint ? { hint: replay.hint } : {}) }));
309
+ return 1;
310
+ }
311
+ observations = replay.observations;
312
+ console.error(formatWarning({
313
+ message: `graphing snapshot ${replay.commit.slice(0, 7)} taken ${replay.timestamp} — the estate was not read`,
314
+ }));
315
+ }
316
+ else {
317
+ const observeResult = await observeResources(environment, observing, buildResult, {
318
+ owned: true,
319
+ stacks: [...stacks],
320
+ // `--namespace <ns>` (#1629): where to read entities that declare no
321
+ // namespace. One project declaring the GitOps binding and another
322
+ // declaring the objects is the whole reason this is a per-read option
323
+ // and not config.
324
+ ...(args.namespace ? { namespace: args.namespace } : {}),
325
+ });
326
+ observations = observeResult.observations;
327
+ const { errors, warnings, notes = [] } = observeResult;
328
+ for (const e of errors)
329
+ console.error(formatWarning({ message: e }));
330
+ // Unobserved entities (#1089) arrive as warnings — a node missing from the
331
+ // live graph because nobody looked is a different fact from one that isn't
332
+ // deployed, and the diagram alone cannot say which. Capped: an estate with no
333
+ // ownership markers can produce one per declared entity, and a wall of them
334
+ // buries the graph output. The full list is `lifecycle diff --live`.
335
+ const WARN_CAP = 5;
336
+ for (const w of warnings.slice(0, WARN_CAP))
337
+ console.error(formatWarning({ message: w }));
338
+ if (warnings.length > WARN_CAP) {
339
+ console.error(formatWarning({
340
+ message: `... and ${warnings.length - WARN_CAP} more entity(ies) not observed — run \`chant lifecycle diff ${environment} --live\` for the full list`,
341
+ }));
342
+ }
343
+ // Run-level notes (#1265): one line each, outside the per-entity cap.
344
+ for (const n of notes)
345
+ console.error(formatWarning({ message: n }));
346
+ }
347
+ // Both paths land here: a replay rejoins the live pipeline at exactly this
348
+ // point, which is what makes every fold and overlay below shared.
349
+ ir = buildLiveGraphIr(observations);
350
+ // The estate was asked for and nothing came back. Say that once, and say
351
+ // that a recording exists — the per-entity warnings above describe the same
352
+ // failure N times without ever naming the thing that would answer. Agents
353
+ // denied the network read the empty graph as an empty estate and spent
354
+ // their turns retrying `--live`.
355
+ if (!replaying && ir.nodes.length === 0 && (await hasSnapshot(environment))) {
356
+ console.error(formatWarning({
357
+ message: `could not read the estate for "${environment}" — a snapshot of it is recorded; graph that instead with --at latest`,
358
+ }));
359
+ }
360
+ // Enrich node attrs from the fuller live config (#784) so references are
361
+ // present for edge reconstruction — describeResources metadata alone is often
362
+ // too thin (e.g. AWS returns stack outputs, not per-resource references).
363
+ // Live-only: enrichment is a provider call, so a replay must skip it.
364
+ for (const p of replaying ? [] : observing) {
365
+ if (!p.enrichLiveAttrs)
366
+ continue;
367
+ try {
368
+ const enriched = await p.enrichLiveAttrs({ environment, owned: true, stacks });
369
+ ir = {
370
+ ...ir,
371
+ nodes: ir.nodes.map((n) => n.lexicon === p.name && enriched[n.id] ? { ...n, attrs: { ...n.attrs, ...enriched[n.id] } } : n),
372
+ };
373
+ }
374
+ catch (err) {
375
+ console.error(formatWarning({ message: `${p.name}: live attr enrichment failed — edges may be sparse (${err instanceof Error ? err.message : String(err)})` }));
376
+ }
377
+ }
378
+ }
379
+ finally {
380
+ endpointResult.restore();
381
+ }
382
+ // Reconstruct edges + containment from live references (#778): merge the
383
+ // observing lexicons' reference catalogs and resolve them over the live nodes.
384
+ const catalogs = observing.map((p) => p.referenceCatalog).filter((c) => !!c);
385
+ let containment = [];
386
+ if (catalogs.length > 0) {
387
+ const reconstructed = reconstructEdges(ir.nodes, mergeCatalogs(catalogs));
388
+ ir = { ...ir, edges: reconstructed.edges };
389
+ containment = reconstructed.containment;
390
+ }
391
+ // Drift overlay: classify each resource against declared source (managed /
392
+ // foreign / pending) so a renderer colours the drift. Two anchorings:
393
+ // - source (default, #821): declared graph is the canvas — keeps its edges,
394
+ // so cross-substrate topology survives; live status joined per node.
395
+ // - live (#780): provisioned graph is the canvas — reconstructed live edges.
396
+ if (args.overlay) {
397
+ // Declared nodes chant could not read are painted `neutral`, not
398
+ // `accent`/pending (#1089) — a wrong-cluster or unsupported-kind read must
399
+ // not draw the estate as "not deployed yet".
400
+ const overlayOpts = { unobserved: collectUnobserved(observations) };
401
+ // Multi-stack (#1162): the live `ir` keys nodes by `${stack}::${logicalId}`,
402
+ // so the declared canvas must qualify identically — build each stack's src
403
+ // scoped rather than a flat whole-project discovery (whose disambiguated
404
+ // names never match the observed bare ids). Fall back to the flat build when
405
+ // no stack carries a `src`.
406
+ const scopedStacks = stacks.filter((s) => s.src);
407
+ if (scopedStacks.length > 0) {
408
+ const declaredIr = await buildDeclaredPerStack(scopedStacks, projectPath);
409
+ ir =
410
+ args.overlayAnchor === "live"
411
+ ? overlayGraphs(ir, declaredIr, overlayOpts)
412
+ : sourceOverlayGraphs(declaredIr, ir, overlayOpts);
413
+ }
414
+ else {
415
+ const declaredParams = await graphBuildParams(ctx, projectPath);
416
+ const declared = await discover(resolve(args.src ?? config.sourceDir ?? "."), {
417
+ ...(declaredParams ? { buildParams: declaredParams } : {}),
418
+ });
419
+ // #1626 — the declared canvas must include what the build declares, and
420
+ // that is discovery PLUS build-root contributions (rendered kustomize
421
+ // objects). Same contributors, same merge as the `build()` above — so
422
+ // the rendered nodes classify `good`/`accent` like typed ones instead
423
+ // of reading as foreign. A merge that fails here (it just succeeded in
424
+ // the build above, so only a non-deterministic render gets this far)
425
+ // degrades exactly like discovery errors: overlay skipped, said once.
426
+ if (declared.errors.length > 0) {
427
+ console.error(formatWarning({ message: "overlay: source has discovery errors — showing the provisioned graph without the declared overlay" }));
428
+ }
429
+ else if (!(await mergeGraphBuildRoots(declared.entities, buildRoots))) {
430
+ console.error(formatWarning({ message: "overlay: a build root failed to render — showing the provisioned graph without the declared overlay" }));
431
+ }
432
+ else {
433
+ await mergeGraphOps(declared.entities, declared.sourceFiles, projectPath);
434
+ const declaredIr = buildGraphIr(declared.entities, projectPath);
435
+ ir =
436
+ args.overlayAnchor === "live"
437
+ ? overlayGraphs(ir, declaredIr, overlayOpts)
438
+ : sourceOverlayGraphs(declaredIr, ir, overlayOpts);
439
+ }
440
+ }
441
+ }
442
+ // Behaviour overlay (#2377, epic #2355): carry a prediction on the graph.
443
+ // After the drift overlay so it lands on the final node set beside `_status`,
444
+ // and before the lens so a lens filters a predicted node like any other.
445
+ {
446
+ const raw = buildResult.outputs ? [...buildResult.outputs.values()][0] : undefined;
447
+ const predicted = await predictOntoIr(ir, plugins, args, {
448
+ environment: environment ?? "",
449
+ buildOutput: raw === undefined ? "" : typeof raw === "string" ? raw : raw.primary,
450
+ // This graph was read from the account, drift included.
451
+ from: "live",
452
+ });
453
+ if (predicted === REFUSED)
454
+ return 1;
455
+ ir = predicted;
456
+ }
457
+ if (args.lens) {
458
+ try {
459
+ ir = applyLens(ir, parseLens(args.lens, { up: args.up, down: args.down }));
460
+ }
461
+ catch (err) {
462
+ console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
463
+ return 1;
464
+ }
465
+ }
466
+ {
467
+ const base = ir;
468
+ ir = applyDetail(ir, (args.detail ?? 2));
469
+ // #1489 — a --detail 3 that changed nothing says so instead of silently
470
+ // emitting the same bytes as --detail 2.
471
+ if (args.detail === 3) {
472
+ const notice = detailInertNotice(base, ir);
473
+ if (notice)
474
+ console.error(formatWarning({ message: notice }));
475
+ }
476
+ }
477
+ // Containment grouping (#779) → boundary boxes. Built after lens/detail and
478
+ // filtered to surviving nodes, so a lens can't leave dangling group refs.
479
+ if (containment.length > 0) {
480
+ const present = new Set(ir.nodes.map((n) => n.id));
481
+ const byContainer = containmentGroups(containment.filter((c) => present.has(c.child) && present.has(c.parent)));
482
+ if (Object.keys(byContainer).length > 0) {
483
+ ir = { ...ir, groups: { ...ir.groups, byContainer } };
484
+ }
485
+ }
486
+ return emitIr(ir, ctx, format);
487
+ }
488
+ /**
489
+ * `chant graph --components` (#560) — dependency order/waves for discovered
490
+ * `Component` declarations, mirroring `runStackGraph`'s presentation
491
+ * (waves top-to-bottom, consumer → producer edges) but sourced from
492
+ * `computeComponentGraph` (../../components/cli-support.ts), which resolves
493
+ * order purely from each component's flat `dependsOn` list — no AttrRef-style
494
+ * cross-lexicon inference needed, since a component's dependency is always
495
+ * an explicit name.
496
+ */
497
+ async function runComponentGraph(ctx) {
498
+ const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
499
+ // #1490 — as in runComponentGraphView: the text/--json mode reads the same
500
+ // source and must not disagree with the --format modes about it.
501
+ const componentParams = await graphBuildParams(ctx, projectPath);
502
+ if (!componentParams)
503
+ return 1;
504
+ const graph = await computeComponentGraph(projectPath, ctx.args.sandbox, componentParams);
505
+ if (!graph.success) {
506
+ console.error(formatError({ message: graph.error ?? "Failed to compute component graph" }));
507
+ return 1;
508
+ }
509
+ if (ctx.args.json) {
510
+ console.log(JSON.stringify(graph, null, 2));
511
+ return 0;
512
+ }
513
+ if (graph.order.length === 0) {
514
+ console.log("No components found");
515
+ return 0;
516
+ }
517
+ console.log(formatBold("Deploy order (waves apply top-to-bottom; a wave's components are parallel-safe):"));
518
+ graph.waves.forEach((wave, i) => console.log(` ${i + 1}. ${wave.join(", ")}`));
519
+ if (graph.edges.length > 0) {
520
+ console.log(formatBold("\nDependencies (consumer → producer):"));
521
+ for (const { from, to } of graph.edges)
522
+ console.log(` ${from} → ${to}`);
523
+ }
524
+ else {
525
+ console.log("\nNo cross-component dependencies — all components are independent.");
526
+ }
527
+ return 0;
528
+ }
529
+ /**
530
+ * `chant graph --components --format ir|mermaid|dot|layout` — the component DAG
531
+ * projected into the renderable IR (nodes = components, `groups.byWave` = the
532
+ * parallel-safe deploy waves, edges = `dependsOn` consumer → producer). This is
533
+ * the graph behold paints: read one way it is the deploy order, read the other
534
+ * the CI pipeline. Distinct from `runGraphView`, which emits the AWS *entity*
535
+ * graph — the component projection has one node per component, not per resource.
536
+ *
537
+ * `--projection <lexicon>` (#989, `--format ir` only — validated in `runGraph`)
538
+ * adds the **CI/pipeline projection** alongside this component graph:
539
+ * `ir.pipeline` carries the stages/jobs/`needs` `<lexicon>`'s
540
+ * `generateComponentPipeline` synthesizes for `chant build --components
541
+ * --generate <lexicon>` (`generateComponentsPipeline`, ../../components/cli-support.ts)
542
+ * — reused wholesale, not re-derived, so a consumer (e.g. behold, epic #492/
543
+ * INTENTIUS/behold#54) gets the pipeline shape as first-class IR nodes/edges
544
+ * instead of re-deriving it from `dependsOn` or parsing generated CI YAML.
545
+ *
546
+ * Lint-gated like the entity view: the DAG stands for deployable source, so we
547
+ * refuse to emit it for source that does not pass lint.
548
+ */
549
+ async function runComponentGraphView(ctx, format) {
550
+ const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
551
+ // #1490 — resolved BEFORE the lint gate, not after. The COMP* checks import
552
+ // every `*.component.ts`, an ES module evaluates once per path, and the
553
+ // values in effect at that first import are the ones the graph below will
554
+ // read no matter what it resolves for itself. Ordering is the fix; passing
555
+ // them to `computeComponentGraph` alone did nothing.
556
+ const componentParams = await graphBuildParams(ctx, projectPath);
557
+ if (!componentParams)
558
+ return 1;
559
+ const lint = await lintCommand({
560
+ path: ctx.args.path,
561
+ format: "stylish",
562
+ sandbox: ctx.args.sandbox,
563
+ buildParams: componentParams,
564
+ });
565
+ if (!lint.success) {
566
+ console.error(formatError({
567
+ message: "Refusing to emit graph: source has lint errors. Run `chant lint` and fix them first.",
568
+ }));
569
+ return 1;
570
+ }
571
+ const graph = await computeComponentGraph(projectPath, ctx.args.sandbox, componentParams);
572
+ if (!graph.success) {
573
+ console.error(formatError({ message: graph.error ?? "Failed to compute component graph" }));
574
+ return 1;
575
+ }
576
+ // One node per component; wave index carried on the node so a renderer that
577
+ // ignores groups can still lane by it. `dependsOn` is a plain name edge —
578
+ // `kind: "ref"` matches the entity graph's edge vocabulary the emitters read.
579
+ const waveOf = new Map();
580
+ graph.waves.forEach((wave, i) => wave.forEach((name) => waveOf.set(name, i + 1)));
581
+ let ir = {
582
+ nodes: graph.order.map((name) => ({
583
+ id: name,
584
+ kind: "Component",
585
+ lexicon: "chant",
586
+ // `liveNames` (#1491): the resources this component owns — declared, or
587
+ // the contract's `[name]` identity fallback — so a consumer can join
588
+ // the component DAG to the resource graph instead of guessing at kinds.
589
+ // `composites` (#1492): the composite kind(s) this component's
590
+ // resources come from, when the component declared them explicitly —
591
+ // omitted from attrs (not defaulted) when it didn't, so a consumer
592
+ // knows to fall back to its own naming-convention guess rather than
593
+ // reading "no composites" from an empty array.
594
+ attrs: {
595
+ wave: waveOf.get(name) ?? null,
596
+ liveNames: graph.liveNames?.[name] ?? [name],
597
+ ...(graph.composites?.[name] ? { composites: graph.composites[name] } : {}),
598
+ // The archetype (#2662), declared or inferred, so a reader such as
599
+ // `chant workspace graph --composites` labels a component without
600
+ // importing its source.
601
+ ...(graph.archetypes?.[name] ? { archetype: graph.archetypes[name] } : {}),
602
+ // The environments the component declares (#3153), where each release goes, so
603
+ // `chant workspace graph --composites` lists them without importing its source.
604
+ ...(graph.environments?.[name] ? { environments: graph.environments[name] } : {}),
605
+ },
606
+ // Deep-link the node to its `*.component.ts` (behold's inspect panel).
607
+ ...(graph.files?.[name] ? { sourceLoc: { file: graph.files[name] } } : {}),
608
+ })),
609
+ edges: graph.edges.map(({ from, to }) => ({ from, to, kind: "ref" })),
610
+ groups: {
611
+ byWave: Object.fromEntries(graph.waves.map((wave, i) => [`wave-${i + 1}`, [...wave]])),
612
+ },
613
+ };
614
+ if (ctx.args.projection) {
615
+ const pipeline = await buildPipelineProjection(projectPath, ctx.args.projection, ctx.args.sandbox);
616
+ if (!pipeline.success) {
617
+ console.error(formatError({ message: pipeline.error ?? `Failed to generate ${ctx.args.projection} pipeline projection` }));
618
+ return 1;
619
+ }
620
+ ir = { ...ir, pipeline: pipeline.pipeline };
621
+ }
622
+ return emitIr(ir, ctx, format);
623
+ }
624
+ /**
625
+ * Reshape `generateComponentsPipeline`'s result (../../components/cli-support.ts
626
+ * — the exact function `chant build --components --generate <lexicon>` calls)
627
+ * into the IR's `IRPipeline` vocabulary (#989): one `IRPipelineNode` per
628
+ * generated CI job, one `IRPipelineEdge` per `needs:` dependency (consumer job
629
+ * → producer job, mirroring the component edges' consumer → producer
630
+ * direction). Every shape decision — job naming, one stage per wave,
631
+ * dependency resolution — stays owned by `lexicon`'s `generateComponentPipeline`;
632
+ * this only relabels its `{ stages, jobs }` output as IR nodes/edges, it never
633
+ * re-derives the graph.
634
+ */
635
+ async function buildPipelineProjection(projectPath, lexicon, sandbox) {
636
+ const result = await generateComponentsPipeline(projectPath, lexicon, undefined, sandbox);
637
+ if (!result.success)
638
+ return { success: false, error: result.error };
639
+ const jobs = result.jobs ?? [];
640
+ return {
641
+ success: true,
642
+ pipeline: {
643
+ provider: lexicon,
644
+ // The environment the projected pipeline deploys (#2046) — the
645
+ // generator's own resolution, carried rather than re-derived.
646
+ ...(result.env ? { env: result.env } : {}),
647
+ stages: result.stages ?? [],
648
+ nodes: jobs.map((j) => ({ id: j.jobName, kind: "CIJob", component: j.component, stage: j.stage })),
649
+ edges: jobs.flatMap((j) => j.needs.map((dep) => ({ from: j.jobName, to: dep, kind: "needs" }))),
650
+ },
651
+ };
652
+ }
653
+ /**
654
+ * `chant graph --format ir|mermaid|dot|layout` — build the graph IR (honouring
655
+ * `--detail`) and emit it as JSON, a Mermaid flowchart, Graphviz DOT, or node
656
+ * positions from a layout engine. `layout` takes optional painter-measured
657
+ * `--node-sizes` so spacing fits real node footprints, and defaults to the dagre
658
+ * engine (no native dependency); `--layout-engine graphviz` opts into `dot`.
659
+ * Lint-gated: the IR represents valid infra, so we refuse to emit for source that
660
+ * does not pass lint. Non-zero on discovery errors or a layout-engine failure.
661
+ */
662
+ /**
663
+ * Add what the lexicons' `graphMeta` hooks report to `ir.meta` (#2559). A
664
+ * lexicon with nothing to report leaves the IR as it was, so a project that
665
+ * declares none of their entities prints what it did before. Two lexicons
666
+ * that answer the same key keep the first and say so on stderr.
667
+ */
668
+ function withGraphMeta(ir, plugins, entities) {
669
+ const added = {};
670
+ for (const p of plugins) {
671
+ if (!p.graphMeta)
672
+ continue;
673
+ for (const [key, value] of Object.entries(p.graphMeta(entities) ?? {})) {
674
+ if (key in added || (ir.meta && key in ir.meta)) {
675
+ console.error(formatWarning({ message: `the ${p.name} lexicon reports graph meta "${key}", which another source already set; its value is dropped` }));
676
+ continue;
677
+ }
678
+ added[key] = value;
679
+ }
680
+ }
681
+ return Object.keys(added).length === 0 ? ir : { ...ir, meta: { ...(ir.meta ?? {}), ...added } };
682
+ }
683
+ /** Returned instead of a graph when the prediction cannot be attempted honestly. */
684
+ const REFUSED = Symbol("behaviour-refused");
685
+ /**
686
+ * Carry a prediction on `ir`, if one was asked for (#2377, epic #2355).
687
+ *
688
+ * Shared by both graph paths, because the epic wants both: "the live path
689
+ * predicts the account as it stands, drift included. The declared path
690
+ * predicts the file. The two are shown as a delta" (#2355). A delta between
691
+ * two shapes that reached the engine by different routes is the worst possible
692
+ * input to a delta, so there is one route.
693
+ *
694
+ * `--traffic` is the trigger, and it is the trigger rather than the engine
695
+ * variable because the contract forbids defaulting the level
696
+ * (../../behaviour.ts): every figure an engine returns is *at* a stated
697
+ * traffic, so inventing one would silently decide what every number on the
698
+ * graph means. Without the flag nothing is asked, neither key appears, and a
699
+ * consumer reads that absence as "not looked" rather than as a refusal.
700
+ */
701
+ async function predictOntoIr(ir, plugins, args, ctx) {
702
+ if (!args.traffic)
703
+ return ir;
704
+ const predicting = plugins.filter((p) => p.predictBehaviour);
705
+ if (predicting.length === 0) {
706
+ console.error(formatWarning({
707
+ message: "--traffic: no installed lexicon implements predictBehaviour, so nothing was predicted. The graph is unchanged.",
708
+ }));
709
+ return ir;
710
+ }
711
+ if (predicting.length > 1) {
712
+ // Two engines would mean two `meta._behaviour` values and one key. Rather
713
+ // than pick, say so: a merged prediction across engines is not defined by
714
+ // the contract, and silently taking the first would attribute one engine's
715
+ // figures to the other's provenance.
716
+ console.error(formatError({
717
+ message: `--traffic: ${predicting.length} lexicons implement predictBehaviour (${predicting.map((p) => p.name).join(", ")}) — chant cannot merge two engines' figures onto one graph.`,
718
+ hint: "Predict one lexicon at a time, or drop --traffic to graph without a prediction",
719
+ }));
720
+ return REFUSED;
721
+ }
722
+ const request = behaviourRequestFromIr(ir, {
723
+ environment: ctx.environment,
724
+ traffic: args.traffic,
725
+ buildOutput: ctx.buildOutput,
726
+ from: ctx.from,
727
+ // `unknown`, for the reason the declared path claims it
728
+ // (../../op/activities/predict-behaviour.ts): reference edges resolved,
729
+ // containment absent, and no vocabulary here for "this kind is a boundary
730
+ // whose containment is missing". Claiming `complete` would be true about
731
+ // references and false about the graph; `partial` has to name its gap as
732
+ // `dangling` or `unresolvedKinds`, and this gap is neither.
733
+ edgeCoverage: { verdict: "unknown" },
734
+ ...(args.owned === undefined ? {} : { owned: args.owned }),
735
+ });
736
+ try {
737
+ // A refusal is a value, not a throw: it comes back as a result and rides on
738
+ // `meta._behaviour` whole, which is the one shape behold's reader branches
739
+ // on (../../behaviour-overlay.ts).
740
+ return applyBehaviourOverlay(ir, behaviourOverlay(await predicting[0].predictBehaviour(request)));
741
+ }
742
+ catch (err) {
743
+ // The estate graph is the thing asked for; a broken engine must not take it
744
+ // away. Say what failed and serve the graph without the block.
745
+ console.error(formatWarning({
746
+ message: `--traffic: ${predicting[0].name}'s predictBehaviour failed (${err instanceof Error ? err.message : String(err)}) — showing the graph without a prediction`,
747
+ }));
748
+ return ir;
749
+ }
750
+ }
751
+ async function runGraphView(ctx, format) {
752
+ const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
753
+ const level = ctx.args.detail ?? 2;
754
+ if (![0, 1, 2, 3].includes(level)) {
755
+ console.error(formatError({ message: `Invalid --detail ${level}. Expected 0, 1, 2, or 3.` }));
756
+ return 1;
757
+ }
758
+ // Resolved before the gate for the reason in runComponentGraphView: the
759
+ // lint pass imports project source, and the first import of a module is the
760
+ // one that binds its parameter-derived values (#1490).
761
+ const buildParams = await graphBuildParams(ctx, projectPath);
762
+ if (!buildParams)
763
+ return 1;
764
+ // Gate: only emit for lint-clean source.
765
+ const lint = await lintCommand({
766
+ path: ctx.args.path,
767
+ format: "stylish",
768
+ sandbox: ctx.args.sandbox,
769
+ buildParams,
770
+ });
771
+ if (!lint.success) {
772
+ console.error(formatError({
773
+ message: "Refusing to emit graph: source has lint errors. Run `chant lint` and fix them first.",
774
+ }));
775
+ return 1;
776
+ }
777
+ const result = await discover(projectPath, { buildParams });
778
+ if (result.errors.length > 0) {
779
+ for (const e of result.errors)
780
+ console.error(formatError({ message: e.message }));
781
+ return 1;
782
+ }
783
+ // #1626 — join the build-root contributions (rendered kustomize objects) to
784
+ // the discovered set, the way `build()` does before partitioning, so the
785
+ // static graph shows the same estate the build emits. Fatal on failure,
786
+ // like discovery errors: this graph stands for what would build.
787
+ if (!(await mergeGraphBuildRoots(result.entities, await graphBuildRootContributors(ctx, projectPath)))) {
788
+ return 1;
789
+ }
790
+ // #1675 — ops live outside sourceDir by convention; join the ones
791
+ // `discoverOps` finds from the git root so the IR carries the declared DAG.
792
+ await mergeGraphOps(result.entities, result.sourceFiles, projectPath);
793
+ // Build the base IR, focus with a lens (declarable-level, most precise), then
794
+ // apply the detail tier — so e.g. blast:<resource> works before any collapse.
795
+ let ir = buildGraphIr(result.entities, projectPath);
796
+ // The declared half of the epic's delta (#2355): this path predicts the
797
+ // file, the live path predicts the account. Same helper, so the two shapes
798
+ // reach the engine by one route and stay comparable.
799
+ {
800
+ const plugins = ctx.plugins.length > 0
801
+ ? ctx.plugins
802
+ : await loadPlugins(await projectLexiconsOrNone(projectPath));
803
+ const predicted = await predictOntoIr(ir, plugins, ctx.args, {
804
+ // No environment on the declared path: the file is not deployed anywhere
805
+ // yet, and naming one would claim it was.
806
+ environment: ctx.args.env ?? "",
807
+ buildOutput: "",
808
+ // And this graph was built from the file, so say so. Without it a
809
+ // lexicon cannot tell the two paths apart and answers about whichever
810
+ // estate it defaults to, with nothing in the report to say which.
811
+ from: "declared",
812
+ });
813
+ if (predicted === REFUSED)
814
+ return 1;
815
+ ir = predicted;
816
+ ir = withGraphMeta(ir, plugins, result.entities);
817
+ }
818
+ if (ctx.args.lens) {
819
+ try {
820
+ ir = applyLens(ir, parseLens(ctx.args.lens, { up: ctx.args.up, down: ctx.args.down }));
821
+ }
822
+ catch (err) {
823
+ console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
824
+ return 1;
825
+ }
826
+ }
827
+ {
828
+ const base = ir;
829
+ ir = applyDetail(ir, level);
830
+ // #1489 — same say-so as the live path: an inert --detail 3 names itself.
831
+ if (level === 3) {
832
+ const notice = detailInertNotice(base, ir);
833
+ if (notice)
834
+ console.error(formatWarning({ message: notice }));
835
+ }
836
+ }
837
+ return emitIr(ir, ctx, format);
838
+ }
839
+ /** Emit a built IR in the requested view format — shared by the source
840
+ * (`runGraphView`) and live (`runGraphLive`) paths. */
841
+ async function emitIr(ir, ctx, format) {
842
+ switch (format) {
843
+ case "mermaid":
844
+ console.log(toMermaid(ir));
845
+ return 0;
846
+ case "dot":
847
+ console.log(toDot(ir));
848
+ return 0;
849
+ case "layout":
850
+ try {
851
+ const sizes = readNodeSizes(ctx.args.nodeSizes);
852
+ const engine = getLayoutEngine(ctx.args.layoutEngine);
853
+ const layout = await engine.layout(toLayoutInput(ir, sizes));
854
+ console.log(JSON.stringify(layout, null, 2));
855
+ return 0;
856
+ }
857
+ catch (err) {
858
+ console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
859
+ return 1;
860
+ }
861
+ case "ir":
862
+ default:
863
+ // The version leads the document (#2529), so a reader sees it before
864
+ // anything it might not understand.
865
+ console.log(JSON.stringify({ version: GRAPH_IR_VERSION, ...ir }, null, 2));
866
+ return 0;
867
+ }
868
+ }
869
+ /**
870
+ * Resolve the `--node-sizes` value into a `{ id: {w, h} }` map. The spec is one
871
+ * of: inline JSON, `-` (read JSON from stdin, to dodge arg-length limits), or
872
+ * `@path` (read from a file). Empty/absent → no sizes (engine uses defaults).
873
+ * Throws on malformed JSON so a typo fails loudly rather than mis-laying out.
874
+ */
875
+ function readNodeSizes(spec) {
876
+ if (!spec)
877
+ return {};
878
+ let raw;
879
+ if (spec === "-")
880
+ raw = readFileSync(0, "utf8");
881
+ else if (spec.startsWith("@"))
882
+ raw = readFileSync(spec.slice(1), "utf8");
883
+ else
884
+ raw = spec;
885
+ raw = raw.trim();
886
+ if (!raw)
887
+ return {};
888
+ let parsed;
889
+ try {
890
+ parsed = JSON.parse(raw);
891
+ }
892
+ catch (err) {
893
+ throw new Error(`--node-sizes is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
894
+ }
895
+ if (typeof parsed !== "object" || parsed === null) {
896
+ throw new Error("--node-sizes must be a JSON object mapping node id → {w, h}");
897
+ }
898
+ const out = {};
899
+ for (const [id, val] of Object.entries(parsed)) {
900
+ const v = val;
901
+ if (typeof v?.w === "number" && typeof v?.h === "number" && v.w > 0 && v.h > 0) {
902
+ out[id] = { w: v.w, h: v.h };
903
+ }
904
+ }
905
+ return out;
906
+ }
907
+ async function runOpGraph() {
908
+ const { ops, errors } = await discoverOps();
909
+ for (const err of errors)
910
+ console.error(formatError({ message: err }));
911
+ if (ops.size === 0) {
912
+ console.log("No Ops found");
913
+ return 0;
914
+ }
915
+ let hasEdges = false;
916
+ for (const [name, { config }] of ops) {
917
+ for (const dep of config.depends ?? []) {
918
+ console.log(`${dep} → ${name}`);
919
+ hasEdges = true;
920
+ }
921
+ }
922
+ if (!hasEdges)
923
+ console.log("No Op dependencies");
924
+ return 0;
925
+ }
926
+ async function runStackGraph(ctx) {
927
+ const projectPath = resolve(ctx.args.path === "." ? "." : ctx.args.path);
928
+ const buildParams = await graphBuildParams(ctx, projectPath);
929
+ if (!buildParams)
930
+ return 1;
931
+ const result = await discover(projectPath, { buildParams });
932
+ if (result.errors.length > 0) {
933
+ for (const e of result.errors)
934
+ console.error(formatError({ message: e.message }));
935
+ return 1;
936
+ }
937
+ // #1626 — same join as runGraphView: contributed entities are part of the
938
+ // built estate, so they belong in its stack partitions too.
939
+ if (!(await mergeGraphBuildRoots(result.entities, await graphBuildRootContributors(ctx, projectPath)))) {
940
+ return 1;
941
+ }
942
+ const lexicons = [...partitionByLexicon(result.entities).keys()];
943
+ const graph = computeStackGraph(result.entities, lexicons);
944
+ if (ctx.args.json) {
945
+ console.log(JSON.stringify(graph, null, 2));
946
+ return graph.cycles.length > 0 ? 1 : 0;
947
+ }
948
+ if (graph.nodes.length === 0) {
949
+ console.log("No stacks found");
950
+ return 0;
951
+ }
952
+ console.log(formatBold("Apply order (waves apply top-to-bottom; a wave's stacks are parallel-safe):"));
953
+ graph.waves.forEach((wave, i) => console.log(` ${i + 1}. ${wave.join(", ")}`));
954
+ if (graph.edges.length > 0) {
955
+ console.log(formatBold("\nDependencies (consumer → producer):"));
956
+ for (const { from, to } of graph.edges)
957
+ console.log(` ${from} → ${to}`);
958
+ }
959
+ else {
960
+ console.log("\nNo cross-stack dependencies — all stacks are independent.");
961
+ }
962
+ if (graph.cycles.length > 0) {
963
+ for (const cycle of graph.cycles) {
964
+ console.error(formatWarning({ message: `Dependency cycle among stacks: ${cycle.join(" ↔ ")}` }));
965
+ }
966
+ return 1;
967
+ }
968
+ return 0;
969
+ }