Unify the extensions collection toolbars - #1020
Conversation
Plugins, Skills, and Automations each grew their own filter and sort treatment. Pull them onto one set of shared primitives: - Merge the Automations project and status dropdowns into one grouped ResourceFilterMenu; filtering behavior is unchanged, only the control. - Drop the explicit "All" row from the type filters. An empty selection already means "no filter", so ResourceMultiSelectMenu loses the prop. - Add a type filter (bb Official / User) to installed plugins, and move Browse's category pills into the same toolbar as a multi-select. - Rename the Skills type labels to "bb Official" and "Included in plugin". - Render toolbar filter and sort keys as siblings of the search input -- same 32px box, --input border, and radius -- with the app's one selection surface (bg-state-active) when engaged. Icon buttons carry no resting fill, which drops a hardcoded background on the template card. - Give every band the same pr-1 scrollbar gutter so description, tabs, toolbar, and results share one content width. - Keep the Automations prompt footer inside the box while editing so edit and read-only modes have identical geometry. Note: the Skills library now opens unfiltered rather than pre-filtered to bb Official, which follows from "nothing selected means all types". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
packages/plugin-registry/r/button.json is generated from shared-ui's button, and CI's build-registry --check gates both typecheck and test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SawyerHood
left a comment
There was a problem hiding this comment.
🚨 SLOP COP 🚨 · review
I am the SlopCop. I am reviewing this pull request under the review rule.
The stack contains only PR #1020. I found no later pull requests after the required second scan.
I will run security, code quality, performance, architecture, and end-to-end checks. I will post each phase result here.
SawyerHood
left a comment
There was a problem hiding this comment.
🚨 SLOP COP 🚨 · review
Security review complete. I found no security problem.
I checked text injection, plugin provenance labels, permission controls, filter state, and the generated button registry source. The changes do not alter authorization, requests, routes, storage, or the host protocol.
SawyerHood
left a comment
There was a problem hiding this comment.
🚨 SLOP COP 🚨 · review
Performance review complete. I found no user-visible performance defect.
The Skills page now searches more items because it opens without a source filter. Current work remains within one frame. A future search index could remove repeated string work if the library grows.
Pagination still limits the DOM. The new menu state stays local, and the new filter work occurs only after a user action.
SawyerHood
left a comment
There was a problem hiding this comment.
🚨 SLOP COP 🚨 · review
End-to-end review complete. I found no functional or visual defect in the tested paths.
I tested the Skills Type filter, the installed Plugins Type filter, the Browse Category filter, and the grouped Automations filter. I also inspected the Automations toolbar and open menu.
The app suite passed 2,347 tests. The Automations suite passed 58 tests. The App, Shared UI, and Automations type checks passed.
shared-ui's button is embedded in the plugin starter files, and generate-templates --check gates both typecheck and test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
| ); | ||
| } | ||
|
|
||
| /** The toolbar's recessed track, so engaged reads in its real context. */ |
There was a problem hiding this comment.
🚨 slopcop/review — Replace the removed toolbar track in this story.
This story still renders the recessed 28px track that this PR removes. The shipped keys use separate 32px outline buttons with an input border. Build the story from the real trigger classes so it checks the design that users receive.
| const source = skillSourceFilterId(skill); | ||
| if (source !== null && !sourceFilters.includes(source)) { | ||
| if ( | ||
| sourceFilters.length > 0 && |
There was a problem hiding this comment.
🚨 slopcop/review — Add a User source option before this filter excludes user skills.
Any selected Type now removes every user and project scope because skillSourceFilterId returns null for them. The menu only offers bb Official and Included in plugin. Add a User value and map all user-authored scopes to it.
| icon: "h-9 w-9", | ||
| }, | ||
| }, | ||
| compoundVariants: [ |
There was a problem hiding this comment.
🚨 slopcop/review — Regenerate the plugin starter template.
This button source also feeds packages/templates/src/generated/plugin-starter-files.generated.ts. The current PR updates the registry output but not this second output. Both @bb/templates tests and type checks fail their generation check. Run node packages/templates/scripts/generate-templates.mjs and commit the result.
SawyerHood
left a comment
There was a problem hiding this comment.
🚨 SLOP COP 🚨 · review
Code-quality and architecture review complete. I found one blocking build defect and two user-facing consistency defects.
The plugin starter template is stale. Both @bb/templates tests and type checks fail. The Skills Type menu omits user-authored skills. The new control story still shows the removed toolbar track.
The new grouped menu centralizes the main toolbar structure. Its option toggle logic still duplicates ResourceMultiSelectMenu, so a shared helper can reduce future drift. The Browse empty state also still says “this category” after the move to multiple selections.
I posted three inline comments for the actionable changed lines.
SawyerHood
left a comment
There was a problem hiding this comment.
🚨 SLOP COP 🚨 · review
Final review result: changes are required, but I am leaving a comment-only review as instructed.
The current PR state still fails the @bb/templates generation check. Regenerate and commit packages/templates/src/generated/plugin-starter-files.generated.ts.
Please also add a User value to the Skills Type filter. Update the new control story to use the shipped 32px outline keys.
Security review found no problem. Performance review found no user-visible defect at the current scale. Browser tests passed across Skills, Plugins, Browse, and Automations.
The app suite passed 2,347 tests. The Automations suite passed 58 tests. The relevant App, Shared UI, and Automations type checks passed.
The grouped menu is a good shared base. Extract the duplicated option-toggle logic before it causes behavior drift.
Plugins, Skills, and Automations had each grown their own filter and sort treatment. This pulls them onto one set of shared primitives.
Filters
ResourceFilterMenu. Each group keeps its own state and handler, so filtering behavior is identical; only the affordance merges.ResourceMultiSelectMenulosesallOptionLabelentirely rather than keeping dead API.bb Official/User), mappingbuiltin/catalog→ bb Official.bb OfficialandIncluded in plugin.Control styling
Toolbar filter and sort keys are now siblings of the search input beside them — same 32px box, same
--inputborder, same radius — instead of floating chips in a recessed track. Engaged uses the app's one selection surface,bg-state-active(the sameCONTEXT_SELECTION_SURFACE_CLASSbehind selected sidebar rows, active tab pills, and focused split panes). Icon buttons carry no resting fill, which let a hardcoded background come offResourceTemplateBrowseCard.Sort triggers are
ArrowUpDownon all three pages; Automations previously swapped in a direction-flipping arrow.Layout
Every band — description, tabs, toolbar, results, footer — carries the same
pr-1scrollbar gutter, so they share one content width. Previously the description was capped atmax-w-2xland insetpx-1, and the toolbar ran 4px wider than the results.The Automations prompt footer now sits inside the box while editing, matching read-only geometry; it used to float below on
mt-1.Behavior change worth flagging
The Skills library now opens unfiltered (142 skills) rather than pre-filtered to bb Official (3). That follows from "nothing selected means all types", but it is the one user-visible behavior change here.
Verification
turbo run test --filter=@bb/app— 312 files / 2347 tests passturbo run typecheck— clean for@bb/app,@bb/shared-ui,bb-plugin-automationscontrol-weightstory, and the Nord palette checked viabb theme set nordto confirm the--canvas/--ink-derived tokens tint correctly🤖 Generated with Claude Code