xai-org/grok-build · warning

Plugin "{name}" belongs to repo "{repo_key}" which also cont

Error message

Plugin "{name}" belongs to repo "{repo_key}" which also contains:
{}

Uninstalling will remove all {total} plugin(s). To proceed:
  grok plugin uninstall {name} --confirm

What it means

`cmd_uninstall` refuses to uninstall when the target plugin's repository directory also contains other installed plugins. `UninstallError::NeedsConfirm` is converted into this multi-line message listing the sibling plugins and the total count, instructing the user to re-run with `--confirm` to remove the whole repo (all plugins in it). This is a destructive-action safety gate, not an unexpected failure.

Source

Thrown at crates/codegen/xai-grok-pager/src/plugin_cmd.rs:549

                xai_grok_telemetry::events::PluginUninstalled {
                    confirmed: true,
                    success: true,
                },
            );
            let suffix = if keep_data { " (data preserved)" } else { "" };
            println!(
                "Uninstalled {} plugin(s): {}{suffix}",
                outcome.removed_plugins.len(),
                outcome.removed_plugins.join(", "),
            );
            Ok(())
        }
        Err(UninstallError::NeedsConfirm {
            name,
            repo_key,
            other_plugins,
            total,
        }) => bail!(
            "Plugin \"{name}\" belongs to repo \"{repo_key}\" which also contains:\n\
             {}\n\n\
             Uninstalling will remove all {total} plugin(s). To proceed:\n\
               grok plugin uninstall {name} --confirm",
            other_plugins
                .iter()
                .map(|p| format!("  - {p}"))
                .collect::<Vec<_>>()
                .join("\n"),
        ),
        Err(e @ UninstallError::NotFound { .. }) => bail!("{e}"),
    }
}

fn cmd_update(name: Option<&str>) -> Result<()> {
    let outcomes = plugin::update_plugins(name).map_err(|e| anyhow::anyhow!("{e}"))?;

    if outcomes.is_empty() {

View on GitHub (pinned to bc7f02eddd)

Solutions

  1. Re-run with confirmation if removing all plugins in the repo is intended: grok plugin uninstall <name> --confirm
  2. Uninstall the other plugins individually first if you want to keep them, then remove the last one
  3. Use --keep-data if the plugin's data should survive the uninstall
  4. Run grok plugin list to see which plugins share the repo before confirming

Example fix

// before (blocked)
grok plugin uninstall monorepo-plugin-a

// after (explicit confirmation)
grok plugin uninstall monorepo-plugin-a --confirm
Defensive patterns

Strategy: validation

Validate before calling

// before uninstall, detect shared-repo situation
fn needs_confirm(name: &str, registry: &InstallRegistry) -> bool {
    registry.find_plugin(name)
        .map(|p| registry.plugins_in_repo(&p.repo_key).len() > 1)
        .unwrap_or(false)
}

Type guard

fn is_installed(registry: &InstallRegistry, name: &str) -> bool {
    registry.find_plugin(name).is_some()
}

Try / catch

match result {
    Err(e) if e.to_string().contains("--confirm") => {
        eprintln!("Shared repo detected: re-run with --confirm to remove all plugins in it.");
    }
    other => other?,
}

Prevention

When it happens

Trigger: `grok plugin uninstall <name>` where plugin::uninstall_plugin returns NeedsConfirm because the plugin's repo_key maps to a directory with more than one installed plugin and no --confirm flag was passed.

Common situations: Installing multiple plugins from a monorepo (e.g. a company plugins repo cloned locally) and later uninstalling one of them; scripted cleanups that hit the confirmation gate; users unaware uninstall removes the whole cloned repo.

Related errors


AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31). Data as JSON: /api/errors/c355c47c8cc0dd25. Report an issue: GitHub.