@bleedingdev/modern-js-create 3.2.0-ultramodern.12 → 3.2.0-ultramodern.121

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 (165) hide show
  1. package/README.md +167 -72
  2. package/bin/run.js +0 -0
  3. package/dist/cjs/create-package-root.cjs +63 -0
  4. package/dist/cjs/index.cjs +528 -0
  5. package/dist/cjs/locale/en.cjs +93 -0
  6. package/dist/cjs/locale/index.cjs +50 -0
  7. package/dist/cjs/locale/zh.cjs +93 -0
  8. package/dist/cjs/ultramodern-package-source.cjs +135 -0
  9. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +337 -0
  10. package/dist/cjs/ultramodern-workspace/app-files.cjs +223 -0
  11. package/dist/cjs/ultramodern-workspace/contracts.cjs +836 -0
  12. package/dist/cjs/ultramodern-workspace/demo-components.cjs +422 -0
  13. package/dist/cjs/ultramodern-workspace/descriptors.cjs +222 -0
  14. package/dist/cjs/ultramodern-workspace/effect-api.cjs +952 -0
  15. package/dist/cjs/ultramodern-workspace/fs-io.cjs +191 -0
  16. package/dist/cjs/ultramodern-workspace/index.cjs +48 -0
  17. package/dist/cjs/ultramodern-workspace/locales.cjs +173 -0
  18. package/dist/cjs/ultramodern-workspace/module-federation.cjs +487 -0
  19. package/dist/cjs/ultramodern-workspace/naming.cjs +161 -0
  20. package/dist/cjs/ultramodern-workspace/package-json.cjs +406 -0
  21. package/dist/cjs/ultramodern-workspace/package-source.cjs +59 -0
  22. package/dist/cjs/ultramodern-workspace/policy.cjs +248 -0
  23. package/dist/cjs/ultramodern-workspace/public-surface.cjs +268 -0
  24. package/dist/cjs/ultramodern-workspace/routes.cjs +375 -0
  25. package/dist/cjs/ultramodern-workspace/types.cjs +61 -0
  26. package/dist/cjs/ultramodern-workspace/versions.cjs +153 -0
  27. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +153 -0
  28. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +175 -0
  29. package/dist/esm/create-package-root.js +14 -0
  30. package/dist/esm/index.js +491 -0
  31. package/dist/esm/locale/en.js +55 -0
  32. package/dist/esm/locale/index.js +9 -0
  33. package/dist/esm/locale/zh.js +55 -0
  34. package/dist/esm/ultramodern-package-source.js +63 -0
  35. package/dist/esm/ultramodern-workspace/add-vertical.js +252 -0
  36. package/dist/esm/ultramodern-workspace/app-files.js +149 -0
  37. package/dist/esm/ultramodern-workspace/contracts.js +741 -0
  38. package/dist/esm/ultramodern-workspace/demo-components.js +363 -0
  39. package/dist/esm/ultramodern-workspace/descriptors.js +133 -0
  40. package/dist/esm/ultramodern-workspace/effect-api.js +854 -0
  41. package/dist/esm/ultramodern-workspace/fs-io.js +90 -0
  42. package/dist/esm/ultramodern-workspace/index.js +3 -0
  43. package/dist/esm/ultramodern-workspace/locales.js +122 -0
  44. package/dist/esm/ultramodern-workspace/module-federation.js +415 -0
  45. package/dist/esm/ultramodern-workspace/naming.js +71 -0
  46. package/dist/esm/ultramodern-workspace/package-json.js +338 -0
  47. package/dist/esm/ultramodern-workspace/package-source.js +21 -0
  48. package/dist/esm/ultramodern-workspace/policy.js +183 -0
  49. package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
  50. package/dist/esm/ultramodern-workspace/routes.js +280 -0
  51. package/dist/esm/ultramodern-workspace/types.js +16 -0
  52. package/dist/esm/ultramodern-workspace/versions.js +34 -0
  53. package/dist/esm/ultramodern-workspace/workspace-scripts.js +91 -0
  54. package/dist/esm/ultramodern-workspace/write-workspace.js +121 -0
  55. package/dist/esm-node/create-package-root.js +15 -0
  56. package/dist/esm-node/index.js +492 -0
  57. package/dist/esm-node/locale/en.js +56 -0
  58. package/dist/esm-node/locale/index.js +10 -0
  59. package/dist/esm-node/locale/zh.js +56 -0
  60. package/dist/esm-node/ultramodern-package-source.js +64 -0
  61. package/dist/esm-node/ultramodern-workspace/add-vertical.js +253 -0
  62. package/dist/esm-node/ultramodern-workspace/app-files.js +150 -0
  63. package/dist/esm-node/ultramodern-workspace/contracts.js +742 -0
  64. package/dist/esm-node/ultramodern-workspace/demo-components.js +364 -0
  65. package/dist/esm-node/ultramodern-workspace/descriptors.js +134 -0
  66. package/dist/esm-node/ultramodern-workspace/effect-api.js +855 -0
  67. package/dist/esm-node/ultramodern-workspace/fs-io.js +91 -0
  68. package/dist/esm-node/ultramodern-workspace/index.js +4 -0
  69. package/dist/esm-node/ultramodern-workspace/locales.js +123 -0
  70. package/dist/esm-node/ultramodern-workspace/module-federation.js +416 -0
  71. package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
  72. package/dist/esm-node/ultramodern-workspace/package-json.js +339 -0
  73. package/dist/esm-node/ultramodern-workspace/package-source.js +22 -0
  74. package/dist/esm-node/ultramodern-workspace/policy.js +184 -0
  75. package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
  76. package/dist/esm-node/ultramodern-workspace/routes.js +281 -0
  77. package/dist/esm-node/ultramodern-workspace/types.js +17 -0
  78. package/dist/esm-node/ultramodern-workspace/versions.js +35 -0
  79. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -0
  80. package/dist/esm-node/ultramodern-workspace/write-workspace.js +122 -0
  81. package/dist/types/create-package-root.d.ts +1 -0
  82. package/dist/types/locale/en.d.ts +8 -9
  83. package/dist/types/locale/index.d.ts +109 -2
  84. package/dist/types/locale/zh.d.ts +8 -9
  85. package/dist/types/ultramodern-package-source.d.ts +28 -0
  86. package/dist/types/ultramodern-workspace/add-vertical.d.ts +19 -0
  87. package/dist/types/ultramodern-workspace/app-files.d.ts +14 -0
  88. package/dist/types/ultramodern-workspace/contracts.d.ts +21 -0
  89. package/dist/types/ultramodern-workspace/demo-components.d.ts +9 -0
  90. package/dist/types/ultramodern-workspace/descriptors.d.ts +39 -0
  91. package/dist/types/ultramodern-workspace/effect-api.d.ts +73 -0
  92. package/dist/types/ultramodern-workspace/fs-io.d.ts +18 -0
  93. package/dist/types/ultramodern-workspace/index.d.ts +4 -0
  94. package/dist/types/ultramodern-workspace/locales.d.ts +183 -0
  95. package/dist/types/ultramodern-workspace/module-federation.d.ts +16 -0
  96. package/dist/types/ultramodern-workspace/naming.d.ts +16 -0
  97. package/dist/types/ultramodern-workspace/package-json.d.ts +12 -0
  98. package/dist/types/ultramodern-workspace/package-source.d.ts +2 -0
  99. package/dist/types/ultramodern-workspace/policy.d.ts +60 -0
  100. package/dist/types/ultramodern-workspace/public-surface.d.ts +37 -0
  101. package/dist/types/ultramodern-workspace/routes.d.ts +25 -0
  102. package/dist/types/ultramodern-workspace/types.d.ts +95 -0
  103. package/dist/types/ultramodern-workspace/versions.d.ts +38 -0
  104. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +10 -0
  105. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -0
  106. package/package.json +34 -15
  107. package/template-workspace/.agents/agent-reference-repos.json +24 -0
  108. package/template-workspace/.agents/skills-lock.json +19 -0
  109. package/template-workspace/.codex/hooks.json +16 -0
  110. package/template-workspace/.github/renovate.json +29 -0
  111. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +67 -0
  112. package/template-workspace/.gitignore.handlebars +5 -0
  113. package/template-workspace/.mise.toml.handlebars +3 -0
  114. package/template-workspace/AGENTS.md.handlebars +87 -0
  115. package/template-workspace/README.md.handlebars +132 -11
  116. package/template-workspace/lefthook.yml +24 -0
  117. package/template-workspace/oxfmt.config.ts +1 -0
  118. package/template-workspace/oxlint.config.ts +1 -0
  119. package/template-workspace/pnpm-workspace.yaml.handlebars +40 -0
  120. package/template-workspace/scripts/bootstrap-agent-skills.mjs +184 -21
  121. package/template-workspace/scripts/setup-agent-reference-repos.mjs +370 -0
  122. package/templates/app/shell-frame.tsx +49 -0
  123. package/templates/app/ultramodern-route-head.tsx.handlebars +142 -0
  124. package/templates/packages/shared-contracts-index.ts +466 -0
  125. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +69 -0
  126. package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mjs +9 -0
  127. package/templates/workspace-scripts/generate-public-surface-assets.mjs +529 -0
  128. package/templates/workspace-scripts/proof-cloudflare-version.mjs +125 -0
  129. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +851 -0
  130. package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
  131. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +223 -0
  132. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +593 -0
  133. package/dist/index.js +0 -2626
  134. package/dist/types/ultramodern-workspace.d.ts +0 -20
  135. package/template/.agents/skills-lock.json +0 -34
  136. package/template/.browserslistrc +0 -4
  137. package/template/.github/workflows/ultramodern-gates.yml.handlebars +0 -30
  138. package/template/.gitignore.handlebars +0 -30
  139. package/template/.nvmrc +0 -2
  140. package/template/AGENTS.md +0 -25
  141. package/template/README.md +0 -79
  142. package/template/api/effect/index.ts.handlebars +0 -23
  143. package/template/api/lambda/hello.ts.handlebars +0 -6
  144. package/template/config/public/locales/cs/translation.json +0 -39
  145. package/template/config/public/locales/en/translation.json +0 -39
  146. package/template/modern.config.ts.handlebars +0 -53
  147. package/template/oxfmt.config.ts +0 -8
  148. package/template/oxlint.config.ts +0 -12
  149. package/template/package.json.handlebars +0 -67
  150. package/template/postcss.config.mjs.handlebars +0 -6
  151. package/template/scripts/bootstrap-agent-skills.mjs +0 -95
  152. package/template/scripts/check-i18n-strings.mjs +0 -83
  153. package/template/scripts/validate-ultramodern.mjs.handlebars +0 -178
  154. package/template/shared/effect/api.ts.handlebars +0 -17
  155. package/template/src/modern-app-env.d.ts +0 -1
  156. package/template/src/modern.runtime.ts.handlebars +0 -23
  157. package/template/src/routes/index.css.handlebars +0 -129
  158. package/template/src/routes/layout.tsx.handlebars +0 -9
  159. package/template/src/routes/page.tsx.handlebars +0 -155
  160. package/template/tailwind.config.ts.handlebars +0 -10
  161. package/template/tsconfig.json +0 -120
  162. package/template-workspace/AGENTS.md +0 -50
  163. package/template-workspace/pnpm-workspace.yaml +0 -17
  164. package/template-workspace/scripts/check-i18n-strings.mjs +0 -83
  165. package/template-workspace/scripts/validate-ultramodern-workspace.mjs.handlebars +0 -433
package/README.md CHANGED
@@ -8,117 +8,212 @@
8
8
  A Progressive React Framework for modern web development.
9
9
  </p>
10
10
 
11
- ## Getting Started
11
+ ## UltraModern.js Create
12
12
 
13
- Please follow [Quick Start](https://modernjs.dev/en/guides/get-started/quick-start) to get started with Modern.js.
14
-
15
- For UltraModern.js, use the BleedingDev create package. It defaults to the
16
- canonical SuperApp workspace and published BleedingDev package aliases:
13
+ The BleedingDev create package has one supported generated product: an
14
+ UltraModern SuperApp workspace.
17
15
 
18
16
  ```bash
19
- pnpm dlx @bleedingdev/modern-js-create my-super-app
17
+ pnpm dlx @bleedingdev/modern-js-create my-workspace
20
18
  ```
21
19
 
22
- ### Router Template
20
+ The supported pnpm command contract is the scoped package specifier above:
21
+ `pnpm dlx @bleedingdev/modern-js-create <target>`. Do not shorten it to
22
+ `pnpm dlx modern-js-create`; there is no unscoped `modern-js-create` npm
23
+ package. Release proof runs this scoped form from a temporary pnpm store/cache
24
+ so it cannot pass because of a local link cache.
23
25
 
24
- You can scaffold a TanStack Router first template:
26
+ To initialize the empty directory you are already in, pass `.` explicitly:
25
27
 
26
28
  ```bash
27
- npx @modern-js/create my-app --router tanstack
29
+ pnpm dlx @bleedingdev/modern-js-create .
28
30
  ```
29
31
 
30
- ### Tailwind Template
32
+ The workspace starts shell-only so the first commit has no fake business
33
+ domains to delete. It generates:
31
34
 
32
- You can scaffold Tailwind CSS v4 setup (PostCSS + starter utility classes):
35
+ - `apps/shell-super-app` as the Module Federation host and topology owner.
36
+ - `verticals/*` empty until a real domain is added with `--vertical`.
37
+ - `packages/shared-*` placeholders for shared contracts, tokens, and Effect
38
+ API support.
39
+ - `.modernjs/ultramodern-generated-contract.json` with Module Federation,
40
+ Effect, i18n, federated CSS, Cloudflare, route publicness, generated
41
+ public-surface, and Zephyr dependency metadata.
33
42
 
34
- ```bash
35
- npx @modern-js/create my-app --tailwind
36
- ```
37
-
38
- You can combine both options:
43
+ Validate the generated workspace before making application changes:
39
44
 
40
45
  ```bash
41
- npx @modern-js/create my-app --router tanstack --tailwind
46
+ cd my-workspace
47
+ mise install
48
+ pnpm install
49
+ pnpm check
50
+ pnpm build
42
51
  ```
43
52
 
44
- ### BFF Runtime Template
53
+ The generated toolchain baseline is Node `>=26` with pnpm `11.5.3`.
54
+ `packageManager`, `.mise.toml`, generated validation, and CI should all agree
55
+ on that baseline; do not reintroduce Corepack or older pnpm aliases.
45
56
 
46
- You can scaffold BFF APIs with the current default runtime:
57
+ Generated CI does not call the local aggregate. It runs format, lint,
58
+ typecheck, skills, i18n boundary validation, contract validation, and build as
59
+ separate matrix jobs so failures are isolated and parallelizable. Generated
60
+ lefthook config runs separate format and lint-fix commands on pre-commit, then
61
+ runs the read-only primitive gates in parallel on pre-push.
47
62
 
48
- ```bash
49
- npx @modern-js/create my-app --bff
50
- ```
51
-
52
- You can explicitly scaffold Effect HttpApi runtime for BFF:
63
+ For local monorepo dependency testing, add `--workspace`:
53
64
 
54
65
  ```bash
55
- npx @modern-js/create my-app --bff-runtime effect
66
+ pnpm dlx @bleedingdev/modern-js-create my-workspace --workspace
56
67
  ```
57
68
 
58
- To scaffold Hono runtime explicitly:
59
-
60
- ```bash
61
- npx @modern-js/create my-app --bff-runtime hono
62
- ```
69
+ For package-source validation outside the monorepo, pass explicit
70
+ `--ultramodern-package-*` options.
63
71
 
64
- Generated starters expose `presetUltramodern(...)` as the public opinionated
65
- config wrapper when you want the full Ultramodern setup surface in
66
- `modern.config.ts`.
72
+ ## Vertical Workspace Recipes
67
73
 
68
- You can combine TanStack Router + Tailwind + Effect BFF in one command:
74
+ Use the workspace add flow from the UltraModern workspace root. It derives the
75
+ package path, package name, port, Module Federation name, topology entry, local
76
+ overlay, ownership entry, Effect BFF surface, and root `dev:*` script from the
77
+ requested vertical name.
69
78
 
70
79
  ```bash
71
- npx @modern-js/create my-app --router tanstack --tailwind --bff-runtime effect
80
+ pnpm dlx @bleedingdev/modern-js-create catalog --vertical
72
81
  ```
73
82
 
74
- ### Micro Vertical Workspace Recipes
75
-
76
- Use the existing create flags to scaffold packages inside a Micro Vertical
77
- workspace. The shell and remotes use TanStack Router; services use Effect by
78
- default, with Hono kept as an explicit compatibility lane.
83
+ Use this decision table before adding a vertical:
84
+
85
+ | Need | Keep inside current vertical | Create a new vertical |
86
+ | --- | --- | --- |
87
+ | Route or widget changes with the same product owner, release train, and fallback behavior | Yes | No |
88
+ | Route subtree needs independent rollout, rollback, or incident ownership | No | `--vertical` |
89
+ | UI and Effect BFF must version, deploy, and roll back together | No | `--vertical` |
90
+ | Design tokens, primitives, generated clients, or domain-neutral utilities | Yes | Use an ordinary workspace package, not a vertical |
91
+ | Feature composites or workflow state shared across verticals | No | Revisit ownership; do not hide it in shared code |
92
+
93
+ ## SuperApp Architecture Contracts
94
+
95
+ The generated shell owns route assembly and policy. Each vertical added with
96
+ `--vertical` owns its route subtree, Module Federation exposes, Effect BFF
97
+ contract, generated client, `localisedUrls`, locale JSON, CSS layer, and
98
+ Cloudflare Worker output. The shell consumes vertical UI through Module
99
+ Federation manifests and vertical APIs through generated Effect clients
100
+ exported by the vertical packages.
101
+
102
+ Route metadata is route-owned and colocated in
103
+ `src/routes/**/route.meta.ts`. The scaffold regenerates
104
+ `src/routes/ultramodern-route-metadata.ts` as a compatibility manifest for
105
+ Modern.js config, i18n, public head, and public surface contracts; authors
106
+ should not hand-maintain it. Locale JSON is served from
107
+ `/locales/{{lng}}/{{ns}}.json`; Czech and English routes are generated from the
108
+ route owner, not from shell rewrites.
109
+
110
+ Routes default to `privateByDefault: true` and
111
+ `publicnessDefault: private-app-screen`. Public web artifacts are build/deploy
112
+ outputs generated by `scripts/generate-public-surface-assets.mjs` into
113
+ `dist/public` and `.output/public`, not source files under `config/public`.
114
+ Generated public files use only explicit `public && indexable` route metadata,
115
+ so private app screens publish only a disallowing `robots.txt` by default.
116
+ JSON-LD is not inferred from route titles, descriptions, localized paths, app
117
+ names, BFF APIs, or Module Federation metadata. To publish structured data,
118
+ author `jsonLd` explicitly in route metadata for a `public && indexable` route;
119
+ generated apps provide `src/routes/ultramodern-jsonld.ts` helpers for
120
+ `WebPage`, `WebApplication`, `SoftwareApplication`, `BreadcrumbList`,
121
+ `FAQPage`, and `Organization`, while raw JSON-LD remains possible for other
122
+ schema types.
123
+
124
+ Dynamic public routes can expand sitemap entries through route-owned,
125
+ Node-safe ESM providers, normally `route.sitemap.mjs` beside the route
126
+ metadata. The public-surface generator discovers those providers for dynamic
127
+ public routes and still honors explicit `routes.publicSurface.contentSources`
128
+ entries in the generated compatibility manifest. Providers may export
129
+ `entries`, `entries()`, or a default entries/loader returning sitemap entries;
130
+ draft entries and `indexable: false` entries are omitted.
131
+
132
+ CSS federation is explicit:
133
+
134
+ - `packages/shared-design-tokens` exports `./tokens.css` and owns
135
+ `ultramodern-shared-tokens`.
136
+ - The shell owns shell base and overlay CSS only.
137
+ - Verticals own their vertical CSS layer and `[data-app-id="<vertical>"]`
138
+ root marker.
139
+ - Tailwind CSS v4 is configured per app through `@tailwindcss/postcss`.
140
+ - Duplicate base styles are forbidden; SSR first paint depends on shared token
141
+ CSS plus Modern/Rspack-emitted app CSS.
142
+
143
+ ## Public URL Environment Variables
144
+
145
+ Generated apps must not bake absolute `http://localhost:<port>` URLs into asset
146
+ configuration. Public URL and asset prefix environment variables have distinct
147
+ roles, and stale aliases should not be carried forward when regenerating or
148
+ updating workspaces.
149
+
150
+ | Variable | Role | Feeds |
151
+ | --- | --- | --- |
152
+ | `MODERN_PUBLIC_SITE_URL` | Canonical site origin for public SEO output only | Canonical, hreflang, sitemap `<loc>`, robots `Sitemap:` |
153
+ | `MODERN_ASSET_PREFIX` | Preferred JS/CSS/static asset prefix | Modern/Rspack-emitted asset URLs |
154
+ | `ULTRAMODERN_ASSET_PREFIX` | UltraModern compatibility asset prefix | Modern/Rspack-emitted asset URLs when `MODERN_ASSET_PREFIX` is unset |
155
+ | `ULTRAMODERN_PUBLIC_URL_<APP_ID>` | Per-app deployment/proof URL | Cloudflare proof inputs and Module Federation remote URLs |
156
+
157
+ Asset URLs use this precedence: `MODERN_ASSET_PREFIX` →
158
+ `ULTRAMODERN_ASSET_PREFIX` → origin-relative `/`. `MODERN_PUBLIC_SITE_URL` is
159
+ canonical/SEO-only and must not be used as an asset-prefix fallback.
160
+ SEO output uses `MODERN_PUBLIC_SITE_URL`; if it is unset, generated local and
161
+ preview outputs remain non-public until deployment proof provides explicit
162
+ public URLs.
163
+
164
+ Without public URLs configured, asset paths are origin-relative (`/`), and the
165
+ dev server uses `dev.assetPrefix: '/'` — so apps work through tunnels and
166
+ reverse proxies (ngrok, cloudflared) without triggering Chrome's Local Network
167
+ Access prompt or mixed-content errors. Shell-only workspaces can set
168
+ `MODERN_PUBLIC_SITE_URL` for SEO output without changing where assets load
169
+ from.
170
+
171
+ ## Cloudflare And Zephyr Proof
172
+
173
+ Each generated workspace app has:
174
+
175
+ - `cloudflare:build`, `cloudflare:deploy`, `cloudflare:preview`, and
176
+ `cloudflare:proof` scripts.
177
+ - Cloudflare metadata in `.modernjs/ultramodern-generated-contract.json`.
178
+ - `zephyr:dependencies` for any consumed verticals.
179
+ - `zephyr-rspack-plugin` wired through the generated Modern.js Rspack bridge.
180
+
181
+ Deploy first, then pass each deployed app's generated public URL env key into
182
+ the proof step. The proof script reads the generated contract and checks the
183
+ Cloudflare Worker surface, including public-route sitemap/robots consistency,
184
+ preview noindex behavior, unknown-route status, asset headers, byte budgets,
185
+ and public sourcemap exposure. Shell-only workspaces only need the shell URL;
186
+ added verticals use the same `ULTRAMODERN_PUBLIC_URL_<APP_ID>` pattern with
187
+ hyphens converted to underscores and uppercased:
79
188
 
80
189
  ```bash
81
- npx @modern-js/create apps/shell --router tanstack --tailwind --workspace --sub
82
- npx @modern-js/create apps/remotes/catalog --router tanstack --tailwind --workspace --sub
83
- npx @modern-js/create apps/remotes/design-system --router tanstack --tailwind --workspace --sub
84
- npx @modern-js/create services/catalog-api --bff-runtime effect --workspace --sub
85
- npx @modern-js/create services/legacy-api --bff-runtime hono --workspace --sub
190
+ pnpm cloudflare:deploy
191
+ ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP=https://shell-super-app.example.workers.dev \
192
+ ULTRAMODERN_PUBLIC_URL_TRANSPORTATION=https://transportation.example.workers.dev \
193
+ pnpm cloudflare:proof -- --require-public-urls
86
194
  ```
87
195
 
88
- When a design system needs independent deployment, treat it as a horizontal
89
- Module Federation remote with the same topology, trust, SSR, compatibility, and
90
- fallback expectations as feature remotes. Otherwise shared packages should be
91
- regular workspace packages for tokens, primitives, generated clients, or
92
- domain-neutral utilities. Keep feature composites and workflow logic owned by a
93
- shell, remote, or service package.
94
-
95
- See
96
- `docs/super-app-rfc-adr/WORKSPACE-0001-micro-vertical-workspace-scaffolding.md`
97
- for the canonical workspace topology and local orchestration model.
196
+ Without public URLs and credentials, use local primitive gates and `pnpm build`
197
+ evidence only; do not claim live Cloudflare or Zephyr selection has been
198
+ proven.
98
199
 
99
- The published `@bleedingdev/modern-js-create` package is the preferred
100
- UltraModern.js entrypoint. The lower-level `--ultramodern-*` flags remain
101
- available for release engineering and local package-source testing, but users
102
- should not need them for normal app creation.
200
+ ## Troubleshooting
103
201
 
104
- ### Local Monorepo Testing
202
+ | Symptom | Current check | Owner |
203
+ | --- | --- | --- |
204
+ | Package cohort mismatch | Regenerate with one package source strategy, run `mise install`, then rerun `pnpm install` from the activated shell. | Generated workspace package source metadata |
205
+ | Install failure | Check the active Node/pnpm from `mise install`; rerun `pnpm install` after the shell sees the pinned versions. | Toolchain setup |
206
+ | Build failure | Run the matching primitive gate (`pnpm lint`, `pnpm typecheck`, `pnpm i18n:boundaries`, `pnpm contract:check`) before `pnpm build`; fix the owning failure first. | Owning package or generated contract |
207
+ | Missing public URL | Set the env key from `.modernjs/ultramodern-generated-contract.json`, for example `ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP`. | Deployment operator |
208
+ | Cloudflare credentials | Confirm Wrangler credentials before `pnpm cloudflare:deploy`; local checks do not prove live Worker access. | Deployment operator |
209
+ | Asset or CSS 404 | Rebuild with `pnpm build` or `pnpm cloudflare:deploy` and inspect emitted Modern/Rspack asset paths instead of hardcoding CSS URLs. | Framework/runtime asset pipeline |
210
+ | Federation manifest failure | Run the shell and vertical build scripts, then check each deployed `/mf-manifest.json` URL used by the shell. | Module Federation owner |
105
211
 
106
- When testing unreleased Modern.js packages from a local monorepo checkout, use
107
- workspace protocol dependencies:
108
-
109
- ```bash
110
- npx @modern-js/create my-app --router tanstack --bff-runtime effect --workspace
111
- ```
112
-
113
- ## Documentation
212
+ ## Modern.js Documentation
114
213
 
115
214
  - [English Documentation](https://modernjs.dev/en/)
116
215
  - [中文文档](https://modernjs.dev)
117
216
 
118
- ## Contributing
119
-
120
- Please read the [Contributing Guide](https://github.com/web-infra-dev/modern.js/blob/main/CONTRIBUTING.md).
121
-
122
217
  ## License
123
218
 
124
219
  Modern.js is [MIT licensed](https://github.com/web-infra-dev/modern.js/blob/main/LICENSE).
package/bin/run.js CHANGED
File without changes
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ resolveCreatePackageRoot: ()=>resolveCreatePackageRoot
41
+ });
42
+ const external_node_fs_namespaceObject = require("node:fs");
43
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
44
+ const external_node_path_namespaceObject = require("node:path");
45
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
46
+ const MAX_WALK_UP_LEVELS = 5;
47
+ function resolveCreatePackageRoot(fromDir) {
48
+ let candidate = fromDir;
49
+ for(let level = 0; level <= MAX_WALK_UP_LEVELS; level++){
50
+ if (external_node_fs_default().existsSync(external_node_path_default().join(candidate, 'package.json')) && external_node_fs_default().existsSync(external_node_path_default().join(candidate, 'template-workspace'))) return candidate;
51
+ const parent = external_node_path_default().dirname(candidate);
52
+ if (parent === candidate) break;
53
+ candidate = parent;
54
+ }
55
+ throw new Error(`Unable to resolve the @modern-js/create package root (a directory containing both package.json and template-workspace/) within ${MAX_WALK_UP_LEVELS} levels above ${fromDir}`);
56
+ }
57
+ exports.resolveCreatePackageRoot = __webpack_exports__.resolveCreatePackageRoot;
58
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
59
+ "resolveCreatePackageRoot"
60
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
61
+ Object.defineProperty(exports, '__esModule', {
62
+ value: true
63
+ });