@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,948 @@
1
+ import { resolve, relative, dirname } from "path";
2
+ import { readFileSync, writeFileSync, readdirSync } from "fs";
3
+ import { runLint, parseDisableComments } from "../../lint/engine.js";
4
+ import { loadPlugin, loadPlugins, resolveProjectLexicons } from "../plugins.js";
5
+ import { findInfraFiles, detectLexicons } from "../../index.js";
6
+ import { formatStylish, formatJson, formatSarif } from "../reporters/stylish.js";
7
+ import { loadLocalRules } from "../../lint/rule-loader.js";
8
+ import { loadCoreRules } from "../../lint/rules/index.js";
9
+ import { loadComponentChecks } from "../../lint/rules/comp/index.js";
10
+ import { runComponentChecks } from "../../lint/component-checks.js";
11
+ import { buildCapabilityRegistry } from "../../components/capability-plugin-loader.js";
12
+ import { coreOpChecks } from "../../lint/rules/op/index.js";
13
+ import { loadActivityContracts } from "../../op/activity-contract-registry.js";
14
+ import { runPostSynthChecks } from "../../lint/post-synth.js";
15
+ import { rule } from "../../lint/declarative.js";
16
+ import { watchDirectory, formatTimestamp, formatChangedFiles } from "../watch.js";
17
+ import { formatError, formatInfo } from "../format.js";
18
+ import { hasDiscoveryMarkerSync, isSourceFileName } from "../../discovery/files.js";
19
+ import { walkDiscovery, workspaceMemberDirs } from "../../discovery/walk.js";
20
+ import { buildParamValues, resolveBuildParams } from "../../build-params.js";
21
+ import { setBuildParams } from "../../params.js";
22
+ import { isNoLexiconDetected } from "../../detectLexicon.js";
23
+ import { build } from "../../build.js";
24
+ import { loadChantConfigUpward, resolveOwnershipEnv, resolveOwnershipMarker } from "../../config.js";
25
+ import { resolveBuildModes, resolveProjectBuildOptions } from "../build-options.js";
26
+ import { resolveTelemetryAttribution } from "../../telemetry-attribution.js";
27
+ import { applyConfiguredPreset, applyConfiguredSeverity, resolvePresetIds } from "../../lint/config.js";
28
+ import { applyInlineSuppressions } from "../../lint/suppressions.js";
29
+ import { getProvenance } from "../../provenance.js";
30
+ import { runLexiconPostSynthChecks } from "./build.js";
31
+ import { armSandboxPolicyExecution, runProjectPolicies } from "../../lint/policy-sandbox.js";
32
+ import { ensureTypeScriptLoader } from "../../ts-loader.js";
33
+ // Import config loader
34
+ import { loadConfig, resolveRulesForFile, resolveConfiguredSeverity, findProjectRoot } from "../../lint/config.js";
35
+ import { loadChantConfig, resolveKnowledgeDir, resolveDiscoveryGlobs } from "../../config.js";
36
+ import { findProjectConfig } from "../../project-root.js";
37
+ import { loadOkfBundle } from "../../okf-read.js";
38
+ /**
39
+ * Type guard to check if a value conforms to the LintRule interface.
40
+ */
41
+ export function isLintRule(value) {
42
+ return (typeof value === "object" &&
43
+ value !== null &&
44
+ "id" in value &&
45
+ typeof value.id === "string" &&
46
+ "severity" in value &&
47
+ "category" in value &&
48
+ "check" in value &&
49
+ typeof value.check === "function");
50
+ }
51
+ /**
52
+ * Load custom lint rules from plugin files.
53
+ * Each plugin file is dynamically imported and all exports conforming to LintRule are collected.
54
+ *
55
+ * chant #1051 — this (and `loadLocalRules`, `../../lint/rule-loader.ts`, for
56
+ * `.chant/rules/*.ts`) is unconditional project-source `import()` with no
57
+ * `--sandbox` equivalent, the same class of gap #1051 closes for
58
+ * `discoverComponents`. Deliberately NOT sandboxed here, and not a "decide by
59
+ * omission": a `LintRule` is not a one-shot data producer like `Component`/
60
+ * `Declarable` — its `check(context)` is a function the rule engine invokes
61
+ * inline, once per linted file, for the whole `chant lint` run. There is no
62
+ * cheap "collect once, JSON-serialize the result, hand it back" shape the way
63
+ * there is for a `Component` (plain JSON) or an entity (a wire codec) —
64
+ * `check` has to keep running as live JS in whichever process calls it. A
65
+ * shallow fix that sandboxed only the *import* step (mirroring
66
+ * `discoverComponents`) would give a false sense of safety: it would close
67
+ * off "malicious top-level module code" but leave `check()`'s own executable
68
+ * body — the dominant part of a rule's attack surface, since it runs for
69
+ * every file, every lint invocation — entirely unsandboxed regardless. A real
70
+ * fix needs either the AST/`ts.SourceFile` itself to cross the sandbox
71
+ * boundary or the whole custom-rule evaluation to run inside the child; both
72
+ * are materially harder, separate design problems from this issue's `Component`
73
+ * fix and are tracked separately (chant #1052).
74
+ */
75
+ export async function loadPluginRules(plugins, configDir) {
76
+ const pluginRules = new Map();
77
+ for (const pluginPath of plugins) {
78
+ const resolved = resolve(configDir, pluginPath);
79
+ let mod;
80
+ try {
81
+ ensureTypeScriptLoader();
82
+ mod = await import(resolved);
83
+ }
84
+ catch (err) {
85
+ throw new Error(`Failed to load plugin "${pluginPath}": ${err instanceof Error ? err.message : String(err)}`);
86
+ }
87
+ for (const value of Object.values(mod)) {
88
+ if (isLintRule(value)) {
89
+ pluginRules.set(value.id, value);
90
+ }
91
+ }
92
+ }
93
+ return pluginRules;
94
+ }
95
+ /**
96
+ * The diagnostic id `chant lint` reports a lexicon it could not resolve under
97
+ * (chant #2222).
98
+ *
99
+ * Deliberately outside the COR/EVL/COMP/OPS families: those are *rules*, each
100
+ * with a `check()` the engine runs per file, a documented page, a configurable
101
+ * severity and a `chant-disable` escape hatch. This is none of those. It is
102
+ * the lint run reporting that it could not assemble the rule set the project
103
+ * asked for, so it is not silenceable through `rules: { ... : "off" }` or a
104
+ * disable comment. Silencing it would put back the exact "green on a broken
105
+ * project" this id exists to prevent.
106
+ */
107
+ export const LEXICON_RESOLUTION_RULE_ID = "LEX001";
108
+ /**
109
+ * Turn a lexicon-resolution failure into the error diagnostic `chant lint`
110
+ * reports it as. The message is the underlying error's own, unwrapped, so it
111
+ * is character-for-character what `chant build` prints after `error: ` for the
112
+ * same project (`loadPluginsOrExit`, ../main.ts): one failure, one wording.
113
+ *
114
+ * Attributed to the project's `chant.config.*` where there is one, since that
115
+ * is the file that names the lexicon; to the project root otherwise.
116
+ */
117
+ function lexiconResolutionDiagnostic(projectRoot, error) {
118
+ return {
119
+ file: findProjectConfig(projectRoot).configPath ?? projectRoot,
120
+ line: 1,
121
+ column: 1,
122
+ ruleId: LEXICON_RESOLUTION_RULE_ID,
123
+ severity: "error",
124
+ message: error.message,
125
+ };
126
+ }
127
+ /**
128
+ * The diagnostic id `chant lint` reports a lint target that does not build
129
+ * under (chant #3750). The lexicons' post-synth checks read a build result, so
130
+ * when the build fails they cannot run; this says so instead of letting the
131
+ * lint pass in silence. Like {@link LEXICON_RESOLUTION_RULE_ID} it is not a
132
+ * rule: it has no severity setting and no disable form. The message is the
133
+ * build's own.
134
+ */
135
+ export const BUILD_FAILURE_RULE_ID = "LEX002";
136
+ /**
137
+ * The plugins of lexicons that the project's source imports from and that are not in `configured`, for their
138
+ * property-kind class names (#3184). A package that is not installed, or that fails to load, is skipped.
139
+ */
140
+ async function loadImportedPropertyPlugins(projectPath, configured) {
141
+ let imported;
142
+ try {
143
+ imported = await detectLexicons(await findInfraFiles(projectPath));
144
+ }
145
+ catch {
146
+ return [];
147
+ }
148
+ const plugins = [];
149
+ for (const name of imported) {
150
+ if (configured.includes(name))
151
+ continue;
152
+ try {
153
+ plugins.push(await loadPlugin(name));
154
+ }
155
+ catch {
156
+ // Not installed here; the import is the build's problem to report, not lint's.
157
+ }
158
+ }
159
+ return plugins;
160
+ }
161
+ /**
162
+ * Load all lint rules: core COR/EVL rules, then lexicon plugin rules.
163
+ *
164
+ * Also returns the active lexicons' registered intrinsics (chant #1106) —
165
+ * gathered here because this is where the project's lexicon plugins are
166
+ * already resolved and loaded (`loadPlugins`), the same set `../commands/
167
+ * build.ts` reads `plugin.intrinsics?.()` off of for the fold path. Handed
168
+ * back alongside `rules` so `lintCommand` can thread it into every
169
+ * `runLint` call without loading plugins a second time.
170
+ */
171
+ async function loadAllPluginRules(projectPath) {
172
+ const rules = new Map();
173
+ // Load core COR/EVL rules directly
174
+ for (const r of loadCoreRules()) {
175
+ rules.set(r.id, r);
176
+ }
177
+ // Resolve project lexicons (e.g. ["aws"]) from config or detection, then
178
+ // load their plugins.
179
+ //
180
+ // chant #2222: a failure in either step is handed back to `lintCommand`
181
+ // (which reports it as {@link LEXICON_RESOLUTION_RULE_ID}) rather than
182
+ // swallowed or thrown. Both steps fail on the same project state: a
183
+ // `chant.config.ts` that names a lexicon whose package is not installed
184
+ // throws out of `loadPlugins`, and one that *imports* that package throws
185
+ // out of `resolveProjectLexicons` before the names are ever read. Before
186
+ // this, the first case crashed `chant lint` with a stack trace and the
187
+ // second was caught here and discarded, so `chant lint` printed "No
188
+ // problems found" and exited 0 on a project `chant build` refuses to
189
+ // build. A CI job that lints before it builds reported green on a project
190
+ // whose lexicon was missing.
191
+ //
192
+ // The one failure that stays quiet is the one the original `catch` was
193
+ // written for and named in its comment: a project that declares no
194
+ // `lexicons` and imports none from its source files, where the detection
195
+ // fallback throws `NO_LEXICON_DETECTED_MESSAGE`. That project lints under
196
+ // the core rules alone and always has. It is told apart by the exported
197
+ // sentinel rather than by a string literal copied to this file, so the two
198
+ // cannot drift apart.
199
+ let lexiconNames = [];
200
+ let lexiconError;
201
+ try {
202
+ lexiconNames = await resolveProjectLexicons(projectPath);
203
+ }
204
+ catch (err) {
205
+ if (!isNoLexiconDetected(err)) {
206
+ lexiconError = err instanceof Error ? err : new Error(String(err));
207
+ }
208
+ }
209
+ // Load only project lexicon plugins (no "chant" injection)
210
+ let plugins = [];
211
+ if (!lexiconError) {
212
+ try {
213
+ plugins = await loadPlugins(lexiconNames);
214
+ }
215
+ catch (err) {
216
+ lexiconError = err instanceof Error ? err : new Error(String(err));
217
+ }
218
+ }
219
+ // chant #1106 — the same plugins' registered intrinsics (`Ref`, `GetAtt`,
220
+ // ...), so EVL001 can answer "does this call fold?" exactly like fold()
221
+ // does instead of flagging every call as a violation. A plugin's
222
+ // `intrinsics` is an optional extension (not every lexicon defines any),
223
+ // hence the guard.
224
+ const intrinsics = plugins.flatMap((plugin) => plugin.intrinsics?.() ?? []);
225
+ // chant #2957 — the class names these plugins declare property-kind, so
226
+ // COR001, COR004 and COR009 leave out declarables that live inside a
227
+ // resource (a Grafana panel inside its dashboard) instead of treating
228
+ // them as resources.
229
+ const propertyClasses = new Set(plugins.flatMap((plugin) => plugin.propertyClassNames?.() ?? []));
230
+ // chant #3184: a lexicon the source imports from but the config does not list (grafana in a k8s project that
231
+ // holds a dashboard ConfigMap, after `chant import`) still declares which of its classes are property-kind. Only
232
+ // those names are taken from it; its rules and intrinsics stay out, since the project did not ask for them.
233
+ if (!lexiconError) {
234
+ for (const plugin of await loadImportedPropertyPlugins(projectPath, lexiconNames)) {
235
+ for (const name of plugin.propertyClassNames?.() ?? [])
236
+ propertyClasses.add(name);
237
+ }
238
+ }
239
+ for (const plugin of plugins) {
240
+ if (plugin.lintRules) {
241
+ for (const r of plugin.lintRules()) {
242
+ rules.set(r.id, r);
243
+ }
244
+ }
245
+ // Compile declarative rules from plugins
246
+ if (plugin.declarativeRules) {
247
+ for (const spec of plugin.declarativeRules()) {
248
+ const compiled = rule(spec);
249
+ rules.set(compiled.id, compiled);
250
+ }
251
+ }
252
+ }
253
+ // Load project-local rules from .chant/rules/
254
+ const localRules = await loadLocalRules(projectPath);
255
+ for (const r of localRules) {
256
+ rules.set(r.id, r);
257
+ }
258
+ return { rules, intrinsics, propertyClasses, plugins, ...(lexiconError ? { lexiconError } : {}) };
259
+ }
260
+ /**
261
+ * Every TypeScript file `chant lint` reads under `dir`, through the one
262
+ * discovery walk (`../../discovery/walk.ts`, #2527): git-ignored paths
263
+ * (vendored trees and the like, which the project never wrote), dot-directories,
264
+ * `dist` and, inside a project, child projects are skipped, and so is what the
265
+ * project's `exclude` globs (#2519) name, unless `include` re-admits it. Test
266
+ * and spec files, chant-generated files and skip-marked files are left out.
267
+ * Symlinks are followed, as lint always did.
268
+ */
269
+ async function getTypeScriptFiles(dir) {
270
+ // A missing or non-directory path fails here, as lint's own walk always did;
271
+ // the shared walk skips an unreadable directory in silence.
272
+ readdirSync(dir);
273
+ return walkDiscovery({
274
+ walker: "lint",
275
+ root: dir,
276
+ globs: await resolveDiscoveryGlobs(dir),
277
+ excludeDirs: await workspaceMemberDirs(dir),
278
+ followSymlinks: true,
279
+ accept: (name, full) => isSourceFileName(name) && !hasDiscoveryMarkerSync(full),
280
+ });
281
+ }
282
+ /**
283
+ * Get default rules and options, optionally applying per-file overrides.
284
+ *
285
+ * `projectRoot` is where the config lives (see `findProjectRoot`); `filePath`,
286
+ * when given, must be relative to that root so `lint.overrides` globs
287
+ * (`src/lib/**`) match regardless of which subpath is being linted.
288
+ */
289
+ function getDefaultRules(projectRoot, filePath, allRules = new Map()) {
290
+ const config = loadConfig(projectRoot);
291
+ const effectiveRules = filePath ? resolveRulesForFile(config, filePath) : config.rules;
292
+ const rules = [];
293
+ const ruleOptions = new Map();
294
+ for (const [ruleId, rule] of allRules) {
295
+ // chant #1138 — the same resolution post-synth checks and COMP* checks
296
+ // now go through too (`resolveConfiguredSeverity`, ../../lint/config.ts),
297
+ // so `lint.rules: { ID: "off" }` suppresses a rule id identically no
298
+ // matter which phase produced it.
299
+ const { severity, options } = resolveConfiguredSeverity(effectiveRules, ruleId, rule.severity);
300
+ // Skip rules that are explicitly turned off
301
+ if (severity === "off")
302
+ continue;
303
+ // Override severity from config (a no-op when the rule wasn't mentioned —
304
+ // `severity` is then just `rule.severity` again)
305
+ rules.push({ ...rule, severity });
306
+ // Store options if present
307
+ if (options) {
308
+ ruleOptions.set(ruleId, options);
309
+ }
310
+ }
311
+ return { rules, ruleOptions };
312
+ }
313
+ /**
314
+ * Run the COMP* composition checks (#562) over the discovered `Component`
315
+ * graph and convert their results into plain `LintDiagnostic`s so they merge
316
+ * into the same `chant lint` output (stylish/json/sarif) and the same
317
+ * error-count gating as every COR/EVL diagnostic.
318
+ *
319
+ * These checks operate on the whole discovered component graph, not one
320
+ * `ts.SourceFile`, so they carry no real line/column — reported at `1:1` in
321
+ * the file the component was declared in (matching COR009's whole-file
322
+ * diagnostic convention, see ../../lint/rules/file-declarable-limit.ts).
323
+ * Config severity overrides (`lint.rules["COMP001"]`, including `"off"`) are
324
+ * honored the same way `getDefaultRules` honors them for AST rules. Only the
325
+ * *file-level* disable directive form (`// chant-disable` /
326
+ * `// chant-disable COMP004 -- reason`, anywhere in the file) is honored —
327
+ * `-line`/`-next-line` need an exact line to match against, which a
328
+ * whole-component diagnostic does not have; see
329
+ * docs/lint-rules/composition.mdx for this documented limitation.
330
+ */
331
+ /**
332
+ * Build the registry-derived context composition checks need — the set of
333
+ * capability kinds registered for this project (core's starter set plus the
334
+ * active lexicons' leaves, e.g. `cfn-deploy` when `lexicons: ["aws"]`) and each
335
+ * verb's rollback disposition — so COMP005/COMP003 read real registry facts
336
+ * rather than hard-coding verb lists. A verb's rollback policy is its own
337
+ * declaration (`rollbackPolicy`), else derived: a paired `rollback` method is
338
+ * `"native"`, everything else `"none-by-design"`. Tolerant: any failure (an
339
+ * unresolvable lexicon, a config-less directory) returns `undefined` fields,
340
+ * letting the checks fall back to core's starter set.
341
+ */
342
+ async function resolveRegistryContext(infraPath) {
343
+ try {
344
+ const lexicons = await resolveProjectLexicons(infraPath).catch(() => []);
345
+ const registry = await buildCapabilityRegistry({ lexicons });
346
+ const kinds = registry.kinds();
347
+ const rollbackPolicies = new Map();
348
+ for (const kind of kinds) {
349
+ const capability = registry.resolve(kind);
350
+ rollbackPolicies.set(kind, capability.rollbackPolicy ?? (capability.rollback ? "native" : "none-by-design"));
351
+ }
352
+ return { knownKinds: new Set(kinds), rollbackPolicies };
353
+ }
354
+ catch {
355
+ return {};
356
+ }
357
+ }
358
+ async function runComponentCheckDiagnostics(infraPath, sandbox, buildParams) {
359
+ // Discovery stays scoped to the lint arg; COMP* severity overrides come from
360
+ // the project-root config, same as the AST-rule pass.
361
+ const config = loadConfig(findProjectRoot(infraPath));
362
+ const checks = loadComponentChecks();
363
+ const allCheckIds = new Set(checks.map((c) => c.id));
364
+ const registryContext = await resolveRegistryContext(infraPath);
365
+ const raw = await runComponentChecks(infraPath, checks, registryContext, sandbox, buildParams);
366
+ const fileDirectivesCache = new Map();
367
+ const fileLevelDisable = (file, checkId) => {
368
+ let directives = fileDirectivesCache.get(file);
369
+ if (!directives) {
370
+ let content = "";
371
+ try {
372
+ content = readFileSync(file, "utf-8");
373
+ }
374
+ catch {
375
+ // File may be unreadable (e.g. a synthetic discovery-error path) — no directives to honor.
376
+ }
377
+ directives = parseDisableComments(content);
378
+ fileDirectivesCache.set(file, directives);
379
+ }
380
+ for (const directive of directives) {
381
+ if (directive.type !== "file")
382
+ continue;
383
+ if (!directive.ruleIds)
384
+ return { suppressed: true, reason: directive.reason };
385
+ if (directive.ruleIds.some((id) => allCheckIds.has(id) || id === "COMP000") && directive.ruleIds.includes(checkId)) {
386
+ return { suppressed: true, reason: directive.reason };
387
+ }
388
+ }
389
+ return { suppressed: false };
390
+ };
391
+ const toLintDiagnostic = (d, severity) => ({
392
+ file: d.file,
393
+ line: 1,
394
+ column: 1,
395
+ ruleId: d.checkId,
396
+ severity,
397
+ message: d.message,
398
+ });
399
+ const diagnostics = [];
400
+ const suppressed = [];
401
+ for (const d of raw) {
402
+ // Discovery errors (COMP000) always surface at error severity — not user-configurable.
403
+ let severity = d.severity;
404
+ if (d.checkId !== "COMP000") {
405
+ // chant #1138 — same resolution function AST rules and post-synth
406
+ // checks use (`resolveConfiguredSeverity`, ../../lint/config.ts).
407
+ const resolved = resolveConfiguredSeverity(config.rules, d.checkId, d.severity);
408
+ if (resolved.severity === "off")
409
+ continue;
410
+ severity = resolved.severity;
411
+ }
412
+ const disable = fileLevelDisable(d.file, d.checkId);
413
+ const diagnostic = toLintDiagnostic(d, severity);
414
+ if (disable.suppressed) {
415
+ suppressed.push({ ...diagnostic, reason: disable.reason });
416
+ }
417
+ else {
418
+ diagnostics.push(diagnostic);
419
+ }
420
+ }
421
+ return { diagnostics, suppressed };
422
+ }
423
+ /**
424
+ * Run the OPS* Op-model post-synth checks (#2122, epic #2114 sub-issue 6 —
425
+ * OPS012/OPS013/OPS014, ported from a hosting lexicon's own
426
+ * TMP012/TMP013/TMP014) over every `*.op.ts` file under the lint target and
427
+ * merge them into the same diagnostics/suppressed lists `chant lint` already
428
+ * reports through, the same treatment {@link runComponentCheckDiagnostics}
429
+ * above gives COMP*.
430
+ *
431
+ * Deliberately scoped DOWNWARD from `infraPath` — the same scan
432
+ * `getTypeScriptFiles` already ran to build `files` — rather than
433
+ * `../../op/discover.ts`'s `discoverOps`, which walks UP to the nearest
434
+ * project root (or the git root, absent a config file) precisely because a
435
+ * real project's `ops/` convention sits outside `sourceDir`. That upward
436
+ * walk is right for `chant run`/`chant build`, which always operate on one
437
+ * whole project; it is wrong here, because `chant lint <path>` (and every
438
+ * fixture-scoped test that calls this file's `lintCommand`) may point at a
439
+ * directory with no `chant.config.*` above it short of this repo's own git
440
+ * root — which would make this check import every `*.op.ts` file in the
441
+ * entire monorepo on every such call. Scanning only under `infraPath`, like
442
+ * every other check in this function, keeps this check's cost proportional
443
+ * to the target the caller actually asked to lint.
444
+ *
445
+ * Each `*.op.ts` file's default export is imported directly and used as-is
446
+ * (it is already the `Declarable` `OpResource` instance `Op()` built) — no
447
+ * serializer and no lexicon plugin needed, since OPS012/OPS013/OPS014 only
448
+ * ever read `ctx.entities`, never `ctx.outputs`. That's what lets this fire
449
+ * even on a project with no lexicons configured at all.
450
+ *
451
+ * The project's configured lexicon NAMES are read, though (chant #2101), to
452
+ * resolve the activity contracts each one declares at
453
+ * `@intentius/chant-lexicon-<name>/op/activity-contracts`. The plugins
454
+ * `lintCommand` already loaded are passed in (chant #2520), so a plugin's
455
+ * `activityContracts()` member counts here as it does in `chant build`, and
456
+ * a lexicon declared by module path is covered. Without them a step calling a
457
+ * lexicon's activity is flagged for the absence of a contract that lexicon
458
+ * does declare, which is the whole point of OPS013 firing outside a build.
459
+ *
460
+ * Reported at `1:1` in the file the Op was declared in, the same whole-file
461
+ * convention COMP* diagnostics use — a post-synth finding carries no real
462
+ * line/column (../../lint/post-synth.ts's `PostSynthDiagnostic` doc) and
463
+ * there's no per-file disable-directive suppression for the same reason
464
+ * (that doc again), so this reads only `lint.rules` severity overrides, not
465
+ * `chant-disable` comments.
466
+ */
467
+ async function runOpCheckDiagnostics(infraPath, files, buildParams, plugins = []) {
468
+ const config = loadConfig(findProjectRoot(infraPath));
469
+ const opFiles = files.filter((f) => f.endsWith(".op.ts"));
470
+ if (opFiles.length === 0)
471
+ return { diagnostics: [], suppressed: [] };
472
+ // chant #2251 — the same step `discover()` runs before it imports or folds a
473
+ // project file (../../discovery/index.ts): populate the shared build-time
474
+ // parameters object BEFORE the imports below, so an Op that takes a step
475
+ // argument from `params.<name>` reads the value this invocation resolved
476
+ // rather than `undefined`. Unconditional, so a stale value from a prior
477
+ // lint in the same process (a test, `--watch`) never leaks into one that
478
+ // resolved none.
479
+ setBuildParams(buildParamValues(buildParams ?? []));
480
+ const entities = new Map();
481
+ const fileByOpName = new Map();
482
+ for (const filePath of opFiles) {
483
+ try {
484
+ ensureTypeScriptLoader();
485
+ const mod = await import(filePath);
486
+ const entity = mod.default;
487
+ if (!entity || typeof entity !== "object")
488
+ continue;
489
+ const opConfig = entity.props;
490
+ if (!opConfig || typeof opConfig.name !== "string" || !Array.isArray(opConfig.phases))
491
+ continue;
492
+ entities.set(opConfig.name, entity);
493
+ fileByOpName.set(opConfig.name, filePath);
494
+ }
495
+ catch {
496
+ // A file that fails to import is somebody else's problem — a syntax
497
+ // error surfaces through the AST rule pass over the same file instead
498
+ // of crashing this one.
499
+ continue;
500
+ }
501
+ }
502
+ if (entities.size === 0)
503
+ return { diagnostics: [], suppressed: [] };
504
+ // chant #2520 — hand over the loaded plugin objects when there are any, as
505
+ // `chant build` does, so a plugin's `activityContracts()` member is read
506
+ // here too. Names alone are the fallback when no plugin loaded.
507
+ const activityContracts = plugins.length > 0
508
+ ? await loadActivityContracts(plugins)
509
+ : await loadActivityContracts(await resolveProjectLexicons(infraPath).catch(() => []));
510
+ // SYS010 (#2828) also reads `decide.backends` from the project's config.
511
+ // A directory whose config does not load simply has none to check.
512
+ const decideBackends = await loadChantConfig(findProjectRoot(infraPath))
513
+ .then((loaded) => loaded.config.decide?.backends)
514
+ .catch(() => undefined);
515
+ const raw = runPostSynthChecks(coreOpChecks({ decideBackends }), {
516
+ outputs: new Map(),
517
+ entities: entities,
518
+ warnings: [],
519
+ errors: [],
520
+ sourceFileCount: opFiles.length,
521
+ }, undefined, { activityContracts });
522
+ const diagnostics = [];
523
+ const suppressed = [];
524
+ for (const d of raw) {
525
+ const resolved = resolveConfiguredSeverity(config.rules, d.checkId, d.severity);
526
+ if (resolved.severity === "off")
527
+ continue;
528
+ diagnostics.push({
529
+ file: (d.entity && fileByOpName.get(d.entity)) ?? infraPath,
530
+ line: 1,
531
+ column: 1,
532
+ ruleId: d.checkId,
533
+ severity: resolved.severity,
534
+ message: d.message,
535
+ });
536
+ }
537
+ return { diagnostics, suppressed };
538
+ }
539
+ /**
540
+ * Run each loaded lexicon's own post-synth checks (#3750), the ones `chant
541
+ * build` runs after it serializes, over an in-memory build of the lint target.
542
+ *
543
+ * The build is `chant build`'s: the same `build()` call with options from the
544
+ * same assembler (`../build-options.ts`), and the same per-lexicon scoping of
545
+ * outputs (`runLexiconPostSynthChecks`, ./build.ts). Nothing is written. It
546
+ * builds `infraPath`, the target the caller asked to lint, never the project
547
+ * root above it, so `chant lint <dir>` costs a build of `<dir>` and nothing
548
+ * more (the same scoping {@link runOpCheckDiagnostics} documents). It is
549
+ * skipped outright when no loaded lexicon ships post-synth checks and the
550
+ * project declares no `lint.policies`, which keeps a project with no lexicon,
551
+ * and every core-only fixture, from building at all.
552
+ *
553
+ * The project's `lint.policies` run over the same build after the lexicons'
554
+ * checks (#3870), with every lexicon's output and the env, as `chant build`
555
+ * runs them, and sandboxed when the build is. `lint.rules` applies to their
556
+ * ids; a policy that does not load is reported under
557
+ * {@link BUILD_FAILURE_RULE_ID}.
558
+ *
559
+ * A target that does not build reports each build error under
560
+ * {@link BUILD_FAILURE_RULE_ID} and skips the checks. Findings go through
561
+ * `lint.presets`, then `lint.rules`, then inline `chant-ignore` comments, the
562
+ * order `chant build` applies them in. A finding carries no line (see
563
+ * ../../lint/post-synth.ts's `PostSynthDiagnostic`), so it is reported at
564
+ * `1:1` in the file that declared its entity, or at the config file (the
565
+ * project root without one) when it names none.
566
+ */
567
+ async function runLexiconPostSynthDiagnostics(infraPath, plugins, buildParams, sandbox) {
568
+ const diagnostics = [];
569
+ const suppressed = [];
570
+ const withChecks = plugins.filter((plugin) => (plugin.postSynthChecks?.() ?? []).length > 0);
571
+ const projectRoot = findProjectRoot(infraPath);
572
+ const lintConfig = loadConfig(projectRoot);
573
+ if (withChecks.length === 0 && (lintConfig.policies ?? []).length === 0)
574
+ return { diagnostics, suppressed };
575
+ // Where a finding that names no declared entity is reported: the config the
576
+ // build loads once it is known (past a lint-only fragment), else the nearest.
577
+ let fallbackFile = findProjectConfig(projectRoot).configPath ?? projectRoot;
578
+ const buildFailure = (message, at) => ({
579
+ file: at?.file ?? fallbackFile,
580
+ line: at?.line ?? 1,
581
+ column: at?.column ?? 1,
582
+ ruleId: BUILD_FAILURE_RULE_ID,
583
+ severity: "error",
584
+ message,
585
+ });
586
+ let result;
587
+ let env;
588
+ let telemetry;
589
+ let configDir = infraPath;
590
+ let loadedConfig;
591
+ let policies = [];
592
+ try {
593
+ const loaded = await loadChantConfigUpward(infraPath);
594
+ const config = loaded.config;
595
+ loadedConfig = config;
596
+ configDir = loaded.configPath ? dirname(loaded.configPath) : infraPath;
597
+ if (loaded.configPath)
598
+ fallbackFile = loaded.configPath;
599
+ // The caller's parameters when it resolved them (the CLI does, from the
600
+ // same upward config walk); otherwise the declared defaults and `env`
601
+ // mappings of the config this build loads. Not lintCommand's own fallback:
602
+ // that one reads the config at the lint root, which may be a lint-only
603
+ // fragment with no `buildParams` (a `src/chant.config.json`).
604
+ const params = buildParams ?? resolveBuildParams(config.buildParams, { env: process.env }).provenance;
605
+ env = resolveOwnershipEnv(config, params);
606
+ policies = config.lint?.policies ?? [];
607
+ // #3870: a sandboxed build sandboxes the policies too, as `chant build` arms it.
608
+ const modes = resolveBuildModes(config, { sandbox });
609
+ if (modes.sandbox && policies.length > 0)
610
+ armSandboxPolicyExecution();
611
+ telemetry = await resolveTelemetryAttribution(configDir, config, env);
612
+ // Every lexicon the lint loaded, as `chant build` serializes with every
613
+ // lexicon it loaded: a check may read another lexicon's entities, and the
614
+ // outputs are scoped per plugin below either way.
615
+ result = await build(infraPath, plugins.map((plugin) => plugin.serializer), undefined, resolveProjectBuildOptions({
616
+ config,
617
+ configDir,
618
+ plugins,
619
+ modes,
620
+ ownership: resolveOwnershipMarker(config, params),
621
+ buildParams: params,
622
+ telemetry,
623
+ }));
624
+ }
625
+ catch (err) {
626
+ diagnostics.push(buildFailure(err instanceof Error ? err.message : String(err)));
627
+ return { diagnostics, suppressed };
628
+ }
629
+ if (result.errors.length > 0) {
630
+ const seen = new Set();
631
+ for (const error of result.errors) {
632
+ const at = error;
633
+ const key = `${at.file ?? ""}:${at.line ?? ""}:${error.message}`;
634
+ if (seen.has(key))
635
+ continue;
636
+ seen.add(key);
637
+ diagnostics.push(buildFailure(error.message, at));
638
+ }
639
+ return { diagnostics, suppressed };
640
+ }
641
+ const activityContracts = await loadActivityContracts(plugins);
642
+ const fileOf = (entity) => {
643
+ const declared = entity ? result.entities.get(entity) : undefined;
644
+ return (declared && getProvenance(declared)?.sourceFile) || fallbackFile;
645
+ };
646
+ const toLint = (d) => ({
647
+ file: fileOf(d.entity),
648
+ line: 1,
649
+ column: 1,
650
+ ruleId: d.checkId,
651
+ severity: d.severity,
652
+ message: `${d.entity ? `[${d.entity}] ` : ""}${d.message}`,
653
+ });
654
+ for (const { plugin, diagnostics: raw } of runLexiconPostSynthChecks(withChecks, result, env, { activityContracts, telemetry, projectDir: configDir, ...(loadedConfig ? { projectConfig: loadedConfig } : {}) })) {
655
+ const presetIds = resolvePresetIds(plugin.lintPresets?.(), lintConfig.presets?.[plugin.name] ?? "recommended");
656
+ const afterPreset = applyConfiguredPreset(raw, presetIds, lintConfig.rules).diagnostics;
657
+ const afterConfig = applyConfiguredSeverity(afterPreset, lintConfig.rules).diagnostics;
658
+ const inline = applyInlineSuppressions(afterConfig, result.entities, lintConfig.rules);
659
+ for (const d of inline.diagnostics)
660
+ diagnostics.push(toLint(d));
661
+ for (const d of inline.suppressed)
662
+ suppressed.push({ ...toLint(d), reason: "chant-ignore" });
663
+ for (const m of inline.meta) {
664
+ diagnostics.push({ file: m.file, line: m.line, column: 1, ruleId: m.checkId, severity: m.severity, message: m.message });
665
+ }
666
+ }
667
+ // #3870: the project's `lint.policies`, over the same build, as `chant
668
+ // build` runs them: every lexicon's output at once, with the env, and
669
+ // `lint.rules` applied to their ids.
670
+ if (policies.length > 0) {
671
+ let raw;
672
+ try {
673
+ raw = await runProjectPolicies({ policies, configDir, buildResult: result, env });
674
+ }
675
+ catch (err) {
676
+ diagnostics.push(buildFailure(err instanceof Error ? err.message : String(err)));
677
+ return { diagnostics, suppressed };
678
+ }
679
+ const configured = applyConfiguredSeverity(raw, lintConfig.rules);
680
+ for (const d of configured.diagnostics)
681
+ diagnostics.push(toLint(d));
682
+ }
683
+ return { diagnostics, suppressed };
684
+ }
685
+ /**
686
+ * Apply fixes to a file
687
+ */
688
+ function applyFixes(filePath, fixes) {
689
+ if (fixes.length === 0)
690
+ return;
691
+ let content = readFileSync(filePath, "utf-8");
692
+ // Sort fixes by position descending so we can apply from end to start
693
+ const sortedFixes = [...fixes].sort((a, b) => b.range[0] - a.range[0]);
694
+ for (const fix of sortedFixes) {
695
+ content = content.slice(0, fix.range[0]) + fix.replacement + content.slice(fix.range[1]);
696
+ }
697
+ writeFileSync(filePath, content);
698
+ }
699
+ /**
700
+ * Execute the lint command
701
+ */
702
+ export async function lintCommand(options) {
703
+ const infraPath = resolve(options.path);
704
+ // Config, rules, and lexicons anchor on the project root so a scoped lint
705
+ // (`chant lint src`, the `graph --format ir` gate) still sees `lint.overrides`
706
+ // and the declared lexicons; only the file scan stays scoped to `infraPath`.
707
+ const projectRoot = findProjectRoot(infraPath);
708
+ const config = loadConfig(projectRoot);
709
+ const hasOverrides = config.overrides && config.overrides.length > 0;
710
+ // chant #1221 — the project's chant.config slice for config-aware rules
711
+ // (COR021 reads `environments` + `ownership`), threaded into every
712
+ // runLint() call below via LintContext.projectConfig. Best-effort: a
713
+ // directory with no project config lints with those rules silent.
714
+ let projectConfig;
715
+ // chant #1866 — the loaded OKF knowledge bundle, threaded into
716
+ // `formatStylish` below so its suppressed section can resolve `okf:`
717
+ // citations. Best-effort like `projectConfig` above (same
718
+ // `loadChantConfig` call): a directory with no chant config, or no
719
+ // `knowledge/` bundle, lints with citations rendering unresolved rather
720
+ // than a failure — `loadOkfBundle` already treats a missing directory as
721
+ // an empty bundle.
722
+ let knowledgeBundle;
723
+ /**
724
+ * chant #2249 — this invocation's build-time parameters, falling back to
725
+ * the project's own declared `buildParams` when the caller passed none.
726
+ *
727
+ * `chant lint` resolves them in ./handlers/lint.ts (#2251) because only
728
+ * the CLI knows about `--param`/`--params-file`, and passes them here. An
729
+ * in-process caller has no such flags to read, and before this fell
730
+ * through to the empty parameter object: the OPS* checks import each
731
+ * `*.op.ts`, an Op taking a step argument from `params.<name>` read
732
+ * `undefined` at module load, and OPS012 reported the activity contract
733
+ * violated for source `chant lint` on the command line passes. That made
734
+ * `lintCommand` disagree with its own CLI (the root-examples gate,
735
+ * `handleLint` over MCP, test-utils' example harness). Resolving the
736
+ * declared defaults + `env` mappings here is what the command line
737
+ * already gets; anything a flag would override still arrives in
738
+ * `options.buildParams` and wins. Best-effort like `projectConfig`:
739
+ * `resolveBuildParams` collects failures per parameter without throwing,
740
+ * and the ones that did resolve are still better than none.
741
+ */
742
+ let buildParams = options.buildParams;
743
+ try {
744
+ const chantConfig = (await loadChantConfig(projectRoot)).config;
745
+ projectConfig = chantConfig;
746
+ knowledgeBundle = await loadOkfBundle(resolveKnowledgeDir(chantConfig, projectRoot));
747
+ buildParams ?? (buildParams = resolveBuildParams(chantConfig.buildParams, { env: process.env }).provenance);
748
+ }
749
+ catch {
750
+ projectConfig = undefined;
751
+ knowledgeBundle = undefined;
752
+ }
753
+ // Load all rules from lexicon plugins (core "chant" + lexicon-specific)
754
+ const loaded = await loadAllPluginRules(projectRoot);
755
+ let allRules = loaded.rules;
756
+ // chant #1106 — the active lexicons' registered intrinsics, threaded into
757
+ // every runLint() call below so EVL001 answers exactly like fold() does
758
+ // for a registered, opted-in call (`Ref(...)`, `GetAtt(...)`) instead of
759
+ // flagging it. Computed once here regardless of which branch below runs,
760
+ // same as `allRules`.
761
+ const intrinsics = loaded.intrinsics;
762
+ const propertyClasses = loaded.propertyClasses;
763
+ // Merge in any config-level plugin rules (custom .ts rule files)
764
+ if (config.plugins && config.plugins.length > 0) {
765
+ const pluginRules = await loadPluginRules(config.plugins, projectRoot);
766
+ allRules = new Map([...allRules, ...pluginRules]);
767
+ }
768
+ // Get all TypeScript files, through the one discovery walk (#2527)
769
+ const files = await getTypeScriptFiles(infraPath);
770
+ // Run lint — use per-file rules when overrides are present
771
+ let diagnostics;
772
+ let suppressed = [];
773
+ if (options.rules) {
774
+ const result = await runLint(files, options.rules, undefined, intrinsics, projectConfig, propertyClasses);
775
+ diagnostics = result.diagnostics;
776
+ suppressed = result.suppressed;
777
+ }
778
+ else if (hasOverrides) {
779
+ diagnostics = [];
780
+ for (const file of files) {
781
+ const relativePath = relative(projectRoot, file);
782
+ const { rules: fileRules, ruleOptions } = getDefaultRules(projectRoot, relativePath, allRules);
783
+ const result = await runLint([file], fileRules, ruleOptions, intrinsics, projectConfig, propertyClasses);
784
+ diagnostics.push(...result.diagnostics);
785
+ suppressed.push(...result.suppressed);
786
+ }
787
+ }
788
+ else {
789
+ const { rules, ruleOptions } = getDefaultRules(projectRoot, undefined, allRules);
790
+ const result = await runLint(files, rules, ruleOptions, intrinsics, projectConfig, propertyClasses);
791
+ diagnostics = result.diagnostics;
792
+ suppressed = result.suppressed;
793
+ }
794
+ // Run the COMP* composition checks (#562) over the discovered `Component`
795
+ // graph and merge them into the same diagnostics/suppressed lists — a
796
+ // structurally distinct check family (whole-project, post-discovery,
797
+ // see ../../lint/component-checks.ts) but the same `chant lint` output and
798
+ // the same error-severity gating as every COR/EVL diagnostic.
799
+ const componentResult = await runComponentCheckDiagnostics(infraPath, options.sandbox, buildParams);
800
+ diagnostics.push(...componentResult.diagnostics);
801
+ suppressed.push(...componentResult.suppressed);
802
+ // Run the OPS* Op-model post-synth checks (#2122) over every `*.op.ts`
803
+ // file under the lint target — see runOpCheckDiagnostics's doc for why
804
+ // this needs no lexicon or build to fire.
805
+ const opResult = await runOpCheckDiagnostics(infraPath, files, buildParams, loaded.plugins);
806
+ diagnostics.push(...opResult.diagnostics);
807
+ suppressed.push(...opResult.suppressed);
808
+ // Apply fixes if requested
809
+ if (options.fix) {
810
+ // Group fixes by file
811
+ const fixesByFile = new Map();
812
+ for (const diag of diagnostics) {
813
+ if (diag.fix) {
814
+ const existing = fixesByFile.get(diag.file) ?? [];
815
+ existing.push(diag.fix);
816
+ fixesByFile.set(diag.file, existing);
817
+ }
818
+ }
819
+ // Apply fixes to each file
820
+ for (const [file, fixes] of fixesByFile) {
821
+ applyFixes(file, fixes);
822
+ }
823
+ // Re-lint after fixes to get updated diagnostics
824
+ if (options.rules) {
825
+ const postResult = await runLint(files, options.rules, undefined, intrinsics, projectConfig, propertyClasses);
826
+ diagnostics = postResult.diagnostics;
827
+ suppressed = postResult.suppressed;
828
+ }
829
+ else if (hasOverrides) {
830
+ diagnostics = [];
831
+ suppressed = [];
832
+ for (const file of files) {
833
+ const relativePath = relative(projectRoot, file);
834
+ const { rules: fileRules, ruleOptions } = getDefaultRules(projectRoot, relativePath, allRules);
835
+ const postResult = await runLint([file], fileRules, ruleOptions, intrinsics, projectConfig, propertyClasses);
836
+ diagnostics.push(...postResult.diagnostics);
837
+ suppressed.push(...postResult.suppressed);
838
+ }
839
+ }
840
+ else {
841
+ const { rules, ruleOptions } = getDefaultRules(projectRoot, undefined, allRules);
842
+ const postResult = await runLint(files, rules, ruleOptions, intrinsics, projectConfig, propertyClasses);
843
+ diagnostics = postResult.diagnostics;
844
+ suppressed = postResult.suppressed;
845
+ }
846
+ // COMP* checks have no `.fix` (nothing above could have touched a
847
+ // `*.component.ts` file on their behalf), but a fix applied to another
848
+ // rule could still be in the same file a component was discovered from —
849
+ // re-run for consistency with the AST re-lint above.
850
+ const postComponentResult = await runComponentCheckDiagnostics(infraPath, options.sandbox, buildParams);
851
+ diagnostics.push(...postComponentResult.diagnostics);
852
+ suppressed.push(...postComponentResult.suppressed);
853
+ // OPS* checks have no `.fix` either; re-run for the same consistency
854
+ // reason as the COMP* re-run just above.
855
+ const postOpResult = await runOpCheckDiagnostics(infraPath, files, buildParams, loaded.plugins);
856
+ diagnostics.push(...postOpResult.diagnostics);
857
+ suppressed.push(...postOpResult.suppressed);
858
+ }
859
+ // chant #3750: each lexicon's own post-synth checks, over an in-memory
860
+ // build of the lint target. Run once, after any `--fix` above, so it sees
861
+ // the source as fixed; a post-synth finding has no fix of its own. Skipped
862
+ // when a lexicon failed to resolve, which LEX001 below already reports.
863
+ if (!loaded.lexiconError && options.postSynth !== false) {
864
+ const lexiconResult = await runLexiconPostSynthDiagnostics(infraPath, loaded.plugins, options.buildParams, options.sandbox);
865
+ diagnostics.push(...lexiconResult.diagnostics);
866
+ suppressed.push(...lexiconResult.suppressed);
867
+ }
868
+ // chant #2222: a lexicon the project declared but this run could not
869
+ // resolve. Appended here, after the `--fix` re-lint block above has finished
870
+ // reassigning `diagnostics`, so it survives every path; it is a property of
871
+ // the run, not of any file a fix could touch.
872
+ if (loaded.lexiconError) {
873
+ diagnostics.push(lexiconResolutionDiagnostic(projectRoot, loaded.lexiconError));
874
+ }
875
+ // Count errors and warnings
876
+ let errorCount = 0;
877
+ let warningCount = 0;
878
+ for (const diag of diagnostics) {
879
+ if (diag.severity === "error") {
880
+ errorCount++;
881
+ }
882
+ else if (diag.severity === "warning") {
883
+ warningCount++;
884
+ }
885
+ }
886
+ // Collect all loaded rules for SARIF enrichment
887
+ const allLoadedRules = options.rules
888
+ ? options.rules
889
+ : [...allRules.values()];
890
+ // Format output
891
+ let output;
892
+ switch (options.format) {
893
+ case "json":
894
+ output = formatJson(diagnostics);
895
+ break;
896
+ case "sarif":
897
+ output = formatSarif(diagnostics, allLoadedRules, suppressed);
898
+ break;
899
+ case "stylish":
900
+ default:
901
+ output = formatStylish(diagnostics, suppressed, knowledgeBundle);
902
+ break;
903
+ }
904
+ return {
905
+ success: errorCount === 0,
906
+ errorCount,
907
+ warningCount,
908
+ diagnostics,
909
+ output,
910
+ };
911
+ }
912
+ /**
913
+ * Print lint result to console
914
+ */
915
+ export function printLintResult(result) {
916
+ if (result.output) {
917
+ console.log(result.output);
918
+ }
919
+ }
920
+ /**
921
+ * Run lint in watch mode. Runs an initial lint, then watches for changes
922
+ * and triggers re-lints. Returns a cleanup function.
923
+ */
924
+ export function lintCommandWatch(options, onReLint) {
925
+ const infraPath = resolve(options.path);
926
+ console.error(formatInfo(`[${formatTimestamp()}] Watching for changes...`));
927
+ // Run initial lint
928
+ lintCommand(options).then((result) => {
929
+ printLintResult(result);
930
+ onReLint?.(result);
931
+ console.error(formatInfo(`[${formatTimestamp()}] Waiting for changes...`));
932
+ });
933
+ // Watch for changes and trigger re-lints
934
+ const cleanup = watchDirectory(infraPath, async (changedFiles) => {
935
+ console.error("");
936
+ console.error(formatInfo(`[${formatTimestamp()}] Changes detected: ${formatChangedFiles(changedFiles, infraPath)}`));
937
+ try {
938
+ const result = await lintCommand(options);
939
+ printLintResult(result);
940
+ onReLint?.(result);
941
+ }
942
+ catch (err) {
943
+ console.error(formatError({ message: err instanceof Error ? err.message : String(err) }));
944
+ }
945
+ console.error(formatInfo(`[${formatTimestamp()}] Waiting for changes...`));
946
+ });
947
+ return cleanup;
948
+ }