#!/usr/bin/env node import fs from "fs"; import path from "path"; import { execSync } from "child_process"; import { fileURLToPath } from "url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); /** * Updates version across all package.json files in the monorepo * Usage: node scripts/update-version.js * Example: node scripts/update-version.js 0.14.2 */ const newVersion = process.argv[2]; if (!newVersion) { console.error("āŒ Please provide a version number"); console.error("Usage: node scripts/update-version.js "); console.error("Example: node scripts/update-version.js 0.14.2"); process.exit(1); } // Validate version format const versionRegex = /^\d+\.\d+\.\d+(-[\w.]+)?$/; if (!versionRegex.test(newVersion)) { console.error( "āŒ Invalid version format. Please use semantic versioning (e.g., 1.2.3 or 1.2.3-beta.1)", ); process.exit(1); } console.log(`šŸ”„ Updating all packages to version ${newVersion}...`); // List of package.json files to update const packagePaths = [ "package.json", "client/package.json", "server/package.json", "cli/package.json", ]; const updatedFiles = []; // Update version in each package.json packagePaths.forEach((packagePath) => { const fullPath = path.join(__dirname, "..", packagePath); if (!fs.existsSync(fullPath)) { console.warn(`āš ļø Skipping ${packagePath} - file not found`); return; } try { const packageJson = JSON.parse(fs.readFileSync(fullPath, "utf8")); const oldVersion = packageJson.version; packageJson.version = newVersion; // Update workspace dependencies in root package.json if (packagePath === "package.json" && packageJson.dependencies) { Object.keys(packageJson.dependencies).forEach((dep) => { if (dep.startsWith("@modelcontextprotocol/inspector-")) { packageJson.dependencies[dep] = `^${newVersion}`; } }); } fs.writeFileSync(fullPath, JSON.stringify(packageJson, null, 2) + "\n"); updatedFiles.push(packagePath); console.log( `āœ… Updated ${packagePath} from ${oldVersion} to ${newVersion}`, ); } catch (error) { console.error(`āŒ Failed to update ${packagePath}:`, error.message); process.exit(1); } }); console.log("\nšŸ“ Summary:"); console.log(`Updated ${updatedFiles.length} files to version ${newVersion}`); // Update package-lock.json console.log("\nšŸ”’ Updating package-lock.json..."); try { execSync("npm install", { stdio: "inherit" }); console.log("āœ… package-lock.json updated successfully"); } catch (error) { console.error("āŒ Failed to update package-lock.json:", error.message); console.error('Please run "npm install" manually'); process.exit(1); } console.log("\n✨ Version update complete!"); console.log("\nNext steps:"); console.log("1. Review the changes: git diff"); console.log( '2. Commit the changes: git add -A && git commit -m "chore: bump version to ' + newVersion + '"', ); console.log("3. Create a git tag: git tag v" + newVersion); console.log("4. Push changes and tag: git push && git push --tags");