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..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 '../generated/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/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..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 '../generated/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 new file mode 100644 index 0000000000..64fae3a213 --- /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 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 + * 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}` +};