jdx/mise · error

package manager '{}' does not support pruning

Error message

package manager '{}' does not support pruning

What it means

`mise system prune --manager <name>` looks up the manager among discovered managers (`system::packages::all_managers()`); if found but `is_plugin()` is false — i.e. it is a built-in manager, not a plugin — pruning is not implemented for it and mise bails. Only plugin-based package managers support prune here.

Source

Thrown at src/cli/system/prune.rs:76

            bail!(
                "manager '{}' is excluded by the system_packages.managers setting",
                self.manager
            );
        }
        match self.manager.as_str() {
            "brew" => self.run_brew().await,
            "brew-cask" => self.run_brew_cask().await,
            _ => self.run_plugin().await,
        }
    }

    async fn run_plugin(self) -> Result<()> {
        let discovered = system::packages::all_managers()
            .into_iter()
            .find(|manager| manager.name() == self.manager)
            .ok_or_else(|| eyre::eyre!("unknown bootstrap package manager '{}'", self.manager))?;
        if !discovered.is_plugin() {
            bail!(
                "package manager '{}' does not support pruning",
                self.manager
            );
        }
        if let Some(reason) = discovered.unavailable_reason_async().await {
            bail!("{} is not available: {reason}", self.manager);
        }
        let manager = PackagePluginManager::new(self.manager.clone())?;
        let config = Config::get().await?;
        let configured = system::package_requests_for_manager_from_config_and_tracked_config_files(
            &config,
            &self.manager,
        )
        .await?;
        let plan = manager.prune_plan(&configured).await?;
        if plan.is_empty() {
            if !self.dry_run {
                manager.apply_prune_plan(&plan).await?;

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Prune only plugin-based managers (`mise system prune --manager <plugin-name>`).
  2. For built-ins, remove packages declaratively via `mise system packages` with absent desired state, or use the manager's own CLI (e.g. `brew autoremove`).
  3. Verify which managers are plugins via `mise system packages` output/docs.

Example fix

// before
mise system prune --manager brew
// after (built-ins: use native CLI)
brew autoremove
Defensive patterns

Strategy: fallback

Validate before calling

# Prune only plugin managers; check docs or discovery output first
mise system prune --manager myplugin --dry-run 2>/dev/null || echo "prune unsupported for this manager"

Prevention

When it happens

Trigger: Running `mise system prune --manager brew` (or any built-in/non-plugin manager) — built-ins lack the prune pathway the plugin manager provides via `PackagePluginManager`.

Common situations: Assuming prune works uniformly across managers; docs/scripts written for a plugin manager applied to brew/apt; confusion between `system packages` declarative removal and `system prune`.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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