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
- Check the executable exists in the installed tool: `mise which <program>` or look in the tool's install path bin directory.
- Correct the exec entry's program name to match an executable the tool actually ships.
- Pin/install the tool version the manifest was written for, or update the manifest for the installed version.
- 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
- Verify executable names against the installed tool version (`mise which` or the install bin dir).
- Pin tool versions in lockfiles so manifests match the binaries actually installed.
- Update manifests when a tool renames its executables between releases.
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
- relay unavailable
- must not record a pin before replacement succeeds
- packslip:{tool_name} is not a project name; use github.com/o
- the packslip lists {a} and {b} for this host and mise will n
- packslip:{project} is not on a forge mise knows, so nothing
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/9dc5d1422ba28347.
Report an issue: GitHub.