jdx/mise · error

mise outdated --monorepo is not implemented yet

Error message

mise outdated --monorepo is not implemented yet

What it means

mise reserves a `--monorepo` flag on `mise outdated` (declared in src/cli/outdated.rs:55-57 as a clap placeholder documented as 'Placeholder for future monorepo outdated checks') but the implementation does not exist yet. When the flag is passed, `Outdated::run` immediately calls `unimplemented!()` (src/cli/outdated.rs:76), a Rust panic that aborts the command before any config or toolset is loaded. The flag exists only so the CLI grammar is stable for scripts written against the future feature.

Source

Thrown at src/cli/outdated.rs:76

    /// Don't show table header
    #[clap(long)]
    pub no_header: bool,
}

impl Outdated {
    pub async fn run(mut self) -> Result<()> {
        if self.legacy_bump {
            deprecated_at!(
                "2026.8.5",
                "2027.8.5",
                "cli.outdated.bump-l",
                "`mise outdated -l` is deprecated. Use `mise outdated -b` or `mise outdated --bump` instead. After removal, `-l` will become shorthand for `--local`."
            );
            self.bump = true;
        }
        if self.monorepo {
            unimplemented!("mise outdated --monorepo is not implemented yet");
        }
        let config = Config::get().await?;
        let scope = if self.local {
            ConfigScope::LocalOnly
        } else {
            ConfigScope::All
        };
        let mut ts = ToolsetBuilder::new()
            .with_args(&self.tool)
            .with_scope(scope)
            .build(&config)
            .await?;
        let tool_set = self
            .tool
            .iter()
            .map(|t| t.ba.clone())
            .collect::<HashSet<_>>();
        ts.versions

View on GitHub (pinned to 6bd4a54fad)

Solutions

  1. Remove `--monorepo` from the command: run `mise outdated` per repository, or scope it with `--local` (only project-local mise.toml tools) or `--inactive` (include installed-but-inactive tools)
  2. If you need per-project checks across a monorepo, loop over subprojects: `for d in */; do (cd "$d" && mise outdated); done`
  3. Track mise releases (mise --version, github.com/jdx/mise releases) and re-enable the flag only in a version where monorepo support ships
  4. If the flag came from a shared script, gate it: only pass it when `mise outdated --help 2>&1 | grep -q monorepo.*implemented` no longer matches 'not implemented'

Example fix

# before
mise outdated --monorepo
# after
for d in services/*/; do (cd "$d" && mise outdated); done
Defensive patterns

Strategy: validation

Validate before calling

# before invoking mise in a script, confirm the flag is actually implemented
if mise outdated --help 2>/dev/null | grep -q -- '--monorepo.*not implemented'; then
  echo "--monorepo is a placeholder here; falling back to per-project outdated" >&2
  for d in services/*/; do (cd "$d" && mise outdated); done
else
  mise outdated --monorepo
fi

Try / catch

# shell: capture the panic and retry without the flag
out=$(mise outdated --monorepo 2>&1)
if [ $? -ne 0 ] && printf '%s' "$out" | grep -q 'not implemented yet'; then
  mise outdated   # retry without the unsupported flag
else
  printf '%s\n' "$out"
fi

Prevention

When it happens

Trigger: Running `mise outdated --monorepo` from the command line or a script. The panic fires unconditionally and first thing in `run()` (after only the legacy `-l` deprecation check), so any invocation carrying the flag terminates with a panic message instead of a usage error.

Common situations: Scripts written against mise docs/issues that discuss upcoming monorepo support; shell tab-completion offering the flag because clap exposes it; copying a command from a teammate's dotfiles running a newer/older mise; CI pinning a mise version where the flag parses but is not implemented.

Related errors


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