@empire-builder-kit/nx 1.0.0-rc.37 → 1.0.0-rc.39

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 (637) hide show
  1. package/README.md +18 -0
  2. package/executors.json +5 -0
  3. package/generators.json +10 -0
  4. package/package.json +20 -3
  5. package/src/aws-authority/index.d.ts +1 -0
  6. package/src/aws-authority/index.js +1 -0
  7. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  8. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  9. package/src/aws-authority/stage-authority.d.ts +11 -3
  10. package/src/aws-authority/stage-authority.js +615 -29
  11. package/src/blueprints/external-sandbox.js +21 -9
  12. package/src/blueprints/manifest.d.ts +1 -1
  13. package/src/blueprints/resolver.js +28 -15
  14. package/src/cli/bootstrap.d.ts +1 -1
  15. package/src/cli/deploy-runtime.d.ts +6 -0
  16. package/src/cli/deploy-runtime.js +58 -0
  17. package/src/cli/dev-command.d.ts +16 -4
  18. package/src/cli/dev-command.js +63 -0
  19. package/src/cli/main.d.ts +7 -1
  20. package/src/cli/main.js +128 -20
  21. package/src/cli/output.d.ts +1 -1
  22. package/src/developer-agent/context.js +41 -9
  23. package/src/developer-agent/generator-planning.js +16 -2
  24. package/src/developer-agent/git-inspection.d.ts +6 -2
  25. package/src/developer-agent/git-inspection.js +78 -6
  26. package/src/developer-agent/model.d.ts +4 -2
  27. package/src/developer-agent/operation-registry.d.ts +5 -0
  28. package/src/developer-agent/operation-registry.js +179 -23
  29. package/src/developer-agent/preview-changes.d.ts +2 -0
  30. package/src/developer-agent/preview-changes.js +14 -2
  31. package/src/developer-agent/preview-source.js +3 -0
  32. package/src/developer-agent/validation.js +20 -8
  33. package/src/developer-agent/workspace-inspection.js +37 -3
  34. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  35. package/src/executors/deployment-plan/deployment-plan.js +51 -4
  36. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  37. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  38. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  39. package/src/executors/dev-task-cleanup/schema.json +9 -0
  40. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  41. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  42. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  43. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  44. package/src/executors/fleet/fleet.js +1 -1
  45. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +28 -1
  46. package/src/executors/local-deploy/local-deploy.d.ts +8 -1
  47. package/src/executors/local-deploy/local-deploy.js +97 -24
  48. package/src/executors/local-deploy/schema.json +8 -0
  49. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +30 -18
  50. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +2 -0
  51. package/src/executors/sst-lifecycle/governed-native-operation.js +9 -0
  52. package/src/executors/sst-lifecycle/run-sst-command.d.ts +5 -0
  53. package/src/executors/sst-lifecycle/run-sst-command.js +220 -32
  54. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +8 -0
  55. package/src/executors/sst-lifecycle/sst-environment-source.js +54 -0
  56. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  57. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  58. package/src/foundation/capability-plan.d.ts +43 -0
  59. package/src/foundation/capability-plan.js +168 -0
  60. package/src/foundation/discovery.d.ts +14 -11
  61. package/src/foundation/discovery.js +32 -6
  62. package/src/foundation/index.d.ts +1 -0
  63. package/src/foundation/index.js +1 -0
  64. package/src/foundation/local-database-contract.d.ts +20 -0
  65. package/src/foundation/local-database-contract.js +262 -13
  66. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  67. package/src/foundation/local-private-smoke-access.js +197 -0
  68. package/src/foundation/preflight.js +37 -18
  69. package/src/foundation/private-smoke-access.js +10 -2
  70. package/src/foundation/private-smoke-admission.d.ts +3 -1
  71. package/src/foundation/private-smoke-admission.js +29 -8
  72. package/src/foundation/private-smoke-control-plane.js +17 -6
  73. package/src/foundation/provision-database-bindings.d.ts +5 -0
  74. package/src/foundation/provision-database-bindings.js +41 -8
  75. package/src/foundation/provision-logical-database.js +13 -8
  76. package/src/foundation/requirements.d.ts +3 -3
  77. package/src/foundation/requirements.js +24 -12
  78. package/src/foundation/router-waf.d.ts +1 -0
  79. package/src/foundation/router-waf.js +14 -1
  80. package/src/generators/blueprint/blueprint.d.ts +5 -0
  81. package/src/generators/blueprint/blueprint.js +102 -0
  82. package/src/generators/blueprint/files.d.ts +6 -0
  83. package/src/generators/blueprint/files.js +217 -0
  84. package/src/generators/blueprint/schema.d.ts +4 -0
  85. package/src/generators/blueprint/schema.json +18 -0
  86. package/src/generators/formatting.js +24 -1
  87. package/src/generators/logging-registry.d.ts +2 -0
  88. package/src/generators/logging-registry.js +22 -0
  89. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  90. package/src/generators/preset/workspace-files-adopter-skills.js +301 -0
  91. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  92. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  93. package/src/generators/preset/workspace-files-developer-agent.js +40 -13
  94. package/src/generators/preset/workspace-files-performance-load.js +8 -0
  95. package/src/generators/preset/workspace-files-stage-authority.js +40 -1
  96. package/src/generators/preset/workspace-files-thin-deploy.js +66 -34
  97. package/src/generators/preset/workspace-files-thin-docs.js +64 -18
  98. package/src/generators/preset/workspace-files.d.ts +4 -0
  99. package/src/generators/preset/workspace-files.js +159 -91
  100. package/src/generators/repository-policy/repository-policy.js +37 -0
  101. package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
  102. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  103. package/src/generators/slice/built-in-plan-api-files.js +47 -389
  104. package/src/generators/slice/built-in-plan-async-work-files.js +19 -1912
  105. package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
  106. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +36 -2
  107. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  108. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  109. package/src/generators/slice/built-in-plan-background-work-files.d.ts +1 -1
  110. package/src/generators/slice/built-in-plan-background-work-files.js +15 -5
  111. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  112. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  113. package/src/generators/slice/built-in-plan-data-files.js +61 -1164
  114. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  115. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +18 -2
  116. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2446
  117. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +30 -6
  118. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  119. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +4 -15
  120. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  121. package/src/generators/slice/built-in-plan-foundation-files.js +34 -10
  122. package/src/generators/slice/built-in-plan-frontend-files.js +2 -2
  123. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  124. package/src/generators/slice/built-in-plan-infrastructure-files.js +180 -522
  125. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  126. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  127. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  128. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  129. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  130. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  131. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  132. package/src/generators/slice/built-in-plan-key-value-delivery.js +120 -0
  133. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  134. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  135. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  136. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  137. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  138. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  139. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  140. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  141. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  142. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  143. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  144. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  145. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  146. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  147. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  148. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  149. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  150. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  151. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  152. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  153. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  154. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  155. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  156. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  157. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  158. package/src/generators/slice/built-in-plan-metadata-files.js +140 -28
  159. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +1 -1
  160. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +36 -19
  161. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  162. package/src/generators/slice/built-in-plan-operations-files.js +89 -50
  163. package/src/generators/slice/built-in-plan-performance-files.js +84 -1010
  164. package/src/generators/slice/built-in-plan-project-files.js +116 -67
  165. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  166. package/src/generators/slice/built-in-plan-release-files.js +64 -15
  167. package/src/generators/slice/built-in-plan-reliability-files.js +54 -28
  168. package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
  169. package/src/generators/slice/built-in-plan-shared.js +41 -19
  170. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  171. package/src/generators/slice/built-in-plan-sql-events.js +257 -0
  172. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  173. package/src/generators/slice/built-in-plan-testing-files.js +184 -132
  174. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  175. package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
  176. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +1 -1
  177. package/src/generators/slice/built-in-plan-thin-release-files.js +35 -2
  178. package/src/generators/slice/built-in-plan-verification-files.js +70 -0
  179. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  180. package/src/generators/slice/built-in-plan-web-files.js +206 -14
  181. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  182. package/src/generators/slice/built-in-plan-workload-role-files.js +113 -274
  183. package/src/generators/slice/built-in-plan.d.ts +9 -1
  184. package/src/generators/slice/built-in-plan.js +49 -21
  185. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  186. package/src/generators/slice/data-policy-review-seed.js +22 -0
  187. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  188. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  189. package/src/generators/slice/local-source-identity.d.ts +2 -0
  190. package/src/generators/slice/local-source-identity.js +31 -0
  191. package/src/generators/slice/persistence-contract.d.ts +14 -0
  192. package/src/generators/slice/persistence-contract.js +32 -0
  193. package/src/generators/slice/slice.js +29 -24
  194. package/src/generators/sql/schema.d.ts +7 -0
  195. package/src/generators/sql/schema.json +38 -0
  196. package/src/generators/sql/sql.d.ts +6 -0
  197. package/src/generators/sql/sql.js +53 -0
  198. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  199. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  200. package/src/generators/upgrade/upgrade.d.ts +2 -0
  201. package/src/generators/upgrade/upgrade.js +136 -9
  202. package/src/generators/workload/workload.js +51 -2
  203. package/src/local-dev/browser-verification.d.ts +37 -0
  204. package/src/local-dev/browser-verification.js +281 -0
  205. package/src/local-dev/contracts.d.ts +10 -1
  206. package/src/local-dev/contracts.js +114 -13
  207. package/src/local-dev/dev-command-core.js +24 -5
  208. package/src/local-dev/docker-credential-health.d.ts +14 -0
  209. package/src/local-dev/docker-credential-health.js +94 -0
  210. package/src/local-dev/environment-inspector.d.ts +7 -0
  211. package/src/local-dev/environment-inspector.js +42 -15
  212. package/src/local-dev/environment-state.js +2 -2
  213. package/src/local-dev/errors.d.ts +1 -1
  214. package/src/local-dev/errors.js +2 -0
  215. package/src/local-dev/fleet-client.js +2 -2
  216. package/src/local-dev/fleet-configuration.js +57 -25
  217. package/src/local-dev/fleet-inventory.js +46 -18
  218. package/src/local-dev/fleet-ipc.d.ts +7 -0
  219. package/src/local-dev/fleet-ipc.js +14 -2
  220. package/src/local-dev/fleet-launcher.d.ts +6 -0
  221. package/src/local-dev/fleet-launcher.js +14 -2
  222. package/src/local-dev/fleet-logs.js +50 -22
  223. package/src/local-dev/fleet-process.d.ts +20 -1
  224. package/src/local-dev/fleet-process.js +197 -41
  225. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  226. package/src/local-dev/fleet-runner-evidence.js +56 -0
  227. package/src/local-dev/fleet-runtime.js +268 -229
  228. package/src/local-dev/fleet-session.d.ts +2 -0
  229. package/src/local-dev/fleet-session.js +28 -11
  230. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  231. package/src/local-dev/fleet-state.d.ts +5 -2
  232. package/src/local-dev/fleet-state.js +25 -4
  233. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  234. package/src/local-dev/fleet-supervisor.js +66 -11
  235. package/src/local-dev/fleet-web-start.d.ts +12 -0
  236. package/src/local-dev/fleet-web-start.js +48 -0
  237. package/src/local-dev/identity.js +3 -14
  238. package/src/local-dev/index.d.ts +1 -0
  239. package/src/local-dev/index.js +1 -0
  240. package/src/local-dev/native-completion.d.ts +9 -0
  241. package/src/local-dev/native-completion.js +130 -0
  242. package/src/local-dev/nx-workspace.d.ts +4 -2
  243. package/src/local-dev/nx-workspace.js +11 -6
  244. package/src/local-dev/personal-stage.d.ts +4 -5
  245. package/src/local-dev/personal-stage.js +6 -54
  246. package/src/local-dev/port-claims.d.ts +13 -0
  247. package/src/local-dev/port-claims.js +46 -0
  248. package/src/local-dev/ports.d.ts +14 -2
  249. package/src/local-dev/ports.js +78 -3
  250. package/src/local-dev/private-state.d.ts +6 -0
  251. package/src/local-dev/private-state.js +126 -34
  252. package/src/local-dev/process-group.d.ts +4 -0
  253. package/src/local-dev/process-group.js +29 -0
  254. package/src/local-dev/process-identity.d.ts +8 -0
  255. package/src/local-dev/process-identity.js +31 -1
  256. package/src/local-dev/proxy.js +11 -12
  257. package/src/local-dev/runtime-paths.js +1 -1
  258. package/src/local-dev/slice-claim.js +1 -1
  259. package/src/local-dev/slice-runner.d.ts +15 -6
  260. package/src/local-dev/slice-runner.js +189 -54
  261. package/src/local-dev/task-attachment.d.ts +17 -0
  262. package/src/local-dev/task-attachment.js +73 -0
  263. package/src/local-dev/task-authority.d.ts +10 -0
  264. package/src/local-dev/task-authority.js +27 -0
  265. package/src/local-dev/task-identity.d.ts +33 -0
  266. package/src/local-dev/task-identity.js +418 -0
  267. package/src/local-dev/task-native-writer.d.ts +18 -0
  268. package/src/local-dev/task-native-writer.js +329 -0
  269. package/src/local-dev/tls.js +3 -1
  270. package/src/local-dev/web-launch.d.ts +9 -0
  271. package/src/local-dev/web-launch.js +130 -0
  272. package/src/ownership/composition.d.ts +2 -1
  273. package/src/ownership/composition.js +1 -0
  274. package/src/performance/scenario.d.ts +22 -0
  275. package/src/performance/scenario.js +100 -92
  276. package/src/repository-policy/deployment-plan.d.ts +2 -2
  277. package/src/repository-policy/deployment-plan.js +2 -1
  278. package/src/repository-policy/policy.js +38 -3
  279. package/src/schemas/blueprint-v1.json +5 -4
  280. package/src/schemas/foundation-requirement-v1.json +5 -4
  281. package/src/schemas/testing-evidence-result-v1.json +1 -1
  282. package/src/secrets/operator.d.ts +3 -1
  283. package/src/secrets/operator.js +22 -3
  284. package/src/sst-environment-source-format.d.ts +3 -0
  285. package/src/sst-environment-source-format.js +20 -0
  286. package/src/supply-chain/blueprint-trust-git.js +13 -3
  287. package/src/supply-chain/build-output.js +15 -0
  288. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  289. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  290. package/src/testing-evidence/fixture-scope.js +4 -2
  291. package/src/testing-evidence/result.d.ts +2 -1
  292. package/src/testing-evidence/result.js +18 -4
  293. package/src/workload-roles/standard-slice.js +2 -3
  294. package/src/api-contract/baseline-update.js.map +0 -1
  295. package/src/api-contract/compatibility.js.map +0 -1
  296. package/src/api-contract/contract-graph.js.map +0 -1
  297. package/src/api-contract/evidence.js.map +0 -1
  298. package/src/api-contract/index.js.map +0 -1
  299. package/src/api-contract/model.fixtures.d.ts +0 -2
  300. package/src/api-contract/model.fixtures.js +0 -81
  301. package/src/api-contract/model.fixtures.js.map +0 -1
  302. package/src/api-contract/model.js.map +0 -1
  303. package/src/api-contract/rollout.js.map +0 -1
  304. package/src/authorization/compatibility.js.map +0 -1
  305. package/src/authorization/index.js.map +0 -1
  306. package/src/aws/child-environment.js.map +0 -1
  307. package/src/aws/identity.js.map +0 -1
  308. package/src/aws-authority/index.js.map +0 -1
  309. package/src/aws-authority/stage-authority.js.map +0 -1
  310. package/src/blueprints/execution.js.map +0 -1
  311. package/src/blueprints/external-sandbox.js.map +0 -1
  312. package/src/blueprints/index.js.map +0 -1
  313. package/src/blueprints/inputs.js.map +0 -1
  314. package/src/blueprints/manifest.js.map +0 -1
  315. package/src/blueprints/resolver.js.map +0 -1
  316. package/src/blueprints/transitions.js.map +0 -1
  317. package/src/cli/agent-command.js.map +0 -1
  318. package/src/cli/agent-runtime.js.map +0 -1
  319. package/src/cli/blueprint-authority.js.map +0 -1
  320. package/src/cli/blueprint-command.js.map +0 -1
  321. package/src/cli/bootstrap.js.map +0 -1
  322. package/src/cli/dev-command.js.map +0 -1
  323. package/src/cli/main.js.map +0 -1
  324. package/src/cli/output.js.map +0 -1
  325. package/src/cli/personal-secret-runtime.js.map +0 -1
  326. package/src/cli/secret-terminal.js.map +0 -1
  327. package/src/container-images.js.map +0 -1
  328. package/src/data-lifecycle/index.js.map +0 -1
  329. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  330. package/src/data-lifecycle/model.fixtures.js +0 -244
  331. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  332. package/src/data-lifecycle/model.js.map +0 -1
  333. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  334. package/src/data-lifecycle/validation.js.map +0 -1
  335. package/src/database-retirement/contract.js.map +0 -1
  336. package/src/database-retirement/index.js.map +0 -1
  337. package/src/deterministic-order.js.map +0 -1
  338. package/src/developer-agent/context.js.map +0 -1
  339. package/src/developer-agent/generator-planning.js.map +0 -1
  340. package/src/developer-agent/generator-preview.js.map +0 -1
  341. package/src/developer-agent/git-inspection.js.map +0 -1
  342. package/src/developer-agent/handoff.js.map +0 -1
  343. package/src/developer-agent/index.js.map +0 -1
  344. package/src/developer-agent/model.js.map +0 -1
  345. package/src/developer-agent/operation-registry.js.map +0 -1
  346. package/src/developer-agent/ordering.js.map +0 -1
  347. package/src/developer-agent/planning.js.map +0 -1
  348. package/src/developer-agent/preview-changes.js.map +0 -1
  349. package/src/developer-agent/preview-source.js.map +0 -1
  350. package/src/developer-agent/validation.js.map +0 -1
  351. package/src/developer-agent/workspace-inspection.js.map +0 -1
  352. package/src/developer-agent/workspace-path.js.map +0 -1
  353. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  354. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  355. package/src/executors/deploy/deploy.js.map +0 -1
  356. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  357. package/src/executors/dev/dev.js.map +0 -1
  358. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  359. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  360. package/src/executors/developer-context/developer-context.js.map +0 -1
  361. package/src/executors/fleet/fleet.js.map +0 -1
  362. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  363. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  364. package/src/executors/foundation-profile-preflight/production-database-safeguard.js.map +0 -1
  365. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  366. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  367. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  368. package/src/executors/local-deploy/federated-credential-transport.js.map +0 -1
  369. package/src/executors/local-deploy/fixtures/local-deploy-state-machine.mjs +0 -53
  370. package/src/executors/local-deploy/local-approval.js.map +0 -1
  371. package/src/executors/local-deploy/local-deploy.js.map +0 -1
  372. package/src/executors/refresh/refresh.js.map +0 -1
  373. package/src/executors/remove/remove.js.map +0 -1
  374. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js.map +0 -1
  375. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  376. package/src/executors/secret-initialize/secret-initialize.js.map +0 -1
  377. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  378. package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +0 -1
  379. package/src/executors/sst-lifecycle/governed-native-operation.js.map +0 -1
  380. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  381. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  382. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  383. package/src/executors/sst-lifecycle/sst-environment-source.js.map +0 -1
  384. package/src/executors/unlock/unlock.js.map +0 -1
  385. package/src/executors/work-markers/work-markers.js.map +0 -1
  386. package/src/foundation/discovery.js.map +0 -1
  387. package/src/foundation/index.js.map +0 -1
  388. package/src/foundation/local-database-contract.js.map +0 -1
  389. package/src/foundation/logging-preflight.js.map +0 -1
  390. package/src/foundation/logging.js.map +0 -1
  391. package/src/foundation/partial-state.js.map +0 -1
  392. package/src/foundation/preflight.js.map +0 -1
  393. package/src/foundation/private-smoke-access.js.map +0 -1
  394. package/src/foundation/private-smoke-admission.js.map +0 -1
  395. package/src/foundation/private-smoke-control-plane.js.map +0 -1
  396. package/src/foundation/provision-database-bindings.js.map +0 -1
  397. package/src/foundation/provision-logical-database.js.map +0 -1
  398. package/src/foundation/requirements.js.map +0 -1
  399. package/src/foundation/router-origin-proof.js.map +0 -1
  400. package/src/foundation/router-waf-rate-rehearsal.js.map +0 -1
  401. package/src/foundation/router-waf.js.map +0 -1
  402. package/src/foundation/stages.js.map +0 -1
  403. package/src/frontend-security/index.js.map +0 -1
  404. package/src/frontend-security/security-headers.js.map +0 -1
  405. package/src/generators/feature-registry.js.map +0 -1
  406. package/src/generators/formatting.js.map +0 -1
  407. package/src/generators/function/function.js.map +0 -1
  408. package/src/generators/job/job.js.map +0 -1
  409. package/src/generators/logging-registry.js.map +0 -1
  410. package/src/generators/post-generation-install.js.map +0 -1
  411. package/src/generators/preset/dependency-overrides.js.map +0 -1
  412. package/src/generators/preset/generator.js.map +0 -1
  413. package/src/generators/preset/tool-versions.js.map +0 -1
  414. package/src/generators/preset/workspace-files-ci-acceptance.js.map +0 -1
  415. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  416. package/src/generators/preset/workspace-files-ecr-inspector.js.map +0 -1
  417. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  418. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  419. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  420. package/src/generators/preset/workspace-files-stage-authority.js.map +0 -1
  421. package/src/generators/preset/workspace-files-thin-deploy.js.map +0 -1
  422. package/src/generators/preset/workspace-files-thin-docs.js.map +0 -1
  423. package/src/generators/preset/workspace-files-thin-release.js.map +0 -1
  424. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  425. package/src/generators/preset/workspace-files.js.map +0 -1
  426. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  427. package/src/generators/repository-policy/tree-policy.js.map +0 -1
  428. package/src/generators/service/service.js.map +0 -1
  429. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  430. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  431. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  432. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  433. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  434. package/src/generators/slice/built-in-plan-background-work-files.js.map +0 -1
  435. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  436. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  437. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  438. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  439. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  440. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  441. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  442. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  443. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  444. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  445. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  446. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  447. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  448. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  449. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  450. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js.map +0 -1
  451. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  452. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  453. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  454. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  455. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  456. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  457. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  458. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  459. package/src/generators/slice/built-in-plan-thin-release-files.js.map +0 -1
  460. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  461. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  462. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  463. package/src/generators/slice/built-in-plan.js.map +0 -1
  464. package/src/generators/slice/slice.js.map +0 -1
  465. package/src/generators/upgrade/upgrade.js.map +0 -1
  466. package/src/generators/workload/frozen-container.js.map +0 -1
  467. package/src/generators/workload/performance-registration.js.map +0 -1
  468. package/src/generators/workload/reliability-registration.js.map +0 -1
  469. package/src/generators/workload/service-performance-files.js.map +0 -1
  470. package/src/generators/workload/workload.js.map +0 -1
  471. package/src/git-policy/action-pins.js.map +0 -1
  472. package/src/git-policy/github-bootstrap.js.map +0 -1
  473. package/src/git-policy/index.js.map +0 -1
  474. package/src/git-policy/routing.js.map +0 -1
  475. package/src/index.js.map +0 -1
  476. package/src/infrastructure-change/convergence.js.map +0 -1
  477. package/src/infrastructure-change/drift.js.map +0 -1
  478. package/src/infrastructure-change/index.js.map +0 -1
  479. package/src/infrastructure-change/local-capability.js.map +0 -1
  480. package/src/infrastructure-change/model.js.map +0 -1
  481. package/src/infrastructure-change/normalize.js.map +0 -1
  482. package/src/infrastructure-change/plan.js.map +0 -1
  483. package/src/infrastructure-change/risk.js.map +0 -1
  484. package/src/infrastructure-change/summary.js.map +0 -1
  485. package/src/local-dev/context-discovery.js.map +0 -1
  486. package/src/local-dev/contract-validation.js.map +0 -1
  487. package/src/local-dev/contracts.js.map +0 -1
  488. package/src/local-dev/control-contract.js.map +0 -1
  489. package/src/local-dev/dev-command-core.js.map +0 -1
  490. package/src/local-dev/effects.js.map +0 -1
  491. package/src/local-dev/environment-inspector.js.map +0 -1
  492. package/src/local-dev/environment-state.js.map +0 -1
  493. package/src/local-dev/errors.js.map +0 -1
  494. package/src/local-dev/fleet-client.js.map +0 -1
  495. package/src/local-dev/fleet-configuration.js.map +0 -1
  496. package/src/local-dev/fleet-inventory.js.map +0 -1
  497. package/src/local-dev/fleet-ipc.js.map +0 -1
  498. package/src/local-dev/fleet-launcher.js.map +0 -1
  499. package/src/local-dev/fleet-lock.js.map +0 -1
  500. package/src/local-dev/fleet-logs.js.map +0 -1
  501. package/src/local-dev/fleet-process.js.map +0 -1
  502. package/src/local-dev/fleet-runtime.js.map +0 -1
  503. package/src/local-dev/fleet-session.js.map +0 -1
  504. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  505. package/src/local-dev/fleet-startup.js.map +0 -1
  506. package/src/local-dev/fleet-state.js.map +0 -1
  507. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  508. package/src/local-dev/fleet-supervisor.js.map +0 -1
  509. package/src/local-dev/gateway-daemon.js.map +0 -1
  510. package/src/local-dev/gateway.js.map +0 -1
  511. package/src/local-dev/identity.js.map +0 -1
  512. package/src/local-dev/index.js.map +0 -1
  513. package/src/local-dev/local-context.js.map +0 -1
  514. package/src/local-dev/nx-workspace.js.map +0 -1
  515. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  516. package/src/local-dev/personal-stage.js.map +0 -1
  517. package/src/local-dev/portless.js.map +0 -1
  518. package/src/local-dev/ports.js.map +0 -1
  519. package/src/local-dev/private-state.js.map +0 -1
  520. package/src/local-dev/process-identity.js.map +0 -1
  521. package/src/local-dev/proxy.js.map +0 -1
  522. package/src/local-dev/runtime-paths.js.map +0 -1
  523. package/src/local-dev/secret-slice-claim.js.map +0 -1
  524. package/src/local-dev/slice-claim.js.map +0 -1
  525. package/src/local-dev/slice-runner.js.map +0 -1
  526. package/src/local-dev/tls.js.map +0 -1
  527. package/src/ownership/composition.js.map +0 -1
  528. package/src/ownership/foundation-record.js.map +0 -1
  529. package/src/ownership/hash.js.map +0 -1
  530. package/src/ownership/index.js.map +0 -1
  531. package/src/ownership/json-ownership.js.map +0 -1
  532. package/src/ownership/record.js.map +0 -1
  533. package/src/ownership/workspace-record.js.map +0 -1
  534. package/src/performance/cost-collection.js.map +0 -1
  535. package/src/performance/cost-controls.js.map +0 -1
  536. package/src/performance/evidence.js.map +0 -1
  537. package/src/performance/index.js.map +0 -1
  538. package/src/performance/load-safety.js.map +0 -1
  539. package/src/performance/model.js.map +0 -1
  540. package/src/performance/pr-artifact-budget.js.map +0 -1
  541. package/src/performance/runner.js.map +0 -1
  542. package/src/performance/scenario-endpoint.js.map +0 -1
  543. package/src/performance/scenario.js.map +0 -1
  544. package/src/performance/test-fixtures.d.ts +0 -7
  545. package/src/performance/test-fixtures.js +0 -167
  546. package/src/performance/test-fixtures.js.map +0 -1
  547. package/src/performance/unit-cost.js.map +0 -1
  548. package/src/release/index.js.map +0 -1
  549. package/src/release/lifecycle.js.map +0 -1
  550. package/src/release/manifest.js.map +0 -1
  551. package/src/release/rollout.js.map +0 -1
  552. package/src/release/source-authority.js.map +0 -1
  553. package/src/repository-policy/aurora-preflight.js.map +0 -1
  554. package/src/repository-policy/capacity-migration.js.map +0 -1
  555. package/src/repository-policy/deployment-plan.js.map +0 -1
  556. package/src/repository-policy/foundation-profile.js.map +0 -1
  557. package/src/repository-policy/index.js.map +0 -1
  558. package/src/repository-policy/policy.js.map +0 -1
  559. package/src/secrets/adapters.js.map +0 -1
  560. package/src/secrets/aws-control-plane.js.map +0 -1
  561. package/src/secrets/declaration-verification.js.map +0 -1
  562. package/src/secrets/generated-aws-control-plane.js.map +0 -1
  563. package/src/secrets/guardrails.js.map +0 -1
  564. package/src/secrets/index.js.map +0 -1
  565. package/src/secrets/metadata.js.map +0 -1
  566. package/src/secrets/model.js.map +0 -1
  567. package/src/secrets/operator.js.map +0 -1
  568. package/src/secrets/permissions.js.map +0 -1
  569. package/src/secrets/personal-command.js.map +0 -1
  570. package/src/secrets/personal-ledger.js.map +0 -1
  571. package/src/secrets/registry.js.map +0 -1
  572. package/src/secrets/verification.js.map +0 -1
  573. package/src/secrets/workload-access.js.map +0 -1
  574. package/src/sst-environment-source-format.js.map +0 -1
  575. package/src/supply-chain/action-pins.js.map +0 -1
  576. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  577. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  578. package/src/supply-chain/blueprint-trust.js.map +0 -1
  579. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  580. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  581. package/src/supply-chain/build-output-bounds.js.map +0 -1
  582. package/src/supply-chain/build-output.js.map +0 -1
  583. package/src/supply-chain/common.js.map +0 -1
  584. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  585. package/src/supply-chain/container-release.js.map +0 -1
  586. package/src/supply-chain/ecr-applicability.js.map +0 -1
  587. package/src/supply-chain/ecr-scanning.js.map +0 -1
  588. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  589. package/src/supply-chain/errors.js.map +0 -1
  590. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  591. package/src/supply-chain/generated-command.js.map +0 -1
  592. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  593. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  594. package/src/supply-chain/generated-files.js.map +0 -1
  595. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  596. package/src/supply-chain/index.js.map +0 -1
  597. package/src/supply-chain/inventory.js.map +0 -1
  598. package/src/supply-chain/license-expression.js.map +0 -1
  599. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  600. package/src/supply-chain/policy.js.map +0 -1
  601. package/src/supply-chain/publication.js.map +0 -1
  602. package/src/supply-chain/sbom.js.map +0 -1
  603. package/src/supply-chain/scanner.js.map +0 -1
  604. package/src/supply-chain/vendored-source.js.map +0 -1
  605. package/src/testing-evidence/fixture-scope.js.map +0 -1
  606. package/src/testing-evidence/index.js.map +0 -1
  607. package/src/testing-evidence/quarantine.js.map +0 -1
  608. package/src/testing-evidence/result.js.map +0 -1
  609. package/src/testing-evidence/runner-adapter.js.map +0 -1
  610. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  611. package/src/validation.js.map +0 -1
  612. package/src/work-markers/index.js.map +0 -1
  613. package/src/work-markers/work-markers.js.map +0 -1
  614. package/src/workload-roles/account-baseline.js.map +0 -1
  615. package/src/workload-roles/authority.js.map +0 -1
  616. package/src/workload-roles/aws-adapter.js.map +0 -1
  617. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  618. package/src/workload-roles/aws-s3-state.js.map +0 -1
  619. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  620. package/src/workload-roles/boundary.js.map +0 -1
  621. package/src/workload-roles/convergence.js.map +0 -1
  622. package/src/workload-roles/effective-policy.js.map +0 -1
  623. package/src/workload-roles/handler.js.map +0 -1
  624. package/src/workload-roles/history.js.map +0 -1
  625. package/src/workload-roles/index.js.map +0 -1
  626. package/src/workload-roles/injection.js.map +0 -1
  627. package/src/workload-roles/manifest.js.map +0 -1
  628. package/src/workload-roles/provisioner.js.map +0 -1
  629. package/src/workload-roles/registration.js.map +0 -1
  630. package/src/workload-roles/stage-boundary.js.map +0 -1
  631. package/src/workload-roles/standard-slice.js.map +0 -1
  632. package/src/workspace-deployment/affected-lifecycle.js.map +0 -1
  633. package/src/workspace-deployment/identity.js.map +0 -1
  634. package/src/workspace-deployment/index.js.map +0 -1
  635. package/src/workspace-deployment/migration-evidence.js.map +0 -1
  636. package/src/workspace-deployment/migration.js.map +0 -1
  637. package/src/workspace-deployment/ownership.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  export interface SmokeAdmissionContext {
2
+ authority?: 'local';
2
3
  run: string;
3
4
  attempt: string;
4
5
  source: string;
@@ -14,6 +15,7 @@ export interface SmokeIpSetStore {
14
15
  update(previous: SmokeIpSet, next: Pick<SmokeIpSet, 'addresses' | 'description'>): Promise<void>;
15
16
  }
16
17
  export interface SmokeAdmissionLease {
18
+ authority?: 'local';
17
19
  run: string;
18
20
  attempt: string;
19
21
  source: string;
@@ -33,7 +35,7 @@ export declare function withPrivateSmokeAdmission<T>(input: {
33
35
  context: SmokeAdmissionContext;
34
36
  cidr: string;
35
37
  run: (lease: SmokeAdmissionLease) => Promise<T>;
36
- awaitAdmission: () => Promise<void>;
38
+ awaitAdmission: (signal: AbortSignal) => Promise<void>;
37
39
  awaitRevocation: () => Promise<void>;
38
40
  now?: () => number;
39
41
  signals?: {
@@ -9,6 +9,7 @@ exports.withPrivateSmokeAdmission = withPrivateSmokeAdmission;
9
9
  const node_crypto_1 = require("node:crypto");
10
10
  const node_net_1 = require("node:net");
11
11
  const prefix = 'ebk-smoke-v1:';
12
+ const localPrefix = 'ebk-smoke-local-v1:';
12
13
  const sorted = (values) => [...values].sort();
13
14
  const same = (a, b) => JSON.stringify(sorted(a)) === JSON.stringify(sorted(b));
14
15
  const baselineDigest = (values) => (0, node_crypto_1.createHash)('sha256')
@@ -47,20 +48,31 @@ function publicRunnerIpv4(value) {
47
48
  function parseSmokeAdmissionLease(description) {
48
49
  if (description === '')
49
50
  return undefined;
50
- requireCondition(description.startsWith(prefix) && description.length <= 256, 'unrecognized IP-set description; do not overwrite it');
51
- const parts = description.slice(prefix.length).split(',');
51
+ const local = description.startsWith(localPrefix);
52
+ const leasePrefix = local ? localPrefix : prefix;
53
+ requireCondition(description.startsWith(leasePrefix) && description.length <= 256, 'unrecognized IP-set description; do not overwrite it');
54
+ const parts = description.slice(leasePrefix.length).split(',');
52
55
  requireCondition(parts.length === 6, 'malformed admission lease');
53
56
  const [run, attempt, source, cidr, baseline, expires] = parts;
54
- requireCondition(/^[1-9][0-9]*$/.test(run) &&
57
+ requireCondition((local ? /^[a-f0-9]{32}$/.test(run) : /^[1-9][0-9]*$/.test(run)) &&
55
58
  /^[1-9][0-9]*$/.test(attempt) &&
56
59
  /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(source) &&
57
60
  /^[a-f0-9]{64}$/.test(baseline) &&
58
61
  /^[0-9]{13}$/.test(expires), 'malformed admission identity');
59
62
  requireCondition(cidr === publicRunnerIpv4(cidr.replace(/\/32$/, '')), 'admission is not an exact /32');
60
- return { run, attempt, source, cidr, baseline, expiresAt: Number(expires) };
63
+ return {
64
+ ...(local ? { authority: 'local' } : {}),
65
+ run,
66
+ attempt,
67
+ source,
68
+ cidr,
69
+ baseline,
70
+ expiresAt: Number(expires),
71
+ };
61
72
  }
62
73
  function belongsTo(lease, context) {
63
- return (lease.run === context.run &&
74
+ return (lease.authority === context.authority &&
75
+ lease.run === context.run &&
64
76
  lease.attempt === context.attempt &&
65
77
  lease.source === context.source);
66
78
  }
@@ -91,7 +103,10 @@ async function cleanupSmokeAdmission(store, context) {
91
103
  return;
92
104
  }
93
105
  }
94
- throw new Error('Private smoke access: cleanup unproved; deployment acceptance is prohibited. Run protected smoke-access cleanup before retrying.');
106
+ throw new Error('Private smoke access: cleanup unproved; deployment acceptance is prohibited. ' +
107
+ (context.authority === 'local'
108
+ ? 'Preserve the private recovery receipt, stop the owning invocation, then retry ebk deploy from the same workspace and stage with its verified credential profile.'
109
+ : 'Run protected smoke-access cleanup before retrying.'));
95
110
  }
96
111
  /** A retained lease alone, or its expiry, is not proof that a different run ended. */
97
112
  async function recoverSmokeAdmission(store, baseline, completedRun) {
@@ -112,7 +127,7 @@ async function withPrivateSmokeAdmission(input) {
112
127
  requireCondition(!parseSmokeAdmissionLease(before.description), 'recover the existing admission before starting smoke');
113
128
  requireCondition(same(before.addresses, context.baseline), 'live allowlist differs from committed baseline');
114
129
  const alreadyAllowed = runnerAlreadyAllowed(cidr, context.baseline);
115
- const description = prefix +
130
+ const description = (context.authority === 'local' ? localPrefix : prefix) +
116
131
  [
117
132
  context.run,
118
133
  context.attempt,
@@ -125,8 +140,10 @@ async function withPrivateSmokeAdmission(input) {
125
140
  requireCondition(lease !== undefined, 'admission lease is unreadable');
126
141
  const signals = input.signals ?? process;
127
142
  let interrupted = false;
143
+ const admissionAbort = new AbortController();
128
144
  const stop = () => {
129
145
  interrupted = true;
146
+ admissionAbort.abort(new Error('Private smoke interrupted'));
130
147
  };
131
148
  signals.on('SIGINT', stop);
132
149
  signals.on('SIGTERM', stop);
@@ -138,7 +155,8 @@ async function withPrivateSmokeAdmission(input) {
138
155
  });
139
156
  const after = await store.read();
140
157
  requireCondition(same(after.addresses, alreadyAllowed ? context.baseline : [...context.baseline, cidr]) && after.description === (alreadyAllowed ? '' : description), 'admission readback differs');
141
- await input.awaitAdmission();
158
+ requireCondition(!interrupted, 'interrupted before admission');
159
+ await input.awaitAdmission(admissionAbort.signal);
142
160
  requireCondition(!interrupted, 'interrupted before smoke');
143
161
  const result = await input.run(lease);
144
162
  requireCondition(!interrupted, 'smoke interrupted');
@@ -149,6 +167,9 @@ async function withPrivateSmokeAdmission(input) {
149
167
  await cleanupSmokeAdmission(store, context);
150
168
  if (!alreadyAllowed)
151
169
  await input.awaitRevocation();
170
+ // Signals must not abort revocation, but they must invalidate the pending
171
+ // return value even when smoke itself already completed successfully.
172
+ requireCondition(!interrupted, 'smoke interrupted during cleanup');
152
173
  }
153
174
  finally {
154
175
  signals.removeListener('SIGINT', stop);
@@ -29,7 +29,7 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
29
29
  const url = smokeUrl === undefined ? undefined : new URL(smokeUrl);
30
30
  if (url)
31
31
  check(url.protocol === 'https:' && !url.username && !url.password && !url.port, 'credential-free HTTPS Router required');
32
- const name = `foundation-${identity.stage}-router-ipv4-allowlist`;
32
+ const name = `foundation-${identity.stage}-router-smoke-access`;
33
33
  const ipSets = [];
34
34
  let marker;
35
35
  const seen = new Set();
@@ -47,7 +47,7 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
47
47
  check(seen.size <= 100, 'IP-set inventory exceeds bounded inspection');
48
48
  } while (marker);
49
49
  const matches = ipSets.filter((set) => set.Name === name);
50
- check(matches.length === 1 && matches[0].Id, 'exact stage IPv4 IP set missing or ambiguous; configure a baseline IPv4 CIDR before private hosted smoke');
50
+ check(matches.length === 1 && matches[0].Id, 'exact stage smoke-access IP set missing or ambiguous; deploy the upgraded Foundation before private smoke');
51
51
  const selected = matches[0];
52
52
  const arn = `arn:aws:wafv2:us-east-1:${identity.account}:global/ipset/${name}/${selected.Id}`;
53
53
  check(selected.ARN === arn, 'IP-set account/scope/identity mismatch');
@@ -56,7 +56,6 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
56
56
  'ebk:owner': 'foundation',
57
57
  'ebk:stage': identity.stage,
58
58
  'ebk:workspace': identity.workspace,
59
- 'ebk:policy-digest': identity.policyDigest,
60
59
  };
61
60
  async function attestTags(resourceArn) {
62
61
  const tags = {};
@@ -80,6 +79,15 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
80
79
  } while (tagMarker);
81
80
  for (const [key, value] of Object.entries(expectedTags))
82
81
  check(tags[key] === value, 'WAF ownership or committed policy differs');
82
+ if (resourceArn === arn) {
83
+ // The dedicated smoke set has stable ownership, not mutable WAF policy.
84
+ // An older creation-time digest tag is inert. Policy binding is checked
85
+ // on the attached Web ACL before any admission, never during revocation.
86
+ check(tags['ebk:purpose'] === 'private-smoke-access', 'IP set is not owned exclusively by private smoke');
87
+ }
88
+ else {
89
+ check(tags['ebk:policy-digest'] === identity.policyDigest, 'WAF ownership or committed policy differs');
90
+ }
83
91
  }
84
92
  await attestTags(arn);
85
93
  // Cleanup never expands access; exact tagged IP-set identity and lease are sufficient.
@@ -135,12 +143,15 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
135
143
  : statement?.OrStatement?.Statements?.map((item) => item.IPSetReferenceStatement);
136
144
  check(rules.length === 1 &&
137
145
  rules[0].Action?.Block &&
138
- refs?.length &&
146
+ refs &&
147
+ refs.length >= 2 &&
148
+ refs.length <= 3 &&
139
149
  refs.every((ref) => ref?.ARN) &&
150
+ new Set(refs.map((ref) => ref?.ARN)).size === refs.length &&
140
151
  refs.filter((ref) => ref?.ARN === arn).length === 1, 'Router blocking rule does not reference the exact IP set');
141
- // A dual-stack rule may have only its same-stage IPv6 companion, never an arbitrary second set.
152
+ // Only the unchanged same-stage baseline sets may accompany the smoke set.
142
153
  check(refs.every((ref) => ref?.ARN === arn ||
143
- ref?.ARN?.startsWith(`arn:aws:wafv2:us-east-1:${identity.account}:global/ipset/foundation-${identity.stage}-router-ipv6-allowlist/`)), 'Router allowlist contains an out-of-stage reference');
154
+ ['ipv4', 'ipv6'].some((family) => ref?.ARN?.startsWith(`arn:aws:wafv2:us-east-1:${identity.account}:global/ipset/foundation-${identity.stage}-router-${family}-allowlist/`))), 'Router allowlist contains an out-of-stage reference');
144
155
  }
145
156
  const key = { Name: name, Id: selected.Id, Scope: 'CLOUDFRONT' };
146
157
  return {
@@ -32,7 +32,12 @@ export type ProvisionedDatabaseBindings<TBindings extends DatabaseBindingDeclara
32
32
  export declare function createDatabaseBindingPlan(bindings: DatabaseBindingDeclaration, context: {
33
33
  slice: string;
34
34
  stage: string;
35
+ localDev?: boolean;
35
36
  }): DatabaseBindingPlan;
37
+ /** Validate declaration shape/collisions without planning deployment or connection coordinates. */
38
+ export declare function validateDatabaseBindings(bindings: DatabaseBindingDeclaration, context: {
39
+ slice: string;
40
+ }): Pick<DatabaseBindingPlan, 'active' | 'provisioned'>;
36
41
  export declare function provisionDatabaseBindings<TBindings extends DatabaseBindingDeclaration>(foundation: FoundationInfrastructure, options: ProvisionDatabaseBindingsOptions & {
37
42
  bindings: TBindings;
38
43
  }): ProvisionedDatabaseBindings<TBindings>;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.selectDatabaseTarget = selectDatabaseTarget;
4
4
  exports.createDatabaseBindingPlan = createDatabaseBindingPlan;
5
+ exports.validateDatabaseBindings = validateDatabaseBindings;
5
6
  exports.provisionDatabaseBindings = provisionDatabaseBindings;
6
7
  const local_database_contract_js_1 = require("./local-database-contract.js");
7
8
  const provision_logical_database_js_1 = require("./provision-logical-database.js");
@@ -25,6 +26,40 @@ function collisionKey(value) {
25
26
  return (0, local_database_contract_js_1.normalizePostgresIdentifier)(value).normalize('NFKC').toLowerCase();
26
27
  }
27
28
  function createDatabaseBindingPlan(bindings, context) {
29
+ return inspectDatabaseBindings(bindings, context.slice, (identifier) => {
30
+ if (!context.localDev)
31
+ return (0, local_database_contract_js_1.resolveLogicalDatabaseIdentifiers)({
32
+ database: identifier,
33
+ slice: context.slice,
34
+ stage: context.stage,
35
+ });
36
+ const local = (0, local_database_contract_js_1.resolveLocalDatabaseContract)({
37
+ database: identifier,
38
+ slice: context.slice,
39
+ stage: context.stage,
40
+ });
41
+ const resolved = {
42
+ database: local.database,
43
+ localDatabase: local.database,
44
+ localReadwriteRole: local.username,
45
+ readwriteRole: local.username,
46
+ readonlyRole: `${local.database}_readonly`,
47
+ migratorRole: `${local.database}_migrator`,
48
+ };
49
+ for (const [role, value] of Object.entries(resolved))
50
+ (0, local_database_contract_js_1.assertPostgresIdentifierLength)(value, `Local ${role} identifier`);
51
+ return resolved;
52
+ });
53
+ }
54
+ /** Validate declaration shape/collisions without planning deployment or connection coordinates. */
55
+ function validateDatabaseBindings(bindings, context) {
56
+ const { active, provisioned } = inspectDatabaseBindings(bindings, context.slice);
57
+ return { active, provisioned };
58
+ }
59
+ function inspectDatabaseBindings(bindings, slice, resolveIdentifiers) {
60
+ if (typeof slice !== 'string' || slice.trim() === '') {
61
+ throw new Error('Product Slice name must be a non-empty string.');
62
+ }
28
63
  if (typeof bindings !== 'object' ||
29
64
  bindings === null ||
30
65
  Array.isArray(bindings)) {
@@ -73,17 +108,13 @@ function createDatabaseBindingPlan(bindings, context) {
73
108
  if (declared.has(identifier)) {
74
109
  throw new Error(`Database identifier "${identifier}" is declared more than once. Each provisioned identifier must be unique across the binding set.`);
75
110
  }
76
- const resolved = (0, local_database_contract_js_1.resolveLogicalDatabaseIdentifiers)({
77
- database: identifier,
78
- slice: context.slice,
79
- stage: context.stage,
80
- });
81
- const key = collisionKey(resolved.database);
111
+ const resolved = resolveIdentifiers?.(identifier);
112
+ const key = collisionKey(resolved?.database ?? identifier);
82
113
  const previous = normalized.get(key);
83
114
  if (previous !== undefined) {
84
115
  throw new Error(`Database identifiers "${previous}" and "${identifier}" collide after PostgreSQL normalization. Rename one identifier; EBK never truncates or aliases database bindings.`);
85
116
  }
86
- const componentName = (0, provision_logical_database_js_1.defaultDatabaseLinkableName)(context.slice, identifier);
117
+ const componentName = (0, provision_logical_database_js_1.defaultDatabaseLinkableName)(slice, identifier);
87
118
  const previousComponent = componentNames.get(componentName);
88
119
  if (previousComponent !== undefined) {
89
120
  throw new Error(`Database identifiers "${previousComponent}" and "${identifier}" collide after SST logical-name normalization as "${componentName}". Rename one identifier so every resource name is unique before deployment.`);
@@ -91,7 +122,8 @@ function createDatabaseBindingPlan(bindings, context) {
91
122
  declared.add(identifier);
92
123
  normalized.set(key, identifier);
93
124
  componentNames.set(componentName, identifier);
94
- identifiers[identifier] = resolved;
125
+ if (resolved)
126
+ identifiers[identifier] = resolved;
95
127
  }
96
128
  }
97
129
  return {
@@ -107,6 +139,7 @@ function provisionDatabaseBindings(foundation, options) {
107
139
  const plan = createDatabaseBindingPlan(options.bindings, {
108
140
  slice: options.slice,
109
141
  stage: $app.stage,
142
+ localDev: $dev && options.localDev !== false,
110
143
  });
111
144
  const provisioned = new Map();
112
145
  for (const database of plan.provisioned) {
@@ -27,11 +27,6 @@ function provisionLogicalDatabase(foundation, options) {
27
27
  options.rotationToken.trim() === '') {
28
28
  throw new Error('Logical database rotationToken must be a non-empty string when supplied.');
29
29
  }
30
- const identifiers = (0, local_database_contract_js_1.resolveLogicalDatabaseIdentifiers)({
31
- database: options.database,
32
- slice: options.slice,
33
- stage: consumerStage,
34
- });
35
30
  const resourceName = options.linkableName ??
36
31
  defaultDatabaseLinkableName(options.slice, options.database);
37
32
  if ($dev && (options.localDev ?? true)) {
@@ -40,7 +35,12 @@ function provisionLogicalDatabase(foundation, options) {
40
35
  password: options.localDevPassword,
41
36
  port: options.localDevPort,
42
37
  slice: options.slice,
38
+ stage: consumerStage,
43
39
  });
40
+ const readonlyRole = `${localDatabase.database}_readonly`;
41
+ const migratorRole = `${localDatabase.database}_migrator`;
42
+ (0, local_database_contract_js_1.assertPostgresIdentifierLength)(readonlyRole, 'Local read-only role identifier');
43
+ (0, local_database_contract_js_1.assertPostgresIdentifierLength)(migratorRole, 'Local migrator role identifier');
44
44
  return {
45
45
  db: new sst.Linkable(resourceName, {
46
46
  properties: {
@@ -49,12 +49,17 @@ function provisionLogicalDatabase(foundation, options) {
49
49
  },
50
50
  }),
51
51
  databaseName: localDatabase.database,
52
- migratorRole: identifiers.migratorRole,
53
- readonlyRole: identifiers.readonlyRole,
54
- readwriteRole: identifiers.readwriteRole,
52
+ migratorRole,
53
+ readonlyRole,
54
+ readwriteRole: localDatabase.username,
55
55
  resourceName,
56
56
  };
57
57
  }
58
+ const identifiers = (0, local_database_contract_js_1.resolveLogicalDatabaseIdentifiers)({
59
+ database: options.database,
60
+ slice: options.slice,
61
+ stage: consumerStage,
62
+ });
58
63
  if (options.removalPolicy === 'destroy') {
59
64
  throw new Error('Logical database removalPolicy "destroy" requires a reviewed AWS-internal retirement workflow and is not supported by the v1 protected bootstrap.');
60
65
  }
@@ -1,6 +1,6 @@
1
1
  import { type ValidationResult } from '../validation.js';
2
- export declare const STANDARD_FOUNDATION_CONTRACT_VERSION: 1;
3
- export declare const STANDARD_FOUNDATION_CAPABILITIES: readonly ["network", "routing", "container-compute", "postgres", "identity", "events", "observability", "configuration", "deployment"];
2
+ export declare const STANDARD_FOUNDATION_CONTRACT_VERSION: 2;
3
+ export declare const STANDARD_FOUNDATION_CAPABILITIES: readonly ["key-value", "routing", "identity", "events", "observability", "configuration", "deployment", "network", "container-compute", "postgres"];
4
4
  export type StandardFoundationCapability = (typeof STANDARD_FOUNDATION_CAPABILITIES)[number];
5
5
  export interface FoundationRequirement {
6
6
  capabilities: StandardFoundationCapability[];
@@ -20,7 +20,7 @@ export declare const foundationRequirementSchema: {
20
20
  readonly properties: {
21
21
  readonly capabilities: {
22
22
  readonly items: {
23
- readonly enum: readonly ["network", "routing", "container-compute", "postgres", "identity", "events", "observability", "configuration", "deployment"];
23
+ readonly enum: readonly ["key-value", "routing", "identity", "events", "observability", "configuration", "deployment", "network", "container-compute", "postgres"];
24
24
  readonly type: "string";
25
25
  };
26
26
  readonly type: "array";
@@ -6,18 +6,9 @@ exports.validateFoundationRequirement = validateFoundationRequirement;
6
6
  exports.validateFoundationCompatibility = validateFoundationCompatibility;
7
7
  const validation_js_1 = require("../validation.js");
8
8
  const semver_1 = require("semver");
9
- exports.STANDARD_FOUNDATION_CONTRACT_VERSION = 1;
10
- exports.STANDARD_FOUNDATION_CAPABILITIES = [
11
- 'network',
12
- 'routing',
13
- 'container-compute',
14
- 'postgres',
15
- 'identity',
16
- 'events',
17
- 'observability',
18
- 'configuration',
19
- 'deployment',
20
- ];
9
+ const capability_plan_js_1 = require("./capability-plan.js");
10
+ exports.STANDARD_FOUNDATION_CONTRACT_VERSION = 2;
11
+ exports.STANDARD_FOUNDATION_CAPABILITIES = capability_plan_js_1.FOUNDATION_CAPABILITY_VOCABULARY;
21
12
  const capabilitySet = new Set(exports.STANDARD_FOUNDATION_CAPABILITIES);
22
13
  function isStandardFoundationCapability(value) {
23
14
  return typeof value === 'string' && capabilitySet.has(value);
@@ -91,6 +82,7 @@ function validateFoundationCompatibility(requirement, foundation) {
91
82
  });
92
83
  }
93
84
  else {
85
+ const seen = new Set();
94
86
  foundation.capabilities.forEach((capability, index) => {
95
87
  if (!isStandardFoundationCapability(capability)) {
96
88
  issues.push({
@@ -98,7 +90,27 @@ function validateFoundationCompatibility(requirement, foundation) {
98
90
  path: `foundationDescriptor.capabilities[${index}]`,
99
91
  });
100
92
  }
93
+ if (seen.has(capability)) {
94
+ issues.push({
95
+ message: 'must not contain duplicate capabilities',
96
+ path: `foundationDescriptor.capabilities[${index}]`,
97
+ });
98
+ }
99
+ seen.add(capability);
101
100
  });
101
+ if (foundation.contractVersion === '2.0.0') {
102
+ for (const [capability, dependency] of [
103
+ ['postgres', 'container-compute'],
104
+ ['container-compute', 'network'],
105
+ ]) {
106
+ if (seen.has(capability) && !seen.has(dependency)) {
107
+ issues.push({
108
+ message: `capability ${capability} requires ${dependency}`,
109
+ path: 'foundationDescriptor.capabilities',
110
+ });
111
+ }
112
+ }
113
+ }
102
114
  }
103
115
  if (requirementResult.valid &&
104
116
  typeof foundation.contractVersion === 'string' &&
@@ -143,6 +143,7 @@ export declare function createRouterWafStagePlan(input: {
143
143
  export declare function createRouterWafRules(plan: RouterWafStagePlan, ipSets: {
144
144
  ipv4Arn?: unknown;
145
145
  ipv6Arn?: unknown;
146
+ smokeArn?: unknown;
146
147
  }): WafRule[];
147
148
  export declare function routerWafContractDigest(policy: RouterWafPolicy): `sha256:${string}`;
148
149
  export {};
@@ -652,7 +652,10 @@ function createRouterWafRules(plan, ipSets) {
652
652
  const rules = [];
653
653
  let priority = 0;
654
654
  if (plan.access === 'allowlist') {
655
- const references = [ipSets.ipv4Arn, ipSets.ipv6Arn]
655
+ if (ipSets.ipv4Arn === undefined && ipSets.ipv6Arn === undefined) {
656
+ throw new Error('Router WAF allowlist is missing its exact IP set ARN.');
657
+ }
658
+ const references = [ipSets.ipv4Arn, ipSets.ipv6Arn, ipSets.smokeArn]
656
659
  .filter((value) => value !== undefined)
657
660
  .map((arn) => ({ ipSetReferenceStatement: { arn } }));
658
661
  if (references.length === 0) {
@@ -749,6 +752,9 @@ function routerWafContractDigest(policy) {
749
752
  ...(plan.ipv6Cidrs.length > 0
750
753
  ? { ipv6Arn: `<ipv6-ip-set:${stage}>` }
751
754
  : {}),
755
+ ...(plan.access === 'allowlist'
756
+ ? { smokeArn: `<smoke-ip-set:${stage}>` }
757
+ : {}),
752
758
  }),
753
759
  };
754
760
  });
@@ -785,6 +791,13 @@ function routerWafContractDigest(policy) {
785
791
  'ebk:stage',
786
792
  'ebk:workspace',
787
793
  ],
794
+ smokeIpSetTags: [
795
+ 'ebk:managed-by',
796
+ 'ebk:owner',
797
+ 'ebk:purpose',
798
+ 'ebk:stage',
799
+ 'ebk:workspace',
800
+ ],
788
801
  logging: policy.logging,
789
802
  scope: 'CLOUDFRONT',
790
803
  },
@@ -0,0 +1,5 @@
1
+ import { type Tree } from '@nx/devkit';
2
+ import type { BlueprintGeneratorSchema } from './schema.js';
3
+ /** Scaffold source owned by the adopter, without executing it or minting trust. */
4
+ export declare function blueprintGenerator(tree: Tree, options: BlueprintGeneratorSchema): Promise<void>;
5
+ export default blueprintGenerator;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.blueprintGenerator = blueprintGenerator;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const prettier_1 = require("prettier");
6
+ const semver_1 = require("semver");
7
+ const validation_js_1 = require("../../validation.js");
8
+ const manifest_js_1 = require("../../blueprints/manifest.js");
9
+ const post_generation_install_js_1 = require("../post-generation-install.js");
10
+ const files_js_1 = require("./files.js");
11
+ /** Scaffold source owned by the adopter, without executing it or minting trust. */
12
+ async function blueprintGenerator(tree, options) {
13
+ const name = options.name;
14
+ if (typeof name !== 'string' ||
15
+ name.length > 63 ||
16
+ !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(name) ||
17
+ /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/.test(name)) {
18
+ throw new Error('Blueprint name must be a lowercase hyphenated name of at most 63 characters.');
19
+ }
20
+ (0, post_generation_install_js_1.assertPostGenerationInstallWorkspaceAvailable)(tree, `generator:blueprint:${name}`);
21
+ const workspace = (0, devkit_1.readJson)(tree, 'package.json');
22
+ if (!(0, validation_js_1.isRecord)(workspace) ||
23
+ typeof workspace.name !== 'string' ||
24
+ !/^[a-z0-9][a-z0-9-]*$/.test(workspace.name) ||
25
+ !(0, validation_js_1.isRecord)(workspace.devDependencies) ||
26
+ typeof workspace.devDependencies['@empire-builder-kit/nx'] !== 'string' ||
27
+ !(0, semver_1.valid)(workspace.devDependencies['@empire-builder-kit/nx'])) {
28
+ throw new Error('Blueprint authoring requires an EBK workspace with an unscoped name and exact @empire-builder-kit/nx version.');
29
+ }
30
+ if (workspace.ebk !== undefined && !(0, validation_js_1.isRecord)(workspace.ebk)) {
31
+ throw new Error('Workspace ebk configuration must be an object.');
32
+ }
33
+ const ebk = (0, validation_js_1.isRecord)(workspace.ebk) ? workspace.ebk : {};
34
+ if (ebk.blueprints !== undefined && !(0, validation_js_1.isRecord)(ebk.blueprints)) {
35
+ throw new Error('Workspace ebk.blueprints configuration must be an object.');
36
+ }
37
+ const blueprints = (0, validation_js_1.isRecord)(ebk.blueprints) ? ebk.blueprints : {};
38
+ if ((blueprints.localPackages !== undefined &&
39
+ (!(0, validation_js_1.isRecord)(blueprints.localPackages) ||
40
+ Object.values(blueprints.localPackages).some((path) => typeof path !== 'string'))) ||
41
+ (blueprints.localAuthoringPackages !== undefined &&
42
+ (!Array.isArray(blueprints.localAuthoringPackages) ||
43
+ blueprints.localAuthoringPackages.some((entry) => typeof entry !== 'string')))) {
44
+ throw new Error('Existing Blueprint local authoring mappings must be valid before scaffolding.');
45
+ }
46
+ const root = `blueprints/${name}`;
47
+ const project = `blueprint-${name}`;
48
+ const packageName = `@${workspace.name}/blueprint-${name}`;
49
+ const localPackages = (blueprints.localPackages ?? {});
50
+ const localAuthoringPackages = (blueprints.localAuthoringPackages ??
51
+ []);
52
+ if (tree.isFile('blueprints') ||
53
+ tree.exists(root) ||
54
+ tree.children(root).length > 0 ||
55
+ tree.children('blueprints').some((entry) => entry.toLowerCase() === name) ||
56
+ (0, devkit_1.getProjects)(tree).has(project) ||
57
+ Object.prototype.hasOwnProperty.call(localPackages, packageName) ||
58
+ Object.values(localPackages).includes(root)) {
59
+ throw new Error(`Blueprint ${name} already has files, a project, or a local mapping. Choose a new name; existing authoring source is never overwritten.`);
60
+ }
61
+ const files = (0, files_js_1.createBlueprintAuthoringFiles)({
62
+ engine: workspace.devDependencies['@empire-builder-kit/nx'],
63
+ name,
64
+ packageName,
65
+ root,
66
+ });
67
+ const manifest = (0, manifest_js_1.validateBlueprintManifest)(JSON.parse(files['ebk-blueprint.json']));
68
+ if (!manifest.valid)
69
+ throw new Error('Generated Blueprint authoring manifest is invalid.');
70
+ const nextWorkspace = {
71
+ ...workspace,
72
+ ebk: {
73
+ ...ebk,
74
+ blueprints: {
75
+ ...blueprints,
76
+ localPackages: { ...localPackages, [packageName]: root },
77
+ localAuthoringPackages: [
78
+ ...new Set([...localAuthoringPackages, packageName]),
79
+ ],
80
+ },
81
+ },
82
+ };
83
+ const planned = {
84
+ ...Object.fromEntries(Object.entries(files).map(([path, contents]) => [
85
+ `${root}/${path}`,
86
+ contents,
87
+ ])),
88
+ 'package.json': JSON.stringify(nextWorkspace, null, 2) + '\n',
89
+ };
90
+ // Complete validation and formatting before the first write. Only this new
91
+ // package and the supported user-owned root ebk mapping are in scope.
92
+ const formatted = await Promise.all(Object.entries(planned).map(async ([path, contents]) => [
93
+ path,
94
+ options.skipFormat
95
+ ? contents
96
+ : await (0, prettier_1.format)(contents, { filepath: path, singleQuote: true }),
97
+ ]));
98
+ for (const [path, contents] of formatted)
99
+ tree.write(path, contents);
100
+ }
101
+ exports.default = blueprintGenerator;
102
+ //# sourceMappingURL=blueprint.js.map
@@ -0,0 +1,6 @@
1
+ export declare function createBlueprintAuthoringFiles(options: {
2
+ engine: string;
3
+ name: string;
4
+ packageName: string;
5
+ root: string;
6
+ }): Record<string, string>;