jdx/mise · error · eyre::Report

{ba} is not installed

Error message

{ba} is not installed

What it means

`mise ls TOOL…` accepts positional tool filters; for each one, mise resolves the backend and, if it is a plugin-style backend (asdf/vfox plugin), verifies the plugin is actually installed before listing. If the plugin's install directory is absent, listing aborts with `<backend> is not installed` rather than showing an empty list — the tool has no locally meaningful state until its plugin exists.

Source

Thrown at src/cli/ls.rs:155

            runtimes = missing_runtimes;
        }
        if let Some(prefix) = &self.prefix {
            runtimes.retain(|(_, _, tv, _)| tv.version.starts_with(prefix));
        }
        if self.json {
            self.display_json(&config, runtimes, sources_map.as_ref())
                .await
        } else {
            self.display_user(&config, runtimes, sources_map.as_ref())
                .await
        }
    }

    fn verify_plugin(&self) -> Result<()> {
        if let Some(plugins) = &self.installed_tool {
            for ba in plugins {
                if let Some(plugin) = ba.backend()?.plugin() {
                    ensure!(plugin.is_installed(), "{ba} is not installed");
                }
            }
        }
        Ok(())
    }

    async fn display_json(
        &self,
        config: &Arc<Config>,
        runtimes: Vec<RuntimeRow<'_>>,
        sources_map: Option<&SourcesMap>,
    ) -> Result<()> {
        if let Some(plugins) = &self.installed_tool {
            // only runtimes for 1 plugin
            let runtimes: Vec<RuntimeRow<'_>> = runtimes
                .into_iter()
                .filter(|(_, p, _, _)| matches_requested_tool(plugins, p.ba()))
                .collect();

View on GitHub (pinned to 9dcfcaa0dc)

Solutions

  1. Let mise set the tool up: `mise use <tool>` (installs plugin and version automatically)
  2. Or install just the plugin: `mise plugin install <plugin>` then re-run `mise ls <tool>`
  3. For scripting, probe without the positional filter — plain `mise ls` never triggers verify_plugin — and filter output yourself
  4. If the name was a typo, check `mise registry` for the correct short name

Example fix

# before
mise ls some-tool   # ERROR: some-tool is not installed

# after
mise use some-tool@latest   # installs plugin + version
mise ls some-tool
Defensive patterns

Strategy: validation

Validate before calling

# Only filter mise ls by tool once its plugin exists
mise plugin ls 2>/dev/null | grep -qx "$tool" || mise plugin install "$tool"
mise ls "$tool"

Try / catch

# Scripting: probe with plain `mise ls` (never runs verify_plugin) and filter yourself
mise ls | awk -v t="$tool" '$1 == t'

Prevention

When it happens

Trigger: Running `mise ls <tool>` where <tool> maps to an asdf or vfox plugin that has never been installed on this machine (fresh clone, plugin removed by `mise prune`, or name typo resolving to a plugin backend). Core tools and aqua-style backends have no plugin and do not hit this check.

Common situations: New contributors running `mise ls <tool>` immediately after cloning, before `mise install`/`mise use` has pulled the plugin; after `mise prune` cleaned an unused plugin while a stale mise.toml still references the tool; scripts that probe installed versions per-tool before bootstrap.

Related errors


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