Skip to content

Add new workspace above and below actions - #5644

Closed
lawrencecchen wants to merge 2 commits into
mainfrom
task-new-workspace-position-actions
Closed

lawrencecchen wants to merge 2 commits into
mainfrom
task-new-workspace-position-actions

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 8, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Add command palette actions for New Workspace Above and New Workspace Below.
  • Add matching right-click menu actions on workspace rows and workspace group headers.
  • Route all entrypoints through a shared TabManager adjacent-insertion API so group member insertion stays inside the group, while group header insertion targets outside the whole group.
  • Add localized English and Japanese strings.

Testing

  • node -e 'JSON.parse(require("fs").readFileSync("Resources/Localizable.xcstrings","utf8")); console.log("Localizable.xcstrings JSON OK")'
  • git diff --check
  • ./scripts/reload-cloud.sh --tag wspabv
  • xcodebuild test -project cmux.xcodeproj -scheme cmux-unit -configuration Debug -destination 'platform=macOS' -derivedDataPath /tmp/cmux-workspace-position-actions-rerun -only-testing:cmuxTests/WorkspaceGroupTests built and ran the suite locally. The three new adjacent-insertion tests passed. The run still failed existing WorkspaceGroupTests expectations unrelated to these new actions, including pinned/group reorder cases.

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


Note

Medium Risk
Touches workspace ordering, group membership, and addWorkspace inheritance paths; mistakes could mis-order tabs or break group contiguity, though behavior is covered by new unit tests.

Overview
Adds New Workspace Above and New Workspace Below so users can insert a workspace next to the current one instead of only using generic “new workspace” placement.

Command palette registers two new commands (with keywords above/below) that require a selected workspace and call TabManager.createWorkspaceAdjacent. Workspace row and workspace group header context menus get the same two actions; group headers wire through onNewWorkspaceAbove / onNewWorkspaceBelow in VerticalTabsSidebar+WorkspaceGroups.

TabManager introduces WorkspaceAdjacentInsertionPosition and createWorkspaceAdjacent(to:position:), plus sourceWorkspaceOverride on addWorkspace so inheritance follows the reference row, not only the current selection. Ungrouped tabs insert via create-then-reorder; grouped members stay in the group and expand collapsed groups when selecting; acting on the group anchor inserts outside the whole group (before first / after last member). English and Japanese strings cover palette and context menu labels.

Tests: WorkspaceGroupTests is marked .serialized and adds three tests for ungrouped, in-group, and group-header adjacent insertion.

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


Summary by cubic

Add actions to create a new workspace above or below the current selection. Uses a shared TabManager adjacent-insertion API to place new workspaces inside groups or outside the group when triggered from a group header.

  • New Features
    • Command palette actions: palette.newWorkspaceAbove and palette.newWorkspaceBelow with localized titles.
    • Right-click menu actions on workspace rows and workspace group headers.
    • Shared TabManager.createWorkspaceAdjacent(to:position:) ensures:
      • Group member insertion stays inside the group.
      • Group header insertion targets outside the whole group.
    • Added English and Japanese strings and unit tests covering ungrouped, grouped member, and group header cases.

Written for commit 4e0f350. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added "New Workspace Above" and "New Workspace Below" commands accessible via command palette and workspace context menus for creating adjacent workspaces
    • Extended multi-language support with English and Japanese translations for the new commands
    • Workspace groups now support creating adjacent workspaces from the group header menu

@vercel

vercel Bot commented Jun 8, 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 8, 2026 9:49am
cmux-staging Building Building Preview, Comment Jun 8, 2026 9:49am

@coderabbitai

coderabbitai Bot commented Jun 8, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds "New Workspace Above" and "New Workspace Below" functionality across the application. It introduces core placement logic in TabManager via a new createWorkspaceAdjacent method that intelligently handles group membership semantics, exposes this via command palette and context menu actions, and adds corresponding UI in sidebar group headers with comprehensive test coverage.

Changes

Adjacent Workspace Creation Feature

Layer / File(s) Summary
Core Adjacent Workspace Placement Logic
Sources/TabManager.swift
WorkspaceAdjacentInsertionPosition enum (above/below) distinguishes insertion direction. addWorkspace now accepts sourceWorkspaceOverride to control context resolution. New createWorkspaceAdjacent method detects whether reference is group anchor, creates workspace with appropriate group membership, reorders relative to neighbors, and expands collapsed groups on selection.
Localized UI Strings
Resources/Localizable.xcstrings
Command palette titles and context menu labels for "New Workspace Above/Below" added in English and Japanese.
Command Palette and Context Menu Entry Points
Sources/ContentView.swift
Command palette contributions define new commands with localized titles and keywords. Handlers validate selected tab, call createWorkspaceAdjacent, and beep+return on failure. Tab context menu buttons invoke same logic for right-clicked tab.
Sidebar Group Header UI and Wiring
Sources/SidebarWorkspaceGroupHeaderView.swift, Sources/VerticalTabsSidebar+WorkspaceGroups.swift
SidebarWorkspaceGroupHeaderView receives new onNewWorkspaceAbove/onNewWorkspaceBelow callback properties and extends context menu with new buttons. VerticalTabsSidebar+WorkspaceGroups wires these callbacks to create adjacent workspaces relative to group anchor with guard-based failure handling.
Test Coverage for Adjacent Placement
cmuxTests/WorkspaceGroupTests.swift
Suite marked .serialized. New tests validate createWorkspaceAdjacent for ungrouped references, grouped members (preserving group membership), and group anchors (placing ungrouped outside group), verifying correct insertion positions and group assignment.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • manaflow-ai/cmux#4989: Both PRs modify Sources/TabManager.swift's workspace creation and group placement logic—this PR adds adjacent-workspace insertion via createWorkspaceAdjacent and extends addWorkspace placement context, while PR #4989 modifies group normalization and creation positioning, so they likely overlap in the same code paths.

Suggested reviewers

  • Ari4ka

Poem

🐰 A warren grows, where workspaces convene,
Above and below, new spaces convene,
Group anchors hold the line,
With placement so fine,
Adjacent creation keeps things pristine! ✨


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 createWorkspaceAdjacent performs multiple O(n) full-collection scans on user-triggered paths without indexing for ~1000 workspaces, violating algorithmic complexity rules. Use workspace ID index for O(1) lookups; set isPinned on new workspace to preserve pin tier in reordering.
Cmux Full Internationalization ❌ Error Four new localization keys have en and ja translations only, but Localizable.xcstrings supports 20 locales. Missing 18 locale translations per policy requirement. Add translations for all 20 locales (ar, bs, da, de, es, fr, it, ko, km, nb, pl, pt-BR, ru, th, tr, uk, zh-Hans, zh-Hant, plus en/ja) to the four new keys in Resources/Localizable.xcstrings.
Cmux Architecture Rethink ❌ Error Newly-created adjacent workspaces are unpinned, but reorderWorkspace clamps by pin tier, breaking adjacency promise with pinned references. Set newWorkspace.isPinned = referenceWorkspace.isPinned before reordering to preserve pin tier and guarantee adjacency invariant.
Docstring Coverage ⚠️ Warning Docstring coverage is 6.25% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (15 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding new workspace above and below actions to the application.
Description check ✅ Passed The description covers the template sections: Summary explains what changed and why, Testing describes verification steps, and a Checklist is partially provided.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed TabManager and Workspace properly marked @MainActor; WorkspaceAdjacentInsertionPosition correctly marked Sendable; SwiftUI Views intentionally on MainActor; no background access of UI stores.
Cmux Swift Blocking Runtime ✅ Passed No blocking synchronization patterns detected in modified files. All new code uses guard statements and synchronous operations with NSSound.beep() feedback only.
Cmux No Hacky Sleeps ✅ Passed PR contains only Swift and localization files; check scope explicitly excludes Swift code (covered separately) and requires TypeScript/JavaScript/shell/runtime scripts.
Cmux Swift Concurrency ✅ Passed PR introduces only synchronous Swift APIs with no legacy async patterns (DispatchQueue.global, Combine, completion handlers, fire-and-forget Tasks) in TabManager, UI views, or tests.
Cmux Swift @Concurrent ✅ Passed All new functions are synchronous methods on @MainActor TabManager with no async work or @concurrent misuse.
Cmux Swift File And Package Boundaries ✅ Passed PR adds 123 lines to TabManager and 50 to ContentView—below 250-line threshold for oversized files. Workspace-adjacent logic properly belongs in TabManager; no mixed responsibilities introduced.
Cmux Swift Logging ✅ Passed Only one NSLog added in feedback code, guarded by #if DEBUG (allowed per rules). New workspace action code contains no logging violations. Compliant with swift-logging.md.
Cmux User-Facing Error Privacy ✅ Passed PR adds user-facing "New Workspace Above/Below" actions with generic, localized strings only. No credentials, vendor names, raw errors, or sensitive data exposed in user-facing text or error handling.
Cmux Swiftui State Layout ✅ Passed New action closures added as immutable snapshots with weak captures. No @State, @Published, @StateObject, @EnvironmentObject, or store refs. Compliant with SwiftUI state layout rules.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR adds workspace commands and menu items but does not introduce standalone NSWindow, NSPanel, NSWindowController, or SwiftUI Window/WindowGroup requiring cmux.* identifiers.
Cmux Source Artifacts ✅ Passed All changed files are hand-written Swift source code, tests, or localization catalogs—legitimate product assets with no local tool output, generated logs, or artifact patterns.
✨ 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 task-new-workspace-position-actions

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.

@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 4e0f350. Configure here.

Comment thread Sources/TabManager.swift
case .below:
_ = reorderWorkspace(tabId: workspaceId, after: referenceWorkspaceId)
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pinned adjacent insert misplaces workspace

Medium Severity

Adjacent workspace creation appends via addWorkspace, then reorderCreatedWorkspace calls reorderWorkspace with before/after the reference. That path uses clampedReorderIndex, which keeps unpinned tabs out of the pinned prefix (and applies grouped pin bounds). For a pinned reference, “above” or “below” can clamp to the pin-tier edge instead of the slot next to that workspace, while the action still succeeds.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 4e0f350. Configure here.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4e0f3501ad

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/TabManager.swift
Comment on lines +4329 to +4332
let cwd = tabs.first(where: { $0.id == group.anchorWorkspaceId })?.currentDirectory
let newWorkspace = addWorkspace(
workingDirectory: cwd,
inheritWorkingDirectory: cwd == nil,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Inherit the clicked grouped workspace directory

When this action is invoked from a workspace row inside a group whose current directory differs from the group anchor, the new workspace is created with the anchor's currentDirectory because workingDirectory: cwd is passed explicitly; that prevents sourceWorkspaceOverride: referenceWorkspace from supplying the clicked workspace's directory. The ungrouped adjacent path inherits from the reference workspace, so grouped rows behave inconsistently and “New Workspace Above/Below” can open in the wrong folder for mixed-directory groups.

Useful? React with 👍 / 👎.

@greptile-apps

greptile-apps Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds "New Workspace Above" and "New Workspace Below" actions wired through a new createWorkspaceAdjacent API on TabManager, exposed via the command palette, workspace row context menus, and group header context menus. The insertion logic correctly distinguishes three cases: ungrouped workspaces (placed outside any group), non-anchor group members (placed inside the group), and group anchor workspaces (placed outside the entire group).

  • TabManager.swift: Adds WorkspaceAdjacentInsertionPosition, a sourceWorkspaceOverride parameter to addWorkspace, and three new private helpers that funnel through the existing reorderWorkspace path, which already fires normalizeWorkspaceGroupContiguity and postWorkspaceOrderDidChange.
  • Localizable.xcstrings: Adds four new string keys with en and ja translations, but the catalog already contains 20 locales; the other 18 are not covered.
  • cmuxTests/WorkspaceGroupTests.swift: Three new @Test cases covering the three insertion scenarios, plus .serialized added to the suite.

Confidence Score: 3/5

Safe to merge for English and Japanese users; all other supported locales will display raw English fallback strings for the four new menu and palette entries until translations are added.

The insertion logic itself is well-structured and the three new tests cover the core branching paths. The only outstanding defect is in Localizable.xcstrings: four new string keys ship translations for only 2 of the 20 locales in the catalog, leaving ar, bs, da, de, es, fr, it, km, ko, nb, pl, pt-BR, ru, th, tr, uk, zh-Hans, and zh-Hant without localized text for the new actions.

Resources/Localizable.xcstrings needs translation entries for the 18 missing locales before shipping to non-English/non-Japanese users.

Important Files Changed

Filename Overview
Resources/Localizable.xcstrings Adds 4 new string keys but only provides en and ja translations; 18 of the 20 catalog locales are missing entries.
Sources/TabManager.swift Adds WorkspaceAdjacentInsertionPosition enum, sourceWorkspaceOverride param, and three new helpers; reorderWorkspace already fires normalizeWorkspaceGroupContiguity + postWorkspaceOrderDidChange so the state-update chain is correct.
Sources/ContentView.swift Registers two new palette contributions and two context-menu buttons routing through createWorkspaceAdjacent; uses String(localized:defaultValue:) correctly.
Sources/SidebarWorkspaceGroupHeaderView.swift Adds onNewWorkspaceAbove and onNewWorkspaceBelow callbacks; wired correctly with a Divider before the rename action.
Sources/VerticalTabsSidebar+WorkspaceGroups.swift Wires the header closures with anchorWorkspaceId captured by value and [weak tabManager] correctly.
cmuxTests/WorkspaceGroupTests.swift Adds .serialized and three new @test cases covering all three insertion scenarios; expectations look correct.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[User triggers action] --> B{Entry point}
    B --> C[Command palette]
    B --> D[TabItemView context menu]
    B --> E[GroupHeader context menu]
    C --> F[selectedTabId]
    D --> G[tab.id]
    E --> H[anchorWorkspaceId]
    F --> I[createWorkspaceAdjacent]
    G --> I
    H --> I
    I --> J{In a group?}
    J -- No --> K[addWorkspace .end + reorderCreatedWorkspace]
    J -- Yes, is anchor --> L[createWorkspaceAdjacentToGroup — outside group]
    J -- Yes, non-anchor --> M[createWorkspaceAdjacentWithinGroup — inside group]
    K --> N[reorderWorkspace: normalizeContiguity + postOrderChanged]
    L --> N
    M --> O[assignGroup + reorderCreatedWorkspace + expandGroupIfNeeded]
    O --> N
Loading

Reviews (1): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment on lines 50082 to 50120
}
},
"command.newWorkspaceAbove.title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "New Workspace Above"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "上に新規ワークスペース"
}
}
}
},
"command.newWorkspaceBelow.title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "New Workspace Below"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "下に新規ワークスペース"
}
}
}
},
"command.nextTabInPane.subtitle": {
"extractionState": "manual",
"localizations": {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Missing translations for 18 locales

The catalog already contains 20 locales — ar, bs, da, de, es, fr, it, km, ko, nb, pl, pt-BR, ru, th, tr, uk, zh-Hans, and zh-Hant in addition to en and ja — but all four new keys (command.newWorkspaceAbove.title, command.newWorkspaceBelow.title, contextMenu.newWorkspaceAbove, contextMenu.newWorkspaceBelow) only supply en and ja entries. Every other supported locale will fall back to the en default value at runtime, leaving users of the other 18 locales with untranslated strings.

Rule Used: Flag production user-facing text that is not fully... (source)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@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: 1

🤖 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/TabManager.swift`:
- Around line 4309-4318: When creating then immediately reordering a new
workspace (via addWorkspace and reorderCreatedWorkspace), the new workspace is
always unpinned so reorderWorkspace's pin-tier clamping can place it
non-adjacent to a pinned reference; modify the flow so the new workspace
inherits the reference workspace's pin tier (or pass an explicit
pinTier/placementHint into addWorkspace or reorderCreatedWorkspace) before
calling reorderWorkspace/reorderCreatedWorkspace so pin-tier clamping uses the
correct tier; update calls around addWorkspace/select: select,
placementOverride: .end, sourceWorkspaceOverride: referenceWorkspace and the
subsequent reorderCreatedWorkspace(newWorkspace.id, adjacentTo:
referenceWorkspaceId, position: position) (and the other similar blocks at the
noted ranges) to preserve the referenceWorkspace.pin state when reordering.
🪄 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: 51143161-ec4a-457e-a50d-28fa14fe3451

📥 Commits

Reviewing files that changed from the base of the PR and between ee22255 and 4e0f350.

📒 Files selected for processing (6)
  • Resources/Localizable.xcstrings
  • Sources/ContentView.swift
  • Sources/SidebarWorkspaceGroupHeaderView.swift
  • Sources/TabManager.swift
  • Sources/VerticalTabsSidebar+WorkspaceGroups.swift
  • cmuxTests/WorkspaceGroupTests.swift

Comment thread Sources/TabManager.swift
Comment on lines +4309 to +4318
let newWorkspace = addWorkspace(
select: select,
placementOverride: .end,
sourceWorkspaceOverride: referenceWorkspace
)
reorderCreatedWorkspace(
newWorkspace.id,
adjacentTo: referenceWorkspaceId,
position: position
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Preserve pin tier for adjacent insertion targets.

Line 4314 / Line 4339 / Line 4366 reorder a newly created workspace that is always unpinned. Because reorderWorkspace clamps by pin tier, “above/below” against pinned references (or pinned groups/pinned group members) can land non-adjacent.

Suggested fix
@@
     func createWorkspaceAdjacent(
         to referenceWorkspaceId: UUID,
         position: WorkspaceAdjacentInsertionPosition,
         select: Bool = true
     ) -> Workspace? {
@@
         let newWorkspace = addWorkspace(
             select: select,
             placementOverride: .end,
             sourceWorkspaceOverride: referenceWorkspace
         )
+        newWorkspace.isPinned = referenceWorkspace.isPinned
         reorderCreatedWorkspace(
             newWorkspace.id,
             adjacentTo: referenceWorkspaceId,
             position: position
         )
         return newWorkspace
     }
@@
     private func createWorkspaceAdjacentWithinGroup(
         to referenceWorkspace: Workspace,
         groupId: UUID,
         position: WorkspaceAdjacentInsertionPosition,
         select: Bool
@@
         let newWorkspace = addWorkspace(
             workingDirectory: cwd,
             inheritWorkingDirectory: cwd == nil,
             select: select,
             placementOverride: .end,
             sourceWorkspaceOverride: referenceWorkspace,
             autoWelcomeIfNeeded: false
         )
+        newWorkspace.isPinned = referenceWorkspace.isPinned
         assignGroup(workspaceId: newWorkspace.id, groupId: groupId)
         reorderCreatedWorkspace(
             newWorkspace.id,
             adjacentTo: referenceWorkspace.id,
             position: position
         )
@@
     private func createWorkspaceAdjacentToGroup(
         groupId: UUID,
         position: WorkspaceAdjacentInsertionPosition,
         select: Bool
     ) -> Workspace? {
@@
         let newWorkspace = addWorkspace(
             select: select,
             placementOverride: .end,
             sourceWorkspaceOverride: anchorWorkspace
         )
+        newWorkspace.isPinned = group.isPinned
         let groupMemberIds = tabs.filter { $0.groupId == groupId && $0.id != newWorkspace.id }.map(\.id)
         switch position {

Also applies to: 4330-4343, 4357-4371

🤖 Prompt for 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.

In `@Sources/TabManager.swift` around lines 4309 - 4318, When creating then
immediately reordering a new workspace (via addWorkspace and
reorderCreatedWorkspace), the new workspace is always unpinned so
reorderWorkspace's pin-tier clamping can place it non-adjacent to a pinned
reference; modify the flow so the new workspace inherits the reference
workspace's pin tier (or pass an explicit pinTier/placementHint into
addWorkspace or reorderCreatedWorkspace) before calling
reorderWorkspace/reorderCreatedWorkspace so pin-tier clamping uses the correct
tier; update calls around addWorkspace/select: select, placementOverride: .end,
sourceWorkspaceOverride: referenceWorkspace and the subsequent
reorderCreatedWorkspace(newWorkspace.id, adjacentTo: referenceWorkspaceId,
position: position) (and the other similar blocks at the noted ranges) to
preserve the referenceWorkspace.pin state when reordering.

@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 — 4e0f3501 Deployed Jun 8, 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.

2 participants