{"record":{"id":"17f3040ccc9ba28a","repo":"jdx/mise","slug":"vfox-backend-plugin-plugin-name-exists-but-t","errorCode":null,"errorMessage":"vfox-backend plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed","messagePattern":"vfox-backend plugin '(.+?)' exists but '(.+?)' is not available or the plugin is not properly installed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/args/backend_arg.rs","lineNumber":329,"sourceCode":"            Ok(backend)\n        } else if let Some((plugin_name, tool_name)) = self.short.split_once(':') {\n            // Check if the plugin exists first\n            if let Some(plugin_type) = install_state::get_plugin_type(plugin_name) {\n                // Plugin exists, but the backend couldn't be created\n                // This could be due to the tool not being available or plugin not properly installed\n                match plugin_type {\n                    PluginType::Asdf => {\n                        bail!(\n                            \"asdf plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed\"\n                        );\n                    }\n                    PluginType::Vfox => {\n                        bail!(\n                            \"vfox plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed\"\n                        );\n                    }\n                    PluginType::VfoxBackend => {\n                        bail!(\n                            \"vfox-backend plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed\"\n                        );\n                    }\n                    PluginType::Package => {\n                        bail!(\"package plugin '{plugin_name}' is not a tool backend\");\n                    }\n                }\n            } else {\n                // Plugin doesn't exist\n                bail!(\"{plugin_name} is not a valid plugin name\");\n            }\n        } else {\n            // Check if the tool is in the registry but has no available backends\n            if let Some(rt) = REGISTRY.get(self.short.as_str())\n                && rt.backends().is_empty()\n                && !rt.backends.is_empty()\n            {\n                let all_backends: Vec<&str> = rt.backends.iter().map(|rb| rb.full).collect();","sourceCodeStart":311,"sourceCodeEnd":347,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/src/cli/args/backend_arg.rs#L311-L347","documentation":"Bailed from BackendArg::backend() (src/cli/args/backend_arg.rs:329) when a 'plugin:tool' style short name fails to produce a backend AND install_state::get_plugin_type() still reports the prefix as PluginType::VfoxBackend. mise is saying: the plugin is registered in its install state, but its files cannot actually construct a backend for the requested tool - a broken or half-finished installation rather than an unknown name.","triggerScenarios":"Any command that resolves a backend for a spec like 'my-vfb:tool@1.0' (mise use/install/uninstall): backend::get() returns None while the plugin's recorded type is VfoxBackend. Concrete causes: the plugin directory under ~/.local/share/mise/plugins/<name> was deleted or truncated (missing plugin metadata) while install-state metadata still labels it, or the tool portion of the pair is not provided by that plugin.","commonSituations":"An interrupted 'mise plugin add' or failed update; manually rm -rf-ing a plugin directory instead of 'mise plugin rm'; copying a mise data directory to a new machine without plugin files; plugin layout changes after a mise upgrade leaving stale install state.","solutions":["Cleanly reinstall: 'mise plugin rm <plugin>' (if that also fails, delete ~/.local/share/mise/plugins/<plugin> and its install-state entry) then 'mise plugin add <repo-url>'","Inspect the plugin directory (ls ~/.local/share/mise/plugins/<plugin>) for missing or empty plugin metadata and restore the files","Confirm what mise sees: 'mise plugin ls' should list the plugin; then retry the original command","Bypass the broken plugin with an explicit backend for the same tool, e.g. 'mise use aqua:owner/repo' or 'mise use github:owner/repo'"],"exampleFix":"# before: install state says vfox-backend, but plugin files are gone\nmise use my-vfb:mytool@1.0\n# Error: vfox-backend plugin 'my-vfb' exists but 'mytool' is not available or the plugin is not properly installed\n\n# after\nmise plugin rm my-vfb || rm -rf ~/.local/share/mise/plugins/my-vfb\nmise plugin add https://github.com/me/my-vfb\nmise use my-vfb:mytool@1.0","handlingStrategy":"validation","validationCode":"# bash: verify the plugin is installed and intact before using plugin:tool syntax\nplugin=\"${SPEC%%:*}\"\nmise plugin ls 2>/dev/null | grep -qx \"$plugin\" || { echo \"plugin not installed: $plugin\" >&2; exit 1; }\ndir=\"$HOME/.local/share/mise/plugins/$plugin\"\n[ -d \"$dir\" ] && [ -n \"$(ls -A \"$dir\")\" ] || { echo \"plugin dir incomplete: $dir\" >&2; exit 1; }","typeGuard":null,"tryCatchPattern":"# bash: on this specific error, reinstall once and retry\nif ! mise use \"$SPEC\" 2>err.log; then\n  grep -q 'not properly installed' err.log || exit 1\n  mise plugin rm \"${SPEC%%:*}\" && mise plugin add \"$REPO\" && mise use \"$SPEC\"\nfi","preventionTips":["Install plugins only through 'mise plugin add' so install state stays consistent; never rm -rf plugin directories by hand","After upgrades or restores, run 'mise plugin ls' to confirm plugins still resolve","In CI, prefer stateless explicit backends (aqua:, github:) over locally-installed plugins"],"tags":["mise","vfox","plugin","backend-resolution","install-state"],"backgroundTag":"broken-plugin-installation","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}