@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,191 @@
1
+ /**
2
+ * What `chant workspace status` reads of a project's stewards and Ops
3
+ * (#3636), kept per tree so a status doesn't import every `*.op.ts` file
4
+ * each time it runs.
5
+ *
6
+ * Discovery (`../op/discover.ts`) has to import the Op modules, and an Op
7
+ * module may do work when it is imported: run git, read files, even start
8
+ * another chant. Status needs only plain fields of what it finds: each
9
+ * steward's name, file, form, vault, capabilities and Ops, and of each Op
10
+ * its name, schedule, labels, work lease kind and `changesCheckout`. The
11
+ * first status on a tree discovers them and writes that index to
12
+ * `<cache dir>/workspace-stewards/<checkout>/<key>.json`; later ones read
13
+ * it back, until the tree changes. The cache dir is the one the graph cache
14
+ * uses (`./graph-cache.ts`): `$CHANT_CACHE_DIR`, else
15
+ * `$XDG_CACHE_HOME/chant`, else `~/.cache/chant`, outside the workspace,
16
+ * since a read never changes the workspace it reads.
17
+ *
18
+ * The tree is the checkout's `HEAD` tree plus every changed or untracked
19
+ * file `git status` lists (its path and contents), and the chant version,
20
+ * so a commit, an edit or a new file anywhere in the checkout discovers
21
+ * again. Files git ignores (`node_modules`) are not part of it. An index is
22
+ * only written when every Op file imported, so an import that failed is
23
+ * tried again by the next status. `CHANT_STEWARD_INDEX=0` turns the index
24
+ * off, for an Op module whose declaration depends on more than its tree.
25
+ */
26
+ import { execFile } from "node:child_process";
27
+ import { createHash } from "node:crypto";
28
+ import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
29
+ import { homedir } from "node:os";
30
+ import { dirname, join, resolve } from "node:path";
31
+ import { promisify } from "node:util";
32
+ import { CHANT_VERSION } from "../cli/version.js";
33
+ import { discoverOps, discoverStewards } from "../op/discover.js";
34
+ import { stewardBesideOf } from "../op/steward.js";
35
+ const execFileAsync = promisify(execFile);
36
+ /** Bumped when the index's shape changes, so an older index is never read. */
37
+ const INDEX_FORMAT = 1;
38
+ /** Where the indexes of the checkout at `top` live, and the checkout's real path. */
39
+ function indexDir(top, env = process.env) {
40
+ const base = env.CHANT_CACHE_DIR || join(env.XDG_CACHE_HOME || join(homedir(), ".cache"), "chant");
41
+ let checkout = resolve(top);
42
+ try {
43
+ checkout = realpathSync(checkout);
44
+ }
45
+ catch {
46
+ // Keyed on the path as given.
47
+ }
48
+ return { dir: join(base, "workspace-stewards", createHash("sha256").update(checkout).digest("hex").slice(0, 16)), checkout };
49
+ }
50
+ /** How many indexes a checkout keeps: the newest, by when they were written. */
51
+ const KEPT = 32;
52
+ function indexOp(op) {
53
+ return {
54
+ name: op.name,
55
+ schedule: op.schedule ? { cron: op.schedule.cron } : null,
56
+ ...(op.labels ? { labels: { ...op.labels } } : {}),
57
+ workLease: op.workLease ? { kind: op.workLease.kind ?? null } : null,
58
+ changesCheckout: op.changesCheckout === true,
59
+ };
60
+ }
61
+ /** Discover the stewards and Ops under `memberDir`, importing every Op file. Throws as `discoverStewards` does. */
62
+ export async function discoverStewardIndex(memberDir) {
63
+ const { stewards, errors, conflicts } = await discoverStewards({ cwd: memberDir });
64
+ const listed = [...stewards.values()].map(({ declaration, filePath }) => ({
65
+ name: declaration.name,
66
+ filePath,
67
+ ops: declaration.ops.map(indexOp),
68
+ beside: stewardBesideOf(declaration).map((b) => ({ op: b.op, ready: b.ready !== null && b.ready !== undefined })),
69
+ form: { default: declaration.form.default, environments: { ...declaration.form.environments } },
70
+ capabilities: Array.isArray(declaration.capabilities) ? [...declaration.capabilities] : [],
71
+ vault: typeof declaration.vault === "string" ? declaration.vault : null,
72
+ }));
73
+ let otherOps = null;
74
+ // Only a project with a steward has waits to look for among its other Ops.
75
+ if (listed.length > 0) {
76
+ const declared = new Set(listed.flatMap((s) => s.ops.map((op) => op.name)));
77
+ try {
78
+ otherOps = [...(await discoverOps({ cwd: memberDir })).ops.values()].map((d) => indexOp(d.config)).filter((op) => !declared.has(op.name));
79
+ }
80
+ catch {
81
+ otherOps = null;
82
+ }
83
+ }
84
+ return { stewards: listed, errors, conflicts, otherOps };
85
+ }
86
+ async function git(args, cwd) {
87
+ // A read: `git status` must not take the index lock from a writer.
88
+ const env = { ...process.env, GIT_OPTIONAL_LOCKS: "0" };
89
+ const { stdout } = await execFileAsync("git", args, { cwd, env, maxBuffer: 64 * 1024 * 1024 });
90
+ return stdout;
91
+ }
92
+ /**
93
+ * The key of the tree `memberDir` is in: its `HEAD` tree, each changed or
94
+ * untracked file's path and contents, the chant version and `memberDir`.
95
+ * Null outside a checkout, or when git can't say.
96
+ */
97
+ export async function treeKey(memberDir) {
98
+ try {
99
+ const top = (await git(["rev-parse", "--show-toplevel"], memberDir)).trim();
100
+ const head = (await git(["rev-parse", "--verify", "--quiet", "HEAD^{tree}"], top).catch(() => "")).trim();
101
+ const changed = (await git(["status", "--porcelain=v1", "-z", "--untracked-files=all", "--no-renames"], top))
102
+ .split("\0")
103
+ .filter((e) => e.length > 3)
104
+ .map((e) => e.slice(3))
105
+ .sort();
106
+ const h = createHash("sha256");
107
+ h.update(`${INDEX_FORMAT}\0${CHANT_VERSION}\0${resolve(memberDir)}\0${head}\0`);
108
+ for (const path of changed) {
109
+ h.update(`${path}\0`);
110
+ try {
111
+ const full = join(top, path);
112
+ h.update(statSync(full).isFile() ? readFileSync(full) : "dir");
113
+ }
114
+ catch {
115
+ h.update("gone");
116
+ }
117
+ h.update("\0");
118
+ }
119
+ return { key: h.digest("hex"), ...indexDir(top) };
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ /**
126
+ * Remove all but the {@link KEPT} newest indexes of this checkout, and the
127
+ * indexes of checkouts that are gone (each directory names its checkout in
128
+ * its `checkout` file).
129
+ */
130
+ function prune(dir) {
131
+ const files = readdirSync(dir)
132
+ .filter((f) => f.endsWith(".json"))
133
+ .map((f) => ({ f, at: statSync(join(dir, f)).mtimeMs }))
134
+ .sort((a, b) => b.at - a.at);
135
+ for (const { f } of files.slice(KEPT))
136
+ rmSync(join(dir, f), { force: true });
137
+ const parent = dirname(dir);
138
+ for (const other of readdirSync(parent)) {
139
+ const at = join(parent, other);
140
+ if (at === dir)
141
+ continue;
142
+ try {
143
+ if (!existsSync(readFileSync(join(at, "checkout"), "utf-8")))
144
+ rmSync(at, { recursive: true, force: true });
145
+ }
146
+ catch {
147
+ // No checkout file, or being written: left alone.
148
+ }
149
+ }
150
+ }
151
+ function isIndex(v) {
152
+ const i = v;
153
+ return !!i && Array.isArray(i.stewards) && Array.isArray(i.errors) && Array.isArray(i.conflicts) && (i.otherOps === null || Array.isArray(i.otherOps));
154
+ }
155
+ /**
156
+ * The stewards and Ops under `memberDir`: from the index for its tree when
157
+ * there is one, else discovered and indexed. Throws as `discoverStewards`
158
+ * does.
159
+ */
160
+ export async function readStewardIndex(memberDir, deps = {}) {
161
+ const discover = deps.discover ?? discoverStewardIndex;
162
+ if (process.env.CHANT_STEWARD_INDEX === "0")
163
+ return discover(memberDir);
164
+ const tree = await treeKey(memberDir);
165
+ if (!tree)
166
+ return discover(memberDir);
167
+ const file = join(tree.dir, `${tree.key}.json`);
168
+ try {
169
+ const kept = JSON.parse(readFileSync(file, "utf-8"));
170
+ if (isIndex(kept))
171
+ return kept;
172
+ }
173
+ catch {
174
+ // None yet, or unreadable: discover.
175
+ }
176
+ const index = await discover(memberDir);
177
+ if (index.errors.length === 0) {
178
+ try {
179
+ mkdirSync(tree.dir, { recursive: true });
180
+ writeFileSync(join(tree.dir, "checkout"), tree.checkout);
181
+ const tmp = `${file}.${process.pid}.tmp`;
182
+ writeFileSync(tmp, JSON.stringify(index));
183
+ renameSync(tmp, file);
184
+ prune(tree.dir);
185
+ }
186
+ catch {
187
+ // A cache dir that can't be written: status still works, discovering each time.
188
+ }
189
+ }
190
+ return index;
191
+ }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Symbol regions for the intent walk (#3034): `graph --intent <path>#<symbol>`
3
+ * names a function, class, method, type or constant instead of a line range,
4
+ * because a line range means something else once the file is edited.
5
+ *
6
+ * A resolver turns a symbol into its current lines in the tree read, and the
7
+ * walk follows those lines through history as it follows any line range
8
+ * (`git log -L`). Resolvers are chosen by file extension. Core ships one for
9
+ * TypeScript and JavaScript, parsed with the TypeScript compiler chant already
10
+ * depends on. A lexicon can contribute more through its plugin's
11
+ * `symbolResolvers()` (#3313), which the intent walk loads for a file in a
12
+ * member that configures the lexicon (`lexicon-symbols.ts`); core's resolver
13
+ * stays the one for `.ts` and `.js`. A file with no resolver is refused with
14
+ * `intent-symbol-unsupported`, and a line range still works for it.
15
+ *
16
+ * A symbol is a name, or a dotted path through classes, namespaces,
17
+ * interfaces, enums and object literals bound to a constant, such as
18
+ * `createApp` or `Server.listen`. A bare name is looked up among the
19
+ * file's top-level declarations first, then among every nested one; when it
20
+ * matches more than one declaration it is refused as ambiguous, with the
21
+ * qualified names that would pick one. The lines run from the declaration's
22
+ * doc comment, when it has one, to its last line.
23
+ */
24
+ import * as ts from "typescript";
25
+ // ── TypeScript and JavaScript ────────────────────────────────────────────────
26
+ function scriptKind(path) {
27
+ if (/\.tsx$/.test(path))
28
+ return ts.ScriptKind.TSX;
29
+ if (/\.jsx$/.test(path))
30
+ return ts.ScriptKind.JSX;
31
+ if (/\.[cm]?js$/.test(path))
32
+ return ts.ScriptKind.JS;
33
+ return ts.ScriptKind.TS;
34
+ }
35
+ function nameText(name) {
36
+ if (!name)
37
+ return undefined;
38
+ if (ts.isIdentifier(name) || ts.isPrivateIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name))
39
+ return name.text;
40
+ return undefined;
41
+ }
42
+ const typescriptResolver = {
43
+ language: "TypeScript and JavaScript",
44
+ extensions: [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"],
45
+ declarations(path, text) {
46
+ const sf = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, scriptKind(path));
47
+ const out = [];
48
+ const lineOf = (pos) => sf.getLineAndCharacterOfPosition(pos).line + 1;
49
+ // The span: from the doc comment (or the statement holding a lone variable) to the node's end.
50
+ const push = (qualified, kind, node) => {
51
+ out.push({ qualified, kind, lines: { start: lineOf(node.getStart(sf, true)), end: lineOf(node.getEnd()) } });
52
+ };
53
+ const visitMembers = (prefix, members) => {
54
+ for (const m of members) {
55
+ const name = nameText(m.name);
56
+ if (name === undefined) {
57
+ if (ts.isConstructorDeclaration(m))
58
+ push(`${prefix}.constructor`, "method", m);
59
+ continue;
60
+ }
61
+ const q = `${prefix}.${name}`;
62
+ if (ts.isMethodDeclaration(m) || ts.isMethodSignature(m) || ts.isGetAccessorDeclaration(m) || ts.isSetAccessorDeclaration(m))
63
+ push(q, "method", m);
64
+ else if (ts.isPropertyDeclaration(m) || ts.isPropertySignature(m)) {
65
+ push(q, "property", m);
66
+ if (ts.isPropertyDeclaration(m) && m.initializer)
67
+ visitValue(q, m.initializer);
68
+ }
69
+ else if (ts.isEnumMember(m))
70
+ push(q, "member", m);
71
+ else if (ts.isPropertyAssignment(m)) {
72
+ push(q, "property", m);
73
+ visitValue(q, m.initializer);
74
+ }
75
+ else if (ts.isShorthandPropertyAssignment(m))
76
+ push(q, "property", m);
77
+ }
78
+ };
79
+ // A class expression or object literal bound to a name has members of its own.
80
+ const visitValue = (prefix, value) => {
81
+ let v = value;
82
+ while (ts.isParenthesizedExpression(v) || ts.isAsExpression(v) || ts.isSatisfiesExpression(v))
83
+ v = v.expression;
84
+ if (ts.isClassExpression(v))
85
+ visitMembers(prefix, v.members);
86
+ else if (ts.isObjectLiteralExpression(v))
87
+ visitMembers(prefix, v.properties);
88
+ };
89
+ const visitStatements = (prefix, statements) => {
90
+ const q = (name) => (prefix ? `${prefix}.${name}` : name);
91
+ for (const s of statements) {
92
+ if (ts.isFunctionDeclaration(s) && s.name)
93
+ push(q(s.name.text), "function", s);
94
+ else if (ts.isClassDeclaration(s) && s.name) {
95
+ push(q(s.name.text), "class", s);
96
+ visitMembers(q(s.name.text), s.members);
97
+ }
98
+ else if (ts.isInterfaceDeclaration(s)) {
99
+ push(q(s.name.text), "interface", s);
100
+ visitMembers(q(s.name.text), s.members);
101
+ }
102
+ else if (ts.isTypeAliasDeclaration(s))
103
+ push(q(s.name.text), "type", s);
104
+ else if (ts.isEnumDeclaration(s)) {
105
+ push(q(s.name.text), "enum", s);
106
+ visitMembers(q(s.name.text), s.members);
107
+ }
108
+ else if (ts.isModuleDeclaration(s)) {
109
+ const name = nameText(s.name);
110
+ if (name === undefined)
111
+ continue;
112
+ push(q(name), "namespace", s);
113
+ let body = s.body;
114
+ let inner = q(name);
115
+ while (body && ts.isModuleDeclaration(body)) {
116
+ inner = `${inner}.${nameText(body.name)}`;
117
+ body = body.body;
118
+ }
119
+ if (body && ts.isModuleBlock(body))
120
+ visitStatements(inner, body.statements);
121
+ }
122
+ else if (ts.isVariableStatement(s)) {
123
+ const lone = s.declarationList.declarations.length === 1;
124
+ for (const d of s.declarationList.declarations) {
125
+ const name = nameText(d.name);
126
+ if (name === undefined)
127
+ continue;
128
+ // A lone declaration takes its statement's lines, so `export const x = ...` and its doc comment are in the region.
129
+ push(q(name), "variable", lone ? s : d);
130
+ if (d.initializer)
131
+ visitValue(q(name), d.initializer);
132
+ }
133
+ }
134
+ else if (ts.isExportAssignment(s) && !s.isExportEquals) {
135
+ push(q("default"), "variable", s);
136
+ visitValue(q("default"), s.expression);
137
+ }
138
+ }
139
+ };
140
+ visitStatements("", sf.statements);
141
+ return out;
142
+ },
143
+ };
144
+ /** The resolvers core ships, chosen by the file's extension. */
145
+ export const SYMBOL_RESOLVERS = [typescriptResolver];
146
+ /**
147
+ * The resolver for a path, or undefined when none reads its language. Core's
148
+ * resolvers come first, so a lexicon's never takes `.ts` or `.js` from them;
149
+ * among `extra`, the first that names the extension wins.
150
+ */
151
+ export function symbolResolverFor(path, extra = []) {
152
+ const lower = path.toLowerCase();
153
+ return [...SYMBOL_RESOLVERS, ...extra].find((r) => r.extensions.some((e) => lower.endsWith(e.toLowerCase())));
154
+ }
155
+ /**
156
+ * Resolve `symbol` in the file `path` holding `text`: its current lines, or
157
+ * why it can't be. `extra` are the resolvers a lexicon contributed for the
158
+ * file's member (#3313).
159
+ */
160
+ export function resolveSymbol(path, text, symbol, extra = []) {
161
+ const resolver = symbolResolverFor(path, extra);
162
+ if (!resolver) {
163
+ const known = [...new Set([...SYMBOL_RESOLVERS, ...extra].flatMap((r) => r.extensions))].join(", ");
164
+ return { ok: false, reason: "unsupported", message: `${path} has no symbol resolver: symbols resolve in ${known} files. Give a line range, ${path}:<start>-<end>, instead`, candidates: [] };
165
+ }
166
+ const all = resolver.declarations(path, text);
167
+ const exact = all.filter((d) => d.qualified === symbol);
168
+ // A name declared twice at one path, such as an overload or a merged declaration, is one region from the first to the last.
169
+ if (exact.length > 0) {
170
+ const start = Math.min(...exact.map((d) => d.lines.start));
171
+ const end = Math.max(...exact.map((d) => d.lines.end));
172
+ return { ok: true, declaration: { qualified: symbol, kind: exact[0].kind, lines: { start, end } } };
173
+ }
174
+ const nested = [...new Set(all.filter((d) => d.qualified.endsWith(`.${symbol}`)).map((d) => d.qualified))];
175
+ if (nested.length === 1)
176
+ return resolveSymbol(path, text, nested[0], extra);
177
+ if (nested.length > 1) {
178
+ return { ok: false, reason: "ambiguous", message: `${symbol} names ${nested.length} declarations in ${path}: ${nested.join(", ")}. Give the qualified name`, candidates: nested };
179
+ }
180
+ const top = [...new Set(all.filter((d) => !d.qualified.includes(".")).map((d) => d.qualified))];
181
+ const shown = top.slice(0, 20);
182
+ return {
183
+ ok: false,
184
+ reason: "unknown",
185
+ message: `${path} declares no ${symbol}${top.length > 0 ? `; its top-level declarations are ${shown.join(", ")}${top.length > shown.length ? `, and ${top.length - shown.length} more` : ""}` : ", and no top-level declaration a resolver reads"}`,
186
+ candidates: shown,
187
+ };
188
+ }
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Template parameters (#2627, #2524 D9): `chant.template.json` at a
3
+ * template's root declares the parameters `chant init --from` takes and the
4
+ * files they are substituted into.
5
+ *
6
+ * ```json
7
+ * {
8
+ * "parameters": {
9
+ * "name": { "type": "string", "default": "Reference app", "pattern": "^[A-Za-z0-9][A-Za-z0-9 ._-]*$" }
10
+ * },
11
+ * "files": ["app/src/server.mjs"]
12
+ * }
13
+ * ```
14
+ *
15
+ * A listed file carries `{{chant:<name>}}` where the value goes. The `chant:`
16
+ * prefix keeps the placeholder apart from TypeScript template literals
17
+ * (`${x}`), GitHub and Forgejo expressions (`${{ x }}`) and Handlebars or
18
+ * Mustache (`{{x}}`), so a template can hold any of those in a listed file.
19
+ * Only listed files are substituted, the value is inserted as written, and a
20
+ * placeholder naming an undeclared parameter is an error in the template.
21
+ *
22
+ * The manifest is JSON and read as data: no template code runs at init or
23
+ * upgrade. It is template metadata, like `.chant/migrations/`, so it is not
24
+ * copied into the project. The values used are recorded in the lineage's
25
+ * `parameters`, and `chant workspace upgrade` substitutes them again into both
26
+ * the merge base and the target version, so an unedited file carrying a value
27
+ * still has its recorded hash.
28
+ *
29
+ * A parameter marked `hostBound` holds a value that differs per host, such
30
+ * as the domain a hosted service serves the app on. Its value is recorded in
31
+ * `parameters` like any other, and the lineage also records, under
32
+ * `hostBound`, the files whose template text carries it, so `chant workspace
33
+ * export` can switch the value for the export and `import` can switch it
34
+ * back without fetching the template (#2552).
35
+ */
36
+ import { posix } from "node:path";
37
+ import { z } from "zod";
38
+ import { LockError } from "./lineage-lock.js";
39
+ import { MIGRATIONS_DIR } from "./lineage-migrations.js";
40
+ /** The manifest's path, relative to the template's root (the `#<member>` directory, when one is given). */
41
+ export const TEMPLATE_MANIFEST = "chant.template.json";
42
+ const PARAM_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
43
+ /** `{{chant:<name>}}`. */
44
+ const PLACEHOLDER = /\{\{chant:([A-Za-z_][A-Za-z0-9_]*)\}\}/g;
45
+ export function placeholder(name) {
46
+ return `{{chant:${name}}}`;
47
+ }
48
+ const ParameterSchema = z
49
+ .object({
50
+ type: z.literal("string"),
51
+ default: z.string().optional(),
52
+ /** A regular expression every value must match, checked before substitution. */
53
+ pattern: z.string().optional(),
54
+ /** The value differs per host (#2524 D9): export and import switch it (#2552). */
55
+ hostBound: z.boolean().optional(),
56
+ description: z.string().optional(),
57
+ })
58
+ .strict();
59
+ const ManifestSchema = z
60
+ .object({
61
+ $comment: z.string().optional(),
62
+ parameters: z.record(z.string(), ParameterSchema),
63
+ files: z.array(z.string().min(1)),
64
+ })
65
+ .strict();
66
+ function has(obj, key) {
67
+ return Object.prototype.hasOwnProperty.call(obj, key);
68
+ }
69
+ export class TemplateParameterError extends LockError {
70
+ constructor() {
71
+ super(...arguments);
72
+ this.name = "TemplateParameterError";
73
+ }
74
+ }
75
+ /**
76
+ * Read the manifest from a template's files, or null when it has none.
77
+ * Throws on a manifest that is not valid JSON or does not match the schema.
78
+ */
79
+ export function readManifest(files) {
80
+ const data = files.get(TEMPLATE_MANIFEST);
81
+ if (!data)
82
+ return null;
83
+ let raw;
84
+ try {
85
+ raw = JSON.parse(data.toString("utf-8"));
86
+ }
87
+ catch (err) {
88
+ throw new TemplateParameterError(`${TEMPLATE_MANIFEST} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
89
+ }
90
+ const parsed = ManifestSchema.safeParse(raw);
91
+ if (!parsed.success) {
92
+ throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: ${parsed.error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ")}`);
93
+ }
94
+ const manifest = parsed.data;
95
+ for (const [name, p] of Object.entries(manifest.parameters)) {
96
+ if (!PARAM_NAME.test(name)) {
97
+ throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: parameter name "${name}" is not a letter or _ followed by letters, digits or _`);
98
+ }
99
+ if (p.pattern !== undefined) {
100
+ try {
101
+ new RegExp(p.pattern, "u");
102
+ }
103
+ catch {
104
+ throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: parameters.${name}.pattern is not a regular expression`);
105
+ }
106
+ if (p.default !== undefined)
107
+ checkValue(name, p, p.default, "its default");
108
+ }
109
+ }
110
+ for (const f of manifest.files) {
111
+ const norm = posix.normalize(f);
112
+ if (norm !== f || f.startsWith("/") || f.startsWith("../") || f === TEMPLATE_MANIFEST || f.startsWith(`${MIGRATIONS_DIR}/`)) {
113
+ throw new TemplateParameterError(`invalid ${TEMPLATE_MANIFEST}: files lists "${f}", which is not a normalised path to a template file`);
114
+ }
115
+ }
116
+ return manifest;
117
+ }
118
+ function checkValue(name, p, value, what) {
119
+ if (p.pattern !== undefined && !new RegExp(p.pattern, "u").test(value)) {
120
+ throw new TemplateParameterError(`parameter ${name}: ${what} ${JSON.stringify(value)} does not match ${p.pattern}`);
121
+ }
122
+ }
123
+ /**
124
+ * Parse `--param name=value` arguments (split at the first `=`). A name given
125
+ * twice is refused rather than silently taking the last value.
126
+ */
127
+ export function parseParamArgs(args) {
128
+ const out = {};
129
+ for (const arg of args) {
130
+ const eq = arg.indexOf("=");
131
+ if (eq <= 0)
132
+ throw new TemplateParameterError(`--param ${arg}: expected <name>=<value>`);
133
+ const name = arg.slice(0, eq);
134
+ if (has(out, name))
135
+ throw new TemplateParameterError(`--param ${name} is given twice`);
136
+ out[name] = arg.slice(eq + 1);
137
+ }
138
+ return out;
139
+ }
140
+ function declaredList(manifest) {
141
+ const names = manifest ? Object.keys(manifest.parameters).sort() : [];
142
+ return names.length > 0 ? `declared: ${names.join(", ")}` : "the template declares none";
143
+ }
144
+ /**
145
+ * The value of every declared parameter: the given value, or the default.
146
+ * Refuses an undeclared name (listing the declared ones), a parameter with no
147
+ * value and no default, and a value that does not match its pattern.
148
+ */
149
+ export function resolveParameters(manifest, given) {
150
+ const declared = manifest?.parameters ?? {};
151
+ const unknown = Object.keys(given).filter((n) => !has(declared, n)).sort();
152
+ if (unknown.length > 0) {
153
+ throw new TemplateParameterError(`unknown parameter${unknown.length > 1 ? "s" : ""} ${unknown.join(", ")} (${declaredList(manifest)})`);
154
+ }
155
+ const values = {};
156
+ const missing = [];
157
+ for (const name of Object.keys(declared).sort()) {
158
+ const p = declared[name];
159
+ const value = has(given, name) ? given[name] : p.default;
160
+ if (value === undefined) {
161
+ missing.push(name);
162
+ continue;
163
+ }
164
+ checkValue(name, p, value, has(given, name) ? "the value" : "its default");
165
+ values[name] = value;
166
+ }
167
+ if (missing.length > 0) {
168
+ throw new TemplateParameterError(`parameter${missing.length > 1 ? "s" : ""} ${missing.join(", ")} ${missing.length > 1 ? "have" : "has"} no default; pass ${missing.map((n) => `--param ${n}=<value>`).join(" ")}`);
169
+ }
170
+ return values;
171
+ }
172
+ /**
173
+ * The template's files as the project gets them: the manifest removed, and
174
+ * each listed file with its placeholders replaced. A listed file that is
175
+ * missing, or a placeholder naming no declared parameter, is refused.
176
+ */
177
+ export function substituteParameters(files, manifest, values) {
178
+ const out = new Map(files);
179
+ out.delete(TEMPLATE_MANIFEST);
180
+ if (!manifest)
181
+ return out;
182
+ for (const path of manifest.files) {
183
+ const data = out.get(path);
184
+ if (!data)
185
+ throw new TemplateParameterError(`${TEMPLATE_MANIFEST} lists ${path}, which is not in the template`);
186
+ const text = data.toString("utf-8");
187
+ const replaced = text.replace(PLACEHOLDER, (_m, name) => {
188
+ if (!has(values, name)) {
189
+ throw new TemplateParameterError(`${path} has ${placeholder(name)}, but ${TEMPLATE_MANIFEST} declares no parameter ${name}`);
190
+ }
191
+ return values[name];
192
+ });
193
+ if (replaced !== text)
194
+ out.set(path, Buffer.from(replaced, "utf-8"));
195
+ }
196
+ return out;
197
+ }
198
+ /**
199
+ * The values an upgrade substitutes into a version of the template: the
200
+ * recorded value of every parameter that version declares, and the default of
201
+ * one it adds. A recorded parameter the version no longer declares is dropped.
202
+ */
203
+ export function carryParameters(manifest, recorded) {
204
+ const declared = manifest?.parameters ?? {};
205
+ const given = {};
206
+ for (const [name, value] of Object.entries(recorded)) {
207
+ if (has(declared, name) && typeof value === "string")
208
+ given[name] = value;
209
+ }
210
+ return resolveParameters(manifest, given);
211
+ }
212
+ /**
213
+ * The host-bound parameters of a template (#2552), each with the listed files
214
+ * whose text carries its placeholder. Undefined when the template declares none.
215
+ */
216
+ export function hostBoundFiles(files, manifest) {
217
+ if (!manifest)
218
+ return undefined;
219
+ const names = Object.keys(manifest.parameters).filter((n) => manifest.parameters[n].hostBound === true).sort();
220
+ if (names.length === 0)
221
+ return undefined;
222
+ const out = {};
223
+ for (const name of names) {
224
+ out[name] = manifest.files.filter((f) => files.get(f)?.toString("utf-8").includes(placeholder(name))).sort();
225
+ }
226
+ return out;
227
+ }