jdx/mise · error
mise prune --monorepo is not implemented yet
Error message
mise prune --monorepo is not implemented yet
What it means
`mise prune` accepts a `--monorepo` flag declared as a placeholder (src/cli/prune.rs:52-54: 'Placeholder for future monorepo pruning; mise prune --monorepo is not implemented yet'). The implementation does not exist, so `Prune::run` calls `unimplemented!()` at src/cli/prune.rs:68 the moment the flag is seen — a Rust panic that aborts before any config load, tracking-file read, or deletion planning happens. No pruning occurs, partial or otherwise.
Source
Thrown at src/cli/prune.rs:68
pub dry_run_code: bool,
/// Placeholder for future monorepo pruning; `mise prune --monorepo` is not implemented yet.
#[clap(long, verbatim_doc_comment)]
pub monorepo: bool,
/// Prune only unused versions of tools
#[clap(long)]
pub tools: bool,
}
impl Prune {
fn is_dry_run(&self) -> bool {
self.dry_run || self.dry_run_code
}
pub async fn run(self) -> Result<()> {
if self.monorepo {
unimplemented!("mise prune --monorepo is not implemented yet");
}
let mut config = Config::get().await?;
if self.configs || !self.tools {
self.prune_configs()?;
}
if self.tools || !self.configs {
let backends = self
.installed_tool
.as_ref()
.map(|it| it.iter().map(|ta| ta.ba.as_ref()).collect());
let tools = backends.unwrap_or_default();
let to_delete = prunable_tools(&config, tools).await?;
let has_work = !to_delete.is_empty();
delete(&config, self.is_dry_run(), to_delete).await?;
if self.dry_run_code && has_work {
return Err(exit::request(1));
}
if self.is_dry_run() {View on GitHub (pinned to 6bd4a54fad)
Solutions
- Drop the flag and run `mise prune` from each repository root; pruning uses tracked configs (~/.local/state/mise/tracked-configs) so running it per project prunes that project's unused versions
- Use `mise prune -n` (dry-run) first to confirm what would be deleted before running for real
- Watch mise release notes and only adopt `--monorepo` in a version where it is implemented
- In shared scripts, feature-detect instead of hardcoding the flag (e.g. parse `mise prune --help` output)
Example fix
# before mise prune --monorepo # after for d in services/*/; do (cd "$d" && mise prune); done
Defensive patterns
Strategy: validation
Validate before calling
# confirm the prune monorepo path exists before relying on it if mise prune --help 2>/dev/null | grep -q -- '--monorepo.*not implemented'; then for d in services/*/; do (cd "$d" && mise prune -n); done # dry-run per project else mise prune --monorepo fi
Try / catch
# shell: prune per project when the flag panics out=$(mise prune --monorepo 2>&1) if [ $? -ne 0 ] && printf '%s' "$out" | grep -q 'not implemented yet'; then for d in services/*/; do (cd "$d" && mise prune); done else printf '%s\n' "$out" fi
Prevention
- Feature-detect flags in cleanup scripts instead of assuming; the flag parsing successfully is not evidence it works
- Always dry-run (`mise prune -n`) after changing prune automation to see exactly what would be deleted
- Version-lock mise in cron/CI environments so a half-shipped flag can never surprise a scheduled job
When it happens
Trigger: Running `mise prune --monorepo`. The check is the first statement in `run()`, so the command panics before `prune_configs()` or `prunable_tools()` execute; nothing is deleted and tracked-config state is untouched.
Common situations: Cleanup scripts or cron jobs written for a future mise that documents monorepo pruning; tab-completion or `mise prune --help` showing the flag (it is a real clap arg) inviting use; sharing dotfiles across mise versions where the flag parses but panics.
Related errors
- mise outdated --monorepo is not implemented yet
- mise upgrade --monorepo is not implemented yet
- erlang does not yet support refs
- cask uses `#{feature}`, which mise's cask shim does not supp
- formula uses `#{feature}`, which mise's source-build shim do
AI-assisted analysis of jdx/mise@6bd4a54fad (2026-08-16).
Data as JSON: /api/errors/5f9dbd76c35749d4.
Report an issue: GitHub.