inspector/scripts/update-version.js
Jerome b70cf563a8
feat: add version management scripts and CI check
- Added update-version.js script to automate version bumps across all packages
- Added check-version-consistency.js script to verify version consistency
- Integrated version check into CI workflow
- Scripts check package.json versions AND package-lock.json sync
- Added npm scripts: `npm run update-version` and `npm run check-version`
- Added documentation in scripts/README.md

This ensures version consistency across the monorepo and prevents
accidental version mismatches or outdated lock files.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-14 19:52:36 +01:00

96 lines
No EOL
3.1 KiB
JavaScript
Executable file

#!/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 <new-version>
* 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 <new-version>');
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');