@bleedingdev/modern-js-create 3.5.0-ultramodern.9 → 3.5.0-ultramodern.90

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