jdx/mise · error

{name} is not an active, installed tool or one of their exec

Error message

{name} is not an active, installed tool or one of their executables

What it means

find_tool looks up a tool by short name, tool name, or id among the currently active/installed toolset versions. If no installed tool matches `name`, it bails. This is mise's guard for commands that operate on an already-installed, active tool (e.g. deriving completion scripts), not for arbitrary uninstalled names.

Source

Thrown at src/packslip.rs:1041

}

/// The active, installed tool called `name`, or the one providing an
/// executable called `name`.
async fn find_tool(
    config: &Arc<Config>,
    ts: &Toolset,
    name: &str,
) -> Result<(Arc<dyn Backend>, ToolVersion)> {
    if let Some(found) = ts.which(config, name).await {
        return Ok(found);
    }
    let by_name = ts
        .list_current_installed_versions(config)
        .into_iter()
        .find(|(b, _)| b.ba().short == name || b.tool_name() == name || b.id() == name);
    match by_name {
        Some(found) => Ok(found),
        None => bail!("{name} is not an active, installed tool or one of their executables"),
    }
}

/// Run one of the tool's own executables and return what it printed.
async fn run_tool(
    config: &Arc<Config>,
    backend: &Arc<dyn Backend>,
    tv: &ToolVersion,
    argv: &[String],
    env: &BTreeMap<String, String>,
) -> Result<String> {
    let Some((program, args)) = argv.split_first() else {
        bail!("an exec entry with no command");
    };
    let Some(path) = backend.which(config, tv, program).await? else {
        bail!("{} has no executable called {program}", tv.style());
    };
    run_resource_command(

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Run `mise ls` to confirm the tool is installed and active in the current project.
  2. Install the missing tool (`mise use <tool>` or `mise install <tool>`).
  3. Use the exact tool name/id as shown by `mise ls` (short name like `node`, full tool name, or backend id like `npm:typescript`).
  4. cd into (or add config for) the project where the tool is active before running the command.

Example fix

// before: querying an uninstalled tool
mise resource completions ripgrep

// after: install first, use the active tool's name
mise use ripgrep
mise resource completions ripgrep
Defensive patterns

Strategy: validation

Validate before calling

let active: Vec<String> = ts.list_current_installed_versions(config)
    .into_iter()
    .map(|(b, _)| b.ba().short)
    .collect();
if !active.contains(&name) {
    eprintln!("{name} is not installed/active. Active: {active:?}");
}

Try / catch

match find_tool(config, &ts, &name) {
    Ok(tv) => run_tool(config, tv).await?,
    Err(e) if e.to_string().contains("not an active, installed tool") => {
        eprintln!("Install it first: mise use {name}");
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling completion_script with a name that is not in ts.list_current_installed_versions(config) — the tool isn't installed, isn't active in the current config, or the name doesn't match short name, tool_name, or id.

Common situations: Typo in the tool name; the tool is pinned in a config file but never installed; the tool is active only in another directory's mise.toml; querying by an alias or executable name that doesn't equal the backend short name, tool name, or id.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/8e676fd800515d29. Report an issue: GitHub.