jdx/mise · error · eyre::Report

No executable found for configured tool

Error message

No executable found for configured tool: {bin_name}
The installed version does not provide this executable with its current backend metadata.
Reinstall it with:
mise install --force {tool}@{version}

What it means

Built by `shims::unavailable_configured_tool_message` (src/shims.rs:843) and surfaced by `mise which` (and by shim execution): the bin name matches a configured tool (`matches_bin_name`) and that version IS installed, but no executable could be resolved for it — the installed version's backend/bin metadata does not list BIN. mise concludes the install metadata is stale or incomplete and tells you to reinstall with `mise install --force`.

Solutions

  1. Reinstall the exact current version as the message says: `mise install --force <tool>@<version>`
  2. Verify the install on disk: `ls ~/.local/share/mise/installs/<tool>/<version>/bin`
  3. Confirm which version is active with `mise ls <tool>` before reinstalling
  4. If the release genuinely does not ship that bin on your platform, `mise use` a version that does

Example fix

# before
$ mise which codex
No executable found for configured tool: codex
...

# after
$ mise install --force node@22.0.0
$ mise which codex
Defensive patterns

Strategy: retry

Validate before calling

# verify the bin really exists in the active install before relying on it
v=$(mise current jq 2>/dev/null || true)
if [ -n "$v" ] && [ ! -x "$(mise where jq "$v")/bin/jq" ]; then
  mise install --force "jq@$v"
fi

Try / catch

# shell wrapper: reinstall once on this specific failure
out=$(mise which jq 2>&1) || {
  case "$out" in
    "No executable found for configured tool"*)
      mise install --force "$(mise current jq)" && mise which jq ;;
    *) echo "$out"; exit 1 ;;
  esac
}

Prevention

When it happens

Trigger: `mise which <bin>` (or running a shim) where the install directory is missing the bin: an interrupted extraction, a backend whose bin-listing metadata changed after install (e.g. an aqua registry update), or a version that only ships the bin on other platforms.

Common situations: Upgrade of mise changed how a backend lists bins, leaving old installs unresolvable; partial installs after disk-full or crash; tools whose bin name differs across versions; NFS/symlinked installs where bins failed to materialize.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/773dd09be7e64e72. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/which.rs:66

            Some((p, tv)) => {
                if self.version {
                    miseprintln!("{}", tv.version);
                } else if self.plugin {
                    miseprintln!("{p}");
                } else {
                    let path = p.which(&config, &tv, &bin_name).await?;
                    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())

View on GitHub (pinned to 6f52dcdf99)