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

  1. 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
  2. Use `mise prune -n` (dry-run) first to confirm what would be deleted before running for real
  3. Watch mise release notes and only adopt `--monorepo` in a version where it is implemented
  4. 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

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


AI-assisted analysis of jdx/mise@6bd4a54fad (2026-08-16). Data as JSON: /api/errors/5f9dbd76c35749d4. Report an issue: GitHub.