const VERSION_REGEX = /^\d+\.\d+\.\d+$/; export function bumpVersion(current: string, command: "major" | "minor" | "patch" | "set", target?: string): string { validateVersion(current); const [major, minor, patch] = parseVersion(current); switch (command) { case "major": return formatVersion(major + 1, 0, 0); case "minor": return formatVersion(major, minor + 1, 0); case "patch": return formatVersion(major, minor, patch + 1); case "set": { if (!target) { throw new Error("set command requires a target version"); } validateVersion(target); return target; } } } export function formatVersion(major: number, minor: number, patch: number): string { return `${major}.${minor}.${patch}`; } export function parseVersion(version: string): [number, number, number] { const parts = version.split(".").map((p) => parseInt(p, 10)); if (parts.length !== 3 || parts.some(isNaN)) { throw new Error(`Invalid version format: ${version}`); } return [parts[0]!, parts[1]!, parts[2]!]; } export function validateVersion(version: string): void { if (!VERSION_REGEX.test(version)) { throw new Error(`Invalid version format: ${version}. Expected MAJOR.MINOR.PATCH (e.g., 0.1.0)`); } }