@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
@@ -0,0 +1,593 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+
5
+ const root = process.cwd();
6
+ const packageScope = '{{packageScope}}';
7
+ const expectedNodeVersion = '{{nodeVersion}}';
8
+ const expectedPnpmVersion = '{{pnpmVersion}}';
9
+ const tailwindEnabled = {{tailwindEnabledJson}};
10
+ const fullStackVerticals = {{fullStackVerticalsJson}};
11
+ const shellNamespace = {{shellNamespaceJson}};
12
+ const oldRemotePaths = {{oldRemotePathsJson}};
13
+ const expectedBuildScript = {{expectedBuildScriptJson}};
14
+ const expectedCloudflareBuildScript = {{expectedCloudflareBuildScriptJson}};
15
+ const expectedCloudflareDeployScript = {{expectedCloudflareDeployScriptJson}};
16
+ const expectedCloudflareSecurity = {{expectedCloudflareSecurityJson}};
17
+ const publicSurfaceManagedSourceAssetPaths = {{publicSurfaceManagedSourceAssetPathsJson}};
18
+ const expectedModernPackageSpecifier = packageName => {
19
+ if (packageSource.strategy === 'workspace') {
20
+ return 'workspace:*';
21
+ }
22
+ const aliases = packageSource.modernPackages?.aliases ?? {};
23
+ const alias = aliases[packageName];
24
+ const specifier = packageSource.modernPackages?.specifier;
25
+ return typeof alias === 'string' ? `npm:${alias}@${specifier}` : specifier;
26
+ };
27
+
28
+ const readText = relativePath => fs.readFileSync(path.join(root, relativePath), 'utf-8');
29
+ const readJson = relativePath => JSON.parse(readText(relativePath));
30
+ const assert = (condition, message) => {
31
+ if (!condition) {
32
+ throw new Error(message);
33
+ }
34
+ };
35
+ const assertExists = relativePath => {
36
+ assert(fs.existsSync(path.join(root, relativePath)), `Missing ${relativePath}`);
37
+ };
38
+ const assertNotExists = relativePath => {
39
+ assert(!fs.existsSync(path.join(root, relativePath)), `Unexpected ${relativePath}`);
40
+ };
41
+ const assertPublicSurfaceAssets = (appPath, publicRoutes) => {
42
+ for (const relativePath of publicSurfaceManagedSourceAssetPaths) {
43
+ assertNotExists(`${appPath}/${relativePath}`);
44
+ }
45
+ void publicRoutes;
46
+ };
47
+ const assertPublicSurfaceContract = (appId, publicSurface) => {
48
+ assert(publicSurface?.artifactLifecycle === 'build-and-deploy-output', `${appId} public surface artifacts must be build/deploy outputs`);
49
+ assert(publicSurface?.generator === 'scripts/generate-public-surface-assets.mjs', `${appId} public surface generator script is incorrect`);
50
+ assert(publicSurface?.outputRoot === 'dist/public', `${appId} public surface dist outputRoot is incorrect`);
51
+ assert(publicSurface?.cloudflareOutputRoot === '.output/public', `${appId} public surface Cloudflare outputRoot is incorrect`);
52
+ assert(!('staticRoot' in (publicSurface ?? {})), `${appId} public surface must not point at source config/public`);
53
+ assert((publicSurface?.files ?? []).includes('robots.txt'), `${appId} public surface must always emit robots.txt`);
54
+ assert(publicSurface?.contentExpansion?.authoring === 'route-owned-esm-provider', `${appId} public content expansion authoring is incorrect`);
55
+ assert(publicSurface?.contentExpansion?.defaultProviderFile === 'route.sitemap.mjs', `${appId} public content expansion provider file is incorrect`);
56
+ assert(publicSurface?.contentExpansion?.draftPolicy === 'omit-draft-by-default', `${appId} public content expansion draft policy is incorrect`);
57
+ assert(publicSurface?.contentExpansion?.indexablePolicy === 'omit-indexable-false', `${appId} public content expansion indexable policy is incorrect`);
58
+ assert(Array.isArray(publicSurface?.contentSources), `${appId} public content sources must be an array`);
59
+ if ((publicSurface?.publicRoutes ?? []).length === 0) {
60
+ assert(!(publicSurface?.files ?? []).includes('sitemap.xml'), `${appId} private public surface must omit sitemap.xml`);
61
+ assert(!(publicSurface?.files ?? []).includes('site.webmanifest'), `${appId} private public surface must omit site.webmanifest`);
62
+ } else {
63
+ assert((publicSurface?.files ?? []).includes('sitemap.xml'), `${appId} public surface must emit sitemap.xml when public routes exist`);
64
+ assert((publicSurface?.files ?? []).includes('site.webmanifest'), `${appId} public surface must emit site.webmanifest when public routes exist`);
65
+ }
66
+ };
67
+ const assertPublicHeadContract = (appId, publicHead, headModule) => {
68
+ assert(publicHead?.generator === './src/routes/ultramodern-route-head', `${appId} public head generator is incorrect`);
69
+ assert(publicHead?.renderer === '@modern-js/runtime/head Helmet', `${appId} public head renderer is incorrect`);
70
+ assert(publicHead?.ssr === true, `${appId} public head must be SSR-rendered`);
71
+ assert(publicHead?.title?.source === 'route.titleKey', `${appId} public head title must come from route metadata`);
72
+ assert(publicHead?.description?.source === 'route.descriptionKey', `${appId} public head description must come from route metadata`);
73
+ assert(publicHead?.canonical?.publicIndexableOnly === true, `${appId} canonical links must be public/indexable only`);
74
+ assert(publicHead?.structuredData?.optional === true, `${appId} structured data must be optional`);
75
+ assert(publicHead?.structuredData?.source === 'route.jsonLd', `${appId} structured data must come from explicit route metadata`);
76
+ assert(publicHead?.structuredData?.inference === false, `${appId} structured data inference must stay disabled`);
77
+ assert(publicHead?.structuredData?.helperModule === './src/routes/ultramodern-jsonld', `${appId} structured data helper module is incorrect`);
78
+ assert(publicHead?.structuredData?.sanitizesHtmlOpenBracket === true, `${appId} structured data must sanitize HTML open brackets`);
79
+ assert(publicHead?.privateRouteRobots === 'noindex, nofollow', `${appId} private route robots policy is incorrect`);
80
+ for (const snippet of [
81
+ "from '@modern-js/runtime/head'",
82
+ '<title>{title}</title>',
83
+ 'name="description"',
84
+ 'name="robots"',
85
+ 'rel="canonical"',
86
+ 'rel="alternate"',
87
+ 'property="og:title"',
88
+ 'property="og:description"',
89
+ 'name="twitter:card"',
90
+ 'application/ld+json',
91
+ 'route?.jsonLd',
92
+ "replaceAll('<', '\\\\u003c')",
93
+ ]) {
94
+ assert(headModule.includes(snippet), `${appId} route head module is missing ${snippet}`);
95
+ }
96
+ };
97
+ const assertCloudflareQualityGates = (appId, qualityGates) => {
98
+ assert(qualityGates?.publicRoutes?.requireSitemapWhenPresent === true, `${appId} quality gates must require sitemap for public routes`);
99
+ assert(qualityGates?.publicRoutes?.requireRobotsSitemapConsistency === true, `${appId} quality gates must require robots/sitemap consistency`);
100
+ assert(qualityGates?.statusCodes?.unknownRouteStatus === 404, `${appId} quality gates must require 404 unknown routes`);
101
+ assert(qualityGates?.indexing?.previewNoindex === true, `${appId} quality gates must require preview noindex`);
102
+ assert(qualityGates?.indexing?.productionPublicRoutesIndexable === true, `${appId} quality gates must require production public routes to be indexable`);
103
+ assert(qualityGates?.assets?.cssPreloadRequired === true, `${appId} quality gates must require CSS preload evidence`);
104
+ assert(qualityGates?.assets?.sourcemapsPubliclyReferenced === false, `${appId} quality gates must reject public sourcemap references`);
105
+ assert(typeof qualityGates?.budgets?.ssrHtmlMaxBytes === 'number', `${appId} quality gates must define SSR HTML byte budget`);
106
+ assert(typeof qualityGates?.budgets?.mfManifestMaxBytes === 'number', `${appId} quality gates must define MF manifest byte budget`);
107
+ assert(qualityGates?.csp?.finalMode === 'report-only-dogfood', `${appId} CSP final mode decision is missing`);
108
+ };
109
+ const extractAssetPrefixExpression = modernConfig => {
110
+ const match = /const assetPrefix =\n(?<expression>[\s\S]*?);/u.exec(modernConfig);
111
+ assert(match?.groups?.expression, 'modern.config.ts must assign assetPrefix');
112
+ return match.groups.expression;
113
+ };
114
+ const expectedWorkerName = packageSuffix => `${packageScope}-${packageSuffix}`.slice(0, 63);
115
+ const expectedChunkLoadingGlobal = mfName =>
116
+ `__ULTRAMODERN_${mfName
117
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
118
+ .replace(/[^a-zA-Z0-9]+/g, '_')
119
+ .replace(/^_+|_+$/g, '')
120
+ .toUpperCase()}_LOADED_CHUNKS__`;
121
+ const parseSemver = version => {
122
+ const match = /^(\d+)\.(\d+)\.(\d+)/u.exec(version);
123
+ assert(match, `Unable to parse pnpm version: ${version}`);
124
+ return {
125
+ major: Number(match[1]),
126
+ minor: Number(match[2]),
127
+ patch: Number(match[3]),
128
+ };
129
+ };
130
+ const compareSemver = (left, right) =>
131
+ left.major - right.major || left.minor - right.minor || left.patch - right.patch;
132
+
133
+ const activePnpmVersion = execFileSync('pnpm', ['--pm-on-fail=ignore', '--version'], {
134
+ cwd: root,
135
+ encoding: 'utf-8',
136
+ stdio: ['ignore', 'pipe', 'pipe'],
137
+ }).trim();
138
+ const activeNodeVersion = process.versions.node;
139
+ const minimumPnpmVersion = parseSemver(expectedPnpmVersion);
140
+ const maximumPnpmVersion = {
141
+ major: minimumPnpmVersion.major,
142
+ minor: minimumPnpmVersion.minor + 1,
143
+ patch: 0,
144
+ };
145
+ const currentPnpmVersion = parseSemver(activePnpmVersion);
146
+ const minimumNodeVersion = { major: 26, minor: 0, patch: 0 };
147
+ const currentNodeVersion = parseSemver(activeNodeVersion);
148
+
149
+ assert(
150
+ compareSemver(currentPnpmVersion, minimumPnpmVersion) >= 0 &&
151
+ compareSemver(currentPnpmVersion, maximumPnpmVersion) < 0,
152
+ `Generated workspace requires pnpm >=${expectedPnpmVersion} <${maximumPnpmVersion.major}.${maximumPnpmVersion.minor}.${maximumPnpmVersion.patch}; active pnpm is ${activePnpmVersion}. Run mise install, then rerun pnpm from the activated shell.`,
153
+ );
154
+ assert(
155
+ compareSemver(currentNodeVersion, minimumNodeVersion) >= 0,
156
+ `Generated workspace requires Node >=26; active Node is ${activeNodeVersion}. Run mise install, then rerun node from the activated shell.`,
157
+ );
158
+
159
+ const requiredPaths = [
160
+ 'AGENTS.md',
161
+ '.gitignore',
162
+ 'package.json',
163
+ 'pnpm-workspace.yaml',
164
+ 'tsconfig.base.json',
165
+ 'oxlint.config.ts',
166
+ 'oxfmt.config.ts',
167
+ '.github/renovate.json',
168
+ '.github/workflows/ultramodern-workspace-gates.yml',
169
+ '.agents/skills-lock.json',
170
+ '.agents/agent-reference-repos.json',
171
+ '.agents/rstackjs-agent-skills-LICENSE',
172
+ 'topology/reference-topology.json',
173
+ 'topology/ownership.json',
174
+ 'topology/local-overlays/development.json',
175
+ '.modernjs/ultramodern-workspace-template-manifest.json',
176
+ '.modernjs/ultramodern-package-source.json',
177
+ '.modernjs/ultramodern-generated-contract.json',
178
+ 'scripts/assert-mf-types.mjs',
179
+ 'scripts/bootstrap-agent-skills.mjs',
180
+ 'scripts/check-ultramodern-i18n-boundaries.mjs',
181
+ 'scripts/generate-public-surface-assets.mjs',
182
+ 'scripts/proof-cloudflare-version.mjs',
183
+ 'scripts/setup-agent-reference-repos.mjs',
184
+ 'scripts/ultramodern-performance-readiness.config.mjs',
185
+ 'scripts/ultramodern-performance-readiness.mjs',
186
+ 'apps/shell-super-app/package.json',
187
+ 'apps/shell-super-app/modern.config.ts',
188
+ 'apps/shell-super-app/module-federation.config.ts',
189
+ 'apps/shell-super-app/src/modern-app-env.d.ts',
190
+ 'apps/shell-super-app/src/modern.runtime.ts',
191
+ 'apps/shell-super-app/src/effect/vertical-clients.ts',
192
+ 'apps/shell-super-app/locales/en/translation.json',
193
+ `apps/shell-super-app/locales/en/${shellNamespace}.json`,
194
+ 'apps/shell-super-app/locales/cs/translation.json',
195
+ `apps/shell-super-app/locales/cs/${shellNamespace}.json`,
196
+ 'apps/shell-super-app/src/routes/index.css',
197
+ 'apps/shell-super-app/src/routes/layout.tsx',
198
+ 'apps/shell-super-app/src/routes/ultramodern-route-head.tsx',
199
+ 'apps/shell-super-app/src/routes/ultramodern-route-metadata.ts',
200
+ 'apps/shell-super-app/src/routes/[lang]/page.tsx',
201
+ ...{{shellRouteMetaPathsJson}},
202
+ 'packages/shared-contracts/src/index.ts',
203
+ 'packages/shared-design-tokens/src/index.ts',
204
+ 'packages/shared-design-tokens/src/tokens.css',
205
+ ];
206
+
207
+ for (const vertical of fullStackVerticals) {
208
+ requiredPaths.push(
209
+ `${vertical.path}/package.json`,
210
+ `${vertical.path}/modern.config.ts`,
211
+ `${vertical.path}/module-federation.config.ts`,
212
+ `${vertical.path}/api/effect/index.ts`,
213
+ `${vertical.path}/shared/effect/api.ts`,
214
+ `${vertical.path}/src/effect/${vertical.stem}-client.ts`,
215
+ `${vertical.path}/src/modern-app-env.d.ts`,
216
+ `${vertical.path}/src/modern.runtime.ts`,
217
+ `${vertical.path}/src/federation-entry.tsx`,
218
+ ...vertical.componentPaths,
219
+ `${vertical.path}/locales/en/translation.json`,
220
+ `${vertical.path}/locales/en/${vertical.namespace}.json`,
221
+ `${vertical.path}/locales/cs/translation.json`,
222
+ `${vertical.path}/locales/cs/${vertical.namespace}.json`,
223
+ `${vertical.path}/src/routes/index.css`,
224
+ `${vertical.path}/src/routes/layout.tsx`,
225
+ `${vertical.path}/src/routes/ultramodern-route-head.tsx`,
226
+ `${vertical.path}/src/routes/ultramodern-route-metadata.ts`,
227
+ `${vertical.path}/src/routes/[lang]/page.tsx`,
228
+ ...vertical.routePagePaths,
229
+ ...vertical.routeMetaPaths,
230
+ );
231
+ }
232
+
233
+ if (tailwindEnabled) {
234
+ requiredPaths.push(
235
+ 'apps/shell-super-app/postcss.config.mjs',
236
+ 'apps/shell-super-app/tailwind.config.ts',
237
+ ...fullStackVerticals.flatMap(vertical => [
238
+ `${vertical.path}/postcss.config.mjs`,
239
+ `${vertical.path}/tailwind.config.ts`,
240
+ ]),
241
+ );
242
+ }
243
+
244
+ for (const requiredPath of requiredPaths) {
245
+ assertExists(requiredPath);
246
+ }
247
+ for (const oldRemotePath of oldRemotePaths) {
248
+ assertNotExists(oldRemotePath);
249
+ }
250
+ const rootPackage = readJson('package.json');
251
+ const packageSource = readJson('.modernjs/ultramodern-package-source.json');
252
+ const generatedContract = readJson('.modernjs/ultramodern-generated-contract.json');
253
+ const topology = readJson('topology/reference-topology.json');
254
+ const ownership = readJson('topology/ownership.json');
255
+ const overlay = readJson('topology/local-overlays/development.json');
256
+
257
+ assert(rootPackage.private === true, 'Root package must be private');
258
+ assert(rootPackage.packageManager === `pnpm@${expectedPnpmVersion}`, 'Root must pin pnpm');
259
+ assert(rootPackage.engines?.node === '>=26', 'Root must require Node >=26');
260
+ assert(generatedContract.node?.version === expectedNodeVersion, 'Generated contract must record the Node toolchain version');
261
+ assert(generatedContract.node?.engineRange === '>=26', 'Generated contract must record the Node engine range');
262
+ assert(readText('.mise.toml').includes(`node = "${expectedNodeVersion}"`), 'mise must pin the generated Node version');
263
+ assert(readText('.mise.toml').includes(`pnpm = "${expectedPnpmVersion}"`), 'mise must pin the generated pnpm version');
264
+ const workflowText = readText('.github/workflows/ultramodern-workspace-gates.yml');
265
+ assert(workflowText.includes(`node-version: "${expectedNodeVersion}"`), 'CI workflow must pin the generated Node version');
266
+ assert(!workflowText.includes('FORCE_JAVASCRIPT_ACTIONS_TO_NODE24'), 'CI workflow must not carry the legacy Node 24 override');
267
+ assert(rootPackage.modernjs?.preset === 'presetUltramodern', 'Root must declare presetUltramodern');
268
+ assert(rootPackage.modernjs?.packageSource?.config === './.modernjs/ultramodern-package-source.json', 'Root must point at package source metadata');
269
+ assert(rootPackage.modernjs?.packageSource?.strategy === packageSource.strategy, 'Root package source strategy must match metadata');
270
+ assert(packageSource.strategy === 'workspace' || packageSource.strategy === 'install', 'Package source strategy must be workspace or install');
271
+ assert(packageSource.strategy === 'install' || packageSource.modernPackages?.specifier === 'workspace:*', 'Workspace package source must be explicitly backed by workspace:*');
272
+ const expectedModernDependency = packageName => {
273
+ const alias = packageSource.modernPackages?.aliases?.[packageName];
274
+ const specifier = packageSource.modernPackages?.specifier;
275
+ return typeof alias === 'string' ? `npm:${alias}@${specifier}` : specifier;
276
+ };
277
+ assert(
278
+ rootPackage.devDependencies?.['@modern-js/create'] ===
279
+ expectedModernDependency('@modern-js/create'),
280
+ 'Root must depend on @modern-js/create through package source metadata',
281
+ );
282
+ assert(
283
+ rootPackage.devDependencies?.['@modern-js/code-tools'] ===
284
+ expectedModernDependency('@modern-js/code-tools'),
285
+ 'Root must depend on @modern-js/code-tools through package source metadata',
286
+ );
287
+ if (packageSource.strategy === 'install') {
288
+ const installSpecifier = packageSource.modernPackages?.specifier;
289
+ assert(
290
+ typeof installSpecifier === 'string' &&
291
+ /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(installSpecifier) &&
292
+ installSpecifier.includes('ultramodern'),
293
+ 'Install package source must use a semver UltraModern published cohort',
294
+ );
295
+ const modernAliases = packageSource.modernPackages?.aliases ?? {};
296
+ if (Object.keys(modernAliases).length > 0) {
297
+ for (const modernPackageName of [
298
+ '@modern-js/app-tools',
299
+ '@modern-js/code-tools',
300
+ '@modern-js/plugin-bff',
301
+ '@modern-js/plugin-i18n',
302
+ '@modern-js/plugin-tanstack',
303
+ '@modern-js/runtime',
304
+ '@modern-js/create',
305
+ ]) {
306
+ assert(
307
+ /^@[^/]+\/.+/.test(modernAliases[modernPackageName] ?? ''),
308
+ `Install package source alias for ${modernPackageName} must be a scoped npm package`,
309
+ );
310
+ }
311
+ }
312
+ }
313
+ assert(packageSource.generatedWorkspacePackages?.specifier === 'workspace:*', 'Generated workspace packages must keep workspace:* links');
314
+ assert(
315
+ rootPackage.scripts?.build === expectedBuildScript,
316
+ 'Root build script must build verticals before shell',
317
+ );
318
+ assert(rootPackage.scripts?.['cloudflare:build'] === expectedCloudflareBuildScript, 'Root cloudflare:build script is incorrect');
319
+ assert(!('ultramodern:check' in (rootPackage.scripts ?? {})), 'Root must not expose ultramodern:check');
320
+ assert(rootPackage.scripts?.['contract:check'] === 'node ./scripts/validate-ultramodern-workspace.mjs', 'Root must expose contract:check');
321
+ assert(rootPackage.scripts?.['i18n:boundaries'] === 'node ./scripts/check-ultramodern-i18n-boundaries.mjs', 'Root must expose i18n:boundaries');
322
+ assert(rootPackage.scripts?.['performance:readiness'] === 'node ./scripts/ultramodern-performance-readiness.mjs', 'Root must expose default-on performance readiness diagnostics');
323
+ assert(rootPackage.scripts?.check?.endsWith('&& pnpm performance:readiness'), 'Root check must run default-on performance readiness diagnostics');
324
+ const performanceReadinessConfig = readText('scripts/ultramodern-performance-readiness.config.mjs');
325
+ const performanceReadinessScript = readText('scripts/ultramodern-performance-readiness.mjs');
326
+ assert(performanceReadinessConfig.includes('UltramodernPerformanceReadinessDiagnosticsConfig'), 'Performance readiness config must carry the typed opt-out surface');
327
+ assert(performanceReadinessConfig.includes('enabled: true'), 'Performance readiness diagnostics must be default-on');
328
+ assert(performanceReadinessConfig.includes("failOn: 'framework-invariant'"), 'Performance readiness diagnostics must only fail framework invariants by default');
329
+ assert(performanceReadinessScript.includes("ULTRAMODERN_PERFORMANCE_READINESS_DIAGNOSTICS"), 'Performance readiness script must support env opt-out');
330
+ assert(performanceReadinessScript.includes('ultramodern-performance-readiness-diagnostics-v1'), 'Performance readiness script must emit the deterministic report profile');
331
+ const i18nBoundaryScript = readText('scripts/check-ultramodern-i18n-boundaries.mjs');
332
+ assert(
333
+ i18nBoundaryScript.includes("from '@modern-js/code-tools'") &&
334
+ i18nBoundaryScript.includes('runWorkspaceSourceCheck'),
335
+ 'Root i18n boundary script must call @modern-js/code-tools',
336
+ );
337
+ assert(rootPackage.scripts?.['mf:types'] === 'node ./scripts/assert-mf-types.mjs', 'Root must expose mf:types');
338
+ assert(rootPackage.scripts?.['cloudflare:deploy'] === expectedCloudflareDeployScript, 'Root must expose cloudflare:deploy');
339
+ assert(rootPackage.scripts?.['cloudflare:proof'] === 'node ./scripts/proof-cloudflare-version.mjs --out .codex/reports/cloudflare-version-proof/public-url-proof.json', 'Root must expose cloudflare:proof');
340
+ assert(rootPackage.scripts?.['skills:install'] === 'node ./scripts/bootstrap-agent-skills.mjs', 'Root must expose skills:install');
341
+ assert(rootPackage.scripts?.['skills:check'] === 'node ./scripts/bootstrap-agent-skills.mjs --check', 'Root must expose skills:check');
342
+ assert(rootPackage.scripts?.postinstall === "oxfmt . '!repos/**' && node ./scripts/bootstrap-agent-skills.mjs --postinstall", 'Root postinstall must only format and run the clone-free skills bootstrap; repository clones are explicit opt-in steps');
343
+ assert(rootPackage.scripts?.['agents:refs:install'] === 'node ./scripts/setup-agent-reference-repos.mjs', 'Root must expose agents:refs:install as the explicit reference repo installer');
344
+ const agentSkillsBootstrap = readText('scripts/bootstrap-agent-skills.mjs');
345
+ assert(agentSkillsBootstrap.includes('never installs system packages'), 'Agent skills bootstrap must declare the no-system-install policy');
346
+ assert(!agentSkillsBootstrap.includes("run('brew'") && !agentSkillsBootstrap.includes('runShell('), 'Agent skills bootstrap must never invoke system package managers');
347
+ const agentReferenceRepoSetup = readText('scripts/setup-agent-reference-repos.mjs');
348
+ assert(agentReferenceRepoSetup.includes("['commit', '--no-verify', '-m', message]"), 'Agent reference repo installer commits must skip hooks during postinstall');
349
+ assert(agentReferenceRepoSetup.includes("commitInstallerChanges('Initialize UltraModern workspace')"), 'Initial agent reference repo commit must use the installer commit helper');
350
+ assert(agentReferenceRepoSetup.includes("commitInstallerChanges('Record agent reference repo manifest')"), 'Agent reference repo manifest commit must use the installer commit helper');
351
+
352
+ const expectedAppIds = ['shell-super-app', ...fullStackVerticals.map(vertical => vertical.id)];
353
+ const expectedCloudflareCompatibilityDate = '{{cloudflareCompatibilityDate}}';
354
+ const expectedCloudflareCompatibilityFlags = ['nodejs_compat', 'global_fetch_strictly_public'];
355
+ assert(
356
+ JSON.stringify(generatedContract.apps?.map(app => app.id)) === JSON.stringify(expectedAppIds),
357
+ 'Generated contract must contain shell plus the full-stack verticals',
358
+ );
359
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.owner?.id === 'shared-design-tokens', 'CSS federation must declare shared design token ownership');
360
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.role === 'shared-design-tokens', 'CSS federation must mark shared-design-tokens as token owner');
361
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.rootSelector === ':root', 'Shared design tokens must declare their root selector');
362
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.classPrefix === '--um-', 'Shared design tokens must declare their CSS custom property prefix');
363
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.layers?.owned?.includes('ultramodern-shared-tokens'), 'Shared design tokens must own the shared token CSS layer');
364
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.entrypoints?.css?.includes('packages/shared-design-tokens/src/tokens.css'), 'Shared design tokens must declare their CSS entrypoint');
365
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.assets?.exports?.includes('./tokens.css'), 'Shared design tokens must export their CSS asset');
366
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.dedupe?.duplicateBaseStylesAllowed === false, 'Shared design token CSS must be deduplicated');
367
+ assert(generatedContract.cssFederation?.sharedDesignTokens?.ssr?.firstPaintRequired === true, 'Shared design token CSS must be required for SSR first paint');
368
+ const expectedPerformanceReadinessSignals = [
369
+ 'bfcache',
370
+ 'core-web-vitals-rum',
371
+ 'duplicate-prefetch-warmup',
372
+ 'cache-policy-sanity',
373
+ 'save-data-behavior',
374
+ 'cloudflare-ssr-cache-hints',
375
+ ];
376
+ assert(generatedContract.performanceReadiness?.default === 'enabled', 'Performance readiness diagnostics must be default-on in the generated contract');
377
+ assert(generatedContract.performanceReadiness?.mode === 'diagnostic', 'Performance readiness must remain diagnostic-only');
378
+ assert(generatedContract.performanceReadiness?.report?.script === 'scripts/ultramodern-performance-readiness.mjs', 'Performance readiness contract must point at the generated script');
379
+ assert(generatedContract.performanceReadiness?.report?.deterministic === true, 'Performance readiness reports must be deterministic');
380
+ assert(generatedContract.performanceReadiness?.optOut?.env === 'ULTRAMODERN_PERFORMANCE_READINESS_DIAGNOSTICS=false', 'Performance readiness env opt-out is incorrect');
381
+ assert(JSON.stringify(generatedContract.performanceReadiness?.signals?.map(signal => signal.id)) === JSON.stringify(expectedPerformanceReadinessSignals), 'Performance readiness signal ids are incorrect');
382
+
383
+ const shellPackage = readJson('apps/shell-super-app/package.json');
384
+ const shellModernConfig = readText('apps/shell-super-app/modern.config.ts');
385
+ const shellRouteHead = readText('apps/shell-super-app/src/routes/ultramodern-route-head.tsx');
386
+ const shellRouteMetadata = readText('apps/shell-super-app/src/routes/ultramodern-route-metadata.ts');
387
+ assert(shellRouteMetadata.includes('@generated by @modern-js/create'), 'Shell route metadata compatibility manifest must be marked generated');
388
+ assert(shellRouteMetadata.includes("authoring: 'colocated-route-meta'"), 'Shell route metadata manifest must advertise colocated authoring');
389
+ const expectedZephyrDependencies = Object.fromEntries(
390
+ fullStackVerticals.map(vertical => [
391
+ vertical.zephyrAlias,
392
+ `${vertical.packageName}@workspace:*`,
393
+ ]),
394
+ );
395
+ assert(
396
+ JSON.stringify(shellPackage['zephyr:dependencies']) ===
397
+ JSON.stringify(expectedZephyrDependencies),
398
+ 'Shell Zephyr dependencies must reference every vertical package',
399
+ );
400
+ assert(shellPackage.devDependencies?.['@modern-js/app-tools'] === expectedModernPackageSpecifier('@modern-js/app-tools'), 'Shell app-tools dependency must match package source metadata');
401
+ assert(shellPackage.dependencies?.['@modern-js/plugin-bff'] === expectedModernPackageSpecifier('@modern-js/plugin-bff'), 'Shell plugin-bff dependency must match package source metadata');
402
+ assert(shellPackage.dependencies?.['@modern-js/plugin-i18n'] === expectedModernPackageSpecifier('@modern-js/plugin-i18n'), 'Shell plugin-i18n dependency must match package source metadata');
403
+ assert(shellPackage.dependencies?.['@modern-js/plugin-tanstack'] === expectedModernPackageSpecifier('@modern-js/plugin-tanstack'), 'Shell plugin-tanstack dependency must match package source metadata');
404
+ assert(shellPackage.dependencies?.['@modern-js/runtime'] === expectedModernPackageSpecifier('@modern-js/runtime'), 'Shell runtime dependency must match package source metadata');
405
+ const shellContract = generatedContract.apps?.find(app => app.id === 'shell-super-app');
406
+ assert(shellContract?.deploy?.cloudflare?.workerName === expectedWorkerName('shell-super-app'), 'Shell Cloudflare workerName is incorrect');
407
+ assert(shellContract?.deploy?.cloudflare?.publicUrlEnv === 'ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP', 'Shell Cloudflare public URL env is incorrect');
408
+ assert(shellContract?.deploy?.cloudflare?.compatibilityDate === expectedCloudflareCompatibilityDate, 'Shell Cloudflare compatibilityDate is incorrect');
409
+ assert(JSON.stringify(shellContract?.deploy?.cloudflare?.compatibilityFlags) === JSON.stringify(expectedCloudflareCompatibilityFlags), 'Shell Cloudflare compatibility flags are incorrect');
410
+ assert(JSON.stringify(shellContract?.deploy?.cloudflare?.security) === JSON.stringify(expectedCloudflareSecurity), 'Shell Cloudflare security contract is incorrect');
411
+ assertCloudflareQualityGates('shell-super-app', shellContract?.deploy?.cloudflare?.qualityGates);
412
+ assert(shellContract?.deploy?.worker?.compatibilityDate === expectedCloudflareCompatibilityDate, 'Shell worker compatibilityDate is incorrect');
413
+ assert(shellContract?.deploy?.worker?.name === expectedWorkerName('shell-super-app'), 'Shell worker name is incorrect');
414
+ assert(shellModernConfig.includes("const cloudflareWorkerName = '" + expectedWorkerName('shell-super-app') + "'"), 'Shell modern.config.ts must define the Cloudflare worker name');
415
+ assert(shellModernConfig.includes('name: cloudflareWorkerName'), 'Shell modern.config.ts must wire deploy.worker.name');
416
+ assert(shellModernConfig.includes('const assetPrefix ='), 'Shell modern.config.ts must derive a dedicated asset prefix');
417
+ assert(shellModernConfig.includes("const configuredUltramodernAssetPrefix = envValue('ULTRAMODERN_ASSET_PREFIX')"), 'Shell asset prefix must support ULTRAMODERN_ASSET_PREFIX');
418
+ assert(shellModernConfig.includes("const configuredModernAssetPrefix = envValue('MODERN_ASSET_PREFIX')"), 'Shell asset prefix must support MODERN_ASSET_PREFIX');
419
+ const shellAssetPrefixExpression = extractAssetPrefixExpression(shellModernConfig);
420
+ assert(shellAssetPrefixExpression.includes("configuredModernAssetPrefix || configuredUltramodernAssetPrefix || '/'"), 'Shell asset prefix fallback order is incorrect');
421
+ assert(!shellAssetPrefixExpression.includes('configuredSiteUrl') && !shellAssetPrefixExpression.includes('MODERN_PUBLIC_SITE_URL'), 'Shell asset prefix must not fall back to MODERN_PUBLIC_SITE_URL');
422
+ assert(!shellAssetPrefixExpression.includes('configuredCloudflareUrl') && !shellAssetPrefixExpression.includes('ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP'), 'Shell asset prefix must not fall back to the per-app public URL');
423
+ assert(!shellAssetPrefixExpression.includes('inferredCloudflareUrl') && !shellAssetPrefixExpression.includes('ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN'), 'Shell asset prefix must not infer workers.dev URLs');
424
+ assert(shellModernConfig.includes("assetPrefix: '/'"), 'Shell modern.config.ts must keep dev assets origin-relative');
425
+ assert(shellModernConfig.includes('assetPrefix,'), 'Shell modern.config.ts must wire output.assetPrefix to the derived asset prefix');
426
+ assert(shellContract?.config?.dev?.assetPrefix === '/', 'Shell dev asset prefix must stay origin-relative');
427
+ assert(shellContract?.config?.output?.assetPrefix?.default === '/', 'Shell asset prefix must default to origin-relative paths');
428
+ assert(JSON.stringify(shellContract?.config?.output?.assetPrefix?.envFallbackOrder) === JSON.stringify(['MODERN_ASSET_PREFIX', 'ULTRAMODERN_ASSET_PREFIX']), 'Shell asset prefix env fallback order is incorrect');
429
+ assert(shellContract?.config?.performance?.readinessDiagnostics?.default === 'enabled', 'Shell performance readiness diagnostics must be default-on');
430
+ assert(shellContract?.config?.performance?.readinessDiagnostics?.failOn === 'framework-invariant', 'Shell performance readiness diagnostics must only fail framework invariants by default');
431
+ assert(shellContract?.config?.performance?.readinessDiagnostics?.optOut?.env === 'ULTRAMODERN_PERFORMANCE_READINESS_DIAGNOSTICS=false', 'Shell performance readiness env opt-out is incorrect');
432
+ assert(JSON.stringify(shellContract?.config?.source?.siteUrl?.envFallbackOrder) === JSON.stringify(['MODERN_PUBLIC_SITE_URL', 'ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP', 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN', 'SHELL_SUPER_APP_PORT']), 'Shell site URL env fallback order is incorrect');
433
+ assert(shellContract?.config?.rspack?.output?.uniqueName === 'shellSuperApp', 'Shell Rspack uniqueName is incorrect');
434
+ assert(shellContract?.config?.rspack?.output?.chunkLoadingGlobal === expectedChunkLoadingGlobal('shellSuperApp'), 'Shell Rspack chunkLoadingGlobal is incorrect');
435
+ assert(topology.shell?.cloudflare?.workerName === expectedWorkerName('shell-super-app'), 'Shell topology Cloudflare workerName is incorrect');
436
+ assert(shellContract?.styling?.federation?.owner?.id === 'shell-super-app', 'Shell CSS federation owner is missing');
437
+ assert(shellContract?.styling?.federation?.role === 'shell-base-overlay', 'Shell must own base and overlay CSS');
438
+ assert(shellContract?.styling?.federation?.rootSelector === '[data-app-id="shell-super-app"]', 'Shell CSS root selector is incorrect');
439
+ assert(shellContract?.styling?.federation?.classPrefix === 'shell:', 'Shell CSS class prefix is incorrect');
440
+ assert(shellContract?.styling?.federation?.layers?.owned?.includes('ultramodern-shell-base'), 'Shell must own the base CSS layer');
441
+ assert(shellContract?.styling?.federation?.layers?.owned?.includes('ultramodern-shell-overlay'), 'Shell must own the overlay CSS layer');
442
+ assert(shellContract?.styling?.federation?.entrypoints?.css?.includes('src/routes/index.css'), 'Shell CSS entrypoint is missing');
443
+ assert(shellContract?.styling?.federation?.assets?.shared?.some(asset => asset.endsWith('/shared-design-tokens/tokens.css')), 'Shell must import the shared design token CSS asset');
444
+ assert(shellContract?.styling?.federation?.dedupe?.duplicateBaseStylesAllowed === false, 'Shell CSS contract must forbid duplicated base styles');
445
+ assert(shellContract?.styling?.federation?.ssr?.firstPaintRequired === true, 'Shell CSS must be required for SSR first paint');
446
+ assert(shellContract?.routes?.privateByDefault === true, 'Shell routes must be private by default');
447
+ assert(shellContract?.routes?.metadataAuthoring === 'colocated-route-meta', 'Shell route metadata authoring mode is incorrect');
448
+ assert(shellContract?.routes?.generatedManifest === true, 'Shell route metadata manifest must be generated');
449
+ assert(shellContract?.routes?.publicnessDefault === 'private-app-screen', 'Shell route publicness default is incorrect');
450
+ assert(JSON.stringify(shellContract?.routes?.publicRoutes ?? []) === '[]', 'Shell must not expose generated public routes by default');
451
+ assertPublicHeadContract('shell-super-app', shellContract?.routes?.publicHead, shellRouteHead);
452
+ assertPublicSurfaceContract('shell-super-app', shellContract?.routes?.publicSurface);
453
+ assert(
454
+ (shellContract?.routes?.owned ?? []).every(route => route.public === false && route.indexable === false && route.publicSurface === 'private-app-screen' && typeof route.descriptionKey === 'string'),
455
+ 'Shell owned routes must be non-indexable private app screens by default and include description keys',
456
+ );
457
+ assertPublicSurfaceAssets('apps/shell-super-app', shellContract?.routes?.publicRoutes ?? []);
458
+ assert(
459
+ topology.shell?.verticalRefs?.join(',') === fullStackVerticals.map(vertical => vertical.id).join(','),
460
+ 'Topology shell verticalRefs must match generated verticals',
461
+ );
462
+ assert(topology.verticals?.length === fullStackVerticals.length, 'Topology must contain only generated verticals');
463
+ assert(!('remotes' in topology), 'Topology must not expose legacy remotes; use verticals');
464
+ assert(!('effectServices' in topology), 'Default APIs must be vertical-owned, not effectServices');
465
+
466
+ for (const vertical of fullStackVerticals) {
467
+ const packageJson = readJson(`${vertical.path}/package.json`);
468
+ const modernConfig = readText(`${vertical.path}/modern.config.ts`);
469
+ const routeHead = readText(`${vertical.path}/src/routes/ultramodern-route-head.tsx`);
470
+ const routeMetadata = readText(`${vertical.path}/src/routes/ultramodern-route-metadata.ts`);
471
+ assert(routeMetadata.includes('@generated by @modern-js/create'), `${vertical.id} route metadata compatibility manifest must be marked generated`);
472
+ assert(routeMetadata.includes("authoring: 'colocated-route-meta'"), `${vertical.id} route metadata manifest must advertise colocated authoring`);
473
+ assert(packageJson.name === vertical.packageName, `${vertical.id} package name is incorrect`);
474
+ assert(packageJson.scripts?.['cloudflare:deploy'] === 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS=true pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json', `${vertical.id} must expose cloudflare:deploy`);
475
+ assert(packageJson.scripts?.['cloudflare:proof']?.includes(`--app ${vertical.id}`), `${vertical.id} must expose cloudflare:proof`);
476
+ assert(packageJson.devDependencies?.['@modern-js/app-tools'] === expectedModernPackageSpecifier('@modern-js/app-tools'), `${vertical.id} app-tools dependency must match package source metadata`);
477
+ assert(packageJson.dependencies?.['@modern-js/plugin-bff'] === expectedModernPackageSpecifier('@modern-js/plugin-bff'), `${vertical.id} plugin-bff dependency must match package source metadata`);
478
+ assert(packageJson.dependencies?.['@modern-js/plugin-i18n'] === expectedModernPackageSpecifier('@modern-js/plugin-i18n'), `${vertical.id} plugin-i18n dependency must match package source metadata`);
479
+ assert(packageJson.dependencies?.['@modern-js/plugin-tanstack'] === expectedModernPackageSpecifier('@modern-js/plugin-tanstack'), `${vertical.id} plugin-tanstack dependency must match package source metadata`);
480
+ assert(packageJson.dependencies?.['@modern-js/runtime'] === expectedModernPackageSpecifier('@modern-js/runtime'), `${vertical.id} runtime dependency must match package source metadata`);
481
+ assert(packageJson.exports?.['./effect/client'] === `./src/effect/${vertical.stem}-client.ts`, `${vertical.id} must export its Effect client`);
482
+ assert(packageJson.exports?.['./shared/effect/api'] === './shared/effect/api.ts', `${vertical.id} must export its Effect API contract`);
483
+ const expectedVerticalZephyrDependencies = Object.fromEntries(
484
+ fullStackVerticals
485
+ .filter(candidate => vertical.verticalRefs.includes(candidate.id))
486
+ .map(candidate => [
487
+ candidate.zephyrAlias,
488
+ `${candidate.packageName}@workspace:*`,
489
+ ]),
490
+ );
491
+ assert(
492
+ JSON.stringify(packageJson['zephyr:dependencies']) ===
493
+ JSON.stringify(expectedVerticalZephyrDependencies),
494
+ `${vertical.id} Zephyr dependencies must match declared vertical refs`,
495
+ );
496
+
497
+ const contractEntry = generatedContract.apps?.find(app => app.id === vertical.id);
498
+ assert(contractEntry?.path === vertical.path, `${vertical.id} generated contract path is incorrect`);
499
+ assert(contractEntry?.kind === 'vertical', `${vertical.id} generated contract kind is incorrect`);
500
+ assert(contractEntry?.deploy?.cloudflare?.workerName === expectedWorkerName(vertical.id), `${vertical.id} Cloudflare workerName is incorrect`);
501
+ assert(contractEntry?.deploy?.cloudflare?.publicUrlEnv === `ULTRAMODERN_PUBLIC_URL_${vertical.id.replace(/-/g, '_').toUpperCase()}`, `${vertical.id} Cloudflare public URL env is incorrect`);
502
+ assert(contractEntry?.deploy?.cloudflare?.compatibilityDate === expectedCloudflareCompatibilityDate, `${vertical.id} Cloudflare compatibilityDate is incorrect`);
503
+ assert(JSON.stringify(contractEntry?.deploy?.cloudflare?.compatibilityFlags) === JSON.stringify(expectedCloudflareCompatibilityFlags), `${vertical.id} Cloudflare compatibility flags are incorrect`);
504
+ assert(JSON.stringify(contractEntry?.deploy?.cloudflare?.security) === JSON.stringify(expectedCloudflareSecurity), `${vertical.id} Cloudflare security contract is incorrect`);
505
+ assertCloudflareQualityGates(vertical.id, contractEntry?.deploy?.cloudflare?.qualityGates);
506
+ assert(contractEntry?.deploy?.worker?.compatibilityDate === expectedCloudflareCompatibilityDate, `${vertical.id} worker compatibilityDate is incorrect`);
507
+ assert(contractEntry?.deploy?.worker?.name === expectedWorkerName(vertical.id), `${vertical.id} worker name is incorrect`);
508
+ assert(modernConfig.includes("const cloudflareWorkerName = '" + expectedWorkerName(vertical.id) + "'"), `${vertical.id} modern.config.ts must define the Cloudflare worker name`);
509
+ assert(modernConfig.includes('name: cloudflareWorkerName'), `${vertical.id} modern.config.ts must wire deploy.worker.name`);
510
+ assert(modernConfig.includes('const assetPrefix ='), `${vertical.id} modern.config.ts must derive a dedicated asset prefix`);
511
+ assert(modernConfig.includes("const configuredUltramodernAssetPrefix = envValue('ULTRAMODERN_ASSET_PREFIX')"), `${vertical.id} asset prefix must support ULTRAMODERN_ASSET_PREFIX`);
512
+ assert(modernConfig.includes("const configuredModernAssetPrefix = envValue('MODERN_ASSET_PREFIX')"), `${vertical.id} asset prefix must support MODERN_ASSET_PREFIX`);
513
+ const verticalAssetPrefixExpression = extractAssetPrefixExpression(modernConfig);
514
+ assert(verticalAssetPrefixExpression.includes("configuredModernAssetPrefix || configuredUltramodernAssetPrefix || '/'"), `${vertical.id} asset prefix fallback order is incorrect`);
515
+ assert(!verticalAssetPrefixExpression.includes('configuredSiteUrl') && !verticalAssetPrefixExpression.includes('MODERN_PUBLIC_SITE_URL'), `${vertical.id} asset prefix must not fall back to MODERN_PUBLIC_SITE_URL`);
516
+ assert(!verticalAssetPrefixExpression.includes('configuredCloudflareUrl') && !verticalAssetPrefixExpression.includes(`ULTRAMODERN_PUBLIC_URL_${vertical.id.replace(/-/g, '_').toUpperCase()}`), `${vertical.id} asset prefix must not fall back to the per-app public URL`);
517
+ assert(!verticalAssetPrefixExpression.includes('inferredCloudflareUrl') && !verticalAssetPrefixExpression.includes('ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN'), `${vertical.id} asset prefix must not infer workers.dev URLs`);
518
+ assert(modernConfig.includes("assetPrefix: '/'"), `${vertical.id} modern.config.ts must keep dev assets origin-relative`);
519
+ assert(modernConfig.includes('assetPrefix,'), `${vertical.id} modern.config.ts must wire output.assetPrefix to the derived asset prefix`);
520
+ assert(contractEntry?.config?.dev?.assetPrefix === '/', `${vertical.id} dev asset prefix must stay origin-relative`);
521
+ assert(contractEntry?.config?.output?.assetPrefix?.default === '/', `${vertical.id} asset prefix must default to origin-relative paths`);
522
+ assert(JSON.stringify(contractEntry?.config?.output?.assetPrefix?.envFallbackOrder) === JSON.stringify(['MODERN_ASSET_PREFIX', 'ULTRAMODERN_ASSET_PREFIX']), `${vertical.id} asset prefix env fallback order is incorrect`);
523
+ assert(contractEntry?.config?.performance?.readinessDiagnostics?.default === 'enabled', `${vertical.id} performance readiness diagnostics must be default-on`);
524
+ assert(contractEntry?.config?.performance?.readinessDiagnostics?.failOn === 'framework-invariant', `${vertical.id} performance readiness diagnostics must only fail framework invariants by default`);
525
+ assert(contractEntry?.config?.performance?.readinessDiagnostics?.optOut?.config === 'scripts/ultramodern-performance-readiness.config.mjs', `${vertical.id} performance readiness opt-out config is incorrect`);
526
+ assert(contractEntry?.deploy?.cloudflare?.routes?.effectReadiness === `${vertical.apiPrefix}/effect/${vertical.stem}/readiness`, `${vertical.id} Cloudflare proof readiness route is incorrect`);
527
+ assert(contractEntry?.config?.rspack?.output?.uniqueName === vertical.mfName, `${vertical.id} Rspack uniqueName is incorrect`);
528
+ assert(contractEntry?.config?.rspack?.output?.chunkLoadingGlobal === expectedChunkLoadingGlobal(vertical.mfName), `${vertical.id} Rspack chunkLoadingGlobal is incorrect`);
529
+ assert(contractEntry?.moduleFederation?.name === vertical.mfName, `${vertical.id} MF name is incorrect`);
530
+ assert(JSON.stringify(contractEntry?.moduleFederation?.exposes) === JSON.stringify(vertical.exposes), `${vertical.id} MF exposes are incorrect`);
531
+ assert(contractEntry?.moduleFederation?.dts?.compilerInstance === 'tsgo', `${vertical.id} must keep mandatory DTS compiler`);
532
+ assert(JSON.stringify(contractEntry?.moduleFederation?.verticalRefs ?? []) === JSON.stringify(vertical.verticalRefs), `${vertical.id} MF verticalRefs are incorrect`);
533
+ assert(
534
+ JSON.stringify((contractEntry?.moduleFederation?.remotes ?? []).map(remote => remote.id)) ===
535
+ JSON.stringify(vertical.verticalRefs),
536
+ `${vertical.id} MF consumed verticals are incorrect`,
537
+ );
538
+ assert(contractEntry?.effect?.prefix === vertical.apiPrefix, `${vertical.id} Effect API prefix is incorrect`);
539
+ assert(contractEntry?.effect?.group === vertical.group, `${vertical.id} Effect group is incorrect`);
540
+ assert(contractEntry?.effect?.readiness?.endpoint === `/effect/${vertical.stem}/readiness`, `${vertical.id} readiness endpoint is incorrect`);
541
+ assert(contractEntry?.effect?.operations?.readiness?.path === `/effect/${vertical.stem}/readiness`, `${vertical.id} readiness operation is missing`);
542
+ assert(contractEntry?.effect?.requestContext?.propagatedHeaders?.includes('traceparent'), `${vertical.id} trace context propagation is missing`);
543
+ assert(Object.keys(contractEntry?.effect?.domainOperations ?? {}).length >= 3, `${vertical.id} domain operations are missing`);
544
+ assert(contractEntry?.i18n?.languages?.includes('en') && contractEntry?.i18n?.languages?.includes('cs'), `${vertical.id} must declare i18n languages`);
545
+ assert(contractEntry?.i18n?.namespace === vertical.namespace, `${vertical.id} i18n namespace is incorrect`);
546
+ assert(
547
+ JSON.stringify(contractEntry?.i18n?.localisedUrls) === JSON.stringify(vertical.localisedUrls),
548
+ `${vertical.id} localisedUrls must come from route metadata`,
549
+ );
550
+ assert(contractEntry?.routes?.source === 'route-owned', `${vertical.id} routes must be route-owned`);
551
+ assert(contractEntry?.routes?.metadataAuthoring === 'colocated-route-meta', `${vertical.id} route metadata authoring mode is incorrect`);
552
+ assert(contractEntry?.routes?.generatedManifest === true, `${vertical.id} route metadata manifest must be generated`);
553
+ assert(contractEntry?.routes?.metadataExport === './src/routes/ultramodern-route-metadata', `${vertical.id} route metadata export is incorrect`);
554
+ assert(contractEntry?.routes?.privateByDefault === true, `${vertical.id} routes must be private by default`);
555
+ assert(contractEntry?.routes?.publicnessDefault === 'private-app-screen', `${vertical.id} route publicness default is incorrect`);
556
+ assert(JSON.stringify(contractEntry?.routes?.publicRoutes ?? []) === '[]', `${vertical.id} must not expose generated public routes by default`);
557
+ assertPublicHeadContract(vertical.id, contractEntry?.routes?.publicHead, routeHead);
558
+ assertPublicSurfaceContract(vertical.id, contractEntry?.routes?.publicSurface);
559
+ assert(
560
+ (contractEntry?.routes?.owned ?? []).every(route => route.public === false && route.indexable === false && route.publicSurface === 'private-app-screen' && typeof route.descriptionKey === 'string'),
561
+ `${vertical.id} owned routes must be non-indexable private app screens by default and include description keys`,
562
+ );
563
+ assertPublicSurfaceAssets(vertical.path, contractEntry?.routes?.publicRoutes ?? []);
564
+ assert(contractEntry?.styling?.federation?.owner?.id === vertical.id, `${vertical.id} CSS federation owner is missing`);
565
+ assert(contractEntry?.styling?.federation?.role === 'vertical-css', `${vertical.id} must own only vertical CSS`);
566
+ assert(contractEntry?.styling?.federation?.rootSelector === `[data-app-id="${vertical.id}"]`, `${vertical.id} CSS root selector is incorrect`);
567
+ assert(contractEntry?.styling?.federation?.classPrefix === `${vertical.tailwindPrefix}:`, `${vertical.id} CSS class prefix is incorrect`);
568
+ assert(contractEntry?.styling?.federation?.layers?.owned?.includes(`ultramodern-vertical-${vertical.domain}`), `${vertical.id} vertical CSS layer is missing`);
569
+ assert(!contractEntry?.styling?.federation?.layers?.owned?.includes('ultramodern-shell-base'), `${vertical.id} must not own shell base CSS`);
570
+ assert(contractEntry?.styling?.federation?.entrypoints?.federationEntry === 'src/federation-entry.tsx', `${vertical.id} CSS contract must include federation entry`);
571
+ assert(contractEntry?.styling?.federation?.assets?.shared?.some(asset => asset.endsWith('/shared-design-tokens/tokens.css')), `${vertical.id} must import shared design token CSS`);
572
+ assert(contractEntry?.styling?.federation?.dedupe?.runtimeLoad === 'once-per-content-hash', `${vertical.id} CSS dedupe strategy is incorrect`);
573
+ assert(contractEntry?.styling?.federation?.ssr?.verticalCss === 'federated-manifest-owned-css', `${vertical.id} SSR CSS loading contract is incorrect`);
574
+
575
+ const topologyEntry = topology.verticals?.find(verticalEntry => verticalEntry.id === vertical.id);
576
+ assert(topologyEntry?.kind === 'vertical', `${vertical.id} topology kind is incorrect`);
577
+ assert(topologyEntry?.package === vertical.packageName, `${vertical.id} topology package is incorrect`);
578
+ assert(topologyEntry?.cloudflare?.workerName === expectedWorkerName(vertical.id), `${vertical.id} topology Cloudflare workerName is incorrect`);
579
+ assert(topologyEntry?.moduleFederation?.name === vertical.mfName, `${vertical.id} topology MF name is incorrect`);
580
+ assert(JSON.stringify(topologyEntry?.moduleFederation?.exposes) === JSON.stringify(vertical.exposes), `${vertical.id} topology exposes are incorrect`);
581
+ assert(JSON.stringify(topologyEntry?.moduleFederation?.verticalRefs ?? []) === JSON.stringify(vertical.verticalRefs), `${vertical.id} topology verticalRefs are incorrect`);
582
+ assert(topologyEntry?.api?.effect?.bff?.prefix === vertical.apiPrefix, `${vertical.id} topology API prefix is incorrect`);
583
+ assert(topologyEntry?.api?.effect?.serverEntry === `${vertical.path}/api/effect/index.ts`, `${vertical.id} topology server entry is incorrect`);
584
+ assert(topologyEntry?.api?.effect?.readiness?.endpoint === `/effect/${vertical.stem}/readiness`, `${vertical.id} topology readiness endpoint is incorrect`);
585
+ assert(Object.keys(topologyEntry?.api?.effect?.domainOperations ?? {}).length >= 3, `${vertical.id} topology domain operations are missing`);
586
+
587
+ assert(ownership.owners?.some(owner => owner.id === vertical.id && owner.path === vertical.path), `${vertical.id} ownership entry is missing`);
588
+ assert(overlay.ports?.[vertical.id], `${vertical.id} development port is missing`);
589
+ assert(overlay.manifests?.[vertical.id]?.includes('/mf-manifest.json'), `${vertical.id} development manifest is missing`);
590
+ assert(overlay.apis?.[vertical.id]?.endsWith(vertical.apiPrefix), `${vertical.id} development API URL is missing`);
591
+ }
592
+
593
+ console.log('UltraModern workspace scaffold validated');