jdx/mise · error

vfox-backend plugin ' ' exists but ' ' is not available or…

Error message

vfox-backend plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed

What it means

Same family as errors 177/178 but for plugins registered as PluginType::VfoxBackend (vfox plugins wrapped as full backends). The plugin exists in install state, yet mise could not construct the backend for tool_name — the tool is not exposed by the plugin or the plugin installation is damaged.

Solutions

  1. Reinstall the plugin: mise plugin remove <name> then mise plugin add <name>
  2. Check the plugin registers the exact tool name requested
  3. Update the plugin to its latest version (mise plugin update <name>)
  4. Run mise doctor for a plugin health report

Example fix

# before
mise use my-backend-tool@latest   # plugin exists but tool not registered
# after
mise plugin update my-backend-tool
mise ls-remote my-backend-tool   # confirm the tool is listed
mise use my-backend-tool@latest
Defensive patterns

Strategy: validation

Validate before calling

# confirm the plugin registers the tool
assert tool in registered_tools(plugin), f'{plugin} does not register {tool}'

Try / catch

match backend {
    Err(e) if e.to_string().contains("vfox-backend plugin") =>
        update_and_verify_plugin(plugin),
    r => r,
}

Prevention

When it happens

Trigger: BackendArg::backend() sees PluginType::VfoxBackend for plugin_name and backend creation fails, e.g. the wrapped vfox-backend plugin does not register the requested tool or its metadata/scripts are missing.

Common situations: Requesting a tool name the vfox-backend plugin never registered; interrupted plugin install leaving partial files; version drift between the plugin and its vfox runtime.

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


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/17f3040ccc9ba28a. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/args/backend_arg.rs:337

            Ok(backend)
        } else if let Some((plugin_name, tool_name)) = self.short.split_once(':') {
            // Check if the plugin exists first
            if let Some(plugin_type) = install_state::get_plugin_type(plugin_name) {
                // Plugin exists, but the backend couldn't be created
                // This could be due to the tool not being available or plugin not properly installed
                match plugin_type {
                    PluginType::Asdf => {
                        bail!(
                            "asdf plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed"
                        );
                    }
                    PluginType::Vfox => {
                        bail!(
                            "vfox plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed"
                        );
                    }
                    PluginType::VfoxBackend => {
                        bail!(
                            "vfox-backend plugin '{plugin_name}' exists but '{tool_name}' is not available or the plugin is not properly installed"
                        );
                    }
                    PluginType::Package => {
                        bail!("package plugin '{plugin_name}' is not a tool backend");
                    }
                }
            } else {
                // Plugin doesn't exist
                bail!("{plugin_name} is not a valid plugin name");
            }
        } else {
            // Check if the tool is in the registry but has no available backends
            if let Some(rt) = REGISTRY.get(self.registry_short().as_str())
                && rt
                    .backends_for_version(self.registry_version.as_deref())
                    .is_empty()
                && !rt.backends.is_empty()

View on GitHub (pinned to 533346cc37)