Skip to content

Make group new workspace placement configurable - #5018

Merged
lawrencecchen merged 5 commits into
mainfrom
feat-group-new-workspace-placement
May 30, 2026
Merged

lawrencecchen merged 5 commits into
mainfrom
feat-group-new-workspace-placement

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented May 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary:

  • Route Cmd-N from group anchors and members into the current group.
  • Add after-current, top, and end placement for group-created workspaces, with global and per-cwd cmux.json settings.
  • Add Settings UI, schema/docs, CLI/socket help, localization, and model/settings tests.

Checks:

  • git diff --check
  • jq empty Resources/Localizable.xcstrings
  • jq empty web/data/cmux.schema.json
  • ./scripts/reload.sh --tag feat-group-new-workspace-placement

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


Note

Medium Risk
Changes default insert order for group workspaces and Cmd-N routing; users who relied on top placement need an explicit setting. Cloud VM group joining now depends on CLI UUID output rather than a timeout window.

Overview
Group new workspace placement is now configurable with afterCurrent (default), top, and end, resolved per-cwd in cmux.json then from the global workspaceGroups.newWorkspacePlacement setting (new Settings row and cmux.json parsing).

Cmd-N and configured “new workspace” flows from a group member create inside that group using the active member as the insert reference; the group + and CLI new-workspace --placement document the same options, with afterCurrent falling back to top when there is no in-group reference.

Async group actions (e.g. Cloud VM) pass placement and reference into group join logic; the watcher drops the fixed timeout and instead finishes when the VM process reports success and a workspace= UUID from cmux vm new --id-format uuids.

Localization adds strings for group placement labels/descriptions and reformats several TextBox catalog entries in Localizable.xcstrings.

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


Summary by cubic

Makes new workspace placement inside a group configurable and routes Cmd‑N from group anchors and members to create inside that group. The default is now After current; placement resolves from per‑cwd first, then global, and falls back to top when no in‑group reference exists.

  • New Features

    • Added placement modes for group-created workspaces: afterCurrent (default), top, end (accepts after-current/after_current in config).
    • New global setting workspaceGroups.newWorkspacePlacement with Settings UI (“Group New Workspace Placement”); settable in global cmux.json with per‑cwd override.
    • Cmd‑N on a group anchor/member creates inside that group using the configured placement; header + and CLI use the anchor as the reference so afterCurrent behaves like top when no member is active.
    • CLI: cmux workspace-group new-workspace <group> [--placement afterCurrent|top|end] with validation and the above resolution order (per‑cwd → global).
    • Async group actions (e.g. Cloud VM) now join into the target group with the chosen placement; the watcher clears on match, group removal, or when the launching process completes. Cloud VM now outputs the created workspace ID and signals completion so placement finishes reliably with no timeout.
    • Updated docs, schema, localization, settings search/aliases, settings template, and tests.
  • Migration

    • Default changed from top to afterCurrent. To keep prior behavior, set Settings > App > Group New Workspace Placement to Top, or add:
      • "workspaceGroups": { "newWorkspacePlacement": "top" } in cmux.json.
    • Pass --placement in scripts if you need a specific order.

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

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added "after current" placement for new workspaces; Settings picker, CLI --placement flag, and per-directory/global configuration.
  • Behavior

    • Cmd‑N, group “+”, and configured actions now resolve placement in order (CLI → per-cwd → global); anchor/reference semantics clarified.
    • Async workspace creation (e.g., cloud VM) correctly joins the target group with the chosen placement.
  • Documentation

    • Docs and web schema updated to describe placement options and resolution.
  • Localization

    • Added translations for the new setting.
  • Tests

    • Added tests for parsing and placement behavior.

Review Change Stack

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@vercel

vercel Bot commented May 30, 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 May 30, 2026 10:58am
cmux-staging Building Building Preview, Comment May 30, 2026 10:58am

@coderabbitai

coderabbitai Bot commented May 30, 2026 •

Copy link
Copy Markdown

Caution

Review failed

Failed to post review comments

📝 Walkthrough

Walkthrough

Adds an afterCurrent placement option and threads placement plus optional referenceWorkspaceId through TabManager, AppDelegate, CloudVM launcher, settings parsing/UI, CLI/docs/schema, localization, and tests.

Changes

Workspace Group Placement Enhancement

Layer / File(s) Summary
Placement enum and settings
Sources/TabManager.swift, Sources/cmuxApp.swift
WorkspaceGroupNewPlacement adds .afterCurrent; settings default/resolution and App settings UI/persistence updated to surface the new option.
TabManager insertion & reference support
Sources/TabManager.swift
APIs accept optional referenceWorkspaceId; placeWithinGroup(...) implements .afterCurrent insertion relative to reference workspace with anchor/first-member fallback and logging.
AppDelegate orchestration and async observer
Sources/AppDelegate.swift
Introduce WorkspaceGroupNewWorkspaceTarget; thread placement and referenceWorkspaceId into new-workspace execution paths, post-action joining, and a keyed async observer lifecycle for cloud VM completion.
CloudVM launcher termination hook
Sources/CloudVMActionLauncher.swift, Sources/AppDelegate.swift
CloudVMActionLauncher.start gains an onCompletion callback and Completion struct (including parsed workspaceId); AppDelegate forwards callback to finish pending observers.
Settings file parsing, supported paths, and template
Sources/CmuxSettingsJSONPathSupport.swift, Sources/KeyboardShortcutSettingsFileStore+Template.swift, Sources/KeyboardShortcutSettingsFileStore.swift
Add supported workspaceGroups.newWorkspacePlacement path, include workspaceGroups in generated cmux.json template, and parse workspaceGroups.newWorkspacePlacement into managed settings.
CLI help and TerminalController validation
CLI/cmux.swift, Sources/TerminalController.swift, Sources/CmuxConfig.swift
CLI help updated to accept `afterCurrent
Settings UI, localization, and search integration
Resources/Localizable.xcstrings, Sources/cmuxApp.swift, Sources/SettingsNavigation.swift, Sources/SettingsSearchAliases.swift
Add localization keys, AppStorage binding, picker row UI, reset behavior, settings search entry and alias for the new placement setting.
Docs, web schema, and config examples
docs/workspace-groups.md, web/app/[locale]/docs/configuration/page.tsx, web/data/cmux.schema.json
Docs updated to describe `--placement afterCurrent
Web documentation translations
web/messages/*.json
Add localized schema description strings for the new workspaceGroups schema entries across locales.
Unit and integration tests
cmuxTests/WorkspaceGroupTests.swift, cmuxTests/WorkspaceUnitTests.swift
Tests added for .afterCurrent behaviors, parsing variants, anchor fallback, and settings-file integration.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • Ari4ka

Poem

🐰 I nibble code and hop in place,
afterCurrent finds its space.
Top or end — the group now knows,
Tabs align in tidy rows.
Hooray, a carrot for new shows!


Caution

Pre-merge checks failed

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

  • Ignore

❌ Failed checks (3 errors, 1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Cmux Swift Concurrency ❌ Error PR introduces completion-handler callback API and fire-and-forget Task with meaningful lifecycle in cmux code, violating Swift concurrency modernization rules. Refactor CloudVMActionLauncher.start() to async throwing instead of accepting optional completion callbacks; update callers to use await.
Cmux Swift Logging ❌ Error Sources/TabManager.swift line 15: Logger declared as private let without nonisolated modifier, violating swift-logging.md rule for @MainActor-affected file-scoped loggers. Change to: nonisolated private let tabManagerLogger = Logger(subsystem: "com.cmuxterm.app", category: "TabManager")
Cmux Architecture Rethink ❌ Error URL dedup check violates normalization invariant: terminalFilePaths built from raw paths but filtered against standardized paths, allowing normalized duplicates to slip through and open files twice. Normalize terminalFilePaths: use standardizedFileURL.path() on both sides of the dedup check to ensure consistent comparison and prevent duplicate file opens.
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Cmux Algorithmic Complexity ❓ Inconclusive No result was produced after verification. Marking as INCONCLUSIVE. Re-run the check or adjust instructions to produce a final result.
✅ Passed checks (13 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Make group new workspace placement configurable' clearly summarizes the main change: adding configurability to workspace placement within groups, which is the core focus of this PR.
Description check ✅ Passed The PR description is comprehensive and well-structured, covering the summary of changes, testing approach, checks performed, migration guidance, and relevant context. It aligns well with the repository's description template requirements.
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 All new types comply with Swift 6 actor isolation: Sendable enums marked, @MainActor classes explicit, async callbacks in Task @MainActor, shared state protected with NSLock.
Cmux Swift Blocking Runtime ✅ Passed PR removes Task.sleep timeout, replaces with process-completion callbacks. No new blocking patterns in production code. Test-only RunLoop patterns are acceptable deterministic scaffolding.
Cmux No Hacky Sleeps ✅ Passed PR removes hacky sleeps (timeout-based cleanup) and replaces with event-based logic. Non-Swift changes (TS/JS/schema/docs) contain no sleep/timer patterns. Scope of rule excludes Swift code.
Cmux Swift @Concurrent ✅ Passed CloudVMActionLauncher.start() is synchronous; onCompletion callbacks execute on @MainActor via Task block. No nonisolated async functions added. Existing @concurrent annotations unchanged.
Cmux Swift File And Package Boundaries ✅ Passed Additions to large files (AppDelegate +145, TabManager +87 net) stay under 250-line threshold; responsibilities appropriately distributed; no new oversized files created.
Cmux User-Facing Error Privacy ✅ Passed All user-facing text complies with privacy rules. Error messages use generic product terms, no vendor/provider/credential details are exposed, and CloudVM output sanitization blocks sensitive content.
Cmux Full Internationalization ✅ Passed All new user-facing text is properly localized: 8 Swift xcstring keys translated to 20 locales each, 20 web message files include workspaceGroups descriptions, UI uses String(localized:) API.
Cmux Swiftui State Layout ✅ Passed SwiftUI changes use @AppStorage with proper @Binding patterns. No ObservableObject/@published, layout-changing GeometryReader, lazy list store refs, or render-time mutations.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed No new standalone windows added. PR only adds a settings row UI component, AppStorage property, and TabManager placement logic; existing Settings/Config windows unchanged.
✨ 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 feat-group-new-workspace-placement

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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.

@greptile-apps

greptile-apps Bot commented May 30, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR makes the placement of new workspaces inside groups fully configurable (afterCurrent / top / end), changes the global default from top to afterCurrent, and routes Cmd-N from group anchors and members into the active group. The async CloudVM observer is refactored to clear on process-exit signals rather than a fixed 180 s timeout.

  • Core placement logic (TabManager.placeWithinGroup): afterCurrent inserts after the reference workspace; falls back to anchor-index+1 when the reference is the anchor or absent; all three placement no-op paths now emit a unified-logging info message.
  • Cmd-N routing (AppDelegate): workspaceGroupNewWorkspaceTarget resolves placement (per-cwd cmux.json → global UserDefaults → .afterCurrent default) and passes the selected workspace as referenceWorkspaceId.
  • CloudVM observer: fixed-timeout Task.sleep removed; observer now self-clears on first tab match, group disappearance, or process-exit completion signal.

Confidence Score: 5/5

Safe to merge; changes are isolated to group workspace creation ordering and have no impact on data integrity or security.

The placement logic is well-guarded with proper fallbacks at every branch, actor isolation is consistent throughout, the old timing-based Task.sleep is correctly replaced by a process-exit signal, localization is complete across all 20 supported locales on both Swift and web surfaces, and the new test suite exercises placement, fallback, and config-parsing paths.

Sources/AppDelegate.swift — the finish(workspaceId:) early-return path silently disposes the observer; worth a log line for diagnosability.

Important Files Changed

Filename Overview
Sources/TabManager.swift Adds WorkspaceGroupNewPlacement.afterCurrent, placeWithinGroup referenceWorkspaceId, and unified logging for all placement no-op paths; logic is correct and well-guarded.
Sources/AppDelegate.swift Routes Cmd-N through group placement, replaces 180s timeout with process-exit observer signals; asyncObserverId capture order is correct but finish() silently disposes when workspace isn't in tabs yet.
Sources/CloudVMActionLauncher.swift Adds Completion struct, --id-format uuids flag, workspace=UUID output parsing, and onCompletion callback; correct async dispatch on @mainactor.
Sources/KeyboardShortcutSettingsFileStore.swift Adds parseWorkspaceGroupsSection correctly mirroring other section parsers.
Sources/cmuxApp.swift Adds WorkspaceGroupNewWorkspacePlacementSettingsRow and @AppStorage binding; resets to defaultValue on settings reset.
cmuxTests/WorkspaceGroupTests.swift Four new tests covering afterCurrent placement, anchor-as-reference fallback, addWorkspaceToGroup with reference, and rawString parsing.
cmuxTests/WorkspaceUnitTests.swift Adds settings-file-store integration test for workspaceGroups.newWorkspacePlacement.
Sources/TerminalController.swift Comment and error-string updates only; no logic changes.
Resources/Localizable.xcstrings Adds 6 new string keys translated for all 20 supported locales.

Sequence Diagram

sequenceDiagram
    participant User
    participant AppDelegate
    participant TabManager
    participant Observer as ConfiguredGroupActionAsyncWorkspaceObserver
    participant CloudVM as CloudVMActionLauncher

    Note over User,CloudVM: Cmd-N on group member (afterCurrent default)

    User->>AppDelegate: Cmd-N keypress
    AppDelegate->>AppDelegate: workspaceGroupNewWorkspaceTarget(in:)
    Note right of AppDelegate: resolves placement per-cwd then global then default

    alt configured action is builtIn(.newWorkspace)
        AppDelegate->>TabManager: createWorkspaceInGroup(groupId, placement, referenceWorkspaceId)
        TabManager->>TabManager: addWorkspace()
        TabManager->>TabManager: assignGroup()
        TabManager->>TabManager: placeWithinGroup(.afterCurrent, referenceId)
    else configured action is builtIn(.cloudVM)
        AppDelegate->>CloudVM: performCloudVMAction(onCompletion:)
        CloudVM->>CloudVM: launch cmux --id-format uuids vm new
        AppDelegate->>AppDelegate: onExecuted() snapshot beforeIds
        AppDelegate->>Observer: install(tabManager, groupId, placement, referenceId)
        Note over Observer: subscribes to tabManager.$tabs
        alt workspace appears before process exits
            TabManager-->>Observer: $tabs fires
            Observer->>TabManager: addWorkspaceToGroup(placement, referenceId)
            Observer->>Observer: dispose()
        end
        CloudVM-->>AppDelegate: terminationHandler onCompletion(Completion)
        AppDelegate->>Observer: finishPending(observerId, workspaceId)
        alt observer still alive and workspace in tabs
            Observer->>TabManager: addWorkspaceToGroup(placement, referenceId)
            Observer->>Observer: dispose()
        end
    else no configured action
        AppDelegate->>TabManager: createWorkspaceInGroup(groupId, placement, referenceId)
    end
Loading

Reviews (4): Last reviewed commit: "Fix group Cloud VM placement completion" | Re-trigger Greptile

Comment thread Sources/TabManager.swift
Comment on lines +6272 to +6283
case .afterCurrent:
if let referenceWorkspaceId,
referenceWorkspaceId != workspaceId,
let referenceIndex = tabs.firstIndex(where: { $0.id == referenceWorkspaceId && $0.groupId == groupId }) {
targetIndex = referenceIndex + 1
} else if let anchorIndex = tabs.firstIndex(where: { $0.id == group.anchorWorkspaceId }) {
targetIndex = anchorIndex + 1
} else if let firstMember = memberIndices.first {
targetIndex = firstMember
} else {
return
}

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.

P2 afterCurrent fallback silently no-ops when group has no members and no anchor

When referenceWorkspaceId is nil (or not found in the group), group.anchorWorkspaceId is absent, and memberIndices is empty, the function returns early without placing the workspace at all. The workspace is left in whatever position addWorkspace inserted it, which can land it outside the group's contiguous block. The .top and .end cases have the same silent-return, so this is pre-existing behaviour, but the new default makes this path reachable more often. A log at the .logger level on the otherwise-dead return would make the failure visible in diagnostics.

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

🤖 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 `@CLI/cmux.swift`:
- Around line 13278-13280: Rewrite the ambiguous sentence to explicitly state
the resolution order: indicate that placement is determined first from the
per-cwd cmux.json value named newWorkspacePlacement, and if that is not present
the global default is used; update the comment containing "Placement follows
per-cwd cmux.json `newWorkspacePlacement`, then the global default" to a clearer
form that lists the two steps in that order so readers can unambiguously find
`newWorkspacePlacement` in the per-directory cmux.json.

In `@cmuxTests/WorkspaceGroupTests.swift`:
- Around line 503-510: Replace the manual multiple `#expect` assertions in the
test function workspaceGroupNewPlacementParsesConfigSpellings with a
parameterized `@Test`(arguments:) data-driven test: define an array of
input/expected pairs for WorkspaceGroupNewPlacement(rawString:) (including
"afterCurrent"/"after-current"/"after_current" -> .afterCurrent, "top" -> .top,
"end" -> .end, "middle" -> nil) and convert the test to accept parameters and
assert the parsed result equals the expected value; this keeps the test concise
and lets you add more spellings easily while still exercising
WorkspaceGroupNewPlacement(rawString:).

In `@web/data/cmux.schema.json`:
- Around line 168-173: The schema property newWorkspacePlacement in
web/data/cmux.schema.json is missing a descriptionKey for i18n; add a
descriptionKey (e.g.,
"schemaDescriptions.workspaceGroups.newWorkspacePlacement") alongside the
existing description so page.tsx's t(property.descriptionKey) can resolve a
localized string, then add the matching entry under
"schemaDescriptions.workspaceGroups.newWorkspacePlacement" in
web/messages/en.json and all other locale files with translated text matching
the current description. Ensure the key name matches exactly between the JSON
schema property and the entries in web/messages/* so page.tsx (which reads
property.descriptionKey) can load localized descriptions.
- Around line 199-203: The schema property newWorkspacePlacement in
cmux.schema.json needs internationalization: add a descriptionKey (matching the
pattern used elsewhere, e.g., descriptionKey:
"schemaDescriptions.workspaceGroups.byCwd.newWorkspacePlacement") alongside the
existing description, and then add the corresponding entry to
web/messages/en.json (and all other locale files) under
schemaDescriptions.workspaceGroups.byCwd.newWorkspacePlacement with the full
user-facing string from the review; ensure translations are added for Japanese
and each supported locale to keep parity with other fields.
🪄 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: 32a338c5-72c3-4ac5-b5ac-00578e655f7c

📥 Commits

Reviewing files that changed from the base of the PR and between 5dac49f and 6e718f5.

📒 Files selected for processing (17)
  • CLI/cmux.swift
  • Resources/Localizable.xcstrings
  • Sources/AppDelegate.swift
  • Sources/CmuxConfig.swift
  • Sources/CmuxSettingsJSONPathSupport.swift
  • Sources/KeyboardShortcutSettingsFileStore+Template.swift
  • Sources/KeyboardShortcutSettingsFileStore.swift
  • Sources/SettingsNavigation.swift
  • Sources/SettingsSearchAliases.swift
  • Sources/TabManager.swift
  • Sources/TerminalController.swift
  • Sources/cmuxApp.swift
  • cmuxTests/WorkspaceGroupTests.swift
  • cmuxTests/WorkspaceUnitTests.swift
  • docs/workspace-groups.md
  • web/app/[locale]/docs/configuration/page.tsx
  • web/data/cmux.schema.json

Comment thread CLI/cmux.swift Outdated
Comment thread cmuxTests/WorkspaceGroupTests.swift Outdated
Comment thread web/data/cmux.schema.json
Comment thread web/data/cmux.schema.json
Comment thread Sources/AppDelegate.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 1b85d69. Configure here.

Comment thread Sources/AppDelegate.swift Outdated
@lawrencecchen
lawrencecchen merged commit b2fc7ae into main May 30, 2026
19 of 20 checks passed
@lawrencecchen
lawrencecchen deleted the feat-group-new-workspace-placement branch May 30, 2026 11:19
hhsw2015 pushed a commit to hhsw2015/cmux that referenced this pull request May 30, 2026
- Keep workspace group creation in place (manaflow-ai#4989)
- Allow narrower sidebar with titlebar accessories (manaflow-ai#5013)
- Add beta TextBox defaults settings (manaflow-ai#4773)
- Add default terminal registration (manaflow-ai#4935)
- Make group new workspace placement configurable (manaflow-ai#5018)
- Fix nightly publishing runner selection (manaflow-ai#5022)

Conflicts resolved:
- ContentView: take upstream's SidebarWorkspaceTopDropIndicator extraction.
- cmuxApp: keep fork's QuickTerminal/WorkspaceTopTabsVisibility @AppStorage
  + TerminalCopyOnSelectSettings; adopt upstream's Setting(\.terminal.*)
  for textBoxMaxLines + showTextBoxOnNewTerminals + focusTextBoxOnNewTerminals.
- xcstrings: keep both fork's settings.app.workspaceTopTabsVisibility[.*]
  keys and upstream's settings.app.workspaceGroupNewWorkspacePlacement.
- TabManagerUnitTests: drop fork's testNewSurfaceCreatesAndFocusesTopLevelTab
  (upstream renames + retains coverage via testNewSurfaceFocusesCreatedSurface).

This branch was successfully deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant