@intentius/chant 0.124.12 → 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 (928) 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.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. package/src/workspace/principal-classes.ts +5 -30
@@ -0,0 +1,620 @@
1
+ /**
2
+ * `chant workspace init [dir] [--name <name>] [--yes] [--verbose]` (#2534):
3
+ * propose a declaration from the projects already in a repository, print it
4
+ * with the directories that would leave the root project, and write it only
5
+ * once the user confirms (#2525 rule 1, ws-012).
6
+ *
7
+ * The proposal is a starting point for review, never written silently:
8
+ *
9
+ * - each outermost chant project (a chant.config.ts or .json) becomes a
10
+ * `chant` member, and the root's own config makes a root member `"."`;
11
+ * - each nested declaration becomes a `workspace` member;
12
+ * - each other npm package, from the npm workspaces or any other
13
+ * package.json, becomes an `other` member with a `because`;
14
+ * - projects under an `examples`, `test` or `fixtures`-style directory become
15
+ * example groups (ws-051), one glob per tree where the tree is mostly
16
+ * projects, explicit paths where it isn't;
17
+ * - each `chant` member gets an `ownership.stack` of its own (#2538, ws-037):
18
+ * a stack no other member uses is kept, and a shared or missing one gets a
19
+ * proposed name. The stack stays in the member's chant.config, since
20
+ * markers carry no member key, so this is printed for the user to apply and
21
+ * never written.
22
+ *
23
+ * Nothing here runs project code: it reads file names and package.json files.
24
+ *
25
+ * `--profile ideation|app|infra` starts a workspace from one of the reference
26
+ * workspace's profiles instead (#3174, ws-096): records only with a stub app,
27
+ * an app with its factory, or an estate with a factory and no app. It is
28
+ * `chant init --from` on `reference-workspace/profiles/<profile>` of the chant
29
+ * repository at this chant's release tag, or of the repository or directory
30
+ * `--from` names, so the new workspace gets a lineage lock and can be upgraded
31
+ * like any template copy.
32
+ */
33
+ import { execFileSync } from "node:child_process";
34
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
35
+ import { basename, join, resolve } from "node:path";
36
+ import { formatError, formatSuccess } from "../cli/format.js";
37
+ import { DECLARATION_FILES, NAME_PATTERN, parseDeclaration, resolveGroups, rootExclusions, WorkspaceReadError, isInside, readerVersion, } from "./declaration.js";
38
+ import { expandGlob } from "./glob.js";
39
+ import { setProperty } from "./json-edit.js";
40
+ import { holdsChantProject } from "./kinds.js";
41
+ import { gitTop, skippedDir, workingTree } from "./tree.js";
42
+ const USAGE = "chant workspace init [dir] [--name <name>] [--yes] [--verbose]\n chant workspace init --profile ideation|app|infra [dir] [--name <name>] [--param name=<display name>] [--from <repo>@<ref>|<chant checkout>] [--yes]";
43
+ /** The profiles `--profile` takes (#3174), each a directory under {@link PROFILES_DIR} in the chant repository. */
44
+ export const PROFILES = ["ideation", "app", "infra"];
45
+ /** Where the profiles live in the chant repository. */
46
+ export const PROFILES_DIR = "reference-workspace/profiles";
47
+ /** The repository the profiles are read from by default, at this chant's release tag. */
48
+ export const PROFILES_REPO = "https://github.com/INTENTIUS/chant";
49
+ /**
50
+ * The `chant init --from` source for a profile: `from` (a `<repo>@<ref>` or
51
+ * a directory holding a chant checkout) when given, else the chant repository
52
+ * at the tag of the chant reading, `chant-v<version>`.
53
+ */
54
+ export function profileSource(profile, from, version) {
55
+ const base = from ?? `${PROFILES_REPO}@chant-v${version}`;
56
+ return `${base}#${PROFILES_DIR}/${profile}`;
57
+ }
58
+ /** Directory names whose children are examples or test fixtures, not members. */
59
+ const EXAMPLE_DIRS = new Map([
60
+ ["examples", "examples"],
61
+ ["example", "examples"],
62
+ ["samples", "examples"],
63
+ ["test", "fixtures"],
64
+ ["tests", "fixtures"],
65
+ ["fixtures", "fixtures"],
66
+ ]);
67
+ const CONFIG_FILES = new Set(["chant.config.ts", "chant.config.json"]);
68
+ /**
69
+ * Test-runner directories (`__fixtures__` and the like). A project inside one
70
+ * is a fixture of the package around it, so it stays with that package.
71
+ */
72
+ const SCAFFOLDING = /(^|\/)__[a-z]+__(\/|$)/;
73
+ // ── Files ────────────────────────────────────────────────────────────────────
74
+ /** Every file under `root`, relative and `/`-separated: git's view when in a repository, else a walk. */
75
+ function listFiles(root) {
76
+ if (gitTop(root)) {
77
+ try {
78
+ const out = execFileSync("git", ["ls-files", "-z", "--cached", "--others", "--exclude-standard"], {
79
+ cwd: root,
80
+ encoding: "utf-8",
81
+ stdio: ["ignore", "pipe", "pipe"],
82
+ maxBuffer: 512 * 1024 * 1024,
83
+ });
84
+ return out
85
+ .split("\0")
86
+ .filter(Boolean)
87
+ .filter((f) => !f.split("/").some((s) => skippedDir(s)) && existsSync(join(root, f)));
88
+ }
89
+ catch {
90
+ // Fall through to the walk.
91
+ }
92
+ }
93
+ const out = [];
94
+ const walk = (dir, rel) => {
95
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
96
+ if (e.isDirectory()) {
97
+ if (!skippedDir(e.name))
98
+ walk(join(dir, e.name), rel ? `${rel}/${e.name}` : e.name);
99
+ }
100
+ else if (e.isFile()) {
101
+ out.push(rel ? `${rel}/${e.name}` : e.name);
102
+ }
103
+ }
104
+ };
105
+ walk(root, "");
106
+ return out;
107
+ }
108
+ const dirOf = (file) => (file.includes("/") ? file.slice(0, file.lastIndexOf("/")) : "");
109
+ /** Keep only the directories no other kept directory contains. */
110
+ function outermost(dirs) {
111
+ const kept = [];
112
+ for (const d of [...new Set(dirs)].sort()) {
113
+ if (!kept.some((k) => isInside(d, k)))
114
+ kept.push(d);
115
+ }
116
+ return kept;
117
+ }
118
+ // ── Names ────────────────────────────────────────────────────────────────────
119
+ export function sanitizeName(raw) {
120
+ return raw
121
+ .toLowerCase()
122
+ .replace(/[^a-z0-9-]+/g, "-")
123
+ .replace(/-+/g, "-")
124
+ .replace(/^[^a-z0-9]+/, "")
125
+ .slice(0, 40)
126
+ .replace(/-+$/, "");
127
+ }
128
+ function readPackage(tree, dir) {
129
+ try {
130
+ return JSON.parse(tree.read(dir ? `${dir}/package.json` : "package.json"));
131
+ }
132
+ catch {
133
+ return undefined;
134
+ }
135
+ }
136
+ /** The workspace's name: `--name`, else the git remote's repository name, else the root package, else the directory. */
137
+ function workspaceName(root, tree, given) {
138
+ if (given)
139
+ return given;
140
+ try {
141
+ const url = execFileSync("git", ["remote", "get-url", "origin"], { cwd: root, encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
142
+ const repo = sanitizeName(url.replace(/\.git$/, "").split(/[/:]/).pop() ?? "");
143
+ if (repo)
144
+ return repo;
145
+ }
146
+ catch {
147
+ // No remote.
148
+ }
149
+ const pkg = readPackage(tree, "");
150
+ if (typeof pkg?.name === "string") {
151
+ const n = sanitizeName(pkg.name.replace(/^@[^/]+\//, ""));
152
+ if (n)
153
+ return n;
154
+ }
155
+ return sanitizeName(basename(root)) || "workspace";
156
+ }
157
+ /** A member's name from its package.json, dropping the scope and the workspace's own prefix, else from its directory. */
158
+ function memberName(tree, dir, workspace) {
159
+ const pkg = readPackage(tree, dir);
160
+ if (typeof pkg?.name === "string") {
161
+ let n = pkg.name.replace(/^@[^/]+\//, "");
162
+ if (n.startsWith(`${workspace}-`))
163
+ n = n.slice(workspace.length + 1);
164
+ n = sanitizeName(n);
165
+ if (n && n !== workspace)
166
+ return n;
167
+ }
168
+ if (dir === "")
169
+ return "root";
170
+ return sanitizeName(basename(dir)) || "member";
171
+ }
172
+ function uniqueName(name, taken) {
173
+ let n = name;
174
+ for (let i = 2; taken.has(n); i++)
175
+ n = `${name.slice(0, 37)}-${i}`;
176
+ taken.add(n);
177
+ return n;
178
+ }
179
+ // ── Ownership stacks ─────────────────────────────────────────────────────────
180
+ /** A string literal in TS or JSON source. */
181
+ const STRING = String.raw `(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)'|\`([^\`$\\]*)\`)`;
182
+ const TS_STACK = new RegExp(String.raw `\bownership\s*:\s*\{[^{}]*?\bstack\s*:\s*` + STRING);
183
+ const TS_OWNERSHIP = /\bownership\s*:/;
184
+ /**
185
+ * A member's `ownership.stack` read from its config's text, without running
186
+ * it: `{ stack }` when it is a plain string, `{ computed: true }` when the
187
+ * config has an ownership block whose stack is not one, and `{}` when it sets
188
+ * none.
189
+ */
190
+ export function readOwnershipStack(tree, dir) {
191
+ for (const name of ["chant.config.ts", "chant.config.json"]) {
192
+ const config = dir ? `${dir}/${name}` : name;
193
+ if (tree.stat(config) !== "file")
194
+ continue;
195
+ const text = tree.read(config);
196
+ if (name.endsWith(".json")) {
197
+ try {
198
+ const stack = JSON.parse(text).ownership?.stack;
199
+ return typeof stack === "string" ? { config, stack } : { config };
200
+ }
201
+ catch {
202
+ return { config };
203
+ }
204
+ }
205
+ const m = TS_STACK.exec(text);
206
+ if (m)
207
+ return { config, stack: m[1] ?? m[2] ?? m[3] };
208
+ return TS_OWNERSHIP.test(text) && /\bstack\s*:/.test(text) ? { config, computed: true } : { config };
209
+ }
210
+ return undefined;
211
+ }
212
+ /** A stack name from a member name: the name itself, else the name with a number, avoiding `taken`. */
213
+ function freeStack(name, taken) {
214
+ let s = name;
215
+ for (let i = 2; taken.has(s); i++)
216
+ s = `${name}-${i}`;
217
+ return s;
218
+ }
219
+ /**
220
+ * One distinct stack per `chant` member, in declaration order, so the root
221
+ * member and then the outermost directories keep theirs first. A stack only
222
+ * one member uses is kept. A shared stack stays with the first member using
223
+ * it, and the others get their member name. A member with no stack, or one
224
+ * the config computes, gets its member name too. A proposed name never takes
225
+ * a stack another member already sets.
226
+ */
227
+ export function proposeStacks(tree, members) {
228
+ const chant = members
229
+ .filter((m) => m.kind === "chant")
230
+ .map((m) => ({ m, read: readOwnershipStack(tree, m.dir === "." ? "" : m.dir) }))
231
+ .filter((x) => x.read !== undefined);
232
+ const setBy = new Map();
233
+ for (const { m, read } of chant)
234
+ if (read.stack)
235
+ setBy.set(read.stack, [...(setBy.get(read.stack) ?? []), m.name]);
236
+ const taken = new Set();
237
+ const out = [];
238
+ for (const { m, read } of chant) {
239
+ const current = read.stack ?? null;
240
+ const base = { member: m.name, dir: m.dir, config: read.config, current };
241
+ if (current !== null && !taken.has(current)) {
242
+ taken.add(current);
243
+ out.push({ ...base, proposed: current });
244
+ continue;
245
+ }
246
+ // Avoid every stack a member sets, so no rename lands on a later member's.
247
+ const proposed = freeStack(m.name, new Set([...taken, ...setBy.keys()]));
248
+ taken.add(proposed);
249
+ out.push({ ...base, proposed, reason: current !== null ? "shared" : read.computed ? "computed" : "missing" });
250
+ }
251
+ return out;
252
+ }
253
+ // ── Examples ─────────────────────────────────────────────────────────────────
254
+ /** The example match holding `dir`: the directory just below its last examples-style segment, if any. */
255
+ function exampleMatch(dir) {
256
+ const segs = dir.split("/");
257
+ for (let k = segs.length - 2; k >= 0; k--) {
258
+ if (EXAMPLE_DIRS.has(segs[k]))
259
+ return { match: segs.slice(0, k + 2).join("/"), parent: segs.slice(0, k + 1).join("/") };
260
+ }
261
+ return undefined;
262
+ }
263
+ function dependsOnChant(tree, dir) {
264
+ const pkg = readPackage(tree, dir);
265
+ if (!pkg)
266
+ return false;
267
+ return ["dependencies", "devDependencies", "peerDependencies"].some((f) => {
268
+ const deps = pkg[f];
269
+ return !!deps && typeof deps === "object" && Object.keys(deps).some((d) => d === "@intentius/chant" || d.startsWith("@intentius/chant-lexicon-"));
270
+ });
271
+ }
272
+ /**
273
+ * Globs covering `matches`. A tree whose subdirectories are mostly matches
274
+ * gets `<parent>/*`, and parents that differ in one segment merge into one
275
+ * glob with `*` there, when the merged glob claims no member. A tree that is
276
+ * mostly something else lists its matches one by one.
277
+ */
278
+ function exampleGlobs(tree, matches, memberDirs) {
279
+ const byParent = new Map();
280
+ for (const m of matches) {
281
+ const parent = dirOf(m);
282
+ byParent.set(parent, [...(byParent.get(parent) ?? []), m]);
283
+ }
284
+ const wide = [];
285
+ const explicit = [];
286
+ for (const [parent, ms] of byParent) {
287
+ const subdirs = (tree.list(parent) ?? []).filter((e) => e.type === "dir" && !skippedDir(e.name)).length;
288
+ if (ms.length * 2 >= subdirs)
289
+ wide.push(parent);
290
+ else
291
+ explicit.push(...ms);
292
+ }
293
+ const safe = (glob) => expandGlob(tree, glob).every((d) => !memberDirs.some((m) => m !== "" && isInside(m, d)) && (matches.includes(d) || !holdsChantProject(tree, d)));
294
+ const globs = [];
295
+ const left = new Set(wide);
296
+ // Try every one-segment wildcard, largest merge first.
297
+ const candidates = new Map();
298
+ for (const p of wide) {
299
+ const segs = p.split("/");
300
+ for (let i = 0; i < segs.length - 1; i++) {
301
+ const pattern = [...segs.slice(0, i), "*", ...segs.slice(i + 1)].join("/");
302
+ candidates.set(pattern, [...(candidates.get(pattern) ?? []), p]);
303
+ }
304
+ }
305
+ for (const [pattern, parents] of [...candidates].sort((a, b) => b[1].length - a[1].length)) {
306
+ const open = parents.filter((p) => left.has(p));
307
+ if (open.length < 2 || !safe(`${pattern}/*`))
308
+ continue;
309
+ globs.push(`${pattern}/*`);
310
+ for (const p of open)
311
+ left.delete(p);
312
+ }
313
+ for (const p of left)
314
+ globs.push(`${p}/*`);
315
+ // Explicit matches a glob already covers need no entry of their own.
316
+ const covered = new Set(globs.flatMap((g) => expandGlob(tree, g)));
317
+ for (const m of explicit)
318
+ if (!covered.has(m))
319
+ globs.push(m);
320
+ return globs.sort();
321
+ }
322
+ /** The group a glob belongs to: `examples`, `fixtures`, or prefixed by the tree it sits in, such as `lexicon-examples`. */
323
+ function groupName(glob) {
324
+ const segs = glob.split("/");
325
+ let k = segs.length - 1;
326
+ while (k > 0 && !EXAMPLE_DIRS.has(segs[k]))
327
+ k--;
328
+ const base = EXAMPLE_DIRS.get(segs[k]) ?? "examples";
329
+ const words = [];
330
+ for (let i = 0; i < k; i++) {
331
+ if (segs[i] === "*" || EXAMPLE_DIRS.has(segs[i]))
332
+ continue;
333
+ words.push(segs[i + 1] === "*" ? segs[i].replace(/s$/, "") : segs[i]);
334
+ }
335
+ return sanitizeName([...words, base].join("-")) || base;
336
+ }
337
+ // ── The proposal ─────────────────────────────────────────────────────────────
338
+ export function proposeWorkspace(root, options = {}) {
339
+ const tree = workingTree(root);
340
+ const files = listFiles(root);
341
+ const dirsWith = (names) => new Set(files.filter((f) => names(f.slice(f.lastIndexOf("/") + 1))).map(dirOf));
342
+ const name = workspaceName(root, tree, options.name);
343
+ const configDirs = new Set([...dirsWith((n) => CONFIG_FILES.has(n))].filter((d) => !SCAFFOLDING.test(d)));
344
+ const declDirs = dirsWith((n) => DECLARATION_FILES.includes(n));
345
+ const pkgDirs = dirsWith((n) => n === "package.json");
346
+ const nested = outermost([...declDirs].filter((d) => d !== ""));
347
+ const notNested = (d) => !nested.some((n) => isInside(d, n));
348
+ const projects = outermost([...configDirs].filter((d) => d !== "" && notNested(d)));
349
+ const matches = new Set();
350
+ const chantMembers = [];
351
+ for (const p of projects) {
352
+ const ex = exampleMatch(p);
353
+ if (ex)
354
+ matches.add(ex.match);
355
+ else
356
+ chantMembers.push(p);
357
+ }
358
+ // Examples with no config name their lexicon in package.json.
359
+ for (const d of pkgDirs) {
360
+ const ex = d === "" || SCAFFOLDING.test(d) ? undefined : exampleMatch(d);
361
+ if (ex && ex.match === d && notNested(d) && dependsOnChant(tree, d))
362
+ matches.add(ex.match);
363
+ }
364
+ // A match holding a member's project would put a member inside a group.
365
+ for (const m of [...matches])
366
+ if (chantMembers.some((c) => isInside(c, m) || isInside(m, c)))
367
+ matches.delete(m);
368
+ const npmWorkspaces = new Set();
369
+ const rootPkg = readPackage(tree, "");
370
+ const ws = rootPkg?.workspaces;
371
+ const wsGlobs = Array.isArray(ws) ? ws : ws && typeof ws === "object" && Array.isArray(ws.packages) ? ws.packages : [];
372
+ for (const g of wsGlobs)
373
+ if (typeof g === "string" && !g.startsWith("!"))
374
+ for (const d of expandGlob(tree, g.replace(/^\.\//, "").replace(/\/$/, "")))
375
+ npmWorkspaces.add(d);
376
+ const claimed = (d) => !notNested(d) ||
377
+ [...matches].some((m) => isInside(d, m)) ||
378
+ chantMembers.some((c) => isInside(d, c) || isInside(c, d)) ||
379
+ exampleMatch(d) !== undefined;
380
+ const packages = outermost([...pkgDirs].filter((d) => d !== "" && !claimed(d)));
381
+ const taken = new Set([name]);
382
+ const entries = [];
383
+ if (configDirs.has(""))
384
+ entries.push({ sort: "", name: uniqueName(memberName(tree, "", name), taken), dir: ".", kind: "chant" });
385
+ for (const d of nested)
386
+ entries.push({ sort: d, name: uniqueName(memberName(tree, d, name), taken), dir: d, kind: "workspace" });
387
+ for (const d of chantMembers)
388
+ entries.push({ sort: d, name: uniqueName(memberName(tree, d, name), taken), dir: d, kind: "chant" });
389
+ for (const d of packages) {
390
+ entries.push({
391
+ sort: d,
392
+ name: uniqueName(memberName(tree, d, name), taken),
393
+ dir: d,
394
+ kind: "other",
395
+ because: npmWorkspaces.has(d) ? "an npm workspace package with no chant project" : "an npm package with no chant project",
396
+ });
397
+ }
398
+ entries.sort((a, b) => (a.sort < b.sort ? -1 : a.sort > b.sort ? 1 : 0));
399
+ taken.delete(name);
400
+ const memberDirs = entries.map((e) => (e.dir === "." ? "" : e.dir));
401
+ const byGroup = new Map();
402
+ for (const g of exampleGlobs(tree, [...matches].sort(), memberDirs)) {
403
+ const n = groupName(g);
404
+ byGroup.set(n, [...(byGroup.get(n) ?? []), g]);
405
+ }
406
+ const groups = [...byGroup]
407
+ .map(([n, globs]) => ({ name: uniqueName(n, taken), kind: "examples", glob: globs.length === 1 ? globs[0] : globs }))
408
+ .sort((a, b) => ([a.glob].flat()[0] < [b.glob].flat()[0] ? -1 : 1));
409
+ const declaration = {
410
+ name,
411
+ schema: 1,
412
+ members: [...entries.map(({ sort: _sort, ...e }) => e), ...groups],
413
+ };
414
+ // Read the proposal back through the real reader: it must be a valid
415
+ // declaration before anyone is asked to write it.
416
+ const parsed = parseDeclaration(JSON.stringify(declaration), "chant.workspace.json");
417
+ const resolved = resolveGroups(parsed, tree);
418
+ const isSource = (f) => f.endsWith(".ts") && !f.endsWith(".test.ts") && !f.endsWith(".spec.ts");
419
+ const leaving = rootExclusions(parsed, resolved).map((x) => ({
420
+ ...x,
421
+ files: files.filter((f) => isInside(f, x.dir) && isSource(f)),
422
+ }));
423
+ const stacks = proposeStacks(tree, entries.map((e) => ({ name: e.name, dir: e.dir, kind: e.kind })));
424
+ return { root, declaration, leaving, stacks };
425
+ }
426
+ // ── The command ──────────────────────────────────────────────────────────────
427
+ function formatLeaving(proposal, verbose) {
428
+ const lines = [];
429
+ if (proposal.leaving.length === 0) {
430
+ lines.push("No directory leaves the root project.");
431
+ return lines;
432
+ }
433
+ lines.push("Once the file exists, these directories leave the root project: chant build, lint, run and audit");
434
+ lines.push("at the root stop reading them, and the member or example group named beside each takes them over.");
435
+ lines.push("");
436
+ // Group matches are summed per group; members get a row each.
437
+ const rows = [];
438
+ const groupNames = new Set(proposal.declaration.members.filter((m) => m.kind === "examples").map((m) => m.name));
439
+ for (const x of proposal.leaving) {
440
+ if (groupNames.has(x.owner) && !verbose) {
441
+ const row = rows.find((r) => r.owner === x.owner);
442
+ if (row) {
443
+ row.files.push(...x.files);
444
+ row.label = `${Number(row.label.split(" ")[0]) + 1} directories`;
445
+ continue;
446
+ }
447
+ rows.push({ label: "1 directories", owner: x.owner, files: [...x.files] });
448
+ }
449
+ else {
450
+ rows.push({ label: x.dir, owner: x.owner, files: x.files });
451
+ }
452
+ }
453
+ for (const r of rows)
454
+ if (r.label === "1 directories")
455
+ r.label = "1 directory";
456
+ const w0 = Math.max(9, ...rows.map((r) => r.label.length));
457
+ const w1 = Math.max(5, ...rows.map((r) => r.owner.length));
458
+ lines.push(` ${"DIRECTORY".padEnd(w0)} ${"OWNER".padEnd(w1)} .TS FILES`);
459
+ for (const r of rows) {
460
+ lines.push(` ${r.label.padEnd(w0)} ${r.owner.padEnd(w1)} ${r.files.length}`);
461
+ if (verbose)
462
+ for (const f of r.files)
463
+ lines.push(` ${f}`);
464
+ }
465
+ const total = proposal.leaving.reduce((n, x) => n + x.files.length, 0);
466
+ lines.push("");
467
+ lines.push(`${proposal.leaving.length} director${proposal.leaving.length === 1 ? "y" : "ies"} with ${total} .ts source file${total === 1 ? "" : "s"} leave the root project.${verbose ? "" : " --verbose lists every file."}`);
468
+ return lines;
469
+ }
470
+ function formatStacks(proposal) {
471
+ if (proposal.stacks.length === 0)
472
+ return [];
473
+ const lines = [];
474
+ lines.push("Each chant member needs its own ownership.stack: markers carry no member name, and chant workspace");
475
+ lines.push("check fails when two members share one. The stack stays in the member's chant.config, so apply");
476
+ lines.push("the changes below by hand. Renaming a stack that is already deployed changes its resources' markers.");
477
+ lines.push("");
478
+ const w0 = Math.max(6, ...proposal.stacks.map((s) => s.member.length));
479
+ const w1 = Math.max(5, ...proposal.stacks.map((s) => s.proposed.length));
480
+ lines.push(` ${"MEMBER".padEnd(w0)} ${"STACK".padEnd(w1)} CHANGE`);
481
+ for (const s of proposal.stacks) {
482
+ let change = "keep";
483
+ if (s.reason === "missing")
484
+ change = `set ownership.stack in ${s.config}`;
485
+ if (s.reason === "computed")
486
+ change = `computed in ${s.config}; make sure it is distinct`;
487
+ if (s.reason === "shared")
488
+ change = `rename from ${JSON.stringify(s.current)} in ${s.config}, which another member uses`;
489
+ lines.push(` ${s.member.padEnd(w0)} ${s.proposed.padEnd(w1)} ${change}`);
490
+ }
491
+ return lines;
492
+ }
493
+ async function confirm(question) {
494
+ const { createInterface } = await import("node:readline");
495
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
496
+ return new Promise((resolveAnswer) => {
497
+ rl.question(question, (answer) => {
498
+ resolveAnswer(/^y(es)?$/i.test(answer.trim()));
499
+ rl.close();
500
+ });
501
+ // EOF without an answer is a no.
502
+ rl.on("close", () => resolveAnswer(false));
503
+ });
504
+ }
505
+ export async function runWorkspaceInit(ctx) {
506
+ const { args } = ctx;
507
+ const cwd = process.cwd();
508
+ const root = args.extraPositional ? resolve(args.extraPositional) : (gitTop(cwd) ?? cwd);
509
+ if (!existsSync(root)) {
510
+ console.error(formatError({ message: `${root} does not exist`, hint: USAGE }));
511
+ return 1;
512
+ }
513
+ const existing = DECLARATION_FILES.filter((f) => existsSync(join(root, f)));
514
+ if (existing.length > 0) {
515
+ console.error(formatError({
516
+ message: `${join(root, existing[0])} already exists`,
517
+ hint: "Edit it by hand, or run chant workspace ls to see what it declares.",
518
+ }));
519
+ return 1;
520
+ }
521
+ if (args.selectName !== undefined && !NAME_PATTERN.test(args.selectName)) {
522
+ console.error(formatError({
523
+ message: `--name ${JSON.stringify(args.selectName)} is not a valid workspace name`,
524
+ hint: "Use lowercase letters, digits and hyphens, starting with a letter or digit, at most 40 characters.",
525
+ }));
526
+ return 1;
527
+ }
528
+ if (args.profile !== undefined)
529
+ return initProfile(args, root);
530
+ let proposal;
531
+ try {
532
+ proposal = proposeWorkspace(root, { name: args.selectName });
533
+ }
534
+ catch (err) {
535
+ if (!(err instanceof WorkspaceReadError))
536
+ throw err;
537
+ // The proposal failed its own check; that is a bug in the proposer, but say what it found.
538
+ console.error(formatError({ message: `the proposed declaration is not valid: ${err.describe()}`, hint: "Write chant.workspace.json by hand for now." }));
539
+ return 1;
540
+ }
541
+ const target = join(root, "chant.workspace.json");
542
+ const text = `${JSON.stringify(proposal.declaration, null, 2)}\n`;
543
+ console.log(`Proposed ${target}:`);
544
+ console.log("");
545
+ console.log(text);
546
+ for (const line of formatLeaving(proposal, !!args.verbose))
547
+ console.log(line);
548
+ console.log("");
549
+ const stackLines = formatStacks(proposal);
550
+ if (stackLines.length > 0) {
551
+ for (const line of stackLines)
552
+ console.log(line);
553
+ console.log("");
554
+ }
555
+ let write = !!args.yes;
556
+ if (!write) {
557
+ if (!process.stdin.isTTY) {
558
+ console.log("Nothing written. Re-run with --yes to write it, or save the proposal above and edit it first.");
559
+ return 0;
560
+ }
561
+ write = await confirm("Write chant.workspace.json? [y/N] ");
562
+ }
563
+ if (!write) {
564
+ console.log("Nothing written.");
565
+ return 0;
566
+ }
567
+ writeFileSync(target, text, { flag: "wx" });
568
+ console.log(formatSuccess(`Wrote ${target}. chant workspace ls lists what it declares.`));
569
+ return 0;
570
+ }
571
+ /** `chant workspace init --profile <profile>` (#3174): copy a profile with `chant init --from`, then name the workspace. */
572
+ async function initProfile(args, root) {
573
+ const profile = args.profile;
574
+ if (!PROFILES.includes(profile)) {
575
+ console.error(formatError({ message: `--profile ${JSON.stringify(args.profile)} is not a profile; the profiles are ${PROFILES.join(", ")}`, hint: USAGE }));
576
+ return 1;
577
+ }
578
+ const { parseParamArgs } = await import("./template-manifest.js");
579
+ let params;
580
+ try {
581
+ params = parseParamArgs(args.param ?? []);
582
+ }
583
+ catch (err) {
584
+ console.error(formatError({ message: err.message, hint: USAGE }));
585
+ return 1;
586
+ }
587
+ const from = profileSource(profile, args.migrateFrom, readerVersion());
588
+ console.log(`chant workspace init --profile ${profile} copies ${from} into ${root}, as chant init --from would, with a lineage lock.`);
589
+ if (args.selectName !== undefined)
590
+ console.log(`The workspace is named ${args.selectName}.`);
591
+ console.log("");
592
+ let write = !!args.yes;
593
+ if (!write) {
594
+ if (!process.stdin.isTTY) {
595
+ console.log("Nothing written. Re-run with --yes to write it.");
596
+ return 0;
597
+ }
598
+ write = await confirm(`Make the ${profile} workspace? [y/N] `);
599
+ }
600
+ if (!write) {
601
+ console.log("Nothing written.");
602
+ return 0;
603
+ }
604
+ const { initFromCommand } = await import("./lineage-init.js");
605
+ const result = await initFromCommand({ from, path: root, params, force: args.force });
606
+ if (!result.success) {
607
+ console.error(formatError({ message: result.error ?? `the ${profile} profile could not be copied`, hint: USAGE }));
608
+ return 1;
609
+ }
610
+ if (args.selectName !== undefined) {
611
+ const file = join(root, "chant.workspace.json");
612
+ writeFileSync(file, setProperty(readFileSync(file, "utf-8"), false, "", "name", args.selectName));
613
+ }
614
+ console.log(formatSuccess(`Made a ${profile} workspace in ${root}:`));
615
+ for (const f of result.createdFiles)
616
+ console.log(` ${f}`);
617
+ console.log("");
618
+ console.log("chant workspace check checks it, and chant workspace upgrade takes a later version of the profile.");
619
+ return 0;
620
+ }