jdx/mise · error

Plugin is not installed

Error message

Plugin {ba} is not installed

What it means

mise's `mise current <plugin>` command resolves the currently active versions for a tool backend. Before querying, it checks whether the named plugin's backend exposes a plugin and that the plugin is actually installed (e.g. an asdf/vfox plugin has been downloaded). If not, it bails instead of returning meaningless 'current version' data.

Solutions

  1. Run `mise install <plugin>` to install the plugin (e.g. `mise install node`).
  2. Check the plugin name with `mise ls-remote <plugin>` / `mise plugins ls` to confirm spelling and availability.
  3. Run `mise install` with no arguments to install everything listed in mise.toml.

Example fix

// before
$ mise current nodejs   // "Plugin nodejs is not installed"
// after
$ mise install node
$ mise current node
Defensive patterns

Strategy: validation

Validate before calling

mise plugins ls | grep -qx <plugin> || mise install <plugin>

Prevention

When it happens

Trigger: Run `mise current <name>` (or `mise current <name>` via `one()`) where `<name>.backend()?.plugin()` returns a plugin and `plugin.is_installed()` is false — i.e. the tool is known to the registry but has never been installed via `mise install <name>`.

Common situations: Typo'd or uninstalled plugin name in `mise current`; fresh machine where mise.toml lists tools but `mise install` was never run; plugin removed manually from ~/.local/share/mise/plugins.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/current.rs:51

    )
)]
pub(crate) struct Current {
    /// Plugin to show versions of
    /// e.g.: ruby, node, cargo:eza, npm:prettier, etc.
    #[usage()]
    plugin: Option<BackendArg>,
}

impl Current {
    pub(crate) async fn run(self) -> Result<()> {
        let config = Config::get().await?;
        let ts = ToolsetBuilder::new().build(&config).await?;
        match &self.plugin {
            Some(ba) => {
                if let Some(plugin) = ba.backend()?.plugin()
                    && !plugin.is_installed()
                {
                    bail!("Plugin {ba} is not installed");
                }
                self.one(ts, ba.backend()?.as_ref()).await
            }
            None => self.all(ts).await,
        }
    }

    async fn one(&self, ts: Toolset, tool: &dyn Backend) -> Result<()> {
        if let Some(plugin) = tool.plugin()
            && !plugin.is_installed()
        {
            warn!("Plugin {} is not installed", tool.id());
            return Ok(());
        }
        match ts
            .list_versions_by_plugin()
            .into_iter()
            .find(|(p, _)| p.id() == tool.id())

View on GitHub (pinned to 533346cc37)