jdx/mise · error

package plugin '{name}' collides with a built-in package man

Error message

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

What it means

A plugin of type Package (a package-manager-backed plugin) whose name matches one of mise's built-in package manager names (crate::system::packages::is_builtin_manager_name) collides with a backend mise already provides natively. install_plugin bails to prevent a user plugin shadowing or conflicting with the built-in backend.

Source

Thrown at src/cli/plugins/install.rs:164

    let (mut plugin_type, name) = PluginType::from_plugin_config(name);
    let git_url = git_url.or_else(|| {
        config
            .get_repo_url(name)
            .filter(|url| url.starts_with("packslip:"))
    });
    if git_url
        .as_deref()
        .is_some_and(|url| url.starts_with("packslip:"))
    {
        if explicit_type && plugin_type != PluginType::Vfox {
            bail!("packslip plugin sources require the vfox plugin type");
        }
        plugin_type = PluginType::Vfox;
    }
    let name = name.to_string();
    if plugin_type == PluginType::Package && crate::system::packages::is_builtin_manager_name(&name)
    {
        bail!("package plugin '{name}' collides with a built-in package manager");
    }
    let path = dirs::PLUGINS.join(name.to_kebab_case());
    let plugin = plugin_type.plugin(name.clone());
    if let Some(url) = git_url {
        plugin.set_remote_url(url);
    }
    if !force && plugin.is_installed() {
        warn!("Plugin {name} already installed");
        warn!("Use --force to install anyway");
    } else {
        let mpr = MultiProgressReport::get();
        plugin
            .ensure_installed(config, &mpr, force, dry_run)
            .await?;
        if !dry_run {
            warn_if_env_plugin_shadows_registry(&name, &path);
        }
    }

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Drop the plugin install — use the built-in backend directly (`mise use cargo:crate-name`, `mise use npm:pkg`).
  2. Rename your plugin to something that doesn't collide with a built-in manager name.
  3. If you need custom behavior for that tool, implement it as a vfox/asdf plugin with a distinct name instead of a Package plugin.

Example fix

// before
mise plugins install cargo packslip:owner/cargo-plugin
// after
mise use cargo:serde_cli  # built-in cargo backend, no plugin needed
Defensive patterns

Strategy: validation

Validate before calling

for m in cargo npm pipx gem go dotnet; do [ "$PLUGIN" = "$m" ] && { echo "$m collides with a built-in backend"; exit 1; }; done

Prevention

When it happens

Trigger: `mise plugins install <name>` (or install_one path) where the resolved plugin type is Package and <name> equals a built-in package manager name (e.g. cargo, npm, pipx, gem, go, dotnet).

Common situations: Trying to register a custom plugin named after an existing backend (e.g. `mise plugins install cargo ...`); migrating old plugin setups after those tools became built-in backends; scripted installs using unvalidated names.

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@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/2592a35ddde2167c. Report an issue: GitHub.