@bleedingdev/modern-js-create 3.2.0-ultramodern.11 → 3.2.0-ultramodern.110

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 (95) hide show
  1. package/README.md +158 -35
  2. package/bin/run.js +0 -0
  3. package/dist/cjs/index.cjs +1040 -0
  4. package/dist/cjs/locale/en.cjs +97 -0
  5. package/dist/cjs/locale/index.cjs +50 -0
  6. package/dist/cjs/locale/zh.cjs +97 -0
  7. package/dist/cjs/ultramodern-checks/cli/i18n-check.cjs +73 -0
  8. package/dist/cjs/ultramodern-checks/cli/oxlint.cjs +174 -0
  9. package/dist/cjs/ultramodern-checks/cli/workspace-source-check.cjs +179 -0
  10. package/dist/cjs/ultramodern-checks/index.cjs +58 -0
  11. package/dist/cjs/ultramodern-checks/oxlint-plugin.cjs +354 -0
  12. package/dist/cjs/ultramodern-package-source.cjs +133 -0
  13. package/dist/cjs/ultramodern-workspace.cjs +5616 -0
  14. package/dist/esm/index.js +1002 -0
  15. package/dist/esm/locale/en.js +59 -0
  16. package/dist/esm/locale/index.js +9 -0
  17. package/dist/esm/locale/zh.js +59 -0
  18. package/dist/esm/ultramodern-checks/cli/i18n-check.js +26 -0
  19. package/dist/esm/ultramodern-checks/cli/oxlint.js +118 -0
  20. package/dist/esm/ultramodern-checks/cli/workspace-source-check.js +124 -0
  21. package/dist/esm/ultramodern-checks/index.js +3 -0
  22. package/dist/esm/ultramodern-checks/oxlint-plugin.js +316 -0
  23. package/dist/esm/ultramodern-package-source.js +61 -0
  24. package/dist/esm/ultramodern-workspace.js +5554 -0
  25. package/dist/esm-node/index.js +1003 -0
  26. package/dist/esm-node/locale/en.js +60 -0
  27. package/dist/esm-node/locale/index.js +10 -0
  28. package/dist/esm-node/locale/zh.js +60 -0
  29. package/dist/esm-node/ultramodern-checks/cli/i18n-check.js +27 -0
  30. package/dist/esm-node/ultramodern-checks/cli/oxlint.js +119 -0
  31. package/dist/esm-node/ultramodern-checks/cli/workspace-source-check.js +125 -0
  32. package/dist/esm-node/ultramodern-checks/index.js +4 -0
  33. package/dist/esm-node/ultramodern-checks/oxlint-plugin.js +317 -0
  34. package/dist/esm-node/ultramodern-package-source.js +62 -0
  35. package/dist/esm-node/ultramodern-workspace.js +5555 -0
  36. package/dist/types/locale/en.d.ts +3 -0
  37. package/dist/types/locale/index.d.ts +117 -2
  38. package/dist/types/locale/zh.d.ts +3 -0
  39. package/dist/types/ultramodern-checks/cli/i18n-check.d.ts +9 -0
  40. package/dist/types/ultramodern-checks/cli/oxlint.d.ts +22 -0
  41. package/dist/types/ultramodern-checks/cli/workspace-source-check.d.ts +8 -0
  42. package/dist/types/ultramodern-checks/index.d.ts +3 -0
  43. package/dist/types/ultramodern-checks/oxlint-plugin.d.ts +63 -0
  44. package/dist/types/ultramodern-package-source.d.ts +28 -0
  45. package/dist/types/ultramodern-workspace.d.ts +12 -2
  46. package/package.json +52 -11
  47. package/template/.codex/hooks.json +16 -0
  48. package/template/.github/renovate.json +53 -0
  49. package/template/.github/workflows/ultramodern-gates.yml.handlebars +34 -10
  50. package/template/.mise.toml.handlebars +2 -0
  51. package/template/AGENTS.md +9 -6
  52. package/template/README.md +66 -34
  53. package/template/api/effect/index.ts.handlebars +20 -9
  54. package/template/api/lambda/hello.ts.handlebars +5 -5
  55. package/template/config/favicon.svg +5 -0
  56. package/template/config/public/assets/ultramodern-logo.svg +6 -0
  57. package/template/config/public/locales/cs/translation.json +44 -0
  58. package/template/config/public/locales/en/translation.json +44 -0
  59. package/template/lefthook.yml +10 -0
  60. package/template/modern.config.ts.handlebars +35 -3
  61. package/template/oxfmt.config.ts +8 -1
  62. package/template/oxlint.config.ts +8 -1
  63. package/template/package.json.handlebars +36 -30
  64. package/template/pnpm-workspace.yaml +34 -0
  65. package/template/rstest.config.mts +5 -0
  66. package/template/scripts/bootstrap-agent-skills.mjs +148 -15
  67. package/template/scripts/check-i18n-strings.mjs +3 -0
  68. package/template/scripts/validate-ultramodern.mjs.handlebars +494 -3
  69. package/template/src/modern-app-env.d.ts +2 -0
  70. package/template/src/modern.runtime.ts.handlebars +17 -1
  71. package/template/src/routes/[lang]/page.tsx.handlebars +209 -0
  72. package/template/src/routes/index.css.handlebars +192 -55
  73. package/template/src/routes/layout.tsx.handlebars +2 -1
  74. package/template/tailwind.config.ts.handlebars +1 -1
  75. package/template/tests/tsconfig.json +7 -0
  76. package/template/tests/ultramodern.contract.test.ts.handlebars +160 -0
  77. package/template/tsconfig.json +2 -1
  78. package/template-workspace/.agents/agent-reference-repos.json +24 -0
  79. package/template-workspace/.agents/skills-lock.json +19 -0
  80. package/template-workspace/.codex/hooks.json +16 -0
  81. package/template-workspace/.github/renovate.json +29 -0
  82. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +54 -0
  83. package/template-workspace/.gitignore.handlebars +5 -0
  84. package/template-workspace/.mise.toml.handlebars +2 -0
  85. package/template-workspace/AGENTS.md +36 -5
  86. package/template-workspace/README.md.handlebars +70 -11
  87. package/template-workspace/lefthook.yml +10 -0
  88. package/template-workspace/oxfmt.config.ts +1 -0
  89. package/template-workspace/oxlint.config.ts +1 -0
  90. package/template-workspace/pnpm-workspace.yaml +31 -8
  91. package/template-workspace/scripts/bootstrap-agent-skills.mjs +190 -21
  92. package/template-workspace/scripts/setup-agent-reference-repos.mjs +370 -0
  93. package/dist/index.js +0 -2474
  94. package/template/src/routes/page.tsx.handlebars +0 -136
  95. package/template-workspace/scripts/validate-ultramodern-workspace.mjs.handlebars +0 -405
package/README.md CHANGED
@@ -12,85 +12,123 @@
12
12
 
13
13
  Please follow [Quick Start](https://modernjs.dev/en/guides/get-started/quick-start) to get started with Modern.js.
14
14
 
15
- For UltraModern.js, use the BleedingDev create package. It defaults to the
16
- canonical SuperApp workspace and published BleedingDev package aliases:
15
+ For UltraModern.js, use the BleedingDev create package. It defaults to a
16
+ production-ready single app with `presetUltramodern(...)`, TanStack Router,
17
+ Tailwind CSS v4, i18n, Effect BFF, generated quality gates, and published
18
+ BleedingDev package aliases:
17
19
 
18
20
  ```bash
19
- pnpm dlx @bleedingdev/modern-js-create my-super-app
21
+ pnpm dlx @bleedingdev/modern-js-create my-app
20
22
  ```
21
23
 
22
- ### Router Template
24
+ To initialize the empty directory you are already in, pass `.` explicitly:
25
+
26
+ ```bash
27
+ pnpm dlx @bleedingdev/modern-js-create .
28
+ ```
23
29
 
24
- You can scaffold a TanStack Router first template:
30
+ The default is the full UltraModern single-app setup. Create a SuperApp
31
+ workspace explicitly when you need independently owned verticals:
25
32
 
26
33
  ```bash
27
- npx @modern-js/create my-app --router tanstack
34
+ pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace
28
35
  ```
29
36
 
30
- ### Tailwind Template
37
+ The workspace starts shell-only so the first commit has no fake business
38
+ domains to delete. It generates:
39
+
40
+ - `apps/shell-super-app` as the Module Federation host and topology owner.
41
+ - `verticals/*` empty until you add a real domain with `--vertical`.
42
+ - `packages/shared-*` placeholders for shared contracts, tokens, and API
43
+ support.
44
+ - `.modernjs/ultramodern-generated-contract.json` with MF, Effect, i18n,
45
+ federated CSS, Cloudflare, route publicness, generated public-surface, and
46
+ Zephyr dependency metadata.
31
47
 
32
- You can scaffold Tailwind CSS v4 setup (PostCSS + starter utility classes):
48
+ Validate the generated workspace before making application changes:
33
49
 
34
50
  ```bash
35
- npx @modern-js/create my-app --tailwind
51
+ cd my-super-app
52
+ mise install
53
+ pnpm install
54
+ pnpm check
55
+ pnpm build
36
56
  ```
37
57
 
38
- You can combine both options:
58
+ ### Router Template
59
+
60
+ TanStack Router is generated by default. Choose React Router only as an explicit
61
+ compatibility lane:
39
62
 
40
63
  ```bash
41
- npx @modern-js/create my-app --router tanstack --tailwind
64
+ pnpm dlx @bleedingdev/modern-js-create my-app --router react-router
42
65
  ```
43
66
 
44
- ### BFF Runtime Template
67
+ ### Tailwind Template
45
68
 
46
- You can scaffold BFF APIs with the current default runtime:
69
+ Tailwind CSS v4 setup is generated by default. Disable it explicitly when you
70
+ need a plain CSS starter:
47
71
 
48
72
  ```bash
49
- npx @modern-js/create my-app --bff
73
+ pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind
50
74
  ```
51
75
 
52
- You can explicitly scaffold Effect HttpApi runtime for BFF:
76
+ TanStack Router and Tailwind CSS work together without extra flags:
53
77
 
54
78
  ```bash
55
- npx @modern-js/create my-app --bff-runtime effect
79
+ pnpm dlx @bleedingdev/modern-js-create my-app
80
+ ```
81
+
82
+ ### BFF Runtime Template
83
+
84
+ UltraModern app scaffolds include Effect HttpApi BFF by default:
85
+
86
+ ```bash
87
+ pnpm dlx @bleedingdev/modern-js-create my-app
56
88
  ```
57
89
 
58
90
  To scaffold Hono runtime explicitly:
59
91
 
60
92
  ```bash
61
- npx @modern-js/create my-app --bff-runtime hono
93
+ pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono
62
94
  ```
63
95
 
64
96
  Generated starters expose `presetUltramodern(...)` as the public opinionated
65
97
  config wrapper when you want the full Ultramodern setup surface in
66
98
  `modern.config.ts`.
67
99
 
68
- You can combine TanStack Router + Tailwind + Effect BFF in one command:
100
+ TanStack Router, default Tailwind, and Effect BFF are included without extra
101
+ flags. For local monorepo dependency testing, add `--workspace`:
69
102
 
70
103
  ```bash
71
- npx @modern-js/create my-app --router tanstack --tailwind --bff-runtime effect
104
+ pnpm dlx @bleedingdev/modern-js-create my-app --workspace
72
105
  ```
73
106
 
74
- ### Micro Vertical Workspace Recipes
107
+ ### Vertical Workspace Recipes
75
108
 
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.
109
+ Use the workspace add flow from the UltraModern workspace root. It derives the
110
+ package path, package name, port, Module Federation name, topology entry, local
111
+ overlay, ownership entry, Effect BFF surface, and root `dev:*` script from the
112
+ requested vertical name.
79
113
 
80
114
  ```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
115
+ pnpm dlx @bleedingdev/modern-js-create catalog --vertical
86
116
  ```
87
117
 
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.
118
+ Use this decision table before adding a vertical:
119
+
120
+ | Need | Keep inside current vertical | Create a new vertical |
121
+ | --- | --- | --- |
122
+ | Route or widget changes with the same product owner, release train, and fallback behavior | Yes | No |
123
+ | Route subtree needs independent rollout, rollback, or incident ownership | No | `--vertical` |
124
+ | UI and Effect BFF must version, deploy, and roll back together | No | `--vertical` |
125
+ | Design tokens, primitives, generated clients, or domain-neutral utilities | Yes | Use an ordinary workspace package, not a vertical |
126
+ | Feature composites or workflow state shared across verticals | No | Revisit ownership; do not hide it in shared code |
127
+
128
+ The lower-level `--router react-router`, `--workspace`, and `--sub` flags remain
129
+ available for compatibility and local package scaffolding, but UltraModern
130
+ vertical additions should use `--vertical` so paths, topology, Effect BFF
131
+ contracts, and local overlays stay consistent.
94
132
 
95
133
  See
96
134
  `docs/super-app-rfc-adr/WORKSPACE-0001-micro-vertical-workspace-scaffolding.md`
@@ -101,13 +139,98 @@ UltraModern.js entrypoint. The lower-level `--ultramodern-*` flags remain
101
139
  available for release engineering and local package-source testing, but users
102
140
  should not need them for normal app creation.
103
141
 
142
+ ### SuperApp Architecture Contracts
143
+
144
+ The generated shell owns route assembly and policy. Each vertical added with
145
+ `--vertical` owns its route subtree, MF exposes, Effect BFF contract, generated
146
+ client, `localisedUrls`, locale JSON, CSS layer, and Cloudflare Worker output.
147
+ The shell consumes vertical UI through MF manifests and vertical APIs through
148
+ generated Effect clients exported by the vertical packages.
149
+
150
+ Route metadata is route-owned. Each app writes
151
+ `src/routes/ultramodern-route-metadata` and passes
152
+ `ultramodernLocalisedUrls` into `@modern-js/plugin-i18n`. Locale JSON is served
153
+ from `/locales/{{lng}}/{{ns}}.json`; Czech and English routes are generated from
154
+ the route owner, not from shell rewrites. Routes default to
155
+ `privateByDefault: true` and `publicnessDefault: private-app-screen`; generated
156
+ public files use only explicit `public && indexable` route metadata, so private
157
+ app screens publish only a disallowing `robots.txt` by default. Sitemap,
158
+ manifest, `llms.txt`, API catalog, JSON-LD, and broad web profile/certification
159
+ output stay omitted unless a safe public input exists.
160
+
161
+ CSS federation is explicit:
162
+
163
+ - `packages/shared-design-tokens` exports `./tokens.css` and owns
164
+ `ultramodern-shared-tokens`.
165
+ - The shell owns shell base and overlay CSS only.
166
+ - Verticals own their vertical CSS layer and `[data-app-id="<vertical>"]`
167
+ root marker.
168
+ - Tailwind CSS v4 is configured per app through `@tailwindcss/postcss`.
169
+ - Duplicate base styles are forbidden; SSR first paint depends on shared token
170
+ CSS plus Modern/Rspack-emitted app CSS.
171
+ - Apps should not inject remote `async-index.css` paths, hardcode remote
172
+ stylesheet links, or disable filename hashing to make CSS URLs predictable.
173
+ UltraModern SSR resolves federated CSS from build output and MF manifests so
174
+ generated shells and demos can keep normal hashed assets.
175
+
176
+ Version switching evidence must keep UI, Effect API, CSS, i18n JSON, and MF
177
+ manifest markers in lockstep for the same vertical version.
178
+
179
+ ### Cloudflare And Zephyr Proof
180
+
181
+ Each generated workspace app has:
182
+
183
+ - `cloudflare:build`, `cloudflare:deploy`, `cloudflare:preview`, and
184
+ `cloudflare:proof` scripts.
185
+ - Cloudflare metadata in `.modernjs/ultramodern-generated-contract.json`.
186
+ - `zephyr:dependencies` for any consumed verticals.
187
+ - `zephyr-rspack-plugin` wired through the generated Modern.js Rspack bridge.
188
+
189
+ Deploy first, then pass each deployed app's generated public URL env key into
190
+ the proof step. Shell-only workspaces only need the shell URL; added verticals
191
+ use the same `ULTRAMODERN_PUBLIC_URL_<APP_ID>` pattern with hyphens converted
192
+ to underscores and uppercased:
193
+
194
+ ```bash
195
+ pnpm cloudflare:deploy
196
+ ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP=https://shell-super-app.example.workers.dev \
197
+ ULTRAMODERN_PUBLIC_URL_TRANSPORTATION=https://transportation.example.workers.dev \
198
+ pnpm cloudflare:proof -- --require-public-urls
199
+ ```
200
+
201
+ Without public URLs and credentials, use local `pnpm check` and `pnpm build`
202
+ evidence only; do not claim live Cloudflare or Zephyr selection has been
203
+ proven.
204
+
205
+ ### Troubleshooting
206
+
207
+ | Symptom | Current check | Owner |
208
+ | --- | --- | --- |
209
+ | 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 |
210
+ | Install failure | Check the active Node/pnpm from `mise install`; rerun `pnpm install` after the shell sees the pinned versions. | Toolchain setup |
211
+ | Build failure | Run `pnpm check` before `pnpm build`; fix reported format, lint, type, skill, i18n, or generated-contract failures first. | Owning package or generated contract |
212
+ | Missing public URL | Set the env key from `.modernjs/ultramodern-generated-contract.json`, for example `ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP`. | Deployment operator |
213
+ | Cloudflare credentials | Confirm Wrangler credentials before `pnpm cloudflare:deploy`; local checks do not prove live Worker access. | Deployment operator |
214
+ | 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 |
215
+ | 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 |
216
+
104
217
  ### Local Monorepo Testing
105
218
 
106
219
  When testing unreleased Modern.js packages from a local monorepo checkout, use
107
220
  workspace protocol dependencies:
108
221
 
109
222
  ```bash
110
- npx @modern-js/create my-app --router tanstack --bff-runtime effect --workspace
223
+ pnpm dlx @bleedingdev/modern-js-create my-app --workspace
224
+ ```
225
+
226
+ For package-source validation of the full SuperApp workspace, generate with the
227
+ workspace package source, then run the generated contract gate:
228
+
229
+ ```bash
230
+ pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace --ultramodern-package-source workspace
231
+ cd my-super-app
232
+ pnpm install
233
+ pnpm check
111
234
  ```
112
235
 
113
236
  ## Documentation
package/bin/run.js CHANGED
File without changes