@bleedingdev/modern-js-create 3.5.0-ultramodern.0 → 3.5.0-ultramodern.1

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 (28) hide show
  1. package/README.md +24 -0
  2. package/dist/cjs/ultramodern-tooling/commands.cjs +246 -0
  3. package/dist/cjs/ultramodern-workspace/contracts.cjs +1 -0
  4. package/dist/cjs/ultramodern-workspace/module-federation.cjs +6 -0
  5. package/dist/cjs/ultramodern-workspace/package-json.cjs +1 -0
  6. package/dist/cjs/ultramodern-workspace/versions.cjs +10 -0
  7. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +1 -0
  8. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +2 -0
  9. package/dist/esm/ultramodern-tooling/commands.js +246 -0
  10. package/dist/esm/ultramodern-workspace/contracts.js +1 -0
  11. package/dist/esm/ultramodern-workspace/module-federation.js +6 -0
  12. package/dist/esm/ultramodern-workspace/package-json.js +1 -0
  13. package/dist/esm/ultramodern-workspace/versions.js +5 -1
  14. package/dist/esm/ultramodern-workspace/workspace-scripts.js +1 -0
  15. package/dist/esm/ultramodern-workspace/write-workspace.js +3 -1
  16. package/dist/esm-node/ultramodern-tooling/commands.js +246 -0
  17. package/dist/esm-node/ultramodern-workspace/contracts.js +1 -0
  18. package/dist/esm-node/ultramodern-workspace/module-federation.js +6 -0
  19. package/dist/esm-node/ultramodern-workspace/package-json.js +1 -0
  20. package/dist/esm-node/ultramodern-workspace/versions.js +5 -1
  21. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +1 -0
  22. package/dist/esm-node/ultramodern-workspace/write-workspace.js +3 -1
  23. package/dist/types/ultramodern-workspace/versions.d.ts +4 -0
  24. package/package.json +3 -3
  25. package/template-workspace/README.md.handlebars +40 -1
  26. package/template-workspace/pnpm-workspace.yaml.handlebars +3 -0
  27. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +30 -8
  28. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +2 -0
package/README.md CHANGED
@@ -189,6 +189,30 @@ mise exec -- pnpm check
189
189
  mise exec -- pnpm build
190
190
  ```
191
191
 
192
+ For strict Effect API migrations, update generated package metadata and Modern
193
+ package aliases through the framework command before hand-editing app code:
194
+
195
+ ```bash
196
+ pnpm dlx @bleedingdev/modern-js-create@3.5.0-ultramodern.1 ultramodern \
197
+ migrate-strict-effect --version 3.5.0-ultramodern.1
198
+ pnpm api:check
199
+ pnpm contract:check
200
+ pnpm check
201
+ pnpm build
202
+ ```
203
+
204
+ The command updates `.modernjs/ultramodern.json`, root `modernjs.packageSource`,
205
+ generated Modern package aliases, old direct topology metadata, and the pnpm
206
+ lockfile. It does not invent compatibility shims or move business code behind
207
+ your back. If `pnpm api:check` still fails, migrate the source to
208
+ `shared/api.ts`, `api/index.ts`, and `src/api/*-client.ts` and delete
209
+ `api/effect`, `api/lambda`, `shared/effect`, and `src/effect` paths.
210
+
211
+ Generated strict Effect workspaces pin the compatible Effect cohort through
212
+ `pnpm-workspace.yaml` overrides: `effect@4.0.0-beta.89` and
213
+ `@effect/vitest@4.0.0-beta.89`. Do not override those in app packages; update
214
+ the framework cohort when the runtime moves.
215
+
192
216
  Use `--ultramodern-package-source=install` for published cohort proof and pin a
193
217
  specific release with `--ultramodern-package-version` when CI must prove an
194
218
  exact framework version. Keep `--workspace` only for local monorepo testing
@@ -51,6 +51,7 @@ const external_node_path_namespaceObject = require("node:path");
51
51
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
52
52
  const external_node_url_namespaceObject = require("node:url");
53
53
  const external_create_package_root_cjs_namespaceObject = require("../create-package-root.cjs");
54
+ const external_ultramodern_package_source_cjs_namespaceObject = require("../ultramodern-package-source.cjs");
54
55
  const mf_validation_cjs_namespaceObject = require("../ultramodern-workspace/mf-validation.cjs");
55
56
  const workspace_scripts_cjs_namespaceObject = require("../ultramodern-workspace/workspace-scripts.cjs");
56
57
  const external_config_cjs_namespaceObject = require("./config.cjs");
@@ -64,6 +65,7 @@ Commands:
64
65
  validate
65
66
  typecheck
66
67
  mf-types
68
+ migrate-strict-effect
67
69
  public-surface
68
70
  cloudflare-proof
69
71
  performance-readiness
@@ -129,6 +131,248 @@ Checks real Module Federation config files and DTS archives for exposed apps.
129
131
  });
130
132
  return 0;
131
133
  }
134
+ const modernPackageNames = new Set([
135
+ ...external_ultramodern_package_source_cjs_namespaceObject.ULTRAMODERN_SINGLE_APP_MODERN_PACKAGES,
136
+ ...external_ultramodern_package_source_cjs_namespaceObject.ULTRAMODERN_WORKSPACE_MODERN_PACKAGES
137
+ ]);
138
+ function readJsonFile(filePath) {
139
+ return JSON.parse(external_node_fs_default().readFileSync(filePath, 'utf-8'));
140
+ }
141
+ function writeJsonFile(filePath, value) {
142
+ external_node_fs_default().writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
143
+ }
144
+ function readOption(args, name) {
145
+ const prefix = `${name}=`;
146
+ const inline = args.find((arg)=>arg.startsWith(prefix));
147
+ if (inline) {
148
+ const value = inline.slice(prefix.length);
149
+ if (!value) throw new Error(`${name} needs a value.`);
150
+ return value;
151
+ }
152
+ const index = args.indexOf(name);
153
+ if (-1 === index) return;
154
+ const value = args[index + 1];
155
+ if (!value || value.startsWith('--')) throw new Error(`${name} needs a value.`);
156
+ return value;
157
+ }
158
+ function hasFlag(args, name) {
159
+ return args.includes(name);
160
+ }
161
+ function listWorkspacePackageFiles(workspaceRoot) {
162
+ const packageFiles = [
163
+ 'package.json'
164
+ ];
165
+ for (const directory of [
166
+ 'apps',
167
+ 'verticals',
168
+ 'packages'
169
+ ]){
170
+ const absoluteDirectory = external_node_path_default().join(workspaceRoot, directory);
171
+ if (external_node_fs_default().existsSync(absoluteDirectory)) for (const entry of external_node_fs_default().readdirSync(absoluteDirectory, {
172
+ withFileTypes: true
173
+ })){
174
+ if (!entry.isDirectory()) continue;
175
+ const packageFile = external_node_path_default().join(directory, entry.name, 'package.json');
176
+ if (external_node_fs_default().existsSync(external_node_path_default().join(workspaceRoot, packageFile))) packageFiles.push(packageFile);
177
+ }
178
+ }
179
+ return packageFiles;
180
+ }
181
+ function updateModernDependencies(packageJson, packageSource) {
182
+ let changed = false;
183
+ for (const section of [
184
+ 'dependencies',
185
+ 'devDependencies',
186
+ 'peerDependencies',
187
+ 'optionalDependencies'
188
+ ]){
189
+ const dependencies = packageJson[section];
190
+ if (!(!dependencies || 'object' != typeof dependencies || Array.isArray(dependencies))) for (const packageName of Object.keys(dependencies)){
191
+ if (!modernPackageNames.has(packageName)) continue;
192
+ const nextSpecifier = (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)(packageName, packageSource);
193
+ if (dependencies[packageName] !== nextSpecifier) {
194
+ dependencies[packageName] = nextSpecifier;
195
+ changed = true;
196
+ }
197
+ }
198
+ }
199
+ return changed;
200
+ }
201
+ function normalizeStrictEffectApiMetadata(value) {
202
+ const api = value.api;
203
+ if (!api || 'object' != typeof api || Array.isArray(api)) return false;
204
+ let changed = false;
205
+ const oldEffect = api.effect;
206
+ if (oldEffect && 'object' == typeof oldEffect && !Array.isArray(oldEffect)) {
207
+ if (void 0 === api.stem && 'string' == typeof oldEffect.stem) {
208
+ api.stem = oldEffect.stem;
209
+ changed = true;
210
+ }
211
+ if (void 0 === api.prefix && 'string' == typeof oldEffect.prefix) {
212
+ api.prefix = oldEffect.prefix;
213
+ changed = true;
214
+ }
215
+ if (void 0 === api.consumedBy && Array.isArray(oldEffect.consumedBy)) {
216
+ api.consumedBy = oldEffect.consumedBy;
217
+ changed = true;
218
+ }
219
+ delete api.effect;
220
+ changed = true;
221
+ }
222
+ if (void 0 !== api.runtime && 'effect' !== api.runtime) {
223
+ api.runtime = 'effect';
224
+ changed = true;
225
+ }
226
+ if (api.bff && 'object' == typeof api.bff && !Array.isArray(api.bff)) {
227
+ if (true !== api.bff.strictEffectApproach) {
228
+ api.bff.strictEffectApproach = true;
229
+ changed = true;
230
+ }
231
+ }
232
+ if ('string' == typeof value.path) {
233
+ const directServerEntry = `${value.path}/api/index.ts`;
234
+ if ('string' == typeof api.serverEntry && /\/api\/effect\/index\.[cm]?[jt]sx?$/u.test(api.serverEntry)) {
235
+ api.serverEntry = directServerEntry;
236
+ changed = true;
237
+ }
238
+ if (api.contract && 'object' == typeof api.contract && !Array.isArray(api.contract)) {
239
+ if ('./shared/effect/api' === api.contract.export) {
240
+ api.contract.export = './api';
241
+ changed = true;
242
+ }
243
+ if ('string' == typeof api.contract.path && /\/shared\/effect\/api\.[cm]?[jt]sx?$/u.test(api.contract.path)) {
244
+ api.contract.path = `${value.path}/shared/api.ts`;
245
+ changed = true;
246
+ }
247
+ }
248
+ if (api.client && 'object' == typeof api.client && !Array.isArray(api.client)) {
249
+ if ('./effect/client' === api.client.export) {
250
+ api.client.export = './api/client';
251
+ changed = true;
252
+ }
253
+ if ('string' == typeof api.client.path && /\/src\/effect\/[^/]+-client\.[cm]?ts$/u.test(api.client.path)) {
254
+ const basename = external_node_path_default().basename(api.client.path);
255
+ api.client.path = `${value.path}/src/api/${basename}`;
256
+ changed = true;
257
+ }
258
+ }
259
+ if (void 0 === api.serverEntry && 'effect' === api.runtime) {
260
+ api.serverEntry = directServerEntry;
261
+ changed = true;
262
+ }
263
+ }
264
+ return changed;
265
+ }
266
+ function updateUltramodernConfig(workspaceRoot, packageSource) {
267
+ const configPath = external_node_path_default().join(workspaceRoot, '.modernjs/ultramodern.json');
268
+ const config = readJsonFile(configPath);
269
+ config.packageSource = {
270
+ strategy: packageSource.strategy,
271
+ modernPackageVersion: packageSource.modernPackageVersion,
272
+ ...packageSource.registry ? {
273
+ registry: packageSource.registry
274
+ } : {},
275
+ ...packageSource.aliasScope ? {
276
+ aliasScope: packageSource.aliasScope
277
+ } : {},
278
+ ...packageSource.aliasPackageNamePrefix ? {
279
+ aliasPackageNamePrefix: packageSource.aliasPackageNamePrefix
280
+ } : {}
281
+ };
282
+ for (const app of config.topology?.apps ?? [])if (app && 'object' == typeof app && !Array.isArray(app)) normalizeStrictEffectApiMetadata(app);
283
+ writeJsonFile(configPath, config);
284
+ }
285
+ function updateReferenceTopology(workspaceRoot) {
286
+ const topologyPath = external_node_path_default().join(workspaceRoot, 'topology/reference-topology.json');
287
+ if (!external_node_fs_default().existsSync(topologyPath)) return false;
288
+ const topology = readJsonFile(topologyPath);
289
+ let changed = false;
290
+ for (const vertical of topology.verticals ?? [])if (vertical && 'object' == typeof vertical && !Array.isArray(vertical)) changed = normalizeStrictEffectApiMetadata(vertical) || changed;
291
+ if (changed) writeJsonFile(topologyPath, topology);
292
+ return changed;
293
+ }
294
+ function createMigrationPackageSource(args, current) {
295
+ const strategy = hasFlag(args, '--workspace') ? 'workspace' : 'install';
296
+ const registry = readOption(args, '--registry') ?? readOption(args, '--ultramodern-package-registry');
297
+ const explicitAliasScope = readOption(args, '--alias-scope') ?? readOption(args, '--ultramodern-package-scope');
298
+ const aliasScope = explicitAliasScope ?? ('install' === strategy && void 0 === registry ? current.packageSource?.aliasScope ?? external_ultramodern_package_source_cjs_namespaceObject.BLEEDINGDEV_PACKAGE_SCOPE : current.packageSource?.aliasScope);
299
+ const aliasPackageNamePrefix = readOption(args, '--alias-package-name-prefix') ?? readOption(args, '--ultramodern-package-name-prefix') ?? current.packageSource?.aliasPackageNamePrefix ?? (aliasScope ? external_ultramodern_package_source_cjs_namespaceObject.BLEEDINGDEV_PACKAGE_NAME_PREFIX : void 0);
300
+ if ('workspace' === strategy) return {
301
+ strategy,
302
+ modernPackageVersion: external_ultramodern_package_source_cjs_namespaceObject.WORKSPACE_PACKAGE_VERSION,
303
+ ...registry ? {
304
+ registry
305
+ } : {},
306
+ ...aliasScope ? {
307
+ aliasScope
308
+ } : {},
309
+ ...aliasPackageNamePrefix ? {
310
+ aliasPackageNamePrefix
311
+ } : {}
312
+ };
313
+ const version = readOption(args, '--version') ?? readOption(args, '--ultramodern-package-version') ?? current.packageSource?.modernPackageVersion;
314
+ if (!version || version === external_ultramodern_package_source_cjs_namespaceObject.WORKSPACE_PACKAGE_VERSION) throw new Error('migrate-strict-effect needs --version <published-ultramodern-version> for install package source.');
315
+ return {
316
+ strategy,
317
+ modernPackageVersion: version,
318
+ ...registry ? {
319
+ registry
320
+ } : {},
321
+ ...aliasScope ? {
322
+ aliasScope
323
+ } : {},
324
+ ...aliasPackageNamePrefix ? {
325
+ aliasPackageNamePrefix
326
+ } : {}
327
+ };
328
+ }
329
+ function runPnpmLockfileRefresh(context) {
330
+ const result = (0, external_node_child_process_namespaceObject.spawnSync)('pnpm', [
331
+ 'install',
332
+ '--lockfile-only',
333
+ "--ignore-scripts"
334
+ ], {
335
+ cwd: context.workspaceRoot,
336
+ stdio: 'inherit'
337
+ });
338
+ if (result.error) throw result.error;
339
+ return result.status ?? 1;
340
+ }
341
+ function runMigrateStrictEffect(args, context) {
342
+ if (args.includes('--help') || args.includes('-h')) {
343
+ process.stdout.write(`Usage:
344
+ modern-js-create ultramodern migrate-strict-effect --version <version> [--skip-install]
345
+
346
+ Updates generated UltraModern package-source metadata, Modern package aliases,
347
+ direct Effect API topology metadata, and the pnpm lockfile for strict Effect
348
+ workspaces. Source code still has to pass pnpm api:check and pnpm contract:check.
349
+ `);
350
+ return 0;
351
+ }
352
+ const current = (0, external_config_cjs_namespaceObject.readUltramodernConfig)(context.workspaceRoot);
353
+ const packageSource = createMigrationPackageSource(args, current);
354
+ updateUltramodernConfig(context.workspaceRoot, packageSource);
355
+ updateReferenceTopology(context.workspaceRoot);
356
+ for (const relativePackageFile of listWorkspacePackageFiles(context.workspaceRoot)){
357
+ const packageFile = external_node_path_default().join(context.workspaceRoot, relativePackageFile);
358
+ const packageJson = readJsonFile(packageFile);
359
+ if ('package.json' === relativePackageFile) {
360
+ packageJson.modernjs ??= {};
361
+ packageJson.modernjs.packageSource = {
362
+ strategy: packageSource.strategy,
363
+ config: './.modernjs/ultramodern.json'
364
+ };
365
+ }
366
+ if (updateModernDependencies(packageJson, packageSource)) writeJsonFile(packageFile, packageJson);
367
+ else if ('package.json' === relativePackageFile) writeJsonFile(packageFile, packageJson);
368
+ }
369
+ if (!hasFlag(args, '--skip-install')) {
370
+ const status = runPnpmLockfileRefresh(context);
371
+ if (0 !== status) return status;
372
+ }
373
+ process.stdout.write(`UltraModern strict Effect metadata migrated to ${packageSource.modernPackageVersion}. Run pnpm api:check && pnpm contract:check next.\n`);
374
+ return 0;
375
+ }
132
376
  function runSkills(args, context) {
133
377
  const [subcommand, ...rest] = args;
134
378
  if ('install' === subcommand) return spawnNodeScript("template-workspace/scripts/bootstrap-agent-skills.mjs", rest, context);
@@ -159,6 +403,8 @@ async function runUltramodernToolingCli(args, workspaceRoot = process.env.ULTRAM
159
403
  });
160
404
  case 'mf-types':
161
405
  return runMfTypes(rest, context);
406
+ case 'migrate-strict-effect':
407
+ return runMigrateStrictEffect(rest, context);
162
408
  case 'public-surface':
163
409
  return spawnNodeScript("templates/workspace-scripts/generate-public-surface-assets.mjs", rest, context);
164
410
  case 'cloudflare-proof':
@@ -289,6 +289,7 @@ function createUltramodernConfig(scope, modernVersion, packageSource, apps = [
289
289
  publicSurface: "scripts/generate-public-surface-assets.mts",
290
290
  cloudflareProof: "scripts/proof-cloudflare-version.mts",
291
291
  performanceReadiness: "scripts/ultramodern-performance-readiness.mts",
292
+ migrateStrictEffect: "scripts/migrate-strict-effect.mts",
292
293
  apiBoundaries: "scripts/check-ultramodern-api-boundaries.mts",
293
294
  skills: "scripts/bootstrap-agent-skills.mts"
294
295
  }
@@ -144,6 +144,8 @@ ${defaultAssetPrefixSource}
144
144
  // load remoteEntry.js and exposed chunks from the remote origin, not the host.
145
145
  const assetPrefix =
146
146
  configuredModernAssetPrefix || configuredUltramodernAssetPrefix || defaultAssetPrefix;
147
+ const buildCacheTarget = cloudflareDeployEnabled ? 'cloudflare' : 'web';
148
+ const buildCacheDirectory = \`node_modules/.cache/rspack-\${appId}-\${buildCacheTarget}\`;
147
149
 
148
150
  if (
149
151
  cloudflareDeployEnabled &&
@@ -190,6 +192,10 @@ ${bffConfig} ...(cloudflareDeployEnabled
190
192
  splitRouteChunks: true,
191
193
  },
192
194
  performance: {
195
+ buildCache: {
196
+ cacheDigest: [appId, buildCacheTarget],
197
+ cacheDirectory: buildCacheDirectory,
198
+ },
193
199
  rsdoctor: {
194
200
  disableClientServer: true,
195
201
  enabled: process.env['ULTRAMODERN_RSDOCTOR'] === 'true',
@@ -224,6 +224,7 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge) {
224
224
  'agents:refs:check': "node ./scripts/setup-agent-reference-repos.mts --check",
225
225
  'mf:types': "node ./scripts/assert-mf-types.mts",
226
226
  'performance:readiness': "node ./scripts/ultramodern-performance-readiness.mts",
227
+ 'migrate:strict-effect': "node ./scripts/migrate-strict-effect.mts",
227
228
  'contract:check': "node ./scripts/validate-ultramodern-workspace.mts",
228
229
  'api:check': "node ./scripts/check-ultramodern-api-boundaries.mts",
229
230
  'i18n:boundaries': "node ./scripts/check-ultramodern-i18n-boundaries.mts",
@@ -37,6 +37,8 @@ const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
37
37
  const TAILWIND_VERSION = '4.3.1';
38
38
  const TAILWIND_POSTCSS_VERSION = '4.3.1';
39
39
  const POSTCSS_VERSION = '8.5.15';
40
+ const EFFECT_VERSION = '4.0.0-beta.89';
41
+ const EFFECT_VITEST_VERSION = '4.0.0-beta.89';
40
42
  const EFFECT_TSGO_VERSION = '0.14.6';
41
43
  const TYPESCRIPT_STABLE_VERSION = '6.0.3';
42
44
  const TYPESCRIPT_NATIVE_PREVIEW_VERSION = '7.0.0-dev.20260624.1';
@@ -60,12 +62,16 @@ const ultramodernWorkspaceVersions = {
60
62
  tanstackRouter: TANSTACK_ROUTER_VERSION,
61
63
  tanstackRouterCore: TANSTACK_ROUTER_CORE_VERSION,
62
64
  moduleFederation: MODULE_FEDERATION_VERSION,
65
+ effect: EFFECT_VERSION,
66
+ effectVitest: EFFECT_VITEST_VERSION,
63
67
  tailwind: TAILWIND_VERSION,
64
68
  tailwindPostcss: TAILWIND_POSTCSS_VERSION
65
69
  };
66
70
  __webpack_require__.d(__webpack_exports__, {}, {
67
71
  CLOUDFLARE_COMPATIBILITY_DATE: CLOUDFLARE_COMPATIBILITY_DATE,
68
72
  EFFECT_TSGO_VERSION: EFFECT_TSGO_VERSION,
73
+ EFFECT_VERSION: EFFECT_VERSION,
74
+ EFFECT_VITEST_VERSION: EFFECT_VITEST_VERSION,
69
75
  I18NEXT_VERSION: I18NEXT_VERSION,
70
76
  LEFTHOOK_VERSION: LEFTHOOK_VERSION,
71
77
  MODULE_FEDERATION_AGENT_SKILLS_COMMIT: MODULE_FEDERATION_AGENT_SKILLS_COMMIT,
@@ -97,6 +103,8 @@ __webpack_require__.d(__webpack_exports__, {}, {
97
103
  });
98
104
  exports.CLOUDFLARE_COMPATIBILITY_DATE = __webpack_exports__.CLOUDFLARE_COMPATIBILITY_DATE;
99
105
  exports.EFFECT_TSGO_VERSION = __webpack_exports__.EFFECT_TSGO_VERSION;
106
+ exports.EFFECT_VERSION = __webpack_exports__.EFFECT_VERSION;
107
+ exports.EFFECT_VITEST_VERSION = __webpack_exports__.EFFECT_VITEST_VERSION;
100
108
  exports.I18NEXT_VERSION = __webpack_exports__.I18NEXT_VERSION;
101
109
  exports.LEFTHOOK_VERSION = __webpack_exports__.LEFTHOOK_VERSION;
102
110
  exports.MODULE_FEDERATION_AGENT_SKILLS_COMMIT = __webpack_exports__.MODULE_FEDERATION_AGENT_SKILLS_COMMIT;
@@ -128,6 +136,8 @@ exports.ultramodernWorkspaceVersions = __webpack_exports__.ultramodernWorkspaceV
128
136
  for(var __rspack_i in __webpack_exports__)if (-1 === [
129
137
  "CLOUDFLARE_COMPATIBILITY_DATE",
130
138
  "EFFECT_TSGO_VERSION",
139
+ "EFFECT_VERSION",
140
+ "EFFECT_VITEST_VERSION",
131
141
  "I18NEXT_VERSION",
132
142
  "LEFTHOOK_VERSION",
133
143
  "MODULE_FEDERATION_AGENT_SKILLS_COMMIT",
@@ -209,6 +209,7 @@ function writeGeneratedWorkspaceScripts(targetDir, _scope, _enableTailwind, _rem
209
209
  writeWorkspaceOwnedMtsScript(targetDir, 'proof-cloudflare-version', createToolWrapperScript('cloudflare-proof'));
210
210
  (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-performance-readiness.config.mjs", createPerformanceReadinessConfigScript());
211
211
  writeWorkspaceOwnedMtsScript(targetDir, 'ultramodern-performance-readiness', createToolWrapperScript('performance-readiness'));
212
+ writeWorkspaceOwnedMtsScript(targetDir, 'migrate-strict-effect', createToolWrapperScript('migrate-strict-effect'));
212
213
  writeWorkspaceOwnedMtsScript(targetDir, 'ultramodern-typecheck', createToolWrapperScript('typecheck'));
213
214
  writeWorkspaceOwnedMtsScript(targetDir, 'bootstrap-agent-skills', createSkillsToolWrapperScript());
214
215
  migrateCopiedWorkspaceScriptToMts(targetDir, 'setup-agent-reference-repos');
@@ -175,6 +175,8 @@ function generateUltramodernWorkspace(options) {
175
175
  nodeVersion: external_versions_cjs_namespaceObject.NODE_VERSION,
176
176
  pnpmVersion: external_versions_cjs_namespaceObject.PNPM_VERSION,
177
177
  nodeFetchVersion: external_versions_cjs_namespaceObject.NODE_FETCH_VERSION,
178
+ effectVersion: external_versions_cjs_namespaceObject.EFFECT_VERSION,
179
+ effectVitestVersion: external_versions_cjs_namespaceObject.EFFECT_VITEST_VERSION,
178
180
  tanstackRouterCoreVersion: external_versions_cjs_namespaceObject.TANSTACK_ROUTER_CORE_VERSION,
179
181
  tanstackRouterVersion: external_versions_cjs_namespaceObject.TANSTACK_ROUTER_VERSION,
180
182
  typescriptVersion: external_versions_cjs_namespaceObject.TYPESCRIPT_VERSION,