@intentius/chant 0.124.13 → 0.124.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (907) hide show
  1. package/bin/chant +11 -0
  2. package/dist/agents/checks.js +326 -0
  3. package/dist/agents/discover.js +885 -0
  4. package/dist/agents/importer.js +17 -0
  5. package/dist/agents/index.js +12 -0
  6. package/dist/agents/types.js +19 -0
  7. package/dist/apply.js +151 -0
  8. package/dist/attrref.js +70 -0
  9. package/dist/audit/catalog.js +350 -0
  10. package/dist/audit/core.js +252 -0
  11. package/dist/audit/discover.js +633 -0
  12. package/dist/audit/fetch.js +666 -0
  13. package/dist/audit/lineage.js +91 -0
  14. package/dist/audit/nginx.js +366 -0
  15. package/dist/audit/prior-art.js +132 -0
  16. package/dist/audit/proof.js +321 -0
  17. package/dist/audit/report-html.js +194 -0
  18. package/dist/audit/report-model.js +198 -0
  19. package/dist/audit/report.js +102 -0
  20. package/dist/audit/rules-doc.js +144 -0
  21. package/dist/audit/secrets.js +405 -0
  22. package/dist/audit/terraform-state.js +140 -0
  23. package/dist/audit/wrangler.js +262 -0
  24. package/dist/behaviour-delta.js +401 -0
  25. package/dist/behaviour-engine.js +357 -0
  26. package/dist/behaviour-graph.js +83 -0
  27. package/dist/behaviour-http.js +188 -0
  28. package/dist/behaviour-kinds.js +172 -0
  29. package/dist/behaviour-overlay.js +50 -0
  30. package/dist/behaviour-predict.js +188 -0
  31. package/dist/behaviour-request.js +194 -0
  32. package/dist/behaviour.js +1325 -0
  33. package/dist/build-params.js +108 -0
  34. package/dist/build.js +668 -0
  35. package/dist/builder.js +44 -0
  36. package/dist/cdk/advise.js +30 -0
  37. package/dist/cdk/assembly.js +122 -0
  38. package/dist/cdk/graph.js +444 -0
  39. package/dist/cdk/tier-map.js +64 -0
  40. package/dist/cdk/types.js +24 -0
  41. package/dist/change-set.js +312 -0
  42. package/dist/child-project.js +21 -0
  43. package/dist/claimed-fields.js +135 -0
  44. package/dist/cli/build-options.js +70 -0
  45. package/dist/cli/build-params-cli.js +139 -0
  46. package/dist/cli/command-group.js +123 -0
  47. package/dist/cli/commands/audit-agents.js +326 -0
  48. package/dist/cli/commands/audit.js +571 -0
  49. package/dist/cli/commands/build.js +920 -0
  50. package/dist/cli/commands/carve-apply.js +153 -0
  51. package/dist/cli/commands/carve-bridge.js +201 -0
  52. package/dist/cli/commands/carve-emit.js +332 -0
  53. package/dist/cli/commands/carve-status.js +119 -0
  54. package/dist/cli/commands/carve.js +204 -0
  55. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  56. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  57. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  58. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  59. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  60. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  61. package/dist/cli/commands/check-lexicon.js +766 -0
  62. package/dist/cli/commands/describe.js +85 -0
  63. package/dist/cli/commands/diff.js +175 -0
  64. package/dist/cli/commands/doctor.js +350 -0
  65. package/dist/cli/commands/import-agents.js +155 -0
  66. package/dist/cli/commands/import.js +670 -0
  67. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  68. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  69. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  70. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  71. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  72. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  73. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  74. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  75. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  76. package/dist/cli/commands/init-lexicon.js +172 -0
  77. package/dist/cli/commands/init.js +381 -0
  78. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  79. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  80. package/dist/cli/commands/licenses.js +125 -0
  81. package/dist/cli/commands/lint.d.ts.map +1 -1
  82. package/dist/cli/commands/lint.js +948 -0
  83. package/dist/cli/commands/list.js +63 -0
  84. package/dist/cli/commands/migrate.d.ts.map +1 -1
  85. package/dist/cli/commands/migrate.js +423 -0
  86. package/dist/cli/commands/onboard.js +403 -0
  87. package/dist/cli/commands/pinned-upgrade.js +191 -0
  88. package/dist/cli/commands/update.js +194 -0
  89. package/dist/cli/commands/vendor.js +217 -0
  90. package/dist/cli/conflict-check.js +104 -0
  91. package/dist/cli/debug.js +8 -0
  92. package/dist/cli/format.js +104 -0
  93. package/dist/cli/handlers/build.js +267 -0
  94. package/dist/cli/handlers/carve-apply.js +30 -0
  95. package/dist/cli/handlers/carve-bridge.js +28 -0
  96. package/dist/cli/handlers/carve-emit.js +50 -0
  97. package/dist/cli/handlers/carve-status.js +26 -0
  98. package/dist/cli/handlers/carve.js +40 -0
  99. package/dist/cli/handlers/change-set.js +46 -0
  100. package/dist/cli/handlers/components.js +730 -0
  101. package/dist/cli/handlers/dev.js +113 -0
  102. package/dist/cli/handlers/emulator.js +233 -0
  103. package/dist/cli/handlers/explain.js +54 -0
  104. package/dist/cli/handlers/fan-out.js +422 -0
  105. package/dist/cli/handlers/gate-resume.js +275 -0
  106. package/dist/cli/handlers/generate.js +84 -0
  107. package/dist/cli/handlers/graph.js +969 -0
  108. package/dist/cli/handlers/init.js +102 -0
  109. package/dist/cli/handlers/lifecycle.js +1727 -0
  110. package/dist/cli/handlers/lint.js +62 -0
  111. package/dist/cli/handlers/migrate.js +48 -0
  112. package/dist/cli/handlers/misc.js +391 -0
  113. package/dist/cli/handlers/operator.js +1162 -0
  114. package/dist/cli/handlers/override-approve.js +102 -0
  115. package/dist/cli/handlers/pr.js +503 -0
  116. package/dist/cli/handlers/promote.js +342 -0
  117. package/dist/cli/handlers/run-generate.js +206 -0
  118. package/dist/cli/handlers/run-wave.js +66 -0
  119. package/dist/cli/handlers/run.js +1191 -0
  120. package/dist/cli/handlers/scenario.js +325 -0
  121. package/dist/cli/handlers/search.js +924 -0
  122. package/dist/cli/handlers/serve.js +32 -0
  123. package/dist/cli/handlers/vendor.js +154 -0
  124. package/dist/cli/index.js +3 -0
  125. package/dist/cli/is-entry-point.js +23 -0
  126. package/dist/cli/lsp/capabilities.js +28 -0
  127. package/dist/cli/lsp/diagnostics.js +34 -0
  128. package/dist/cli/lsp/server.js +329 -0
  129. package/dist/cli/main.d.ts.map +1 -1
  130. package/dist/cli/main.js +2540 -0
  131. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  132. package/dist/cli/mcp/op-tools.js +306 -0
  133. package/dist/cli/mcp/resource-handlers.js +258 -0
  134. package/dist/cli/mcp/resources/context.js +85 -0
  135. package/dist/cli/mcp/server.js +353 -0
  136. package/dist/cli/mcp/tools/build.js +111 -0
  137. package/dist/cli/mcp/tools/composites.js +95 -0
  138. package/dist/cli/mcp/tools/explain.js +166 -0
  139. package/dist/cli/mcp/tools/import.js +49 -0
  140. package/dist/cli/mcp/tools/lint.js +41 -0
  141. package/dist/cli/mcp/tools/scaffold.js +111 -0
  142. package/dist/cli/mcp/tools/search.js +112 -0
  143. package/dist/cli/mcp/types.js +1 -0
  144. package/dist/cli/mcp/workspace-plugins.js +91 -0
  145. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  146. package/dist/cli/mcp/workspace-tools.js +564 -0
  147. package/dist/cli/mcp-config.js +70 -0
  148. package/dist/cli/plugins.js +313 -0
  149. package/dist/cli/registry.js +23 -0
  150. package/dist/cli/reporters/stylish.js +329 -0
  151. package/dist/cli/version.js +15 -0
  152. package/dist/cli/watch.js +79 -0
  153. package/dist/codegen/bound-property-types.js +82 -0
  154. package/dist/codegen/coverage.js +119 -0
  155. package/dist/codegen/docs-file-markers.js +60 -0
  156. package/dist/codegen/docs-pages.js +115 -0
  157. package/dist/codegen/docs-rule-scanning.js +164 -0
  158. package/dist/codegen/docs-rules.js +76 -0
  159. package/dist/codegen/docs-sections.js +117 -0
  160. package/dist/codegen/docs-sidebar.js +65 -0
  161. package/dist/codegen/docs-types.js +4 -0
  162. package/dist/codegen/docs.js +356 -0
  163. package/dist/codegen/fetch.js +340 -0
  164. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  165. package/dist/codegen/generate-registry.js +71 -0
  166. package/dist/codegen/generate-runtime-index.js +56 -0
  167. package/dist/codegen/generate-typescript.js +119 -0
  168. package/dist/codegen/generate.js +115 -0
  169. package/dist/codegen/json-patch.js +141 -0
  170. package/dist/codegen/json-schema-to-ts.js +344 -0
  171. package/dist/codegen/json-schema.js +246 -0
  172. package/dist/codegen/lexicon-regen.js +412 -0
  173. package/dist/codegen/naming.js +217 -0
  174. package/dist/codegen/okf-lexicon.js +245 -0
  175. package/dist/codegen/package.js +150 -0
  176. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  177. package/dist/codegen/pinned-upgrade.js +494 -0
  178. package/dist/codegen/registry.js +60 -0
  179. package/dist/codegen/rehype-base-url.mjs +68 -0
  180. package/dist/codegen/rolling-upgrade.js +217 -0
  181. package/dist/codegen/surface-snapshot.js +537 -0
  182. package/dist/codegen/testdata/postgres-tags.json +242 -0
  183. package/dist/codegen/topo-sort.js +36 -0
  184. package/dist/codegen/typecheck.js +115 -0
  185. package/dist/codegen/validate.js +200 -0
  186. package/dist/codegen/version-bump.js +35 -0
  187. package/dist/components/auto-release.js +143 -0
  188. package/dist/components/builders.js +47 -0
  189. package/dist/components/capability-plugin-loader.js +175 -0
  190. package/dist/components/capability-plugin-schema.js +46 -0
  191. package/dist/components/capability-plugin.js +99 -0
  192. package/dist/components/capability.js +60 -0
  193. package/dist/components/changed-files.js +72 -0
  194. package/dist/components/cli-support.js +427 -0
  195. package/dist/components/component.js +120 -0
  196. package/dist/components/component.schema.json +271 -0
  197. package/dist/components/config-defaults.js +130 -0
  198. package/dist/components/deploy-units.js +60 -0
  199. package/dist/components/discover.d.ts.map +1 -1
  200. package/dist/components/discover.js +189 -0
  201. package/dist/components/driver-output.js +86 -0
  202. package/dist/components/driver.js +728 -0
  203. package/dist/components/fan-out-output.js +165 -0
  204. package/dist/components/fan-out-record.js +94 -0
  205. package/dist/components/fan-out-run.js +373 -0
  206. package/dist/components/fan-out-support.js +60 -0
  207. package/dist/components/fan-out.js +273 -0
  208. package/dist/components/gate-plan.js +41 -0
  209. package/dist/components/gated-wave-pipeline.js +46 -0
  210. package/dist/components/index.js +24 -0
  211. package/dist/components/layers.js +28 -0
  212. package/dist/components/manifest-persistence.js +108 -0
  213. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  214. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  215. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  216. package/dist/components/pilots/lambda.pilot.js +52 -0
  217. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  218. package/dist/components/pilots/project.js +12 -0
  219. package/dist/components/pr-pipeline.js +134 -0
  220. package/dist/components/pr-run.js +363 -0
  221. package/dist/components/presets/ecs-fargate.js +72 -0
  222. package/dist/components/presets/index.js +28 -0
  223. package/dist/components/presets/lambda.js +34 -0
  224. package/dist/components/presets/single-host-compose.js +41 -0
  225. package/dist/components/promote.js +549 -0
  226. package/dist/components/registry.js +34 -0
  227. package/dist/components/run-progress.js +33 -0
  228. package/dist/components/sandbox/driver.d.ts.map +1 -1
  229. package/dist/components/sandbox/driver.js +93 -0
  230. package/dist/components/sandbox/run.js +115 -0
  231. package/dist/components/starter-plugin.js +104 -0
  232. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  233. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  234. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  235. package/dist/components/verbs/bom-writer.js +287 -0
  236. package/dist/components/verbs/build-archive.js +188 -0
  237. package/dist/components/verbs/build.js +142 -0
  238. package/dist/components/verbs/cloud-executor.js +110 -0
  239. package/dist/components/verbs/component-bom.js +125 -0
  240. package/dist/components/verbs/ensure-secret.js +50 -0
  241. package/dist/components/verbs/index.js +61 -0
  242. package/dist/components/verbs/license-policy.js +75 -0
  243. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  244. package/dist/components/verbs/process-runner.js +78 -0
  245. package/dist/components/verbs/r2-sync.js +93 -0
  246. package/dist/components/verbs/reproducibility.js +62 -0
  247. package/dist/components/verbs/run-agent.js +577 -0
  248. package/dist/components/verbs/sbom-generator.js +119 -0
  249. package/dist/components/verbs/sbom.js +97 -0
  250. package/dist/components/verbs/shell.js +32 -0
  251. package/dist/components/verbs/sign.js +221 -0
  252. package/dist/components/verbs/stub.js +28 -0
  253. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  254. package/dist/components/verbs/verify.js +112 -0
  255. package/dist/components/verbs/vex.js +131 -0
  256. package/dist/components/verbs/vuln-gate.js +152 -0
  257. package/dist/components/verbs/vuln-scan.js +288 -0
  258. package/dist/components/verbs/wait-verify.js +106 -0
  259. package/dist/components/verbs/wrangler.js +179 -0
  260. package/dist/components/wave-plan.js +102 -0
  261. package/dist/composite.js +305 -0
  262. package/dist/config-import.d.ts.map +1 -1
  263. package/dist/config-import.js +22 -0
  264. package/dist/config-sandbox.js +122 -0
  265. package/dist/config-static.js +206 -0
  266. package/dist/config.js +605 -0
  267. package/dist/content-digest.js +23 -0
  268. package/dist/declarable.js +114 -0
  269. package/dist/deep-observation.js +437 -0
  270. package/dist/detectLexicon.js +54 -0
  271. package/dist/discovery/cache.js +70 -0
  272. package/dist/discovery/collect.js +208 -0
  273. package/dist/discovery/cycles.js +95 -0
  274. package/dist/discovery/entity-wire-codec.js +391 -0
  275. package/dist/discovery/entity-wire.js +42 -0
  276. package/dist/discovery/files.js +121 -0
  277. package/dist/discovery/fold-import.d.ts.map +1 -1
  278. package/dist/discovery/fold-import.js +4178 -0
  279. package/dist/discovery/fold-rank.js +292 -0
  280. package/dist/discovery/graph.js +115 -0
  281. package/dist/discovery/import.d.ts.map +1 -1
  282. package/dist/discovery/import.js +65 -0
  283. package/dist/discovery/index.js +333 -0
  284. package/dist/discovery/param-deps.js +487 -0
  285. package/dist/discovery/resolve.js +39 -0
  286. package/dist/discovery/sandbox/bundle.js +214 -0
  287. package/dist/discovery/sandbox/child-errors.js +26 -0
  288. package/dist/discovery/sandbox/config-run.js +100 -0
  289. package/dist/discovery/sandbox/config-wire.js +183 -0
  290. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  291. package/dist/discovery/sandbox/driver.js +333 -0
  292. package/dist/discovery/sandbox/fork.js +229 -0
  293. package/dist/discovery/sandbox/policy-run.js +142 -0
  294. package/dist/discovery/sandbox/policy-wire.js +152 -0
  295. package/dist/discovery/sandbox/run.js +77 -0
  296. package/dist/discovery/specifier-resolve.js +320 -0
  297. package/dist/discovery/walk.js +284 -0
  298. package/dist/effect-receipt.js +340 -0
  299. package/dist/env.js +55 -0
  300. package/dist/errors.js +62 -0
  301. package/dist/fold/fold.js +1434 -0
  302. package/dist/fold/foldable-helpers.js +229 -0
  303. package/dist/fold/subset.js +696 -0
  304. package/dist/fold-provenance.js +414 -0
  305. package/dist/gate-decision.js +260 -0
  306. package/dist/gate-resume-run.js +154 -0
  307. package/dist/gated-waves.js +165 -0
  308. package/dist/governance.js +43 -0
  309. package/dist/graph-declared.js +45 -0
  310. package/dist/graph-detail.js +207 -0
  311. package/dist/graph-dot.js +54 -0
  312. package/dist/graph-effective.js +107 -0
  313. package/dist/graph-ir.js +623 -0
  314. package/dist/graph-layout.js +184 -0
  315. package/dist/graph-lens.js +105 -0
  316. package/dist/graph-mermaid.js +83 -0
  317. package/dist/graph-ops.js +39 -0
  318. package/dist/graph-refs.js +156 -0
  319. package/dist/held-elsewhere.js +87 -0
  320. package/dist/identity.js +251 -0
  321. package/dist/import/base-parser.js +34 -0
  322. package/dist/import/embedded.js +255 -0
  323. package/dist/import/generator.js +1 -0
  324. package/dist/import/ir-utils.js +85 -0
  325. package/dist/import/parser-options.js +45 -0
  326. package/dist/import/parser.js +1 -0
  327. package/dist/index.js +118 -0
  328. package/dist/intrinsic-interpolation.js +73 -0
  329. package/dist/intrinsic.js +31 -0
  330. package/dist/join-key.js +35 -0
  331. package/dist/kubectl-context.js +150 -0
  332. package/dist/lexicon-config.js +58 -0
  333. package/dist/lexicon-integrity.js +47 -0
  334. package/dist/lexicon-manifest.js +70 -0
  335. package/dist/lexicon-module.d.ts.map +1 -1
  336. package/dist/lexicon-module.js +241 -0
  337. package/dist/lexicon-output.js +218 -0
  338. package/dist/lexicon-plugin-helpers.js +104 -0
  339. package/dist/lexicon-schema.js +136 -0
  340. package/dist/lexicon.js +130 -0
  341. package/dist/lifecycle/affected.js +224 -0
  342. package/dist/lifecycle/assert-live.js +110 -0
  343. package/dist/lifecycle/build-ledger-store.js +160 -0
  344. package/dist/lifecycle/build-ledger.js +155 -0
  345. package/dist/lifecycle/change-set.js +356 -0
  346. package/dist/lifecycle/converge-ledger.js +161 -0
  347. package/dist/lifecycle/deep-diff.js +233 -0
  348. package/dist/lifecycle/deep-observe.js +147 -0
  349. package/dist/lifecycle/digest.js +143 -0
  350. package/dist/lifecycle/disruption.js +135 -0
  351. package/dist/lifecycle/gate-applied.js +113 -0
  352. package/dist/lifecycle/gate-audit.js +341 -0
  353. package/dist/lifecycle/gate-ledger-select.js +89 -0
  354. package/dist/lifecycle/gate-ledger.js +193 -0
  355. package/dist/lifecycle/gate-origin.js +117 -0
  356. package/dist/lifecycle/gate-pending.js +58 -0
  357. package/dist/lifecycle/git.js +1182 -0
  358. package/dist/lifecycle/identity.js +58 -0
  359. package/dist/lifecycle/index.js +26 -0
  360. package/dist/lifecycle/lease.js +283 -0
  361. package/dist/lifecycle/ledger-port.js +1 -0
  362. package/dist/lifecycle/legacy-digest.js +91 -0
  363. package/dist/lifecycle/live-diff.js +274 -0
  364. package/dist/lifecycle/local-note.js +15 -0
  365. package/dist/lifecycle/member-ledger.js +122 -0
  366. package/dist/lifecycle/observation-baseline.js +155 -0
  367. package/dist/lifecycle/observe.js +375 -0
  368. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  369. package/dist/lifecycle/override-ledger.js +54 -0
  370. package/dist/lifecycle/plan-digest.js +110 -0
  371. package/dist/lifecycle/plan-ledger.js +129 -0
  372. package/dist/lifecycle/receipt-plan.js +192 -0
  373. package/dist/lifecycle/release-ledger.js +155 -0
  374. package/dist/lifecycle/release-read.js +64 -0
  375. package/dist/lifecycle/replay.js +193 -0
  376. package/dist/lifecycle/rollback.js +102 -0
  377. package/dist/lifecycle/run-ledger.js +183 -0
  378. package/dist/lifecycle/scenario-eval.js +204 -0
  379. package/dist/lifecycle/scenario.js +214 -0
  380. package/dist/lifecycle/snapshot.js +239 -0
  381. package/dist/lifecycle/status.js +447 -0
  382. package/dist/lifecycle/symptoms.js +117 -0
  383. package/dist/lifecycle/teardown.js +255 -0
  384. package/dist/lifecycle/types.js +1 -0
  385. package/dist/lifecycle/unobserved-gate.js +33 -0
  386. package/dist/lifecycle/wave-plans.js +68 -0
  387. package/dist/lifecycle/work-item-id.js +36 -0
  388. package/dist/lifecycle/work-lease.js +393 -0
  389. package/dist/lint/component-checks.js +87 -0
  390. package/dist/lint/config.js +483 -0
  391. package/dist/lint/declarative.js +122 -0
  392. package/dist/lint/discover.d.ts.map +1 -1
  393. package/dist/lint/discover.js +138 -0
  394. package/dist/lint/engine.js +246 -0
  395. package/dist/lint/knowledge-checks.js +64 -0
  396. package/dist/lint/named-checks.js +22 -0
  397. package/dist/lint/output-checks.js +87 -0
  398. package/dist/lint/output-docs.js +163 -0
  399. package/dist/lint/parser.js +33 -0
  400. package/dist/lint/pipeline-change-gate.js +70 -0
  401. package/dist/lint/policy-import.d.ts +1 -1
  402. package/dist/lint/policy-import.d.ts.map +1 -1
  403. package/dist/lint/policy-import.js +62 -0
  404. package/dist/lint/policy-sandbox.js +86 -0
  405. package/dist/lint/policy.js +122 -0
  406. package/dist/lint/post-synth.js +87 -0
  407. package/dist/lint/presets/relaxed.json +26 -0
  408. package/dist/lint/presets/strict.json +24 -24
  409. package/dist/lint/receipt-checks.js +83 -0
  410. package/dist/lint/rule-loader.d.ts.map +1 -1
  411. package/dist/lint/rule-loader.js +89 -0
  412. package/dist/lint/rule-registry.js +86 -0
  413. package/dist/lint/rule.js +1 -0
  414. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  415. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  416. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  417. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  437. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  438. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  439. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  440. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  441. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  442. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  443. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  444. package/dist/lint/rules/comp/index.js +33 -0
  445. package/dist/lint/rules/comp/support.js +129 -0
  446. package/dist/lint/rules/composite-scope.js +51 -0
  447. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  448. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  449. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  450. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  451. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  452. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  453. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  454. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  455. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  456. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  457. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  458. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  459. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  460. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  461. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  462. package/dist/lint/rules/export-required.js +115 -0
  463. package/dist/lint/rules/file-declarable-limit.js +88 -0
  464. package/dist/lint/rules/flat-declarations.js +62 -0
  465. package/dist/lint/rules/index.js +90 -0
  466. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  467. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  468. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  469. package/dist/lint/rules/no-string-ref.js +59 -0
  470. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  471. package/dist/lint/rules/no-unused-declarable.js +142 -0
  472. package/dist/lint/rules/op/index.js +28 -0
  473. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  474. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  475. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  476. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  477. package/dist/lint/rules/op/support.js +11 -0
  478. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  479. package/dist/lint/rules/property-kind.js +56 -0
  480. package/dist/lint/rules/single-concern-file.js +71 -0
  481. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  482. package/dist/lint/selectors.js +168 -0
  483. package/dist/lint/suppressions.js +129 -0
  484. package/dist/lint/typescript.js +17 -0
  485. package/dist/live-endpoint.js +113 -0
  486. package/dist/live-read-session.js +76 -0
  487. package/dist/lsp/lexicon-providers.js +163 -0
  488. package/dist/lsp/types.js +5 -0
  489. package/dist/managed-fields.js +293 -0
  490. package/dist/mcp/types.js +4 -0
  491. package/dist/notify-verify.js +0 -1
  492. package/dist/notify.js +0 -1
  493. package/dist/notify.schema.json +72 -0
  494. package/dist/observation.js +266 -0
  495. package/dist/okf-read.js +134 -0
  496. package/dist/okf.js +275 -0
  497. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  498. package/dist/op/activities/activity-contracts.js +313 -0
  499. package/dist/op/activities/apply.js +582 -0
  500. package/dist/op/activities/build.js +18 -0
  501. package/dist/op/activities/change-coverage.js +40 -0
  502. package/dist/op/activities/change-set.js +64 -0
  503. package/dist/op/activities/converge.js +492 -0
  504. package/dist/op/activities/decide.js +211 -0
  505. package/dist/op/activities/env-teardown.js +110 -0
  506. package/dist/op/activities/factory.js +591 -0
  507. package/dist/op/activities/forge-pull-request.js +82 -0
  508. package/dist/op/activities/gh-host.js +78 -0
  509. package/dist/op/activities/guard-validate.js +165 -0
  510. package/dist/op/activities/http-check.js +40 -0
  511. package/dist/op/activities/index.js +59 -0
  512. package/dist/op/activities/lexicon-upgrade.js +629 -0
  513. package/dist/op/activities/lifecycle.js +109 -0
  514. package/dist/op/activities/pipeline-audit.js +147 -0
  515. package/dist/op/activities/policy.js +26 -0
  516. package/dist/op/activities/predict-behaviour.js +341 -0
  517. package/dist/op/activities/propose-upgrade.js +165 -0
  518. package/dist/op/activities/reconcile.js +997 -0
  519. package/dist/op/activities/shell.js +118 -0
  520. package/dist/op/activities/source-release.js +97 -0
  521. package/dist/op/activities/source-rollback.js +165 -0
  522. package/dist/op/activities/teardown.js +17 -0
  523. package/dist/op/activities/util.js +6 -0
  524. package/dist/op/activities/wait.js +51 -0
  525. package/dist/op/activities/work-evidence.js +35 -0
  526. package/dist/op/activities/workflow-audit.js +133 -0
  527. package/dist/op/activity-contract-registry.js +106 -0
  528. package/dist/op/activity-contract.js +232 -0
  529. package/dist/op/activity-failure.js +31 -0
  530. package/dist/op/activity-profiles.js +129 -0
  531. package/dist/op/activity-registry.js +105 -0
  532. package/dist/op/activity-runtime.js +28 -0
  533. package/dist/op/builders.js +801 -0
  534. package/dist/op/change-signal.js +118 -0
  535. package/dist/op/composites/apply-op.js +151 -0
  536. package/dist/op/composites/behaviour-op.js +65 -0
  537. package/dist/op/composites/converge-op.js +141 -0
  538. package/dist/op/composites/index.js +19 -0
  539. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  540. package/dist/op/composites/pipeline-audit-op.js +50 -0
  541. package/dist/op/composites/reconcile-op.js +84 -0
  542. package/dist/op/composites/watch-op.js +69 -0
  543. package/dist/op/composites/workflow-audit-op.js +57 -0
  544. package/dist/op/converge-rule.js +205 -0
  545. package/dist/op/cron.js +146 -0
  546. package/dist/op/decide-backend.js +181 -0
  547. package/dist/op/decide-config.js +68 -0
  548. package/dist/op/decide-read-inputs.js +141 -0
  549. package/dist/op/discover.d.ts.map +1 -1
  550. package/dist/op/discover.js +213 -0
  551. package/dist/op/duration.js +21 -0
  552. package/dist/op/emulator-freshness.js +80 -0
  553. package/dist/op/emulator-lifecycle.js +269 -0
  554. package/dist/op/factory.js +83 -0
  555. package/dist/op/gate-approval.js +172 -0
  556. package/dist/op/gate-name.js +86 -0
  557. package/dist/op/gate-plan-context.js +167 -0
  558. package/dist/op/gate-point-run.js +67 -0
  559. package/dist/op/gate-point.js +111 -0
  560. package/dist/op/gate-resume-plan.js +155 -0
  561. package/dist/op/gate-resume.js +31 -0
  562. package/dist/op/gate-review.js +290 -0
  563. package/dist/op/gate-run-locator.js +85 -0
  564. package/dist/op/gate-summary.js +100 -0
  565. package/dist/op/gate-wait.js +56 -0
  566. package/dist/op/gate.js +449 -0
  567. package/dist/op/generate-pipeline.js +124 -0
  568. package/dist/op/index.js +51 -0
  569. package/dist/op/lifecycle-receipt-store.js +45 -0
  570. package/dist/op/local-executor.js +1164 -0
  571. package/dist/op/local-output.js +140 -0
  572. package/dist/op/op-ir.js +317 -0
  573. package/dist/op/op-verb-class.js +131 -0
  574. package/dist/op/op-waves-notify.js +136 -0
  575. package/dist/op/op-waves-run.js +1657 -0
  576. package/dist/op/op-waves.js +409 -0
  577. package/dist/op/operator.js +743 -0
  578. package/dist/op/receipt-store.js +94 -0
  579. package/dist/op/resource.js +23 -0
  580. package/dist/op/run-context.js +28 -0
  581. package/dist/op/run-live.js +256 -0
  582. package/dist/op/runtime.js +21 -0
  583. package/dist/op/runtimes/local.js +195 -0
  584. package/dist/op/source-archive.js +131 -0
  585. package/dist/op/step-output-ref.js +397 -0
  586. package/dist/op/steward-beside.js +169 -0
  587. package/dist/op/steward-points.js +138 -0
  588. package/dist/op/steward-turn.js +59 -0
  589. package/dist/op/steward.js +317 -0
  590. package/dist/op/types.js +25 -0
  591. package/dist/op/work-lease-decl.js +81 -0
  592. package/dist/op/work-lease-run.js +393 -0
  593. package/dist/override-gate.js +284 -0
  594. package/dist/owner-chain.js +74 -0
  595. package/dist/ownership.js +92 -0
  596. package/dist/params.js +61 -0
  597. package/dist/plan-summary.js +711 -0
  598. package/dist/point-decision.js +211 -0
  599. package/dist/pr-forge.js +810 -0
  600. package/dist/pr-loop.js +203 -0
  601. package/dist/project-codegen.js +191 -0
  602. package/dist/project-root.js +74 -0
  603. package/dist/project-validation.js +50 -0
  604. package/dist/provenance.js +157 -0
  605. package/dist/pseudo-parameter.js +40 -0
  606. package/dist/reconcile.js +450 -0
  607. package/dist/resource-attributes.js +33 -0
  608. package/dist/runtime-adapter.js +77 -0
  609. package/dist/runtime.js +66 -0
  610. package/dist/secret-materialization.js +153 -0
  611. package/dist/secret-provenance.js +250 -0
  612. package/dist/serializer-walker.js +112 -0
  613. package/dist/serializer.js +1 -0
  614. package/dist/sort.js +45 -0
  615. package/dist/stack-output.js +115 -0
  616. package/dist/telemetry-attribution.js +149 -0
  617. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  618. package/dist/terraform/adopt-state.js +40 -0
  619. package/dist/terraform/aws-resources.js +384 -0
  620. package/dist/terraform/bridge.js +204 -0
  621. package/dist/terraform/carve-provider.js +155 -0
  622. package/dist/terraform/carve.js +138 -0
  623. package/dist/terraform/data-source-shape.js +57 -0
  624. package/dist/terraform/emit-source.js +36 -0
  625. package/dist/terraform/excise.js +123 -0
  626. package/dist/terraform/graduate.js +128 -0
  627. package/dist/terraform/graph.js +435 -0
  628. package/dist/terraform/hcl2json.js +60 -0
  629. package/dist/terraform/manifest.js +149 -0
  630. package/dist/terraform/parse.js +81 -0
  631. package/dist/terraform/providers/aws.js +146 -0
  632. package/dist/terraform/providers/gcp.js +294 -0
  633. package/dist/terraform/providers/index.js +17 -0
  634. package/dist/terraform/providers/kubernetes.js +253 -0
  635. package/dist/terraform/score.js +151 -0
  636. package/dist/terraform/state.js +67 -0
  637. package/dist/terraform/tier-map.js +74 -0
  638. package/dist/terraform/types.js +13 -0
  639. package/dist/terraform/unified-diff.js +132 -0
  640. package/dist/testing.js +295 -0
  641. package/dist/toml-emit.js +153 -0
  642. package/dist/toml-parse.js +355 -0
  643. package/dist/toml-utils.js +60 -0
  644. package/dist/toml.js +428 -0
  645. package/dist/ts-loader.d.ts +46 -0
  646. package/dist/ts-loader.d.ts.map +1 -0
  647. package/dist/ts-loader.js +103 -0
  648. package/dist/types.js +1 -0
  649. package/dist/utils.js +61 -0
  650. package/dist/validation.js +20 -0
  651. package/dist/vendor/js-yaml-load.js +1662 -0
  652. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  653. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  654. package/dist/workspace/__fixtures__/sessions.js +91 -0
  655. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  656. package/dist/workspace/agent-cli.js +99 -0
  657. package/dist/workspace/agent.schema.json +390 -0
  658. package/dist/workspace/answers-ledger.js +89 -0
  659. package/dist/workspace/box-cli.js +142 -0
  660. package/dist/workspace/box-factory-write.js +196 -0
  661. package/dist/workspace/box-factory-write.schema.json +342 -0
  662. package/dist/workspace/box-factory.js +88 -0
  663. package/dist/workspace/box-intent.js +126 -0
  664. package/dist/workspace/box-isolation.js +169 -0
  665. package/dist/workspace/box-listing-write.schema.json +204 -0
  666. package/dist/workspace/box-listing.js +298 -0
  667. package/dist/workspace/box-publish.js +352 -0
  668. package/dist/workspace/box-publish.schema.json +498 -0
  669. package/dist/workspace/box-services.js +39 -0
  670. package/dist/workspace/broker-protocol.js +359 -0
  671. package/dist/workspace/broker-protocol.schema.json +228 -0
  672. package/dist/workspace/change-set.schema.json +460 -0
  673. package/dist/workspace/changes-cli.js +56 -0
  674. package/dist/workspace/changes.js +446 -0
  675. package/dist/workspace/changes.schema.json +642 -0
  676. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  677. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  678. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  679. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  680. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  681. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  682. package/dist/workspace/chant-migrations.js +113 -0
  683. package/dist/workspace/check.schema.json +433 -0
  684. package/dist/workspace/checks/box-isolation.js +62 -0
  685. package/dist/workspace/checks/boxes.js +491 -0
  686. package/dist/workspace/checks/diagrams.js +104 -0
  687. package/dist/workspace/checks/generated.js +419 -0
  688. package/dist/workspace/checks/ledgers.js +212 -0
  689. package/dist/workspace/checks/links.js +191 -0
  690. package/dist/workspace/checks/live.js +100 -0
  691. package/dist/workspace/checks/pipelines.js +188 -0
  692. package/dist/workspace/checks/records.js +169 -0
  693. package/dist/workspace/checks.js +426 -0
  694. package/dist/workspace/ci-green-cli.js +125 -0
  695. package/dist/workspace/ci-green-forge.js +83 -0
  696. package/dist/workspace/ci-green-workflow.js +199 -0
  697. package/dist/workspace/ci-green.js +325 -0
  698. package/dist/workspace/ci-last-green.schema.json +158 -0
  699. package/dist/workspace/compose-graph.js +235 -0
  700. package/dist/workspace/compose-reports.js +146 -0
  701. package/dist/workspace/composites.js +264 -0
  702. package/dist/workspace/composites.schema.json +617 -0
  703. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  704. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  705. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  706. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  707. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  708. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  709. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  710. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  711. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  712. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  713. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  714. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  715. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  716. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  717. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  718. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  719. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  720. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  721. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  722. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  723. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  724. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  725. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  726. package/dist/workspace/conformance/broker.js +736 -0
  727. package/dist/workspace/conformance/index.js +673 -0
  728. package/dist/workspace/conformance/vitest.js +108 -0
  729. package/dist/workspace/conformance/writer.js +1080 -0
  730. package/dist/workspace/decide.js +879 -0
  731. package/dist/workspace/decision-points.schema.json +135 -135
  732. package/dist/workspace/declaration-write-cli.js +74 -0
  733. package/dist/workspace/declaration-write.js +238 -0
  734. package/dist/workspace/declaration.js +938 -0
  735. package/dist/workspace/declaration.schema.json +1413 -1413
  736. package/dist/workspace/declared-kinds.js +106 -0
  737. package/dist/workspace/environments.js +164 -0
  738. package/dist/workspace/evidence.schema.json +279 -0
  739. package/dist/workspace/export-cli.js +185 -0
  740. package/dist/workspace/export.js +499 -0
  741. package/dist/workspace/factory-rules.js +175 -0
  742. package/dist/workspace/generated-files.js +92 -0
  743. package/dist/workspace/glob.js +45 -0
  744. package/dist/workspace/graph-cache.js +352 -0
  745. package/dist/workspace/graph-cli.js +348 -0
  746. package/dist/workspace/graph.schema.json +1338 -0
  747. package/dist/workspace/identity-gate-rule.js +75 -0
  748. package/dist/workspace/identity.js +126 -0
  749. package/dist/workspace/import.js +283 -0
  750. package/dist/workspace/init.js +620 -0
  751. package/dist/workspace/intent-cli.js +263 -0
  752. package/dist/workspace/intent-joins.js +201 -0
  753. package/dist/workspace/intent-record.js +352 -0
  754. package/dist/workspace/intent-record.schema.json +864 -0
  755. package/dist/workspace/intent.js +1582 -0
  756. package/dist/workspace/intent.schema.json +2420 -0
  757. package/dist/workspace/json-edit.js +221 -0
  758. package/dist/workspace/jsonc.js +235 -0
  759. package/dist/workspace/kind-readers.js +103 -0
  760. package/dist/workspace/kinds.js +587 -0
  761. package/dist/workspace/lexicon-symbols.js +112 -0
  762. package/dist/workspace/lineage-adopt-cli.js +102 -0
  763. package/dist/workspace/lineage-adopt.js +360 -0
  764. package/dist/workspace/lineage-check.js +282 -0
  765. package/dist/workspace/lineage-cli.js +121 -0
  766. package/dist/workspace/lineage-hash-index.js +284 -0
  767. package/dist/workspace/lineage-init.js +507 -0
  768. package/dist/workspace/lineage-lock.js +387 -0
  769. package/dist/workspace/lineage-merge.js +45 -0
  770. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  771. package/dist/workspace/lineage-migrations.js +329 -0
  772. package/dist/workspace/lineage-provenance.js +36 -0
  773. package/dist/workspace/lineage-update.js +138 -0
  774. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  775. package/dist/workspace/lineage-upgrade.js +889 -0
  776. package/dist/workspace/lineage-vendor.js +171 -0
  777. package/dist/workspace/lineage-version.js +128 -0
  778. package/dist/workspace/lineage-versions.js +275 -0
  779. package/dist/workspace/links.js +330 -0
  780. package/dist/workspace/ls-generated.js +95 -0
  781. package/dist/workspace/ls.js +277 -0
  782. package/dist/workspace/ls.schema.json +333 -0
  783. package/dist/workspace/member-commands.js +508 -0
  784. package/dist/workspace/member-handles.js +216 -0
  785. package/dist/workspace/member-pipeline.js +258 -0
  786. package/dist/workspace/member-run.js +117 -0
  787. package/dist/workspace/member-write.schema.json +193 -0
  788. package/dist/workspace/nested-graph.js +156 -0
  789. package/dist/workspace/nesting.js +38 -0
  790. package/dist/workspace/patch.js +301 -0
  791. package/dist/workspace/patch.schema.json +321 -0
  792. package/dist/workspace/pin-cli.js +55 -0
  793. package/dist/workspace/pin-integrity.js +100 -0
  794. package/dist/workspace/plan-summary.schema.json +155 -0
  795. package/dist/workspace/point-answer.schema.json +129 -129
  796. package/dist/workspace/points-cli.js +291 -0
  797. package/dist/workspace/points-write.schema.json +660 -0
  798. package/dist/workspace/points.js +521 -0
  799. package/dist/workspace/points.schema.json +916 -0
  800. package/dist/workspace/pr-report.schema.json +108 -0
  801. package/dist/workspace/principal-classes.js +245 -0
  802. package/dist/workspace/reason-codes.js +326 -0
  803. package/dist/workspace/record-assets.js +151 -0
  804. package/dist/workspace/record-decided.js +105 -0
  805. package/dist/workspace/record-sessions.js +96 -0
  806. package/dist/workspace/record-source.js +114 -0
  807. package/dist/workspace/records-amend.schema.json +284 -0
  808. package/dist/workspace/records-checkout.js +76 -0
  809. package/dist/workspace/records-cli.js +707 -0
  810. package/dist/workspace/records-close.js +116 -0
  811. package/dist/workspace/records-close.schema.json +278 -0
  812. package/dist/workspace/records-new.schema.json +202 -0
  813. package/dist/workspace/records-review.schema.json +367 -0
  814. package/dist/workspace/records-since.js +317 -0
  815. package/dist/workspace/records-since.schema.json +218 -0
  816. package/dist/workspace/records-write.js +1229 -0
  817. package/dist/workspace/records.js +1345 -0
  818. package/dist/workspace/records.schema.json +604 -0
  819. package/dist/workspace/reference-kinds/app/package.json +10 -0
  820. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  821. package/dist/workspace/returns.js +303 -0
  822. package/dist/workspace/root-refusal.js +75 -0
  823. package/dist/workspace/run-statement.schema.json +622 -0
  824. package/dist/workspace/runs-cli.js +584 -0
  825. package/dist/workspace/runs-write.schema.json +994 -0
  826. package/dist/workspace/runs.js +708 -0
  827. package/dist/workspace/runs.schema.json +1257 -0
  828. package/dist/workspace/runtimes.js +76 -0
  829. package/dist/workspace/session-kinds.js +83 -0
  830. package/dist/workspace/signers.schema.json +206 -0
  831. package/dist/workspace/source-block.js +125 -0
  832. package/dist/workspace/squash.js +177 -0
  833. package/dist/workspace/status-gates.js +162 -0
  834. package/dist/workspace/status-stewards.js +330 -0
  835. package/dist/workspace/status.js +514 -0
  836. package/dist/workspace/status.schema.json +998 -0
  837. package/dist/workspace/steward-index.js +191 -0
  838. package/dist/workspace/symbols.js +188 -0
  839. package/dist/workspace/template-manifest.js +227 -0
  840. package/dist/workspace/template-pins.js +115 -0
  841. package/dist/workspace/trailer-joins.js +65 -0
  842. package/dist/workspace/trailers.js +111 -0
  843. package/dist/workspace/tree.js +136 -0
  844. package/dist/workspace/trust/attestor.js +63 -0
  845. package/dist/workspace/trust/dsse.js +108 -0
  846. package/dist/workspace/trust/evidence-cli.js +175 -0
  847. package/dist/workspace/trust/evidence.js +161 -0
  848. package/dist/workspace/trust/gate-seal.js +226 -0
  849. package/dist/workspace/trust/policy.js +190 -0
  850. package/dist/workspace/trust/provenance.js +180 -0
  851. package/dist/workspace/trust/rotation.js +298 -0
  852. package/dist/workspace/trust/run-commits.js +101 -0
  853. package/dist/workspace/trust/run-statement.js +182 -0
  854. package/dist/workspace/trust/seal.js +272 -0
  855. package/dist/workspace/trust/signers-cli.js +152 -0
  856. package/dist/workspace/trust/ssh-commit.js +178 -0
  857. package/dist/workspace/trust/test-repo.js +118 -0
  858. package/dist/workspace/trust/trust-files.js +193 -0
  859. package/dist/workspace/trust/verify-cli.js +63 -0
  860. package/dist/workspace/trust/verify.js +192 -0
  861. package/dist/workspace/which-chant.js +141 -0
  862. package/dist/workspace/wip-cli.js +95 -0
  863. package/dist/workspace/wip-write.schema.json +504 -0
  864. package/dist/workspace/wip.js +631 -0
  865. package/dist/workspace/wip.schema.json +334 -0
  866. package/dist/workspace/work-cli.js +448 -0
  867. package/dist/workspace/work-evidence.js +122 -0
  868. package/dist/workspace/work-evidence.schema.json +222 -0
  869. package/dist/workspace/work-history.schema.json +421 -0
  870. package/dist/workspace/work-lease.schema.json +246 -0
  871. package/dist/workspace/work-size.js +77 -0
  872. package/dist/workspace/work.js +283 -0
  873. package/dist/workspace/workspace-kinds.schema.json +259 -259
  874. package/dist/workspace/workspace-principals.schema.json +53 -53
  875. package/dist/workspace/write-lock-cli.js +105 -0
  876. package/dist/workspace/write-lock.js +424 -0
  877. package/dist/workspace/write-lock.schema.json +172 -0
  878. package/dist/workspace/write-scope.js +484 -0
  879. package/dist/yaml.js +459 -0
  880. package/package.json +2 -2
  881. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  882. package/src/cli/commands/lint.ts +3 -0
  883. package/src/cli/commands/migrate.ts +2 -0
  884. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  885. package/src/cli/main.ts +121 -27
  886. package/src/cli/mcp/workspace-tools.ts +1 -1
  887. package/src/codegen/pinned-upgrade.ts +2 -0
  888. package/src/components/discover.ts +2 -0
  889. package/src/components/sandbox/driver.ts +3 -1
  890. package/src/config-import.ts +3 -0
  891. package/src/discovery/fold-import.ts +23 -14
  892. package/src/discovery/import.ts +2 -0
  893. package/src/discovery/sandbox/driver.ts +3 -1
  894. package/src/lexicon-module.ts +3 -0
  895. package/src/lint/config.ts +1 -1
  896. package/src/lint/discover.ts +28 -8
  897. package/src/lint/policy-import.ts +4 -1
  898. package/src/lint/rule-loader.ts +2 -0
  899. package/src/op/discover.ts +3 -0
  900. package/src/ts-loader.test.ts +23 -0
  901. package/src/ts-loader.ts +122 -0
  902. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  903. package/src/workspace/declaration.ts +1 -1
  904. package/src/workspace/kinds.ts +1 -1
  905. package/src/workspace/lineage-migrations.ts +2 -0
  906. package/src/workspace/points.ts +1 -1
  907. package/src/workspace/principal-classes.ts +1 -1
@@ -0,0 +1,203 @@
1
+ /**
2
+ * The pull-request loop (#3183): plan the members a change reaches, show the
3
+ * plan on the pull request, and apply it on merge only when the plan is the
4
+ * one a reviewer approved.
5
+ *
6
+ * `chant components pr-plan` and `chant components pr-apply` run it, and the
7
+ * generated CI for GitHub, GitLab and Forgejo calls them
8
+ * (`components/pr-pipeline.ts`). This module holds the parts that need no
9
+ * runner: the gate's names, the report both commands write, the pull-request
10
+ * note rendered from it and the status line. terragucci reads the report and
11
+ * renders the note from one bundled file with no TypeScript toolchain
12
+ * (#3421), so this imports `./change-set` and `./plan-summary` and nothing
13
+ * else; `pr-loop-bundle.test.ts` holds that.
14
+ *
15
+ * ## What the gate binds
16
+ *
17
+ * One gate per pull request: op `pr-<number>`, gate `pr-apply` unless the
18
+ * pipeline names another. It binds the digest of the change-set document over
19
+ * every planned member (`changeSetDocumentDigest`, #3181): the set digest a
20
+ * gated wave binds over its members (#3049), and the document's entries, holes
21
+ * and side effects with it (#3555). A reviewer approves it with `chant
22
+ * approve pr-<number> pr-apply --plan <digest>`. The op carries the number so
23
+ * that one pull request's approval never answers another's, and the gate name
24
+ * stays fixed so a workspace can require signed approvals for it under
25
+ * `identity.gates` (#3163).
26
+ *
27
+ * On merge the apply plans the same members again, before anything applies,
28
+ * and decides the gate against the new digest. The same plan applies; a moved
29
+ * plan stops with both digests named and nothing applied.
30
+ *
31
+ * ## Inside a workspace member
32
+ *
33
+ * Each workspace member that generates the pipeline (#3465) runs its own
34
+ * plan and apply on the same pull request, so each keeps its own gate, note
35
+ * and statuses: op `pr-<number>-<member>`, the note marker and the status
36
+ * contexts carry the member's name. The gate name stays the same, so one
37
+ * `identity.gates` entry covers every member.
38
+ */
39
+ import { GITHUB_COMMENT_LIMIT, groupChangeSet, renderPlanSummaryMarkdown } from "./plan-summary.js";
40
+ /** The schema a pull-request report names in `$schema`. */
41
+ export const PR_REPORT_SCHEMA_ID = "https://intentius.io/chant/schemas/workspace/pr-report/v1/pr-report.schema.json";
42
+ /** The read-contract version the report follows. */
43
+ export const PR_REPORT_CONTRACT = 1;
44
+ /** The gate a pull request's apply waits on, unless the pipeline names another. */
45
+ export const PR_APPLY_GATE = "pr-apply";
46
+ /**
47
+ * The op a pull request's gate is recorded under: `pr-<number>`, or
48
+ * `pr-<number>-<member>` for a workspace member's pipeline (#3465).
49
+ */
50
+ export function prOp(pr, member) {
51
+ return member ? `pr-${pr}-${member}` : `pr-${pr}`;
52
+ }
53
+ /** Whether `op` is a pull request's gate op, with or without a member. Member names follow the declaration's name pattern. */
54
+ export const PR_GATE_OP = /^pr-\d+(?:-[a-z0-9][a-z0-9-]*)?$/;
55
+ /** The hidden line that marks the pull request's note, one per environment and, in a workspace, per member. */
56
+ export function prNoteMarker(env, member) {
57
+ return member ? `<!-- chant-pr:${env}:${member} -->` : `<!-- chant-pr:${env} -->`;
58
+ }
59
+ /** The status contexts the two stages set on the commit. */
60
+ export const PR_STATUS_CONTEXTS = { plan: "chant/plan", apply: "chant/apply" };
61
+ /** A stage's status context: `chant/plan`, or `chant/plan/<member>` for a workspace member's pipeline. */
62
+ export function prStatusContext(stage, member) {
63
+ return member ? `${PR_STATUS_CONTEXTS[stage]}/${member}` : PR_STATUS_CONTEXTS[stage];
64
+ }
65
+ /** The counts a member's entries add up to. */
66
+ export function memberCounts(doc, member) {
67
+ const by = doc.summary.byMember[member] ?? {};
68
+ const n = (a) => by[a] ?? 0;
69
+ return { create: n("create"), update: n("update"), replace: n("replace"), delete: n("delete") };
70
+ }
71
+ /** The approve command a reviewer runs for this report's digest. */
72
+ export function prApproveCommand(report, approver = "<you>") {
73
+ return `chant approve ${report.op} ${report.gate} --plan ${report.digest} --approver ${approver} --sign`;
74
+ }
75
+ /**
76
+ * The refusal when the approved digest is not the planned one: both digests,
77
+ * that nothing applied, and how to close it.
78
+ */
79
+ export function describePlanChanged(report) {
80
+ return (`The plan changed after review, so nothing was applied. ` +
81
+ `approved: ${report.approval.approved ?? "(none)"}; planned now: ${report.digest}. ` +
82
+ `Read the new plan, and if it is right, approve it: ${prApproveCommand(report)}; then run the apply again.`);
83
+ }
84
+ const short = (sha) => sha.slice(0, 12);
85
+ const code = (s) => "`" + s.replaceAll("`", "'") + "`";
86
+ const STATUS_WORDS = {
87
+ planned: "planned",
88
+ "plan-failed": "plan failed",
89
+ applied: "applied",
90
+ failed: "apply failed",
91
+ blocked: "blocked",
92
+ };
93
+ function headline(report) {
94
+ const n = report.members.length;
95
+ const members = `${n} member${n === 1 ? "" : "s"}`;
96
+ switch (report.status) {
97
+ case "nothing":
98
+ return "Nothing to plan: no component deploys what this change touches.";
99
+ case "planned":
100
+ return `Planned ${members}.`;
101
+ case "plan-failed":
102
+ return `Planning failed for ${report.members.filter((m) => m.status === "plan-failed").length} of ${members}, so nothing can apply.`;
103
+ case "applied":
104
+ return `Applied ${members}.`;
105
+ case "failed":
106
+ return `The apply failed: ${report.members.filter((m) => m.status === "failed").length} failed, ${report.members.filter((m) => m.status === "applied").length} applied.`;
107
+ case "refused":
108
+ return "The apply refused.";
109
+ }
110
+ }
111
+ function approvalLines(report, approver) {
112
+ const a = report.approval;
113
+ if (report.status === "nothing")
114
+ return [];
115
+ if (a.status === "approved")
116
+ return [`Approved by ${(a.approvedBy ?? []).map(code).join(", ")} for this digest.`];
117
+ const lines = a.status === "changed"
118
+ ? [`An approval stands for ${code(a.approved ?? "(none)")}, not for this digest: the plan changed since it was approved.`]
119
+ : ["Not approved yet."];
120
+ if (report.stage === "plan" && report.status === "planned") {
121
+ lines.push("", "A reviewer who approved this pull request approves the plan with:", "", "```", prApproveCommand(report, approver), "```", "", "It applies on merge if the plan is still this one. If it moved, the apply refuses and names both digests.");
122
+ }
123
+ return lines;
124
+ }
125
+ /**
126
+ * The pull-request note: the stage's headline, a row per member, the digest
127
+ * and the approval, then the grouped plan summary (#3188) in whatever room
128
+ * `limit` leaves. The note starts with {@link prNoteMarker}, so the same
129
+ * comment is updated by every push and by the apply.
130
+ */
131
+ export function renderPrNote(report, options = {}) {
132
+ const limit = options.limit ?? GITHUB_COMMENT_LIMIT;
133
+ const out = [
134
+ prNoteMarker(report.env, report.member),
135
+ `### chant ${report.stage === "plan" ? "plan" : "apply"} for ${code(report.env)}${report.member ? ` in member ${code(report.member)}` : ""}`,
136
+ "",
137
+ `${headline(report)} Head ${code(short(report.head))}, measured from ${code(short(report.base))}.`,
138
+ ];
139
+ if (report.message)
140
+ out.push("", `> ${report.message.split("\n").join("\n> ")}`);
141
+ if (report.resumed && report.resumed.applied.length > 0) {
142
+ out.push("", `Resumed under the same approval: ${report.resumed.applied.map(code).join(", ")} applied in an earlier attempt and did not run again.`);
143
+ }
144
+ if (report.members.length > 0) {
145
+ out.push("", "| Member | Component | Status | Create | Update | Replace | Delete |", "|---|---|---|---:|---:|---:|---:|");
146
+ for (const m of report.members) {
147
+ const status = STATUS_WORDS[m.status] + (m.inputsMoved?.length ? `, inputs from ${m.inputsMoved.join(", ")} moved` : "");
148
+ out.push(`| ${code(m.member)} | ${m.component} | ${status} | ${m.counts.create} | ${m.counts.update} | ${m.counts.replace} | ${m.counts.delete} |`);
149
+ }
150
+ if (report.members.some((m) => m.inputsMoved?.length)) {
151
+ out.push("", "A member whose inputs moved applied the plan it was approved with. The next run plans it against the new values.");
152
+ }
153
+ }
154
+ if (report.selection.unclaimed.length > 0) {
155
+ out.push("", `Changed, and deployed by no component: ${report.selection.unclaimed.map(code).join(", ")}.`);
156
+ }
157
+ if (report.status !== "nothing") {
158
+ out.push("", `Plan digest: ${code(report.digest)}`, "", ...approvalLines(report, options.approver ?? "<you>"));
159
+ }
160
+ const head = out.join("\n") + "\n";
161
+ if (report.status === "nothing" || report.changeSet.members.length === 0)
162
+ return head;
163
+ const room = limit - [...head].length - 1;
164
+ if (room < 400)
165
+ return head;
166
+ return head + "\n" + renderPlanSummaryMarkdown(groupChangeSet(report.changeSet), { limit: room, command: "chant change-set summary .chant/pr/change-set.json" });
167
+ }
168
+ /** A commit status's description, at most 140 characters (GitHub's limit). */
169
+ export function prStatusDescription(report) {
170
+ const n = report.members.length;
171
+ const sum = report.members.reduce((acc, m) => ({ change: acc.change + m.counts.create + m.counts.update + m.counts.replace, destroy: acc.destroy + m.counts.delete + m.counts.replace }), { change: 0, destroy: 0 });
172
+ const digest = report.digest ? `; plan ${report.digest.replace(/^(?:jcs1-)?sha256:/, "").slice(0, 12)}` : "";
173
+ let text;
174
+ switch (report.status) {
175
+ case "nothing":
176
+ text = "nothing to plan";
177
+ break;
178
+ case "planned":
179
+ text = `${n} member${n === 1 ? "" : "s"}: ${sum.change} to change, ${sum.destroy} to destroy or replace${digest}`;
180
+ break;
181
+ case "plan-failed":
182
+ text = `a member failed to plan${digest}`;
183
+ break;
184
+ case "applied":
185
+ text = `applied ${n} member${n === 1 ? "" : "s"}${digest}`;
186
+ break;
187
+ case "failed":
188
+ text = `apply failed for ${report.members.filter((m) => m.status === "failed").map((m) => m.member).join(", ")}`;
189
+ break;
190
+ case "refused":
191
+ text = `refused: ${report.refusal === "plan-changed" ? "the plan changed after review" : report.refusal === "not-a-reviewer" ? "the approver has not approved the pull request" : report.refusal === "no-pull-request" ? "no pull request merged this commit" : "the plan is not approved"}`;
192
+ break;
193
+ }
194
+ return text.length > 140 ? text.slice(0, 137) + "..." : text;
195
+ }
196
+ /** The commit status state for a report: success, failure, or pending while it waits on approval. */
197
+ export function prStatusState(report) {
198
+ if (report.status === "planned" || report.status === "applied" || report.status === "nothing")
199
+ return "success";
200
+ if (report.status === "refused" && report.refusal === "not-approved")
201
+ return "pending";
202
+ return "failure";
203
+ }
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Project-local code generation: typed code a lexicon generates into the
3
+ * project from sources the project declares in `chant.config.ts` (a CRD file,
4
+ * a Helm chart), as opposed to the types a lexicon ships in its package.
5
+ *
6
+ * The split of work:
7
+ *
8
+ * - A lexicon implements {@link ProjectCodegen} (the plugin's
9
+ * `projectCodegen()` hook). It says what its declared inputs are
10
+ * ({@link ProjectCodegen.inputs}, offline), renders files from them
11
+ * ({@link ProjectCodegen.generate}, may fetch), and optionally reads its own
12
+ * committed output back when a build starts ({@link ProjectCodegen.load}).
13
+ * - Core owns the output directory, writes the files, and records a digest of
14
+ * the inputs beside them in {@link STAMP_FILE}. `chant generate` is the only
15
+ * writer.
16
+ * - Every build compares the inputs' digest with the recorded one before it
17
+ * serializes ({@link checkProjectCodegen}, wired in through the build-root
18
+ * contributors in ./cli/plugins.ts). A mismatch fails the build. The build
19
+ * never fetches and never regenerates, so it stays offline and the committed
20
+ * output is what a fresh clone typechecks against.
21
+ *
22
+ * Output lives in `<codegen.outDir>/<lexicon>/`, default `src/generated/<lexicon>/`,
23
+ * relative to the directory holding `chant.config.*`.
24
+ */
25
+ import { createHash } from "node:crypto";
26
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmdirSync, rmSync, writeFileSync } from "node:fs";
27
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
28
+ import { canonicalJson } from "./effect-receipt.js";
29
+ import { GENERATED_MARKER } from "./discovery/files.js";
30
+ /** Default output directory, relative to the project root. */
31
+ export const DEFAULT_CODEGEN_OUT_DIR = "src/generated";
32
+ /** The file core writes beside a lexicon's generated files: the inputs digest and the file list. */
33
+ export const STAMP_FILE = "chant-codegen.json";
34
+ /**
35
+ * Header for generated TypeScript. It carries discovery's generated-file
36
+ * marker (`./discovery/files.ts`), so the build and `chant lint` do not treat
37
+ * the generated module as authored source; project files still import it.
38
+ */
39
+ export const GENERATED_TS_HEADER = `// ${GENERATED_MARKER}. Run \`chant generate\` to update.`;
40
+ /** Resolve the output root (`codegen.outDir`, default {@link DEFAULT_CODEGEN_OUT_DIR}) against the project root. */
41
+ export function resolveCodegenRoot(projectRoot, config) {
42
+ const codegen = config.codegen;
43
+ const outDir = typeof codegen?.outDir === "string" && codegen.outDir.length > 0 ? codegen.outDir : DEFAULT_CODEGEN_OUT_DIR;
44
+ return resolve(projectRoot, outDir);
45
+ }
46
+ /** The context for one lexicon. */
47
+ export function projectCodegenContext(lexicon, projectRoot, config) {
48
+ return { projectRoot, config, outDir: join(resolveCodegenRoot(projectRoot, config), lexicon) };
49
+ }
50
+ /** `sha256:<hex>` of a JSON value's canonical form. */
51
+ export function digestInputs(inputs) {
52
+ return `sha256:${createHash("sha256").update(canonicalJson(inputs)).digest("hex")}`;
53
+ }
54
+ /** Read a lexicon's stamp, or `undefined` when it has none (or it does not parse). */
55
+ export function readStamp(outDir) {
56
+ const path = join(outDir, STAMP_FILE);
57
+ if (!existsSync(path))
58
+ return undefined;
59
+ try {
60
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
61
+ if (typeof parsed.inputs !== "string" || !Array.isArray(parsed.files))
62
+ return undefined;
63
+ return { inputs: parsed.inputs, files: parsed.files.filter((f) => typeof f === "string") };
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ }
69
+ /**
70
+ * `chant generate` for one lexicon: render its files, write them, delete
71
+ * files a previous run wrote that this one did not, and record the stamp.
72
+ * With nothing declared, a previous run's output is removed.
73
+ */
74
+ export async function generateProjectCode(plugin, projectRoot, config, options = {}) {
75
+ const codegen = plugin.projectCodegen?.();
76
+ if (!codegen)
77
+ return undefined;
78
+ const ctx = projectCodegenContext(plugin.name, projectRoot, config);
79
+ const previous = readStamp(ctx.outDir);
80
+ const inputs = await codegen.inputs(ctx);
81
+ if (inputs === undefined) {
82
+ if (!previous)
83
+ return { lexicon: plugin.name, outDir: ctx.outDir, status: "none", files: [], summary: [] };
84
+ removeFiles(ctx.outDir, [...previous.files, STAMP_FILE]);
85
+ return { lexicon: plugin.name, outDir: ctx.outDir, status: "removed", files: previous.files, summary: [] };
86
+ }
87
+ const output = await codegen.generate({ ...ctx, ...(options.fetch ? { fetch: options.fetch } : {}) });
88
+ const files = Object.keys(output.files).sort();
89
+ for (const file of files) {
90
+ const target = safeJoin(ctx.outDir, file);
91
+ mkdirSync(dirname(target), { recursive: true });
92
+ writeFileSync(target, output.files[file]);
93
+ }
94
+ if (previous) {
95
+ const keep = new Set(files);
96
+ removeFiles(ctx.outDir, previous.files.filter((f) => !keep.has(f)));
97
+ }
98
+ const stamp = { inputs: digestInputs(inputs), files };
99
+ mkdirSync(ctx.outDir, { recursive: true });
100
+ writeFileSync(join(ctx.outDir, STAMP_FILE), JSON.stringify(stamp, null, 2) + "\n");
101
+ return { lexicon: plugin.name, outDir: ctx.outDir, status: "written", files, summary: output.summary ?? [] };
102
+ }
103
+ /**
104
+ * Whether a lexicon's committed output matches its declared inputs. Offline.
105
+ *
106
+ * - `none`: nothing declared, nothing generated.
107
+ * - `current`: the recorded digest matches and every recorded file exists.
108
+ * - `missing`: sources are declared and there is no output (or a recorded file is gone).
109
+ * - `drift`: the declared sources changed since the output was generated.
110
+ * - `orphan`: nothing is declared any more, but generated output remains.
111
+ */
112
+ export async function checkProjectCodegen(plugin, projectRoot, config) {
113
+ const codegen = plugin.projectCodegen?.();
114
+ if (!codegen)
115
+ return { status: "none" };
116
+ const ctx = projectCodegenContext(plugin.name, projectRoot, config);
117
+ const where = displayPath(projectRoot, ctx.outDir);
118
+ const stamp = readStamp(ctx.outDir);
119
+ const inputs = await codegen.inputs(ctx);
120
+ if (inputs === undefined) {
121
+ if (!stamp)
122
+ return { status: "none" };
123
+ return {
124
+ status: "orphan",
125
+ message: `${where} holds generated ${plugin.name} code, but chant.config declares no ${plugin.name} sources for it. Run \`chant generate\` to remove it.`,
126
+ };
127
+ }
128
+ if (!stamp) {
129
+ return {
130
+ status: "missing",
131
+ message: `chant.config declares ${plugin.name} sources to generate, but ${where} has no generated code. Run \`chant generate\` and commit the result.`,
132
+ };
133
+ }
134
+ const absent = stamp.files.filter((f) => !existsSync(safeJoin(ctx.outDir, f)));
135
+ if (absent.length > 0) {
136
+ return {
137
+ status: "missing",
138
+ message: `generated ${plugin.name} file(s) missing from ${where}: ${absent.join(", ")}. Run \`chant generate\` and commit the result.`,
139
+ };
140
+ }
141
+ if (stamp.inputs !== digestInputs(inputs)) {
142
+ return {
143
+ status: "drift",
144
+ message: `generated ${plugin.name} code in ${where} is out of date: its declared sources changed since it was generated. Run \`chant generate\` and commit the result.`,
145
+ };
146
+ }
147
+ return { status: "current" };
148
+ }
149
+ /**
150
+ * The build's side of project codegen for one plugin: check the committed
151
+ * output against the declared inputs, throw on any mismatch, and let the
152
+ * lexicon load its output when it is current. Called once per top-level
153
+ * build, before serialization.
154
+ */
155
+ export async function prepareProjectCodegen(plugin, projectRoot, config) {
156
+ const check = await checkProjectCodegen(plugin, projectRoot, config);
157
+ if ("message" in check)
158
+ throw new Error(check.message);
159
+ if (check.status === "none")
160
+ return;
161
+ await plugin.projectCodegen?.().load?.(projectCodegenContext(plugin.name, projectRoot, config));
162
+ }
163
+ function removeFiles(outDir, files) {
164
+ for (const file of files) {
165
+ rmSync(safeJoin(outDir, file), { force: true });
166
+ }
167
+ pruneEmptyDirs(outDir);
168
+ }
169
+ /** Remove empty directories under (and including) `dir`. */
170
+ function pruneEmptyDirs(dir) {
171
+ if (!existsSync(dir))
172
+ return;
173
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
174
+ if (entry.isDirectory())
175
+ pruneEmptyDirs(join(dir, entry.name));
176
+ }
177
+ if (readdirSync(dir).length === 0)
178
+ rmdirSync(dir);
179
+ }
180
+ /** Join a recorded relative path onto `outDir`, refusing one that escapes it. */
181
+ function safeJoin(outDir, file) {
182
+ const target = resolve(outDir, file);
183
+ if (isAbsolute(file) || (target !== outDir && !target.startsWith(outDir + sep))) {
184
+ throw new Error(`generated file path "${file}" is outside ${outDir}`);
185
+ }
186
+ return target;
187
+ }
188
+ function displayPath(projectRoot, path) {
189
+ const rel = relative(projectRoot, path);
190
+ return rel === "" ? "." : rel.split(sep).join("/");
191
+ }
@@ -0,0 +1,74 @@
1
+ import { existsSync } from "fs";
2
+ import { dirname, join, resolve } from "path";
3
+ /** Walk up from `startDir` (inclusive) to the nearest chant config or project boundary. See {@link ProjectConfigSearch}. */
4
+ export function findProjectConfig(startDir) {
5
+ const resolvedStart = resolve(startDir);
6
+ let dir = resolvedStart;
7
+ for (;;) {
8
+ const tsPath = join(dir, "chant.config.ts");
9
+ if (existsSync(tsPath))
10
+ return { dir, configPath: tsPath };
11
+ const jsonPath = join(dir, "chant.config.json");
12
+ if (existsSync(jsonPath))
13
+ return { dir, configPath: jsonPath };
14
+ if (existsSync(join(dir, ".git")) || existsSync(join(dir, "package.json"))) {
15
+ return { dir };
16
+ }
17
+ const parent = dirname(dir);
18
+ if (parent === dir) {
19
+ // Filesystem root, no config, no boundary ever seen — give up rather
20
+ // than adopting "/" as the project root (see the module doc above).
21
+ return { dir: resolvedStart };
22
+ }
23
+ dir = parent;
24
+ }
25
+ }
26
+ /**
27
+ * Walk up from `startDir` to the nearest ancestor holding a chant project
28
+ * config (`chant.config.ts` or `chant.config.json`), the `.git`/`package.json`
29
+ * project boundary, or `startDir` itself when neither is found. Thin wrapper
30
+ * over {@link findProjectConfig} for callers that only need the directory
31
+ * (e.g. `chant lint`'s rule/plugin resolution, which just needs *a* stable
32
+ * root to resolve relative paths against).
33
+ */
34
+ export function findProjectRoot(startDir) {
35
+ return findProjectConfig(startDir).dir;
36
+ }
37
+ /** The two names a workspace declaration may have (#2524 D1). */
38
+ export const WORKSPACE_DECLARATION_FILES = ["chant.workspace.json", "chant.workspace.jsonc"];
39
+ /**
40
+ * Walk up from `startDir` (inclusive) to the nearest `chant.workspace.json` or
41
+ * `chant.workspace.jsonc` (#2524 D1). The walk stops at the git root, the first
42
+ * directory holding `.git`, after checking it. Outside a git repository only
43
+ * `startDir` itself is checked, so a stray declaration in an unrelated
44
+ * ancestor is never picked up.
45
+ *
46
+ * It only tests whether files exist and loads nothing else, so a level-0
47
+ * command can afford to call it. {@link findProjectConfig} is unchanged and
48
+ * never looks at a declaration.
49
+ */
50
+ export function findWorkspaceRoot(startDir) {
51
+ const start = resolve(startDir);
52
+ let top;
53
+ for (let dir = start;; dir = dirname(dir)) {
54
+ if (existsSync(join(dir, ".git"))) {
55
+ top = dir;
56
+ break;
57
+ }
58
+ if (dirname(dir) === dir)
59
+ break;
60
+ }
61
+ for (let dir = start;; dir = dirname(dir)) {
62
+ const [json, jsonc] = WORKSPACE_DECLARATION_FILES.map((name) => join(dir, name));
63
+ const hasJson = existsSync(json);
64
+ const hasJsonc = existsSync(jsonc);
65
+ if (hasJson && hasJsonc)
66
+ return { dir, file: json, conflicting: jsonc };
67
+ if (hasJson)
68
+ return { dir, file: json };
69
+ if (hasJsonc)
70
+ return { dir, file: jsonc };
71
+ if (top === undefined || dir === top || dirname(dir) === dir)
72
+ return undefined;
73
+ }
74
+ }
@@ -0,0 +1,50 @@
1
+ import { existsSync } from "fs";
2
+ import { join } from "path";
3
+ /**
4
+ * Validate project structure.
5
+ *
6
+ * Checks that required files and directories exist for a chant project.
7
+ *
8
+ * @param projectDir - Root directory of the chant project
9
+ * @param lexicons - Lexicon names from config (e.g. ["aws"])
10
+ */
11
+ export function validateProjectStructure(projectDir, lexicons = []) {
12
+ const issues = [];
13
+ // Check for config file
14
+ const hasTsConfig = existsSync(join(projectDir, "chant.config.ts"));
15
+ const hasJsonConfig = existsSync(join(projectDir, "chant.config.json"));
16
+ if (!hasTsConfig && !hasJsonConfig) {
17
+ issues.push({
18
+ severity: "warning",
19
+ message: "No chant config found. Run \"chant init\" to create one.",
20
+ });
21
+ }
22
+ // Check for src directory
23
+ if (!existsSync(join(projectDir, "src"))) {
24
+ issues.push({
25
+ severity: "warning",
26
+ message: "No src/ directory found.",
27
+ });
28
+ }
29
+ // Check for .chant/types/core/
30
+ if (!existsSync(join(projectDir, ".chant", "types", "core", "index.d.ts"))) {
31
+ issues.push({
32
+ severity: "warning",
33
+ message: "Core types not installed in .chant/types/core/. Run \"chant update\" to sync.",
34
+ });
35
+ }
36
+ // Check for lexicon type stubs
37
+ for (const lexicon of lexicons) {
38
+ const lexiconDir = join(projectDir, ".chant", "types", `lexicon-${lexicon}`);
39
+ if (!existsSync(lexiconDir)) {
40
+ issues.push({
41
+ severity: "warning",
42
+ message: `Lexicon types not installed for "${lexicon}". Run "chant update" to sync.`,
43
+ });
44
+ }
45
+ }
46
+ return {
47
+ valid: issues.every((i) => i.severity !== "error"),
48
+ issues,
49
+ };
50
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Build provenance: where a declared entity came from in the TypeScript source.
3
+ *
4
+ * Stamped during discovery as a non-enumerable, symbol-keyed side channel on the
5
+ * entity object, so it never serializes into the emitted YAML/JSON — it is build
6
+ * metadata, not declared configuration. Read it back with {@link getProvenance}.
7
+ *
8
+ * Entity-level provenance (which file declared it, and which composite expanded
9
+ * it) answers "where did this resource come from?", which is the question an
10
+ * agent asks before changing it. {@link PathOrigin} (chant #1443) answers the
11
+ * follow-up — "what set THIS field" — for the paths a build can attribute
12
+ * without guessing. Neither is a YAML-line source map.
13
+ *
14
+ * {@link BuildParamProvenance} (chant #1064) is the other half: not "where did
15
+ * this ENTITY come from" but "what INPUTS was this whole BUILD invoked with" —
16
+ * the question ambient `process.env` reads used to answer invisibly. See
17
+ * ../build-params.ts for declaration/resolution and ../build.ts's
18
+ * `BuildResult.buildParams` for where a build surfaces it.
19
+ */
20
+ const PROVENANCE = Symbol.for("chant.provenance");
21
+ /** True when `prefix` addresses `path` or an ancestor of it, on a segment boundary. */
22
+ function isPathPrefix(prefix, path) {
23
+ if (prefix === "")
24
+ return true;
25
+ if (!path.startsWith(prefix))
26
+ return false;
27
+ if (path.length === prefix.length)
28
+ return true;
29
+ const next = path[prefix.length];
30
+ return next === "." || next === "[";
31
+ }
32
+ /**
33
+ * Merge provenance onto an entity. Non-enumerable so it is invisible to
34
+ * serializers and spreads. Existing fields win (`??=`), so the first/most
35
+ * specific writer — the innermost composite, the declaring file — is kept.
36
+ */
37
+ export function setProvenance(entity, prov) {
38
+ var _a;
39
+ if (!Object.isExtensible(entity))
40
+ return;
41
+ const existing = entity[PROVENANCE];
42
+ if (existing) {
43
+ existing.sourceFile ?? (existing.sourceFile = prov.sourceFile);
44
+ existing.composite ?? (existing.composite = prov.composite);
45
+ existing.compositeInstance ?? (existing.compositeInstance = prov.compositeInstance);
46
+ existing.compositeCall ?? (existing.compositeCall = prov.compositeCall);
47
+ if (prov.paths) {
48
+ existing.paths ?? (existing.paths = {});
49
+ for (const [path, origin] of Object.entries(prov.paths)) {
50
+ (_a = existing.paths)[path] ?? (_a[path] = origin);
51
+ }
52
+ }
53
+ return;
54
+ }
55
+ Object.defineProperty(entity, PROVENANCE, {
56
+ value: { ...prov, ...(prov.paths ? { paths: { ...prov.paths } } : {}) },
57
+ enumerable: false,
58
+ writable: true,
59
+ configurable: true,
60
+ });
61
+ }
62
+ /** Read an entity's build provenance, if any was stamped. */
63
+ export function getProvenance(entity) {
64
+ return entity[PROVENANCE];
65
+ }
66
+ /**
67
+ * Record one path's origin, first writer wins — the same rule
68
+ * {@link setProvenance} applies to entity-level fields, and for the same
69
+ * reason: expansion runs innermost-composite-first, so the earliest writer is
70
+ * the most specific one.
71
+ */
72
+ export function setPathProvenance(entity, path, origin) {
73
+ setProvenance(entity, { paths: { [path]: origin } });
74
+ }
75
+ /**
76
+ * An entity's recorded path origins in sorted key order, or `undefined` when
77
+ * none were recorded. Sorted because a build's outputs are compared byte for
78
+ * byte and object key order is not something insertion should decide.
79
+ */
80
+ export function getPathProvenance(entity) {
81
+ const paths = getProvenance(entity)?.paths;
82
+ if (!paths)
83
+ return undefined;
84
+ const keys = Object.keys(paths).sort();
85
+ if (keys.length === 0)
86
+ return undefined;
87
+ const out = {};
88
+ for (const key of keys)
89
+ out[key] = paths[key];
90
+ return out;
91
+ }
92
+ /**
93
+ * The origin governing `path` — the longest recorded key that addresses it or
94
+ * one of its ancestors. See {@link PROVENANCE_PATH_GRAMMAR}.
95
+ */
96
+ export function originOfPath(paths, path) {
97
+ if (!paths)
98
+ return undefined;
99
+ let best;
100
+ for (const key of Object.keys(paths)) {
101
+ if (!isPathPrefix(key, path))
102
+ continue;
103
+ if (best === undefined || key.length > best.length)
104
+ best = key;
105
+ }
106
+ return best === undefined ? undefined : paths[best];
107
+ }
108
+ const INTERPOLATION_FIELDS = Symbol.for("chant.interpolationFields");
109
+ /**
110
+ * For an entity a tagged template built: which of its `props` paths each
111
+ * interpolation fed, by interpolation index (chant #3212). Element `i` lists
112
+ * the paths the `i`-th `${...}` landed in, in {@link EntityProvenance.paths}'
113
+ * grammar (dotted names, no array segments). An interpolation that fed no
114
+ * field the author typed, such as a reference to another entity, lists none.
115
+ *
116
+ * Only the tag can say this. It is the tag that parsed the text, so a
117
+ * `${props.ttlDays}` inside `TTL ts + INTERVAL ${props.ttlDays} DAY` is known
118
+ * to have fed `ttl` only there. When a composite factory interpreted at fold
119
+ * time writes the template, `discovery/fold-import.ts` joins these paths with
120
+ * the factory parameters each interpolation reads, which is what lets drift on
121
+ * such a field be reported against the parameter. A tag that never calls this
122
+ * leaves its fields `unknown`, the honest answer, rather than claiming either.
123
+ *
124
+ * Stored like provenance itself: non-enumerable and symbol-keyed, so no
125
+ * serializer, spread or comparison of the output ever sees it.
126
+ */
127
+ export function setInterpolationFields(entity, fields) {
128
+ if (!Object.isExtensible(entity))
129
+ return;
130
+ Object.defineProperty(entity, INTERPOLATION_FIELDS, {
131
+ value: Object.freeze(fields.map((paths) => Object.freeze([...paths]))),
132
+ enumerable: false,
133
+ writable: true,
134
+ configurable: true,
135
+ });
136
+ }
137
+ /** What {@link setInterpolationFields} recorded on an entity, if anything. */
138
+ export function getInterpolationFields(entity) {
139
+ return entity[INTERPOLATION_FIELDS];
140
+ }
141
+ /** One-line rendering of an origin, for diff output. */
142
+ export function describePathOrigin(origin) {
143
+ switch (origin.kind) {
144
+ case "authored":
145
+ return "authored";
146
+ case "composite":
147
+ return `composite ${origin.composite} (${origin.instance})`;
148
+ case "build-param":
149
+ return `param ${origin.params.join(", ")}`;
150
+ case "composite-parameter":
151
+ return `composite ${origin.composite} parameter ${origin.parameters.join(", ")}`;
152
+ case "composite-literal":
153
+ return `composite ${origin.composite} literal`;
154
+ case "host":
155
+ return origin.reason;
156
+ }
157
+ }