jdx/mise · error

{} has no executable called {program}

Error message

{} has no executable called {program}

What it means

After resolving the program name from the exec argv, run_tool asks the tool's backend to locate the executable (backend.which). If the installed tool version does not provide an executable with that name, the error bails naming the tool version and the missing program. It means the manifest's exec entry references a binary that the installed version of the tool doesn't ship.

Source

Thrown at src/packslip.rs:1057

    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(
        &path,
        args,
        env,
        &tv.install_path(),
        std::time::Duration::from_secs(5),
    )
    .await
}

/// Run vendor resource generation outside the user's project, without
/// input, under a deadline. Empty output is a failed source, never a cache hit.
async fn run_resource_command(
    path: &Path,
    args: &[String],
    env: &BTreeMap<String, String>,
    install_path: &Path,

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Check the executable exists in the installed tool: `mise which <program>` or look in the tool's install path bin directory.
  2. Correct the exec entry's program name to match an executable the tool actually ships.
  3. Pin/install the tool version the manifest was written for, or update the manifest for the installed version.
  4. Reinstall the tool if the binary is missing from an otherwise expected install (`mise install --force <tool>`).

Example fix

# before: executable doesn't exist in this version
exec = ["rg-old", "--version"]

# after
exec = ["rg", "--version"]
Defensive patterns

Strategy: validation

Validate before calling

if backend.which(config, &tv, program).await?.is_none() {
    eprintln!("{} does not ship an executable named {program}", tv.style());
}

Try / catch

match run_tool(config, &backend, &tv, &argv, &env).await {
    Err(e) if e.to_string().contains("has no executable called") => {
        eprintln!("Check `mise which {program}`; fix the binary name or pin the matching tool version");
    }
    Ok(out) => use(out),
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: A resource command's exec argv names a program (e.g. `rg`) that backend.which cannot find in the installed tool version's install path — wrong binary name, binary only present in newer/older versions, or the tool isn't fully installed.

Common situations: Manifest written against a different version of the tool than the one installed; renamed executables between releases; typo in the executable name; partial/corrupted install where the binary is missing.

Related errors


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