jdx/mise · error

package plugin ' ' collides with a built-in package manager

Error message

package plugin '{}' collides with a built-in package manager

What it means

Vfox 'package' type plugins wrap a package manager, but mise already has built-in package-manager integrations. If a package plugin's name matches a built-in manager name (`system::packages::is_builtin_manager_name`), mise deletes the plugin directory and bails rather than shadowing built-in behavior.

Solutions

  1. Remove the built-in-backed usage: just use the built-in package manager support directly instead of the vfox package plugin.
  2. If the plugin is obsolete, drop it — mise deleted the plugin directory already; verify with `mise plugins ls`.
  3. If you truly need the plugin, rename it (fork with a distinct plugin name) so it doesn't collide with the builtin.

Example fix

// before
mise plugin add pip https://github.com/version-fox/vfox-pip
// after
mise use pipx:somepackage  # built-in pipx/pip support
Defensive patterns

Strategy: validation

Validate before calling

const BUILTINS = ['pip','cargo','gem','npm','go','composer'];
if (BUILTINS.includes(pluginName)) throw new Error(`${pluginName} collides with a built-in manager`);

Prevention

When it happens

Trigger: Installing a vfox package-type plugin whose name collides with a built-in package manager (e.g. pip, cargo, gem, npm style names) via `mise plugin add`/`mise install`, after taking the plugin lock.

Common situations: Plugin renamed/republished so its name matches a builtin; user following an outdated tutorial for a package plugin that has since become built-in; stale plugin cache holding an old plugin at a now-colliding name.

Understand the failure class

Background: "already exists" / EEXIST / FileAlreadyExistsException: what the 'file already exists' error means and how to fix it — this error's family across 37 libraries.

Related errors


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

Appendix: source

Thrown at src/plugins/vfox_plugin.rs:366

            }
        }

        let prefix = format!("plugin:{}", style(&self.name).blue().for_stderr());
        let pr = mpr.add_with_options(&prefix, dry_run);
        if !dry_run {
            // Force requests reinstallation, but staged replacements still
            // need exclusive access to their destination and backup.
            let skip_lock = force && !self.get_repo_url(config)?.starts_with("packslip:");
            let plugin_lock = lock_file::get(&self.plugin_path, skip_lock)?;
            self.install(config, pr.as_ref()).await?;
            let plugin_type =
                PluginType::from_plugin_path(&self.plugin_path).unwrap_or(PluginType::Vfox);
            if plugin_type == PluginType::Package
                && crate::system::packages::is_builtin_manager_name(&self.name)
            {
                drop(plugin_lock);
                file::remove_all(&self.plugin_path)?;
                bail!(
                    "package plugin '{}' collides with a built-in package manager",
                    self.name
                );
            }
            install_state::add_plugin(&self.name, plugin_type).await?;
            backend::remove(&self.name);
            warn_if_env_plugin_shadows_registry(&self.name, &self.plugin_path);
        }
        Ok(())
    }

    async fn update(&self, pr: &dyn SingleReport, gitref: Option<String>) -> Result<()> {
        if let Some(installed) = packslip::installed(&self.plugin_path)? {
            if self.plugin_path.is_symlink() {
                warn!("plugin:{} is a symlink, not updating", self.name);
                return Ok(());
            }
            let _lock = lock_file::get(&self.plugin_path, false)?;

View on GitHub (pinned to 533346cc37)