Skip to content

Separate Automations from Extensions - #888

Draft
brsbl wants to merge 14 commits into
mainfrom
agent/tools-hub-schedules
Draft

Separate Automations from Extensions#888
brsbl wants to merge 14 commits into
mainfrom
agent/tools-hub-schedules

Conversation

@brsbl

@brsbl brsbl commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

What

  • Rename the experiment-gated management surface to Extensions and keep only Skills and Plugins inside it.
  • Keep the existing Automations product name and move its plugin-owned page beside Threads at /plugins/automations/automations.
  • Group every plugin-contributed nav page under a first-level Plugins sidebar section. The group shares the main sidebar scroll, is hidden when empty, shows all contributed pages, and persists its collapsed state.
  • Redirect legacy /tools/automations and /automations collection, browse, detail, and edit URLs to the canonical Automations plugin routes.
  • Clarify plugin detail pages:
    • Put Release directly below About, and make it a quiet metadata run instead of a bordered fact table.
    • Lift Compatibility out of the fact list into a warning-toned row with its own details action, so an exceptional blocked update does not read as another fact.
    • Widen the page and render Includes as a single ResourceDetailCollection — one surface, with each capability category as a quiet row-group header over its items.
    • Lay out each item as name plus description on one baseline, so long ids and long summaries wrap as a hanging definition instead of stranding text mid-row.
    • Give Activity the same row-group language, so the two neighbouring sections read as one list vocabulary instead of two.
    • Separate runtime Activity into plugin health, background services, scheduled jobs, and handler errors, with visible status text and leading status icons.
  • Add production-backed Automations overview, browse, state, and detail stories.
  • Reorganize the Sidebar stories so Plugin pages and Extensions are focused, non-overlapping stories.
  • Isolate plugin-detail story fixtures and seed Release metadata locally so the story does not depend on backend plugin-source requests.
  • Cover the Release states that previously had no story: bundled, update available, update failed, and compatibility blocked.

Why

Extensions is the management surface for skills and plugin installations. Plugin-contributed working pages are a different kind of navigation: they belong beside Threads, under an explicit Plugins group that can grow without crowding fixed sidebar chrome. Automations remains a familiar user-facing concept while moving out of the management hub.

Plugin details now distinguish two questions that the previous page mixed together: Includes explains what the plugin adds for the user, while Activity explains whether its background work is healthy or needs attention.

Includes had been reaching for a bespoke card per category. ResourceDetailCollection already exists for exactly this — its own contract names capabilities as a use case and says the section supplies the hierarchy "without introducing another card" — and skill Files, automation Run history, and Activity all already use it. A per-category panel drew a border around what is usually a single row, so Includes read as a stack of unrelated objects while Activity, directly below it, read as a list. Categories are now row groups inside one collection: Includes drops from 739px to 432px and the page goes from eight bordered surfaces to two. Release had the same problem in miniature — a bordered grid with filled label cells for one or two short scalars, heavier than the About paragraph above it while mattering less.

Compatibility and constraints

  • experiments.toolsHub remains default-off and gates Extensions only. Automations and other registered plugin pages remain available in the Plugins section in either experiment state.
  • Existing automation storage, RPC contracts, realtime channels, plugin ID, CLI command, and public name remain unchanged.
  • Legacy automation URLs preserve collection mode and resource identity through redirects.
  • The detail-page recipe contract remains enforced with the updated Release order.
  • Exact public exports remain 69 shared resource-list exports, 21 SkillsView exports, and 3 ToolsView exports.
  • ResourceDetailFacts/ResourceDetailFact keep their names and their two call sites; the redesign removed the unused action and details props rather than adding a variant with a dead branch.
  • detail-page-recipes.test.tsx is untouched. ToolsView.plugin-detail.test.tsx still pins the capability-group count and every item-to-heading binding; only the three assertions that required per-group card chrome changed, and they now assert the single collection surface instead.

Validation

Under Node 22 (v22.22.1):

  • pnpm exec turbo run build typecheck lint — 68/68 tasks passed.
  • pnpm exec turbo run test --filter=@bb/app --filter=@bb/shared-ui --filter=bb-plugin-automations --force — @bb/app 295 files and 2,144 tests passed, with @bb/shared-ui and bb-plugin-automations green.
  • Focused contract coverage — ToolsView.plugin-detail, detail-page-recipes, tools-public-exports, and PluginUpdatesCard: 27/27 passed.

Screenshot review in Ladle, driven headlessly over CDP against the real story:

  • extensions--plugin-detail-states at 420, 480, 620, 900, and 1600px, in light and dark, in both fullscreen preview and normal Ladle chrome.
  • Full, Minimal, Disabled, Unhealthy, App surfaces, Awkward content, Bundled, Update available, Update failed, Compatibility blocked, Route loading, Route not found, and Route failed.
  • Measured rather than eyeballed: Includes section 739px → 432px, Activity 489px → 416px, Release section 163px → 119px, and bordered surfaces on a fully populated page 8 → 2.
  • No horizontal overflow at any of those widths, and no failed requests, non-2xx responses, or console errors on story load.

@brsbl brsbl changed the title Move schedules beside Plugins & Skills Separate Automations from Extensions Jul 29, 2026
brsbl added 11 commits July 29, 2026 00:22
The previous Includes layout kept a full-width header band above each
card's items, so every capability spent most of its height and 60-66% of
its width on category chrome: a 115px card carried one 44px item, and the
label/detail grid left both texts floating in whitespace.

Give each card an internal horizontal split instead. The category becomes
a fixed left rail — a label on the card's axis, not a peer of its contents
— and the width that used to be dead space becomes the item column, with a
rule anchoring it. Items lay out as label plus detail on one baseline, so
long ids and long summaries wrap as a hanging definition rather than
stranding text mid-row. Cards fall to 60px and Includes to 478px from
739px, and the rail stacks above the items below `sm` where there is no
horizontal space to use.

Release carried the same problem: a bordered fact table with filled label
cells for one or two short scalars. Facts now read as a quiet metadata run
with no surface of their own. Compatibility leaves that run entirely — it
is a blocked update the user may need to act on, not a peer fact — and
keeps a warning tone, an icon, and its own details action.

Category glosses are tightened to fit the rail without wrapping, which is
what lets the cards be short; they still say what the capability adds and
where it is encountered.

Also cover the Release states that had no story at all: bundled, update
available, update failed, and compatibility blocked. Each carries its own
plugin id so the seeded source query serves it without a backend request.

Validation under Node 22: `turbo run build typecheck lint` 68/68; @bb/app
295 files / 2144 tests, plus @bb/shared-ui and bb-plugin-automations.
Reviewed in Ladle at 420/480/620/900/1600px, light and dark, with no
horizontal overflow and no failed requests or console errors.
Includes was reaching for a bespoke card per capability category, which is
the thing shared-ui already has a primitive for. `ResourceDetailCollection`
names capabilities in its own contract and says the section supplies the
hierarchy "without introducing another card", and skill Files, automation
Run history, and Activity all already use it. Includes was the only
holdout, which is why it read as a stack of unrelated objects while
Activity — directly below it on the same page — read as a list.

A category is a label on a run of rows, not an object. Wrapping each one in
its own bordered panel drew a box around what is usually a single row, and
the per-category gloss under it was boilerplate that repeated what the
category name already said. Categories are now quiet row-group headers
inside one collection, and the glosses are gone.

Activity gets the same row-group language and loses its own four lines of
boilerplate, so the two neighbouring sections stop looking like two
different products.

Includes 739px → 432px, Activity 489px → 416px, and a fully populated page
drops from eight bordered surfaces to two. The bespoke `sm:` grid is gone
too — a list reflows on its own, so narrow widths need no special case.

`detail-page-recipes.test.tsx` is untouched, and the capability-group count
and item-to-heading bindings still hold. Only the three assertions that
required per-group card chrome changed; they now assert the single
collection surface instead.

Validation under Node 22: `turbo run build typecheck lint` 68/68; @bb/app
295 files, @bb/shared-ui, and bb-plugin-automations green; focused
contract tests 27/27. Reviewed in Ladle at 560/1600px, light and dark.
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