[BUG] claude plugin update is silent on no-op/failure and has no bulk mode — outcomes are indistinguishable to the caller
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
- Install several plugins across one or more marketplaces (I have 17 across 5).
- Run
claude plugin update <some-plugin>for a plugin that is already current. - Run it again for one that has an upstream update.
- Compare stdout/stderr and exit codes between the two cases.
- Try to update everything at once:
claude plugin update --all.
Expected behavior
- Each invocation reports a clear per-plugin outcome:
updated,already-current, orfailed. - 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
--allrequest; auto-closed as a duplicate of #38271 by the dedup bot (no human comment), then locked. - #38271 — the merge target; itself closed
NOT_PLANNEDfor inactivity one week later. - #35752, #29071 —
updatenever pulls the marketplace clone, "always reports 'already at latest'" (the silent-no-op defect). Both closedNOT_PLANNED. - #14061 —
/plugin updatedoes 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