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

  1. 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)
  2. Or pass an explicit version: '1.2.4' to prepareRelease() so the existing string is never parsed
  3. 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

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


AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18). Data as JSON: /api/errors/4d3626b2534251de. Report an issue: GitHub.