@bleedingdev/modern-js-create 3.2.0-ultramodern.116 → 3.2.0-ultramodern.118

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 (62) hide show
  1. package/README.md +35 -125
  2. package/dist/cjs/create-package-root.cjs +1 -1
  3. package/dist/cjs/index.cjs +12 -606
  4. package/dist/cjs/locale/en.cjs +13 -20
  5. package/dist/cjs/locale/zh.cjs +13 -20
  6. package/dist/cjs/ultramodern-workspace.cjs +16 -19
  7. package/dist/esm/create-package-root.js +1 -1
  8. package/dist/esm/index.js +14 -607
  9. package/dist/esm/locale/en.js +13 -20
  10. package/dist/esm/locale/zh.js +13 -20
  11. package/dist/esm/ultramodern-workspace.js +17 -17
  12. package/dist/esm-node/create-package-root.js +1 -1
  13. package/dist/esm-node/index.js +14 -607
  14. package/dist/esm-node/locale/en.js +13 -20
  15. package/dist/esm-node/locale/zh.js +13 -20
  16. package/dist/esm-node/ultramodern-workspace.js +17 -17
  17. package/dist/types/locale/en.d.ts +0 -7
  18. package/dist/types/locale/index.d.ts +0 -14
  19. package/dist/types/locale/zh.d.ts +0 -7
  20. package/dist/types/ultramodern-workspace.d.ts +0 -1
  21. package/package.json +4 -5
  22. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +22 -6
  23. package/template-workspace/AGENTS.md +7 -3
  24. package/template-workspace/README.md.handlebars +5 -1
  25. package/template-workspace/lefthook.yml +18 -4
  26. package/template/.agents/skills-lock.json +0 -34
  27. package/template/.browserslistrc +0 -4
  28. package/template/.codex/hooks.json +0 -16
  29. package/template/.github/renovate.json +0 -53
  30. package/template/.github/workflows/ultramodern-gates.yml.handlebars +0 -54
  31. package/template/.gitignore.handlebars +0 -30
  32. package/template/.mise.toml.handlebars +0 -2
  33. package/template/.nvmrc +0 -2
  34. package/template/AGENTS.md +0 -23
  35. package/template/README.md +0 -111
  36. package/template/api/effect/index.ts.handlebars +0 -34
  37. package/template/api/lambda/hello.ts.handlebars +0 -6
  38. package/template/config/favicon.svg +0 -5
  39. package/template/config/public/assets/ultramodern-logo.svg +0 -6
  40. package/template/config/public/locales/cs/translation.json +0 -44
  41. package/template/config/public/locales/en/translation.json +0 -44
  42. package/template/lefthook.yml +0 -10
  43. package/template/modern.config.ts.handlebars +0 -78
  44. package/template/oxfmt.config.ts +0 -15
  45. package/template/oxlint.config.ts +0 -19
  46. package/template/package.json.handlebars +0 -69
  47. package/template/pnpm-workspace.yaml +0 -34
  48. package/template/postcss.config.mjs.handlebars +0 -6
  49. package/template/rstest.config.mts +0 -5
  50. package/template/scripts/bootstrap-agent-skills.mjs +0 -228
  51. package/template/scripts/check-i18n-strings.mjs +0 -3
  52. package/template/scripts/validate-ultramodern.mjs.handlebars +0 -658
  53. package/template/shared/effect/api.ts.handlebars +0 -17
  54. package/template/src/modern-app-env.d.ts +0 -3
  55. package/template/src/modern.runtime.ts.handlebars +0 -23
  56. package/template/src/routes/[lang]/page.tsx.handlebars +0 -209
  57. package/template/src/routes/index.css.handlebars +0 -266
  58. package/template/src/routes/layout.tsx.handlebars +0 -10
  59. package/template/tailwind.config.ts.handlebars +0 -10
  60. package/template/tests/tsconfig.json +0 -7
  61. package/template/tests/ultramodern.contract.test.ts.handlebars +0 -163
  62. package/template/tsconfig.json +0 -121
@@ -35,8 +35,6 @@ const EN_LOCALE = {
35
35
  error: {
36
36
  projectNameEmpty: 'Error: Project name cannot be empty',
37
37
  directoryExists: 'Error: Directory "{projectName}" already exists and is not empty',
38
- invalidRouter: 'Error: Unsupported router "{router}". Use "react-router" or "tanstack".',
39
- invalidBffRuntime: 'Error: Unsupported BFF runtime "{runtime}". Use "hono" or "effect".',
40
38
  legacyModernJsNotConfirmed: 'Aborted. UltraModern.js remains the default unattended setup.',
41
39
  createFailed: 'Error creating project:'
42
40
  },
@@ -47,41 +45,36 @@ const EN_LOCALE = {
47
45
  step1: 'cd {projectName}',
48
46
  step2: 'pnpm install',
49
47
  step3: 'pnpm dev',
50
- legacyModernJsWarning: "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\nBRUTAL WARNING: YOU ARE OPTING OUT OF ULTRAMODERN.JS DEFAULTS.\nThe unattended default is the best UltraModern.js configuration:\npresetUltramodern, TanStack Router, Effect BFF, Tailwind CSS v4,\nand the BleedingDev package cohort.\nThe original Modern.js setup is legacy compatibility only.\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
48
+ legacyModernJsWarning: "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\nBRUTAL WARNING: YOU ARE OPTING OUT OF ULTRAMODERN.JS DEFAULTS.\nThe unattended default is the best UltraModern.js configuration:\na structured SuperApp workspace, presetUltramodern, TanStack Router,\nEffect BFF, Tailwind CSS v4, and the BleedingDev package cohort.\nThe original Modern.js setup is a dangerous opt-in path.\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
51
49
  },
52
50
  help: {
53
51
  title: '🚀 UltraModern.js Project Creator',
54
- description: 'Create a new UltraModern.js app with TanStack Router and Effect BFF by default',
52
+ description: 'Create a new UltraModern.js SuperApp workspace with the full quality baseline by default',
55
53
  usage: '📖 Usage:',
56
54
  usageExample: ' pnpm dlx @bleedingdev/modern-js-create [project-name] [options]',
57
55
  options: '⚙️ Options:',
58
56
  optionHelp: ' -h, --help Display this help message',
59
57
  optionVersion: ' -v, --version Display version information',
60
- optionLang: ' -l, --lang Set the language (zh or en)',
61
- optionRouter: ' -r, --router Select router framework (tanstack default; react-router is compatibility mode)',
62
- optionBff: ' --bff Keep Effect BFF enabled (default for UltraModern apps)',
63
- optionBffRuntime: ' --bff-runtime Select BFF runtime (hono or effect)',
64
- optionTailwind: ' --no-tailwind Disable default Tailwind CSS v4 scaffold',
58
+ optionLang: ' -l, --lang Set the language (en default; zh opt-in)',
59
+ optionTailwind: ' --no-tailwind Disable default Tailwind CSS v4 workspace styling',
65
60
  optionWorkspace: ' --workspace Use workspace protocol for @modern-js dependencies (for local monorepo testing)',
66
- optionUltramodernWorkspace: ' --ultramodern-workspace Generate an UltraModern SuperApp workspace (default is a full UltraModern single app)',
67
61
  optionUltramodernPackageSource: ' --ultramodern-package-source Select UltraModern package source (workspace or install; BleedingDev defaults to install aliases)',
68
62
  optionUltramodernPackageScope: ' --ultramodern-package-scope Publish scope for npm alias installs (for example bleedingdev)',
69
63
  optionUltramodernPackageNamePrefix: ' --ultramodern-package-name-prefix Prefix for npm alias package names (default: modern-js-)',
70
64
  optionVertical: ' --vertical Mutate the current existing UltraModern workspace and wire a MicroVertical named <project-name>',
71
65
  optionLegacyModernJs: ' --legacy-modern-js Opt into the original Modern.js setup after a large warning and typed confirmation',
72
- optionSub: ' -s, --sub Mark as a subproject (package in monorepo)',
73
66
  examples: '💡 Examples:',
74
- example1: ' pnpm dlx @bleedingdev/modern-js-create my-app',
75
- example2: ' pnpm dlx @bleedingdev/modern-js-create my-app --lang zh',
76
- example3: ' pnpm dlx @bleedingdev/modern-js-create my-app --sub',
67
+ example1: ' pnpm dlx @bleedingdev/modern-js-create my-workspace',
68
+ example2: ' pnpm dlx @bleedingdev/modern-js-create my-workspace --lang zh',
69
+ example3: ' pnpm dlx @bleedingdev/modern-js-create my-workspace --no-tailwind',
77
70
  example4: ' pnpm dlx @bleedingdev/modern-js-create --help',
78
71
  example5: ' pnpm dlx @bleedingdev/modern-js-create .',
79
- example6: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router --no-tailwind',
80
- example7: ' pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono',
81
- example8: ' pnpm dlx @bleedingdev/modern-js-create my-app --workspace',
82
- example9: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
83
- example10: ' pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind',
84
- example11: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router # compatibility mode',
72
+ example6: ' pnpm dlx @bleedingdev/modern-js-create my-workspace --workspace',
73
+ example7: '',
74
+ example8: '',
75
+ example9: '',
76
+ example10: '',
77
+ example11: '',
85
78
  example12: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
86
79
  moreInfo: '📚 Learn more: https://modernjs.dev'
87
80
  },
@@ -35,8 +35,6 @@ const ZH_LOCALE = {
35
35
  error: {
36
36
  projectNameEmpty: '错误: 项目名称不能为空',
37
37
  directoryExists: '错误: 目录 "{projectName}" 已存在且不为空',
38
- invalidRouter: '错误: 不支持的路由器 "{router}",请使用 "react-router" 或 "tanstack"',
39
- invalidBffRuntime: '错误: 不支持的 BFF 运行时 "{runtime}",请使用 "hono" 或 "effect"',
40
38
  legacyModernJsNotConfirmed: '已中止。UltraModern.js 仍是默认的免交互初始化方案。',
41
39
  createFailed: '创建项目时出错:'
42
40
  },
@@ -47,41 +45,36 @@ const ZH_LOCALE = {
47
45
  step1: 'cd {projectName}',
48
46
  step2: 'pnpm install',
49
47
  step3: 'pnpm dev',
50
- legacyModernJsWarning: "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n严重警告:你正在退出 ULTRAMODERN.JS 默认配置。\n免交互默认值是最佳 UltraModern.js 配置:\npresetUltramodern、TanStack Router、Effect BFF、Tailwind CSS v4,\n以及 BleedingDev 包版本队列。\n原始 Modern.js 初始化仅用于遗留兼容。\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
48
+ legacyModernJsWarning: "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n严重警告:你正在退出 ULTRAMODERN.JS 默认配置。\n免交互默认值是最佳 UltraModern.js 配置:\n结构化 SuperApp 工作区、presetUltramodern、TanStack Router、\nEffect BFF、Tailwind CSS v4,以及 BleedingDev 包版本队列。\n原始 Modern.js 初始化是危险的显式选择路径。\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
51
49
  },
52
50
  help: {
53
51
  title: '🚀 UltraModern.js 项目创建工具',
54
- description: '创建默认包含 TanStack Router 和 Effect BFF 的 UltraModern.js 应用',
52
+ description: '默认创建带完整质量基线的 UltraModern.js SuperApp 工作区',
55
53
  usage: '📖 用法:',
56
54
  usageExample: ' pnpm dlx @bleedingdev/modern-js-create [项目名称] [选项]',
57
55
  options: '⚙️ 选项:',
58
56
  optionHelp: ' -h, --help 显示帮助信息',
59
57
  optionVersion: ' -v, --version 显示版本信息',
60
- optionLang: ' -l, --lang 设置语言 (zh 或 en)',
61
- optionRouter: ' -r, --router 选择路由框架(默认 tanstack;react-router 为兼容模式)',
62
- optionBff: ' --bff 保持启用 Effect BFF(UltraModern 应用默认值)',
63
- optionBffRuntime: ' --bff-runtime 选择 BFF 运行时(hono 或 effect)',
64
- optionTailwind: ' --no-tailwind 禁用默认 Tailwind CSS v4 模板',
58
+ optionLang: ' -l, --lang 设置语言 (默认 en;zh 需显式选择)',
59
+ optionTailwind: ' --no-tailwind 禁用默认 Tailwind CSS v4 工作区样式',
65
60
  optionWorkspace: ' --workspace 对 @modern-js 依赖使用 workspace 协议(用于本地 monorepo 联调)',
66
- optionUltramodernWorkspace: ' --ultramodern-workspace 生成 UltraModern SuperApp 工作区(默认创建完整 UltraModern 单应用)',
67
61
  optionUltramodernPackageSource: ' --ultramodern-package-source 选择 UltraModern 依赖来源(workspace 或 install;BleedingDev 默认使用 install alias)',
68
62
  optionUltramodernPackageScope: ' --ultramodern-package-scope npm alias 安装使用的发布 scope(例如 bleedingdev)',
69
63
  optionUltramodernPackageNamePrefix: ' --ultramodern-package-name-prefix npm alias 包名前缀(默认:modern-js-)',
70
64
  optionVertical: ' --vertical 修改当前已有的 UltraModern 工作区,并接入名为 <项目名称> 的 MicroVertical',
71
65
  optionLegacyModernJs: ' --legacy-modern-js 在大型警告和输入确认后,选择原始 Modern.js 初始化',
72
- optionSub: ' -s, --sub 标记为子项目(monorepo 中的子包)',
73
66
  examples: '💡 示例:',
74
- example1: ' pnpm dlx @bleedingdev/modern-js-create my-app',
75
- example2: ' pnpm dlx @bleedingdev/modern-js-create my-app --lang zh',
76
- example3: ' pnpm dlx @bleedingdev/modern-js-create my-app --sub',
67
+ example1: ' pnpm dlx @bleedingdev/modern-js-create my-workspace',
68
+ example2: ' pnpm dlx @bleedingdev/modern-js-create my-workspace --lang zh',
69
+ example3: ' pnpm dlx @bleedingdev/modern-js-create my-workspace --no-tailwind',
77
70
  example4: ' pnpm dlx @bleedingdev/modern-js-create --help',
78
71
  example5: ' pnpm dlx @bleedingdev/modern-js-create .',
79
- example6: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router --no-tailwind',
80
- example7: ' pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono',
81
- example8: ' pnpm dlx @bleedingdev/modern-js-create my-app --workspace',
82
- example9: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
83
- example10: ' pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind',
84
- example11: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router # 兼容模式',
72
+ example6: ' pnpm dlx @bleedingdev/modern-js-create my-workspace --workspace',
73
+ example7: '',
74
+ example8: '',
75
+ example9: '',
76
+ example10: '',
77
+ example11: '',
85
78
  example12: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
86
79
  moreInfo: '📚 更多信息: https://modernjs.dev'
87
80
  },
@@ -40,7 +40,6 @@ var __webpack_require__ = {};
40
40
  var __webpack_exports__ = {};
41
41
  __webpack_require__.r(__webpack_exports__);
42
42
  __webpack_require__.d(__webpack_exports__, {
43
- ULTRAMODERN_WORKSPACE_FLAG: ()=>ULTRAMODERN_WORKSPACE_FLAG,
44
43
  addUltramodernVertical: ()=>addUltramodernVertical,
45
44
  generateUltramodernWorkspace: ()=>generateUltramodernWorkspace,
46
45
  ultramodernWorkspaceVersions: ()=>ultramodernWorkspaceVersions
@@ -113,7 +112,6 @@ const supportedWorkspaceLanguages = [
113
112
  'en',
114
113
  'cs'
115
114
  ];
116
- const ULTRAMODERN_WORKSPACE_FLAG = '--ultramodern-workspace';
117
115
  const FIRST_VERTICAL_PORT = 4101;
118
116
  const TAILWIND_PREFIX_DIGIT_WORDS = [
119
117
  'zero',
@@ -490,24 +488,24 @@ function createRootPackageJson(scope, packageSource, remotes = []) {
490
488
  `dev:${remote.packageSuffix}`,
491
489
  `pnpm --filter ${ultramodern_workspace_packageName(scope, remote.packageSuffix)} dev`
492
490
  ])),
493
- build: `${remoteBuildPrefix}ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm ultramodern:assert-mf-types`,
491
+ build: `${remoteBuildPrefix}ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types`,
494
492
  format: "oxfmt . '!repos/**'",
495
493
  'format:check': "oxfmt --check . '!repos/**'",
496
494
  lint: 'oxlint apps verticals packages',
497
495
  'lint:fix': 'oxlint apps verticals packages --fix',
498
496
  typecheck: `pnpm -r --filter "@${scope}/*" typecheck`,
499
- 'cloudflare:build': `${remoteCloudflareBuildPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm ultramodern:assert-mf-types`,
497
+ 'cloudflare:build': `${remoteCloudflareBuildPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types`,
500
498
  'cloudflare:deploy': `${remoteCloudflareDeployPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:deploy`,
501
499
  'cloudflare:proof': "node ./scripts/proof-cloudflare-version.mjs --out .codex/reports/cloudflare-version-proof/public-url-proof.json",
502
500
  'skills:install': "node ./scripts/bootstrap-agent-skills.mjs",
503
501
  'skills:check': "node ./scripts/bootstrap-agent-skills.mjs --check",
504
502
  'agents:refs:install': "node ./scripts/setup-agent-reference-repos.mjs",
505
503
  'agents:refs:check': "node ./scripts/setup-agent-reference-repos.mjs --check",
506
- 'ultramodern:assert-mf-types': "node ./scripts/assert-mf-types.mjs",
507
- 'ultramodern:check': "node ./scripts/validate-ultramodern-workspace.mjs",
508
- 'ultramodern:i18n-boundaries': "node ./scripts/check-ultramodern-i18n-boundaries.mjs",
504
+ 'mf:types': "node ./scripts/assert-mf-types.mjs",
505
+ 'contract:check': "node ./scripts/validate-ultramodern-workspace.mjs",
506
+ 'i18n:boundaries': "node ./scripts/check-ultramodern-i18n-boundaries.mjs",
509
507
  postinstall: "oxfmt . '!repos/**' && node ./scripts/bootstrap-agent-skills.mjs && node ./scripts/setup-agent-reference-repos.mjs",
510
- check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm skills:check && pnpm ultramodern:i18n-boundaries && pnpm ultramodern:check'
508
+ check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm skills:check && pnpm i18n:boundaries && pnpm contract:check'
511
509
  },
512
510
  engines: {
513
511
  node: '>=20',
@@ -3628,8 +3626,8 @@ function createTopology(scope, remotes = []) {
3628
3626
  validation: {
3629
3627
  script: "scripts/validate-ultramodern-workspace.mjs",
3630
3628
  commands: [
3631
- 'pnpm ultramodern:i18n-boundaries',
3632
- 'pnpm ultramodern:check'
3629
+ 'pnpm i18n:boundaries',
3630
+ 'pnpm contract:check'
3633
3631
  ]
3634
3632
  }
3635
3633
  };
@@ -4214,8 +4212,8 @@ function createTemplateManifest(modernVersion, packageSource) {
4214
4212
  expectedCommands: [
4215
4213
  'mise install',
4216
4214
  'pnpm install',
4217
- 'pnpm run ultramodern:i18n-boundaries',
4218
- 'pnpm run ultramodern:check'
4215
+ 'pnpm run i18n:boundaries',
4216
+ 'pnpm run contract:check'
4219
4217
  ]
4220
4218
  }
4221
4219
  };
@@ -4327,8 +4325,8 @@ function createWorkspaceValidationScript(scope, enableTailwind, remotes = []) {
4327
4325
  const oldRemotePaths = [
4328
4326
  'apps/remotes'
4329
4327
  ];
4330
- const expectedBuildScript = remotes.length > 0 ? 'ULTRAMODERN_ZEPHYR=false pnpm -r --filter "./verticals/*" run build && ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm ultramodern:assert-mf-types' : 'ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm ultramodern:assert-mf-types';
4331
- const expectedCloudflareBuildScript = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:build && pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm ultramodern:assert-mf-types' : 'pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm ultramodern:assert-mf-types';
4328
+ const expectedBuildScript = remotes.length > 0 ? 'ULTRAMODERN_ZEPHYR=false pnpm -r --filter "./verticals/*" run build && ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types' : 'ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types';
4329
+ const expectedCloudflareBuildScript = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:build && pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types' : 'pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types';
4332
4330
  const expectedCloudflareDeployScript = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:deploy && pnpm --filter "./apps/shell-super-app" run cloudflare:deploy' : 'pnpm --filter "./apps/shell-super-app" run cloudflare:deploy';
4333
4331
  const expectedCloudflareSecurity = createCloudflareSecurityContract();
4334
4332
  return `import { execFileSync } from 'node:child_process';
@@ -4580,15 +4578,16 @@ assert(
4580
4578
  'Root build script must build verticals before shell',
4581
4579
  );
4582
4580
  assert(rootPackage.scripts?.['cloudflare:build'] === expectedCloudflareBuildScript, 'Root cloudflare:build script is incorrect');
4583
- assert(rootPackage.scripts?.['ultramodern:check'] === 'node ./scripts/validate-ultramodern-workspace.mjs', 'Root must expose ultramodern:check');
4584
- assert(rootPackage.scripts?.['ultramodern:i18n-boundaries'] === 'node ./scripts/check-ultramodern-i18n-boundaries.mjs', 'Root must expose ultramodern:i18n-boundaries');
4581
+ assert(!('ultramodern:check' in (rootPackage.scripts ?? {})), 'Root must not expose ultramodern:check');
4582
+ assert(rootPackage.scripts?.['contract:check'] === 'node ./scripts/validate-ultramodern-workspace.mjs', 'Root must expose contract:check');
4583
+ assert(rootPackage.scripts?.['i18n:boundaries'] === 'node ./scripts/check-ultramodern-i18n-boundaries.mjs', 'Root must expose i18n:boundaries');
4585
4584
  const i18nBoundaryScript = readText('scripts/check-ultramodern-i18n-boundaries.mjs');
4586
4585
  assert(
4587
4586
  i18nBoundaryScript.includes("from '@modern-js/code-tools'") &&
4588
4587
  i18nBoundaryScript.includes('runWorkspaceSourceCheck'),
4589
4588
  'Root i18n boundary script must call @modern-js/code-tools',
4590
4589
  );
4591
- assert(rootPackage.scripts?.['ultramodern:assert-mf-types'] === 'node ./scripts/assert-mf-types.mjs', 'Root must expose ultramodern:assert-mf-types');
4590
+ assert(rootPackage.scripts?.['mf:types'] === 'node ./scripts/assert-mf-types.mjs', 'Root must expose mf:types');
4592
4591
  assert(rootPackage.scripts?.['cloudflare:deploy'] === expectedCloudflareDeployScript, 'Root must expose cloudflare:deploy');
4593
4592
  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');
4594
4593
  assert(rootPackage.scripts?.['skills:install'] === 'node ./scripts/bootstrap-agent-skills.mjs', 'Root must expose skills:install');
@@ -5610,12 +5609,10 @@ const ultramodernWorkspaceVersions = {
5610
5609
  tailwind: TAILWIND_VERSION,
5611
5610
  tailwindPostcss: TAILWIND_POSTCSS_VERSION
5612
5611
  };
5613
- exports.ULTRAMODERN_WORKSPACE_FLAG = __webpack_exports__.ULTRAMODERN_WORKSPACE_FLAG;
5614
5612
  exports.addUltramodernVertical = __webpack_exports__.addUltramodernVertical;
5615
5613
  exports.generateUltramodernWorkspace = __webpack_exports__.generateUltramodernWorkspace;
5616
5614
  exports.ultramodernWorkspaceVersions = __webpack_exports__.ultramodernWorkspaceVersions;
5617
5615
  for(var __rspack_i in __webpack_exports__)if (-1 === [
5618
- "ULTRAMODERN_WORKSPACE_FLAG",
5619
5616
  "addUltramodernVertical",
5620
5617
  "generateUltramodernWorkspace",
5621
5618
  "ultramodernWorkspaceVersions"
@@ -9,7 +9,7 @@ function resolveCreatePackageRoot(fromDir) {
9
9
  const seen = new Set();
10
10
  for (const candidate of candidates)if (!seen.has(candidate)) {
11
11
  seen.add(candidate);
12
- if (node_fs.existsSync(node_path.join(candidate, 'package.json')) && node_fs.existsSync(node_path.join(candidate, 'template'))) return candidate;
12
+ if (node_fs.existsSync(node_path.join(candidate, 'package.json')) && node_fs.existsSync(node_path.join(candidate, 'template-workspace'))) return candidate;
13
13
  }
14
14
  throw new Error('Unable to resolve create package root');
15
15
  }