@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
|
@@ -107,6 +107,72 @@ export interface ChangesPolicy {
|
|
|
107
107
|
ignore: string[];
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
/** The core principal classes (#2524 D5). A pinned package may supply domain classes too (#3080, `principal-classes.ts`). */
|
|
111
|
+
export const PRINCIPAL_CLASSES = ["human", "agent", "runner", "service"] as const;
|
|
112
|
+
export type CorePrincipalClass = (typeof PRINCIPAL_CLASSES)[number];
|
|
113
|
+
/** A class name: a core class, or a domain class a pinned package supplies (#3080). */
|
|
114
|
+
export type PrincipalClass = string;
|
|
115
|
+
|
|
116
|
+
/** How a record is written, as the records commands name it (#2548). */
|
|
117
|
+
export const WRITE_VERBS = ["new", "amend", "review", "close"] as const;
|
|
118
|
+
export type WriteVerb = (typeof WRITE_VERBS)[number];
|
|
119
|
+
|
|
120
|
+
/** One principal class's entry in the declaration's `writeScope` (#2548, ws-067). */
|
|
121
|
+
export interface ClassScope {
|
|
122
|
+
/** The members whose files the class may write, or null for every path. Always null for the agent class: a session writes its own member. */
|
|
123
|
+
members: string[] | null;
|
|
124
|
+
/** Kind name to the verbs the class may write it with, or null for every kind in reach with every verb. */
|
|
125
|
+
records: Record<string, WriteVerb[]> | null;
|
|
126
|
+
/** Paths the class may not write even inside a member it may (#3146, ws-077), in file order. Empty when the entry lists none. */
|
|
127
|
+
protected: ProtectedPath[];
|
|
128
|
+
pointer: string;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* A protected path in a write scope (#3146, ws-077): a glob from the
|
|
133
|
+
* workspace root. It protects the files it matches and everything under a
|
|
134
|
+
* directory it matches. `except` names top-level keys of a JSON file a write
|
|
135
|
+
* may still change; empty when the entry allows none.
|
|
136
|
+
*/
|
|
137
|
+
export interface ProtectedPath {
|
|
138
|
+
path: string;
|
|
139
|
+
except: string[];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* The declaration's `writeScope` block: an entry per restricted class, in
|
|
144
|
+
* file order. A class with no entry is not restricted. A key may name a
|
|
145
|
+
* domain class a pinned package supplies (#3080); whether one does is known
|
|
146
|
+
* only once the pins are read, so an unknown key is judged where the scope
|
|
147
|
+
* is applied, not here.
|
|
148
|
+
*/
|
|
149
|
+
export type WriteScope = Record<PrincipalClass, ClassScope>;
|
|
150
|
+
|
|
151
|
+
/** A gate the declaration's `identity.gates` names (#3163, ws-080): it passes only on a signed approval. */
|
|
152
|
+
export interface SignedGate {
|
|
153
|
+
gate: string;
|
|
154
|
+
/** The class the signer must be in, or null for any signer the signers file at base lists. */
|
|
155
|
+
class: PrincipalClass | null;
|
|
156
|
+
pointer: string;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** The declaration's `identity` block (#3163, ws-080), read at base. */
|
|
160
|
+
export interface IdentityPolicy {
|
|
161
|
+
/** `identified`: a person-attributed write must name a forge identity, a signer at base, or an agent, runner or service principal. */
|
|
162
|
+
attribution: "any" | "identified";
|
|
163
|
+
/** By gate name. */
|
|
164
|
+
gates: Record<string, SignedGate>;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** An agent session the declaration names (#2524 D20, #2548): bound to one member. */
|
|
168
|
+
export interface AgentDeclaration {
|
|
169
|
+
name: string;
|
|
170
|
+
member: string;
|
|
171
|
+
/** Principals that write only as this session. */
|
|
172
|
+
principals: string[];
|
|
173
|
+
pointer: string;
|
|
174
|
+
}
|
|
175
|
+
|
|
110
176
|
export interface MemberRole {
|
|
111
177
|
name: string;
|
|
112
178
|
/** Relative to the member's directory, or null for the whole member. */
|
|
@@ -135,6 +201,8 @@ export interface LinkDeclaration {
|
|
|
135
201
|
output: string;
|
|
136
202
|
/** The link kind as written, or null for the default (`output`). */
|
|
137
203
|
kind: string | null;
|
|
204
|
+
/** A telemetry link's OTLP protocol as written (#2558), or null. */
|
|
205
|
+
protocol: string | null;
|
|
138
206
|
/** The link's JSON Pointer in the file, for messages. */
|
|
139
207
|
pointer: string;
|
|
140
208
|
}
|
|
@@ -223,10 +291,63 @@ export interface BoxDeclaration {
|
|
|
223
291
|
* `spriteApplyServices` read them with `box: true`.
|
|
224
292
|
*/
|
|
225
293
|
services: BoxService[];
|
|
294
|
+
/** What the box builds and how (#3146, ws-077), or null when the block declares no factory. */
|
|
295
|
+
factory: BoxFactory | null;
|
|
296
|
+
/** What the box shows of itself on a home site (#3146), or null when the block declares no listing. */
|
|
297
|
+
listing: BoxListing | null;
|
|
298
|
+
/** The block's JSON Pointer in the file, for messages. */
|
|
299
|
+
pointer: string;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** What a check command is (#3146). */
|
|
303
|
+
export const FACTORY_CHECK_KINDS = ["test", "build", "lint", "plan", "conformance"] as const;
|
|
304
|
+
export type FactoryCheckKind = (typeof FACTORY_CHECK_KINDS)[number];
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* A box's factory (#3146, ws-077): what it builds, how a build is checked,
|
|
308
|
+
* which member declares the builder agents and where a finished build is
|
|
309
|
+
* published. Defaults are filled in, so a reader never guesses one.
|
|
310
|
+
*/
|
|
311
|
+
export interface BoxFactory {
|
|
312
|
+
/** The members the factory builds, in file order; at least one. */
|
|
313
|
+
builds: string[];
|
|
314
|
+
/** The verdict command, run from the workspace root, or null when none is declared. */
|
|
315
|
+
check: { run: string; kind: FactoryCheckKind } | null;
|
|
316
|
+
/** Where a work item's builder writes its check, from the workspace root, or null for the orchestrator's choice. */
|
|
317
|
+
checks: string | null;
|
|
318
|
+
/** The member that declares the builder agents, or null when none is named. */
|
|
319
|
+
builders: string | null;
|
|
320
|
+
/** Where a finished build is published, or null when the factory doesn't publish past the box. */
|
|
321
|
+
publish: FactoryPublish | null;
|
|
226
322
|
/** The block's JSON Pointer in the file, for messages. */
|
|
227
323
|
pointer: string;
|
|
228
324
|
}
|
|
229
325
|
|
|
326
|
+
/** Where a finished build goes (#3146): its branch is pushed and a pull request opened against `repo`'s `base`. */
|
|
327
|
+
export interface FactoryPublish {
|
|
328
|
+
forge: "github";
|
|
329
|
+
/** owner/name. */
|
|
330
|
+
repo: string;
|
|
331
|
+
/** The branch the pull request targets, or null for the repository's default branch. */
|
|
332
|
+
base: string | null;
|
|
333
|
+
/** What the published branch's name starts with, before the work item's id. */
|
|
334
|
+
branchPrefix: string;
|
|
335
|
+
/** The repository the branch is pushed to when it isn't `repo` (a fork), as owner/name, or null. */
|
|
336
|
+
head: string | null;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/** The branch prefix a publish target uses when it names none: the work lease's own branch. */
|
|
340
|
+
export const DEFAULT_PUBLISH_BRANCH_PREFIX = "chant/work/";
|
|
341
|
+
|
|
342
|
+
/** What a box shows of itself (#3146, #3154). */
|
|
343
|
+
export interface BoxListing {
|
|
344
|
+
published: boolean;
|
|
345
|
+
title: string;
|
|
346
|
+
line: string;
|
|
347
|
+
/** The cover image, from the workspace root, or null. */
|
|
348
|
+
cover: string | null;
|
|
349
|
+
}
|
|
350
|
+
|
|
230
351
|
/** A service a box runs under its supervisor (#2880). */
|
|
231
352
|
export interface BoxService {
|
|
232
353
|
/** Unique in the box. */
|
|
@@ -292,6 +413,8 @@ export interface Member {
|
|
|
292
413
|
box: BoxDeclaration | null;
|
|
293
414
|
upstream: string | null;
|
|
294
415
|
because: string | null;
|
|
416
|
+
/** Whether `chant workspace export` takes the member (#2552, D10). False when the entry does not say. */
|
|
417
|
+
travel: boolean;
|
|
295
418
|
suppress: Suppression[];
|
|
296
419
|
/** The entry's JSON Pointer in the file, for messages. */
|
|
297
420
|
pointer: string;
|
|
@@ -338,6 +461,12 @@ export interface Declaration {
|
|
|
338
461
|
hosts: Host[];
|
|
339
462
|
/** The forward coverage check's policy (#2773), or null when the declaration has no `changes` block. */
|
|
340
463
|
changes: ChangesPolicy | null;
|
|
464
|
+
/** Who may write what (#2548), or null when the declaration has no `writeScope` block. */
|
|
465
|
+
writeScope: WriteScope | null;
|
|
466
|
+
/** The agent sessions, in file order (#2548). */
|
|
467
|
+
agents: AgentDeclaration[];
|
|
468
|
+
/** Who a person-attributed write may name, and which gates need a signed approval (#3163), or null when the declaration has no `identity` block. */
|
|
469
|
+
identity: IdentityPolicy | null;
|
|
341
470
|
/** The file, relative to the workspace root's tree (`chant.workspace.json` or `.jsonc`). */
|
|
342
471
|
file: string;
|
|
343
472
|
}
|
|
@@ -543,10 +672,11 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
543
672
|
handWritten: g.handWritten ? { because: (g.handWritten as { because: string }).because } : null,
|
|
544
673
|
pointer: `${pointer}/generated/${j}`,
|
|
545
674
|
}));
|
|
546
|
-
const links = ((e.links as { member: string; output: string; kind?: string }[] | undefined) ?? []).map((l, j) => ({
|
|
675
|
+
const links = ((e.links as { member: string; output: string; kind?: string; protocol?: string }[] | undefined) ?? []).map((l, j) => ({
|
|
547
676
|
member: l.member,
|
|
548
677
|
output: l.output,
|
|
549
678
|
kind: l.kind ?? null,
|
|
679
|
+
protocol: l.protocol ?? null,
|
|
550
680
|
pointer: `${pointer}/links/${j}`,
|
|
551
681
|
}));
|
|
552
682
|
const records = recordKindsOf(e.records, e.dir as string, e.name as string, `${pointer}/records`);
|
|
@@ -566,6 +696,7 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
566
696
|
box,
|
|
567
697
|
upstream: (e.upstream as string | undefined) ?? null,
|
|
568
698
|
because: (e.because as string | undefined) ?? null,
|
|
699
|
+
travel: e.travel === true,
|
|
569
700
|
suppress,
|
|
570
701
|
pointer,
|
|
571
702
|
};
|
|
@@ -660,6 +791,9 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
660
791
|
const problem = m.box ? boxServicesProblem(m.name, m.box.services) : null;
|
|
661
792
|
if (problem) throw new WorkspaceReadError("declaration-invalid", problem.message, at(problem.pointer));
|
|
662
793
|
}
|
|
794
|
+
// One factory, building and naming declared members (#3146).
|
|
795
|
+
const factory = factoryProblem(members);
|
|
796
|
+
if (factory) throw new WorkspaceReadError("declaration-invalid", factory.message, at(factory.pointer));
|
|
663
797
|
|
|
664
798
|
// A diagram name is given once across the declaration (#2764): a reader keys diagrams by name.
|
|
665
799
|
const ownDiagrams = diagramsOf(obj.diagrams, null, "/diagrams");
|
|
@@ -673,6 +807,8 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
673
807
|
}
|
|
674
808
|
|
|
675
809
|
const hosts = hostsOf(obj, members, at);
|
|
810
|
+
const writeScope = writeScopeOf(obj.writeScope, members, at);
|
|
811
|
+
const agents = agentsOf(obj.agents, members, at);
|
|
676
812
|
|
|
677
813
|
const pins = ((obj.pins as Record<string, string>[] | undefined) ?? []).map((p) => ({
|
|
678
814
|
package: p.package ?? null,
|
|
@@ -695,10 +831,86 @@ export function parseDeclaration(text: string, file: string, reader: string = re
|
|
|
695
831
|
diagrams: ownDiagrams,
|
|
696
832
|
hosts,
|
|
697
833
|
changes: changesOf(obj.changes as Record<string, unknown> | undefined),
|
|
834
|
+
writeScope,
|
|
835
|
+
agents,
|
|
836
|
+
identity: identityOf(obj.identity),
|
|
698
837
|
file,
|
|
699
838
|
};
|
|
700
839
|
}
|
|
701
840
|
|
|
841
|
+
/**
|
|
842
|
+
* The `writeScope` block, already validated, with the rule the schema can't
|
|
843
|
+
* say (#2548): a member it names is a declared member. Its keys are kept in
|
|
844
|
+
* file order: the core classes and any domain class (#3080).
|
|
845
|
+
*/
|
|
846
|
+
function writeScopeOf(raw: unknown, members: Member[], at: (pointer: string, key?: boolean) => ErrorLocation): WriteScope | null {
|
|
847
|
+
if (raw === undefined) return null;
|
|
848
|
+
const block = raw as Record<PrincipalClass, { members?: "*" | string[]; records?: Record<string, WriteVerb[]>; protected?: (string | { path: string; except?: string[] })[] }>;
|
|
849
|
+
const out: WriteScope = {};
|
|
850
|
+
for (const [cls, entry] of Object.entries(block)) {
|
|
851
|
+
const pointer = `/writeScope/${cls}`;
|
|
852
|
+
const list = entry.members === undefined || entry.members === "*" ? null : [...entry.members];
|
|
853
|
+
for (const [i, name] of (list ?? []).entries()) {
|
|
854
|
+
if (!members.some((m) => m.name === name)) {
|
|
855
|
+
throw new WorkspaceReadError(
|
|
856
|
+
"declaration-invalid",
|
|
857
|
+
`writeScope.${cls} names the member ${JSON.stringify(name)}, which the declaration does not declare; declared members: ${members.map((m) => m.name).join(", ") || "none"}`,
|
|
858
|
+
at(`${pointer}/members/${i}`),
|
|
859
|
+
);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
const records = entry.records === undefined ? null : Object.fromEntries(Object.entries(entry.records).map(([k, v]) => [k, [...v]]));
|
|
863
|
+
const guarded = (entry.protected ?? []).map((p) => (typeof p === "string" ? { path: p, except: [] } : { path: p.path, except: [...(p.except ?? [])] }));
|
|
864
|
+
out[cls] = { members: list, records, protected: guarded, pointer };
|
|
865
|
+
}
|
|
866
|
+
return out;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
/**
|
|
870
|
+
* The `agents` list, already validated, with the rules the schema can't say
|
|
871
|
+
* (#2548): names are unique, each names a declared member, and a principal
|
|
872
|
+
* is listed by one session at most.
|
|
873
|
+
*/
|
|
874
|
+
/** The `identity` block, already validated by the schema (#3163). */
|
|
875
|
+
function identityOf(raw: unknown): IdentityPolicy | null {
|
|
876
|
+
if (raw === undefined) return null;
|
|
877
|
+
const block = raw as { attribution?: "any" | "identified"; gates?: Record<string, { class?: string }> };
|
|
878
|
+
const gates: Record<string, SignedGate> = {};
|
|
879
|
+
for (const [gate, entry] of Object.entries(block.gates ?? {})) {
|
|
880
|
+
gates[gate] = { gate, class: entry.class ?? null, pointer: `/identity/gates/${gate.replace(/~/g, "~0").replace(/\//g, "~1")}` };
|
|
881
|
+
}
|
|
882
|
+
return { attribution: block.attribution ?? "any", gates };
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
function agentsOf(raw: unknown, members: Member[], at: (pointer: string, key?: boolean) => ErrorLocation): AgentDeclaration[] {
|
|
886
|
+
const agents = ((raw as { name: string; member: string; principals?: string[] }[] | undefined) ?? []).map((a, i) => ({
|
|
887
|
+
name: a.name,
|
|
888
|
+
member: a.member,
|
|
889
|
+
principals: [...(a.principals ?? [])],
|
|
890
|
+
pointer: `/agents/${i}`,
|
|
891
|
+
}));
|
|
892
|
+
const byName = new Map<string, AgentDeclaration>();
|
|
893
|
+
const byPrincipal = new Map<string, AgentDeclaration>();
|
|
894
|
+
for (const a of agents) {
|
|
895
|
+
const first = byName.get(a.name);
|
|
896
|
+
if (first) throw new WorkspaceReadError("declaration-invalid", `the agent name ${JSON.stringify(a.name)} is already used by the agent at ${first.pointer}`, at(`${a.pointer}/name`));
|
|
897
|
+
byName.set(a.name, a);
|
|
898
|
+
if (!members.some((m) => m.name === a.member)) {
|
|
899
|
+
throw new WorkspaceReadError(
|
|
900
|
+
"declaration-invalid",
|
|
901
|
+
`agent ${a.name} is bound to ${JSON.stringify(a.member)}, which is not a declared member; an agent session is bound to one member, not an example group`,
|
|
902
|
+
at(`${a.pointer}/member`),
|
|
903
|
+
);
|
|
904
|
+
}
|
|
905
|
+
for (const [i, p] of a.principals.entries()) {
|
|
906
|
+
const other = byPrincipal.get(p);
|
|
907
|
+
if (other) throw new WorkspaceReadError("declaration-invalid", `the principal ${JSON.stringify(p)} is already listed by agent ${other.name}`, at(`${a.pointer}/principals/${i}`));
|
|
908
|
+
byPrincipal.set(p, a);
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
return agents;
|
|
912
|
+
}
|
|
913
|
+
|
|
702
914
|
/** The `changes` block, already validated, with its defaults (#2773). */
|
|
703
915
|
function changesOf(block: Record<string, unknown> | undefined): ChangesPolicy | null {
|
|
704
916
|
if (block === undefined) return null;
|
|
@@ -751,7 +963,17 @@ function boxOf(raw: unknown, pointer: string): BoxDeclaration | null {
|
|
|
751
963
|
cookies?: string[];
|
|
752
964
|
intent?: string;
|
|
753
965
|
services?: { name: string; cmd: string; needs?: string[]; httpPort?: number; duration?: string; health?: string; optional?: boolean }[];
|
|
966
|
+
factory?: {
|
|
967
|
+
builds: string[];
|
|
968
|
+
check?: string | { run: string; kind?: FactoryCheckKind };
|
|
969
|
+
checks?: string;
|
|
970
|
+
builders?: string;
|
|
971
|
+
publish?: { forge?: "github"; repo: string; base?: string; branchPrefix?: string; head?: string };
|
|
972
|
+
};
|
|
973
|
+
listing?: { published?: boolean; title?: string; line?: string; cover?: string };
|
|
754
974
|
};
|
|
975
|
+
const f = b.factory;
|
|
976
|
+
const l = b.listing;
|
|
755
977
|
return {
|
|
756
978
|
capabilities: (b.capabilities ?? []).map((c, i) => ({ name: c.name, broker: c.broker ?? null, scope: [...(c.scope ?? [])], pointer: `${pointer}/capabilities/${i}` })),
|
|
757
979
|
// The schema requires host and slot together, and host for ports, state and cookies.
|
|
@@ -770,10 +992,57 @@ function boxOf(raw: unknown, pointer: string): BoxDeclaration | null {
|
|
|
770
992
|
optional: s.optional ?? false,
|
|
771
993
|
pointer: `${pointer}/services/${i}`,
|
|
772
994
|
})),
|
|
995
|
+
factory:
|
|
996
|
+
f === undefined
|
|
997
|
+
? null
|
|
998
|
+
: {
|
|
999
|
+
builds: [...f.builds],
|
|
1000
|
+
check: f.check === undefined ? null : typeof f.check === "string" ? { run: f.check, kind: "test" } : { run: f.check.run, kind: f.check.kind ?? "test" },
|
|
1001
|
+
checks: f.checks ?? null,
|
|
1002
|
+
builders: f.builders ?? null,
|
|
1003
|
+
publish:
|
|
1004
|
+
f.publish === undefined
|
|
1005
|
+
? null
|
|
1006
|
+
: {
|
|
1007
|
+
forge: f.publish.forge ?? "github",
|
|
1008
|
+
repo: f.publish.repo,
|
|
1009
|
+
base: f.publish.base ?? null,
|
|
1010
|
+
branchPrefix: f.publish.branchPrefix ?? DEFAULT_PUBLISH_BRANCH_PREFIX,
|
|
1011
|
+
head: f.publish.head ?? null,
|
|
1012
|
+
},
|
|
1013
|
+
pointer: `${pointer}/factory`,
|
|
1014
|
+
},
|
|
1015
|
+
listing: l === undefined ? null : { published: l.published ?? true, title: l.title ?? "", line: l.line ?? "", cover: l.cover ?? null },
|
|
773
1016
|
pointer,
|
|
774
1017
|
};
|
|
775
1018
|
}
|
|
776
1019
|
|
|
1020
|
+
/**
|
|
1021
|
+
* The rules the schema can't say about the factories (#3146, ws-077): at most
|
|
1022
|
+
* one box block declares one, and the members its builds and builders name
|
|
1023
|
+
* are declared members.
|
|
1024
|
+
*/
|
|
1025
|
+
function factoryProblem(members: readonly Member[]): { message: string; pointer: string } | null {
|
|
1026
|
+
const declaring = members.filter((m) => m.box?.factory);
|
|
1027
|
+
if (declaring.length > 1) {
|
|
1028
|
+
return {
|
|
1029
|
+
message: `members ${declaring[0].name} and ${declaring[1].name} both declare a factory in their box block; a workspace has one factory, so an orchestrator reads one`,
|
|
1030
|
+
pointer: declaring[1].box!.factory!.pointer,
|
|
1031
|
+
};
|
|
1032
|
+
}
|
|
1033
|
+
const factory = declaring[0]?.box?.factory;
|
|
1034
|
+
if (!factory) return null;
|
|
1035
|
+
const known = () => members.map((m) => m.name).join(", ");
|
|
1036
|
+
const j = factory.builds.findIndex((name) => !members.some((m) => m.name === name));
|
|
1037
|
+
if (j >= 0) {
|
|
1038
|
+
return { message: `the factory builds ${JSON.stringify(factory.builds[j])}, which is not a declared member; declared members: ${known()}`, pointer: `${factory.pointer}/builds/${j}` };
|
|
1039
|
+
}
|
|
1040
|
+
if (factory.builders !== null && !members.some((m) => m.name === factory.builders)) {
|
|
1041
|
+
return { message: `the factory's builders names ${JSON.stringify(factory.builders)}, which is not a declared member; declared members: ${known()}`, pointer: `${factory.pointer}/builders` };
|
|
1042
|
+
}
|
|
1043
|
+
return null;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
777
1046
|
/**
|
|
778
1047
|
* The rules the schema can't say about a box's services (#2880), as a
|
|
779
1048
|
* message and the pointer to show, or null when they hold: each name is
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* `--kind` is not given, while `--kind` still overrides.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
8
9
|
import { readFileSync } from "node:fs";
|
|
9
10
|
import { join } from "node:path";
|
|
10
11
|
import { afterAll, afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
@@ -199,6 +200,38 @@ describe("records without --kind reads every declared kind (#2680)", () => {
|
|
|
199
200
|
expect(printed.kinds.map((k: { records: { id: string }[] }) => k.records.map((r) => r.id))).toEqual([["ref-001"], ["ref-001"]]);
|
|
200
201
|
});
|
|
201
202
|
|
|
203
|
+
test("--current adds the spec: the current records of spec: true kinds, with the files they pin (#2546, #2524 D20)", async () => {
|
|
204
|
+
const server = "export const port = 8080;\n";
|
|
205
|
+
const sha256 = createHash("sha256").update(server).digest("hex");
|
|
206
|
+
// ref-004 supersedes ref-001 and pins the app's server file; the note kind is not part of the spec.
|
|
207
|
+
const ref004 = REF_001.replace('id: "ref-001"', 'id: "ref-004"')
|
|
208
|
+
.replace("supersedes: []", 'supersedes:\n - decision: "ref-001"')
|
|
209
|
+
.replace(/^evidence:\n/m, `evidence:\n - title: "The server"\n path: "app/server.mjs"\n sha256: "${sha256}"\n`);
|
|
210
|
+
const root = workspace({
|
|
211
|
+
"decisions/ref-004-how-the-app-is-deployed-now.md": ref004,
|
|
212
|
+
"design/notes/note.kind.mjs": NOTE_KIND.replace("spec: true", "spec: false"),
|
|
213
|
+
});
|
|
214
|
+
expect(await run(root, "--current", "--json")).toBe(0);
|
|
215
|
+
const printed = JSON.parse(out.join("\n"));
|
|
216
|
+
expectValid(printed);
|
|
217
|
+
expect(printed.kinds.map((k: { kind: { spec: boolean } }) => k.kind.spec)).toEqual([true, false]);
|
|
218
|
+
expect(printed.spec.kinds).toEqual([{ member: null, path: "decisions/decision.kind.mjs", name: null }]);
|
|
219
|
+
expect(printed.spec.records).toEqual([
|
|
220
|
+
expect.objectContaining({
|
|
221
|
+
kind: "decision",
|
|
222
|
+
id: "ref-004",
|
|
223
|
+
path: "decisions/ref-004-how-the-app-is-deployed-now.md",
|
|
224
|
+
state: "decided",
|
|
225
|
+
valid: true,
|
|
226
|
+
assets: [{ path: "app/server.mjs", sha256, actual: sha256, state: "pinned" }],
|
|
227
|
+
}),
|
|
228
|
+
]);
|
|
229
|
+
// Without --current there is no spec: superseded records are still listed under kinds.
|
|
230
|
+
out.length = 0;
|
|
231
|
+
expect(await run(root, "--json")).toBe(0);
|
|
232
|
+
expect(JSON.parse(out.join("\n")).spec).toBeUndefined();
|
|
233
|
+
});
|
|
234
|
+
|
|
202
235
|
test("a kind that can't be read is listed with its error, the others are read, and the exit code is 1", async () => {
|
|
203
236
|
const root = workspace({}, [{ kind: "gone.kind.mjs" }]);
|
|
204
237
|
expect(await run(root, "--json")).toBe(1);
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/chant/schemas/workspace/evidence/v1/evidence.schema.json",
|
|
4
|
+
"title": "chant workspace evidence output",
|
|
5
|
+
"description": "What `chant workspace evidence verify --json` prints (#2553), and what a refused `chant workspace evidence sign --json` prints: runner evidence, an in-toto statement over record hashes in a DSSE envelope, checked offline against the runner keys `.chant/trust.json` lists at the base revision. Version 1 of the read contract. Readers ignore fields they do not know; a field is only ever added within a version. The error codes are a closed list, each in the one closed list of `reason-codes.ts`.",
|
|
6
|
+
"oneOf": [
|
|
7
|
+
{
|
|
8
|
+
"$ref": "#/$defs/result"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"$ref": "#/$defs/failure"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"$defs": {
|
|
15
|
+
"result": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"description": "A runner key the policy at base lists signed the envelope. `status` says whether the records still hash as signed; it exits 1 when they don't.",
|
|
18
|
+
"required": [
|
|
19
|
+
"$schema",
|
|
20
|
+
"contract",
|
|
21
|
+
"chant",
|
|
22
|
+
"at",
|
|
23
|
+
"ok",
|
|
24
|
+
"status",
|
|
25
|
+
"runner",
|
|
26
|
+
"class",
|
|
27
|
+
"keyid",
|
|
28
|
+
"statement",
|
|
29
|
+
"subjects"
|
|
30
|
+
],
|
|
31
|
+
"properties": {
|
|
32
|
+
"$schema": {
|
|
33
|
+
"const": "https://intentius.io/chant/schemas/workspace/evidence/v1/evidence.schema.json"
|
|
34
|
+
},
|
|
35
|
+
"contract": {
|
|
36
|
+
"const": 1
|
|
37
|
+
},
|
|
38
|
+
"chant": {
|
|
39
|
+
"type": "string"
|
|
40
|
+
},
|
|
41
|
+
"at": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
|
|
44
|
+
"description": "The commit the subjects were compared at."
|
|
45
|
+
},
|
|
46
|
+
"ok": {
|
|
47
|
+
"const": true
|
|
48
|
+
},
|
|
49
|
+
"status": {
|
|
50
|
+
"enum": [
|
|
51
|
+
"current",
|
|
52
|
+
"stale"
|
|
53
|
+
],
|
|
54
|
+
"description": "current when every subject hashes the same at `at`; stale otherwise. Stale evidence is never reused."
|
|
55
|
+
},
|
|
56
|
+
"runner": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "The runner principal whose key signed."
|
|
59
|
+
},
|
|
60
|
+
"class": {
|
|
61
|
+
"enum": [
|
|
62
|
+
"runner",
|
|
63
|
+
"service"
|
|
64
|
+
],
|
|
65
|
+
"description": "A CI runner or a service, as `.chant/trust.json` lists it."
|
|
66
|
+
},
|
|
67
|
+
"keyid": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "The ssh SHA256 fingerprint of the key that signed."
|
|
70
|
+
},
|
|
71
|
+
"statement": {
|
|
72
|
+
"$ref": "#/$defs/statement"
|
|
73
|
+
},
|
|
74
|
+
"subjects": {
|
|
75
|
+
"type": "array",
|
|
76
|
+
"items": {
|
|
77
|
+
"$ref": "#/$defs/subject"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"statement": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"description": "The in-toto Statement v1 the runner signed.",
|
|
85
|
+
"required": [
|
|
86
|
+
"_type",
|
|
87
|
+
"subject",
|
|
88
|
+
"predicateType",
|
|
89
|
+
"predicate"
|
|
90
|
+
],
|
|
91
|
+
"properties": {
|
|
92
|
+
"_type": {
|
|
93
|
+
"const": "https://in-toto.io/Statement/v1"
|
|
94
|
+
},
|
|
95
|
+
"subject": {
|
|
96
|
+
"type": "array",
|
|
97
|
+
"items": {
|
|
98
|
+
"type": "object",
|
|
99
|
+
"required": [
|
|
100
|
+
"name",
|
|
101
|
+
"digest"
|
|
102
|
+
],
|
|
103
|
+
"properties": {
|
|
104
|
+
"name": {
|
|
105
|
+
"type": "string"
|
|
106
|
+
},
|
|
107
|
+
"digest": {
|
|
108
|
+
"type": "object",
|
|
109
|
+
"required": [
|
|
110
|
+
"sha256"
|
|
111
|
+
],
|
|
112
|
+
"properties": {
|
|
113
|
+
"sha256": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"predicateType": {
|
|
123
|
+
"const": "https://intentius.io/chant/runner-evidence/v1"
|
|
124
|
+
},
|
|
125
|
+
"predicate": {
|
|
126
|
+
"type": "object",
|
|
127
|
+
"required": [
|
|
128
|
+
"runner",
|
|
129
|
+
"commit",
|
|
130
|
+
"tree",
|
|
131
|
+
"check"
|
|
132
|
+
],
|
|
133
|
+
"properties": {
|
|
134
|
+
"runner": {
|
|
135
|
+
"type": "string"
|
|
136
|
+
},
|
|
137
|
+
"commit": {
|
|
138
|
+
"type": "string",
|
|
139
|
+
"pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
|
|
140
|
+
},
|
|
141
|
+
"tree": {
|
|
142
|
+
"type": "string",
|
|
143
|
+
"pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
|
|
144
|
+
},
|
|
145
|
+
"check": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"description": "The check's id, as given to --check-id."
|
|
148
|
+
},
|
|
149
|
+
"claim": {
|
|
150
|
+
"type": "object",
|
|
151
|
+
"required": [
|
|
152
|
+
"sha256"
|
|
153
|
+
],
|
|
154
|
+
"properties": {
|
|
155
|
+
"sha256": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"environment": {
|
|
162
|
+
"type": "object",
|
|
163
|
+
"required": [
|
|
164
|
+
"sha256"
|
|
165
|
+
],
|
|
166
|
+
"properties": {
|
|
167
|
+
"sha256": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"subject": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"required": [
|
|
180
|
+
"name",
|
|
181
|
+
"signed",
|
|
182
|
+
"now",
|
|
183
|
+
"matches"
|
|
184
|
+
],
|
|
185
|
+
"properties": {
|
|
186
|
+
"name": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"description": "The record's path from the repository root."
|
|
189
|
+
},
|
|
190
|
+
"signed": {
|
|
191
|
+
"type": "string",
|
|
192
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
193
|
+
},
|
|
194
|
+
"now": {
|
|
195
|
+
"oneOf": [
|
|
196
|
+
{
|
|
197
|
+
"type": "null"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"type": "string",
|
|
201
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
202
|
+
}
|
|
203
|
+
],
|
|
204
|
+
"description": "The record's hash at `at`, or null when it is not there."
|
|
205
|
+
},
|
|
206
|
+
"matches": {
|
|
207
|
+
"type": "boolean"
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"failure": {
|
|
212
|
+
"type": "object",
|
|
213
|
+
"description": "The evidence was refused, or could not be checked. Exits 1.",
|
|
214
|
+
"required": [
|
|
215
|
+
"$schema",
|
|
216
|
+
"contract",
|
|
217
|
+
"chant",
|
|
218
|
+
"at",
|
|
219
|
+
"error"
|
|
220
|
+
],
|
|
221
|
+
"properties": {
|
|
222
|
+
"$schema": {
|
|
223
|
+
"const": "https://intentius.io/chant/schemas/workspace/evidence/v1/evidence.schema.json"
|
|
224
|
+
},
|
|
225
|
+
"contract": {
|
|
226
|
+
"const": 1
|
|
227
|
+
},
|
|
228
|
+
"chant": {
|
|
229
|
+
"type": "string"
|
|
230
|
+
},
|
|
231
|
+
"at": {
|
|
232
|
+
"oneOf": [
|
|
233
|
+
{
|
|
234
|
+
"type": "null"
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"type": "string",
|
|
238
|
+
"pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
"error": {
|
|
243
|
+
"type": "object",
|
|
244
|
+
"required": [
|
|
245
|
+
"code",
|
|
246
|
+
"message"
|
|
247
|
+
],
|
|
248
|
+
"properties": {
|
|
249
|
+
"code": {
|
|
250
|
+
"enum": [
|
|
251
|
+
"not-a-git-repository",
|
|
252
|
+
"revision-unknown",
|
|
253
|
+
"trust-policy-unreadable",
|
|
254
|
+
"envelope-unreadable",
|
|
255
|
+
"envelope-invalid",
|
|
256
|
+
"envelope-untrusted",
|
|
257
|
+
"evidence-payload-type",
|
|
258
|
+
"evidence-statement-invalid",
|
|
259
|
+
"evidence-runner-mismatch",
|
|
260
|
+
"runner-key-invalid",
|
|
261
|
+
"runner-key-is-signer",
|
|
262
|
+
"runner-key-unlisted",
|
|
263
|
+
"kind-unreadable",
|
|
264
|
+
"kind-invalid",
|
|
265
|
+
"schema-unreadable",
|
|
266
|
+
"schema-id-mismatch",
|
|
267
|
+
"schema-invalid",
|
|
268
|
+
"location-missing"
|
|
269
|
+
]
|
|
270
|
+
},
|
|
271
|
+
"message": {
|
|
272
|
+
"type": "string"
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|