jdx/mise · error · eyre::Report
{ba} is not installed
Error message
{ba} is not installed What it means
`mise ls TOOL…` accepts positional tool filters; for each one, mise resolves the backend and, if it is a plugin-style backend (asdf/vfox plugin), verifies the plugin is actually installed before listing. If the plugin's install directory is absent, listing aborts with `<backend> is not installed` rather than showing an empty list — the tool has no locally meaningful state until its plugin exists.
Source
Thrown at src/cli/ls.rs:155
runtimes = missing_runtimes;
}
if let Some(prefix) = &self.prefix {
runtimes.retain(|(_, _, tv, _)| tv.version.starts_with(prefix));
}
if self.json {
self.display_json(&config, runtimes, sources_map.as_ref())
.await
} else {
self.display_user(&config, runtimes, sources_map.as_ref())
.await
}
}
fn verify_plugin(&self) -> Result<()> {
if let Some(plugins) = &self.installed_tool {
for ba in plugins {
if let Some(plugin) = ba.backend()?.plugin() {
ensure!(plugin.is_installed(), "{ba} is not installed");
}
}
}
Ok(())
}
async fn display_json(
&self,
config: &Arc<Config>,
runtimes: Vec<RuntimeRow<'_>>,
sources_map: Option<&SourcesMap>,
) -> Result<()> {
if let Some(plugins) = &self.installed_tool {
// only runtimes for 1 plugin
let runtimes: Vec<RuntimeRow<'_>> = runtimes
.into_iter()
.filter(|(_, p, _, _)| matches_requested_tool(plugins, p.ba()))
.collect();View on GitHub (pinned to 9dcfcaa0dc)
Solutions
- Let mise set the tool up: `mise use <tool>` (installs plugin and version automatically)
- Or install just the plugin: `mise plugin install <plugin>` then re-run `mise ls <tool>`
- For scripting, probe without the positional filter — plain `mise ls` never triggers verify_plugin — and filter output yourself
- If the name was a typo, check `mise registry` for the correct short name
Example fix
# before mise ls some-tool # ERROR: some-tool is not installed # after mise use some-tool@latest # installs plugin + version mise ls some-tool
Defensive patterns
Strategy: validation
Validate before calling
# Only filter mise ls by tool once its plugin exists mise plugin ls 2>/dev/null | grep -qx "$tool" || mise plugin install "$tool" mise ls "$tool"
Try / catch
# Scripting: probe with plain `mise ls` (never runs verify_plugin) and filter yourself mise ls | awk -v t="$tool" '$1 == t'
Prevention
- Bootstrap repos with `mise install` (or `mise use`) before per-tool ls probes in scripts
- In automation, prefer `mise ls --json` or unfiltered `mise ls` over positional tool filters
- Check `mise registry <tool>` for the canonical short name before scripting against it
When it happens
Trigger: Running `mise ls <tool>` where <tool> maps to an asdf or vfox plugin that has never been installed on this machine (fresh clone, plugin removed by `mise prune`, or name typo resolving to a plugin backend). Core tools and aqua-style backends have no plugin and do not hit this check.
Common situations: New contributors running `mise ls <tool>` immediately after cloning, before `mise install`/`mise use` has pulled the plugin; after `mise prune` cleaned an unused plugin while a stale mise.toml still references the tool; scripts that probe installed versions per-tool before bootstrap.
Related errors
- vfox-backend plugin '{plugin_name}' exists but '{tool_name}'
- package plugin '{plugin_name}' is not a tool backend
- {plugin_name} is not a valid plugin name
- No config file found in current directory
- Either --url or --platform-url must be specified
AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17).
Data as JSON: /api/errors/f401ded81461a963.
Report an issue: GitHub.