Repository navigation
feat(sidebar): show inner tabs in workspace hover - #24785
teamleaderleo wants to merge 43 commits into
Conversation
|
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)
Passes: CI passes on CI passes on Written by web and size checks: green Default changesThis pull request changes 7 defaults at
Needs a review. It passes with an independent review receipt on this commit: a comment or review whose first line is Regenerate the snapshot with |
|
Bead |
|
Found 4 test failures on Blacksmith runners: Failures
|
408d7fd to
d8a092d
Compare
d8a092d to
14e92eb
Compare
14e92eb to
1ae5728
Compare
1ae5728 to
f733a49
Compare
f733a49 to
6a8aaed
Compare
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
6a8aaed to
cb8f8bd
Compare
920ac09 to
64efd77
Compare
Sidebar-Look: no visual change; regression coverage for Leo’s workspace preview gap. Agent-Session: https://cmux.com/deeplink/agent?id=aid-f0e2e06c2fc61fa2b914
Sidebar-Look: Leo: "the gap between the hover preview and ... the workspace sidebar element thingy". Touch the row before the drag-out thumb; snap inward so fractional edges leave no seam. Agent-Session: https://cmux.com/deeplink/agent?id=aid-f0e2e06c2fc61fa2b914
# Conflicts: # plans/cmux-next/sidebar-owner.md
|
Review (codex gpt-6.1-sol high, next-review): SHIP at 9137768 No blocking findings. |
…ount the inner-tab gallery cards SidebarHoverCardEscapeTests.theCardFollowsTheHoverToTheNextRow failed by 9 pt on display workers: with no scroll view the list sizes itself to its rows (124 pt) at the window's bottom, so the third row's top sat 68 pt above the window's bottom and its 77 pt inner-tab card was clamped up to the window edge (card 100-177, row top 168). The fixture now puts the rows at the window's top, which is the room its comment meant to give. HoverCardSharedRowsTests expected six workspace gallery cards; this PR adds the five inner-tab cards, so the gallery has eleven. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
…261024' into h13/sidebar-hover-fix
|
Independent review (gpt-6.1-sol high) at 22bd712: BLOCK.
|
|
Review (codex gpt-6-astra high, next-review): SHIP at f9554b1 No blocking findings. |
…-hover-fix # Conflicts: # plans/cmux-next/sidebar-owner.md
|
Review (codex gpt-6.1-sol high, next-review): SHIP at 30eaf59 No blocking findings. |
The settings schema export (scripts/cmux-next/regenerate-settings-exports.sh on the fleet at 6551871, applied with pr-autofix-apply.sh --changed) adds the surfaces block of sidebar.hoverCards.richDetails and base's sidebar.textSize, with the MDM docs that follow the schema; web/data/next-docs/settings-reference.generated.json comes from bun web/scripts/export-next-docs.ts. The defaults snapshot stays the base autofix's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
…-hover-fix # Conflicts: # schemas/settings/settings-schema.json # web/data/next-docs/settings-reference.generated.json
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
scripts/cmux-next/regenerate-settings-exports.sh on the fleet at d24023e (applied with pr-autofix-apply.sh --changed) lists sidebar.hoverCards.richDetails in the Sidebar group, as the generator writes it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
…ture tour WorkspaceTabHoverCardContrastTests fails before the fix: the card's paths draw in the tertiary text token, washed out next to the rich card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
The paths used the tertiary token (#808080 in a dark theme), which read as washed-out grey on the dark glass next to the rich card, whose facts use secondary text. WorkspaceTabHoverCardContrastTests was red before this on the fleet (path ink 0.29 vs the 0.32 floor; token #808080 vs #A1A1A1). The capture tour takes window stills only (no whole-display shots). Sidebar-Look: review of #24785: "the dark inner-tab hover card's titles and paths are washed-out grey on the glass" Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
…-hover-fix # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Schema/SettingsSchema+AgentPolicy.swift # plans/cmux-next/sidebar-owner.md
Fleet step 14ec68f9 regenerated them at 66a8297; the snapshot matches its patch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
…ooser Fleet step de3960c6 (regenerate-settings-exports.sh at 27da5cf) wrote them; base had not regenerated them yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
|
Review (codex gpt-6.1-sol xhigh, next-review): SHIP at ffa9106 SHIP at ffa9106 Visual verdict: after light/dark cards fit beside the sidebar with readable text and no off-screen layout.
Follow-ups:
|
|
Closing: this change landed on feat-cmux-next as #28897 (carry of #28139, which carries this PR's commits with their authorship), merged 2026-10-31 12:55Z. Merging base into this branch would only conflict with its own landed copy. Still open from this PR's review: the dark-mode inner-tab hover card draws titles and paths in washed-out grey on the glass, and the after captures never showed the card itself. Those go to a follow-up on the landed code. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Summary
Workspace hover cards now open a compact, Rex-style inner-tab popover for every non-empty workspace. The header names the workspace; each tab row shows its icon, title, abbreviated cwd, existing status indicator and status word. Rows select the workspace and tab on mouse release, close the card, and support Up/Down plus Return from the card's keyboard monitor. The card stays interactive while the pointer crosses into it.
Leo asked for this directly on 2026-10-24:
The existing prompt, needs-input and workspace-facts card remains intact behind the new
sidebar.hoverCards.richDetailssetting, which is off by default. This matches the private Rex density while keeping cmux glass, colors and typography; the private reference image is not included here. The change does not touch Lawrence's rail placement or Chief sidebar code.Scope: the change is one interaction plus its settings/export/test surfaces. The raw diff exceeds 800 lines because 262 lines are the two localized setting strings and 91 lines are fleet-generated exports; splitting the compact body from keyboard/click routing would leave a partial interaction.
Risk: the shared hover-card coordinator now permits mouse events for this one interactive body and consumes its arrow/Return keys. Events outside the card still dismiss and pass through, and the rich card continues through its existing path. Empty workspaces have no tab popover and therefore do not show a hover card in the default mode.
Stale-press repair — 2026-10-29
At
1ad21a369b, each reusable hover-card row captures itsTabIDon mouse-down, clears the press onconfigure, and only activates on release when the captured ID still matches the current row.aPressedRowCannotSelectAReusedRowAfterItsTabChangespresses the first tab, reconfigures the row as the replacement tab, releases, and proves no replacement tab is selected. Swift syntax and the prepush gate pass; no duplicate native job was dispatched.Current integration — 2026-10-29
Current head
46fc445c34mergesfeat-cmux-nextataff72f12bdinto the stale-press repair at1ad21a369b. The only conflict in this merge wasschemas/defaults/cmux-next.json; regenerating the snapshot preserves every current-base default and adds the default-offsidebar.hoverCards.richDetailssetting with fresh source fingerprints. Prepush gate, Swift syntax for the 20 changed files, defaults freshness and diff checks pass. No duplicate native job was dispatched.Dependency: #26942 remains the only external dependency. Its drawn workspace-fill/pinned-pill anchors, inward snapping, no-gap geometry and both sidebar-owner notes are retained alongside the current base's anchor behavior. The per-tab hover content and stale-press fix are unchanged by this merge.
Prior native evidence is tied to its original head: at
d1ee8995ea, the app compile passed, 38 tests passed across eight focused suites, and GUI retry95a9bed132d925513c2f1773passed all five keyboard/card tests. These receipts do not establish native validation of the new merge head.Testing
python3 scripts/cmux-next/prepush-gate.pypassed.71ce4d6c3bpassed (jobedb49ba8a54e6c042b549101); later changes only complete settings translations and strengthen the interaction capture tour.WorkspaceTabHoverCardTestsfor tab line projection, single-tab behavior, arrow navigation, Return focus, release-click and pointer transfer;SidebarTabMappingTestscovers per-tab cwd and status mapping. Six focused native suites ran at85c2c9a2a8: mapping, dwell, scroll and pinned-row suites passed. The new keyboard fixture failed before establishing its synthetic window/hover target; repaired at924d3e77aeand all 5 tests passed on the fleet (job48d5375b7ce0bee70fd438ae, exit 0). Its test now requires the visible native window, a registered hover source, a shown target and an event associated with that same window before testing key consumption. The row escape tests now preserve S2’s flush anchor geometry.webviewsfull check passed on Linux (job5096b7a0036307e3dbe2a4ec): formatting, lint, typecheck, browser-lane and protocol checks.e275db3f69, retaining Lawrence’s geometry and pinned-row hover lookup. The card reuses the current per-tab folder/state projection. Fleet export job7d423c7c3850d3db326334acpassed all 9 settings/MDM export tests; the exact generated schema, MDM docs, settings reference and default snapshot are committed at71ce4d6c3b.defaults_guard.py check-freshpasses. Repeating regeneration at85c2c9a2a8passed all 9 tests with exit 0 and no changed export; the empty patch upload failed separately with cache HTTP 400. Current base derives the source stamp instead of committing it, so the retired stamp is not restored.Changelog
Added: Workspace hover cards show selectable inner tabs with per-tab status and cwd.
Proof
Real hover, after (
cmux-ci captureat4df66d7983, fleet build, capture mini at 2x, tourworkspace-hover-tabs-card): a workspace with three terminal tabs, the pointer on its sidebar row, and the inner-tab card shown over the sidebar. Synthetic data only: the tabs are plain shells in/tmp, so each title repeats its path (the shell's own title). Cropped to the card with its row for context.Same hover before the contrast fix (at
e2a0a93d99, same tour). The paths drew in the tertiary text token (#808080 in this dark theme) and read as washed-out grey on the glass.Interaction proof (earlier head
85c2c9a2a8, unchanged interaction code): hover, enter the card, click a different tab; the card closes after selection. GIF, video.Base (
46e3205f42, no inner-tab card): light, dark.Dark text contrast fix
Each inner-tab row's path now uses the theme's secondary text token, the same token the rich card uses for its facts. Titles stay primary.
WorkspaceTabHoverCardContrastTestspins both the tokens and the rendered ink in a dark theme against the rich card's title:473667b61con the fleet (gui-session-v1): path token #808080 instead of #A1A1A1, and path ink 0.289 against a floor of 0.323. The titles already matched the rich card's title (ink 0.717).4df66d7983, together with the nine hover suites (10 of 10 passed, fleet stepa67f5e08).Checklist
scripts/localize-changes.46fc445c34. Native receipts and captures above retain their original heads; no new native run or capture is claimed for this merge.Visual review
Viewed after image: yes
Visual verdict: Ship, because the after stills show the real inner-tab card over the hovered sidebar row in light and dark with bright titles and paths that now read clearly in secondary grey on the dark glass, no repeated per-row controls and a card that fits beside the sidebar, so it sits fine next to ChatGPT or Claude.
Agent session: agent session