jdx/mise · error

expose requires uv@ or newer, but uv@ is installed

Error message

{} expose requires uv@{} or newer, but uv@{} is installed

What it means

ensure_uv_supports_expose enforces a minimum uv version of 0.8.5 (UV_WITH_EXECUTABLES_FROM_VERSION) for the `expose` option. If the resolved uv version is older than that, install bails with the installed version named in the message.

Solutions

  1. Upgrade uv to >= 0.8.5: `mise use uv@latest` or bump the pinned version
  2. Update mise.lock via `mise lock` after upgrading so the newer uv is replayed
  3. Remove the expose option if you must stay on an older uv

Example fix

// before
[tools]
uv = "0.7.12"
"pipx:ruff" = { version = "latest", expose = ["ruff"] }
// after
[tools]
uv = "latest"
"pipx:ruff" = { version = "latest", expose = ["ruff"] }
Defensive patterns

Strategy: validation

Validate before calling

const { stdout } = await $`uv --version`;
const v = stdout.match(/uv (\d+)\.(\d+)\.(\d+)/).slice(1).map(Number);
if (v[0] < 1 && (v[0] * 1e6 + v[1] * 1e3 + v[2]) < (0 * 1e6 + 8 * 1e3 + 5))
  throw new Error("expose requires uv >= 0.8.5");

Try / catch

try { await $`mise install pipx:ruff` } catch (e) {
  if (/or newer/.test(e.message) && /uv@/.test(e.message)) { await $`mise use uv@latest`; await $`mise install pipx:ruff`; }
  else throw e;
}

Prevention

When it happens

Trigger: Installing a pipx tool with expose options while the uv resolved from the toolset or PATH is semantically older than 0.8.5 (semver_is_older_than returns true).

Common situations: Pinned old uv in mise.toml (e.g. uv = "0.7.0"); stale uv on PATH predating the feature; team lockfile locking an old uv version.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/c0f3fef09a202472. Report an issue: GitHub.

Appendix: source

Thrown at src/backend/pipx.rs:1153

        &self,
        ctx: &InstallContext,
        options: &PipxOptions<'_>,
    ) -> Result<()> {
        if options.expose()?.is_empty() {
            return Ok(());
        }
        let Some(version) =
            crate::backend::semver_version_from_toolsets_or_path(self, &ctx.config, &ctx.ts, "uv")
                .await
        else {
            bail!(
                "{} expose requires uv@{} or newer, but the installed uv version could not be determined",
                self.ba.short,
                UV_WITH_EXECUTABLES_FROM_VERSION
            );
        };
        if semver_is_older_than(&version, UV_WITH_EXECUTABLES_FROM_VERSION).unwrap_or(false) {
            bail!(
                "{} expose requires uv@{} or newer, but uv@{} is installed",
                self.ba.short,
                UV_WITH_EXECUTABLES_FROM_VERSION,
                version
            );
        }
        Ok(())
    }
}

enum PipxRequest {
    /// git+https://github.com/psf/black.git@24.2.0
    /// psf/black@24.2.0
    Git(String),
    /// black@24.2.0
    Pypi(String),
}

View on GitHub (pinned to 533346cc37)