@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.
- package/dist/agents/checks.d.ts.map +1 -1
- package/dist/attrref.d.ts.map +1 -1
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/nginx.d.ts.map +1 -1
- package/dist/audit/prior-art.d.ts +48 -0
- package/dist/audit/prior-art.d.ts.map +1 -1
- package/dist/behaviour-kinds.d.ts.map +1 -1
- package/dist/build.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/cli/build-options.d.ts +2 -0
- package/dist/cli/build-options.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/carve-emit.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.d.ts +16 -0
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/import.d.ts +8 -0
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts +9 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
- package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
- package/dist/cli/handlers/dev.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +9 -0
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/lsp/server.d.ts.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/tools/build.d.ts.map +1 -1
- package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
- package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
- package/dist/cli/mcp/tools/import.d.ts.map +1 -1
- package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
- package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
- package/dist/cli/mcp/tools/search.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.d.ts +9 -1
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +33 -2
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/fetch.d.ts.map +1 -1
- package/dist/codegen/naming.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.d.ts +67 -3
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/registry.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/verbs/process-runner.d.ts.map +1 -1
- package/dist/components/verbs/r2-sync.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
- package/dist/components/verbs/sign.d.ts.map +1 -1
- package/dist/components/verbs/verify.d.ts.map +1 -1
- package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
- package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
- package/dist/components/verbs/wrangler.d.ts.map +1 -1
- package/dist/composite.d.ts.map +1 -1
- package/dist/config.d.ts +30 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/declarable.d.ts +16 -0
- package/dist/declarable.d.ts.map +1 -1
- package/dist/discovery/cache.d.ts.map +1 -1
- package/dist/discovery/fold-import.d.ts +15 -5
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/param-deps.d.ts +16 -0
- package/dist/discovery/param-deps.d.ts.map +1 -1
- package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
- package/dist/discovery/specifier-resolve.d.ts +37 -0
- package/dist/discovery/specifier-resolve.d.ts.map +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/fold/fold.d.ts +3 -1
- package/dist/fold/fold.d.ts.map +1 -1
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-layout.d.ts.map +1 -1
- package/dist/import/base-parser.d.ts.map +1 -1
- package/dist/import/embedded.d.ts +7 -0
- package/dist/import/embedded.d.ts.map +1 -1
- package/dist/import/parser-options.d.ts +14 -0
- package/dist/import/parser-options.d.ts.map +1 -0
- package/dist/import/parser.d.ts +17 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/kubectl-context.d.ts.map +1 -1
- package/dist/lexicon-output.d.ts.map +1 -1
- package/dist/lexicon-schema.d.ts +3 -3
- package/dist/lexicon.d.ts +78 -3
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/assert-live.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +15 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/member-ledger.d.ts.map +1 -1
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/plan-digest.d.ts +26 -5
- package/dist/lifecycle/plan-digest.d.ts.map +1 -1
- package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/scenario.d.ts.map +1 -1
- package/dist/lifecycle/status.d.ts.map +1 -1
- package/dist/lifecycle/work-lease.d.ts +61 -2
- package/dist/lifecycle/work-lease.d.ts.map +1 -1
- package/dist/lint/config.d.ts +4 -4
- package/dist/lint/engine.d.ts +6 -0
- package/dist/lint/engine.d.ts.map +1 -1
- package/dist/lsp/lexicon-providers.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.d.ts +12 -11
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/apply.d.ts +79 -9
- package/dist/op/activities/apply.d.ts.map +1 -1
- package/dist/op/activities/decide.d.ts.map +1 -1
- package/dist/op/activities/index.d.ts +1 -1
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
- package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
- package/dist/op/activities/propose-upgrade.d.ts +2 -0
- package/dist/op/activities/propose-upgrade.d.ts.map +1 -1
- package/dist/op/activity-contract.d.ts +1 -1
- package/dist/op/activity-failure.d.ts.map +1 -1
- package/dist/op/activity-profiles.d.ts.map +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/composites/apply-op.d.ts +12 -5
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
- package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
- package/dist/op/decide-backend.d.ts.map +1 -1
- package/dist/op/decide-read-inputs.d.ts.map +1 -1
- package/dist/op/emulator-lifecycle.d.ts +21 -2
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/gate-approval.d.ts +5 -1
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-wait.d.ts.map +1 -1
- package/dist/op/gate.d.ts +19 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/index.d.ts +3 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +6 -0
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/operator.d.ts.map +1 -1
- package/dist/op/run-context.d.ts +39 -0
- package/dist/op/run-context.d.ts.map +1 -0
- package/dist/op/run-live.d.ts.map +1 -1
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/op/source-archive.d.ts.map +1 -1
- package/dist/op/steward-beside.d.ts.map +1 -1
- package/dist/op/steward-points.d.ts.map +1 -1
- package/dist/op/steward.d.ts.map +1 -1
- package/dist/op/types.d.ts +8 -3
- package/dist/op/types.d.ts.map +1 -1
- package/dist/op/work-lease-run.d.ts +24 -4
- package/dist/op/work-lease-run.d.ts.map +1 -1
- package/dist/project-root.d.ts.map +1 -1
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -1
- package/dist/pseudo-parameter.d.ts.map +1 -1
- package/dist/reconcile.d.ts.map +1 -1
- package/dist/secret-materialization.d.ts.map +1 -1
- package/dist/serializer.d.ts +8 -0
- package/dist/serializer.d.ts.map +1 -1
- package/dist/telemetry-attribution.d.ts +77 -0
- package/dist/telemetry-attribution.d.ts.map +1 -0
- package/dist/terraform/emit-source.d.ts.map +1 -1
- package/dist/terraform/parse.d.ts.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
- package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
- package/dist/workspace/agent-cli.d.ts +88 -0
- package/dist/workspace/agent-cli.d.ts.map +1 -0
- package/dist/workspace/box-factory.d.ts +73 -0
- package/dist/workspace/box-factory.d.ts.map +1 -0
- package/dist/workspace/changes-cli.d.ts.map +1 -1
- package/dist/workspace/changes.d.ts +8 -1
- package/dist/workspace/changes.d.ts.map +1 -1
- package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
- package/dist/workspace/checks/boxes.d.ts.map +1 -1
- package/dist/workspace/checks/links.d.ts +1 -0
- package/dist/workspace/checks/links.d.ts.map +1 -1
- package/dist/workspace/checks/live.d.ts +40 -0
- package/dist/workspace/checks/live.d.ts.map +1 -0
- package/dist/workspace/checks.d.ts +26 -2
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/compose-graph.d.ts +73 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/conformance/index.d.ts +67 -6
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/vitest.d.ts +12 -3
- package/dist/workspace/conformance/vitest.d.ts.map +1 -1
- package/dist/workspace/conformance/writer.d.ts +368 -0
- package/dist/workspace/conformance/writer.d.ts.map +1 -0
- package/dist/workspace/decide.d.ts +1 -1
- package/dist/workspace/decide.d.ts.map +1 -1
- package/dist/workspace/declaration.d.ts +119 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.schema.json +368 -4
- package/dist/workspace/export-cli.d.ts +12 -0
- package/dist/workspace/export-cli.d.ts.map +1 -0
- package/dist/workspace/export.d.ts +145 -0
- package/dist/workspace/export.d.ts.map +1 -0
- package/dist/workspace/generated-files.d.ts.map +1 -1
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cli.d.ts +2 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/identity.d.ts +111 -0
- package/dist/workspace/identity.d.ts.map +1 -0
- package/dist/workspace/import.d.ts +73 -0
- package/dist/workspace/import.d.ts.map +1 -0
- package/dist/workspace/intent-cli.d.ts +7 -4
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-record.d.ts +8 -1
- package/dist/workspace/intent-record.d.ts.map +1 -1
- package/dist/workspace/intent.d.ts +149 -5
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/kinds.d.ts +24 -6
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/lineage-adopt-cli.d.ts +15 -0
- package/dist/workspace/lineage-adopt-cli.d.ts.map +1 -0
- package/dist/workspace/lineage-adopt.d.ts +106 -0
- package/dist/workspace/lineage-adopt.d.ts.map +1 -0
- package/dist/workspace/lineage-check.d.ts +9 -2
- package/dist/workspace/lineage-check.d.ts.map +1 -1
- package/dist/workspace/lineage-cli.d.ts +6 -1
- package/dist/workspace/lineage-cli.d.ts.map +1 -1
- package/dist/workspace/lineage-hash-index.d.ts +110 -0
- package/dist/workspace/lineage-hash-index.d.ts.map +1 -0
- package/dist/workspace/lineage-init.d.ts +10 -0
- package/dist/workspace/lineage-init.d.ts.map +1 -1
- package/dist/workspace/lineage-lock.d.ts +149 -2
- package/dist/workspace/lineage-lock.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.d.ts +15 -3
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-provenance.d.ts +18 -0
- package/dist/workspace/lineage-provenance.d.ts.map +1 -0
- package/dist/workspace/lineage-upgrade-cli.d.ts +2 -0
- package/dist/workspace/lineage-upgrade-cli.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.d.ts +30 -1
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/lineage-versions.d.ts +116 -0
- package/dist/workspace/lineage-versions.d.ts.map +1 -0
- package/dist/workspace/links.d.ts +31 -5
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/ls-generated.d.ts +37 -0
- package/dist/workspace/ls-generated.d.ts.map +1 -0
- package/dist/workspace/ls.d.ts +4 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/nested-graph.d.ts +56 -0
- package/dist/workspace/nested-graph.d.ts.map +1 -0
- package/dist/workspace/nesting.d.ts +21 -0
- package/dist/workspace/nesting.d.ts.map +1 -0
- package/dist/workspace/pin-cli.d.ts +10 -0
- package/dist/workspace/pin-cli.d.ts.map +1 -0
- package/dist/workspace/pin-integrity.d.ts +51 -0
- package/dist/workspace/pin-integrity.d.ts.map +1 -0
- package/dist/workspace/points.d.ts.map +1 -1
- package/dist/workspace/principal-classes.d.ts +114 -0
- package/dist/workspace/principal-classes.d.ts.map +1 -0
- package/dist/workspace/reason-codes.d.ts +47 -3
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/record-assets.d.ts.map +1 -1
- package/dist/workspace/record-sessions.d.ts +7 -11
- package/dist/workspace/record-sessions.d.ts.map +1 -1
- package/dist/workspace/records-checkout.d.ts +54 -0
- package/dist/workspace/records-checkout.d.ts.map +1 -0
- package/dist/workspace/records-cli.d.ts +57 -2
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-close.d.ts +5 -2
- package/dist/workspace/records-close.d.ts.map +1 -1
- package/dist/workspace/records-since.d.ts.map +1 -1
- package/dist/workspace/records-write.d.ts +23 -4
- package/dist/workspace/records-write.d.ts.map +1 -1
- package/dist/workspace/records.d.ts +58 -5
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/returns.d.ts +129 -0
- package/dist/workspace/returns.d.ts.map +1 -0
- package/dist/workspace/runs-cli.d.ts +164 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -0
- package/dist/workspace/runs.d.ts +423 -0
- package/dist/workspace/runs.d.ts.map +1 -0
- package/dist/workspace/source-block.d.ts +1 -1
- package/dist/workspace/source-block.d.ts.map +1 -1
- package/dist/workspace/status-gates.d.ts +15 -3
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +10 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/symbols.d.ts +52 -0
- package/dist/workspace/symbols.d.ts.map +1 -0
- package/dist/workspace/template-manifest.d.ts +11 -3
- package/dist/workspace/template-manifest.d.ts.map +1 -1
- package/dist/workspace/trailer-joins.d.ts +46 -0
- package/dist/workspace/trailer-joins.d.ts.map +1 -0
- package/dist/workspace/trailers.d.ts +89 -0
- package/dist/workspace/trailers.d.ts.map +1 -0
- package/dist/workspace/trust/attestor.d.ts +8 -0
- package/dist/workspace/trust/attestor.d.ts.map +1 -1
- package/dist/workspace/trust/dsse.d.ts +58 -0
- package/dist/workspace/trust/dsse.d.ts.map +1 -0
- package/dist/workspace/trust/evidence-cli.d.ts +66 -0
- package/dist/workspace/trust/evidence-cli.d.ts.map +1 -0
- package/dist/workspace/trust/evidence.d.ts +93 -0
- package/dist/workspace/trust/evidence.d.ts.map +1 -0
- package/dist/workspace/trust/policy.d.ts +54 -1
- package/dist/workspace/trust/policy.d.ts.map +1 -1
- package/dist/workspace/trust/provenance.d.ts +21 -1
- package/dist/workspace/trust/provenance.d.ts.map +1 -1
- package/dist/workspace/trust/rotation.d.ts +132 -0
- package/dist/workspace/trust/rotation.d.ts.map +1 -0
- package/dist/workspace/trust/seal.d.ts +33 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/signers-cli.d.ts +49 -0
- package/dist/workspace/trust/signers-cli.d.ts.map +1 -0
- package/dist/workspace/trust/ssh-commit.d.ts +12 -0
- package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
- package/dist/workspace/trust/test-repo.d.ts +13 -0
- package/dist/workspace/trust/test-repo.d.ts.map +1 -1
- package/dist/workspace/trust/verify.d.ts +15 -0
- package/dist/workspace/trust/verify.d.ts.map +1 -1
- package/dist/workspace/work-cli.d.ts +39 -3
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-evidence.d.ts +1 -1
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work.d.ts +26 -1
- package/dist/workspace/work.d.ts.map +1 -1
- package/dist/workspace/workspace-principals.schema.json +60 -0
- package/dist/workspace/write-scope.d.ts +259 -0
- package/dist/workspace/write-scope.d.ts.map +1 -0
- package/dist/yaml.d.ts +21 -39
- package/dist/yaml.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/audit/prior-art.ts +15 -0
- package/src/build.ts +8 -0
- package/src/cli/build-options.ts +4 -1
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
- package/src/cli/commands/build.ts +2 -0
- package/src/cli/commands/carve-emit-state.test.ts +4 -0
- package/src/cli/commands/carve-emit.ts +5 -19
- package/src/cli/commands/check-lexicon.test.ts +62 -1
- package/src/cli/commands/check-lexicon.ts +36 -6
- package/src/cli/commands/import-live.test.ts +87 -1
- package/src/cli/commands/import-parser-options.test.ts +133 -0
- package/src/cli/commands/import.ts +69 -25
- package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
- package/src/cli/commands/init.test.ts +8 -1
- package/src/cli/commands/init.ts +23 -8
- package/src/cli/commands/lint.test.ts +37 -0
- package/src/cli/commands/onboard.test.ts +53 -3
- package/src/cli/commands/onboard.ts +52 -4
- package/src/cli/commands/pinned-upgrade.ts +73 -33
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
- package/src/cli/handlers/components.ts +2 -2
- package/src/cli/handlers/dev.ts +8 -6
- package/src/cli/handlers/fan-out.test.ts +6 -6
- package/src/cli/handlers/fan-out.ts +2 -1
- package/src/cli/handlers/graph.test.ts +42 -0
- package/src/cli/handlers/graph.ts +22 -0
- package/src/cli/handlers/lifecycle.test.ts +67 -0
- package/src/cli/handlers/lifecycle.ts +6 -5
- package/src/cli/handlers/misc.ts +2 -0
- package/src/cli/handlers/operator.ts +88 -4
- package/src/cli/handlers/run.test.ts +111 -0
- package/src/cli/handlers/run.ts +85 -24
- package/src/cli/handlers/scenario.ts +2 -2
- package/src/cli/main.test.ts +33 -0
- package/src/cli/main.ts +168 -17
- package/src/cli/mcp/workspace-tools.test.ts +5 -2
- package/src/cli/mcp/workspace-tools.ts +62 -4
- package/src/cli/registry.ts +33 -2
- package/src/cli/serve-mcp-workspace.test.ts +1 -1
- package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
- package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
- package/src/codegen/pinned-upgrade.test.ts +104 -0
- package/src/codegen/pinned-upgrade.ts +250 -56
- package/src/codegen/release-wiring.test.ts +5 -1
- package/src/codegen/testdata/postgres-tags.json +242 -0
- package/src/components/fan-out-output.test.ts +1 -1
- package/src/components/fan-out.test.ts +1 -1
- package/src/components/promote.test.ts +1 -1
- package/src/config.test.ts +21 -0
- package/src/config.ts +27 -0
- package/src/content-digest.test.ts +2 -2
- package/src/declarable.test.ts +21 -0
- package/src/declarable.ts +19 -0
- package/src/discovery/fold-composite.test.ts +41 -5
- package/src/discovery/fold-import.test.ts +129 -0
- package/src/discovery/fold-import.ts +643 -131
- package/src/discovery/fold-package-composite.test.ts +264 -0
- package/src/discovery/fold-specifiers.test.ts +191 -0
- package/src/discovery/param-deps.test.ts +66 -1
- package/src/discovery/param-deps.ts +45 -0
- package/src/discovery/specifier-resolve.ts +344 -0
- package/src/fold/fold.test.ts +39 -1
- package/src/fold/fold.ts +83 -9
- package/src/fold-provenance.test.ts +140 -0
- package/src/graph-ir.test.ts +83 -0
- package/src/graph-ir.ts +29 -0
- package/src/import/embedded.test.ts +20 -0
- package/src/import/embedded.ts +13 -0
- package/src/import/parser-options.ts +46 -0
- package/src/import/parser.ts +20 -0
- package/src/lexicon.ts +79 -3
- package/src/lifecycle/gate-ledger.test.ts +14 -0
- package/src/lifecycle/gate-ledger.ts +18 -1
- package/src/lifecycle/observe.test.ts +18 -0
- package/src/lifecycle/observe.ts +6 -4
- package/src/lifecycle/plan-digest.test.ts +54 -3
- package/src/lifecycle/plan-digest.ts +38 -8
- package/src/lifecycle/snapshot.ts +2 -2
- package/src/lifecycle/work-lease.test.ts +1 -1
- package/src/lifecycle/work-lease.ts +93 -2
- package/src/lint/engine.test.ts +55 -0
- package/src/lint/engine.ts +30 -4
- package/src/lint/output-docs.test.ts +59 -56
- package/src/op/activities/activity-contracts.ts +1 -0
- package/src/op/activities/apply.test.ts +189 -5
- package/src/op/activities/apply.ts +230 -8
- package/src/op/activities/index.ts +3 -0
- package/src/op/activities/lexicon-upgrade.test.ts +160 -6
- package/src/op/activities/lexicon-upgrade.ts +154 -51
- package/src/op/activities/propose-upgrade.ts +8 -5
- package/src/op/composites/apply-op.ts +12 -5
- package/src/op/composites/composites.test.ts +30 -3
- package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
- package/src/op/composites/lexicon-upgrade-op.ts +29 -8
- package/src/op/emulator-lifecycle.test.ts +23 -0
- package/src/op/emulator-lifecycle.ts +52 -14
- package/src/op/gate-approval.test.ts +91 -0
- package/src/op/gate-approval.ts +5 -1
- package/src/op/gate.ts +34 -8
- package/src/op/index.ts +3 -1
- package/src/op/local-executor.test.ts +15 -0
- package/src/op/local-executor.ts +40 -12
- package/src/op/local-output.ts +1 -1
- package/src/op/operator.ts +4 -0
- package/src/op/run-context.test.ts +141 -0
- package/src/op/run-context.ts +51 -0
- package/src/op/runtimes/local.test.ts +14 -0
- package/src/op/runtimes/local.ts +2 -0
- package/src/op/steward-beside.ts +2 -0
- package/src/op/types.ts +8 -3
- package/src/op/work-lease-run.test.ts +47 -0
- package/src/op/work-lease-run.ts +73 -11
- package/src/provenance.ts +35 -0
- package/src/serializer.ts +9 -0
- package/src/telemetry-attribution.test.ts +91 -0
- package/src/telemetry-attribution.ts +145 -0
- package/src/workspace/__fixtures__/studio-template-84c8b21.json +1 -1
- package/src/workspace/agent-cli.ts +138 -0
- package/src/workspace/agent.schema.json +378 -0
- package/src/workspace/behold-kinds.test.ts +1 -1
- package/src/workspace/box-factory.test.ts +320 -0
- package/src/workspace/box-factory.ts +103 -0
- package/src/workspace/changes-cli.ts +5 -0
- package/src/workspace/changes.schema.json +171 -1
- package/src/workspace/changes.ts +61 -4
- package/src/workspace/check-live.test.ts +192 -0
- package/src/workspace/check.schema.json +64 -0
- package/src/workspace/checks/boxes.test.ts +2 -0
- package/src/workspace/checks/links.ts +23 -2
- package/src/workspace/checks/live.ts +113 -0
- package/src/workspace/checks.test.ts +2 -2
- package/src/workspace/checks.ts +49 -8
- package/src/workspace/compose-graph.test.ts +47 -0
- package/src/workspace/compose-graph.ts +127 -3
- package/src/workspace/conformance/__fixture__/decisions/decision.kind.mjs +7 -1
- package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +5 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +27 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +95 -0
- package/src/workspace/conformance/__writer_fixture__/decisions/points.json +132 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +48 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +108 -0
- package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +578 -0
- package/src/workspace/conformance/conformance.e2e.test.ts +35 -3
- package/src/workspace/conformance/index.mjs +30 -3
- package/src/workspace/conformance/index.ts +103 -15
- package/src/workspace/conformance/vitest.ts +44 -2
- package/src/workspace/conformance/writer-conformance.e2e.test.ts +131 -0
- package/src/workspace/conformance/writer.test.ts +156 -0
- package/src/workspace/conformance/writer.ts +880 -0
- package/src/workspace/decide.ts +7 -1
- package/src/workspace/declaration.schema.json +368 -4
- package/src/workspace/declaration.ts +270 -1
- package/src/workspace/declared-kinds.test.ts +33 -0
- package/src/workspace/evidence.schema.json +279 -0
- package/src/workspace/export-cli.ts +180 -0
- package/src/workspace/export-import.test.ts +282 -0
- package/src/workspace/export.ts +486 -0
- package/src/workspace/graph-cli.ts +51 -2
- package/src/workspace/graph-contract.test.ts +89 -4
- package/src/workspace/graph.schema.json +453 -1
- package/src/workspace/identity.test.ts +196 -0
- package/src/workspace/identity.ts +186 -0
- package/src/workspace/import.ts +325 -0
- package/src/workspace/intent-cli.ts +64 -10
- package/src/workspace/intent-record.schema.json +208 -0
- package/src/workspace/intent-record.ts +35 -1
- package/src/workspace/intent-why.test.ts +274 -0
- package/src/workspace/intent.schema.json +718 -7
- package/src/workspace/intent.test.ts +11 -2
- package/src/workspace/intent.ts +495 -32
- package/src/workspace/kinds.test.ts +5 -5
- package/src/workspace/kinds.ts +62 -33
- package/src/workspace/lineage-adopt-cli.ts +103 -0
- package/src/workspace/lineage-adopt.test.ts +552 -0
- package/src/workspace/lineage-adopt.ts +452 -0
- package/src/workspace/lineage-check.ts +26 -5
- package/src/workspace/lineage-cli.ts +12 -2
- package/src/workspace/lineage-hash-index.ts +305 -0
- package/src/workspace/lineage-init.test.ts +9 -0
- package/src/workspace/lineage-init.ts +29 -9
- package/src/workspace/lineage-lock.ts +54 -0
- package/src/workspace/lineage-migrations.test.ts +27 -0
- package/src/workspace/lineage-migrations.ts +44 -14
- package/src/workspace/lineage-provenance.ts +40 -0
- package/src/workspace/lineage-upgrade-cli.ts +9 -5
- package/src/workspace/lineage-upgrade.test.ts +92 -1
- package/src/workspace/lineage-upgrade.ts +111 -16
- package/src/workspace/lineage-versions.ts +348 -0
- package/src/workspace/links.test.ts +121 -2
- package/src/workspace/links.ts +97 -6
- package/src/workspace/ls-contract.test.ts +84 -1
- package/src/workspace/ls-generated.ts +111 -0
- package/src/workspace/ls.schema.json +19 -0
- package/src/workspace/ls.ts +8 -1
- package/src/workspace/member-commands.ts +3 -1
- package/src/workspace/nested-graph.test.ts +176 -0
- package/src/workspace/nested-graph.ts +169 -0
- package/src/workspace/nesting.ts +37 -0
- package/src/workspace/pin-cli.test.ts +71 -0
- package/src/workspace/pin-cli.ts +57 -0
- package/src/workspace/pin-integrity.test.ts +121 -0
- package/src/workspace/pin-integrity.ts +104 -0
- package/src/workspace/points-write.schema.json +2 -0
- package/src/workspace/principal-classes.test.ts +175 -0
- package/src/workspace/principal-classes.ts +307 -0
- package/src/workspace/read-contract.test.ts +24 -0
- package/src/workspace/reason-codes.test.ts +20 -2
- package/src/workspace/reason-codes.ts +53 -3
- package/src/workspace/record-sessions.ts +12 -14
- package/src/workspace/records-amend.schema.json +6 -0
- package/src/workspace/records-checkout.ts +106 -0
- package/src/workspace/records-cli.ts +195 -22
- package/src/workspace/records-close.schema.json +7 -2
- package/src/workspace/records-close.ts +10 -2
- package/src/workspace/records-formats.test.ts +13 -5
- package/src/workspace/records-new.schema.json +6 -0
- package/src/workspace/records-review.schema.json +6 -0
- package/src/workspace/records-sessions.test.ts +23 -6
- package/src/workspace/records-uncommitted.test.ts +171 -0
- package/src/workspace/records-write.test.ts +65 -8
- package/src/workspace/records-write.ts +92 -6
- package/src/workspace/records.schema.json +127 -4
- package/src/workspace/records.ts +123 -5
- package/src/workspace/returns.ts +328 -0
- package/src/workspace/runs-cli.ts +381 -0
- package/src/workspace/runs-write.schema.json +583 -0
- package/src/workspace/runs.schema.json +810 -0
- package/src/workspace/runs.test.ts +242 -0
- package/src/workspace/runs.ts +709 -0
- package/src/workspace/signers.schema.json +206 -0
- package/src/workspace/status-contract.test.ts +5 -0
- package/src/workspace/status-gates.ts +24 -9
- package/src/workspace/status.schema.json +127 -2
- package/src/workspace/status.ts +21 -1
- package/src/workspace/symbols.ts +180 -0
- package/src/workspace/template-manifest.ts +22 -4
- package/src/workspace/trailer-joins.test.ts +171 -0
- package/src/workspace/trailer-joins.ts +82 -0
- package/src/workspace/trailers.ts +148 -0
- package/src/workspace/trust/attestor.ts +15 -0
- package/src/workspace/trust/dsse.ts +134 -0
- package/src/workspace/trust/evidence-cli.ts +195 -0
- package/src/workspace/trust/evidence.test.ts +241 -0
- package/src/workspace/trust/evidence.ts +207 -0
- package/src/workspace/trust/policy.ts +110 -3
- package/src/workspace/trust/provenance.ts +41 -4
- package/src/workspace/trust/record-seal.test.ts +1 -1
- package/src/workspace/trust/rotation.test.ts +258 -0
- package/src/workspace/trust/rotation.ts +336 -0
- package/src/workspace/trust/seal.ts +63 -1
- package/src/workspace/trust/signers-cli.ts +178 -0
- package/src/workspace/trust/ssh-commit.ts +53 -4
- package/src/workspace/trust/test-repo.ts +18 -0
- package/src/workspace/trust/trust.test.ts +8 -2
- package/src/workspace/trust/verify-cli.ts +1 -0
- package/src/workspace/trust/verify.ts +22 -0
- package/src/workspace/work-cli.e2e.test.ts +28 -1
- package/src/workspace/work-cli.ts +133 -8
- package/src/workspace/work-evidence.schema.json +6 -0
- package/src/workspace/work-history.schema.json +73 -1
- package/src/workspace/work-history.test.ts +48 -5
- package/src/workspace/work-kind-fields.test.ts +154 -0
- package/src/workspace/work-lease.schema.json +14 -1
- package/src/workspace/work.ts +82 -0
- package/src/workspace/workspace-principals.schema.json +60 -0
- package/src/workspace/write-scope.test.ts +466 -0
- package/src/workspace/write-scope.ts +573 -0
- package/src/yaml.test.ts +111 -1
- package/src/yaml.ts +141 -549
package/src/cli/main.test.ts
CHANGED
|
@@ -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 <
|
|
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
|
|
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
|
-
|
|
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>
|
|
1070
|
-
|
|
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
|
|
1114
|
-
|
|
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
|
|
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
|
|
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
|
|