jdx/mise · error

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

Error message

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

What it means

find_tool looks up a backend/version pair among the currently active, installed tool versions by short name, tool name, or id. When nothing matches, it bails with this error, since completion_script needs an installed tool to run its own executables.

Solutions

  1. Install the tool first (mise install <name>) and ensure it is active in the current toolset
  2. Use the exact tool name or id as shown by `mise ls --current`
  3. Check spelling/case of the tool name
  4. Verify you are in a project whose mise.toml includes the tool

Example fix

// before
// mise packslip completions unknowncli
// after
// mise install usage && mise packslip completions usage  # or the correct installed tool name
Defensive patterns

Strategy: type-guard

Validate before calling

const installed = ts.listCurrentInstalledVersions(config).map(([b]) => b.toolName());
if (!installed.includes(name)) throw new Error(`install ${name} first`);

Type guard

const isInstalledTool = (name: string) => ts.listCurrentInstalledVersions(config).some(([b]) => b.ba().short === name || b.toolName() === name || b.id() === name);

Try / catch

try { const found = await findTool(config, ts, name) } catch (e) { if (/is not an active, installed tool/.test(e.message)) { await installTool(name); } else { throw e; } }

Prevention

When it happens

Trigger: completion_script is asked to derive completions from a tool whose name does not match any entry returned by list_current_installed_versions — the tool is not installed, not active in this toolset, or the name given is an executable alias rather than a known tool id.

Common situations: Running completion generation before `mise install`, referencing a tool only present in another environment, misspelling the tool name, using a binary name that does not equal the tool's short 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@533346cc37 (2026-09-17). Data as JSON: /api/errors/8e676fd800515d29. Report an issue: GitHub.

Appendix: source

Thrown at src/packslip.rs:1345

}

/// 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 533346cc37)