@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,185 @@
1
+ /**
2
+ * `chant workspace export [<member>...] [--to <member>] [--param name=value] [--dry-run] [--json]`,
3
+ * `chant workspace import [<dir>] [--remove] [--dry-run] [--json]` and
4
+ * `chant workspace admit <return id> [--note <text>] [--dry-run] [--json]` (#2552).
5
+ *
6
+ * See ./export.ts, ./import.ts and ./returns.ts.
7
+ */
8
+ import { join } from "node:path";
9
+ import { formatError, formatInfo, formatSuccess, formatWarning } from "../cli/format.js";
10
+ import { findWorkspaceRoot } from "../project-root.js";
11
+ import { WorkspaceReadError } from "./declaration.js";
12
+ import { LockError } from "./lineage-lock.js";
13
+ import { parseParamArgs } from "./template-manifest.js";
14
+ const EXPORT_USAGE = "chant workspace export [<member>[,<member>...]] [--to <export member>] [--param name=value] [--dry-run] [--json]";
15
+ const IMPORT_USAGE = "chant workspace import [<dir>] [--remove] [--dry-run] [--json]";
16
+ const ADMIT_USAGE = "chant workspace admit <return id> [--note <text>] [--dry-run] [--json]";
17
+ function workspaceRoot(usage) {
18
+ const found = findWorkspaceRoot(process.cwd());
19
+ if (!found) {
20
+ console.error(formatError({ message: "no chant.workspace.json here or above", hint: usage }));
21
+ return undefined;
22
+ }
23
+ return found.dir;
24
+ }
25
+ function fail(err, usage) {
26
+ if (err instanceof WorkspaceReadError) {
27
+ console.error(formatError({ message: `${err.code}: ${err.describe()}`, hint: usage }));
28
+ return 1;
29
+ }
30
+ if (err instanceof LockError) {
31
+ console.error(formatError({ message: err.message, hint: usage }));
32
+ return 1;
33
+ }
34
+ throw err;
35
+ }
36
+ export async function runWorkspaceExport(ctx) {
37
+ const { args } = ctx;
38
+ const root = workspaceRoot(EXPORT_USAGE);
39
+ if (!root)
40
+ return 1;
41
+ const members = [args.extraPositional, args.extraPositional2]
42
+ .filter((x) => x !== undefined)
43
+ .flatMap((x) => x.split(","))
44
+ .map((x) => x.trim())
45
+ .filter(Boolean);
46
+ try {
47
+ const { exportWorkspace } = await import("./export.js");
48
+ const r = await exportWorkspace({
49
+ root,
50
+ members,
51
+ to: args.migrateTo,
52
+ params: args.param?.length ? parseParamArgs(args.param) : undefined,
53
+ dryRun: args.dryRun,
54
+ });
55
+ if (args.json) {
56
+ console.log(JSON.stringify(r, null, 2));
57
+ return 0;
58
+ }
59
+ const m = r.manifest;
60
+ console.log(`${m.id} ${m.whole ? "workspace" : "members"} ${m.members.join(", ")} -> ${r.member} (${r.dir})`);
61
+ console.log(` ${Object.keys(m.files).length} file(s), ${Object.keys(m.locks).length} lock(s)${m.dirs.length ? `, record directories ${m.dirs.join(", ")}` : ""}`);
62
+ if (r.switched.length > 0)
63
+ console.log(` host values switched in: ${r.switched.join(", ")}`);
64
+ const d = m.dropped;
65
+ const left = [
66
+ ...d.links.map((l) => `link ${l.member} -> ${l.to}`),
67
+ ...d.agents.map((a) => `agent ${a}`),
68
+ ...d.pins.map((p) => `pin ${p}`),
69
+ ...d.records.map((k) => `record kind ${k}`),
70
+ ...d.diagrams.map((x) => `diagram ${x}`),
71
+ ];
72
+ if (left.length > 0)
73
+ console.log(` left out of the export's declaration: ${left.join("; ")}`);
74
+ if (m.from.dirty)
75
+ console.error(formatWarning({ message: "exported paths have uncommitted changes; the export records HEAD, which does not hold them" }));
76
+ if (r.written)
77
+ console.error(formatSuccess(`wrote the export into ${r.dir}. It is a workspace of its own; copy it where it goes, and bring it back with chant workspace import.`));
78
+ else
79
+ console.error(formatInfo("--dry-run: nothing written"));
80
+ return 0;
81
+ }
82
+ catch (err) {
83
+ return fail(err, EXPORT_USAGE);
84
+ }
85
+ }
86
+ export async function runWorkspaceImport(ctx) {
87
+ const { args } = ctx;
88
+ if (args.extraPositional2) {
89
+ console.error(formatError({ message: `unexpected argument: ${args.extraPositional2}`, hint: IMPORT_USAGE }));
90
+ return 1;
91
+ }
92
+ const root = workspaceRoot(IMPORT_USAGE);
93
+ if (!root)
94
+ return 1;
95
+ try {
96
+ const { importWorkspace } = await import("./import.js");
97
+ const r = await importWorkspace({ root, from: args.extraPositional ? join(process.cwd(), args.extraPositional) : undefined, remove: args.remove, dryRun: args.dryRun });
98
+ const refused = r.outside.length > 0 || r.conflicts.length > 0;
99
+ if (args.json) {
100
+ console.log(JSON.stringify(r, null, 2));
101
+ return refused ? 1 : 0;
102
+ }
103
+ console.log(`${r.export} from ${r.from}`);
104
+ for (const p of r.written)
105
+ console.log(` write ${p}${r.hostValues.includes(p) ? " (host values back)" : ""}`);
106
+ for (const p of r.removed)
107
+ console.log(` remove ${p}`);
108
+ for (const p of r.locks)
109
+ console.log(` lock ${p}`);
110
+ for (const c of r.conflicts)
111
+ console.log(` conflict ${c.path}: ${c.reason}`);
112
+ for (const p of r.outside)
113
+ console.log(` outside ${p}`);
114
+ if (r.outside.length > 0) {
115
+ console.error(formatError({ message: `the copy holds ${r.outside.length} file(s) outside the members that went with the export; import never writes into another member, so nothing was written` }));
116
+ return 1;
117
+ }
118
+ if (r.conflicts.length > 0) {
119
+ console.error(formatError({ message: `${r.conflicts.length} conflict(s): nothing was written. Resolve them in the copy or here, then import again` }));
120
+ return 1;
121
+ }
122
+ if (r.return) {
123
+ const proved = Object.values(r.return.paths).filter((p) => p.origin).length;
124
+ console.log(` return ${r.return.id}: ${proved} file(s) carry the commit they were made in${r.return.signers.length ? `, signed by ${r.return.signers.map((s) => `${s.principal} (${s.fingerprint || "key"})`).join(", ")}` : ""}`);
125
+ }
126
+ if (!r.applied) {
127
+ console.error(formatInfo("--dry-run: nothing written"));
128
+ return 0;
129
+ }
130
+ if (!r.return)
131
+ console.error(formatInfo("the copy holds no change since the export"));
132
+ if (r.member)
133
+ console.log(` member ${r.member.name} ${r.member.action}${r.member.note ? `: ${r.member.note}` : ""}`);
134
+ if (r.returnRecord) {
135
+ console.error(formatSuccess(`imported, and recorded the return in ${r.returnRecord}. Review and commit it. Work signed by keys the policy at base does not list reads as attested-unverifiable-here until an admin runs chant workspace admit ${r.return.id} and merges that change.`));
136
+ }
137
+ return 0;
138
+ }
139
+ catch (err) {
140
+ return fail(err, IMPORT_USAGE);
141
+ }
142
+ }
143
+ export async function runWorkspaceAdmit(ctx) {
144
+ const { args } = ctx;
145
+ const id = args.extraPositional;
146
+ if (!id || args.extraPositional2) {
147
+ console.error(formatError({ message: "admit takes one return id, such as ret-0123456789ab", hint: ADMIT_USAGE }));
148
+ return 1;
149
+ }
150
+ const root = workspaceRoot(ADMIT_USAGE);
151
+ if (!root)
152
+ return 1;
153
+ try {
154
+ const { readFileSync, existsSync } = await import("node:fs");
155
+ const { RETURNS_DIR, admitReturn, parseReturn } = await import("./returns.js");
156
+ const { gitTopOf } = await import("./export.js");
157
+ const file = join(root, RETURNS_DIR, `${id}.json`);
158
+ if (!/^ret-[0-9a-f]{12}$/.test(id) || !existsSync(file))
159
+ throw new LockError(`no return ${id} in ${RETURNS_DIR}`);
160
+ const ret = parseReturn(readFileSync(file, "utf-8"), file);
161
+ const repo = gitTopOf(root);
162
+ if (!repo)
163
+ throw new LockError("admit writes .chant/trust.json at the repository root, and this workspace is not in a git repository");
164
+ const r = admitReturn(repo, ret, { note: args.note, dryRun: args.dryRun });
165
+ if (args.json) {
166
+ console.log(JSON.stringify(r, null, 2));
167
+ return 0;
168
+ }
169
+ if (r.added.length === 0) {
170
+ console.error(formatInfo(`every signer of ${id} is already admitted in ${r.path}`));
171
+ return 0;
172
+ }
173
+ for (const s of r.added)
174
+ console.log(` admit ${s.principal} ${s.key.slice(0, 40)}...`);
175
+ if (!r.written) {
176
+ console.error(formatInfo("--dry-run: nothing written"));
177
+ return 0;
178
+ }
179
+ console.error(formatSuccess(`added ${r.added.length} signer(s) for ${id} to ${r.path}. Check each principal, then commit it signed: the file is policy, so the admission counts once an admin's signed commit is merged to the base branch.`));
180
+ return 0;
181
+ }
182
+ catch (err) {
183
+ return fail(err, ADMIT_USAGE);
184
+ }
185
+ }
@@ -0,0 +1,499 @@
1
+ /**
2
+ * `chant workspace export`: write members of this workspace, with their
3
+ * lineage and records, into the workspace's export member as a workspace of
4
+ * their own (#2552, #2524 D10, requirements X1 to X3 and X6, ws-073).
5
+ *
6
+ * The export goes into its own member, found by role: a member of kind
7
+ * `workspace` with the role `export`. Nothing is written anywhere else, and a
8
+ * layout where the export would land inside another member, or another
9
+ * member inside the export, is refused. That member is a nested workspace
10
+ * (ws-071): the outer workspace reads it only through its own commands, and
11
+ * export is the one command that writes there.
12
+ *
13
+ * Only members that declare `travel: true` go (X6). With no members named,
14
+ * every such member goes, with the workspace's own record kinds and their
15
+ * records: that is an export of the workspace. Naming members exports just
16
+ * those, each with the record kinds it declares.
17
+ *
18
+ * The export keeps the workspace's layout: a member at `app/` is at
19
+ * `<export>/app/`. It gets a declaration listing the members that went, each
20
+ * entry copied as written, less the links, agents and pins that point at
21
+ * members that stayed. The lineage of each scope goes with it, filtered to
22
+ * the files that went. Records are copied byte for byte, so every seal on
23
+ * them stays as it was.
24
+ *
25
+ * Host-bound parameters (D9) switch on export (X3): `--param name=value`
26
+ * gives an exported lineage's host-bound parameter the value it has where the
27
+ * export goes. The files the lineage lists for it get the new value, the lock
28
+ * records it, and a file that had its recorded hash keeps a matching one. The
29
+ * host's values stay in `.chant/export.json`, where `import` reads them to
30
+ * switch back.
31
+ *
32
+ * `.chant/export.json` records where the export came from (the workspace's
33
+ * name and revision, ws-016), what went, and the hash each file had here and
34
+ * in the export. Import uses those as its merge base.
35
+ */
36
+ import { execFileSync } from "node:child_process";
37
+ import { createHash } from "node:crypto";
38
+ import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
39
+ import { dirname, join, posix, relative, resolve } from "node:path";
40
+ import { z } from "zod";
41
+ import { DECLARATION_FILES, readDeclaration } from "./declaration.js";
42
+ import { parseJsonText } from "./jsonc.js";
43
+ import { fileHash, LOCK_FILE, LockError, parseLock, renderLock } from "./lineage-lock.js";
44
+ import { loadRecordKind } from "./records.js";
45
+ import { workingTree } from "./tree.js";
46
+ /** The role that marks the member an export is written into. */
47
+ export const EXPORT_ROLE = "export";
48
+ /** The export manifest, relative to the export's root. */
49
+ export const EXPORT_MANIFEST = ".chant/export.json";
50
+ const Sha256 = z.string().regex(/^sha256:[0-9a-f]{64}$/);
51
+ const ManifestSchema = z
52
+ .object({
53
+ schema: z.literal(1),
54
+ /** `exp-<12 hex>`, from what the export holds. */
55
+ id: z.string().regex(/^exp-[0-9a-f]{12}$/),
56
+ from: z
57
+ .object({
58
+ /** The declaration's `name`. */
59
+ workspace: z.string().min(1),
60
+ /** HEAD of the repository when the export was written, or null outside git. */
61
+ revision: z.string().regex(/^[0-9a-f]{40}([0-9a-f]{24})?$/).nullable(),
62
+ /** Whether exported paths had uncommitted changes. */
63
+ dirty: z.boolean(),
64
+ })
65
+ .strict(),
66
+ /** The export member's name. */
67
+ member: z.string().min(1),
68
+ /** The members that went, by name. */
69
+ members: z.array(z.string().min(1)),
70
+ /** True when no members were named: the workspace's own record kinds went too. */
71
+ whole: z.boolean(),
72
+ /** Directories, relative to the workspace root, that went besides member directories: the workspace's own record kinds and records. */
73
+ dirs: z.array(z.string().min(1)),
74
+ /** Every exported file, relative to the workspace root, with its hash here and in the export. Locks are under `locks`. */
75
+ files: z.record(z.string(), z.object({ host: Sha256, export: Sha256 }).strict()),
76
+ /** Each lock that went, by its path relative to the workspace root, with each scope's digest here and in the export, and whether only part of it went. */
77
+ locks: z.record(z.string(), z.record(z.string(), z.object({ host: Sha256, export: Sha256, partial: z.boolean() }).strict())),
78
+ /** Host-bound values switched, by `<lock path>#<scope>`, then parameter: the value here and in the export. */
79
+ hostValues: z.record(z.string(), z.record(z.string(), z.object({ host: z.string(), export: z.string() }).strict())),
80
+ /** What the export's declaration leaves out, because it names members that stayed. */
81
+ dropped: z
82
+ .object({
83
+ links: z.array(z.object({ member: z.string(), to: z.string() }).strict()),
84
+ agents: z.array(z.string()),
85
+ pins: z.array(z.string()),
86
+ records: z.array(z.string()),
87
+ diagrams: z.array(z.string()),
88
+ })
89
+ .strict(),
90
+ })
91
+ .strict();
92
+ export class ExportError extends LockError {
93
+ constructor() {
94
+ super(...arguments);
95
+ this.name = "ExportError";
96
+ }
97
+ }
98
+ // ── Reading ──────────────────────────────────────────────────────────────────
99
+ export function parseManifest(text, label) {
100
+ let raw;
101
+ try {
102
+ raw = JSON.parse(text);
103
+ }
104
+ catch (err) {
105
+ throw new ExportError(`${label} is not JSON: ${err instanceof Error ? err.message : String(err)}`);
106
+ }
107
+ const parsed = ManifestSchema.safeParse(raw);
108
+ if (!parsed.success)
109
+ throw new ExportError(`${label} is not an export manifest: ${parsed.error.issues.map((i) => `${i.path.join(".") || "/"}: ${i.message}`).join("; ")}`);
110
+ return parsed.data;
111
+ }
112
+ export function readManifestAt(dir) {
113
+ const abs = join(dir, EXPORT_MANIFEST);
114
+ if (!existsSync(abs))
115
+ return null;
116
+ return parseManifest(readFileSync(abs, "utf-8"), abs);
117
+ }
118
+ // ── Shared helpers ───────────────────────────────────────────────────────────
119
+ /** `true` when `path` is `dir` or below it. Both relative, `/`-separated, `"."` for the root. */
120
+ export function under(path, dir) {
121
+ return dir === "." || path === dir || path.startsWith(`${dir}/`);
122
+ }
123
+ function git(cwd, args) {
124
+ return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 256 * 1024 * 1024 });
125
+ }
126
+ export function gitTopOf(dir) {
127
+ try {
128
+ return git(dir, ["rev-parse", "--show-toplevel"]).trim() || undefined;
129
+ }
130
+ catch {
131
+ return undefined;
132
+ }
133
+ }
134
+ /**
135
+ * The files under `dir` (absolute) that git tracks or would track, relative
136
+ * to `dir`, that exist in the working tree. Outside git, every file, leaving
137
+ * out `.git` and `node_modules`.
138
+ */
139
+ export function listFiles(dir) {
140
+ if (!existsSync(dir))
141
+ return [];
142
+ const top = gitTopOf(dir);
143
+ if (top) {
144
+ const out = git(dir, ["ls-files", "-z", "-co", "--exclude-standard", "--full-name", "--", "."]);
145
+ // git reports its top with symlinks resolved (/var is /private/var on macOS).
146
+ const prefix = relative(top, realpathSync(dir)).split("\\").join("/");
147
+ return [...new Set(out.split("\0").filter(Boolean))]
148
+ .map((p) => (prefix ? p.slice(prefix.length + 1) : p))
149
+ .filter((p) => {
150
+ try {
151
+ return statSync(join(dir, p)).isFile();
152
+ }
153
+ catch {
154
+ return false;
155
+ }
156
+ })
157
+ .sort();
158
+ }
159
+ const out = [];
160
+ const walk = (rel) => {
161
+ for (const d of readdirSync(join(dir, rel), { withFileTypes: true })) {
162
+ if (d.name === ".git" || d.name === "node_modules")
163
+ continue;
164
+ const p = rel ? `${rel}/${d.name}` : d.name;
165
+ if (d.isDirectory())
166
+ walk(p);
167
+ else if (d.isFile())
168
+ out.push(p);
169
+ }
170
+ };
171
+ walk("");
172
+ return out.sort();
173
+ }
174
+ /** A lock's path, relative to the workspace root, is a lock file: `.chant/workspace.lock.json` at some directory. */
175
+ export function isLockPath(path) {
176
+ return path === LOCK_FILE || path.endsWith(`/${LOCK_FILE}`);
177
+ }
178
+ /** The directory, relative to the workspace root, a lock at `path` sits in. */
179
+ export function lockDir(path) {
180
+ return path === LOCK_FILE ? "." : path.slice(0, -(LOCK_FILE.length + 1));
181
+ }
182
+ /** Join a lock directory, a scope and a file into a workspace-relative path. */
183
+ export function scopedPath(dir, scope, file) {
184
+ return [dir, scope, file].filter((p) => p !== "." && p !== "").join("/");
185
+ }
186
+ /** The digest of a lineage, for telling whether it changed. */
187
+ export function lineageDigest(lineage) {
188
+ const lock = { lockVersion: 1, scopes: { s: lineage } };
189
+ return fileHash(renderLock(lock));
190
+ }
191
+ /**
192
+ * Switch host-bound values in a scope (#2552): for each parameter in
193
+ * `values`, the files the lineage lists for it get `to` in place of `from`,
194
+ * the lineage records `to`, and a file that had its recorded hash keeps a
195
+ * matching one. `files` holds the scope's files by workspace-relative path,
196
+ * and is changed in place. Returns the paths whose content changed.
197
+ */
198
+ export function switchHostValues(lineage, dir, scope, values, files) {
199
+ const changed = [];
200
+ for (const [name, { from, to }] of Object.entries(values)) {
201
+ if (from === to)
202
+ continue;
203
+ for (const f of lineage.hostBound?.[name] ?? []) {
204
+ const path = scopedPath(dir, scope, f);
205
+ const before = files.get(path);
206
+ if (!before)
207
+ continue;
208
+ const after = Buffer.from(before.toString("utf-8").split(from).join(to), "utf-8");
209
+ if (after.equals(before))
210
+ continue;
211
+ files.set(path, after);
212
+ changed.push(path);
213
+ const entry = lineage.files[f];
214
+ if (entry && entry.sha256 === fileHash(before))
215
+ lineage.files[f] = { ...entry, sha256: fileHash(after) };
216
+ }
217
+ lineage.parameters = { ...lineage.parameters, [name]: to };
218
+ }
219
+ return [...new Set(changed)].sort();
220
+ }
221
+ /** The raw declaration object, read as JSON or JSONC. */
222
+ export function rawDeclaration(root) {
223
+ for (const name of DECLARATION_FILES) {
224
+ const abs = join(root, name);
225
+ if (!existsSync(abs))
226
+ continue;
227
+ const parsed = parseJsonText(readFileSync(abs, "utf-8"), { jsonc: name.endsWith(".jsonc") });
228
+ if (!parsed.ok)
229
+ throw new ExportError(`${name} can't be read: ${parsed.message}`);
230
+ return { file: name, obj: parsed.value };
231
+ }
232
+ throw new ExportError(`no chant.workspace.json at ${root}`);
233
+ }
234
+ /** The export member: the one with the export role, or the one `to` names. */
235
+ export function exportMember(decl, to) {
236
+ const withRole = decl.members.filter((m) => m.roles.some((r) => r.name === EXPORT_ROLE));
237
+ let m;
238
+ if (to !== undefined) {
239
+ m = decl.members.find((x) => x.name === to);
240
+ if (!m)
241
+ throw new ExportError(`--to ${to}: the declaration has no member ${to}`);
242
+ if (!withRole.includes(m))
243
+ throw new ExportError(`--to ${to}: member ${to} does not have the role ${EXPORT_ROLE}; an export goes only into a member with that role`);
244
+ }
245
+ else if (withRole.length === 1) {
246
+ m = withRole[0];
247
+ }
248
+ else if (withRole.length === 0) {
249
+ throw new ExportError(`no member has the role ${EXPORT_ROLE}; declare one, of kind workspace, for the export to go into`);
250
+ }
251
+ else {
252
+ throw new ExportError(`${withRole.length} members have the role ${EXPORT_ROLE} (${withRole.map((x) => x.name).join(", ")}); name one with --to <member>`);
253
+ }
254
+ if (m.kind !== "workspace")
255
+ throw new ExportError(`member ${m.name} has kind ${m.kind}; an export is a workspace, so its member has kind workspace`);
256
+ if (m.dir === ".")
257
+ throw new ExportError(`member ${m.name} is the workspace root; an export needs a directory of its own`);
258
+ return m;
259
+ }
260
+ /** Plan the export, and write it unless `dryRun`. Throws an {@link ExportError}. */
261
+ export async function exportWorkspace(o) {
262
+ const root = resolve(o.root);
263
+ const decl = readDeclaration(workingTree(root));
264
+ const target = exportMember(decl, o.to);
265
+ const whole = !o.members || o.members.length === 0;
266
+ // What goes.
267
+ let members;
268
+ if (whole) {
269
+ members = decl.members.filter((m) => m.travel && m !== target);
270
+ if (members.length === 0)
271
+ throw new ExportError(`no member sets travel to true, so nothing goes with an export; set it on each member that should`);
272
+ }
273
+ else {
274
+ members = [];
275
+ for (const name of new Set(o.members)) {
276
+ const m = decl.members.find((x) => x.name === name);
277
+ if (!m)
278
+ throw new ExportError(`the declaration has no member ${name}`);
279
+ if (m === target)
280
+ throw new ExportError(`member ${name} is the export member itself`);
281
+ if (!m.travel)
282
+ throw new ExportError(`member ${name} does not set travel to true, so it stays with the workspace`);
283
+ members.push(m);
284
+ }
285
+ }
286
+ if (members.some((m) => m.dir === "."))
287
+ throw new ExportError(`member ${members.find((m) => m.dir === ".").name} is the workspace root, and the root can't travel as a member`);
288
+ // Never into another member, never another member inside the export (D10).
289
+ for (const m of decl.members) {
290
+ if (m === target)
291
+ continue;
292
+ if (m.dir !== "." && under(target.dir, m.dir))
293
+ throw new ExportError(`the export member ${target.name} (${target.dir}) is inside member ${m.name} (${m.dir}); an export never writes into another member`);
294
+ if (under(m.dir, target.dir))
295
+ throw new ExportError(`member ${m.name} (${m.dir}) is inside the export member ${target.name} (${target.dir}); an export would write over it`);
296
+ }
297
+ // The workspace's own record kinds, for a whole export.
298
+ const dirs = [];
299
+ const dropped = { links: [], agents: [], pins: [], records: [], diagrams: [] };
300
+ if (whole) {
301
+ for (const k of decl.records) {
302
+ const loaded = await loadRecordKind(join(root, k.path), root);
303
+ for (const d of [posix.dirname(k.path), relative(root, loaded.dir).split("\\").join("/") || "."]) {
304
+ if (d === "." || d.startsWith(".."))
305
+ throw new ExportError(`record kind ${k.kind} keeps its kind file or records at the workspace root; an export takes directories, so move them into one`);
306
+ if (!dirs.includes(d))
307
+ dirs.push(d);
308
+ }
309
+ }
310
+ }
311
+ else {
312
+ dropped.records = decl.records.map((k) => k.kind);
313
+ }
314
+ for (const d of dirs) {
315
+ if (under(d, target.dir) || under(target.dir, d))
316
+ throw new ExportError(`the record directory ${d} overlaps the export member ${target.name}`);
317
+ }
318
+ // The files, read once. Another member's directory inside one that goes is left out.
319
+ const others = decl.members.filter((m) => !members.includes(m));
320
+ const files = new Map();
321
+ const locks = new Map();
322
+ for (const d of [...members.map((m) => m.dir), ...dirs]) {
323
+ for (const f of listFiles(join(root, d))) {
324
+ const path = `${d}/${f}`;
325
+ if (others.some((m) => m.dir !== "." && under(path, m.dir)))
326
+ continue;
327
+ if (isLockPath(path)) {
328
+ locks.set(path, parseLock(readFileSync(join(root, path), "utf-8")));
329
+ continue;
330
+ }
331
+ files.set(path, readFileSync(join(root, path)));
332
+ }
333
+ }
334
+ const hostFiles = new Map(files);
335
+ // The root lock goes, filtered to the files that went.
336
+ if (existsSync(join(root, LOCK_FILE)))
337
+ locks.set(LOCK_FILE, parseLock(readFileSync(join(root, LOCK_FILE), "utf-8")));
338
+ const exportLocks = new Map();
339
+ const lockDigests = {};
340
+ const hostValues = {};
341
+ const switched = new Set();
342
+ const params = { ...(o.params ?? {}) };
343
+ const usedParams = new Set();
344
+ for (const [path, lock] of locks) {
345
+ const dir = lockDir(path);
346
+ const out = { lockVersion: lock.lockVersion, scopes: {} };
347
+ for (const [scope, lineage] of Object.entries(lock.scopes)) {
348
+ const all = Object.keys(lineage.files);
349
+ const kept = all.filter((f) => files.has(scopedPath(dir, scope, f)) || (lineage.files[f].class === "generated" && members.some((m) => under(scopedPath(dir, scope, f), m.dir))));
350
+ const scopeDir = scopedPath(dir, scope, "") || ".";
351
+ const inside = members.some((m) => under(scopeDir, m.dir)) || dirs.some((d) => under(scopeDir, d));
352
+ if (kept.length === 0 && !inside)
353
+ continue;
354
+ const copy = JSON.parse(JSON.stringify(lineage));
355
+ copy.files = Object.fromEntries(kept.map((f) => [f, lineage.files[f]]));
356
+ copy.manualSteps = lineage.manualSteps.filter((s) => kept.includes(s.path));
357
+ if (copy.repinned)
358
+ copy.repinned = copy.repinned.filter((r) => kept.includes(r.record));
359
+ // Host-bound values switch (X3).
360
+ const values = {};
361
+ for (const name of Object.keys(lineage.hostBound ?? {})) {
362
+ if (params[name] === undefined)
363
+ continue;
364
+ usedParams.add(name);
365
+ const from = lineage.parameters[name];
366
+ if (typeof from !== "string")
367
+ throw new ExportError(`${path} scope ${scope}: host-bound parameter ${name} has no recorded value to switch`);
368
+ const pinned = (lineage.repinned ?? []).filter((r) => r.paths.some((p) => (lineage.hostBound[name] ?? []).includes(p)));
369
+ if (pinned.length > 0)
370
+ throw new ExportError(`${path} scope ${scope}: ${pinned[0].record} pins a file that carries host-bound ${name}; switching it would break the pin and the record's seal`);
371
+ values[name] = { from, to: params[name] };
372
+ }
373
+ if (Object.keys(values).length > 0) {
374
+ for (const p of switchHostValues(copy, dir, scope, values, files))
375
+ switched.add(p);
376
+ hostValues[`${path}#${scope}`] = Object.fromEntries(Object.entries(values).map(([n, v]) => [n, { host: v.from, export: v.to }]));
377
+ }
378
+ out.scopes[scope] = copy;
379
+ lockDigests[path] = { ...(lockDigests[path] ?? {}), [scope]: { host: lineageDigest(lineage), export: lineageDigest(copy), partial: kept.length < all.length } };
380
+ }
381
+ if (Object.keys(out.scopes).length > 0)
382
+ exportLocks.set(path, out);
383
+ }
384
+ const unused = Object.keys(params).filter((p) => !usedParams.has(p)).sort();
385
+ if (unused.length > 0)
386
+ throw new ExportError(`--param ${unused.join(", ")}: no exported lineage has a host-bound parameter by that name`);
387
+ // The export's declaration: the members that went, as written.
388
+ const raw = rawDeclaration(root).obj;
389
+ const names = new Set(members.map((m) => m.name));
390
+ const outDecl = {};
391
+ for (const [key, value] of Object.entries(raw)) {
392
+ if (key === "members") {
393
+ outDecl.members = value
394
+ .filter((e) => typeof e.name === "string" && names.has(e.name))
395
+ .map((e) => {
396
+ const links = e.links;
397
+ if (!links)
398
+ return e;
399
+ const keep = links.filter((l) => names.has(l.member));
400
+ for (const l of links)
401
+ if (!names.has(l.member))
402
+ dropped.links.push({ member: e.name, to: l.member });
403
+ const { links: _links, ...rest } = e;
404
+ return keep.length > 0 ? { ...rest, links: keep } : rest;
405
+ });
406
+ }
407
+ else if (key === "agents") {
408
+ // A session bound to several members (ws-101) keeps those that go, and is dropped when none does.
409
+ const agents = value;
410
+ const kept = [];
411
+ for (const a of agents) {
412
+ const bound = a.members ?? (a.member !== undefined ? [a.member] : []);
413
+ const going = bound.filter((m) => names.has(m));
414
+ if (going.length === 0)
415
+ dropped.agents.push(a.name);
416
+ else
417
+ kept.push(a.members !== undefined ? { ...a, members: going } : a);
418
+ }
419
+ outDecl.agents = kept;
420
+ }
421
+ else if (key === "pins") {
422
+ const pins = value;
423
+ for (const p of pins)
424
+ if (p.path !== undefined)
425
+ dropped.pins.push(p.path);
426
+ outDecl.pins = pins.filter((p) => p.path === undefined);
427
+ }
428
+ else if (key === "records") {
429
+ if (whole)
430
+ outDecl.records = value;
431
+ }
432
+ else if (key === "diagrams") {
433
+ for (const d of value)
434
+ dropped.diagrams.push(d.name);
435
+ }
436
+ else {
437
+ outDecl[key] = value;
438
+ }
439
+ }
440
+ // The manifest.
441
+ const fileHashes = {};
442
+ for (const path of [...files.keys()].sort())
443
+ fileHashes[path] = { host: fileHash(hostFiles.get(path)), export: fileHash(files.get(path)) };
444
+ const top = gitTopOf(root);
445
+ let revision = null;
446
+ let dirty = false;
447
+ if (top) {
448
+ try {
449
+ revision = git(root, ["rev-parse", "HEAD"]).trim();
450
+ }
451
+ catch {
452
+ revision = null;
453
+ }
454
+ const exported = [...members.map((m) => m.dir), ...dirs];
455
+ dirty = git(root, ["status", "--porcelain", "--", ...exported]).trim() !== "";
456
+ }
457
+ const body = {
458
+ from: { workspace: decl.name, revision, dirty },
459
+ member: target.name,
460
+ members: members.map((m) => m.name),
461
+ whole,
462
+ dirs: [...dirs].sort(),
463
+ files: fileHashes,
464
+ locks: lockDigests,
465
+ hostValues,
466
+ dropped,
467
+ };
468
+ const id = `exp-${createHash("sha256").update(JSON.stringify(body)).digest("hex").slice(0, 12)}`;
469
+ const manifest = ManifestSchema.parse({ schema: 1, id, ...body });
470
+ const result = { member: target.name, dir: target.dir, manifest, files: files.size + exportLocks.size, switched: [...switched].sort(), written: false };
471
+ if (o.dryRun)
472
+ return result;
473
+ // Write: the export member only, after clearing what an earlier export left.
474
+ const out = join(root, target.dir);
475
+ if (existsSync(out)) {
476
+ const present = readdirSync(out);
477
+ if (present.length > 0 && !existsSync(join(out, EXPORT_MANIFEST))) {
478
+ throw new ExportError(`${target.dir} holds files no export wrote (it has no ${EXPORT_MANIFEST}); export writes only into an empty export member or over an earlier export`);
479
+ }
480
+ for (const name of present)
481
+ if (name !== ".git")
482
+ rmSync(join(out, name), { recursive: true, force: true });
483
+ }
484
+ const put = (rel, data) => {
485
+ const abs = resolve(out, rel);
486
+ if (relative(out, abs).startsWith(".."))
487
+ throw new ExportError(`${rel} would land outside the export member`);
488
+ mkdirSync(dirname(abs), { recursive: true });
489
+ writeFileSync(abs, data);
490
+ };
491
+ for (const [path, data] of files)
492
+ put(path, data);
493
+ for (const [path, lock] of exportLocks)
494
+ put(path, renderLock(lock));
495
+ put("chant.workspace.json", JSON.stringify(outDecl, null, 2) + "\n");
496
+ put(EXPORT_MANIFEST, JSON.stringify(manifest, null, 2) + "\n");
497
+ result.written = true;
498
+ return result;
499
+ }