jdx/mise · error

Tool ' ' not found

Error message

Tool '{}' not found

What it means

When resolving a tool+binary for execution (e.g. `mise x`/`mise exec`), mise maps a bin-path failure to a user-facing error. `BinPathError::ToolNotFound` means no installed version matched the requested tool, so there is nothing to run.

Solutions

  1. Run `mise ls` to see installed tools and `mise ls-remote <tool>` for available versions
  2. Install the tool first: mise use node@22 (or mise install node@22)
  3. Fix the tool-name spelling in the command or config file

Example fix

// before
mise x nod@22 -- node -v
// after
mise use node@22 && mise x node -- node -v
Defensive patterns

Strategy: validation

Validate before calling

const installed = exec('mise ls --json');
function toolInstalled(name){ return JSON.parse(installed).some(t=>t.tool===name); }
if (!toolInstalled('node')) exec('mise install node');

Type guard

const isInstalled = (tool: string, list: {tool:string;installed?:string[]}[]) =>
  list.some(t => t.tool === tool && (t.installed?.length ?? 0) > 0);

Try / catch

try { exec(`mise x ${tool}@${ver} -- ${cmd}`); } catch (e) { if (String(e).includes('not found')) { exec(`mise install ${tool}`); retry(); } else throw e; }

Prevention

When it happens

Trigger: `mise x node@99 -- node -v` or `mise x python -- ...` when the named tool has no matching installed version; typo in tool name passed via tool arguments to exec/x.

Common situations: Referencing a tool not in mise.toml/.tool-versions and not installed; renaming tools in config without reinstalling; misspelled tool name in `mise x`.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/tool_stub.rs:604

                    env.insert(
                        crate::env::PATH_KEY.to_string(),
                        std::env::join_paths(paths)?.to_string_lossy().to_string(),
                    );
                }
            }
            crate::cli::exec::exec_program(
                bin_path,
                args,
                env,
                env_remove,
                &Default::default(),
                false,
            )
            .await
        }
        Err(e) => match e {
            BinPathError::ToolNotFound(tool_name) => {
                bail!("Tool '{}' not found", tool_name);
            }
            BinPathError::BinNotFound {
                tool_name,
                bin,
                available_bins,
            } => {
                if available_bins.is_empty() {
                    bail!(
                        "Tool '{}' does not have an executable named '{}'",
                        tool_name,
                        bin
                    );
                } else {
                    bail!(
                        "Tool '{}' does not have an executable named '{}'. Available executables: {}",
                        tool_name,
                        bin,
                        available_bins.join(", ")

View on GitHub (pinned to 533346cc37)