Repository navigation
feat(cmux-next): Chrome's menu for several selected sidebar workspaces - #23110
Conversation
Right-clicking one of several selected rows shows Chrome's menu for several tabs: New Workspace Below, Add to New Group, Duplicate, Move, Pin, Mute, Close, Close Other, Close Below, Reopen Closed. Close Other and Close Below keep the whole selection, New Below goes under the last selected row, Mute and the color swatches act on every selected row, and Cmd-W in the sidebar closes the selection. A workspace group's Close reads Close All in Group. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by web and size checks: green |
|
Owned by projects-50 on cosmic-gray · session |
This comment has been minimized.
This comment has been minimized.
|
Bead |
…nguages Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray
…ts docs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray
|
Review (claude-review-subagent): SHIP at 23a57b0 No blockers. I read the code and traced it; I didn't build or run tests. What I checked
Nits (none block)
|
|
Tests at 23a57b0, run on the build fleet with
The review receipt is above. Merging. |
…guage (#23225) #23110's new strings (Close All in Group and the selection menu's titles) had only the 9 required locales, while the strings they replace had 21. Add bs, da, it, km, nb, pl, pt-BR, ru, th, tr, uk and vi, in the words the catalog already uses for tabs and workspaces. Also fix two comments #23110 left stale. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Shipped in:
|
Leo: "also idk what's going on with these new workspace deletions but it's really slow and it's missing a LOT... and it's also 2 lines tall for some reason" (closing several selected workspaces, #23110). Each selected row ran its own Close Workspace: its own question titled with its name (wraps on a long name, queued behind the others, Return does not confirm it), then its own serialized turn in the window's lane waiting for the daemon and the store. A selection now hides in one sidebar pass, asks one "Close N workspaces?" question, sends every close at once in one lane turn and offers "Closed N workspaces" with Undo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray
…ndo (#24341) * Test: closing 50 selected sidebar workspaces closes them all at once, with one undo A failing regression for Leo's report on #23110's multi-select close: each selected row runs its own Close Workspace, one serialized lane turn and one question at a time, with no "Closed N workspaces" undo toast. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray * Close a sidebar selection as one batch: one pass, one question, one undo Leo: "also idk what's going on with these new workspace deletions but it's really slow and it's missing a LOT... and it's also 2 lines tall for some reason" (closing several selected workspaces, #23110). Each selected row ran its own Close Workspace: its own question titled with its name (wraps on a long name, queued behind the others, Return does not confirm it), then its own serialized turn in the window's lane waiting for the daemon and the store. A selection now hides in one sidebar pass, asks one "Close N workspaces?" question, sends every close at once in one lane turn and offers "Closed N workspaces" with Undo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray * Selection close: end every hidden row, hold reservations until offline closes finish Review (Codex) findings on the batched selection close: - a row closed elsewhere while the question was up stayed hidden; - the row a window keeps could be closed again by Close Workspace; - an offline machine's close unhid before its store applied it; - Undo left out offline rows; - the running-program question asked each workspace's terminals one at a time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray * Selection close: release each row as it settles; Undo never waits for an offline machine Review (Codex) at eccb37a: a refused row stayed reserved until every offline close finished, and one paused machine held back Undo for the rows that had closed. Each row's reservation now ends when its own close settles; the toast shows once the live rows settle and is shown again in place as each offline row closes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray * Selection close: an offline close that ends after Undo no longer reoffers the toast Review (Codex) at 52e9596: Undo pressed before a paused machine's close finished left that close to show the toast again from undo state already used. Once Undo ran, a later offline close stays out of the toast; Reopen Closed Workspace and History still have it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray * Test: read the reopened workspaces on the main actor The nested reopened() helper was nonisolated and read main-actor store properties, so the CmuxNext test target did not compile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray * CI: start a cmux-next run (the run at 90ca309 hit startup_failure) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-74b7-74e2-a471-ad8e009b887f&host=cosmic-gray * cmux-next: move the selection batch close into CmuxNextAppCore so CmuxNextApp does not grow After the merge of the base, check-app-size refused this PR's 133 new CmuxNextApp source lines (SW14). The batch close flow now lives in CmuxNextAppCore (WorkspaceSelectionCloseFlow, injected closures as WorkspaceCloseFlow does), with only its wiring left in the App (WorkspaceSelectionClose). BulkClosePlan, DaemonService.servesBulkClose and the multi-workspace close (now WorkspaceClose.close(_ members:)) move to CmuxNextAppCore with it. InstantClose keeps one begin (a list of ids), the Undo hook is an `undone` argument of WorkspaceGroupClose.offerUndo, and Close Workspace's guard reads WorkspaceSelectionCloseFlow.canStart. No behavior change intended. CmuxNextApp: 107684 source lines vs 107685. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e6a8cd518b89570f9ff4 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Right-clicking one of several selected sidebar rows (Shift- or Cmd-click) now opens Chrome's menu for several tabs:
The color swatches in the header color every selected row.
What the verbs now do on a selection:
WorkspaceBulkClose, so they ask the same question and show the same "Closed N workspaces" toast with Undo as before.closesRowOnly, androwTargetsrespects that flag.sidebar.multiSelection, and it's a scoped default that sendscloseWorkspace. Anywhere else, or with one row selected, Cmd-W still closes the shown tab.A one-row menu keeps its layout, and Reopen Closed Workspace is added to its More ▸ Close section.
A workspace group's menu and its editor now say "Close All in Group" instead of "Close Group". Tab and screen groups keep "Close Group".
#21835 (another lane) makes Close Workspaces on a selection one action, with "Close N Workspaces", one question and one Undo. This PR doesn't touch that path. Both PRs edit
WorkspaceBulkClose.plan, but in different hunks.The menu is a native NSMenu. The webview gallery can't draw it, and a tour's window snapshot doesn't include a menu, so this PR adds no gallery entry; the tests below check the menu's rows instead.
The new strings are translated into all nine languages.
localization_catalog.py checkreports no errors for the new keys; its other errors areneeds_reviewstates that are also present on base.Tests added (not yet run; they run in CI):
ContextMenuEssentialsTests: the selection menu's row order and its 12-row cap, the rows that live in More, the one-row menu's Reopen Closed, and the selection titles.SidebarSelectionVerbsMenuTests:WorkspaceBulkClose.keepingfor Other, Below and Above; thesidebar.multiSelectionkey context; and how Cmd-W resolves with and without a multi-selection.Changelog
Agent session: cosmic-gray
🤖 Generated with Claude Code