jdx/mise · error · eyre::Report

{bin_name} is not a mise bin. Perhaps you need to install it

Error message

{bin_name} is not a mise bin. Perhaps you need to install it first.

What it means

`mise which <bin>` resolved nothing and found no shim for the bin either (src/cli/which.rs:70): mise has never managed this name — it is neither active in the toolset nor present in the shims directory. `mise which` can only report paths for mise-managed binaries.

Source

Thrown at src/cli/which.rs:70

                    miseprintln!("{p}");
                } else {
                    let path = p.which(&config, &tv, &bin_name).await?;
                    miseprintln!("{}", path.unwrap().display());
                }
                Ok(())
            }
            None => {
                if let Some(msg) =
                    crate::shims::unavailable_configured_tool_message(&config, &ts, &bin_name)
                {
                    bail!(msg);
                }
                if self.has_shim(&bin_name) {
                    bail!(
                        "{bin_name} is a mise bin however it is not currently active. Use `mise use` to activate it in this directory."
                    )
                } else {
                    bail!("{bin_name} is not a mise bin. Perhaps you need to install it first.",)
                }
            }
        }
    }
    async fn complete(&self, config: &Arc<Config>) -> Result<()> {
        let ts = self.get_toolset(config).await?;
        let bins = ts
            .list_paths(config)
            .await
            .into_iter()
            .flat_map(|p| file::ls(&p).unwrap_or_default())
            .map(|p| p.file_name().unwrap().to_string_lossy().to_string())
            .unique()
            .sorted()
            .collect_vec();
        for bin in bins {
            println!("{bin}");
        }

View on GitHub (pinned to 9dcfcaa0dc)

Solutions

  1. If you want mise to manage it: find the tool name (`mise registry | grep -i <name>` or `mise a <partial>`) then `mise use <tool>`
  2. If it's a system binary, query the shell instead: `command -v <bin>`
  3. If you expected it via a tool, check which bins an installed tool provides: `mise which --tool=<tool>@<version> <bin>` or ls the install's bin dir

Example fix

# before
$ mise which jq
# error: jq is not a mise bin. Perhaps you need to install it first.

# after
$ mise use jq   # installs and activates
$ mise which jq
Defensive patterns

Strategy: fallback

Validate before calling

bin="jq"
mise which "$bin" >/dev/null 2>&1 || command -v "$bin" >/dev/null 2>&1 || { mise registry | grep -i "^$bin " && mise use "$bin"; }

Try / catch

path="$(mise which "$bin" 2>/dev/null)" || path="$(command -v "$bin" 2>/dev/null)" || { echo "$bin neither mise-managed nor on PATH" >&2; exit 1; }

Prevention

When it happens

Trigger: `mise which git` when git is a system binary and not mise-managed; `mise which <typo>`; a tool that exists on PATH but was never installed through mise.

Common situations: Assuming mise tracks every executable on PATH; probing for optional tools; typo'd bin names; checking before a tool was ever `mise use`d/installed.

Related errors


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