@empire-builder-kit/nx 1.0.0-rc.4 → 1.0.0-rc.41
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/README.md +44 -10
- package/executors.json +21 -1
- package/generators.json +10 -0
- package/package.json +31 -7
- package/src/aws/child-environment.d.ts +10 -0
- package/src/aws/child-environment.js +77 -0
- package/src/aws/identity.d.ts +13 -0
- package/src/aws/identity.js +41 -0
- package/src/aws-authority/index.d.ts +2 -0
- package/src/aws-authority/index.js +6 -0
- package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
- package/src/aws-authority/lambda-policy-ordering.js +56 -0
- package/src/aws-authority/stage-authority.d.ts +248 -0
- package/src/aws-authority/stage-authority.js +3558 -0
- package/src/blueprints/external-sandbox.d.ts +1 -1
- package/src/blueprints/external-sandbox.js +21 -9
- package/src/blueprints/manifest.d.ts +1 -1
- package/src/blueprints/resolver.js +28 -15
- package/src/cli/bootstrap.d.ts +1 -1
- package/src/cli/deploy-runtime.d.ts +30 -0
- package/src/cli/deploy-runtime.js +174 -0
- package/src/cli/dev-command.d.ts +18 -4
- package/src/cli/dev-command.js +71 -0
- package/src/cli/main.d.ts +9 -1
- package/src/cli/main.js +157 -24
- package/src/cli/output.d.ts +1 -1
- package/src/cli/output.js +1 -1
- package/src/cli/personal-secret-runtime.d.ts +12 -0
- package/src/cli/personal-secret-runtime.js +18 -3
- package/src/cli/secret-terminal.js +1 -1
- package/src/container-images.d.ts +1 -1
- package/src/container-images.js +1 -1
- package/src/developer-agent/context.js +41 -9
- package/src/developer-agent/generator-planning.js +20 -6
- package/src/developer-agent/git-inspection.d.ts +6 -2
- package/src/developer-agent/git-inspection.js +78 -6
- package/src/developer-agent/model.d.ts +5 -3
- package/src/developer-agent/model.js +4 -4
- package/src/developer-agent/operation-registry.d.ts +15 -0
- package/src/developer-agent/operation-registry.js +342 -49
- package/src/developer-agent/planning.d.ts +8 -1
- package/src/developer-agent/planning.js +39 -16
- package/src/developer-agent/preview-changes.d.ts +2 -0
- package/src/developer-agent/preview-changes.js +14 -2
- package/src/developer-agent/preview-source.js +3 -0
- package/src/developer-agent/validation.js +25 -9
- package/src/developer-agent/workspace-inspection.js +60 -5
- package/src/executors/blueprint-trust/blueprint-trust.js +6 -0
- package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
- package/src/executors/deployment-plan/deployment-plan.js +57 -2
- package/src/executors/dev-doctor/dev-doctor.js +13 -6
- package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
- package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
- package/src/executors/dev-task-cleanup/schema.json +9 -0
- package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
- package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
- package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
- package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
- package/src/executors/fleet/fleet.js +1 -1
- package/src/executors/foundation-preflight/foundation-preflight.d.ts +1 -0
- package/src/executors/foundation-preflight/foundation-preflight.js +6 -2
- package/src/executors/foundation-preflight/schema.json +5 -0
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.d.ts +13 -2
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js +95 -31
- package/src/executors/foundation-profile-preflight/production-database-safeguard.d.ts +65 -0
- package/src/executors/foundation-profile-preflight/production-database-safeguard.js +223 -0
- package/src/executors/foundation-profile-preflight/schema.json +15 -4
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.d.ts +11 -1
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +70 -20
- package/src/executors/foundation-remove-preflight/schema.json +6 -1
- package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
- package/src/executors/github-bootstrap/github-bootstrap.js +3 -0
- package/src/executors/github-bootstrap/schema.json +7 -1
- package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +29 -136
- package/src/executors/infrastructure-plan/infrastructure-plan.js +230 -3282
- package/src/executors/infrastructure-plan/schema.json +12 -52
- package/src/executors/local-deploy/federated-credential-transport.d.ts +48 -0
- package/src/executors/local-deploy/federated-credential-transport.js +252 -0
- package/src/executors/local-deploy/local-approval.d.ts +18 -0
- package/src/executors/local-deploy/local-approval.js +39 -0
- package/src/executors/local-deploy/local-deploy.d.ts +112 -0
- package/src/executors/local-deploy/local-deploy.js +1404 -0
- package/src/executors/local-deploy/schema.json +70 -0
- package/src/executors/refresh/refresh.js +2 -2
- package/src/executors/remove/remove.js +2 -2
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.d.ts +42 -0
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +1229 -0
- package/src/executors/router-waf-rehearsal/schema.json +29 -0
- package/src/executors/secret-initialize/schema.json +42 -0
- package/src/executors/secret-initialize/secret-initialize.d.ts +34 -0
- package/src/executors/secret-initialize/secret-initialize.js +297 -0
- package/src/executors/secret-metadata/schema.json +5 -0
- package/src/executors/secret-metadata/secret-metadata.d.ts +16 -2
- package/src/executors/secret-metadata/secret-metadata.js +129 -30
- package/src/executors/sst-lifecycle/generated-secret-retirement.d.ts +53 -0
- package/src/executors/sst-lifecycle/generated-secret-retirement.js +192 -0
- package/src/executors/sst-lifecycle/governed-native-operation.d.ts +48 -0
- package/src/executors/sst-lifecycle/governed-native-operation.js +163 -0
- package/src/executors/sst-lifecycle/logging-preflight.d.ts +5 -0
- package/src/executors/sst-lifecycle/logging-preflight.js +23 -13
- package/src/executors/sst-lifecycle/run-sst-command.d.ts +46 -6
- package/src/executors/sst-lifecycle/run-sst-command.js +750 -71
- package/src/executors/sst-lifecycle/schema.json +8 -1
- package/src/executors/sst-lifecycle/secret-preflight.d.ts +2 -0
- package/src/executors/sst-lifecycle/secret-preflight.js +13 -7
- package/src/executors/sst-lifecycle/sst-environment-source.d.ts +33 -0
- package/src/executors/sst-lifecycle/sst-environment-source.js +267 -0
- package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
- package/src/executors/sst-lifecycle/task-unlock.js +126 -0
- package/src/executors/unlock/unlock.js +2 -2
- package/src/foundation/capability-plan.d.ts +43 -0
- package/src/foundation/capability-plan.js +168 -0
- package/src/foundation/cost-estimate.d.ts +170 -0
- package/src/foundation/cost-estimate.js +683 -0
- package/src/foundation/discovery.d.ts +14 -11
- package/src/foundation/discovery.js +32 -6
- package/src/foundation/index.d.ts +4 -0
- package/src/foundation/index.js +11 -0
- package/src/foundation/local-database-contract.d.ts +20 -0
- package/src/foundation/local-database-contract.js +262 -13
- package/src/foundation/local-private-smoke-access.d.ts +20 -0
- package/src/foundation/local-private-smoke-access.js +197 -0
- package/src/foundation/logging-preflight.js +1 -1
- package/src/foundation/logging.d.ts +3 -1
- package/src/foundation/logging.js +1 -1
- package/src/foundation/partial-state.d.ts +10 -0
- package/src/foundation/partial-state.js +21 -0
- package/src/foundation/preflight.js +37 -18
- package/src/foundation/private-smoke-access.d.ts +25 -0
- package/src/foundation/private-smoke-access.js +135 -0
- package/src/foundation/private-smoke-admission.d.ts +45 -0
- package/src/foundation/private-smoke-admission.js +180 -0
- package/src/foundation/private-smoke-control-plane.d.ts +18 -0
- package/src/foundation/private-smoke-control-plane.js +184 -0
- package/src/foundation/provision-database-bindings.d.ts +5 -0
- package/src/foundation/provision-database-bindings.js +41 -8
- package/src/foundation/provision-logical-database.js +15 -8
- package/src/foundation/requirements.d.ts +3 -3
- package/src/foundation/requirements.js +24 -12
- package/src/foundation/router-waf-rate-rehearsal.d.ts +97 -0
- package/src/foundation/router-waf-rate-rehearsal.js +210 -0
- package/src/foundation/router-waf.d.ts +149 -0
- package/src/foundation/router-waf.js +809 -0
- package/src/foundation/stages.d.ts +1 -0
- package/src/foundation/stages.js +11 -0
- package/src/generators/blueprint/blueprint.d.ts +5 -0
- package/src/generators/blueprint/blueprint.js +102 -0
- package/src/generators/blueprint/files.d.ts +6 -0
- package/src/generators/blueprint/files.js +217 -0
- package/src/generators/blueprint/schema.d.ts +4 -0
- package/src/generators/blueprint/schema.json +18 -0
- package/src/generators/formatting.d.ts +8 -0
- package/src/generators/formatting.js +141 -0
- package/src/generators/function/function.js +38 -17
- package/src/generators/logging-registry.d.ts +2 -0
- package/src/generators/logging-registry.js +22 -0
- package/src/generators/post-generation-install.js +2 -2
- package/src/generators/preset/dependency-overrides.d.ts +8 -0
- package/src/generators/preset/dependency-overrides.js +55 -0
- package/src/generators/preset/generator.js +43 -3
- package/src/generators/preset/schema.d.ts +10 -0
- package/src/generators/preset/schema.json +47 -0
- package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
- package/src/generators/preset/workspace-files-adopter-skills.js +324 -0
- package/src/generators/preset/workspace-files-ci-acceptance.d.ts +1 -0
- package/src/generators/preset/workspace-files-ci-acceptance.js +791 -0
- package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
- package/src/generators/preset/workspace-files-ci-install.js +196 -0
- package/src/generators/preset/workspace-files-developer-agent.d.ts +2 -0
- package/src/generators/preset/workspace-files-developer-agent.js +162 -44
- package/src/generators/preset/workspace-files-ecr-inspector.d.ts +18 -0
- package/src/generators/preset/workspace-files-ecr-inspector.js +298 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.js +5 -2
- package/src/generators/preset/workspace-files-performance-cost.d.ts +2 -2
- package/src/generators/preset/workspace-files-performance-cost.js +8 -8
- package/src/generators/preset/workspace-files-performance-load.d.ts +1 -1
- package/src/generators/preset/workspace-files-performance-load.js +39 -25
- package/src/generators/preset/workspace-files-shared-operation-claims.d.ts +10 -0
- package/src/generators/preset/workspace-files-shared-operation-claims.js +59 -0
- package/src/generators/preset/workspace-files-stage-authority.d.ts +6 -0
- package/src/generators/preset/workspace-files-stage-authority.js +529 -0
- package/src/generators/preset/workspace-files-thin-deploy.d.ts +65 -0
- package/src/generators/preset/workspace-files-thin-deploy.js +2507 -0
- package/src/generators/preset/workspace-files-thin-docs.d.ts +7 -0
- package/src/generators/preset/workspace-files-thin-docs.js +370 -0
- package/src/generators/preset/workspace-files-thin-release.d.ts +14 -0
- package/src/generators/preset/workspace-files-thin-release.js +26 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.js +254 -42
- package/src/generators/preset/workspace-files.d.ts +18 -2
- package/src/generators/preset/workspace-files.js +1525 -609
- package/src/generators/repository-policy/repository-policy.js +235 -5
- package/src/generators/repository-policy/schema.d.ts +10 -0
- package/src/generators/repository-policy/schema.json +80 -4
- package/src/generators/repository-policy/tree-policy.d.ts +3 -0
- package/src/generators/repository-policy/tree-policy.js +25 -0
- package/src/generators/slice/built-in-plan-api-contract-files.js +49 -11
- package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-api-files.js +130 -414
- package/src/generators/slice/built-in-plan-async-work-files.js +166 -1969
- package/src/generators/slice/built-in-plan-authorization-files.js +102 -334
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +975 -233
- package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
- package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
- package/src/generators/slice/built-in-plan-background-work-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-background-work-files.js +99 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +5 -31
- package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-data-files.js +176 -1200
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +37 -2
- package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2443
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +50 -8
- package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js +44 -25
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +25 -2
- package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
- package/src/generators/slice/built-in-plan-foundation-files.js +39 -18
- package/src/generators/slice/built-in-plan-frontend-files.js +14 -3
- package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js +933 -730
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +75 -14
- package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
- package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
- package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
- package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-delivery.js +137 -0
- package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
- package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
- package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
- package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
- package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
- package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
- package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
- package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
- package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
- package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
- package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
- package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
- package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
- package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
- package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-metadata-files.js +159 -29
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +324 -0
- package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-operations-files.js +585 -97
- package/src/generators/slice/built-in-plan-performance-files.d.ts +2 -1
- package/src/generators/slice/built-in-plan-performance-files.js +220 -1074
- package/src/generators/slice/built-in-plan-project-files.js +141 -135
- package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-release-files.js +310 -70
- package/src/generators/slice/built-in-plan-reliability-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-reliability-files.js +283 -44
- package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-secret-runtime-files.js +87 -76
- package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
- package/src/generators/slice/built-in-plan-shared.js +41 -19
- package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
- package/src/generators/slice/built-in-plan-sql-events.js +276 -0
- package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-testing-files.js +304 -172
- package/src/generators/slice/built-in-plan-testing-persistence-event-files.d.ts +7 -0
- package/src/generators/slice/built-in-plan-testing-persistence-event-files.js +487 -0
- package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-testing-persistence-files.js +180 -0
- package/src/generators/slice/built-in-plan-thin-release-files.d.ts +11 -0
- package/src/generators/slice/built-in-plan-thin-release-files.js +162 -0
- package/src/generators/slice/built-in-plan-verification-files.js +76 -2
- package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-web-files.js +223 -16
- package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-workload-role-files.js +143 -279
- package/src/generators/slice/built-in-plan.d.ts +11 -1
- package/src/generators/slice/built-in-plan.js +83 -30
- package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
- package/src/generators/slice/data-policy-review-seed.js +22 -0
- package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
- package/src/generators/slice/deployed-smoke-readiness.js +214 -0
- package/src/generators/slice/local-source-identity.d.ts +2 -0
- package/src/generators/slice/local-source-identity.js +31 -0
- package/src/generators/slice/persistence-contract.d.ts +14 -0
- package/src/generators/slice/persistence-contract.js +32 -0
- package/src/generators/slice/slice.js +61 -50
- package/src/generators/sql/schema.d.ts +7 -0
- package/src/generators/sql/schema.json +38 -0
- package/src/generators/sql/sql.d.ts +6 -0
- package/src/generators/sql/sql.js +53 -0
- package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
- package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
- package/src/generators/upgrade/upgrade.d.ts +15 -1
- package/src/generators/upgrade/upgrade.js +435 -44
- package/src/generators/workload/frozen-container.d.ts +1 -1
- package/src/generators/workload/performance-registration.d.ts +1 -0
- package/src/generators/workload/performance-registration.js +9 -11
- package/src/generators/workload/service-performance-files.d.ts +1 -0
- package/src/generators/workload/service-performance-files.js +27 -7
- package/src/generators/workload/workload.d.ts +1 -1
- package/src/generators/workload/workload.js +105 -29
- package/src/git-policy/action-pins.d.ts +5 -0
- package/src/git-policy/action-pins.js +5 -0
- package/src/git-policy/github-bootstrap.d.ts +48 -8
- package/src/git-policy/github-bootstrap.js +344 -176
- package/src/git-policy/routing.d.ts +7 -1
- package/src/git-policy/routing.js +62 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/infrastructure-change/local-capability.d.ts +73 -0
- package/src/infrastructure-change/local-capability.js +114 -0
- package/src/infrastructure-change/model.d.ts +25 -4
- package/src/infrastructure-change/model.js +1 -0
- package/src/infrastructure-change/normalize.d.ts +4 -0
- package/src/infrastructure-change/normalize.js +47 -7
- package/src/infrastructure-change/plan.d.ts +30 -3
- package/src/infrastructure-change/plan.js +323 -13
- package/src/infrastructure-change/risk.d.ts +3 -1
- package/src/infrastructure-change/risk.js +96 -16
- package/src/local-dev/browser-verification.d.ts +37 -0
- package/src/local-dev/browser-verification.js +281 -0
- package/src/local-dev/contracts.d.ts +10 -1
- package/src/local-dev/contracts.js +114 -13
- package/src/local-dev/dev-command-core.js +24 -5
- package/src/local-dev/docker-credential-health.d.ts +14 -0
- package/src/local-dev/docker-credential-health.js +94 -0
- package/src/local-dev/environment-inspector.d.ts +7 -0
- package/src/local-dev/environment-inspector.js +42 -15
- package/src/local-dev/environment-state.js +2 -2
- package/src/local-dev/errors.d.ts +1 -1
- package/src/local-dev/errors.js +2 -0
- package/src/local-dev/fleet-client.js +2 -2
- package/src/local-dev/fleet-configuration.js +57 -25
- package/src/local-dev/fleet-inventory.js +58 -22
- package/src/local-dev/fleet-ipc.d.ts +7 -0
- package/src/local-dev/fleet-ipc.js +14 -2
- package/src/local-dev/fleet-launcher.d.ts +6 -0
- package/src/local-dev/fleet-launcher.js +16 -4
- package/src/local-dev/fleet-logs.js +50 -22
- package/src/local-dev/fleet-process.d.ts +20 -1
- package/src/local-dev/fleet-process.js +197 -41
- package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
- package/src/local-dev/fleet-runner-evidence.js +56 -0
- package/src/local-dev/fleet-runtime.js +268 -229
- package/src/local-dev/fleet-session.d.ts +2 -0
- package/src/local-dev/fleet-session.js +28 -11
- package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
- package/src/local-dev/fleet-state.d.ts +5 -2
- package/src/local-dev/fleet-state.js +25 -4
- package/src/local-dev/fleet-supervisor.d.ts +3 -0
- package/src/local-dev/fleet-supervisor.js +66 -11
- package/src/local-dev/fleet-web-start.d.ts +12 -0
- package/src/local-dev/fleet-web-start.js +48 -0
- package/src/local-dev/identity.js +3 -14
- package/src/local-dev/index.d.ts +1 -0
- package/src/local-dev/index.js +1 -0
- package/src/local-dev/native-completion.d.ts +9 -0
- package/src/local-dev/native-completion.js +130 -0
- package/src/local-dev/nx-workspace.d.ts +4 -2
- package/src/local-dev/nx-workspace.js +11 -6
- package/src/local-dev/personal-stage.d.ts +4 -5
- package/src/local-dev/personal-stage.js +6 -54
- package/src/local-dev/port-claims.d.ts +13 -0
- package/src/local-dev/port-claims.js +46 -0
- package/src/local-dev/ports.d.ts +14 -2
- package/src/local-dev/ports.js +78 -3
- package/src/local-dev/private-state.d.ts +11 -0
- package/src/local-dev/private-state.js +146 -40
- package/src/local-dev/process-group.d.ts +4 -0
- package/src/local-dev/process-group.js +29 -0
- package/src/local-dev/process-identity.d.ts +8 -0
- package/src/local-dev/process-identity.js +31 -1
- package/src/local-dev/proxy.js +11 -12
- package/src/local-dev/runtime-paths.js +1 -1
- package/src/local-dev/slice-claim.js +1 -1
- package/src/local-dev/slice-runner.d.ts +15 -6
- package/src/local-dev/slice-runner.js +189 -54
- package/src/local-dev/task-attachment.d.ts +17 -0
- package/src/local-dev/task-attachment.js +73 -0
- package/src/local-dev/task-authority.d.ts +10 -0
- package/src/local-dev/task-authority.js +27 -0
- package/src/local-dev/task-identity.d.ts +33 -0
- package/src/local-dev/task-identity.js +418 -0
- package/src/local-dev/task-native-writer.d.ts +18 -0
- package/src/local-dev/task-native-writer.js +329 -0
- package/src/local-dev/tls.js +8 -2
- package/src/local-dev/web-launch.d.ts +9 -0
- package/src/local-dev/web-launch.js +130 -0
- package/src/ownership/composition.d.ts +2 -1
- package/src/ownership/composition.js +1 -0
- package/src/performance/cost-collection.d.ts +1 -1
- package/src/performance/cost-collection.js +4 -2
- package/src/performance/cost-controls.d.ts +8 -4
- package/src/performance/cost-controls.js +39 -28
- package/src/performance/evidence.d.ts +1 -1
- package/src/performance/evidence.js +5 -3
- package/src/performance/load-safety.js +5 -3
- package/src/performance/model.d.ts +4 -4
- package/src/performance/model.js +4 -5
- package/src/performance/scenario.d.ts +22 -0
- package/src/performance/scenario.js +100 -92
- package/src/release/index.d.ts +0 -2
- package/src/release/index.js +0 -2
- package/src/release/source-authority.d.ts +5 -5
- package/src/release/source-authority.js +141 -124
- package/src/repository-policy/aurora-preflight.d.ts +1 -1
- package/src/repository-policy/aurora-preflight.js +4 -1
- package/src/repository-policy/capacity-migration.d.ts +3 -0
- package/src/repository-policy/capacity-migration.js +21 -0
- package/src/repository-policy/deployment-plan.d.ts +4 -1
- package/src/repository-policy/deployment-plan.js +9 -0
- package/src/repository-policy/foundation-profile.js +10 -1
- package/src/repository-policy/policy.d.ts +57 -3
- package/src/repository-policy/policy.js +497 -11
- package/src/schemas/blueprint-v1.json +5 -4
- package/src/schemas/foundation-requirement-v1.json +5 -4
- package/src/schemas/performance-policy-v1.json +3 -3
- package/src/schemas/repository-policy-v1.json +130 -6
- package/src/schemas/testing-evidence-result-v1.json +1 -1
- package/src/secrets/adapters.d.ts +7 -2
- package/src/secrets/adapters.js +34 -3
- package/src/secrets/aws-control-plane.d.ts +10 -1
- package/src/secrets/aws-control-plane.js +67 -0
- package/src/secrets/generated-aws-control-plane.d.ts +23 -0
- package/src/secrets/generated-aws-control-plane.js +259 -0
- package/src/secrets/metadata.js +38 -10
- package/src/secrets/model.d.ts +8 -1
- package/src/secrets/model.js +24 -3
- package/src/secrets/operator.d.ts +91 -3
- package/src/secrets/operator.js +463 -13
- package/src/secrets/personal-command.d.ts +18 -2
- package/src/secrets/personal-command.js +66 -12
- package/src/secrets/registry.d.ts +2 -1
- package/src/secrets/registry.js +18 -1
- package/src/secrets/verification.js +15 -2
- package/src/secrets/workload-access.js +10 -2
- package/src/sst-environment-source-format.d.ts +6 -0
- package/src/sst-environment-source-format.js +199 -0
- package/src/supply-chain/action-pins.js +61 -7
- package/src/supply-chain/blueprint-trust-git.js +85 -24
- package/src/supply-chain/blueprint-verification-authority.js +55 -3
- package/src/supply-chain/build-output-bounds.d.ts +2 -0
- package/src/supply-chain/build-output-bounds.js +12 -0
- package/src/supply-chain/build-output.d.ts +7 -1
- package/src/supply-chain/build-output.js +177 -24
- package/src/supply-chain/ecr-scanning.d.ts +5 -3
- package/src/supply-chain/ecr-scanning.js +11 -7
- package/src/supply-chain/ecs-deployed-image.d.ts +5 -3
- package/src/supply-chain/ecs-deployed-image.js +6 -4
- package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
- package/src/supply-chain/generated-command.js +1 -0
- package/src/supply-chain/generated-container-release-command.js +1285 -124
- package/src/supply-chain/generated-ecr-collector-command.d.ts +0 -1
- package/src/supply-chain/generated-ecr-collector-command.js +200 -93
- package/src/supply-chain/generated-files.js +25 -14
- package/src/supply-chain/generated-scanner-command.js +2 -1
- package/src/supply-chain/index.d.ts +1 -1
- package/src/supply-chain/index.js +2 -1
- package/src/supply-chain/sbom.d.ts +1 -1
- package/src/supply-chain/sbom.js +30 -5
- package/src/supply-chain/scanner.js +3 -0
- package/src/testing-evidence/fixture-scope.d.ts +2 -1
- package/src/testing-evidence/fixture-scope.js +4 -2
- package/src/testing-evidence/result.d.ts +2 -1
- package/src/testing-evidence/result.js +18 -4
- package/src/workload-roles/account-baseline.d.ts +11 -0
- package/src/workload-roles/account-baseline.js +253 -16
- package/src/workload-roles/authority.d.ts +3 -1
- package/src/workload-roles/authority.js +48 -2
- package/src/workload-roles/aws-s3-state.js +27 -0
- package/src/workload-roles/boundary.d.ts +2 -1
- package/src/workload-roles/boundary.js +9 -2
- package/src/workload-roles/handler.js +52 -24
- package/src/workload-roles/index.d.ts +10 -17
- package/src/workload-roles/index.js +5 -18
- package/src/workload-roles/injection.js +1 -1
- package/src/workload-roles/provisioner.js +12 -4
- package/src/workload-roles/registration.d.ts +1 -0
- package/src/workload-roles/registration.js +5 -0
- package/src/workload-roles/stage-boundary.js +1 -1
- package/src/workload-roles/standard-slice.js +3 -3
- package/src/workspace-deployment/affected-lifecycle.d.ts +53 -0
- package/src/workspace-deployment/affected-lifecycle.js +84 -0
- package/src/workspace-deployment/identity.d.ts +3 -0
- package/src/workspace-deployment/identity.js +22 -0
- package/src/workspace-deployment/index.d.ts +4 -0
- package/src/workspace-deployment/index.js +8 -0
- package/src/workspace-deployment/migration-evidence.d.ts +29 -0
- package/src/workspace-deployment/migration-evidence.js +83 -0
- package/src/workspace-deployment/migration.d.ts +27 -0
- package/src/workspace-deployment/migration.js +109 -0
- package/src/workspace-deployment/ownership.d.ts +81 -0
- package/src/workspace-deployment/ownership.js +381 -0
- package/src/api-contract/baseline-update.js.map +0 -1
- package/src/api-contract/compatibility.js.map +0 -1
- package/src/api-contract/contract-graph.js.map +0 -1
- package/src/api-contract/evidence.js.map +0 -1
- package/src/api-contract/index.js.map +0 -1
- package/src/api-contract/model.fixtures.d.ts +0 -2
- package/src/api-contract/model.fixtures.js +0 -81
- package/src/api-contract/model.fixtures.js.map +0 -1
- package/src/api-contract/model.js.map +0 -1
- package/src/api-contract/rollout.js.map +0 -1
- package/src/authorization/compatibility.js.map +0 -1
- package/src/authorization/index.js.map +0 -1
- package/src/blueprints/execution.js.map +0 -1
- package/src/blueprints/external-sandbox.js.map +0 -1
- package/src/blueprints/index.js.map +0 -1
- package/src/blueprints/inputs.js.map +0 -1
- package/src/blueprints/manifest.js.map +0 -1
- package/src/blueprints/resolver.js.map +0 -1
- package/src/blueprints/transitions.js.map +0 -1
- package/src/cli/agent-command.js.map +0 -1
- package/src/cli/agent-runtime.js.map +0 -1
- package/src/cli/blueprint-authority.js.map +0 -1
- package/src/cli/blueprint-command.js.map +0 -1
- package/src/cli/bootstrap.js.map +0 -1
- package/src/cli/dev-command.js.map +0 -1
- package/src/cli/main.js.map +0 -1
- package/src/cli/output.js.map +0 -1
- package/src/cli/personal-secret-runtime.js.map +0 -1
- package/src/cli/secret-terminal.js.map +0 -1
- package/src/container-images.js.map +0 -1
- package/src/data-lifecycle/index.js.map +0 -1
- package/src/data-lifecycle/model.fixtures.d.ts +0 -2
- package/src/data-lifecycle/model.fixtures.js +0 -244
- package/src/data-lifecycle/model.fixtures.js.map +0 -1
- package/src/data-lifecycle/model.js.map +0 -1
- package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
- package/src/data-lifecycle/validation.js.map +0 -1
- package/src/database-retirement/contract.js.map +0 -1
- package/src/database-retirement/index.js.map +0 -1
- package/src/deterministic-order.js.map +0 -1
- package/src/developer-agent/context.js.map +0 -1
- package/src/developer-agent/generator-planning.js.map +0 -1
- package/src/developer-agent/generator-preview.js.map +0 -1
- package/src/developer-agent/git-inspection.js.map +0 -1
- package/src/developer-agent/handoff.js.map +0 -1
- package/src/developer-agent/index.js.map +0 -1
- package/src/developer-agent/model.js.map +0 -1
- package/src/developer-agent/operation-registry.js.map +0 -1
- package/src/developer-agent/ordering.js.map +0 -1
- package/src/developer-agent/planning.js.map +0 -1
- package/src/developer-agent/preview-changes.js.map +0 -1
- package/src/developer-agent/preview-source.js.map +0 -1
- package/src/developer-agent/validation.js.map +0 -1
- package/src/developer-agent/workspace-inspection.js.map +0 -1
- package/src/developer-agent/workspace-path.js.map +0 -1
- package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
- package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
- package/src/executors/deploy/deploy.js.map +0 -1
- package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
- package/src/executors/dev/dev.js.map +0 -1
- package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
- package/src/executors/dev-setup/dev-setup.js.map +0 -1
- package/src/executors/developer-context/developer-context.js.map +0 -1
- package/src/executors/fleet/fleet.js.map +0 -1
- package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
- package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
- package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
- package/src/executors/refresh/refresh.js.map +0 -1
- package/src/executors/remove/remove.js.map +0 -1
- package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
- package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
- package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
- package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
- package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
- package/src/executors/unlock/unlock.js.map +0 -1
- package/src/executors/work-markers/work-markers.js.map +0 -1
- package/src/foundation/discovery.js.map +0 -1
- package/src/foundation/index.js.map +0 -1
- package/src/foundation/local-database-contract.js.map +0 -1
- package/src/foundation/logging-preflight.js.map +0 -1
- package/src/foundation/logging.js.map +0 -1
- package/src/foundation/preflight.js.map +0 -1
- package/src/foundation/provision-database-bindings.js.map +0 -1
- package/src/foundation/provision-logical-database.js.map +0 -1
- package/src/foundation/requirements.js.map +0 -1
- package/src/foundation/router-origin-proof.js.map +0 -1
- package/src/foundation/stages.js.map +0 -1
- package/src/frontend-security/index.js.map +0 -1
- package/src/frontend-security/security-headers.js.map +0 -1
- package/src/generators/feature-registry.js.map +0 -1
- package/src/generators/function/function.js.map +0 -1
- package/src/generators/job/job.js.map +0 -1
- package/src/generators/logging-registry.js.map +0 -1
- package/src/generators/post-generation-install.js.map +0 -1
- package/src/generators/preset/generator.js.map +0 -1
- package/src/generators/preset/tool-versions.js.map +0 -1
- package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
- package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
- package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
- package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
- package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
- package/src/generators/preset/workspace-files.js.map +0 -1
- package/src/generators/repository-policy/repository-policy.js.map +0 -1
- package/src/generators/service/service.js.map +0 -1
- package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-shared.js.map +0 -1
- package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
- package/src/generators/slice/built-in-plan.js.map +0 -1
- package/src/generators/slice/slice.js.map +0 -1
- package/src/generators/upgrade/upgrade.js.map +0 -1
- package/src/generators/workload/frozen-container.js.map +0 -1
- package/src/generators/workload/performance-registration.js.map +0 -1
- package/src/generators/workload/reliability-registration.js.map +0 -1
- package/src/generators/workload/service-performance-files.js.map +0 -1
- package/src/generators/workload/workload.js.map +0 -1
- package/src/git-policy/action-pins.js.map +0 -1
- package/src/git-policy/github-bootstrap.js.map +0 -1
- package/src/git-policy/index.js.map +0 -1
- package/src/git-policy/routing.js.map +0 -1
- package/src/index.js.map +0 -1
- package/src/infrastructure-change/convergence.js.map +0 -1
- package/src/infrastructure-change/drift.js.map +0 -1
- package/src/infrastructure-change/index.js.map +0 -1
- package/src/infrastructure-change/model.js.map +0 -1
- package/src/infrastructure-change/normalize.js.map +0 -1
- package/src/infrastructure-change/plan.js.map +0 -1
- package/src/infrastructure-change/risk.js.map +0 -1
- package/src/infrastructure-change/summary.js.map +0 -1
- package/src/local-dev/context-discovery.js.map +0 -1
- package/src/local-dev/contract-validation.js.map +0 -1
- package/src/local-dev/contracts.js.map +0 -1
- package/src/local-dev/control-contract.js.map +0 -1
- package/src/local-dev/dev-command-core.js.map +0 -1
- package/src/local-dev/effects.js.map +0 -1
- package/src/local-dev/environment-inspector.js.map +0 -1
- package/src/local-dev/environment-state.js.map +0 -1
- package/src/local-dev/errors.js.map +0 -1
- package/src/local-dev/fleet-client.js.map +0 -1
- package/src/local-dev/fleet-configuration.js.map +0 -1
- package/src/local-dev/fleet-inventory.js.map +0 -1
- package/src/local-dev/fleet-ipc.js.map +0 -1
- package/src/local-dev/fleet-launcher.js.map +0 -1
- package/src/local-dev/fleet-lock.js.map +0 -1
- package/src/local-dev/fleet-logs.js.map +0 -1
- package/src/local-dev/fleet-process.js.map +0 -1
- package/src/local-dev/fleet-runtime.js.map +0 -1
- package/src/local-dev/fleet-session.js.map +0 -1
- package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
- package/src/local-dev/fleet-startup.js.map +0 -1
- package/src/local-dev/fleet-state.js.map +0 -1
- package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
- package/src/local-dev/fleet-supervisor.js.map +0 -1
- package/src/local-dev/gateway-daemon.js.map +0 -1
- package/src/local-dev/gateway.js.map +0 -1
- package/src/local-dev/identity.js.map +0 -1
- package/src/local-dev/index.js.map +0 -1
- package/src/local-dev/local-context.js.map +0 -1
- package/src/local-dev/nx-workspace.js.map +0 -1
- package/src/local-dev/personal-secret-ledger.js.map +0 -1
- package/src/local-dev/personal-stage.js.map +0 -1
- package/src/local-dev/portless.js.map +0 -1
- package/src/local-dev/ports.js.map +0 -1
- package/src/local-dev/private-state.js.map +0 -1
- package/src/local-dev/process-identity.js.map +0 -1
- package/src/local-dev/proxy.js.map +0 -1
- package/src/local-dev/runtime-paths.js.map +0 -1
- package/src/local-dev/secret-slice-claim.js.map +0 -1
- package/src/local-dev/slice-claim.js.map +0 -1
- package/src/local-dev/slice-runner.js.map +0 -1
- package/src/local-dev/tls.js.map +0 -1
- package/src/ownership/composition.js.map +0 -1
- package/src/ownership/foundation-record.js.map +0 -1
- package/src/ownership/hash.js.map +0 -1
- package/src/ownership/index.js.map +0 -1
- package/src/ownership/json-ownership.js.map +0 -1
- package/src/ownership/record.js.map +0 -1
- package/src/ownership/workspace-record.js.map +0 -1
- package/src/performance/cost-collection.js.map +0 -1
- package/src/performance/cost-controls.js.map +0 -1
- package/src/performance/evidence.js.map +0 -1
- package/src/performance/index.js.map +0 -1
- package/src/performance/load-safety.js.map +0 -1
- package/src/performance/model.js.map +0 -1
- package/src/performance/pr-artifact-budget.js.map +0 -1
- package/src/performance/runner.js.map +0 -1
- package/src/performance/scenario-endpoint.js.map +0 -1
- package/src/performance/scenario.js.map +0 -1
- package/src/performance/test-fixtures.d.ts +0 -7
- package/src/performance/test-fixtures.js +0 -169
- package/src/performance/test-fixtures.js.map +0 -1
- package/src/performance/unit-cost.js.map +0 -1
- package/src/release/index.js.map +0 -1
- package/src/release/lifecycle.js.map +0 -1
- package/src/release/manifest.js.map +0 -1
- package/src/release/rollout.js.map +0 -1
- package/src/release/source-authority.js.map +0 -1
- package/src/repository-policy/aurora-preflight.js.map +0 -1
- package/src/repository-policy/deployment-plan.js.map +0 -1
- package/src/repository-policy/foundation-profile.js.map +0 -1
- package/src/repository-policy/index.js.map +0 -1
- package/src/repository-policy/policy.js.map +0 -1
- package/src/secrets/adapters.js.map +0 -1
- package/src/secrets/aws-control-plane.js.map +0 -1
- package/src/secrets/declaration-verification.js.map +0 -1
- package/src/secrets/guardrails.js.map +0 -1
- package/src/secrets/index.js.map +0 -1
- package/src/secrets/metadata.js.map +0 -1
- package/src/secrets/model.js.map +0 -1
- package/src/secrets/operator.js.map +0 -1
- package/src/secrets/permissions.js.map +0 -1
- package/src/secrets/personal-command.js.map +0 -1
- package/src/secrets/personal-ledger.js.map +0 -1
- package/src/secrets/registry.js.map +0 -1
- package/src/secrets/verification.js.map +0 -1
- package/src/secrets/workload-access.js.map +0 -1
- package/src/supply-chain/action-pins.js.map +0 -1
- package/src/supply-chain/blueprint-trust-git.js.map +0 -1
- package/src/supply-chain/blueprint-trust-process.js.map +0 -1
- package/src/supply-chain/blueprint-trust.js.map +0 -1
- package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
- package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
- package/src/supply-chain/build-output.js.map +0 -1
- package/src/supply-chain/common.js.map +0 -1
- package/src/supply-chain/container-artifact-contract.js.map +0 -1
- package/src/supply-chain/container-release.js.map +0 -1
- package/src/supply-chain/ecr-applicability.js.map +0 -1
- package/src/supply-chain/ecr-scanning.js.map +0 -1
- package/src/supply-chain/ecs-deployed-image.js.map +0 -1
- package/src/supply-chain/errors.js.map +0 -1
- package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
- package/src/supply-chain/generated-command.js.map +0 -1
- package/src/supply-chain/generated-container-release-command.js.map +0 -1
- package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
- package/src/supply-chain/generated-files.js.map +0 -1
- package/src/supply-chain/generated-scanner-command.js.map +0 -1
- package/src/supply-chain/index.js.map +0 -1
- package/src/supply-chain/inventory.js.map +0 -1
- package/src/supply-chain/license-expression.js.map +0 -1
- package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
- package/src/supply-chain/policy.js.map +0 -1
- package/src/supply-chain/publication.js.map +0 -1
- package/src/supply-chain/sbom.js.map +0 -1
- package/src/supply-chain/scanner.js.map +0 -1
- package/src/supply-chain/vendored-source.js.map +0 -1
- package/src/testing-evidence/fixture-scope.js.map +0 -1
- package/src/testing-evidence/index.js.map +0 -1
- package/src/testing-evidence/quarantine.js.map +0 -1
- package/src/testing-evidence/result.js.map +0 -1
- package/src/testing-evidence/runner-adapter.js.map +0 -1
- package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
- package/src/validation.js.map +0 -1
- package/src/work-markers/index.js.map +0 -1
- package/src/work-markers/work-markers.js.map +0 -1
- package/src/workload-roles/account-baseline.js.map +0 -1
- package/src/workload-roles/authority.js.map +0 -1
- package/src/workload-roles/aws-adapter.js.map +0 -1
- package/src/workload-roles/aws-internal-handler.js.map +0 -1
- package/src/workload-roles/aws-s3-state.js.map +0 -1
- package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
- package/src/workload-roles/boundary.js.map +0 -1
- package/src/workload-roles/convergence.js.map +0 -1
- package/src/workload-roles/effective-policy.js.map +0 -1
- package/src/workload-roles/handler.js.map +0 -1
- package/src/workload-roles/history.js.map +0 -1
- package/src/workload-roles/index.js.map +0 -1
- package/src/workload-roles/injection.js.map +0 -1
- package/src/workload-roles/manifest.js.map +0 -1
- package/src/workload-roles/provisioner.js.map +0 -1
- package/src/workload-roles/registration.js.map +0 -1
- package/src/workload-roles/stage-boundary.js.map +0 -1
- package/src/workload-roles/standard-slice.js.map +0 -1
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EBK_CODE_OWNER_PLACEHOLDER = exports.
|
|
3
|
+
exports.EBK_CODE_OWNER_PLACEHOLDER = exports.EBK_OPTIONAL_STAGE_ENVIRONMENT_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_SECRETS = exports.EBK_STAGING_PROMOTION_PULL_ROLE_SECRET = exports.EBK_PROTECTED_MAIN_RULESET_NAME = exports.EBK_RECORD_MAIN_TOKEN_SECRET = exports.EBK_PERFORMANCE_ORIGINS_VARIABLE = exports.EBK_PERFORMANCE_LOAD_ROLE_SECRET = exports.EBK_PERFORMANCE_COST_ROLE_SECRET = exports.EBK_PERFORMANCE_AGGREGATE_ROLE_SECRET = exports.EBK_ASYNC_RECOVERY_ROLE_SECRET = exports.EBK_ECR_INSPECTOR_EVIDENCE_ROLE_SECRET = exports.EBK_RETIRED_DEPLOYMENT_ROLE_SECRET = exports.EBK_REQUIRED_CHECKS = exports.EBK_PROTECTED_BRANCH_RULESET_NAME = void 0;
|
|
4
|
+
exports.githubEnvironmentTopology = githubEnvironmentTopology;
|
|
4
5
|
exports.runGitHubBootstrap = runGitHubBootstrap;
|
|
5
6
|
const index_js_1 = require("../repository-policy/index.js");
|
|
6
7
|
const deterministic_order_js_1 = require("../deterministic-order.js");
|
|
7
8
|
exports.EBK_PROTECTED_BRANCH_RULESET_NAME = 'Empire Builder Kit protected branches';
|
|
8
9
|
exports.EBK_REQUIRED_CHECKS = ['policy', 'verify'];
|
|
9
|
-
exports.
|
|
10
|
+
exports.EBK_RETIRED_DEPLOYMENT_ROLE_SECRET = 'AWS_DEPLOY_ROLE_ARN';
|
|
10
11
|
exports.EBK_ECR_INSPECTOR_EVIDENCE_ROLE_SECRET = 'AWS_ECR_INSPECTOR_EVIDENCE_ROLE_ARN';
|
|
11
12
|
exports.EBK_ASYNC_RECOVERY_ROLE_SECRET = 'AWS_ASYNC_RECOVERY_ROLE_ARN';
|
|
12
13
|
exports.EBK_PERFORMANCE_AGGREGATE_ROLE_SECRET = 'AWS_PERFORMANCE_AGGREGATE_ROLE_ARN';
|
|
13
14
|
exports.EBK_PERFORMANCE_COST_ROLE_SECRET = 'AWS_PERFORMANCE_COST_ROLE_ARN';
|
|
14
15
|
exports.EBK_PERFORMANCE_LOAD_ROLE_SECRET = 'AWS_PERFORMANCE_LOAD_ROLE_ARN';
|
|
15
16
|
exports.EBK_PERFORMANCE_ORIGINS_VARIABLE = 'EBK_PERFORMANCE_ORIGINS_JSON';
|
|
16
|
-
|
|
17
|
-
exports.
|
|
17
|
+
/** Production environment secret that lets trunk promotion fast-forward main. */
|
|
18
|
+
exports.EBK_RECORD_MAIN_TOKEN_SECRET = 'EBK_RECORD_MAIN_TOKEN';
|
|
19
|
+
/** Trunk promotion keeps main behind status checks and fast-forward pushes only. */
|
|
20
|
+
exports.EBK_PROTECTED_MAIN_RULESET_NAME = 'EBK protected main (trunk promotion)';
|
|
18
21
|
exports.EBK_STAGING_PROMOTION_PULL_ROLE_SECRET = 'AWS_STAGING_PROMOTION_PULL_ROLE_ARN';
|
|
19
22
|
exports.EBK_PROTECTED_ENVIRONMENT_SECRETS = [
|
|
20
23
|
exports.EBK_ASYNC_RECOVERY_ROLE_SECRET,
|
|
21
|
-
exports.EBK_DEPLOYMENT_ROLE_SECRET,
|
|
22
24
|
exports.EBK_ECR_INSPECTOR_EVIDENCE_ROLE_SECRET,
|
|
23
|
-
exports.
|
|
24
|
-
exports.EBK_PERFORMANCE_COST_ROLE_SECRET,
|
|
25
|
-
exports.EBK_PERFORMANCE_LOAD_ROLE_SECRET,
|
|
26
|
-
exports.EBK_RELIABILITY_READ_ROLE_SECRET,
|
|
27
|
-
exports.EBK_SMOKE_ROLE_SECRET,
|
|
25
|
+
exports.EBK_RETIRED_DEPLOYMENT_ROLE_SECRET,
|
|
28
26
|
exports.EBK_STAGING_PROMOTION_PULL_ROLE_SECRET,
|
|
29
27
|
];
|
|
30
28
|
exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES = [
|
|
@@ -34,128 +32,133 @@ exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES = [
|
|
|
34
32
|
'AWS_STAGING_PROMOTION_REGION',
|
|
35
33
|
'EBK_ALLOW_PRODUCTION_REMOVE',
|
|
36
34
|
'EBK_FLEET_ORIGIN',
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Non-secret stage environment variables an operator may set to request a
|
|
38
|
+
* machine credential generation or its retirement on a workflow deploy. They
|
|
39
|
+
* are never required, and a repository- or organization-scoped copy would
|
|
40
|
+
* silently apply to every stage, so only the stage environment may hold them.
|
|
41
|
+
*/
|
|
42
|
+
exports.EBK_OPTIONAL_STAGE_ENVIRONMENT_VARIABLES = [
|
|
43
|
+
'EBK_MACHINE_CREDENTIAL_GENERATION',
|
|
44
|
+
'EBK_MACHINE_RETIRE_PREVIOUS_GENERATION',
|
|
40
45
|
];
|
|
41
46
|
const FORBIDDEN_NPM_TOKEN_NAMES = [
|
|
42
47
|
'NODE_AUTH_TOKEN',
|
|
43
48
|
'NPM_CONFIG_TOKEN',
|
|
44
49
|
'NPM_TOKEN',
|
|
45
50
|
];
|
|
46
|
-
exports.EBK_PRODUCTION_PLAN_REPOSITORY_VARIABLES = [
|
|
47
|
-
'AWS_PRODUCTION_PLAN_EXPECTED_ACCOUNT_ID',
|
|
48
|
-
'AWS_PRODUCTION_PLAN_GENERATED_OBJECT_ARNS_JSON',
|
|
49
|
-
'AWS_PRODUCTION_PLAN_GENERATED_PARAMETER_ARNS_JSON',
|
|
50
|
-
'AWS_PRODUCTION_PLAN_GENERATED_SECRET_ARNS_JSON',
|
|
51
|
-
'AWS_PRODUCTION_PLAN_PROVIDER_REFRESH_POLICY_JSON',
|
|
52
|
-
'AWS_PRODUCTION_PLAN_REGION',
|
|
53
|
-
'AWS_PRODUCTION_PLAN_ROLE_ARN',
|
|
54
|
-
'AWS_PRODUCTION_PLAN_SST_APPS_JSON',
|
|
55
|
-
'AWS_PRODUCTION_PLAN_STATE_BUCKET_ARN',
|
|
56
|
-
'AWS_PRODUCTION_PLAN_STATE_KMS_KEY_ARN',
|
|
57
|
-
'EBK_PRODUCTION_FLEET_ORIGIN',
|
|
58
|
-
];
|
|
59
|
-
exports.EBK_STAGING_PLAN_REPOSITORY_VARIABLES = [
|
|
60
|
-
'AWS_STAGING_PLAN_EXPECTED_ACCOUNT_ID',
|
|
61
|
-
'AWS_STAGING_PLAN_GENERATED_OBJECT_ARNS_JSON',
|
|
62
|
-
'AWS_STAGING_PLAN_GENERATED_PARAMETER_ARNS_JSON',
|
|
63
|
-
'AWS_STAGING_PLAN_GENERATED_SECRET_ARNS_JSON',
|
|
64
|
-
'AWS_STAGING_PLAN_PROVIDER_REFRESH_POLICY_JSON',
|
|
65
|
-
'AWS_STAGING_PLAN_REGION',
|
|
66
|
-
'AWS_STAGING_PLAN_ROLE_ARN',
|
|
67
|
-
'AWS_STAGING_PLAN_SST_APPS_JSON',
|
|
68
|
-
'AWS_STAGING_PLAN_STATE_BUCKET_ARN',
|
|
69
|
-
'AWS_STAGING_PLAN_STATE_KMS_KEY_ARN',
|
|
70
|
-
'EBK_STAGING_FLEET_ORIGIN',
|
|
71
|
-
];
|
|
72
51
|
exports.EBK_CODE_OWNER_PLACEHOLDER = '@REPLACE_WITH_GITHUB_CODE_OWNER';
|
|
73
|
-
const GITHUB_API_VERSION = '
|
|
52
|
+
const GITHUB_API_VERSION = '2026-03-10';
|
|
53
|
+
const GITHUB_IMMUTABLE_OIDC_CHANGE = 'Use the default immutable GitHub OIDC repository subject.';
|
|
54
|
+
const GITHUB_IMMUTABLE_OIDC_TRUST_ACKNOWLEDGEMENT_PREFIX = 'aws-trust-ready:';
|
|
74
55
|
const PROTECTED_BRANCHES = ['develop', 'main'];
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
'
|
|
78
|
-
|
|
79
|
-
'infrastructure-plan-staging': 'develop',
|
|
80
|
-
'performance-cost-production': 'main',
|
|
81
|
-
'performance-cost-staging': 'develop',
|
|
82
|
-
'performance-aggregate-production': 'main',
|
|
83
|
-
'performance-aggregate-staging': 'develop',
|
|
84
|
-
'performance-load-production': 'main',
|
|
85
|
-
'performance-load-staging': 'develop',
|
|
86
|
-
'npm-prerelease': 'main',
|
|
87
|
-
production: 'main',
|
|
88
|
-
'reliability-read-production': 'main',
|
|
89
|
-
'reliability-read-staging': 'develop',
|
|
90
|
-
staging: 'develop',
|
|
91
|
-
};
|
|
92
|
-
const ENVIRONMENT_SECRET_REQUIREMENTS = {
|
|
93
|
-
'async-recovery-production': [exports.EBK_ASYNC_RECOVERY_ROLE_SECRET],
|
|
94
|
-
'async-recovery-staging': [exports.EBK_ASYNC_RECOVERY_ROLE_SECRET],
|
|
95
|
-
'infrastructure-plan-production': [],
|
|
96
|
-
'infrastructure-plan-staging': [],
|
|
97
|
-
'performance-cost-production': [exports.EBK_PERFORMANCE_COST_ROLE_SECRET],
|
|
98
|
-
'performance-cost-staging': [exports.EBK_PERFORMANCE_COST_ROLE_SECRET],
|
|
99
|
-
'performance-aggregate-production': [exports.EBK_PERFORMANCE_AGGREGATE_ROLE_SECRET],
|
|
100
|
-
'performance-aggregate-staging': [exports.EBK_PERFORMANCE_AGGREGATE_ROLE_SECRET],
|
|
101
|
-
'performance-load-production': [exports.EBK_PERFORMANCE_LOAD_ROLE_SECRET],
|
|
102
|
-
'performance-load-staging': [exports.EBK_PERFORMANCE_LOAD_ROLE_SECRET],
|
|
103
|
-
'npm-prerelease': [],
|
|
104
|
-
production: [
|
|
105
|
-
exports.EBK_DEPLOYMENT_ROLE_SECRET,
|
|
106
|
-
exports.EBK_ECR_INSPECTOR_EVIDENCE_ROLE_SECRET,
|
|
107
|
-
exports.EBK_SMOKE_ROLE_SECRET,
|
|
108
|
-
exports.EBK_STAGING_PROMOTION_PULL_ROLE_SECRET,
|
|
109
|
-
],
|
|
110
|
-
'reliability-read-production': [exports.EBK_RELIABILITY_READ_ROLE_SECRET],
|
|
111
|
-
'reliability-read-staging': [exports.EBK_RELIABILITY_READ_ROLE_SECRET],
|
|
112
|
-
staging: [
|
|
113
|
-
exports.EBK_DEPLOYMENT_ROLE_SECRET,
|
|
114
|
-
exports.EBK_ECR_INSPECTOR_EVIDENCE_ROLE_SECRET,
|
|
115
|
-
exports.EBK_SMOKE_ROLE_SECRET,
|
|
116
|
-
],
|
|
117
|
-
};
|
|
56
|
+
/** The trunk lane protects main alone; the protected pair protects both. */
|
|
57
|
+
function protectedBranchesFor(deliveryLane = 'protected-pair') {
|
|
58
|
+
return deliveryLane === 'trunk' ? ['main'] : PROTECTED_BRANCHES;
|
|
59
|
+
}
|
|
118
60
|
const BASE_STAGE_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES.filter((variable) => variable !== 'EBK_ALLOW_PRODUCTION_REMOVE' &&
|
|
119
|
-
variable !== exports.EBK_PERFORMANCE_ORIGINS_VARIABLE &&
|
|
120
61
|
!variable.startsWith('AWS_STAGING_PROMOTION_'));
|
|
121
|
-
const PRODUCTION_STAGE_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
'
|
|
133
|
-
|
|
134
|
-
exports.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
62
|
+
const PRODUCTION_STAGE_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES;
|
|
63
|
+
const AUXILIARY_ENVIRONMENTS = Object.freeze([
|
|
64
|
+
{
|
|
65
|
+
name: 'async-recovery',
|
|
66
|
+
requiredSecrets: [exports.EBK_ASYNC_RECOVERY_ROLE_SECRET],
|
|
67
|
+
requiredVariables: ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
70
|
+
function stageEnvironmentTopology(stage, deploymentProfile) {
|
|
71
|
+
const production = stage === 'production';
|
|
72
|
+
return Object.freeze({
|
|
73
|
+
branch: production ? 'main' : 'develop',
|
|
74
|
+
name: stage,
|
|
75
|
+
optionalVariables: exports.EBK_OPTIONAL_STAGE_ENVIRONMENT_VARIABLES,
|
|
76
|
+
requiredSecrets: Object.freeze(production
|
|
77
|
+
? deploymentProfile === 'starter'
|
|
78
|
+
? []
|
|
79
|
+
: [exports.EBK_STAGING_PROMOTION_PULL_ROLE_SECRET]
|
|
80
|
+
: []),
|
|
81
|
+
requiredVariables: Object.freeze(production
|
|
82
|
+
? deploymentProfile === 'starter'
|
|
83
|
+
? PRODUCTION_STAGE_VARIABLES.filter((variable) => !variable.startsWith('AWS_STAGING_PROMOTION_'))
|
|
84
|
+
: PRODUCTION_STAGE_VARIABLES
|
|
85
|
+
: BASE_STAGE_VARIABLES),
|
|
86
|
+
stage,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Exact generated GitHub environment contract for one deployment profile.
|
|
91
|
+
* Starter uses development as its rehearsal stage; isolated profiles use
|
|
92
|
+
* staging. Production and npm publication remain present for every profile.
|
|
93
|
+
*/
|
|
94
|
+
function githubEnvironmentTopology(deploymentProfile, deliveryLane = 'protected-pair', productionApprovalMode = 'promotion-pr') {
|
|
95
|
+
if (deliveryLane === 'trunk') {
|
|
96
|
+
// Trunk lane: development stays local; only production-stage
|
|
97
|
+
// environments exist and every one of them binds to main.
|
|
98
|
+
return githubEnvironmentTopology(deploymentProfile).filter(({ stage }) => stage === 'production');
|
|
99
|
+
}
|
|
100
|
+
if (productionApprovalMode === 'trunk-promotion') {
|
|
101
|
+
// Trunk promotion: the develop run itself promotes and deploys
|
|
102
|
+
// production, so every production-stage environment also admits
|
|
103
|
+
// develop, and the production stage holds the record-main token.
|
|
104
|
+
return githubEnvironmentTopology(deploymentProfile).map((entry) => entry.stage === 'production'
|
|
105
|
+
? Object.freeze({
|
|
106
|
+
...entry,
|
|
107
|
+
additionalBranches: Object.freeze(['develop']),
|
|
108
|
+
requiredSecrets: Object.freeze(entry.name === 'production'
|
|
109
|
+
? [...entry.requiredSecrets, exports.EBK_RECORD_MAIN_TOKEN_SECRET]
|
|
110
|
+
: [...entry.requiredSecrets]),
|
|
111
|
+
})
|
|
112
|
+
: entry);
|
|
113
|
+
}
|
|
114
|
+
const rehearsalStage = deploymentProfile === 'starter' ? 'development' : 'staging';
|
|
115
|
+
const stages = [
|
|
116
|
+
'production',
|
|
117
|
+
rehearsalStage,
|
|
118
|
+
];
|
|
119
|
+
const topology = [];
|
|
120
|
+
for (const auxiliary of AUXILIARY_ENVIRONMENTS) {
|
|
121
|
+
for (const stage of stages) {
|
|
122
|
+
topology.push(Object.freeze({
|
|
123
|
+
branch: stage === 'production' ? 'main' : 'develop',
|
|
124
|
+
name: `${auxiliary.name}-${stage}`,
|
|
125
|
+
requiredSecrets: Object.freeze([...auxiliary.requiredSecrets]),
|
|
126
|
+
requiredVariables: Object.freeze([...auxiliary.requiredVariables]),
|
|
127
|
+
stage,
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const ecrStages = deploymentProfile === 'starter'
|
|
132
|
+
? ['production']
|
|
133
|
+
: ['staging', 'production'];
|
|
134
|
+
for (const stage of ecrStages) {
|
|
135
|
+
topology.push(Object.freeze({
|
|
136
|
+
branch: stage === 'production' ? 'main' : 'develop',
|
|
137
|
+
name: `ecr-inspector-${stage}`,
|
|
138
|
+
requiredSecrets: Object.freeze([
|
|
139
|
+
exports.EBK_ECR_INSPECTOR_EVIDENCE_ROLE_SECRET,
|
|
140
|
+
]),
|
|
141
|
+
requiredVariables: Object.freeze([
|
|
142
|
+
'AWS_EXPECTED_ACCOUNT_ID',
|
|
143
|
+
'AWS_REGION',
|
|
144
|
+
]),
|
|
145
|
+
stage,
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
topology.push(Object.freeze({
|
|
149
|
+
branch: 'main',
|
|
150
|
+
name: 'npm-prerelease',
|
|
151
|
+
requiredSecrets: Object.freeze([]),
|
|
152
|
+
requiredVariables: Object.freeze([]),
|
|
153
|
+
stage: 'production',
|
|
154
|
+
}), stageEnvironmentTopology('production', deploymentProfile), stageEnvironmentTopology(rehearsalStage, deploymentProfile));
|
|
155
|
+
return Object.freeze(topology);
|
|
153
156
|
}
|
|
154
157
|
function desiredEnvironmentProtection(environment, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds) {
|
|
155
|
-
const current = state.environments[environment];
|
|
156
|
-
const stage =
|
|
158
|
+
const current = state.environments[environment.name];
|
|
159
|
+
const stage = environment.stage;
|
|
157
160
|
const stageEnvironment = state.environments[stage];
|
|
158
|
-
if (environment === 'npm-prerelease') {
|
|
161
|
+
if (environment.name === 'npm-prerelease') {
|
|
159
162
|
if (productionApprovalMode === 'promotion-pr') {
|
|
160
163
|
return {
|
|
161
164
|
preventSelfReview: false,
|
|
@@ -177,19 +180,29 @@ function desiredEnvironmentProtection(environment, state, productionApprovalMode
|
|
|
177
180
|
preventSelfReview: stage === 'production' &&
|
|
178
181
|
productionApprovalMode === 'environment-reviewer'
|
|
179
182
|
? true
|
|
180
|
-
: environment === stage
|
|
183
|
+
: environment.name === stage
|
|
181
184
|
? current.preventSelfReview
|
|
182
185
|
: stageEnvironment.preventSelfReview,
|
|
183
186
|
reviewers: stage === 'production' &&
|
|
184
187
|
productionApprovalMode === 'environment-reviewer' &&
|
|
185
188
|
productionReviewerIds.length > 0
|
|
186
189
|
? existingReviewerPayload(productionReviewerIds)
|
|
187
|
-
: environment === stage
|
|
190
|
+
: environment.name === stage
|
|
188
191
|
? current.reviewers
|
|
189
192
|
: stageEnvironment.reviewers,
|
|
190
|
-
waitTimer: environment === stage
|
|
193
|
+
waitTimer: environment.name === stage
|
|
194
|
+
? current.waitTimer
|
|
195
|
+
: stageEnvironment.waitTimer,
|
|
191
196
|
};
|
|
192
197
|
}
|
|
198
|
+
function requiresImmutableOidcSubjectCutover(state) {
|
|
199
|
+
return Boolean(state.oidcSubjectCustomization &&
|
|
200
|
+
(!state.oidcSubjectCustomization.useDefault ||
|
|
201
|
+
!state.oidcSubjectCustomization.useImmutableSubject));
|
|
202
|
+
}
|
|
203
|
+
function immutableOidcTrustAcknowledgement(identity) {
|
|
204
|
+
return `${GITHUB_IMMUTABLE_OIDC_TRUST_ACKNOWLEDGEMENT_PREFIX}${identity.subjectPrefix}`;
|
|
205
|
+
}
|
|
193
206
|
const PRIVATE_ENVIRONMENT_REVIEWER_PLANS = new Set([
|
|
194
207
|
'business_plus',
|
|
195
208
|
'enterprise',
|
|
@@ -231,9 +244,10 @@ class GitHubApi {
|
|
|
231
244
|
}
|
|
232
245
|
throw new GitHubApiError(response.status, `GitHub ${method} ${path} failed (${response.status}): ${detail}`);
|
|
233
246
|
}
|
|
234
|
-
|
|
247
|
+
const responseBody = await response.text();
|
|
248
|
+
if (!responseBody)
|
|
235
249
|
return undefined;
|
|
236
|
-
return
|
|
250
|
+
return JSON.parse(responseBody);
|
|
237
251
|
}
|
|
238
252
|
}
|
|
239
253
|
function parseRepository(repository) {
|
|
@@ -243,6 +257,58 @@ function parseRepository(repository) {
|
|
|
243
257
|
}
|
|
244
258
|
return { owner: match[1], repo: match[2] };
|
|
245
259
|
}
|
|
260
|
+
function inspectRepositoryIdentity(repo) {
|
|
261
|
+
const owner = typeof repo.owner === 'object' && repo.owner !== null
|
|
262
|
+
? repo.owner
|
|
263
|
+
: undefined;
|
|
264
|
+
const ownerLogin = owner?.login;
|
|
265
|
+
const ownerId = owner?.id;
|
|
266
|
+
const repositoryName = repo.name;
|
|
267
|
+
const repositoryId = repo.id;
|
|
268
|
+
const fullName = repo.full_name;
|
|
269
|
+
if (typeof ownerLogin !== 'string' ||
|
|
270
|
+
!/^[A-Za-z0-9_.-]+$/u.test(ownerLogin) ||
|
|
271
|
+
typeof ownerId !== 'number' ||
|
|
272
|
+
!Number.isSafeInteger(ownerId) ||
|
|
273
|
+
ownerId <= 0 ||
|
|
274
|
+
typeof repositoryName !== 'string' ||
|
|
275
|
+
!/^[A-Za-z0-9_.-]+$/u.test(repositoryName) ||
|
|
276
|
+
typeof repositoryId !== 'number' ||
|
|
277
|
+
!Number.isSafeInteger(repositoryId) ||
|
|
278
|
+
repositoryId <= 0 ||
|
|
279
|
+
typeof fullName !== 'string' ||
|
|
280
|
+
fullName !== `${ownerLogin}/${repositoryName}`) {
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
const ownerIdString = String(ownerId);
|
|
284
|
+
const repositoryIdString = String(repositoryId);
|
|
285
|
+
return {
|
|
286
|
+
fullName,
|
|
287
|
+
ownerId: ownerIdString,
|
|
288
|
+
repositoryId: repositoryIdString,
|
|
289
|
+
subjectPrefix: `repo:${ownerLogin}@${ownerIdString}/${repositoryName}@${repositoryIdString}`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
function inspectOidcSubjectCustomization(value) {
|
|
293
|
+
const includeClaimKeys = value.include_claim_keys;
|
|
294
|
+
const useDefault = value.use_default;
|
|
295
|
+
const useImmutableSubject = value.use_immutable_subject;
|
|
296
|
+
if (typeof useDefault !== 'boolean' ||
|
|
297
|
+
(useImmutableSubject !== undefined &&
|
|
298
|
+
typeof useImmutableSubject !== 'boolean') ||
|
|
299
|
+
(includeClaimKeys !== undefined &&
|
|
300
|
+
(!Array.isArray(includeClaimKeys) ||
|
|
301
|
+
includeClaimKeys.some((key) => typeof key !== 'string')))) {
|
|
302
|
+
return undefined;
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
includeClaimKeys: Array.isArray(includeClaimKeys)
|
|
306
|
+
? [...new Set(includeClaimKeys)].sort(deterministic_order_js_1.compareUtf16)
|
|
307
|
+
: [],
|
|
308
|
+
useDefault,
|
|
309
|
+
useImmutableSubject: useImmutableSubject === true,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
246
312
|
function asObjects(value) {
|
|
247
313
|
return Array.isArray(value)
|
|
248
314
|
? value.filter((item) => typeof item === 'object' && item !== null && !Array.isArray(item))
|
|
@@ -306,7 +372,7 @@ function refPatternMatches(pattern, ref) {
|
|
|
306
372
|
.replace(/\?/g, '.');
|
|
307
373
|
return new RegExp(`^${expression}$`).test(ref);
|
|
308
374
|
}
|
|
309
|
-
function rulesetTouchesProtectedBranches(ruleset) {
|
|
375
|
+
function rulesetTouchesProtectedBranches(ruleset, deliveryLane = 'protected-pair') {
|
|
310
376
|
const conditions = typeof ruleset.conditions === 'object' && ruleset.conditions !== null
|
|
311
377
|
? ruleset.conditions
|
|
312
378
|
: {};
|
|
@@ -317,7 +383,7 @@ function rulesetTouchesProtectedBranches(ruleset) {
|
|
|
317
383
|
return true;
|
|
318
384
|
const include = asStrings(refName.include);
|
|
319
385
|
const exclude = asStrings(refName.exclude);
|
|
320
|
-
return
|
|
386
|
+
return protectedBranchesFor(deliveryLane).some((branch) => {
|
|
321
387
|
const ref = `refs/heads/${branch}`;
|
|
322
388
|
const included = include.length === 0 ||
|
|
323
389
|
include.some((pattern) => refPatternMatches(pattern, ref));
|
|
@@ -325,9 +391,9 @@ function rulesetTouchesProtectedBranches(ruleset) {
|
|
|
325
391
|
return included && !excluded;
|
|
326
392
|
});
|
|
327
393
|
}
|
|
328
|
-
function conflictsWithMergeCommitContract(ruleset) {
|
|
394
|
+
function conflictsWithMergeCommitContract(ruleset, deliveryLane = 'protected-pair') {
|
|
329
395
|
if (!activeBranchRuleset(ruleset) ||
|
|
330
|
-
!rulesetTouchesProtectedBranches(ruleset)) {
|
|
396
|
+
!rulesetTouchesProtectedBranches(ruleset, deliveryLane)) {
|
|
331
397
|
return [];
|
|
332
398
|
}
|
|
333
399
|
const conflicts = [];
|
|
@@ -389,13 +455,19 @@ function hasValidCatchAllCodeOwner(contents) {
|
|
|
389
455
|
effectiveOwners.length > 0 &&
|
|
390
456
|
effectiveOwners.every((owner) => owner.startsWith('@') && owner !== exports.EBK_CODE_OWNER_PLACEHOLDER));
|
|
391
457
|
}
|
|
392
|
-
function desiredRuleset() {
|
|
458
|
+
function desiredRuleset(deliveryLane = 'protected-pair', productionApprovalMode = 'promotion-pr') {
|
|
459
|
+
// Trunk promotion records main by fast-forward from the deploy run, so
|
|
460
|
+
// the pull-request rule applies to develop alone and main keeps its own
|
|
461
|
+
// status-check and fast-forward-only ruleset.
|
|
462
|
+
const branches = productionApprovalMode === 'trunk-promotion' && deliveryLane !== 'trunk'
|
|
463
|
+
? ['develop']
|
|
464
|
+
: protectedBranchesFor(deliveryLane);
|
|
393
465
|
return {
|
|
394
466
|
bypass_actors: [],
|
|
395
467
|
conditions: {
|
|
396
468
|
ref_name: {
|
|
397
469
|
exclude: [],
|
|
398
|
-
include:
|
|
470
|
+
include: branches.map((branch) => `refs/heads/${branch}`),
|
|
399
471
|
},
|
|
400
472
|
},
|
|
401
473
|
enforcement: 'active',
|
|
@@ -427,6 +499,30 @@ function desiredRuleset() {
|
|
|
427
499
|
target: 'branch',
|
|
428
500
|
};
|
|
429
501
|
}
|
|
502
|
+
function desiredMainRuleset() {
|
|
503
|
+
return {
|
|
504
|
+
bypass_actors: [],
|
|
505
|
+
conditions: {
|
|
506
|
+
ref_name: { exclude: [], include: ['refs/heads/main'] },
|
|
507
|
+
},
|
|
508
|
+
enforcement: 'active',
|
|
509
|
+
name: exports.EBK_PROTECTED_MAIN_RULESET_NAME,
|
|
510
|
+
rules: [
|
|
511
|
+
{ type: 'deletion' },
|
|
512
|
+
{ type: 'non_fast_forward' },
|
|
513
|
+
{
|
|
514
|
+
parameters: {
|
|
515
|
+
required_status_checks: exports.EBK_REQUIRED_CHECKS.map((context) => ({
|
|
516
|
+
context,
|
|
517
|
+
})),
|
|
518
|
+
strict_required_status_checks_policy: true,
|
|
519
|
+
},
|
|
520
|
+
type: 'required_status_checks',
|
|
521
|
+
},
|
|
522
|
+
],
|
|
523
|
+
target: 'branch',
|
|
524
|
+
};
|
|
525
|
+
}
|
|
430
526
|
async function inspectEnvironment(api, repositoryPath, name) {
|
|
431
527
|
const encoded = encodeURIComponent(name);
|
|
432
528
|
let environment;
|
|
@@ -486,9 +582,24 @@ async function inspectEnvironment(api, repositoryPath, name) {
|
|
|
486
582
|
waitTimer: environmentWaitTimer(environment),
|
|
487
583
|
};
|
|
488
584
|
}
|
|
489
|
-
async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
585
|
+
async function inspect(api, repositoryPath, productionApprovalMode, deploymentProfile, deliveryLane = 'protected-pair') {
|
|
490
586
|
const blockers = [];
|
|
491
587
|
const repo = await api.request('GET', repositoryPath);
|
|
588
|
+
const repositoryIdentity = inspectRepositoryIdentity(repo);
|
|
589
|
+
if (!repositoryIdentity) {
|
|
590
|
+
blockers.push('GitHub repository identity must expose one canonical full name and positive immutable owner and repository IDs.');
|
|
591
|
+
}
|
|
592
|
+
let oidcSubjectCustomization;
|
|
593
|
+
try {
|
|
594
|
+
const oidcState = await api.request('GET', `${repositoryPath}/actions/oidc/customization/sub`);
|
|
595
|
+
oidcSubjectCustomization = inspectOidcSubjectCustomization(oidcState);
|
|
596
|
+
if (!oidcSubjectCustomization) {
|
|
597
|
+
blockers.push('GitHub repository OIDC subject customization returned an invalid response.');
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
catch (error) {
|
|
601
|
+
blockers.push(`GitHub repository OIDC subject customization could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
602
|
+
}
|
|
492
603
|
let ownerPlanName;
|
|
493
604
|
if (productionApprovalMode === 'environment-reviewer' &&
|
|
494
605
|
requiresPrivateEnvironmentCapabilities(repo)) {
|
|
@@ -518,7 +629,7 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
518
629
|
}
|
|
519
630
|
}
|
|
520
631
|
}
|
|
521
|
-
for (const branch of
|
|
632
|
+
for (const branch of protectedBranchesFor(deliveryLane)) {
|
|
522
633
|
try {
|
|
523
634
|
const codeOwners = await api.request('GET', `${repositoryPath}/contents/.github/CODEOWNERS?ref=${branch}`);
|
|
524
635
|
const content = codeOwners.content;
|
|
@@ -551,7 +662,7 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
551
662
|
catch (error) {
|
|
552
663
|
blockers.push(`Ruleset enforcement could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
553
664
|
}
|
|
554
|
-
for (const branch of
|
|
665
|
+
for (const branch of protectedBranchesFor(deliveryLane)) {
|
|
555
666
|
try {
|
|
556
667
|
const branchState = await api.request('GET', `${repositoryPath}/branches/${branch}`);
|
|
557
668
|
const commit = typeof branchState.commit === 'object' && branchState.commit !== null
|
|
@@ -643,7 +754,7 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
643
754
|
};
|
|
644
755
|
}
|
|
645
756
|
};
|
|
646
|
-
const environments = Object.fromEntries(await Promise.all(
|
|
757
|
+
const environments = Object.fromEntries(await Promise.all(githubEnvironmentTopology(deploymentProfile, deliveryLane, productionApprovalMode).map(async ({ name }) => [name, await inspectNamedEnvironment(name)])));
|
|
647
758
|
return {
|
|
648
759
|
blockers,
|
|
649
760
|
state: {
|
|
@@ -652,17 +763,21 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
652
763
|
environments,
|
|
653
764
|
orgSecretNames,
|
|
654
765
|
orgVariableNames,
|
|
766
|
+
oidcSubjectCustomization,
|
|
655
767
|
ownerPlanName,
|
|
768
|
+
ownedMainRuleset: rulesets.find((ruleset) => ruleset.name === exports.EBK_PROTECTED_MAIN_RULESET_NAME &&
|
|
769
|
+
ruleset.source_type !== 'Organization'),
|
|
656
770
|
ownedRuleset: rulesets.find((ruleset) => ruleset.name === exports.EBK_PROTECTED_BRANCH_RULESET_NAME &&
|
|
657
771
|
ruleset.source_type !== 'Organization'),
|
|
658
772
|
repo,
|
|
773
|
+
repositoryIdentity,
|
|
659
774
|
repositorySecretNames,
|
|
660
775
|
repositoryVariableNames,
|
|
661
776
|
rulesets,
|
|
662
777
|
},
|
|
663
778
|
};
|
|
664
779
|
}
|
|
665
|
-
function evaluate(repository, state, inspectionBlockers, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds) {
|
|
780
|
+
function evaluate(repository, state, inspectionBlockers, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile = 'fully-isolated', deliveryLane = 'protected-pair') {
|
|
666
781
|
const blockers = [...inspectionBlockers];
|
|
667
782
|
const changes = [];
|
|
668
783
|
const warnings = [];
|
|
@@ -682,6 +797,9 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
682
797
|
if (state.repo.allow_rebase_merge !== false) {
|
|
683
798
|
changes.push('Disable repository rebase merging.');
|
|
684
799
|
}
|
|
800
|
+
if (requiresImmutableOidcSubjectCutover(state)) {
|
|
801
|
+
changes.push(GITHUB_IMMUTABLE_OIDC_CHANGE);
|
|
802
|
+
}
|
|
685
803
|
if (state.actionsCanApprovePullRequests !== true) {
|
|
686
804
|
blockers.push('GitHub Actions is not permitted to create or approve pull requests for managed sync-back.');
|
|
687
805
|
}
|
|
@@ -701,6 +819,7 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
701
819
|
}
|
|
702
820
|
for (const variable of [
|
|
703
821
|
...exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES,
|
|
822
|
+
...exports.EBK_OPTIONAL_STAGE_ENVIRONMENT_VARIABLES,
|
|
704
823
|
...FORBIDDEN_NPM_TOKEN_NAMES,
|
|
705
824
|
]) {
|
|
706
825
|
if (state.repositoryVariableNames.includes(variable)) {
|
|
@@ -710,19 +829,8 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
710
829
|
blockers.push(`${variable} is exposed from organization variable scope instead of its protected environment.`);
|
|
711
830
|
}
|
|
712
831
|
}
|
|
713
|
-
for (const variable of [
|
|
714
|
-
...exports.EBK_STAGING_PLAN_REPOSITORY_VARIABLES,
|
|
715
|
-
...exports.EBK_PRODUCTION_PLAN_REPOSITORY_VARIABLES,
|
|
716
|
-
]) {
|
|
717
|
-
if (!state.repositoryVariableNames.includes(variable)) {
|
|
718
|
-
blockers.push(`Repository variable ${variable} is required for a protected read-only plan job; bootstrap never creates variable values.`);
|
|
719
|
-
}
|
|
720
|
-
if (state.orgVariableNames?.includes(variable)) {
|
|
721
|
-
blockers.push(`${variable} must be repository-bound instead of inherited from organization scope.`);
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
832
|
for (const ruleset of state.rulesets) {
|
|
725
|
-
const conflicts = conflictsWithMergeCommitContract(ruleset);
|
|
833
|
+
const conflicts = conflictsWithMergeCommitContract(ruleset, deliveryLane);
|
|
726
834
|
if (conflicts.length > 0) {
|
|
727
835
|
blockers.push(`Active ruleset ${String(ruleset.name ?? ruleset.id ?? 'unknown')} ${conflicts.join(' and ')}.`);
|
|
728
836
|
}
|
|
@@ -730,27 +838,44 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
730
838
|
if (!state.ownedRuleset) {
|
|
731
839
|
changes.push(`Create ruleset ${exports.EBK_PROTECTED_BRANCH_RULESET_NAME}.`);
|
|
732
840
|
}
|
|
733
|
-
else if (
|
|
734
|
-
JSON.stringify(normalizeRuleset(desiredRuleset()))) {
|
|
841
|
+
else if (!rulesetMatchesDesired(state.ownedRuleset, deliveryLane, productionApprovalMode)) {
|
|
735
842
|
changes.push(`Update ruleset ${exports.EBK_PROTECTED_BRANCH_RULESET_NAME}.`);
|
|
736
843
|
}
|
|
737
|
-
|
|
844
|
+
if (productionApprovalMode === 'trunk-promotion') {
|
|
845
|
+
if (!state.ownedMainRuleset) {
|
|
846
|
+
changes.push(`Create ruleset ${exports.EBK_PROTECTED_MAIN_RULESET_NAME}.`);
|
|
847
|
+
}
|
|
848
|
+
else if (JSON.stringify(normalizeRuleset(state.ownedMainRuleset)) !==
|
|
849
|
+
JSON.stringify(normalizeRuleset(desiredMainRuleset()))) {
|
|
850
|
+
changes.push(`Update ruleset ${exports.EBK_PROTECTED_MAIN_RULESET_NAME}.`);
|
|
851
|
+
}
|
|
852
|
+
warnings.push('Trunk promotion keeps main behind required status checks and fast-forward-only updates without a pull-request rule; the production environment secret EBK_RECORD_MAIN_TOKEN is the intended writer, and any other contents-write actor could push an already verified commit.');
|
|
853
|
+
}
|
|
854
|
+
else if (state.ownedMainRuleset) {
|
|
855
|
+
changes.push(`Delete ruleset ${exports.EBK_PROTECTED_MAIN_RULESET_NAME}.`);
|
|
856
|
+
}
|
|
857
|
+
for (const topology of githubEnvironmentTopology(deploymentProfile, deliveryLane, productionApprovalMode)) {
|
|
858
|
+
const { branch, name: environment, stage } = topology;
|
|
859
|
+
const allowedBranches = [branch, ...(topology.additionalBranches ?? [])];
|
|
738
860
|
const current = state.environments[environment];
|
|
739
861
|
if (!current.exists)
|
|
740
862
|
changes.push(`Create ${environment} environment.`);
|
|
741
863
|
if (!current.customBranchPolicies) {
|
|
742
864
|
changes.push(`Enable custom deployment branch policy for ${environment}.`);
|
|
743
865
|
}
|
|
744
|
-
const extras = current.branchPolicies.filter(({ name, type }) =>
|
|
866
|
+
const extras = current.branchPolicies.filter(({ name, type }) => type !== 'branch' ||
|
|
867
|
+
!allowedBranches.includes(name));
|
|
745
868
|
if (extras.length > 0) {
|
|
746
869
|
blockers.push(`${environment} permits unexpected deployment refs: ${extras
|
|
747
870
|
.map(({ name, type }) => `${type}:${name}`)
|
|
748
871
|
.join(', ')}.`);
|
|
749
872
|
}
|
|
750
|
-
|
|
751
|
-
|
|
873
|
+
for (const allowed of allowedBranches) {
|
|
874
|
+
if (!current.branchPolicies.some(({ name, type }) => name === allowed && type === 'branch')) {
|
|
875
|
+
changes.push(`Restrict ${environment} deployment to ${allowed}.`);
|
|
876
|
+
}
|
|
752
877
|
}
|
|
753
|
-
const requiredSecrets =
|
|
878
|
+
const requiredSecrets = topology.requiredSecrets;
|
|
754
879
|
for (const secret of requiredSecrets) {
|
|
755
880
|
if (!current.secretNames.includes(secret)) {
|
|
756
881
|
blockers.push(`${environment} environment is missing ${secret}; bootstrap never creates secret values.`);
|
|
@@ -761,20 +886,21 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
761
886
|
blockers.push(`${environment} environment exposes ${secret} outside its exact capability boundary.`);
|
|
762
887
|
}
|
|
763
888
|
}
|
|
764
|
-
const requiredVariables =
|
|
889
|
+
const requiredVariables = topology.requiredVariables;
|
|
765
890
|
for (const variable of requiredVariables) {
|
|
766
891
|
if (!current.variableNames.includes(variable)) {
|
|
767
892
|
blockers.push(`${environment} environment is missing required variable ${variable}; bootstrap never creates variable values.`);
|
|
768
893
|
}
|
|
769
894
|
}
|
|
895
|
+
const optionalVariables = topology.optionalVariables ?? [];
|
|
770
896
|
for (const variable of current.variableNames) {
|
|
771
|
-
if (!requiredVariables.includes(variable)
|
|
897
|
+
if (!requiredVariables.includes(variable) &&
|
|
898
|
+
!optionalVariables.includes(variable)) {
|
|
772
899
|
blockers.push(`${environment} environment exposes ${variable} outside its exact capability boundary.`);
|
|
773
900
|
}
|
|
774
901
|
}
|
|
775
|
-
const stage = environmentStage(environment);
|
|
776
902
|
if (environment !== stage) {
|
|
777
|
-
const desired = desiredEnvironmentProtection(
|
|
903
|
+
const desired = desiredEnvironmentProtection(topology, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
|
|
778
904
|
if (environment === 'npm-prerelease' &&
|
|
779
905
|
productionApprovalMode === 'environment-reviewer' &&
|
|
780
906
|
desired.reviewers.length === 0) {
|
|
@@ -816,14 +942,19 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
816
942
|
}
|
|
817
943
|
}
|
|
818
944
|
}
|
|
819
|
-
|
|
820
|
-
|
|
945
|
+
const rehearsalStage = deploymentProfile === 'starter' ? 'development' : 'staging';
|
|
946
|
+
if (state.environments[rehearsalStage].reviewers.length > 0) {
|
|
947
|
+
warnings.push(`${rehearsalStage === 'development' ? 'Development' : 'Staging'} has additional reviewer protection; bootstrap will preserve it.`);
|
|
821
948
|
}
|
|
822
949
|
return {
|
|
823
950
|
blockers: [...new Set(blockers)].sort(),
|
|
824
951
|
changes: [...new Set(changes)].sort(),
|
|
952
|
+
deploymentProfile,
|
|
825
953
|
ready: blockers.length === 0 && changes.length === 0,
|
|
826
954
|
repository,
|
|
955
|
+
...(state.repositoryIdentity
|
|
956
|
+
? { repositoryIdentity: state.repositoryIdentity }
|
|
957
|
+
: {}),
|
|
827
958
|
productionApprovalMode,
|
|
828
959
|
warnings: [...new Set(warnings)].sort(),
|
|
829
960
|
};
|
|
@@ -885,11 +1016,14 @@ function normalizeRuleset(ruleset) {
|
|
|
885
1016
|
function existingReviewerPayload(ids) {
|
|
886
1017
|
return ids.map((id) => ({ id, type: 'User' }));
|
|
887
1018
|
}
|
|
888
|
-
function rulesetMatchesDesired(ruleset) {
|
|
1019
|
+
function rulesetMatchesDesired(ruleset, deliveryLane = 'protected-pair', productionApprovalMode = 'promotion-pr') {
|
|
889
1020
|
return (JSON.stringify(normalizeRuleset(ruleset)) ===
|
|
890
|
-
JSON.stringify(normalizeRuleset(desiredRuleset())));
|
|
1021
|
+
JSON.stringify(normalizeRuleset(desiredRuleset(deliveryLane, productionApprovalMode))));
|
|
891
1022
|
}
|
|
892
|
-
async function applyChanges(api, repositoryPath, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds) {
|
|
1023
|
+
async function applyChanges(api, repositoryPath, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane = 'protected-pair') {
|
|
1024
|
+
if (requiresImmutableOidcSubjectCutover(state)) {
|
|
1025
|
+
await api.request('PUT', `${repositoryPath}/actions/oidc/customization/sub`, { use_default: true, use_immutable_subject: true });
|
|
1026
|
+
}
|
|
893
1027
|
if (state.repo.allow_merge_commit !== true ||
|
|
894
1028
|
state.repo.allow_rebase_merge !== false ||
|
|
895
1029
|
state.repo.allow_squash_merge !== false) {
|
|
@@ -899,19 +1033,36 @@ async function applyChanges(api, repositoryPath, state, productionApprovalMode,
|
|
|
899
1033
|
allow_squash_merge: false,
|
|
900
1034
|
});
|
|
901
1035
|
}
|
|
902
|
-
const desired = desiredRuleset();
|
|
1036
|
+
const desired = desiredRuleset(deliveryLane, productionApprovalMode);
|
|
903
1037
|
if (state.ownedRuleset &&
|
|
904
1038
|
typeof state.ownedRuleset.id === 'number' &&
|
|
905
|
-
!rulesetMatchesDesired(state.ownedRuleset)) {
|
|
1039
|
+
!rulesetMatchesDesired(state.ownedRuleset, deliveryLane, productionApprovalMode)) {
|
|
906
1040
|
await api.request('PUT', `${repositoryPath}/rulesets/${state.ownedRuleset.id}`, desired);
|
|
907
1041
|
}
|
|
908
1042
|
else if (!state.ownedRuleset) {
|
|
909
1043
|
await api.request('POST', `${repositoryPath}/rulesets`, desired);
|
|
910
1044
|
}
|
|
911
|
-
|
|
1045
|
+
if (productionApprovalMode === 'trunk-promotion') {
|
|
1046
|
+
const desiredMain = desiredMainRuleset();
|
|
1047
|
+
if (state.ownedMainRuleset &&
|
|
1048
|
+
typeof state.ownedMainRuleset.id === 'number' &&
|
|
1049
|
+
JSON.stringify(normalizeRuleset(state.ownedMainRuleset)) !==
|
|
1050
|
+
JSON.stringify(normalizeRuleset(desiredMain))) {
|
|
1051
|
+
await api.request('PUT', `${repositoryPath}/rulesets/${state.ownedMainRuleset.id}`, desiredMain);
|
|
1052
|
+
}
|
|
1053
|
+
else if (!state.ownedMainRuleset) {
|
|
1054
|
+
await api.request('POST', `${repositoryPath}/rulesets`, desiredMain);
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
else if (state.ownedMainRuleset &&
|
|
1058
|
+
typeof state.ownedMainRuleset.id === 'number') {
|
|
1059
|
+
await api.request('DELETE', `${repositoryPath}/rulesets/${state.ownedMainRuleset.id}`);
|
|
1060
|
+
}
|
|
1061
|
+
for (const topology of githubEnvironmentTopology(deploymentProfile, deliveryLane, productionApprovalMode)) {
|
|
1062
|
+
const { branch, name: environment, stage } = topology;
|
|
1063
|
+
const allowedBranches = [branch, ...(topology.additionalBranches ?? [])];
|
|
912
1064
|
const current = state.environments[environment];
|
|
913
|
-
const
|
|
914
|
-
const desiredProtection = desiredEnvironmentProtection(environment, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
|
|
1065
|
+
const desiredProtection = desiredEnvironmentProtection(topology, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
|
|
915
1066
|
const reviewers = desiredProtection.reviewers;
|
|
916
1067
|
const desiredPreventSelfReview = desiredProtection.preventSelfReview;
|
|
917
1068
|
const desiredWaitTimer = desiredProtection.waitTimer;
|
|
@@ -941,19 +1092,25 @@ async function applyChanges(api, repositoryPath, state, productionApprovalMode,
|
|
|
941
1092
|
: {}),
|
|
942
1093
|
});
|
|
943
1094
|
}
|
|
944
|
-
|
|
945
|
-
|
|
1095
|
+
for (const allowed of allowedBranches) {
|
|
1096
|
+
if (!current.branchPolicies.some(({ name, type }) => name === allowed && type === 'branch')) {
|
|
1097
|
+
await api.request('POST', `${repositoryPath}/environments/${encodeURIComponent(environment)}/deployment-branch-policies`, { name: allowed, type: 'branch' });
|
|
1098
|
+
}
|
|
946
1099
|
}
|
|
947
1100
|
}
|
|
948
1101
|
}
|
|
949
1102
|
async function runGitHubBootstrap(options) {
|
|
950
1103
|
const repository = options.repository.trim();
|
|
1104
|
+
const deploymentProfile = options.deploymentProfile ?? 'fully-isolated';
|
|
951
1105
|
const { owner, repo } = parseRepository(repository);
|
|
952
1106
|
if (!options.token.trim()) {
|
|
953
1107
|
throw new Error('GH_TOKEN or GITHUB_TOKEN is required for GitHub bootstrap.');
|
|
954
1108
|
}
|
|
955
1109
|
if (!index_js_1.PRODUCTION_APPROVAL_MODES.includes(options.productionApprovalMode)) {
|
|
956
|
-
throw new Error('Production approval mode must be the explicit committed value promotion-pr or
|
|
1110
|
+
throw new Error('Production approval mode must be the explicit committed value promotion-pr, environment-reviewer, or trunk-promotion.');
|
|
1111
|
+
}
|
|
1112
|
+
if (!index_js_1.DEPLOYMENT_PROFILES.includes(deploymentProfile)) {
|
|
1113
|
+
throw new Error('Deployment profile must be starter, production-isolated, or fully-isolated.');
|
|
957
1114
|
}
|
|
958
1115
|
const productionReviewerIds = [
|
|
959
1116
|
...new Set(options.productionReviewerIds ?? []),
|
|
@@ -973,15 +1130,26 @@ async function runGitHubBootstrap(options) {
|
|
|
973
1130
|
}
|
|
974
1131
|
const api = new GitHubApi(options.apiBaseUrl?.trim() || 'https://api.github.com', options.token);
|
|
975
1132
|
const repositoryPath = `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`;
|
|
976
|
-
const
|
|
977
|
-
const
|
|
1133
|
+
const deliveryLane = options.deliveryLane ?? 'protected-pair';
|
|
1134
|
+
const initial = await inspect(api, repositoryPath, options.productionApprovalMode, deploymentProfile, deliveryLane);
|
|
1135
|
+
const report = evaluate(repository, initial.state, initial.blockers, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane);
|
|
978
1136
|
if (!options.apply)
|
|
979
1137
|
return report;
|
|
980
1138
|
if (report.blockers.length > 0) {
|
|
981
1139
|
throw new Error(`GitHub bootstrap apply is blocked:\n- ${report.blockers.join('\n- ')}`);
|
|
982
1140
|
}
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
1141
|
+
if (requiresImmutableOidcSubjectCutover(initial.state)) {
|
|
1142
|
+
const identity = initial.state.repositoryIdentity;
|
|
1143
|
+
if (!identity) {
|
|
1144
|
+
throw new Error('GitHub bootstrap cannot acknowledge immutable OIDC trust without the inspected repository identity.');
|
|
1145
|
+
}
|
|
1146
|
+
const expectedAcknowledgement = immutableOidcTrustAcknowledgement(identity);
|
|
1147
|
+
if (options.immutableOidcTrustAcknowledgement !== expectedAcknowledgement) {
|
|
1148
|
+
throw new Error(`GitHub bootstrap immutable OIDC subject cutover requires the exact AWS-trust readiness acknowledgement ${JSON.stringify(expectedAcknowledgement)}. Apply the matching immutable repository-subject AWS trusts, read them back, and rerun with --immutableOidcTrustAcknowledgement=${JSON.stringify(expectedAcknowledgement)}. No GitHub settings were changed.`);
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
await applyChanges(api, repositoryPath, initial.state, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane);
|
|
1152
|
+
const completed = await inspect(api, repositoryPath, options.productionApprovalMode, deploymentProfile, deliveryLane);
|
|
1153
|
+
return evaluate(repository, completed.state, completed.blockers, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane);
|
|
986
1154
|
}
|
|
987
1155
|
//# sourceMappingURL=github-bootstrap.js.map
|