ruvnet/ruflo · error · Error
Invalid version format: ${currentVersion}
Error message
Invalid version format: ${currentVersion} What it means
bumpVersion() only accepts versions matching ^(\d+)\.(\d+)\.(\d+)(?:-([a-z]+)\.(\d+))?$: plain X.Y.Z, or X.Y.Z followed by a single lowercase-only prerelease word and a number (1.2.3-beta.1). It rejects v-prefixes, two-part versions, uppercase or hyphenated prerelease identifiers, extra prerelease segments, and build metadata.
Source
Thrown at v3/@claude-flow/deployment/src/release-manager.ts:156
} catch (error) {
result.error = error instanceof Error ? error.message : String(error);
return result;
}
}
/**
* Bump version based on type
*/
private bumpVersion(
currentVersion: string,
bumpType: VersionBumpType,
channel: string
): string {
const versionMatch = currentVersion.match(/^(\d+)\.(\d+)\.(\d+)(?:-([a-z]+)\.(\d+))?$/);
if (!versionMatch) {
throw new Error(`Invalid version format: ${currentVersion}`);
}
let [, major, minor, patch, prerelease, prereleaseNum] = versionMatch;
let newMajor = parseInt(major);
let newMinor = parseInt(minor);
let newPatch = parseInt(patch);
let newPrerelease: string | undefined = prerelease;
let newPrereleaseNum = prereleaseNum ? parseInt(prereleaseNum) : 0;
switch (bumpType) {
case 'major':
newMajor++;
newMinor = 0;
newPatch = 0;
newPrerelease = undefined;
break;
case 'minor':View on GitHub (pinned to fa13ee4ad6)
Solutions
- Set pkg.version to a supported form: 1.2.3 or 1.2.3-beta.1 (lowercase letters only in the prerelease word, exactly one dot-number, no build metadata)
- Or pass an explicit version: '1.2.4' to prepareRelease() so the existing string is never parsed
- If you need richer semver, compute the new version yourself with a proper semver library and pass it in
Example fix
// before
// package.json: "version": "0.0.0-use.local"
await manager.prepareRelease({ bumpType: 'patch' }); // throws: Invalid version format
// after
// package.json: "version": "0.1.0"
await manager.prepareRelease({ bumpType: 'patch' }); Defensive patterns
Strategy: validation
Validate before calling
const SUPPORTED_VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([a-z]+)\.(\d+))?$/;
function isBumpableVersion(v: string): boolean {
return SUPPORTED_VERSION.test(v);
}
const pkg = JSON.parse(readFileSync('package.json', 'utf8'));
if (!isBumpableVersion(pkg.version)) {
throw new Error(`version ${pkg.version} must be X.Y.Z or X.Y.Z-word.N`);
} Type guard
function isBumpableVersion(v: unknown): v is string {
return typeof v === 'string' && /^(\d+)\.(\d+)\.(\d+)(?:-([a-z]+)\.(\d+))?$/.test(v);
} Prevention
- Keep package.json versions in X.Y.Z or X.Y.Z-lowercase.N form
- Pass an explicit version to prepareRelease() when the stored version is a placeholder
When it happens
Trigger: prepareRelease() without an explicit version option while package.json version is '0.0.0', 'v1.2.3', '1.2', '1.2.3-RC.1', '1.2.3-alpha-1', '1.2.3-alpha.1.2', or '1.2.3-beta+build.1'.
Common situations: Monorepo placeholder versions like '0.0.0-dev' or '0.0.0-use.local'; versions written by other tooling with v-prefix or build metadata; prerelease channels named with uppercase or hyphens ('RC', 'pre-release').
Related errors
- NOT_CLAIMED
- UNAUTHORIZED
- HANDOFF_PENDING
- Issue ${issueId} is not claimed
- Issue ${issueId} is not claimed by ${this.formatClaimant(cla
AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18).
Data as JSON: /api/errors/4d3626b2534251de.
Report an issue: GitHub.