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
- Prune only plugin-based managers (`mise system prune --manager <plugin-name>`).
- 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`).
- 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
- Use the manager's native CLI (brew autoremove, apt autoremove) for built-in managers.
- Use declarative removal via system packages for built-ins instead of prune.
- Don't assume prune parity across managers.
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
- {name} does not support declarative package removal
- {} is not available: {reason}
- package plugin '{}' does not support uninstall; add hooks/pa
- mise prune --monorepo is not implemented yet
- package plugin '{plugin_name}' is not a tool backend
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/ac82d37d22745918.
Report an issue: GitHub.