{"record":{"id":"f401ded81461a963","repo":"jdx/mise","slug":"ba-is-not-installed","errorCode":null,"errorMessage":"{ba} is not installed","messagePattern":"(.+?) is not installed","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/ls.rs","lineNumber":192,"sourceCode":"            Err(err) => {\n                warn!(\"failed to read tool purgatory state: {err:#}\");\n                BTreeMap::new()\n            }\n        };\n        if self.json {\n            self.display_json(&config, runtimes, sources_map.as_ref(), &scheduled_removals)\n                .await\n        } else {\n            self.display_user(&config, runtimes, sources_map.as_ref(), &scheduled_removals)\n                .await\n        }\n    }\n\n    fn verify_plugin(&self) -> Result<()> {\n        if let Some(plugins) = &self.installed_tool {\n            for ba in plugins {\n                if let Some(plugin) = ba.backend()?.plugin() {\n                    ensure!(plugin.is_installed(), \"{ba} is not installed\");\n                }\n            }\n        }\n        Ok(())\n    }\n\n    async fn display_json(\n        &self,\n        config: &Arc<Config>,\n        runtimes: Vec<RuntimeRow<'_>>,\n        sources_map: Option<&SourcesMap>,\n        scheduled_removals: &BTreeMap<PathBuf, u64>,\n    ) -> Result<()> {\n        if let Some(plugins) = &self.installed_tool {\n            // only runtimes for 1 plugin\n            let runtimes: Vec<RuntimeRow<'_>> = runtimes\n                .into_iter()\n                .filter(|(_, p, _, _)| matches_requested_tool(plugins, p.ba()))","sourceCodeStart":174,"sourceCodeEnd":210,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/cli/ls.rs#L174-L210","documentation":"`mise ls` verifies that each tool/plugin selected for display is actually installed. When a requested backend maps to an asdf/vfox-style plugin whose `is_installed()` check fails, it bails with \"<tool> is not installed\". It is a precondition check before listing versions.","triggerScenarios":"Running `mise ls <tool>` (or with `--installed-tool` selections) where the tool's backend has a plugin that is not installed on the machine.","commonSituations":"Referencing a tool in .tool-versions/mise.toml whose plugin was never installed (e.g. after cloning a project config), a plugin that was removed or corrupted in ~/.local/share/mise/plugins, or typos in tool names.","solutions":["Install the missing plugin/tool: `mise install <tool>` or `mise plugin install <tool>`","Check installed plugins with `mise plugins ls` and add the missing one","Fix the tool name in your mise.toml/.tool-versions if it is a typo","Remove the stale tool entry if the tool is no longer needed"],"exampleFix":"// mise.toml before\n[tools]\nnode = \"20\"\nunknownplugin = \"1.0\"\n// after (install it or remove the entry)\nmise install unknownplugin","handlingStrategy":"validation","validationCode":"mise plugins ls | grep -q \"^node$\" || mise plugin install node","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run `mise install` after cloning a project to provision all declared plugins","Keep plugin list in sync with mise.toml tool entries","Verify tool names against `mise registry` before adding them to config","Periodically run `mise doctor` to detect broken plugins"],"tags":["plugin","asdf","tool-management","not-installed"],"backgroundTag":"missing-dependency","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}