Skip to content

Ship bb-plugins as official catalog entries with a quiet update flow - #1474

Merged
brsbl merged 5 commits into
bb/extensions-browse-herofrom
bb/extensions-official-catalog
Aug 13, 2026
Merged

Ship bb-plugins as official catalog entries with a quiet update flow#1474
brsbl merged 5 commits into
bb/extensions-browse-herofrom
bb/extensions-official-catalog

Conversation

@brsbl

@brsbl brsbl commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Ships two BB official plugins in the catalog: Thread Hover Cards and Prompt Improver, installable from Extensions → Browse. Timeline Comments remains in the bb-plugins source stack but is intentionally excluded from the official BB catalog for now.

  • Both plugins install from the brsbl/bb-plugins repo at pinned, reviewed commits: Thread Hover Cards at 30f91fd977ba and Prompt Improver at 1c6bb2e8ad35. The Prompt Improver ref was regenerated from the green SDK 0.5 source integration in bb-plugins PR manager: named template sets in manager-templates/<name>/ (supersedes #21) #24.
  • Install-id enforcement: a git catalog install aborts if the fetched manifest id differs from the catalog entry id — a repo cannot swap one plugin for another underneath a pin.
  • Quiet update signals: available updates surface with short commit hashes instead of noisy banners.
  • Sidebar hover-target integration that Thread Hover Cards builds on, formerly PR Add thread hover cards example plugin #1349 and now folded in here.
  • Install surfaces describe git-catalog installs truthfully: builtin plugins say bundled with BB; git-catalog entries say they install from their pinned source, in both the Add-plugin dialog and CLI preamble.

BB-Thread-ID: thr_kuixkqt8n2

AGENT GENERATED: by GPT-5

@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch from f15b5d2 to 6301869 Compare August 13, 2026 03:51
@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch 2 times, most recently from c139334 to e3b9bd6 Compare August 13, 2026 09:51
@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch from e3b9bd6 to 00018f2 Compare August 13, 2026 09:59
@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch from 00018f2 to 1c0943a Compare August 13, 2026 10:09
@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch from 1c0943a to 2635bb2 Compare August 13, 2026 10:12
@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch 3 times, most recently from 4dfe6d5 to 0a29911 Compare August 13, 2026 11:29
@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch from 0a29911 to f4861e1 Compare August 13, 2026 11:43
@brsbl
brsbl force-pushed the bb/extensions-official-catalog branch from f4861e1 to 885408f Compare August 13, 2026 15:57
@brsbl
brsbl merged commit fa27130 into main Aug 13, 2026
12 of 19 checks passed
@brsbl
brsbl deleted the bb/extensions-official-catalog branch August 13, 2026 17:30
brsbl added a commit that referenced this pull request Aug 13, 2026
Moves plugin configuration into Settings, where configuration lives —
and is the top layer of the native GitHub stack for the Extensions
rework (#1358#1360#1471#1472#1473#1474 → here).

- **/settings/plugins/:id** hosts each plugin's settings form, under a
Plugins sidebar group where each row uses the plugin's own icon.
- **Mirrored anatomies**: the plugin settings page mirrors the
Extensions detail page's header (icon + title + one-line description)
and section stack; its "Plugin details" section is one sentence linking
across to the plugin page, and the detail page's "Configuration" section
is one sentence linking here — each page owns its half and points at the
other.
- The per-plugin settings route participates in Settings route memory
like any other section; only the bare /settings/plugins list remains a
legacy redirect to Extensions.


Bundle budget: this integration layer raises the compressed boot
allowance from 435.3 KB to 438.0 KB to account for the persistent plugin
rows added to Settings. The final measured boot payload is 436.2 KB
Brotli; the raw boot payload remains within its existing limit.

BB-Thread-ID: thr_kuixkqt8n2

> AGENT GENERATED: by GPT-5
SawyerHood added a commit that referenced this pull request Aug 19, 2026
## What was wrong

The plugin update UI (the "Update x.y.z" pill, the update dialog, and
the detail-page banner) shipped in #1474, but nothing ever triggered an
update check. `checkForUpdates` only ran when a user ran `bb plugin
outdated` or `bb plugin update`. The app had a `checkPluginUpdates()`
helper with no caller, and the server only refreshed marketplace catalog
metadata on a timer, not installed-plugin update state. So the pills
never appeared for users who do not use the CLI.

## What changed

Server:
- `apps/server/src/services/plugins/plugin-updates.ts`: new
`startPeriodicUpdateChecks()` / `stopPeriodicUpdateChecks()` with
`PLUGIN_UPDATE_CHECK_INTERVAL_MS = 6h`. The first sweep runs at once
when no plugin has a recorded check or the newest one is older than 6h;
otherwise it waits the remainder, so a restart does not re-check. A
failed sweep waits a full interval. `lastCheckAt` now uses the injected
`deps.now` clock.
- `plugin-service-internal.ts`: `scheduleUpdateCheck` test seam on
`PluginServiceDeps`.
- `start-server.ts`: starts the sweep after plugin startup settles;
stops it on shutdown.
- No wire change between server and host daemon;
`HOST_DAEMON_PROTOCOL_VERSION` is unchanged.

App:
- New `CheckPluginUpdatesButton`: a toolbar key (same 32px outline style
as the filter/sort keys) that POSTs `/plugins/updates/check`,
invalidates the plugin list so the pills appear, and toasts a summary.
- `PluginsOverview`: the button sits in the Installed toolbar beside
"New plugin".
- `PluginDetail`: an inline "Check" button in the Release section for
updatable plugins when no update is known yet.
- `PluginRowSignal`: the row's "Update x.y.z" text pill is now a round
icon button (`PackageReceive`, the app's update icon) that matches the
status icon beside it; the version lives in the tooltip and the
accessible name.

Docs: `docs/configuration.md` "Plugin updates" now describes the button
and the 6-hour sweep. No CLI command changed.

## How you verified

- New server test `sweeps for updates on start, then waits a full
interval across restarts` in `plugin-update.test.ts` (fails before:
`startPeriodicUpdateChecks` does not exist). All 24 tests in that file
pass.
- New `CheckPluginUpdatesButton.test.tsx` (4 tests): toast summary, full
check request shape + plugin list invalidation, scoped single-plugin
check.
- `pnpm exec turbo run typecheck lint --filter=@bb/app
--filter=@bb/server` pass.
- E2E in the dev app: installed a local `git:` plugin, committed a newer
version, clicked the toolbar key → toast "1 plugin update available:
updater-demo" and the row pill appeared; detail page showed the
candidate; applied the update through the dialog; clicked the inline
"Check" → "updater-demo is up to date". Server log/DB confirmed the
startup sweep stamped `lastCheckAt` on every installed plugin.

Toolbar key after a check (toast + pill):

![after
check](https://raw.githubusercontent.com/get-bb/reports/main/assets/plugin-update-check/02-after-check.png)

Row icon button (hovered):

![icon
row](https://raw.githubusercontent.com/get-bb/reports/main/assets/plugin-update-check/08-icon-row.png)

Detail page with the found candidate:


![detail](https://raw.githubusercontent.com/get-bb/reports/main/assets/plugin-update-check/04-detail.png)

Detail page after applying, inline Check:

![detail
check](https://raw.githubusercontent.com/get-bb/reports/main/assets/plugin-update-check/07-detail-check-uptodate.png)

> AGENT GENERATED: by Claude Opus 5

---------

Co-authored-by: Claude <noreply@anthropic.com>
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