@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.
Files changed (791) hide show
  1. package/README.md +18 -0
  2. package/executors.json +21 -1
  3. package/generators.json +10 -0
  4. package/package.json +31 -7
  5. package/src/aws/child-environment.d.ts +10 -0
  6. package/src/aws/child-environment.js +77 -0
  7. package/src/aws/identity.d.ts +13 -0
  8. package/src/aws/identity.js +41 -0
  9. package/src/aws-authority/index.d.ts +2 -0
  10. package/src/aws-authority/index.js +6 -0
  11. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  12. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  13. package/src/aws-authority/stage-authority.d.ts +248 -0
  14. package/src/aws-authority/stage-authority.js +3558 -0
  15. package/src/blueprints/external-sandbox.js +21 -9
  16. package/src/blueprints/manifest.d.ts +1 -1
  17. package/src/blueprints/resolver.js +28 -15
  18. package/src/cli/bootstrap.d.ts +1 -1
  19. package/src/cli/deploy-runtime.d.ts +6 -0
  20. package/src/cli/deploy-runtime.js +58 -0
  21. package/src/cli/dev-command.d.ts +16 -4
  22. package/src/cli/dev-command.js +63 -0
  23. package/src/cli/main.d.ts +9 -1
  24. package/src/cli/main.js +139 -20
  25. package/src/cli/output.d.ts +1 -1
  26. package/src/cli/output.js +1 -1
  27. package/src/developer-agent/context.js +41 -9
  28. package/src/developer-agent/generator-planning.js +20 -6
  29. package/src/developer-agent/git-inspection.d.ts +6 -2
  30. package/src/developer-agent/git-inspection.js +78 -6
  31. package/src/developer-agent/model.d.ts +5 -3
  32. package/src/developer-agent/model.js +4 -4
  33. package/src/developer-agent/operation-registry.d.ts +5 -0
  34. package/src/developer-agent/operation-registry.js +286 -40
  35. package/src/developer-agent/planning.js +16 -13
  36. package/src/developer-agent/preview-changes.d.ts +2 -0
  37. package/src/developer-agent/preview-changes.js +14 -2
  38. package/src/developer-agent/preview-source.js +3 -0
  39. package/src/developer-agent/validation.js +25 -9
  40. package/src/developer-agent/workspace-inspection.js +60 -5
  41. package/src/executors/blueprint-trust/blueprint-trust.js +6 -0
  42. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  43. package/src/executors/deployment-plan/deployment-plan.js +57 -2
  44. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  45. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  46. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  47. package/src/executors/dev-task-cleanup/schema.json +9 -0
  48. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  49. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  50. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  51. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  52. package/src/executors/fleet/fleet.js +1 -1
  53. package/src/executors/foundation-preflight/foundation-preflight.d.ts +1 -0
  54. package/src/executors/foundation-preflight/foundation-preflight.js +6 -2
  55. package/src/executors/foundation-preflight/schema.json +5 -0
  56. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.d.ts +13 -2
  57. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js +95 -31
  58. package/src/executors/foundation-profile-preflight/production-database-safeguard.d.ts +65 -0
  59. package/src/executors/foundation-profile-preflight/production-database-safeguard.js +223 -0
  60. package/src/executors/foundation-profile-preflight/schema.json +15 -4
  61. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.d.ts +11 -1
  62. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +70 -20
  63. package/src/executors/foundation-remove-preflight/schema.json +6 -1
  64. package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
  65. package/src/executors/github-bootstrap/github-bootstrap.js +3 -0
  66. package/src/executors/github-bootstrap/schema.json +7 -1
  67. package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +29 -136
  68. package/src/executors/infrastructure-plan/infrastructure-plan.js +230 -3282
  69. package/src/executors/infrastructure-plan/schema.json +12 -52
  70. package/src/executors/local-deploy/federated-credential-transport.d.ts +48 -0
  71. package/src/executors/local-deploy/federated-credential-transport.js +252 -0
  72. package/src/executors/local-deploy/local-approval.d.ts +18 -0
  73. package/src/executors/local-deploy/local-approval.js +39 -0
  74. package/src/executors/local-deploy/local-deploy.d.ts +112 -0
  75. package/src/executors/local-deploy/local-deploy.js +1404 -0
  76. package/src/executors/local-deploy/schema.json +70 -0
  77. package/src/executors/refresh/refresh.js +2 -2
  78. package/src/executors/remove/remove.js +2 -2
  79. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.d.ts +42 -0
  80. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +1229 -0
  81. package/src/executors/router-waf-rehearsal/schema.json +29 -0
  82. package/src/executors/secret-initialize/schema.json +42 -0
  83. package/src/executors/secret-initialize/secret-initialize.d.ts +34 -0
  84. package/src/executors/secret-initialize/secret-initialize.js +297 -0
  85. package/src/executors/secret-metadata/schema.json +5 -0
  86. package/src/executors/secret-metadata/secret-metadata.d.ts +16 -2
  87. package/src/executors/secret-metadata/secret-metadata.js +129 -30
  88. package/src/executors/sst-lifecycle/generated-secret-retirement.d.ts +53 -0
  89. package/src/executors/sst-lifecycle/generated-secret-retirement.js +192 -0
  90. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +48 -0
  91. package/src/executors/sst-lifecycle/governed-native-operation.js +162 -0
  92. package/src/executors/sst-lifecycle/logging-preflight.d.ts +5 -0
  93. package/src/executors/sst-lifecycle/logging-preflight.js +23 -13
  94. package/src/executors/sst-lifecycle/run-sst-command.d.ts +40 -6
  95. package/src/executors/sst-lifecycle/run-sst-command.js +779 -70
  96. package/src/executors/sst-lifecycle/schema.json +8 -1
  97. package/src/executors/sst-lifecycle/secret-preflight.d.ts +2 -0
  98. package/src/executors/sst-lifecycle/secret-preflight.js +13 -7
  99. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +33 -0
  100. package/src/executors/sst-lifecycle/sst-environment-source.js +267 -0
  101. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  102. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  103. package/src/executors/unlock/unlock.js +2 -2
  104. package/src/foundation/capability-plan.d.ts +43 -0
  105. package/src/foundation/capability-plan.js +168 -0
  106. package/src/foundation/discovery.d.ts +14 -11
  107. package/src/foundation/discovery.js +32 -6
  108. package/src/foundation/index.d.ts +4 -0
  109. package/src/foundation/index.js +11 -0
  110. package/src/foundation/local-database-contract.d.ts +20 -0
  111. package/src/foundation/local-database-contract.js +262 -13
  112. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  113. package/src/foundation/local-private-smoke-access.js +197 -0
  114. package/src/foundation/logging-preflight.js +1 -1
  115. package/src/foundation/logging.d.ts +3 -1
  116. package/src/foundation/logging.js +1 -1
  117. package/src/foundation/partial-state.d.ts +10 -0
  118. package/src/foundation/partial-state.js +21 -0
  119. package/src/foundation/preflight.js +37 -18
  120. package/src/foundation/private-smoke-access.d.ts +25 -0
  121. package/src/foundation/private-smoke-access.js +135 -0
  122. package/src/foundation/private-smoke-admission.d.ts +45 -0
  123. package/src/foundation/private-smoke-admission.js +180 -0
  124. package/src/foundation/private-smoke-control-plane.d.ts +18 -0
  125. package/src/foundation/private-smoke-control-plane.js +184 -0
  126. package/src/foundation/provision-database-bindings.d.ts +5 -0
  127. package/src/foundation/provision-database-bindings.js +41 -8
  128. package/src/foundation/provision-logical-database.js +15 -8
  129. package/src/foundation/requirements.d.ts +3 -3
  130. package/src/foundation/requirements.js +24 -12
  131. package/src/foundation/router-waf-rate-rehearsal.d.ts +97 -0
  132. package/src/foundation/router-waf-rate-rehearsal.js +210 -0
  133. package/src/foundation/router-waf.d.ts +149 -0
  134. package/src/foundation/router-waf.js +809 -0
  135. package/src/foundation/stages.d.ts +1 -0
  136. package/src/foundation/stages.js +11 -0
  137. package/src/generators/blueprint/blueprint.d.ts +5 -0
  138. package/src/generators/blueprint/blueprint.js +102 -0
  139. package/src/generators/blueprint/files.d.ts +6 -0
  140. package/src/generators/blueprint/files.js +217 -0
  141. package/src/generators/blueprint/schema.d.ts +4 -0
  142. package/src/generators/blueprint/schema.json +18 -0
  143. package/src/generators/formatting.d.ts +8 -0
  144. package/src/generators/formatting.js +141 -0
  145. package/src/generators/function/function.js +38 -17
  146. package/src/generators/logging-registry.d.ts +2 -0
  147. package/src/generators/logging-registry.js +22 -0
  148. package/src/generators/post-generation-install.js +2 -2
  149. package/src/generators/preset/dependency-overrides.d.ts +8 -0
  150. package/src/generators/preset/dependency-overrides.js +55 -0
  151. package/src/generators/preset/generator.js +43 -3
  152. package/src/generators/preset/schema.d.ts +10 -0
  153. package/src/generators/preset/schema.json +47 -0
  154. package/src/generators/preset/tool-versions.d.ts +2 -0
  155. package/src/generators/preset/tool-versions.js +3 -1
  156. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  157. package/src/generators/preset/workspace-files-adopter-skills.js +303 -0
  158. package/src/generators/preset/workspace-files-ci-acceptance.d.ts +1 -0
  159. package/src/generators/preset/workspace-files-ci-acceptance.js +791 -0
  160. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  161. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  162. package/src/generators/preset/workspace-files-developer-agent.d.ts +2 -0
  163. package/src/generators/preset/workspace-files-developer-agent.js +90 -28
  164. package/src/generators/preset/workspace-files-ecr-inspector.d.ts +18 -0
  165. package/src/generators/preset/workspace-files-ecr-inspector.js +298 -0
  166. package/src/generators/preset/workspace-files-foundation-workload-roles.js +5 -2
  167. package/src/generators/preset/workspace-files-performance-cost.d.ts +2 -2
  168. package/src/generators/preset/workspace-files-performance-cost.js +8 -8
  169. package/src/generators/preset/workspace-files-performance-load.d.ts +1 -1
  170. package/src/generators/preset/workspace-files-performance-load.js +39 -25
  171. package/src/generators/preset/workspace-files-stage-authority.d.ts +6 -0
  172. package/src/generators/preset/workspace-files-stage-authority.js +518 -0
  173. package/src/generators/preset/workspace-files-thin-deploy.d.ts +55 -0
  174. package/src/generators/preset/workspace-files-thin-deploy.js +2473 -0
  175. package/src/generators/preset/workspace-files-thin-docs.d.ts +7 -0
  176. package/src/generators/preset/workspace-files-thin-docs.js +352 -0
  177. package/src/generators/preset/workspace-files-thin-release.d.ts +14 -0
  178. package/src/generators/preset/workspace-files-thin-release.js +26 -0
  179. package/src/generators/preset/workspace-files-workload-role-baseline.js +254 -42
  180. package/src/generators/preset/workspace-files.d.ts +18 -2
  181. package/src/generators/preset/workspace-files.js +1504 -608
  182. package/src/generators/repository-policy/repository-policy.js +235 -5
  183. package/src/generators/repository-policy/schema.d.ts +10 -0
  184. package/src/generators/repository-policy/schema.json +80 -4
  185. package/src/generators/repository-policy/tree-policy.d.ts +3 -0
  186. package/src/generators/repository-policy/tree-policy.js +25 -0
  187. package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
  188. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  189. package/src/generators/slice/built-in-plan-api-files.js +130 -414
  190. package/src/generators/slice/built-in-plan-async-work-files.js +166 -1969
  191. package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
  192. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +60 -2
  193. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  194. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  195. package/src/generators/slice/built-in-plan-background-work-files.d.ts +2 -0
  196. package/src/generators/slice/built-in-plan-background-work-files.js +99 -0
  197. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  198. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +5 -31
  199. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  200. package/src/generators/slice/built-in-plan-data-files.js +163 -1196
  201. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  202. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +37 -2
  203. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2443
  204. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +50 -8
  205. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  206. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +44 -25
  207. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +20 -1
  208. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  209. package/src/generators/slice/built-in-plan-foundation-files.js +39 -18
  210. package/src/generators/slice/built-in-plan-frontend-files.js +7 -3
  211. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  212. package/src/generators/slice/built-in-plan-infrastructure-files.js +933 -729
  213. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +67 -11
  214. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  215. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  216. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  217. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  218. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  219. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  220. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  221. package/src/generators/slice/built-in-plan-key-value-delivery.js +137 -0
  222. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  223. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  224. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  225. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  226. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  227. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  228. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  229. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  230. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  231. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  232. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  233. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  234. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  235. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  236. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  237. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  238. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  239. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  240. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  241. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  242. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  243. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  244. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  245. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  246. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  247. package/src/generators/slice/built-in-plan-metadata-files.js +157 -28
  248. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +2 -0
  249. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +324 -0
  250. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  251. package/src/generators/slice/built-in-plan-operations-files.js +585 -97
  252. package/src/generators/slice/built-in-plan-performance-files.d.ts +2 -1
  253. package/src/generators/slice/built-in-plan-performance-files.js +220 -1074
  254. package/src/generators/slice/built-in-plan-project-files.js +141 -135
  255. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  256. package/src/generators/slice/built-in-plan-release-files.js +310 -70
  257. package/src/generators/slice/built-in-plan-reliability-files.d.ts +1 -1
  258. package/src/generators/slice/built-in-plan-reliability-files.js +279 -43
  259. package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +1 -1
  260. package/src/generators/slice/built-in-plan-secret-runtime-files.js +87 -76
  261. package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
  262. package/src/generators/slice/built-in-plan-shared.js +41 -19
  263. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  264. package/src/generators/slice/built-in-plan-sql-events.js +276 -0
  265. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  266. package/src/generators/slice/built-in-plan-testing-files.js +304 -172
  267. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  268. package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
  269. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +11 -0
  270. package/src/generators/slice/built-in-plan-thin-release-files.js +162 -0
  271. package/src/generators/slice/built-in-plan-verification-files.js +76 -2
  272. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  273. package/src/generators/slice/built-in-plan-web-files.js +223 -16
  274. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  275. package/src/generators/slice/built-in-plan-workload-role-files.js +143 -279
  276. package/src/generators/slice/built-in-plan.d.ts +11 -1
  277. package/src/generators/slice/built-in-plan.js +80 -29
  278. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  279. package/src/generators/slice/data-policy-review-seed.js +22 -0
  280. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  281. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  282. package/src/generators/slice/local-source-identity.d.ts +2 -0
  283. package/src/generators/slice/local-source-identity.js +31 -0
  284. package/src/generators/slice/persistence-contract.d.ts +14 -0
  285. package/src/generators/slice/persistence-contract.js +32 -0
  286. package/src/generators/slice/slice.js +61 -50
  287. package/src/generators/sql/schema.d.ts +7 -0
  288. package/src/generators/sql/schema.json +38 -0
  289. package/src/generators/sql/sql.d.ts +6 -0
  290. package/src/generators/sql/sql.js +53 -0
  291. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  292. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  293. package/src/generators/upgrade/upgrade.d.ts +15 -1
  294. package/src/generators/upgrade/upgrade.js +435 -44
  295. package/src/generators/workload/performance-registration.d.ts +1 -0
  296. package/src/generators/workload/performance-registration.js +9 -11
  297. package/src/generators/workload/service-performance-files.d.ts +1 -0
  298. package/src/generators/workload/service-performance-files.js +27 -7
  299. package/src/generators/workload/workload.d.ts +1 -1
  300. package/src/generators/workload/workload.js +105 -29
  301. package/src/git-policy/action-pins.d.ts +5 -0
  302. package/src/git-policy/action-pins.js +5 -0
  303. package/src/git-policy/github-bootstrap.d.ts +39 -8
  304. package/src/git-policy/github-bootstrap.js +329 -175
  305. package/src/git-policy/routing.d.ts +7 -1
  306. package/src/git-policy/routing.js +62 -1
  307. package/src/index.d.ts +1 -0
  308. package/src/index.js +1 -0
  309. package/src/infrastructure-change/local-capability.d.ts +73 -0
  310. package/src/infrastructure-change/local-capability.js +114 -0
  311. package/src/infrastructure-change/model.d.ts +25 -4
  312. package/src/infrastructure-change/model.js +1 -0
  313. package/src/infrastructure-change/normalize.d.ts +4 -0
  314. package/src/infrastructure-change/normalize.js +47 -7
  315. package/src/infrastructure-change/plan.d.ts +30 -3
  316. package/src/infrastructure-change/plan.js +323 -13
  317. package/src/infrastructure-change/risk.d.ts +3 -1
  318. package/src/infrastructure-change/risk.js +96 -16
  319. package/src/local-dev/browser-verification.d.ts +37 -0
  320. package/src/local-dev/browser-verification.js +281 -0
  321. package/src/local-dev/contracts.d.ts +10 -1
  322. package/src/local-dev/contracts.js +114 -13
  323. package/src/local-dev/dev-command-core.js +24 -5
  324. package/src/local-dev/docker-credential-health.d.ts +14 -0
  325. package/src/local-dev/docker-credential-health.js +94 -0
  326. package/src/local-dev/environment-inspector.d.ts +7 -0
  327. package/src/local-dev/environment-inspector.js +42 -15
  328. package/src/local-dev/environment-state.js +2 -2
  329. package/src/local-dev/errors.d.ts +1 -1
  330. package/src/local-dev/errors.js +2 -0
  331. package/src/local-dev/fleet-client.js +2 -2
  332. package/src/local-dev/fleet-configuration.js +57 -25
  333. package/src/local-dev/fleet-inventory.js +46 -18
  334. package/src/local-dev/fleet-ipc.d.ts +7 -0
  335. package/src/local-dev/fleet-ipc.js +14 -2
  336. package/src/local-dev/fleet-launcher.d.ts +6 -0
  337. package/src/local-dev/fleet-launcher.js +14 -2
  338. package/src/local-dev/fleet-logs.js +50 -22
  339. package/src/local-dev/fleet-process.d.ts +20 -1
  340. package/src/local-dev/fleet-process.js +197 -41
  341. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  342. package/src/local-dev/fleet-runner-evidence.js +56 -0
  343. package/src/local-dev/fleet-runtime.js +268 -229
  344. package/src/local-dev/fleet-session.d.ts +2 -0
  345. package/src/local-dev/fleet-session.js +28 -11
  346. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  347. package/src/local-dev/fleet-state.d.ts +5 -2
  348. package/src/local-dev/fleet-state.js +25 -4
  349. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  350. package/src/local-dev/fleet-supervisor.js +66 -11
  351. package/src/local-dev/fleet-web-start.d.ts +12 -0
  352. package/src/local-dev/fleet-web-start.js +48 -0
  353. package/src/local-dev/identity.js +3 -14
  354. package/src/local-dev/index.d.ts +1 -0
  355. package/src/local-dev/index.js +1 -0
  356. package/src/local-dev/native-completion.d.ts +9 -0
  357. package/src/local-dev/native-completion.js +130 -0
  358. package/src/local-dev/nx-workspace.d.ts +4 -2
  359. package/src/local-dev/nx-workspace.js +11 -6
  360. package/src/local-dev/personal-stage.d.ts +4 -5
  361. package/src/local-dev/personal-stage.js +6 -54
  362. package/src/local-dev/port-claims.d.ts +13 -0
  363. package/src/local-dev/port-claims.js +46 -0
  364. package/src/local-dev/ports.d.ts +14 -2
  365. package/src/local-dev/ports.js +78 -3
  366. package/src/local-dev/private-state.d.ts +11 -0
  367. package/src/local-dev/private-state.js +146 -40
  368. package/src/local-dev/process-group.d.ts +4 -0
  369. package/src/local-dev/process-group.js +29 -0
  370. package/src/local-dev/process-identity.d.ts +8 -0
  371. package/src/local-dev/process-identity.js +31 -1
  372. package/src/local-dev/proxy.js +11 -12
  373. package/src/local-dev/runtime-paths.js +1 -1
  374. package/src/local-dev/slice-claim.js +1 -1
  375. package/src/local-dev/slice-runner.d.ts +15 -6
  376. package/src/local-dev/slice-runner.js +189 -54
  377. package/src/local-dev/task-attachment.d.ts +17 -0
  378. package/src/local-dev/task-attachment.js +73 -0
  379. package/src/local-dev/task-authority.d.ts +10 -0
  380. package/src/local-dev/task-authority.js +27 -0
  381. package/src/local-dev/task-identity.d.ts +33 -0
  382. package/src/local-dev/task-identity.js +418 -0
  383. package/src/local-dev/task-native-writer.d.ts +18 -0
  384. package/src/local-dev/task-native-writer.js +329 -0
  385. package/src/local-dev/tls.js +8 -2
  386. package/src/local-dev/web-launch.d.ts +9 -0
  387. package/src/local-dev/web-launch.js +130 -0
  388. package/src/ownership/composition.d.ts +2 -1
  389. package/src/ownership/composition.js +1 -0
  390. package/src/performance/cost-collection.d.ts +1 -1
  391. package/src/performance/cost-collection.js +4 -2
  392. package/src/performance/cost-controls.d.ts +8 -4
  393. package/src/performance/cost-controls.js +39 -28
  394. package/src/performance/evidence.d.ts +1 -1
  395. package/src/performance/evidence.js +5 -3
  396. package/src/performance/load-safety.js +5 -3
  397. package/src/performance/model.d.ts +4 -4
  398. package/src/performance/model.js +4 -5
  399. package/src/performance/scenario.d.ts +22 -0
  400. package/src/performance/scenario.js +100 -92
  401. package/src/release/index.d.ts +0 -2
  402. package/src/release/index.js +0 -2
  403. package/src/release/source-authority.d.ts +5 -5
  404. package/src/release/source-authority.js +141 -124
  405. package/src/repository-policy/aurora-preflight.d.ts +1 -1
  406. package/src/repository-policy/aurora-preflight.js +4 -1
  407. package/src/repository-policy/capacity-migration.d.ts +3 -0
  408. package/src/repository-policy/capacity-migration.js +21 -0
  409. package/src/repository-policy/deployment-plan.d.ts +4 -1
  410. package/src/repository-policy/deployment-plan.js +9 -0
  411. package/src/repository-policy/foundation-profile.js +10 -1
  412. package/src/repository-policy/policy.d.ts +57 -3
  413. package/src/repository-policy/policy.js +497 -11
  414. package/src/schemas/blueprint-v1.json +5 -4
  415. package/src/schemas/foundation-requirement-v1.json +5 -4
  416. package/src/schemas/performance-policy-v1.json +3 -3
  417. package/src/schemas/repository-policy-v1.json +130 -6
  418. package/src/schemas/testing-evidence-result-v1.json +1 -1
  419. package/src/secrets/adapters.d.ts +7 -2
  420. package/src/secrets/adapters.js +34 -3
  421. package/src/secrets/aws-control-plane.d.ts +10 -1
  422. package/src/secrets/aws-control-plane.js +67 -0
  423. package/src/secrets/generated-aws-control-plane.d.ts +23 -0
  424. package/src/secrets/generated-aws-control-plane.js +259 -0
  425. package/src/secrets/metadata.js +38 -10
  426. package/src/secrets/model.d.ts +8 -1
  427. package/src/secrets/model.js +24 -3
  428. package/src/secrets/operator.d.ts +91 -3
  429. package/src/secrets/operator.js +463 -13
  430. package/src/secrets/registry.d.ts +2 -1
  431. package/src/secrets/registry.js +18 -1
  432. package/src/secrets/verification.js +9 -1
  433. package/src/secrets/workload-access.js +10 -2
  434. package/src/sst-environment-source-format.d.ts +6 -0
  435. package/src/sst-environment-source-format.js +199 -0
  436. package/src/supply-chain/action-pins.js +61 -7
  437. package/src/supply-chain/blueprint-trust-git.js +85 -24
  438. package/src/supply-chain/blueprint-verification-authority.js +55 -3
  439. package/src/supply-chain/build-output-bounds.d.ts +2 -0
  440. package/src/supply-chain/build-output-bounds.js +12 -0
  441. package/src/supply-chain/build-output.d.ts +7 -1
  442. package/src/supply-chain/build-output.js +177 -24
  443. package/src/supply-chain/ecr-scanning.d.ts +5 -3
  444. package/src/supply-chain/ecr-scanning.js +11 -7
  445. package/src/supply-chain/ecs-deployed-image.d.ts +5 -3
  446. package/src/supply-chain/ecs-deployed-image.js +6 -4
  447. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  448. package/src/supply-chain/generated-command.js +1 -0
  449. package/src/supply-chain/generated-container-release-command.js +1285 -124
  450. package/src/supply-chain/generated-ecr-collector-command.d.ts +0 -1
  451. package/src/supply-chain/generated-ecr-collector-command.js +200 -93
  452. package/src/supply-chain/generated-files.js +25 -14
  453. package/src/supply-chain/generated-scanner-command.js +2 -1
  454. package/src/supply-chain/index.d.ts +1 -1
  455. package/src/supply-chain/index.js +2 -1
  456. package/src/supply-chain/sbom.d.ts +1 -1
  457. package/src/supply-chain/sbom.js +30 -5
  458. package/src/supply-chain/scanner.js +3 -0
  459. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  460. package/src/testing-evidence/fixture-scope.js +4 -2
  461. package/src/testing-evidence/result.d.ts +2 -1
  462. package/src/testing-evidence/result.js +18 -4
  463. package/src/workload-roles/account-baseline.d.ts +11 -0
  464. package/src/workload-roles/account-baseline.js +253 -16
  465. package/src/workload-roles/authority.d.ts +3 -1
  466. package/src/workload-roles/authority.js +48 -2
  467. package/src/workload-roles/aws-s3-state.js +27 -0
  468. package/src/workload-roles/boundary.d.ts +2 -1
  469. package/src/workload-roles/boundary.js +9 -2
  470. package/src/workload-roles/handler.js +52 -24
  471. package/src/workload-roles/index.d.ts +10 -17
  472. package/src/workload-roles/index.js +5 -18
  473. package/src/workload-roles/injection.js +1 -1
  474. package/src/workload-roles/provisioner.js +12 -4
  475. package/src/workload-roles/registration.d.ts +1 -0
  476. package/src/workload-roles/registration.js +5 -0
  477. package/src/workload-roles/stage-boundary.js +1 -1
  478. package/src/workload-roles/standard-slice.js +3 -3
  479. package/src/workspace-deployment/affected-lifecycle.d.ts +53 -0
  480. package/src/workspace-deployment/affected-lifecycle.js +84 -0
  481. package/src/workspace-deployment/identity.d.ts +3 -0
  482. package/src/workspace-deployment/identity.js +22 -0
  483. package/src/workspace-deployment/index.d.ts +4 -0
  484. package/src/workspace-deployment/index.js +8 -0
  485. package/src/workspace-deployment/migration-evidence.d.ts +29 -0
  486. package/src/workspace-deployment/migration-evidence.js +83 -0
  487. package/src/workspace-deployment/migration.d.ts +27 -0
  488. package/src/workspace-deployment/migration.js +109 -0
  489. package/src/workspace-deployment/ownership.d.ts +81 -0
  490. package/src/workspace-deployment/ownership.js +381 -0
  491. package/src/api-contract/baseline-update.js.map +0 -1
  492. package/src/api-contract/compatibility.js.map +0 -1
  493. package/src/api-contract/contract-graph.js.map +0 -1
  494. package/src/api-contract/evidence.js.map +0 -1
  495. package/src/api-contract/index.js.map +0 -1
  496. package/src/api-contract/model.fixtures.d.ts +0 -2
  497. package/src/api-contract/model.fixtures.js +0 -81
  498. package/src/api-contract/model.fixtures.js.map +0 -1
  499. package/src/api-contract/model.js.map +0 -1
  500. package/src/api-contract/rollout.js.map +0 -1
  501. package/src/authorization/compatibility.js.map +0 -1
  502. package/src/authorization/index.js.map +0 -1
  503. package/src/blueprints/execution.js.map +0 -1
  504. package/src/blueprints/external-sandbox.js.map +0 -1
  505. package/src/blueprints/index.js.map +0 -1
  506. package/src/blueprints/inputs.js.map +0 -1
  507. package/src/blueprints/manifest.js.map +0 -1
  508. package/src/blueprints/resolver.js.map +0 -1
  509. package/src/blueprints/transitions.js.map +0 -1
  510. package/src/cli/agent-command.js.map +0 -1
  511. package/src/cli/agent-runtime.js.map +0 -1
  512. package/src/cli/blueprint-authority.js.map +0 -1
  513. package/src/cli/blueprint-command.js.map +0 -1
  514. package/src/cli/bootstrap.js.map +0 -1
  515. package/src/cli/dev-command.js.map +0 -1
  516. package/src/cli/main.js.map +0 -1
  517. package/src/cli/output.js.map +0 -1
  518. package/src/cli/personal-secret-runtime.js.map +0 -1
  519. package/src/cli/secret-terminal.js.map +0 -1
  520. package/src/container-images.js.map +0 -1
  521. package/src/data-lifecycle/index.js.map +0 -1
  522. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  523. package/src/data-lifecycle/model.fixtures.js +0 -244
  524. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  525. package/src/data-lifecycle/model.js.map +0 -1
  526. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  527. package/src/data-lifecycle/validation.js.map +0 -1
  528. package/src/database-retirement/contract.js.map +0 -1
  529. package/src/database-retirement/index.js.map +0 -1
  530. package/src/deterministic-order.js.map +0 -1
  531. package/src/developer-agent/context.js.map +0 -1
  532. package/src/developer-agent/generator-planning.js.map +0 -1
  533. package/src/developer-agent/generator-preview.js.map +0 -1
  534. package/src/developer-agent/git-inspection.js.map +0 -1
  535. package/src/developer-agent/handoff.js.map +0 -1
  536. package/src/developer-agent/index.js.map +0 -1
  537. package/src/developer-agent/model.js.map +0 -1
  538. package/src/developer-agent/operation-registry.js.map +0 -1
  539. package/src/developer-agent/ordering.js.map +0 -1
  540. package/src/developer-agent/planning.js.map +0 -1
  541. package/src/developer-agent/preview-changes.js.map +0 -1
  542. package/src/developer-agent/preview-source.js.map +0 -1
  543. package/src/developer-agent/validation.js.map +0 -1
  544. package/src/developer-agent/workspace-inspection.js.map +0 -1
  545. package/src/developer-agent/workspace-path.js.map +0 -1
  546. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  547. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  548. package/src/executors/deploy/deploy.js.map +0 -1
  549. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  550. package/src/executors/dev/dev.js.map +0 -1
  551. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  552. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  553. package/src/executors/developer-context/developer-context.js.map +0 -1
  554. package/src/executors/fleet/fleet.js.map +0 -1
  555. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  556. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  557. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  558. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  559. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  560. package/src/executors/refresh/refresh.js.map +0 -1
  561. package/src/executors/remove/remove.js.map +0 -1
  562. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  563. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  564. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  565. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  566. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  567. package/src/executors/unlock/unlock.js.map +0 -1
  568. package/src/executors/work-markers/work-markers.js.map +0 -1
  569. package/src/foundation/discovery.js.map +0 -1
  570. package/src/foundation/index.js.map +0 -1
  571. package/src/foundation/local-database-contract.js.map +0 -1
  572. package/src/foundation/logging-preflight.js.map +0 -1
  573. package/src/foundation/logging.js.map +0 -1
  574. package/src/foundation/preflight.js.map +0 -1
  575. package/src/foundation/provision-database-bindings.js.map +0 -1
  576. package/src/foundation/provision-logical-database.js.map +0 -1
  577. package/src/foundation/requirements.js.map +0 -1
  578. package/src/foundation/router-origin-proof.js.map +0 -1
  579. package/src/foundation/stages.js.map +0 -1
  580. package/src/frontend-security/index.js.map +0 -1
  581. package/src/frontend-security/security-headers.js.map +0 -1
  582. package/src/generators/feature-registry.js.map +0 -1
  583. package/src/generators/function/function.js.map +0 -1
  584. package/src/generators/job/job.js.map +0 -1
  585. package/src/generators/logging-registry.js.map +0 -1
  586. package/src/generators/post-generation-install.js.map +0 -1
  587. package/src/generators/preset/generator.js.map +0 -1
  588. package/src/generators/preset/tool-versions.js.map +0 -1
  589. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  590. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  591. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  592. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  593. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  594. package/src/generators/preset/workspace-files.js.map +0 -1
  595. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  596. package/src/generators/service/service.js.map +0 -1
  597. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  598. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  599. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  600. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  601. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  602. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  603. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  604. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  605. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  606. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  607. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  608. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  609. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  610. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  611. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  612. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  613. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  614. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  615. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  616. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  617. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  618. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  619. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  620. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  621. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  622. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  623. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  624. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  625. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  626. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  627. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  628. package/src/generators/slice/built-in-plan.js.map +0 -1
  629. package/src/generators/slice/slice.js.map +0 -1
  630. package/src/generators/upgrade/upgrade.js.map +0 -1
  631. package/src/generators/workload/frozen-container.js.map +0 -1
  632. package/src/generators/workload/performance-registration.js.map +0 -1
  633. package/src/generators/workload/reliability-registration.js.map +0 -1
  634. package/src/generators/workload/service-performance-files.js.map +0 -1
  635. package/src/generators/workload/workload.js.map +0 -1
  636. package/src/git-policy/action-pins.js.map +0 -1
  637. package/src/git-policy/github-bootstrap.js.map +0 -1
  638. package/src/git-policy/index.js.map +0 -1
  639. package/src/git-policy/routing.js.map +0 -1
  640. package/src/index.js.map +0 -1
  641. package/src/infrastructure-change/convergence.js.map +0 -1
  642. package/src/infrastructure-change/drift.js.map +0 -1
  643. package/src/infrastructure-change/index.js.map +0 -1
  644. package/src/infrastructure-change/model.js.map +0 -1
  645. package/src/infrastructure-change/normalize.js.map +0 -1
  646. package/src/infrastructure-change/plan.js.map +0 -1
  647. package/src/infrastructure-change/risk.js.map +0 -1
  648. package/src/infrastructure-change/summary.js.map +0 -1
  649. package/src/local-dev/context-discovery.js.map +0 -1
  650. package/src/local-dev/contract-validation.js.map +0 -1
  651. package/src/local-dev/contracts.js.map +0 -1
  652. package/src/local-dev/control-contract.js.map +0 -1
  653. package/src/local-dev/dev-command-core.js.map +0 -1
  654. package/src/local-dev/effects.js.map +0 -1
  655. package/src/local-dev/environment-inspector.js.map +0 -1
  656. package/src/local-dev/environment-state.js.map +0 -1
  657. package/src/local-dev/errors.js.map +0 -1
  658. package/src/local-dev/fleet-client.js.map +0 -1
  659. package/src/local-dev/fleet-configuration.js.map +0 -1
  660. package/src/local-dev/fleet-inventory.js.map +0 -1
  661. package/src/local-dev/fleet-ipc.js.map +0 -1
  662. package/src/local-dev/fleet-launcher.js.map +0 -1
  663. package/src/local-dev/fleet-lock.js.map +0 -1
  664. package/src/local-dev/fleet-logs.js.map +0 -1
  665. package/src/local-dev/fleet-process.js.map +0 -1
  666. package/src/local-dev/fleet-runtime.js.map +0 -1
  667. package/src/local-dev/fleet-session.js.map +0 -1
  668. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  669. package/src/local-dev/fleet-startup.js.map +0 -1
  670. package/src/local-dev/fleet-state.js.map +0 -1
  671. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  672. package/src/local-dev/fleet-supervisor.js.map +0 -1
  673. package/src/local-dev/gateway-daemon.js.map +0 -1
  674. package/src/local-dev/gateway.js.map +0 -1
  675. package/src/local-dev/identity.js.map +0 -1
  676. package/src/local-dev/index.js.map +0 -1
  677. package/src/local-dev/local-context.js.map +0 -1
  678. package/src/local-dev/nx-workspace.js.map +0 -1
  679. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  680. package/src/local-dev/personal-stage.js.map +0 -1
  681. package/src/local-dev/portless.js.map +0 -1
  682. package/src/local-dev/ports.js.map +0 -1
  683. package/src/local-dev/private-state.js.map +0 -1
  684. package/src/local-dev/process-identity.js.map +0 -1
  685. package/src/local-dev/proxy.js.map +0 -1
  686. package/src/local-dev/runtime-paths.js.map +0 -1
  687. package/src/local-dev/secret-slice-claim.js.map +0 -1
  688. package/src/local-dev/slice-claim.js.map +0 -1
  689. package/src/local-dev/slice-runner.js.map +0 -1
  690. package/src/local-dev/tls.js.map +0 -1
  691. package/src/ownership/composition.js.map +0 -1
  692. package/src/ownership/foundation-record.js.map +0 -1
  693. package/src/ownership/hash.js.map +0 -1
  694. package/src/ownership/index.js.map +0 -1
  695. package/src/ownership/json-ownership.js.map +0 -1
  696. package/src/ownership/record.js.map +0 -1
  697. package/src/ownership/workspace-record.js.map +0 -1
  698. package/src/performance/cost-collection.js.map +0 -1
  699. package/src/performance/cost-controls.js.map +0 -1
  700. package/src/performance/evidence.js.map +0 -1
  701. package/src/performance/index.js.map +0 -1
  702. package/src/performance/load-safety.js.map +0 -1
  703. package/src/performance/model.js.map +0 -1
  704. package/src/performance/pr-artifact-budget.js.map +0 -1
  705. package/src/performance/runner.js.map +0 -1
  706. package/src/performance/scenario-endpoint.js.map +0 -1
  707. package/src/performance/scenario.js.map +0 -1
  708. package/src/performance/test-fixtures.d.ts +0 -7
  709. package/src/performance/test-fixtures.js +0 -169
  710. package/src/performance/test-fixtures.js.map +0 -1
  711. package/src/performance/unit-cost.js.map +0 -1
  712. package/src/release/index.js.map +0 -1
  713. package/src/release/lifecycle.js.map +0 -1
  714. package/src/release/manifest.js.map +0 -1
  715. package/src/release/rollout.js.map +0 -1
  716. package/src/release/source-authority.js.map +0 -1
  717. package/src/repository-policy/aurora-preflight.js.map +0 -1
  718. package/src/repository-policy/deployment-plan.js.map +0 -1
  719. package/src/repository-policy/foundation-profile.js.map +0 -1
  720. package/src/repository-policy/index.js.map +0 -1
  721. package/src/repository-policy/policy.js.map +0 -1
  722. package/src/secrets/adapters.js.map +0 -1
  723. package/src/secrets/aws-control-plane.js.map +0 -1
  724. package/src/secrets/declaration-verification.js.map +0 -1
  725. package/src/secrets/guardrails.js.map +0 -1
  726. package/src/secrets/index.js.map +0 -1
  727. package/src/secrets/metadata.js.map +0 -1
  728. package/src/secrets/model.js.map +0 -1
  729. package/src/secrets/operator.js.map +0 -1
  730. package/src/secrets/permissions.js.map +0 -1
  731. package/src/secrets/personal-command.js.map +0 -1
  732. package/src/secrets/personal-ledger.js.map +0 -1
  733. package/src/secrets/registry.js.map +0 -1
  734. package/src/secrets/verification.js.map +0 -1
  735. package/src/secrets/workload-access.js.map +0 -1
  736. package/src/supply-chain/action-pins.js.map +0 -1
  737. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  738. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  739. package/src/supply-chain/blueprint-trust.js.map +0 -1
  740. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  741. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  742. package/src/supply-chain/build-output.js.map +0 -1
  743. package/src/supply-chain/common.js.map +0 -1
  744. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  745. package/src/supply-chain/container-release.js.map +0 -1
  746. package/src/supply-chain/ecr-applicability.js.map +0 -1
  747. package/src/supply-chain/ecr-scanning.js.map +0 -1
  748. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  749. package/src/supply-chain/errors.js.map +0 -1
  750. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  751. package/src/supply-chain/generated-command.js.map +0 -1
  752. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  753. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  754. package/src/supply-chain/generated-files.js.map +0 -1
  755. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  756. package/src/supply-chain/index.js.map +0 -1
  757. package/src/supply-chain/inventory.js.map +0 -1
  758. package/src/supply-chain/license-expression.js.map +0 -1
  759. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  760. package/src/supply-chain/policy.js.map +0 -1
  761. package/src/supply-chain/publication.js.map +0 -1
  762. package/src/supply-chain/sbom.js.map +0 -1
  763. package/src/supply-chain/scanner.js.map +0 -1
  764. package/src/supply-chain/vendored-source.js.map +0 -1
  765. package/src/testing-evidence/fixture-scope.js.map +0 -1
  766. package/src/testing-evidence/index.js.map +0 -1
  767. package/src/testing-evidence/quarantine.js.map +0 -1
  768. package/src/testing-evidence/result.js.map +0 -1
  769. package/src/testing-evidence/runner-adapter.js.map +0 -1
  770. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  771. package/src/validation.js.map +0 -1
  772. package/src/work-markers/index.js.map +0 -1
  773. package/src/work-markers/work-markers.js.map +0 -1
  774. package/src/workload-roles/account-baseline.js.map +0 -1
  775. package/src/workload-roles/authority.js.map +0 -1
  776. package/src/workload-roles/aws-adapter.js.map +0 -1
  777. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  778. package/src/workload-roles/aws-s3-state.js.map +0 -1
  779. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  780. package/src/workload-roles/boundary.js.map +0 -1
  781. package/src/workload-roles/convergence.js.map +0 -1
  782. package/src/workload-roles/effective-policy.js.map +0 -1
  783. package/src/workload-roles/handler.js.map +0 -1
  784. package/src/workload-roles/history.js.map +0 -1
  785. package/src/workload-roles/index.js.map +0 -1
  786. package/src/workload-roles/injection.js.map +0 -1
  787. package/src/workload-roles/manifest.js.map +0 -1
  788. package/src/workload-roles/provisioner.js.map +0 -1
  789. package/src/workload-roles/registration.js.map +0 -1
  790. package/src/workload-roles/stage-boundary.js.map +0 -1
  791. 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.EBK_STAGING_PLAN_REPOSITORY_VARIABLES = exports.EBK_PRODUCTION_PLAN_REPOSITORY_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_VARIABLES = exports.EBK_PROTECTED_ENVIRONMENT_SECRETS = exports.EBK_STAGING_PROMOTION_PULL_ROLE_SECRET = exports.EBK_SMOKE_ROLE_SECRET = exports.EBK_RELIABILITY_READ_ROLE_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_DEPLOYMENT_ROLE_SECRET = exports.EBK_REQUIRED_CHECKS = exports.EBK_PROTECTED_BRANCH_RULESET_NAME = void 0;
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.EBK_DEPLOYMENT_ROLE_SECRET = 'AWS_DEPLOY_ROLE_ARN';
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
- exports.EBK_RELIABILITY_READ_ROLE_SECRET = 'AWS_RELIABILITY_READ_ROLE_ARN';
17
- exports.EBK_SMOKE_ROLE_SECRET = 'AWS_SMOKE_ROLE_ARN';
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.EBK_PERFORMANCE_AGGREGATE_ROLE_SECRET,
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 = '2022-11-28';
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
- const ENVIRONMENT_BRANCHES = {
76
- 'async-recovery-production': 'main',
77
- 'async-recovery-staging': 'develop',
78
- 'infrastructure-plan-production': 'main',
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.filter((variable) => variable !== exports.EBK_PERFORMANCE_ORIGINS_VARIABLE);
122
- const ENVIRONMENT_VARIABLE_REQUIREMENTS = {
123
- 'async-recovery-production': ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
124
- 'async-recovery-staging': ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
125
- 'infrastructure-plan-production': [],
126
- 'infrastructure-plan-staging': [],
127
- 'performance-cost-production': ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
128
- 'performance-cost-staging': ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
129
- 'performance-aggregate-production': ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
130
- 'performance-aggregate-staging': ['AWS_EXPECTED_ACCOUNT_ID', 'AWS_REGION'],
131
- 'performance-load-production': [
132
- 'AWS_EXPECTED_ACCOUNT_ID',
133
- 'AWS_REGION',
134
- exports.EBK_PERFORMANCE_ORIGINS_VARIABLE,
135
- ],
136
- 'performance-load-staging': [
137
- 'AWS_EXPECTED_ACCOUNT_ID',
138
- 'AWS_REGION',
139
- exports.EBK_PERFORMANCE_ORIGINS_VARIABLE,
140
- ],
141
- 'npm-prerelease': [],
142
- production: PRODUCTION_STAGE_VARIABLES,
143
- 'reliability-read-production': [],
144
- 'reliability-read-staging': [],
145
- staging: BASE_STAGE_VARIABLES,
146
- };
147
- function environmentStage(environment) {
148
- return environment.endsWith('-production') ||
149
- environment === 'npm-prerelease' ||
150
- environment === 'production'
151
- ? 'production'
152
- : 'staging';
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 = environmentStage(environment);
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 ? current.waitTimer : stageEnvironment.waitTimer,
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
- if (response.status === 204)
236
+ const responseBody = await response.text();
237
+ if (!responseBody)
235
238
  return undefined;
236
- return (await response.json());
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 PROTECTED_BRANCHES.some((branch) => {
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: PROTECTED_BRANCHES.map((branch) => `refs/heads/${branch}`),
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 PROTECTED_BRANCHES) {
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 PROTECTED_BRANCHES) {
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(Object.keys(ENVIRONMENT_BRANCHES).map(async (name) => [name, await inspectNamedEnvironment(name)])));
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 (JSON.stringify(normalizeRuleset(state.ownedRuleset)) !==
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
- for (const [environment, branch] of Object.entries(ENVIRONMENT_BRANCHES)) {
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 }) => name !== branch || type !== 'branch');
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
- if (!current.branchPolicies.some(({ name, type }) => name === branch && type === 'branch')) {
751
- changes.push(`Restrict ${environment} deployment to ${branch}.`);
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 = ENVIRONMENT_SECRET_REQUIREMENTS[environment];
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 = ENVIRONMENT_VARIABLE_REQUIREMENTS[environment];
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(environment, state, productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
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
- if (state.environments.staging.reviewers.length > 0) {
820
- warnings.push('Staging has additional reviewer protection; bootstrap will preserve it.');
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
- for (const [environment, branch] of Object.entries(ENVIRONMENT_BRANCHES)) {
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 stage = environmentStage(environment);
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
- if (!current.branchPolicies.some(({ name, type }) => name === branch && type === 'branch')) {
945
- await api.request('POST', `${repositoryPath}/environments/${encodeURIComponent(environment)}/deployment-branch-policies`, { name: branch, type: 'branch' });
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 environment-reviewer.');
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 initial = await inspect(api, repositoryPath, options.productionApprovalMode);
977
- const report = evaluate(repository, initial.state, initial.blockers, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
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
- await applyChanges(api, repositoryPath, initial.state, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
984
- const completed = await inspect(api, repositoryPath, options.productionApprovalMode);
985
- return evaluate(repository, completed.state, completed.blockers, options.productionApprovalMode, productionReviewerIds, npmPrereleaseReviewerIds);
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