playbook/ui-ux-pro-max/scripts/sync-release-version.mjs

78 lines
2.3 KiB
JavaScript
Executable File

#!/usr/bin/env node
import { readFileSync, writeFileSync } from 'node:fs';
import { resolve } from 'node:path';
const version = process.argv[2];
if (!version) {
console.error('Usage: node scripts/sync-release-version.mjs <version>');
process.exit(1);
}
function readJson(path) {
return JSON.parse(readFileSync(resolve(path), 'utf8'));
}
function replaceJsonVersion(path, updater) {
const fullPath = resolve(path);
const original = readFileSync(fullPath, 'utf8');
const data = JSON.parse(original);
updater(data);
let next = original;
const replacements = [];
function setTopLevelVersion(value) {
replacements.push([/(\"version\"\s*:\s*)\"[^\"]+\"/, `$1\"${value}\"`]);
}
function setMetadataVersion(value) {
replacements.push([/(\"metadata\"\s*:\s*\{[\s\S]*?\"version\"\s*:\s*)\"[^\"]+\"/, `$1\"${value}\"`]);
}
function setPluginVersions(value) {
replacements.push([/(\"plugins\"\s*:\s*\[[\s\S]*?\"version\"\s*:\s*)\"[^\"]+\"/, `$1\"${value}\"`]);
}
if (path === '.claude-plugin/marketplace.json') {
setMetadataVersion(data.metadata?.version);
if (data.plugins?.[0]?.version) setPluginVersions(data.plugins[0].version);
} else {
setTopLevelVersion(data.version);
if (data.packages?.['']?.version) {
replacements.push([/(\"packages\"\s*:\s*\{\s*\"\"\s*:\s*\{[\s\S]*?\"version\"\s*:\s*)\"[^\"]+\"/, `$1\"${data.packages[''].version}\"`]);
}
}
for (const [pattern, replacement] of replacements) next = next.replace(pattern, replacement);
writeFileSync(fullPath, next);
}
replaceJsonVersion('skill.json', (data) => {
data.version = version;
});
replaceJsonVersion('.claude-plugin/plugin.json', (data) => {
data.version = version;
});
replaceJsonVersion('.claude-plugin/marketplace.json', (data) => {
if (data.metadata) data.metadata.version = version;
if (Array.isArray(data.plugins)) {
for (const item of data.plugins) item.version = version;
}
});
replaceJsonVersion('cli/package.json', (data) => {
data.version = version;
});
try {
replaceJsonVersion('cli/package-lock.json', (data) => {
data.version = version;
if (data.packages?.['']) data.packages[''].version = version;
});
} catch (err) {
if (err.code !== 'ENOENT') throw err;
}
console.log(`Synced release version ${version} across skill, plugin, marketplace, and CLI manifests.`);