jdx/mise · error

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

Error message

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

What it means

Terminal fallback of `mise which <bin>`: when the bin has no mise shim and no match in the active toolset, mise concludes the binary is simply not managed by mise and bails with this message, suggesting the user install it first.

Solutions

  1. Add and install the tool: `mise use <tool>@<version>` then retry `mise which <bin>`.
  2. Verify the binary name spelling; if the binary is system-installed and not mise-managed, use `command -v <bin>` instead.
  3. Run `mise ls` to confirm the tool is present in the toolset.

Example fix

// before
mise which rg   # rg not managed by mise
// after
mise use ripgrep@14
mise which rg
Defensive patterns

Strategy: fallback

Validate before calling

mise ls --json | jq -e --arg b "$bin" 'any(.[]; .active == true)' >/dev/null || echo "$bin not managed by mise"

Try / catch

if ! mise which "$bin" 2>/dev/null; then
  command -v "$bin" || { mise use "$tool" && mise which "$bin"; }
fi

Prevention

When it happens

Trigger: `mise which <bin>` where `has_shim(&bin_name)` is false and the toolset lookup returned None — the name was never added to any mise config and no shim was generated.

Common situations: Typo in the binary name; using `mise which` for a system binary mise never manages; forgetting to add the tool to mise.toml before locating it.

Related errors


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

Appendix: source

Thrown at src/cli/which.rs:87

                    miseprintln!("{}", path.unwrap().display());
                }
                Ok(())
            }
            None => {
                if let Some(msg) = self.uninstalled_tool_message(&config, &ts) {
                    bail!(msg);
                }
                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 533346cc37)