@empire-builder-kit/nx 1.0.0-rc.4 → 1.0.0-rc.40
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 +18 -0
- 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.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 +6 -0
- package/src/cli/deploy-runtime.js +58 -0
- package/src/cli/dev-command.d.ts +16 -4
- package/src/cli/dev-command.js +63 -0
- package/src/cli/main.d.ts +9 -1
- package/src/cli/main.js +139 -20
- package/src/cli/output.d.ts +1 -1
- package/src/cli/output.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 +5 -0
- package/src/developer-agent/operation-registry.js +286 -40
- package/src/developer-agent/planning.js +16 -13
- 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 +162 -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 +40 -6
- package/src/executors/sst-lifecycle/run-sst-command.js +779 -70
- 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/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/tool-versions.d.ts +2 -0
- package/src/generators/preset/tool-versions.js +3 -1
- package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
- package/src/generators/preset/workspace-files-adopter-skills.js +303 -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 +90 -28
- 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-stage-authority.d.ts +6 -0
- package/src/generators/preset/workspace-files-stage-authority.js +518 -0
- package/src/generators/preset/workspace-files-thin-deploy.d.ts +55 -0
- package/src/generators/preset/workspace-files-thin-deploy.js +2473 -0
- package/src/generators/preset/workspace-files-thin-docs.d.ts +7 -0
- package/src/generators/preset/workspace-files-thin-docs.js +352 -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 +1504 -608
- 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 +42 -7
- 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 +92 -329
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +60 -2
- 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 +163 -1196
- 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 +20 -1
- 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 +7 -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 -729
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +67 -11
- 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 +157 -28
- 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 +279 -43
- 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-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -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 +80 -29
- 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/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 +39 -8
- package/src/git-policy/github-bootstrap.js +329 -175
- 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 +46 -18
- 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 +14 -2
- 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/registry.d.ts +2 -1
- package/src/secrets/registry.js +18 -1
- package/src/secrets/verification.js +9 -1
- 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_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,122 @@ exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES = [
|
|
|
34
32
|
'AWS_STAGING_PROMOTION_REGION',
|
|
35
33
|
'EBK_ALLOW_PRODUCTION_REMOVE',
|
|
36
34
|
'EBK_FLEET_ORIGIN',
|
|
37
|
-
exports.EBK_PERFORMANCE_ORIGINS_VARIABLE,
|
|
38
|
-
'EBK_SMOKE_AUTHORITY_VERSION',
|
|
39
|
-
'EBK_SMOKE_TARGETS',
|
|
40
35
|
];
|
|
41
36
|
const FORBIDDEN_NPM_TOKEN_NAMES = [
|
|
42
37
|
'NODE_AUTH_TOKEN',
|
|
43
38
|
'NPM_CONFIG_TOKEN',
|
|
44
39
|
'NPM_TOKEN',
|
|
45
40
|
];
|
|
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
41
|
exports.EBK_CODE_OWNER_PLACEHOLDER = '@REPLACE_WITH_GITHUB_CODE_OWNER';
|
|
73
|
-
const GITHUB_API_VERSION = '
|
|
42
|
+
const GITHUB_API_VERSION = '2026-03-10';
|
|
43
|
+
const GITHUB_IMMUTABLE_OIDC_CHANGE = 'Use the default immutable GitHub OIDC repository subject.';
|
|
44
|
+
const GITHUB_IMMUTABLE_OIDC_TRUST_ACKNOWLEDGEMENT_PREFIX = 'aws-trust-ready:';
|
|
74
45
|
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
|
-
};
|
|
46
|
+
/** The trunk lane protects main alone; the protected pair protects both. */
|
|
47
|
+
function protectedBranchesFor(deliveryLane = 'protected-pair') {
|
|
48
|
+
return deliveryLane === 'trunk' ? ['main'] : PROTECTED_BRANCHES;
|
|
49
|
+
}
|
|
118
50
|
const BASE_STAGE_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES.filter((variable) => variable !== 'EBK_ALLOW_PRODUCTION_REMOVE' &&
|
|
119
|
-
variable !== exports.EBK_PERFORMANCE_ORIGINS_VARIABLE &&
|
|
120
51
|
!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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
52
|
+
const PRODUCTION_STAGE_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES;
|
|
53
|
+
const AUXILIARY_ENVIRONMENTS = Object.freeze([
|
|
54
|
+
{
|
|
55
|
+
name: 'async-recovery',
|
|
56
|
+
requiredSecrets: [exports.EBK_ASYNC_RECOVERY_ROLE_SECRET],
|
|
57
|
+
requiredVariables: ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
function stageEnvironmentTopology(stage, deploymentProfile) {
|
|
61
|
+
const production = stage === 'production';
|
|
62
|
+
return Object.freeze({
|
|
63
|
+
branch: production ? 'main' : 'develop',
|
|
64
|
+
name: stage,
|
|
65
|
+
requiredSecrets: Object.freeze(production
|
|
66
|
+
? deploymentProfile === 'starter'
|
|
67
|
+
? []
|
|
68
|
+
: [exports.EBK_STAGING_PROMOTION_PULL_ROLE_SECRET]
|
|
69
|
+
: []),
|
|
70
|
+
requiredVariables: Object.freeze(production
|
|
71
|
+
? deploymentProfile === 'starter'
|
|
72
|
+
? PRODUCTION_STAGE_VARIABLES.filter((variable) => !variable.startsWith('AWS_STAGING_PROMOTION_'))
|
|
73
|
+
: PRODUCTION_STAGE_VARIABLES
|
|
74
|
+
: BASE_STAGE_VARIABLES),
|
|
75
|
+
stage,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Exact generated GitHub environment contract for one deployment profile.
|
|
80
|
+
* Starter uses development as its rehearsal stage; isolated profiles use
|
|
81
|
+
* staging. Production and npm publication remain present for every profile.
|
|
82
|
+
*/
|
|
83
|
+
function githubEnvironmentTopology(deploymentProfile, deliveryLane = 'protected-pair', productionApprovalMode = 'promotion-pr') {
|
|
84
|
+
if (deliveryLane === 'trunk') {
|
|
85
|
+
// Trunk lane: development stays local; only production-stage
|
|
86
|
+
// environments exist and every one of them binds to main.
|
|
87
|
+
return githubEnvironmentTopology(deploymentProfile).filter(({ stage }) => stage === 'production');
|
|
88
|
+
}
|
|
89
|
+
if (productionApprovalMode === 'trunk-promotion') {
|
|
90
|
+
// Trunk promotion: the develop run itself promotes and deploys
|
|
91
|
+
// production, so every production-stage environment also admits
|
|
92
|
+
// develop, and the production stage holds the record-main token.
|
|
93
|
+
return githubEnvironmentTopology(deploymentProfile).map((entry) => entry.stage === 'production'
|
|
94
|
+
? Object.freeze({
|
|
95
|
+
...entry,
|
|
96
|
+
additionalBranches: Object.freeze(['develop']),
|
|
97
|
+
requiredSecrets: Object.freeze(entry.name === 'production'
|
|
98
|
+
? [...entry.requiredSecrets, exports.EBK_RECORD_MAIN_TOKEN_SECRET]
|
|
99
|
+
: [...entry.requiredSecrets]),
|
|
100
|
+
})
|
|
101
|
+
: entry);
|
|
102
|
+
}
|
|
103
|
+
const rehearsalStage = deploymentProfile === 'starter' ? 'development' : 'staging';
|
|
104
|
+
const stages = [
|
|
105
|
+
'production',
|
|
106
|
+
rehearsalStage,
|
|
107
|
+
];
|
|
108
|
+
const topology = [];
|
|
109
|
+
for (const auxiliary of AUXILIARY_ENVIRONMENTS) {
|
|
110
|
+
for (const stage of stages) {
|
|
111
|
+
topology.push(Object.freeze({
|
|
112
|
+
branch: stage === 'production' ? 'main' : 'develop',
|
|
113
|
+
name: `${auxiliary.name}-${stage}`,
|
|
114
|
+
requiredSecrets: Object.freeze([...auxiliary.requiredSecrets]),
|
|
115
|
+
requiredVariables: Object.freeze([...auxiliary.requiredVariables]),
|
|
116
|
+
stage,
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const ecrStages = deploymentProfile === 'starter'
|
|
121
|
+
? ['production']
|
|
122
|
+
: ['staging', 'production'];
|
|
123
|
+
for (const stage of ecrStages) {
|
|
124
|
+
topology.push(Object.freeze({
|
|
125
|
+
branch: stage === 'production' ? 'main' : 'develop',
|
|
126
|
+
name: `ecr-inspector-${stage}`,
|
|
127
|
+
requiredSecrets: Object.freeze([
|
|
128
|
+
exports.EBK_ECR_INSPECTOR_EVIDENCE_ROLE_SECRET,
|
|
129
|
+
]),
|
|
130
|
+
requiredVariables: Object.freeze([
|
|
131
|
+
'AWS_EXPECTED_ACCOUNT_ID',
|
|
132
|
+
'AWS_REGION',
|
|
133
|
+
]),
|
|
134
|
+
stage,
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
topology.push(Object.freeze({
|
|
138
|
+
branch: 'main',
|
|
139
|
+
name: 'npm-prerelease',
|
|
140
|
+
requiredSecrets: Object.freeze([]),
|
|
141
|
+
requiredVariables: Object.freeze([]),
|
|
142
|
+
stage: 'production',
|
|
143
|
+
}), stageEnvironmentTopology('production', deploymentProfile), stageEnvironmentTopology(rehearsalStage, deploymentProfile));
|
|
144
|
+
return Object.freeze(topology);
|
|
153
145
|
}
|
|
154
146
|
function desiredEnvironmentProtection(environment, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds) {
|
|
155
|
-
const current = state.environments[environment];
|
|
156
|
-
const stage =
|
|
147
|
+
const current = state.environments[environment.name];
|
|
148
|
+
const stage = environment.stage;
|
|
157
149
|
const stageEnvironment = state.environments[stage];
|
|
158
|
-
if (environment === 'npm-prerelease') {
|
|
150
|
+
if (environment.name === 'npm-prerelease') {
|
|
159
151
|
if (productionApprovalMode === 'promotion-pr') {
|
|
160
152
|
return {
|
|
161
153
|
preventSelfReview: false,
|
|
@@ -177,19 +169,29 @@ function desiredEnvironmentProtection(environment, state, productionApprovalMode
|
|
|
177
169
|
preventSelfReview: stage === 'production' &&
|
|
178
170
|
productionApprovalMode === 'environment-reviewer'
|
|
179
171
|
? true
|
|
180
|
-
: environment === stage
|
|
172
|
+
: environment.name === stage
|
|
181
173
|
? current.preventSelfReview
|
|
182
174
|
: stageEnvironment.preventSelfReview,
|
|
183
175
|
reviewers: stage === 'production' &&
|
|
184
176
|
productionApprovalMode === 'environment-reviewer' &&
|
|
185
177
|
productionReviewerIds.length > 0
|
|
186
178
|
? existingReviewerPayload(productionReviewerIds)
|
|
187
|
-
: environment === stage
|
|
179
|
+
: environment.name === stage
|
|
188
180
|
? current.reviewers
|
|
189
181
|
: stageEnvironment.reviewers,
|
|
190
|
-
waitTimer: environment === stage
|
|
182
|
+
waitTimer: environment.name === stage
|
|
183
|
+
? current.waitTimer
|
|
184
|
+
: stageEnvironment.waitTimer,
|
|
191
185
|
};
|
|
192
186
|
}
|
|
187
|
+
function requiresImmutableOidcSubjectCutover(state) {
|
|
188
|
+
return Boolean(state.oidcSubjectCustomization &&
|
|
189
|
+
(!state.oidcSubjectCustomization.useDefault ||
|
|
190
|
+
!state.oidcSubjectCustomization.useImmutableSubject));
|
|
191
|
+
}
|
|
192
|
+
function immutableOidcTrustAcknowledgement(identity) {
|
|
193
|
+
return `${GITHUB_IMMUTABLE_OIDC_TRUST_ACKNOWLEDGEMENT_PREFIX}${identity.subjectPrefix}`;
|
|
194
|
+
}
|
|
193
195
|
const PRIVATE_ENVIRONMENT_REVIEWER_PLANS = new Set([
|
|
194
196
|
'business_plus',
|
|
195
197
|
'enterprise',
|
|
@@ -231,9 +233,10 @@ class GitHubApi {
|
|
|
231
233
|
}
|
|
232
234
|
throw new GitHubApiError(response.status, `GitHub ${method} ${path} failed (${response.status}): ${detail}`);
|
|
233
235
|
}
|
|
234
|
-
|
|
236
|
+
const responseBody = await response.text();
|
|
237
|
+
if (!responseBody)
|
|
235
238
|
return undefined;
|
|
236
|
-
return
|
|
239
|
+
return JSON.parse(responseBody);
|
|
237
240
|
}
|
|
238
241
|
}
|
|
239
242
|
function parseRepository(repository) {
|
|
@@ -243,6 +246,58 @@ function parseRepository(repository) {
|
|
|
243
246
|
}
|
|
244
247
|
return { owner: match[1], repo: match[2] };
|
|
245
248
|
}
|
|
249
|
+
function inspectRepositoryIdentity(repo) {
|
|
250
|
+
const owner = typeof repo.owner === 'object' && repo.owner !== null
|
|
251
|
+
? repo.owner
|
|
252
|
+
: undefined;
|
|
253
|
+
const ownerLogin = owner?.login;
|
|
254
|
+
const ownerId = owner?.id;
|
|
255
|
+
const repositoryName = repo.name;
|
|
256
|
+
const repositoryId = repo.id;
|
|
257
|
+
const fullName = repo.full_name;
|
|
258
|
+
if (typeof ownerLogin !== 'string' ||
|
|
259
|
+
!/^[A-Za-z0-9_.-]+$/u.test(ownerLogin) ||
|
|
260
|
+
typeof ownerId !== 'number' ||
|
|
261
|
+
!Number.isSafeInteger(ownerId) ||
|
|
262
|
+
ownerId <= 0 ||
|
|
263
|
+
typeof repositoryName !== 'string' ||
|
|
264
|
+
!/^[A-Za-z0-9_.-]+$/u.test(repositoryName) ||
|
|
265
|
+
typeof repositoryId !== 'number' ||
|
|
266
|
+
!Number.isSafeInteger(repositoryId) ||
|
|
267
|
+
repositoryId <= 0 ||
|
|
268
|
+
typeof fullName !== 'string' ||
|
|
269
|
+
fullName !== `${ownerLogin}/${repositoryName}`) {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
const ownerIdString = String(ownerId);
|
|
273
|
+
const repositoryIdString = String(repositoryId);
|
|
274
|
+
return {
|
|
275
|
+
fullName,
|
|
276
|
+
ownerId: ownerIdString,
|
|
277
|
+
repositoryId: repositoryIdString,
|
|
278
|
+
subjectPrefix: `repo:${ownerLogin}@${ownerIdString}/${repositoryName}@${repositoryIdString}`,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function inspectOidcSubjectCustomization(value) {
|
|
282
|
+
const includeClaimKeys = value.include_claim_keys;
|
|
283
|
+
const useDefault = value.use_default;
|
|
284
|
+
const useImmutableSubject = value.use_immutable_subject;
|
|
285
|
+
if (typeof useDefault !== 'boolean' ||
|
|
286
|
+
(useImmutableSubject !== undefined &&
|
|
287
|
+
typeof useImmutableSubject !== 'boolean') ||
|
|
288
|
+
(includeClaimKeys !== undefined &&
|
|
289
|
+
(!Array.isArray(includeClaimKeys) ||
|
|
290
|
+
includeClaimKeys.some((key) => typeof key !== 'string')))) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
includeClaimKeys: Array.isArray(includeClaimKeys)
|
|
295
|
+
? [...new Set(includeClaimKeys)].sort(deterministic_order_js_1.compareUtf16)
|
|
296
|
+
: [],
|
|
297
|
+
useDefault,
|
|
298
|
+
useImmutableSubject: useImmutableSubject === true,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
246
301
|
function asObjects(value) {
|
|
247
302
|
return Array.isArray(value)
|
|
248
303
|
? value.filter((item) => typeof item === 'object' && item !== null && !Array.isArray(item))
|
|
@@ -306,7 +361,7 @@ function refPatternMatches(pattern, ref) {
|
|
|
306
361
|
.replace(/\?/g, '.');
|
|
307
362
|
return new RegExp(`^${expression}$`).test(ref);
|
|
308
363
|
}
|
|
309
|
-
function rulesetTouchesProtectedBranches(ruleset) {
|
|
364
|
+
function rulesetTouchesProtectedBranches(ruleset, deliveryLane = 'protected-pair') {
|
|
310
365
|
const conditions = typeof ruleset.conditions === 'object' && ruleset.conditions !== null
|
|
311
366
|
? ruleset.conditions
|
|
312
367
|
: {};
|
|
@@ -317,7 +372,7 @@ function rulesetTouchesProtectedBranches(ruleset) {
|
|
|
317
372
|
return true;
|
|
318
373
|
const include = asStrings(refName.include);
|
|
319
374
|
const exclude = asStrings(refName.exclude);
|
|
320
|
-
return
|
|
375
|
+
return protectedBranchesFor(deliveryLane).some((branch) => {
|
|
321
376
|
const ref = `refs/heads/${branch}`;
|
|
322
377
|
const included = include.length === 0 ||
|
|
323
378
|
include.some((pattern) => refPatternMatches(pattern, ref));
|
|
@@ -325,9 +380,9 @@ function rulesetTouchesProtectedBranches(ruleset) {
|
|
|
325
380
|
return included && !excluded;
|
|
326
381
|
});
|
|
327
382
|
}
|
|
328
|
-
function conflictsWithMergeCommitContract(ruleset) {
|
|
383
|
+
function conflictsWithMergeCommitContract(ruleset, deliveryLane = 'protected-pair') {
|
|
329
384
|
if (!activeBranchRuleset(ruleset) ||
|
|
330
|
-
!rulesetTouchesProtectedBranches(ruleset)) {
|
|
385
|
+
!rulesetTouchesProtectedBranches(ruleset, deliveryLane)) {
|
|
331
386
|
return [];
|
|
332
387
|
}
|
|
333
388
|
const conflicts = [];
|
|
@@ -389,13 +444,19 @@ function hasValidCatchAllCodeOwner(contents) {
|
|
|
389
444
|
effectiveOwners.length > 0 &&
|
|
390
445
|
effectiveOwners.every((owner) => owner.startsWith('@') && owner !== exports.EBK_CODE_OWNER_PLACEHOLDER));
|
|
391
446
|
}
|
|
392
|
-
function desiredRuleset() {
|
|
447
|
+
function desiredRuleset(deliveryLane = 'protected-pair', productionApprovalMode = 'promotion-pr') {
|
|
448
|
+
// Trunk promotion records main by fast-forward from the deploy run, so
|
|
449
|
+
// the pull-request rule applies to develop alone and main keeps its own
|
|
450
|
+
// status-check and fast-forward-only ruleset.
|
|
451
|
+
const branches = productionApprovalMode === 'trunk-promotion' && deliveryLane !== 'trunk'
|
|
452
|
+
? ['develop']
|
|
453
|
+
: protectedBranchesFor(deliveryLane);
|
|
393
454
|
return {
|
|
394
455
|
bypass_actors: [],
|
|
395
456
|
conditions: {
|
|
396
457
|
ref_name: {
|
|
397
458
|
exclude: [],
|
|
398
|
-
include:
|
|
459
|
+
include: branches.map((branch) => `refs/heads/${branch}`),
|
|
399
460
|
},
|
|
400
461
|
},
|
|
401
462
|
enforcement: 'active',
|
|
@@ -427,6 +488,30 @@ function desiredRuleset() {
|
|
|
427
488
|
target: 'branch',
|
|
428
489
|
};
|
|
429
490
|
}
|
|
491
|
+
function desiredMainRuleset() {
|
|
492
|
+
return {
|
|
493
|
+
bypass_actors: [],
|
|
494
|
+
conditions: {
|
|
495
|
+
ref_name: { exclude: [], include: ['refs/heads/main'] },
|
|
496
|
+
},
|
|
497
|
+
enforcement: 'active',
|
|
498
|
+
name: exports.EBK_PROTECTED_MAIN_RULESET_NAME,
|
|
499
|
+
rules: [
|
|
500
|
+
{ type: 'deletion' },
|
|
501
|
+
{ type: 'non_fast_forward' },
|
|
502
|
+
{
|
|
503
|
+
parameters: {
|
|
504
|
+
required_status_checks: exports.EBK_REQUIRED_CHECKS.map((context) => ({
|
|
505
|
+
context,
|
|
506
|
+
})),
|
|
507
|
+
strict_required_status_checks_policy: true,
|
|
508
|
+
},
|
|
509
|
+
type: 'required_status_checks',
|
|
510
|
+
},
|
|
511
|
+
],
|
|
512
|
+
target: 'branch',
|
|
513
|
+
};
|
|
514
|
+
}
|
|
430
515
|
async function inspectEnvironment(api, repositoryPath, name) {
|
|
431
516
|
const encoded = encodeURIComponent(name);
|
|
432
517
|
let environment;
|
|
@@ -486,9 +571,24 @@ async function inspectEnvironment(api, repositoryPath, name) {
|
|
|
486
571
|
waitTimer: environmentWaitTimer(environment),
|
|
487
572
|
};
|
|
488
573
|
}
|
|
489
|
-
async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
574
|
+
async function inspect(api, repositoryPath, productionApprovalMode, deploymentProfile, deliveryLane = 'protected-pair') {
|
|
490
575
|
const blockers = [];
|
|
491
576
|
const repo = await api.request('GET', repositoryPath);
|
|
577
|
+
const repositoryIdentity = inspectRepositoryIdentity(repo);
|
|
578
|
+
if (!repositoryIdentity) {
|
|
579
|
+
blockers.push('GitHub repository identity must expose one canonical full name and positive immutable owner and repository IDs.');
|
|
580
|
+
}
|
|
581
|
+
let oidcSubjectCustomization;
|
|
582
|
+
try {
|
|
583
|
+
const oidcState = await api.request('GET', `${repositoryPath}/actions/oidc/customization/sub`);
|
|
584
|
+
oidcSubjectCustomization = inspectOidcSubjectCustomization(oidcState);
|
|
585
|
+
if (!oidcSubjectCustomization) {
|
|
586
|
+
blockers.push('GitHub repository OIDC subject customization returned an invalid response.');
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
catch (error) {
|
|
590
|
+
blockers.push(`GitHub repository OIDC subject customization could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
591
|
+
}
|
|
492
592
|
let ownerPlanName;
|
|
493
593
|
if (productionApprovalMode === 'environment-reviewer' &&
|
|
494
594
|
requiresPrivateEnvironmentCapabilities(repo)) {
|
|
@@ -518,7 +618,7 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
518
618
|
}
|
|
519
619
|
}
|
|
520
620
|
}
|
|
521
|
-
for (const branch of
|
|
621
|
+
for (const branch of protectedBranchesFor(deliveryLane)) {
|
|
522
622
|
try {
|
|
523
623
|
const codeOwners = await api.request('GET', `${repositoryPath}/contents/.github/CODEOWNERS?ref=${branch}`);
|
|
524
624
|
const content = codeOwners.content;
|
|
@@ -551,7 +651,7 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
551
651
|
catch (error) {
|
|
552
652
|
blockers.push(`Ruleset enforcement could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
553
653
|
}
|
|
554
|
-
for (const branch of
|
|
654
|
+
for (const branch of protectedBranchesFor(deliveryLane)) {
|
|
555
655
|
try {
|
|
556
656
|
const branchState = await api.request('GET', `${repositoryPath}/branches/${branch}`);
|
|
557
657
|
const commit = typeof branchState.commit === 'object' && branchState.commit !== null
|
|
@@ -643,7 +743,7 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
643
743
|
};
|
|
644
744
|
}
|
|
645
745
|
};
|
|
646
|
-
const environments = Object.fromEntries(await Promise.all(
|
|
746
|
+
const environments = Object.fromEntries(await Promise.all(githubEnvironmentTopology(deploymentProfile, deliveryLane, productionApprovalMode).map(async ({ name }) => [name, await inspectNamedEnvironment(name)])));
|
|
647
747
|
return {
|
|
648
748
|
blockers,
|
|
649
749
|
state: {
|
|
@@ -652,17 +752,21 @@ async function inspect(api, repositoryPath, productionApprovalMode) {
|
|
|
652
752
|
environments,
|
|
653
753
|
orgSecretNames,
|
|
654
754
|
orgVariableNames,
|
|
755
|
+
oidcSubjectCustomization,
|
|
655
756
|
ownerPlanName,
|
|
757
|
+
ownedMainRuleset: rulesets.find((ruleset) => ruleset.name === exports.EBK_PROTECTED_MAIN_RULESET_NAME &&
|
|
758
|
+
ruleset.source_type !== 'Organization'),
|
|
656
759
|
ownedRuleset: rulesets.find((ruleset) => ruleset.name === exports.EBK_PROTECTED_BRANCH_RULESET_NAME &&
|
|
657
760
|
ruleset.source_type !== 'Organization'),
|
|
658
761
|
repo,
|
|
762
|
+
repositoryIdentity,
|
|
659
763
|
repositorySecretNames,
|
|
660
764
|
repositoryVariableNames,
|
|
661
765
|
rulesets,
|
|
662
766
|
},
|
|
663
767
|
};
|
|
664
768
|
}
|
|
665
|
-
function evaluate(repository, state, inspectionBlockers, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds) {
|
|
769
|
+
function evaluate(repository, state, inspectionBlockers, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile = 'fully-isolated', deliveryLane = 'protected-pair') {
|
|
666
770
|
const blockers = [...inspectionBlockers];
|
|
667
771
|
const changes = [];
|
|
668
772
|
const warnings = [];
|
|
@@ -682,6 +786,9 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
682
786
|
if (state.repo.allow_rebase_merge !== false) {
|
|
683
787
|
changes.push('Disable repository rebase merging.');
|
|
684
788
|
}
|
|
789
|
+
if (requiresImmutableOidcSubjectCutover(state)) {
|
|
790
|
+
changes.push(GITHUB_IMMUTABLE_OIDC_CHANGE);
|
|
791
|
+
}
|
|
685
792
|
if (state.actionsCanApprovePullRequests !== true) {
|
|
686
793
|
blockers.push('GitHub Actions is not permitted to create or approve pull requests for managed sync-back.');
|
|
687
794
|
}
|
|
@@ -710,19 +817,8 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
710
817
|
blockers.push(`${variable} is exposed from organization variable scope instead of its protected environment.`);
|
|
711
818
|
}
|
|
712
819
|
}
|
|
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
820
|
for (const ruleset of state.rulesets) {
|
|
725
|
-
const conflicts = conflictsWithMergeCommitContract(ruleset);
|
|
821
|
+
const conflicts = conflictsWithMergeCommitContract(ruleset, deliveryLane);
|
|
726
822
|
if (conflicts.length > 0) {
|
|
727
823
|
blockers.push(`Active ruleset ${String(ruleset.name ?? ruleset.id ?? 'unknown')} ${conflicts.join(' and ')}.`);
|
|
728
824
|
}
|
|
@@ -730,27 +826,44 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
730
826
|
if (!state.ownedRuleset) {
|
|
731
827
|
changes.push(`Create ruleset ${exports.EBK_PROTECTED_BRANCH_RULESET_NAME}.`);
|
|
732
828
|
}
|
|
733
|
-
else if (
|
|
734
|
-
JSON.stringify(normalizeRuleset(desiredRuleset()))) {
|
|
829
|
+
else if (!rulesetMatchesDesired(state.ownedRuleset, deliveryLane, productionApprovalMode)) {
|
|
735
830
|
changes.push(`Update ruleset ${exports.EBK_PROTECTED_BRANCH_RULESET_NAME}.`);
|
|
736
831
|
}
|
|
737
|
-
|
|
832
|
+
if (productionApprovalMode === 'trunk-promotion') {
|
|
833
|
+
if (!state.ownedMainRuleset) {
|
|
834
|
+
changes.push(`Create ruleset ${exports.EBK_PROTECTED_MAIN_RULESET_NAME}.`);
|
|
835
|
+
}
|
|
836
|
+
else if (JSON.stringify(normalizeRuleset(state.ownedMainRuleset)) !==
|
|
837
|
+
JSON.stringify(normalizeRuleset(desiredMainRuleset()))) {
|
|
838
|
+
changes.push(`Update ruleset ${exports.EBK_PROTECTED_MAIN_RULESET_NAME}.`);
|
|
839
|
+
}
|
|
840
|
+
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.');
|
|
841
|
+
}
|
|
842
|
+
else if (state.ownedMainRuleset) {
|
|
843
|
+
changes.push(`Delete ruleset ${exports.EBK_PROTECTED_MAIN_RULESET_NAME}.`);
|
|
844
|
+
}
|
|
845
|
+
for (const topology of githubEnvironmentTopology(deploymentProfile, deliveryLane, productionApprovalMode)) {
|
|
846
|
+
const { branch, name: environment, stage } = topology;
|
|
847
|
+
const allowedBranches = [branch, ...(topology.additionalBranches ?? [])];
|
|
738
848
|
const current = state.environments[environment];
|
|
739
849
|
if (!current.exists)
|
|
740
850
|
changes.push(`Create ${environment} environment.`);
|
|
741
851
|
if (!current.customBranchPolicies) {
|
|
742
852
|
changes.push(`Enable custom deployment branch policy for ${environment}.`);
|
|
743
853
|
}
|
|
744
|
-
const extras = current.branchPolicies.filter(({ name, type }) =>
|
|
854
|
+
const extras = current.branchPolicies.filter(({ name, type }) => type !== 'branch' ||
|
|
855
|
+
!allowedBranches.includes(name));
|
|
745
856
|
if (extras.length > 0) {
|
|
746
857
|
blockers.push(`${environment} permits unexpected deployment refs: ${extras
|
|
747
858
|
.map(({ name, type }) => `${type}:${name}`)
|
|
748
859
|
.join(', ')}.`);
|
|
749
860
|
}
|
|
750
|
-
|
|
751
|
-
|
|
861
|
+
for (const allowed of allowedBranches) {
|
|
862
|
+
if (!current.branchPolicies.some(({ name, type }) => name === allowed && type === 'branch')) {
|
|
863
|
+
changes.push(`Restrict ${environment} deployment to ${allowed}.`);
|
|
864
|
+
}
|
|
752
865
|
}
|
|
753
|
-
const requiredSecrets =
|
|
866
|
+
const requiredSecrets = topology.requiredSecrets;
|
|
754
867
|
for (const secret of requiredSecrets) {
|
|
755
868
|
if (!current.secretNames.includes(secret)) {
|
|
756
869
|
blockers.push(`${environment} environment is missing ${secret}; bootstrap never creates secret values.`);
|
|
@@ -761,7 +874,7 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
761
874
|
blockers.push(`${environment} environment exposes ${secret} outside its exact capability boundary.`);
|
|
762
875
|
}
|
|
763
876
|
}
|
|
764
|
-
const requiredVariables =
|
|
877
|
+
const requiredVariables = topology.requiredVariables;
|
|
765
878
|
for (const variable of requiredVariables) {
|
|
766
879
|
if (!current.variableNames.includes(variable)) {
|
|
767
880
|
blockers.push(`${environment} environment is missing required variable ${variable}; bootstrap never creates variable values.`);
|
|
@@ -772,9 +885,8 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
772
885
|
blockers.push(`${environment} environment exposes ${variable} outside its exact capability boundary.`);
|
|
773
886
|
}
|
|
774
887
|
}
|
|
775
|
-
const stage = environmentStage(environment);
|
|
776
888
|
if (environment !== stage) {
|
|
777
|
-
const desired = desiredEnvironmentProtection(
|
|
889
|
+
const desired = desiredEnvironmentProtection(topology, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
|
|
778
890
|
if (environment === 'npm-prerelease' &&
|
|
779
891
|
productionApprovalMode === 'environment-reviewer' &&
|
|
780
892
|
desired.reviewers.length === 0) {
|
|
@@ -816,14 +928,19 @@ function evaluate(repository, state, inspectionBlockers, productionApprovalMode,
|
|
|
816
928
|
}
|
|
817
929
|
}
|
|
818
930
|
}
|
|
819
|
-
|
|
820
|
-
|
|
931
|
+
const rehearsalStage = deploymentProfile === 'starter' ? 'development' : 'staging';
|
|
932
|
+
if (state.environments[rehearsalStage].reviewers.length > 0) {
|
|
933
|
+
warnings.push(`${rehearsalStage === 'development' ? 'Development' : 'Staging'} has additional reviewer protection; bootstrap will preserve it.`);
|
|
821
934
|
}
|
|
822
935
|
return {
|
|
823
936
|
blockers: [...new Set(blockers)].sort(),
|
|
824
937
|
changes: [...new Set(changes)].sort(),
|
|
938
|
+
deploymentProfile,
|
|
825
939
|
ready: blockers.length === 0 && changes.length === 0,
|
|
826
940
|
repository,
|
|
941
|
+
...(state.repositoryIdentity
|
|
942
|
+
? { repositoryIdentity: state.repositoryIdentity }
|
|
943
|
+
: {}),
|
|
827
944
|
productionApprovalMode,
|
|
828
945
|
warnings: [...new Set(warnings)].sort(),
|
|
829
946
|
};
|
|
@@ -885,11 +1002,14 @@ function normalizeRuleset(ruleset) {
|
|
|
885
1002
|
function existingReviewerPayload(ids) {
|
|
886
1003
|
return ids.map((id) => ({ id, type: 'User' }));
|
|
887
1004
|
}
|
|
888
|
-
function rulesetMatchesDesired(ruleset) {
|
|
1005
|
+
function rulesetMatchesDesired(ruleset, deliveryLane = 'protected-pair', productionApprovalMode = 'promotion-pr') {
|
|
889
1006
|
return (JSON.stringify(normalizeRuleset(ruleset)) ===
|
|
890
|
-
JSON.stringify(normalizeRuleset(desiredRuleset())));
|
|
1007
|
+
JSON.stringify(normalizeRuleset(desiredRuleset(deliveryLane, productionApprovalMode))));
|
|
891
1008
|
}
|
|
892
|
-
async function applyChanges(api, repositoryPath, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds) {
|
|
1009
|
+
async function applyChanges(api, repositoryPath, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane = 'protected-pair') {
|
|
1010
|
+
if (requiresImmutableOidcSubjectCutover(state)) {
|
|
1011
|
+
await api.request('PUT', `${repositoryPath}/actions/oidc/customization/sub`, { use_default: true, use_immutable_subject: true });
|
|
1012
|
+
}
|
|
893
1013
|
if (state.repo.allow_merge_commit !== true ||
|
|
894
1014
|
state.repo.allow_rebase_merge !== false ||
|
|
895
1015
|
state.repo.allow_squash_merge !== false) {
|
|
@@ -899,19 +1019,36 @@ async function applyChanges(api, repositoryPath, state, productionApprovalMode,
|
|
|
899
1019
|
allow_squash_merge: false,
|
|
900
1020
|
});
|
|
901
1021
|
}
|
|
902
|
-
const desired = desiredRuleset();
|
|
1022
|
+
const desired = desiredRuleset(deliveryLane, productionApprovalMode);
|
|
903
1023
|
if (state.ownedRuleset &&
|
|
904
1024
|
typeof state.ownedRuleset.id === 'number' &&
|
|
905
|
-
!rulesetMatchesDesired(state.ownedRuleset)) {
|
|
1025
|
+
!rulesetMatchesDesired(state.ownedRuleset, deliveryLane, productionApprovalMode)) {
|
|
906
1026
|
await api.request('PUT', `${repositoryPath}/rulesets/${state.ownedRuleset.id}`, desired);
|
|
907
1027
|
}
|
|
908
1028
|
else if (!state.ownedRuleset) {
|
|
909
1029
|
await api.request('POST', `${repositoryPath}/rulesets`, desired);
|
|
910
1030
|
}
|
|
911
|
-
|
|
1031
|
+
if (productionApprovalMode === 'trunk-promotion') {
|
|
1032
|
+
const desiredMain = desiredMainRuleset();
|
|
1033
|
+
if (state.ownedMainRuleset &&
|
|
1034
|
+
typeof state.ownedMainRuleset.id === 'number' &&
|
|
1035
|
+
JSON.stringify(normalizeRuleset(state.ownedMainRuleset)) !==
|
|
1036
|
+
JSON.stringify(normalizeRuleset(desiredMain))) {
|
|
1037
|
+
await api.request('PUT', `${repositoryPath}/rulesets/${state.ownedMainRuleset.id}`, desiredMain);
|
|
1038
|
+
}
|
|
1039
|
+
else if (!state.ownedMainRuleset) {
|
|
1040
|
+
await api.request('POST', `${repositoryPath}/rulesets`, desiredMain);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
else if (state.ownedMainRuleset &&
|
|
1044
|
+
typeof state.ownedMainRuleset.id === 'number') {
|
|
1045
|
+
await api.request('DELETE', `${repositoryPath}/rulesets/${state.ownedMainRuleset.id}`);
|
|
1046
|
+
}
|
|
1047
|
+
for (const topology of githubEnvironmentTopology(deploymentProfile, deliveryLane, productionApprovalMode)) {
|
|
1048
|
+
const { branch, name: environment, stage } = topology;
|
|
1049
|
+
const allowedBranches = [branch, ...(topology.additionalBranches ?? [])];
|
|
912
1050
|
const current = state.environments[environment];
|
|
913
|
-
const
|
|
914
|
-
const desiredProtection = desiredEnvironmentProtection(environment, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
|
|
1051
|
+
const desiredProtection = desiredEnvironmentProtection(topology, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
|
|
915
1052
|
const reviewers = desiredProtection.reviewers;
|
|
916
1053
|
const desiredPreventSelfReview = desiredProtection.preventSelfReview;
|
|
917
1054
|
const desiredWaitTimer = desiredProtection.waitTimer;
|
|
@@ -941,19 +1078,25 @@ async function applyChanges(api, repositoryPath, state, productionApprovalMode,
|
|
|
941
1078
|
: {}),
|
|
942
1079
|
});
|
|
943
1080
|
}
|
|
944
|
-
|
|
945
|
-
|
|
1081
|
+
for (const allowed of allowedBranches) {
|
|
1082
|
+
if (!current.branchPolicies.some(({ name, type }) => name === allowed && type === 'branch')) {
|
|
1083
|
+
await api.request('POST', `${repositoryPath}/environments/${encodeURIComponent(environment)}/deployment-branch-policies`, { name: allowed, type: 'branch' });
|
|
1084
|
+
}
|
|
946
1085
|
}
|
|
947
1086
|
}
|
|
948
1087
|
}
|
|
949
1088
|
async function runGitHubBootstrap(options) {
|
|
950
1089
|
const repository = options.repository.trim();
|
|
1090
|
+
const deploymentProfile = options.deploymentProfile ?? 'fully-isolated';
|
|
951
1091
|
const { owner, repo } = parseRepository(repository);
|
|
952
1092
|
if (!options.token.trim()) {
|
|
953
1093
|
throw new Error('GH_TOKEN or GITHUB_TOKEN is required for GitHub bootstrap.');
|
|
954
1094
|
}
|
|
955
1095
|
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
|
|
1096
|
+
throw new Error('Production approval mode must be the explicit committed value promotion-pr, environment-reviewer, or trunk-promotion.');
|
|
1097
|
+
}
|
|
1098
|
+
if (!index_js_1.DEPLOYMENT_PROFILES.includes(deploymentProfile)) {
|
|
1099
|
+
throw new Error('Deployment profile must be starter, production-isolated, or fully-isolated.');
|
|
957
1100
|
}
|
|
958
1101
|
const productionReviewerIds = [
|
|
959
1102
|
...new Set(options.productionReviewerIds ?? []),
|
|
@@ -973,15 +1116,26 @@ async function runGitHubBootstrap(options) {
|
|
|
973
1116
|
}
|
|
974
1117
|
const api = new GitHubApi(options.apiBaseUrl?.trim() || 'https://api.github.com', options.token);
|
|
975
1118
|
const repositoryPath = `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`;
|
|
976
|
-
const
|
|
977
|
-
const
|
|
1119
|
+
const deliveryLane = options.deliveryLane ?? 'protected-pair';
|
|
1120
|
+
const initial = await inspect(api, repositoryPath, options.productionApprovalMode, deploymentProfile, deliveryLane);
|
|
1121
|
+
const report = evaluate(repository, initial.state, initial.blockers, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane);
|
|
978
1122
|
if (!options.apply)
|
|
979
1123
|
return report;
|
|
980
1124
|
if (report.blockers.length > 0) {
|
|
981
1125
|
throw new Error(`GitHub bootstrap apply is blocked:\n- ${report.blockers.join('\n- ')}`);
|
|
982
1126
|
}
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
1127
|
+
if (requiresImmutableOidcSubjectCutover(initial.state)) {
|
|
1128
|
+
const identity = initial.state.repositoryIdentity;
|
|
1129
|
+
if (!identity) {
|
|
1130
|
+
throw new Error('GitHub bootstrap cannot acknowledge immutable OIDC trust without the inspected repository identity.');
|
|
1131
|
+
}
|
|
1132
|
+
const expectedAcknowledgement = immutableOidcTrustAcknowledgement(identity);
|
|
1133
|
+
if (options.immutableOidcTrustAcknowledgement !== expectedAcknowledgement) {
|
|
1134
|
+
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.`);
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
await applyChanges(api, repositoryPath, initial.state, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane);
|
|
1138
|
+
const completed = await inspect(api, repositoryPath, options.productionApprovalMode, deploymentProfile, deliveryLane);
|
|
1139
|
+
return evaluate(repository, completed.state, completed.blockers, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds, deploymentProfile, deliveryLane);
|
|
986
1140
|
}
|
|
987
1141
|
//# sourceMappingURL=github-bootstrap.js.map
|