@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,673 @@
1
+ /**
2
+ * Workspace reader conformance (#2657, ws-052; published by #2679).
3
+ *
4
+ * A reader of a workspace, such as hud or behold, reads only through the
5
+ * read contract (#2524 D15, ws-017) and writes nothing. This module holds a
6
+ * reader to that, for each read-contract command it lists:
7
+ *
8
+ * 1. The reader's `read(command, args)` returns a document that validates
9
+ * against that command's output schema, with the contract version this
10
+ * chant writes.
11
+ * 2. Each read makes exactly one chant call, and that call is the contract
12
+ * command with the suite's arguments and the command's JSON flag, and
13
+ * nothing else.
14
+ * 3. What the reader returns is the document chant printed, unchanged.
15
+ * 4. The workspace's files are byte for byte the same after every read.
16
+ *
17
+ * How "touched nothing else" is checked: the reader is built by calling
18
+ * `reader(chant)`, where `chant` is a recording transport. The reader is
19
+ * never given the workspace's path, so the transport is its only way to the
20
+ * workspace, and every call through it is recorded and compared with the
21
+ * contract command (points 2 and 3). Every file under the workspace is
22
+ * hashed before the first read and after the last one (point 4), which
23
+ * catches a write by any route, the transport included.
24
+ *
25
+ * This module ships in `@intentius/chant` as the subpath
26
+ * `@intentius/chant/workspace/conformance` and imports no test runner.
27
+ * {@link runWorkspaceReaderConformance} returns the problems for `node:test`
28
+ * or any runner, {@link checkReaderRead} checks one read, and
29
+ * `@intentius/chant/workspace/conformance/vitest` wraps the same checks in
30
+ * `describe` and `it`.
31
+ *
32
+ * The workspace: inside the chant repository it is `reference-workspace/`.
33
+ * Anywhere else the suite generates one in a temporary directory from the
34
+ * `__fixture__/` this package ships beside this module (a decision kind and record, an
35
+ * app, and a chant member with one composite and one component), declared
36
+ * by `chant workspace init --yes`, so {@link REFERENCE_READS} resolve in
37
+ * both. `workspaceDir` names another workspace with the same files.
38
+ *
39
+ * The workspace the suite generates for a run also holds one decision,
40
+ * proposed and never committed ({@link UNCOMMITTED_DECISION}), so
41
+ * `records --uncommitted` (#3160) has a record to list with its `worktree`.
42
+ * {@link createConformanceWorkspace} called directly leaves it out unless
43
+ * asked, so a test that writes records there allocates the ids it always
44
+ * did. In the chant repository the reference workspace holds whatever the
45
+ * checkout does, often nothing uncommitted.
46
+ */
47
+ import { execFileSync, spawn } from "node:child_process";
48
+ import { createHash } from "node:crypto";
49
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
50
+ import { createRequire } from "node:module";
51
+ import { tmpdir } from "node:os";
52
+ import { dirname, join, resolve } from "node:path";
53
+ import { fileURLToPath, pathToFileURL } from "node:url";
54
+ import { isDeepStrictEqual } from "node:util";
55
+ import { READ_CONTRACT_VERSION } from "../reason-codes.js";
56
+ /** The read-contract commands, as a reader names them. */
57
+ export const READ_CONTRACT_COMMANDS = ["ls", "graph", "check", "status", "records", "records --uncommitted", "graph --intent", "graph --composites", "runs", "wip"];
58
+ /**
59
+ * Each command's output schema, beside this module's parent in `src/workspace/`.
60
+ * The write commands' schemas (`records-new`, `records-amend`,
61
+ * `records-review`, #2675) are not here: a reader never runs them.
62
+ */
63
+ export const READ_CONTRACT_SCHEMAS = {
64
+ ls: "ls.schema.json",
65
+ graph: "graph.schema.json",
66
+ check: "check.schema.json",
67
+ status: "status.schema.json",
68
+ records: "records.schema.json",
69
+ "records --uncommitted": "records.schema.json",
70
+ "graph --intent": "intent.schema.json",
71
+ "graph --composites": "composites.schema.json",
72
+ runs: "runs.schema.json",
73
+ wip: "wip.schema.json",
74
+ };
75
+ /** The flags that ask each command for its JSON document. A reader adds one of these and nothing else. */
76
+ export const READ_CONTRACT_JSON_FLAGS = {
77
+ ls: [["--json"]],
78
+ graph: [[], ["--json"]],
79
+ check: [["--format", "json"]],
80
+ status: [["--json"]],
81
+ records: [["--json"]],
82
+ "records --uncommitted": [["--json"]],
83
+ "graph --intent": [["--json"]],
84
+ "graph --composites": [[], ["--json"]],
85
+ runs: [["--json"]],
86
+ wip: [["--json"]],
87
+ };
88
+ /** The arguments the suite passes each read, on the reference workspace or the generated one. */
89
+ export const REFERENCE_READS = {
90
+ ls: [],
91
+ graph: ["--kind", "decisions/decision.kind.mjs"],
92
+ check: [],
93
+ status: ["dev"],
94
+ records: ["--kind", "decisions/decision.kind.mjs"],
95
+ "records --uncommitted": ["--kind", "decisions/decision.kind.mjs"],
96
+ "graph --intent": ["app/src/server.mjs:19", "--kind", "decisions/decision.kind.mjs"],
97
+ "graph --composites": [],
98
+ runs: [],
99
+ wip: [],
100
+ };
101
+ const here = dirname(fileURLToPath(import.meta.url));
102
+ /** The package this module ships in: `packages/core` in the repository, `node_modules/@intentius/chant` when installed. */
103
+ const packageRoot = resolve(here, "..", "..", "..");
104
+ const workspaceSrc = resolve(here, "..");
105
+ /**
106
+ * The fixture the generated workspace is copied from, shipped under `src/`.
107
+ * Its `__fixture__` name keeps `chant workspace init` on the chant repository
108
+ * from proposing its projects as members.
109
+ */
110
+ export const CONFORMANCE_FIXTURE_DIR = join(here, "__fixture__");
111
+ /** The chant repository this module is part of, when it is not an installed copy. */
112
+ function chantCheckout() {
113
+ const root = resolve(packageRoot, "..", "..");
114
+ const inCheckout = existsSync(join(root, "reference-workspace", "chant.workspace.json")) &&
115
+ existsSync(join(packageRoot, "src", "cli", "main.ts")) &&
116
+ existsSync(join(root, "node_modules", "tsx", "dist", "loader.mjs"));
117
+ return inCheckout ? root : undefined;
118
+ }
119
+ /** The chant the suite runs when `chantCommand` is not given. */
120
+ export function defaultChantCommand(cwd = process.cwd()) {
121
+ const checkout = chantCheckout();
122
+ if (checkout) {
123
+ return [process.execPath, "--import", pathToFileURL(join(checkout, "node_modules", "tsx", "dist", "loader.mjs")).href, join(packageRoot, "src", "cli", "main.ts")];
124
+ }
125
+ for (let at = resolve(cwd);; at = dirname(at)) {
126
+ const bin = join(at, "node_modules", ".bin", "chant");
127
+ if (existsSync(bin))
128
+ return [bin];
129
+ if (dirname(at) === at)
130
+ break;
131
+ }
132
+ // The chant this module shipped with, so the suite and the chant agree on the contract.
133
+ const own = join(packageRoot, "bin", "chant");
134
+ return [existsSync(own) ? own : "chant"];
135
+ }
136
+ /** The reference workspace in the chant repository, or undefined in an installed copy. */
137
+ export function referenceWorkspaceDir() {
138
+ const checkout = chantCheckout();
139
+ return checkout ? join(checkout, "reference-workspace") : undefined;
140
+ }
141
+ const validators = new Map();
142
+ /** A command's output schema and a draft 2020-12 validator for it, from this package's own ajv 8. */
143
+ export function readContractSchema(command) {
144
+ const schema = JSON.parse(readFileSync(join(workspaceSrc, READ_CONTRACT_SCHEMAS[command]), "utf-8"));
145
+ let v = validators.get(command);
146
+ if (!v) {
147
+ const mod = createRequire(import.meta.url)("ajv/dist/2020");
148
+ const Ajv = (mod.default ?? mod);
149
+ v = { validate: new Ajv({ strict: true, allErrors: true }).compile(schema), id: schema.$id };
150
+ validators.set(command, v);
151
+ }
152
+ return { schema, validate: v.validate };
153
+ }
154
+ /** A digest of every file under `dir`, skipping node_modules. */
155
+ export function treeDigest(dir) {
156
+ const out = {};
157
+ const walk = (at, prefix) => {
158
+ for (const e of readdirSync(at, { withFileTypes: true })) {
159
+ if (e.name === "node_modules")
160
+ continue;
161
+ const rel = prefix ? `${prefix}/${e.name}` : e.name;
162
+ if (e.isDirectory())
163
+ walk(join(at, e.name), rel);
164
+ else if (e.isFile())
165
+ out[rel] = createHash("sha256").update(readFileSync(join(at, e.name))).digest("hex");
166
+ }
167
+ };
168
+ walk(dir, "");
169
+ return out;
170
+ }
171
+ /** The files that differ between two {@link treeDigest}s: added, removed or changed. */
172
+ export function treeChanges(before, after) {
173
+ const out = [];
174
+ for (const [f, h] of Object.entries(after))
175
+ if (before[f] === undefined)
176
+ out.push(`${f} (added)`);
177
+ else if (before[f] !== h)
178
+ out.push(`${f} (changed)`);
179
+ for (const f of Object.keys(before))
180
+ if (after[f] === undefined)
181
+ out.push(`${f} (removed)`);
182
+ return out.sort();
183
+ }
184
+ /**
185
+ * What is wrong with the chant calls one read made: anything but exactly one
186
+ * call, of `workspace <command>` with `args` in order and the command's JSON
187
+ * flag, and nothing else. Empty when the calls conform.
188
+ */
189
+ export function readerCallProblems(command, args, calls) {
190
+ if (calls.length !== 1)
191
+ return [`${command}: made ${calls.length} chant calls (${calls.map((c) => c.join(" ")).join("; ")}), expected exactly one`];
192
+ const argv = calls[0];
193
+ const prefix = ["workspace", ...command.split(" ")];
194
+ if (prefix.some((t, i) => argv[i] !== t))
195
+ return [`${command}: ran chant ${argv.join(" ")}, which is not workspace ${command}`];
196
+ const rest = argv.slice(prefix.length);
197
+ const at = rest.findIndex((_, i) => args.every((a, j) => rest[i + j] === a));
198
+ if (args.length > 0 && at === -1)
199
+ return [`${command}: ran chant ${argv.join(" ")}, which does not pass ${args.join(" ")} in order`];
200
+ const extra = args.length > 0 ? [...rest.slice(0, at), ...rest.slice(at + args.length)] : rest;
201
+ const allowed = READ_CONTRACT_JSON_FLAGS[command];
202
+ if (!allowed.some((flags) => flags.length === extra.length && flags.every((f, i) => extra[i] === f))) {
203
+ return [`${command}: ran chant ${argv.join(" ")}; beyond the command and its arguments it may add only ${allowed.map((f) => (f.length ? f.join(" ") : "nothing")).join(" or ")}, and it added ${extra.join(" ") || "nothing"}`];
204
+ }
205
+ return [];
206
+ }
207
+ /**
208
+ * Everything wrong with one read: the chant calls it made (`calls`, and
209
+ * `printed`, what each printed), and the document the reader returned
210
+ * (`doc`). Checks points 1 to 3 of the suite; empty when the read conforms.
211
+ */
212
+ export function checkReaderRead(command, args, calls, printed, doc) {
213
+ const problems = readerCallProblems(command, args, calls);
214
+ if (problems.length > 0)
215
+ return problems;
216
+ const run = printed[0];
217
+ if (!run || run.stdout.trim() === "")
218
+ return [`${command}: chant ${calls[0].join(" ")} printed nothing${run?.stderr ? `; stderr: ${run.stderr.trim()}` : ""}`];
219
+ let parsed;
220
+ try {
221
+ parsed = JSON.parse(run.stdout);
222
+ }
223
+ catch (e) {
224
+ return [`${command}: chant ${calls[0].join(" ")} printed something that is not JSON (${e.message}); stderr: ${run.stderr.trim()}`];
225
+ }
226
+ if (!isDeepStrictEqual(doc, parsed))
227
+ problems.push(`${command}: the reader must return the document chant printed, unchanged, and it returned something else`);
228
+ const { schema, validate } = readContractSchema(command);
229
+ if (!validate(doc))
230
+ problems.push(`${command}: the document does not validate against ${READ_CONTRACT_SCHEMAS[command]}: ${JSON.stringify(validate.errors)}`);
231
+ const head = (doc ?? {});
232
+ if (head.$schema !== schema.$id)
233
+ problems.push(`${command}: $schema is ${JSON.stringify(head.$schema)}, expected ${schema.$id}`);
234
+ if (head.contract !== READ_CONTRACT_VERSION)
235
+ problems.push(`${command}: contract is ${JSON.stringify(head.contract)}, expected ${READ_CONTRACT_VERSION}`);
236
+ return problems;
237
+ }
238
+ /** The commands to exercise and the ones skipped, from `commands`. Throws on a name that is not a contract command. */
239
+ export function selectCommands(commands, over = "cli") {
240
+ const served = over === "mcp" ? READ_CONTRACT_COMMANDS.filter((c) => MCP_READ_TOOLS[c] !== undefined) : [...READ_CONTRACT_COMMANDS];
241
+ if (commands === undefined)
242
+ return { checked: served, skipped: READ_CONTRACT_COMMANDS.filter((c) => !served.includes(c)) };
243
+ const unknown = commands.filter((c) => !READ_CONTRACT_COMMANDS.includes(c));
244
+ if (unknown.length > 0)
245
+ throw new Error(`not read-contract commands: ${unknown.join(", ")}; the commands are ${READ_CONTRACT_COMMANDS.join(", ")}`);
246
+ if (commands.length === 0)
247
+ throw new Error("commands is empty; list at least one read-contract command");
248
+ const toolless = commands.filter((c) => !served.includes(c));
249
+ if (toolless.length > 0)
250
+ throw new Error(`chant serve mcp has no tool for ${toolless.join(", ")}; over MCP the commands are ${served.join(", ")}`);
251
+ return { checked: READ_CONTRACT_COMMANDS.filter((c) => commands.includes(c)), skipped: READ_CONTRACT_COMMANDS.filter((c) => !commands.includes(c)) };
252
+ }
253
+ // ── Over MCP (#2707) ─────────────────────────────────────────────────────────
254
+ /** The `chant serve mcp` tool that answers each read-contract command. `check` has none. */
255
+ export const MCP_READ_TOOLS = {
256
+ ls: "workspace-ls",
257
+ graph: "workspace-graph",
258
+ status: "workspace-status",
259
+ records: "workspace-records",
260
+ "records --uncommitted": "workspace-records",
261
+ "graph --intent": "workspace-graph",
262
+ "graph --composites": "workspace-graph",
263
+ runs: "workspace-runs",
264
+ };
265
+ /**
266
+ * The tool call that answers `chant <argv>`, a read-contract command with its
267
+ * arguments and JSON flag, or undefined when no tool does. Flags map to the
268
+ * tool's arguments of the same meaning; the JSON flag is dropped, since a tool
269
+ * always returns the document.
270
+ */
271
+ export function mcpToolCall(argv) {
272
+ if (argv[0] !== "workspace")
273
+ return undefined;
274
+ const verb = argv[1];
275
+ const rest = argv.slice(2);
276
+ const args = {};
277
+ const positional = [];
278
+ const kinds = [];
279
+ for (let i = 0; i < rest.length; i++) {
280
+ const a = rest[i];
281
+ const value = () => rest[++i];
282
+ if (a === "--json")
283
+ continue;
284
+ if (a === "--format" && rest[i + 1] === "json") {
285
+ i++;
286
+ continue;
287
+ }
288
+ if (a === "--kind")
289
+ kinds.push(value() ?? "");
290
+ else if (a === "--at")
291
+ args.at = value();
292
+ else if (a === "--since")
293
+ args.since = value();
294
+ else if (a === "--compare-to")
295
+ args.compareTo = value();
296
+ else if (a === "--intent")
297
+ args.intent = value();
298
+ else if (a === "--changes")
299
+ args.range = value();
300
+ else if (a === "--work")
301
+ args.work = value();
302
+ else if (a === "--severity")
303
+ args.severity = value();
304
+ else if (a === "--current")
305
+ args.current = true;
306
+ else if (a === "--unit")
307
+ args.unit = value();
308
+ else if (a === "--decision")
309
+ args.decision = value();
310
+ else if (a === "--by")
311
+ args.by = value();
312
+ else if (a === "--uncommitted")
313
+ args.uncommitted = true;
314
+ else if (a === "--composites")
315
+ args.composites = true;
316
+ else if (a.startsWith("-"))
317
+ return undefined;
318
+ else
319
+ positional.push(a);
320
+ }
321
+ switch (verb) {
322
+ case "ls":
323
+ return positional.length === 0 && kinds.length === 0 ? { name: "workspace-ls", arguments: args } : undefined;
324
+ case "status":
325
+ return positional.length === 1 && kinds.length === 0 ? { name: "workspace-status", arguments: { ...args, env: positional[0] } } : undefined;
326
+ case "records":
327
+ return positional.length === 0 && kinds.length <= 1 ? { name: "workspace-records", arguments: { ...args, ...(kinds.length ? { kind: kinds[0] } : {}) } } : undefined;
328
+ case "check":
329
+ return positional.length === 0 && args.range !== undefined ? { name: "workspace-changes", arguments: { ...args, ...(kinds.length ? { kind: kinds } : {}) } } : undefined;
330
+ case "graph":
331
+ return positional.length === 0 ? { name: "workspace-graph", arguments: { ...args, ...(kinds.length ? { kind: kinds } : {}) } } : undefined;
332
+ case "runs":
333
+ return positional.length === 0 && kinds.length === 0 ? { name: "workspace-runs", arguments: args } : undefined;
334
+ default:
335
+ return undefined;
336
+ }
337
+ }
338
+ /**
339
+ * Start `chant serve mcp` in `cwd` and initialize it as `clientInfo`. The
340
+ * server speaks over stdio only (ws-052): nothing here opens a port.
341
+ */
342
+ export async function startMcpSession(command, cwd, options = {}) {
343
+ const child = spawn(command[0], [...command.slice(1), "serve", "mcp"], { cwd, env: { ...process.env, NO_COLOR: "1" }, stdio: ["pipe", "pipe", "pipe"] });
344
+ const pending = new Map();
345
+ let stderr = "";
346
+ let buffered = "";
347
+ let next = 1;
348
+ const failAll = (e) => {
349
+ for (const p of pending.values()) {
350
+ clearTimeout(p.timer);
351
+ p.fail(e);
352
+ }
353
+ pending.clear();
354
+ };
355
+ child.stderr.setEncoding("utf-8").on("data", (s) => (stderr += s));
356
+ child.stdout.setEncoding("utf-8").on("data", (s) => {
357
+ buffered += s;
358
+ let nl;
359
+ while ((nl = buffered.indexOf("\n")) >= 0) {
360
+ const line = buffered.slice(0, nl).trim();
361
+ buffered = buffered.slice(nl + 1);
362
+ if (!line)
363
+ continue;
364
+ let msg;
365
+ try {
366
+ msg = JSON.parse(line);
367
+ }
368
+ catch {
369
+ continue;
370
+ }
371
+ const p = msg.id !== undefined ? pending.get(msg.id) : undefined;
372
+ if (!p)
373
+ continue;
374
+ pending.delete(msg.id);
375
+ clearTimeout(p.timer);
376
+ if (msg.error)
377
+ p.fail(new Error(msg.error.message));
378
+ else
379
+ p.settle(msg.result);
380
+ }
381
+ });
382
+ child.on("error", (e) => failAll(new Error(`could not start chant serve mcp: ${e.message}`)));
383
+ child.on("close", (code) => failAll(new Error(`chant serve mcp exited (${code})${stderr.trim() ? `: ${stderr.trim()}` : ""}`)));
384
+ const request = (method, params) => new Promise((settle, fail) => {
385
+ const id = next++;
386
+ const timer = setTimeout(() => {
387
+ pending.delete(id);
388
+ fail(new Error(`chant serve mcp did not answer ${method} in time`));
389
+ }, options.timeoutMs ?? 120000);
390
+ pending.set(id, { settle, fail, timer });
391
+ child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`);
392
+ });
393
+ await request("initialize", { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: options.clientInfo ?? { name: "chant-reader-conformance" } });
394
+ child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" })}\n`);
395
+ return {
396
+ async call(name, args) {
397
+ const result = (await request("tools/call", { name, arguments: args }));
398
+ if (result.isError)
399
+ throw new Error(result.content?.[0]?.text ?? `${name} failed`);
400
+ return result.structuredContent ?? JSON.parse(result.content?.[0]?.text ?? "null");
401
+ },
402
+ close() {
403
+ child.stdin.end();
404
+ child.kill();
405
+ },
406
+ };
407
+ }
408
+ const GIT_ENV = { GIT_CONFIG_GLOBAL: process.platform === "win32" ? "NUL" : "/dev/null", GIT_CONFIG_NOSYSTEM: "1" };
409
+ function git(cwd, ...args) {
410
+ execFileSync("git", ["-c", "user.name=chant", "-c", "user.email=chant@localhost", "-c", "commit.gpgsign=false", ...args], {
411
+ cwd,
412
+ env: { ...process.env, ...GIT_ENV },
413
+ stdio: ["ignore", "pipe", "pipe"],
414
+ });
415
+ }
416
+ /**
417
+ * The decision the generated workspace leaves uncommitted (#3160): proposed,
418
+ * about the delivery member only, so the app region the intent read walks
419
+ * is unchanged. Its path from the workspace root, and its text.
420
+ */
421
+ export const UNCOMMITTED_DECISION = {
422
+ path: "decisions/fix-002-where-kept-records-wait.md",
423
+ text: `---
424
+ schema: 1
425
+ id: "fix-002"
426
+ title: "Where kept records wait"
427
+ state: "proposed"
428
+ area: "delivery"
429
+ source:
430
+ kind: "workspace"
431
+ member: "delivery"
432
+ question: "Where does a record wait between being kept and being applied?"
433
+ options:
434
+ - id: "a"
435
+ label: "uncommitted in the working tree"
436
+ how: "The record stays a file in the checkout until it is committed or applied."
437
+ tradeoff: "A reader lists it with records --uncommitted, and nothing else holds it."
438
+ choice: null
439
+ rejected: []
440
+ supersedes: []
441
+ evidence:
442
+ - title: "INTENTIUS/chant#3160, uncommitted records in the read contract"
443
+ url: "https://github.com/INTENTIUS/chant/issues/3160"
444
+ decided_by: null
445
+ decided_on: null
446
+ reviews: []
447
+ constrains:
448
+ - "member:delivery"
449
+ ---
450
+
451
+ # Where kept records wait
452
+
453
+ The reader conformance workspace leaves this decision uncommitted, so \`records --uncommitted\` has one record to list.
454
+ `,
455
+ };
456
+ /**
457
+ * Generate the conformance workspace in a temporary directory: copy
458
+ * `__fixture__/`, link this package in as `node_modules/@intentius/chant`
459
+ * so the chant member resolves it, declare the workspace with
460
+ * `chant workspace init --yes --name conformance` and commit it all to a new
461
+ * git repository on `main`. With `uncommitted`, then write
462
+ * {@link UNCOMMITTED_DECISION} and leave it uncommitted (#3160).
463
+ */
464
+ export function createConformanceWorkspace(options = {}) {
465
+ const chant = options.chantCommand ?? defaultChantCommand();
466
+ const scratch = realpathSync(mkdtempSync(join(tmpdir(), "chant-reader-conformance-")));
467
+ const dispose = () => rmSync(scratch, { recursive: true, force: true });
468
+ try {
469
+ const dir = join(scratch, "ws");
470
+ cpSync(CONFORMANCE_FIXTURE_DIR, dir, { recursive: true });
471
+ // npm leaves .gitignore out of a package, so it is written here.
472
+ writeFileSync(join(dir, ".gitignore"), "node_modules/\n");
473
+ mkdirSync(join(dir, "node_modules", "@intentius"), { recursive: true });
474
+ symlinkSync(packageRoot, join(dir, "node_modules", "@intentius", "chant"), "junction");
475
+ git(dir, "init", "--quiet", "--initial-branch=main");
476
+ execFileSync(chant[0], [...chant.slice(1), "workspace", "init", "--yes", "--name", "conformance"], {
477
+ cwd: dir,
478
+ env: { ...process.env, ...GIT_ENV, NO_COLOR: "1" },
479
+ stdio: ["ignore", "pipe", "pipe"],
480
+ timeout: options.timeoutMs ?? 120000,
481
+ });
482
+ git(dir, "add", "-A");
483
+ git(dir, "commit", "--quiet", "-m", "the reader conformance workspace", "-m", "Chant-Run: conformance-run");
484
+ // One agent run in the run ledger (#3033), which made that commit, so `runs` reads a run with every field.
485
+ const head = execFileSync("git", ["rev-parse", "HEAD"], { cwd: dir, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] }).trim();
486
+ const run = { id: "conformance-run", harness: { name: "conformance", version: "1" }, model: "none", provider: "none", by: "conformance", startedAt: "2026-01-01T00:00:00Z", endedAt: "2026-01-01T00:01:00Z", outcome: "done", usage: { turns: 1, inputTokens: 10, outputTokens: 5 }, cost: { amount: 0.01, currency: "USD", source: "conformance" }, transcript: { sha256: "0".repeat(64), ref: "conformance" }, commits: [head] };
487
+ execFileSync(chant[0], [...chant.slice(1), "workspace", "runs", "record", "--from", "-"], {
488
+ cwd: dir,
489
+ input: JSON.stringify(run),
490
+ env: { ...process.env, ...GIT_ENV, NO_COLOR: "1" },
491
+ stdio: ["pipe", "pipe", "pipe"],
492
+ timeout: options.timeoutMs ?? 120000,
493
+ });
494
+ if (options.uncommitted)
495
+ writeFileSync(join(dir, ...UNCOMMITTED_DECISION.path.split("/")), UNCOMMITTED_DECISION.text);
496
+ return { dir, dispose };
497
+ }
498
+ catch (e) {
499
+ dispose();
500
+ const err = e;
501
+ throw new Error(`could not generate the reader conformance workspace: ${err.message}${err.stderr ? `\n${String(err.stderr)}` : ""}`);
502
+ }
503
+ }
504
+ /** The workspace and chant a run uses, from its options. `dispose` removes a generated workspace. */
505
+ export function conformanceTarget(options = {}) {
506
+ const chantCommand = options.chantCommand ?? defaultChantCommand();
507
+ const given = options.workspaceDir ?? referenceWorkspaceDir();
508
+ if (given)
509
+ return { workspaceDir: given, chantCommand, dispose: () => { } };
510
+ const ws = createConformanceWorkspace({ chantCommand, timeoutMs: options.timeoutMs, uncommitted: true });
511
+ return { workspaceDir: ws.dir, chantCommand, dispose: ws.dispose };
512
+ }
513
+ /** Run `command` in `cwd`, with `input` on stdin when given, collecting what it printed. Resolves, never rejects. */
514
+ export function runChant(command, argv, cwd, timeoutMs, input) {
515
+ return new Promise((settle) => {
516
+ const child = spawn(command[0], [...command.slice(1), ...argv], { cwd, env: { ...process.env, NO_COLOR: "1" }, stdio: ["pipe", "pipe", "pipe"] });
517
+ const given = input === undefined ? {} : { input };
518
+ // Without input, stdin is closed at once, as it was when it was ignored.
519
+ child.stdin.on("error", () => { }).end(input ?? "");
520
+ let stdout = "";
521
+ let stderr = "";
522
+ child.stdout.setEncoding("utf-8").on("data", (s) => (stdout += s));
523
+ child.stderr.setEncoding("utf-8").on("data", (s) => (stderr += s));
524
+ const timer = setTimeout(() => child.kill("SIGKILL"), timeoutMs);
525
+ child.on("error", (e) => {
526
+ clearTimeout(timer);
527
+ settle({ argv: [...argv], ...given, status: null, stdout, stderr: `${stderr}${e.message}` });
528
+ });
529
+ child.on("close", (status) => {
530
+ clearTimeout(timer);
531
+ settle({ argv: [...argv], ...given, status, stdout, stderr });
532
+ });
533
+ });
534
+ }
535
+ /**
536
+ * Whether an MCP tool's document and the one its command printed are the same
537
+ * read (#2707). Each graph member's `cached` flag (#2876) is left out: it says
538
+ * whether chant's per-member cache answered that one read, not what the graph
539
+ * is. The tool is called first, so its read can store the cache entry the
540
+ * command's read is then answered from, and the flag differs while the graph
541
+ * does not (#3019). Everything else must be equal.
542
+ */
543
+ export function sameReadDocument(tool, printed) {
544
+ return isDeepStrictEqual(withoutCacheFlags(tool), withoutCacheFlags(printed));
545
+ }
546
+ function withoutCacheFlags(doc) {
547
+ if (typeof doc !== "object" || doc === null || !Array.isArray(doc.members))
548
+ return doc;
549
+ const members = doc.members.map((m) => {
550
+ if (typeof m !== "object" || m === null || !("cached" in m))
551
+ return m;
552
+ const { cached: _cached, ...rest } = m;
553
+ return rest;
554
+ });
555
+ return { ...doc, members };
556
+ }
557
+ /**
558
+ * A transport that runs chant in the workspace `target()` names and records
559
+ * every call and what it printed. `reset()` clears the record before a read.
560
+ */
561
+ export function recordingTransport(target, timeoutMs = 120000, over = "cli") {
562
+ const calls = [];
563
+ const printed = [];
564
+ /** Over MCP: where a tool's document and the command's differ. */
565
+ const problems = [];
566
+ let session;
567
+ const viaMcp = async (argv) => {
568
+ const t = target();
569
+ const call = mcpToolCall(argv);
570
+ if (!call)
571
+ return { argv: [...argv], status: null, stdout: "", stderr: `no chant serve mcp tool answers chant ${argv.join(" ")}` };
572
+ session ?? (session = startMcpSession(t.chantCommand, t.workspaceDir, { timeoutMs }));
573
+ let doc;
574
+ try {
575
+ doc = await (await session).call(call.name, call.arguments);
576
+ }
577
+ catch (e) {
578
+ return { argv: [...argv], status: 1, stdout: "", stderr: `${call.name}: ${e.message}` };
579
+ }
580
+ // The command the tool stands for, run directly: the two documents must be equal.
581
+ const cli = await runChant(t.chantCommand, argv, t.workspaceDir, timeoutMs);
582
+ let printedDoc;
583
+ try {
584
+ printedDoc = JSON.parse(cli.stdout);
585
+ }
586
+ catch {
587
+ printedDoc = undefined;
588
+ }
589
+ if (!sameReadDocument(doc, printedDoc))
590
+ problems.push(`${argv.slice(1).join(" ")}: the MCP tool ${call.name} returned a document other than chant ${argv.join(" ")} printed`);
591
+ return { argv: [...argv], status: 0, stdout: JSON.stringify(doc), stderr: "" };
592
+ };
593
+ const transport = {
594
+ async run(argv, options) {
595
+ calls.push([...argv]);
596
+ const t = target();
597
+ const run = over === "mcp" ? await viaMcp(argv) : await runChant(t.chantCommand, argv, t.workspaceDir, timeoutMs, options?.input);
598
+ printed.push(run);
599
+ return run;
600
+ },
601
+ };
602
+ return {
603
+ transport,
604
+ calls,
605
+ printed,
606
+ problems,
607
+ reset() {
608
+ calls.length = 0;
609
+ printed.length = 0;
610
+ problems.length = 0;
611
+ },
612
+ /** Stop the MCP session, when one was started. */
613
+ async close() {
614
+ if (session)
615
+ (await session.catch(() => undefined))?.close();
616
+ session = undefined;
617
+ },
618
+ };
619
+ }
620
+ /** Make one read through a recording transport and check it. A reader that throws is a problem, not an error. */
621
+ export async function readAndCheck(reader, recorder, command) {
622
+ const args = [...REFERENCE_READS[command]];
623
+ recorder.reset();
624
+ let doc;
625
+ try {
626
+ doc = await reader.read(command, [...args]);
627
+ }
628
+ catch (e) {
629
+ const stderr = recorder.printed[0]?.stderr.trim();
630
+ return { command, args, problems: [`${command}: the reader threw: ${e.message}${stderr ? `; chant's stderr: ${stderr}` : ""}`] };
631
+ }
632
+ return { command, args, problems: [...checkReaderRead(command, args, recorder.calls, recorder.printed, doc), ...recorder.problems] };
633
+ }
634
+ /**
635
+ * Hold a reader to the read contract, with no test runner: read each listed
636
+ * command once through a recording transport, check the four points, and
637
+ * return what is wrong. The reader conforms when `problems` is empty.
638
+ *
639
+ * ```js
640
+ * import { test } from "node:test";
641
+ * import assert from "node:assert/strict";
642
+ * import { runWorkspaceReaderConformance } from "@intentius/chant/workspace/conformance";
643
+ *
644
+ * test("my reader reads only through the contract", { timeout: 600_000 }, async () => {
645
+ * const report = await runWorkspaceReaderConformance(myReader, { commands: ["ls", "status"] });
646
+ * assert.deepEqual(report.problems, []);
647
+ * });
648
+ * ```
649
+ */
650
+ export async function runWorkspaceReaderConformance(reader, options = {}) {
651
+ const { checked, skipped } = selectCommands(options.commands, options.over);
652
+ const target = conformanceTarget(options);
653
+ const recorder = recordingTransport(() => target, options.timeoutMs, options.over);
654
+ try {
655
+ const built = reader(recorder.transport);
656
+ const before = treeDigest(target.workspaceDir);
657
+ const results = [];
658
+ for (const command of checked)
659
+ results.push(await readAndCheck(built, recorder, command));
660
+ const changed = treeChanges(before, treeDigest(target.workspaceDir));
661
+ const problems = results.flatMap((r) => r.problems);
662
+ if (changed.length > 0)
663
+ problems.push(`workspace: the reads changed files: ${changed.join(", ")}`);
664
+ return { problems, checked, skipped, results, workspaceDir: target.workspaceDir };
665
+ }
666
+ finally {
667
+ await recorder.close();
668
+ target.dispose();
669
+ }
670
+ }
671
+ // The writer suite (#3159), published from this same entry.
672
+ export * from "./writer.js";
673
+ export * from "./broker.js";