jdx/mise · error

expose requires uv@ or newer, but the installed uv version…

Error message

{} expose requires uv@{} or newer, but the installed uv version could not be determined

What it means

ensure_uv_supports_expose verifies that the resolved uv version supports the `expose` feature (introduced in uv 0.8.5, per UV_WITH_EXECUTABLES_FROM_VERSION). When it cannot determine the installed uv version at all — semver_version_from_toolsets_or_path returns None — the check bails rather than risking an unsupported uv running the expose logic.

Solutions

  1. Ensure a real uv is installed via mise: `mise use uv@latest`
  2. Run `uv --version` manually to confirm it prints a parseable version
  3. Remove the expose option if you don't need executables exposure features

Example fix

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

Strategy: validation

Validate before calling

const v = (await $`uv --version`.nothrow()).stdout.trim();
if (!/^uv \d+\.\d+\.\d+/.test(v)) throw new Error("uv version unresolvable; reinstall uv via mise");

Try / catch

try { await $`mise install pipx:ruff` } catch (e) {
  if (/could not be determined/.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 where uv is spawnable but its version cannot be resolved from the toolset or PATH (e.g. uv binary exists but `uv --version` output can't be parsed, or resolution machinery fails).

Common situations: Custom uv builds or forks with non-standard version output; uv shim/symlink returning unexpected output; mise version-detection failing for a PATH-installed uv.

Related errors


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

Appendix: source

Thrown at src/backend/pipx.rs:1146

                "minimum_release_age is set for {} but uv@{} is older than the documented minimum uv@{} required for --exclude-newer. Older versions may fail while processing the forwarded argument. See https://mise.jdx.dev/dev-tools/backends/pypi.html",
                self.ba.short, version, UV_EXCLUDE_NEWER_VERSION,
            );
        }
    }

    async fn ensure_uv_supports_expose(
        &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 {

View on GitHub (pinned to 533346cc37)