From eb247b4dac1d356f41588a911df44798f06bf5a8 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Thu, 2 Jul 2026 14:20:38 +0000 Subject: [PATCH 1/2] Read codemod target versions from workspace manifests at build time The committed generated versions.ts went stale after every release: the changesets version PR bumps package.json files without regenerating, so source builds of the codemod wrote outdated versions into migrated projects (and every local build dirtied the tree regenerating the file). Replace the generated file with a plain source module that imports the six workspace package.json files directly; the bundler inlines the version fields at build time. Deletes the generator script, the prebuild hook, and the generated/ directory. --- .changeset/codemod-versions-from-manifests.md | 5 +++ packages/codemod/package.json | 2 -- packages/codemod/scripts/generateVersions.ts | 36 ------------------- packages/codemod/src/bin/batchTest.ts | 2 +- packages/codemod/src/generated/versions.ts | 9 ----- .../codemod/src/utils/packageJsonUpdater.ts | 2 +- packages/codemod/src/versions.ts | 20 +++++++++++ 7 files changed, 27 insertions(+), 49 deletions(-) create mode 100644 .changeset/codemod-versions-from-manifests.md delete mode 100644 packages/codemod/scripts/generateVersions.ts delete mode 100644 packages/codemod/src/generated/versions.ts create mode 100644 packages/codemod/src/versions.ts diff --git a/.changeset/codemod-versions-from-manifests.md b/.changeset/codemod-versions-from-manifests.md new file mode 100644 index 0000000000..b0383703ad --- /dev/null +++ b/.changeset/codemod-versions-from-manifests.md @@ -0,0 +1,5 @@ +--- +'@modelcontextprotocol/codemod': patch +--- + +Read the v2 package versions the codemod writes into migrated `package.json` files directly from the workspace manifests at build time, replacing the committed generated `versions.ts` (which went stale after every release and made source builds write outdated versions). diff --git a/packages/codemod/package.json b/packages/codemod/package.json index 803053fb2c..f3c19675a6 100644 --- a/packages/codemod/package.json +++ b/packages/codemod/package.json @@ -41,8 +41,6 @@ ], "scripts": { "typecheck": "tsgo -p tsconfig.json --noEmit", - "generate:versions": "tsx scripts/generateVersions.ts", - "prebuild": "pnpm run generate:versions", "build": "tsdown", "build:watch": "tsdown --watch", "prepack": "pnpm run build", diff --git a/packages/codemod/scripts/generateVersions.ts b/packages/codemod/scripts/generateVersions.ts deleted file mode 100644 index f4d827d76d..0000000000 --- a/packages/codemod/scripts/generateVersions.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { readFileSync, writeFileSync } from 'node:fs'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const packagesDir = path.resolve(__dirname, '../..'); - -const PACKAGE_DIRS: Record = { - '@modelcontextprotocol/client': 'client', - '@modelcontextprotocol/server': 'server', - '@modelcontextprotocol/node': 'middleware/node', - '@modelcontextprotocol/express': 'middleware/express', - '@modelcontextprotocol/server-legacy': 'server-legacy', - '@modelcontextprotocol/core': 'core' -}; - -const versions: Record = {}; - -for (const [pkg, dir] of Object.entries(PACKAGE_DIRS)) { - const pkgJsonPath = path.join(packagesDir, dir, 'package.json'); - const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf8')); - versions[pkg] = `^${pkgJson.version}`; -} - -const entries = Object.entries(versions); -const lines = entries.map(([pkg, ver], i) => ` '${pkg}': '${ver}'${i < entries.length - 1 ? ',' : ''}`).join('\n'); - -const output = `// AUTO-GENERATED — do not edit. Run \`pnpm run generate:versions\` to regenerate. -export const V2_PACKAGE_VERSIONS: Record = { -${lines} -}; -`; - -const outPath = path.resolve(__dirname, '../src/generated/versions.ts'); -writeFileSync(outPath, output); -console.log(`Wrote ${outPath}`); diff --git a/packages/codemod/src/bin/batchTest.ts b/packages/codemod/src/bin/batchTest.ts index 1a6802bc86..07369645c0 100644 --- a/packages/codemod/src/bin/batchTest.ts +++ b/packages/codemod/src/bin/batchTest.ts @@ -6,7 +6,7 @@ import { tmpdir } from 'node:os'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -import { V2_PACKAGE_VERSIONS } from '../generated/versions'; +import { V2_PACKAGE_VERSIONS } from '../versions'; import { getMigration } from '../migrations/index'; import { run } from '../runner'; import type { Diagnostic, Migration } from '../types'; diff --git a/packages/codemod/src/generated/versions.ts b/packages/codemod/src/generated/versions.ts deleted file mode 100644 index a82d986db8..0000000000 --- a/packages/codemod/src/generated/versions.ts +++ /dev/null @@ -1,9 +0,0 @@ -// AUTO-GENERATED — do not edit. Run `pnpm run generate:versions` to regenerate. -export const V2_PACKAGE_VERSIONS: Record = { - '@modelcontextprotocol/client': '^2.0.0-beta.1', - '@modelcontextprotocol/server': '^2.0.0-beta.1', - '@modelcontextprotocol/node': '^2.0.0-beta.1', - '@modelcontextprotocol/express': '^2.0.0-beta.1', - '@modelcontextprotocol/server-legacy': '^2.0.0-beta.1', - '@modelcontextprotocol/core': '^2.0.0-beta.1' -}; diff --git a/packages/codemod/src/utils/packageJsonUpdater.ts b/packages/codemod/src/utils/packageJsonUpdater.ts index 0a03fc1e52..b32821fc33 100644 --- a/packages/codemod/src/utils/packageJsonUpdater.ts +++ b/packages/codemod/src/utils/packageJsonUpdater.ts @@ -3,7 +3,7 @@ import path from 'node:path'; import fg from 'fast-glob'; -import { V2_PACKAGE_VERSIONS } from '../generated/versions'; +import { V2_PACKAGE_VERSIONS } from '../versions'; import type { PackageJsonChange } from '../types'; import { findPackageJson } from './projectAnalyzer'; diff --git a/packages/codemod/src/versions.ts b/packages/codemod/src/versions.ts new file mode 100644 index 0000000000..babf343e5f --- /dev/null +++ b/packages/codemod/src/versions.ts @@ -0,0 +1,20 @@ +import clientPkg from '../../client/package.json'; +import corePkg from '../../core/package.json'; +import expressPkg from '../../middleware/express/package.json'; +import nodePkg from '../../middleware/node/package.json'; +import serverLegacyPkg from '../../server-legacy/package.json'; +import serverPkg from '../../server/package.json'; + +/** + * Caret ranges for the v2 packages the codemod writes into migrated package.json + * files. Versions come straight from the workspace manifests — the bundler inlines + * them at build time — so a release bump can never leave this map stale. + */ +export const V2_PACKAGE_VERSIONS: Record = { + '@modelcontextprotocol/client': `^${clientPkg.version}`, + '@modelcontextprotocol/server': `^${serverPkg.version}`, + '@modelcontextprotocol/node': `^${nodePkg.version}`, + '@modelcontextprotocol/express': `^${expressPkg.version}`, + '@modelcontextprotocol/server-legacy': `^${serverLegacyPkg.version}`, + '@modelcontextprotocol/core': `^${corePkg.version}` +}; From 372c597592da36705081441db23375d21964f4ca Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Thu, 2 Jul 2026 14:50:11 +0000 Subject: [PATCH 2/2] Sort imports --- packages/codemod/src/bin/batchTest.ts | 2 +- packages/codemod/src/utils/packageJsonUpdater.ts | 2 +- packages/codemod/src/versions.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/codemod/src/bin/batchTest.ts b/packages/codemod/src/bin/batchTest.ts index 07369645c0..3d95fd23c5 100644 --- a/packages/codemod/src/bin/batchTest.ts +++ b/packages/codemod/src/bin/batchTest.ts @@ -6,10 +6,10 @@ import { tmpdir } from 'node:os'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -import { V2_PACKAGE_VERSIONS } from '../versions'; import { getMigration } from '../migrations/index'; import { run } from '../runner'; import type { Diagnostic, Migration } from '../types'; +import { V2_PACKAGE_VERSIONS } from '../versions'; // --------------------------------------------------------------------------- // Types diff --git a/packages/codemod/src/utils/packageJsonUpdater.ts b/packages/codemod/src/utils/packageJsonUpdater.ts index b32821fc33..c543db452d 100644 --- a/packages/codemod/src/utils/packageJsonUpdater.ts +++ b/packages/codemod/src/utils/packageJsonUpdater.ts @@ -3,8 +3,8 @@ import path from 'node:path'; import fg from 'fast-glob'; -import { V2_PACKAGE_VERSIONS } from '../versions'; import type { PackageJsonChange } from '../types'; +import { V2_PACKAGE_VERSIONS } from '../versions'; import { findPackageJson } from './projectAnalyzer'; const V1_PACKAGE = '@modelcontextprotocol/sdk'; diff --git a/packages/codemod/src/versions.ts b/packages/codemod/src/versions.ts index babf343e5f..64fae3a213 100644 --- a/packages/codemod/src/versions.ts +++ b/packages/codemod/src/versions.ts @@ -2,8 +2,8 @@ import clientPkg from '../../client/package.json'; import corePkg from '../../core/package.json'; import expressPkg from '../../middleware/express/package.json'; import nodePkg from '../../middleware/node/package.json'; -import serverLegacyPkg from '../../server-legacy/package.json'; import serverPkg from '../../server/package.json'; +import serverLegacyPkg from '../../server-legacy/package.json'; /** * Caret ranges for the v2 packages the codemod writes into migrated package.json