@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, test, expect } from "vitest";
|
|
2
2
|
import { applyResult } from "../../apply";
|
|
3
3
|
import { defaultOutput, nativeApply, compensateApply, hasNativeRollback } from "./apply";
|
|
4
|
-
import type { K8sApplier, AzureApplier, GcpApplier, FlyApplier, AwsApplier, AwsRollback } from "./apply";
|
|
4
|
+
import type { K8sApplier, AzureApplier, GcpApplier, FlyApplier, GrafanaApplier, ClickHouseApplier, PostgresApplier, AwsApplier, AwsRollback } from "./apply";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* The kubectl branch moved to the k8s lexicon in chant #1075, the arm branch to
|
|
@@ -415,6 +415,189 @@ describe("nativeApply: fly dispatches to the fly lexicon (chant #1449)", () => {
|
|
|
415
415
|
});
|
|
416
416
|
});
|
|
417
417
|
|
|
418
|
+
describe("nativeApply: grafana dispatches to the grafana lexicon (chant #3011)", () => {
|
|
419
|
+
/** Records what the applier was handed, and reports an empty envelope. */
|
|
420
|
+
const spy = (): { calls: Array<Parameters<GrafanaApplier>[0]>; applier: GrafanaApplier } => {
|
|
421
|
+
const calls: Array<Parameters<GrafanaApplier>[0]> = [];
|
|
422
|
+
const applier: GrafanaApplier = async (args) => {
|
|
423
|
+
calls.push(args);
|
|
424
|
+
return applyResult([]);
|
|
425
|
+
};
|
|
426
|
+
return { calls, applier };
|
|
427
|
+
};
|
|
428
|
+
/** nativeApply with only the grafana applier injected. */
|
|
429
|
+
const applyGrafana = (args: Parameters<typeof nativeApply>[0], applier: GrafanaApplier) =>
|
|
430
|
+
nativeApply(args, undefined, undefined, undefined, undefined, undefined, undefined, undefined, applier);
|
|
431
|
+
|
|
432
|
+
test("output maps to the index path and env to the environment, and nothing else is passed", async () => {
|
|
433
|
+
const { calls, applier } = spy();
|
|
434
|
+
await applyGrafana({ target: "grafana", env: "prod", output: "dist/grafana.json" }, applier);
|
|
435
|
+
// env selects grafana.profiles.<env>; the ownership marker is read from
|
|
436
|
+
// chant.config.ts inside grafanaApply, so neither stack nor
|
|
437
|
+
// ownershipEnv crosses this seam.
|
|
438
|
+
expect(calls).toEqual([{ indexPath: "dist/grafana.json", environment: "prod", prune: false }]);
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
test("owned-only and gated ask the grafana applier to prune", async () => {
|
|
442
|
+
for (const deleteMode of ["owned-only", "gated"] as const) {
|
|
443
|
+
const { calls, applier } = spy();
|
|
444
|
+
await applyGrafana({ target: "grafana", env: "prod", deleteMode }, applier);
|
|
445
|
+
expect(calls[0].prune).toBe(true);
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
test("never (and the default) do not prune", async () => {
|
|
450
|
+
const explicit = spy();
|
|
451
|
+
await applyGrafana({ target: "grafana", env: "prod", deleteMode: "never" }, explicit.applier);
|
|
452
|
+
expect(explicit.calls[0].prune).toBe(false);
|
|
453
|
+
|
|
454
|
+
const defaulted = spy();
|
|
455
|
+
await applyGrafana({ target: "grafana", env: "prod" }, defaulted.applier);
|
|
456
|
+
expect(defaulted.calls[0].prune).toBe(false);
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
test("defaults the index path to dist/grafana.json", async () => {
|
|
460
|
+
const { calls, applier } = spy();
|
|
461
|
+
await applyGrafana({ target: "grafana", env: "prod" }, applier);
|
|
462
|
+
expect(calls[0].indexPath).toBe("dist/grafana.json");
|
|
463
|
+
expect(defaultOutput("grafana")).toBe("dist/grafana.json");
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
test("counts are preserved from the applier's envelope, not-prunable kinds included", async () => {
|
|
467
|
+
const applier: GrafanaApplier = async () =>
|
|
468
|
+
applyResult(
|
|
469
|
+
[
|
|
470
|
+
{ kind: "Folder", name: "team-a", action: "created" },
|
|
471
|
+
{ kind: "Dashboard", name: "api", action: "updated" },
|
|
472
|
+
{ kind: "Dashboard", name: "db", action: "unchanged" },
|
|
473
|
+
],
|
|
474
|
+
[{ kind: "Dashboard", name: "old", deleted: true }],
|
|
475
|
+
[{ kind: "LibraryPanel", name: "*", reason: "not-prunable", detail: "library panels carry no labels" }],
|
|
476
|
+
);
|
|
477
|
+
const result = await applyGrafana({ target: "grafana", env: "prod" }, applier);
|
|
478
|
+
expect(result).toEqual({ applied: 3, pruned: 1, notAttempted: 1 });
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
test("with nothing injected it resolves the real grafana lexicon's grafanaApply", async () => {
|
|
482
|
+
// An index path that does not exist fails inside grafanaApply's own read,
|
|
483
|
+
// reachable only if the dynamic import found the lexicon, and before any
|
|
484
|
+
// binding or HTTP call.
|
|
485
|
+
const err = await nativeApply({
|
|
486
|
+
target: "grafana",
|
|
487
|
+
env: "prod",
|
|
488
|
+
output: "/nonexistent/chant-3011-grafana.json",
|
|
489
|
+
}).catch((e: unknown) => e);
|
|
490
|
+
expect(String(err)).toMatch(/ENOENT|no such file/);
|
|
491
|
+
expect(String(err)).not.toMatch(/could not be loaded/);
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
describe("nativeApply: clickhouse dispatches to the sql lexicon (chant #3208)", () => {
|
|
496
|
+
const spy = (): { calls: Array<Parameters<ClickHouseApplier>[0]>; applier: ClickHouseApplier } => {
|
|
497
|
+
const calls: Array<Parameters<ClickHouseApplier>[0]> = [];
|
|
498
|
+
const applier: ClickHouseApplier = async (args) => {
|
|
499
|
+
calls.push(args);
|
|
500
|
+
return applyResult([]);
|
|
501
|
+
};
|
|
502
|
+
return { calls, applier };
|
|
503
|
+
};
|
|
504
|
+
const applyClickHouse = (args: Parameters<typeof nativeApply>[0], applier: ClickHouseApplier) =>
|
|
505
|
+
nativeApply(args, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, applier);
|
|
506
|
+
|
|
507
|
+
test("output maps to the build path and env to the environment, and nothing else is passed", async () => {
|
|
508
|
+
const { calls, applier } = spy();
|
|
509
|
+
await applyClickHouse({ target: "clickhouse", env: "prod", output: "dist/schema.json" }, applier);
|
|
510
|
+
expect(calls).toEqual([{ buildPath: "dist/schema.json", environment: "prod", prune: false }]);
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
test("owned-only and gated prune; never and the default do not", async () => {
|
|
514
|
+
for (const [deleteMode, prune] of [["owned-only", true], ["gated", true], ["never", false], [undefined, false]] as const) {
|
|
515
|
+
const { calls, applier } = spy();
|
|
516
|
+
await applyClickHouse({ target: "clickhouse", env: "prod", ...(deleteMode ? { deleteMode } : {}) }, applier);
|
|
517
|
+
expect(calls[0].prune).toBe(prune);
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
test("defaults the build path to dist/schema.json", async () => {
|
|
522
|
+
const { calls, applier } = spy();
|
|
523
|
+
await applyClickHouse({ target: "clickhouse", env: "prod" }, applier);
|
|
524
|
+
expect(calls[0].buildPath).toBe("dist/schema.json");
|
|
525
|
+
expect(defaultOutput("clickhouse")).toBe("dist/schema.json");
|
|
526
|
+
});
|
|
527
|
+
|
|
528
|
+
test("counts come from the envelope, a refused rebuild among the not-attempted", async () => {
|
|
529
|
+
const applier: ClickHouseApplier = async () =>
|
|
530
|
+
applyResult(
|
|
531
|
+
[
|
|
532
|
+
{ kind: "ClickHouse::Database", name: "shop", action: "unchanged" },
|
|
533
|
+
{ kind: "ClickHouse::Table", name: "shop.users", action: "updated" },
|
|
534
|
+
],
|
|
535
|
+
[{ kind: "ClickHouse::Table", name: "shop.old", deleted: true }],
|
|
536
|
+
[{ kind: "ClickHouse::Table", name: "shop.events", reason: "unsupported-kind", detail: "needs a rebuild" }],
|
|
537
|
+
);
|
|
538
|
+
expect(await applyClickHouse({ target: "clickhouse", env: "prod" }, applier)).toEqual({ applied: 2, pruned: 1, notAttempted: 1 });
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
test("with nothing injected it resolves the real sql lexicon's clickhouseApply", async () => {
|
|
542
|
+
const err = await nativeApply({ target: "clickhouse", env: "prod", output: "/nonexistent/chant-3208-schema.json" }).catch((e: unknown) => e);
|
|
543
|
+
expect(String(err)).toMatch(/ENOENT|no such file/);
|
|
544
|
+
expect(String(err)).not.toMatch(/could not be loaded/);
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
describe("nativeApply: postgres dispatches to the sql lexicon (chant #3280)", () => {
|
|
549
|
+
const spy = (): { calls: Array<Parameters<PostgresApplier>[0]>; applier: PostgresApplier } => {
|
|
550
|
+
const calls: Array<Parameters<PostgresApplier>[0]> = [];
|
|
551
|
+
const applier: PostgresApplier = async (args) => {
|
|
552
|
+
calls.push(args);
|
|
553
|
+
return applyResult([]);
|
|
554
|
+
};
|
|
555
|
+
return { calls, applier };
|
|
556
|
+
};
|
|
557
|
+
const applyPostgres = (args: Parameters<typeof nativeApply>[0], applier: PostgresApplier) =>
|
|
558
|
+
nativeApply(args, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, applier);
|
|
559
|
+
|
|
560
|
+
test("output maps to the build path and env to the environment, and nothing else is passed", async () => {
|
|
561
|
+
const { calls, applier } = spy();
|
|
562
|
+
await applyPostgres({ target: "postgres", env: "prod", output: "dist/schema.json" }, applier);
|
|
563
|
+
expect(calls).toEqual([{ buildPath: "dist/schema.json", environment: "prod", prune: false }]);
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
test("owned-only and gated prune; never and the default do not", async () => {
|
|
567
|
+
for (const [deleteMode, prune] of [["owned-only", true], ["gated", true], ["never", false], [undefined, false]] as const) {
|
|
568
|
+
const { calls, applier } = spy();
|
|
569
|
+
await applyPostgres({ target: "postgres", env: "prod", ...(deleteMode ? { deleteMode } : {}) }, applier);
|
|
570
|
+
expect(calls[0].prune).toBe(prune);
|
|
571
|
+
}
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
test("defaults the build path to dist/schema.json", async () => {
|
|
575
|
+
const { calls, applier } = spy();
|
|
576
|
+
await applyPostgres({ target: "postgres", env: "prod" }, applier);
|
|
577
|
+
expect(calls[0].buildPath).toBe("dist/schema.json");
|
|
578
|
+
expect(defaultOutput("postgres")).toBe("dist/schema.json");
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
test("counts come from the envelope, a refused expand-and-contract change among the not-attempted", async () => {
|
|
582
|
+
const applier: PostgresApplier = async () =>
|
|
583
|
+
applyResult(
|
|
584
|
+
[
|
|
585
|
+
{ kind: "Postgres::Schema", name: "app", action: "unchanged" },
|
|
586
|
+
{ kind: "Postgres::Table", name: "app.users", action: "updated" },
|
|
587
|
+
],
|
|
588
|
+
[{ kind: "Postgres::Table", name: "app.old", deleted: true }],
|
|
589
|
+
[{ kind: "Postgres::Table", name: "app.orders", reason: "unsupported-kind", detail: "SQLPG205 Rename a column" }],
|
|
590
|
+
);
|
|
591
|
+
expect(await applyPostgres({ target: "postgres", env: "prod" }, applier)).toEqual({ applied: 2, pruned: 1, notAttempted: 1 });
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
test("with nothing injected it resolves the real sql lexicon's postgresApply", async () => {
|
|
595
|
+
const err = await nativeApply({ target: "postgres", env: "prod", output: "/nonexistent/chant-3280-schema.json" }).catch((e: unknown) => e);
|
|
596
|
+
expect(String(err)).toMatch(/ENOENT|no such file/);
|
|
597
|
+
expect(String(err)).not.toMatch(/could not be loaded/);
|
|
598
|
+
});
|
|
599
|
+
});
|
|
600
|
+
|
|
418
601
|
describe("nativeApply: cloudformation dispatches to the aws lexicon (chant #1449)", () => {
|
|
419
602
|
/** Records what the applier was handed, and reports a settled create. */
|
|
420
603
|
const spy = (): { calls: Array<Parameters<AwsApplier>[0]>; applier: AwsApplier } => {
|
|
@@ -515,11 +698,11 @@ describe("compensateApply: cloudformation rolls back through the aws lexicon (ch
|
|
|
515
698
|
expect(result).toEqual({ command: "echo custom-rollback" });
|
|
516
699
|
});
|
|
517
700
|
|
|
518
|
-
test("kubectl / kustomize / arm / gcp / fly without a command throw — the defensive branch (#1449)", async () => {
|
|
701
|
+
test("kubectl / kustomize / arm / gcp / fly / grafana / clickhouse / postgres without a command throw — the defensive branch (#1449)", async () => {
|
|
519
702
|
// Unreachable from a built ApplyOp, which refuses this combination at
|
|
520
703
|
// build time. A hand-assembled op that reaches it fails loudly rather than
|
|
521
704
|
// returning a result that could read as a revert.
|
|
522
|
-
for (const target of ["kubectl", "kustomize", "arm", "gcp", "fly"] as const) {
|
|
705
|
+
for (const target of ["kubectl", "kustomize", "arm", "gcp", "fly", "grafana", "clickhouse", "postgres"] as const) {
|
|
523
706
|
const err = await compensateApply({ target, env: "prod" }).catch((e: unknown) => e);
|
|
524
707
|
expect(String(err)).toMatch(`no automatic rollback for target "${target}"`);
|
|
525
708
|
expect(String(err)).toMatch(/NOT\s+reverted/);
|
|
@@ -529,7 +712,7 @@ describe("compensateApply: cloudformation rolls back through the aws lexicon (ch
|
|
|
529
712
|
|
|
530
713
|
test("hasNativeRollback: cloudformation only", () => {
|
|
531
714
|
expect(hasNativeRollback("cloudformation")).toBe(true);
|
|
532
|
-
for (const target of ["kubectl", "kustomize", "arm", "gcp", "fly"] as const) {
|
|
715
|
+
for (const target of ["kubectl", "kustomize", "arm", "gcp", "fly", "grafana", "clickhouse", "postgres"] as const) {
|
|
533
716
|
expect(hasNativeRollback(target)).toBe(false);
|
|
534
717
|
}
|
|
535
718
|
});
|
|
@@ -557,11 +740,12 @@ describe("compensateApply: cloudformation rolls back through the aws lexicon (ch
|
|
|
557
740
|
});
|
|
558
741
|
|
|
559
742
|
describe('defaultOutput (target-aware apply output)', () => {
|
|
560
|
-
test('kubectl → dist (dir); cloudformation/arm → template.json (file); gcp → dist/gcp.yaml; fly → dist/fly.json', () => {
|
|
743
|
+
test('kubectl → dist (dir); cloudformation/arm → template.json (file); gcp → dist/gcp.yaml; fly → dist/fly.json; grafana → dist/grafana.json', () => {
|
|
561
744
|
expect(defaultOutput('kubectl')).toBe('dist');
|
|
562
745
|
expect(defaultOutput('cloudformation')).toBe('template.json');
|
|
563
746
|
expect(defaultOutput('arm')).toBe('template.json');
|
|
564
747
|
expect(defaultOutput('gcp')).toBe('dist/gcp.yaml');
|
|
565
748
|
expect(defaultOutput('fly')).toBe('dist/fly.json');
|
|
749
|
+
expect(defaultOutput('grafana')).toBe('dist/grafana.json');
|
|
566
750
|
});
|
|
567
751
|
});
|
|
@@ -21,6 +21,14 @@
|
|
|
21
21
|
* per-resource `gcpApply` and the fly lexicon's `flyApply`, which never had a
|
|
22
22
|
* CLI in the path to begin with: gcp maps each CNRM kind to its REST API
|
|
23
23
|
* itself, and fly speaks the Machines API (flaps) directly, no flyctl.
|
|
24
|
+
* `grafana` joined later (#3011): the grafana lexicon's `grafanaApply`, which
|
|
25
|
+
* writes folders, library panels and dashboards over Grafana's HTTP API.
|
|
26
|
+
* `clickhouse` joined after it (#3208): the sql lexicon's `clickhouseApply`,
|
|
27
|
+
* which sends a ClickHouse server the CREATE and ALTER statements a build's
|
|
28
|
+
* classified changes need, over its HTTP interface. `postgres` joined after
|
|
29
|
+
* that (#3280): the sql lexicon's `postgresApply`, which sends a Postgres
|
|
30
|
+
* server the statements a build's classified changes need, grouped into
|
|
31
|
+
* transactions, with `CONCURRENTLY` statements outside them.
|
|
24
32
|
* **The dispatcher stayed here**, because "which
|
|
25
33
|
* mechanism applies this target" is not any one product's knowledge — and
|
|
26
34
|
* because the activity keeps its name, its arguments and its place in
|
|
@@ -40,7 +48,7 @@ import { importLexiconPackage } from "../../lexicon-module";
|
|
|
40
48
|
const execAsync = promisify(exec);
|
|
41
49
|
|
|
42
50
|
/** The native apply mechanism for a target. */
|
|
43
|
-
export type ApplyTarget = "cloudformation" | "kubectl" | "arm" | "kustomize" | "gcp" | "fly";
|
|
51
|
+
export type ApplyTarget = "cloudformation" | "kubectl" | "arm" | "kustomize" | "gcp" | "fly" | "grafana" | "clickhouse" | "postgres";
|
|
44
52
|
|
|
45
53
|
/**
|
|
46
54
|
* How apply treats resources no longer declared.
|
|
@@ -52,7 +60,16 @@ export type ApplyTarget = "cloudformation" | "kubectl" | "arm" | "kustomize" | "
|
|
|
52
60
|
* ownership label (via the gcp lexicon's `gcpApply` — only kinds it can
|
|
53
61
|
* list; the rest are reported not-prunable), `fly` prunes machines by the
|
|
54
62
|
* metadata marker and the metadata-less types (volumes/ips/certs/secrets)
|
|
55
|
-
* app-scoped under a managed app (via the fly lexicon's `flyApply`),
|
|
63
|
+
* app-scoped under a managed app (via the fly lexicon's `flyApply`),
|
|
64
|
+
* `grafana` prunes dashboards and folders by the ownership labels (via the
|
|
65
|
+
* grafana lexicon's `grafanaApply`; library panels, Grafana 11 and a project
|
|
66
|
+
* with no ownership stack are reported not-prunable), `clickhouse` drops
|
|
67
|
+
* tables, views and databases whose comment carries the project's marker
|
|
68
|
+
* (via the sql lexicon's `clickhouseApply`; a project with no ownership
|
|
69
|
+
* stack is reported not-prunable), `postgres` drops the objects in the
|
|
70
|
+
* declared schemas whose comment carries the project's marker (via the sql
|
|
71
|
+
* lexicon's `postgresApply`; never an object another tool keeps, and a
|
|
72
|
+
* project with no ownership stack is reported not-prunable), and
|
|
56
73
|
* `cloudformation` is bounded by the stack — which holds, because a
|
|
57
74
|
* resource CFN did not create is not in the stack.
|
|
58
75
|
* - `gated` — same delete scope as `owned-only`, but an approval gate precedes
|
|
@@ -66,7 +83,11 @@ export interface NativeApplyArgs {
|
|
|
66
83
|
target: ApplyTarget;
|
|
67
84
|
/** Environment. What it means is per target: the CFN stack name on
|
|
68
85
|
* `cloudformation`, the ARM resource group on `arm`, the chant environment
|
|
69
|
-
* on `kubectl`/`kustomize
|
|
86
|
+
* on `kubectl`/`kustomize`, and on `grafana` the chant environment whose
|
|
87
|
+
* `grafana.profiles.<env>` names the Grafana to write to, and on
|
|
88
|
+
* `clickhouse` and `postgres` the chant environment whose
|
|
89
|
+
* `sql.profiles.<env>` names the server. On `gcp` and
|
|
90
|
+
* `fly` it is a log label only — the
|
|
70
91
|
* gcp applier resolves the project (`GOOGLE_CLOUD_PROJECT` env / CNRM
|
|
71
92
|
* annotation) and endpoint (`GCP_ENDPOINT_URL` env) itself, and the fly
|
|
72
93
|
* applier resolves its endpoint (`FLY_FLAPS_BASE_URL` env) and token
|
|
@@ -74,7 +95,9 @@ export interface NativeApplyArgs {
|
|
|
74
95
|
env: string;
|
|
75
96
|
/** Built manifest/template path. Default per target ({@link defaultOutput}):
|
|
76
97
|
* `dist` (a dir) for kubectl, `template.json` (a file) for
|
|
77
|
-
* CloudFormation/ARM, `dist/gcp.yaml` for gcp, `dist/fly.json` for fly
|
|
98
|
+
* CloudFormation/ARM, `dist/gcp.yaml` for gcp, `dist/fly.json` for fly,
|
|
99
|
+
* `dist/grafana.json` (the build index) for grafana, `dist/schema.json`
|
|
100
|
+
* (the sql lexicon's build output) for clickhouse and postgres. */
|
|
78
101
|
output?: string;
|
|
79
102
|
/** Delete handling. Default: never. */
|
|
80
103
|
deleteMode?: DeleteMode;
|
|
@@ -182,6 +205,57 @@ export type FlyApplier = (
|
|
|
182
205
|
signal?: AbortSignal,
|
|
183
206
|
) => Promise<ApplyResult>;
|
|
184
207
|
|
|
208
|
+
/**
|
|
209
|
+
* The grafana lexicon's API applier, as this module needs to call it (#3011):
|
|
210
|
+
* `grafanaApply` composed with the lexicon's own `toApplyResult` projection,
|
|
211
|
+
* so what crosses this seam is core's versioned apply envelope (#1446).
|
|
212
|
+
*
|
|
213
|
+
* `environment` selects `grafana.profiles.<environment>` (else `GRAFANA_URL`
|
|
214
|
+
* with `GRAFANA_TOKEN`), the binding observe and export use. The ownership
|
|
215
|
+
* marker is not passed: `grafanaApply` reads `ownership` from the project's
|
|
216
|
+
* `chant.config.ts` itself, and a prune without a stack declines as
|
|
217
|
+
* not-prunable rather than delete another project's dashboards.
|
|
218
|
+
*/
|
|
219
|
+
export type GrafanaApplier = (
|
|
220
|
+
args: {
|
|
221
|
+
indexPath: string;
|
|
222
|
+
environment?: string;
|
|
223
|
+
prune?: boolean;
|
|
224
|
+
},
|
|
225
|
+
signal?: AbortSignal,
|
|
226
|
+
) => Promise<ApplyResult>;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* The sql lexicon's ClickHouse applier, as this module needs to call it
|
|
230
|
+
* (#3208): `clickhouseApply` composed with the lexicon's own `toApplyResult`
|
|
231
|
+
* projection, so what crosses this seam is core's versioned apply envelope
|
|
232
|
+
* (#1446). A rebuild-class change rides it as NOT-ATTEMPTED.
|
|
233
|
+
*
|
|
234
|
+
* `environment` selects `sql.profiles.<environment>` (else `CLICKHOUSE_URL`),
|
|
235
|
+
* the binding observe and import use. The ownership marker is not passed:
|
|
236
|
+
* `clickhouseApply` reads `ownership` from the project's `chant.config.ts`.
|
|
237
|
+
*/
|
|
238
|
+
export type ClickHouseApplier = (
|
|
239
|
+
args: {
|
|
240
|
+
buildPath: string;
|
|
241
|
+
environment?: string;
|
|
242
|
+
prune?: boolean;
|
|
243
|
+
},
|
|
244
|
+
signal?: AbortSignal,
|
|
245
|
+
) => Promise<ApplyResult>;
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The sql lexicon's Postgres applier, as this module needs to call it
|
|
249
|
+
* (#3280): `postgresApply` composed with the lexicon's own `toApplyResult`,
|
|
250
|
+
* the same seam as {@link ClickHouseApplier}. An expand-and-contract change
|
|
251
|
+
* and a rolled-back transaction's objects ride it as NOT-ATTEMPTED.
|
|
252
|
+
*
|
|
253
|
+
* `environment` selects `sql.profiles.<environment>` (else `POSTGRES_URL`).
|
|
254
|
+
* The ownership marker and the timeouts are not passed: `postgresApply`
|
|
255
|
+
* reads `ownership` and the profile from the project's `chant.config.ts`.
|
|
256
|
+
*/
|
|
257
|
+
export type PostgresApplier = ClickHouseApplier;
|
|
258
|
+
|
|
185
259
|
/**
|
|
186
260
|
* The aws lexicon's CloudFormation applier, as this module needs to call it
|
|
187
261
|
* (#1449). Structural, like {@link K8sApplier} and {@link AzureApplier}.
|
|
@@ -363,6 +437,102 @@ async function loadFlyApplier(): Promise<FlyApplier> {
|
|
|
363
437
|
return async (args, signal) => toApplyResult(await flyApply(args, signal));
|
|
364
438
|
}
|
|
365
439
|
|
|
440
|
+
/**
|
|
441
|
+
* Load the grafana lexicon's `grafanaApply` (#3011). Same variable-specifier
|
|
442
|
+
* trick as {@link loadK8sApplier}, for the same reason. The activities subpath,
|
|
443
|
+
* not the package root or `op/builders`: those hold the typed step builder,
|
|
444
|
+
* while the activity itself (and its `toApplyResult`) lives here.
|
|
445
|
+
*/
|
|
446
|
+
async function loadGrafanaApplier(): Promise<GrafanaApplier> {
|
|
447
|
+
const spec = "@intentius/chant-lexicon-grafana/op/activities";
|
|
448
|
+
type GrafanaModule = {
|
|
449
|
+
grafanaApply?: (args: Parameters<GrafanaApplier>[0], signal?: AbortSignal) => Promise<unknown>;
|
|
450
|
+
toApplyResult?: (result: unknown) => ApplyResult;
|
|
451
|
+
};
|
|
452
|
+
let mod: GrafanaModule;
|
|
453
|
+
try {
|
|
454
|
+
mod = (await importLexiconPackage(spec)) as GrafanaModule;
|
|
455
|
+
} catch (err) {
|
|
456
|
+
throw new Error(
|
|
457
|
+
`apply target "grafana" needs @intentius/chant-lexicon-grafana, which could not be loaded ` +
|
|
458
|
+
`(${err instanceof Error ? err.message : String(err)}). Grafana applies go through the grafana ` +
|
|
459
|
+
`lexicon's API applier (chant #2948); install the grafana lexicon and list it in chant.config.ts.`,
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
const { grafanaApply, toApplyResult } = mod;
|
|
463
|
+
if (typeof grafanaApply !== "function") {
|
|
464
|
+
throw new Error(
|
|
465
|
+
"the installed @intentius/chant-lexicon-grafana exports no grafanaApply — it predates chant #2948",
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
if (typeof toApplyResult !== "function") {
|
|
469
|
+
throw new Error(
|
|
470
|
+
"the installed @intentius/chant-lexicon-grafana exports no toApplyResult — it predates chant #2948",
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
return async (args, signal) => toApplyResult(await grafanaApply(args, signal));
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Load the sql lexicon's `clickhouseApply` (#3208). Same variable-specifier
|
|
478
|
+
* trick as {@link loadK8sApplier}, for the same reason.
|
|
479
|
+
*/
|
|
480
|
+
async function loadClickHouseApplier(): Promise<ClickHouseApplier> {
|
|
481
|
+
const spec = "@intentius/chant-lexicon-sql/op/activities";
|
|
482
|
+
type SqlModule = {
|
|
483
|
+
clickhouseApply?: (args: Parameters<ClickHouseApplier>[0], signal?: AbortSignal) => Promise<unknown>;
|
|
484
|
+
toApplyResult?: (result: unknown) => ApplyResult;
|
|
485
|
+
};
|
|
486
|
+
let mod: SqlModule;
|
|
487
|
+
try {
|
|
488
|
+
mod = (await importLexiconPackage(spec)) as SqlModule;
|
|
489
|
+
} catch (err) {
|
|
490
|
+
throw new Error(
|
|
491
|
+
`apply target "clickhouse" needs @intentius/chant-lexicon-sql, which could not be loaded ` +
|
|
492
|
+
`(${err instanceof Error ? err.message : String(err)}). ClickHouse applies go through the sql ` +
|
|
493
|
+
`lexicon's applier (chant #3208); install the sql lexicon and list it in chant.config.ts.`,
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
const { clickhouseApply, toApplyResult } = mod;
|
|
497
|
+
if (typeof clickhouseApply !== "function") {
|
|
498
|
+
throw new Error("the installed @intentius/chant-lexicon-sql exports no clickhouseApply — it predates chant #3208");
|
|
499
|
+
}
|
|
500
|
+
if (typeof toApplyResult !== "function") {
|
|
501
|
+
throw new Error("the installed @intentius/chant-lexicon-sql exports no toApplyResult — it predates chant #3208");
|
|
502
|
+
}
|
|
503
|
+
return async (args, signal) => toApplyResult(await clickhouseApply(args, signal));
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Load the sql lexicon's `postgresApply` (#3280). Same variable-specifier
|
|
508
|
+
* trick as {@link loadK8sApplier}, for the same reason.
|
|
509
|
+
*/
|
|
510
|
+
async function loadPostgresApplier(): Promise<PostgresApplier> {
|
|
511
|
+
const spec = "@intentius/chant-lexicon-sql/op/activities";
|
|
512
|
+
type SqlModule = {
|
|
513
|
+
postgresApply?: (args: Parameters<PostgresApplier>[0], signal?: AbortSignal) => Promise<unknown>;
|
|
514
|
+
toApplyResult?: (result: unknown) => ApplyResult;
|
|
515
|
+
};
|
|
516
|
+
let mod: SqlModule;
|
|
517
|
+
try {
|
|
518
|
+
mod = (await importLexiconPackage(spec)) as SqlModule;
|
|
519
|
+
} catch (err) {
|
|
520
|
+
throw new Error(
|
|
521
|
+
`apply target "postgres" needs @intentius/chant-lexicon-sql, which could not be loaded ` +
|
|
522
|
+
`(${err instanceof Error ? err.message : String(err)}). Postgres applies go through the sql ` +
|
|
523
|
+
`lexicon's applier (chant #3280); install the sql lexicon and list it in chant.config.ts.`,
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
const { postgresApply, toApplyResult } = mod;
|
|
527
|
+
if (typeof postgresApply !== "function") {
|
|
528
|
+
throw new Error("the installed @intentius/chant-lexicon-sql exports no postgresApply — it predates chant #3280");
|
|
529
|
+
}
|
|
530
|
+
if (typeof toApplyResult !== "function") {
|
|
531
|
+
throw new Error("the installed @intentius/chant-lexicon-sql exports no toApplyResult — it predates chant #3208");
|
|
532
|
+
}
|
|
533
|
+
return async (args, signal) => toApplyResult(await postgresApply(args, signal));
|
|
534
|
+
}
|
|
535
|
+
|
|
366
536
|
/**
|
|
367
537
|
* Load the aws lexicon's `awsApply` (#1449). Same variable-specifier trick as
|
|
368
538
|
* {@link loadK8sApplier}, for the same reason.
|
|
@@ -418,8 +588,11 @@ async function loadAwsRollback(): Promise<AwsRollback> {
|
|
|
418
588
|
* manifests), so `dist`; kustomize's "output" is the kustomization DIRECTORY
|
|
419
589
|
* the render reads. The file targets take the file their lexicon's build
|
|
420
590
|
* conventionally emits: `template.json` for CloudFormation/ARM, `dist/gcp.yaml`
|
|
421
|
-
* (the CNRM manifest) for gcp, `dist/fly.json` (the serialized plan) for fly
|
|
422
|
-
*
|
|
591
|
+
* (the CNRM manifest) for gcp, `dist/fly.json` (the serialized plan) for fly,
|
|
592
|
+
* `dist/grafana.json` (the index the grafana serializer writes, with the
|
|
593
|
+
* dashboard files beside it) for grafana, `dist/schema.json` (the sql
|
|
594
|
+
* lexicon's build output) for clickhouse and postgres. Pure — exported for
|
|
595
|
+
* testing.
|
|
423
596
|
*/
|
|
424
597
|
export function defaultOutput(target: ApplyTarget): string {
|
|
425
598
|
switch (target) {
|
|
@@ -430,6 +603,11 @@ export function defaultOutput(target: ApplyTarget): string {
|
|
|
430
603
|
return "dist/gcp.yaml";
|
|
431
604
|
case "fly":
|
|
432
605
|
return "dist/fly.json";
|
|
606
|
+
case "grafana":
|
|
607
|
+
return "dist/grafana.json";
|
|
608
|
+
case "clickhouse":
|
|
609
|
+
case "postgres":
|
|
610
|
+
return "dist/schema.json";
|
|
433
611
|
default:
|
|
434
612
|
return "template.json";
|
|
435
613
|
}
|
|
@@ -469,7 +647,9 @@ function collapseEnvelope(envelope: ApplyResult, label: string): NativeApplyResu
|
|
|
469
647
|
* Apply declared source to the cloud via the target's native mechanism.
|
|
470
648
|
* Deletes (when enabled) ride that mechanism's own delete path — marker-scoped
|
|
471
649
|
* on `kubectl`, tag-scoped on `arm`, label-scoped on `gcp`, marker- and
|
|
472
|
-
* app-scoped on `fly`,
|
|
650
|
+
* app-scoped on `fly`, label-scoped on `grafana`, comment-marker-scoped on
|
|
651
|
+
* `clickhouse` and `postgres`, and stack-scoped on
|
|
652
|
+
* `cloudformation`, where the deploy
|
|
473
653
|
* itself removes resources dropped from the template and `deleteMode` changes
|
|
474
654
|
* nothing: a resource CFN did not create is not in the stack. See
|
|
475
655
|
* {@link DeleteMode}.
|
|
@@ -477,7 +657,7 @@ function collapseEnvelope(envelope: ApplyResult, label: string): NativeApplyResu
|
|
|
477
657
|
* The appliers are injectable so this dispatcher can be tested without the
|
|
478
658
|
* product lexicons present; production resolves them through
|
|
479
659
|
* {@link loadK8sApplier} / {@link loadAzureApplier} / {@link loadAwsApplier} /
|
|
480
|
-
* {@link loadGcpApplier} / {@link loadFlyApplier}.
|
|
660
|
+
* {@link loadGcpApplier} / {@link loadFlyApplier} / {@link loadGrafanaApplier}.
|
|
481
661
|
*/
|
|
482
662
|
export async function nativeApply(
|
|
483
663
|
args: NativeApplyArgs,
|
|
@@ -488,6 +668,9 @@ export async function nativeApply(
|
|
|
488
668
|
awsApplier?: AwsApplier,
|
|
489
669
|
gcpApplier?: GcpApplier,
|
|
490
670
|
flyApplier?: FlyApplier,
|
|
671
|
+
grafanaApplier?: GrafanaApplier,
|
|
672
|
+
clickhouseApplier?: ClickHouseApplier,
|
|
673
|
+
postgresApplier?: PostgresApplier,
|
|
491
674
|
): Promise<NativeApplyResult> {
|
|
492
675
|
const output = args.output ?? defaultOutput(args.target);
|
|
493
676
|
const deleteMode = args.deleteMode ?? "never";
|
|
@@ -568,6 +751,45 @@ export async function nativeApply(
|
|
|
568
751
|
return collapseEnvelope(envelope, args.env);
|
|
569
752
|
}
|
|
570
753
|
|
|
754
|
+
if (args.target === "grafana") {
|
|
755
|
+
// grafana (#3011): the grafana lexicon's API applier. Unlike gcp and fly,
|
|
756
|
+
// env is not just a label here: it selects `grafana.profiles.<env>`, the
|
|
757
|
+
// Grafana observe and export already read. The ownership marker comes from
|
|
758
|
+
// the project's chant.config.ts inside grafanaApply.
|
|
759
|
+
const apply = grafanaApplier ?? (await loadGrafanaApplier());
|
|
760
|
+
const envelope = await apply(
|
|
761
|
+
{ indexPath: output, environment: args.env, prune: deleteMode !== "never" },
|
|
762
|
+
signal,
|
|
763
|
+
);
|
|
764
|
+
// No binding or a refused token rides the envelope as NOT-ATTEMPTED for
|
|
765
|
+
// every resource, as do library panels and anything else prune could
|
|
766
|
+
// not consider.
|
|
767
|
+
return collapseEnvelope(envelope, args.env);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
if (args.target === "clickhouse") {
|
|
771
|
+
// clickhouse (#3208): the sql lexicon's applier. env selects
|
|
772
|
+
// `sql.profiles.<env>`, the server observe and import read; the marker
|
|
773
|
+
// comes from the project's chant.config.ts inside clickhouseApply.
|
|
774
|
+
const apply = clickhouseApplier ?? (await loadClickHouseApplier());
|
|
775
|
+
const envelope = await apply({ buildPath: output, environment: args.env, prune: deleteMode !== "never" }, signal);
|
|
776
|
+
// A refused rebuild and a column drop an additive apply withholds ride the
|
|
777
|
+
// envelope as NOT-ATTEMPTED, so an Op can gate on them.
|
|
778
|
+
return collapseEnvelope(envelope, args.env);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
if (args.target === "postgres") {
|
|
782
|
+
// postgres (#3280): the sql lexicon's applier. env selects
|
|
783
|
+
// `sql.profiles.<env>`; the marker and the lock and statement timeouts
|
|
784
|
+
// come from the project's chant.config.ts inside postgresApply.
|
|
785
|
+
const apply = postgresApplier ?? (await loadPostgresApplier());
|
|
786
|
+
const envelope = await apply({ buildPath: output, environment: args.env, prune: deleteMode !== "never" }, signal);
|
|
787
|
+
// A refused expand-and-contract change, a column drop an additive apply
|
|
788
|
+
// withholds, and the objects of a rolled-back transaction ride the
|
|
789
|
+
// envelope as NOT-ATTEMPTED, so an Op can gate on them.
|
|
790
|
+
return collapseEnvelope(envelope, args.env);
|
|
791
|
+
}
|
|
792
|
+
|
|
571
793
|
// cloudformation (#1449): the aws lexicon's native applier. env is the stack
|
|
572
794
|
// name and output the template path; endpoint resolution (#1694) and
|
|
573
795
|
// capability derivation (#980) are awsApply's own, so nothing else is passed.
|