Repository navigation
fix(plugins): review a pinned link to an installed plugin's source as an update - #3024
Conversation
c7ce487 to
c516182
Compare
|
🤖 Design review at Reviewed the diff, surrounding source and regression cases; did not run tests. Not checked live: native deep-link/update, narrow or enlarged-text layouts, keyboard/focus, agent activity, or rendered disabled/access-change/error states. |
|
Thanks for the design pass. Nothing here changes layout: the pinned link reuses the existing Update review, and the only new copy is the "This plugin will stay disabled." line that the Details Update review already shows. I agree the items you listed weren't checked live: native deep-link/update, narrow and enlarged-text layouts, keyboard/focus, and the rendered disabled, access-change and error states. They stay listed under Remaining gaps in the description. The disabled, access-change and changed-plugin refusal states are covered by — Posted by Claude Code (claude-opus-5-5) on behalf of kylez |
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 One update-source correctness issue.
c516182 to
532def4
Compare
… an update A buzz://plugin-install Git link pinned to a commit and folder for a plugin imported from that repository and folder now opens the same Update review a plugin's Git requestInstall gets, instead of the Add duplicate refusal. When the link's or request's ref differs from the ref the plugin tracks, the review says which branch or tag later updates will follow, because native import saves it. Links without both pins and pinned links to a bundled plugin keep the duplicate refusal. Confirming a requested update now also refuses if the installed plugin's revision, enabled state or source changed after the review opened. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Kyle Zemek <kylez@squareup.com>
532def4 to
e913727
Compare
gilgtm
left a comment
There was a problem hiding this comment.
🤖 No P0/P1 findings in the deep-dual review of e913727fd5608ca61e3e239e078456ce8d5cec41 against main@80cb3a25569f763a2b36ce473320fe628a17c85f. Reviewed pinned-link update eligibility, confirmation and stale-state guards, native pin/publisher enforcement, source persistence, enabled-state preservation, and regression coverage.
Posted by duel-review skill [driver: codex(high), mode: deep-dual, review synthesized by codex(high)]
…nt-progress-rows * origin/main: (53 commits) fix(search): make Command F search the Bestie conversation (#3084) fix(plugins): keep failed update checks on the plugin's Settings row instead of a toast (#3088) Show single-agent Stop on the activity bubble (#3140) fix: support explicit hosted browser origins (#3149) fix: keep Codex tool namespace descriptions bounded (#3128) fix(messages): show "New messages" in channels longer than one page (#3071) Keep shared agent guidance generic (#3134) fix(typing): a thread reply also ends the agent's channel-level typing (#3148) Stream protected evidence across agent runtimes (#2882) feat(identity): consolidate key and account controls (#3069) Add portrait-colored foil and animated agent card reveal (#3144) NEXUS-4190: Disclose unavailable saved Solo choices (#2544) docs: mark the plugin API as preview and say which parts are steady (#3129) Open the app with a saved key; check the account's key in the background (#3064) fix(federated-identity): name only communities that require NIP-FI as affected by a switch (#3072) feat(pairing): signed in with Builderlab, say to get the app instead of pairing (#3039) Show Add agent button on shared agent previews (#3131) NEXUS-4224: Preserve peer unread intent during automatic reads (#2641) fix(plugins): review a pinned link to an installed plugin's source as an update (#3024) perf(profiles): resume verified-profile batches after a planned renewal (#2293) ... Signed-off-by: Gil Birman <gil@squareup.com> # Conflicts: # docs/buzz-help.md
## TL;DR Expose optional plugin update discovery and explicit review queues through the existing `pluginInstaller` service. Reuse the host's retained checker and importer; a missing result remains unknown, not proof that a plugin is current. ## What - `getSnapshot`, `subscribe`, and `refresh` expose aggregate status, known candidates, and known errors. Plugin-triggered refreshes share a one-minute minimum interval. - `queueUpdates` accepts opaque tokens for current candidates from a recent completed check. Each item opens the existing confirmation dialog, identifies its requesting plugin, and preserves source, publisher, access, and saved enabled-choice guards. - Queue snapshots support observation and cancellation. A confirmed import keeps its review slot until the native operation settles, including after the watchdog, cancellation, or consumer unmount. - Stable provider and request IDs bind replay to the exact ordered, deduplicated token list. Request IDs are namespaced by calling plugin ID; a remounted consumer can reconcile its prior request. Both subscriptions are released with the caller's lifetime. - `getQueueRequest` returns `admitted`, `not-admitted`, `unknown`, or `conflict` without submitting. Only `not-admitted` from the same live provider proves non-admission. Replacement, restart, or queue eviction stays unknown and cannot create a duplicate on replay. - A fresh snapshot miss does not establish that an individual plugin was checked, is eligible, or is current. Distinct submissions retain independent confirmation and cancellation; only an exact identified replay shares a queue. ## Validation and limits Focused regression coverage covers review drift and missing candidates, busy-manager admission, late native settlement, caller cleanup, request isolation, and provider replacement. [Hosted CI](https://github.com/block/buzz-app/actions/runs/42895615087) passed on `affbcd72`, including all JavaScript shards and changed-file repetitions. The repairs were not run locally; normal precommit checks passed. No native installed/runtime or fail-before/pass-after proof is claimed. Queue state lasts only for the host provider lifetime. The frontend checks and immutable prepared import preserve the existing boundary; this does not add native enforcement or cross-restart idempotency. No second checker or per-plugin checked-current result is added. ## Tracking Fixes NEXUS-4337 Pinned-link classification and ref-change disclosure are in [#3024](#3024). Generated with [Codex](https://openai.com/codex) (gpt-6.1-sol, high) on behalf of kylez Signed-off-by: Kyle Zemek <kylez@squareup.com> Co-authored-by: Codex <noreply@openai.com>
TL;DR
A
buzz://plugin-installGit link pinned to both acommitand apath, for a plugin already installed from that same repository and folder, now opens the Update review that a plugin's GitrequestInstallalready gets. If the link names another branch or tag than the plugin tracks, the review says so. Before, it hit the Add path's Already installed refusal, so there was no reviewed way to update from such a link. Links without both pins, and links to a plugin installed from another source, are still refused as duplicates.What changed
PluginImporttreats a link with bothcommitandpathlike a boundrequestInstallrequest when deciding between update and duplicate (src/app/PluginImport.tsx). It reuses the existing same-source check: the installedupdateSourcemust be a Git source whose repository matches the fetched preview's source and whose folder matches the candidate's folder, and the candidate must have the installed manifest ID. Native import saves the requestedref, and later update checks follow it. So when a link's or plugin request'srefdiffers from the installed Git source's ref, the review adds "Future updates will follow instead of ." An empty ref reads as "the repository default".docs/plugin-architecture.md,docs/deep-links.mdanddocs/buzz-help.mddescribe the pinned-link update.Protections that still apply: the commit pin (native refuses a ref whose tip differs, and the review re-checks the fetched commit), the folder filter, the access review against the installed manifest, the publisher line and native publisher-continuity refusal, the unsigned-to-signed rollback warning, explicit Update confirmation, and preview discard on cancel. Links with only
commit, onlypath, or neither, and pinned links to a bundled plugin, keep showing Already installed / Open in Buzz.Not in scope: update discovery, Update-all, managed policy feeds or checkers (#2504, #2621, #637), signature or publisher-trust policy (#2212, #2746), and the compact request dialog (#2625). This PR doesn't touch their hunks. #2983 and #2762 also edit
tests/browser/plugin-import.spec.mjs; this PR leaves that file unchanged.Supported operation
On a Buzz desktop build that includes this change, open
buzz://plugin-install?repository=<repo>&ref=<ref>&path=<folder>&commit=<40-or-64-hex>for a plugin whose installed copy came from a Git import of that same repository and folder. The review shows Update , with access changes listed against the installed version, and states any change to the branch or tag later updates follow. Nothing changes until you choose Update. Native import still refuses the update if the ref's tip isn't the pinned commit, or if the publisher changed or a signed plugin became unsigned.Tests
New
src/app/PluginImport.test.tsxcases, all with fictionalexample.comfixtures:requestInstall.The request and link harnesses now return a ready catalog from
plugins.snapshot(), which the new confirm-time check reads.Checked on a Linux box at
37cf73e1:biome checkon both files,pnpm typecheck, andvitest run src/app/PluginImport.test.tsx(100 passed). After the first review fixes, the same three checks passed locally (102 tests), and the bundled-plugin test fails on the earlier predicate. The later enabled-state drift case (two lines plus one test input) passed biome locally; host load refused a local test run, so PR CI covers it. With only therequestedline reverted, 6 of the 8pinned linktests fail. Againstmain'sPluginImport.tsx, the same 6 fail and the other 94 pass. The two that pass either way are the existing pin-retry test and the other-plugin-ID new-install case, which should behave the same before and after.After review feedback, the tracked-ref disclosure was verified on a Blox box at
e913727f:biome check,pnpm typecheckandvitest run src/app/PluginImport.test.tsx(103 passed). With the review line disabled, the new tracked-ref test fails. The before/after screenshots predate this line and show a same-ref update.Before / after
These screenshots come from a temporary Chromium journey using the existing
nativeImportsIPC fixture and fictionalexampledata; the journey is not committed. It installsexample.linkedfromhttps://github.com/example/pluginsatplugins/linked, then delivers the same pinned link again with a newer candidate.main)Remaining gaps
buzz-review-completedis not set.Initiative context
Status: https://g2.sqprod.co/apps/kylez-buzz-improvements-status (buzz-improvements T027).
Fixes NEXUS-4327
🤖 Generated with Claude Code