jdx/mise · error
package manager ' ' does not support pruning
Error message
package manager '{}' does not support pruning What it means
`mise bootstrap packages prune` only works for plugin-based package managers (vfox-style plugins with package hooks). `run_plugin` looks the manager up in the discovered manager list and, if it exists but `is_plugin()` is false (e.g. a built-in manager like brew), pruning is unsupported and mise throws this error.
Solutions
- Prune only managers implemented as package plugins (those with package hook Lua files).
- For brew, remove packages via `brew uninstall` or by removing them from `[bootstrap.packages]` and running the install/sync flow instead of prune.
- Check `mise bootstrap packages --help` / available managers to see which support pruning.
Example fix
// before $ mise bootstrap packages prune --manager brew error: package manager 'brew' does not support pruning // after $ brew autoremove # or manage removal via mise bootstrap packages install sync
Defensive patterns
Strategy: validation
Validate before calling
# Only attempt prune for plugin-based managers case "$MANAGER" in brew|cargo|npm) echo "manager $MANAGER does not support prune"; exit 1 ;; esac mise bootstrap packages prune --manager "$MANAGER"
Try / catch
try {
await run("mise", ["bootstrap","packages","prune","--manager", m]);
} catch (e) {
if (e.message.includes("does not support pruning")) {
// fall back to the manager's native removal command
} else throw e;
} Prevention
- Check which bootstrap managers are plugin-based before scripting prune.
- Use manager-native cleanup (e.g. brew autoremove) for non-plugin managers.
- Keep import and prune manager choices distinct — import's brew default does not imply prune support.
When it happens
Trigger: Running `mise bootstrap packages prune --manager brew` (or another non-plugin manager name): the manager is known to mise but is not a package plugin, so there is no prune implementation.
Common situations: Assuming prune works uniformly across all bootstrap package managers; using brew as the manager for prune because import uses brew by default.
Related errors
- is not available
- package plugin ' ' does not support uninstall; add…
- brew-cask is not available
- loads completions eagerly, so mise cannot leave it a stub…
- manager ' ' is excluded by the system_packages.managers…
AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17).
Data as JSON: /api/errors/ac82d37d22745918.
Report an issue: GitHub.
Appendix: 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 533346cc37)