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
- Run `mise ls` to confirm the tool is installed and active in the current project.
- Install the missing tool (`mise use <tool>` or `mise install <tool>`).
- Use the exact tool name/id as shown by `mise ls` (short name like `node`, full tool name, or backend id like `npm:typescript`).
- 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
- Run `mise ls` to confirm a tool is installed and active before referencing it by name.
- Use exact names/ids as reported by mise (short name, tool name, or backend id).
- cd into the project whose config activates the tool, or add it to the current config.
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
- relay unavailable
- execute_external_command not implemented for {}
- Plugin {ba} is not installed
- Task not found: {}, use `mise tasks ls --all --hidden` to li
- bail!(msg) — dynamic message: uninstalled tool message from
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/8e676fd800515d29.
Report an issue: GitHub.