[BUG] claude plugin update is silent on no-op/failure and has no bulk mode — outcomes are indistinguishable to the caller

Open 💬 0 comments Opened Jun 29, 2026 by brian-deane-gusto

Describe the bug

claude plugin update <plugin> does not give the caller a reliable signal about what it did. A successful update, a no-op ("already current"), and a silent failure are indistinguishable — there's no machine-readable result and no summary. Compounding this, there is no way to update all installed plugins in one invocation (update requires a positional <plugin>; no --all flag), so anyone managing more than a couple of plugins must loop the command by hand and still can't tell what actually changed.

This makes the command unusable in any non-interactive context (CI, hooks, shell startup), because you can't branch on the outcome.

Steps to reproduce

  1. Install several plugins across one or more marketplaces (I have 17 across 5).
  2. Run claude plugin update <some-plugin> for a plugin that is already current.
  3. Run it again for one that has an upstream update.
  4. Compare stdout/stderr and exit codes between the two cases.
  5. Try to update everything at once: claude plugin update --all.

Expected behavior

  • Each invocation reports a clear per-plugin outcome: updated, already-current, or failed.
  • Non-zero exit on failure so callers can branch.
  • A bulk path — claude plugin update --all (composable with the existing --scope) — that iterates installed plugins, runs the existing per-plugin update for each, prints per-plugin progress, and ends with a summary line, e.g. Updated 4 of 17 plugins; 13 already current.

Actual behavior

  • No distinguishable signal between "updated," "already current," and "silent failure."
  • No --all; the only built-in bulk mechanism is the session-start sync, which is silent on failure and gated by per-plugin version comparison — so a no-op sync for a stale plugin looks identical to "everything is up to date."
  • Workaround is a fragile shell loop that still can't solve the silent-no-op problem:

``bash
claude plugin list --json | jq -r '.plugins | keys[]' \
| xargs -I{} -P1 claude plugin update {}
``

Environment

  • Claude Code version: 2.1.195
  • Platform: macOS (Darwin 25.5.0)
  • Scope tested: user

Prior reports (this demand keeps resurfacing and keeps getting auto-closed)

  • #55415 — my --all request; auto-closed as a duplicate of #38271 by the dedup bot (no human comment), then locked.
  • #38271 — the merge target; itself closed NOT_PLANNED for inactivity one week later.
  • #35752, #29071 — update never pulls the marketplace clone, "always reports 'already at latest'" (the silent-no-op defect). Both closed NOT_PLANNED.
  • #14061 — /plugin update does not invalidate plugin cache. Still open.
  • #11676 — claude plugin update-all. Closed for inactivity.
  • #11713 — open community PR adding a slash-only /update-plugins (plugin-based, not reachable from CI/hooks).
[!NOTE] The --all ask is distinct from the refresh-mechanism bug cluster (#38271/#14061): this report is about the update command giving no reliable per-plugin outcome signal, and the missing bulk mode being a downstream consequence. Filing fresh because #55415 is locked.

🤖 Generated with Claude Code

View original on GitHub ↗