@bleedingdev/modern-js-create 3.4.0-ultramodern.12 → 3.4.0-ultramodern.14

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 (108) hide show
  1. package/README.md +13 -11
  2. package/dist/cjs/index.cjs +36 -3
  3. package/dist/cjs/locale/en.cjs +10 -0
  4. package/dist/cjs/locale/zh.cjs +10 -0
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +185 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +248 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +64 -25
  8. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
  9. package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
  10. package/dist/cjs/ultramodern-workspace/contracts.cjs +119 -653
  11. package/dist/cjs/ultramodern-workspace/descriptors.cjs +4 -0
  12. package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
  13. package/dist/cjs/ultramodern-workspace/generation-result.cjs +1 -1
  14. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  15. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +572 -0
  16. package/dist/cjs/ultramodern-workspace/module-federation.cjs +14 -0
  17. package/dist/cjs/ultramodern-workspace/package-json.cjs +26 -12
  18. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  19. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +74 -44
  20. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +55 -15
  21. package/dist/esm/index.js +36 -3
  22. package/dist/esm/locale/en.js +10 -0
  23. package/dist/esm/locale/zh.js +10 -0
  24. package/dist/esm/ultramodern-tooling/commands.js +132 -0
  25. package/dist/esm/ultramodern-tooling/config.js +196 -0
  26. package/dist/esm/ultramodern-workspace/add-vertical.js +65 -29
  27. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  28. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  29. package/dist/esm/ultramodern-workspace/contracts.js +122 -608
  30. package/dist/esm/ultramodern-workspace/descriptors.js +2 -1
  31. package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
  32. package/dist/esm/ultramodern-workspace/generation-result.js +2 -2
  33. package/dist/esm/ultramodern-workspace/index.js +1 -0
  34. package/dist/esm/ultramodern-workspace/mf-validation.js +517 -0
  35. package/dist/esm/ultramodern-workspace/module-federation.js +14 -0
  36. package/dist/esm/ultramodern-workspace/package-json.js +26 -12
  37. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  38. package/dist/esm/ultramodern-workspace/workspace-scripts.js +75 -27
  39. package/dist/esm/ultramodern-workspace/write-workspace.js +56 -19
  40. package/dist/esm-node/index.js +36 -3
  41. package/dist/esm-node/locale/en.js +10 -0
  42. package/dist/esm-node/locale/zh.js +10 -0
  43. package/dist/esm-node/ultramodern-tooling/commands.js +133 -0
  44. package/dist/esm-node/ultramodern-tooling/config.js +197 -0
  45. package/dist/esm-node/ultramodern-workspace/add-vertical.js +65 -29
  46. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  47. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  48. package/dist/esm-node/ultramodern-workspace/contracts.js +122 -608
  49. package/dist/esm-node/ultramodern-workspace/descriptors.js +2 -1
  50. package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
  51. package/dist/esm-node/ultramodern-workspace/generation-result.js +2 -2
  52. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  53. package/dist/esm-node/ultramodern-workspace/mf-validation.js +518 -0
  54. package/dist/esm-node/ultramodern-workspace/module-federation.js +14 -0
  55. package/dist/esm-node/ultramodern-workspace/package-json.js +26 -12
  56. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  57. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +75 -27
  58. package/dist/esm-node/ultramodern-workspace/write-workspace.js +56 -19
  59. package/dist/types/locale/en.d.ts +10 -0
  60. package/dist/types/locale/index.d.ts +20 -0
  61. package/dist/types/locale/zh.d.ts +10 -0
  62. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  63. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  64. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  65. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  66. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  67. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  68. package/dist/types/ultramodern-workspace/descriptors.d.ts +1 -0
  69. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
  70. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  71. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  72. package/dist/types/ultramodern-workspace/package-json.d.ts +4 -3
  73. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  74. package/dist/types/ultramodern-workspace/types.d.ts +2 -0
  75. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +1 -7
  76. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  77. package/package.json +5 -3
  78. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  79. package/template-workspace/.gitignore.handlebars +3 -0
  80. package/template-workspace/AGENTS.md.handlebars +11 -5
  81. package/template-workspace/README.md.handlebars +15 -12
  82. package/template-workspace/oxfmt.config.ts +1 -0
  83. package/template-workspace/oxlint.config.ts +1 -0
  84. package/template-workspace/scripts/bootstrap-agent-skills.mjs +77 -67
  85. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +56 -3
  86. package/templates/workspace-scripts/generate-public-surface-assets.mjs +239 -4
  87. package/templates/workspace-scripts/proof-cloudflare-version.mjs +282 -4
  88. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +172 -1
  89. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  90. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +783 -26
  91. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  92. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  93. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  94. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  95. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  96. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  97. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  98. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  99. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  100. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  101. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  102. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  103. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  104. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  105. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  106. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  107. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  108. /package/template-workspace/{.agents → .codex}/skills/rstest-best-practices/SKILL.md +0 -0
@@ -126,7 +126,7 @@ const effectDiagnostics = [
126
126
  'unnecessaryPipe',
127
127
  'unnecessaryPipeChain'
128
128
  ];
129
- function appDependencies(scope, packageSource, app, remotes = []) {
129
+ function appDependencies(scope, packageSource, app, remotes = [], bridge) {
130
130
  const dependencies = {
131
131
  '@modern-js/plugin-tanstack': (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)('@modern-js/plugin-tanstack', packageSource),
132
132
  '@modern-js/plugin-i18n': (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)('@modern-js/plugin-i18n', packageSource),
@@ -143,6 +143,7 @@ function appDependencies(scope, packageSource, app, remotes = []) {
143
143
  'react-dom': external_versions_cjs_namespaceObject.REACT_DOM_VERSION,
144
144
  'react-router': external_versions_cjs_namespaceObject.REACT_ROUTER_VERSION
145
145
  };
146
+ for (const dependency of bridge?.dependencies ?? [])dependencies[dependency] = external_ultramodern_package_source_cjs_namespaceObject.WORKSPACE_PACKAGE_VERSION;
146
147
  if ('shell' === app.kind) {
147
148
  dependencies['@modern-js/plugin-bff'] = (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)('@modern-js/plugin-bff', packageSource);
148
149
  for (const remote of (0, external_descriptors_cjs_namespaceObject.verticalEffectApps)(remotes))dependencies[(0, external_naming_cjs_namespaceObject.packageName)(scope, remote.packageSuffix)] = external_ultramodern_package_source_cjs_namespaceObject.WORKSPACE_PACKAGE_VERSION;
@@ -169,12 +170,28 @@ function appDevDependencies(packageSource, enableTailwind) {
169
170
  wrangler: external_versions_cjs_namespaceObject.WRANGLER_VERSION
170
171
  };
171
172
  }
172
- function createRootPackageJson(scope, packageSource, remotes = []) {
173
+ function createRootPackageJson(scope, packageSource, remotes = [], bridge) {
173
174
  const shellFilter = `--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, external_descriptors_cjs_namespaceObject.shellApp.packageSuffix)}`;
174
175
  const remoteFilters = remotes.map((remote)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, remote.packageSuffix)}`);
175
176
  const remoteBuildPrefix = remotes.length > 0 ? 'ULTRAMODERN_ZEPHYR=false pnpm -r --filter "./verticals/*" run build && ' : '';
176
177
  const remoteCloudflareBuildPrefix = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:build && ' : '';
177
178
  const remoteCloudflareDeployPrefix = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:deploy && ' : '';
179
+ const generatedPackageTypecheck = 'pnpm -r --filter "./apps/*" --filter "./verticals/*" --filter "./packages/*" run typecheck';
180
+ const typecheck = bridge ? generatedPackageTypecheck : "node ./scripts/ultramodern-typecheck.mjs --build tsconfig.json";
181
+ const bridgeScripts = bridge ? {
182
+ ...Object.fromEntries(bridge.gates.map((gate)=>[
183
+ `bridge:${gate.name}`,
184
+ `${gate.cwd ? `cd ${gate.cwd} && ` : ''}${gate.command}`
185
+ ])),
186
+ 'bridge:check': bridge.gates.map((gate)=>`pnpm run bridge:${gate.name}`).join(' && ')
187
+ } : {};
188
+ const bridgeCheck = bridge ? ' && pnpm bridge:check' : '';
189
+ const workspacePackages = [
190
+ 'apps/*',
191
+ 'verticals/*',
192
+ 'packages/*',
193
+ ...bridge?.workspacePackages.map((entry)=>entry.pattern) ?? []
194
+ ];
178
195
  return {
179
196
  private: true,
180
197
  name: scope,
@@ -196,7 +213,7 @@ function createRootPackageJson(scope, packageSource, remotes = []) {
196
213
  'format:check': "oxfmt --check . '!repos/**'",
197
214
  lint: 'oxlint apps verticals packages',
198
215
  'lint:fix': 'oxlint apps verticals packages --fix',
199
- typecheck: "node ./scripts/ultramodern-typecheck.mjs --build tsconfig.json",
216
+ typecheck,
200
217
  'cloudflare:build': `${remoteCloudflareBuildPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types`,
201
218
  'cloudflare:deploy': `${remoteCloudflareDeployPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:deploy`,
202
219
  'cloudflare:proof': "node ./scripts/proof-cloudflare-version.mjs --out .codex/reports/cloudflare-version-proof/public-url-proof.json",
@@ -208,18 +225,15 @@ function createRootPackageJson(scope, packageSource, remotes = []) {
208
225
  'performance:readiness': "node ./scripts/ultramodern-performance-readiness.mjs",
209
226
  'contract:check': "node ./scripts/validate-ultramodern-workspace.mjs",
210
227
  'i18n:boundaries': "node ./scripts/check-ultramodern-i18n-boundaries.mjs",
228
+ ...bridgeScripts,
211
229
  postinstall: "oxfmt . '!repos/**' && node ./scripts/bootstrap-agent-skills.mjs --postinstall",
212
- check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm skills:check && pnpm i18n:boundaries && pnpm contract:check && pnpm performance:readiness'
230
+ check: `pnpm format:check && pnpm lint && pnpm typecheck && pnpm skills:check && pnpm i18n:boundaries && pnpm contract:check && pnpm performance:readiness${bridgeCheck}`
213
231
  },
214
232
  engines: {
215
233
  node: '>=26',
216
234
  pnpm: '>=11'
217
235
  },
218
- workspaces: [
219
- 'apps/*',
220
- 'verticals/*',
221
- 'packages/*'
222
- ],
236
+ workspaces: workspacePackages,
223
237
  modernjs: {
224
238
  preset: 'presetUltramodern',
225
239
  workspace: 'ultramodern-superapp',
@@ -227,7 +241,7 @@ function createRootPackageJson(scope, packageSource, remotes = []) {
227
241
  ownership: './topology/ownership.json',
228
242
  packageSource: {
229
243
  strategy: packageSource.strategy,
230
- config: './.modernjs/ultramodern-package-source.json'
244
+ config: './.modernjs/ultramodern.json#packageSource'
231
245
  }
232
246
  },
233
247
  devDependencies: {
@@ -385,7 +399,7 @@ function createRootTsConfig(apps = []) {
385
399
  ]
386
400
  };
387
401
  }
388
- function createAppPackage(scope, app, packageSource, enableTailwind, remotes = []) {
402
+ function createAppPackage(scope, app, packageSource, enableTailwind, remotes = [], bridge) {
389
403
  const publicSurfaceBuildCommand = (0, external_public_surface_cjs_namespaceObject.createPublicSurfaceGenerationCommand)(app, 'dist');
390
404
  const publicSurfaceCloudflareBuildCommand = (0, external_public_surface_cjs_namespaceObject.createPublicSurfaceGenerationCommand)(app, 'dist');
391
405
  const publicSurfaceCloudflareOutputCommand = (0, external_public_surface_cjs_namespaceObject.createPublicSurfaceGenerationCommand)(app, 'cloudflare');
@@ -417,7 +431,7 @@ function createAppPackage(scope, app, packageSource, enableTailwind, remotes = [
417
431
  } : {}
418
432
  },
419
433
  'zephyr:dependencies': createZephyrDependencies(scope, app, remotes),
420
- dependencies: appDependencies(scope, packageSource, app, remotes),
434
+ dependencies: appDependencies(scope, packageSource, app, remotes, bridge),
421
435
  devDependencies: appDevDependencies(packageSource, enableTailwind)
422
436
  };
423
437
  if ((0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app)) Object.assign(packageExports, {
@@ -30,16 +30,20 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  addUltramodernVertical: ()=>external_add_vertical_cjs_namespaceObject.addUltramodernVertical,
32
32
  generateUltramodernWorkspace: ()=>external_write_workspace_cjs_namespaceObject.generateUltramodernWorkspace,
33
+ normalizeUltramodernBridgeConfig: ()=>external_bridge_config_cjs_namespaceObject.normalizeUltramodernBridgeConfig,
33
34
  planUltramodernVertical: ()=>external_add_vertical_cjs_namespaceObject.planUltramodernVertical
34
35
  });
35
36
  const external_add_vertical_cjs_namespaceObject = require("./add-vertical.cjs");
37
+ const external_bridge_config_cjs_namespaceObject = require("./bridge-config.cjs");
36
38
  const external_write_workspace_cjs_namespaceObject = require("./write-workspace.cjs");
37
39
  exports.addUltramodernVertical = __webpack_exports__.addUltramodernVertical;
38
40
  exports.generateUltramodernWorkspace = __webpack_exports__.generateUltramodernWorkspace;
41
+ exports.normalizeUltramodernBridgeConfig = __webpack_exports__.normalizeUltramodernBridgeConfig;
39
42
  exports.planUltramodernVertical = __webpack_exports__.planUltramodernVertical;
40
43
  for(var __rspack_i in __webpack_exports__)if (-1 === [
41
44
  "addUltramodernVertical",
42
45
  "generateUltramodernWorkspace",
46
+ "normalizeUltramodernBridgeConfig",
43
47
  "planUltramodernVertical"
44
48
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
45
49
  Object.defineProperty(exports, '__esModule', {
@@ -28,13 +28,7 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
- createAssertMfTypesScript: ()=>createAssertMfTypesScript,
32
- createCloudflareProofHelperScript: ()=>createCloudflareProofHelperScript,
33
- createCloudflareVersionProofScript: ()=>createCloudflareVersionProofScript,
34
31
  createPerformanceReadinessConfigScript: ()=>createPerformanceReadinessConfigScript,
35
- createPerformanceReadinessScript: ()=>createPerformanceReadinessScript,
36
- createPublicSurfaceAssetsScript: ()=>createPublicSurfaceAssetsScript,
37
- createUltramodernTypecheckScript: ()=>createUltramodernTypecheckScript,
38
32
  createWorkspaceI18nBoundaryValidationScript: ()=>createWorkspaceI18nBoundaryValidationScript,
39
33
  createWorkspaceValidationScript: ()=>createWorkspaceValidationScript,
40
34
  writeGeneratedWorkspaceScripts: ()=>writeGeneratedWorkspaceScripts
@@ -48,10 +42,73 @@ const external_policy_cjs_namespaceObject = require("./policy.cjs");
48
42
  const external_public_surface_cjs_namespaceObject = require("./public-surface.cjs");
49
43
  const external_routes_cjs_namespaceObject = require("./routes.cjs");
50
44
  const external_versions_cjs_namespaceObject = require("./versions.cjs");
51
- function createAssertMfTypesScript(remotes = []) {
52
- return (0, external_fs_io_cjs_namespaceObject.renderFileTemplate)("workspace-scripts/assert-mf-types.mjs", {
53
- defaultAppDirsJson: JSON.stringify(remotes.map((remote)=>remote.directory), null, 2)
45
+ function createToolWrapperScript(command, extraArgs = []) {
46
+ const commandJson = JSON.stringify(command);
47
+ const extraArgsJson = JSON.stringify(extraArgs);
48
+ return `#!/usr/bin/env node
49
+ import { spawnSync } from 'node:child_process';
50
+ import path from 'node:path';
51
+ import { fileURLToPath } from 'node:url';
52
+
53
+ const createBin = process.env.ULTRAMODERN_CREATE_BIN;
54
+ const forwardedArgs = process.argv.slice(2);
55
+ const workspaceRoot =
56
+ process.env.ULTRAMODERN_WORKSPACE_ROOT ??
57
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
58
+ const ultramodernArgs = ['ultramodern', ${commandJson}, ...${extraArgsJson}, ...forwardedArgs];
59
+ const result = createBin
60
+ ? spawnSync(process.execPath, [createBin, ...ultramodernArgs], {
61
+ env: { ...process.env, ULTRAMODERN_WORKSPACE_ROOT: workspaceRoot },
62
+ stdio: 'inherit',
63
+ })
64
+ : spawnSync('modern-js-create', ultramodernArgs, {
65
+ env: { ...process.env, ULTRAMODERN_WORKSPACE_ROOT: workspaceRoot },
66
+ shell: process.platform === 'win32',
67
+ stdio: 'inherit',
54
68
  });
69
+
70
+ if (result.error) {
71
+ console.error(result.error.message);
72
+ process.exit(1);
73
+ }
74
+
75
+ process.exit(result.status ?? 1);
76
+ `;
77
+ }
78
+ function createSkillsToolWrapperScript() {
79
+ return `#!/usr/bin/env node
80
+ import { spawnSync } from 'node:child_process';
81
+ import path from 'node:path';
82
+ import { fileURLToPath } from 'node:url';
83
+
84
+ const createBin = process.env.ULTRAMODERN_CREATE_BIN;
85
+ const forwardedArgs = process.argv.slice(2);
86
+ const workspaceRoot =
87
+ process.env.ULTRAMODERN_WORKSPACE_ROOT ??
88
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
89
+ const checkOnly = forwardedArgs.includes('--check');
90
+ const skillArgs = checkOnly
91
+ ? ['skills', 'check', ...forwardedArgs.filter(arg => arg !== '--check')]
92
+ : ['skills', 'install', ...forwardedArgs];
93
+ const ultramodernArgs = ['ultramodern', ...skillArgs];
94
+ const result = createBin
95
+ ? spawnSync(process.execPath, [createBin, ...ultramodernArgs], {
96
+ env: { ...process.env, ULTRAMODERN_WORKSPACE_ROOT: workspaceRoot },
97
+ stdio: 'inherit',
98
+ })
99
+ : spawnSync('modern-js-create', ultramodernArgs, {
100
+ env: { ...process.env, ULTRAMODERN_WORKSPACE_ROOT: workspaceRoot },
101
+ shell: process.platform === 'win32',
102
+ stdio: 'inherit',
103
+ });
104
+
105
+ if (result.error) {
106
+ console.error(result.error.message);
107
+ process.exit(1);
108
+ }
109
+
110
+ process.exit(result.status ?? 1);
111
+ `;
55
112
  }
56
113
  function createWorkspaceValidationScript(scope, enableTailwind, remotes = []) {
57
114
  const verticals = remotes.filter(external_descriptors_cjs_namespaceObject.appHasEffectApi).map((remote)=>({
@@ -105,53 +162,26 @@ function createWorkspaceValidationScript(scope, enableTailwind, remotes = []) {
105
162
  function createWorkspaceI18nBoundaryValidationScript() {
106
163
  return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/check-ultramodern-i18n-boundaries.mjs");
107
164
  }
108
- function createPublicSurfaceAssetsScript() {
109
- return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/generate-public-surface-assets.mjs");
110
- }
111
- function createCloudflareProofHelperScript() {
112
- return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/ultramodern-cloudflare-proof.mjs");
113
- }
114
- function createCloudflareVersionProofScript() {
115
- return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/proof-cloudflare-version.mjs");
116
- }
117
165
  function createPerformanceReadinessConfigScript() {
118
166
  return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/ultramodern-performance-readiness.config.mjs");
119
167
  }
120
- function createPerformanceReadinessScript() {
121
- return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/ultramodern-performance-readiness.mjs");
122
- }
123
- function createUltramodernTypecheckScript() {
124
- return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/ultramodern-typecheck.mjs");
125
- }
126
- function writeGeneratedWorkspaceScripts(targetDir, scope, enableTailwind, remotes = []) {
127
- (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/assert-mf-types.mjs", createAssertMfTypesScript(remotes));
128
- (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/validate-ultramodern-workspace.mjs", createWorkspaceValidationScript(scope, enableTailwind, remotes));
168
+ function writeGeneratedWorkspaceScripts(targetDir, _scope, _enableTailwind, _remotes = []) {
169
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/assert-mf-types.mjs", createToolWrapperScript('mf-types'));
170
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/validate-ultramodern-workspace.mjs", createToolWrapperScript('validate'));
129
171
  (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/check-ultramodern-i18n-boundaries.mjs", createWorkspaceI18nBoundaryValidationScript());
130
- (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/generate-public-surface-assets.mjs", createPublicSurfaceAssetsScript());
131
- (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-cloudflare-proof.mjs", createCloudflareProofHelperScript());
132
- (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/proof-cloudflare-version.mjs", createCloudflareVersionProofScript());
172
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/generate-public-surface-assets.mjs", createToolWrapperScript('public-surface'));
173
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/proof-cloudflare-version.mjs", createToolWrapperScript('cloudflare-proof'));
133
174
  (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-performance-readiness.config.mjs", createPerformanceReadinessConfigScript());
134
- (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-performance-readiness.mjs", createPerformanceReadinessScript());
135
- (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-typecheck.mjs", createUltramodernTypecheckScript());
175
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-performance-readiness.mjs", createToolWrapperScript('performance-readiness'));
176
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-typecheck.mjs", createToolWrapperScript('typecheck'));
177
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/bootstrap-agent-skills.mjs", createSkillsToolWrapperScript());
136
178
  }
137
- exports.createAssertMfTypesScript = __webpack_exports__.createAssertMfTypesScript;
138
- exports.createCloudflareProofHelperScript = __webpack_exports__.createCloudflareProofHelperScript;
139
- exports.createCloudflareVersionProofScript = __webpack_exports__.createCloudflareVersionProofScript;
140
179
  exports.createPerformanceReadinessConfigScript = __webpack_exports__.createPerformanceReadinessConfigScript;
141
- exports.createPerformanceReadinessScript = __webpack_exports__.createPerformanceReadinessScript;
142
- exports.createPublicSurfaceAssetsScript = __webpack_exports__.createPublicSurfaceAssetsScript;
143
- exports.createUltramodernTypecheckScript = __webpack_exports__.createUltramodernTypecheckScript;
144
180
  exports.createWorkspaceI18nBoundaryValidationScript = __webpack_exports__.createWorkspaceI18nBoundaryValidationScript;
145
181
  exports.createWorkspaceValidationScript = __webpack_exports__.createWorkspaceValidationScript;
146
182
  exports.writeGeneratedWorkspaceScripts = __webpack_exports__.writeGeneratedWorkspaceScripts;
147
183
  for(var __rspack_i in __webpack_exports__)if (-1 === [
148
- "createAssertMfTypesScript",
149
- "createCloudflareProofHelperScript",
150
- "createCloudflareVersionProofScript",
151
184
  "createPerformanceReadinessConfigScript",
152
- "createPerformanceReadinessScript",
153
- "createPublicSurfaceAssetsScript",
154
- "createUltramodernTypecheckScript",
155
185
  "createWorkspaceI18nBoundaryValidationScript",
156
186
  "createWorkspaceValidationScript",
157
187
  "writeGeneratedWorkspaceScripts"
@@ -37,6 +37,7 @@ var __webpack_require__ = {};
37
37
  var __webpack_exports__ = {};
38
38
  __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
+ createCompactUltramodernConfig: ()=>createCompactUltramodernConfig,
40
41
  generateUltramodernWorkspace: ()=>generateUltramodernWorkspace,
41
42
  writeApp: ()=>writeApp,
42
43
  writeSharedPackages: ()=>writeSharedPackages
@@ -44,6 +45,7 @@ __webpack_require__.d(__webpack_exports__, {
44
45
  const external_node_fs_namespaceObject = require("node:fs");
45
46
  var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
46
47
  const external_app_files_cjs_namespaceObject = require("./app-files.cjs");
48
+ const external_bridge_config_cjs_namespaceObject = require("./bridge-config.cjs");
47
49
  const external_contracts_cjs_namespaceObject = require("./contracts.cjs");
48
50
  const external_demo_components_cjs_namespaceObject = require("./demo-components.cjs");
49
51
  const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
@@ -59,13 +61,13 @@ const external_package_source_cjs_namespaceObject = require("./package-source.cj
59
61
  const external_public_surface_cjs_namespaceObject = require("./public-surface.cjs");
60
62
  const external_versions_cjs_namespaceObject = require("./versions.cjs");
61
63
  const external_workspace_scripts_cjs_namespaceObject = require("./workspace-scripts.cjs");
62
- function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes = []) {
64
+ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes = [], bridge) {
63
65
  const resolvedApp = 'shell' === app.kind ? (0, external_descriptors_cjs_namespaceObject.createShellHost)(remotes) : app;
64
66
  const publicWeb = (0, external_public_surface_cjs_namespaceObject.createPublicWebAppArtifacts)(resolvedApp);
65
67
  const writeAppFile = (relativePath, content)=>{
66
68
  (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/${relativePath}`, content);
67
69
  };
68
- (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/package.json`, (0, external_package_json_cjs_namespaceObject.createAppPackage)(scope, resolvedApp, packageSource, enableTailwind, remotes));
70
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/package.json`, (0, external_package_json_cjs_namespaceObject.createAppPackage)(scope, resolvedApp, packageSource, enableTailwind, remotes, bridge));
69
71
  (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/tsconfig.json`, (0, external_package_json_cjs_namespaceObject.createAppTsConfig)(resolvedApp, remotes));
70
72
  (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/tsconfig.mf-types.json`, (0, external_package_json_cjs_namespaceObject.createAppMfTypesTsConfig)(resolvedApp));
71
73
  (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/src/modern-app-env.d.ts`, (0, external_app_files_cjs_namespaceObject.createAppEnvDts)(resolvedApp, remotes));
@@ -124,10 +126,36 @@ function writeSharedPackages(targetDir, scope) {
124
126
  `);
125
127
  (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, 'packages/shared-design-tokens/src/tokens.css', (0, external_app_files_cjs_namespaceObject.createSharedDesignTokensCss)());
126
128
  }
129
+ function createCompactRootPackageJson(scope, packageSource, remotes, bridge) {
130
+ const rootPackage = (0, external_package_json_cjs_namespaceObject.createRootPackageJson)(scope, packageSource, remotes, bridge);
131
+ if (rootPackage.modernjs?.packageSource && 'object' == typeof rootPackage.modernjs.packageSource) rootPackage.modernjs.packageSource.config = `./${external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH}`;
132
+ return rootPackage;
133
+ }
134
+ function createCompactUltramodernConfig(scope, modernVersion, packageSource, apps = [
135
+ (0, external_descriptors_cjs_namespaceObject.createShellHost)()
136
+ ], enableTailwind = true, bridge) {
137
+ const config = (0, external_contracts_cjs_namespaceObject.createUltramodernConfig)(scope, modernVersion, packageSource, apps, enableTailwind, bridge);
138
+ if (config.packageSource && 'object' == typeof config.packageSource && !Array.isArray(config.packageSource)) delete config.packageSource.metadata;
139
+ return config;
140
+ }
141
+ function writePnpmWorkspacePackages(targetDir, bridge) {
142
+ if (!bridge) return;
143
+ const pnpmWorkspacePath = `${targetDir}/pnpm-workspace.yaml`;
144
+ const pnpmWorkspace = external_node_fs_default().readFileSync(pnpmWorkspacePath, 'utf-8');
145
+ const packages = [
146
+ 'apps/*',
147
+ 'verticals/*',
148
+ 'packages/*',
149
+ ...bridge.workspacePackages.map((entry)=>entry.pattern)
150
+ ];
151
+ const renderedPackages = packages.map((pattern)=>` - ${pattern}`).join('\n');
152
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, 'pnpm-workspace.yaml', pnpmWorkspace.replace(/^packages:\n(?: {2}- .+\n)+/u, `packages:\n${renderedPackages}\n`));
153
+ }
127
154
  function generateUltramodernWorkspace(options) {
128
155
  const beforeFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.targetDir);
129
156
  const scope = (0, external_naming_cjs_namespaceObject.toPackageScope)(options.packageName);
130
157
  const packageSource = (0, external_package_source_cjs_namespaceObject.resolvePackageSource)(options);
158
+ const bridge = (0, external_bridge_config_cjs_namespaceObject.normalizeUltramodernBridgeConfig)(options.bridge);
131
159
  const enableTailwind = false !== options.enableTailwind;
132
160
  const initialVerticals = [];
133
161
  const createdApps = [
@@ -152,41 +180,53 @@ function generateUltramodernWorkspace(options) {
152
180
  typescriptVersion: external_versions_cjs_namespaceObject.TYPESCRIPT_VERSION,
153
181
  tailwindEnabled: String(enableTailwind)
154
182
  });
155
- (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'package.json', (0, external_package_json_cjs_namespaceObject.createRootPackageJson)(scope, packageSource, initialVerticals));
183
+ writePnpmWorkspacePackages(options.targetDir, bridge);
184
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'package.json', createCompactRootPackageJson(scope, packageSource, initialVerticals, bridge));
156
185
  (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'tsconfig.base.json', (0, external_package_json_cjs_namespaceObject.createTsConfigBase)());
157
186
  (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'tsconfig.json', (0, external_package_json_cjs_namespaceObject.createRootTsConfig)(createdApps));
158
187
  (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'topology/reference-topology.json', (0, external_contracts_cjs_namespaceObject.createTopology)(scope, initialVerticals));
159
188
  (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'topology/ownership.json', (0, external_contracts_cjs_namespaceObject.createOwnership)(scope, initialVerticals));
160
189
  (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'topology/local-overlays/development.json', (0, external_contracts_cjs_namespaceObject.createDevelopmentOverlay)(initialVerticals));
161
- (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, '.modernjs/ultramodern-workspace-template-manifest.json', (0, external_contracts_cjs_namespaceObject.createTemplateManifest)(options.modernVersion, packageSource));
162
- (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, '.modernjs/ultramodern-package-source.json', (0, external_contracts_cjs_namespaceObject.createPackageSourceMetadata)(scope, packageSource));
163
- (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH, (0, external_contracts_cjs_namespaceObject.createGeneratedContract)(scope, createdApps, enableTailwind));
164
- writeApp(options.targetDir, scope, external_descriptors_cjs_namespaceObject.shellApp, packageSource, enableTailwind, initialVerticals);
165
- for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals);
190
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH, createCompactUltramodernConfig(scope, options.modernVersion, packageSource, createdApps, enableTailwind, bridge));
191
+ writeApp(options.targetDir, scope, external_descriptors_cjs_namespaceObject.shellApp, packageSource, enableTailwind, initialVerticals, bridge);
192
+ for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals, bridge);
166
193
  writeSharedPackages(options.targetDir, scope);
167
194
  (0, external_workspace_scripts_cjs_namespaceObject.writeGeneratedWorkspaceScripts)(options.targetDir, scope, enableTailwind, initialVerticals);
168
- const afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.targetDir);
169
- const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
170
- const result = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
195
+ const preliminaryAfterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.targetDir);
196
+ const preliminaryDiff = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, preliminaryAfterFiles);
197
+ const preliminaryResult = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
171
198
  operation: 'workspace',
172
199
  workspaceRoot: options.targetDir,
173
200
  packageScope: scope,
174
201
  packageSource,
175
202
  createdApps,
176
- createdPaths,
177
- rewrittenPaths
203
+ createdPaths: preliminaryDiff.createdPaths,
204
+ rewrittenPaths: preliminaryDiff.rewrittenPaths
178
205
  });
179
206
  (0, external_overlays_cjs_namespaceObject.runCodeSmithOverlays)({
180
207
  workspaceRoot: options.targetDir,
181
208
  overlays: options.overlays,
182
- result
209
+ result: preliminaryResult
210
+ });
211
+ (0, external_fs_io_cjs_namespaceObject.formatGeneratedWorkspaceFiles)(options.targetDir);
212
+ const afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.targetDir);
213
+ const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
214
+ return (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
215
+ operation: 'workspace',
216
+ workspaceRoot: options.targetDir,
217
+ packageScope: scope,
218
+ packageSource,
219
+ createdApps,
220
+ createdPaths,
221
+ rewrittenPaths
183
222
  });
184
- return result;
185
223
  }
224
+ exports.createCompactUltramodernConfig = __webpack_exports__.createCompactUltramodernConfig;
186
225
  exports.generateUltramodernWorkspace = __webpack_exports__.generateUltramodernWorkspace;
187
226
  exports.writeApp = __webpack_exports__.writeApp;
188
227
  exports.writeSharedPackages = __webpack_exports__.writeSharedPackages;
189
228
  for(var __rspack_i in __webpack_exports__)if (-1 === [
229
+ "createCompactUltramodernConfig",
190
230
  "generateUltramodernWorkspace",
191
231
  "writeApp",
192
232
  "writeSharedPackages"
package/dist/esm/index.js CHANGED
@@ -6,7 +6,9 @@ import { fileURLToPath } from "node:url";
6
6
  import { resolveCreatePackageRoot } from "./create-package-root.js";
7
7
  import { i18n, localeKeys } from "./locale/index.js";
8
8
  import { BLEEDINGDEV_CREATE_PACKAGE, BLEEDINGDEV_FRAMEWORK_VERSION_ENV, BLEEDINGDEV_PACKAGE_NAME_PREFIX, BLEEDINGDEV_PACKAGE_SCOPE, WORKSPACE_PACKAGE_VERSION } from "./ultramodern-package-source.js";
9
+ import { runUltramodernToolingCli } from "./ultramodern-tooling/commands.js";
9
10
  import { addUltramodernVertical, generateUltramodernWorkspace, planUltramodernVertical } from "./ultramodern-workspace/index.js";
11
+ import { hasUltramodernBridgeCliOptions, parseUltramodernBridgeCliOptions, ultramodernBridgeCliBooleanFlags, ultramodernBridgeCliValueFlags } from "./ultramodern-workspace/bridge-config.js";
10
12
  const src_dirname = node_path.dirname(fileURLToPath(import.meta.url));
11
13
  const createPackageRoot = resolveCreatePackageRoot(src_dirname);
12
14
  const semverPattern = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
@@ -84,6 +86,16 @@ function showHelp() {
84
86
  console.log(i18n.t(localeKeys.help.optionUltramodernPackageRegistry));
85
87
  console.log(i18n.t(localeKeys.help.optionUltramodernPackageScope));
86
88
  console.log(i18n.t(localeKeys.help.optionUltramodernPackageNamePrefix));
89
+ console.log(i18n.t(localeKeys.help.optionBridge));
90
+ console.log(i18n.t(localeKeys.help.optionBridgeParentRoot));
91
+ console.log(i18n.t(localeKeys.help.optionBridgeWorkspacePackage));
92
+ console.log(i18n.t(localeKeys.help.optionBridgeWorkspacePackageName));
93
+ console.log(i18n.t(localeKeys.help.optionBridgeTestAlias));
94
+ console.log(i18n.t(localeKeys.help.optionBridgeDependency));
95
+ console.log(i18n.t(localeKeys.help.optionBridgeLockfilePolicy));
96
+ console.log(i18n.t(localeKeys.help.optionBridgeGate));
97
+ console.log(i18n.t(localeKeys.help.optionBridgeGateCwd));
98
+ console.log(i18n.t(localeKeys.help.optionBridgeReactSingleton));
87
99
  console.log(i18n.t(localeKeys.help.optionVertical));
88
100
  console.log(i18n.t(localeKeys.help.optionVerticalName));
89
101
  console.log(i18n.t(localeKeys.help.optionDryRun));
@@ -197,7 +209,8 @@ function collectPositionalArgs(args) {
197
209
  '--ultramodern-package-scope',
198
210
  '--ultramodern-package-name-prefix',
199
211
  VERTICAL_NAME_FLAG,
200
- CODESMITH_OVERLAY_FLAG
212
+ CODESMITH_OVERLAY_FLAG,
213
+ ...ultramodernBridgeCliValueFlags
201
214
  ]);
202
215
  const optionWithoutValue = new Set([
203
216
  '--help',
@@ -210,7 +223,8 @@ function collectPositionalArgs(args) {
210
223
  WORKSPACE_PROTOCOL_FLAG,
211
224
  DRY_RUN_FLAG,
212
225
  VERTICAL_FLAG,
213
- LEGACY_MODERN_JS_FLAG
226
+ LEGACY_MODERN_JS_FLAG,
227
+ ...ultramodernBridgeCliBooleanFlags
214
228
  ]);
215
229
  const positionalArgs = [];
216
230
  for(let i = 0; i < args.length; i++){
@@ -220,7 +234,7 @@ function collectPositionalArgs(args) {
220
234
  i += 1;
221
235
  continue;
222
236
  }
223
- if (!(arg.startsWith('--lang=') || arg.startsWith(`${BFF_RUNTIME_OPTION}=`) || arg.startsWith('--ultramodern-package-source=') || arg.startsWith('--ultramodern-package-version=') || arg.startsWith('--ultramodern-package-registry=') || arg.startsWith('--ultramodern-package-scope=') || arg.startsWith('--ultramodern-package-name-prefix=') || arg.startsWith(`${VERTICAL_FLAG}=`) || arg.startsWith(`${VERTICAL_NAME_FLAG}=`) || arg.startsWith(`${CODESMITH_OVERLAY_FLAG}=`))) positionalArgs.push(arg);
237
+ if (!(arg.startsWith('--lang=') || arg.startsWith(`${BFF_RUNTIME_OPTION}=`) || arg.startsWith('--ultramodern-package-source=') || arg.startsWith('--ultramodern-package-version=') || arg.startsWith('--ultramodern-package-registry=') || arg.startsWith('--ultramodern-package-scope=') || arg.startsWith('--ultramodern-package-name-prefix=') || arg.startsWith(`${VERTICAL_FLAG}=`) || arg.startsWith(`${VERTICAL_NAME_FLAG}=`) || arg.startsWith(`${CODESMITH_OVERLAY_FLAG}=`) || ultramodernBridgeCliBooleanFlags.some((flag)=>arg.startsWith(`${flag}=`)) || ultramodernBridgeCliValueFlags.some((flag)=>arg.startsWith(`${flag}=`)))) positionalArgs.push(arg);
224
238
  }
225
239
  }
226
240
  return positionalArgs;
@@ -336,6 +350,14 @@ function detectCodeSmithOverlays(args) {
336
350
  }
337
351
  return overlays.length > 0 ? overlays : void 0;
338
352
  }
353
+ function readBridgeCliOptions(args) {
354
+ try {
355
+ return parseUltramodernBridgeCliOptions(args);
356
+ } catch (error) {
357
+ console.error(error instanceof Error ? error.message : String(error));
358
+ process.exit(1);
359
+ }
360
+ }
339
361
  function detectUltramodernPackageSource(args, defaultPackageVersion, createPackage) {
340
362
  const bleedingDevDefaults = isBleedingDevCreatePackage(createPackage);
341
363
  const strategy = getOptionValue(args, [
@@ -545,6 +567,10 @@ async function getProjectName() {
545
567
  }
546
568
  async function main() {
547
569
  const args = process.argv.slice(2);
570
+ if ('ultramodern' === args[0]) {
571
+ process.exitCode = await runUltramodernToolingCli(args.slice(1));
572
+ return;
573
+ }
548
574
  if (args.includes('--help') || args.includes('-h')) return void showHelp();
549
575
  if (args.includes('--version') || args.includes('-v')) return void showVersion();
550
576
  if (detectLegacyModernJsFlag(args)) {
@@ -556,10 +582,16 @@ async function main() {
556
582
  const dryRun = detectDryRunFlag(args);
557
583
  const verticalInput = resolveVerticalCliInput(args);
558
584
  const overlays = detectCodeSmithOverlays(args);
585
+ const bridgeRequested = hasUltramodernBridgeCliOptions(args);
559
586
  if (dryRun && !verticalInput.addVertical) {
560
587
  console.error(`${DRY_RUN_FLAG} is currently supported only with ${VERTICAL_FLAG}`);
561
588
  process.exit(1);
562
589
  }
590
+ if (verticalInput.addVertical && bridgeRequested) {
591
+ console.error('Bridge options are supported only when creating a new UltraModern workspace.');
592
+ process.exit(1);
593
+ }
594
+ const bridge = readBridgeCliOptions(args);
563
595
  if (!dryRun) console.log(`\n${i18n.t(localeKeys.message.welcome)}\n`);
564
596
  const createPackage = readCreatePackageJson();
565
597
  const version = createPackage.version || 'latest';
@@ -600,6 +632,7 @@ async function main() {
600
632
  packageName: generatedPackageName,
601
633
  modernVersion: version,
602
634
  enableTailwind: detectTailwindFlag(),
635
+ bridge,
603
636
  overlays,
604
637
  packageSource
605
638
  });
@@ -38,6 +38,16 @@ const EN_LOCALE = {
38
38
  optionUltramodernPackageRegistry: ' --ultramodern-package-registry npm registry URL used for install package sources',
39
39
  optionUltramodernPackageScope: ' --ultramodern-package-scope Publish scope for npm alias installs (for example bleedingdev)',
40
40
  optionUltramodernPackageNamePrefix: ' --ultramodern-package-name-prefix Prefix for npm alias package names (default: modern-js-)',
41
+ optionBridge: ' --bridge Enable explicit nested parent-monorepo bridge mode for new workspaces',
42
+ optionBridgeParentRoot: ' --bridge-parent-root <path> Parent monorepo root for bridge mode',
43
+ optionBridgeWorkspacePackage: ' --bridge-workspace-package <glob> Parent workspace package glob consumed by generated apps',
44
+ optionBridgeWorkspacePackageName: ' --bridge-workspace-package-name <glob=package[,package]> Package names covered by a bridge workspace glob',
45
+ optionBridgeTestAlias: ' --bridge-test-alias <glob:alias=target> Test/source alias for a bridge workspace package glob',
46
+ optionBridgeDependency: ' --bridge-dependency <package[,package]> Explicit parent package dependency consumed by generated apps',
47
+ optionBridgeLockfilePolicy: ' --bridge-lockfile-policy <nested|parent> Bridge lockfile ownership policy (default: nested)',
48
+ optionBridgeGate: ' --bridge-gate <name=command> Delegated parent workspace gate command for bridge packages',
49
+ optionBridgeGateCwd: ' --bridge-gate-cwd <name=cwd> Working directory for a named bridge gate',
50
+ optionBridgeReactSingleton: ' --bridge-react-singleton <package[,package]> React singleton package expectation (default: react,react-dom)',
41
51
  optionVertical: ' --vertical[=<name>] Mutate the current existing UltraModern workspace and wire a MicroVertical',
42
52
  optionVerticalName: ' --vertical-name <name> Explicit MicroVertical name for automation-friendly workspace mutation',
43
53
  optionDryRun: ' --dry-run Preview a MicroVertical mutation plan without writing files (supported with --vertical)',
@@ -38,6 +38,16 @@ const ZH_LOCALE = {
38
38
  optionUltramodernPackageRegistry: ' --ultramodern-package-registry install 依赖来源使用的 npm registry 地址',
39
39
  optionUltramodernPackageScope: ' --ultramodern-package-scope npm alias 安装使用的发布 scope(例如 bleedingdev)',
40
40
  optionUltramodernPackageNamePrefix: ' --ultramodern-package-name-prefix npm alias 包名前缀(默认:modern-js-)',
41
+ optionBridge: ' --bridge 为新工作区启用显式的嵌套父 monorepo 桥接模式',
42
+ optionBridgeParentRoot: ' --bridge-parent-root <路径> 桥接模式使用的父 monorepo 根目录',
43
+ optionBridgeWorkspacePackage: ' --bridge-workspace-package <glob> 生成应用消费的父工作区包 glob',
44
+ optionBridgeWorkspacePackageName: ' --bridge-workspace-package-name <glob=包名[,包名]> 桥接工作区 glob 覆盖的包名',
45
+ optionBridgeTestAlias: ' --bridge-test-alias <glob:别名=目标> 桥接工作区包 glob 的测试/源码 alias',
46
+ optionBridgeDependency: ' --bridge-dependency <包名[,包名]> 生成应用显式消费的父包依赖',
47
+ optionBridgeLockfilePolicy: ' --bridge-lockfile-policy <nested|parent> 桥接 lockfile 归属策略(默认:nested)',
48
+ optionBridgeGate: ' --bridge-gate <名称=命令> 桥接包委托给父工作区执行的 gate 命令',
49
+ optionBridgeGateCwd: ' --bridge-gate-cwd <名称=目录> 指定桥接 gate 的工作目录',
50
+ optionBridgeReactSingleton: ' --bridge-react-singleton <包名[,包名]> React 单例包预期(默认:react,react-dom)',
41
51
  optionVertical: ' --vertical[=<名称>] 修改当前已有的 UltraModern 工作区,并接入 MicroVertical',
42
52
  optionVerticalName: ' --vertical-name <名称> 为自动化工作流显式指定 MicroVertical 名称',
43
53
  optionDryRun: ' --dry-run 预览 MicroVertical 修改计划但不写入文件(与 --vertical 一起使用)',