@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
|
@@ -25,6 +25,8 @@ export type { ReleaseRollbackPlanArgs, ReleaseRollbackPlanResult, ReleaseRollbac
|
|
|
25
25
|
export type { HttpCheckArgs, HttpFetch } from "./http-check";
|
|
26
26
|
|
|
27
27
|
export { lifecycleSnapshot, lifecycleDiff } from "./lifecycle";
|
|
28
|
+
export { composeChangeSet, lifecyclePlanChangeSet, readChangeSetPart } from "./change-set";
|
|
29
|
+
export type { ComposeChangeSetArgs, ComposeChangeSetResult, LifecyclePlanChangeSetArgs, ReadChangeSetPartArgs, ChangeSetPartResult } from "./change-set";
|
|
28
30
|
export type { LifecycleSnapshotArgs, LifecycleDiffArgs, LifecycleDiffResult } from "./lifecycle";
|
|
29
31
|
|
|
30
32
|
export { chantTeardown } from "./teardown";
|
|
@@ -70,6 +72,9 @@ export type {
|
|
|
70
72
|
AzureApplier,
|
|
71
73
|
GcpApplier,
|
|
72
74
|
FlyApplier,
|
|
75
|
+
GrafanaApplier,
|
|
76
|
+
ClickHouseApplier,
|
|
77
|
+
PostgresApplier,
|
|
73
78
|
AwsApplier,
|
|
74
79
|
AwsRollback,
|
|
75
80
|
} from "./apply";
|
|
@@ -178,3 +183,7 @@ export type { ChangeCoverageArgs, ChangeCoverageResult } from "./change-coverage
|
|
|
178
183
|
// loads the workspace code on first call.
|
|
179
184
|
export { decide } from "./decide";
|
|
180
185
|
export type { DecideArgs, DecideResult } from "./decide";
|
|
186
|
+
|
|
187
|
+
// The factory reference Op's rules and hooks (#3406, ws-087): `factoryOp` in ../factory.ts declares them.
|
|
188
|
+
export { factoryPick, factoryReady, factoryAsk, factoryBuild, factoryCheck, factoryRecord } from "./factory";
|
|
189
|
+
export type { FactoryAskResult, FactoryBuildResult, FactoryCheckResult, FactoryRecordResult, FactoryPickResult, FactoryLease } from "./factory";
|
|
@@ -18,23 +18,37 @@ import type { UpgradeCheckResult } from "../../codegen/pinned-upgrade";
|
|
|
18
18
|
import type { RollingUpgradeResult } from "../../codegen/rolling-upgrade";
|
|
19
19
|
import { tmpdir } from "node:os";
|
|
20
20
|
import { join } from "node:path";
|
|
21
|
-
import { writeFileSync, readFileSync } from "node:fs";
|
|
21
|
+
import { writeFileSync, readFileSync, mkdirSync } from "node:fs";
|
|
22
22
|
|
|
23
23
|
// ── Classification ────────────────────────────────────────────────────
|
|
24
24
|
|
|
25
25
|
describe("pinned vs rolling classification", () => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const pin = {
|
|
27
|
+
file: "src/pin.ts",
|
|
28
|
+
pattern: /V = "(.+)"/,
|
|
29
|
+
replace: (v: string) => `V = "${v}"`,
|
|
30
|
+
upstream: { owner: "o", repo: "r", kind: "releases" as const },
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
test("pinned lexicons are any whose plugin declares upstreamPin", async () => {
|
|
34
|
+
const loadPin = vi.fn(async () => pin);
|
|
35
|
+
for (const l of ["k8s", "gcp", "docker", "gitlab", "sql", "k3s", "cedar"]) {
|
|
36
|
+
expect(await isPinned(l, "/x", loadPin)).toBe(true);
|
|
29
37
|
expect(isRolling(l)).toBe(false);
|
|
30
38
|
}
|
|
31
39
|
});
|
|
32
40
|
|
|
33
|
-
test("
|
|
41
|
+
test("a lexicon without a pin is not pinned", async () => {
|
|
42
|
+
expect(await isPinned("helm", "/x", async () => null)).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("rolling lexicons", async () => {
|
|
46
|
+
const loadPin = vi.fn(async () => null);
|
|
34
47
|
for (const l of ["aws", "azure", "github"] as const) {
|
|
35
48
|
expect(isRolling(l)).toBe(true);
|
|
36
|
-
expect(isPinned(l)).toBe(false);
|
|
49
|
+
expect(await isPinned(l, "/x", loadPin)).toBe(false);
|
|
37
50
|
}
|
|
51
|
+
expect(loadPin).not.toHaveBeenCalled();
|
|
38
52
|
});
|
|
39
53
|
});
|
|
40
54
|
|
|
@@ -389,6 +403,86 @@ describe("lexiconUpgrade breakage handling", () => {
|
|
|
389
403
|
|
|
390
404
|
// ── out-of-scope rejection ────────────────────────────────────────────
|
|
391
405
|
|
|
406
|
+
describe("discovered pinned lexicons (#3266)", () => {
|
|
407
|
+
const pin = {
|
|
408
|
+
file: "src/pin.ts",
|
|
409
|
+
pattern: /V = "(.+)"/,
|
|
410
|
+
replace: (v: string) => `V = "${v}"`,
|
|
411
|
+
upstream: { owner: "o", repo: "r", kind: "releases" as const },
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
test("a lexicon with a declared pin reaches the pinned check and opens a PR", async () => {
|
|
415
|
+
const checkPinned: CheckPinnedFn = vi.fn(async () => pinnedResult());
|
|
416
|
+
const applyBump = vi.fn(async () => ({ filePath: "/x/src/pin.ts" }));
|
|
417
|
+
const { gh } = recordingGh();
|
|
418
|
+
const dir = join(tmpdir(), `chant-3266-${process.pid}`);
|
|
419
|
+
mkdirSync(dir, { recursive: true });
|
|
420
|
+
writeFileSync(join(dir, "package.json"), JSON.stringify({ version: "0.1.0" }));
|
|
421
|
+
const r = await lexiconUpgrade({
|
|
422
|
+
lexicon: "k3s",
|
|
423
|
+
lexiconDir: dir,
|
|
424
|
+
mode: "pull-request",
|
|
425
|
+
_loadPin: async () => pin,
|
|
426
|
+
_checkPinned: checkPinned,
|
|
427
|
+
_applyBump: applyBump,
|
|
428
|
+
_bumpPackageVersion: vi.fn(),
|
|
429
|
+
_gh: gh,
|
|
430
|
+
});
|
|
431
|
+
expect(checkPinned).toHaveBeenCalledOnce();
|
|
432
|
+
expect(applyBump).toHaveBeenCalledWith("k3s", dir, "v1.33.0");
|
|
433
|
+
expect(r.hasUpgrade).toBe(true);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
test("a lexicon with no pin and not rolling is rejected", async () => {
|
|
437
|
+
await expect(
|
|
438
|
+
lexiconUpgrade({ lexicon: "helm", mode: "report", _loadPin: async () => null }),
|
|
439
|
+
).rejects.toThrow(/not supported/);
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
test("a discovered pin reaches the real check when none is injected", async () => {
|
|
443
|
+
const loadPin = vi.fn(async () => pin);
|
|
444
|
+
// The real checkPinnedUpgrade loads the pin itself; an empty dir has no
|
|
445
|
+
// plugin, so it reports the fetch error rather than throwing "not supported".
|
|
446
|
+
const r = await lexiconUpgrade({
|
|
447
|
+
lexicon: "sql",
|
|
448
|
+
lexiconDir: join(tmpdir(), "chant-3266-none"),
|
|
449
|
+
mode: "report",
|
|
450
|
+
_loadPin: loadPin,
|
|
451
|
+
});
|
|
452
|
+
expect(loadPin).toHaveBeenCalledOnce();
|
|
453
|
+
expect(r.validationOk).toBe(false);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
test("an alsoMoves pin is report-only: newer version and manual step, no bump, no git", async () => {
|
|
457
|
+
const manual = pinnedResult({
|
|
458
|
+
validation: null,
|
|
459
|
+
from: "25.8.1.1-lts",
|
|
460
|
+
to: "26.3.1.1-lts",
|
|
461
|
+
manualPin: { file: "src/spec/pin.ts", instructions: "move CLICKHOUSE_IMAGE_DIGEST too" },
|
|
462
|
+
});
|
|
463
|
+
const applyBump = vi.fn();
|
|
464
|
+
const { gh, calls } = recordingGh();
|
|
465
|
+
for (const mode of ["report", "issue", "pull-request"] as const) {
|
|
466
|
+
const r = await lexiconUpgrade({
|
|
467
|
+
lexicon: "sql",
|
|
468
|
+
mode,
|
|
469
|
+
_checkPinned: vi.fn(async () => manual),
|
|
470
|
+
_applyBump: applyBump,
|
|
471
|
+
_gh: gh,
|
|
472
|
+
});
|
|
473
|
+
expect(r.hasUpgrade).toBe(true);
|
|
474
|
+
expect(r.mode).toBe("report");
|
|
475
|
+
expect(r.prUrl).toBeUndefined();
|
|
476
|
+
expect(r.issueUrl).toBeUndefined();
|
|
477
|
+
expect(r.summary).toContain("26.3.1.1-lts");
|
|
478
|
+
expect(r.summary).toContain("move CLICKHOUSE_IMAGE_DIGEST too");
|
|
479
|
+
expect(r.summary).toContain("src/spec/pin.ts");
|
|
480
|
+
}
|
|
481
|
+
expect(applyBump).not.toHaveBeenCalled();
|
|
482
|
+
expect(calls).toHaveLength(0);
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
|
|
392
486
|
describe("out-of-scope lexicons", () => {
|
|
393
487
|
test("helm/forgejo throw", async () => {
|
|
394
488
|
for (const l of ["helm", "forgejo"]) {
|
|
@@ -585,3 +679,63 @@ describe("lexiconUpgrade pull-request mode: package.json version bump", () => {
|
|
|
585
679
|
}
|
|
586
680
|
});
|
|
587
681
|
});
|
|
682
|
+
|
|
683
|
+
describe("a lexicon with several pins (#3288)", () => {
|
|
684
|
+
const manual = (pin: string, from: string, to: string): UpgradeCheckResult =>
|
|
685
|
+
pinnedResult({ pin, validation: null, from, to, manualPin: { file: "src/spec/postgres-pin.ts", instructions: `move the ${pin} digest too` } });
|
|
686
|
+
const current = (pin: string, v: string): UpgradeCheckResult => pinnedResult({ pin, validation: null, hasUpgrade: false, from: v, to: v });
|
|
687
|
+
|
|
688
|
+
test("every pin is reported; manual pins stay report-only in every mode", async () => {
|
|
689
|
+
const results = [current("clickhouse", "26.8.15.10"), manual("postgres-17", "17.11", "17.12"), manual("postgres-14", "14.24", "14.25")];
|
|
690
|
+
const applyBump = vi.fn();
|
|
691
|
+
const { gh, calls } = recordingGh();
|
|
692
|
+
for (const mode of ["report", "issue", "pull-request"] as const) {
|
|
693
|
+
const r = await lexiconUpgrade({ lexicon: "sql", mode, _checkPinned: vi.fn(async () => results), _applyBump: applyBump, _gh: gh });
|
|
694
|
+
expect(r.hasUpgrade).toBe(true);
|
|
695
|
+
expect(r.mode).toBe("report");
|
|
696
|
+
expect(r.summary).toContain("## Lexicon upgrade: sql (clickhouse)");
|
|
697
|
+
expect(r.summary).toContain("## Lexicon upgrade: sql (postgres-17)");
|
|
698
|
+
expect(r.summary).toContain("move the postgres-17 digest too");
|
|
699
|
+
expect(r.summary).toContain("move the postgres-14 digest too");
|
|
700
|
+
}
|
|
701
|
+
expect(applyBump).not.toHaveBeenCalled();
|
|
702
|
+
expect(calls).toHaveLength(0);
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
test("no pin has an upgrade: nothing to do", async () => {
|
|
706
|
+
const r = await lexiconUpgrade({
|
|
707
|
+
lexicon: "sql",
|
|
708
|
+
_checkPinned: vi.fn(async () => [current("clickhouse", "1.0"), current("postgres-18", "18.6")]),
|
|
709
|
+
});
|
|
710
|
+
expect(r.hasUpgrade).toBe(false);
|
|
711
|
+
expect(r.validationOk).toBe(true);
|
|
712
|
+
});
|
|
713
|
+
|
|
714
|
+
test("the pin label is forwarded to the check", async () => {
|
|
715
|
+
const check = vi.fn(async () => [current("postgres-16", "16.15")]);
|
|
716
|
+
await lexiconUpgrade({ lexicon: "sql", pin: "postgres-16", _checkPinned: check });
|
|
717
|
+
expect(check).toHaveBeenCalledWith(expect.objectContaining({ lexicon: "sql", pin: "postgres-16" }));
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
test("a rewritable pin leads: the PR branch, title and bump name the pin", async () => {
|
|
721
|
+
const results = [manual("clickhouse", "1.0", "2.0"), pinnedResult({ pin: "postgres-17", from: "17.11", to: "17.12" })];
|
|
722
|
+
const applyBump = vi.fn(async () => ({ filePath: "/x/pin.ts" }));
|
|
723
|
+
const { gh, calls } = recordingGh();
|
|
724
|
+
const dir = join(tmpdir(), `chant-3288-${process.pid}`);
|
|
725
|
+
mkdirSync(dir, { recursive: true });
|
|
726
|
+
writeFileSync(join(dir, "package.json"), JSON.stringify({ version: "0.1.0" }));
|
|
727
|
+
await lexiconUpgrade({
|
|
728
|
+
lexicon: "sql",
|
|
729
|
+
mode: "pull-request",
|
|
730
|
+
lexiconDir: dir,
|
|
731
|
+
_checkPinned: vi.fn(async () => results),
|
|
732
|
+
_applyBump: applyBump,
|
|
733
|
+
_bumpPackageVersion: vi.fn(() => "/x/package.json"),
|
|
734
|
+
_gh: gh,
|
|
735
|
+
});
|
|
736
|
+
expect(applyBump).toHaveBeenCalledWith("sql", dir, "17.12", "postgres-17");
|
|
737
|
+
expect(calls.some((c) => c.includes("lexicon-upgrade/sql-postgres-17"))).toBe(true);
|
|
738
|
+
expect(upgradeBranchName("sql", "postgres-17")).toBe("lexicon-upgrade/sql-postgres-17");
|
|
739
|
+
expect(upgradePrTitle("sql", "17.11", "17.12", "postgres-17")).toBe("feat(sql): upgrade postgres-17 17.11 to 17.12");
|
|
740
|
+
});
|
|
741
|
+
});
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* lexiconUpgrade — the upgrade-detection and PR-automation activity for
|
|
3
|
-
* in-scope lexicons
|
|
3
|
+
* in-scope lexicons: every lexicon whose plugin declares `upstreamPin` (k8s,
|
|
4
|
+
* k3s, gcp, docker, gitlab, cedar, sql, ...) plus the rolling ones (aws, azure,
|
|
5
|
+
* github, fly).
|
|
4
6
|
*
|
|
5
7
|
* Classifies the lexicon as pinned or rolling, calls the right check function,
|
|
6
8
|
* then surfaces the result in the requested mode: report (default), issue, or
|
|
@@ -25,7 +27,7 @@ import { exec } from "node:child_process";
|
|
|
25
27
|
import { promisify } from "node:util";
|
|
26
28
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
27
29
|
import { join } from "node:path";
|
|
28
|
-
import type { UpgradeCheckResult, LexiconId } from "../../codegen/pinned-upgrade";
|
|
30
|
+
import type { UpgradeCheckResult, LexiconId, UpstreamPin } from "../../codegen/pinned-upgrade";
|
|
29
31
|
import type { RollingUpgradeResult, RollingLexicon } from "../../codegen/rolling-upgrade";
|
|
30
32
|
import { bumpForSeverity, bumpPackageJsonVersion } from "../../codegen/version-bump";
|
|
31
33
|
import { postOrUpdateGithubIssue } from "./reconcile";
|
|
@@ -48,8 +50,9 @@ export type SemverLabel = "minor" | "breaking";
|
|
|
48
50
|
export interface LexiconUpgradeArgs {
|
|
49
51
|
/**
|
|
50
52
|
* Which lexicon to check. Determines pinned vs rolling dispatch:
|
|
51
|
-
* PINNED: k8s, gcp, docker, gitlab, cedar
|
|
52
53
|
* ROLLING: aws, azure, github, fly
|
|
54
|
+
* PINNED: any other lexicon whose plugin declares `upstreamPin`
|
|
55
|
+
* (discovered at run time, as `chant dev pinned-upgrade` does)
|
|
53
56
|
*/
|
|
54
57
|
lexicon: SupportedLexicon;
|
|
55
58
|
/**
|
|
@@ -57,11 +60,17 @@ export interface LexiconUpgradeArgs {
|
|
|
57
60
|
* Defaults to `<cwd>/lexicons/<lexicon>`.
|
|
58
61
|
*/
|
|
59
62
|
lexiconDir?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Label of one pin to check, for a lexicon whose plugin declares several
|
|
65
|
+
* (`upstreamPins`). Omitted, every pin is checked and reported.
|
|
66
|
+
*/
|
|
67
|
+
pin?: string;
|
|
60
68
|
/** What to produce. Default: "report". */
|
|
61
69
|
mode?: LexiconUpgradeMode;
|
|
62
70
|
/**
|
|
63
|
-
* Override the pinned check function — inject a mock in tests.
|
|
64
|
-
*
|
|
71
|
+
* Override the pinned check function — inject a mock in tests. It may
|
|
72
|
+
* return one result or one per pin.
|
|
73
|
+
* The real implementation calls checkPinnedUpgrades from core.
|
|
65
74
|
*/
|
|
66
75
|
_checkPinned?: CheckPinnedFn;
|
|
67
76
|
/**
|
|
@@ -77,6 +86,13 @@ export interface LexiconUpgradeArgs {
|
|
|
77
86
|
* Override the applyPinnedVersionBump function — inject a mock in tests.
|
|
78
87
|
*/
|
|
79
88
|
_applyBump?: ApplyBumpFn;
|
|
89
|
+
/**
|
|
90
|
+
* Override pin discovery — inject a mock in tests. The real one is
|
|
91
|
+
* `loadUpstreamPin` from core, the loader `chant dev pinned-upgrade` uses.
|
|
92
|
+
* Not consulted when `_checkPinned` is injected: that stands in for the
|
|
93
|
+
* whole pinned check.
|
|
94
|
+
*/
|
|
95
|
+
_loadPin?: (lexicon: string, lexiconDir: string) => Promise<UpstreamPin | null>;
|
|
80
96
|
/**
|
|
81
97
|
* Override the package.json version writer — inject a mock in tests.
|
|
82
98
|
* Defaults to bumpPackageJsonVersion.
|
|
@@ -109,9 +125,11 @@ export interface LexiconUpgradeResult {
|
|
|
109
125
|
export type CheckPinnedFn = (opts: {
|
|
110
126
|
lexiconDir: string;
|
|
111
127
|
lexicon: LexiconId;
|
|
128
|
+
/** One pin's label; omitted, every pin of the plugin. */
|
|
129
|
+
pin?: string;
|
|
112
130
|
force?: boolean;
|
|
113
131
|
verbose?: boolean;
|
|
114
|
-
}) => Promise<UpgradeCheckResult>;
|
|
132
|
+
}) => Promise<UpgradeCheckResult | UpgradeCheckResult[]>;
|
|
115
133
|
|
|
116
134
|
/** Matches checkRollingUpgrade from core. */
|
|
117
135
|
export type CheckRollingFn = (opts: {
|
|
@@ -141,6 +159,7 @@ export type ApplyBumpFn = (
|
|
|
141
159
|
lexicon: LexiconId,
|
|
142
160
|
lexiconDir: string,
|
|
143
161
|
newVersion: string,
|
|
162
|
+
pin?: string,
|
|
144
163
|
) => { filePath: string } | Promise<{ filePath: string }>;
|
|
145
164
|
|
|
146
165
|
/**
|
|
@@ -177,21 +196,32 @@ export function computeBumpedVersion(
|
|
|
177
196
|
|
|
178
197
|
// ── Classification ────────────────────────────────────────────────────
|
|
179
198
|
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
|
|
199
|
+
// Rolling lexicons follow their upstream spec with no version constant, so
|
|
200
|
+
// they are a fixed list. Every other lexicon is pinned when its plugin declares
|
|
201
|
+
// `upstreamPin` (cedar's CEDAR_WASM_VERSION, sql's ClickHouse version, k3s...):
|
|
202
|
+
// discovered at run time, not listed here.
|
|
183
203
|
const ROLLING_LEXICONS: ReadonlySet<string> = new Set<RollingLexicon>(["aws", "azure", "github", "fly"]);
|
|
184
204
|
|
|
185
|
-
/** Return true when the lexicon uses a pinned version constant. */
|
|
186
|
-
export function isPinned(lexicon: SupportedLexicon): lexicon is LexiconId {
|
|
187
|
-
return PINNED_LEXICONS.has(lexicon);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
205
|
/** Return true when the lexicon follows a rolling spec (no pinned constant). */
|
|
191
206
|
export function isRolling(lexicon: SupportedLexicon): lexicon is RollingLexicon {
|
|
192
207
|
return ROLLING_LEXICONS.has(lexicon);
|
|
193
208
|
}
|
|
194
209
|
|
|
210
|
+
/**
|
|
211
|
+
* Return true when the lexicon's plugin declares an `upstreamPin` (loaded from
|
|
212
|
+
* `lexiconDir`, else from its installed package), the same discovery
|
|
213
|
+
* `chant dev pinned-upgrade` does.
|
|
214
|
+
*/
|
|
215
|
+
export async function isPinned(
|
|
216
|
+
lexicon: SupportedLexicon,
|
|
217
|
+
lexiconDir?: string,
|
|
218
|
+
loadPin?: (lexicon: string, lexiconDir: string) => Promise<UpstreamPin | null>,
|
|
219
|
+
): Promise<boolean> {
|
|
220
|
+
if (isRolling(lexicon)) return false;
|
|
221
|
+
const load = loadPin ?? (async (l, d) => (await import("../../codegen/pinned-upgrade")).loadUpstreamPin(l, d));
|
|
222
|
+
return (await load(lexicon, lexiconDir ?? `${process.cwd()}/lexicons/${lexicon}`)) !== null;
|
|
223
|
+
}
|
|
224
|
+
|
|
195
225
|
// ── Semver labeling ───────────────────────────────────────────────────
|
|
196
226
|
|
|
197
227
|
/**
|
|
@@ -210,8 +240,8 @@ export function severityToLabel(severity: string): SemverLabel | null {
|
|
|
210
240
|
// ── Branch / PR naming ────────────────────────────────────────────────
|
|
211
241
|
|
|
212
242
|
/** Long-lived branch name for a lexicon upgrade PR. */
|
|
213
|
-
export function upgradeBranchName(lexicon: SupportedLexicon): string {
|
|
214
|
-
return `lexicon-upgrade/${lexicon}`;
|
|
243
|
+
export function upgradeBranchName(lexicon: SupportedLexicon, pin?: string): string {
|
|
244
|
+
return pin ? `lexicon-upgrade/${lexicon}-${pin}` : `lexicon-upgrade/${lexicon}`;
|
|
215
245
|
}
|
|
216
246
|
|
|
217
247
|
/** PR title for an upgrade. */
|
|
@@ -219,8 +249,9 @@ export function upgradePrTitle(
|
|
|
219
249
|
lexicon: SupportedLexicon,
|
|
220
250
|
from?: string,
|
|
221
251
|
to?: string | null,
|
|
252
|
+
pin?: string,
|
|
222
253
|
): string {
|
|
223
|
-
if (from && to) return `feat(${lexicon}): upgrade spec ${from} to ${to}`;
|
|
254
|
+
if (from && to) return `feat(${lexicon}): upgrade ${pin ? `${pin} ` : "spec "}${from} to ${to}`;
|
|
224
255
|
return `feat(${lexicon}): upgrade to latest spec`;
|
|
225
256
|
}
|
|
226
257
|
|
|
@@ -229,14 +260,18 @@ export function upgradePrTitle(
|
|
|
229
260
|
/** Build the PR/issue/report body from the upgrade result data. */
|
|
230
261
|
export function buildUpgradeSummary(opts: {
|
|
231
262
|
lexicon: SupportedLexicon;
|
|
263
|
+
/** The pin's label, for a lexicon with several pins. */
|
|
264
|
+
pin?: string;
|
|
232
265
|
from?: string;
|
|
233
266
|
to?: string | null;
|
|
234
267
|
deltaText: string;
|
|
235
268
|
semverLabel: SemverLabel | null;
|
|
236
269
|
validationOk: boolean;
|
|
237
270
|
failures?: Array<{ step: string; output: string }>;
|
|
271
|
+
/** Set for a pin that moves with other constants: nothing was bumped or regenerated. */
|
|
272
|
+
manualPin?: { file: string; instructions: string };
|
|
238
273
|
}): string {
|
|
239
|
-
const { lexicon, from, to, deltaText, semverLabel, validationOk, failures = [] } = opts;
|
|
274
|
+
const { lexicon, from, to, deltaText, semverLabel, validationOk, failures = [], manualPin } = opts;
|
|
240
275
|
|
|
241
276
|
// Example validation status (#604): the upgrade check lints the lexicon's
|
|
242
277
|
// examples (regenLexicon step 6), and an example failure makes validation
|
|
@@ -246,7 +281,7 @@ export function buildUpgradeSummary(opts: {
|
|
|
246
281
|
// for rolling lexicons.)
|
|
247
282
|
const exampleFailures = failures.filter((f) => f.step === "lint" || f.step === "examples");
|
|
248
283
|
|
|
249
|
-
const lines: string[] = [`## Lexicon upgrade: ${lexicon}`];
|
|
284
|
+
const lines: string[] = [`## Lexicon upgrade: ${lexicon}${opts.pin ? ` (${opts.pin})` : ""}`];
|
|
250
285
|
if (from) lines.push(``, `**From:** \`${from}\` **To:** \`${to ?? "latest"}\``);
|
|
251
286
|
if (semverLabel) lines.push(`**Semver label:** \`${semverLabel}\``);
|
|
252
287
|
lines.push(
|
|
@@ -257,6 +292,17 @@ export function buildUpgradeSummary(opts: {
|
|
|
257
292
|
|
|
258
293
|
lines.push(``);
|
|
259
294
|
|
|
295
|
+
if (manualPin) {
|
|
296
|
+
lines.push(`### Manual pin bump`);
|
|
297
|
+
lines.push(``);
|
|
298
|
+
lines.push(
|
|
299
|
+
`This pin cannot be rewritten automatically, so nothing was edited or regenerated. ` +
|
|
300
|
+
`Edit \`${manualPin.file}\`: ${manualPin.instructions}`,
|
|
301
|
+
);
|
|
302
|
+
lines.push(``);
|
|
303
|
+
return lines.join("\n");
|
|
304
|
+
}
|
|
305
|
+
|
|
260
306
|
if (!validationOk) {
|
|
261
307
|
lines.push(`### Validation failures`);
|
|
262
308
|
lines.push(``);
|
|
@@ -403,7 +449,7 @@ let _realApplyBump: ApplyBumpFn | null = null;
|
|
|
403
449
|
async function getRealCheckPinned(): Promise<CheckPinnedFn> {
|
|
404
450
|
if (!_realCheckPinned) {
|
|
405
451
|
const mod = await import("../../codegen/pinned-upgrade");
|
|
406
|
-
_realCheckPinned = (opts) => mod.
|
|
452
|
+
_realCheckPinned = (opts) => mod.checkPinnedUpgrades(opts);
|
|
407
453
|
}
|
|
408
454
|
return _realCheckPinned;
|
|
409
455
|
}
|
|
@@ -419,8 +465,8 @@ async function getRealCheckRolling(): Promise<CheckRollingFn> {
|
|
|
419
465
|
async function getRealApplyBump(): Promise<ApplyBumpFn> {
|
|
420
466
|
if (!_realApplyBump) {
|
|
421
467
|
const mod = await import("../../codegen/pinned-upgrade");
|
|
422
|
-
_realApplyBump = (lexicon, lexiconDir, newVersion) =>
|
|
423
|
-
mod.applyPinnedVersionBump(lexicon, lexiconDir, newVersion);
|
|
468
|
+
_realApplyBump = (lexicon, lexiconDir, newVersion, pin) =>
|
|
469
|
+
mod.applyPinnedVersionBump(lexicon, lexiconDir, newVersion, pin);
|
|
424
470
|
}
|
|
425
471
|
return _realApplyBump;
|
|
426
472
|
}
|
|
@@ -430,9 +476,12 @@ async function getRealApplyBump(): Promise<ApplyBumpFn> {
|
|
|
430
476
|
/**
|
|
431
477
|
* Run the lexicon upgrade check for one lexicon and surface the result.
|
|
432
478
|
*
|
|
433
|
-
* Pinned lexicons (
|
|
479
|
+
* Pinned lexicons (any whose plugin declares `upstreamPin`):
|
|
434
480
|
* Calls checkPinnedUpgrade. A PR is opened only when hasUpgrade=true AND
|
|
435
481
|
* validation passed. Validation failures produce a report or issue.
|
|
482
|
+
* A pin that moves with other constants (`alsoMoves`, sql's version plus
|
|
483
|
+
* digest) is report-only: the summary names the newer version and the
|
|
484
|
+
* manual step, and no branch, bump or PR is made.
|
|
436
485
|
*
|
|
437
486
|
* Rolling lexicons (aws, azure, github):
|
|
438
487
|
* Calls checkRollingUpgrade. A PR is opened only when the surface changed
|
|
@@ -472,20 +521,65 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
|
|
|
472
521
|
let to: string | null | undefined;
|
|
473
522
|
let freshSnapshotJson: string | null = null;
|
|
474
523
|
|
|
475
|
-
|
|
524
|
+
// An injected check stands in for the whole pinned check, so discovery runs
|
|
525
|
+
// only on the real path.
|
|
526
|
+
const pinned = !isRolling(lexicon) && (args._checkPinned ? true : await isPinned(lexicon, lexiconDir, args._loadPin));
|
|
527
|
+
let manualPin: { file: string; instructions: string } | undefined;
|
|
528
|
+
|
|
529
|
+
let pinLabel: string | undefined;
|
|
530
|
+
let summaryOverride: string | undefined;
|
|
531
|
+
|
|
532
|
+
if (pinned) {
|
|
476
533
|
const checkPinned = args._checkPinned ?? (await getRealCheckPinned());
|
|
477
|
-
const
|
|
534
|
+
const raw = await checkPinned({ lexiconDir, lexicon, ...(args.pin ? { pin: args.pin } : {}) });
|
|
535
|
+
const results = Array.isArray(raw) ? raw : [raw];
|
|
536
|
+
const multi = results.length > 1;
|
|
537
|
+
|
|
538
|
+
// The pin the rest of the flow (validation, bump, PR) acts on: the first
|
|
539
|
+
// one that has a rewritable upgrade, else the first with any finding.
|
|
540
|
+
// A pin with `alsoMoves` (manualPin) is report-only, so it never leads.
|
|
541
|
+
const rewritable = (r: UpgradeCheckResult) => r.hasUpgrade && !r.manualPin && !r.fetchError;
|
|
542
|
+
const result = results.find(rewritable) ?? results.find((r) => r.hasUpgrade || r.fetchError) ?? results[0]!;
|
|
543
|
+
if (multi) {
|
|
544
|
+
pinLabel = rewritable(result) ? result.pin : undefined;
|
|
545
|
+
const sections = results.map((r) =>
|
|
546
|
+
buildUpgradeSummary({
|
|
547
|
+
lexicon,
|
|
548
|
+
pin: r.pin,
|
|
549
|
+
from: r.from,
|
|
550
|
+
to: r.to,
|
|
551
|
+
deltaText: r.validation?.deltaText ?? "",
|
|
552
|
+
semverLabel: severityToLabel(r.validation?.severity ?? "none"),
|
|
553
|
+
validationOk: r.fetchError ? false : (r.validation?.ok ?? true),
|
|
554
|
+
failures: r.fetchError
|
|
555
|
+
? [{ step: "upstream-fetch", output: r.fetchError }]
|
|
556
|
+
: (r.validation?.failures ?? []).map((f) => ({ step: f.step, output: f.output })),
|
|
557
|
+
manualPin: r.manualPin,
|
|
558
|
+
}),
|
|
559
|
+
);
|
|
560
|
+
const others = results.filter((r) => r !== result && rewritable(r));
|
|
561
|
+
if (others.length > 0) {
|
|
562
|
+
const names = others.map((r) => r.pin).join(", ");
|
|
563
|
+
sections.push(
|
|
564
|
+
"More than one pin has an upgrade this run can bump. This run acts on " + result.pin +
|
|
565
|
+
"; run it again with pin set to each of the others (" + names + ").",
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
summaryOverride = sections.join("\n\n");
|
|
569
|
+
}
|
|
478
570
|
|
|
479
571
|
if (result.fetchError) {
|
|
480
|
-
const summary =
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
572
|
+
const summary =
|
|
573
|
+
summaryOverride ??
|
|
574
|
+
buildUpgradeSummary({
|
|
575
|
+
lexicon,
|
|
576
|
+
from: result.from,
|
|
577
|
+
to: result.to,
|
|
578
|
+
deltaText: "",
|
|
579
|
+
semverLabel: null,
|
|
580
|
+
validationOk: false,
|
|
581
|
+
failures: [{ step: "upstream-fetch", output: result.fetchError }],
|
|
582
|
+
});
|
|
489
583
|
return {
|
|
490
584
|
lexicon,
|
|
491
585
|
mode,
|
|
@@ -497,9 +591,10 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
|
|
|
497
591
|
};
|
|
498
592
|
}
|
|
499
593
|
|
|
500
|
-
hasUpgrade =
|
|
594
|
+
hasUpgrade = results.some((r) => r.hasUpgrade && !r.fetchError);
|
|
501
595
|
from = result.from;
|
|
502
596
|
to = result.to;
|
|
597
|
+
manualPin = multi ? (rewritable(result) ? undefined : result.manualPin) : result.manualPin;
|
|
503
598
|
severity = result.validation?.severity ?? "none";
|
|
504
599
|
deltaText = result.validation?.deltaText ?? "";
|
|
505
600
|
validationOk = result.validation?.ok ?? true;
|
|
@@ -524,20 +619,23 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
|
|
|
524
619
|
} else {
|
|
525
620
|
throw new Error(
|
|
526
621
|
`Lexicon "${lexicon as string}" is not supported by LexiconUpgradeOp. ` +
|
|
527
|
-
`Supported:
|
|
622
|
+
`Supported: the rolling lexicons (${[...ROLLING_LEXICONS].join(", ")}) and any lexicon whose plugin declares upstreamPin.`,
|
|
528
623
|
);
|
|
529
624
|
}
|
|
530
625
|
|
|
531
626
|
const semverLabel = severityToLabel(severity);
|
|
532
|
-
const summary =
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
627
|
+
const summary =
|
|
628
|
+
summaryOverride ??
|
|
629
|
+
buildUpgradeSummary({
|
|
630
|
+
lexicon,
|
|
631
|
+
from,
|
|
632
|
+
to,
|
|
633
|
+
deltaText,
|
|
634
|
+
semverLabel,
|
|
635
|
+
validationOk,
|
|
636
|
+
failures,
|
|
637
|
+
manualPin,
|
|
638
|
+
});
|
|
541
639
|
|
|
542
640
|
// ── 2. No upgrade ─────────────────────────────────────────────────
|
|
543
641
|
|
|
@@ -584,15 +682,20 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
|
|
|
584
682
|
|
|
585
683
|
// ── 4. Upgrade ready: surface according to mode ───────────────────
|
|
586
684
|
|
|
587
|
-
const title = upgradePrTitle(lexicon, from, to);
|
|
685
|
+
const title = upgradePrTitle(lexicon, from, to, pinLabel);
|
|
588
686
|
|
|
589
687
|
// #546: rolling lexicons have no version pin, so a "pull-request" would only
|
|
590
688
|
// refresh the baseline snapshot — low signal, no build-output change. Surface
|
|
591
689
|
// rolling drift as an issue instead; re-baselining stays a deliberate
|
|
592
690
|
// maintainer action (`chant dev surface-diff <lexicon> --update-snapshot --bump`).
|
|
593
691
|
// Pinned lexicons keep opening version-bump PRs.
|
|
594
|
-
|
|
595
|
-
|
|
692
|
+
// A pin that moves with other constants cannot be bumped here, so it is
|
|
693
|
+
// report-only whatever the mode.
|
|
694
|
+
const effectiveMode: LexiconUpgradeMode = manualPin
|
|
695
|
+
? "report"
|
|
696
|
+
: mode === "pull-request" && isRolling(lexicon)
|
|
697
|
+
? "issue"
|
|
698
|
+
: mode;
|
|
596
699
|
|
|
597
700
|
if (effectiveMode === "report") {
|
|
598
701
|
return {
|
|
@@ -622,7 +725,7 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
|
|
|
622
725
|
|
|
623
726
|
// ── 5. pull-request mode: idempotent branch + PR management ──────
|
|
624
727
|
|
|
625
|
-
const branch = upgradeBranchName(lexicon);
|
|
728
|
+
const branch = upgradeBranchName(lexicon, pinLabel);
|
|
626
729
|
|
|
627
730
|
// Idempotency check: if the open PR already has this summary, nothing changed.
|
|
628
731
|
// Compare trimmed — gh/git round-trips can alter trailing whitespace.
|
|
@@ -662,9 +765,9 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
|
|
|
662
765
|
await gh(`git checkout ${shellQuote(branch)}`);
|
|
663
766
|
|
|
664
767
|
// For pinned lexicons: apply the spec version bump permanently on this branch.
|
|
665
|
-
if (
|
|
768
|
+
if (pinned && to) {
|
|
666
769
|
const applyBump = args._applyBump ?? (await getRealApplyBump());
|
|
667
|
-
const { filePath } = await applyBump(lexicon, lexiconDir, to);
|
|
770
|
+
const { filePath } = await (pinLabel ? applyBump(lexicon, lexiconDir, to, pinLabel) : applyBump(lexicon, lexiconDir, to));
|
|
668
771
|
await gh(`git add ${shellQuote(filePath)}`).catch(() => {/* best-effort */});
|
|
669
772
|
|
|
670
773
|
// Bump the lexicon's package.json version so merging this PR causes
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
import { describe, expect, it } from "vitest";
|
|
9
9
|
import { z } from "zod";
|
|
10
|
-
import { activity, phase, effect } from "./builders";
|
|
10
|
+
import { activity, decide, phase, effect } from "./builders";
|
|
11
|
+
import { decideContract } from "./activities/activity-contracts";
|
|
11
12
|
import type { OpConfig } from "./types";
|
|
12
13
|
import {
|
|
13
14
|
activityContract,
|
|
@@ -118,6 +119,25 @@ describe("validateActivitySteps() — passing Ops", () => {
|
|
|
118
119
|
});
|
|
119
120
|
});
|
|
120
121
|
|
|
122
|
+
describe("validateActivitySteps() — a whole-value reference in a record-typed arg (#3299)", () => {
|
|
123
|
+
const contracts = new Map([["decide", decideContract]]);
|
|
124
|
+
|
|
125
|
+
it("accepts decide's `inputs: step.out.json` without throwing", () => {
|
|
126
|
+
const fetch = activity("fetchInputs", {}, { id: "fetch" });
|
|
127
|
+
const ask = decide("dispatch-tier", { inputs: fetch.out.json as unknown as Record<string, unknown> });
|
|
128
|
+
const config = opWith({ phases: [phase("Fetch", [fetch]), phase("Decide", [ask])] });
|
|
129
|
+
expect(validateActivitySteps(config, contracts)).toEqual([]);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("reports a symbol key in a record-typed arg as a finding instead of throwing", () => {
|
|
133
|
+
const step = activity("decide", { point: "dispatch-tier", inputs: { [Symbol("odd")]: 1 } });
|
|
134
|
+
const config = opWith({ phases: [phase("Decide", [step])] });
|
|
135
|
+
const issues = validateActivitySteps(config, contracts);
|
|
136
|
+
expect(issues.length).toBeGreaterThan(0);
|
|
137
|
+
expect(issues[0].message).toContain("args.inputs.Symbol(odd)");
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
121
141
|
describe("validateActivitySteps() — the four failure classes from #1288", () => {
|
|
122
142
|
it("flags an unknown profile — e.g. kubectlApply(..., { profile: \"longInfa\" })", () => {
|
|
123
143
|
const step = activity("kubectlApply", { manifest: "dist/k8s.yaml" }, "longInfa" as never);
|