@intentius/chant 0.101.0 → 0.104.0

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 (739) hide show
  1. package/dist/agents/checks.d.ts.map +1 -1
  2. package/dist/attrref.d.ts.map +1 -1
  3. package/dist/audit/core.d.ts +2 -0
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts.map +1 -1
  6. package/dist/audit/nginx.d.ts.map +1 -1
  7. package/dist/audit/prior-art.d.ts +48 -0
  8. package/dist/audit/prior-art.d.ts.map +1 -1
  9. package/dist/behaviour-kinds.d.ts.map +1 -1
  10. package/dist/builder.d.ts.map +1 -1
  11. package/dist/change-set.d.ts +232 -0
  12. package/dist/change-set.d.ts.map +1 -0
  13. package/dist/cli/commands/audit.d.ts +7 -0
  14. package/dist/cli/commands/audit.d.ts.map +1 -1
  15. package/dist/cli/commands/build.d.ts.map +1 -1
  16. package/dist/cli/commands/carve-emit.d.ts.map +1 -1
  17. package/dist/cli/commands/check-lexicon.d.ts +16 -0
  18. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  19. package/dist/cli/commands/import.d.ts +8 -0
  20. package/dist/cli/commands/import.d.ts.map +1 -1
  21. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  22. package/dist/cli/commands/init.d.ts +19 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/onboard.d.ts +9 -0
  25. package/dist/cli/commands/onboard.d.ts.map +1 -1
  26. package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
  27. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
  28. package/dist/cli/handlers/build.d.ts.map +1 -1
  29. package/dist/cli/handlers/change-set.d.ts +11 -0
  30. package/dist/cli/handlers/change-set.d.ts.map +1 -0
  31. package/dist/cli/handlers/dev.d.ts.map +1 -1
  32. package/dist/cli/handlers/fan-out.d.ts +33 -0
  33. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  34. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  35. package/dist/cli/handlers/misc.d.ts.map +1 -1
  36. package/dist/cli/handlers/operator.d.ts +16 -0
  37. package/dist/cli/handlers/operator.d.ts.map +1 -1
  38. package/dist/cli/handlers/pr.d.ts +31 -0
  39. package/dist/cli/handlers/pr.d.ts.map +1 -0
  40. package/dist/cli/handlers/run.d.ts.map +1 -1
  41. package/dist/cli/lsp/server.d.ts.map +1 -1
  42. package/dist/cli/main.d.ts.map +1 -1
  43. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  44. package/dist/cli/mcp/server.d.ts.map +1 -1
  45. package/dist/cli/mcp/tools/build.d.ts.map +1 -1
  46. package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
  47. package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
  48. package/dist/cli/mcp/tools/import.d.ts.map +1 -1
  49. package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
  50. package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
  51. package/dist/cli/mcp/tools/search.d.ts.map +1 -1
  52. package/dist/cli/mcp/workspace-tools.d.ts +4 -3
  53. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  54. package/dist/cli/registry.d.ts +74 -3
  55. package/dist/cli/registry.d.ts.map +1 -1
  56. package/dist/codegen/fetch.d.ts.map +1 -1
  57. package/dist/codegen/naming.d.ts.map +1 -1
  58. package/dist/codegen/pinned-upgrade.d.ts +67 -3
  59. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  60. package/dist/codegen/registry.d.ts.map +1 -1
  61. package/dist/components/auto-release.d.ts +16 -0
  62. package/dist/components/auto-release.d.ts.map +1 -1
  63. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  64. package/dist/components/capability.d.ts +53 -0
  65. package/dist/components/capability.d.ts.map +1 -1
  66. package/dist/components/changed-files.d.ts +31 -0
  67. package/dist/components/changed-files.d.ts.map +1 -0
  68. package/dist/components/cli-support.d.ts +9 -1
  69. package/dist/components/cli-support.d.ts.map +1 -1
  70. package/dist/components/component.d.ts +24 -0
  71. package/dist/components/component.d.ts.map +1 -1
  72. package/dist/components/deploy-units.d.ts.map +1 -1
  73. package/dist/components/driver.d.ts +13 -0
  74. package/dist/components/driver.d.ts.map +1 -1
  75. package/dist/components/fan-out-output.d.ts +6 -0
  76. package/dist/components/fan-out-output.d.ts.map +1 -1
  77. package/dist/components/fan-out-record.d.ts +41 -0
  78. package/dist/components/fan-out-record.d.ts.map +1 -0
  79. package/dist/components/fan-out-run.d.ts +65 -0
  80. package/dist/components/fan-out-run.d.ts.map +1 -1
  81. package/dist/components/fan-out-support.d.ts +2 -0
  82. package/dist/components/fan-out-support.d.ts.map +1 -1
  83. package/dist/components/fan-out.d.ts +6 -0
  84. package/dist/components/fan-out.d.ts.map +1 -1
  85. package/dist/components/gated-wave-pipeline.d.ts +50 -0
  86. package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
  87. package/dist/components/index.d.ts +1 -1
  88. package/dist/components/index.d.ts.map +1 -1
  89. package/dist/components/layers.d.ts +25 -0
  90. package/dist/components/layers.d.ts.map +1 -0
  91. package/dist/components/pr-pipeline.d.ts +61 -0
  92. package/dist/components/pr-pipeline.d.ts.map +1 -0
  93. package/dist/components/pr-run.d.ts +119 -0
  94. package/dist/components/pr-run.d.ts.map +1 -0
  95. package/dist/components/promote.d.ts.map +1 -1
  96. package/dist/components/starter-plugin.d.ts.map +1 -1
  97. package/dist/components/verbs/process-runner.d.ts.map +1 -1
  98. package/dist/components/verbs/r2-sync.d.ts.map +1 -1
  99. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  100. package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
  101. package/dist/components/verbs/shell.d.ts.map +1 -1
  102. package/dist/components/verbs/sign.d.ts.map +1 -1
  103. package/dist/components/verbs/verify.d.ts.map +1 -1
  104. package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
  105. package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
  106. package/dist/components/verbs/wrangler.d.ts.map +1 -1
  107. package/dist/components/wave-plan.d.ts +49 -0
  108. package/dist/components/wave-plan.d.ts.map +1 -0
  109. package/dist/composite.d.ts.map +1 -1
  110. package/dist/config.d.ts +19 -7
  111. package/dist/config.d.ts.map +1 -1
  112. package/dist/declarable.d.ts +16 -0
  113. package/dist/declarable.d.ts.map +1 -1
  114. package/dist/discovery/cache.d.ts.map +1 -1
  115. package/dist/discovery/fold-import.d.ts +15 -5
  116. package/dist/discovery/fold-import.d.ts.map +1 -1
  117. package/dist/discovery/param-deps.d.ts +16 -0
  118. package/dist/discovery/param-deps.d.ts.map +1 -1
  119. package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
  120. package/dist/discovery/specifier-resolve.d.ts +37 -0
  121. package/dist/discovery/specifier-resolve.d.ts.map +1 -0
  122. package/dist/errors.d.ts.map +1 -1
  123. package/dist/fold/fold.d.ts +3 -1
  124. package/dist/fold/fold.d.ts.map +1 -1
  125. package/dist/gated-waves.d.ts +147 -0
  126. package/dist/gated-waves.d.ts.map +1 -0
  127. package/dist/graph-detail.d.ts.map +1 -1
  128. package/dist/graph-ir.d.ts.map +1 -1
  129. package/dist/graph-layout.d.ts.map +1 -1
  130. package/dist/import/base-parser.d.ts.map +1 -1
  131. package/dist/import/embedded.d.ts +7 -0
  132. package/dist/import/embedded.d.ts.map +1 -1
  133. package/dist/import/parser-options.d.ts +14 -0
  134. package/dist/import/parser-options.d.ts.map +1 -0
  135. package/dist/import/parser.d.ts +17 -0
  136. package/dist/import/parser.d.ts.map +1 -1
  137. package/dist/index.d.ts +1 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/kubectl-context.d.ts.map +1 -1
  140. package/dist/lexicon-output.d.ts.map +1 -1
  141. package/dist/lexicon-schema.d.ts +3 -3
  142. package/dist/lexicon.d.ts +103 -3
  143. package/dist/lexicon.d.ts.map +1 -1
  144. package/dist/lifecycle/assert-live.d.ts.map +1 -1
  145. package/dist/lifecycle/gate-ledger.d.ts +22 -0
  146. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  147. package/dist/lifecycle/git.d.ts +46 -1
  148. package/dist/lifecycle/git.d.ts.map +1 -1
  149. package/dist/lifecycle/member-ledger.d.ts.map +1 -1
  150. package/dist/lifecycle/observe.d.ts.map +1 -1
  151. package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
  152. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  153. package/dist/lifecycle/scenario.d.ts.map +1 -1
  154. package/dist/lifecycle/status.d.ts.map +1 -1
  155. package/dist/lifecycle/work-lease.d.ts +61 -2
  156. package/dist/lifecycle/work-lease.d.ts.map +1 -1
  157. package/dist/lint/config.d.ts +8 -8
  158. package/dist/lint/engine.d.ts +6 -0
  159. package/dist/lint/engine.d.ts.map +1 -1
  160. package/dist/lint/post-synth.d.ts +18 -0
  161. package/dist/lint/post-synth.d.ts.map +1 -1
  162. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  163. package/dist/op/activities/activity-contracts.d.ts +137 -11
  164. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  165. package/dist/op/activities/apply.d.ts +79 -9
  166. package/dist/op/activities/apply.d.ts.map +1 -1
  167. package/dist/op/activities/change-set.d.ts +62 -0
  168. package/dist/op/activities/change-set.d.ts.map +1 -0
  169. package/dist/op/activities/decide.d.ts +2 -0
  170. package/dist/op/activities/decide.d.ts.map +1 -1
  171. package/dist/op/activities/factory.d.ts +137 -0
  172. package/dist/op/activities/factory.d.ts.map +1 -0
  173. package/dist/op/activities/index.d.ts +5 -1
  174. package/dist/op/activities/index.d.ts.map +1 -1
  175. package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
  176. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
  177. package/dist/op/activity-contract.d.ts +1 -1
  178. package/dist/op/activity-contract.d.ts.map +1 -1
  179. package/dist/op/activity-failure.d.ts.map +1 -1
  180. package/dist/op/activity-profiles.d.ts.map +1 -1
  181. package/dist/op/builders.d.ts +11 -0
  182. package/dist/op/builders.d.ts.map +1 -1
  183. package/dist/op/composites/apply-op.d.ts +12 -5
  184. package/dist/op/composites/apply-op.d.ts.map +1 -1
  185. package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
  186. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
  187. package/dist/op/decide-backend.d.ts +5 -1
  188. package/dist/op/decide-backend.d.ts.map +1 -1
  189. package/dist/op/decide-read-inputs.d.ts +4 -2
  190. package/dist/op/decide-read-inputs.d.ts.map +1 -1
  191. package/dist/op/emulator-lifecycle.d.ts +21 -2
  192. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  193. package/dist/op/factory.d.ts +83 -0
  194. package/dist/op/factory.d.ts.map +1 -0
  195. package/dist/op/gate-approval.d.ts +5 -1
  196. package/dist/op/gate-approval.d.ts.map +1 -1
  197. package/dist/op/gate-wait.d.ts.map +1 -1
  198. package/dist/op/gate.d.ts +19 -3
  199. package/dist/op/gate.d.ts.map +1 -1
  200. package/dist/op/index.d.ts +6 -1
  201. package/dist/op/index.d.ts.map +1 -1
  202. package/dist/op/local-executor.d.ts +6 -0
  203. package/dist/op/local-executor.d.ts.map +1 -1
  204. package/dist/op/op-ir.d.ts +2 -0
  205. package/dist/op/op-ir.d.ts.map +1 -1
  206. package/dist/op/op-verb-class.d.ts.map +1 -1
  207. package/dist/op/operator.d.ts.map +1 -1
  208. package/dist/op/run-context.d.ts +39 -0
  209. package/dist/op/run-context.d.ts.map +1 -0
  210. package/dist/op/run-live.d.ts.map +1 -1
  211. package/dist/op/runtimes/local.d.ts.map +1 -1
  212. package/dist/op/source-archive.d.ts.map +1 -1
  213. package/dist/op/steward-beside.d.ts.map +1 -1
  214. package/dist/op/steward-points.d.ts.map +1 -1
  215. package/dist/op/steward.d.ts.map +1 -1
  216. package/dist/op/types.d.ts +16 -3
  217. package/dist/op/types.d.ts.map +1 -1
  218. package/dist/op/work-lease-run.d.ts +24 -4
  219. package/dist/op/work-lease-run.d.ts.map +1 -1
  220. package/dist/plan-summary.d.ts +207 -0
  221. package/dist/plan-summary.d.ts.map +1 -0
  222. package/dist/pr-forge.d.ts +105 -0
  223. package/dist/pr-forge.d.ts.map +1 -0
  224. package/dist/pr-loop.d.ts +178 -0
  225. package/dist/pr-loop.d.ts.map +1 -0
  226. package/dist/project-root.d.ts.map +1 -1
  227. package/dist/provenance.d.ts +21 -0
  228. package/dist/provenance.d.ts.map +1 -1
  229. package/dist/pseudo-parameter.d.ts.map +1 -1
  230. package/dist/reconcile.d.ts.map +1 -1
  231. package/dist/secret-materialization.d.ts.map +1 -1
  232. package/dist/telemetry-attribution.d.ts +31 -0
  233. package/dist/telemetry-attribution.d.ts.map +1 -1
  234. package/dist/terraform/emit-source.d.ts.map +1 -1
  235. package/dist/terraform/hcl2json.d.ts +45 -0
  236. package/dist/terraform/hcl2json.d.ts.map +1 -0
  237. package/dist/terraform/parse.d.ts +4 -40
  238. package/dist/terraform/parse.d.ts.map +1 -1
  239. package/dist/testing.d.ts.map +1 -1
  240. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  241. package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
  242. package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
  243. package/dist/workspace/agent-cli.d.ts +5 -0
  244. package/dist/workspace/agent-cli.d.ts.map +1 -1
  245. package/dist/workspace/box-cli.d.ts +12 -0
  246. package/dist/workspace/box-cli.d.ts.map +1 -0
  247. package/dist/workspace/box-factory.d.ts +97 -0
  248. package/dist/workspace/box-factory.d.ts.map +1 -0
  249. package/dist/workspace/box-listing.d.ts +85 -0
  250. package/dist/workspace/box-listing.d.ts.map +1 -0
  251. package/dist/workspace/box-publish.d.ts +147 -0
  252. package/dist/workspace/box-publish.d.ts.map +1 -0
  253. package/dist/workspace/broker-protocol.d.ts +190 -0
  254. package/dist/workspace/broker-protocol.d.ts.map +1 -0
  255. package/dist/workspace/changes.d.ts.map +1 -1
  256. package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
  257. package/dist/workspace/checks/boxes.d.ts.map +1 -1
  258. package/dist/workspace/checks.d.ts +5 -0
  259. package/dist/workspace/checks.d.ts.map +1 -1
  260. package/dist/workspace/compose-graph.d.ts +10 -0
  261. package/dist/workspace/compose-graph.d.ts.map +1 -1
  262. package/dist/workspace/composites.d.ts +2 -2
  263. package/dist/workspace/composites.d.ts.map +1 -1
  264. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
  265. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
  266. package/dist/workspace/conformance/broker.d.ts +202 -0
  267. package/dist/workspace/conformance/broker.d.ts.map +1 -0
  268. package/dist/workspace/conformance/index.d.ts +68 -6
  269. package/dist/workspace/conformance/index.d.ts.map +1 -1
  270. package/dist/workspace/conformance/vitest.d.ts +19 -3
  271. package/dist/workspace/conformance/vitest.d.ts.map +1 -1
  272. package/dist/workspace/conformance/writer.d.ts +462 -0
  273. package/dist/workspace/conformance/writer.d.ts.map +1 -0
  274. package/dist/workspace/decide.d.ts +126 -12
  275. package/dist/workspace/decide.d.ts.map +1 -1
  276. package/dist/workspace/decision-points.schema.json +11 -4
  277. package/dist/workspace/declaration.d.ts +156 -4
  278. package/dist/workspace/declaration.d.ts.map +1 -1
  279. package/dist/workspace/declaration.schema.json +383 -5
  280. package/dist/workspace/environments.d.ts +36 -10
  281. package/dist/workspace/environments.d.ts.map +1 -1
  282. package/dist/workspace/factory-rules.d.ts +180 -0
  283. package/dist/workspace/factory-rules.d.ts.map +1 -0
  284. package/dist/workspace/generated-files.d.ts.map +1 -1
  285. package/dist/workspace/graph-cache.d.ts.map +1 -1
  286. package/dist/workspace/graph-cli.d.ts +2 -0
  287. package/dist/workspace/graph-cli.d.ts.map +1 -1
  288. package/dist/workspace/identity.d.ts +111 -0
  289. package/dist/workspace/identity.d.ts.map +1 -0
  290. package/dist/workspace/init.d.ts +21 -0
  291. package/dist/workspace/init.d.ts.map +1 -1
  292. package/dist/workspace/intent-cli.d.ts +7 -4
  293. package/dist/workspace/intent-cli.d.ts.map +1 -1
  294. package/dist/workspace/intent-record.d.ts +36 -2
  295. package/dist/workspace/intent-record.d.ts.map +1 -1
  296. package/dist/workspace/intent.d.ts +249 -8
  297. package/dist/workspace/intent.d.ts.map +1 -1
  298. package/dist/workspace/json-edit.d.ts +24 -0
  299. package/dist/workspace/json-edit.d.ts.map +1 -0
  300. package/dist/workspace/jsonc.d.ts +11 -0
  301. package/dist/workspace/jsonc.d.ts.map +1 -1
  302. package/dist/workspace/kinds.d.ts +66 -4
  303. package/dist/workspace/kinds.d.ts.map +1 -1
  304. package/dist/workspace/lexicon-symbols.d.ts +29 -0
  305. package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
  306. package/dist/workspace/lineage-hash-index.d.ts.map +1 -1
  307. package/dist/workspace/lineage-lock.d.ts +2 -2
  308. package/dist/workspace/lineage-lock.d.ts.map +1 -1
  309. package/dist/workspace/lineage-upgrade.d.ts +31 -2
  310. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  311. package/dist/workspace/links.d.ts.map +1 -1
  312. package/dist/workspace/point-answer.schema.json +42 -2
  313. package/dist/workspace/points-cli.d.ts +10 -3
  314. package/dist/workspace/points-cli.d.ts.map +1 -1
  315. package/dist/workspace/points.d.ts +66 -5
  316. package/dist/workspace/points.d.ts.map +1 -1
  317. package/dist/workspace/principal-classes.d.ts +114 -0
  318. package/dist/workspace/principal-classes.d.ts.map +1 -0
  319. package/dist/workspace/reason-codes.d.ts +53 -4
  320. package/dist/workspace/reason-codes.d.ts.map +1 -1
  321. package/dist/workspace/record-assets.d.ts.map +1 -1
  322. package/dist/workspace/record-sessions.d.ts +5 -7
  323. package/dist/workspace/record-sessions.d.ts.map +1 -1
  324. package/dist/workspace/records-checkout.d.ts +54 -0
  325. package/dist/workspace/records-checkout.d.ts.map +1 -0
  326. package/dist/workspace/records-cli.d.ts +34 -1
  327. package/dist/workspace/records-cli.d.ts.map +1 -1
  328. package/dist/workspace/records-close.d.ts +7 -3
  329. package/dist/workspace/records-close.d.ts.map +1 -1
  330. package/dist/workspace/records-since.d.ts.map +1 -1
  331. package/dist/workspace/records-write.d.ts +68 -7
  332. package/dist/workspace/records-write.d.ts.map +1 -1
  333. package/dist/workspace/records.d.ts +43 -9
  334. package/dist/workspace/records.d.ts.map +1 -1
  335. package/dist/workspace/runs-cli.d.ts +296 -0
  336. package/dist/workspace/runs-cli.d.ts.map +1 -0
  337. package/dist/workspace/runs.d.ts +544 -0
  338. package/dist/workspace/runs.d.ts.map +1 -0
  339. package/dist/workspace/session-kinds.d.ts +1 -1
  340. package/dist/workspace/session-kinds.d.ts.map +1 -1
  341. package/dist/workspace/source-block.d.ts +1 -1
  342. package/dist/workspace/source-block.d.ts.map +1 -1
  343. package/dist/workspace/squash.d.ts +80 -0
  344. package/dist/workspace/squash.d.ts.map +1 -0
  345. package/dist/workspace/status-gates.d.ts +17 -3
  346. package/dist/workspace/status-gates.d.ts.map +1 -1
  347. package/dist/workspace/status.d.ts +64 -0
  348. package/dist/workspace/status.d.ts.map +1 -1
  349. package/dist/workspace/symbols.d.ts +63 -0
  350. package/dist/workspace/symbols.d.ts.map +1 -0
  351. package/dist/workspace/trailer-joins.d.ts +46 -0
  352. package/dist/workspace/trailer-joins.d.ts.map +1 -0
  353. package/dist/workspace/trailers.d.ts +89 -0
  354. package/dist/workspace/trailers.d.ts.map +1 -0
  355. package/dist/workspace/trust/attestor.d.ts.map +1 -1
  356. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  357. package/dist/workspace/trust/run-commits.d.ts +46 -0
  358. package/dist/workspace/trust/run-commits.d.ts.map +1 -0
  359. package/dist/workspace/trust/run-statement.d.ts +128 -0
  360. package/dist/workspace/trust/run-statement.d.ts.map +1 -0
  361. package/dist/workspace/trust/seal.d.ts +38 -0
  362. package/dist/workspace/trust/seal.d.ts.map +1 -1
  363. package/dist/workspace/trust/test-repo.d.ts.map +1 -1
  364. package/dist/workspace/trust/verify-cli.d.ts +1 -1
  365. package/dist/workspace/trust/verify.d.ts +16 -2
  366. package/dist/workspace/trust/verify.d.ts.map +1 -1
  367. package/dist/workspace/wip-cli.d.ts +21 -0
  368. package/dist/workspace/wip-cli.d.ts.map +1 -0
  369. package/dist/workspace/wip.d.ts +268 -0
  370. package/dist/workspace/wip.d.ts.map +1 -0
  371. package/dist/workspace/work-cli.d.ts +39 -3
  372. package/dist/workspace/work-cli.d.ts.map +1 -1
  373. package/dist/workspace/work-evidence.d.ts +1 -1
  374. package/dist/workspace/work-evidence.d.ts.map +1 -1
  375. package/dist/workspace/work-size.d.ts +55 -0
  376. package/dist/workspace/work-size.d.ts.map +1 -0
  377. package/dist/workspace/work.d.ts +26 -1
  378. package/dist/workspace/work.d.ts.map +1 -1
  379. package/dist/workspace/workspace-kinds.schema.json +122 -0
  380. package/dist/workspace/workspace-principals.schema.json +60 -0
  381. package/dist/workspace/write-lock-cli.d.ts +60 -0
  382. package/dist/workspace/write-lock-cli.d.ts.map +1 -0
  383. package/dist/workspace/write-lock.d.ts +152 -0
  384. package/dist/workspace/write-lock.d.ts.map +1 -0
  385. package/dist/workspace/write-scope.d.ts +83 -19
  386. package/dist/workspace/write-scope.d.ts.map +1 -1
  387. package/dist/yaml.d.ts +21 -39
  388. package/dist/yaml.d.ts.map +1 -1
  389. package/package.json +7 -2
  390. package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
  391. package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
  392. package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
  393. package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
  394. package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
  395. package/src/__fixtures__/change-set/warden.plan.json +44 -0
  396. package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
  397. package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
  398. package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
  399. package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
  400. package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
  401. package/src/audit/core.test.ts +15 -0
  402. package/src/audit/core.ts +8 -2
  403. package/src/audit/discover.test.ts +11 -0
  404. package/src/audit/discover.ts +7 -2
  405. package/src/audit/prior-art.ts +15 -0
  406. package/src/change-set-bundle.test.ts +57 -0
  407. package/src/change-set.test.ts +215 -0
  408. package/src/change-set.ts +445 -0
  409. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
  410. package/src/cli/commands/audit-opt-in.test.ts +54 -0
  411. package/src/cli/commands/audit.ts +29 -2
  412. package/src/cli/commands/build.test.ts +19 -0
  413. package/src/cli/commands/build.ts +3 -2
  414. package/src/cli/commands/carve-emit-state.test.ts +4 -0
  415. package/src/cli/commands/carve-emit.ts +5 -19
  416. package/src/cli/commands/check-lexicon.test.ts +62 -1
  417. package/src/cli/commands/check-lexicon.ts +36 -6
  418. package/src/cli/commands/import-live.test.ts +18 -0
  419. package/src/cli/commands/import-parser-options.test.ts +133 -0
  420. package/src/cli/commands/import.ts +21 -3
  421. package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
  422. package/src/cli/commands/init.test.ts +8 -1
  423. package/src/cli/commands/init.ts +23 -8
  424. package/src/cli/commands/lint.test.ts +37 -0
  425. package/src/cli/commands/onboard.test.ts +53 -3
  426. package/src/cli/commands/onboard.ts +52 -4
  427. package/src/cli/commands/pinned-upgrade.ts +73 -33
  428. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
  429. package/src/cli/handlers/build.ts +13 -1
  430. package/src/cli/handlers/change-set.test.ts +56 -0
  431. package/src/cli/handlers/change-set.ts +44 -0
  432. package/src/cli/handlers/components.ts +2 -2
  433. package/src/cli/handlers/dev.ts +8 -6
  434. package/src/cli/handlers/fan-out.test.ts +221 -2
  435. package/src/cli/handlers/fan-out.ts +165 -75
  436. package/src/cli/handlers/graph.ts +3 -0
  437. package/src/cli/handlers/lifecycle.test.ts +67 -0
  438. package/src/cli/handlers/lifecycle.ts +6 -5
  439. package/src/cli/handlers/misc.ts +2 -0
  440. package/src/cli/handlers/operator.test.ts +21 -0
  441. package/src/cli/handlers/operator.ts +121 -6
  442. package/src/cli/handlers/pr.ts +373 -0
  443. package/src/cli/handlers/run.test.ts +111 -0
  444. package/src/cli/handlers/run.ts +86 -24
  445. package/src/cli/handlers/scenario.ts +2 -2
  446. package/src/cli/main.test.ts +21 -0
  447. package/src/cli/main.ts +246 -30
  448. package/src/cli/mcp/never-over-mcp.test.ts +101 -0
  449. package/src/cli/mcp/op-tools.ts +24 -2
  450. package/src/cli/mcp/workspace-tools.test.ts +5 -2
  451. package/src/cli/mcp/workspace-tools.ts +62 -7
  452. package/src/cli/registry.ts +74 -3
  453. package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
  454. package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
  455. package/src/codegen/pinned-upgrade.test.ts +104 -0
  456. package/src/codegen/pinned-upgrade.ts +250 -56
  457. package/src/codegen/testdata/postgres-tags.json +242 -0
  458. package/src/components/auto-release.ts +1 -1
  459. package/src/components/capability.ts +55 -0
  460. package/src/components/changed-files.ts +66 -0
  461. package/src/components/cli-support.ts +28 -5
  462. package/src/components/component.schema.json +17 -0
  463. package/src/components/component.ts +25 -0
  464. package/src/components/deploy-units.ts +3 -0
  465. package/src/components/driver.test.ts +52 -0
  466. package/src/components/driver.ts +31 -13
  467. package/src/components/fan-out-output.ts +42 -1
  468. package/src/components/fan-out-record.ts +69 -0
  469. package/src/components/fan-out-run.test.ts +17 -0
  470. package/src/components/fan-out-run.ts +304 -1
  471. package/src/components/fan-out-support.ts +3 -0
  472. package/src/components/fan-out-waves.test.ts +375 -0
  473. package/src/components/fan-out.ts +18 -17
  474. package/src/components/gated-wave-pipeline.ts +82 -0
  475. package/src/components/index.ts +1 -0
  476. package/src/components/layers.ts +30 -0
  477. package/src/components/pr-pipeline.ts +91 -0
  478. package/src/components/pr-run.test.ts +205 -0
  479. package/src/components/pr-run.ts +280 -0
  480. package/src/components/promote.ts +5 -0
  481. package/src/components/verbs/shell.test.ts +11 -0
  482. package/src/components/verbs/shell.ts +7 -3
  483. package/src/components/wave-plan.ts +124 -0
  484. package/src/config.test.ts +21 -0
  485. package/src/config.ts +15 -0
  486. package/src/declarable.test.ts +21 -0
  487. package/src/declarable.ts +19 -0
  488. package/src/discovery/fold-composite.test.ts +41 -5
  489. package/src/discovery/fold-import.test.ts +129 -0
  490. package/src/discovery/fold-import.ts +643 -131
  491. package/src/discovery/fold-package-composite.test.ts +264 -0
  492. package/src/discovery/fold-specifiers.test.ts +191 -0
  493. package/src/discovery/param-deps.test.ts +66 -1
  494. package/src/discovery/param-deps.ts +45 -0
  495. package/src/discovery/sandbox/bundle.ts +1 -1
  496. package/src/discovery/specifier-resolve.ts +344 -0
  497. package/src/fold/fold.test.ts +39 -1
  498. package/src/fold/fold.ts +83 -9
  499. package/src/fold-provenance.test.ts +140 -0
  500. package/src/gated-waves-bundle.test.ts +62 -0
  501. package/src/gated-waves.test.ts +118 -0
  502. package/src/gated-waves.ts +240 -0
  503. package/src/graph-ir.test.ts +83 -0
  504. package/src/graph-ir.ts +29 -0
  505. package/src/import/embedded.test.ts +20 -0
  506. package/src/import/embedded.ts +13 -0
  507. package/src/import/parser-options.ts +46 -0
  508. package/src/import/parser.ts +20 -0
  509. package/src/index.ts +1 -0
  510. package/src/lexicon.ts +106 -3
  511. package/src/lifecycle/gate-ledger.ts +23 -0
  512. package/src/lifecycle/git.ts +102 -16
  513. package/src/lifecycle/observe.test.ts +18 -0
  514. package/src/lifecycle/observe.ts +6 -4
  515. package/src/lifecycle/snapshot.ts +2 -2
  516. package/src/lifecycle/work-lease.test.ts +1 -1
  517. package/src/lifecycle/work-lease.ts +93 -2
  518. package/src/lint/engine.test.ts +55 -0
  519. package/src/lint/engine.ts +30 -4
  520. package/src/lint/output-docs.test.ts +59 -56
  521. package/src/lint/post-synth.test.ts +19 -0
  522. package/src/lint/post-synth.ts +19 -1
  523. package/src/meta/declared-imports.test.ts +1 -1
  524. package/src/op/activities/activity-contracts.ts +84 -0
  525. package/src/op/activities/apply.test.ts +189 -5
  526. package/src/op/activities/apply.ts +230 -8
  527. package/src/op/activities/change-set.ts +114 -0
  528. package/src/op/activities/decide.ts +3 -0
  529. package/src/op/activities/factory.ts +675 -0
  530. package/src/op/activities/index.ts +9 -0
  531. package/src/op/activities/lexicon-upgrade.test.ts +160 -6
  532. package/src/op/activities/lexicon-upgrade.ts +154 -51
  533. package/src/op/activity-contract.test.ts +21 -1
  534. package/src/op/activity-contract.ts +19 -9
  535. package/src/op/builders.ts +23 -0
  536. package/src/op/composites/apply-op.ts +12 -5
  537. package/src/op/composites/composites.test.ts +30 -3
  538. package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
  539. package/src/op/composites/lexicon-upgrade-op.ts +29 -8
  540. package/src/op/decide-backend.ts +5 -1
  541. package/src/op/decide-read-inputs.ts +33 -5
  542. package/src/op/emulator-lifecycle.test.ts +23 -0
  543. package/src/op/emulator-lifecycle.ts +52 -14
  544. package/src/op/factory.e2e.test.ts +232 -0
  545. package/src/op/factory.ts +118 -0
  546. package/src/op/gate-approval.test.ts +74 -0
  547. package/src/op/gate-approval.ts +5 -1
  548. package/src/op/gate.ts +31 -5
  549. package/src/op/index.ts +11 -1
  550. package/src/op/local-executor.test.ts +15 -0
  551. package/src/op/local-executor.ts +40 -12
  552. package/src/op/local-output.ts +1 -1
  553. package/src/op/op-ir.test.ts +9 -0
  554. package/src/op/op-ir.ts +4 -0
  555. package/src/op/op-verb-class.ts +3 -0
  556. package/src/op/operator.ts +4 -0
  557. package/src/op/run-context.test.ts +141 -0
  558. package/src/op/run-context.ts +51 -0
  559. package/src/op/runtimes/local.test.ts +14 -0
  560. package/src/op/runtimes/local.ts +2 -0
  561. package/src/op/steward-beside.ts +2 -0
  562. package/src/op/types.ts +16 -3
  563. package/src/op/work-lease-run.test.ts +47 -0
  564. package/src/op/work-lease-run.ts +76 -11
  565. package/src/plan-summary.test.ts +263 -0
  566. package/src/plan-summary.ts +845 -0
  567. package/src/pr-forge.test.ts +237 -0
  568. package/src/pr-forge.ts +332 -0
  569. package/src/pr-loop-bundle.test.ts +46 -0
  570. package/src/pr-loop.test.ts +171 -0
  571. package/src/pr-loop.ts +324 -0
  572. package/src/provenance.ts +35 -0
  573. package/src/telemetry-attribution.test.ts +23 -1
  574. package/src/telemetry-attribution.ts +51 -0
  575. package/src/terraform/hcl2json.test.ts +21 -0
  576. package/src/terraform/hcl2json.ts +81 -0
  577. package/src/terraform/parse.ts +11 -74
  578. package/src/workspace/agent-cli.ts +7 -3
  579. package/src/workspace/agent.schema.json +22 -0
  580. package/src/workspace/app-kind.test.ts +196 -0
  581. package/src/workspace/box-cli.ts +113 -0
  582. package/src/workspace/box-factory.test.ts +323 -0
  583. package/src/workspace/box-factory.ts +136 -0
  584. package/src/workspace/box-listing-write.schema.json +204 -0
  585. package/src/workspace/box-listing.test.ts +234 -0
  586. package/src/workspace/box-listing.ts +324 -0
  587. package/src/workspace/box-publish.schema.json +498 -0
  588. package/src/workspace/box-publish.test.ts +204 -0
  589. package/src/workspace/box-publish.ts +420 -0
  590. package/src/workspace/box-ship.test.ts +96 -0
  591. package/src/workspace/broker-protocol.schema.json +186 -0
  592. package/src/workspace/broker-protocol.test.ts +122 -0
  593. package/src/workspace/broker-protocol.ts +317 -0
  594. package/src/workspace/builder-tiers.test.ts +146 -0
  595. package/src/workspace/change-set.schema.json +460 -0
  596. package/src/workspace/changes.schema.json +12 -20
  597. package/src/workspace/changes.ts +4 -1
  598. package/src/workspace/chant-migrations.e2e.test.ts +17 -5
  599. package/src/workspace/checks/boxes.test.ts +5 -0
  600. package/src/workspace/checks.ts +39 -8
  601. package/src/workspace/component-environments.test.ts +105 -0
  602. package/src/workspace/compose-graph.ts +7 -0
  603. package/src/workspace/composites.schema.json +23 -4
  604. package/src/workspace/composites.test.ts +8 -8
  605. package/src/workspace/composites.ts +13 -2
  606. package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
  607. package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
  608. package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  609. package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  610. package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  611. package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  612. package/src/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  613. package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  614. package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  615. package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  616. package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  617. package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  618. package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  619. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  620. package/src/workspace/conformance/broker.test.ts +122 -0
  621. package/src/workspace/conformance/broker.ts +792 -0
  622. package/src/workspace/conformance/conformance.e2e.test.ts +36 -3
  623. package/src/workspace/conformance/index.mjs +51 -3
  624. package/src/workspace/conformance/index.ts +107 -15
  625. package/src/workspace/conformance/vitest.ts +76 -2
  626. package/src/workspace/conformance/writer-conformance.e2e.test.ts +177 -0
  627. package/src/workspace/conformance/writer.test.ts +186 -0
  628. package/src/workspace/conformance/writer.ts +1191 -0
  629. package/src/workspace/decide.test.ts +208 -4
  630. package/src/workspace/decide.ts +433 -73
  631. package/src/workspace/decision-points.schema.json +11 -4
  632. package/src/workspace/declaration.schema.json +383 -5
  633. package/src/workspace/declaration.ts +315 -10
  634. package/src/workspace/environments.ts +66 -14
  635. package/src/workspace/factory-rules.test.ts +62 -0
  636. package/src/workspace/factory-rules.ts +218 -0
  637. package/src/workspace/graph-cli.ts +6 -3
  638. package/src/workspace/graph.schema.json +314 -0
  639. package/src/workspace/identity.test.ts +219 -0
  640. package/src/workspace/identity.ts +186 -0
  641. package/src/workspace/init.ts +82 -2
  642. package/src/workspace/intent-cli.ts +84 -13
  643. package/src/workspace/intent-patch-id.test.ts +162 -0
  644. package/src/workspace/intent-record.schema.json +336 -1
  645. package/src/workspace/intent-record.ts +96 -16
  646. package/src/workspace/intent-reviews.test.ts +76 -0
  647. package/src/workspace/intent-squash.test.ts +213 -0
  648. package/src/workspace/intent-why.test.ts +274 -0
  649. package/src/workspace/intent.schema.json +950 -9
  650. package/src/workspace/intent.test.ts +11 -2
  651. package/src/workspace/intent.ts +722 -65
  652. package/src/workspace/json-edit.test.ts +121 -0
  653. package/src/workspace/json-edit.ts +142 -0
  654. package/src/workspace/jsonc.ts +20 -0
  655. package/src/workspace/kinds.ts +201 -39
  656. package/src/workspace/lexicon-symbols.test.ts +148 -0
  657. package/src/workspace/lexicon-symbols.ts +125 -0
  658. package/src/workspace/lineage-upgrade.test.ts +63 -0
  659. package/src/workspace/lineage-upgrade.ts +146 -5
  660. package/src/workspace/plan-summary.schema.json +155 -0
  661. package/src/workspace/point-answer.schema.json +42 -2
  662. package/src/workspace/points-cli.ts +42 -16
  663. package/src/workspace/points-write.schema.json +163 -4
  664. package/src/workspace/points.schema.json +157 -2
  665. package/src/workspace/points.test.ts +13 -1
  666. package/src/workspace/points.ts +118 -12
  667. package/src/workspace/pr-report.schema.json +95 -0
  668. package/src/workspace/principal-classes.test.ts +175 -0
  669. package/src/workspace/principal-classes.ts +307 -0
  670. package/src/workspace/profiles.test.ts +159 -0
  671. package/src/workspace/read-contract.test.ts +2 -2
  672. package/src/workspace/reason-codes.test.ts +23 -3
  673. package/src/workspace/reason-codes.ts +61 -4
  674. package/src/workspace/record-sessions.ts +9 -8
  675. package/src/workspace/records-amend.schema.json +80 -0
  676. package/src/workspace/records-checkout.ts +106 -0
  677. package/src/workspace/records-cli.ts +123 -17
  678. package/src/workspace/records-close.schema.json +79 -0
  679. package/src/workspace/records-close.ts +31 -7
  680. package/src/workspace/records-concurrent.e2e.test.ts +135 -0
  681. package/src/workspace/records-concurrent.test.ts +145 -0
  682. package/src/workspace/records-formats.test.ts +46 -10
  683. package/src/workspace/records-new.schema.json +9 -0
  684. package/src/workspace/records-review.schema.json +80 -0
  685. package/src/workspace/records-sessions-write.test.ts +69 -0
  686. package/src/workspace/records-sessions.test.ts +22 -0
  687. package/src/workspace/records-uncommitted.test.ts +171 -0
  688. package/src/workspace/records-write.ts +219 -30
  689. package/src/workspace/records.schema.json +88 -1
  690. package/src/workspace/records.ts +76 -8
  691. package/src/workspace/reference-kinds/app/package.json +10 -0
  692. package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  693. package/src/workspace/run-statement.schema.json +622 -0
  694. package/src/workspace/runs-cli.ts +710 -0
  695. package/src/workspace/runs-statement.test.ts +239 -0
  696. package/src/workspace/runs-write.schema.json +994 -0
  697. package/src/workspace/runs.schema.json +1257 -0
  698. package/src/workspace/runs.test.ts +281 -0
  699. package/src/workspace/runs.ts +970 -0
  700. package/src/workspace/session-kinds.ts +3 -3
  701. package/src/workspace/squash.ts +198 -0
  702. package/src/workspace/status-contract.test.ts +10 -2
  703. package/src/workspace/status-gates.ts +25 -9
  704. package/src/workspace/status.schema.json +252 -4
  705. package/src/workspace/status.ts +110 -1
  706. package/src/workspace/symbols.ts +191 -0
  707. package/src/workspace/trailer-joins.test.ts +171 -0
  708. package/src/workspace/trailer-joins.ts +82 -0
  709. package/src/workspace/trailers.ts +148 -0
  710. package/src/workspace/trust/run-commits.ts +115 -0
  711. package/src/workspace/trust/run-statement.ts +226 -0
  712. package/src/workspace/trust/seal.ts +58 -1
  713. package/src/workspace/trust/verify-cli.ts +6 -5
  714. package/src/workspace/trust/verify.ts +39 -6
  715. package/src/workspace/wip-cli.ts +97 -0
  716. package/src/workspace/wip-write.schema.json +504 -0
  717. package/src/workspace/wip.schema.json +334 -0
  718. package/src/workspace/wip.test.ts +294 -0
  719. package/src/workspace/wip.ts +753 -0
  720. package/src/workspace/work-cli.e2e.test.ts +28 -1
  721. package/src/workspace/work-cli.ts +136 -8
  722. package/src/workspace/work-evidence.schema.json +5 -0
  723. package/src/workspace/work-history.schema.json +73 -1
  724. package/src/workspace/work-history.test.ts +48 -5
  725. package/src/workspace/work-kind-fields.test.ts +154 -0
  726. package/src/workspace/work-lease.schema.json +14 -1
  727. package/src/workspace/work-size.test.ts +77 -0
  728. package/src/workspace/work-size.ts +93 -0
  729. package/src/workspace/work.ts +82 -0
  730. package/src/workspace/workspace-kinds.schema.json +122 -0
  731. package/src/workspace/workspace-principals.schema.json +60 -0
  732. package/src/workspace/write-lock-cli.ts +131 -0
  733. package/src/workspace/write-lock.schema.json +172 -0
  734. package/src/workspace/write-lock.test.ts +189 -0
  735. package/src/workspace/write-lock.ts +474 -0
  736. package/src/workspace/write-scope.test.ts +144 -3
  737. package/src/workspace/write-scope.ts +192 -45
  738. package/src/yaml.test.ts +111 -1
  739. package/src/yaml.ts +141 -549
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The optional HCL parser, loaded lazily. Kept apart from `parse.ts` so a
3
+ * caller that only needs the loader (the terraform lexicon's HCL reader) does
4
+ * not pull in the dependency graph, the state reader and the carve tables.
5
+ *
6
+ * `@cdktn/hcl2json` is NOT a chant dependency: it carries a ~1.8 MB wasm blob
7
+ * and only HCL users need it. If it is absent the loader fails with a
8
+ * one-line install hint.
9
+ */
10
+
11
+ import { appendFileSync } from "fs";
12
+ import type { Hcl2JsonTree } from "./types";
13
+
14
+ /** Minimal shape of the parser exports we depend on. */
15
+ export interface Hcl2Json {
16
+ parse: (filename: string, hcl: string) => Promise<Hcl2JsonTree>;
17
+ /** Expression-AST reference extraction (#998) — one traversal accessor per reference. */
18
+ getReferencesInExpression: (filename: string, expression: string) => Promise<Array<{ value: string }>>;
19
+ }
20
+
21
+ export class Hcl2JsonNotInstalled extends Error {
22
+ constructor(cause: unknown) {
23
+ super(
24
+ "Terraform carve-out needs the HCL parser, which is not installed.\n" +
25
+ " Install it once: npm install -D @cdktn/hcl2json\n" +
26
+ `(underlying error: ${cause instanceof Error ? cause.message : String(cause)})`,
27
+ );
28
+ this.name = "Hcl2JsonNotInstalled";
29
+ }
30
+ }
31
+
32
+ /**
33
+ * The environment variable that turns on parser-input recording (chant #2483).
34
+ *
35
+ * When set to a file path, every `parse(filename, source)` and every
36
+ * `getReferencesInExpression(filename, expression)` this process makes is
37
+ * appended to that file as one JSON line before the real call runs. That is
38
+ * how `scripts/check-hcl-parser-parity.ts` gets hold of the inline HCL the
39
+ * test suite parses, which no corpus walk on disk would find: run the suite
40
+ * with this set, then replay the file through two parsers and compare. Off
41
+ * unless set, and never changes a result.
42
+ */
43
+ export const HCL2JSON_RECORD_ENV = "CHANT_HCL2JSON_RECORD";
44
+
45
+ /** One recorded parser input, as {@link HCL2JSON_RECORD_ENV} writes it. */
46
+ export interface Hcl2JsonRecordLine {
47
+ kind: "parse" | "refs";
48
+ filename: string;
49
+ text: string;
50
+ }
51
+
52
+ function recording(parser: Hcl2Json, path: string): Hcl2Json {
53
+ const note = (line: Hcl2JsonRecordLine): void => {
54
+ appendFileSync(path, `${JSON.stringify(line)}\n`);
55
+ };
56
+ return {
57
+ parse: (filename, hcl) => {
58
+ note({ kind: "parse", filename, text: hcl });
59
+ return parser.parse(filename, hcl);
60
+ },
61
+ getReferencesInExpression: (filename, expression) => {
62
+ note({ kind: "refs", filename, text: expression });
63
+ return parser.getReferencesInExpression(filename, expression);
64
+ },
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Lazy-load the optional HCL parser. Throws `Hcl2JsonNotInstalled` with an
70
+ * install hint when the package is missing, rather than a raw MODULE_NOT_FOUND.
71
+ */
72
+ export async function loadHcl2json(): Promise<Hcl2Json> {
73
+ let parser: Hcl2Json;
74
+ try {
75
+ parser = (await import("@cdktn/hcl2json")) as Hcl2Json;
76
+ } catch (err) {
77
+ throw new Hcl2JsonNotInstalled(err);
78
+ }
79
+ const record = process.env[HCL2JSON_RECORD_ENV];
80
+ return record ? recording(parser, record) : parser;
81
+ }
@@ -1,87 +1,24 @@
1
1
  /**
2
2
  * Thin wasm glue for the carve-out advisor (#214 T1): read a Terraform estate's
3
3
  * `.tf` files, run them through `@cdktn/hcl2json`, merge into one tree, and hand
4
- * off to the pure `buildGraph`.
5
- *
6
- * `@cdktn/hcl2json` is NOT a chant dependency — it carries a ~1.8 MB wasm blob
7
- * and only carve-out users need it. It is lazy-loaded here and, if absent, the
8
- * advisor fails with a one-line install hint.
4
+ * off to the pure `buildGraph`. The parser loader lives in `./hcl2json`, which
5
+ * this module re-exports.
9
6
  */
10
7
 
11
- import { appendFileSync, readdirSync, readFileSync } from "fs";
8
+ import { readdirSync, readFileSync } from "fs";
12
9
  import { join } from "path";
13
10
  import { buildGraph, collectExpressions, type ExpressionRefs } from "./graph";
14
11
  import { readStateInstanceCounts, applyStateCounts } from "./state";
12
+ import { loadHcl2json, type Hcl2Json } from "./hcl2json";
15
13
  import type { Hcl2JsonTree, TfGraph } from "./types";
16
14
 
17
- /** Minimal shape of the parser exports we depend on. */
18
- export interface Hcl2Json {
19
- parse: (filename: string, hcl: string) => Promise<Hcl2JsonTree>;
20
- /** Expression-AST reference extraction (#998) — one traversal accessor per reference. */
21
- getReferencesInExpression: (filename: string, expression: string) => Promise<Array<{ value: string }>>;
22
- }
23
-
24
- export class Hcl2JsonNotInstalled extends Error {
25
- constructor(cause: unknown) {
26
- super(
27
- "Terraform carve-out needs the HCL parser, which is not installed.\n" +
28
- " Install it once: npm install -D @cdktn/hcl2json\n" +
29
- `(underlying error: ${cause instanceof Error ? cause.message : String(cause)})`,
30
- );
31
- this.name = "Hcl2JsonNotInstalled";
32
- }
33
- }
34
-
35
- /**
36
- * The environment variable that turns on parser-input recording (chant #2483).
37
- *
38
- * When set to a file path, every `parse(filename, source)` and every
39
- * `getReferencesInExpression(filename, expression)` this process makes is
40
- * appended to that file as one JSON line before the real call runs. That is
41
- * how `scripts/check-hcl-parser-parity.ts` gets hold of the inline HCL the
42
- * test suite parses, which no corpus walk on disk would find: run the suite
43
- * with this set, then replay the file through two parsers and compare. Off
44
- * unless set, and never changes a result.
45
- */
46
- export const HCL2JSON_RECORD_ENV = "CHANT_HCL2JSON_RECORD";
47
-
48
- /** One recorded parser input, as {@link HCL2JSON_RECORD_ENV} writes it. */
49
- export interface Hcl2JsonRecordLine {
50
- kind: "parse" | "refs";
51
- filename: string;
52
- text: string;
53
- }
54
-
55
- function recording(parser: Hcl2Json, path: string): Hcl2Json {
56
- const note = (line: Hcl2JsonRecordLine): void => {
57
- appendFileSync(path, `${JSON.stringify(line)}\n`);
58
- };
59
- return {
60
- parse: (filename, hcl) => {
61
- note({ kind: "parse", filename, text: hcl });
62
- return parser.parse(filename, hcl);
63
- },
64
- getReferencesInExpression: (filename, expression) => {
65
- note({ kind: "refs", filename, text: expression });
66
- return parser.getReferencesInExpression(filename, expression);
67
- },
68
- };
69
- }
70
-
71
- /**
72
- * Lazy-load the optional HCL parser. Throws `Hcl2JsonNotInstalled` with an
73
- * install hint when the package is missing, rather than a raw MODULE_NOT_FOUND.
74
- */
75
- export async function loadHcl2json(): Promise<Hcl2Json> {
76
- let parser: Hcl2Json;
77
- try {
78
- parser = (await import("@cdktn/hcl2json")) as Hcl2Json;
79
- } catch (err) {
80
- throw new Hcl2JsonNotInstalled(err);
81
- }
82
- const record = process.env[HCL2JSON_RECORD_ENV];
83
- return record ? recording(parser, record) : parser;
84
- }
15
+ export {
16
+ loadHcl2json,
17
+ Hcl2JsonNotInstalled,
18
+ HCL2JSON_RECORD_ENV,
19
+ type Hcl2Json,
20
+ type Hcl2JsonRecordLine,
21
+ } from "./hcl2json";
85
22
 
86
23
  /**
87
24
  * Resolve every interpolated string in the merged tree through the parser's
@@ -60,6 +60,8 @@ export type AgentDocument =
60
60
  members: string[];
61
61
  /** Every declared kind in reach: the workspace's own and the member's. */
62
62
  records: AgentKindScope[];
63
+ /** The paths writeScope.agent.protected keeps the session from writing, with the JSON keys each still allows (#3146). */
64
+ protected: { path: string; except: string[] }[];
63
65
  };
64
66
  /** The spec, as records --current --json prints it. */
65
67
  spec: SpecView;
@@ -77,10 +79,11 @@ export async function agentSession(q: { cwd: string; name: string }): Promise<Ag
77
79
  throw new WorkspaceReadError("declaration-missing", "no chant.workspace.json or .jsonc between this directory and the git root, so no agent session is declared");
78
80
  }
79
81
  const decl = source.declaration;
80
- const writer = resolveWriter(decl, source.policy, { agent: q.name });
82
+ const writer = resolveWriter(decl, source.policy, { agent: q.name }, source.classes);
81
83
  const agent = writer.agent!;
82
84
  const member = decl.members.find((m) => m.name === agent.member)!;
83
- const rules = scopeOf(decl, writer)!.records;
85
+ const scope = scopeOf(decl, writer)!;
86
+ const rules = scope.records;
84
87
  // The spec query, over every declared kind in the working tree.
85
88
  const set = await queryDeclaredRecords(declaredKindFiles(q.cwd), { cwd: q.cwd, current: true });
86
89
  const loadedName = new Map(set.kinds.map((k) => [k.declared.path, "error" in k ? null : k.kind.name]));
@@ -94,7 +97,7 @@ export async function agentSession(q: { cwd: string; name: string }): Promise<Ag
94
97
  ...head,
95
98
  workspace: { name: decl.name, root: source.root ?? ".", scopeFrom: source.from },
96
99
  agent: { name: agent.name, member: { name: member.name, dir: member.dir, kind: member.kind }, principals: agent.principals },
97
- scope: { members: [member.name], records },
100
+ scope: { members: [member.name], records, protected: scope.protected.map((p) => ({ path: p.path, except: [...p.except] })) },
98
101
  spec: set.spec ?? { kinds: [], records: [] },
99
102
  reload: [`chant workspace agent ${agent.name} --json`, "chant workspace records --current --json"],
100
103
  };
@@ -126,6 +129,7 @@ export async function runWorkspaceAgent(ctx: CommandContext): Promise<number> {
126
129
  const out: string[] = [];
127
130
  out.push(`agent ${doc.agent.name}, bound to member ${doc.agent.member.name} (${doc.agent.member.dir}), scope read from ${doc.workspace.scopeFrom}`);
128
131
  for (const r of doc.scope.records) out.push(`records ${r.name ?? r.kind ?? r.path} (${r.path}): ${r.verbs.length > 0 ? r.verbs.join(", ") : "not writable"}`);
132
+ for (const p of doc.scope.protected) out.push(`protected ${p.path}${p.except.length > 0 ? ` (except ${p.except.join(", ")})` : ""}`);
129
133
  out.push(`spec ${doc.spec.records.length} current records of ${doc.spec.kinds.length} spec kinds`);
130
134
  for (const r of doc.spec.records) out.push(` ${r.kind}/${r.id ?? "?"} ${r.state ?? ""} ${r.path}`);
131
135
  out.push(`reload ${doc.reload.join("; ")}`);
@@ -165,6 +165,28 @@
165
165
  }
166
166
  }
167
167
  }
168
+ },
169
+ "protected": {
170
+ "type": "array",
171
+ "description": "Added in contract 1 by #3146. The paths writeScope.agent.protected keeps the session from writing even inside its member, each a glob from the workspace root that also covers everything under a directory it matches, with the top-level keys of a JSON file a write may still change in except. Empty when none is listed. check --changes reports a write to one with write-scope-protected.",
172
+ "items": {
173
+ "type": "object",
174
+ "required": [
175
+ "path",
176
+ "except"
177
+ ],
178
+ "properties": {
179
+ "path": {
180
+ "type": "string"
181
+ },
182
+ "except": {
183
+ "type": "array",
184
+ "items": {
185
+ "type": "string"
186
+ }
187
+ }
188
+ }
189
+ }
168
190
  }
169
191
  }
170
192
  },
@@ -0,0 +1,196 @@
1
+ /**
2
+ * The app member kind and member fields (#3151, ws-093): a data-only kinds
3
+ * file that declares the fields its members set, a probe that reads a key of
4
+ * a JSON file, WSP005 on a field the kind doesn't declare, and status --json
5
+ * printing every field with its defaults.
6
+ */
7
+ import { execFileSync } from "node:child_process";
8
+ import { cpSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
9
+ import { tmpdir } from "node:os";
10
+ import { dirname, join } from "node:path";
11
+ import { fileURLToPath } from "node:url";
12
+ import { afterAll, describe, expect, test } from "vitest";
13
+ import { runDeclarationChecks } from "./checks";
14
+ import { createKindRegistry, parseKindData, probeKind, readPackageKinds, resolveKind, resolveMemberFields, type MemberKind } from "./kinds";
15
+ import { workspaceStatus } from "./status";
16
+ import { workingTree } from "./tree";
17
+
18
+ const here = dirname(fileURLToPath(import.meta.url));
19
+ const canonical = join(here, "reference-kinds", "app");
20
+ const reference = join(here, "..", "..", "..", "..", "reference-workspace");
21
+
22
+ const scratch: string[] = [];
23
+ afterAll(() => {
24
+ for (const d of scratch) rmSync(d, { recursive: true, force: true });
25
+ });
26
+ function repo(files: Record<string, string>): string {
27
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "chant-3151-")));
28
+ scratch.push(root);
29
+ execFileSync("git", ["init", "-q"], { cwd: root });
30
+ for (const [path, text] of Object.entries(files)) {
31
+ mkdirSync(dirname(join(root, path)), { recursive: true });
32
+ writeFileSync(join(root, path), text);
33
+ }
34
+ return root;
35
+ }
36
+
37
+ /** A workspace that pins a copy of the app kind at kinds/app. */
38
+ function appWorkspace(members: unknown[], files: Record<string, string> = {}): string {
39
+ const root = repo({ "chant.workspace.json": JSON.stringify({ name: "acme", schema: 1, members, pins: [{ path: "kinds/app" }] }, null, 2), ...files });
40
+ cpSync(canonical, join(root, "kinds", "app"), { recursive: true });
41
+ return root;
42
+ }
43
+
44
+ const app = (): MemberKind => {
45
+ const read = readPackageKinds(canonical, "kinds/app");
46
+ expect(read.problems).toEqual([]);
47
+ return read.kinds[0];
48
+ };
49
+
50
+ const pkg = (scripts: Record<string, string>) => JSON.stringify({ name: "web", scripts });
51
+
52
+ describe("the app kind's file", () => {
53
+ test("is valid kind data: one kind, app, with the outputs and fields a delivery member and an orchestrator read", () => {
54
+ const k = app();
55
+ expect(k.name).toBe("app");
56
+ expect(k.outputs).toEqual({ from: "declared", names: ["source", "url"] });
57
+ expect(Object.keys(k.fields ?? {})).toEqual(["scripts", "env", "health"]);
58
+ });
59
+
60
+ test("the reference workspace pins a byte-for-byte copy of it", () => {
61
+ const files = readdirSync(canonical).sort();
62
+ expect(readdirSync(join(reference, "kinds", "app")).sort()).toEqual(files);
63
+ for (const f of files) expect(readFileSync(join(reference, "kinds", "app", f), "utf-8")).toBe(readFileSync(join(canonical, f), "utf-8"));
64
+ });
65
+
66
+ test("its probe claims a Node package with a start script and nothing else, and a chant project outranks it", () => {
67
+ const tree = workingTree(
68
+ repo({
69
+ "web/package.json": pkg({ start: "node server.js" }),
70
+ "lib/package.json": pkg({ test: "node --test" }),
71
+ "broken/package.json": "{ not json",
72
+ "none/README.md": "",
73
+ "both/package.json": pkg({ start: "node x.js" }),
74
+ "both/chant.config.ts": "",
75
+ }),
76
+ );
77
+ const k = app();
78
+ expect(["web", "lib", "broken", "none"].map((d) => probeKind(k, tree, d))).toEqual([true, false, false, false]);
79
+ const kinds = createKindRegistry([k]);
80
+ expect(resolveKind(kinds, tree, "both").winner?.name).toBe("chant");
81
+ expect(resolveKind(kinds, tree, "web").winner?.name).toBe("app");
82
+ });
83
+ });
84
+
85
+ describe("anyJsonKey and fields in a kinds file", () => {
86
+ const base = { name: "svc", description: "a service", precedence: 10, probe: { anyJsonKey: { in: ["svc.json"], pointers: ["/run", "/a~1b/c"] } } };
87
+ const file = (kinds: unknown[]) => JSON.stringify({ schema: 1, kinds });
88
+
89
+ test("anyJsonKey takes JSON Pointers, with ~1 for a slash in a key", () => {
90
+ const tree = workingTree(repo({ "a/svc.json": '{"run":null}', "b/svc.json": '{"a/b":{"c":1}}', "c/svc.json": '{"a":{"b":{"c":1}}}' }));
91
+ const k = parseKindData(file([base]), "p").kinds[0];
92
+ expect(["a", "b", "c"].map((d) => probeKind(k, tree, d))).toEqual([true, true, false]);
93
+ });
94
+
95
+ test("a pointer must start with a slash, and a field's type, description and default are checked", () => {
96
+ expect(parseKindData(file([{ ...base, probe: { anyJsonKey: { in: ["svc.json"], pointers: ["run"] } } }]), "p").problems[0]).toMatch(/pointers/);
97
+ expect(parseKindData(file([{ ...base, fields: { port: { type: "integer", description: "the port", default: 80 } } }]), "p").problems).toEqual([]);
98
+ expect(parseKindData(file([{ ...base, fields: { port: { type: "number", description: "the port" } } }]), "p").problems.length).toBeGreaterThan(0);
99
+ expect(parseKindData(file([{ ...base, fields: { port: { type: "integer", description: "the port", default: "80" } } }]), "p").problems).toEqual([
100
+ "p: kind svc declares field port whose default is \"80\", and the field is an integer",
101
+ ]);
102
+ expect(parseKindData(file([{ ...base, fields: { path: { type: "string", description: "a path", default: "x", pattern: "^/" } } }]), "p").problems).toEqual([
103
+ 'p: kind svc declares field path whose default is "x", which does not match ^/',
104
+ ]);
105
+ expect(parseKindData(file([{ ...base, fields: { path: { type: "string", description: "a path", pattern: "(" } } }]), "p").problems[0]).toMatch(/not a regular expression/);
106
+ });
107
+ });
108
+
109
+ describe("resolveMemberFields", () => {
110
+ test("fills every declared field from its default, and keeps what the entry sets", () => {
111
+ const r = resolveMemberFields(app(), { health: "/healthz", scripts: { start: "serve" } });
112
+ expect(r.problems).toEqual([]);
113
+ expect(r.fields).toEqual({
114
+ scripts: { start: "serve", dev: "dev", test: "test", migrate: "migrate" },
115
+ env: { port: "PORT", data: "APP_DATA", revision: "APP_REVISION" },
116
+ health: "/healthz",
117
+ });
118
+ });
119
+
120
+ test("a field the kind doesn't declare, a value of the wrong type or pattern, and an object given a scalar are problems, and read as the default", () => {
121
+ const r = resolveMemberFields(app(), { healthz: "/x", health: "health", env: { port: 8080, host: "x" }, scripts: "start" });
122
+ expect(r.problems.map((p) => p.path)).toEqual(["healthz", "scripts", "env/host", "env/port", "health"]);
123
+ expect(r.fields?.health).toBe("/health");
124
+ expect(r.fields?.env).toEqual({ port: "PORT", data: "APP_DATA", revision: "APP_REVISION" });
125
+ });
126
+
127
+ test("a kind with no fields reads as null, and fields set on it are one problem; an unknown kind has nothing to check", () => {
128
+ const other: MemberKind = { ...app(), name: "plain", fields: undefined };
129
+ expect(resolveMemberFields(other, null)).toEqual({ fields: null, problems: [] });
130
+ expect(resolveMemberFields(other, { health: "/" }).problems).toHaveLength(1);
131
+ expect(resolveMemberFields(undefined, { health: "/" })).toEqual({ fields: null, problems: [] });
132
+ });
133
+ });
134
+
135
+ describe("chant workspace check and status on an app member", () => {
136
+ const ids = async (root: string) => (await runDeclarationChecks(root)).diagnostics.map((d) => `${d.ruleId}:${d.entity ?? ""}:${d.message}`);
137
+
138
+ test("an app member with valid fields checks clean, and a delivery member may link to its source", async () => {
139
+ const root = appWorkspace(
140
+ [
141
+ { name: "web", dir: "web", kind: "app", fields: { health: "/healthz" } },
142
+ { name: "deploy", dir: "deploy", kind: "chant", links: [{ member: "web", output: "source" }] },
143
+ ],
144
+ { "web/package.json": pkg({ start: "node server.js" }), "deploy/chant.config.ts": "" },
145
+ );
146
+ expect(await ids(root)).toEqual([]);
147
+ });
148
+
149
+ test("a bad field, fields on a kind that declares none, and an app with no start script fail WSP005", async () => {
150
+ const root = appWorkspace(
151
+ [
152
+ { name: "web", dir: "web", kind: "app", fields: { health: "healthz", port: 3000 } },
153
+ { name: "lib", dir: "lib", kind: "app" },
154
+ { name: "deploy", dir: "deploy", kind: "chant", fields: { health: "/" } },
155
+ ],
156
+ { "web/package.json": pkg({ start: "node server.js" }), "lib/package.json": pkg({ test: "x" }), "deploy/chant.config.ts": "" },
157
+ );
158
+ const found = await ids(root);
159
+ expect(found).toHaveLength(4);
160
+ expect(found.every((f) => f.startsWith("WSP005:"))).toBe(true);
161
+ expect(found.join("\n")).toMatch(/web: field health is "healthz", which does not match \^\//);
162
+ expect(found.join("\n")).toMatch(/web: kind app declares no field port/);
163
+ expect(found.join("\n")).toMatch(/lib \(lib\) is not an app/);
164
+ expect(found.join("\n")).toMatch(/deploy: kind chant declares no fields/);
165
+ });
166
+
167
+ test("an other member that is a Node package with a start script is claimed by the app kind (WSP008), and one without isn't", async () => {
168
+ const root = appWorkspace(
169
+ [
170
+ { name: "server", dir: "server", kind: "other", because: "a server" },
171
+ { name: "tools", dir: "tools", kind: "other", because: "scripts" },
172
+ ],
173
+ { "server/package.json": pkg({ start: "node s.js" }), "tools/package.json": pkg({ build: "x" }) },
174
+ );
175
+ const found = await ids(root);
176
+ expect(found.filter((f) => f.startsWith("WSP008"))).toEqual([expect.stringMatching(/^WSP008:server:.*declare it as app/)]);
177
+ });
178
+
179
+ test("status --json prints each member's fields, with defaults, and null for a kind with none", async () => {
180
+ const root = appWorkspace([
181
+ { name: "web", dir: "web", kind: "app", fields: { scripts: { migrate: "db:migrate" } } },
182
+ { name: "notes", dir: "notes", kind: "other", because: "notes" },
183
+ ], { "web/package.json": pkg({ start: "node server.js" }), "notes/README.md": "" });
184
+ execFileSync("git", ["add", "-A"], { cwd: root });
185
+ execFileSync("git", ["-c", "user.name=t", "-c", "user.email=t@example.com", "commit", "-qm", "init"], { cwd: root });
186
+ const doc = await workspaceStatus({ cwd: root, env: "prod" });
187
+ if ("error" in doc) throw new Error(doc.error.message);
188
+ const byName = Object.fromEntries(doc.members.map((m) => [m.name, m.fields]));
189
+ expect(byName.web).toEqual({
190
+ scripts: { start: "start", dev: "dev", test: "test", migrate: "db:migrate" },
191
+ env: { port: "PORT", data: "APP_DATA", revision: "APP_REVISION" },
192
+ health: "/health",
193
+ });
194
+ expect(byName.notes).toBeNull();
195
+ });
196
+ });
@@ -0,0 +1,113 @@
1
+ /**
2
+ * `chant workspace box`: a member's box block. Two verbs:
3
+ *
4
+ * - `box listing set <member>` (#3308) changes the box's listing
5
+ * (`box-listing.ts`). A box's other configuration is changed by editing the
6
+ * declaration in a reviewed change.
7
+ * - `box publish <member> <item> | --records` (#3165, ws-088) runs the
8
+ * publisher the box block names and checks what it did (`box-publish.ts`).
9
+ */
10
+
11
+ import { readFileSync } from "node:fs";
12
+ import { resolve } from "node:path";
13
+ import { formatError } from "../cli/format";
14
+ import type { CommandContext } from "../cli/registry";
15
+ import { BOX_LISTING_CONTRACT_VERSION, BOX_LISTING_WRITE_SCHEMA_ID, boxListingSet, type BoxListingWriteDocument } from "./box-listing";
16
+ import { BOX_PUBLISH_CONTRACT_VERSION, BOX_PUBLISH_SCHEMA_ID, boxPublish, type BoxPublishDocument } from "./box-publish";
17
+ import { readerVersion } from "./declaration";
18
+ import { AGENT_ENV } from "./write-scope";
19
+
20
+ const USAGE = "chant workspace box listing set <member> [--from <file|->] [--cover <image> [--cover-path <path>]] [--by <principal>] [--dry-run] [--json]";
21
+ const PUBLISH_USAGE = "chant workspace box publish <member> (<item> | --records) [--by <principal>] [--head <owner/name>] [--dry-run] [--json]";
22
+
23
+ export async function runWorkspaceBox(ctx: CommandContext): Promise<number> {
24
+ const { args } = ctx;
25
+ const cwd = process.cwd();
26
+ // workspace box <noun> <verb> <member>, or workspace box publish <member> [<item>]
27
+ const [, noun, verb, member, ...extra] = args.positionals ?? [];
28
+ // For publish, the third positional is the member and the fourth the item.
29
+ if (noun === "publish") return runPublish(ctx, verb, member === undefined ? [] : [member, ...extra]);
30
+ if (noun !== "listing" || verb !== "set") {
31
+ console.error(
32
+ formatError({
33
+ message: noun === undefined ? "chant workspace box takes listing set <member> or publish <member>" : `chant workspace box takes listing set <member> or publish <member>, not ${[noun, verb].filter(Boolean).join(" ")}`,
34
+ hint: `${USAGE}\n${PUBLISH_USAGE}`,
35
+ }),
36
+ );
37
+ return 1;
38
+ }
39
+ const print = (doc: BoxListingWriteDocument): number => {
40
+ console.log(JSON.stringify(doc, null, 2));
41
+ return "error" in doc ? 1 : 0;
42
+ };
43
+ const usage = (message: string) =>
44
+ print({ $schema: BOX_LISTING_WRITE_SCHEMA_ID, contract: BOX_LISTING_CONTRACT_VERSION, chant: readerVersion(), member: member ?? null, error: { code: "write-usage-invalid", message } });
45
+ if (member === undefined) return usage("box listing set needs the member whose box it lists: box listing set <member>");
46
+ if (extra.length > 0) return usage(`box listing set takes one member, and was also given ${extra.join(" ")}`);
47
+ for (const [flag, v] of [["--set", args.set], ["--kind", args.kind], ["--at", args.at]] as const) {
48
+ if (v !== undefined) return usage(`box listing set takes its fields with --from, not ${flag}`);
49
+ }
50
+ let fields: string | undefined;
51
+ if (args.migrateFrom !== undefined) {
52
+ try {
53
+ fields = readFileSync(args.migrateFrom === "-" ? 0 : resolve(cwd, args.migrateFrom), "utf-8");
54
+ } catch (err) {
55
+ return print({
56
+ $schema: BOX_LISTING_WRITE_SCHEMA_ID,
57
+ contract: BOX_LISTING_CONTRACT_VERSION,
58
+ chant: readerVersion(),
59
+ member,
60
+ error: { code: "write-input-invalid", message: `--from ${args.migrateFrom} could not be read: ${err instanceof Error ? err.message : String(err)}` },
61
+ });
62
+ }
63
+ }
64
+ return print(
65
+ boxListingSet({
66
+ cwd,
67
+ member,
68
+ fields,
69
+ cover: args.cover,
70
+ coverPath: args.coverPath,
71
+ by: args.by,
72
+ agent: process.env[AGENT_ENV] || undefined,
73
+ dryRun: args.dryRun === true,
74
+ }),
75
+ );
76
+ }
77
+
78
+ /** `box publish <member> <item>` or `box publish <member> --records`. */
79
+ function runPublish(ctx: CommandContext, member: string | undefined, rest: string[]): number {
80
+ const { args } = ctx;
81
+ const [item, ...extra] = rest;
82
+ const print = (doc: BoxPublishDocument): number => {
83
+ console.log(JSON.stringify(doc, null, 2));
84
+ return "error" in doc ? 1 : 0;
85
+ };
86
+ const usage = (message: string) =>
87
+ print({
88
+ $schema: BOX_PUBLISH_SCHEMA_ID,
89
+ contract: BOX_PUBLISH_CONTRACT_VERSION,
90
+ chant: readerVersion(),
91
+ member: member ?? null,
92
+ action: args.records ? "records" : "item",
93
+ item: item ?? null,
94
+ error: { code: "write-usage-invalid", message: `${message}; ${PUBLISH_USAGE}` },
95
+ });
96
+ if (member === undefined) return usage("box publish needs the member whose box publishes");
97
+ if (extra.length > 0) return usage(`box publish takes one work item, and was also given ${extra.join(" ")}`);
98
+ for (const [flag, v] of [["--from", args.migrateFrom], ["--set", args.set], ["--kind", args.kind], ["--at", args.at], ["--cover", args.cover]] as const) {
99
+ if (v !== undefined) return usage(`box publish takes no ${flag}`);
100
+ }
101
+ return print(
102
+ boxPublish({
103
+ cwd: process.cwd(),
104
+ member,
105
+ item,
106
+ records: args.records === true,
107
+ by: args.by,
108
+ head: args.head,
109
+ dryRun: args.dryRun === true,
110
+ agent: process.env[AGENT_ENV] || undefined,
111
+ }),
112
+ );
113
+ }