@intentius/chant 0.101.0 → 0.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/checks.d.ts.map +1 -1
- package/dist/attrref.d.ts.map +1 -1
- package/dist/audit/core.d.ts +2 -0
- package/dist/audit/core.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/builder.d.ts.map +1 -1
- package/dist/change-set.d.ts +232 -0
- package/dist/change-set.d.ts.map +1 -0
- package/dist/cli/commands/audit.d.ts +7 -0
- package/dist/cli/commands/audit.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/build.d.ts.map +1 -1
- package/dist/cli/handlers/change-set.d.ts +11 -0
- package/dist/cli/handlers/change-set.d.ts.map +1 -0
- package/dist/cli/handlers/dev.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.d.ts +33 -0
- 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 +16 -0
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/pr.d.ts +31 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -0
- 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/op-tools.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 +4 -3
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +74 -3
- 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/auto-release.d.ts +16 -0
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability.d.ts +53 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/changed-files.d.ts +31 -0
- package/dist/components/changed-files.d.ts.map +1 -0
- package/dist/components/cli-support.d.ts +9 -1
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +24 -0
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/deploy-units.d.ts.map +1 -1
- package/dist/components/driver.d.ts +13 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/fan-out-output.d.ts +6 -0
- package/dist/components/fan-out-output.d.ts.map +1 -1
- package/dist/components/fan-out-record.d.ts +41 -0
- package/dist/components/fan-out-record.d.ts.map +1 -0
- package/dist/components/fan-out-run.d.ts +65 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-support.d.ts +2 -0
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/fan-out.d.ts +6 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/gated-wave-pipeline.d.ts +50 -0
- package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/layers.d.ts +25 -0
- package/dist/components/layers.d.ts.map +1 -0
- package/dist/components/pr-pipeline.d.ts +61 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -0
- package/dist/components/pr-run.d.ts +119 -0
- package/dist/components/pr-run.d.ts.map +1 -0
- package/dist/components/promote.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/shell.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/components/wave-plan.d.ts +49 -0
- package/dist/components/wave-plan.d.ts.map +1 -0
- package/dist/composite.d.ts.map +1 -1
- package/dist/config.d.ts +19 -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/gated-waves.d.ts +147 -0
- package/dist/gated-waves.d.ts.map +1 -0
- 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/index.d.ts +1 -0
- package/dist/index.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 +103 -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 +22 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +46 -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-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 +8 -8
- package/dist/lint/engine.d.ts +6 -0
- package/dist/lint/engine.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +18 -0
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lsp/lexicon-providers.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.d.ts +137 -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/change-set.d.ts +62 -0
- package/dist/op/activities/change-set.d.ts.map +1 -0
- package/dist/op/activities/decide.d.ts +2 -0
- package/dist/op/activities/decide.d.ts.map +1 -1
- package/dist/op/activities/factory.d.ts +137 -0
- package/dist/op/activities/factory.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +5 -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/activity-contract.d.ts +1 -1
- package/dist/op/activity-contract.d.ts.map +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 +11 -0
- 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 +5 -1
- package/dist/op/decide-backend.d.ts.map +1 -1
- package/dist/op/decide-read-inputs.d.ts +4 -2
- 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/factory.d.ts +83 -0
- package/dist/op/factory.d.ts.map +1 -0
- 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 +6 -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/op-ir.d.ts +2 -0
- package/dist/op/op-ir.d.ts.map +1 -1
- package/dist/op/op-verb-class.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 +16 -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/plan-summary.d.ts +207 -0
- package/dist/plan-summary.d.ts.map +1 -0
- package/dist/pr-forge.d.ts +105 -0
- package/dist/pr-forge.d.ts.map +1 -0
- package/dist/pr-loop.d.ts +178 -0
- package/dist/pr-loop.d.ts.map +1 -0
- 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/telemetry-attribution.d.ts +31 -0
- package/dist/telemetry-attribution.d.ts.map +1 -1
- package/dist/terraform/emit-source.d.ts.map +1 -1
- package/dist/terraform/hcl2json.d.ts +45 -0
- package/dist/terraform/hcl2json.d.ts.map +1 -0
- package/dist/terraform/parse.d.ts +4 -40
- 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 +5 -0
- package/dist/workspace/agent-cli.d.ts.map +1 -1
- package/dist/workspace/box-cli.d.ts +12 -0
- package/dist/workspace/box-cli.d.ts.map +1 -0
- package/dist/workspace/box-factory.d.ts +97 -0
- package/dist/workspace/box-factory.d.ts.map +1 -0
- package/dist/workspace/box-listing.d.ts +85 -0
- package/dist/workspace/box-listing.d.ts.map +1 -0
- package/dist/workspace/box-publish.d.ts +147 -0
- package/dist/workspace/box-publish.d.ts.map +1 -0
- package/dist/workspace/broker-protocol.d.ts +190 -0
- package/dist/workspace/broker-protocol.d.ts.map +1 -0
- 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.d.ts +5 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/compose-graph.d.ts +10 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +2 -2
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
- package/dist/workspace/conformance/broker.d.ts +202 -0
- package/dist/workspace/conformance/broker.d.ts.map +1 -0
- package/dist/workspace/conformance/index.d.ts +68 -6
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/vitest.d.ts +19 -3
- package/dist/workspace/conformance/vitest.d.ts.map +1 -1
- package/dist/workspace/conformance/writer.d.ts +462 -0
- package/dist/workspace/conformance/writer.d.ts.map +1 -0
- package/dist/workspace/decide.d.ts +126 -12
- package/dist/workspace/decide.d.ts.map +1 -1
- package/dist/workspace/decision-points.schema.json +11 -4
- package/dist/workspace/declaration.d.ts +156 -4
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.schema.json +383 -5
- package/dist/workspace/environments.d.ts +36 -10
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/factory-rules.d.ts +180 -0
- package/dist/workspace/factory-rules.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/init.d.ts +21 -0
- package/dist/workspace/init.d.ts.map +1 -1
- 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 +36 -2
- package/dist/workspace/intent-record.d.ts.map +1 -1
- package/dist/workspace/intent.d.ts +249 -8
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/json-edit.d.ts +24 -0
- package/dist/workspace/json-edit.d.ts.map +1 -0
- package/dist/workspace/jsonc.d.ts +11 -0
- package/dist/workspace/jsonc.d.ts.map +1 -1
- package/dist/workspace/kinds.d.ts +66 -4
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/lexicon-symbols.d.ts +29 -0
- package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
- package/dist/workspace/lineage-hash-index.d.ts.map +1 -1
- package/dist/workspace/lineage-lock.d.ts +2 -2
- package/dist/workspace/lineage-lock.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.d.ts +31 -2
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/point-answer.schema.json +42 -2
- package/dist/workspace/points-cli.d.ts +10 -3
- package/dist/workspace/points-cli.d.ts.map +1 -1
- package/dist/workspace/points.d.ts +66 -5
- 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 +53 -4
- 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 +5 -7
- 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 +34 -1
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-close.d.ts +7 -3
- 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 +68 -7
- package/dist/workspace/records-write.d.ts.map +1 -1
- package/dist/workspace/records.d.ts +43 -9
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/runs-cli.d.ts +296 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -0
- package/dist/workspace/runs.d.ts +544 -0
- package/dist/workspace/runs.d.ts.map +1 -0
- package/dist/workspace/session-kinds.d.ts +1 -1
- package/dist/workspace/session-kinds.d.ts.map +1 -1
- package/dist/workspace/source-block.d.ts +1 -1
- package/dist/workspace/source-block.d.ts.map +1 -1
- package/dist/workspace/squash.d.ts +80 -0
- package/dist/workspace/squash.d.ts.map +1 -0
- package/dist/workspace/status-gates.d.ts +17 -3
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +64 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/symbols.d.ts +63 -0
- package/dist/workspace/symbols.d.ts.map +1 -0
- 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.map +1 -1
- package/dist/workspace/trust/rotation.d.ts.map +1 -1
- package/dist/workspace/trust/run-commits.d.ts +46 -0
- package/dist/workspace/trust/run-commits.d.ts.map +1 -0
- package/dist/workspace/trust/run-statement.d.ts +128 -0
- package/dist/workspace/trust/run-statement.d.ts.map +1 -0
- package/dist/workspace/trust/seal.d.ts +38 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/test-repo.d.ts.map +1 -1
- package/dist/workspace/trust/verify-cli.d.ts +1 -1
- package/dist/workspace/trust/verify.d.ts +16 -2
- package/dist/workspace/trust/verify.d.ts.map +1 -1
- package/dist/workspace/wip-cli.d.ts +21 -0
- package/dist/workspace/wip-cli.d.ts.map +1 -0
- package/dist/workspace/wip.d.ts +268 -0
- package/dist/workspace/wip.d.ts.map +1 -0
- 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-size.d.ts +55 -0
- package/dist/workspace/work-size.d.ts.map +1 -0
- package/dist/workspace/work.d.ts +26 -1
- package/dist/workspace/work.d.ts.map +1 -1
- package/dist/workspace/workspace-kinds.schema.json +122 -0
- package/dist/workspace/workspace-principals.schema.json +60 -0
- package/dist/workspace/write-lock-cli.d.ts +60 -0
- package/dist/workspace/write-lock-cli.d.ts.map +1 -0
- package/dist/workspace/write-lock.d.ts +152 -0
- package/dist/workspace/write-lock.d.ts.map +1 -0
- package/dist/workspace/write-scope.d.ts +83 -19
- package/dist/workspace/write-scope.d.ts.map +1 -1
- package/dist/yaml.d.ts +21 -39
- package/dist/yaml.d.ts.map +1 -1
- package/package.json +7 -2
- package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
- package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
- package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
- package/src/__fixtures__/change-set/warden.plan.json +44 -0
- package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
- package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
- package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
- package/src/audit/core.test.ts +15 -0
- package/src/audit/core.ts +8 -2
- package/src/audit/discover.test.ts +11 -0
- package/src/audit/discover.ts +7 -2
- package/src/audit/prior-art.ts +15 -0
- package/src/change-set-bundle.test.ts +57 -0
- package/src/change-set.test.ts +215 -0
- package/src/change-set.ts +445 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
- package/src/cli/commands/audit-opt-in.test.ts +54 -0
- package/src/cli/commands/audit.ts +29 -2
- package/src/cli/commands/build.test.ts +19 -0
- package/src/cli/commands/build.ts +3 -2
- 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 +18 -0
- package/src/cli/commands/import-parser-options.test.ts +133 -0
- package/src/cli/commands/import.ts +21 -3
- 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/build.ts +13 -1
- package/src/cli/handlers/change-set.test.ts +56 -0
- package/src/cli/handlers/change-set.ts +44 -0
- package/src/cli/handlers/components.ts +2 -2
- package/src/cli/handlers/dev.ts +8 -6
- package/src/cli/handlers/fan-out.test.ts +221 -2
- package/src/cli/handlers/fan-out.ts +165 -75
- package/src/cli/handlers/graph.ts +3 -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.test.ts +21 -0
- package/src/cli/handlers/operator.ts +121 -6
- package/src/cli/handlers/pr.ts +373 -0
- package/src/cli/handlers/run.test.ts +111 -0
- package/src/cli/handlers/run.ts +86 -24
- package/src/cli/handlers/scenario.ts +2 -2
- package/src/cli/main.test.ts +21 -0
- package/src/cli/main.ts +246 -30
- package/src/cli/mcp/never-over-mcp.test.ts +101 -0
- package/src/cli/mcp/op-tools.ts +24 -2
- package/src/cli/mcp/workspace-tools.test.ts +5 -2
- package/src/cli/mcp/workspace-tools.ts +62 -7
- package/src/cli/registry.ts +74 -3
- 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/testdata/postgres-tags.json +242 -0
- package/src/components/auto-release.ts +1 -1
- package/src/components/capability.ts +55 -0
- package/src/components/changed-files.ts +66 -0
- package/src/components/cli-support.ts +28 -5
- package/src/components/component.schema.json +17 -0
- package/src/components/component.ts +25 -0
- package/src/components/deploy-units.ts +3 -0
- package/src/components/driver.test.ts +52 -0
- package/src/components/driver.ts +31 -13
- package/src/components/fan-out-output.ts +42 -1
- package/src/components/fan-out-record.ts +69 -0
- package/src/components/fan-out-run.test.ts +17 -0
- package/src/components/fan-out-run.ts +304 -1
- package/src/components/fan-out-support.ts +3 -0
- package/src/components/fan-out-waves.test.ts +375 -0
- package/src/components/fan-out.ts +18 -17
- package/src/components/gated-wave-pipeline.ts +82 -0
- package/src/components/index.ts +1 -0
- package/src/components/layers.ts +30 -0
- package/src/components/pr-pipeline.ts +91 -0
- package/src/components/pr-run.test.ts +205 -0
- package/src/components/pr-run.ts +280 -0
- package/src/components/promote.ts +5 -0
- package/src/components/verbs/shell.test.ts +11 -0
- package/src/components/verbs/shell.ts +7 -3
- package/src/components/wave-plan.ts +124 -0
- package/src/config.test.ts +21 -0
- package/src/config.ts +15 -0
- 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/sandbox/bundle.ts +1 -1
- 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/gated-waves-bundle.test.ts +62 -0
- package/src/gated-waves.test.ts +118 -0
- package/src/gated-waves.ts +240 -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/index.ts +1 -0
- package/src/lexicon.ts +106 -3
- package/src/lifecycle/gate-ledger.ts +23 -0
- package/src/lifecycle/git.ts +102 -16
- package/src/lifecycle/observe.test.ts +18 -0
- package/src/lifecycle/observe.ts +6 -4
- 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/lint/post-synth.test.ts +19 -0
- package/src/lint/post-synth.ts +19 -1
- package/src/meta/declared-imports.test.ts +1 -1
- package/src/op/activities/activity-contracts.ts +84 -0
- package/src/op/activities/apply.test.ts +189 -5
- package/src/op/activities/apply.ts +230 -8
- package/src/op/activities/change-set.ts +114 -0
- package/src/op/activities/decide.ts +3 -0
- package/src/op/activities/factory.ts +675 -0
- package/src/op/activities/index.ts +9 -0
- package/src/op/activities/lexicon-upgrade.test.ts +160 -6
- package/src/op/activities/lexicon-upgrade.ts +154 -51
- package/src/op/activity-contract.test.ts +21 -1
- package/src/op/activity-contract.ts +19 -9
- package/src/op/builders.ts +23 -0
- 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/decide-backend.ts +5 -1
- package/src/op/decide-read-inputs.ts +33 -5
- package/src/op/emulator-lifecycle.test.ts +23 -0
- package/src/op/emulator-lifecycle.ts +52 -14
- package/src/op/factory.e2e.test.ts +232 -0
- package/src/op/factory.ts +118 -0
- package/src/op/gate-approval.test.ts +74 -0
- package/src/op/gate-approval.ts +5 -1
- package/src/op/gate.ts +31 -5
- package/src/op/index.ts +11 -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/op-ir.test.ts +9 -0
- package/src/op/op-ir.ts +4 -0
- package/src/op/op-verb-class.ts +3 -0
- 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 +16 -3
- package/src/op/work-lease-run.test.ts +47 -0
- package/src/op/work-lease-run.ts +76 -11
- package/src/plan-summary.test.ts +263 -0
- package/src/plan-summary.ts +845 -0
- package/src/pr-forge.test.ts +237 -0
- package/src/pr-forge.ts +332 -0
- package/src/pr-loop-bundle.test.ts +46 -0
- package/src/pr-loop.test.ts +171 -0
- package/src/pr-loop.ts +324 -0
- package/src/provenance.ts +35 -0
- package/src/telemetry-attribution.test.ts +23 -1
- package/src/telemetry-attribution.ts +51 -0
- package/src/terraform/hcl2json.test.ts +21 -0
- package/src/terraform/hcl2json.ts +81 -0
- package/src/terraform/parse.ts +11 -74
- package/src/workspace/agent-cli.ts +7 -3
- package/src/workspace/agent.schema.json +22 -0
- package/src/workspace/app-kind.test.ts +196 -0
- package/src/workspace/box-cli.ts +113 -0
- package/src/workspace/box-factory.test.ts +323 -0
- package/src/workspace/box-factory.ts +136 -0
- package/src/workspace/box-listing-write.schema.json +204 -0
- package/src/workspace/box-listing.test.ts +234 -0
- package/src/workspace/box-listing.ts +324 -0
- package/src/workspace/box-publish.schema.json +498 -0
- package/src/workspace/box-publish.test.ts +204 -0
- package/src/workspace/box-publish.ts +420 -0
- package/src/workspace/box-ship.test.ts +96 -0
- package/src/workspace/broker-protocol.schema.json +186 -0
- package/src/workspace/broker-protocol.test.ts +122 -0
- package/src/workspace/broker-protocol.ts +317 -0
- package/src/workspace/builder-tiers.test.ts +146 -0
- package/src/workspace/change-set.schema.json +460 -0
- package/src/workspace/changes.schema.json +12 -20
- package/src/workspace/changes.ts +4 -1
- package/src/workspace/chant-migrations.e2e.test.ts +17 -5
- package/src/workspace/checks/boxes.test.ts +5 -0
- package/src/workspace/checks.ts +39 -8
- package/src/workspace/component-environments.test.ts +105 -0
- package/src/workspace/compose-graph.ts +7 -0
- package/src/workspace/composites.schema.json +23 -4
- package/src/workspace/composites.test.ts +8 -8
- package/src/workspace/composites.ts +13 -2
- package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
- package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/src/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -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 +603 -0
- package/src/workspace/conformance/broker.test.ts +122 -0
- package/src/workspace/conformance/broker.ts +792 -0
- package/src/workspace/conformance/conformance.e2e.test.ts +36 -3
- package/src/workspace/conformance/index.mjs +51 -3
- package/src/workspace/conformance/index.ts +107 -15
- package/src/workspace/conformance/vitest.ts +76 -2
- package/src/workspace/conformance/writer-conformance.e2e.test.ts +177 -0
- package/src/workspace/conformance/writer.test.ts +186 -0
- package/src/workspace/conformance/writer.ts +1191 -0
- package/src/workspace/decide.test.ts +208 -4
- package/src/workspace/decide.ts +433 -73
- package/src/workspace/decision-points.schema.json +11 -4
- package/src/workspace/declaration.schema.json +383 -5
- package/src/workspace/declaration.ts +315 -10
- package/src/workspace/environments.ts +66 -14
- package/src/workspace/factory-rules.test.ts +62 -0
- package/src/workspace/factory-rules.ts +218 -0
- package/src/workspace/graph-cli.ts +6 -3
- package/src/workspace/graph.schema.json +314 -0
- package/src/workspace/identity.test.ts +219 -0
- package/src/workspace/identity.ts +186 -0
- package/src/workspace/init.ts +82 -2
- package/src/workspace/intent-cli.ts +84 -13
- package/src/workspace/intent-patch-id.test.ts +162 -0
- package/src/workspace/intent-record.schema.json +336 -1
- package/src/workspace/intent-record.ts +96 -16
- package/src/workspace/intent-reviews.test.ts +76 -0
- package/src/workspace/intent-squash.test.ts +213 -0
- package/src/workspace/intent-why.test.ts +274 -0
- package/src/workspace/intent.schema.json +950 -9
- package/src/workspace/intent.test.ts +11 -2
- package/src/workspace/intent.ts +722 -65
- package/src/workspace/json-edit.test.ts +121 -0
- package/src/workspace/json-edit.ts +142 -0
- package/src/workspace/jsonc.ts +20 -0
- package/src/workspace/kinds.ts +201 -39
- package/src/workspace/lexicon-symbols.test.ts +148 -0
- package/src/workspace/lexicon-symbols.ts +125 -0
- package/src/workspace/lineage-upgrade.test.ts +63 -0
- package/src/workspace/lineage-upgrade.ts +146 -5
- package/src/workspace/plan-summary.schema.json +155 -0
- package/src/workspace/point-answer.schema.json +42 -2
- package/src/workspace/points-cli.ts +42 -16
- package/src/workspace/points-write.schema.json +163 -4
- package/src/workspace/points.schema.json +157 -2
- package/src/workspace/points.test.ts +13 -1
- package/src/workspace/points.ts +118 -12
- package/src/workspace/pr-report.schema.json +95 -0
- package/src/workspace/principal-classes.test.ts +175 -0
- package/src/workspace/principal-classes.ts +307 -0
- package/src/workspace/profiles.test.ts +159 -0
- package/src/workspace/read-contract.test.ts +2 -2
- package/src/workspace/reason-codes.test.ts +23 -3
- package/src/workspace/reason-codes.ts +61 -4
- package/src/workspace/record-sessions.ts +9 -8
- package/src/workspace/records-amend.schema.json +80 -0
- package/src/workspace/records-checkout.ts +106 -0
- package/src/workspace/records-cli.ts +123 -17
- package/src/workspace/records-close.schema.json +79 -0
- package/src/workspace/records-close.ts +31 -7
- package/src/workspace/records-concurrent.e2e.test.ts +135 -0
- package/src/workspace/records-concurrent.test.ts +145 -0
- package/src/workspace/records-formats.test.ts +46 -10
- package/src/workspace/records-new.schema.json +9 -0
- package/src/workspace/records-review.schema.json +80 -0
- package/src/workspace/records-sessions-write.test.ts +69 -0
- package/src/workspace/records-sessions.test.ts +22 -0
- package/src/workspace/records-uncommitted.test.ts +171 -0
- package/src/workspace/records-write.ts +219 -30
- package/src/workspace/records.schema.json +88 -1
- package/src/workspace/records.ts +76 -8
- package/src/workspace/reference-kinds/app/package.json +10 -0
- package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/src/workspace/run-statement.schema.json +622 -0
- package/src/workspace/runs-cli.ts +710 -0
- package/src/workspace/runs-statement.test.ts +239 -0
- package/src/workspace/runs-write.schema.json +994 -0
- package/src/workspace/runs.schema.json +1257 -0
- package/src/workspace/runs.test.ts +281 -0
- package/src/workspace/runs.ts +970 -0
- package/src/workspace/session-kinds.ts +3 -3
- package/src/workspace/squash.ts +198 -0
- package/src/workspace/status-contract.test.ts +10 -2
- package/src/workspace/status-gates.ts +25 -9
- package/src/workspace/status.schema.json +252 -4
- package/src/workspace/status.ts +110 -1
- package/src/workspace/symbols.ts +191 -0
- 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/run-commits.ts +115 -0
- package/src/workspace/trust/run-statement.ts +226 -0
- package/src/workspace/trust/seal.ts +58 -1
- package/src/workspace/trust/verify-cli.ts +6 -5
- package/src/workspace/trust/verify.ts +39 -6
- package/src/workspace/wip-cli.ts +97 -0
- package/src/workspace/wip-write.schema.json +504 -0
- package/src/workspace/wip.schema.json +334 -0
- package/src/workspace/wip.test.ts +294 -0
- package/src/workspace/wip.ts +753 -0
- package/src/workspace/work-cli.e2e.test.ts +28 -1
- package/src/workspace/work-cli.ts +136 -8
- package/src/workspace/work-evidence.schema.json +5 -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-size.test.ts +77 -0
- package/src/workspace/work-size.ts +93 -0
- package/src/workspace/work.ts +82 -0
- package/src/workspace/workspace-kinds.schema.json +122 -0
- package/src/workspace/workspace-principals.schema.json +60 -0
- package/src/workspace/write-lock-cli.ts +131 -0
- package/src/workspace/write-lock.schema.json +172 -0
- package/src/workspace/write-lock.test.ts +189 -0
- package/src/workspace/write-lock.ts +474 -0
- package/src/workspace/write-scope.test.ts +144 -3
- package/src/workspace/write-scope.ts +192 -45
- package/src/yaml.test.ts +111 -1
- package/src/yaml.ts +141 -549
|
@@ -107,7 +107,7 @@ describe("a work lease in one clone", () => {
|
|
|
107
107
|
|
|
108
108
|
const again = await claimWorkLease("W-003", "carol", { cwd, ttlMs: 1_000, now: at(t0) });
|
|
109
109
|
if (!again.ok) throw new Error(again.message);
|
|
110
|
-
const closed = await releaseWorkLease("W-003", "dispatcher", { cwd, outcome: "
|
|
110
|
+
const closed = await releaseWorkLease("W-003", "dispatcher", { cwd, outcome: "abandoned", now: at("2026-09-25T11:00:00.000Z") });
|
|
111
111
|
expect(closed).toMatchObject({ ok: true, lease: { holder: "carol" } });
|
|
112
112
|
});
|
|
113
113
|
|
|
@@ -100,6 +100,93 @@ export interface WorkLeaseState extends WorkLease {
|
|
|
100
100
|
ref: string;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
/**
|
|
104
|
+
* How a work lease can end (#3147): the closed list of outcomes a release
|
|
105
|
+
* records. A new outcome is a contract change. Readers of an older history
|
|
106
|
+
* may still find free text from before the list was closed, which counts as
|
|
107
|
+
* an attempt (see {@link outcomeCountsAsAttempt}).
|
|
108
|
+
*/
|
|
109
|
+
export const WORK_LEASE_OUTCOMES = [
|
|
110
|
+
/** The work was finished: built, checked and recorded. */
|
|
111
|
+
"done",
|
|
112
|
+
/** A build ran and did not finish, or the run failed. Counts as an attempt. */
|
|
113
|
+
"not_done",
|
|
114
|
+
/** An expired lease closed out by someone other than its holder: the worker went away. Counts as an attempt. */
|
|
115
|
+
"abandoned",
|
|
116
|
+
/** The run stopped at a gate, waiting for an approval. */
|
|
117
|
+
"gated",
|
|
118
|
+
/** The run stopped on a decision point's open question, waiting for a person. */
|
|
119
|
+
"waiting",
|
|
120
|
+
/** The item was dropped, such as by a refuse at the understand point. Nothing was built. */
|
|
121
|
+
"dropped",
|
|
122
|
+
/** The understand point answered redraft: the item goes back to its author. Nothing was built. */
|
|
123
|
+
"redraft",
|
|
124
|
+
/** The understand point answered ask: the item waits on a question to its author. Nothing was built. */
|
|
125
|
+
"ask",
|
|
126
|
+
] as const;
|
|
127
|
+
export type WorkLeaseOutcome = (typeof WORK_LEASE_OUTCOMES)[number];
|
|
128
|
+
|
|
129
|
+
/** The outcomes that count toward an item's attempt limit. */
|
|
130
|
+
export const ATTEMPT_OUTCOMES: readonly WorkLeaseOutcome[] = ["not_done", "abandoned"];
|
|
131
|
+
|
|
132
|
+
/** Whether `value` is one of {@link WORK_LEASE_OUTCOMES}. */
|
|
133
|
+
export function isWorkLeaseOutcome(value: unknown): value is WorkLeaseOutcome {
|
|
134
|
+
return typeof value === "string" && (WORK_LEASE_OUTCOMES as readonly string[]).includes(value);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Whether a release with `outcome` counts toward the item's attempt limit:
|
|
139
|
+
* `not_done` and `abandoned` do, and so does a release that gave no outcome
|
|
140
|
+
* or one outside the closed list (free text written before #3147), since
|
|
141
|
+
* nothing says the work got anywhere.
|
|
142
|
+
*/
|
|
143
|
+
export function outcomeCountsAsAttempt(outcome: string | null | undefined): boolean {
|
|
144
|
+
if (!isWorkLeaseOutcome(outcome)) return true;
|
|
145
|
+
return ATTEMPT_OUTCOMES.includes(outcome);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** The ref prefix that keeps an unfinished attempt's work (#3147). */
|
|
149
|
+
export const KEPT_REF_PREFIX = "refs/chant/kept/";
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Where the work of an attempt that ended `not_done` is kept: one ref per
|
|
153
|
+
* lease token, `refs/chant/kept/[<member>/...]<item>/<token>`, scoped by the
|
|
154
|
+
* members the way the work branch `chant/work/[<member>/]<item>` is.
|
|
155
|
+
*/
|
|
156
|
+
export function keptAttemptRef(id: string, token: string, members: readonly string[] = []): string {
|
|
157
|
+
return `${keptAttemptPrefix(id, members)}${token}`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** The prefix under which every kept attempt of item `id` sits. */
|
|
161
|
+
export function keptAttemptPrefix(id: string, members: readonly string[] = []): string {
|
|
162
|
+
return `${KEPT_REF_PREFIX}${members.length ? `${members.join("/")}/` : ""}${id}/`;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** One kept attempt, as `work history` lists it. */
|
|
166
|
+
export interface KeptAttempt {
|
|
167
|
+
/** The lease token the attempt ran under. */
|
|
168
|
+
token: string;
|
|
169
|
+
ref: string;
|
|
170
|
+
/** The commit the ref points at. */
|
|
171
|
+
commit: string;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Every kept attempt of item `id`, from the local refs, sorted by ref. Empty outside git. */
|
|
175
|
+
export async function listKeptAttempts(id: string, opts: { cwd: string; members?: readonly string[] }): Promise<KeptAttempt[]> {
|
|
176
|
+
const prefix = keptAttemptPrefix(id, opts.members ?? []);
|
|
177
|
+
const out = await getRuntime().spawn(["git", "for-each-ref", "--format=%(refname) %(objectname)", prefix], { cwd: opts.cwd });
|
|
178
|
+
if (out.exitCode !== 0) return [];
|
|
179
|
+
return out.stdout
|
|
180
|
+
.split("\n")
|
|
181
|
+
.filter(Boolean)
|
|
182
|
+
.map((line) => {
|
|
183
|
+
const [ref, commit] = line.split(" ");
|
|
184
|
+
return { token: ref.slice(prefix.length), ref, commit };
|
|
185
|
+
})
|
|
186
|
+
.filter((k) => k.token !== "" && !k.token.includes("/"))
|
|
187
|
+
.sort((a, b) => (a.ref < b.ref ? -1 : a.ref > b.ref ? 1 : 0));
|
|
188
|
+
}
|
|
189
|
+
|
|
103
190
|
/** One line of `_leases/<id>.jsonl`. */
|
|
104
191
|
export interface LeaseHistoryRecord {
|
|
105
192
|
version: 1;
|
|
@@ -115,7 +202,7 @@ export interface LeaseHistoryRecord {
|
|
|
115
202
|
expiresAt: string;
|
|
116
203
|
/** When the event happened. */
|
|
117
204
|
timestamp: string;
|
|
118
|
-
/** How the work ended, on a release
|
|
205
|
+
/** How the work ended, on a release: one of {@link WORK_LEASE_OUTCOMES}, or free text in a line written before #3147. */
|
|
119
206
|
outcome?: string;
|
|
120
207
|
note?: string;
|
|
121
208
|
}
|
|
@@ -257,7 +344,8 @@ async function finish(
|
|
|
257
344
|
/**
|
|
258
345
|
* Give the lease on `id` back. The holder releases a live lease (with
|
|
259
346
|
* `token`, only that one); anyone may release an expired one, which is how an
|
|
260
|
-
* abandoned claim is closed out. `outcome` says how the work ended
|
|
347
|
+
* abandoned claim is closed out. `outcome` says how the work ended, from the
|
|
348
|
+
* closed list {@link WORK_LEASE_OUTCOMES}; any other value throws. Refused
|
|
261
349
|
* with `lease-not-held` when there is no lease, and `lease-held` when someone
|
|
262
350
|
* else holds it live.
|
|
263
351
|
*/
|
|
@@ -267,6 +355,9 @@ export async function releaseWorkLease(
|
|
|
267
355
|
opts: WorkLeaseOptions & { token?: string; outcome?: string; note?: string },
|
|
268
356
|
): Promise<WorkLeaseResult> {
|
|
269
357
|
checkId(id);
|
|
358
|
+
if (opts.outcome !== undefined && !isWorkLeaseOutcome(opts.outcome)) {
|
|
359
|
+
throw new Error(`${JSON.stringify(opts.outcome)} is not a work lease outcome: use one of ${WORK_LEASE_OUTCOMES.join(", ")}`);
|
|
360
|
+
}
|
|
270
361
|
const key = workLeaseKey(id);
|
|
271
362
|
const now = opts.now?.() ?? new Date();
|
|
272
363
|
const { record } = await readLease(key, { cwd: opts.cwd });
|
package/src/lint/engine.test.ts
CHANGED
|
@@ -6,6 +6,61 @@ import { writeFile } from "node:fs/promises";
|
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
|
|
8
8
|
describe("runLint", () => {
|
|
9
|
+
// #2511
|
|
10
|
+
test("a rule that throws is an error for that file, and the other rules still run", async () => {
|
|
11
|
+
await withTestDir(async (testDir) => {
|
|
12
|
+
const testFile = join(testDir, "test.ts");
|
|
13
|
+
await writeFile(testFile, "const x = 1;");
|
|
14
|
+
|
|
15
|
+
const throwing: LintRule = {
|
|
16
|
+
id: "throws",
|
|
17
|
+
severity: "warning",
|
|
18
|
+
category: "correctness",
|
|
19
|
+
check: () => {
|
|
20
|
+
throw new Error("bad input");
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const after: LintRule = {
|
|
24
|
+
id: "after",
|
|
25
|
+
severity: "warning",
|
|
26
|
+
category: "correctness",
|
|
27
|
+
check: (context: LintContext): LintDiagnostic[] => [
|
|
28
|
+
{ file: context.filePath, line: 1, column: 1, ruleId: "after", severity: "warning", message: "ran" },
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const { diagnostics } = await runLint([testFile], [throwing, after]);
|
|
33
|
+
|
|
34
|
+
expect(diagnostics.map((d) => d.ruleId).sort()).toEqual(["after", "throws"]);
|
|
35
|
+
const threw = diagnostics.find((d) => d.ruleId === "throws")!;
|
|
36
|
+
expect(threw.severity).toBe("error");
|
|
37
|
+
expect(threw.file).toBe(testFile);
|
|
38
|
+
expect(threw.message).toBe(`Rule throws threw while checking ${testFile}: bad input`);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("a disable comment does not suppress a rule's failure", async () => {
|
|
43
|
+
await withTestDir(async (testDir) => {
|
|
44
|
+
const testFile = join(testDir, "test.ts");
|
|
45
|
+
await writeFile(testFile, "// chant-disable\nconst x = 1;");
|
|
46
|
+
|
|
47
|
+
const throwing: LintRule = {
|
|
48
|
+
id: "throws",
|
|
49
|
+
severity: "warning",
|
|
50
|
+
category: "correctness",
|
|
51
|
+
check: () => {
|
|
52
|
+
throw "not an Error";
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const { diagnostics, suppressed } = await runLint([testFile], [throwing]);
|
|
57
|
+
|
|
58
|
+
expect(suppressed).toHaveLength(0);
|
|
59
|
+
expect(diagnostics).toHaveLength(1);
|
|
60
|
+
expect(diagnostics[0].message).toContain("not an Error");
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
9
64
|
test("executes rules and returns diagnostics", async () => {
|
|
10
65
|
await withTestDir(async (testDir) => {
|
|
11
66
|
const testFile = join(testDir, "test.ts");
|
package/src/lint/engine.ts
CHANGED
|
@@ -189,6 +189,23 @@ function isDiagnosticDisabled(
|
|
|
189
189
|
return { suppressed: false };
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
+
/**
|
|
193
|
+
* The error reported when a rule throws while checking a file (#2511). It
|
|
194
|
+
* names the rule, the file and the thrown message, at error severity so
|
|
195
|
+
* `chant lint` exits non-zero.
|
|
196
|
+
*/
|
|
197
|
+
export function ruleThrewDiagnostic(ruleId: string, filePath: string, error: unknown): LintDiagnostic {
|
|
198
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
199
|
+
return {
|
|
200
|
+
file: filePath,
|
|
201
|
+
line: 1,
|
|
202
|
+
column: 1,
|
|
203
|
+
ruleId,
|
|
204
|
+
severity: "error",
|
|
205
|
+
message: `Rule ${ruleId} threw while checking ${filePath}: ${message}`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
192
209
|
/**
|
|
193
210
|
* Execute lint rules on a set of files
|
|
194
211
|
* @param files - Array of file paths to lint
|
|
@@ -246,11 +263,17 @@ export async function runLint(
|
|
|
246
263
|
propertyClasses,
|
|
247
264
|
};
|
|
248
265
|
|
|
249
|
-
// Execute each rule
|
|
266
|
+
// Execute each rule. A rule that throws is reported as an error for
|
|
267
|
+
// this file (#2511) and the remaining rules still run.
|
|
268
|
+
const ruleErrors: LintDiagnostic[] = [];
|
|
250
269
|
for (const rule of rules) {
|
|
251
270
|
const options = ruleOptions?.get(rule.id);
|
|
252
|
-
|
|
253
|
-
|
|
271
|
+
try {
|
|
272
|
+
const diagnostics = rule.check(context, options);
|
|
273
|
+
allDiagnostics.push(...diagnostics);
|
|
274
|
+
} catch (error) {
|
|
275
|
+
ruleErrors.push(ruleThrewDiagnostic(rule.id, filePath, error));
|
|
276
|
+
}
|
|
254
277
|
}
|
|
255
278
|
|
|
256
279
|
// Partition file diagnostics into active and suppressed
|
|
@@ -269,7 +292,10 @@ export async function runLint(
|
|
|
269
292
|
|
|
270
293
|
// Replace file diagnostics with filtered ones
|
|
271
294
|
allDiagnostics.length = 0;
|
|
272
|
-
|
|
295
|
+
// A rule's own failure is never suppressed by a disable comment: the
|
|
296
|
+
// comment is aimed at the rule's findings, and hiding the failure would
|
|
297
|
+
// make a rule that did not run look like a clean lint.
|
|
298
|
+
allDiagnostics.push(...otherFileDiags, ...keptDiags, ...ruleErrors);
|
|
273
299
|
} catch (error) {
|
|
274
300
|
// If parsing fails, skip this file and continue with others
|
|
275
301
|
continue;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, test, expect } from "vitest";
|
|
2
2
|
import { parseOutputDocs, pick, get } from "./output-docs";
|
|
3
3
|
import type { SerializerResult } from "../serializer";
|
|
4
|
+
import { load as jsYamlLoad } from "js-yaml";
|
|
4
5
|
|
|
5
6
|
describe("parseOutputDocs", () => {
|
|
6
7
|
test("parses a single JSON output as one document", () => {
|
|
@@ -156,65 +157,67 @@ describe("parseOutputDocs", () => {
|
|
|
156
157
|
expect(bad.value).toBeUndefined();
|
|
157
158
|
});
|
|
158
159
|
});
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
describe("pick", () => {
|
|
162
|
-
interface Widget {
|
|
163
|
-
kind: string;
|
|
164
|
-
name: string;
|
|
165
|
-
extra: unknown;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
test("returns only the named keys that are present", () => {
|
|
169
|
-
const value = { kind: "Deployment", name: "web", other: "ignored" };
|
|
170
|
-
expect(pick<Widget>(value, ["kind", "name"])).toEqual({ kind: "Deployment", name: "web" });
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test("omits a named key that is absent — no invented default", () => {
|
|
174
|
-
const value = { kind: "Deployment" };
|
|
175
|
-
expect(pick<Widget>(value, ["kind", "name"])).toEqual({ kind: "Deployment" });
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
test("returns an empty object for a non-object value", () => {
|
|
179
|
-
expect(pick<Widget>(null, ["kind"])).toEqual({});
|
|
180
|
-
expect(pick<Widget>("a string", ["kind"])).toEqual({});
|
|
181
|
-
expect(pick<Widget>(undefined, ["kind"])).toEqual({});
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
test("copies values through unvalidated, whatever their actual shape", () => {
|
|
185
|
-
const value = { kind: 42 }; // wrong runtime type for `kind: string`
|
|
186
|
-
expect(pick<Widget>(value, ["kind"])).toEqual({ kind: 42 });
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
describe("get", () => {
|
|
191
|
-
test("walks a dotted path through nested objects", () => {
|
|
192
|
-
const value = { spec: { template: { spec: { containers: [] } } } };
|
|
193
|
-
expect(get(value, "spec.template.spec")).toEqual({ containers: [] });
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
test("returns undefined as soon as a segment is missing", () => {
|
|
197
|
-
const value = { spec: {} };
|
|
198
|
-
expect(get(value, "spec.template.spec")).toBeUndefined();
|
|
199
|
-
});
|
|
200
160
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
161
|
+
// #2925: hand-written and third-party YAML (`chant audit`, test fixtures)
|
|
162
|
+
// uses flow collections and folded scalars. Each case is checked against
|
|
163
|
+
// js-yaml, so the expected value is what a full parser reads.
|
|
164
|
+
describe("YAML a hand-written manifest uses (#2925)", () => {
|
|
165
|
+
const docOf = (yaml: string): unknown => {
|
|
166
|
+
const docs = parseOutputDocs(new Map<string, string | SerializerResult>([["k8s", yaml]]));
|
|
167
|
+
expect(docs).toHaveLength(1);
|
|
168
|
+
expect(docs[0].error).toBeUndefined();
|
|
169
|
+
return docs[0].value;
|
|
170
|
+
};
|
|
205
171
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
172
|
+
test("flow mappings read as mappings, not strings", () => {
|
|
173
|
+
const yaml = [
|
|
174
|
+
"apiVersion: apps/v1",
|
|
175
|
+
"kind: Deployment",
|
|
176
|
+
"metadata: { name: gw, namespace: obs }",
|
|
177
|
+
"spec:",
|
|
178
|
+
" template:",
|
|
179
|
+
" spec:",
|
|
180
|
+
" volumes:",
|
|
181
|
+
" - name: conf",
|
|
182
|
+
" configMap: { name: gw-config }",
|
|
183
|
+
].join("\n");
|
|
184
|
+
const value = docOf(yaml);
|
|
185
|
+
expect(value).toEqual(jsYamlLoad(yaml));
|
|
186
|
+
expect(get(value, "metadata.namespace")).toBe("obs");
|
|
187
|
+
expect(get(value, "spec.template.spec.volumes.0.configMap.name")).toBe("gw-config");
|
|
188
|
+
});
|
|
210
189
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
190
|
+
test("a flow sequence of flow mappings reads as a list of mappings", () => {
|
|
191
|
+
const yaml = [
|
|
192
|
+
"kind: Pod",
|
|
193
|
+
"spec:",
|
|
194
|
+
" containers:",
|
|
195
|
+
" - name: gw",
|
|
196
|
+
" volumeMounts: [{ name: conf, mountPath: /conf }, { name: data, mountPath: /data, readOnly: true }]",
|
|
197
|
+
" args: [--config, /conf/config.yaml]",
|
|
198
|
+
].join("\n");
|
|
199
|
+
const value = docOf(yaml);
|
|
200
|
+
expect(value).toEqual(jsYamlLoad(yaml));
|
|
201
|
+
expect(get(value, "spec.containers.0.volumeMounts.1.readOnly")).toBe(true);
|
|
202
|
+
expect(get(value, "spec.containers.0.args")).toEqual(["--config", "/conf/config.yaml"]);
|
|
203
|
+
});
|
|
215
204
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
205
|
+
test("a folded scalar keeps the line breaks of its more-indented lines", () => {
|
|
206
|
+
// js-yaml dumps a long ConfigMap value this way.
|
|
207
|
+
const yaml = [
|
|
208
|
+
"kind: ConfigMap",
|
|
209
|
+
"data:",
|
|
210
|
+
" config.yaml: >",
|
|
211
|
+
" receivers:",
|
|
212
|
+
" k8s_cluster:",
|
|
213
|
+
" auth_type: serviceAccount",
|
|
214
|
+
" exporters: {}",
|
|
215
|
+
].join("\n");
|
|
216
|
+
const value = docOf(yaml);
|
|
217
|
+
expect(value).toEqual(jsYamlLoad(yaml));
|
|
218
|
+
expect((value as { data: Record<string, string> }).data["config.yaml"]).toBe(
|
|
219
|
+
"receivers:\n k8s_cluster:\n auth_type: serviceAccount\nexporters: {}\n",
|
|
220
|
+
);
|
|
221
|
+
});
|
|
219
222
|
});
|
|
220
223
|
});
|
|
@@ -162,6 +162,25 @@ describe("cross-lexicon activity contracts (#2101)", () => {
|
|
|
162
162
|
});
|
|
163
163
|
});
|
|
164
164
|
|
|
165
|
+
describe("telemetry attribution (#3375)", () => {
|
|
166
|
+
const readsTelemetry: PostSynthCheck = {
|
|
167
|
+
id: "TELEMETRY",
|
|
168
|
+
description: "reports the attribution the context carries",
|
|
169
|
+
check(ctx) {
|
|
170
|
+
return [{ checkId: "TELEMETRY", severity: "warning", message: JSON.stringify(ctx.telemetry ?? null) }];
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
test("the build's attribution is threaded into the context", () => {
|
|
175
|
+
const diags = runPostSynthChecks([readsTelemetry], createBuildResult(), undefined, { telemetry: { workspace: "acme" } });
|
|
176
|
+
expect(diags[0].message).toBe('{"workspace":"acme"}');
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test("a level-0 run leaves the field undefined", () => {
|
|
180
|
+
expect(runPostSynthChecks([readsTelemetry], createBuildResult())[0].message).toBe("null");
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
165
184
|
describe("isPostSynthCheck", () => {
|
|
166
185
|
test("accepts a well-formed check and rejects others", async () => {
|
|
167
186
|
const { isPostSynthCheck } = await import("./post-synth");
|
package/src/lint/post-synth.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Declarable } from "../declarable";
|
|
2
2
|
import type { ActivityContract } from "../op/activity-contract";
|
|
3
3
|
import type { SerializerResult } from "../serializer";
|
|
4
|
+
import type { TelemetryAttribution } from "../telemetry-attribution";
|
|
4
5
|
import type { Severity } from "./rule";
|
|
5
6
|
import { parseOutputDocs, type OutputDoc } from "./output-docs";
|
|
6
7
|
|
|
@@ -55,6 +56,13 @@ export interface PostSynthContext {
|
|
|
55
56
|
* when it is `undefined`.
|
|
56
57
|
*/
|
|
57
58
|
readonly activityContracts?: ReadonlyMap<string, ActivityContract>;
|
|
59
|
+
/**
|
|
60
|
+
* The telemetry attribution the build stamped (#2558), from
|
|
61
|
+
* `resolveTelemetryAttribution`. Set when the project is inside a workspace
|
|
62
|
+
* or sets `telemetry.attribution: true`, and absent at level 0 and from a
|
|
63
|
+
* hand-built context. OTEL118 runs only when it is set.
|
|
64
|
+
*/
|
|
65
|
+
readonly telemetry?: TelemetryAttribution;
|
|
58
66
|
/** Raw build result object */
|
|
59
67
|
buildResult: {
|
|
60
68
|
outputs: Map<string, string | SerializerResult>;
|
|
@@ -183,6 +191,14 @@ export interface PostSynthCheck {
|
|
|
183
191
|
description: string;
|
|
184
192
|
/** Execute the check and return diagnostics */
|
|
185
193
|
check(ctx: PostSynthContext): PostSynthDiagnostic[];
|
|
194
|
+
/**
|
|
195
|
+
* `chant audit` skips this check unless the project enables it with a
|
|
196
|
+
* `lint.rules` entry for its id (chant #3190). Builds are not affected: they
|
|
197
|
+
* already filter by the lexicon's `lintPresets()`. It exists because the
|
|
198
|
+
* audit runs every check a lexicon ships, report-only ones included, so a
|
|
199
|
+
* new check would otherwise change the audit output of every project.
|
|
200
|
+
*/
|
|
201
|
+
auditOptIn?: boolean;
|
|
186
202
|
}
|
|
187
203
|
|
|
188
204
|
/** Structural type guard — used to collect project-authored policy checks. */
|
|
@@ -201,12 +217,13 @@ export function isPostSynthCheck(value: unknown): value is PostSynthCheck {
|
|
|
201
217
|
* into the context so a check can branch on the current environment/stack, and
|
|
202
218
|
* `opts.activityContracts` (chant #2101) carries the build's cross-lexicon
|
|
203
219
|
* activity-contract map to the checks that validate Op steps against it.
|
|
220
|
+
* `opts.telemetry` is the build's resolved telemetry attribution.
|
|
204
221
|
*/
|
|
205
222
|
export function runPostSynthChecks(
|
|
206
223
|
checks: PostSynthCheck[],
|
|
207
224
|
buildResult: PostSynthContext["buildResult"],
|
|
208
225
|
env?: string,
|
|
209
|
-
opts?: { activityContracts?: ReadonlyMap<string, ActivityContract
|
|
226
|
+
opts?: { activityContracts?: ReadonlyMap<string, ActivityContract>; telemetry?: TelemetryAttribution },
|
|
210
227
|
): PostSynthDiagnostic[] {
|
|
211
228
|
const getDocs = createDocsAccessor(buildResult.outputs);
|
|
212
229
|
const ctx: PostSynthContext = {
|
|
@@ -215,6 +232,7 @@ export function runPostSynthChecks(
|
|
|
215
232
|
env,
|
|
216
233
|
buildResult,
|
|
217
234
|
...(opts?.activityContracts ? { activityContracts: opts.activityContracts } : {}),
|
|
235
|
+
...(opts?.telemetry ? { telemetry: opts.telemetry } : {}),
|
|
218
236
|
get docs(): OutputDoc[] {
|
|
219
237
|
return getDocs();
|
|
220
238
|
},
|
|
@@ -43,7 +43,7 @@ const DELIBERATELY_UNDECLARED = new Map<string, string>([
|
|
|
43
43
|
[
|
|
44
44
|
"@cdktn/hcl2json",
|
|
45
45
|
"carries a ~1.8 MB wasm blob and is only needed by `chant carve`; " +
|
|
46
|
-
"`terraform/
|
|
46
|
+
"`terraform/hcl2json.ts` catches the failed import and prints the install line",
|
|
47
47
|
],
|
|
48
48
|
[
|
|
49
49
|
"@intentius/chant-lexicon-gitlab",
|
|
@@ -252,6 +252,29 @@ export const sourceArchiveContract = activityContract(
|
|
|
252
252
|
z.object({ digest: z.string(), archive: z.string(), commit: z.string(), dir: z.string(), files: z.number(), bytes: z.number() }),
|
|
253
253
|
);
|
|
254
254
|
|
|
255
|
+
const changeSetPart = z.object({
|
|
256
|
+
member: z.object({ member: z.string(), planDigest: z.string().nullable() }).passthrough(),
|
|
257
|
+
entries: z.array(z.unknown()),
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
export const composeChangeSetContract = activityContract(
|
|
261
|
+
"composeChangeSet",
|
|
262
|
+
z.strictObject({ parts: z.array(changeSetPart) }),
|
|
263
|
+
z.object({ document: z.record(z.string(), z.unknown()), digest: z.string(), summary: z.record(z.string(), z.unknown()) }),
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
export const lifecyclePlanChangeSetContract = activityContract(
|
|
267
|
+
"lifecyclePlanChangeSet",
|
|
268
|
+
z.strictObject({ member: z.string(), env: z.string(), cwd: z.string().optional(), owned: z.boolean().optional() }),
|
|
269
|
+
z.object({ part: changeSetPart }),
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
export const readChangeSetPartContract = activityContract(
|
|
273
|
+
"readChangeSetPart",
|
|
274
|
+
z.strictObject({ member: z.string(), planner: z.enum(["chant", "warden"]), file: z.string(), lexicon: z.string().optional() }),
|
|
275
|
+
z.object({ part: changeSetPart }),
|
|
276
|
+
);
|
|
277
|
+
|
|
255
278
|
export const releasePlanContract = activityContract(
|
|
256
279
|
"releasePlan",
|
|
257
280
|
z.strictObject({
|
|
@@ -356,3 +379,64 @@ export const releaseRollbackRecordContract = activityContract(
|
|
|
356
379
|
}),
|
|
357
380
|
z.object({ recorded: z.boolean(), digest: z.string(), env: z.string(), component: z.string(), approver: z.string().nullable() }),
|
|
358
381
|
);
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* The factory reference Op's activities (#3406, ws-087, ./factory.ts).
|
|
385
|
+
* OPS013 checks a later step's reference into each result, so `factoryOp`'s
|
|
386
|
+
* wiring (ask into build, build into check, all three into record) is
|
|
387
|
+
* validated at `chant build`.
|
|
388
|
+
*/
|
|
389
|
+
const factoryLease = z.unknown();
|
|
390
|
+
const factoryBackends = z.record(z.string(), backendSchema).optional();
|
|
391
|
+
|
|
392
|
+
export const factoryPickContract = activityContract(
|
|
393
|
+
"factoryPick",
|
|
394
|
+
z.strictObject({ cwd: z.string().optional(), kind: z.string().optional() }),
|
|
395
|
+
z.strictObject({
|
|
396
|
+
candidates: z.array(z.string()),
|
|
397
|
+
held: z.array(z.object({ item: z.string(), hold: z.string(), message: z.string() })),
|
|
398
|
+
keys: z.array(z.string()),
|
|
399
|
+
}),
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
export const factoryReadyContract = activityContract(
|
|
403
|
+
"factoryReady",
|
|
404
|
+
z.strictObject({ cwd: z.string().optional(), kind: z.string().optional(), also: z.string().optional() }),
|
|
405
|
+
z.array(z.string()),
|
|
406
|
+
);
|
|
407
|
+
|
|
408
|
+
export const factoryAskContract = activityContract(
|
|
409
|
+
"factoryAsk",
|
|
410
|
+
z.strictObject({ lease: factoryLease, cwd: z.string().optional(), kind: z.string().optional(), backends: factoryBackends }),
|
|
411
|
+
z.strictObject({
|
|
412
|
+
item: z.string(),
|
|
413
|
+
ask: z.boolean(),
|
|
414
|
+
tier: z.string(),
|
|
415
|
+
understand: z.string().nullable(),
|
|
416
|
+
outcome: z.enum(["dropped", "redraft", "ask"]).nullable(),
|
|
417
|
+
}),
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
export const factoryBuildContract = activityContract(
|
|
421
|
+
"factoryBuild",
|
|
422
|
+
z.strictObject({ lease: factoryLease, ask: z.unknown(), builder: z.string().min(1), context: z.string().optional(), cwd: z.string().optional() }),
|
|
423
|
+
z.strictObject({ ran: z.boolean(), finished: z.boolean(), exitCode: z.number().nullable(), reverted: z.array(z.string()), note: z.string(), report: z.record(z.string(), z.unknown()).nullable() }),
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
export const factoryCheckContract = activityContract(
|
|
427
|
+
"factoryCheck",
|
|
428
|
+
z.strictObject({ lease: factoryLease, build: z.unknown(), check: z.string().optional(), cwd: z.string().optional() }),
|
|
429
|
+
z.strictObject({ ran: z.boolean(), ok: z.boolean(), command: z.string().nullable(), evidence: z.array(z.string()), log: z.string().nullable(), report: z.record(z.string(), z.unknown()).nullable() }),
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
export const factoryRecordContract = activityContract(
|
|
433
|
+
"factoryRecord",
|
|
434
|
+
z.strictObject({ lease: factoryLease, ask: z.unknown(), build: z.unknown(), check: z.unknown(), after: z.string().optional(), cwd: z.string().optional() }),
|
|
435
|
+
z.strictObject({
|
|
436
|
+
outcome: z.enum(["done", "not_done", "dropped", "redraft", "ask"]),
|
|
437
|
+
reason: z.string().nullable(),
|
|
438
|
+
commit: z.string().nullable(),
|
|
439
|
+
implementsProposed: z.array(z.object({ decision: z.string(), paths: z.array(z.string()) })),
|
|
440
|
+
}),
|
|
441
|
+
);
|
|
442
|
+
|