Skip to content

GitHub plugin: a PR inbox that says what each pull request needs next, and hands it to an agent #5867

Description

@alexandre-vl

The workflow

I run several agents in parallel; each one opens a pull request. Several times a day I open the GitHub panel to answer one question: which pull requests need me, and for what — a merge, a failing check, a conflict, a draft to finish — and then hand the work back to an agent.

What happens today

On bb 0.46.1 (GitHub plugin 0.2.1), with get-bb/bb itself tracked, the Pull requests tab shows 50 rows that all read open with a Review button. GitHub's own data for the same 50 (snapshot 2026-10-20 16:33 UTC) says:

None of that is on the row, so I open each pull request, or GitHub, to find it. The list query asks for number title state author labels assignees url body updatedAt only (listFields); getPull already asks for isDraft, headRefName, baseRefName, mergeStateStatus and statusCheckRollup, for the detail view (server.ts#L1227-L1232, draft label).

Same public data on both sides; the right column is the prototype below.

Today (plugin 0.2.1)Proposal (prototype)
List
Pull request with 2 failing checks (#5849)
Phone, list
Phone, pull request
Dark

What you would expect

Clickable prototype: https://alexandre-vl.github.io/bb/prototype/ — one HTML file, built on the snapshot above; agents and their threads are simulated. Press ? for shortcuts.

  • Inbox by whose move. Rows are grouped by what the pull request needs next (Your move, Ready to merge, Needs fixing, In progress, Drafts), with one status glyph in bb's own PR vocabulary (assemblePullRequestAttention, pull-request-display.ts) and the reason as a plain second line: #5849 · 2 checks failing, #5760 · 23 checks passed · stacked on #5756.
  • One next-step card on the pull request. Failing check names with their logs and Fix with an agent; Resolve with an agent on conflicts; Merge when green; Mark ready / Finish with an agent on drafts. While an agent works or waits for an answer, the card says so and takes the reply.
  • Agents launch from bb's own composer. Fix with an agent opens experimental_NewThreadComposer prefilled with a prompt and the PR branch; the spawned thread is recorded as linked to the pull request (covers GitHub plugin: picking a PR in the thread sidebar should persist the thread↔PR link #4509).
  • bb's kit, not a web table. Inter 13/12, three inks, hue only on the status glyph, state-hover / state-active, 32px buttons, Hugeicons through experimental_Icon, a bottom drawer under 768px, and J/K, X to select, A for an agent, M to merge.
  • Ambient surfaces. A status glyph on linked thread rows (experimental_setThreadRowStatus), a header control on threads whose pull request bb cannot infer (experimental_threadHeaderAction), palette commands (app.commands.register), a homepage section.
More states from the prototype
An agent fixing the checks (#5835) Ready, reviewed by an agent (#5856)
An agent waiting for an answer (#5563) Fix with an agent, prefilled

Context and alternatives

Checks

  • I searched open and closed issues for the same request.
  • If an agent wrote this, the body ends with > AGENT GENERATED.

AGENT GENERATED

Activity

  1. alexandre-vl commented on Oct 20, 2026

    @alexandre-vl
    ContributorAuthor

    A first slice — list data and inbox grouping — is implemented on my fork, ready to retarget here after sign-off: alexandre-vl#1 (diff against main).

    • Typecheck, lint, 54 tests and scripts/check-plugin-forks.mjs pass.
    • On get-bb/bb the list request costs 6 GraphQL points instead of 5, still one request per repository per sweep.
    • bb github prs prints the same next step; --json adds nextStep and pr.

    AGENT GENERATED

  2. alexandre-vl commented on Oct 20, 2026

    @alexandre-vl
    ContributorAuthor

    Prototype update, same link: https://alexandre-vl.github.io/bb/prototype/. Menus now open at their trigger, and every read and write has a loading state you can watch.

    Menus open at their trigger

    Two menus were misplaced. The reply target menu was laid out inside the composer and made it taller. The display menu opened at the window's right edge, over the pull request.

    BeforeAfter
    Reply target (#5849)
    Display menu
    Display menu, phone
    • Every menu opens 4 px from its button and lines up with the button's edge: display, reply target, the row ⋮ menu, snooze, and the thread header chip. Near a screen edge, a menu flips to the other side or is clamped to stay on screen. The composer keeps its height.
    • When the panel is narrower than 560 px, a menu opens as a bottom drawer over a scrim.
    • Dialogs no longer replay their entrance animation when the list re-renders behind them.

    Loading

    Reads and writes now take time in the prototype, so each loading state can be seen. The prototype adds none of its own loading patterns: each state uses something bb already ships.

    First load, then a refresh

    The recording: first load, then Refresh. The agent fixing #5835's checks has finished, so its row moves into Ready to merge.

    When What you see From bb
    First load Nothing for 200 ms. Then skeleton rows at the real row and group heights, which fade out over the loaded rows. DelayedLoading, Skeleton, stable dimensions, abstract bars
    Opening a pull request The header appears at once, from the list row. Activity, Files and Checks each show a skeleton until their own request returns, and are cached after that. preserve panel geometry
    Refresh The rows stay. A 2 px indeterminate bar runs under the header, and Refresh spins and is disabled. A row whose state changed slides to its new group and flashes. route navigation indicator
    Merge A loading toast, which becomes the success or error toast. The row shows a spinner and Merging into main… with the shine bb uses for Checks running. appToast.loading, then the same id, running: true, animate-shine
    Launch an agent, re-run checks The button is disabled, marked aria-busy, and shows a spinner. Re-run checks then tick through live. pending control
    Reply, mark ready, snooze Applied at once. A reply reads sending…; if it fails, it reads couldn't send and offers Retry. optimistic send
    Offline Can't reach GitHub with Try again. With rows already on screen, a banner says they come from the last sync. The list reloads when the connection returns. —

    To try it, use the bar above the prototype: Replay loading empties the cache and loads everything again, Slow network makes every request about 3× slower, and Offline makes every request fail. #net=slow and #net=offline open the prototype in those modes.

    The prototype departs from bb in one place. Skeleton has no exit transition, so in bb the content replaces it in a single frame. The prototype instead fades the skeleton out over 150 ms, above rows that are already laid out; drop that if you prefer bb's swap. With reduced motion, spinners and skeletons stand still and rows don't slide.

    Each loading state
    First load, 650 ms in Opening #5839
    Merging #5856 Refresh in flight
    After the refresh Offline
    Phone, first load

    AGENT GENERATED

  3. alexandre-vl commented on Oct 20, 2026

    @alexandre-vl
    ContributorAuthor

    Prototype update, same link: https://alexandre-vl.github.io/bb/prototype/#pr=5849. The pull request status is now a menu, and the diff stat uses bb's own colours.

    The status is a menu

    Today the status pill only labels the pull request, so changing the status means going to GitHub. In the prototype, clicking the pill or pressing S lists the four states and what picking each one does.

    Picking Draft from the status menu of #5849

    Picking Draft on #5849: the pill spins, the toast resolves with Undo, and Activity records the change.

    Before After
    The status menu on #5849 After choosing Closed

    On a phone the status menu is a bottom drawer

    On a phone the menu is a bottom drawer.

    • Draft and Open (ready for review) behave like core's own buttons for a thread's pull request: a pending state, then a loading toast that becomes the success toast (handlers, banner buttons). Here the pill shows the spinner, and the success toast offers Undo.
    • Merged opens the merge dialog when GitHub can merge the pull request. Otherwise it stays disabled and says why: 2 checks failing, Conflicts with main, Mark it ready first.
    • Closed asks for a second click within 3 s. The pull request then leaves the inbox, its next-step card offers Reopen, and it moves to a collapsed Closed group under All.
    • Each change is recorded in the Activity timeline, and the row moves if its group changes. Offline, the change fails with an error toast and nothing moves.
    • The icon and colour for each state come from core's PULL_REQUEST_STATE_DISPLAY. Merged pull requests keep a static pill.

    For any listed pull request, the plugin would call GitHub's markPullRequestReadyForReview, convertPullRequestToDraft, closePullRequest and reopenPullRequest. It would offer each state only when the pull request reports viewerCanUpdate, viewerCanClose or viewerCanReopen.

    Diff stat and branch

    • +74 -14 takes the text-diff-added / text-diff-removed colours from DiffStatsTally and the five blocks from DiffSizeBar. Clicking it opens the Files tab. Rows (Show on rows → Changes) and the Files tab use the same colours.
    • The head branch is a copy chip: clicking it copies the name, and its icon turns into a check for 1.6 s.

    Smaller fixes

    • Mark ready and Convert to draft in the row menu used to only show a toast. They now change the pull request, and the menu has Change status… (S).
    • Arrow keys, Home and End move through every menu. Before, the arrows moved the list selection behind an open menu. Esc on the status menu returns focus to the pill.

    AGENT GENERATED

  4. added
    uiApp shell, sidebar, composer, rendering
    githubBuilt-in plugin: github
    on Oct 20, 2026
  5. bb-slop-cop commented on Oct 20, 2026

    @bb-slop-cop
    Contributor

    🚨 SLOP COP 🚨 · new-issue-autopilot

    Applied missing classification: Type: Feature · Priority: Medium · Effort: High. Added labels: ui, github. No existing classification values or labels were replaced; all writes were verified.

    This adds a PR inbox and agent-handoff workflow rather than correcting a single unexpected behavior. Existing detail views and GitHub provide workarounds; the proposed grouping, actions, thread linkage, and ambient surfaces require substantial interaction design and integration.

    No reproduction report or pull request: this is a feature request requiring product/design decisions, outside the bug-only fix path.

    AGENT GENERATED

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    githubBuilt-in plugin: githubuiApp shell, sidebar, composer, rendering

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions