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
- Install the tool first (mise install <name>) and ensure it is active in the current toolset
- Use the exact tool name or id as shown by `mise ls --current`
- Check spelling/case of the tool name
- 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
- Run `mise install` before generating completions
- Match the tool name/id exactly as listed by `mise ls --current`
- Keep the tool in the active toolset of your project
- Don't assume executable names equal tool names
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
- cli-spec entry names
- has no executable called
- invalid completion cache identity
- mise cannot derive completions from a
- resource command produced no output
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)