@intentius/chant 0.100.0 → 0.102.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 (608) 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/discover.d.ts.map +1 -1
  4. package/dist/audit/nginx.d.ts.map +1 -1
  5. package/dist/audit/prior-art.d.ts +48 -0
  6. package/dist/audit/prior-art.d.ts.map +1 -1
  7. package/dist/behaviour-kinds.d.ts.map +1 -1
  8. package/dist/build.d.ts +6 -0
  9. package/dist/build.d.ts.map +1 -1
  10. package/dist/builder.d.ts.map +1 -1
  11. package/dist/cli/build-options.d.ts +2 -0
  12. package/dist/cli/build-options.d.ts.map +1 -1
  13. package/dist/cli/commands/build.d.ts.map +1 -1
  14. package/dist/cli/commands/carve-emit.d.ts.map +1 -1
  15. package/dist/cli/commands/check-lexicon.d.ts +16 -0
  16. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  17. package/dist/cli/commands/import.d.ts +8 -0
  18. package/dist/cli/commands/import.d.ts.map +1 -1
  19. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  20. package/dist/cli/commands/init.d.ts +19 -0
  21. package/dist/cli/commands/init.d.ts.map +1 -1
  22. package/dist/cli/commands/onboard.d.ts +9 -0
  23. package/dist/cli/commands/onboard.d.ts.map +1 -1
  24. package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
  25. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
  26. package/dist/cli/handlers/dev.d.ts.map +1 -1
  27. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  28. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  29. package/dist/cli/handlers/misc.d.ts.map +1 -1
  30. package/dist/cli/handlers/operator.d.ts +9 -0
  31. package/dist/cli/handlers/operator.d.ts.map +1 -1
  32. package/dist/cli/handlers/run.d.ts.map +1 -1
  33. package/dist/cli/lsp/server.d.ts.map +1 -1
  34. package/dist/cli/main.d.ts.map +1 -1
  35. package/dist/cli/mcp/server.d.ts.map +1 -1
  36. package/dist/cli/mcp/tools/build.d.ts.map +1 -1
  37. package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
  38. package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
  39. package/dist/cli/mcp/tools/import.d.ts.map +1 -1
  40. package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
  41. package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
  42. package/dist/cli/mcp/tools/search.d.ts.map +1 -1
  43. package/dist/cli/mcp/workspace-tools.d.ts +9 -1
  44. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  45. package/dist/cli/registry.d.ts +33 -2
  46. package/dist/cli/registry.d.ts.map +1 -1
  47. package/dist/codegen/fetch.d.ts.map +1 -1
  48. package/dist/codegen/naming.d.ts.map +1 -1
  49. package/dist/codegen/pinned-upgrade.d.ts +67 -3
  50. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  51. package/dist/codegen/registry.d.ts.map +1 -1
  52. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  53. package/dist/components/capability.d.ts.map +1 -1
  54. package/dist/components/driver.d.ts.map +1 -1
  55. package/dist/components/fan-out.d.ts.map +1 -1
  56. package/dist/components/starter-plugin.d.ts.map +1 -1
  57. package/dist/components/verbs/process-runner.d.ts.map +1 -1
  58. package/dist/components/verbs/r2-sync.d.ts.map +1 -1
  59. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  60. package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
  61. package/dist/components/verbs/sign.d.ts.map +1 -1
  62. package/dist/components/verbs/verify.d.ts.map +1 -1
  63. package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
  64. package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
  65. package/dist/components/verbs/wrangler.d.ts.map +1 -1
  66. package/dist/composite.d.ts.map +1 -1
  67. package/dist/config.d.ts +30 -7
  68. package/dist/config.d.ts.map +1 -1
  69. package/dist/declarable.d.ts +16 -0
  70. package/dist/declarable.d.ts.map +1 -1
  71. package/dist/discovery/cache.d.ts.map +1 -1
  72. package/dist/discovery/fold-import.d.ts +15 -5
  73. package/dist/discovery/fold-import.d.ts.map +1 -1
  74. package/dist/discovery/param-deps.d.ts +16 -0
  75. package/dist/discovery/param-deps.d.ts.map +1 -1
  76. package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
  77. package/dist/discovery/specifier-resolve.d.ts +37 -0
  78. package/dist/discovery/specifier-resolve.d.ts.map +1 -0
  79. package/dist/errors.d.ts.map +1 -1
  80. package/dist/fold/fold.d.ts +3 -1
  81. package/dist/fold/fold.d.ts.map +1 -1
  82. package/dist/graph-detail.d.ts.map +1 -1
  83. package/dist/graph-ir.d.ts.map +1 -1
  84. package/dist/graph-layout.d.ts.map +1 -1
  85. package/dist/import/base-parser.d.ts.map +1 -1
  86. package/dist/import/embedded.d.ts +7 -0
  87. package/dist/import/embedded.d.ts.map +1 -1
  88. package/dist/import/parser-options.d.ts +14 -0
  89. package/dist/import/parser-options.d.ts.map +1 -0
  90. package/dist/import/parser.d.ts +17 -0
  91. package/dist/import/parser.d.ts.map +1 -1
  92. package/dist/kubectl-context.d.ts.map +1 -1
  93. package/dist/lexicon-output.d.ts.map +1 -1
  94. package/dist/lexicon-schema.d.ts +3 -3
  95. package/dist/lexicon.d.ts +78 -3
  96. package/dist/lexicon.d.ts.map +1 -1
  97. package/dist/lifecycle/assert-live.d.ts.map +1 -1
  98. package/dist/lifecycle/gate-ledger.d.ts +15 -0
  99. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  100. package/dist/lifecycle/git.d.ts.map +1 -1
  101. package/dist/lifecycle/member-ledger.d.ts.map +1 -1
  102. package/dist/lifecycle/observe.d.ts.map +1 -1
  103. package/dist/lifecycle/plan-digest.d.ts +26 -5
  104. package/dist/lifecycle/plan-digest.d.ts.map +1 -1
  105. package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
  106. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  107. package/dist/lifecycle/scenario.d.ts.map +1 -1
  108. package/dist/lifecycle/status.d.ts.map +1 -1
  109. package/dist/lifecycle/work-lease.d.ts +61 -2
  110. package/dist/lifecycle/work-lease.d.ts.map +1 -1
  111. package/dist/lint/config.d.ts +4 -4
  112. package/dist/lint/engine.d.ts +6 -0
  113. package/dist/lint/engine.d.ts.map +1 -1
  114. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  115. package/dist/op/activities/activity-contracts.d.ts +12 -11
  116. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  117. package/dist/op/activities/apply.d.ts +79 -9
  118. package/dist/op/activities/apply.d.ts.map +1 -1
  119. package/dist/op/activities/decide.d.ts.map +1 -1
  120. package/dist/op/activities/index.d.ts +1 -1
  121. package/dist/op/activities/index.d.ts.map +1 -1
  122. package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
  123. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
  124. package/dist/op/activities/propose-upgrade.d.ts +2 -0
  125. package/dist/op/activities/propose-upgrade.d.ts.map +1 -1
  126. package/dist/op/activity-contract.d.ts +1 -1
  127. package/dist/op/activity-failure.d.ts.map +1 -1
  128. package/dist/op/activity-profiles.d.ts.map +1 -1
  129. package/dist/op/builders.d.ts.map +1 -1
  130. package/dist/op/composites/apply-op.d.ts +12 -5
  131. package/dist/op/composites/apply-op.d.ts.map +1 -1
  132. package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
  133. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
  134. package/dist/op/decide-backend.d.ts.map +1 -1
  135. package/dist/op/decide-read-inputs.d.ts.map +1 -1
  136. package/dist/op/emulator-lifecycle.d.ts +21 -2
  137. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  138. package/dist/op/gate-approval.d.ts +5 -1
  139. package/dist/op/gate-approval.d.ts.map +1 -1
  140. package/dist/op/gate-wait.d.ts.map +1 -1
  141. package/dist/op/gate.d.ts +19 -3
  142. package/dist/op/gate.d.ts.map +1 -1
  143. package/dist/op/index.d.ts +3 -1
  144. package/dist/op/index.d.ts.map +1 -1
  145. package/dist/op/local-executor.d.ts +6 -0
  146. package/dist/op/local-executor.d.ts.map +1 -1
  147. package/dist/op/operator.d.ts.map +1 -1
  148. package/dist/op/run-context.d.ts +39 -0
  149. package/dist/op/run-context.d.ts.map +1 -0
  150. package/dist/op/run-live.d.ts.map +1 -1
  151. package/dist/op/runtimes/local.d.ts.map +1 -1
  152. package/dist/op/source-archive.d.ts.map +1 -1
  153. package/dist/op/steward-beside.d.ts.map +1 -1
  154. package/dist/op/steward-points.d.ts.map +1 -1
  155. package/dist/op/steward.d.ts.map +1 -1
  156. package/dist/op/types.d.ts +8 -3
  157. package/dist/op/types.d.ts.map +1 -1
  158. package/dist/op/work-lease-run.d.ts +24 -4
  159. package/dist/op/work-lease-run.d.ts.map +1 -1
  160. package/dist/project-root.d.ts.map +1 -1
  161. package/dist/provenance.d.ts +21 -0
  162. package/dist/provenance.d.ts.map +1 -1
  163. package/dist/pseudo-parameter.d.ts.map +1 -1
  164. package/dist/reconcile.d.ts.map +1 -1
  165. package/dist/secret-materialization.d.ts.map +1 -1
  166. package/dist/serializer.d.ts +8 -0
  167. package/dist/serializer.d.ts.map +1 -1
  168. package/dist/telemetry-attribution.d.ts +77 -0
  169. package/dist/telemetry-attribution.d.ts.map +1 -0
  170. package/dist/terraform/emit-source.d.ts.map +1 -1
  171. package/dist/terraform/parse.d.ts.map +1 -1
  172. package/dist/testing.d.ts.map +1 -1
  173. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  174. package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
  175. package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
  176. package/dist/workspace/agent-cli.d.ts +88 -0
  177. package/dist/workspace/agent-cli.d.ts.map +1 -0
  178. package/dist/workspace/box-factory.d.ts +73 -0
  179. package/dist/workspace/box-factory.d.ts.map +1 -0
  180. package/dist/workspace/changes-cli.d.ts.map +1 -1
  181. package/dist/workspace/changes.d.ts +8 -1
  182. package/dist/workspace/changes.d.ts.map +1 -1
  183. package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
  184. package/dist/workspace/checks/boxes.d.ts.map +1 -1
  185. package/dist/workspace/checks/links.d.ts +1 -0
  186. package/dist/workspace/checks/links.d.ts.map +1 -1
  187. package/dist/workspace/checks/live.d.ts +40 -0
  188. package/dist/workspace/checks/live.d.ts.map +1 -0
  189. package/dist/workspace/checks.d.ts +26 -2
  190. package/dist/workspace/checks.d.ts.map +1 -1
  191. package/dist/workspace/compose-graph.d.ts +73 -0
  192. package/dist/workspace/compose-graph.d.ts.map +1 -1
  193. package/dist/workspace/conformance/index.d.ts +67 -6
  194. package/dist/workspace/conformance/index.d.ts.map +1 -1
  195. package/dist/workspace/conformance/vitest.d.ts +12 -3
  196. package/dist/workspace/conformance/vitest.d.ts.map +1 -1
  197. package/dist/workspace/conformance/writer.d.ts +368 -0
  198. package/dist/workspace/conformance/writer.d.ts.map +1 -0
  199. package/dist/workspace/decide.d.ts +1 -1
  200. package/dist/workspace/decide.d.ts.map +1 -1
  201. package/dist/workspace/declaration.d.ts +119 -0
  202. package/dist/workspace/declaration.d.ts.map +1 -1
  203. package/dist/workspace/declaration.schema.json +368 -4
  204. package/dist/workspace/export-cli.d.ts +12 -0
  205. package/dist/workspace/export-cli.d.ts.map +1 -0
  206. package/dist/workspace/export.d.ts +145 -0
  207. package/dist/workspace/export.d.ts.map +1 -0
  208. package/dist/workspace/generated-files.d.ts.map +1 -1
  209. package/dist/workspace/graph-cache.d.ts.map +1 -1
  210. package/dist/workspace/graph-cli.d.ts +2 -0
  211. package/dist/workspace/graph-cli.d.ts.map +1 -1
  212. package/dist/workspace/identity.d.ts +111 -0
  213. package/dist/workspace/identity.d.ts.map +1 -0
  214. package/dist/workspace/import.d.ts +73 -0
  215. package/dist/workspace/import.d.ts.map +1 -0
  216. package/dist/workspace/intent-cli.d.ts +7 -4
  217. package/dist/workspace/intent-cli.d.ts.map +1 -1
  218. package/dist/workspace/intent-record.d.ts +8 -1
  219. package/dist/workspace/intent-record.d.ts.map +1 -1
  220. package/dist/workspace/intent.d.ts +149 -5
  221. package/dist/workspace/intent.d.ts.map +1 -1
  222. package/dist/workspace/kinds.d.ts +24 -6
  223. package/dist/workspace/kinds.d.ts.map +1 -1
  224. package/dist/workspace/lineage-adopt-cli.d.ts +15 -0
  225. package/dist/workspace/lineage-adopt-cli.d.ts.map +1 -0
  226. package/dist/workspace/lineage-adopt.d.ts +106 -0
  227. package/dist/workspace/lineage-adopt.d.ts.map +1 -0
  228. package/dist/workspace/lineage-check.d.ts +9 -2
  229. package/dist/workspace/lineage-check.d.ts.map +1 -1
  230. package/dist/workspace/lineage-cli.d.ts +6 -1
  231. package/dist/workspace/lineage-cli.d.ts.map +1 -1
  232. package/dist/workspace/lineage-hash-index.d.ts +110 -0
  233. package/dist/workspace/lineage-hash-index.d.ts.map +1 -0
  234. package/dist/workspace/lineage-init.d.ts +10 -0
  235. package/dist/workspace/lineage-init.d.ts.map +1 -1
  236. package/dist/workspace/lineage-lock.d.ts +149 -2
  237. package/dist/workspace/lineage-lock.d.ts.map +1 -1
  238. package/dist/workspace/lineage-migrations.d.ts +15 -3
  239. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  240. package/dist/workspace/lineage-provenance.d.ts +18 -0
  241. package/dist/workspace/lineage-provenance.d.ts.map +1 -0
  242. package/dist/workspace/lineage-upgrade-cli.d.ts +2 -0
  243. package/dist/workspace/lineage-upgrade-cli.d.ts.map +1 -1
  244. package/dist/workspace/lineage-upgrade.d.ts +30 -1
  245. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  246. package/dist/workspace/lineage-versions.d.ts +116 -0
  247. package/dist/workspace/lineage-versions.d.ts.map +1 -0
  248. package/dist/workspace/links.d.ts +31 -5
  249. package/dist/workspace/links.d.ts.map +1 -1
  250. package/dist/workspace/ls-generated.d.ts +37 -0
  251. package/dist/workspace/ls-generated.d.ts.map +1 -0
  252. package/dist/workspace/ls.d.ts +4 -0
  253. package/dist/workspace/ls.d.ts.map +1 -1
  254. package/dist/workspace/member-commands.d.ts.map +1 -1
  255. package/dist/workspace/nested-graph.d.ts +56 -0
  256. package/dist/workspace/nested-graph.d.ts.map +1 -0
  257. package/dist/workspace/nesting.d.ts +21 -0
  258. package/dist/workspace/nesting.d.ts.map +1 -0
  259. package/dist/workspace/pin-cli.d.ts +10 -0
  260. package/dist/workspace/pin-cli.d.ts.map +1 -0
  261. package/dist/workspace/pin-integrity.d.ts +51 -0
  262. package/dist/workspace/pin-integrity.d.ts.map +1 -0
  263. package/dist/workspace/points.d.ts.map +1 -1
  264. package/dist/workspace/principal-classes.d.ts +114 -0
  265. package/dist/workspace/principal-classes.d.ts.map +1 -0
  266. package/dist/workspace/reason-codes.d.ts +47 -3
  267. package/dist/workspace/reason-codes.d.ts.map +1 -1
  268. package/dist/workspace/record-assets.d.ts.map +1 -1
  269. package/dist/workspace/record-sessions.d.ts +7 -11
  270. package/dist/workspace/record-sessions.d.ts.map +1 -1
  271. package/dist/workspace/records-checkout.d.ts +54 -0
  272. package/dist/workspace/records-checkout.d.ts.map +1 -0
  273. package/dist/workspace/records-cli.d.ts +57 -2
  274. package/dist/workspace/records-cli.d.ts.map +1 -1
  275. package/dist/workspace/records-close.d.ts +5 -2
  276. package/dist/workspace/records-close.d.ts.map +1 -1
  277. package/dist/workspace/records-since.d.ts.map +1 -1
  278. package/dist/workspace/records-write.d.ts +23 -4
  279. package/dist/workspace/records-write.d.ts.map +1 -1
  280. package/dist/workspace/records.d.ts +58 -5
  281. package/dist/workspace/records.d.ts.map +1 -1
  282. package/dist/workspace/returns.d.ts +129 -0
  283. package/dist/workspace/returns.d.ts.map +1 -0
  284. package/dist/workspace/runs-cli.d.ts +164 -0
  285. package/dist/workspace/runs-cli.d.ts.map +1 -0
  286. package/dist/workspace/runs.d.ts +423 -0
  287. package/dist/workspace/runs.d.ts.map +1 -0
  288. package/dist/workspace/source-block.d.ts +1 -1
  289. package/dist/workspace/source-block.d.ts.map +1 -1
  290. package/dist/workspace/status-gates.d.ts +15 -3
  291. package/dist/workspace/status-gates.d.ts.map +1 -1
  292. package/dist/workspace/status.d.ts +10 -0
  293. package/dist/workspace/status.d.ts.map +1 -1
  294. package/dist/workspace/symbols.d.ts +52 -0
  295. package/dist/workspace/symbols.d.ts.map +1 -0
  296. package/dist/workspace/template-manifest.d.ts +11 -3
  297. package/dist/workspace/template-manifest.d.ts.map +1 -1
  298. package/dist/workspace/trailer-joins.d.ts +46 -0
  299. package/dist/workspace/trailer-joins.d.ts.map +1 -0
  300. package/dist/workspace/trailers.d.ts +89 -0
  301. package/dist/workspace/trailers.d.ts.map +1 -0
  302. package/dist/workspace/trust/attestor.d.ts +8 -0
  303. package/dist/workspace/trust/attestor.d.ts.map +1 -1
  304. package/dist/workspace/trust/dsse.d.ts +58 -0
  305. package/dist/workspace/trust/dsse.d.ts.map +1 -0
  306. package/dist/workspace/trust/evidence-cli.d.ts +66 -0
  307. package/dist/workspace/trust/evidence-cli.d.ts.map +1 -0
  308. package/dist/workspace/trust/evidence.d.ts +93 -0
  309. package/dist/workspace/trust/evidence.d.ts.map +1 -0
  310. package/dist/workspace/trust/policy.d.ts +54 -1
  311. package/dist/workspace/trust/policy.d.ts.map +1 -1
  312. package/dist/workspace/trust/provenance.d.ts +21 -1
  313. package/dist/workspace/trust/provenance.d.ts.map +1 -1
  314. package/dist/workspace/trust/rotation.d.ts +132 -0
  315. package/dist/workspace/trust/rotation.d.ts.map +1 -0
  316. package/dist/workspace/trust/seal.d.ts +33 -0
  317. package/dist/workspace/trust/seal.d.ts.map +1 -1
  318. package/dist/workspace/trust/signers-cli.d.ts +49 -0
  319. package/dist/workspace/trust/signers-cli.d.ts.map +1 -0
  320. package/dist/workspace/trust/ssh-commit.d.ts +12 -0
  321. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
  322. package/dist/workspace/trust/test-repo.d.ts +13 -0
  323. package/dist/workspace/trust/test-repo.d.ts.map +1 -1
  324. package/dist/workspace/trust/verify.d.ts +15 -0
  325. package/dist/workspace/trust/verify.d.ts.map +1 -1
  326. package/dist/workspace/work-cli.d.ts +39 -3
  327. package/dist/workspace/work-cli.d.ts.map +1 -1
  328. package/dist/workspace/work-evidence.d.ts +1 -1
  329. package/dist/workspace/work-evidence.d.ts.map +1 -1
  330. package/dist/workspace/work.d.ts +26 -1
  331. package/dist/workspace/work.d.ts.map +1 -1
  332. package/dist/workspace/workspace-principals.schema.json +60 -0
  333. package/dist/workspace/write-scope.d.ts +259 -0
  334. package/dist/workspace/write-scope.d.ts.map +1 -0
  335. package/dist/yaml.d.ts +21 -39
  336. package/dist/yaml.d.ts.map +1 -1
  337. package/package.json +2 -2
  338. package/src/audit/prior-art.ts +15 -0
  339. package/src/build.ts +8 -0
  340. package/src/cli/build-options.ts +4 -1
  341. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
  342. package/src/cli/commands/build.ts +2 -0
  343. package/src/cli/commands/carve-emit-state.test.ts +4 -0
  344. package/src/cli/commands/carve-emit.ts +5 -19
  345. package/src/cli/commands/check-lexicon.test.ts +62 -1
  346. package/src/cli/commands/check-lexicon.ts +36 -6
  347. package/src/cli/commands/import-live.test.ts +87 -1
  348. package/src/cli/commands/import-parser-options.test.ts +133 -0
  349. package/src/cli/commands/import.ts +69 -25
  350. package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
  351. package/src/cli/commands/init.test.ts +8 -1
  352. package/src/cli/commands/init.ts +23 -8
  353. package/src/cli/commands/lint.test.ts +37 -0
  354. package/src/cli/commands/onboard.test.ts +53 -3
  355. package/src/cli/commands/onboard.ts +52 -4
  356. package/src/cli/commands/pinned-upgrade.ts +73 -33
  357. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
  358. package/src/cli/handlers/components.ts +2 -2
  359. package/src/cli/handlers/dev.ts +8 -6
  360. package/src/cli/handlers/fan-out.test.ts +6 -6
  361. package/src/cli/handlers/fan-out.ts +2 -1
  362. package/src/cli/handlers/graph.test.ts +42 -0
  363. package/src/cli/handlers/graph.ts +22 -0
  364. package/src/cli/handlers/lifecycle.test.ts +67 -0
  365. package/src/cli/handlers/lifecycle.ts +6 -5
  366. package/src/cli/handlers/misc.ts +2 -0
  367. package/src/cli/handlers/operator.ts +88 -4
  368. package/src/cli/handlers/run.test.ts +111 -0
  369. package/src/cli/handlers/run.ts +85 -24
  370. package/src/cli/handlers/scenario.ts +2 -2
  371. package/src/cli/main.test.ts +33 -0
  372. package/src/cli/main.ts +168 -17
  373. package/src/cli/mcp/workspace-tools.test.ts +5 -2
  374. package/src/cli/mcp/workspace-tools.ts +62 -4
  375. package/src/cli/registry.ts +33 -2
  376. package/src/cli/serve-mcp-workspace.test.ts +1 -1
  377. package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
  378. package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
  379. package/src/codegen/pinned-upgrade.test.ts +104 -0
  380. package/src/codegen/pinned-upgrade.ts +250 -56
  381. package/src/codegen/release-wiring.test.ts +5 -1
  382. package/src/codegen/testdata/postgres-tags.json +242 -0
  383. package/src/components/fan-out-output.test.ts +1 -1
  384. package/src/components/fan-out.test.ts +1 -1
  385. package/src/components/promote.test.ts +1 -1
  386. package/src/config.test.ts +21 -0
  387. package/src/config.ts +27 -0
  388. package/src/content-digest.test.ts +2 -2
  389. package/src/declarable.test.ts +21 -0
  390. package/src/declarable.ts +19 -0
  391. package/src/discovery/fold-composite.test.ts +41 -5
  392. package/src/discovery/fold-import.test.ts +129 -0
  393. package/src/discovery/fold-import.ts +643 -131
  394. package/src/discovery/fold-package-composite.test.ts +264 -0
  395. package/src/discovery/fold-specifiers.test.ts +191 -0
  396. package/src/discovery/param-deps.test.ts +66 -1
  397. package/src/discovery/param-deps.ts +45 -0
  398. package/src/discovery/specifier-resolve.ts +344 -0
  399. package/src/fold/fold.test.ts +39 -1
  400. package/src/fold/fold.ts +83 -9
  401. package/src/fold-provenance.test.ts +140 -0
  402. package/src/graph-ir.test.ts +83 -0
  403. package/src/graph-ir.ts +29 -0
  404. package/src/import/embedded.test.ts +20 -0
  405. package/src/import/embedded.ts +13 -0
  406. package/src/import/parser-options.ts +46 -0
  407. package/src/import/parser.ts +20 -0
  408. package/src/lexicon.ts +79 -3
  409. package/src/lifecycle/gate-ledger.test.ts +14 -0
  410. package/src/lifecycle/gate-ledger.ts +18 -1
  411. package/src/lifecycle/observe.test.ts +18 -0
  412. package/src/lifecycle/observe.ts +6 -4
  413. package/src/lifecycle/plan-digest.test.ts +54 -3
  414. package/src/lifecycle/plan-digest.ts +38 -8
  415. package/src/lifecycle/snapshot.ts +2 -2
  416. package/src/lifecycle/work-lease.test.ts +1 -1
  417. package/src/lifecycle/work-lease.ts +93 -2
  418. package/src/lint/engine.test.ts +55 -0
  419. package/src/lint/engine.ts +30 -4
  420. package/src/lint/output-docs.test.ts +59 -56
  421. package/src/op/activities/activity-contracts.ts +1 -0
  422. package/src/op/activities/apply.test.ts +189 -5
  423. package/src/op/activities/apply.ts +230 -8
  424. package/src/op/activities/index.ts +3 -0
  425. package/src/op/activities/lexicon-upgrade.test.ts +160 -6
  426. package/src/op/activities/lexicon-upgrade.ts +154 -51
  427. package/src/op/activities/propose-upgrade.ts +8 -5
  428. package/src/op/composites/apply-op.ts +12 -5
  429. package/src/op/composites/composites.test.ts +30 -3
  430. package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
  431. package/src/op/composites/lexicon-upgrade-op.ts +29 -8
  432. package/src/op/emulator-lifecycle.test.ts +23 -0
  433. package/src/op/emulator-lifecycle.ts +52 -14
  434. package/src/op/gate-approval.test.ts +91 -0
  435. package/src/op/gate-approval.ts +5 -1
  436. package/src/op/gate.ts +34 -8
  437. package/src/op/index.ts +3 -1
  438. package/src/op/local-executor.test.ts +15 -0
  439. package/src/op/local-executor.ts +40 -12
  440. package/src/op/local-output.ts +1 -1
  441. package/src/op/operator.ts +4 -0
  442. package/src/op/run-context.test.ts +141 -0
  443. package/src/op/run-context.ts +51 -0
  444. package/src/op/runtimes/local.test.ts +14 -0
  445. package/src/op/runtimes/local.ts +2 -0
  446. package/src/op/steward-beside.ts +2 -0
  447. package/src/op/types.ts +8 -3
  448. package/src/op/work-lease-run.test.ts +47 -0
  449. package/src/op/work-lease-run.ts +73 -11
  450. package/src/provenance.ts +35 -0
  451. package/src/serializer.ts +9 -0
  452. package/src/telemetry-attribution.test.ts +91 -0
  453. package/src/telemetry-attribution.ts +145 -0
  454. package/src/workspace/__fixtures__/studio-template-84c8b21.json +1 -1
  455. package/src/workspace/agent-cli.ts +138 -0
  456. package/src/workspace/agent.schema.json +378 -0
  457. package/src/workspace/behold-kinds.test.ts +1 -1
  458. package/src/workspace/box-factory.test.ts +320 -0
  459. package/src/workspace/box-factory.ts +103 -0
  460. package/src/workspace/changes-cli.ts +5 -0
  461. package/src/workspace/changes.schema.json +171 -1
  462. package/src/workspace/changes.ts +61 -4
  463. package/src/workspace/check-live.test.ts +192 -0
  464. package/src/workspace/check.schema.json +64 -0
  465. package/src/workspace/checks/boxes.test.ts +2 -0
  466. package/src/workspace/checks/links.ts +23 -2
  467. package/src/workspace/checks/live.ts +113 -0
  468. package/src/workspace/checks.test.ts +2 -2
  469. package/src/workspace/checks.ts +49 -8
  470. package/src/workspace/compose-graph.test.ts +47 -0
  471. package/src/workspace/compose-graph.ts +127 -3
  472. package/src/workspace/conformance/__fixture__/decisions/decision.kind.mjs +7 -1
  473. package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +5 -0
  474. package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +27 -0
  475. package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +95 -0
  476. package/src/workspace/conformance/__writer_fixture__/decisions/points.json +132 -0
  477. package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +48 -0
  478. package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +108 -0
  479. package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  480. package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  481. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +578 -0
  482. package/src/workspace/conformance/conformance.e2e.test.ts +35 -3
  483. package/src/workspace/conformance/index.mjs +30 -3
  484. package/src/workspace/conformance/index.ts +103 -15
  485. package/src/workspace/conformance/vitest.ts +44 -2
  486. package/src/workspace/conformance/writer-conformance.e2e.test.ts +131 -0
  487. package/src/workspace/conformance/writer.test.ts +156 -0
  488. package/src/workspace/conformance/writer.ts +880 -0
  489. package/src/workspace/decide.ts +7 -1
  490. package/src/workspace/declaration.schema.json +368 -4
  491. package/src/workspace/declaration.ts +270 -1
  492. package/src/workspace/declared-kinds.test.ts +33 -0
  493. package/src/workspace/evidence.schema.json +279 -0
  494. package/src/workspace/export-cli.ts +180 -0
  495. package/src/workspace/export-import.test.ts +282 -0
  496. package/src/workspace/export.ts +486 -0
  497. package/src/workspace/graph-cli.ts +51 -2
  498. package/src/workspace/graph-contract.test.ts +89 -4
  499. package/src/workspace/graph.schema.json +453 -1
  500. package/src/workspace/identity.test.ts +196 -0
  501. package/src/workspace/identity.ts +186 -0
  502. package/src/workspace/import.ts +325 -0
  503. package/src/workspace/intent-cli.ts +64 -10
  504. package/src/workspace/intent-record.schema.json +208 -0
  505. package/src/workspace/intent-record.ts +35 -1
  506. package/src/workspace/intent-why.test.ts +274 -0
  507. package/src/workspace/intent.schema.json +718 -7
  508. package/src/workspace/intent.test.ts +11 -2
  509. package/src/workspace/intent.ts +495 -32
  510. package/src/workspace/kinds.test.ts +5 -5
  511. package/src/workspace/kinds.ts +62 -33
  512. package/src/workspace/lineage-adopt-cli.ts +103 -0
  513. package/src/workspace/lineage-adopt.test.ts +552 -0
  514. package/src/workspace/lineage-adopt.ts +452 -0
  515. package/src/workspace/lineage-check.ts +26 -5
  516. package/src/workspace/lineage-cli.ts +12 -2
  517. package/src/workspace/lineage-hash-index.ts +305 -0
  518. package/src/workspace/lineage-init.test.ts +9 -0
  519. package/src/workspace/lineage-init.ts +29 -9
  520. package/src/workspace/lineage-lock.ts +54 -0
  521. package/src/workspace/lineage-migrations.test.ts +27 -0
  522. package/src/workspace/lineage-migrations.ts +44 -14
  523. package/src/workspace/lineage-provenance.ts +40 -0
  524. package/src/workspace/lineage-upgrade-cli.ts +9 -5
  525. package/src/workspace/lineage-upgrade.test.ts +92 -1
  526. package/src/workspace/lineage-upgrade.ts +111 -16
  527. package/src/workspace/lineage-versions.ts +348 -0
  528. package/src/workspace/links.test.ts +121 -2
  529. package/src/workspace/links.ts +97 -6
  530. package/src/workspace/ls-contract.test.ts +84 -1
  531. package/src/workspace/ls-generated.ts +111 -0
  532. package/src/workspace/ls.schema.json +19 -0
  533. package/src/workspace/ls.ts +8 -1
  534. package/src/workspace/member-commands.ts +3 -1
  535. package/src/workspace/nested-graph.test.ts +176 -0
  536. package/src/workspace/nested-graph.ts +169 -0
  537. package/src/workspace/nesting.ts +37 -0
  538. package/src/workspace/pin-cli.test.ts +71 -0
  539. package/src/workspace/pin-cli.ts +57 -0
  540. package/src/workspace/pin-integrity.test.ts +121 -0
  541. package/src/workspace/pin-integrity.ts +104 -0
  542. package/src/workspace/points-write.schema.json +2 -0
  543. package/src/workspace/principal-classes.test.ts +175 -0
  544. package/src/workspace/principal-classes.ts +307 -0
  545. package/src/workspace/read-contract.test.ts +24 -0
  546. package/src/workspace/reason-codes.test.ts +20 -2
  547. package/src/workspace/reason-codes.ts +53 -3
  548. package/src/workspace/record-sessions.ts +12 -14
  549. package/src/workspace/records-amend.schema.json +6 -0
  550. package/src/workspace/records-checkout.ts +106 -0
  551. package/src/workspace/records-cli.ts +195 -22
  552. package/src/workspace/records-close.schema.json +7 -2
  553. package/src/workspace/records-close.ts +10 -2
  554. package/src/workspace/records-formats.test.ts +13 -5
  555. package/src/workspace/records-new.schema.json +6 -0
  556. package/src/workspace/records-review.schema.json +6 -0
  557. package/src/workspace/records-sessions.test.ts +23 -6
  558. package/src/workspace/records-uncommitted.test.ts +171 -0
  559. package/src/workspace/records-write.test.ts +65 -8
  560. package/src/workspace/records-write.ts +92 -6
  561. package/src/workspace/records.schema.json +127 -4
  562. package/src/workspace/records.ts +123 -5
  563. package/src/workspace/returns.ts +328 -0
  564. package/src/workspace/runs-cli.ts +381 -0
  565. package/src/workspace/runs-write.schema.json +583 -0
  566. package/src/workspace/runs.schema.json +810 -0
  567. package/src/workspace/runs.test.ts +242 -0
  568. package/src/workspace/runs.ts +709 -0
  569. package/src/workspace/signers.schema.json +206 -0
  570. package/src/workspace/status-contract.test.ts +5 -0
  571. package/src/workspace/status-gates.ts +24 -9
  572. package/src/workspace/status.schema.json +127 -2
  573. package/src/workspace/status.ts +21 -1
  574. package/src/workspace/symbols.ts +180 -0
  575. package/src/workspace/template-manifest.ts +22 -4
  576. package/src/workspace/trailer-joins.test.ts +171 -0
  577. package/src/workspace/trailer-joins.ts +82 -0
  578. package/src/workspace/trailers.ts +148 -0
  579. package/src/workspace/trust/attestor.ts +15 -0
  580. package/src/workspace/trust/dsse.ts +134 -0
  581. package/src/workspace/trust/evidence-cli.ts +195 -0
  582. package/src/workspace/trust/evidence.test.ts +241 -0
  583. package/src/workspace/trust/evidence.ts +207 -0
  584. package/src/workspace/trust/policy.ts +110 -3
  585. package/src/workspace/trust/provenance.ts +41 -4
  586. package/src/workspace/trust/record-seal.test.ts +1 -1
  587. package/src/workspace/trust/rotation.test.ts +258 -0
  588. package/src/workspace/trust/rotation.ts +336 -0
  589. package/src/workspace/trust/seal.ts +63 -1
  590. package/src/workspace/trust/signers-cli.ts +178 -0
  591. package/src/workspace/trust/ssh-commit.ts +53 -4
  592. package/src/workspace/trust/test-repo.ts +18 -0
  593. package/src/workspace/trust/trust.test.ts +8 -2
  594. package/src/workspace/trust/verify-cli.ts +1 -0
  595. package/src/workspace/trust/verify.ts +22 -0
  596. package/src/workspace/work-cli.e2e.test.ts +28 -1
  597. package/src/workspace/work-cli.ts +133 -8
  598. package/src/workspace/work-evidence.schema.json +6 -0
  599. package/src/workspace/work-history.schema.json +73 -1
  600. package/src/workspace/work-history.test.ts +48 -5
  601. package/src/workspace/work-kind-fields.test.ts +154 -0
  602. package/src/workspace/work-lease.schema.json +14 -1
  603. package/src/workspace/work.ts +82 -0
  604. package/src/workspace/workspace-principals.schema.json +60 -0
  605. package/src/workspace/write-scope.test.ts +466 -0
  606. package/src/workspace/write-scope.ts +573 -0
  607. package/src/yaml.test.ts +111 -1
  608. package/src/yaml.ts +141 -549
@@ -747,25 +747,58 @@ describe("workspace init and ls (#2534)", () => {
747
747
  expect(resolveCommand(init, commandRegistry)?.def.name).toBe("workspace init");
748
748
  expect(commandRegistry.filter((c) => c.name === "workspace" || c.name.startsWith("workspace ")).map((c) => c.name).sort()).toEqual([
749
749
  "workspace",
750
+ "workspace admit",
751
+ "workspace adopt-lineage",
752
+ "workspace agent",
750
753
  "workspace audit",
751
754
  "workspace build",
752
755
  "workspace check",
756
+ "workspace evidence",
757
+ "workspace export",
753
758
  "workspace graph",
759
+ "workspace hash-index",
760
+ "workspace import",
754
761
  "workspace init",
755
762
  "workspace lineage",
756
763
  "workspace lint",
757
764
  "workspace ls",
758
765
  "workspace member-run",
759
766
  "workspace patch",
767
+ "workspace pin",
760
768
  "workspace points",
761
769
  "workspace records",
770
+ "workspace runs",
771
+ "workspace signers",
762
772
  "workspace status",
763
773
  "workspace upgrade",
764
774
  "workspace verify",
775
+ "workspace versions",
765
776
  "workspace work",
766
777
  ]);
767
778
  });
768
779
 
780
+ test("adopt-lineage, hash-index, versions and upgrade --source take their flags (#2551)", () => {
781
+ const adopt = parseArgs(["workspace", "adopt-lineage", "app", "--from", "acme/starter#svc", "--tags", "v*", "--index", "i.json", "--param", "name=x", "--dry-run"]);
782
+ expect(adopt).toMatchObject({ command: "workspace", path: "adopt-lineage", extraPositional: "app", migrateFrom: "acme/starter#svc", tags: "v*", index: "i.json", param: ["name=x"], dryRun: true });
783
+ expect(resolveCommand(adopt, commandRegistry)?.def.name).toBe("workspace adopt-lineage");
784
+ expect(parseArgs(["workspace", "versions", "--available", "--template", "x"])).toMatchObject({ path: "versions", available: true, template: "x" });
785
+ expect(parseArgs(["workspace", "upgrade", "--source", "acme/upstream", "--to", "v2.0.0"])).toMatchObject({ source: "acme/upstream", migrateTo: "v2.0.0" });
786
+ expect(() => parseArgs(["workspace", "adopt-lineage", "--tags"])).toThrow(/--tags needs a tag glob/);
787
+ expect(() => parseArgs(["workspace", "upgrade", "--source", "--to"])).toThrow(/--source needs a template/);
788
+ });
789
+
790
+ test("export, import and admit take their arguments (#2552)", () => {
791
+ const exp = parseArgs(["workspace", "export", "app,design", "--to", "out", "--param", "domain=example.com", "--dry-run", "--json"]);
792
+ expect(exp).toMatchObject({ command: "workspace", path: "export", extraPositional: "app,design", migrateTo: "out", param: ["domain=example.com"], dryRun: true, json: true });
793
+ expect(resolveCommand(exp, commandRegistry)?.def.name).toBe("workspace export");
794
+ const imp = parseArgs(["workspace", "import", "../copy", "--remove"]);
795
+ expect(imp).toMatchObject({ path: "import", extraPositional: "../copy", remove: true });
796
+ expect(resolveCommand(imp, commandRegistry)?.def.name).toBe("workspace import");
797
+ const admit = parseArgs(["workspace", "admit", "ret-0123456789ab", "--note", "returned from the studio"]);
798
+ expect(admit).toMatchObject({ path: "admit", extraPositional: "ret-0123456789ab", note: "returned from the studio" });
799
+ expect(resolveCommand(admit, commandRegistry)?.def.name).toBe("workspace admit");
800
+ });
801
+
769
802
  test("workspace work takes its verb, id and lease flags (#2732)", () => {
770
803
  const claim = parseArgs(["workspace", "work", "claim", "W-001", "--holder", "a", "--ttl", "60", "--json"]);
771
804
  expect(claim).toMatchObject({ command: "workspace", path: "work", extraPositional: "claim", extraPositional2: "W-001", holder: "a", ttl: "60", json: true });
package/src/cli/main.ts CHANGED
@@ -102,6 +102,7 @@ const BOOLEAN_FLAGS = new Set([
102
102
  "--durable-requests",
103
103
  "--skip-mcp",
104
104
  "--current",
105
+ "--uncommitted",
105
106
  "--allow-code",
106
107
  "--root-only",
107
108
  "--generated",
@@ -227,6 +228,12 @@ export function parseArgs(args: string[]): ParsedArgs {
227
228
  // `chant import --kustomize <dir>` (#1548): render the overlay, import
228
229
  // the output through the k8s template parser.
229
230
  result.kustomize = args[++i];
231
+ } else if (arg === "--parser-option") {
232
+ // `chant import --parser-option key[=value]` (#2994), repeatable: checked
233
+ // against the lexicon's parserOptions() by the import command.
234
+ const v = args[++i];
235
+ if (!v || v.startsWith("-")) throw new Error("--parser-option needs key or key=value: --parser-option acceptLossyV1");
236
+ (result.parserOption ??= []).push(v);
230
237
  } else if (arg === "--type") {
231
238
  result.selectType = args[++i];
232
239
  } else if (arg === "--name") {
@@ -377,11 +384,11 @@ export function parseArgs(args: string[]): ParsedArgs {
377
384
  // `chant workspace graph --composites` (#2662)
378
385
  result.composites = true;
379
386
  } else if (arg === "--intent") {
380
- // `chant workspace graph --intent <path[:start-end]>` (#2651), or `--intent --record <id>` with no region.
387
+ // `chant workspace graph --intent <path[:start-end]|path#symbol>` (#2651), or `--intent --record <id>` with no region.
381
388
  const value = args[i + 1];
382
389
  if (value !== undefined && !value.startsWith("-")) result.intent = args[++i];
383
390
  else if (args.includes("--record")) result.intent = "";
384
- else throw new Error("--intent needs a region: --intent <path[:start-end]>, or --intent --record <id>");
391
+ else throw new Error("--intent needs a region: --intent <path[:start-end]|path#symbol>, or --intent --record <id>");
385
392
  } else if (arg === "--record") {
386
393
  // `chant workspace graph --intent --record <id>`
387
394
  result.record = args[++i];
@@ -409,6 +416,9 @@ export function parseArgs(args: string[]): ParsedArgs {
409
416
  if (!result.severity || result.severity.startsWith("-")) throw new Error("--severity needs off, warn or fail");
410
417
  } else if (arg === "--current") {
411
418
  result.current = true;
419
+ } else if (arg === "--uncommitted") {
420
+ // `chant workspace records --uncommitted` (#3160)
421
+ result.uncommitted = true;
412
422
  } else if (arg === "--set") {
413
423
  // `chant workspace records amend <id> --set <file|->` (#2670)
414
424
  result.set = args[++i];
@@ -445,6 +455,7 @@ export function parseArgs(args: string[]): ParsedArgs {
445
455
  } else if (arg === "--sign") {
446
456
  // `chant workspace records review <id> --sign [<key file>]` (#2687): seal the verdict.
447
457
  // `records new` and `records amend` take it too, to seal the record's author (#2688).
458
+ // `chant approve <op> <gate> --sign [<key file>]` seals a gate approval (#3163).
448
459
  // With no key file, git's user.signingkey, as `git commit -S` reads it.
449
460
  const next = args[i + 1];
450
461
  result.sign = next !== undefined && !next.startsWith("-") ? args[++i] : true;
@@ -456,6 +467,12 @@ export function parseArgs(args: string[]): ParsedArgs {
456
467
  // `chant workspace records new <kind> --prefix <prefix>` (#2670): the id prefix to allocate under.
457
468
  result.prefix = args[++i];
458
469
  if (!result.prefix || result.prefix.startsWith("-")) throw new Error("--prefix needs an id prefix: --prefix <prefix>");
470
+ } else if (arg === "--key" || arg === "--check-id" || arg === "--claim" || arg === "--environment" || arg === "--envelope" || arg === "--threshold") {
471
+ // `chant workspace evidence sign|verify` and `chant workspace signers` (#2553)
472
+ const value = args[++i];
473
+ if (value === undefined || value.startsWith("-")) throw new Error(`${arg} needs a value`);
474
+ const field = ({ "--key": "key", "--check-id": "checkId", "--claim": "claim", "--environment": "environment", "--envelope": "envelope", "--threshold": "threshold" } as const)[arg];
475
+ result[field] = value;
459
476
  } else if (arg === "--require") {
460
477
  // `chant workspace records|verify --require attested` (#2547)
461
478
  result.require = args[++i];
@@ -560,6 +577,11 @@ export function parseArgs(args: string[]): ParsedArgs {
560
577
  const value = args[++i];
561
578
  if (!value || value.startsWith("-")) throw new Error(`${arg} needs a value: ${arg} <${arg.slice(2)}>`);
562
579
  result[arg.slice(2) as "holder" | "ttl" | "token" | "outcome"] = value;
580
+ } else if (arg === "--unit" || arg === "--decision") {
581
+ // `chant workspace runs --unit <id> | --decision <id>` (#3033): the runs on one work item, or for one decision.
582
+ const value = args[++i];
583
+ if (!value || value.startsWith("-")) throw new Error(`${arg} needs an id: ${arg} <id>`);
584
+ result[arg.slice(2) as "unit" | "decision"] = value;
563
585
  } else if (arg === "--note") {
564
586
  result.note = args[++i];
565
587
  } else if (arg === "--expire") {
@@ -576,6 +598,24 @@ export function parseArgs(args: string[]): ParsedArgs {
576
598
  // #2550 — `chant workspace upgrade` runs a template's code migrations
577
599
  // only when asked to.
578
600
  result.allowCode = true;
601
+ } else if (arg === "--source") {
602
+ // #2551 — `chant workspace upgrade --source <repo>[#<member>]`.
603
+ result.source = args[++i];
604
+ if (!result.source || result.source.startsWith("-")) throw new Error("--source needs a template: --source <repo>[#<member>]");
605
+ } else if (arg === "--tags") {
606
+ // #2551 — `chant workspace adopt-lineage --tags <glob>`, also hash-index and versions.
607
+ result.tags = args[++i];
608
+ if (!result.tags || result.tags.startsWith("-")) throw new Error("--tags needs a tag glob: --tags 'v*'");
609
+ } else if (arg === "--index") {
610
+ // #2551 — `chant workspace adopt-lineage --index <file>`.
611
+ result.index = args[++i];
612
+ if (!result.index || result.index.startsWith("-")) throw new Error("--index needs a hash index file: --index <file>");
613
+ } else if (arg === "--remove") {
614
+ // #2552 — `chant workspace import --remove` removes the export member instead of writing it again.
615
+ result.remove = true;
616
+ } else if (arg === "--available") {
617
+ // #2551 — `chant workspace versions --available` lists the template's version tags.
618
+ result.available = true;
579
619
  } else if (arg === "--root-only") {
580
620
  // #2537 — `chant build` and `chant lint` at a declared workspace root
581
621
  // run on the root project alone instead of refusing with WSP000.
@@ -794,7 +834,11 @@ Ops:
794
834
  and defaults to the PR/MR of the surrounding CI job.
795
835
  The next "chant run <op>" walks through the gate.
796
836
  --expire clears a pending fact without approving it,
797
- so the gate is re-decided from scratch next run
837
+ so the gate is re-decided from scratch next run.
838
+ --sign [<key file>] seals the approval with an ssh
839
+ key; a gate the workspace's identity.gates names
840
+ counts only an approval sealed by a key the signers
841
+ file at base lists for --actor
798
842
 
799
843
  graph Show Op dependency graph (--stacks for cross-stack order,
800
844
  --format ir|mermaid|dot|layout for the lint-gated graph IR,
@@ -834,7 +878,7 @@ Workspace (level 1, #2524):
834
878
  beside it and marks the members whose digests differ.
835
879
  Read only; never fetches. --json prints the
836
880
  read-contract document
837
- workspace records [--kind <kind file>] [--current] [--at <rev>] [--base <rev>] [--require attested] [--json]
881
+ workspace records [--kind <kind file>] [--current] [--uncommitted | --at <rev>] [--base <rev>] [--require attested] [--json]
838
882
  Without --kind, every record kind the declaration
839
883
  names. Read the records a record kind locates, validated
840
884
  against its schema, with reason codes for invalid
@@ -844,7 +888,10 @@ Workspace (level 1, #2524):
844
888
  the signers at --base (default: the target branch);
845
889
  --require attested exits 2 if any record is not
846
890
  attested. A pinned file that changed is a warning,
847
- asset-drift or asset-missing
891
+ asset-drift or asset-missing. In the working tree,
892
+ each record says whether it is committed, modified
893
+ or new against HEAD, with the branch and base;
894
+ --uncommitted lists only the modified and new ones
848
895
  workspace records [--kind <kind file>] --since <rev|session id> [--at <rev>] [--json]
849
896
  What changed in the records between <rev> and --at
850
897
  (default: the working tree): new and removed records,
@@ -886,7 +933,7 @@ Workspace (level 1, #2524):
886
933
  closing commit and seal, in one write. Without
887
934
  --kind, the one session kind the declaration names.
888
935
  Prints {path, id, changed, seal, closedRev}
889
- workspace work claim|renew|release <id> --holder <name> [--kind <kind file>] [--ttl <seconds|duration>] [--token <token>] [--outcome <text>] [--note <text>] [--json]
936
+ workspace work claim|renew|release <id> --holder <name> [--kind <kind file>] [--ttl <seconds|duration>] [--token <token>] [--outcome <outcome>] [--note <text>] [--json]
890
937
  Take, heartbeat or give back the lease on a work item:
891
938
  refs/chant/lease/work/<id>, a compare-and-set ref with a
892
939
  fencing token and an expiry, pushed to the remote so
@@ -897,6 +944,28 @@ Workspace (level 1, #2524):
897
944
  A work item's lease history: each claim with its token
898
945
  and holder, and how it ended, released with an outcome
899
946
  or never released (expired or lost). Read-only
947
+ workspace work evidence <id> --holder <name> --token <token> --from <file|-> [--kind <kind file>]
948
+ Attach evidence for one acceptance criterion under the
949
+ lease you hold: the entry (criterion, result, title,
950
+ a url or a path pinned by hash) is appended to the
951
+ item's pins through records amend. Prints the
952
+ work-evidence document and never commits
953
+ workspace runs [--unit <id>] [--decision <id>] [--by <principal>] [--since <rev>] [--json]
954
+ The agent runs in the run ledger on chant/lifecycle, each
955
+ with its model, tokens, cost and the commits it made,
956
+ and totals per work item, decision and principal; a run
957
+ that reports no cost is listed as unpriced, never zero.
958
+ Read-only, never fetches
959
+ workspace runs start --from <file|->
960
+ Record that an agent run started: who it worked for,
961
+ its harness, model, work item and lease. Prints the run
962
+ and its Chant-Run trailer. chant never starts a run
963
+ workspace runs end <run id> [--from <file|->]
964
+ Record how a started run ended: its outcome, tokens,
965
+ cost and price source, the transcript pinned by hash,
966
+ and the commits it made
967
+ workspace runs record --from <file|->
968
+ Record a finished run, its start and end in one write
900
969
  workspace points [--open] [--kind <kind file>] [--at <rev>] [--json]
901
970
  List the decision points the declared answer kinds'
902
971
  points files declare, and the questions asked of them;
@@ -909,24 +978,77 @@ Workspace (level 1, #2524):
909
978
  workspace points answer <id> --answer <value> --by <name>... [--kind <kind file>] [--dry-run]
910
979
  Record people's answer to an open question, or confirm
911
980
  a model's proposal, once the point's quorum is met
981
+ workspace pin <path> [--json]
982
+ Print the integrity value that pins the plugin at
983
+ <path>, to put in a path pin of chant.workspace.json.
984
+ chant checks it before it reads the plugin
985
+ workspace agent [<name>] [--json]
986
+ Print an agent session from the declaration: the one
987
+ member it is bound to, the record kinds and verbs its
988
+ write scope allows, and the spec records --current
989
+ prints. Without a name, the session CHANT_AGENT names
912
990
  workspace verify [--base <rev>] [--head <rev>] [--require attested]
913
991
  Check the commits in base..head against the signers
914
992
  and roles read from base. A change to the signers file
915
993
  or .chant/trust.json needs a signature by a signer
916
- trusted at base. Does nothing without a signers file
994
+ trusted at base, and a new signer set needs a
995
+ threshold of the old one. Does nothing without a
996
+ signers file
997
+ workspace signers [--json] [rotate [--threshold <n>] | sign --key <file>]
998
+ Show the signer history at base, or propose the next
999
+ signer set and sign it with a current signer's key
1000
+ workspace evidence sign --kind <kind file> --key <runner.pem> --check-id <id>
1001
+ Sign runner evidence over the records' hashes in a
1002
+ DSSE envelope, with a runner key .chant/trust.json
1003
+ lists. For CI and services, never a person's key
1004
+ workspace evidence verify --envelope <file> [--at <rev>] [--json]
1005
+ Verify runner evidence offline, and whether the
1006
+ records it covers are unchanged
917
1007
  workspace lineage [--json]
918
1008
  Show each scope in .chant/workspace.lock.json: its
919
1009
  template and pin, locally edited files and open
920
1010
  manual steps. Needs no workspace file
921
1011
  workspace lineage resolve <path>
922
1012
  Close a manual step once the file is merged by hand
923
- workspace upgrade [<scope>] [--to <ref|dir>] [--allow-code] [--dry-run] [--output <file>]
1013
+ workspace upgrade [<scope>] [--to <ref|dir>] [--source <repo>[#<member>]] [--allow-code] [--dry-run] [--output <file>]
924
1014
  Bring a lineage scope to a newer template version: fetch
925
1015
  it, migrate and merge per file in a worktree, run build,
926
1016
  lint and workspace check there, then gate on the digest
927
1017
  of the patch (chant approve workspace-upgrade <scope>).
928
- A second run with the approval applies the patch
929
- workspace check [--at <rev>] [--json] [--format stylish|json|sarif] [--generated] [--kind <kind file>]
1018
+ A second run with the approval applies the patch.
1019
+ --source <repo>[#<member>] moves the scope to another
1020
+ template through that template's bridge migration
1021
+ workspace adopt-lineage [<scope>] --from <repo>[@<ref>][#<member>] [--tags <glob>]
1022
+ [--index <file>] [--param name=value] [--dry-run] [--json]
1023
+ Give a scope a git lineage: match a scope with none
1024
+ against the template's versions and record the best
1025
+ one, with the adopted commit range in .chant/trust.json,
1026
+ or move a directory lineage onto the version that
1027
+ reproduces its recorded files
1028
+ workspace hash-index --from <repo>[#<member>] [--tags <glob>] [--output <file>]
1029
+ Compute the per-version file hashes adopt-lineage
1030
+ matches against, for a template's CI to publish
1031
+ workspace versions [<dir>] [--template <id>] [--available [--tags <glob>]] [--json]
1032
+ Report the template, chant and lexicon versions of
1033
+ every lineage lock under <dir>, grouped into families
1034
+ by template; --available also lists each git
1035
+ template's version tags and where each lock sits
1036
+ workspace export [<member>[,<member>...]] [--to <member>] [--param name=value] [--dry-run] [--json]
1037
+ Write members that set travel, with their lineage and
1038
+ records, into the export member (role export) as a
1039
+ workspace of their own; with no member named, every
1040
+ member that travels and the workspace's own records.
1041
+ --param gives a host-bound parameter its value there
1042
+ workspace import [<dir>] [--remove] [--dry-run] [--json]
1043
+ Bring an export back: merge per file against the
1044
+ export's hashes, switch host values back, record the
1045
+ return in .chant/returns/<id>.json with the commits the
1046
+ files were made in, then write the export member again
1047
+ or, with --remove, remove it
1048
+ workspace admit <return id> [--note <text>] [--dry-run] [--json]
1049
+ Admit the signers of a return in .chant/trust.json, so
1050
+ its signed work reads as attested once merged
1051
+ workspace check [--at <rev>] [--json] [--format stylish|json|sarif] [--generated] [--kind <kind file>] [--live --env <env>]
930
1052
  Fail on an unreadable lineage lock or an open manual
931
1053
  step, and, in a declared workspace, on a WSP check of
932
1054
  the declaration, member ledgers, pipelines or
@@ -934,14 +1056,21 @@ Workspace (level 1, #2524):
934
1056
  and compares their output. --kind warns on records
935
1057
  whose pinned files changed. Needs no workspace file.
936
1058
  --at reads a commit's git objects; --format json
937
- prints the read-contract document
1059
+ prints the read-contract document. --live --env
1060
+ resolves each declared member link against the live
1061
+ graph of <env> (each chant member runs chant graph
1062
+ --live, which reaches the account) and reports
1063
+ WSP141 and WSP142
938
1064
  workspace check --changes <base>..<head> [--work <id>] [--severity off|warn|fail] [--kind <kind file>...] [--json]
939
1065
  Map each path the diff changes to the current records
940
1066
  whose constrains cover it: change-uncovered when none
941
1067
  does, change-out-of-scope when a record in hand (the
942
1068
  --work item and its decisions) lists it in
943
1069
  out_of_scope. The declaration's changes block sets
944
- the severity (warn by default) and ignore globs
1070
+ the severity (warn by default) and ignore globs. When
1071
+ the declaration at base has writeScope or agents, each
1072
+ commit that writes outside its writer's scope fails
1073
+ the check (write-scope-member, write-scope-kind)
945
1074
  workspace patch <base>..<head>|<base>...<head>|<commit> [--path <p>...] [--max-bytes <n>] [--json]
946
1075
  workspace patch [<commit>] --worktree [--path <p>...] [--max-bytes <n>] [--json]
947
1076
  The hunks of a diff, file by file: a range, a work
@@ -972,7 +1101,7 @@ Workspace (level 1, #2524):
972
1101
  Each composite instance the members declare, with the
973
1102
  components whose contract can deploy it; an instance
974
1103
  with none lists an empty set
975
- workspace graph --intent <path[:start-end]> [--at <rev>] [--kind <kind file>...] [--json]
1104
+ workspace graph --intent <path[:start-end]|path#symbol> [--at <rev>] [--kind <kind file>...] [--json]
976
1105
  The intent graph over one region: the commits that
977
1106
  touched it, the decisions whose constrains cover it,
978
1107
  the artifacts they pin, and findings with closed codes.
@@ -1066,8 +1195,13 @@ Lexicon development:
1066
1195
  --check: fail if the committed baseline drifted (never writes);
1067
1196
  --run-examples: also run example build harness;
1068
1197
  --pinned-digest <file>: verify spec digest before regen)
1069
- dev pinned-upgrade <dir> Report if a pinned lexicon (k8s|gcp|docker|gitlab) has a newer
1070
- upstream release; dry-run bump + regen + surface-diff, then revert
1198
+ dev pinned-upgrade <dir> [pin]
1199
+ Report if a lexicon that declares upstreamPin (k8s, k3s, gcp, docker,
1200
+ gitlab, cedar, sql) has a newer upstream release; dry-run bump + regen +
1201
+ surface-diff, then revert. A pin that moves with other constants (sql's
1202
+ image digest) is reported with how to move it, not edited. A lexicon
1203
+ with several pins (sql: clickhouse, postgres-14 .. postgres-18) gets one
1204
+ report per pin; name a pin to check only that one
1071
1205
  (reports only; --force bypasses the spec cache, -f json for JSON)
1072
1206
  dev rolling-upgrade <dir> Report rolling-spec drift (aws, azure, github): regen from
1073
1207
  latest, diff surface vs committed baseline, print delta + PR
@@ -1110,8 +1244,9 @@ Options:
1110
1244
  -h, --help Show this help message
1111
1245
  -V, --version Print the installed chant's version
1112
1246
  --on <lexicon> Which runtime hosts the run: a configured lexicon with
1113
- an opRuntime, or the built-in local runtime when
1114
- omitted (every run subcommand; #2121)
1247
+ an opRuntime, or local. Omitted, run.on in
1248
+ chant.config.ts decides, then the built-in local
1249
+ runtime (every run subcommand; #2121, #2523)
1115
1250
  --local Run an Op with the local in-process executor (default)
1116
1251
  -p, --profile <name> Named connection profile the hosting runtime targets
1117
1252
  (fountain.profiles in chant.config.ts); each runtime's
@@ -1203,6 +1338,7 @@ Examples:
1203
1338
  chant components export prod --component search-service -o ./dist/search-service
1204
1339
  chant import template.json --output ./infra/
1205
1340
  chant import manifest.yaml --lexicon k8s --output ./infra/
1341
+ chant import dash.json --lexicon grafana --parser-option acceptLossyV1
1206
1342
  chant import --from prod --name my-bucket --output src/
1207
1343
  chant lint ./infra/
1208
1344
  chant lint ./infra/ --format sarif
@@ -1468,9 +1604,19 @@ export const commandRegistry: CommandDef[] = [
1468
1604
  { name: "workspace ls", handler: async (ctx) => (await import("../workspace/ls")).runWorkspaceLs(ctx) },
1469
1605
  // #2732 — the work lease: claim, renew and release a work item.
1470
1606
  { name: "workspace work", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/work-cli")).runWorkspaceWork(ctx) },
1607
+ // #3033 — the agent run record: what each run cost and which commits it made. chant records runs and never starts one.
1608
+ { name: "workspace runs", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/runs-cli")).runWorkspaceRuns(ctx) },
1471
1609
  { name: "workspace status", handler: async (ctx) => (await import("../workspace/status")).runWorkspaceStatus(ctx) },
1472
1610
  { name: "workspace lineage", handler: async (ctx) => (await import("../workspace/lineage-cli")).runWorkspaceLineage(ctx) },
1473
1611
  { name: "workspace upgrade", handler: async (ctx) => (await import("../workspace/lineage-upgrade-cli")).runWorkspaceUpgrade(ctx) },
1612
+ // #2551 — adopt a lineage, the hash index it matches against, and the versions of a family of workspaces.
1613
+ { name: "workspace adopt-lineage", handler: async (ctx) => (await import("../workspace/lineage-adopt-cli")).runWorkspaceAdoptLineage(ctx) },
1614
+ { name: "workspace hash-index", handler: async (ctx) => (await import("../workspace/lineage-adopt-cli")).runWorkspaceHashIndex(ctx) },
1615
+ // #2552 — export a workspace or members, bring an export back, and admit a return's signers.
1616
+ { name: "workspace export", handler: async (ctx) => (await import("../workspace/export-cli")).runWorkspaceExport(ctx) },
1617
+ { name: "workspace import", handler: async (ctx) => (await import("../workspace/export-cli")).runWorkspaceImport(ctx) },
1618
+ { name: "workspace admit", handler: async (ctx) => (await import("../workspace/export-cli")).runWorkspaceAdmit(ctx) },
1619
+ { name: "workspace versions", handler: async (ctx) => (await import("../workspace/lineage-versions")).runWorkspaceVersions(ctx) },
1474
1620
  // #2641 — workspace check reads member configs statically and never runs one.
1475
1621
  { name: "workspace check", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/lineage-check")).runWorkspaceCheck(ctx) },
1476
1622
  // The hunks of a diff, for a reader that runs no git of its own.
@@ -1484,7 +1630,12 @@ export const commandRegistry: CommandDef[] = [
1484
1630
  { name: "workspace graph", handler: async (ctx) => (await import("../workspace/member-commands")).runWorkspaceMembers(ctx, "graph") },
1485
1631
  // Each unit decides for itself whether its config is loaded (runCommandInProcess).
1486
1632
  { name: "workspace member-run", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/member-run")).runWorkspaceMemberRun(ctx, runCommandInProcess) },
1633
+ { name: "workspace pin", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/pin-cli")).runWorkspacePin(ctx) },
1634
+ // #2548 — an agent session's member, write scope and spec, for a session that resumes.
1635
+ { name: "workspace agent", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/agent-cli")).runWorkspaceAgent(ctx) },
1487
1636
  { name: "workspace verify", handler: async (ctx) => (await import("../workspace/trust/verify-cli")).runWorkspaceVerify(ctx) },
1637
+ { name: "workspace signers", handler: async (ctx) => (await import("../workspace/trust/signers-cli")).runWorkspaceSigners(ctx) },
1638
+ { name: "workspace evidence", handler: async (ctx) => (await import("../workspace/trust/evidence-cli")).runWorkspaceEvidence(ctx) },
1488
1639
 
1489
1640
  // State subcommands
1490
1641
  { name: "lifecycle snapshot", requiresPlugins: true, handler: runLifecycleSnapshot },
@@ -12,7 +12,7 @@ import { join } from "node:path";
12
12
  import { afterAll, beforeAll, describe, expect, test } from "vitest";
13
13
  import { createConformanceWorkspace, defaultChantCommand, mcpToolCall, type ConformanceWorkspace } from "../../workspace/conformance";
14
14
  import { McpServer } from "./server";
15
- import { workspaceReadTools, workspaceWriteTools } from "./workspace-tools";
15
+ import { readArgv, workspaceReadTools, workspaceWriteTools } from "./workspace-tools";
16
16
 
17
17
  const KIND = "decisions/decision.kind.mjs";
18
18
  const chant = defaultChantCommand();
@@ -85,7 +85,7 @@ describe("which servers have the workspace tools", () => {
85
85
  const { tools } = (await rpc(server(cwd), "tools/list")) as { tools: { name: string }[] };
86
86
  expect(tools.map((t) => t.name)).toEqual(expect.arrayContaining(names));
87
87
  }
88
- expect(names).toEqual(["workspace-ls", "workspace-status", "workspace-graph", "workspace-changes", "workspace-records", "workspace-points", "workspace-work-history", "records-new", "records-amend", "records-review", "records-close", "points-answer"]);
88
+ expect(names).toEqual(["workspace-ls", "workspace-status", "workspace-graph", "workspace-changes", "workspace-records", "workspace-points", "workspace-agent", "workspace-work-history", "workspace-runs", "records-new", "records-amend", "records-review", "records-close", "points-answer"]);
89
89
  });
90
90
 
91
91
  test("a server outside any workspace, or given none, does not", async () => {
@@ -161,6 +161,9 @@ describe("reads", () => {
161
161
 
162
162
  test("the conformance suite's argv maps to the tool that answers it", () => {
163
163
  expect(mcpToolCall(["workspace", "records", "--kind", KIND, "--json"])).toEqual({ name: "workspace-records", arguments: { kind: KIND } });
164
+ expect(mcpToolCall(["workspace", "records", "--uncommitted", "--kind", KIND, "--json"])).toEqual({ name: "workspace-records", arguments: { uncommitted: true, kind: KIND } });
165
+ expect(readArgv("workspace-records", { kind: KIND, uncommitted: true })).toEqual(["workspace", "records", "--kind", KIND, "--uncommitted", "--json"]);
166
+ expect(() => readArgv("workspace-records", { uncommitted: true, at: "HEAD" })).toThrow(/takes no at or since/);
164
167
  expect(mcpToolCall(["workspace", "status", "dev", "--json"])).toEqual({ name: "workspace-status", arguments: { env: "dev" } });
165
168
  expect(mcpToolCall(["workspace", "graph", "--intent", "a.mjs:1", "--kind", KIND, "--json"])).toEqual({ name: "workspace-graph", arguments: { intent: "a.mjs:1", kind: [KIND] } });
166
169
  expect(mcpToolCall(["workspace", "graph", "--composites", "--json"])).toEqual({ name: "workspace-graph", arguments: { composites: true } });
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * - The reads (`workspace-ls`, `workspace-status`, `workspace-graph`,
9
9
  * `workspace-changes`, `workspace-records`, `workspace-points`,
10
- * `workspace-work-history`) run `chant workspace <command>
10
+ * `workspace-work-history`, `workspace-runs`) run `chant workspace <command>
11
11
  * ... --json` with the chant this server runs as, in the server's
12
12
  * directory, and return the
13
13
  * document it printed, unchanged, with its reason codes (#2536). Running the
@@ -28,11 +28,20 @@
28
28
  *
29
29
  * Nothing here listens on a port or authenticates anyone (ws-052): the server
30
30
  * speaks over stdio, and `by` is recorded as given, as `--by` is.
31
+ *
32
+ * An agent session (#2548): a server started with `CHANT_AGENT` set writes in
33
+ * that session, bound to its one member, and its writes are refused outside
34
+ * the session's write scope with the CLI's codes (`write-scope-member`,
35
+ * `write-scope-kind`, `agent-unknown`). `workspace-agent` returns what the
36
+ * session reloads from.
31
37
  */
32
38
 
33
39
  import { spawn } from "node:child_process";
34
40
  import type { ToolContext, ToolDefinition, ToolHandler } from "./types";
35
41
 
42
+ /** `AGENT_ENV` of `workspace/write-scope.ts`, kept here so the server loads nothing under workspace/ until a tool is called. */
43
+ const AGENT_ENV = "CHANT_AGENT";
44
+
36
45
  /** How the reads run chant: a command and its leading arguments. */
37
46
  export type ChantCommand = string[];
38
47
 
@@ -49,6 +58,8 @@ export interface WorkspaceToolsOptions {
49
58
  cwd: string;
50
59
  /** The chant the reads run. Defaults to {@link ownChantCommand}. */
51
60
  chantCommand?: ChantCommand;
61
+ /** The agent session the writes are made in (#2548). Defaults to `CHANT_AGENT`. */
62
+ agent?: string;
52
63
  }
53
64
 
54
65
  const PROTOCOL =
@@ -100,7 +111,7 @@ export const workspaceReadTools: ToolDefinition[] = [
100
111
  items: { type: "string" },
101
112
  description: "Record kind files whose records join the graph (--kind). The plain graph takes one; intent takes several.",
102
113
  },
103
- intent: { type: "string", description: "The region for the intent graph: a workspace path, path:line or path:start-end (--intent)." },
114
+ intent: { type: "string", description: "The region for the intent graph: a workspace path, path:line, path:start-end, or path#symbol for a TypeScript or JavaScript declaration such as src/server.ts#createApp (--intent). The document's why answers why the region is like this." },
104
115
  composites: { type: "boolean", description: "The composites document instead (--composites). Takes no kind or intent." },
105
116
  at: atProp,
106
117
  },
@@ -135,6 +146,10 @@ export const workspaceReadTools: ToolDefinition[] = [
135
146
  properties: {
136
147
  kind: kindProp,
137
148
  current: { type: "boolean", description: "Leave out records a closed record supersedes (--current)." },
149
+ uncommitted: {
150
+ type: "boolean",
151
+ description: "Only the records the working tree holds modified or new against HEAD, with the checkout's branch, head and base (--uncommitted, #3160). Takes no at or since.",
152
+ },
138
153
  since: { type: "string", description: "A revision, or a review session id, to compare with (--since)." },
139
154
  id: { type: "string", description: "Keep only the record with this id in the document's records." },
140
155
  at: atProp,
@@ -154,6 +169,17 @@ export const workspaceReadTools: ToolDefinition[] = [
154
169
  },
155
170
  },
156
171
  },
172
+ {
173
+ name: "workspace-agent",
174
+ description:
175
+ "An agent session and what it reloads from (#2548): chant workspace agent <name> --json (agent.schema.json). The one member it is bound to, the record kinds and verbs its write scope allows, and the spec records --current prints, read from the repository alone. Without name, this server's session (CHANT_AGENT). Returns the document unchanged.",
176
+ inputSchema: {
177
+ type: "object",
178
+ properties: {
179
+ name: { type: "string", description: "The session's name, as the declaration's agents list gives it." },
180
+ },
181
+ },
182
+ },
157
183
  {
158
184
  name: "workspace-work-history",
159
185
  description:
@@ -167,6 +193,20 @@ export const workspaceReadTools: ToolDefinition[] = [
167
193
  required: ["item"],
168
194
  },
169
195
  },
196
+ {
197
+ name: "workspace-runs",
198
+ description:
199
+ "The agent runs in the workspace's run ledger on chant/lifecycle: chant workspace runs --json (runs.schema.json, #3033). Each run has who it worked for, its harness and model, its tokens and cost with the price source, the transcript pinned by hash and the commits it made, and the totals are per work item, per decision and per principal. A run that reports no cost is listed as unpriced, never counted as zero. Returns the document unchanged.",
200
+ inputSchema: {
201
+ type: "object",
202
+ properties: {
203
+ unit: { type: "string", description: "Only the runs on this work item (--unit)." },
204
+ decision: { type: "string", description: "Only the runs that carried out this decision, by id or <kind>/<id> (--decision)." },
205
+ by: { type: "string", description: "Only the runs made for this principal (--by)." },
206
+ since: { type: "string", description: "Only the runs that made a commit after this revision, or started after it (--since)." },
207
+ },
208
+ },
209
+ },
170
210
  ];
171
211
 
172
212
  export const workspaceWriteTools: ToolDefinition[] = [
@@ -334,11 +374,22 @@ export function readArgv(tool: string, params: Record<string, unknown>): string[
334
374
  "--json",
335
375
  ];
336
376
  }
377
+ case "workspace-agent": {
378
+ const name = str(params, "name", true)!;
379
+ return ["workspace", "agent", name, "--json"];
380
+ }
337
381
  case "workspace-work-history": {
338
382
  const item = str(params, "item", true)!;
339
383
  const kind = str(params, "kind");
340
384
  return ["workspace", "work", "history", item, ...(kind !== undefined ? ["--kind", kind] : []), "--json"];
341
385
  }
386
+ case "workspace-runs": {
387
+ const flags = (["unit", "decision", "by", "since"] as const).flatMap((f) => {
388
+ const v = str(params, f);
389
+ return v !== undefined ? [`--${f}`, v] : [];
390
+ });
391
+ return ["workspace", "runs", ...flags, "--json"];
392
+ }
342
393
  case "workspace-points": {
343
394
  const kind = str(params, "kind");
344
395
  return ["workspace", "points", ...(bool(params, "open") ? ["--open"] : []), ...(kind !== undefined ? ["--kind", kind] : []), ...atArgs, "--json"];
@@ -346,11 +397,13 @@ export function readArgv(tool: string, params: Record<string, unknown>): string[
346
397
  case "workspace-records": {
347
398
  const kind = str(params, "kind");
348
399
  const since = str(params, "since");
400
+ if (bool(params, "uncommitted") && (at !== undefined || since !== undefined)) throw new ToolInputError("uncommitted reads the working tree against HEAD, and takes no at or since");
349
401
  return [
350
402
  "workspace",
351
403
  "records",
352
404
  ...(kind !== undefined ? ["--kind", kind] : []),
353
405
  ...(bool(params, "current") ? ["--current"] : []),
406
+ ...(bool(params, "uncommitted") ? ["--uncommitted"] : []),
354
407
  ...(since !== undefined ? ["--since", since] : []),
355
408
  ...atArgs,
356
409
  "--json",
@@ -413,10 +466,12 @@ export interface WorkspaceTool {
413
466
  export function createWorkspaceTools(options: WorkspaceToolsOptions): WorkspaceTool[] {
414
467
  const { cwd } = options;
415
468
  const chant = options.chantCommand ?? ownChantCommand();
469
+ const agent = options.agent ?? (process.env[AGENT_ENV] || undefined);
416
470
  const reads: WorkspaceTool[] = workspaceReadTools.map((definition) => ({
417
471
  definition,
418
472
  handler: async (params) => {
419
- const argv = readArgv(definition.name, params);
473
+ const given = definition.name === "workspace-agent" && params.name === undefined && agent !== undefined ? { ...params, name: agent } : params;
474
+ const argv = readArgv(definition.name, given);
420
475
  const id = definition.name === "workspace-records" ? str(params, "id") : undefined;
421
476
  const doc = await runRead(chant, argv, cwd);
422
477
  return id !== undefined ? onlyRecord(doc, id) : doc;
@@ -446,6 +501,7 @@ export function createWorkspaceTools(options: WorkspaceToolsOptions): WorkspaceT
446
501
  sign: sign(params),
447
502
  dryRun: bool(params, "dryRun"),
448
503
  cwd,
504
+ agent,
449
505
  through: { source: mcpSource(context), opensInitial: true },
450
506
  });
451
507
  },
@@ -463,6 +519,7 @@ export function createWorkspaceTools(options: WorkspaceToolsOptions): WorkspaceT
463
519
  sign: sign(params),
464
520
  dryRun: bool(params, "dryRun"),
465
521
  cwd,
522
+ agent,
466
523
  through: { source: mcpSource(context) },
467
524
  });
468
525
  },
@@ -481,6 +538,7 @@ export function createWorkspaceTools(options: WorkspaceToolsOptions): WorkspaceT
481
538
  sign: sign(params),
482
539
  dryRun: bool(params, "dryRun"),
483
540
  cwd,
541
+ agent,
484
542
  });
485
543
  },
486
544
  "points-answer": async (params) => {
@@ -498,7 +556,7 @@ export function createWorkspaceTools(options: WorkspaceToolsOptions): WorkspaceT
498
556
  const named = str(params, "kind");
499
557
  const kind = named !== undefined ? w.resolveWriteKind(named, cwd) : await w.declaredSessionKind(RECORDS_CLOSE_SCHEMA_ID, cwd);
500
558
  if (typeof kind !== "string") return kind;
501
- return closeRecord({ kind, id, dryRun: bool(params, "dryRun"), cwd });
559
+ return closeRecord({ kind, id, dryRun: bool(params, "dryRun"), cwd, agent });
502
560
  },
503
561
  };
504
562