@intentius/chant 0.124.46 → 0.124.48
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/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
- package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
- package/dist/__golden__/wave-loop/op-denied.json +16 -0
- package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on.json +16 -0
- package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/dist/__golden__/wave-loop/op-overridden.json +16 -0
- package/dist/__golden__/wave-loop/op-per-run.json +20 -0
- package/dist/__golden__/wave-loop/op-point.json +13 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
- package/dist/__golden__/wave-loop/op-sealed.json +10 -0
- package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/dist/__golden__/wave-loop/op-spend.json +10 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/dist/__golden__/wave-loop/op-wide.json +39 -0
- package/dist/action-pins.d.ts +61 -0
- package/dist/action-pins.d.ts.map +1 -0
- package/dist/action-pins.js +77 -0
- package/dist/cli/commands/carve.d.ts +3 -0
- package/dist/cli/commands/carve.d.ts.map +1 -1
- package/dist/cli/commands/carve.js +36 -7
- package/dist/cli/commands/import-report.d.ts +26 -0
- package/dist/cli/commands/import-report.d.ts.map +1 -0
- package/dist/cli/commands/import-report.js +65 -0
- package/dist/cli/commands/import.d.ts +11 -1
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +22 -3
- package/dist/cli/commands/migrate.d.ts +13 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +134 -10
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +21 -2
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +6 -1
- package/dist/cli/handlers/ledger.d.ts +3 -0
- package/dist/cli/handlers/ledger.d.ts.map +1 -0
- package/dist/cli/handlers/ledger.js +55 -0
- package/dist/cli/handlers/migrate.d.ts.map +1 -1
- package/dist/cli/handlers/migrate.js +18 -11
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/misc.js +12 -1
- package/dist/cli/handlers/pr-env.js +2 -2
- package/dist/cli/handlers/pr.d.ts +15 -1
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +143 -39
- package/dist/cli/handlers/query.d.ts +7 -2
- package/dist/cli/handlers/query.d.ts.map +1 -1
- package/dist/cli/handlers/query.js +16 -4
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +6 -3
- package/dist/cli/handlers/search.d.ts +2 -4
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +13 -39
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +65 -14
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +36 -2
- package/dist/cli/registry.d.ts +14 -4
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/builders.d.ts +5 -1
- package/dist/components/builders.d.ts.map +1 -1
- package/dist/components/builders.js +5 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.js +16 -1
- package/dist/components/capability-plugin.d.ts +14 -0
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/pr-hooks.d.ts +21 -1
- package/dist/components/pr-hooks.d.ts.map +1 -1
- package/dist/components/pr-hooks.js +72 -4
- package/dist/components/pr-pipeline.d.ts +45 -10
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +47 -14
- package/dist/components/pr-policy.d.ts +36 -0
- package/dist/components/pr-policy.d.ts.map +1 -1
- package/dist/components/pr-policy.js +36 -0
- package/dist/components/starter-plugin.d.ts +1 -0
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/starter-plugin.js +5 -1
- package/dist/components/verbs/index.d.ts +2 -0
- package/dist/components/verbs/index.d.ts.map +1 -1
- package/dist/components/verbs/index.js +2 -0
- package/dist/components/verbs/publish-artifact.d.ts +65 -0
- package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
- package/dist/components/verbs/publish-artifact.js +74 -0
- package/dist/components/verbs/publish-image.d.ts +129 -0
- package/dist/components/verbs/publish-image.d.ts.map +1 -0
- package/dist/components/verbs/publish-image.js +145 -0
- package/dist/config-environments.d.ts +20 -0
- package/dist/config-environments.d.ts.map +1 -1
- package/dist/config-environments.js +12 -0
- package/dist/config.d.ts +9 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- package/dist/gate-decision.d.ts +11 -2
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +15 -3
- package/dist/graph-ir.d.ts +25 -0
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-walk.d.ts +66 -0
- package/dist/graph-walk.d.ts.map +1 -0
- package/dist/graph-walk.js +70 -0
- package/dist/import/parser.d.ts +19 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/lexicon.d.ts +71 -6
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +11 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +2 -5
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/ledger-read.d.ts +65 -0
- package/dist/lifecycle/ledger-read.d.ts.map +1 -0
- package/dist/lifecycle/ledger-read.js +160 -0
- package/dist/lifecycle/release-workstation.d.ts +7 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -1
- package/dist/lifecycle/release-workstation.js +25 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -3
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +1 -0
- package/dist/lint/discover.js +3 -1
- package/dist/lint/post-synth.d.ts +127 -1
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/post-synth.js +84 -2
- package/dist/lint/rules/op/index.d.ts +1 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.js +2 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
- package/dist/op/activities/activity-contracts.d.ts +5 -2
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +5 -2
- package/dist/op/activities/index.d.ts +2 -2
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +1 -1
- package/dist/op/activities/review-agent.d.ts +90 -4
- package/dist/op/activities/review-agent.d.ts.map +1 -1
- package/dist/op/activities/review-agent.js +217 -19
- package/dist/op/activities/work-evidence.d.ts +8 -1
- package/dist/op/activities/work-evidence.d.ts.map +1 -1
- package/dist/op/activities/work-evidence.js +1 -0
- package/dist/op/builders.d.ts +9 -5
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +9 -5
- package/dist/op/composites/apply-op.d.ts +29 -2
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/apply-op.js +20 -1
- package/dist/op/gate-approval.d.ts +11 -5
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-approval.js +11 -6
- package/dist/op/gate-quorum.d.ts +100 -3
- package/dist/op/gate-quorum.d.ts.map +1 -1
- package/dist/op/gate-quorum.js +108 -6
- package/dist/op/gate-review.d.ts +9 -0
- package/dist/op/gate-review.d.ts.map +1 -1
- package/dist/op/gate-review.js +13 -0
- package/dist/op/gate.d.ts +44 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +25 -4
- package/dist/op/index.d.ts +3 -3
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +38 -3
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +48 -6
- package/dist/op/op-waves-run.d.ts +26 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +259 -13
- package/dist/op/op-waves.d.ts +72 -5
- package/dist/op/op-waves.d.ts.map +1 -1
- package/dist/op/op-waves.js +110 -15
- package/dist/op/runtime.d.ts +11 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/schedule-overdue.d.ts +16 -0
- package/dist/op/schedule-overdue.d.ts.map +1 -1
- package/dist/op/schedule-overdue.js +36 -0
- package/dist/op/stage-hooks.d.ts +9 -2
- package/dist/op/stage-hooks.d.ts.map +1 -1
- package/dist/op/stage-hooks.js +7 -5
- package/dist/op/workspace-run-env.d.ts +22 -0
- package/dist/op/workspace-run-env.d.ts.map +1 -0
- package/dist/op/workspace-run-env.js +21 -0
- package/dist/pr-forge.d.ts +24 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +47 -0
- package/dist/pr-post.d.ts +42 -0
- package/dist/pr-post.d.ts.map +1 -1
- package/dist/pr-post.js +67 -1
- package/dist/read-filter.d.ts +65 -0
- package/dist/read-filter.d.ts.map +1 -0
- package/dist/read-filter.js +179 -0
- package/dist/run-event.d.ts +1 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/terraform/carve.d.ts +24 -3
- package/dist/terraform/carve.d.ts.map +1 -1
- package/dist/terraform/carve.js +32 -14
- package/dist/terraform/cuts.d.ts +97 -0
- package/dist/terraform/cuts.d.ts.map +1 -0
- package/dist/terraform/cuts.js +138 -0
- package/dist/terraform/folds.d.ts +26 -0
- package/dist/terraform/folds.d.ts.map +1 -0
- package/dist/terraform/folds.js +38 -0
- package/dist/terraform/graph.d.ts.map +1 -1
- package/dist/terraform/graph.js +10 -0
- package/dist/terraform/reach.d.ts +140 -0
- package/dist/terraform/reach.d.ts.map +1 -0
- package/dist/terraform/reach.js +170 -0
- package/dist/terraform/score.d.ts +14 -0
- package/dist/terraform/score.d.ts.map +1 -1
- package/dist/terraform/score.js +14 -31
- package/dist/terraform/state.d.ts.map +1 -1
- package/dist/terraform/state.js +4 -2
- package/dist/terraform/types.d.ts +8 -0
- package/dist/terraform/types.d.ts.map +1 -1
- package/dist/wave-blocked.d.ts +10 -1
- package/dist/wave-blocked.d.ts.map +1 -1
- package/dist/wave-blocked.js +31 -3
- package/dist/wave-runtime.mjs +263 -254
- package/dist/workspace/check.schema.json +11 -2
- package/dist/workspace/checks/ci-branch.d.ts +44 -0
- package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
- package/dist/workspace/checks/ci-branch.js +133 -0
- package/dist/workspace/checks/links.d.ts +3 -0
- package/dist/workspace/checks/links.d.ts.map +1 -1
- package/dist/workspace/checks/links.js +12 -1
- package/dist/workspace/checks/org.d.ts +48 -0
- package/dist/workspace/checks/org.d.ts.map +1 -0
- package/dist/workspace/checks/org.js +156 -0
- package/dist/workspace/checks.d.ts +11 -1
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +59 -7
- package/dist/workspace/ci-branches.d.ts +16 -0
- package/dist/workspace/ci-branches.d.ts.map +1 -1
- package/dist/workspace/ci-branches.js +27 -0
- package/dist/workspace/ci-green-cli.js +7 -7
- package/dist/workspace/ci-green-workflow.d.ts +1 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +13 -8
- package/dist/workspace/ci-green.d.ts +14 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +44 -11
- package/dist/workspace/ci-run.d.ts +9 -1
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +67 -6
- package/dist/workspace/ci-serve.d.ts +9 -0
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +114 -76
- package/dist/workspace/compose-graph.d.ts +14 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +4 -1
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/composites.js +5 -2
- package/dist/workspace/composites.schema.json +22 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/dist/workspace/cross-root-lint.d.ts +56 -0
- package/dist/workspace/cross-root-lint.d.ts.map +1 -0
- package/dist/workspace/cross-root-lint.js +111 -0
- package/dist/workspace/dbt-models-reader.d.ts +44 -0
- package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
- package/dist/workspace/dbt-models-reader.js +356 -0
- package/dist/workspace/dbt-project-common.d.ts +40 -0
- package/dist/workspace/dbt-project-common.d.ts.map +1 -0
- package/dist/workspace/dbt-project-common.js +106 -0
- package/dist/workspace/dbt-project-reader.d.ts +4 -3
- package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
- package/dist/workspace/dbt-project-reader.js +14 -108
- package/dist/workspace/decision-rank.d.ts +26 -0
- package/dist/workspace/decision-rank.d.ts.map +1 -0
- package/dist/workspace/decision-rank.js +16 -0
- package/dist/workspace/declaration.d.ts +43 -2
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +45 -11
- package/dist/workspace/declaration.schema.json +133 -24
- package/dist/workspace/environments.d.ts +26 -2
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/environments.js +26 -2
- package/dist/workspace/flyway-dir.d.ts +39 -0
- package/dist/workspace/flyway-dir.d.ts.map +1 -0
- package/dist/workspace/flyway-dir.js +104 -0
- package/dist/workspace/flyway-layout.d.ts +96 -0
- package/dist/workspace/flyway-layout.d.ts.map +1 -0
- package/dist/workspace/flyway-layout.js +308 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +26 -8
- package/dist/workspace/graph.schema.json +34 -0
- package/dist/workspace/intent.d.ts +2 -3
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +5 -9
- package/dist/workspace/kind-link-readers.d.ts +59 -2
- package/dist/workspace/kind-link-readers.d.ts.map +1 -1
- package/dist/workspace/kind-link-readers.js +17 -1
- package/dist/workspace/kinds.d.ts +66 -2
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +98 -4
- package/dist/workspace/ledger.schema.json +158 -0
- package/dist/workspace/lexicon-outputs.d.ts +20 -1
- package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
- package/dist/workspace/lexicon-outputs.js +102 -10
- package/dist/workspace/lineage-check.d.ts +3 -0
- package/dist/workspace/lineage-check.d.ts.map +1 -1
- package/dist/workspace/lineage-check.js +23 -4
- package/dist/workspace/links.d.ts +8 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/links.js +25 -1
- package/dist/workspace/ls.d.ts +8 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +7 -1
- package/dist/workspace/ls.schema.json +7 -0
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/member-commands.js +54 -5
- package/dist/workspace/migrate-links.d.ts +45 -0
- package/dist/workspace/migrate-links.d.ts.map +1 -0
- package/dist/workspace/migrate-links.js +100 -0
- package/dist/workspace/migration-dirs.d.ts +74 -0
- package/dist/workspace/migration-dirs.d.ts.map +1 -0
- package/dist/workspace/migration-dirs.js +254 -0
- package/dist/workspace/reason-codes.d.ts +8 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +11 -0
- package/dist/workspace/records-cli.d.ts +11 -0
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-cli.js +57 -5
- package/dist/workspace/records.schema.json +5 -0
- package/dist/workspace/release-candidates.d.ts +2 -0
- package/dist/workspace/release-candidates.d.ts.map +1 -1
- package/dist/workspace/release-candidates.js +5 -2
- package/dist/workspace/release-train.d.ts +53 -0
- package/dist/workspace/release-train.d.ts.map +1 -0
- package/dist/workspace/release-train.js +134 -0
- package/dist/workspace/release-workflow.d.ts.map +1 -1
- package/dist/workspace/release-workflow.js +4 -3
- package/dist/workspace/repo-ref.d.ts +45 -0
- package/dist/workspace/repo-ref.d.ts.map +1 -0
- package/dist/workspace/repo-ref.js +114 -0
- package/dist/workspace/run-event.schema.json +2 -2
- package/dist/workspace/runs-cli.d.ts +9 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -1
- package/dist/workspace/runs-cli.js +48 -3
- package/dist/workspace/runs.schema.json +7 -0
- package/dist/workspace/search-contract.d.ts +1 -1
- package/dist/workspace/search-contract.d.ts.map +1 -1
- package/dist/workspace/status-decisions.d.ts +37 -0
- package/dist/workspace/status-decisions.d.ts.map +1 -0
- package/dist/workspace/status-decisions.js +147 -0
- package/dist/workspace/status-gates.d.ts +9 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +4 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +14 -2
- package/dist/workspace/status.schema.json +6 -0
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-cli.js +5 -3
- package/dist/workspace/work-evidence-ops.d.ts +83 -0
- package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
- package/dist/workspace/work-evidence-ops.js +169 -0
- package/dist/workspace/work-evidence.d.ts +12 -2
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-evidence.js +21 -3
- package/dist/workspace/work-evidence.schema.json +49 -2
- package/dist/workspace/workspace-gates.d.ts +110 -0
- package/dist/workspace/workspace-gates.d.ts.map +1 -0
- package/dist/workspace/workspace-gates.js +140 -0
- package/dist/workspace/workspace-kinds.schema.json +58 -3
- package/dist/workspace/workspace-ledger.d.ts +76 -0
- package/dist/workspace/workspace-ledger.d.ts.map +1 -0
- package/dist/workspace/workspace-ledger.js +91 -0
- package/dist/workspace/workspace-run.d.ts +112 -0
- package/dist/workspace/workspace-run.d.ts.map +1 -0
- package/dist/workspace/workspace-run.js +432 -0
- package/package.json +1 -1
- package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/src/__golden__/wave-loop/op-cost-member.json +13 -0
- package/src/__golden__/wave-loop/op-denied-source.json +16 -0
- package/src/__golden__/wave-loop/op-denied.json +16 -0
- package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/src/__golden__/wave-loop/op-held-on.json +16 -0
- package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/src/__golden__/wave-loop/op-overridden.json +16 -0
- package/src/__golden__/wave-loop/op-per-run.json +20 -0
- package/src/__golden__/wave-loop/op-point.json +13 -0
- package/src/__golden__/wave-loop/op-pr-review.json +10 -0
- package/src/__golden__/wave-loop/op-sealed.json +10 -0
- package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/src/__golden__/wave-loop/op-spend.json +10 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/src/__golden__/wave-loop/op-wide.json +39 -0
- package/src/action-pins.test.ts +78 -0
- package/src/action-pins.ts +92 -0
- package/src/cli/commands/carve-score-once.test.ts +99 -0
- package/src/cli/commands/carve.ts +37 -6
- package/src/cli/commands/check-lexicon.test.ts +2 -2
- package/src/cli/commands/import-report.ts +71 -0
- package/src/cli/commands/import.ts +33 -3
- package/src/cli/commands/migrate-dialect.test.ts +145 -0
- package/src/cli/commands/migrate.ts +132 -11
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
- package/src/cli/handlers/approve.ts +23 -2
- package/src/cli/handlers/build.ts +7 -1
- package/src/cli/handlers/ledger.ts +54 -0
- package/src/cli/handlers/migrate.ts +21 -12
- package/src/cli/handlers/misc.ts +10 -1
- package/src/cli/handlers/pr-env.ts +2 -2
- package/src/cli/handlers/pr.ts +138 -36
- package/src/cli/handlers/query.ts +16 -4
- package/src/cli/handlers/release.ts +6 -3
- package/src/cli/handlers/search.ts +13 -34
- package/src/cli/main.test.ts +15 -0
- package/src/cli/main.ts +65 -14
- package/src/cli/parse-args.ts +27 -2
- package/src/cli/registry.ts +14 -4
- package/src/components/builders.ts +8 -0
- package/src/components/capability-plugin-loader.ts +13 -1
- package/src/components/capability-plugin.ts +16 -0
- package/src/components/pr-hooks.test.ts +73 -5
- package/src/components/pr-hooks.ts +95 -5
- package/src/components/pr-pipeline.ts +64 -16
- package/src/components/pr-policy.test.ts +64 -1
- package/src/components/pr-policy.ts +53 -0
- package/src/components/registry.test.ts +1 -1
- package/src/components/starter-plugin.ts +6 -0
- package/src/components/verbs/index.ts +2 -0
- package/src/components/verbs/publish-artifact.test.ts +60 -0
- package/src/components/verbs/publish-artifact.ts +122 -0
- package/src/components/verbs/publish-image.test.ts +101 -0
- package/src/components/verbs/publish-image.ts +265 -0
- package/src/config-environments.ts +28 -1
- package/src/config.ts +8 -1
- package/src/gate-decision-bundle.test.ts +1 -0
- package/src/gate-decision-identity.test.ts +9 -0
- package/src/gate-decision.ts +26 -3
- package/src/graph-ir.ts +27 -0
- package/src/graph-walk.test.ts +44 -0
- package/src/graph-walk.ts +102 -0
- package/src/import/parser.ts +20 -0
- package/src/lexicon.ts +74 -6
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lifecycle/git.ts +2 -2
- package/src/lifecycle/ledger-read.test.ts +107 -0
- package/src/lifecycle/ledger-read.ts +195 -0
- package/src/lifecycle/release-workstation.ts +24 -0
- package/src/lifecycle/run-ledger.ts +5 -2
- package/src/lint/cross-root.test.ts +122 -0
- package/src/lint/discover.ts +3 -1
- package/src/lint/post-synth.ts +212 -2
- package/src/lint/rules/op/index.ts +2 -0
- package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
- package/src/op/activities/activity-contracts.ts +5 -2
- package/src/op/activities/index.ts +2 -2
- package/src/op/activities/review-agent.test.ts +221 -4
- package/src/op/activities/review-agent.ts +265 -22
- package/src/op/activities/work-evidence.ts +9 -1
- package/src/op/builders.ts +9 -5
- package/src/op/composites/apply-op.test.ts +108 -0
- package/src/op/composites/apply-op.ts +37 -2
- package/src/op/gate-approval.test.ts +6 -1
- package/src/op/gate-approval.ts +12 -6
- package/src/op/gate-quorum-at-base.test.ts +211 -0
- package/src/op/gate-quorum.ts +156 -8
- package/src/op/gate-review.ts +14 -0
- package/src/op/gate.ts +67 -8
- package/src/op/index.ts +3 -2
- package/src/op/local-executor.ts +69 -9
- package/src/op/op-waves-depends-on.test.ts +81 -0
- package/src/op/op-waves-hook-targets.test.ts +4 -2
- package/src/op/op-waves-quorum-product.test.ts +158 -0
- package/src/op/op-waves-run.ts +288 -14
- package/src/op/op-waves.ts +143 -14
- package/src/op/runtime.ts +8 -0
- package/src/op/schedule-overdue.ts +33 -0
- package/src/op/stage-hooks.ts +13 -5
- package/src/op/workspace-run-env.ts +29 -0
- package/src/pr-forge-bundle.test.ts +2 -2
- package/src/pr-forge.test.ts +47 -0
- package/src/pr-forge.ts +68 -0
- package/src/pr-post-open.e2e.test.ts +36 -0
- package/src/pr-post.test.ts +102 -3
- package/src/pr-post.ts +89 -1
- package/src/read-filter.test.ts +54 -0
- package/src/read-filter.ts +193 -0
- package/src/run-event.ts +1 -1
- package/src/stage-hooks-bundle.test.ts +1 -0
- package/src/terraform/carve.ts +52 -15
- package/src/terraform/cuts.test.ts +173 -0
- package/src/terraform/cuts.ts +188 -0
- package/src/terraform/folds.ts +44 -0
- package/src/terraform/graph.ts +9 -0
- package/src/terraform/radius.test.ts +90 -0
- package/src/terraform/reach.test.ts +146 -0
- package/src/terraform/reach.ts +247 -0
- package/src/terraform/score.ts +27 -29
- package/src/terraform/state.ts +3 -1
- package/src/terraform/types.ts +8 -0
- package/src/wave-blocked.ts +28 -3
- package/src/wave-loop-golden.test.ts +4 -3
- package/src/workspace/behold-kinds.test.ts +1 -1
- package/src/workspace/check-contract.test.ts +7 -6
- package/src/workspace/check.schema.json +11 -2
- package/src/workspace/checks/ci-branch.test.ts +128 -0
- package/src/workspace/checks/ci-branch.ts +141 -0
- package/src/workspace/checks/links.ts +12 -1
- package/src/workspace/checks/org.ts +169 -0
- package/src/workspace/checks.ts +64 -7
- package/src/workspace/ci-branches.ts +31 -0
- package/src/workspace/ci-green-branches.test.ts +153 -0
- package/src/workspace/ci-green-cli.ts +7 -7
- package/src/workspace/ci-green-workflow.test.ts +4 -3
- package/src/workspace/ci-green-workflow.ts +13 -9
- package/src/workspace/ci-green.ts +49 -12
- package/src/workspace/ci-run.test.ts +72 -1
- package/src/workspace/ci-run.ts +68 -8
- package/src/workspace/ci-serve.test.ts +95 -0
- package/src/workspace/ci-serve.ts +106 -65
- package/src/workspace/component-environments.test.ts +25 -2
- package/src/workspace/compose-graph.ts +9 -2
- package/src/workspace/composites.schema.json +22 -0
- package/src/workspace/composites.test.ts +39 -8
- package/src/workspace/composites.ts +6 -2
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/src/workspace/cross-root-lint.test.ts +90 -0
- package/src/workspace/cross-root-lint.ts +126 -0
- package/src/workspace/dbt-kind.test.ts +3 -2
- package/src/workspace/dbt-models-reader.ts +362 -0
- package/src/workspace/dbt-models.test.ts +248 -0
- package/src/workspace/dbt-project-common.ts +113 -0
- package/src/workspace/dbt-project-reader.ts +29 -112
- package/src/workspace/decision-rank.ts +40 -0
- package/src/workspace/declaration.schema.json +133 -24
- package/src/workspace/declaration.ts +84 -15
- package/src/workspace/environments.ts +40 -4
- package/src/workspace/flyway-dir.ts +113 -0
- package/src/workspace/flyway-layout.ts +337 -0
- package/src/workspace/graph-cli.ts +25 -10
- package/src/workspace/graph-contract.test.ts +4 -2
- package/src/workspace/graph.schema.json +34 -0
- package/src/workspace/identity.test.ts +14 -2
- package/src/workspace/intent.ts +6 -14
- package/src/workspace/kind-link-readers.ts +68 -3
- package/src/workspace/kinds.test.ts +12 -7
- package/src/workspace/kinds.ts +132 -7
- package/src/workspace/ledger.schema.json +158 -0
- package/src/workspace/lexicon-outputs.ts +132 -13
- package/src/workspace/lineage-check.ts +30 -7
- package/src/workspace/links.ts +24 -1
- package/src/workspace/ls-contract.test.ts +1 -1
- package/src/workspace/ls.schema.json +7 -0
- package/src/workspace/ls.ts +10 -1
- package/src/workspace/member-commands.ts +60 -2
- package/src/workspace/member-file-schema.test.ts +124 -0
- package/src/workspace/migrate-links.test.ts +99 -0
- package/src/workspace/migrate-links.ts +108 -0
- package/src/workspace/migration-dirs.test.ts +272 -0
- package/src/workspace/migration-dirs.ts +267 -0
- package/src/workspace/org-scope.test.ts +238 -0
- package/src/workspace/reason-codes.test.ts +6 -1
- package/src/workspace/reason-codes.ts +11 -0
- package/src/workspace/records-cli.ts +58 -5
- package/src/workspace/records.schema.json +5 -0
- package/src/workspace/release-candidates.ts +7 -2
- package/src/workspace/release-train.ts +157 -0
- package/src/workspace/release-workflow.ts +4 -3
- package/src/workspace/repo-ref.ts +113 -0
- package/src/workspace/run-event.schema.json +2 -2
- package/src/workspace/runs-cli.ts +48 -4
- package/src/workspace/runs.schema.json +7 -0
- package/src/workspace/status-contract.test.ts +46 -1
- package/src/workspace/status-decisions.test.ts +100 -0
- package/src/workspace/status-decisions.ts +151 -0
- package/src/workspace/status-gates.ts +9 -0
- package/src/workspace/status.schema.json +6 -0
- package/src/workspace/status.ts +17 -3
- package/src/workspace/where-filters.test.ts +39 -0
- package/src/workspace/work-cli.ts +5 -3
- package/src/workspace/work-evidence-ops.test.ts +176 -0
- package/src/workspace/work-evidence-ops.ts +189 -0
- package/src/workspace/work-evidence.schema.json +49 -2
- package/src/workspace/work-evidence.ts +22 -3
- package/src/workspace/workspace-gates.ts +200 -0
- package/src/workspace/workspace-kinds.schema.json +58 -3
- package/src/workspace/workspace-ledger.ts +130 -0
- package/src/workspace/workspace-run.test.ts +322 -0
- package/src/workspace/workspace-run.ts +461 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The review report of `chant import` (#4398): the parser's diagnostics as
|
|
3
|
+
* SARIF (`--report <path>`), a summary on stderr, and the exit code under
|
|
4
|
+
* `--strict`. The shape follows `chant migrate`: a needs-review diagnostic is
|
|
5
|
+
* a `warning`, and `--strict` makes any open `warning` or `error` fail the
|
|
6
|
+
* run. An `info` diagnostic names something not carried that needs no
|
|
7
|
+
* decision, and never fails a run.
|
|
8
|
+
*/
|
|
9
|
+
import { writeFileSync } from "fs";
|
|
10
|
+
import { formatSarif } from "../reporters/stylish.js";
|
|
11
|
+
/** Import diagnostics as lint diagnostics against `file`, the template that was imported. */
|
|
12
|
+
export function importDiagnosticsToLint(file, diagnostics) {
|
|
13
|
+
return diagnostics.map((d) => ({
|
|
14
|
+
file,
|
|
15
|
+
line: d.line ?? 1,
|
|
16
|
+
column: d.column ?? 1,
|
|
17
|
+
ruleId: d.ruleId,
|
|
18
|
+
severity: d.severity,
|
|
19
|
+
message: d.message,
|
|
20
|
+
...(d.entity ? { entity: d.entity } : {}),
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
/** The SARIF document for a run. */
|
|
24
|
+
export function importSarif(file, diagnostics, version) {
|
|
25
|
+
return formatSarif(importDiagnosticsToLint(file, diagnostics), undefined, undefined, version);
|
|
26
|
+
}
|
|
27
|
+
/** Write the SARIF report; an unwritable path is returned as a message, not thrown. */
|
|
28
|
+
export function writeImportReport(path, file, diagnostics, version) {
|
|
29
|
+
try {
|
|
30
|
+
writeFileSync(path, importSarif(file, diagnostics, version));
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return `could not write SARIF report to ${path}: ${err instanceof Error ? err.message : String(err)}`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Diagnostics that are open: everything but `info`. */
|
|
38
|
+
export function openDiagnostics(diagnostics) {
|
|
39
|
+
return diagnostics.filter((d) => d.severity !== "info");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The exit code for a finished import. An `error` always fails (a failed
|
|
43
|
+
* `--validate`); a `warning` fails under `--strict`.
|
|
44
|
+
*/
|
|
45
|
+
export function importExitCode(diagnostics, strict) {
|
|
46
|
+
if (!diagnostics)
|
|
47
|
+
return 0;
|
|
48
|
+
if (diagnostics.some((d) => d.severity === "error"))
|
|
49
|
+
return 1;
|
|
50
|
+
return strict && diagnostics.some((d) => d.severity === "warning") ? 1 : 0;
|
|
51
|
+
}
|
|
52
|
+
/** Counts by severity and rule, as the lines printed after an import. */
|
|
53
|
+
export function summarizeImportDiagnostics(diagnostics) {
|
|
54
|
+
const bySeverity = { error: 0, warning: 0, info: 0 };
|
|
55
|
+
const byRule = new Map();
|
|
56
|
+
for (const d of diagnostics) {
|
|
57
|
+
bySeverity[d.severity]++;
|
|
58
|
+
byRule.set(d.ruleId, (byRule.get(d.ruleId) ?? 0) + 1);
|
|
59
|
+
}
|
|
60
|
+
const rules = [...byRule].sort(([a], [b]) => a.localeCompare(b)).map(([id, n]) => `${id} x${String(n)}`);
|
|
61
|
+
return [
|
|
62
|
+
`Review: ${String(bySeverity.warning)} to review, ${String(bySeverity.error)} errors, ${String(bySeverity.info)} notes (${rules.join(", ")}).`,
|
|
63
|
+
"Write them with --report <path> as SARIF; --strict fails while any to review or error is open.",
|
|
64
|
+
].join("\n");
|
|
65
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TemplateIR } from "../../import/parser.js";
|
|
1
|
+
import type { TemplateIR, ImportDiagnostic } from "../../import/parser.js";
|
|
2
2
|
import type { GeneratedFile, TypeScriptGenerator } from "../../import/generator.js";
|
|
3
3
|
import type { LexiconPlugin, ResourceSelector } from "../../lexicon.js";
|
|
4
4
|
/**
|
|
@@ -22,6 +22,8 @@ export interface ImportOptions {
|
|
|
22
22
|
* fails the import before anything is parsed.
|
|
23
23
|
*/
|
|
24
24
|
parserOptions?: string[];
|
|
25
|
+
/** `--validate` (#4398): check the parsed template on the lexicon's emulator before writing. */
|
|
26
|
+
validate?: boolean;
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Import command result
|
|
@@ -42,6 +44,12 @@ export interface ImportResult {
|
|
|
42
44
|
* it was named (`--lexicon`, `--kustomize`) (#2965).
|
|
43
45
|
*/
|
|
44
46
|
detected?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* What the parser flagged for review (#4398), then what `--validate`
|
|
49
|
+
* rejected. `--report` writes them as SARIF and `--strict` fails while a
|
|
50
|
+
* `warning` or `error` is open; see `./import-report.ts`.
|
|
51
|
+
*/
|
|
52
|
+
diagnostics?: ImportDiagnostic[];
|
|
45
53
|
}
|
|
46
54
|
/**
|
|
47
55
|
* Parse template content for detection (#2935): JSON first, then YAML. A YAML
|
|
@@ -114,6 +122,8 @@ export interface ContentImportOptions {
|
|
|
114
122
|
force?: boolean;
|
|
115
123
|
/** `--parser-option` entries for the lexicon's parser (#2994); see {@link ImportOptions.parserOptions}. */
|
|
116
124
|
parserOptions?: string[];
|
|
125
|
+
/** `--validate`; see {@link ImportOptions.validate}. */
|
|
126
|
+
validate?: boolean;
|
|
117
127
|
}
|
|
118
128
|
export declare function importFromContent(options: ContentImportOptions): Promise<ImportResult>;
|
|
119
129
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAyC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { listInstalledLexicons, loadPlugin, loadPlugins, resolveProjectLexicons
|
|
|
5
5
|
import { parseYAMLDocument, splitYAMLDocuments } from "../../yaml.js";
|
|
6
6
|
import { importLexiconPackage } from "../../lexicon-module.js";
|
|
7
7
|
import { resolveParserOptions } from "../../import/parser-options.js";
|
|
8
|
+
import { summarizeImportDiagnostics } from "./import-report.js";
|
|
8
9
|
import { EmbeddedImports } from "../../import/embedded.js";
|
|
9
10
|
/**
|
|
10
11
|
* Parse template content for detection (#2935): JSON first, then YAML. A YAML
|
|
@@ -257,6 +258,7 @@ export async function importCommand(options) {
|
|
|
257
258
|
output: options.output,
|
|
258
259
|
force: options.force,
|
|
259
260
|
parserOptions: options.parserOptions,
|
|
261
|
+
validate: options.validate,
|
|
260
262
|
});
|
|
261
263
|
}
|
|
262
264
|
// Parse for detection: JSON, falling back to YAML.
|
|
@@ -288,7 +290,7 @@ export async function importCommand(options) {
|
|
|
288
290
|
warnings.push(`The template is also recognized by ${detection.alsoMatched.join(", ")}. ` +
|
|
289
291
|
`Importing with ${plugin.name}; pass --lexicon <name> to choose another.`);
|
|
290
292
|
}
|
|
291
|
-
const result = await parseAndWrite(plugin, content, outputDir, options.force, warnings, generatedFiles, plugin.name, projectDir, options.parserOptions);
|
|
293
|
+
const result = await parseAndWrite(plugin, content, outputDir, options.force, warnings, generatedFiles, plugin.name, projectDir, options.parserOptions, options.validate);
|
|
292
294
|
return { ...result, detected: true };
|
|
293
295
|
}
|
|
294
296
|
export async function importFromContent(options) {
|
|
@@ -310,7 +312,7 @@ export async function importFromContent(options) {
|
|
|
310
312
|
return { success: false, generatedFiles: [], warnings: [], error: `Lexicon "${options.lexicon}" not available.` };
|
|
311
313
|
}
|
|
312
314
|
const projectDir = resolve(options.output ? dirname(options.output) : ".");
|
|
313
|
-
return parseAndWrite(plugin, options.content, outputDir, options.force, [], [], plugin.name, projectDir, options.parserOptions);
|
|
315
|
+
return parseAndWrite(plugin, options.content, outputDir, options.force, [], [], plugin.name, projectDir, options.parserOptions, options.validate);
|
|
314
316
|
}
|
|
315
317
|
/**
|
|
316
318
|
* The importers for the content a host's parser offered (#2962): those of the
|
|
@@ -431,7 +433,7 @@ export async function buildErrorWarnings(plugin, outputDir) {
|
|
|
431
433
|
}
|
|
432
434
|
}
|
|
433
435
|
/** The shared tail of every template import: parse → generate → write. */
|
|
434
|
-
async function parseAndWrite(plugin, content, outputDir, force, warnings, generatedFiles, lexicon, projectDir, parserOptionEntries) {
|
|
436
|
+
async function parseAndWrite(plugin, content, outputDir, force, warnings, generatedFiles, lexicon, projectDir, parserOptionEntries, validate) {
|
|
435
437
|
// A lexicon can recognize a template (detectTemplate) without being able to
|
|
436
438
|
// import it (grafana had no parser until #2945). Every path funnels through here, so
|
|
437
439
|
// this one check covers detection, --lexicon and content import (#2940).
|
|
@@ -470,6 +472,19 @@ async function parseAndWrite(plugin, content, outputDir, force, warnings, genera
|
|
|
470
472
|
if (ir.warnings) {
|
|
471
473
|
warnings.push(...ir.warnings);
|
|
472
474
|
}
|
|
475
|
+
// Findings for review (#4398), and what the lexicon's emulator rejects.
|
|
476
|
+
const diagnostics = [...(ir.diagnostics ?? [])];
|
|
477
|
+
if (validate) {
|
|
478
|
+
if (!plugin.validateImport) {
|
|
479
|
+
return { success: false, generatedFiles: [], warnings: [], error: `lexicon "${plugin.name}" has no emulator to validate an import against`, lexicon: plugin.name };
|
|
480
|
+
}
|
|
481
|
+
try {
|
|
482
|
+
diagnostics.push(...(await plugin.validateImport(ir, resolved.options)));
|
|
483
|
+
}
|
|
484
|
+
catch (err) {
|
|
485
|
+
return { success: false, generatedFiles: [], warnings: [], error: `--validate failed to run: ${err instanceof Error ? err.message : String(err)}`, lexicon: plugin.name };
|
|
486
|
+
}
|
|
487
|
+
}
|
|
473
488
|
// Embedded content the owner could not carry, or that no installed lexicon imports.
|
|
474
489
|
if (embedded)
|
|
475
490
|
warnings.push(...embedded.warnings);
|
|
@@ -512,6 +527,7 @@ async function parseAndWrite(plugin, content, outputDir, force, warnings, genera
|
|
|
512
527
|
generatedFiles,
|
|
513
528
|
warnings,
|
|
514
529
|
lexicon,
|
|
530
|
+
...(diagnostics.length > 0 ? { diagnostics } : {}),
|
|
515
531
|
};
|
|
516
532
|
}
|
|
517
533
|
/**
|
|
@@ -699,6 +715,9 @@ export function printImportResult(result) {
|
|
|
699
715
|
if (result.lexicon) {
|
|
700
716
|
console.log(`${result.detected ? "Detected lexicon" : "Lexicon"}: ${result.lexicon}`);
|
|
701
717
|
}
|
|
718
|
+
if (result.diagnostics && result.diagnostics.length > 0) {
|
|
719
|
+
console.error(summarizeImportDiagnostics(result.diagnostics));
|
|
720
|
+
}
|
|
702
721
|
if (result.generatedFiles.length > 0) {
|
|
703
722
|
console.log(formatSuccess("Generated files:"));
|
|
704
723
|
for (const file of result.generatedFiles) {
|
|
@@ -6,11 +6,16 @@
|
|
|
6
6
|
* stdout/stderr surfaces, and exit codes.
|
|
7
7
|
*/
|
|
8
8
|
import type { LexiconPlugin } from "../../lexicon.js";
|
|
9
|
+
/**
|
|
10
|
+
* A side of `--from` or `--to`: a lexicon, or a lexicon and one of its
|
|
11
|
+
* dialects, `sql/clickhouse` (#4399). The plugin is the part before the slash.
|
|
12
|
+
*/
|
|
13
|
+
export declare function lexiconOfSide(side: string): string;
|
|
9
14
|
export interface MigrateCliOpts {
|
|
10
15
|
sourceFile: string;
|
|
11
16
|
from: string;
|
|
12
17
|
to: string;
|
|
13
|
-
emit: "yaml" | "ts";
|
|
18
|
+
emit: "yaml" | "ts" | "sql";
|
|
14
19
|
strict: boolean;
|
|
15
20
|
validate: boolean;
|
|
16
21
|
useComposites: boolean;
|
|
@@ -30,6 +35,8 @@ export interface MigrateCliResult {
|
|
|
30
35
|
error?: string;
|
|
31
36
|
/** Markdown summary lines printed to stderr */
|
|
32
37
|
markdownSummary?: string;
|
|
38
|
+
/** What was done about workspace links, or why nothing was (#4399) */
|
|
39
|
+
linkNote?: string;
|
|
33
40
|
}
|
|
34
41
|
export declare function migrateCommand(opts: MigrateCliOpts): Promise<MigrateCliResult>;
|
|
35
42
|
interface ValidatorResult {
|
|
@@ -46,6 +53,11 @@ interface ValidatorResult {
|
|
|
46
53
|
* Exported for testability.
|
|
47
54
|
*/
|
|
48
55
|
export declare function tryValidateExternal(yamlText: string): ValidatorResult;
|
|
56
|
+
/**
|
|
57
|
+
* The report for a pair that is not GitHub to GitLab: the counts and the
|
|
58
|
+
* diagnostics, with none of that pair's workflow advice (#4399).
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatDiagnosticSummary(provenance: Array<Record<string, unknown>>, diagnostics: Array<Record<string, unknown>>): string;
|
|
49
61
|
/**
|
|
50
62
|
* Format the migration report as Markdown, mirroring the output format
|
|
51
63
|
* prescribed by the upstream gitlab-org/ci-cd/github-actions-to-gitlab-ci
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,4DAA4D;IAC5D,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0NpF;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AASD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAUrE;AAwCD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAavI;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC1C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC3C,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAkER;AAyID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAgBjE"}
|
|
@@ -5,13 +5,24 @@
|
|
|
5
5
|
* The lexicon owns the actual translation logic; core orchestrates I/O,
|
|
6
6
|
* stdout/stderr surfaces, and exit codes.
|
|
7
7
|
*/
|
|
8
|
-
import { readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { dirname } from "node:path";
|
|
9
10
|
import { spawnSync } from "node:child_process";
|
|
10
11
|
import { formatError, formatInfo } from "../format.js";
|
|
11
12
|
import { formatSarif } from "../reporters/stylish.js";
|
|
12
13
|
import { ensureTypeScriptLoader } from "../../ts-loader.js";
|
|
14
|
+
import { planMigrateLinks } from "../../workspace/migrate-links.js";
|
|
15
|
+
/**
|
|
16
|
+
* A side of `--from` or `--to`: a lexicon, or a lexicon and one of its
|
|
17
|
+
* dialects, `sql/clickhouse` (#4399). The plugin is the part before the slash.
|
|
18
|
+
*/
|
|
19
|
+
export function lexiconOfSide(side) {
|
|
20
|
+
const slash = side.indexOf("/");
|
|
21
|
+
return slash === -1 ? side : side.slice(0, slash);
|
|
22
|
+
}
|
|
13
23
|
export async function migrateCommand(opts) {
|
|
14
|
-
const
|
|
24
|
+
const targetLexicon = lexiconOfSide(opts.to);
|
|
25
|
+
const targetPlugin = opts.plugins.find((p) => p.name === targetLexicon);
|
|
15
26
|
if (!targetPlugin) {
|
|
16
27
|
return {
|
|
17
28
|
exitCode: 1,
|
|
@@ -28,7 +39,7 @@ export async function migrateCommand(opts) {
|
|
|
28
39
|
error: `Lexicon "${opts.to}" does not support migration`,
|
|
29
40
|
};
|
|
30
41
|
}
|
|
31
|
-
const source = targetPlugin.migrationSource(opts.from);
|
|
42
|
+
const source = targetPlugin.migrationSource(opts.from, opts.to);
|
|
32
43
|
if (!source) {
|
|
33
44
|
return {
|
|
34
45
|
exitCode: 1,
|
|
@@ -38,8 +49,24 @@ export async function migrateCommand(opts) {
|
|
|
38
49
|
};
|
|
39
50
|
}
|
|
40
51
|
let content;
|
|
52
|
+
// A directory is a workspace member: the source reads it itself (#4399).
|
|
53
|
+
let isDirectory = false;
|
|
54
|
+
try {
|
|
55
|
+
isDirectory = statSync(opts.sourceFile).isDirectory();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// The read below names the problem.
|
|
59
|
+
}
|
|
60
|
+
if (isDirectory && !source.directory) {
|
|
61
|
+
return {
|
|
62
|
+
exitCode: 1,
|
|
63
|
+
diagnostics: [],
|
|
64
|
+
provenance: [],
|
|
65
|
+
error: `${opts.sourceFile} is a directory, and migrating from "${opts.from}" reads a file`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
41
68
|
try {
|
|
42
|
-
content = readFileSync(opts.sourceFile, "utf-8");
|
|
69
|
+
content = isDirectory ? "" : readFileSync(opts.sourceFile, "utf-8");
|
|
43
70
|
}
|
|
44
71
|
catch (err) {
|
|
45
72
|
return {
|
|
@@ -49,7 +76,7 @@ export async function migrateCommand(opts) {
|
|
|
49
76
|
error: `Cannot read ${opts.sourceFile}: ${err instanceof Error ? err.message : String(err)}`,
|
|
50
77
|
};
|
|
51
78
|
}
|
|
52
|
-
if (!source.detect(content)) {
|
|
79
|
+
if (!isDirectory && !source.detect(content)) {
|
|
53
80
|
return {
|
|
54
81
|
exitCode: 1,
|
|
55
82
|
diagnostics: [],
|
|
@@ -80,6 +107,7 @@ export async function migrateCommand(opts) {
|
|
|
80
107
|
// Write output (--output file or stdout)
|
|
81
108
|
if (opts.output && opts.output !== "-") {
|
|
82
109
|
try {
|
|
110
|
+
mkdirSync(dirname(opts.output), { recursive: true });
|
|
83
111
|
writeFileSync(opts.output, result.output);
|
|
84
112
|
}
|
|
85
113
|
catch (err) {
|
|
@@ -94,9 +122,35 @@ export async function migrateCommand(opts) {
|
|
|
94
122
|
else {
|
|
95
123
|
process.stdout.write(result.output);
|
|
96
124
|
}
|
|
125
|
+
// The target's own server (--validate), when the source has one (#4399).
|
|
126
|
+
// A refusal always fails the run; so does a server that could not start,
|
|
127
|
+
// since a validation that did not run is not a pass.
|
|
128
|
+
let validationFailed = false;
|
|
129
|
+
if (opts.validate && result.validate) {
|
|
130
|
+
try {
|
|
131
|
+
const found = await result.validate();
|
|
132
|
+
result.diagnostics.push(...found);
|
|
133
|
+
if (found.some((d) => d.severity === "error")) {
|
|
134
|
+
validationFailed = true;
|
|
135
|
+
console.error(`Validator found ${found.filter((d) => d.severity === "error").length} refused statement(s):\n${found.map((d) => ` ${String(d.message)}`).join("\n")}`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.error("Validator (target server) OK");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return {
|
|
143
|
+
exitCode: 1,
|
|
144
|
+
output: result.output,
|
|
145
|
+
diagnostics: result.diagnostics,
|
|
146
|
+
provenance: result.provenance,
|
|
147
|
+
error: `--validate did not run: ${err instanceof Error ? err.message : String(err)}`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
97
151
|
// External validator (--validate) — glci preferred, glab fallback.
|
|
98
152
|
let validatorWarning;
|
|
99
|
-
if (opts.validate && opts.emit === "yaml") {
|
|
153
|
+
if (opts.validate && !result.validate && opts.emit === "yaml") {
|
|
100
154
|
const v = tryValidateExternal(result.output);
|
|
101
155
|
if (!v.ran) {
|
|
102
156
|
validatorWarning = "neither glci nor glab is on PATH; skipping --validate";
|
|
@@ -126,11 +180,37 @@ export async function migrateCommand(opts) {
|
|
|
126
180
|
console.error(`Validator (${v.backend}) OK`);
|
|
127
181
|
}
|
|
128
182
|
}
|
|
183
|
+
// Links from the output's workspace member to the outputs it reads (#4399).
|
|
184
|
+
let linkNote;
|
|
185
|
+
if (result.links && result.links.length > 0) {
|
|
186
|
+
const outcome = planMigrateLinks({
|
|
187
|
+
sourcePath: opts.sourceFile,
|
|
188
|
+
outputPath: opts.output && opts.output !== "-" ? opts.output : undefined,
|
|
189
|
+
outputs: result.links,
|
|
190
|
+
});
|
|
191
|
+
if (outcome && "skipped" in outcome)
|
|
192
|
+
linkNote = outcome.skipped;
|
|
193
|
+
else if (outcome) {
|
|
194
|
+
const { plan } = outcome;
|
|
195
|
+
if (plan.added.length === 0) {
|
|
196
|
+
linkNote = `member ${plan.consumer} already links every output it reads from ${plan.producer}`;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
try {
|
|
200
|
+
writeFileSync(plan.file, plan.text);
|
|
201
|
+
linkNote = `added ${plan.added.length} link${plan.added.length === 1 ? "" : "s"} from member ${plan.consumer} to ${plan.producer} in ${plan.file}`;
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
linkNote = `could not write the links to ${plan.file}: ${err instanceof Error ? err.message : String(err)}`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
129
209
|
// SARIF report (--report <path>) — reuse the lint-side formatSarif so any
|
|
130
210
|
// CI SARIF ingest path treats migration findings uniformly.
|
|
131
211
|
if (opts.reportFile) {
|
|
132
212
|
try {
|
|
133
|
-
const rules = await loadMigrationRules(
|
|
213
|
+
const rules = await loadMigrationRules(targetLexicon);
|
|
134
214
|
const lintShape = result.diagnostics;
|
|
135
215
|
const sarif = formatSarif(lintShape, rules);
|
|
136
216
|
writeFileSync(opts.reportFile, sarif);
|
|
@@ -141,7 +221,7 @@ export async function migrateCommand(opts) {
|
|
|
141
221
|
}
|
|
142
222
|
}
|
|
143
223
|
// Markdown summary (always to stderr — leaves stdout clean for piping)
|
|
144
|
-
let markdownSummary = formatMarkdownSummary(result.provenance, result.diagnostics, content);
|
|
224
|
+
let markdownSummary = targetLexicon === "gitlab" ? formatMarkdownSummary(result.provenance, result.diagnostics, content) : formatDiagnosticSummary(result.provenance, result.diagnostics);
|
|
145
225
|
// Append the security posture section when security analysis ran (#306).
|
|
146
226
|
if (result.securityPosture) {
|
|
147
227
|
markdownSummary += `\n\n${result.securityPosture}`;
|
|
@@ -150,13 +230,14 @@ export async function migrateCommand(opts) {
|
|
|
150
230
|
// The transformer already escalates needs-review → error when opts.strict
|
|
151
231
|
// is passed via MigrationSource.transform(); we double-check here.
|
|
152
232
|
const errorDiagnostics = result.diagnostics.filter((d) => d.severity === "error");
|
|
153
|
-
const exitCode = opts.strict && errorDiagnostics.length > 0 ? 1 : 0;
|
|
233
|
+
const exitCode = validationFailed || (opts.strict && errorDiagnostics.length > 0) ? 1 : 0;
|
|
154
234
|
return {
|
|
155
235
|
exitCode,
|
|
156
236
|
output: result.output,
|
|
157
237
|
diagnostics: result.diagnostics,
|
|
158
238
|
provenance: result.provenance,
|
|
159
239
|
markdownSummary,
|
|
240
|
+
...(linkNote ? { linkNote } : {}),
|
|
160
241
|
};
|
|
161
242
|
}
|
|
162
243
|
function isOnPath(cmd) {
|
|
@@ -188,7 +269,7 @@ export function tryValidateExternal(yamlText) {
|
|
|
188
269
|
* Returns an empty array if the lexicon doesn't expose them.
|
|
189
270
|
*/
|
|
190
271
|
async function loadMigrationRules(targetLexicon) {
|
|
191
|
-
//
|
|
272
|
+
// gitlab and sql expose migration rules. Hard-coded imports keep
|
|
192
273
|
// the dependency direction explicit; widen the switch when more
|
|
193
274
|
// lexicons ship their own migrate paths.
|
|
194
275
|
if (targetLexicon === "gitlab") {
|
|
@@ -201,8 +282,48 @@ async function loadMigrationRules(targetLexicon) {
|
|
|
201
282
|
return [];
|
|
202
283
|
}
|
|
203
284
|
}
|
|
285
|
+
// The sql lexicon's needs-review catalog (#4399), one rule per finding id.
|
|
286
|
+
if (targetLexicon === "sql") {
|
|
287
|
+
try {
|
|
288
|
+
ensureTypeScriptLoader();
|
|
289
|
+
const mod = await import("@intentius/chant-lexicon-sql/clickhouse/review-catalog");
|
|
290
|
+
const rules = mod.REVIEW_RULES;
|
|
291
|
+
return Object.values(rules).map((r) => ({
|
|
292
|
+
id: r.id,
|
|
293
|
+
severity: "warning",
|
|
294
|
+
category: "correctness",
|
|
295
|
+
description: `${r.name}: ${r.summary}`,
|
|
296
|
+
helpUri: r.docs[0] ?? "https://intentius.io/chant/lexicons/sql/migrate-postgres-to-clickhouse/",
|
|
297
|
+
check: () => [],
|
|
298
|
+
}));
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
return [];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
204
304
|
return [];
|
|
205
305
|
}
|
|
306
|
+
/**
|
|
307
|
+
* The report for a pair that is not GitHub to GitLab: the counts and the
|
|
308
|
+
* diagnostics, with none of that pair's workflow advice (#4399).
|
|
309
|
+
*/
|
|
310
|
+
export function formatDiagnosticSummary(provenance, diagnostics) {
|
|
311
|
+
const totals = { error: 0, warning: 0, info: 0 };
|
|
312
|
+
for (const d of diagnostics) {
|
|
313
|
+
const sev = d.severity;
|
|
314
|
+
if (sev === "error" || sev === "warning" || sev === "info")
|
|
315
|
+
totals[sev]++;
|
|
316
|
+
}
|
|
317
|
+
const lines = ["", "## Migration report", "", `- Translated: ${provenance.length}`, `- Diagnostics: ${totals.error} error, ${totals.warning} warning, ${totals.info} info`];
|
|
318
|
+
if (diagnostics.length > 0) {
|
|
319
|
+
lines.push("", "### Diagnostics", "", "| Severity | Rule | Message |", "|---|---|---|");
|
|
320
|
+
for (const d of diagnostics.slice(0, 50))
|
|
321
|
+
lines.push(`| ${String(d.severity)} | ${String(d.ruleId)} | ${String(d.message).replace(/\|/g, "\\|").slice(0, 160)} |`);
|
|
322
|
+
if (diagnostics.length > 50)
|
|
323
|
+
lines.push(`| ... | ... | ${diagnostics.length - 50} more diagnostics omitted |`);
|
|
324
|
+
}
|
|
325
|
+
return lines.join("\n");
|
|
326
|
+
}
|
|
206
327
|
/**
|
|
207
328
|
* Format the migration report as Markdown, mirroring the output format
|
|
208
329
|
* prescribed by the upstream gitlab-org/ci-cd/github-actions-to-gitlab-ci
|
|
@@ -414,6 +535,9 @@ export function printMigrateResult(result) {
|
|
|
414
535
|
if (result.markdownSummary) {
|
|
415
536
|
console.error(result.markdownSummary);
|
|
416
537
|
}
|
|
538
|
+
if (result.linkNote) {
|
|
539
|
+
console.error(`\nWorkspace links: ${result.linkNote}`);
|
|
540
|
+
}
|
|
417
541
|
if (result.exitCode === 0) {
|
|
418
542
|
console.error(formatInfo("\nMigration complete."));
|
|
419
543
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/approve.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EACuE,KAAK,UAAU,EAC5F,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EAEuC,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAChG,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAiE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAO3H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkDlD,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA6GrE;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oGAAoG;IACpG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AA0ClB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/approve.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EACuE,KAAK,UAAU,EAC5F,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EAEuC,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAChG,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAiE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAO3H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkDlD,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA6GrE;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oGAAoG;IACpG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AA0ClB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CA0Y9B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,oBAAoB,EAAE,EAC7B,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,OAAO,GAAE,SAAS,iBAAiB,EAA+B,EAClE,KAAK,GAAE,eAAgC,GACtC,MAAM,EAAE,CAuCV"}
|
|
@@ -488,6 +488,21 @@ export async function recordGateApproval(opName, gate, opts) {
|
|
|
488
488
|
// decision is written next to the approval, so a pass can be traced to the
|
|
489
489
|
// rule that allowed it.
|
|
490
490
|
const approval = standingForOrigin?.approval;
|
|
491
|
+
// #4290, #4324: roles come from .chant/trust.json at base, for an approver
|
|
492
|
+
// a seal proves. The quorum and the policy both read these, never --role.
|
|
493
|
+
const judge = trustQuorumJudge({ signers: scope.policy, roles: scope.policy.roles });
|
|
494
|
+
const trusted = judge({
|
|
495
|
+
version: 1,
|
|
496
|
+
op: opName,
|
|
497
|
+
gate,
|
|
498
|
+
...(environment !== undefined ? { environment } : {}),
|
|
499
|
+
...(planDigest !== undefined ? { planDigest } : {}),
|
|
500
|
+
resolvedBy,
|
|
501
|
+
...(relayedBy ? { relayedBy } : {}),
|
|
502
|
+
timestamp,
|
|
503
|
+
...(checkpointDigest !== undefined ? { checkpointDigest } : {}),
|
|
504
|
+
...(seal ? { seal } : {}),
|
|
505
|
+
}).roles;
|
|
491
506
|
let policyDecision;
|
|
492
507
|
if (approval?.policy) {
|
|
493
508
|
try {
|
|
@@ -497,6 +512,7 @@ export async function recordGateApproval(opName, gate, opts) {
|
|
|
497
512
|
gate,
|
|
498
513
|
resolvedBy,
|
|
499
514
|
approver,
|
|
515
|
+
roles: trusted,
|
|
500
516
|
...(planDigest !== undefined ? { planDigest } : {}),
|
|
501
517
|
...(approval.context ? { context: approval.context } : {}),
|
|
502
518
|
}));
|
|
@@ -557,9 +573,12 @@ export async function recordGateApproval(opName, gate, opts) {
|
|
|
557
573
|
console.error(formatInfo(`The next run resumes at this gate from run ${standing?.runId ?? "(unknown)"}'s checkpoint ${record.checkpointDigest}, ` +
|
|
558
574
|
"after it plans again. A moved plan or another commit starts it at the first phase."));
|
|
559
575
|
}
|
|
576
|
+
const untrusted = (approver.roles ?? []).filter((r) => !trusted.includes(r));
|
|
577
|
+
if (untrusted.length > 0) {
|
|
578
|
+
console.error(formatInfo(`--role ${untrusted.join(", ")} is recorded on the approval and trusted by nothing: a gate's quorum and policy read ` +
|
|
579
|
+
`${record.resolvedBy}'s roles from .chant/trust.json at base, and only for an approval sealed by a signer listed at base (chant approve --sign).`));
|
|
580
|
+
}
|
|
560
581
|
if (approval) {
|
|
561
|
-
// #4290: the rules count roles from .chant/trust.json at base, for a proven approver.
|
|
562
|
-
const judge = trustQuorumJudge({ signers: scope.policy, roles: scope.policy.roles });
|
|
563
582
|
for (const line of describeApprovalProgress(approval, record, ledger.resolutions, standingForOrigin, ledger.pending, judge)) {
|
|
564
583
|
console.error(formatInfo(line));
|
|
565
584
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/build.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/build.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2PlD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsJnE"}
|
|
@@ -168,6 +168,11 @@ async function runGenerateComponents(ctx) {
|
|
|
168
168
|
return 1;
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
|
+
// #4327: ci.locks: plan adds the lock and unlock jobs. Read from the declaration, as the security groups are; GitLab keeps its own jobs.
|
|
172
|
+
let locks;
|
|
173
|
+
if (found && args.prLoop && lexicon !== "gitlab") {
|
|
174
|
+
locks = (await import("../../workspace/ci-locks.js")).ciLocksAt(resolve(args.path)) === "plan" ? "plan" : undefined;
|
|
175
|
+
}
|
|
171
176
|
// Which lexicons support generate mode is a property of the loaded lexicon
|
|
172
177
|
// plugins (those implementing `generateComponentPipeline`, #688), not a
|
|
173
178
|
// hard-coded core list — `generateComponentsPipeline` returns a descriptive
|
|
@@ -186,7 +191,7 @@ async function runGenerateComponents(ctx) {
|
|
|
186
191
|
: {}),
|
|
187
192
|
// #3183: a plan job per pull request and an apply job per merge.
|
|
188
193
|
// #4292: on the branch ci.branches routes the member to, when it routes it.
|
|
189
|
-
...(args.prLoop ? { prLoop: { ...prLoopOption(args, reportUrl, reviewRules, isolatedRunners), ...(plan?.branch ? { branch: plan.branch } : {}), ...(identity ? { identity } : {}), ...(prEnvIdentity ? { prEnvIdentity } : {}) } } : {}),
|
|
194
|
+
...(args.prLoop ? { prLoop: { ...prLoopOption(args, reportUrl, reviewRules, isolatedRunners), ...(plan?.branch ? { branch: plan.branch } : {}), ...(identity ? { identity } : {}), ...(prEnvIdentity ? { prEnvIdentity } : {}), ...(locks ? { locks } : {}) } } : {}),
|
|
190
195
|
// #4002: the job image and the lines that install what it lacks, chant itself included.
|
|
191
196
|
...(args.image ? { image: args.image } : {}),
|
|
192
197
|
...(args.beforeScript?.length ? { beforeScript: args.beforeScript } : {}),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/ledger.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC3E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant ledger <table> [dir] [--member <name>] [--where <field><op><value>]...
|
|
3
|
+
* [--since <time>] [--at <rev>] [--json]` (#4363): one ledger's rows from the
|
|
4
|
+
* local `chant/lifecycle` branch, filtered with typed filters. The read and
|
|
5
|
+
* its contract live in `../../lifecycle/ledger-read.ts`; the ledgers are read
|
|
6
|
+
* as `chant query` reads them (`./query.ts` {@link queryLedgers}).
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync } from "node:fs";
|
|
9
|
+
import { resolve } from "node:path";
|
|
10
|
+
import { formatError, formatWarning } from "../format.js";
|
|
11
|
+
import { queryLedgers } from "./query.js";
|
|
12
|
+
const USAGE = "chant ledger <resources|snapshots|runs|gates|deploys|releases|cuts> [dir] [--member <name>] [--where <field><op><value>]... [--since <time>] [--at <rev>] [--json]";
|
|
13
|
+
const cell = (v) => (v === null || v === undefined ? "" : typeof v === "object" ? JSON.stringify(v) : String(v));
|
|
14
|
+
export async function runLedgerCommand(ctx) {
|
|
15
|
+
const { args } = ctx;
|
|
16
|
+
const table = args.positionals?.[0];
|
|
17
|
+
if (table === undefined || table.trim() === "") {
|
|
18
|
+
console.error(formatError({ message: "chant ledger needs a table", hint: USAGE }));
|
|
19
|
+
return 1;
|
|
20
|
+
}
|
|
21
|
+
const cwd = resolve(args.positionals?.[1] ?? ".");
|
|
22
|
+
if (!existsSync(cwd)) {
|
|
23
|
+
console.error(formatError({ message: `${cwd} does not exist`, hint: USAGE }));
|
|
24
|
+
return 1;
|
|
25
|
+
}
|
|
26
|
+
const { readLedgerTable, ledgerReadFailure, LedgerRevisionError } = await import("../../lifecycle/ledger-read.js");
|
|
27
|
+
const { QueryError } = await import("../../lifecycle/query.js");
|
|
28
|
+
let doc;
|
|
29
|
+
try {
|
|
30
|
+
doc = await readLedgerTable(table, () => queryLedgers(cwd, args.members, args.at), { where: args.where, since: args.since, at: args.at ?? null });
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
if (err instanceof LedgerRevisionError)
|
|
34
|
+
doc = ledgerReadFailure("revision-unknown", err.message);
|
|
35
|
+
else if (err instanceof QueryError)
|
|
36
|
+
doc = ledgerReadFailure("ledger-unreadable", err.message);
|
|
37
|
+
else
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
if (args.json) {
|
|
41
|
+
console.log(JSON.stringify(doc, null, 2));
|
|
42
|
+
return "error" in doc ? 1 : 0;
|
|
43
|
+
}
|
|
44
|
+
if ("error" in doc) {
|
|
45
|
+
console.error(formatError({ message: `${doc.error.code}: ${doc.error.message}`, hint: USAGE }));
|
|
46
|
+
return 1;
|
|
47
|
+
}
|
|
48
|
+
const widths = doc.columns.map((c) => Math.max(c.length, ...doc.rows.map((r) => cell(r[c]).length)));
|
|
49
|
+
const line = (vals) => vals.map((v, i) => v.padEnd(widths[i])).join(" ").trimEnd();
|
|
50
|
+
console.log([line(doc.columns), line(widths.map((w) => "-".repeat(w))), ...doc.rows.map((r) => line(doc.columns.map((c) => cell(r[c]))))].join("\n"));
|
|
51
|
+
console.log(`(${doc.rows.length} of ${doc.total} ${doc.total === 1 ? "row" : "rows"})`);
|
|
52
|
+
if (doc.malformed > 0)
|
|
53
|
+
console.error(formatWarning({ message: `left out ${doc.malformed} in ${doc.table} that could not be read` }));
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/migrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/migrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDrE"}
|