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
- Reinstall the exact current version as the message says: `mise install --force <tool>@<version>`
- Verify the install on disk: `ls ~/.local/share/mise/installs/<tool>/<version>/bin`
- Confirm which version is active with `mise ls <tool>` before reinstalling
- 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
- After mise upgrades that change backend metadata, reinstall pinned tools
- Avoid interrupting installs (disk-full/Ctrl-C) — rerun with `mise install --force` if in doubt
- Spot-check install bin dirs in health checks: `mise where <tool>`
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
- No executable found for configured tool
- @ is not installed hint: run `mise install @ `, or `mise ls…
- a branch name is required
- a glob is required
- a repository preview directory requires a dry run
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)