jdx/mise · error

{name} is not available: {}

Error message

{name} is not available: {}

What it means

Before acting on a manager's packages, mise checks whether the manager binary is actually usable (unavailable_reason_async: not installed, not on PATH, wrong OS). Unavailable managers are skipped with a debug log during bulk runs, but when the request is explicit (--manager flag or manager:package specs, per unavailable_manager_is_error), failing silently would be a lie, so mise errors with the concrete reason (e.g. command not found).

Source

Thrown at src/cli/system/driver.rs:104

    for mp in mgrs {
        if let Some(only) = &d.manager
            && mp.manager.name() != only
        {
            continue;
        }
        let name = mp.manager.name();
        if mp.disabled {
            if d.manager.is_some() {
                bail!("manager '{name}' is excluded by the system_packages.managers setting");
            }
            debug!("{name}: skipping, excluded by system_packages.managers");
            continue;
        }
        if let Some(reason) = mp.manager.unavailable_reason_async().await {
            if unavailable_manager_is_error(d) {
                // explicitly requested (via --manager or manager:package
                // specs) — failing silently would be a lie
                bail!("{name} is not available: {}", reason);
            }
            debug!("{name}: skipping, {reason}");
            continue;
        }
        let statuses = mp.manager.installed(&mp.requests).await?;
        if let Some(reason) = unavailable_package_reason(d, &statuses) {
            bail!("{reason}");
        }
        let mut targets: Vec<_> = statuses
            .iter()
            .filter(|s| match action {
                Action::Install => {
                    !matches!(s.state, PackageState::Installed { .. }) && !s.state.is_unavailable()
                }
                // upgrade acts on whatever is present (the manager no-ops
                // already-current packages); missing packages are skipped
                // below with a pointer at `install`
                Action::Upgrade => {

View on GitHub (pinned to 9dcfcaa0dc)

Solutions

  1. Install the manager (e.g. install Homebrew, or ensure cargo is on PATH), then retry
  2. If on the wrong OS, pick a manager available there (apt/dnf on Linux, brew on macOS) and configure [bootstrap.packages] accordingly
  3. Make bootstrap config OS-conditional (mise supports per-OS config merging) so unavailable managers are never explicitly requested

Example fix

# before
mise system install --manager brew   # fails on Linux CI: brew not available

# after
# only request managers that exist on the host:
mise system install --manager apt   # (Linux) or gate brew usage to macOS configs
Defensive patterns

Strategy: validation

Validate before calling

# bash: prove the manager binary is invocable before asking mise for it
command -v "$MGR" >/dev/null 2>&1 || { echo "$MGR not installed/on PATH" >&2; exit 2; }
mise system install --manager "$MGR"

Prevention

When it happens

Trigger: Running `mise system install --manager brew` on a machine without Homebrew installed/on PATH; requesting a manager whose binary exists but is broken; CI images lacking the requested package manager.

Common situations: Linux CI reusing a macOS-oriented bootstrap config; fresh container without apt/brew/cargo present; manager installed in a non-standard PATH location not visible to mise.

Related errors


AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17). Data as JSON: /api/errors/b44dd427824ad758. Report an issue: GitHub.