Skip to content

feat: configurable sidebar position - #4826

Closed
austinywang wants to merge 22 commits into
mainfrom
issue-2919-feat-configurable-sidebar-position-top
Closed

austinywang wants to merge 22 commits into
mainfrom
issue-2919-feat-configurable-sidebar-position-top

Conversation

@austinywang

@austinywang austinywang commented May 26, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • add sidebar.position config support for left, top, right, and bottom
  • render top/bottom positions as a horizontal workspace tab strip while preserving the existing left sidebar default
  • document the setting and add it to the config schema/search-path support

Testing

  • git diff --check
  • scripts/check-pbxproj.sh
  • plutil -lint cmux.xcodeproj/project.pbxproj
  • JSON parse and locale coverage checks for web/data/cmux.schema.json and all web/messages/*.json

Local builds/tests were not run per workspace instruction. Launch verification is intentionally deferred until the maintainer requests the required tagged command:
CMUX_SKIP_ZIG_BUILD=1 ./scripts/reload.sh --tag issue-2919-feat-configurable-sidebar-position-top --launch

Demo Video

Not included yet. This PR changes macOS app layout, and the requested local dev launch must wait for explicit maintainer approval before recording or manual inspection.

Review Trigger

Pushed the latest fixes to origin/issue-2919-feat-configurable-sidebar-position-top; GitHub checks and configured review bots are triggered from the branch update. If CodeRabbit is rate-limited, re-run with @coderabbitai review after quota resets.

Closes #2919


Note

Medium Risk
Touches main window layout, sidebar resizing, and portal geometry sync; broad surface area but localized to sidebar chrome with tests for import and layout policy.

Overview
Adds sidebar.position (left | top | right | bottom) so the workspace sidebar can sit on any window edge; default remains left.

Top/bottom use a new HorizontalTabsSidebar (scrollable workspace tabs with groups, unread, multi-select, close/new/toggle) instead of the vertical sidebar. ContentView picks layout via SidebarContentLayoutPolicy (left overlay/stack, right stack, top/bottom VStack) and reacts when the setting changes (geometry, traffic lights, width clamps).

Right placement updates divider hit-testing, resizer edge/drag direction, and right file-explorer width so it does not overlap the workspace sidebar. Horizontal bars skip the vertical resize band. Setting is wired through JSON/JSONPath, settings template, schema, docs, locales, and tests.

Reviewed by Cursor Bugbot for commit 9597bbc. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Adds a configurable sidebar.position so the workspace sidebar can sit on any edge. Top/bottom render a horizontal tab strip; layout, resizers, and the right explorer adapt. Default stays left.

  • New Features

    • Added sidebar.position (left | top | right | bottom) with schema, docs, locales, settings template, settings search anchor, JSON import, and tests.
    • Implemented HorizontalTabsSidebar for top/bottom: groups-aware tabs with multi/range select, unread badges, pin/close, keyboard hints, auto-scroll to selection, toggle-sidebar/new-workspace, copy workspace ID; driven by a centralized render model.
    • Introduced SidebarContentLayoutPolicy and modes: left overlay/stack, right stack, top/bottom stacks; right sidebar available width accounts for a right-positioned workspace sidebar; horizontal bars skip the resizer band.
  • Bug Fixes

    • Kept the right explorer clear of a right-positioned sidebar via normalized available width and divider X; reversed drag direction on right; updated resizer overlay/hit-testing; clamped widths on position/setting changes.
    • Stabilized horizontal tab selection with a reconciliation policy aligned to rendered order and range anchor; refreshed tab actions; pinned tabs stay closeable.
    • Marked the sidebar font size loader as concurrent to silence Swift 6.2 warnings.

Written for commit a12deb3. Summary will update on new commits.

Review in cubic


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag @codesmith with what you need. Autofix is disabled.

Summary by CodeRabbit

  • New Features

    • Configure sidebar position: left, top, right, or bottom
    • Horizontal workspace tabs when sidebar is top or bottom
    • Improved sidebar resizing, right-sidebar width policy and divider behavior
  • Settings & Persistence

    • Sidebar position persists in settings and is importable from config files
  • Documentation

    • Added configuration guide and example for sidebar.position
  • Tests

    • New tests covering sidebar-position import, layout policy, and search indexing

@vercel

vercel Bot commented May 26, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jun 18, 2026 8:07pm
cmux-staging Building Building Preview, Comment Jun 18, 2026 8:07pm

@coderabbitai

coderabbitai Bot commented May 26, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a configurable sidebar.position setting (left/top/right/bottom), layout policy and storage, ContentView composition and resize/divider logic updates, a horizontal workspace tabs sidebar for top/bottom placement, settings parsing/template/schema/docs updates, unit tests, and project wiring for the new component.

Changes

Sidebar Position Configuration and Layout

Layer / File(s) Summary
Sidebar Position Model and Layout Policy
Sources/Sidebar/SidebarState.swift, cmuxTests/SidebarWidthPolicyTests.swift
SidebarPositionOption enum with orientation helpers; SidebarPositionSettings persistence and default resolution; SidebarContentLayoutMode and SidebarContentLayoutPolicy compute layout mode and right-sidebar available width.
Settings Storage, Parsing, and Navigation
Sources/CmuxSettingsJSONPathSupport.swift, Sources/KeyboardShortcutSettingsFileStore+Template.swift, Sources/KeyboardShortcutSettingsFileStore.swift, Sources/SettingsNavigation.swift, cmuxTests/KeyboardShortcutSettingsFileStoreStartupTests.swift, cmuxTests/SettingsSearchIndexTests.swift
Adds sidebar.position to supported JSON paths and default template, parses sidebar.position into SidebarPositionSettings.key (ignoring invalid values), and maps the settings path to sidebar appearance anchor. Startup tests validate valid/invalid imports.
ContentView Position Storage and Layout Composition
Sources/ContentView.swift
Persists sidebarPositionRaw in @AppStorage, derives sidebarPosition, obtains layout mode via SidebarContentLayoutPolicy.mode(...), and restructures main layout to switch over layout modes with conditional horizontal panel insertion for top/bottom.
Width Computation and Sidebar Resizing
Sources/ContentView.swift
Right-sidebar width normalization uses layout policy available width; drag translation sign inverted for right-side resizing; divider X and hit-testing updated; resizer overlay edge/divider closure wired to position-aware helpers.
Horizontal Sidebar Panel and Layout Helpers
Sources/ContentView.swift
Backdrop and panel helpers accept optional size; adds horizontalSidebarPanelWithBackdrop(position:appearance:); wires horizontalSidebarView into ContentView with toggle/new-workspace bindings.
Horizontal Workspace Tabs Component
Sources/HorizontalTabsSidebar.swift, Sources/ContentView.swift
New HorizontalWorkspaceTabSnapshot and HorizontalTabsSidebar view: horizontally scrolling workspace tabs, auto-scroll to selection, modifier-aware multi-select, close flow, unread aggregation for groups, HorizontalWorkspaceTabItem UI with badge/pin/shortcut/hover-close/context menu.
State Update and Geometry Synchronization
Sources/ContentView.swift
Change handlers call right-sidebar clamping, portal geometry resync, resizer band state update, and traffic-light inset sync when relevant settings change.
Configuration Documentation and JSON Schema
docs/configuration.md, web/app/[locale]/docs/configuration/page.tsx, web/data/cmux.schema.json
Adds sidebar.position docs and example; web config template includes commented example; JSON schema adds sidebar.position enum with default "left" and description.
Project File Integration
cmux.xcodeproj/project.pbxproj
Adds HorizontalTabsSidebar.swift to project file references, source group, and build phase so it is compiled.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Poem

🐰 I nudged the sidebar left and right,
Top and bottom — what a sight!
Tabs that stretch across the sky,
A little hop, a playful try,
Workspaces lined up, snug and bright.


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (3 errors, 1 warning)

Check name Status Explanation Resolution
Cmux Algorithmic Complexity ❌ Error Line 49 onChange(snapshots.map(\.id)) rebuilds unbounded array per render; Line 183 firstIndex rescan per click; Line 87-95 O(n) compute property every render without caching. Cache snapshots with @State; use rendered indices for lookups; document size bounds or add memoization.
Cmux Swiftui State Layout ❌ Error New SidebarState class uses ObservableObject + @Published instead of modern @Observable macro, violating swiftui-state-layout.md rule for new cmux-owned SwiftUI state. Replace SidebarState with @Observable macro: change 'final class SidebarState: ObservableObject' to '@Observable final class SidebarState' and remove @Published annotations.
Cmux Architecture Rethink ❌ Error Selection indices use tabManager.tabs while rendering uses renderItems. canCloseWorkspace checks count vs policy, creating split ownership and representable bad states. Index off rendered snapshots; delegate canCloseWorkspace to tabManager.
Docstring Coverage ⚠️ Warning Docstring coverage is 2.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (14 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The implementation fully addresses issue #2919: adds sidebar.position config supporting left/top/right/bottom with left as default, renders top/bottom as horizontal tab strip, and includes settings parsing, schema, and documentation.
Out of Scope Changes check ✅ Passed All changes are scoped to the sidebar positioning feature: configuration files, UI components, layout policy, tests, and documentation are all directly related to #2919 requirements.
Cmux Swift Actor Isolation ✅ Passed New value enums have proper Swift 6 isolation; HorizontalTabsSidebar View properly uses @MainActor; does not worsen pre-existing isolation debt.
Cmux Swift Blocking Runtime ✅ Passed PR introduces no blocking/timing synchronization patterns. New files (HorizontalTabsSidebar.swift, SidebarState.swift) contain zero semaphores, locks, sleeps, or blocking waits.
Cmux No Hacky Sleeps ✅ Passed PR contains only Swift files and documentation; the single TypeScript file modified (page.tsx) adds a commented example to documentation without any sleep/delay/timer/polling patterns.
Cmux Swift Concurrency ✅ Passed PR does not introduce legacy async patterns per swift-concurrency-modernization.md. No background DispatchQueues, new Combine usage, completion handlers, or problematic Tasks found.
Cmux Swift @Concurrent ✅ Passed Sidebar position feature files contain no async functions. All new code in SidebarState.swift, HorizontalTabsSidebar.swift, SettingsNavigation.swift uses synchronous operations only.
Cmux Swift File And Package Boundaries ✅ Passed New files maintain single responsibility: HorizontalTabsSidebar (387 lines, UI), SidebarState (149 lines, models). ContentView adds 127 net lines, under 250-line threshold. No mixed responsibilities.
Cmux Swift Logging ✅ Passed No logging violations. New files have no logging. ContentView NSLog guarded with #if DEBUG. Settings parsing uses proper Logger with privacy redaction.
Cmux User-Facing Error Privacy ✅ Passed All logging properly hides sensitive data via privacy: .private(mask: .hash). UI strings are localized, documentation is generic, and no vendor/provider/credential/token details are exposed.
Cmux Full Internationalization ✅ Passed All 6 new user-facing text keys are fully localized with 19-locale translations. Config keys and docs use allowed exceptions. Pre-existing incomplete key not worsened by PR.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR adds sidebar position configuration without introducing new windows. HorizontalTabsSidebar is a View, not a Window/NSWindow/NSPanel. cmuxApp.swift unchanged.
Title check ✅ Passed The title 'feat: configurable sidebar position' directly and clearly summarizes the main change: adding configurability to the sidebar position across left, top, right, and bottom placements.
Description check ✅ Passed The PR description addresses most template requirements but lacks a demo video and defers local testing per workspace instructions.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-2919-feat-configurable-sidebar-position-top

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread Sources/ContentView.swift
Comment thread Sources/ContentView.swift Outdated
@greptile-apps

greptile-apps Bot commented May 26, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds sidebar.position (left | top | right | bottom) to the workspace sidebar with a new HorizontalTabsSidebar for top/bottom placement and a SidebarContentLayoutPolicy to drive layout-mode selection in ContentView. The right-position path reverses drag direction, updates divider hit-testing, and adjusts the file-explorer available-width calculation to avoid overlap; horizontal positions skip the vertical resizer band entirely.

  • New HorizontalTabsSidebar (451 lines, own file): groups-aware tab strip with range/multi-select, unread badges, pin/close, keyboard shortcuts, and auto-scroll to selected workspace; driven by a snapshot-based render model that eliminates partial-Equatable stale-closure issues from the previous review.
  • SidebarContentLayoutPolicy: maps position × withinWindowOverlay to one of five layout modes, with a dedicated rightSidebarAvailableWidth helper so the file explorer never overlaps a right-edge workspace sidebar.
  • Full locale coverage: all 19 app xcstrings locales and all 18 web/messages/ locales are updated; Swift string keys reused from the vertical sidebar context (all pre-existing in the catalog).

Confidence Score: 5/5

Safe to merge; layout, resizer, and width-accounting changes are well-scoped to sidebar chrome and do not touch terminal rendering or persistence paths.

All four position paths have corresponding layout branches, tests, and locale entries. Previous review findings are confirmed resolved. Swift string keys reused in HorizontalTabsSidebar were verified pre-existing in the full xcstrings catalog. No correctness issues found in drag-direction reversal, divider hit-testing, or file-explorer width accounting.

No files require special attention.

Important Files Changed

Filename Overview
Sources/HorizontalTabsSidebar.swift New 451-line file; well-structured render-model-driven rendering, proper range selection, pre-existing Swift string catalog keys reused throughout
Sources/ContentView.swift Adds sidebarPosition state, layout mode switch, right-drag reversal, divider hit-test update, and position-change onChange handler; all previous issues confirmed fixed
Sources/Sidebar/SidebarContentLayoutPolicy.swift New policy enum maps position x withinWindowOverlay to layout modes; rightSidebarAvailableWidth prevents file-explorer overlap; well-tested
Sources/KeyboardShortcutSettingsFileStore.swift Adds sidebar.position import with validation and logInvalid fallback; follows existing pattern
web/data/cmux.schema.json Adds sidebar.position with enum, default, and descriptionKey wired to every web locale

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[sidebarPositionRaw] --> B[SidebarPositionSettings.resolved]
    B --> C{SidebarPositionOption}
    C -->|left| D[SidebarContentLayoutPolicy.mode]
    C -->|right| D
    C -->|top| D
    C -->|bottom| D
    D -->|left+withinWindow| E[leftOverlay]
    D -->|left+stack| F[leftStack]
    D -->|right| G[rightStack]
    D -->|top| H[topStack]
    D -->|bottom| I[bottomStack]
    G --> J[drag reversed, dividerX=totalWidth-sidebarWidth]
    G --> K[rightSidebarAvailableWidth=totalWidth-workspaceSidebarWidth]
    H --> L[HorizontalTabsSidebar h=48pt]
    I --> L
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[sidebarPositionRaw] --> B[SidebarPositionSettings.resolved]
    B --> C{SidebarPositionOption}
    C -->|left| D[SidebarContentLayoutPolicy.mode]
    C -->|right| D
    C -->|top| D
    C -->|bottom| D
    D -->|left+withinWindow| E[leftOverlay]
    D -->|left+stack| F[leftStack]
    D -->|right| G[rightStack]
    D -->|top| H[topStack]
    D -->|bottom| I[bottomStack]
    G --> J[drag reversed, dividerX=totalWidth-sidebarWidth]
    G --> K[rightSidebarAvailableWidth=totalWidth-workspaceSidebarWidth]
    H --> L[HorizontalTabsSidebar h=48pt]
    I --> L
Loading

Reviews (11): Last reviewed commit: "fix: instantiate sidebar selection polic..." | Re-trigger Greptile

Comment thread Sources/ContentView.swift Outdated
Comment thread Sources/ContentView.swift Outdated
Comment thread Sources/Sidebar/SidebarState.swift Outdated
Comment thread Sources/ContentView.swift
Comment thread Sources/ContentView.swift
Comment thread Sources/ContentView.swift
Comment thread Sources/ContentView.swift

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit ee1a73d. Configure here.

Comment thread Sources/HorizontalTabsSidebar.swift

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/KeyboardShortcutSettingsFileStore.swift`:
- Around line 652-658: The current block only logs invalid values when the
string exists but doesn't map to SidebarPositionOption; if section["position"]
is present but not a string it silently ignores it. Update the logic around
jsonString(section["position"]) in the code that sets
snapshot.managedUserDefaults[SidebarPositionSettings.key] so that if jsonString
returns nil but section["position"] is non-nil you call
logInvalid("sidebar.position", sourcePath: sourcePath); keep the existing branch
that converts a valid string to SidebarPositionOption and logs when the raw
string doesn't map, using the same identifiers (jsonString,
SidebarPositionOption, snapshot.managedUserDefaults,
SidebarPositionSettings.key, logInvalid, sourcePath).

In `@web/data/cmux.schema.json`:
- Around line 624-634: Add a descriptionKey for the user-facing schema
description on the "position" property under the "sidebar" schema so the
description is localizable; specifically add "descriptionKey":
"schemaDescriptions.sidebar.position" alongside the existing "description" in
the schema and then add matching entries for
"schemaDescriptions.sidebar.position" to each locale file in web/messages (one
translation per locale listed in web/i18n/routing.ts) so the message exists for
all supported locales.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: f5b4987a-2859-48ed-bfda-bf6a73402124

📥 Commits

Reviewing files that changed from the base of the PR and between d02e6d6 and abc9584.

📒 Files selected for processing (12)
  • Sources/CmuxSettingsJSONPathSupport.swift
  • Sources/ContentView.swift
  • Sources/KeyboardShortcutSettingsFileStore+Template.swift
  • Sources/KeyboardShortcutSettingsFileStore.swift
  • Sources/SettingsNavigation.swift
  • Sources/Sidebar/SidebarState.swift
  • cmuxTests/KeyboardShortcutSettingsFileStoreStartupTests.swift
  • cmuxTests/SettingsSearchIndexTests.swift
  • cmuxTests/SidebarWidthPolicyTests.swift
  • docs/configuration.md
  • web/app/[locale]/docs/configuration/page.tsx
  • web/data/cmux.schema.json

Comment thread Sources/KeyboardShortcutSettingsFileStore.swift
Comment thread web/data/cmux.schema.json

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/HorizontalTabsSidebar.swift`:
- Around line 183-194: The Shift-range anchor is being computed against
tabManager.tabs (using firstIndex where id == workspaceId) but the UI is
rendered from SidebarWorkspaceRenderItem.renderItems(...), so update the
selection logic in the handlers that touch lastSidebarSelectionIndex and range
calculation to use the rendered order: derive a renderedIds array from
SidebarWorkspaceRenderItem.renderItems(...) (or the same source the view uses),
compute indices and ranges using renderedIds (findIndex of workspaceId), persist
lastSidebarSelectionIndex referencing the rendered index, and when a workspaceId
is not present in renderedIds clear lastSidebarSelectionIndex; apply this change
for the occurrences that set or use lastSidebarSelectionIndex, the Shift-range
computation (currently using tabManager.tabs[...] and map(\.id)), and the
single-click selection path so all anchors are against rendered order.
- Line 161: The UI is using a simple workspaceCount > 1 check instead of the
TabManager policy; replace those boolean checks with the
TabManager.canCloseWorkspace(_:) call so pinned workspaces follow the same close
rules. Find where canCloseWorkspace is set (e.g., in HorizontalTabsSidebar where
you currently use workspaceCount > 1) and change it to use the TabManager
instance method (for example TabManager.shared.canCloseWorkspace(workspace) or
the local tabManager.canCloseWorkspace(workspace) depending on available
context), and apply the same replacement for the other occurrences referenced
(around the blocks at the other noted locations).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: fc3ce71c-20ba-4320-8362-918e5c3138c2

📥 Commits

Reviewing files that changed from the base of the PR and between abc9584 and cf535a9.

📒 Files selected for processing (3)
  • Sources/ContentView.swift
  • Sources/HorizontalTabsSidebar.swift
  • cmux.xcodeproj/project.pbxproj
💤 Files with no reviewable changes (1)
  • Sources/ContentView.swift

Comment thread Sources/HorizontalTabsSidebar.swift Outdated
Comment thread Sources/HorizontalTabsSidebar.swift Outdated
@austinywang

Copy link
Copy Markdown
Contributor Author

@coderabbitai approve

@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown
✅ Action performed

Comments resolved and changes approved.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 30 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread Sources/HorizontalTabsSidebar.swift Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 37 files

Re-trigger cubic

Comment thread Sources/HorizontalTabsSidebar.swift
@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026

This branch was successfully deployed

1 active deployment
Preview – cmux — a12deb3a Deployed Jun 18, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: configurable sidebar position (top/bottom/left/right)

3 participants