Skip to content

Surface plugin update availability on the plugins page - #421

Merged
ChuckBuilds merged 2 commits into
mainfrom
claude/plugin-version-notifications
Jul 21, 2026
Merged

Surface plugin update availability on the plugins page#421
ChuckBuilds merged 2 commits into
mainfrom
claude/plugin-version-notifications

Conversation

@ChuckBuilds

@ChuckBuilds ChuckBuilds commented Jul 19, 2026

Copy link
Copy Markdown
Owner

Summary

The plugins page already showed each installed plugin's version and had an Update button, but nothing told users that an update actually existed. This surfaces an "update available" signal — installed version vs. latest published version — right on the plugin card, mirroring how the app already notifies you about its own core updates.

Type of change

  • New feature

Related issues

Test plan

  • Ran on a real Raspberry Pi with hardware
  • Ran in emulator mode (EMULATOR=true python3 run.py)
  • Ran the dev preview server (scripts/dev_server.py)
  • Ran the test suite (pytest) — new + existing test/test_web_api.py plugin-installed tests pass; frontend JS passes node --check
  • Manually verified the affected code path in the web UI

Details: added unit coverage for the semver comparison helper and endpoint-level tests asserting latest_version / update_available appear (and are correctly True/False) in the /plugins/installed response.

Documentation

  • N/A — no docs needed (behavior matches the existing "update detection" note in CLAUDE.md)

Plugin compatibility

  • No plugin breakage expected

The change only adds two fields to the /plugins/installed response and reads the registry's existing latest_version; no plugin-facing API changes.

Checklist

  • My commits follow the message convention in CONTRIBUTING.md
  • I've not committed any secrets or hardcoded API keys
  • If this adds a new config key, the form in the web UI was verified — N/A, no new config key

Notes for reviewer

What changed

  • web_interface/blueprints/api_v3.py/plugins/installed now returns latest_version (pulled from the registry cache that's already fetched for the verified flag — no extra network call) and an update_available boolean. The boolean comes from a new _is_plugin_update_available() helper that does a PEP 440 / semver-aware comparison so a locally-modified plugin whose version is ahead of the registry is never falsely flagged; it falls back to a plain inequality check for unparseable version strings.
  • web_interface/static/v3/plugins_manager.js — the installed-plugin card shows a "vX.Y.Z available" badge next to the installed version, and the existing Update button becomes emphasized ("Update to vX.Y.Z", blue, gentle pulse) when a newer version exists. The Update button/action itself is unchanged — this just tells the user when to press it.
  • web_interface/static/v3/app.css — pulse animation for the emphasized button, with a prefers-reduced-motion opt-out; reuses the app's existing blue update-banner palette (light + dark).

This deliberately reuses the version-comparison concept the store manager already applies for its reinstall decision, rather than introducing a new mechanism.

🤖 Generated with Claude Code

https://claude.ai/code/session_012EW8yDbsk8EceDpq6Hjgqj


Generated by Claude Code

Summary by CodeRabbit

  • New Features

    • Installed plugins now show whether an update is available and display the latest version.
    • Update controls provide clearer labels and tooltips, including the target version when available.
    • Available updates are highlighted with visual styling and animation.
  • Accessibility

    • Update animations are automatically disabled when reduced motion is enabled.
  • Bug Fixes

    • Improved version comparison ensures updates are flagged only when a newer version is available.

The plugin manager page already showed each installed plugin's version and
had an Update button, but nothing told users an update actually existed —
they had to guess. The store manager already compares the installed
manifest version against the registry's latest_version for its reinstall
decision; this surfaces that same signal in the UI.

- api_v3 /plugins/installed now returns `latest_version` (from the registry
  cache, no extra network call) and an `update_available` flag computed by a
  new semver-aware helper `_is_plugin_update_available`. A locally modified
  plugin whose version is ahead of the registry is not flagged.
- The installed-plugin card shows "vX.Y.Z available" next to the installed
  version, and the Update button becomes emphasized ("Update to vX.Y.Z" with
  a gentle pulse) when a newer version is published — mirroring the app's own
  update banner styling.
- Added tests for the helper and the endpoint fields.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_012EW8yDbsk8EceDpq6Hjgqj
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@ChuckBuilds, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 54 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a5fdf88f-8bae-4828-b4f5-e71515d6e261

📥 Commits

Reviewing files that changed from the base of the PR and between 5113b51 and fe86360.

📒 Files selected for processing (2)
  • test/test_web_api.py
  • web_interface/blueprints/api_v3.py
📝 Walkthrough

Walkthrough

The installed-plugin API now exposes latest_version and update_available, using version-aware comparisons. The plugin manager displays update badges and conditional update controls, with CSS animation and reduced-motion support. Tests cover endpoint responses and comparison behavior.

Changes

Installed plugin updates

Layer / File(s) Summary
API update metadata and validation
web_interface/blueprints/api_v3.py, test/test_web_api.py
Installed-plugin responses include registry latest_version and computed update_available values. Tests cover newer, matching, local-ahead, and empty versions.
Plugin update indicators and controls
web_interface/static/v3/plugins_manager.js, web_interface/static/v3/app.css
Installed-plugin cards show update information and conditional update actions, with pulsing styling disabled when reduced motion is preferred.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PluginManagerUI
  participant InstalledPluginsAPI
  participant PluginRegistry
  PluginManagerUI->>InstalledPluginsAPI: Request installed plugins
  InstalledPluginsAPI->>PluginRegistry: Read latest_version and verified
  PluginRegistry-->>InstalledPluginsAPI: Return registry metadata
  InstalledPluginsAPI-->>PluginManagerUI: Return update_available and latest_version
  PluginManagerUI->>PluginManagerUI: Render badge and update control
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: exposing plugin update availability on the plugins page.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/plugin-version-notifications

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codacy-production

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@ChuckBuilds

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@ChuckBuilds

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web_interface/blueprints/api_v3.py`:
- Around line 136-139: Update the exception handler around _parse_version in the
version comparison logic to catch packaging.version.InvalidVersion specifically
instead of Exception, importing or referencing that exception as needed while
preserving the existing fallback behavior.
🪄 Autofix (Beta)

❌ Autofix failed (check again to retry)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6f7e195c-6188-4c87-a09c-f3cba4c41ffb

📥 Commits

Reviewing files that changed from the base of the PR and between 989162d and 5113b51.

📒 Files selected for processing (4)
  • test/test_web_api.py
  • web_interface/blueprints/api_v3.py
  • web_interface/static/v3/app.css
  • web_interface/static/v3/plugins_manager.js

Comment thread web_interface/blueprints/api_v3.py Outdated
Address review feedback: the version comparison caught a blind `except
Exception` (ruff BLE001). Split the two failure modes and catch each
specifically — ImportError for a missing `packaging` (a core dependency)
and InvalidVersion for an unparseable version string — while preserving
the existing "surface the mismatch" fallback behavior. Added a test for
the unparseable-version path.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_012EW8yDbsk8EceDpq6Hjgqj
@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Autofix skipped. No unresolved CodeRabbit review comments with fix instructions found.

@ChuckBuilds
ChuckBuilds merged commit 3872a68 into main Jul 21, 2026
8 checks passed
@ChuckBuilds
ChuckBuilds deleted the claude/plugin-version-notifications branch July 21, 2026 12:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant