@intentius/chant 0.124.13 → 0.124.15

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 (991) 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.d.ts +6 -0
  35. package/dist/build.d.ts.map +1 -1
  36. package/dist/build.js +669 -0
  37. package/dist/builder.js +44 -0
  38. package/dist/cdk/advise.js +30 -0
  39. package/dist/cdk/assembly.js +122 -0
  40. package/dist/cdk/graph.js +444 -0
  41. package/dist/cdk/tier-map.js +64 -0
  42. package/dist/cdk/types.js +24 -0
  43. package/dist/change-set.d.ts +24 -2
  44. package/dist/change-set.d.ts.map +1 -1
  45. package/dist/change-set.js +361 -0
  46. package/dist/child-project.js +21 -0
  47. package/dist/ci-jobs.d.ts +227 -0
  48. package/dist/ci-jobs.d.ts.map +1 -0
  49. package/dist/ci-jobs.js +448 -0
  50. package/dist/claimed-fields.js +135 -0
  51. package/dist/cli/build-options.js +70 -0
  52. package/dist/cli/build-params-cli.js +139 -0
  53. package/dist/cli/command-group.js +123 -0
  54. package/dist/cli/commands/audit-agents.js +326 -0
  55. package/dist/cli/commands/audit.js +571 -0
  56. package/dist/cli/commands/build.js +920 -0
  57. package/dist/cli/commands/carve-apply.js +153 -0
  58. package/dist/cli/commands/carve-bridge.js +201 -0
  59. package/dist/cli/commands/carve-emit.js +332 -0
  60. package/dist/cli/commands/carve-status.js +119 -0
  61. package/dist/cli/commands/carve.js +204 -0
  62. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  63. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  64. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  65. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  66. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  67. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  68. package/dist/cli/commands/check-lexicon.js +766 -0
  69. package/dist/cli/commands/describe.js +85 -0
  70. package/dist/cli/commands/diff.js +175 -0
  71. package/dist/cli/commands/doctor.js +350 -0
  72. package/dist/cli/commands/import-agents.js +155 -0
  73. package/dist/cli/commands/import.js +670 -0
  74. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  75. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  76. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  77. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  78. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  79. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  80. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  81. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  82. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  83. package/dist/cli/commands/init-lexicon.js +172 -0
  84. package/dist/cli/commands/init.js +381 -0
  85. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  86. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  87. package/dist/cli/commands/licenses.js +125 -0
  88. package/dist/cli/commands/lint.d.ts.map +1 -1
  89. package/dist/cli/commands/lint.js +948 -0
  90. package/dist/cli/commands/list.js +63 -0
  91. package/dist/cli/commands/migrate.d.ts.map +1 -1
  92. package/dist/cli/commands/migrate.js +423 -0
  93. package/dist/cli/commands/onboard.js +403 -0
  94. package/dist/cli/commands/pinned-upgrade.js +191 -0
  95. package/dist/cli/commands/update.js +194 -0
  96. package/dist/cli/commands/vendor.js +217 -0
  97. package/dist/cli/conflict-check.js +104 -0
  98. package/dist/cli/debug.js +8 -0
  99. package/dist/cli/format.js +104 -0
  100. package/dist/cli/handlers/build.js +267 -0
  101. package/dist/cli/handlers/carve-apply.js +30 -0
  102. package/dist/cli/handlers/carve-bridge.js +28 -0
  103. package/dist/cli/handlers/carve-emit.js +50 -0
  104. package/dist/cli/handlers/carve-status.js +26 -0
  105. package/dist/cli/handlers/carve.js +40 -0
  106. package/dist/cli/handlers/change-set.js +46 -0
  107. package/dist/cli/handlers/components.js +730 -0
  108. package/dist/cli/handlers/dev.js +113 -0
  109. package/dist/cli/handlers/emulator.js +233 -0
  110. package/dist/cli/handlers/explain.js +54 -0
  111. package/dist/cli/handlers/fan-out.js +422 -0
  112. package/dist/cli/handlers/gate-resume.js +275 -0
  113. package/dist/cli/handlers/generate.js +84 -0
  114. package/dist/cli/handlers/graph.js +969 -0
  115. package/dist/cli/handlers/init.js +102 -0
  116. package/dist/cli/handlers/lifecycle.js +1727 -0
  117. package/dist/cli/handlers/lint.js +62 -0
  118. package/dist/cli/handlers/migrate.js +48 -0
  119. package/dist/cli/handlers/misc.js +391 -0
  120. package/dist/cli/handlers/operator.js +1162 -0
  121. package/dist/cli/handlers/override-approve.js +102 -0
  122. package/dist/cli/handlers/pr.js +503 -0
  123. package/dist/cli/handlers/promote.js +342 -0
  124. package/dist/cli/handlers/run-generate.js +206 -0
  125. package/dist/cli/handlers/run-wave.js +66 -0
  126. package/dist/cli/handlers/run.js +1191 -0
  127. package/dist/cli/handlers/scenario.js +325 -0
  128. package/dist/cli/handlers/search.js +924 -0
  129. package/dist/cli/handlers/serve.js +32 -0
  130. package/dist/cli/handlers/vendor.js +154 -0
  131. package/dist/cli/index.js +3 -0
  132. package/dist/cli/is-entry-point.js +23 -0
  133. package/dist/cli/lsp/capabilities.js +28 -0
  134. package/dist/cli/lsp/diagnostics.js +34 -0
  135. package/dist/cli/lsp/server.js +329 -0
  136. package/dist/cli/main.d.ts.map +1 -1
  137. package/dist/cli/main.js +2540 -0
  138. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  139. package/dist/cli/mcp/op-tools.js +306 -0
  140. package/dist/cli/mcp/resource-handlers.js +258 -0
  141. package/dist/cli/mcp/resources/context.js +85 -0
  142. package/dist/cli/mcp/server.js +353 -0
  143. package/dist/cli/mcp/tools/build.js +111 -0
  144. package/dist/cli/mcp/tools/composites.js +95 -0
  145. package/dist/cli/mcp/tools/explain.js +166 -0
  146. package/dist/cli/mcp/tools/import.js +49 -0
  147. package/dist/cli/mcp/tools/lint.js +41 -0
  148. package/dist/cli/mcp/tools/scaffold.js +111 -0
  149. package/dist/cli/mcp/tools/search.js +112 -0
  150. package/dist/cli/mcp/types.js +1 -0
  151. package/dist/cli/mcp/workspace-plugins.js +91 -0
  152. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  153. package/dist/cli/mcp/workspace-tools.js +564 -0
  154. package/dist/cli/mcp-config.js +70 -0
  155. package/dist/cli/plugins.js +313 -0
  156. package/dist/cli/registry.js +23 -0
  157. package/dist/cli/reporters/stylish.js +329 -0
  158. package/dist/cli/version.js +15 -0
  159. package/dist/cli/watch.js +79 -0
  160. package/dist/codegen/bound-property-types.js +82 -0
  161. package/dist/codegen/coverage.js +119 -0
  162. package/dist/codegen/docs-file-markers.js +60 -0
  163. package/dist/codegen/docs-pages.js +115 -0
  164. package/dist/codegen/docs-rule-scanning.js +164 -0
  165. package/dist/codegen/docs-rules.js +76 -0
  166. package/dist/codegen/docs-sections.js +117 -0
  167. package/dist/codegen/docs-sidebar.js +65 -0
  168. package/dist/codegen/docs-types.js +4 -0
  169. package/dist/codegen/docs.js +356 -0
  170. package/dist/codegen/fetch.js +340 -0
  171. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  172. package/dist/codegen/generate-registry.js +71 -0
  173. package/dist/codegen/generate-runtime-index.js +56 -0
  174. package/dist/codegen/generate-typescript.js +119 -0
  175. package/dist/codegen/generate.js +115 -0
  176. package/dist/codegen/json-patch.js +141 -0
  177. package/dist/codegen/json-schema-to-ts.js +344 -0
  178. package/dist/codegen/json-schema.js +246 -0
  179. package/dist/codegen/lexicon-regen.js +412 -0
  180. package/dist/codegen/naming.js +217 -0
  181. package/dist/codegen/okf-lexicon.js +245 -0
  182. package/dist/codegen/package.js +150 -0
  183. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  184. package/dist/codegen/pinned-upgrade.js +494 -0
  185. package/dist/codegen/registry.js +60 -0
  186. package/dist/codegen/rehype-base-url.mjs +68 -0
  187. package/dist/codegen/rolling-upgrade.js +217 -0
  188. package/dist/codegen/surface-snapshot.js +537 -0
  189. package/dist/codegen/testdata/postgres-tags.json +242 -0
  190. package/dist/codegen/topo-sort.js +36 -0
  191. package/dist/codegen/typecheck.js +115 -0
  192. package/dist/codegen/validate.js +200 -0
  193. package/dist/codegen/version-bump.js +35 -0
  194. package/dist/components/auto-release.js +143 -0
  195. package/dist/components/builders.js +47 -0
  196. package/dist/components/capability-plugin-loader.js +175 -0
  197. package/dist/components/capability-plugin-schema.js +46 -0
  198. package/dist/components/capability-plugin.js +99 -0
  199. package/dist/components/capability.js +60 -0
  200. package/dist/components/changed-files.js +72 -0
  201. package/dist/components/cli-support.js +427 -0
  202. package/dist/components/component.js +120 -0
  203. package/dist/components/component.schema.json +271 -0
  204. package/dist/components/config-defaults.js +130 -0
  205. package/dist/components/deploy-units.js +60 -0
  206. package/dist/components/discover.d.ts.map +1 -1
  207. package/dist/components/discover.js +189 -0
  208. package/dist/components/driver-output.js +86 -0
  209. package/dist/components/driver.js +728 -0
  210. package/dist/components/fan-out-output.js +165 -0
  211. package/dist/components/fan-out-record.js +94 -0
  212. package/dist/components/fan-out-run.js +373 -0
  213. package/dist/components/fan-out-support.js +60 -0
  214. package/dist/components/fan-out.js +273 -0
  215. package/dist/components/gate-plan.js +41 -0
  216. package/dist/components/gated-wave-pipeline.js +46 -0
  217. package/dist/components/index.js +24 -0
  218. package/dist/components/layers.js +28 -0
  219. package/dist/components/manifest-persistence.js +108 -0
  220. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  221. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  222. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  223. package/dist/components/pilots/lambda.pilot.js +52 -0
  224. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  225. package/dist/components/pilots/project.js +12 -0
  226. package/dist/components/pr-pipeline.d.ts.map +1 -1
  227. package/dist/components/pr-pipeline.js +135 -0
  228. package/dist/components/pr-run.js +363 -0
  229. package/dist/components/presets/ecs-fargate.js +72 -0
  230. package/dist/components/presets/index.js +28 -0
  231. package/dist/components/presets/lambda.js +34 -0
  232. package/dist/components/presets/single-host-compose.js +41 -0
  233. package/dist/components/promote.js +549 -0
  234. package/dist/components/registry.js +34 -0
  235. package/dist/components/run-progress.js +33 -0
  236. package/dist/components/sandbox/driver.d.ts.map +1 -1
  237. package/dist/components/sandbox/driver.js +93 -0
  238. package/dist/components/sandbox/run.js +115 -0
  239. package/dist/components/starter-plugin.js +104 -0
  240. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  241. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  242. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  243. package/dist/components/verbs/bom-writer.js +287 -0
  244. package/dist/components/verbs/build-archive.js +188 -0
  245. package/dist/components/verbs/build.js +142 -0
  246. package/dist/components/verbs/cloud-executor.js +110 -0
  247. package/dist/components/verbs/component-bom.js +125 -0
  248. package/dist/components/verbs/ensure-secret.js +50 -0
  249. package/dist/components/verbs/index.js +61 -0
  250. package/dist/components/verbs/license-policy.js +75 -0
  251. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  252. package/dist/components/verbs/process-runner.js +78 -0
  253. package/dist/components/verbs/r2-sync.js +93 -0
  254. package/dist/components/verbs/reproducibility.js +62 -0
  255. package/dist/components/verbs/run-agent.js +577 -0
  256. package/dist/components/verbs/sbom-generator.js +119 -0
  257. package/dist/components/verbs/sbom.js +97 -0
  258. package/dist/components/verbs/shell.js +32 -0
  259. package/dist/components/verbs/sign.js +221 -0
  260. package/dist/components/verbs/stub.js +28 -0
  261. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  262. package/dist/components/verbs/verify.js +112 -0
  263. package/dist/components/verbs/vex.js +131 -0
  264. package/dist/components/verbs/vuln-gate.js +152 -0
  265. package/dist/components/verbs/vuln-scan.js +288 -0
  266. package/dist/components/verbs/wait-verify.js +106 -0
  267. package/dist/components/verbs/wrangler.js +179 -0
  268. package/dist/components/wave-plan.js +102 -0
  269. package/dist/composite.d.ts +10 -2
  270. package/dist/composite.d.ts.map +1 -1
  271. package/dist/composite.js +313 -0
  272. package/dist/config-import.d.ts.map +1 -1
  273. package/dist/config-import.js +22 -0
  274. package/dist/config-sandbox.js +122 -0
  275. package/dist/config-static.js +206 -0
  276. package/dist/config.js +605 -0
  277. package/dist/content-digest.js +23 -0
  278. package/dist/declarable.js +114 -0
  279. package/dist/deep-observation.js +437 -0
  280. package/dist/detectLexicon.js +54 -0
  281. package/dist/discovery/cache.js +70 -0
  282. package/dist/discovery/collect.d.ts +2 -1
  283. package/dist/discovery/collect.d.ts.map +1 -1
  284. package/dist/discovery/collect.js +223 -0
  285. package/dist/discovery/cycles.js +95 -0
  286. package/dist/discovery/entity-wire-codec.js +391 -0
  287. package/dist/discovery/entity-wire.js +42 -0
  288. package/dist/discovery/files.js +121 -0
  289. package/dist/discovery/fold-import.d.ts.map +1 -1
  290. package/dist/discovery/fold-import.js +4073 -0
  291. package/dist/discovery/fold-rank.js +292 -0
  292. package/dist/discovery/graph.js +115 -0
  293. package/dist/discovery/host-composite.d.ts +35 -0
  294. package/dist/discovery/host-composite.d.ts.map +1 -0
  295. package/dist/discovery/host-composite.js +93 -0
  296. package/dist/discovery/import.d.ts.map +1 -1
  297. package/dist/discovery/import.js +65 -0
  298. package/dist/discovery/index.d.ts +9 -0
  299. package/dist/discovery/index.d.ts.map +1 -1
  300. package/dist/discovery/index.js +333 -0
  301. package/dist/discovery/param-deps.js +487 -0
  302. package/dist/discovery/resolve.js +39 -0
  303. package/dist/discovery/sandbox/bundle.js +214 -0
  304. package/dist/discovery/sandbox/child-errors.js +26 -0
  305. package/dist/discovery/sandbox/config-run.js +100 -0
  306. package/dist/discovery/sandbox/config-wire.js +183 -0
  307. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  308. package/dist/discovery/sandbox/driver.js +333 -0
  309. package/dist/discovery/sandbox/fork.js +229 -0
  310. package/dist/discovery/sandbox/policy-run.js +142 -0
  311. package/dist/discovery/sandbox/policy-wire.js +152 -0
  312. package/dist/discovery/sandbox/run.js +77 -0
  313. package/dist/discovery/specifier-resolve.js +320 -0
  314. package/dist/discovery/walk.js +284 -0
  315. package/dist/effect-receipt.js +340 -0
  316. package/dist/env.js +55 -0
  317. package/dist/errors.js +62 -0
  318. package/dist/fold/fold.js +1434 -0
  319. package/dist/fold/foldable-helpers.js +229 -0
  320. package/dist/fold/subset.js +696 -0
  321. package/dist/fold-provenance.js +414 -0
  322. package/dist/gate-decision.d.ts +20 -9
  323. package/dist/gate-decision.d.ts.map +1 -1
  324. package/dist/gate-decision.js +313 -0
  325. package/dist/gate-resume-run.js +154 -0
  326. package/dist/gated-waves.js +165 -0
  327. package/dist/governance.js +43 -0
  328. package/dist/graph-declared.js +45 -0
  329. package/dist/graph-detail.js +207 -0
  330. package/dist/graph-dot.js +54 -0
  331. package/dist/graph-effective.js +107 -0
  332. package/dist/graph-ir.js +623 -0
  333. package/dist/graph-layout.js +184 -0
  334. package/dist/graph-lens.js +105 -0
  335. package/dist/graph-mermaid.js +83 -0
  336. package/dist/graph-ops.js +39 -0
  337. package/dist/graph-refs.js +156 -0
  338. package/dist/held-elsewhere.js +87 -0
  339. package/dist/identity.js +251 -0
  340. package/dist/import/base-parser.js +34 -0
  341. package/dist/import/embedded.js +255 -0
  342. package/dist/import/generator.js +1 -0
  343. package/dist/import/ir-utils.js +85 -0
  344. package/dist/import/parser-options.js +45 -0
  345. package/dist/import/parser.js +1 -0
  346. package/dist/index.js +118 -0
  347. package/dist/intrinsic-interpolation.js +73 -0
  348. package/dist/intrinsic.js +31 -0
  349. package/dist/join-key.js +35 -0
  350. package/dist/kubectl-context.js +150 -0
  351. package/dist/lexicon-config.js +58 -0
  352. package/dist/lexicon-integrity.js +47 -0
  353. package/dist/lexicon-manifest.js +70 -0
  354. package/dist/lexicon-module.d.ts.map +1 -1
  355. package/dist/lexicon-module.js +241 -0
  356. package/dist/lexicon-output.js +218 -0
  357. package/dist/lexicon-plugin-helpers.js +104 -0
  358. package/dist/lexicon-schema.js +136 -0
  359. package/dist/lexicon.js +130 -0
  360. package/dist/lifecycle/affected.js +224 -0
  361. package/dist/lifecycle/assert-live.js +110 -0
  362. package/dist/lifecycle/build-ledger-store.js +160 -0
  363. package/dist/lifecycle/build-ledger.js +155 -0
  364. package/dist/lifecycle/change-set.js +356 -0
  365. package/dist/lifecycle/converge-ledger.js +161 -0
  366. package/dist/lifecycle/deep-diff.js +233 -0
  367. package/dist/lifecycle/deep-observe.js +147 -0
  368. package/dist/lifecycle/digest.js +143 -0
  369. package/dist/lifecycle/disruption.js +135 -0
  370. package/dist/lifecycle/gate-applied.js +113 -0
  371. package/dist/lifecycle/gate-audit.d.ts +69 -2
  372. package/dist/lifecycle/gate-audit.d.ts.map +1 -1
  373. package/dist/lifecycle/gate-audit.js +415 -0
  374. package/dist/lifecycle/gate-ledger-select.js +89 -0
  375. package/dist/lifecycle/gate-ledger.d.ts +24 -0
  376. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  377. package/dist/lifecycle/gate-ledger.js +201 -0
  378. package/dist/lifecycle/gate-origin.js +117 -0
  379. package/dist/lifecycle/gate-pending.js +58 -0
  380. package/dist/lifecycle/git.js +1182 -0
  381. package/dist/lifecycle/identity.js +58 -0
  382. package/dist/lifecycle/index.js +26 -0
  383. package/dist/lifecycle/lease.js +283 -0
  384. package/dist/lifecycle/ledger-port.js +1 -0
  385. package/dist/lifecycle/legacy-digest.js +91 -0
  386. package/dist/lifecycle/live-diff.js +274 -0
  387. package/dist/lifecycle/local-note.js +15 -0
  388. package/dist/lifecycle/member-ledger.js +122 -0
  389. package/dist/lifecycle/observation-baseline.js +155 -0
  390. package/dist/lifecycle/observe.js +375 -0
  391. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  392. package/dist/lifecycle/override-ledger.js +54 -0
  393. package/dist/lifecycle/plan-digest.js +110 -0
  394. package/dist/lifecycle/plan-ledger.js +129 -0
  395. package/dist/lifecycle/receipt-plan.js +192 -0
  396. package/dist/lifecycle/release-ledger.js +155 -0
  397. package/dist/lifecycle/release-read.js +64 -0
  398. package/dist/lifecycle/replay.js +193 -0
  399. package/dist/lifecycle/rollback.js +102 -0
  400. package/dist/lifecycle/run-ledger.js +183 -0
  401. package/dist/lifecycle/scenario-eval.js +204 -0
  402. package/dist/lifecycle/scenario.js +214 -0
  403. package/dist/lifecycle/snapshot.js +239 -0
  404. package/dist/lifecycle/status.js +447 -0
  405. package/dist/lifecycle/symptoms.js +117 -0
  406. package/dist/lifecycle/teardown.js +255 -0
  407. package/dist/lifecycle/types.js +1 -0
  408. package/dist/lifecycle/unobserved-gate.js +33 -0
  409. package/dist/lifecycle/wave-plans.js +68 -0
  410. package/dist/lifecycle/work-item-id.js +36 -0
  411. package/dist/lifecycle/work-lease.js +393 -0
  412. package/dist/lint/component-checks.js +87 -0
  413. package/dist/lint/config.js +483 -0
  414. package/dist/lint/declarative.js +122 -0
  415. package/dist/lint/discover.d.ts.map +1 -1
  416. package/dist/lint/discover.js +138 -0
  417. package/dist/lint/engine.js +246 -0
  418. package/dist/lint/knowledge-checks.js +64 -0
  419. package/dist/lint/named-checks.js +22 -0
  420. package/dist/lint/output-checks.js +87 -0
  421. package/dist/lint/output-docs.js +163 -0
  422. package/dist/lint/parser.js +33 -0
  423. package/dist/lint/pipeline-change-gate.js +70 -0
  424. package/dist/lint/policy-import.d.ts +1 -1
  425. package/dist/lint/policy-import.d.ts.map +1 -1
  426. package/dist/lint/policy-import.js +62 -0
  427. package/dist/lint/policy-sandbox.js +86 -0
  428. package/dist/lint/policy.js +122 -0
  429. package/dist/lint/post-synth.js +87 -0
  430. package/dist/lint/presets/relaxed.json +26 -0
  431. package/dist/lint/presets/strict.json +24 -24
  432. package/dist/lint/receipt-checks.js +83 -0
  433. package/dist/lint/rule-loader.d.ts.map +1 -1
  434. package/dist/lint/rule-loader.js +89 -0
  435. package/dist/lint/rule-registry.js +86 -0
  436. package/dist/lint/rule.js +1 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  441. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  442. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  443. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  444. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  445. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  446. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  447. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  448. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  449. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  450. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  451. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  452. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  453. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  454. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  455. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  456. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  457. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  458. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  459. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  460. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  461. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  462. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  463. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  464. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  465. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  466. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  467. package/dist/lint/rules/comp/index.js +33 -0
  468. package/dist/lint/rules/comp/support.js +129 -0
  469. package/dist/lint/rules/composite-scope.js +51 -0
  470. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  471. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  472. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  473. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  474. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  475. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  476. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  477. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  478. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  479. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  480. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  481. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  482. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  483. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  484. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  485. package/dist/lint/rules/export-required.js +115 -0
  486. package/dist/lint/rules/file-declarable-limit.js +88 -0
  487. package/dist/lint/rules/flat-declarations.js +62 -0
  488. package/dist/lint/rules/index.js +90 -0
  489. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  490. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  491. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  492. package/dist/lint/rules/no-string-ref.js +59 -0
  493. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  494. package/dist/lint/rules/no-unused-declarable.js +142 -0
  495. package/dist/lint/rules/op/index.js +28 -0
  496. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  497. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  498. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  499. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  500. package/dist/lint/rules/op/support.js +11 -0
  501. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  502. package/dist/lint/rules/property-kind.js +56 -0
  503. package/dist/lint/rules/single-concern-file.js +71 -0
  504. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  505. package/dist/lint/selectors.js +168 -0
  506. package/dist/lint/suppressions.js +129 -0
  507. package/dist/lint/typescript.js +17 -0
  508. package/dist/live-endpoint.js +113 -0
  509. package/dist/live-read-session.js +76 -0
  510. package/dist/lsp/lexicon-providers.js +163 -0
  511. package/dist/lsp/types.js +5 -0
  512. package/dist/managed-fields.js +293 -0
  513. package/dist/mcp/types.js +4 -0
  514. package/dist/notify-verify.js +0 -1
  515. package/dist/notify.js +0 -1
  516. package/dist/notify.schema.json +72 -0
  517. package/dist/observation.js +266 -0
  518. package/dist/okf-read.js +134 -0
  519. package/dist/okf.js +275 -0
  520. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  521. package/dist/op/activities/activity-contracts.d.ts +1 -1
  522. package/dist/op/activities/activity-contracts.js +313 -0
  523. package/dist/op/activities/apply.js +582 -0
  524. package/dist/op/activities/build.js +18 -0
  525. package/dist/op/activities/change-coverage.js +40 -0
  526. package/dist/op/activities/change-set.d.ts +8 -3
  527. package/dist/op/activities/change-set.d.ts.map +1 -1
  528. package/dist/op/activities/change-set.js +67 -0
  529. package/dist/op/activities/converge.js +492 -0
  530. package/dist/op/activities/decide.js +211 -0
  531. package/dist/op/activities/env-teardown.js +110 -0
  532. package/dist/op/activities/factory.js +591 -0
  533. package/dist/op/activities/forge-pull-request.js +82 -0
  534. package/dist/op/activities/gh-host.js +78 -0
  535. package/dist/op/activities/guard-validate.js +165 -0
  536. package/dist/op/activities/http-check.js +40 -0
  537. package/dist/op/activities/index.js +59 -0
  538. package/dist/op/activities/lexicon-upgrade.js +629 -0
  539. package/dist/op/activities/lifecycle.js +109 -0
  540. package/dist/op/activities/pipeline-audit.js +147 -0
  541. package/dist/op/activities/policy.js +26 -0
  542. package/dist/op/activities/predict-behaviour.js +341 -0
  543. package/dist/op/activities/propose-upgrade.js +165 -0
  544. package/dist/op/activities/reconcile.d.ts +28 -16
  545. package/dist/op/activities/reconcile.d.ts.map +1 -1
  546. package/dist/op/activities/reconcile.js +1011 -0
  547. package/dist/op/activities/shell.js +118 -0
  548. package/dist/op/activities/source-release.js +97 -0
  549. package/dist/op/activities/source-rollback.js +165 -0
  550. package/dist/op/activities/teardown.js +17 -0
  551. package/dist/op/activities/util.js +6 -0
  552. package/dist/op/activities/wait.js +51 -0
  553. package/dist/op/activities/work-evidence.js +35 -0
  554. package/dist/op/activities/workflow-audit.js +133 -0
  555. package/dist/op/activity-contract-registry.js +106 -0
  556. package/dist/op/activity-contract.js +232 -0
  557. package/dist/op/activity-failure.js +31 -0
  558. package/dist/op/activity-profiles.js +129 -0
  559. package/dist/op/activity-registry.js +105 -0
  560. package/dist/op/activity-runtime.js +28 -0
  561. package/dist/op/builders.d.ts +1 -1
  562. package/dist/op/builders.d.ts.map +1 -1
  563. package/dist/op/builders.js +801 -0
  564. package/dist/op/change-signal.js +118 -0
  565. package/dist/op/composites/apply-op.js +151 -0
  566. package/dist/op/composites/behaviour-op.js +65 -0
  567. package/dist/op/composites/converge-op.js +141 -0
  568. package/dist/op/composites/index.js +19 -0
  569. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  570. package/dist/op/composites/pipeline-audit-op.js +50 -0
  571. package/dist/op/composites/reconcile-op.js +84 -0
  572. package/dist/op/composites/watch-op.js +69 -0
  573. package/dist/op/composites/workflow-audit-op.js +57 -0
  574. package/dist/op/converge-rule.js +205 -0
  575. package/dist/op/cron.js +146 -0
  576. package/dist/op/decide-backend.js +181 -0
  577. package/dist/op/decide-config.js +68 -0
  578. package/dist/op/decide-read-inputs.js +141 -0
  579. package/dist/op/discover.d.ts.map +1 -1
  580. package/dist/op/discover.js +213 -0
  581. package/dist/op/duration.js +21 -0
  582. package/dist/op/emulator-freshness.js +80 -0
  583. package/dist/op/emulator-lifecycle.js +269 -0
  584. package/dist/op/factory.js +83 -0
  585. package/dist/op/gate-approval.js +172 -0
  586. package/dist/op/gate-name.js +86 -0
  587. package/dist/op/gate-plan-context.js +167 -0
  588. package/dist/op/gate-point-run.js +67 -0
  589. package/dist/op/gate-point.js +111 -0
  590. package/dist/op/gate-resume-plan.js +155 -0
  591. package/dist/op/gate-resume.js +31 -0
  592. package/dist/op/gate-review.js +290 -0
  593. package/dist/op/gate-run-locator.js +85 -0
  594. package/dist/op/gate-summary.js +100 -0
  595. package/dist/op/gate-wait.js +56 -0
  596. package/dist/op/gate.js +449 -0
  597. package/dist/op/generate-pipeline.js +124 -0
  598. package/dist/op/index.js +51 -0
  599. package/dist/op/lifecycle-receipt-store.js +45 -0
  600. package/dist/op/local-executor.js +1164 -0
  601. package/dist/op/local-output.js +140 -0
  602. package/dist/op/op-ir.js +317 -0
  603. package/dist/op/op-verb-class.js +131 -0
  604. package/dist/op/op-waves-notify.js +136 -0
  605. package/dist/op/op-waves-run.d.ts +1 -1
  606. package/dist/op/op-waves-run.d.ts.map +1 -1
  607. package/dist/op/op-waves-run.js +1657 -0
  608. package/dist/op/op-waves.js +409 -0
  609. package/dist/op/operator.js +743 -0
  610. package/dist/op/receipt-store.js +94 -0
  611. package/dist/op/resource.js +23 -0
  612. package/dist/op/run-context.js +28 -0
  613. package/dist/op/run-live.js +256 -0
  614. package/dist/op/runtime.js +21 -0
  615. package/dist/op/runtimes/local.js +195 -0
  616. package/dist/op/source-archive.js +131 -0
  617. package/dist/op/step-output-ref.js +397 -0
  618. package/dist/op/steward-beside.js +169 -0
  619. package/dist/op/steward-points.js +138 -0
  620. package/dist/op/steward-turn.js +59 -0
  621. package/dist/op/steward.js +317 -0
  622. package/dist/op/types.js +25 -0
  623. package/dist/op/work-lease-decl.js +81 -0
  624. package/dist/op/work-lease-run.js +393 -0
  625. package/dist/override-gate.js +284 -0
  626. package/dist/owner-chain.js +74 -0
  627. package/dist/ownership.js +92 -0
  628. package/dist/params.js +61 -0
  629. package/dist/plan-summary.js +711 -0
  630. package/dist/point-decision.js +211 -0
  631. package/dist/pr-forge.js +810 -0
  632. package/dist/pr-loop.js +203 -0
  633. package/dist/project-codegen.js +191 -0
  634. package/dist/project-root.js +74 -0
  635. package/dist/project-validation.js +50 -0
  636. package/dist/provenance.js +157 -0
  637. package/dist/pseudo-parameter.js +40 -0
  638. package/dist/reconcile.js +450 -0
  639. package/dist/resource-attributes.js +33 -0
  640. package/dist/runtime-adapter.js +77 -0
  641. package/dist/runtime.js +66 -0
  642. package/dist/secret-materialization.js +153 -0
  643. package/dist/secret-provenance.js +250 -0
  644. package/dist/serializer-walker.js +112 -0
  645. package/dist/serializer.js +1 -0
  646. package/dist/sort.js +45 -0
  647. package/dist/stack-output.js +115 -0
  648. package/dist/telemetry-attribution.js +149 -0
  649. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  650. package/dist/terraform/adopt-state.js +40 -0
  651. package/dist/terraform/aws-resources.js +384 -0
  652. package/dist/terraform/bridge.js +204 -0
  653. package/dist/terraform/carve-provider.js +155 -0
  654. package/dist/terraform/carve.js +138 -0
  655. package/dist/terraform/data-source-shape.js +57 -0
  656. package/dist/terraform/emit-source.js +36 -0
  657. package/dist/terraform/excise.js +123 -0
  658. package/dist/terraform/graduate.js +128 -0
  659. package/dist/terraform/graph.js +435 -0
  660. package/dist/terraform/hcl2json.js +60 -0
  661. package/dist/terraform/manifest.js +149 -0
  662. package/dist/terraform/parse.js +81 -0
  663. package/dist/terraform/providers/aws.js +146 -0
  664. package/dist/terraform/providers/gcp.js +294 -0
  665. package/dist/terraform/providers/index.js +17 -0
  666. package/dist/terraform/providers/kubernetes.js +253 -0
  667. package/dist/terraform/score.js +151 -0
  668. package/dist/terraform/state.js +67 -0
  669. package/dist/terraform/tier-map.js +74 -0
  670. package/dist/terraform/types.js +13 -0
  671. package/dist/terraform/unified-diff.js +132 -0
  672. package/dist/testing.js +295 -0
  673. package/dist/toml-emit.js +153 -0
  674. package/dist/toml-parse.js +355 -0
  675. package/dist/toml-utils.js +60 -0
  676. package/dist/toml.js +428 -0
  677. package/dist/ts-loader.d.ts +46 -0
  678. package/dist/ts-loader.d.ts.map +1 -0
  679. package/dist/ts-loader.js +103 -0
  680. package/dist/types.js +1 -0
  681. package/dist/utils.js +61 -0
  682. package/dist/validation.js +20 -0
  683. package/dist/vendor/js-yaml-load.js +1662 -0
  684. package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
  685. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  686. package/dist/workspace/__fixtures__/contract-repo.js +119 -0
  687. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  688. package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
  689. package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
  690. package/dist/workspace/__fixtures__/sessions.js +91 -0
  691. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  692. package/dist/workspace/agent-cli.js +99 -0
  693. package/dist/workspace/agent.schema.json +390 -0
  694. package/dist/workspace/answers-ledger.js +89 -0
  695. package/dist/workspace/box-cli.js +142 -0
  696. package/dist/workspace/box-factory-write.js +196 -0
  697. package/dist/workspace/box-factory-write.schema.json +342 -0
  698. package/dist/workspace/box-factory.js +88 -0
  699. package/dist/workspace/box-intent.js +126 -0
  700. package/dist/workspace/box-isolation.js +169 -0
  701. package/dist/workspace/box-listing-write.schema.json +204 -0
  702. package/dist/workspace/box-listing.js +298 -0
  703. package/dist/workspace/box-publish.js +352 -0
  704. package/dist/workspace/box-publish.schema.json +498 -0
  705. package/dist/workspace/box-services.js +39 -0
  706. package/dist/workspace/broker-protocol.js +359 -0
  707. package/dist/workspace/broker-protocol.schema.json +228 -0
  708. package/dist/workspace/change-set.schema.json +462 -0
  709. package/dist/workspace/changes-cli.js +56 -0
  710. package/dist/workspace/changes.js +446 -0
  711. package/dist/workspace/changes.schema.json +642 -0
  712. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  713. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  714. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  715. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  716. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  717. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  718. package/dist/workspace/chant-migrations.js +113 -0
  719. package/dist/workspace/check.schema.json +433 -0
  720. package/dist/workspace/checks/box-isolation.js +62 -0
  721. package/dist/workspace/checks/boxes.js +491 -0
  722. package/dist/workspace/checks/diagrams.js +104 -0
  723. package/dist/workspace/checks/generated.js +419 -0
  724. package/dist/workspace/checks/ledgers.js +212 -0
  725. package/dist/workspace/checks/links.js +191 -0
  726. package/dist/workspace/checks/live.js +100 -0
  727. package/dist/workspace/checks/pipelines.js +188 -0
  728. package/dist/workspace/checks/records.js +169 -0
  729. package/dist/workspace/checks.js +426 -0
  730. package/dist/workspace/ci-green-cli.js +125 -0
  731. package/dist/workspace/ci-green-forge.js +83 -0
  732. package/dist/workspace/ci-green-workflow.d.ts +3 -1
  733. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  734. package/dist/workspace/ci-green-workflow.js +202 -0
  735. package/dist/workspace/ci-green.js +325 -0
  736. package/dist/workspace/ci-last-green.schema.json +158 -0
  737. package/dist/workspace/class-data.d.ts +84 -0
  738. package/dist/workspace/class-data.d.ts.map +1 -0
  739. package/dist/workspace/class-data.js +238 -0
  740. package/dist/workspace/compose-graph.js +235 -0
  741. package/dist/workspace/compose-reports.js +146 -0
  742. package/dist/workspace/composites.js +264 -0
  743. package/dist/workspace/composites.schema.json +617 -0
  744. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  745. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  746. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  747. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  748. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  749. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  750. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  751. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  752. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  753. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  754. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  755. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  756. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  757. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  758. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  759. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  760. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  761. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  762. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  763. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  764. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  765. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  766. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  767. package/dist/workspace/conformance/broker.js +736 -0
  768. package/dist/workspace/conformance/index.js +673 -0
  769. package/dist/workspace/conformance/vitest.js +108 -0
  770. package/dist/workspace/conformance/writer.js +1080 -0
  771. package/dist/workspace/decide.js +879 -0
  772. package/dist/workspace/decision-points.schema.json +135 -135
  773. package/dist/workspace/declaration-write-cli.js +74 -0
  774. package/dist/workspace/declaration-write.js +238 -0
  775. package/dist/workspace/declaration.js +938 -0
  776. package/dist/workspace/declaration.schema.json +1413 -1413
  777. package/dist/workspace/declared-kinds.js +106 -0
  778. package/dist/workspace/environments.js +164 -0
  779. package/dist/workspace/evidence.schema.json +279 -0
  780. package/dist/workspace/export-cli.js +185 -0
  781. package/dist/workspace/export.js +499 -0
  782. package/dist/workspace/factory-rules.js +175 -0
  783. package/dist/workspace/generated-files.js +92 -0
  784. package/dist/workspace/glob.js +45 -0
  785. package/dist/workspace/graph-cache.js +352 -0
  786. package/dist/workspace/graph-cli.js +348 -0
  787. package/dist/workspace/graph.schema.json +1338 -0
  788. package/dist/workspace/identity-gate-rule.js +75 -0
  789. package/dist/workspace/identity.js +126 -0
  790. package/dist/workspace/import.js +283 -0
  791. package/dist/workspace/init.js +620 -0
  792. package/dist/workspace/intent-cli.js +263 -0
  793. package/dist/workspace/intent-joins.js +201 -0
  794. package/dist/workspace/intent-record.js +352 -0
  795. package/dist/workspace/intent-record.schema.json +864 -0
  796. package/dist/workspace/intent.js +1582 -0
  797. package/dist/workspace/intent.schema.json +2420 -0
  798. package/dist/workspace/json-edit.js +221 -0
  799. package/dist/workspace/jsonc.js +235 -0
  800. package/dist/workspace/kind-readers.js +103 -0
  801. package/dist/workspace/kinds.d.ts +3 -7
  802. package/dist/workspace/kinds.d.ts.map +1 -1
  803. package/dist/workspace/kinds.js +553 -0
  804. package/dist/workspace/lexicon-symbols.js +112 -0
  805. package/dist/workspace/lineage-adopt-cli.js +102 -0
  806. package/dist/workspace/lineage-adopt.js +360 -0
  807. package/dist/workspace/lineage-check.js +282 -0
  808. package/dist/workspace/lineage-cli.js +121 -0
  809. package/dist/workspace/lineage-hash-index.js +284 -0
  810. package/dist/workspace/lineage-init.js +507 -0
  811. package/dist/workspace/lineage-lock.js +387 -0
  812. package/dist/workspace/lineage-merge.js +45 -0
  813. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  814. package/dist/workspace/lineage-migrations.js +329 -0
  815. package/dist/workspace/lineage-provenance.js +36 -0
  816. package/dist/workspace/lineage-update.js +138 -0
  817. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  818. package/dist/workspace/lineage-upgrade.js +889 -0
  819. package/dist/workspace/lineage-vendor.js +171 -0
  820. package/dist/workspace/lineage-version.js +128 -0
  821. package/dist/workspace/lineage-versions.js +275 -0
  822. package/dist/workspace/links.js +330 -0
  823. package/dist/workspace/ls-generated.js +95 -0
  824. package/dist/workspace/ls.js +277 -0
  825. package/dist/workspace/ls.schema.json +333 -0
  826. package/dist/workspace/member-commands.js +508 -0
  827. package/dist/workspace/member-handles.js +216 -0
  828. package/dist/workspace/member-pipeline.js +258 -0
  829. package/dist/workspace/member-run.js +117 -0
  830. package/dist/workspace/member-write.schema.json +193 -0
  831. package/dist/workspace/nested-graph.js +156 -0
  832. package/dist/workspace/nesting.js +38 -0
  833. package/dist/workspace/patch.js +301 -0
  834. package/dist/workspace/patch.schema.json +321 -0
  835. package/dist/workspace/pin-cli.js +55 -0
  836. package/dist/workspace/pin-integrity.js +100 -0
  837. package/dist/workspace/plan-summary.schema.json +155 -0
  838. package/dist/workspace/point-answer.schema.json +129 -129
  839. package/dist/workspace/points-cli.js +291 -0
  840. package/dist/workspace/points-write.schema.json +660 -0
  841. package/dist/workspace/points.js +521 -0
  842. package/dist/workspace/points.schema.json +916 -0
  843. package/dist/workspace/pr-report.schema.json +108 -0
  844. package/dist/workspace/principal-classes.d.ts +4 -11
  845. package/dist/workspace/principal-classes.d.ts.map +1 -1
  846. package/dist/workspace/principal-classes.js +162 -0
  847. package/dist/workspace/reason-codes.js +326 -0
  848. package/dist/workspace/record-assets.js +151 -0
  849. package/dist/workspace/record-decided.js +105 -0
  850. package/dist/workspace/record-sessions.js +96 -0
  851. package/dist/workspace/record-source.js +114 -0
  852. package/dist/workspace/records-amend.schema.json +284 -0
  853. package/dist/workspace/records-checkout.js +76 -0
  854. package/dist/workspace/records-cli.js +707 -0
  855. package/dist/workspace/records-close.js +116 -0
  856. package/dist/workspace/records-close.schema.json +278 -0
  857. package/dist/workspace/records-new.schema.json +202 -0
  858. package/dist/workspace/records-review.schema.json +367 -0
  859. package/dist/workspace/records-since.js +317 -0
  860. package/dist/workspace/records-since.schema.json +218 -0
  861. package/dist/workspace/records-write.js +1229 -0
  862. package/dist/workspace/records.js +1345 -0
  863. package/dist/workspace/records.schema.json +604 -0
  864. package/dist/workspace/reference-kinds/app/package.json +10 -0
  865. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  866. package/dist/workspace/returns.js +303 -0
  867. package/dist/workspace/root-refusal.js +75 -0
  868. package/dist/workspace/run-statement.schema.json +622 -0
  869. package/dist/workspace/runs-cli.js +584 -0
  870. package/dist/workspace/runs-write.schema.json +994 -0
  871. package/dist/workspace/runs.js +708 -0
  872. package/dist/workspace/runs.schema.json +1257 -0
  873. package/dist/workspace/runtimes.js +76 -0
  874. package/dist/workspace/session-kinds.js +83 -0
  875. package/dist/workspace/signers.schema.json +206 -0
  876. package/dist/workspace/source-block.js +125 -0
  877. package/dist/workspace/squash.js +177 -0
  878. package/dist/workspace/status-gates.js +162 -0
  879. package/dist/workspace/status-stewards.js +330 -0
  880. package/dist/workspace/status.js +514 -0
  881. package/dist/workspace/status.schema.json +998 -0
  882. package/dist/workspace/steward-index.js +191 -0
  883. package/dist/workspace/symbols.js +188 -0
  884. package/dist/workspace/template-manifest.js +227 -0
  885. package/dist/workspace/template-pins.js +115 -0
  886. package/dist/workspace/trailer-joins.js +65 -0
  887. package/dist/workspace/trailers.js +111 -0
  888. package/dist/workspace/tree.js +136 -0
  889. package/dist/workspace/trust/attestor.js +63 -0
  890. package/dist/workspace/trust/dsse.js +108 -0
  891. package/dist/workspace/trust/evidence-cli.js +175 -0
  892. package/dist/workspace/trust/evidence.js +161 -0
  893. package/dist/workspace/trust/gate-seal.js +226 -0
  894. package/dist/workspace/trust/policy.js +190 -0
  895. package/dist/workspace/trust/provenance.js +180 -0
  896. package/dist/workspace/trust/rotation.js +298 -0
  897. package/dist/workspace/trust/run-commits.js +101 -0
  898. package/dist/workspace/trust/run-statement.js +182 -0
  899. package/dist/workspace/trust/seal.js +272 -0
  900. package/dist/workspace/trust/signers-cli.js +152 -0
  901. package/dist/workspace/trust/ssh-commit.js +178 -0
  902. package/dist/workspace/trust/test-repo.js +118 -0
  903. package/dist/workspace/trust/trust-files.js +193 -0
  904. package/dist/workspace/trust/verify-cli.js +63 -0
  905. package/dist/workspace/trust/verify.js +192 -0
  906. package/dist/workspace/which-chant.js +141 -0
  907. package/dist/workspace/wip-cli.js +95 -0
  908. package/dist/workspace/wip-write.schema.json +504 -0
  909. package/dist/workspace/wip.js +631 -0
  910. package/dist/workspace/wip.schema.json +334 -0
  911. package/dist/workspace/work-cli.js +448 -0
  912. package/dist/workspace/work-evidence.js +122 -0
  913. package/dist/workspace/work-evidence.schema.json +222 -0
  914. package/dist/workspace/work-history.schema.json +421 -0
  915. package/dist/workspace/work-lease.schema.json +246 -0
  916. package/dist/workspace/work-size.js +77 -0
  917. package/dist/workspace/work.js +283 -0
  918. package/dist/workspace/workspace-kinds.schema.json +259 -259
  919. package/dist/workspace/workspace-principals.schema.json +53 -53
  920. package/dist/workspace/write-lock-cli.js +105 -0
  921. package/dist/workspace/write-lock.js +424 -0
  922. package/dist/workspace/write-lock.schema.json +172 -0
  923. package/dist/workspace/write-scope.js +484 -0
  924. package/dist/yaml.js +459 -0
  925. package/package.json +2 -2
  926. package/src/build.ts +8 -0
  927. package/src/change-set.test.ts +48 -0
  928. package/src/change-set.ts +52 -2
  929. package/src/ci-jobs.test.ts +49 -0
  930. package/src/ci-jobs.ts +515 -0
  931. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  932. package/src/cli/commands/lint.ts +3 -0
  933. package/src/cli/commands/migrate.ts +2 -0
  934. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  935. package/src/cli/main.ts +121 -27
  936. package/src/cli/mcp/workspace-tools.ts +1 -1
  937. package/src/codegen/pinned-upgrade.ts +2 -0
  938. package/src/components/discover.ts +2 -0
  939. package/src/components/pr-pipeline.ts +3 -2
  940. package/src/components/sandbox/driver.ts +3 -1
  941. package/src/composite.ts +15 -3
  942. package/src/config-import.ts +3 -0
  943. package/src/discovery/collect.ts +15 -1
  944. package/src/discovery/fold-build-parity.test.ts +71 -0
  945. package/src/discovery/fold-import.ts +25 -127
  946. package/src/discovery/fold-project-provenance.test.ts +21 -4
  947. package/src/discovery/host-composite.ts +101 -0
  948. package/src/discovery/import.ts +2 -0
  949. package/src/discovery/index.ts +11 -1
  950. package/src/discovery/sandbox/driver.ts +3 -1
  951. package/src/gate-decision-bundle.test.ts +5 -4
  952. package/src/gate-decision-identity.test.ts +59 -6
  953. package/src/gate-decision.ts +81 -21
  954. package/src/lexicon-module.ts +3 -0
  955. package/src/lifecycle/gate-audit.test.ts +55 -1
  956. package/src/lifecycle/gate-audit.ts +116 -3
  957. package/src/lifecycle/gate-ledger.test.ts +20 -1
  958. package/src/lifecycle/gate-ledger.ts +33 -1
  959. package/src/lint/config.ts +1 -1
  960. package/src/lint/discover.ts +28 -8
  961. package/src/lint/policy-import.ts +4 -1
  962. package/src/lint/rule-loader.ts +2 -0
  963. package/src/op/activities/activity-contracts.ts +1 -1
  964. package/src/op/activities/change-set.ts +11 -3
  965. package/src/op/activities/lexicon-upgrade.test.ts +2 -0
  966. package/src/op/activities/reconcile.test.ts +62 -2
  967. package/src/op/activities/reconcile.ts +46 -22
  968. package/src/op/builders.ts +1 -1
  969. package/src/op/discover.ts +3 -0
  970. package/src/op/op-waves-run.ts +4 -3
  971. package/src/op/op-waves.test.ts +2 -0
  972. package/src/op/work-lease-run.test.ts +12 -4
  973. package/src/ts-loader.test.ts +23 -0
  974. package/src/ts-loader.ts +122 -0
  975. package/src/workspace/__fixtures__/contract-repo.ts +17 -1
  976. package/src/workspace/__fixtures__/sessions.ts +3 -3
  977. package/src/workspace/change-set.schema.json +5 -3
  978. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  979. package/src/workspace/ci-green-workflow.test.ts +4 -4
  980. package/src/workspace/ci-green-workflow.ts +5 -2
  981. package/src/workspace/class-data.test.ts +64 -0
  982. package/src/workspace/class-data.ts +236 -0
  983. package/src/workspace/declaration.ts +1 -1
  984. package/src/workspace/kinds.ts +7 -36
  985. package/src/workspace/lineage-migrations.ts +2 -0
  986. package/src/workspace/points.ts +1 -1
  987. package/src/workspace/principal-classes.ts +12 -95
  988. package/src/workspace/records-formats.test.ts +7 -2
  989. package/src/workspace/records-sessions-write.test.ts +3 -3
  990. package/src/workspace/status-contract.e2e.test.ts +37 -0
  991. package/src/workspace/status-contract.test.ts +23 -21
@@ -0,0 +1,633 @@
1
+ /**
2
+ * Unified, detectTemplate-driven discovery (prototype for #391).
3
+ *
4
+ * Today `commands/audit.ts` ships six bespoke discoverers — `discoverManifests`,
5
+ * `discoverGcp`, `discoverCloudFormation`, `discoverArm`, `discoverDocker`,
6
+ * `discoverHelm` — each walking the tree and re-implementing a `looksLike*`
7
+ * content heuristic that mostly duplicates the lexicon plugin's own
8
+ * `detectTemplate(parsed)` (already used by `chant import`).
9
+ *
10
+ * This module collapses that into ONE walk plus a single content-detection
11
+ * pass that delegates to each plugin's `detectTemplate`. A new content-detected
12
+ * lexicon then needs only a `detectTemplate` and a precedence entry — no new
13
+ * walk, no new heuristic.
14
+ *
15
+ * It is deliberately a HYBRID, because some classification can't be expressed
16
+ * by content shape alone:
17
+ * - CI (github/forgejo/gitlab) stays a PATH fast-path. github and forgejo
18
+ * workflows are byte-for-byte the same shape (`on:` + `jobs:`), so only the
19
+ * directory (`.github` vs `.forgejo`) disambiguates them.
20
+ * - Dockerfiles are matched by FILENAME — they aren't YAML/JSON, so
21
+ * `detectTemplate` (which only knows Compose's `services:`) can't see them.
22
+ * - Helm charts are a directory BUNDLE keyed by `Chart.yaml`; the helm checks
23
+ * read `output.files`, so the whole chart is one AuditInput.
24
+ * - Terraform is also a directory BUNDLE, keyed by that directory's own
25
+ * `.tf` filenames, not recursively: a nested directory with its own
26
+ * `.tf` files (e.g. `modules/foo`) is its own AuditInput, UNLESS another
27
+ * directory's `.tf` calls it as a local module, in which case it is a
28
+ * child module of that root and is parsed as part of it (#2217). `.tf`
29
+ * isn't YAML/JSON either, so `detectTemplate` can't see it.
30
+ * - k8s `detectTemplate` matches any `apiVersion`+`kind`, including GCP Config
31
+ * Connector (`cnrm.cloud.google.com`) resources and fountain
32
+ * (`fountain.dev/v1`) manifests, so gcp and fountain must be tried first.
33
+ * - aws/azure checks `JSON.parse` their input, so YAML/templated content is
34
+ * normalized to a JSON string here.
35
+ */
36
+ import { readFileSync, statSync } from "fs";
37
+ import { basename, join, relative, resolve } from "path";
38
+ import { parseYAML } from "../yaml.js";
39
+ import { isNginxConfigPath } from "./nginx.js";
40
+ import { walkDiscovery } from "../discovery/walk.js";
41
+ import { findProjectConfig } from "../project-root.js";
42
+ import { gitignoreCoversTerraformState, isTerraformStatePath, nestedGitignoreCovering } from "./terraform-state.js";
43
+ /** Lexicons the auditor knows how to detect and run checks for. */
44
+ export const AUDIT_LEXICONS = ["github", "gitlab", "forgejo", "k8s", "docker", "aws", "azure", "gcp", "helm", "fountain", "terraform"];
45
+ /**
46
+ * Load the plugins used for detection. Each is loaded in isolation (no
47
+ * cross-lexicon conflict aggregation — detection only reads `detectTemplate`),
48
+ * and a lexicon that isn't installed is skipped rather than failing the audit.
49
+ * `init()` is intentionally not called: `detectTemplate` is a pure function of
50
+ * its input and needs no plugin setup.
51
+ */
52
+ export async function loadAuditPlugins(names = AUDIT_LEXICONS) {
53
+ // Lazy import: a top-level `cli/plugins` import would pull the root barrel
54
+ // (index.ts -> lint/parser -> the TypeScript compiler) into anyone importing
55
+ // `classifyFiles`, crashing edge runtimes. Edge callers build detectors from
56
+ // static `detect` imports and never call this. See #408/#426.
57
+ const { loadPlugin } = await import("../cli/plugins.js");
58
+ const plugins = [];
59
+ for (const name of names) {
60
+ try {
61
+ plugins.push(await loadPlugin(name));
62
+ }
63
+ catch {
64
+ // lexicon package not installed — its files simply won't be detected
65
+ }
66
+ }
67
+ return plugins;
68
+ }
69
+ /** Terraform's local working directory: recorded by the walk, never entered (TF023). */
70
+ const TERRAFORM_WORK_DIR = ".terraform";
71
+ /**
72
+ * How many files the local walk takes before it stops. Every file it reaches
73
+ * counts, candidate or not, so a tree with a large `docs/` or `assets/` can hit
74
+ * it long before a thousand auditable files. `--max-files` raises it (#2528).
75
+ */
76
+ export const DEFAULT_MAX_WALK_FILES = 1000;
77
+ /** Skip absurdly large files before parsing — mirrors the fetch layer's caps. */
78
+ const MAX_FILE_BYTES = 2 * 1024 * 1024;
79
+ /**
80
+ * The project's `exclude`/`include` globs for the audit walk, read from a
81
+ * `chant.config.json` only. The audit reads repositories it has no reason to
82
+ * trust, so it never runs a `chant.config.ts` to find them.
83
+ */
84
+ function auditGlobs(root) {
85
+ const { dir, configPath } = findProjectConfig(root);
86
+ if (!configPath?.endsWith(".json"))
87
+ return undefined;
88
+ let raw;
89
+ try {
90
+ raw = JSON.parse(readFileSync(configPath, "utf-8"));
91
+ }
92
+ catch {
93
+ return undefined;
94
+ }
95
+ const list = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === "string" && x !== "") : []);
96
+ const exclude = list(raw?.exclude);
97
+ const include = list(raw?.include);
98
+ return exclude.length === 0 && include.length === 0 ? undefined : { root: dir, exclude, include };
99
+ }
100
+ /**
101
+ * Collect file paths under a root through the one discovery walk
102
+ * (`../discovery/walk.ts`, #2527), sorted per directory.
103
+ *
104
+ * The audit's own departures from the other walkers: `.github` and `.forgejo`
105
+ * are entered, since they hold the CI files it audits; `.terraform/` is
106
+ * recorded but never entered, since it is machine-generated, routinely
107
+ * hundreds of megabytes of provider binaries, and its presence is itself the
108
+ * finding (TF023); and Terraform state paths are left to TF023's own
109
+ * `.gitignore` reading rather than dropped for being git-ignored.
110
+ *
111
+ * Stops at `state.max` paths. Once full it keeps looking only until it meets
112
+ * one more path it would have taken, which is what sets `truncated`: a tree of
113
+ * exactly `max` files, or one whose remaining entries are all skipped
114
+ * directories, was not truncated.
115
+ */
116
+ function walkFiles(root, state, excludeDirs) {
117
+ return walkDiscovery({
118
+ walker: "audit",
119
+ root,
120
+ excludeDirs,
121
+ globs: auditGlobs(root),
122
+ sorted: true,
123
+ limit: state,
124
+ takeSkippedDir: (name) => name === TERRAFORM_WORK_DIR,
125
+ keepIgnored: (full) => isTerraformStatePath(relative(root, full)),
126
+ accept: () => true,
127
+ });
128
+ }
129
+ function readSafe(full) {
130
+ try {
131
+ if (statSync(full).size > MAX_FILE_BYTES)
132
+ return undefined;
133
+ return readFileSync(full, "utf-8");
134
+ }
135
+ catch {
136
+ return undefined;
137
+ }
138
+ }
139
+ function isYaml(name) {
140
+ return name.endsWith(".yml") || name.endsWith(".yaml");
141
+ }
142
+ function isDockerfileName(name) {
143
+ return name === "Dockerfile" || name.startsWith("Dockerfile.") || name.endsWith(".Dockerfile") || name.endsWith(".dockerfile");
144
+ }
145
+ function isTerraformFileName(name) {
146
+ // `terragrunt.hcl` and `root.hcl` ride in the terraform bundle (#3417): the
147
+ // terraform lexicon reads them into Terragrunt entities, apart from modules.
148
+ return /\.tf$/i.test(name) || name === "terragrunt.hcl" || name === "root.hcl";
149
+ }
150
+ /**
151
+ * Filenames the secrets scan (#443) wants that no lexicon otherwise reads —
152
+ * dotenv files and key/cert material. Included in `isCandidatePath` so both
153
+ * the local walk and the remote fetch pick them up; `classifyFiles` doesn't
154
+ * claim them for any lexicon, they just ride along for `scanForSecrets`.
155
+ */
156
+ function isSecretBearingName(name) {
157
+ if (/^\.env(\..+)?$/i.test(name))
158
+ return true;
159
+ return /\.(pem|key|crt|cer|pfx|p12)$/i.test(name);
160
+ }
161
+ /**
162
+ * `wrangler.toml` (#446) — Cloudflare Workers' declarative deploy config.
163
+ * Native TOML, so it rides along the same way secret-bearing filenames do:
164
+ * `wrangler.ts` reads it directly (no lexicon plugin, no authoring surface),
165
+ * so it only needs to be a candidate path, not a `detectTemplate` entry.
166
+ */
167
+ function isWranglerConfigName(name) {
168
+ return name === "wrangler.toml";
169
+ }
170
+ /** Split a possibly multi-document YAML string into per-doc parsed objects. */
171
+ function parseDocs(content) {
172
+ const docs = [];
173
+ for (const raw of content.split(/\n---\n/)) {
174
+ const t = raw.trim();
175
+ if (!t)
176
+ continue;
177
+ try {
178
+ const obj = parseYAML(t);
179
+ if (obj && typeof obj === "object")
180
+ docs.push(obj);
181
+ }
182
+ catch {
183
+ // a non-parseable doc just doesn't contribute a candidate
184
+ }
185
+ }
186
+ return docs;
187
+ }
188
+ /** Parse JSON or YAML content into a single object, or undefined. */
189
+ function parseStructured(content) {
190
+ try {
191
+ const j = JSON.parse(content);
192
+ if (j && typeof j === "object")
193
+ return j;
194
+ }
195
+ catch {
196
+ // not JSON — try YAML
197
+ }
198
+ try {
199
+ const y = parseYAML(content);
200
+ if (y && typeof y === "object")
201
+ return y;
202
+ }
203
+ catch {
204
+ // not YAML either
205
+ }
206
+ return undefined;
207
+ }
208
+ /** Run a plugin's detectTemplate over each parsed doc; true if any matches. */
209
+ function anyDoc(plugin, content) {
210
+ return parseDocs(content).some((doc) => plugin.detectTemplate?.(doc) ?? false);
211
+ }
212
+ /**
213
+ * Precedence-ordered content detectors. Order matters: gcp before k8s (Config
214
+ * Connector resources are also valid k8s manifests).
215
+ */
216
+ const CONTENT_DETECTORS = [
217
+ {
218
+ // GCP Config Connector — must win over k8s for cnrm.cloud.google.com docs.
219
+ lexicon: "gcp",
220
+ accepts: isYaml,
221
+ detect: (plugin, _name, content) => (anyDoc(plugin, content) ? content : null),
222
+ },
223
+ {
224
+ // fountain (`apiVersion: fountain.dev/v1`) — must win over k8s, whose
225
+ // detectTemplate matches any apiVersion+kind document (#1566).
226
+ lexicon: "fountain",
227
+ accepts: isYaml,
228
+ detect: (plugin, _name, content) => (anyDoc(plugin, content) ? content : null),
229
+ },
230
+ {
231
+ lexicon: "k8s",
232
+ accepts: isYaml,
233
+ detect: (plugin, _name, content) => (anyDoc(plugin, content) ? content : null),
234
+ },
235
+ {
236
+ // CloudFormation — JSON, YAML, or `.template`; normalized to a JSON string
237
+ // because the aws checks JSON.parse their input.
238
+ lexicon: "aws",
239
+ accepts: (name) => /\.(json|ya?ml|template)$/i.test(name),
240
+ detect: (plugin, _name, content) => {
241
+ const parsed = parseStructured(content);
242
+ return parsed && plugin.detectTemplate?.(parsed) ? JSON.stringify(parsed) : null;
243
+ },
244
+ },
245
+ {
246
+ // Azure ARM — JSON only; azure's detectTemplate takes the raw string.
247
+ lexicon: "azure",
248
+ accepts: (name) => /\.json$/i.test(name),
249
+ detect: (plugin, _name, content) => {
250
+ if (!plugin.detectTemplate?.(content))
251
+ return null;
252
+ const parsed = parseStructured(content);
253
+ return parsed ? JSON.stringify(parsed) : null;
254
+ },
255
+ },
256
+ {
257
+ // Docker Compose (services:). Dockerfiles are handled separately by name.
258
+ lexicon: "docker",
259
+ accepts: isYaml,
260
+ detect: (plugin, _name, content) => {
261
+ const parsed = parseStructured(content);
262
+ return parsed && plugin.detectTemplate?.(parsed) ? content : null;
263
+ },
264
+ },
265
+ ];
266
+ /**
267
+ * Which CI lexicon a path belongs to (by location — content can't disambiguate
268
+ * github vs forgejo). Exported for the fetch module: known-path lexicons stay a
269
+ * direct path match even in search-first (large-repo) discovery (#520).
270
+ */
271
+ export function ciLexiconForPath(path) {
272
+ if (/^\.github\/workflows\/[^/]+\.ya?ml$/.test(path))
273
+ return "github";
274
+ if (/^\.forgejo\/workflows\/[^/]+\.ya?ml$/.test(path))
275
+ return "forgejo";
276
+ if (path === ".gitlab-ci.yml")
277
+ return "gitlab";
278
+ return undefined;
279
+ }
280
+ /**
281
+ * Whether a path is worth reading/fetching at all. Bounds the local walk and,
282
+ * crucially, the remote fetch (so we never pull a whole repo's contents).
283
+ *
284
+ * nginx configs (#1979) ride along the way `wrangler.toml` does: the NGX
285
+ * scanner (`./nginx.ts`) reads them directly, no lexicon plugin — but a
286
+ * scanner can only see what this filter admits, so its own path detector is
287
+ * part of the candidate set. (Found the hard way: the checks shipped wired
288
+ * into the CLI while no `.conf` ever survived collection, so they were
289
+ * unreachable on both the local and hosted paths.) Content confirmation —
290
+ * a `conf.d/` file that isn't nginx — happens at parse time in the scanner,
291
+ * never here.
292
+ */
293
+ export function isCandidatePath(path) {
294
+ const name = basename(path);
295
+ if (ciLexiconForPath(path))
296
+ return true;
297
+ if (isDockerfileName(name))
298
+ return true;
299
+ if (name === "Chart.yaml")
300
+ return true;
301
+ if (isSecretBearingName(name))
302
+ return true;
303
+ if (isWranglerConfigName(name))
304
+ return true;
305
+ if (isNginxConfigPath(path))
306
+ return true;
307
+ return /\.(ya?ml|json|template)$/i.test(name);
308
+ }
309
+ export function hintLexiconForFile(path, content) {
310
+ const name = basename(path);
311
+ const ci = ciLexiconForPath(path);
312
+ if (ci)
313
+ return ci;
314
+ if (isDockerfileName(name))
315
+ return "docker";
316
+ if (name === "Chart.yaml")
317
+ return "helm";
318
+ if (isTerraformFileName(name))
319
+ return "terraform";
320
+ const head = content.slice(0, 64 * 1024);
321
+ if (/cnrm\.cloud\.google\.com/.test(head))
322
+ return "gcp";
323
+ if (/fountain\.dev\/v1/.test(head))
324
+ return "fountain";
325
+ if (/AWSTemplateFormatVersion|["']?Type["']?\s*:\s*["']AWS::/.test(head))
326
+ return "aws";
327
+ if (/deploymentTemplate\.json/.test(head))
328
+ return "azure";
329
+ if (isYaml(name)) {
330
+ if (/^apiVersion:/m.test(head) && /^kind:/m.test(head))
331
+ return "k8s";
332
+ if (/^services:/m.test(head))
333
+ return "docker";
334
+ }
335
+ return undefined;
336
+ }
337
+ /**
338
+ * Files no loaded lexicon claimed, paired with the lexicon core guesses they
339
+ * wanted. Only files whose guessed lexicon is absent are reported; a file an
340
+ * installed lexicon declined is that plugin's call, not a coverage gap.
341
+ */
342
+ export function unclaimedFiles(files, inputs, plugins) {
343
+ const loaded = new Set(plugins.map((p) => p.name));
344
+ const claimed = new Set();
345
+ for (const i of inputs) {
346
+ if (i.files)
347
+ for (const rel of Object.keys(i.files))
348
+ claimed.add(i.path === "." ? rel : `${i.path}/${rel}`);
349
+ else
350
+ claimed.add(i.path);
351
+ }
352
+ const out = [];
353
+ for (const f of files) {
354
+ if (claimed.has(f.path))
355
+ continue;
356
+ const lexicon = hintLexiconForFile(f.path, f.content);
357
+ if (!lexicon || loaded.has(lexicon))
358
+ continue;
359
+ out.push({ path: f.path, lexicon });
360
+ }
361
+ return out;
362
+ }
363
+ /** Collect Helm charts as bundles from an in-memory file set; returns inputs + chart path-prefixes. */
364
+ function classifyHelm(files, plugin) {
365
+ const inputs = [];
366
+ const prefixes = [];
367
+ if (!plugin)
368
+ return { inputs, prefixes };
369
+ const charts = files.filter((f) => f.path === "Chart.yaml" || f.path.endsWith("/Chart.yaml"));
370
+ for (const chartFile of charts) {
371
+ const dir = chartFile.path === "Chart.yaml" ? "" : chartFile.path.slice(0, -"/Chart.yaml".length);
372
+ const prefix = dir === "" ? "" : `${dir}/`;
373
+ const bundle = {};
374
+ for (const f of files) {
375
+ if (prefix !== "" && !f.path.startsWith(prefix))
376
+ continue;
377
+ bundle[prefix === "" ? f.path : f.path.slice(prefix.length)] = f.content;
378
+ }
379
+ const chart = bundle["Chart.yaml"];
380
+ if (chart === undefined)
381
+ continue;
382
+ const parsed = parseStructured(chart);
383
+ if (!parsed || !plugin.detectTemplate?.(parsed))
384
+ continue;
385
+ inputs.push({ path: dir || ".", content: chart, lexicon: "helm", files: bundle });
386
+ prefixes.push(prefix);
387
+ }
388
+ return { inputs, prefixes };
389
+ }
390
+ /**
391
+ * A `source` attribute naming a local path, the only module source Terraform
392
+ * reads from the repository itself. A registry or git source ("hashicorp/aws",
393
+ * "git::https://...") never starts with `./` or `../`, and `source` inside
394
+ * `required_providers` is a registry address, so the prefix is what tells the
395
+ * two apart without an HCL parser here. `classifyTerraform` uses this to tell
396
+ * a root module from a directory that is somebody's child module; the lexicon
397
+ * plugin parses the calls properly once it has the root.
398
+ */
399
+ const LOCAL_MODULE_SOURCE = /(?:^|[\s{,])source\s*=\s*"(\.{1,2}\/[^"]*)"/g;
400
+ /**
401
+ * Resolve `rel` against the repo-relative directory `dir`. Returns undefined
402
+ * when the path climbs above the audited root, which is a directory this walk
403
+ * never read and so can never be one of its inputs.
404
+ */
405
+ function resolveRepoDir(dir, rel) {
406
+ const parts = dir === "" ? [] : dir.split("/");
407
+ for (const segment of rel.split("/")) {
408
+ if (segment === "" || segment === ".")
409
+ continue;
410
+ if (segment === "..") {
411
+ if (parts.length === 0)
412
+ return undefined;
413
+ parts.pop();
414
+ continue;
415
+ }
416
+ parts.push(segment);
417
+ }
418
+ return parts.join("/");
419
+ }
420
+ /**
421
+ * The directories that are somebody's local child module: a `.tf` file in
422
+ * another directory of this walk calls them with a relative `source`.
423
+ *
424
+ * They are dropped as audit inputs of their own, because the root that calls
425
+ * them parses them as child scopes (the terraform plugin's `auditEntities`
426
+ * descends from `AuditInput.dir`, #2217). Auditing them twice would report
427
+ * every finding in them twice, once per scope, and auditing them as roots is
428
+ * what made `chant audit` disagree with `chant build` about which rules apply
429
+ * to a child module at all.
430
+ *
431
+ * A directory a cycle reaches but no root does is kept: `a` calling `b`
432
+ * calling `a` is a configuration Terraform refuses, and dropping both would
433
+ * leave the files audited by nothing.
434
+ */
435
+ function calledAsLocalModule(byDir) {
436
+ const callees = new Map();
437
+ const called = new Set();
438
+ for (const [dir, bundle] of byDir) {
439
+ const targets = new Set();
440
+ for (const [name, source] of Object.entries(bundle)) {
441
+ // A Terragrunt unit's `terraform { source = "../modules/x" }` is not a
442
+ // `module` call: the directory it names stays a root of its own (#3417).
443
+ if (name === "terragrunt.hcl" || name === "root.hcl")
444
+ continue;
445
+ for (const match of source.matchAll(LOCAL_MODULE_SOURCE)) {
446
+ const target = resolveRepoDir(dir, match[1]);
447
+ if (target === undefined || target === dir || !byDir.has(target))
448
+ continue;
449
+ targets.add(target);
450
+ called.add(target);
451
+ }
452
+ }
453
+ callees.set(dir, targets);
454
+ }
455
+ const queue = [...byDir.keys()].filter((dir) => !called.has(dir));
456
+ const reached = new Set(queue);
457
+ while (queue.length > 0) {
458
+ for (const target of callees.get(queue.shift()) ?? []) {
459
+ if (reached.has(target))
460
+ continue;
461
+ reached.add(target);
462
+ queue.push(target);
463
+ }
464
+ }
465
+ return new Set([...called].filter((dir) => reached.has(dir)));
466
+ }
467
+ /**
468
+ * Collect Terraform root modules as directory bundles from an in-memory file
469
+ * set, modeled on `classifyHelm`. Unlike a Helm chart (its whole subtree is
470
+ * one bundle), a Terraform root module references only its own sibling
471
+ * files, so grouping is by each `.tf` file's immediate directory, not
472
+ * recursive.
473
+ *
474
+ * A directory another one calls as a local module is not a root module and
475
+ * gets no input of its own (#2217): the root that calls it parses it as a
476
+ * child scope, which is what Terraform does and what `chant build` already
477
+ * did. That descent reads the child's directory from disk, so it only happens
478
+ * when `baseDir` says a local walk found these files; an in-memory file set
479
+ * with no directory behind it keeps every `.tf` directory as its own input,
480
+ * as before.
481
+ *
482
+ * Returns inputs plus the exact `.tf` paths claimed, so the loose-file pass in
483
+ * `classifyFiles` can skip them — a child module's files are claimed too, by
484
+ * the root that will parse them.
485
+ */
486
+ function classifyTerraform(files, plugin, baseDir) {
487
+ const inputs = [];
488
+ const claimed = new Set();
489
+ if (!plugin)
490
+ return { inputs, claimed };
491
+ const byDir = new Map();
492
+ for (const f of files) {
493
+ if (!isTerraformFileName(basename(f.path)))
494
+ continue;
495
+ const slash = f.path.lastIndexOf("/");
496
+ const dir = slash === -1 ? "" : f.path.slice(0, slash);
497
+ const name = slash === -1 ? f.path : f.path.slice(slash + 1);
498
+ const bundle = byDir.get(dir) ?? {};
499
+ bundle[name] = f.content;
500
+ byDir.set(dir, bundle);
501
+ claimed.add(f.path);
502
+ }
503
+ const childModules = baseDir === undefined ? new Set() : calledAsLocalModule(byDir);
504
+ for (const [dir, bundle] of byDir) {
505
+ if (childModules.has(dir))
506
+ continue;
507
+ // `content` is the whole root module, every `.tf` in filename order with a
508
+ // `# file:` line comment (legal HCL) marking each boundary, so a lexicon's
509
+ // `auditEntities(content)` sees the module Terraform itself would load,
510
+ // not one arbitrary file of it. `files` keeps the per-file split, and
511
+ // `dir` is where the local modules it calls are read from.
512
+ const content = Object.keys(bundle)
513
+ .sort()
514
+ .map((name) => `# file: ${name}\n${bundle[name]}`)
515
+ .join("\n");
516
+ inputs.push({
517
+ path: dir === "" ? "." : dir,
518
+ content,
519
+ lexicon: "terraform",
520
+ files: bundle,
521
+ ...(baseDir === undefined ? {} : { dir: resolve(baseDir, dir), baseDir }),
522
+ });
523
+ }
524
+ return { inputs, claimed };
525
+ }
526
+ /**
527
+ * Classify an in-memory set of repo files into per-lexicon audit inputs. Pure
528
+ * (no fs, no network) so the local walk and the remote tree-fetch share exactly
529
+ * one detection path. Each file maps to at most one lexicon: CI by path,
530
+ * Dockerfiles by name, Helm charts and Terraform root modules as directory
531
+ * bundles, everything else by the precedence-ordered content detectors
532
+ * (delegating to each plugin's `detectTemplate`). Lexicons whose plugin isn't
533
+ * provided are skipped.
534
+ */
535
+ export function classifyFiles(files, plugins, opts = {}) {
536
+ const byName = new Map(plugins.map((p) => [p.name, p]));
537
+ const baseDir = opts.baseDir === undefined ? undefined : resolve(opts.baseDir);
538
+ // Helm claims whole chart directories first; chart-internal files are excluded
539
+ // from the loose-file pass so templates aren't double-audited.
540
+ const helm = classifyHelm(files, byName.get("helm"));
541
+ const underChart = (p) => helm.prefixes.some((pre) => (pre === "" ? true : p.startsWith(pre)));
542
+ const terraform = classifyTerraform(files, byName.get("terraform"), baseDir);
543
+ const inputs = [...helm.inputs, ...terraform.inputs];
544
+ for (const { path, content } of files) {
545
+ if (underChart(path))
546
+ continue;
547
+ if (terraform.claimed.has(path))
548
+ continue;
549
+ const name = basename(path);
550
+ const ci = ciLexiconForPath(path);
551
+ if (ci) {
552
+ if (byName.has(ci))
553
+ inputs.push({ path, content, lexicon: ci });
554
+ continue;
555
+ }
556
+ if (isDockerfileName(name)) {
557
+ if (byName.has("docker"))
558
+ inputs.push({ path, content, lexicon: "docker" });
559
+ continue;
560
+ }
561
+ for (const det of CONTENT_DETECTORS) {
562
+ const plugin = byName.get(det.lexicon);
563
+ if (!plugin || !det.accepts(name))
564
+ continue;
565
+ const normalized = det.detect(plugin, name, content);
566
+ if (normalized !== null) {
567
+ inputs.push({ path, content: normalized, lexicon: det.lexicon });
568
+ break; // first detector in precedence wins — one lexicon per file
569
+ }
570
+ }
571
+ }
572
+ return inputs;
573
+ }
574
+ /**
575
+ * Local discovery: one filesystem walk, candidate-filtered, read into memory,
576
+ * then handed to the shared `classifyFiles`. Detection is skipped for any
577
+ * lexicon whose plugin isn't provided, so a caller can scope discovery.
578
+ */
579
+ export function discoverByDetection(root, plugins) {
580
+ return classifyFiles(collectCandidates(root), plugins, { baseDir: root });
581
+ }
582
+ /** The walk half of `discoverByDetection`: candidate files read into memory, paths relative to the root. */
583
+ export function collectCandidates(root) {
584
+ return walkCandidates(root).files;
585
+ }
586
+ /**
587
+ * `collectCandidates` plus whether the walk stopped at its limit with files
588
+ * left unread, which the audit report states (#2528).
589
+ */
590
+ export function walkCandidates(root, opts = {}) {
591
+ const state = { max: opts.maxFiles ?? DEFAULT_MAX_WALK_FILES, truncated: false };
592
+ const all = walkFiles(root, state, opts.excludeDirs);
593
+ // TF023 reads paths, not content: a `.tfstate` can be tens of megabytes of
594
+ // machine-generated JSON, and the finding is that it is in the repository at
595
+ // all. The `.gitignore` files are what separate "committed" from "merely on
596
+ // disk" here. A Terraform working tree almost always has an ignored
597
+ // `.terraform/` in it, and reporting that would make TF023 fire on every
598
+ // local audit. Every `.gitignore` from the scan root down to the file's own
599
+ // directory is read (#2528), so auditing from the root and from a
600
+ // subdirectory agree. A fetched repository has no such ambiguity (its file
601
+ // list is the tracked files) and is not filtered.
602
+ const gitignore = readSafe(join(root, ".gitignore")) ?? "";
603
+ const nestedBodies = new Map();
604
+ const nestedGitignoreAt = (dir) => {
605
+ if (!nestedBodies.has(dir))
606
+ nestedBodies.set(dir, readSafe(join(root, dir, ".gitignore")));
607
+ return nestedBodies.get(dir);
608
+ };
609
+ const files = [];
610
+ for (const full of all) {
611
+ const path = relative(root, full);
612
+ if (isTerraformStatePath(path)) {
613
+ const ignored = gitignoreCoversTerraformState(gitignore, path) || nestedGitignoreCovering(path, nestedGitignoreAt) !== undefined;
614
+ if (!ignored)
615
+ files.push({ path, content: "" });
616
+ continue;
617
+ }
618
+ // `.tf` is read locally so `classifyTerraform` can bundle real content.
619
+ // It stays out of `isCandidatePath` so remote fetches still never pull HCL.
620
+ if (isTerraformFileName(basename(path))) {
621
+ const content = readSafe(full);
622
+ if (content !== undefined)
623
+ files.push({ path, content });
624
+ continue;
625
+ }
626
+ if (!isCandidatePath(path))
627
+ continue;
628
+ const content = readSafe(full);
629
+ if (content !== undefined)
630
+ files.push({ path, content });
631
+ }
632
+ return { files, maxFiles: state.max, truncated: state.truncated };
633
+ }