jdx/mise · error

resolved pkgx package {name}@{version} does not satisfy {req

Error message

resolved pkgx package {name}@{version} does not satisfy {requirement:?}

What it means

Thrown by `ensure_resolved_requirement` in the pkgx backend: after pkgx resolves a package version for a requirement, mise re-checks the resolved version against the requested requirement with `version_satisfies_requirement` and bails if it does not satisfy it. This is a post-resolution invariant that catches pkgx returning a version outside the user's requested range.

Source

Thrown at src/backend/pkgx.rs:434

        .rev()
        .find(|version| semver_satisfies(version, &range))
        .map(|version| (*version).to_string())
        .ok_or_else(|| eyre::eyre!("no pkgx version for {name} satisfies {requirement}"))
}

async fn latest_version(name: &str, target: &PlatformTarget) -> Result<String> {
    list_pkg_versions_for_target(name, target)
        .await?
        .last()
        .map(|v| v.version.clone())
        .ok_or_else(|| eyre::eyre!("no pkgx versions found for {name}"))
}

fn ensure_resolved_requirement(name: &str, version: &str, requirement: &str) -> Result<()> {
    if version_satisfies_requirement(version, requirement)? {
        Ok(())
    } else {
        bail!("resolved pkgx package {name}@{version} does not satisfy {requirement:?}")
    }
}

fn merge_requirements(name: &str, left: &str, right: &str) -> Result<String> {
    let left = left.trim();
    let right = right.trim();
    if is_any_requirement(left) {
        return Ok(right.to_string());
    }
    if is_any_requirement(right) || left == right {
        return Ok(left.to_string());
    }
    let merged = format!("{left} {right}");
    parse_requirement_range(name, &merged)?;
    Ok(merged)
}

fn version_satisfies_requirement(version: &str, requirement: &str) -> Result<bool> {

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Pin an exact existing version: run `mise ls-remote pkgx:<name>` and use a full version from that list.
  2. Broaden or correct the requirement string (e.g. `pkgx:node@^20` instead of a prefix pkgx can't satisfy).
  3. Re-run with a refreshed package list if upstream changed; clear pkgx/mise caches and retry.
  4. If merging constraints, verify each requirement individually to find which one excludes the resolved version.

Example fix

// before (mise.toml)
[tools]
"pkgx:node" = "21.x-nonexistent"

// after — exact version known to satisfy the requirement
[tools]
"pkgx:node" = "21.7.3"
Defensive patterns

Strategy: validation

Validate before calling

# confirm a version satisfying the requirement exists before pinning
mise ls-remote pkgx:node | grep -E '^21\.' || echo 'requirement unsatisfiable'

Try / catch

try { await $`mise use pkgx:node@^21` } catch (e) { if (String(e).includes('does not satisfy')) { /* pin an exact version from ls-remote */ } else throw e; }

Prevention

When it happens

Trigger: Calling `mise use pkgx:<name>@<requirement>` (via `resolve_closure` -> `ensure_resolved_requirement`) where pkgx's resolver returns `version` that fails the requirement check — e.g. requesting a prefix like `8.1` or a range while pkgx resolves a different/latest version, or requirement syntax mise interprets differently than pkgx does.

Common situations: Requesting a version prefix that doesn't match any published package version; requirement strings containing characters pkgx treats differently (e.g. `latest`, partial tags); the package was updated upstream so a previously matching version was removed; merging multiple requirements produced a range no version satisfies.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/218b6e8ecdf0206e. Report an issue: GitHub.