@bleedingdev/modern-js-ultramodern-create 3.8.3-ultramodern.2

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 (631) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +459 -0
  3. package/bin/run.js +74 -0
  4. package/dist/cjs/agent-files.cjs +96 -0
  5. package/dist/cjs/agents-md.cjs +98 -0
  6. package/dist/cjs/cli/flags.cjs +358 -0
  7. package/dist/cjs/cli/help.cjs +111 -0
  8. package/dist/cjs/cli/package-source.cjs +188 -0
  9. package/dist/cjs/cli/project-setup.cjs +159 -0
  10. package/dist/cjs/cli/prompts.cjs +100 -0
  11. package/dist/cjs/create-package-root.cjs +63 -0
  12. package/dist/cjs/docs-location.cjs +143 -0
  13. package/dist/cjs/index.cjs +169 -0
  14. package/dist/cjs/locale/en.cjs +126 -0
  15. package/dist/cjs/locale/index.cjs +50 -0
  16. package/dist/cjs/locale/zh.cjs +126 -0
  17. package/dist/cjs/ultramodern-package-source.cjs +115 -0
  18. package/dist/cjs/ultramodern-release-cohort.cjs +206 -0
  19. package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +132 -0
  20. package/dist/cjs/ultramodern-tooling/commands/context.cjs +131 -0
  21. package/dist/cjs/ultramodern-tooling/commands/mf-types.cjs +55 -0
  22. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +212 -0
  23. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +47 -0
  24. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +112 -0
  25. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +55 -0
  26. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +102 -0
  27. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +187 -0
  28. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +146 -0
  29. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.cjs +110 -0
  30. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +67 -0
  31. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +279 -0
  32. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +58 -0
  33. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +71 -0
  34. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs +67 -0
  35. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.cjs +151 -0
  36. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +67 -0
  37. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +52 -0
  38. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +447 -0
  39. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +309 -0
  40. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +87 -0
  41. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +588 -0
  42. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +376 -0
  43. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +73 -0
  44. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.cjs +215 -0
  45. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.cjs +135 -0
  46. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +454 -0
  47. package/dist/cjs/ultramodern-tooling/commands/options.cjs +59 -0
  48. package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +122 -0
  49. package/dist/cjs/ultramodern-tooling/commands/skills.cjs +49 -0
  50. package/dist/cjs/ultramodern-tooling/commands/sync-delivery-unit.cjs +40 -0
  51. package/dist/cjs/ultramodern-tooling/commands/validate.cjs +53 -0
  52. package/dist/cjs/ultramodern-tooling/commands.cjs +99 -0
  53. package/dist/cjs/ultramodern-tooling/config/constants.cjs +48 -0
  54. package/dist/cjs/ultramodern-tooling/config/index.cjs +104 -0
  55. package/dist/cjs/ultramodern-tooling/config/json.cjs +61 -0
  56. package/dist/cjs/ultramodern-tooling/config/load.cjs +62 -0
  57. package/dist/cjs/ultramodern-tooling/config/metadata.cjs +92 -0
  58. package/dist/cjs/ultramodern-tooling/config/normalize.cjs +236 -0
  59. package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +157 -0
  60. package/dist/cjs/ultramodern-tooling/config/types.cjs +18 -0
  61. package/dist/cjs/ultramodern-tooling/config.cjs +62 -0
  62. package/dist/cjs/ultramodern-workspace/add-shell.cjs +277 -0
  63. package/dist/cjs/ultramodern-workspace/add-vertical/constants.cjs +52 -0
  64. package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +186 -0
  65. package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +255 -0
  66. package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +256 -0
  67. package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +99 -0
  68. package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +152 -0
  69. package/dist/cjs/ultramodern-workspace/add-vertical/transaction.cjs +590 -0
  70. package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +137 -0
  71. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +84 -0
  72. package/dist/cjs/ultramodern-workspace/api/checkout-cart.cjs +145 -0
  73. package/dist/cjs/ultramodern-workspace/api/client.cjs +224 -0
  74. package/dist/cjs/ultramodern-workspace/api/contracts.cjs +187 -0
  75. package/dist/cjs/ultramodern-workspace/api/names.cjs +98 -0
  76. package/dist/cjs/ultramodern-workspace/api/rpc.cjs +264 -0
  77. package/dist/cjs/ultramodern-workspace/api/service.cjs +252 -0
  78. package/dist/cjs/ultramodern-workspace/api/shared.cjs +264 -0
  79. package/dist/cjs/ultramodern-workspace/api.cjs +108 -0
  80. package/dist/cjs/ultramodern-workspace/app-files.cjs +206 -0
  81. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +355 -0
  82. package/dist/cjs/ultramodern-workspace/bridge-config/cli.cjs +71 -0
  83. package/dist/cjs/ultramodern-workspace/bridge-config/defaults.cjs +44 -0
  84. package/dist/cjs/ultramodern-workspace/bridge-config/gates.cjs +93 -0
  85. package/dist/cjs/ultramodern-workspace/bridge-config/index.cjs +60 -0
  86. package/dist/cjs/ultramodern-workspace/bridge-config/normalize.cjs +68 -0
  87. package/dist/cjs/ultramodern-workspace/bridge-config/schema.cjs +78 -0
  88. package/dist/cjs/ultramodern-workspace/bridge-config/shared.cjs +110 -0
  89. package/dist/cjs/ultramodern-workspace/bridge-config/validation.cjs +68 -0
  90. package/dist/cjs/ultramodern-workspace/bridge-config/workspace-packages.cjs +108 -0
  91. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +62 -0
  92. package/dist/cjs/ultramodern-workspace/codesmith.cjs +144 -0
  93. package/dist/cjs/ultramodern-workspace/contracts.cjs +366 -0
  94. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/types.cjs +292 -0
  95. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/up-projection.cjs +188 -0
  96. package/dist/cjs/ultramodern-workspace/delivery-unit-stamp.cjs +59 -0
  97. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +150 -0
  98. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +75 -0
  99. package/dist/cjs/ultramodern-workspace/demo-components.cjs +685 -0
  100. package/dist/cjs/ultramodern-workspace/descriptors.cjs +307 -0
  101. package/dist/cjs/ultramodern-workspace/effect-diagnostics.cjs +114 -0
  102. package/dist/cjs/ultramodern-workspace/fs-io.cjs +324 -0
  103. package/dist/cjs/ultramodern-workspace/generation-result.cjs +191 -0
  104. package/dist/cjs/ultramodern-workspace/index.cjs +79 -0
  105. package/dist/cjs/ultramodern-workspace/locales.cjs +159 -0
  106. package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +69 -0
  107. package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +77 -0
  108. package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +84 -0
  109. package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +188 -0
  110. package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +165 -0
  111. package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +211 -0
  112. package/dist/cjs/ultramodern-workspace/mf-validation/types.cjs +18 -0
  113. package/dist/cjs/ultramodern-workspace/mf-validation/validate.cjs +112 -0
  114. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +48 -0
  115. package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +343 -0
  116. package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +111 -0
  117. package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +106 -0
  118. package/dist/cjs/ultramodern-workspace/module-federation/shared-config.cjs +53 -0
  119. package/dist/cjs/ultramodern-workspace/module-federation.cjs +77 -0
  120. package/dist/cjs/ultramodern-workspace/naming.cjs +155 -0
  121. package/dist/cjs/ultramodern-workspace/overlay-baseline-guard.cjs +408 -0
  122. package/dist/cjs/ultramodern-workspace/overlays.cjs +155 -0
  123. package/dist/cjs/ultramodern-workspace/package-json.cjs +269 -0
  124. package/dist/cjs/ultramodern-workspace/package-source.cjs +68 -0
  125. package/dist/cjs/ultramodern-workspace/policy.cjs +1020 -0
  126. package/dist/cjs/ultramodern-workspace/public-api.cjs +58 -0
  127. package/dist/cjs/ultramodern-workspace/public-surface.cjs +247 -0
  128. package/dist/cjs/ultramodern-workspace/routes.cjs +226 -0
  129. package/dist/cjs/ultramodern-workspace/shared-patches.cjs +41 -0
  130. package/dist/cjs/ultramodern-workspace/shells.cjs +152 -0
  131. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +147 -0
  132. package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +201 -0
  133. package/dist/cjs/ultramodern-workspace/types.cjs +88 -0
  134. package/dist/cjs/ultramodern-workspace/versions.cjs +184 -0
  135. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +175 -0
  136. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +261 -0
  137. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +424 -0
  138. package/dist/cjs/ultramodern-workspace/write-app.cjs +148 -0
  139. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +232 -0
  140. package/dist/cjs/ultramodern-workspace/zerops.cjs +108 -0
  141. package/dist/esm/agent-files.js +47 -0
  142. package/dist/esm/agents-md.js +50 -0
  143. package/dist/esm/cli/flags.js +263 -0
  144. package/dist/esm/cli/help.js +70 -0
  145. package/dist/esm/cli/package-source.js +124 -0
  146. package/dist/esm/cli/project-setup.js +102 -0
  147. package/dist/esm/cli/prompts.js +51 -0
  148. package/dist/esm/create-package-root.js +14 -0
  149. package/dist/esm/docs-location.js +79 -0
  150. package/dist/esm/index.js +133 -0
  151. package/dist/esm/locale/en.js +88 -0
  152. package/dist/esm/locale/index.js +9 -0
  153. package/dist/esm/locale/zh.js +88 -0
  154. package/dist/esm/ultramodern-package-source.js +43 -0
  155. package/dist/esm/ultramodern-release-cohort.js +133 -0
  156. package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +84 -0
  157. package/dist/esm/ultramodern-tooling/commands/context.js +66 -0
  158. package/dist/esm/ultramodern-tooling/commands/mf-types.js +17 -0
  159. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +154 -0
  160. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +9 -0
  161. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +63 -0
  162. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +7 -0
  163. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +47 -0
  164. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +138 -0
  165. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +97 -0
  166. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +61 -0
  167. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +16 -0
  168. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +230 -0
  169. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +10 -0
  170. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +8 -0
  171. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +15 -0
  172. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +100 -0
  173. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +29 -0
  174. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +14 -0
  175. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +385 -0
  176. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +262 -0
  177. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +49 -0
  178. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +535 -0
  179. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +329 -0
  180. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +19 -0
  181. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +148 -0
  182. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +80 -0
  183. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +405 -0
  184. package/dist/esm/ultramodern-tooling/commands/options.js +18 -0
  185. package/dist/esm/ultramodern-tooling/commands/routes-generate.js +74 -0
  186. package/dist/esm/ultramodern-tooling/commands/skills.js +11 -0
  187. package/dist/esm/ultramodern-tooling/commands/sync-delivery-unit.js +1 -0
  188. package/dist/esm/ultramodern-tooling/commands/validate.js +15 -0
  189. package/dist/esm/ultramodern-tooling/commands.js +51 -0
  190. package/dist/esm/ultramodern-tooling/config/constants.js +4 -0
  191. package/dist/esm/ultramodern-tooling/config/index.js +7 -0
  192. package/dist/esm/ultramodern-tooling/config/json.js +10 -0
  193. package/dist/esm/ultramodern-tooling/config/load.js +13 -0
  194. package/dist/esm/ultramodern-tooling/config/metadata.js +37 -0
  195. package/dist/esm/ultramodern-tooling/config/normalize.js +173 -0
  196. package/dist/esm/ultramodern-tooling/config/synthesize.js +108 -0
  197. package/dist/esm/ultramodern-tooling/config/types.js +0 -0
  198. package/dist/esm/ultramodern-tooling/config.js +1 -0
  199. package/dist/esm/ultramodern-workspace/add-shell.js +224 -0
  200. package/dist/esm/ultramodern-workspace/add-vertical/constants.js +5 -0
  201. package/dist/esm/ultramodern-workspace/add-vertical/execute.js +138 -0
  202. package/dist/esm/ultramodern-workspace/add-vertical/plan.js +205 -0
  203. package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +198 -0
  204. package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +48 -0
  205. package/dist/esm/ultramodern-workspace/add-vertical/topology.js +108 -0
  206. package/dist/esm/ultramodern-workspace/add-vertical/transaction.js +529 -0
  207. package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +67 -0
  208. package/dist/esm/ultramodern-workspace/add-vertical.js +6 -0
  209. package/dist/esm/ultramodern-workspace/api/checkout-cart.js +86 -0
  210. package/dist/esm/ultramodern-workspace/api/client.js +183 -0
  211. package/dist/esm/ultramodern-workspace/api/contracts.js +149 -0
  212. package/dist/esm/ultramodern-workspace/api/names.js +33 -0
  213. package/dist/esm/ultramodern-workspace/api/rpc.js +205 -0
  214. package/dist/esm/ultramodern-workspace/api/service.js +211 -0
  215. package/dist/esm/ultramodern-workspace/api/shared.js +226 -0
  216. package/dist/esm/ultramodern-workspace/api.js +6 -0
  217. package/dist/esm/ultramodern-workspace/app-files.js +150 -0
  218. package/dist/esm/ultramodern-workspace/backend-federation.js +290 -0
  219. package/dist/esm/ultramodern-workspace/bridge-config/cli.js +30 -0
  220. package/dist/esm/ultramodern-workspace/bridge-config/defaults.js +6 -0
  221. package/dist/esm/ultramodern-workspace/bridge-config/gates.js +52 -0
  222. package/dist/esm/ultramodern-workspace/bridge-config/index.js +3 -0
  223. package/dist/esm/ultramodern-workspace/bridge-config/normalize.js +30 -0
  224. package/dist/esm/ultramodern-workspace/bridge-config/schema.js +31 -0
  225. package/dist/esm/ultramodern-workspace/bridge-config/shared.js +51 -0
  226. package/dist/esm/ultramodern-workspace/bridge-config/validation.js +27 -0
  227. package/dist/esm/ultramodern-workspace/bridge-config/workspace-packages.js +67 -0
  228. package/dist/esm/ultramodern-workspace/bridge-config.js +1 -0
  229. package/dist/esm/ultramodern-workspace/codesmith.js +96 -0
  230. package/dist/esm/ultramodern-workspace/contracts.js +319 -0
  231. package/dist/esm/ultramodern-workspace/delivery-unit-schema/types.js +236 -0
  232. package/dist/esm/ultramodern-workspace/delivery-unit-schema/up-projection.js +129 -0
  233. package/dist/esm/ultramodern-workspace/delivery-unit-stamp.js +18 -0
  234. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +101 -0
  235. package/dist/esm/ultramodern-workspace/delivery-unit.js +21 -0
  236. package/dist/esm/ultramodern-workspace/demo-components.js +617 -0
  237. package/dist/esm/ultramodern-workspace/descriptors.js +191 -0
  238. package/dist/esm/ultramodern-workspace/effect-diagnostics.js +76 -0
  239. package/dist/esm/ultramodern-workspace/fs-io.js +235 -0
  240. package/dist/esm/ultramodern-workspace/generation-result.js +132 -0
  241. package/dist/esm/ultramodern-workspace/index.js +7 -0
  242. package/dist/esm/ultramodern-workspace/locales.js +121 -0
  243. package/dist/esm/ultramodern-workspace/mf-validation/constants.js +19 -0
  244. package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +28 -0
  245. package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +46 -0
  246. package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +144 -0
  247. package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +89 -0
  248. package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +161 -0
  249. package/dist/esm/ultramodern-workspace/mf-validation/types.js +0 -0
  250. package/dist/esm/ultramodern-workspace/mf-validation/validate.js +57 -0
  251. package/dist/esm/ultramodern-workspace/mf-validation.js +3 -0
  252. package/dist/esm/ultramodern-workspace/module-federation/config.js +296 -0
  253. package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +67 -0
  254. package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +65 -0
  255. package/dist/esm/ultramodern-workspace/module-federation/shared-config.js +12 -0
  256. package/dist/esm/ultramodern-workspace/module-federation.js +5 -0
  257. package/dist/esm/ultramodern-workspace/naming.js +71 -0
  258. package/dist/esm/ultramodern-workspace/overlay-baseline-guard.js +350 -0
  259. package/dist/esm/ultramodern-workspace/overlays.js +103 -0
  260. package/dist/esm/ultramodern-workspace/package-json.js +201 -0
  261. package/dist/esm/ultramodern-workspace/package-source.js +27 -0
  262. package/dist/esm/ultramodern-workspace/policy.js +955 -0
  263. package/dist/esm/ultramodern-workspace/public-api.js +4 -0
  264. package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
  265. package/dist/esm/ultramodern-workspace/routes.js +146 -0
  266. package/dist/esm/ultramodern-workspace/shared-patches.js +3 -0
  267. package/dist/esm/ultramodern-workspace/shells.js +96 -0
  268. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +100 -0
  269. package/dist/esm/ultramodern-workspace/tsconfigs.js +138 -0
  270. package/dist/esm/ultramodern-workspace/types.js +31 -0
  271. package/dist/esm/ultramodern-workspace/versions.js +38 -0
  272. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +125 -0
  273. package/dist/esm/ultramodern-workspace/workspace-scripts.js +200 -0
  274. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +386 -0
  275. package/dist/esm/ultramodern-workspace/write-app.js +105 -0
  276. package/dist/esm/ultramodern-workspace/write-workspace.js +178 -0
  277. package/dist/esm/ultramodern-workspace/zerops.js +70 -0
  278. package/dist/esm-node/agent-files.js +48 -0
  279. package/dist/esm-node/agents-md.js +51 -0
  280. package/dist/esm-node/cli/flags.js +264 -0
  281. package/dist/esm-node/cli/help.js +71 -0
  282. package/dist/esm-node/cli/package-source.js +125 -0
  283. package/dist/esm-node/cli/project-setup.js +103 -0
  284. package/dist/esm-node/cli/prompts.js +52 -0
  285. package/dist/esm-node/create-package-root.js +15 -0
  286. package/dist/esm-node/docs-location.js +80 -0
  287. package/dist/esm-node/index.js +134 -0
  288. package/dist/esm-node/locale/en.js +89 -0
  289. package/dist/esm-node/locale/index.js +10 -0
  290. package/dist/esm-node/locale/zh.js +89 -0
  291. package/dist/esm-node/ultramodern-package-source.js +44 -0
  292. package/dist/esm-node/ultramodern-release-cohort.js +134 -0
  293. package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +85 -0
  294. package/dist/esm-node/ultramodern-tooling/commands/context.js +67 -0
  295. package/dist/esm-node/ultramodern-tooling/commands/mf-types.js +18 -0
  296. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +155 -0
  297. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +10 -0
  298. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +64 -0
  299. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +8 -0
  300. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +48 -0
  301. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +139 -0
  302. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +98 -0
  303. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +62 -0
  304. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +17 -0
  305. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +231 -0
  306. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +11 -0
  307. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +9 -0
  308. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +16 -0
  309. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +101 -0
  310. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +30 -0
  311. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +15 -0
  312. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +386 -0
  313. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +263 -0
  314. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +50 -0
  315. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +536 -0
  316. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +330 -0
  317. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +20 -0
  318. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +149 -0
  319. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +81 -0
  320. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +406 -0
  321. package/dist/esm-node/ultramodern-tooling/commands/options.js +19 -0
  322. package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +75 -0
  323. package/dist/esm-node/ultramodern-tooling/commands/skills.js +12 -0
  324. package/dist/esm-node/ultramodern-tooling/commands/sync-delivery-unit.js +2 -0
  325. package/dist/esm-node/ultramodern-tooling/commands/validate.js +16 -0
  326. package/dist/esm-node/ultramodern-tooling/commands.js +52 -0
  327. package/dist/esm-node/ultramodern-tooling/config/constants.js +5 -0
  328. package/dist/esm-node/ultramodern-tooling/config/index.js +8 -0
  329. package/dist/esm-node/ultramodern-tooling/config/json.js +11 -0
  330. package/dist/esm-node/ultramodern-tooling/config/load.js +14 -0
  331. package/dist/esm-node/ultramodern-tooling/config/metadata.js +38 -0
  332. package/dist/esm-node/ultramodern-tooling/config/normalize.js +174 -0
  333. package/dist/esm-node/ultramodern-tooling/config/synthesize.js +109 -0
  334. package/dist/esm-node/ultramodern-tooling/config/types.js +1 -0
  335. package/dist/esm-node/ultramodern-tooling/config.js +2 -0
  336. package/dist/esm-node/ultramodern-workspace/add-shell.js +225 -0
  337. package/dist/esm-node/ultramodern-workspace/add-vertical/constants.js +6 -0
  338. package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +139 -0
  339. package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +206 -0
  340. package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +199 -0
  341. package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +49 -0
  342. package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +109 -0
  343. package/dist/esm-node/ultramodern-workspace/add-vertical/transaction.js +530 -0
  344. package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +68 -0
  345. package/dist/esm-node/ultramodern-workspace/add-vertical.js +7 -0
  346. package/dist/esm-node/ultramodern-workspace/api/checkout-cart.js +87 -0
  347. package/dist/esm-node/ultramodern-workspace/api/client.js +184 -0
  348. package/dist/esm-node/ultramodern-workspace/api/contracts.js +150 -0
  349. package/dist/esm-node/ultramodern-workspace/api/names.js +34 -0
  350. package/dist/esm-node/ultramodern-workspace/api/rpc.js +206 -0
  351. package/dist/esm-node/ultramodern-workspace/api/service.js +212 -0
  352. package/dist/esm-node/ultramodern-workspace/api/shared.js +227 -0
  353. package/dist/esm-node/ultramodern-workspace/api.js +7 -0
  354. package/dist/esm-node/ultramodern-workspace/app-files.js +151 -0
  355. package/dist/esm-node/ultramodern-workspace/backend-federation.js +291 -0
  356. package/dist/esm-node/ultramodern-workspace/bridge-config/cli.js +31 -0
  357. package/dist/esm-node/ultramodern-workspace/bridge-config/defaults.js +7 -0
  358. package/dist/esm-node/ultramodern-workspace/bridge-config/gates.js +53 -0
  359. package/dist/esm-node/ultramodern-workspace/bridge-config/index.js +4 -0
  360. package/dist/esm-node/ultramodern-workspace/bridge-config/normalize.js +31 -0
  361. package/dist/esm-node/ultramodern-workspace/bridge-config/schema.js +32 -0
  362. package/dist/esm-node/ultramodern-workspace/bridge-config/shared.js +52 -0
  363. package/dist/esm-node/ultramodern-workspace/bridge-config/validation.js +28 -0
  364. package/dist/esm-node/ultramodern-workspace/bridge-config/workspace-packages.js +68 -0
  365. package/dist/esm-node/ultramodern-workspace/bridge-config.js +2 -0
  366. package/dist/esm-node/ultramodern-workspace/codesmith.js +97 -0
  367. package/dist/esm-node/ultramodern-workspace/contracts.js +320 -0
  368. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/types.js +237 -0
  369. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/up-projection.js +130 -0
  370. package/dist/esm-node/ultramodern-workspace/delivery-unit-stamp.js +19 -0
  371. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +102 -0
  372. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +22 -0
  373. package/dist/esm-node/ultramodern-workspace/demo-components.js +618 -0
  374. package/dist/esm-node/ultramodern-workspace/descriptors.js +192 -0
  375. package/dist/esm-node/ultramodern-workspace/effect-diagnostics.js +77 -0
  376. package/dist/esm-node/ultramodern-workspace/fs-io.js +236 -0
  377. package/dist/esm-node/ultramodern-workspace/generation-result.js +133 -0
  378. package/dist/esm-node/ultramodern-workspace/index.js +8 -0
  379. package/dist/esm-node/ultramodern-workspace/locales.js +122 -0
  380. package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +20 -0
  381. package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +29 -0
  382. package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +47 -0
  383. package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +145 -0
  384. package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +90 -0
  385. package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +162 -0
  386. package/dist/esm-node/ultramodern-workspace/mf-validation/types.js +1 -0
  387. package/dist/esm-node/ultramodern-workspace/mf-validation/validate.js +58 -0
  388. package/dist/esm-node/ultramodern-workspace/mf-validation.js +4 -0
  389. package/dist/esm-node/ultramodern-workspace/module-federation/config.js +297 -0
  390. package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +68 -0
  391. package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +66 -0
  392. package/dist/esm-node/ultramodern-workspace/module-federation/shared-config.js +13 -0
  393. package/dist/esm-node/ultramodern-workspace/module-federation.js +6 -0
  394. package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
  395. package/dist/esm-node/ultramodern-workspace/overlay-baseline-guard.js +351 -0
  396. package/dist/esm-node/ultramodern-workspace/overlays.js +104 -0
  397. package/dist/esm-node/ultramodern-workspace/package-json.js +202 -0
  398. package/dist/esm-node/ultramodern-workspace/package-source.js +28 -0
  399. package/dist/esm-node/ultramodern-workspace/policy.js +956 -0
  400. package/dist/esm-node/ultramodern-workspace/public-api.js +5 -0
  401. package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
  402. package/dist/esm-node/ultramodern-workspace/routes.js +147 -0
  403. package/dist/esm-node/ultramodern-workspace/shared-patches.js +4 -0
  404. package/dist/esm-node/ultramodern-workspace/shells.js +97 -0
  405. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +101 -0
  406. package/dist/esm-node/ultramodern-workspace/tsconfigs.js +139 -0
  407. package/dist/esm-node/ultramodern-workspace/types.js +32 -0
  408. package/dist/esm-node/ultramodern-workspace/versions.js +39 -0
  409. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +126 -0
  410. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +201 -0
  411. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +387 -0
  412. package/dist/esm-node/ultramodern-workspace/write-app.js +106 -0
  413. package/dist/esm-node/ultramodern-workspace/write-workspace.js +179 -0
  414. package/dist/esm-node/ultramodern-workspace/zerops.js +71 -0
  415. package/dist/types/agent-files.d.ts +11 -0
  416. package/dist/types/agents-md.d.ts +1 -0
  417. package/dist/types/cli/flags.d.ts +35 -0
  418. package/dist/types/cli/help.d.ts +2 -0
  419. package/dist/types/cli/package-source.d.ts +15 -0
  420. package/dist/types/cli/project-setup.d.ts +8 -0
  421. package/dist/types/cli/prompts.d.ts +4 -0
  422. package/dist/types/create-package-root.d.ts +1 -0
  423. package/dist/types/docs-location.d.ts +23 -0
  424. package/dist/types/index.d.ts +1 -0
  425. package/dist/types/locale/en.d.ts +87 -0
  426. package/dist/types/locale/index.d.ts +176 -0
  427. package/dist/types/locale/zh.d.ts +87 -0
  428. package/dist/types/ultramodern-package-source.d.ts +20 -0
  429. package/dist/types/ultramodern-release-cohort.d.ts +30 -0
  430. package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -0
  431. package/dist/types/ultramodern-tooling/commands/context.d.ts +11 -0
  432. package/dist/types/ultramodern-tooling/commands/mf-types.d.ts +2 -0
  433. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +12 -0
  434. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +4 -0
  435. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +1 -0
  436. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +3 -0
  437. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +5 -0
  438. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +3 -0
  439. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +2 -0
  440. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.d.ts +2 -0
  441. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +4 -0
  442. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +3 -0
  443. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +3 -0
  444. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +8 -0
  445. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +3 -0
  446. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.d.ts +3 -0
  447. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +1 -0
  448. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +2 -0
  449. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +26 -0
  450. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +25 -0
  451. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +3 -0
  452. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +26 -0
  453. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +26 -0
  454. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +6 -0
  455. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.d.ts +37 -0
  456. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.d.ts +4 -0
  457. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +2 -0
  458. package/dist/types/ultramodern-tooling/commands/options.d.ts +2 -0
  459. package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +2 -0
  460. package/dist/types/ultramodern-tooling/commands/skills.d.ts +2 -0
  461. package/dist/types/ultramodern-tooling/commands/sync-delivery-unit.d.ts +1 -0
  462. package/dist/types/ultramodern-tooling/commands/validate.d.ts +2 -0
  463. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  464. package/dist/types/ultramodern-tooling/config/constants.d.ts +3 -0
  465. package/dist/types/ultramodern-tooling/config/index.d.ts +7 -0
  466. package/dist/types/ultramodern-tooling/config/json.d.ts +2 -0
  467. package/dist/types/ultramodern-tooling/config/load.d.ts +2 -0
  468. package/dist/types/ultramodern-tooling/config/metadata.d.ts +4 -0
  469. package/dist/types/ultramodern-tooling/config/normalize.d.ts +22 -0
  470. package/dist/types/ultramodern-tooling/config/synthesize.d.ts +5 -0
  471. package/dist/types/ultramodern-tooling/config/types.d.ts +45 -0
  472. package/dist/types/ultramodern-tooling/config.d.ts +1 -0
  473. package/dist/types/ultramodern-workspace/add-shell.d.ts +14 -0
  474. package/dist/types/ultramodern-workspace/add-vertical/constants.d.ts +4 -0
  475. package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +9 -0
  476. package/dist/types/ultramodern-workspace/add-vertical/plan.d.ts +2 -0
  477. package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +42 -0
  478. package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +4 -0
  479. package/dist/types/ultramodern-workspace/add-vertical/topology.d.ts +9 -0
  480. package/dist/types/ultramodern-workspace/add-vertical/transaction.d.ts +49 -0
  481. package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +15 -0
  482. package/dist/types/ultramodern-workspace/add-vertical.d.ts +7 -0
  483. package/dist/types/ultramodern-workspace/api/checkout-cart.d.ts +33 -0
  484. package/dist/types/ultramodern-workspace/api/client.d.ts +6 -0
  485. package/dist/types/ultramodern-workspace/api/contracts.d.ts +2 -0
  486. package/dist/types/ultramodern-workspace/api/names.d.ts +41 -0
  487. package/dist/types/ultramodern-workspace/api/rpc.d.ts +41 -0
  488. package/dist/types/ultramodern-workspace/api/service.d.ts +6 -0
  489. package/dist/types/ultramodern-workspace/api/shared.d.ts +5 -0
  490. package/dist/types/ultramodern-workspace/api.d.ts +6 -0
  491. package/dist/types/ultramodern-workspace/app-files.d.ts +8 -0
  492. package/dist/types/ultramodern-workspace/backend-federation.d.ts +11 -0
  493. package/dist/types/ultramodern-workspace/bridge-config/cli.d.ts +3 -0
  494. package/dist/types/ultramodern-workspace/bridge-config/defaults.d.ts +1 -0
  495. package/dist/types/ultramodern-workspace/bridge-config/gates.d.ts +3 -0
  496. package/dist/types/ultramodern-workspace/bridge-config/index.d.ts +4 -0
  497. package/dist/types/ultramodern-workspace/bridge-config/normalize.d.ts +2 -0
  498. package/dist/types/ultramodern-workspace/bridge-config/schema.d.ts +61 -0
  499. package/dist/types/ultramodern-workspace/bridge-config/shared.d.ts +12 -0
  500. package/dist/types/ultramodern-workspace/bridge-config/validation.d.ts +3 -0
  501. package/dist/types/ultramodern-workspace/bridge-config/workspace-packages.d.ts +3 -0
  502. package/dist/types/ultramodern-workspace/bridge-config.d.ts +1 -0
  503. package/dist/types/ultramodern-workspace/codesmith.d.ts +60 -0
  504. package/dist/types/ultramodern-workspace/contracts.d.ts +6 -0
  505. package/dist/types/ultramodern-workspace/delivery-unit-schema/types.d.ts +290 -0
  506. package/dist/types/ultramodern-workspace/delivery-unit-schema/up-projection.d.ts +189 -0
  507. package/dist/types/ultramodern-workspace/delivery-unit-stamp.d.ts +4 -0
  508. package/dist/types/ultramodern-workspace/delivery-unit-sync.d.ts +6 -0
  509. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +8 -0
  510. package/dist/types/ultramodern-workspace/demo-components.d.ts +19 -0
  511. package/dist/types/ultramodern-workspace/descriptors.d.ts +63 -0
  512. package/dist/types/ultramodern-workspace/effect-diagnostics.d.ts +1 -0
  513. package/dist/types/ultramodern-workspace/fs-io.d.ts +14 -0
  514. package/dist/types/ultramodern-workspace/generation-result.d.ts +16 -0
  515. package/dist/types/ultramodern-workspace/index.d.ts +10 -0
  516. package/dist/types/ultramodern-workspace/locales.d.ts +51 -0
  517. package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +5 -0
  518. package/dist/types/ultramodern-workspace/mf-validation/discovery.d.ts +2 -0
  519. package/dist/types/ultramodern-workspace/mf-validation/inspect.d.ts +2 -0
  520. package/dist/types/ultramodern-workspace/mf-validation/object-literal.d.ts +4 -0
  521. package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +11 -0
  522. package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +6 -0
  523. package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +38 -0
  524. package/dist/types/ultramodern-workspace/mf-validation/validate.d.ts +4 -0
  525. package/dist/types/ultramodern-workspace/mf-validation.d.ts +4 -0
  526. package/dist/types/ultramodern-workspace/module-federation/config.d.ts +5 -0
  527. package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +4 -0
  528. package/dist/types/ultramodern-workspace/module-federation/remote-refs.d.ts +3 -0
  529. package/dist/types/ultramodern-workspace/module-federation/shared-config.d.ts +2 -0
  530. package/dist/types/ultramodern-workspace/module-federation.d.ts +5 -0
  531. package/dist/types/ultramodern-workspace/naming.d.ts +14 -0
  532. package/dist/types/ultramodern-workspace/overlay-baseline-guard.d.ts +57 -0
  533. package/dist/types/ultramodern-workspace/overlays.d.ts +6 -0
  534. package/dist/types/ultramodern-workspace/package-json.d.ts +8 -0
  535. package/dist/types/ultramodern-workspace/package-source.d.ts +3 -0
  536. package/dist/types/ultramodern-workspace/policy.d.ts +281 -0
  537. package/dist/types/ultramodern-workspace/public-api.d.ts +6 -0
  538. package/dist/types/ultramodern-workspace/public-surface.d.ts +27 -0
  539. package/dist/types/ultramodern-workspace/routes.d.ts +16 -0
  540. package/dist/types/ultramodern-workspace/shared-patches.d.ts +1 -0
  541. package/dist/types/ultramodern-workspace/shells.d.ts +48 -0
  542. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +18 -0
  543. package/dist/types/ultramodern-workspace/tsconfigs.d.ts +14 -0
  544. package/dist/types/ultramodern-workspace/types.d.ts +334 -0
  545. package/dist/types/ultramodern-workspace/versions.d.ts +42 -0
  546. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +63 -0
  547. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +16 -0
  548. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +217 -0
  549. package/dist/types/ultramodern-workspace/write-app.d.ts +4 -0
  550. package/dist/types/ultramodern-workspace/write-workspace.d.ts +6 -0
  551. package/dist/types/ultramodern-workspace/zerops.d.ts +2 -0
  552. package/package.json +115 -0
  553. package/template/AGENTS.md +20 -0
  554. package/template-workspace/.agents/agent-reference-repos.json +24 -0
  555. package/template-workspace/.codex/hooks.json +16 -0
  556. package/template-workspace/.codex/rstackjs-agent-skills-LICENSE +21 -0
  557. package/template-workspace/.codex/skills/rsbuild-best-practices/SKILL.md +57 -0
  558. package/template-workspace/.codex/skills/rsdoctor-analysis/SKILL.md +96 -0
  559. package/template-workspace/.codex/skills/rsdoctor-analysis/references/command-map.md +113 -0
  560. package/template-workspace/.codex/skills/rsdoctor-analysis/references/common-analysis-patterns.md +190 -0
  561. package/template-workspace/.codex/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +88 -0
  562. package/template-workspace/.codex/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +138 -0
  563. package/template-workspace/.codex/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +71 -0
  564. package/template-workspace/.codex/skills/rsdoctor-analysis/references/install-rsdoctor.md +39 -0
  565. package/template-workspace/.codex/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +103 -0
  566. package/template-workspace/.codex/skills/rslib-best-practices/SKILL.md +58 -0
  567. package/template-workspace/.codex/skills/rslib-modern-package/SKILL.md +173 -0
  568. package/template-workspace/.codex/skills/rspack-best-practices/SKILL.md +70 -0
  569. package/template-workspace/.codex/skills/rspack-tracing/SKILL.md +75 -0
  570. package/template-workspace/.codex/skills/rspack-tracing/references/bottlenecks.md +47 -0
  571. package/template-workspace/.codex/skills/rspack-tracing/references/tracing-guide.md +38 -0
  572. package/template-workspace/.codex/skills/rspack-tracing/scripts/analyze_trace.js +184 -0
  573. package/template-workspace/.codex/skills/rstest-best-practices/SKILL.md +133 -0
  574. package/template-workspace/.codex/skills-lock.json +114 -0
  575. package/template-workspace/.github/renovate.json +29 -0
  576. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +71 -0
  577. package/template-workspace/.gitignore.handlebars +16 -0
  578. package/template-workspace/.mise.toml.handlebars +3 -0
  579. package/template-workspace/.modernjs/release-cohort.json +244 -0
  580. package/template-workspace/AGENTS.md.handlebars +30 -0
  581. package/template-workspace/CLAUDE.md.handlebars +1 -0
  582. package/template-workspace/README.md.handlebars +229 -0
  583. package/template-workspace/lefthook.yml +24 -0
  584. package/template-workspace/oxfmt.config.ts +20 -0
  585. package/template-workspace/oxlint.config.ts +38 -0
  586. package/template-workspace/patches/@module-federation__bridge-react@2.9.0.patch +47 -0
  587. package/template-workspace/patches/@module-federation__dts-plugin@2.9.0.patch +26 -0
  588. package/template-workspace/patches/@module-federation__modern-js-v3@2.9.0.patch +268 -0
  589. package/template-workspace/patches/@module-federation__runtime-core@2.9.0.patch +13 -0
  590. package/template-workspace/patches/@tanstack__router-core@1.171.27.patch +28 -0
  591. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +471 -0
  592. package/template-workspace/patches/msgpackr@2.0.6.patch +29 -0
  593. package/template-workspace/patches/zod@4.4.3.patch +54 -0
  594. package/template-workspace/pnpm-workspace.yaml.handlebars +54 -0
  595. package/template-workspace/scripts/bootstrap-agent-skills.mjs +308 -0
  596. package/template-workspace/scripts/setup-agent-reference-repos.mjs +370 -0
  597. package/templates/app/shell-frame.tsx +49 -0
  598. package/templates/app/ultramodern-route-head.tsx.handlebars +153 -0
  599. package/templates/packages/shared-contracts-index.ts +400 -0
  600. package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +42 -0
  601. package/templates/workspace/apps/modern.config.ts.handlebars +187 -0
  602. package/templates/workspace/apps/shared/src/routes/ultramodern-jsonld.ts.handlebars +119 -0
  603. package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -0
  604. package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +49 -0
  605. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +27 -0
  606. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +4 -0
  607. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +44 -0
  608. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.helpers.tsx.handlebars +17 -0
  609. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.imports.tsx.handlebars +1 -0
  610. package/templates/workspace/packages/shared-design-tokens/tokens.css.handlebars +7 -0
  611. package/templates/workspace/tailwind.config.ts.handlebars +3 -0
  612. package/templates/workspace/verticals/server/checkout-cart-handlers.ts.handlebars +49 -0
  613. package/templates/workspace/verticals/server/checkout-cart-state.ts.handlebars +23 -0
  614. package/templates/workspace/verticals/shared/api.checkout-cart-contract-fields.ts.handlebars +1 -0
  615. package/templates/workspace/verticals/shared/api.checkout-cart-endpoints.ts.handlebars +23 -0
  616. package/templates/workspace/verticals/shared/api.checkout-cart-operation-contexts.ts.handlebars +29 -0
  617. package/templates/workspace/verticals/shared/api.checkout-cart-schemas.ts.handlebars +48 -0
  618. package/templates/workspace/verticals/src/api/checkout-cart-client-exports.ts.handlebars +70 -0
  619. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +779 -0
  620. package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mts +9 -0
  621. package/templates/workspace-scripts/generate-node-backend-federation.mjs +383 -0
  622. package/templates/workspace-scripts/generate-public-surface-assets.mjs +766 -0
  623. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +447 -0
  624. package/templates/workspace-scripts/proof-cloudflare-version.mjs +682 -0
  625. package/templates/workspace-scripts/proof-node-backend-federation.mjs +1281 -0
  626. package/templates/workspace-scripts/proof-workerd-ssr.mts +847 -0
  627. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +1116 -0
  628. package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
  629. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +412 -0
  630. package/templates/workspace-scripts/ultramodern-typecheck.mjs +159 -0
  631. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +4094 -0
@@ -0,0 +1,1281 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'node:child_process';
3
+ import { createHash } from 'node:crypto';
4
+ import fs from 'node:fs';
5
+ import { createRequire } from 'node:module';
6
+ import net from 'node:net';
7
+ import path from 'node:path';
8
+ import { fileURLToPath, pathToFileURL } from 'node:url';
9
+
10
+ const workspaceRoot = path.resolve(process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd());
11
+ const workspaceRequire = createRequire(path.join(workspaceRoot, 'package.json'));
12
+ const compactConfigPath = path.join(workspaceRoot, '.modernjs/ultramodern.json');
13
+ const defaultOut = path.join(
14
+ workspaceRoot,
15
+ '.codex/reports/node-backend-federation-proof/proof.json',
16
+ );
17
+
18
+ // Keep these constants/checks in sync with
19
+ // @modern-js/utils/universal backend-federation-contract. Generated workspace
20
+ // scripts do not currently import @modern-js/utils directly.
21
+ const contractVersion = 'microvertical-server-effect-v1';
22
+ const nodeAdapterVersion = 'backend-mf-effect-v1';
23
+ const backendExpose = './effect-api';
24
+ const releaseEnvelopePath = 'release/microvertical-release-envelope.json';
25
+ const localRuntimeRelativePaths = [
26
+ 'packages/cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
27
+ 'cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
28
+ ];
29
+
30
+ function readJson(filePath) {
31
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
32
+ }
33
+
34
+ function readBuildIdentity(app, target) {
35
+ const buildArtifactPath = path.join(
36
+ workspaceRoot,
37
+ app.directory,
38
+ target,
39
+ 'ultramodern-build.json',
40
+ );
41
+ assertFile(buildArtifactPath, app.id, 'stamped target build identity');
42
+ const artifact = readJson(buildArtifactPath);
43
+ const deliveryUnit = artifact.deliveryUnit ?? {};
44
+ return {
45
+ artifactPath: buildArtifactPath,
46
+ buildVersion: deliveryUnit.buildMarker ?? deliveryUnit.build,
47
+ packageName: deliveryUnit.packageName,
48
+ version: deliveryUnit.version,
49
+ unitId: deliveryUnit.unitId,
50
+ sourceRevision: deliveryUnit.sourceRevision,
51
+ };
52
+ }
53
+
54
+ function hasBackendFederationManifestAdapter(runtime) {
55
+ return typeof runtime?.loadBackendFederatedEffectApiFromManifest === 'function';
56
+ }
57
+
58
+ function findLocalRuntimePath(createBin) {
59
+ let current = path.dirname(fileURLToPath(pathToFileURL(createBin)));
60
+ for (let depth = 0; depth < 8; depth += 1) {
61
+ for (const relativePath of localRuntimeRelativePaths) {
62
+ const candidate = path.join(current, relativePath);
63
+ if (fs.existsSync(candidate)) {
64
+ return candidate;
65
+ }
66
+ }
67
+
68
+ const parent = path.dirname(current);
69
+ if (parent === current) {
70
+ break;
71
+ }
72
+ current = parent;
73
+ }
74
+
75
+ return undefined;
76
+ }
77
+
78
+ async function importBackendFederationRuntime() {
79
+ let importError;
80
+ try {
81
+ const runtimePath = workspaceRequire.resolve('@modern-js/plugin-bff/effect');
82
+ const runtime = await import(pathToFileURL(runtimePath).href);
83
+ if (hasBackendFederationManifestAdapter(runtime)) {
84
+ return runtime;
85
+ }
86
+
87
+ importError = new Error(
88
+ `${runtimePath} does not export loadBackendFederatedEffectApiFromManifest`,
89
+ );
90
+ } catch (error) {
91
+ importError = error;
92
+ }
93
+
94
+ const createBin = process.env.ULTRAMODERN_CREATE_BIN;
95
+ if (!createBin) {
96
+ throw importError;
97
+ }
98
+
99
+ const localRuntimePath = findLocalRuntimePath(createBin);
100
+ if (!localRuntimePath) {
101
+ throw importError;
102
+ }
103
+
104
+ const localRuntime = await import(pathToFileURL(localRuntimePath).href);
105
+ if (!hasBackendFederationManifestAdapter(localRuntime)) {
106
+ throw new Error(
107
+ `${localRuntimePath} does not export loadBackendFederatedEffectApiFromManifest`,
108
+ );
109
+ }
110
+
111
+ return localRuntime;
112
+ }
113
+
114
+ function normalizeRelativePath(value) {
115
+ return String(value ?? '')
116
+ .replace(/\\/gu, '/')
117
+ .replace(/^\.\/+/u, '');
118
+ }
119
+
120
+ function toPascalCase(value) {
121
+ return String(value)
122
+ .split(/[^a-zA-Z0-9]+/u)
123
+ .filter(Boolean)
124
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
125
+ .join('');
126
+ }
127
+
128
+ function createBackendName(app) {
129
+ return (
130
+ app.backendFederation?.name ??
131
+ app.backendFederation?.executionSurfaces?.node?.remoteName ??
132
+ app.serverExecution?.node?.remoteName ??
133
+ (typeof app.moduleFederation?.name === 'string'
134
+ ? `${app.moduleFederation.name}Backend`
135
+ : `vertical${toPascalCase(app.id)}Backend`)
136
+ );
137
+ }
138
+
139
+ function createBackendManifestUrl(app) {
140
+ return (
141
+ app.backendFederation?.executionSurfaces?.node?.manifestUrl ??
142
+ app.serverExecution?.node?.manifestUrl ??
143
+ `http://localhost:${app.port}/backend-mf-manifest.json`
144
+ );
145
+ }
146
+
147
+ function createBackendContainerEntry(app) {
148
+ return (
149
+ app.backendFederation?.executionSurfaces?.node?.containerEntry ??
150
+ app.serverExecution?.node?.containerEntry ??
151
+ `http://localhost:${app.port}/backendRemoteEntry.cjs`
152
+ );
153
+ }
154
+
155
+ function resolveRemoteType(app) {
156
+ return (
157
+ app.backendFederation?.executionSurfaces?.node?.remoteType ??
158
+ app.serverExecution?.node?.remoteType ??
159
+ 'commonjs-module'
160
+ );
161
+ }
162
+
163
+ function normalizeRoutePath(value) {
164
+ const route = String(value ?? '').trim();
165
+ if (!route) {
166
+ return '/';
167
+ }
168
+ return route.startsWith('/') ? route : `/${route}`;
169
+ }
170
+
171
+ function collectJsonSmokeChecks(apps, targetApp) {
172
+ const apiPrefix = normalizeRoutePath(targetApp.api?.prefix ?? `/${targetApp.id}-api`);
173
+
174
+ const configuredChecks = apps
175
+ .flatMap((app) =>
176
+ Array.isArray(app?.deploy?.cloudflare?.jsonSmokeChecks)
177
+ ? app.deploy.cloudflare.jsonSmokeChecks
178
+ : [],
179
+ )
180
+ .filter((check) => {
181
+ if (typeof check?.route !== 'string') {
182
+ return false;
183
+ }
184
+ const route = normalizeRoutePath(check.route);
185
+ return route === apiPrefix || route.startsWith(`${apiPrefix}/`);
186
+ });
187
+
188
+ if (configuredChecks.length > 0) {
189
+ return configuredChecks;
190
+ }
191
+
192
+ const readinessRoute =
193
+ targetApp.backendFederation?.exposes?.[backendExpose]?.readiness ??
194
+ targetApp.backendFederation?.versionBoundary?.api?.readiness ??
195
+ targetApp.serverExecution?.cloudflare?.apiReadiness;
196
+ if (typeof readinessRoute !== 'string' || readinessRoute.length === 0) {
197
+ return [];
198
+ }
199
+
200
+ return [
201
+ {
202
+ id: `${targetApp.id}-backend-readiness`,
203
+ method: 'GET',
204
+ route: readinessRoute,
205
+ expect: {
206
+ 'checks.api': 'ready',
207
+ status: 'ready',
208
+ versionSkew: 'none',
209
+ },
210
+ },
211
+ ];
212
+ }
213
+
214
+ function compactApps(config, appFilter) {
215
+ const apps = Array.isArray(config.topology?.apps) ? config.topology.apps : [];
216
+ const filteredApps = apps
217
+ .filter((app) => app?.kind === 'vertical' && app.api)
218
+ .filter((app) => !appFilter || app.id === appFilter)
219
+ .map((app) => ({
220
+ id: app.id,
221
+ directory:
222
+ typeof app.path === 'string' ? normalizeRelativePath(app.path) : `verticals/${app.id}`,
223
+ backendName: createBackendName(app),
224
+ manifestUrl: createBackendManifestUrl(app),
225
+ containerEntry: createBackendContainerEntry(app),
226
+ port: app.port,
227
+ portEnv: app.portEnv,
228
+ remoteType: resolveRemoteType(app),
229
+ smokeChecks: collectJsonSmokeChecks(apps, app),
230
+ compactDeliveryUnit:
231
+ app.deliveryUnit && typeof app.deliveryUnit === 'object'
232
+ ? app.deliveryUnit
233
+ : undefined,
234
+ }));
235
+
236
+ if (appFilter && filteredApps.length === 0) {
237
+ throw new Error(`No vertical API app matched --app ${appFilter}`);
238
+ }
239
+
240
+ return filteredApps;
241
+ }
242
+
243
+ const sleep = (durationMs) =>
244
+ new Promise((resolve) => setTimeout(resolve, durationMs));
245
+
246
+ async function assertPortAvailable(port, appId) {
247
+ for (const host of ['127.0.0.1', '::']) {
248
+ await new Promise((resolve, reject) => {
249
+ const server = net.createServer();
250
+ server.unref();
251
+ server.once('error', (error) => {
252
+ if (
253
+ host === '::' &&
254
+ ['EAFNOSUPPORT', 'EADDRNOTAVAIL'].includes(error?.code)
255
+ ) {
256
+ resolve();
257
+ return;
258
+ }
259
+ reject(
260
+ new Error(
261
+ `${appId} Node proof port ${port} is unavailable on ${host}: ${error.message}`,
262
+ ),
263
+ );
264
+ });
265
+ server.listen({ host, port }, () => {
266
+ server.close((error) => (error ? reject(error) : resolve()));
267
+ });
268
+ });
269
+ }
270
+ }
271
+
272
+ function runtimeLogTail(logPath) {
273
+ if (!fs.existsSync(logPath)) {
274
+ return '';
275
+ }
276
+ const source = fs.readFileSync(logPath, 'utf8');
277
+ return source.length > 8_000 ? source.slice(-8_000) : source;
278
+ }
279
+
280
+ async function waitForNodeRuntime(runtime, startupTimeoutMs) {
281
+ const deadline = Date.now() + startupTimeoutMs;
282
+ let lastError;
283
+ while (Date.now() < deadline) {
284
+ if (runtime.exitResult) {
285
+ const tail = runtimeLogTail(runtime.logPath);
286
+ throw new Error(
287
+ `${runtime.appId} Node runtime exited before readiness (code ${runtime.exitResult.exitCode}, signal ${runtime.exitResult.signal})${
288
+ tail ? `\n${tail}` : ''
289
+ }`,
290
+ );
291
+ }
292
+ try {
293
+ const response = await fetch(runtime.manifestUrl, {
294
+ headers: {
295
+ accept: 'application/json',
296
+ 'cache-control': 'no-cache',
297
+ },
298
+ });
299
+ if (response.ok) {
300
+ return;
301
+ }
302
+ lastError = new Error(`HTTP ${response.status}`);
303
+ } catch (error) {
304
+ lastError = error;
305
+ }
306
+ await sleep(100);
307
+ }
308
+
309
+ throw new Error(
310
+ `${runtime.appId} Node runtime did not serve ${runtime.manifestUrl} within ${startupTimeoutMs}ms${
311
+ lastError instanceof Error ? `: ${lastError.message}` : ''
312
+ }`,
313
+ );
314
+ }
315
+
316
+ export async function startNodeRuntime(
317
+ app,
318
+ target,
319
+ {
320
+ deferReadiness = false,
321
+ startupTimeoutMs = 90_000,
322
+ workspaceRoot: runtimeWorkspaceRoot = workspaceRoot,
323
+ } = {},
324
+ ) {
325
+ const parsedPort =
326
+ Number.isInteger(app.port) && app.port > 0
327
+ ? app.port
328
+ : Number(new URL(app.manifestUrl).port);
329
+ if (!Number.isInteger(parsedPort) || parsedPort <= 0) {
330
+ throw new Error(`${app.id} has no valid Node proof port`);
331
+ }
332
+ await assertPortAvailable(parsedPort, app.id);
333
+
334
+ const outputDirectory = path.join(
335
+ runtimeWorkspaceRoot,
336
+ app.directory,
337
+ target,
338
+ );
339
+ const entryPath = path.join(outputDirectory, 'index.js');
340
+ assertFile(entryPath, app.id, 'Node deploy entry');
341
+ const logPath = path.join(
342
+ runtimeWorkspaceRoot,
343
+ '.codex/reports/node-backend-federation-proof',
344
+ `${app.id}-serve.log`,
345
+ );
346
+ fs.mkdirSync(path.dirname(logPath), { recursive: true });
347
+ const logStream = fs.createWriteStream(logPath, { flags: 'w' });
348
+ const env = {
349
+ ...process.env,
350
+ PORT: String(parsedPort),
351
+ ...(typeof app.portEnv === 'string' && app.portEnv.length > 0
352
+ ? { [app.portEnv]: String(parsedPort) }
353
+ : {}),
354
+ };
355
+ const child = spawn(process.execPath, ['index.js'], {
356
+ cwd: outputDirectory,
357
+ detached: process.platform !== 'win32',
358
+ env,
359
+ stdio: ['ignore', 'pipe', 'pipe'],
360
+ });
361
+ child.stdout.pipe(logStream);
362
+ child.stderr.pipe(logStream);
363
+
364
+ const runtime = {
365
+ appId: app.id,
366
+ child,
367
+ exitResult: undefined,
368
+ logPath,
369
+ logStream,
370
+ manifestUrl: app.manifestUrl,
371
+ };
372
+ runtime.exited = new Promise((resolve) => {
373
+ let spawnError;
374
+ child.once('error', (error) => {
375
+ spawnError = error instanceof Error ? error.message : String(error);
376
+ });
377
+ child.once('close', (exitCode, signal) => {
378
+ runtime.exitResult = { exitCode, signal, spawnError };
379
+ logStream.end();
380
+ resolve(runtime.exitResult);
381
+ });
382
+ });
383
+
384
+ if (deferReadiness) {
385
+ runtime.startupTimeoutMs = startupTimeoutMs;
386
+ return runtime;
387
+ }
388
+
389
+ try {
390
+ await waitForNodeRuntime(runtime, startupTimeoutMs);
391
+ return runtime;
392
+ } catch (error) {
393
+ await stopNodeRuntime(runtime);
394
+ throw error;
395
+ }
396
+ }
397
+
398
+ function processGroupIsAlive(pid) {
399
+ if (process.platform === 'win32' || !pid) {
400
+ return false;
401
+ }
402
+ try {
403
+ process.kill(-pid, 0);
404
+ return true;
405
+ } catch {
406
+ return false;
407
+ }
408
+ }
409
+
410
+ function signalRuntime(runtime, signal) {
411
+ if (!runtime.child.pid) {
412
+ return;
413
+ }
414
+ if (process.platform === 'win32') {
415
+ runtime.child.kill(signal);
416
+ return;
417
+ }
418
+ try {
419
+ process.kill(-runtime.child.pid, signal);
420
+ } catch {}
421
+ }
422
+
423
+ export async function stopNodeRuntime(runtime) {
424
+ if (!runtime?.child || runtime.exitResult) {
425
+ return;
426
+ }
427
+ signalRuntime(runtime, 'SIGTERM');
428
+ const deadline = Date.now() + 5_000;
429
+ while (
430
+ processGroupIsAlive(runtime.child.pid) &&
431
+ Date.now() < deadline
432
+ ) {
433
+ await sleep(50);
434
+ }
435
+ if (processGroupIsAlive(runtime.child.pid)) {
436
+ signalRuntime(runtime, 'SIGKILL');
437
+ }
438
+ await Promise.race([runtime.exited, sleep(1_000)]);
439
+ }
440
+
441
+ export function resolveNodeProofServerMode(env = process.env) {
442
+ const mode = env.ULTRAMODERN_NODE_PROOF_SERVER_MODE ?? 'owned';
443
+ if (mode !== 'owned' && mode !== 'existing') {
444
+ throw new Error(
445
+ `ULTRAMODERN_NODE_PROOF_SERVER_MODE must be "owned" or "existing", received ${JSON.stringify(mode)}`,
446
+ );
447
+ }
448
+ return mode;
449
+ }
450
+
451
+ function assertEqual(actual, expected, message) {
452
+ if (actual !== expected) {
453
+ throw new Error(`${message}: expected ${expected}, received ${actual}`);
454
+ }
455
+ }
456
+
457
+ function assertFile(filePath, appId, label) {
458
+ if (!fs.existsSync(filePath)) {
459
+ throw new Error(
460
+ `${appId} missing ${path.relative(
461
+ workspaceRoot,
462
+ filePath,
463
+ )}; run pnpm build or the relevant vertical build before pnpm node:proof`,
464
+ );
465
+ }
466
+
467
+ if (!fs.statSync(filePath).isFile()) {
468
+ throw new Error(`${appId} ${label} is not a file`);
469
+ }
470
+ }
471
+
472
+ function sha256(bytes) {
473
+ return createHash('sha256').update(bytes).digest('hex');
474
+ }
475
+
476
+ function readBoundReleaseEnvelope(app, target) {
477
+ const targetDirectory = path.join(workspaceRoot, app.directory, target);
478
+ const envelopePath = path.join(targetDirectory, releaseEnvelopePath);
479
+ assertFile(envelopePath, app.id, 'Node release envelope');
480
+ const envelope = readJson(envelopePath);
481
+ assertEqual(
482
+ envelope.schemaVersion,
483
+ 3,
484
+ `${app.id} release-envelope schema`,
485
+ );
486
+ assertEqual(envelope.target, 'node', `${app.id} release-envelope target`);
487
+
488
+ const manifestLogicalPath = envelope.surfaces?.backendFederation?.manifest;
489
+ const containerLogicalPath = envelope.surfaces?.backendFederation?.container;
490
+ assertEqual(
491
+ manifestLogicalPath,
492
+ 'backend-mf-manifest.json',
493
+ `${app.id} release-envelope backend manifest path`,
494
+ );
495
+ assertEqual(
496
+ containerLogicalPath,
497
+ 'backendRemoteEntry.cjs',
498
+ `${app.id} release-envelope backend container path`,
499
+ );
500
+
501
+ const apiBackendPaths = envelope.surfaces?.apiBackend;
502
+ if (!Array.isArray(apiBackendPaths) || apiBackendPaths.length === 0) {
503
+ throw new Error(`${app.id} release envelope has no bound API/backend executable`);
504
+ }
505
+ if (
506
+ !apiBackendPaths.some((logicalPath) =>
507
+ /^api\/.*\.(?:c|m)?js$/u.test(logicalPath),
508
+ )
509
+ ) {
510
+ throw new Error(
511
+ `${app.id} release envelope does not bind a compiled api/**/*.js executable`,
512
+ );
513
+ }
514
+
515
+ const artifacts = Array.isArray(envelope.artifacts) ? envelope.artifacts : [];
516
+ const artifactByPath = new Map(
517
+ artifacts.map((artifact) => [artifact.logicalPath, artifact]),
518
+ );
519
+ const requiredPaths = [
520
+ manifestLogicalPath,
521
+ containerLogicalPath,
522
+ ...apiBackendPaths,
523
+ ];
524
+ const boundArtifacts = requiredPaths.map((logicalPath) => {
525
+ const artifact = artifactByPath.get(logicalPath);
526
+ if (!artifact) {
527
+ throw new Error(
528
+ `${app.id} release envelope surface references unbound artifact ${logicalPath}`,
529
+ );
530
+ }
531
+ if (artifact.kind !== 'file') {
532
+ throw new Error(
533
+ `${app.id} release envelope surface references non-file artifact ${logicalPath}`,
534
+ );
535
+ }
536
+ const artifactPath = path.join(targetDirectory, logicalPath);
537
+ assertFile(artifactPath, app.id, `release-envelope artifact ${logicalPath}`);
538
+ const bytes = fs.readFileSync(artifactPath);
539
+ assertEqual(
540
+ bytes.byteLength,
541
+ artifact.byteLength,
542
+ `${app.id} ${logicalPath} envelope byte length`,
543
+ );
544
+ assertEqual(
545
+ sha256(bytes),
546
+ artifact.sha256,
547
+ `${app.id} ${logicalPath} envelope SHA-256`,
548
+ );
549
+ return artifact;
550
+ });
551
+
552
+ return {
553
+ envelope,
554
+ envelopePath,
555
+ manifestArtifact: artifactByPath.get(manifestLogicalPath),
556
+ containerArtifact: artifactByPath.get(containerLogicalPath),
557
+ apiBackendArtifacts: boundArtifacts.filter((artifact) =>
558
+ apiBackendPaths.includes(artifact.logicalPath),
559
+ ),
560
+ };
561
+ }
562
+
563
+ export async function fetchBoundArtifact(
564
+ app,
565
+ url,
566
+ artifact,
567
+ label,
568
+ fetchImpl = globalThis.fetch,
569
+ ) {
570
+ const response = await fetchImpl(url, {
571
+ headers: {
572
+ accept: '*/*',
573
+ 'cache-control': 'no-cache',
574
+ },
575
+ });
576
+ if (!response.ok) {
577
+ throw new Error(`${app.id} live ${label} returned HTTP ${response.status}`);
578
+ }
579
+ const bytes = Buffer.from(await response.arrayBuffer());
580
+ assertEqual(
581
+ bytes.byteLength,
582
+ artifact.byteLength,
583
+ `${app.id} live ${label} byte length`,
584
+ );
585
+ const digest = sha256(bytes);
586
+ assertEqual(
587
+ digest,
588
+ artifact.sha256,
589
+ `${app.id} live ${label} SHA-256`,
590
+ );
591
+ const urlPath = normalizeRelativePath(new URL(url).pathname);
592
+ if (!urlPath.endsWith(artifact.logicalPath)) {
593
+ throw new Error(
594
+ `${app.id} live ${label} URL ${url} does not map to envelope artifact ${artifact.logicalPath}`,
595
+ );
596
+ }
597
+ return {
598
+ bytes,
599
+ evidence: {
600
+ url,
601
+ logicalPath: artifact.logicalPath,
602
+ statusCode: response.status,
603
+ byteLength: bytes.byteLength,
604
+ sha256: digest,
605
+ status: 'pass',
606
+ },
607
+ };
608
+ }
609
+
610
+ export async function loadBackendFromVerifiedArtifacts({
611
+ app,
612
+ buildIdentity,
613
+ container,
614
+ loadImpl,
615
+ manifest,
616
+ }) {
617
+ let manifestDocument;
618
+ try {
619
+ manifestDocument = JSON.parse(Buffer.from(manifest.bytes).toString('utf8'));
620
+ } catch (error) {
621
+ throw new Error(
622
+ `${app.id} verified live backend manifest is invalid JSON: ${error.message}`,
623
+ );
624
+ }
625
+ const verifiedContainerBytes = Buffer.from(container.bytes);
626
+ const verifiedEntryUrl = new URL(app.containerEntry).href;
627
+ const fetchVerifiedEntry = async (url, init = {}) => {
628
+ assertEqual(
629
+ new URL(url).href,
630
+ verifiedEntryUrl,
631
+ `${app.id} verified backend container URL`,
632
+ );
633
+ if (init.signal?.aborted) {
634
+ throw init.signal.reason ?? new Error('Verified entry load was aborted');
635
+ }
636
+ return new Response(verifiedContainerBytes, {
637
+ headers: {
638
+ 'content-length': String(verifiedContainerBytes.byteLength),
639
+ 'content-type': 'text/javascript',
640
+ },
641
+ status: 200,
642
+ });
643
+ };
644
+
645
+ return loadImpl({
646
+ hostName: 'ultramodernNodeBackendProof',
647
+ manifest: manifestDocument,
648
+ entryPolicy: { fetch: fetchVerifiedEntry },
649
+ expected: {
650
+ buildMarker: buildIdentity.buildVersion,
651
+ buildVersion: buildIdentity.buildVersion,
652
+ contractVersion,
653
+ nodeAdapterVersion,
654
+ packageName: buildIdentity.packageName,
655
+ remoteName: app.backendName,
656
+ unitId: buildIdentity.unitId,
657
+ },
658
+ });
659
+ }
660
+
661
+ async function proveLiveApi(app, manifest, releaseBinding) {
662
+ const route = normalizeRoutePath(
663
+ manifest.backendFederation?.readinessPath,
664
+ );
665
+ const url = new URL(route, app.manifestUrl).href;
666
+ const response = await fetch(url, {
667
+ headers: {
668
+ accept: 'application/json',
669
+ 'cache-control': 'no-cache',
670
+ },
671
+ });
672
+ const bodyText = await response.text();
673
+ let body;
674
+ try {
675
+ body = bodyText.length > 0 ? JSON.parse(bodyText) : undefined;
676
+ } catch (error) {
677
+ throw new Error(
678
+ `${app.id} live API GET ${route} did not return JSON: ${error.message}`,
679
+ );
680
+ }
681
+ if (!response.ok) {
682
+ throw new Error(
683
+ `${app.id} live API GET ${route} returned HTTP ${response.status}`,
684
+ );
685
+ }
686
+
687
+ const identity = releaseBinding.envelope.identity ?? {};
688
+ const marker = body?.marker;
689
+ assertEqual(
690
+ marker?.unitId,
691
+ identity.unitId,
692
+ `${app.id} live API marker unitId`,
693
+ );
694
+ assertEqual(
695
+ marker?.buildMarker ?? marker?.build,
696
+ identity.buildMarker,
697
+ `${app.id} live API marker buildMarker`,
698
+ );
699
+ assertEqual(
700
+ marker?.sourceRevision,
701
+ identity.sourceRevision,
702
+ `${app.id} live API marker sourceRevision`,
703
+ );
704
+ assertEqual(
705
+ marker?.version,
706
+ identity.releaseVersion,
707
+ `${app.id} live API marker releaseVersion`,
708
+ );
709
+
710
+ return {
711
+ method: 'GET',
712
+ route,
713
+ url,
714
+ statusCode: response.status,
715
+ marker: {
716
+ unitId: marker.unitId,
717
+ buildMarker: marker.buildMarker ?? marker.build,
718
+ sourceRevision: marker.sourceRevision,
719
+ releaseVersion: marker.version,
720
+ },
721
+ envelopeDigest: releaseBinding.envelope.envelopeDigest,
722
+ apiBackendArtifacts: releaseBinding.apiBackendArtifacts.map((artifact) => ({
723
+ logicalPath: artifact.logicalPath,
724
+ runtime: artifact.runtime,
725
+ byteLength: artifact.byteLength,
726
+ sha256: artifact.sha256,
727
+ })),
728
+ status: 'pass',
729
+ };
730
+ }
731
+
732
+ function jsonPathValue(value, path) {
733
+ const segments = String(path ?? '')
734
+ .split('.')
735
+ .filter(Boolean);
736
+ let current = value;
737
+ for (const segment of segments) {
738
+ if (current === null || current === undefined) {
739
+ return undefined;
740
+ }
741
+ if (Array.isArray(current) && /^\d+$/u.test(segment)) {
742
+ current = current[Number(segment)];
743
+ continue;
744
+ }
745
+ if (typeof current !== 'object' || !Object.hasOwn(current, segment)) {
746
+ return undefined;
747
+ }
748
+ current = current[segment];
749
+ }
750
+ return current;
751
+ }
752
+
753
+ function normalizeJsonExpectations(check) {
754
+ if (Array.isArray(check.expectations)) {
755
+ return check.expectations;
756
+ }
757
+ if (check.expect && typeof check.expect === 'object') {
758
+ return Object.entries(check.expect).map(([path, value]) => ({
759
+ path,
760
+ value,
761
+ }));
762
+ }
763
+ return [];
764
+ }
765
+
766
+ function assertJsonEqual(actual, expected, message) {
767
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) {
768
+ throw new Error(
769
+ `${message}: expected ${JSON.stringify(expected)}, received ${JSON.stringify(actual)}`,
770
+ );
771
+ }
772
+ }
773
+
774
+ async function runSmokeChecks(app, loaded, createEffectBffTestHandler) {
775
+ if (!Array.isArray(app.smokeChecks) || app.smokeChecks.length === 0) {
776
+ throw new Error(
777
+ `${app.id} backend runtime has no smoke checks; configure a JSON smoke check or expose an API readiness route`,
778
+ );
779
+ }
780
+ if (typeof createEffectBffTestHandler !== 'function') {
781
+ throw new Error(`${app.id} backend runtime cannot create Effect test handler`);
782
+ }
783
+
784
+ const servicePrefix = loaded.contract?.servicePrefix ?? loaded.contract?.apiPrefix;
785
+ if (typeof servicePrefix !== 'string' || servicePrefix.length === 0) {
786
+ throw new Error(
787
+ `${app.id} backend expose missing contract.servicePrefix/apiPrefix`,
788
+ );
789
+ }
790
+
791
+ const edge = await createEffectBffTestHandler({
792
+ module: loaded.runtime,
793
+ prefix: servicePrefix,
794
+ });
795
+ try {
796
+ const results = [];
797
+ for (const check of app.smokeChecks) {
798
+ const method = String(check.method ?? 'GET').toUpperCase();
799
+ const route = normalizeRoutePath(check.route);
800
+ const headers = {};
801
+ const init = { method, headers };
802
+ if (check.body !== undefined) {
803
+ headers['content-type'] = 'application/json';
804
+ init.body = JSON.stringify(check.body);
805
+ }
806
+
807
+ const response = await edge.handler(new Request(new URL(route, 'http://localhost'), init));
808
+ const bodyText = await response.text();
809
+ let body;
810
+ try {
811
+ body = bodyText.length > 0 ? JSON.parse(bodyText) : undefined;
812
+ } catch (error) {
813
+ throw new Error(`${app.id} ${method} ${route} did not return JSON: ${error.message}`);
814
+ }
815
+
816
+ if (!response.ok) {
817
+ throw new Error(`${app.id} ${method} ${route} returned HTTP ${response.status}`);
818
+ }
819
+
820
+ const assertions = normalizeJsonExpectations(check).map((expectation) => {
821
+ const actual = jsonPathValue(body, expectation.path);
822
+ assertJsonEqual(
823
+ actual,
824
+ expectation.value,
825
+ `${app.id} ${method} ${route} ${expectation.path}`,
826
+ );
827
+ return {
828
+ path: expectation.path,
829
+ expected: expectation.value,
830
+ actual,
831
+ status: 'pass',
832
+ };
833
+ });
834
+
835
+ results.push({
836
+ id: check.id ?? `${method} ${route}`,
837
+ method,
838
+ route,
839
+ statusCode: response.status,
840
+ assertions,
841
+ status: 'pass',
842
+ });
843
+ }
844
+ return results;
845
+ } finally {
846
+ await edge.dispose?.();
847
+ }
848
+ }
849
+
850
+ function resolveArtifacts(app, target) {
851
+ const targetDirectory = path.join(workspaceRoot, app.directory, target);
852
+
853
+ return {
854
+ manifestPath: path.join(targetDirectory, 'backend-mf-manifest.json'),
855
+ entryPath: path.join(targetDirectory, 'backendRemoteEntry.cjs'),
856
+ };
857
+ }
858
+
859
+ function validateManifest(app, manifest, buildIdentity) {
860
+ assertEqual(manifest.schemaVersion, 1, `${app.id} backend manifest schema`);
861
+ assertEqual(manifest.name, app.backendName, `${app.id} backend manifest name`);
862
+ assertEqual(manifest.id, app.backendName, `${app.id} backend manifest id`);
863
+ assertEqual(
864
+ manifest.version,
865
+ buildIdentity.version,
866
+ `${app.id} backend manifest version`,
867
+ );
868
+ assertEqual(
869
+ manifest.buildVersion,
870
+ buildIdentity.buildVersion,
871
+ `${app.id} backend manifest build version`,
872
+ );
873
+ assertEqual(manifest.metaData?.name, app.backendName, `${app.id} backend manifest metadata name`);
874
+ assertEqual(
875
+ manifest.metaData?.buildInfo?.buildName,
876
+ buildIdentity.packageName,
877
+ `${app.id} backend manifest package name`,
878
+ );
879
+ assertEqual(
880
+ manifest.metaData?.buildInfo?.buildVersion,
881
+ buildIdentity.buildVersion,
882
+ `${app.id} backend manifest metadata build version`,
883
+ );
884
+ assertEqual(
885
+ manifest.metaData?.remoteEntry?.name,
886
+ 'backendRemoteEntry.cjs',
887
+ `${app.id} backend manifest remote entry filename`,
888
+ );
889
+ assertEqual(
890
+ manifest.metaData?.remoteEntry?.type,
891
+ app.remoteType,
892
+ `${app.id} backend manifest remote entry type`,
893
+ );
894
+ assertEqual(manifest.entry?.url, app.containerEntry, `${app.id} backend manifest entry URL`);
895
+ assertEqual(manifest.entry?.type, app.remoteType, `${app.id} backend manifest entry type`);
896
+ assertEqual(
897
+ manifest.backendFederation?.role,
898
+ 'microvertical-server',
899
+ `${app.id} backend manifest role`,
900
+ );
901
+ assertEqual(
902
+ manifest.backendFederation?.runtimeFramework,
903
+ 'effect',
904
+ `${app.id} backend manifest runtime framework`,
905
+ );
906
+ assertEqual(
907
+ manifest.backendFederation?.strictEffectApproach,
908
+ true,
909
+ `${app.id} backend manifest strict Effect flag`,
910
+ );
911
+ assertEqual(
912
+ manifest.backendFederation?.contractVersion,
913
+ contractVersion,
914
+ `${app.id} backend manifest contract version`,
915
+ );
916
+ assertEqual(
917
+ manifest.backendFederation?.nodeAdapterVersion,
918
+ nodeAdapterVersion,
919
+ `${app.id} backend manifest Node adapter version`,
920
+ );
921
+ assertEqual(
922
+ manifest.backendFederation?.manifestUrl,
923
+ app.manifestUrl,
924
+ `${app.id} backend manifest URL`,
925
+ );
926
+ assertEqual(
927
+ manifest.backendFederation?.containerEntry,
928
+ app.containerEntry,
929
+ `${app.id} backend container URL`,
930
+ );
931
+ assertEqual(manifest.backendFederation?.expose, backendExpose, `${app.id} backend expose`);
932
+ assertEqual(
933
+ manifest.backendFederation?.versionBoundary?.packageName,
934
+ buildIdentity.packageName,
935
+ `${app.id} backend manifest version-boundary package`,
936
+ );
937
+ assertEqual(
938
+ manifest.backendFederation?.versionBoundary?.version,
939
+ buildIdentity.version,
940
+ `${app.id} backend manifest version-boundary version`,
941
+ );
942
+ assertEqual(
943
+ manifest.backendFederation?.versionBoundary?.buildVersion,
944
+ buildIdentity.buildVersion,
945
+ `${app.id} backend manifest version-boundary build version`,
946
+ );
947
+
948
+ const manifestDeliveryUnit = manifest.backendFederation?.deliveryUnit;
949
+ if (manifestDeliveryUnit) {
950
+ assertEqual(
951
+ manifestDeliveryUnit.unitId,
952
+ buildIdentity.unitId,
953
+ `${app.id} backend manifest delivery-unit id`,
954
+ );
955
+ assertEqual(
956
+ manifestDeliveryUnit.buildMarker,
957
+ buildIdentity.buildVersion,
958
+ `${app.id} backend manifest delivery-unit build marker`,
959
+ );
960
+ assertEqual(
961
+ manifestDeliveryUnit.packageName,
962
+ buildIdentity.packageName,
963
+ `${app.id} backend manifest delivery-unit package name`,
964
+ );
965
+ assertEqual(
966
+ manifestDeliveryUnit.version,
967
+ buildIdentity.version,
968
+ `${app.id} backend manifest delivery-unit version`,
969
+ );
970
+ assertEqual(
971
+ manifestDeliveryUnit.sourceRevision,
972
+ buildIdentity.sourceRevision,
973
+ `${app.id} backend manifest delivery-unit source revision`,
974
+ );
975
+ }
976
+
977
+ const versionBoundaryDeliveryUnit =
978
+ manifest.backendFederation?.versionBoundary?.deliveryUnit;
979
+ if (versionBoundaryDeliveryUnit) {
980
+ assertEqual(
981
+ versionBoundaryDeliveryUnit.unitId,
982
+ buildIdentity.unitId,
983
+ `${app.id} backend manifest version-boundary delivery-unit id`,
984
+ );
985
+ assertEqual(
986
+ versionBoundaryDeliveryUnit.buildMarker,
987
+ buildIdentity.buildVersion,
988
+ `${app.id} backend manifest version-boundary delivery-unit build marker`,
989
+ );
990
+ }
991
+
992
+ const exposes = Array.isArray(manifest.exposes) ? manifest.exposes : [];
993
+ if (!exposes.some((expose) => expose?.name === backendExpose)) {
994
+ throw new Error(`${app.id} backend manifest missing ${backendExpose} expose`);
995
+ }
996
+ }
997
+
998
+ function assertCompactStableIdentityMatchesBuild(app, buildIdentity) {
999
+ const compactDeliveryUnit = app.compactDeliveryUnit;
1000
+ if (!compactDeliveryUnit) {
1001
+ return;
1002
+ }
1003
+
1004
+ const mismatches = [];
1005
+ const compare = (label, a, b) => {
1006
+ if (a !== undefined && b !== undefined && a !== b) {
1007
+ mismatches.push(`${label}: deliveryUnit=${a} vs ultramodern-build=${b}`);
1008
+ }
1009
+ };
1010
+ compare('unitId', compactDeliveryUnit.unitId, buildIdentity.unitId);
1011
+ compare(
1012
+ 'packageName',
1013
+ compactDeliveryUnit.packageName,
1014
+ buildIdentity.packageName,
1015
+ );
1016
+ compare('version', compactDeliveryUnit.version, buildIdentity.version);
1017
+
1018
+ if (mismatches.length > 0) {
1019
+ throw new Error(
1020
+ `${app.id} delivery-unit identity drift between ${path.relative(
1021
+ workspaceRoot,
1022
+ compactConfigPath,
1023
+ )} (generation metadata) and ${path.relative(
1024
+ workspaceRoot,
1025
+ buildIdentity.artifactPath,
1026
+ )} (stamped target identity): ${mismatches.join('; ')}`,
1027
+ );
1028
+ }
1029
+ }
1030
+
1031
+ async function proveBackend(app, backendRuntime, target) {
1032
+ const {
1033
+ createEffectBffTestHandler,
1034
+ loadBackendFederatedEffectApiFromManifest,
1035
+ } = backendRuntime;
1036
+ const { manifestPath, entryPath } = resolveArtifacts(app, target);
1037
+
1038
+ assertFile(manifestPath, app.id, 'backend manifest');
1039
+ assertFile(entryPath, app.id, 'backend remote entry');
1040
+
1041
+ const buildIdentity = readBuildIdentity(app, target);
1042
+ assertCompactStableIdentityMatchesBuild(app, buildIdentity);
1043
+ const manifest = readJson(manifestPath);
1044
+ validateManifest(app, manifest, buildIdentity);
1045
+ const releaseBinding = readBoundReleaseEnvelope(app, target);
1046
+ assertEqual(
1047
+ releaseBinding.envelope.identity?.unitId,
1048
+ buildIdentity.unitId,
1049
+ `${app.id} release-envelope/build unitId`,
1050
+ );
1051
+ assertEqual(
1052
+ releaseBinding.envelope.identity?.buildMarker,
1053
+ buildIdentity.buildVersion,
1054
+ `${app.id} release-envelope/build marker`,
1055
+ );
1056
+ assertEqual(
1057
+ releaseBinding.envelope.identity?.sourceRevision,
1058
+ buildIdentity.sourceRevision,
1059
+ `${app.id} release-envelope/build source revision`,
1060
+ );
1061
+ assertEqual(
1062
+ releaseBinding.envelope.identity?.releaseVersion,
1063
+ buildIdentity.version,
1064
+ `${app.id} release-envelope/build version`,
1065
+ );
1066
+ const fetchedArtifacts = {
1067
+ manifest: await fetchBoundArtifact(
1068
+ app,
1069
+ app.manifestUrl,
1070
+ releaseBinding.manifestArtifact,
1071
+ 'backend manifest',
1072
+ ),
1073
+ container: await fetchBoundArtifact(
1074
+ app,
1075
+ app.containerEntry,
1076
+ releaseBinding.containerArtifact,
1077
+ 'backend container',
1078
+ ),
1079
+ };
1080
+ const liveArtifacts = {
1081
+ manifest: fetchedArtifacts.manifest.evidence,
1082
+ container: fetchedArtifacts.container.evidence,
1083
+ };
1084
+
1085
+ const loaded = await loadBackendFromVerifiedArtifacts({
1086
+ app,
1087
+ buildIdentity,
1088
+ container: fetchedArtifacts.container,
1089
+ loadImpl: loadBackendFederatedEffectApiFromManifest,
1090
+ manifest: fetchedArtifacts.manifest,
1091
+ });
1092
+ const backendContract = loaded.backendFederationContract;
1093
+
1094
+ assertEqual(
1095
+ backendContract?.strictEffectApproach,
1096
+ true,
1097
+ `${app.id} backend expose strict Effect flag`,
1098
+ );
1099
+ assertEqual(
1100
+ backendContract?.runtimeFramework,
1101
+ 'effect',
1102
+ `${app.id} backend expose runtime framework`,
1103
+ );
1104
+ assertEqual(backendContract?.role, 'microvertical-server', `${app.id} backend expose role`);
1105
+ assertEqual(backendContract?.name, app.backendName, `${app.id} backend expose name`);
1106
+ assertEqual(
1107
+ backendContract?.compatibility?.contractVersion,
1108
+ contractVersion,
1109
+ `${app.id} backend expose contract version`,
1110
+ );
1111
+ assertEqual(
1112
+ backendContract?.compatibility?.nodeAdapterVersion,
1113
+ nodeAdapterVersion,
1114
+ `${app.id} backend expose Node adapter version`,
1115
+ );
1116
+ assertEqual(
1117
+ backendContract?.compatibility?.packageName,
1118
+ buildIdentity.packageName,
1119
+ `${app.id} backend expose package name`,
1120
+ );
1121
+ assertEqual(
1122
+ backendContract?.compatibility?.build,
1123
+ buildIdentity.buildVersion,
1124
+ `${app.id} backend expose build version`,
1125
+ );
1126
+ assertEqual(
1127
+ manifest.buildVersion,
1128
+ backendContract?.compatibility?.build,
1129
+ `${app.id} backend manifest/expose build coupling`,
1130
+ );
1131
+ if (backendContract?.compatibility?.unitId !== undefined) {
1132
+ assertEqual(
1133
+ backendContract.compatibility.unitId,
1134
+ manifest.backendFederation?.deliveryUnit?.unitId,
1135
+ `${app.id} backend expose delivery-unit id`,
1136
+ );
1137
+ }
1138
+
1139
+ if (loaded.api === undefined || loaded.runtime === undefined) {
1140
+ throw new Error(`${app.id} backend expose missing api/runtime exports`);
1141
+ }
1142
+
1143
+ const smokeChecks = await runSmokeChecks(app, loaded, createEffectBffTestHandler);
1144
+ const liveApi = await proveLiveApi(app, manifest, releaseBinding);
1145
+
1146
+ return {
1147
+ appId: app.id,
1148
+ expose: backendExpose,
1149
+ manifestPath: normalizeRelativePath(path.relative(workspaceRoot, manifestPath)),
1150
+ containerPath: normalizeRelativePath(path.relative(workspaceRoot, entryPath)),
1151
+ manifestUrl: app.manifestUrl,
1152
+ containerEntry: app.containerEntry,
1153
+ runtimeEntry: app.containerEntry,
1154
+ releaseEnvelope: {
1155
+ path: normalizeRelativePath(
1156
+ path.relative(workspaceRoot, releaseBinding.envelopePath),
1157
+ ),
1158
+ envelopeDigest: releaseBinding.envelope.envelopeDigest,
1159
+ target: releaseBinding.envelope.target,
1160
+ },
1161
+ liveArtifacts,
1162
+ liveApi,
1163
+ remoteName: app.backendName,
1164
+ remoteType: app.remoteType,
1165
+ versionBoundary: {
1166
+ packageName: buildIdentity.packageName,
1167
+ version: buildIdentity.version,
1168
+ buildVersion: buildIdentity.buildVersion,
1169
+ unitId: buildIdentity.unitId,
1170
+ sourceRevision: buildIdentity.sourceRevision,
1171
+ },
1172
+ smokeChecks,
1173
+ status: 'pass',
1174
+ };
1175
+ }
1176
+
1177
+ function parseArgs(argv) {
1178
+ const parsed = { app: undefined, out: defaultOut, target: '.output' };
1179
+
1180
+ for (let index = 0; index < argv.length; index += 1) {
1181
+ const arg = argv[index];
1182
+ if (arg === '--out') {
1183
+ parsed.out = argv[index + 1];
1184
+ index += 1;
1185
+ } else if (arg === '--app') {
1186
+ parsed.app = argv[index + 1];
1187
+ index += 1;
1188
+ } else if (arg === '--target') {
1189
+ parsed.target = argv[index + 1];
1190
+ index += 1;
1191
+ } else if (arg === '--help' || arg === '-h') {
1192
+ parsed.help = true;
1193
+ } else {
1194
+ throw new Error(`Unknown argument: ${arg}`);
1195
+ }
1196
+ }
1197
+
1198
+ if (!parsed.out) {
1199
+ throw new Error('--out requires a path');
1200
+ }
1201
+ if (!parsed.target) {
1202
+ throw new Error('--target requires a directory name');
1203
+ }
1204
+
1205
+ return parsed;
1206
+ }
1207
+
1208
+ function printHelp() {
1209
+ process.stdout
1210
+ .write(`Usage: node scripts/proof-node-backend-federation.mjs [--app id] [--target .output] [--out proof.json]
1211
+ `);
1212
+ }
1213
+
1214
+ async function main(argv = process.argv.slice(2)) {
1215
+ const args = parseArgs(argv);
1216
+ if (args.help) {
1217
+ printHelp();
1218
+ return 0;
1219
+ }
1220
+
1221
+ const config = readJson(compactConfigPath);
1222
+ const runtimeApps = compactApps(config);
1223
+ const apps = args.app ? compactApps(config, args.app) : runtimeApps;
1224
+ const results = [];
1225
+ const backendRuntime =
1226
+ apps.length > 0 ? await importBackendFederationRuntime() : undefined;
1227
+ const runtimes = [];
1228
+ try {
1229
+ if (resolveNodeProofServerMode() === 'owned') {
1230
+ for (const app of runtimeApps) {
1231
+ runtimes.push(
1232
+ await startNodeRuntime(app, args.target, {
1233
+ deferReadiness: true,
1234
+ }),
1235
+ );
1236
+ }
1237
+ await Promise.all(
1238
+ runtimes.map((runtime) =>
1239
+ waitForNodeRuntime(runtime, runtime.startupTimeoutMs),
1240
+ ),
1241
+ );
1242
+ }
1243
+ for (const app of apps) {
1244
+ results.push(await proveBackend(app, backendRuntime, args.target));
1245
+ }
1246
+ } finally {
1247
+ await Promise.allSettled(
1248
+ runtimes.reverse().map((runtime) => stopNodeRuntime(runtime)),
1249
+ );
1250
+ }
1251
+
1252
+ const report = {
1253
+ schemaVersion: 1,
1254
+ generatedAt: new Date().toISOString(),
1255
+ status: results.length > 0 ? 'pass' : 'skipped',
1256
+ target: args.target,
1257
+ results,
1258
+ };
1259
+
1260
+ fs.mkdirSync(path.dirname(args.out), { recursive: true });
1261
+ fs.writeFileSync(args.out, `${JSON.stringify(report, null, 2)}\n`);
1262
+ process.stdout.write(`[node-backend-federation-proof] ${report.status}: ${args.out}\n`);
1263
+
1264
+ return 0;
1265
+ }
1266
+
1267
+ const isMain =
1268
+ typeof process.argv[1] === 'string' &&
1269
+ path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
1270
+
1271
+ if (isMain) {
1272
+ main().then(
1273
+ (exitCode) => {
1274
+ process.exitCode = exitCode;
1275
+ },
1276
+ (error) => {
1277
+ process.stderr.write(`[node-backend-federation-proof] ${error.message}\n`);
1278
+ process.exitCode = 1;
1279
+ },
1280
+ );
1281
+ }