Skip to content

Split AppDelegate support code into focused files - #3104

Merged
lawrencecchen merged 6 commits into
mainfrom
feat-appdelegate-support-splits
Apr 22, 2026
Merged

lawrencecchen merged 6 commits into
mainfrom
feat-appdelegate-support-splits

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Apr 22, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Split large top-level support domains out of Sources/AppDelegate.swift into focused files under Sources/App/:

  • terminal directory/open-in-app and VS Code serve-web support
  • cmux CLI installer support
  • screen display identity helper
  • shortcut/browser routing helpers
  • menu bar extra controller and formatting support

No behavior changes intended. This sets up clearer future package boundaries for app integration helpers while keeping the PR as a mechanical move.

Verification

  • ./scripts/reload.sh --tag appsplit

Summary by CodeRabbit

  • New Features

    • Menu bar status item with notifications, badge rendering and quick actions.
    • Open-current-directory support for multiple terminal/IDE targets, including VS Code serve‑web flow.
    • Improved keyboard shortcut routing across browser, terminal and app contexts.
    • Built-in installer/uninstaller for the bundled CLI and screen-identification helper.
  • Refactor

    • Routing, menu bar, terminal-open, and related utilities moved out of the app delegate into dedicated modules.
  • Tests

    • Added test to verify directory deduplication (symlink vs real path).

Summary by cubic

Split support code out of AppDelegate into focused files under Sources/App. Improved installer I/O to prevent hangs, deduplicated Finder-selected directories that resolve to the same path, and hardened shortcut routing edge cases.

  • Refactors

    • Added TerminalDirectoryOpenSupport.swift, ShortcutRoutingSupport.swift, MenuBarExtraController.swift, CmuxCLIPathInstaller.swift, ScreenIdentity.swift.
    • Updated the project file and trimmed AppDelegate.swift by moving support code.
  • Bug Fixes

    • Hardened shortcut routing: ignore Caps Lock, normalize modifiers, and avoid NSTextView.delegate lookups in focus checks (tests added).
    • Deduplicate Finder directory results when symlink and real paths point to the same location (test added).

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

@vercel

vercel Bot commented Apr 22, 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 Apr 22, 2026 11:13am

@coderabbitai

coderabbitai Bot commented Apr 22, 2026 •

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Extracted many AppDelegate-scoped helpers into five new Swift source files, added those files to the Xcode project build, added a new test, and relaxed AppDelegate.browserFindBarIsVisible(for:) visibility to internal.

Changes

Cohort / File(s) Summary
Project Configuration
GhosttyTabs.xcodeproj/project.pbxproj
Added PBXFileReference/PBXBuildFile entries and included new Swift sources and test in the GhosttyTabs target build phase.
CLI Installer
Sources/App/CmuxCLIPathInstaller.swift
New CmuxCLIPathInstaller implementing unprivileged symlink install/uninstall with privileged-fallback execution, verification, structured outcomes, and installer errors.
Menu Bar Controller
Sources/App/MenuBarExtraController.swift
New MenuBarExtraController and supporting types for status-item, dynamic menu rebuilding, unread snapshots, badge rendering, menu actions, and Combine-driven refresh.
Terminal Directory & VS Code
Sources/App/TerminalDirectoryOpenSupport.swift
Moved terminal-directory utilities, TerminalDirectoryOpenTarget, VS Code CLI launch-config builder, VSCodeServeWebController process lifecycle and output parsing, and workspace-digit mapping.
Shortcut Routing
Sources/App/ShortcutRoutingSupport.swift
Centralized keyboard/menu shortcut routing helpers (omnibar/arrow/return handling, command-palette navigation/submission, zoom/find routing, responder focus/repair helpers, debug traces).
Screen Identity
Sources/App/ScreenIdentity.swift
Added NSScreen.cmuxDisplayID: UInt32? computed property.
Refactoring Source
Sources/AppDelegate.swift
Removed the extracted helpers/types (large deletions) and changed browserFindBarIsVisible(for:) from fileprivate to internal.
Tests
cmuxTests/OmnibarAndToolsTests.swift
Added test testOrderedUniqueDirectoriesDedupesSymlinkAndRealPaths validating symlink vs real-path deduplication in FinderServicePathResolver.

Sequence Diagram(s)

sequenceDiagram
  participant UI as Caller (UI)
  participant Controller as VSCodeServeWebController
  participant Process as serve-web Process
  participant Collector as ServeWebOutputCollector
  participant FS as FileSystem (tmp)

  UI->>Controller: ensureServeWebURL(vscodeApplicationURL, completion)
  Controller->>Process: spawn serve-web (executableURL, env, args)
  Process-->>Collector: stdout/stderr lines (stream)
  Collector->>Controller: signal when Web UI URL parsed
  Controller->>FS: write connection token file (tmp)
  Controller-->>UI: completion(.success(webUIURL))
  Note over Controller,Process: on stop/restart -> terminate Process and remove token file
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • #685 — Related: adds/extracts VS Code serve-web integration and builders/controllers now moved into TerminalDirectoryOpenSupport.
  • #626 — Related: introduces the same CmuxCLIPathInstaller install/uninstall symlink logic moved out of AppDelegate.
  • #2780 — Related: overlaps omnibar/arrow-key shortcut routing helpers and relocation of browser/omnibar routing logic.

Poem

🐇 I hopped through files, unbundled a heap,

Five tidy sprites now wake from their sleep.
Menus, shortcuts, terminals set free,
AppDelegate lighter — a carrot for me! 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.97% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately summarizes the main change: splitting AppDelegate support code into focused files. It is concise, clear, and directly related to the changeset.
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.
Description check ✅ Passed PR description adequately summarizes the refactoring effort (code split/reorganization) with verification method, though lacks detailed Testing and Demo Video sections from the template.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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-appdelegate-support-splits

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 Apr 22, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR mechanically splits code from Sources/AppDelegate.swift into five focused files under Sources/App/: CmuxCLIPathInstaller.swift, MenuBarExtraController.swift, ScreenIdentity.swift, ShortcutRoutingSupport.swift, and TerminalDirectoryOpenSupport.swift. The Xcode project file is updated to register all new files in the build phase. No logic changes are made; the intent is purely organizational.

Confidence Score: 5/5

Safe to merge — pure mechanical extraction with no logic changes and correct Xcode project registration.

All five new files are verbatim moves of existing code. The Xcode project is updated correctly in all three sections (PBXBuildFile, PBXFileReference, Sources build phase). No new logic, no new coupling, and no behaviour changes are introduced. All remaining findings are P2 or lower.

No files require special attention.

Important Files Changed

Filename Overview
GhosttyTabs.xcodeproj/project.pbxproj Adds PBXBuildFile and PBXFileReference entries plus Sources build-phase entries for all five new files; changes look correct and complete.
Sources/App/CmuxCLIPathInstaller.swift New file containing the CLI symlink installer; code moved verbatim from AppDelegate.swift. Logic is self-contained and well-structured.
Sources/App/MenuBarExtraController.swift New file containing the menu bar controller and all formatting helpers; still references AppDelegate.shared for tab-title lookups (pre-existing coupling, not introduced by this PR).
Sources/App/ScreenIdentity.swift Tiny new file exposing NSScreen.cmuxDisplayID; clean and self-contained.
Sources/App/ShortcutRoutingSupport.swift New file with all keyboard shortcut/browser routing helpers; still references AppDelegate.shared for find-bar state (pre-existing coupling, not introduced here).
Sources/App/TerminalDirectoryOpenSupport.swift Largest new file; contains terminal open targets, VS Code serve-web controller and output collector, and workspace shortcut mapper. All moved verbatim from AppDelegate.swift.
Sources/AppDelegate.swift Large file trimmed of the extracted code; retained content is unchanged and the file remains the primary app delegate.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    AD[Sources/AppDelegate.swift]

    AD -->|extracted| CLI[App/CmuxCLIPathInstaller.swift\nCLI symlink install/uninstall]
    AD -->|extracted| MB[App/MenuBarExtraController.swift\nMenu bar controller + formatters]
    AD -->|extracted| SI[App/ScreenIdentity.swift\nNSScreen.cmuxDisplayID]
    AD -->|extracted| SR[App/ShortcutRoutingSupport.swift\nKeyboard + browser routing helpers]
    AD -->|extracted| TD[App/TerminalDirectoryOpenSupport.swift\nOpen-in-app targets + VSCode serve-web]

    MB -->|still calls| AD
    SR -->|still calls| AD
Loading

Reviews (1): Last reviewed commit: "Split AppDelegate support code into focu..." | Re-trigger Greptile

@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

🧹 Nitpick comments (1)
Sources/App/TerminalDirectoryOpenSupport.swift (1)

84-90: Centralize the deprecated API call in a wrapper to avoid re-spreading the deprecation warning.

NSWorkspace.shared.fullPath(forApplication:) is deprecated on macOS. Rather than call it directly in the DetectionEnvironment.live closure, wrap it in a private helper (similar to the makeAppcastItem pattern used in Sources/Update/UpdateTestSupport.swift) so the deprecation warning is localized to a single definition site and accepted there, rather than propagating to each call site.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/App/TerminalDirectoryOpenSupport.swift` around lines 84 - 90, The use
of the deprecated NSWorkspace.shared.fullPath(forApplication:) should be
localized: create a private helper function (e.g., private func
applicationPathForNameDeprecated(_ name: String) -> String?) that calls
NSWorkspace.shared.fullPath(forApplication:) and annotate/guard the deprecation
in that single function, then replace the inline closure in
DetectionEnvironment.live's applicationPathForName with a reference to that
helper; this centralizes the deprecation warning to one definition site (similar
to makeAppcastItem) and prevents the warning from being emitted at every call
site.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Sources/App/CmuxCLIPathInstaller.swift`:
- Around line 253-284: The runPrivilegedShellCommand function can deadlock
because process.waitUntilExit() is called before draining the stdout/stderr
pipes; update runPrivilegedShellCommand to install readabilityHandler closures
on stdout.fileHandleForReading and stderr.fileHandleForReading that append
incoming Data into local Data buffers (or use readInBackgroundAndNotify) before
calling try process.run() and process.waitUntilExit(), then remove/clear the
handlers and convert the accumulated Data to Strings to produce
stderrText/stdoutText and the InstallerError message; keep the existing logic
for terminationStatus and throwing InstallerError.

In `@Sources/App/ShortcutRoutingSupport.swift`:
- Around line 536-548: Remove the unsafe dereference of NSTextView.delegate in
the non-field-editor branch: keep the existing field-editor path that uses
cmuxFieldEditorOwnerView(_ ) -> cmuxOwningGhosttyView(for:), but delete the `if
!textView.isFieldEditor` branch that casts/reads textView.delegate; instead
allow the code to fall through to the existing nextResponder/superview traversal
(and any hostedView.responderMatchesPreferredKeyboardFocus(...) logic) to
resolve non-field-editor ownership safely. Ensure no other code in
ShortcutRoutingSupport.swift reads NSTextView.delegate on this routing path.

---

Nitpick comments:
In `@Sources/App/TerminalDirectoryOpenSupport.swift`:
- Around line 84-90: The use of the deprecated
NSWorkspace.shared.fullPath(forApplication:) should be localized: create a
private helper function (e.g., private func applicationPathForNameDeprecated(_
name: String) -> String?) that calls
NSWorkspace.shared.fullPath(forApplication:) and annotate/guard the deprecation
in that single function, then replace the inline closure in
DetectionEnvironment.live's applicationPathForName with a reference to that
helper; this centralizes the deprecation warning to one definition site (similar
to makeAppcastItem) and prevents the warning from being emitted at every call
site.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 625763cd-5d76-4f00-bf8f-d0bed78bbbc4

📥 Commits

Reviewing files that changed from the base of the PR and between ad20c65 and a2729f9.

📒 Files selected for processing (7)
  • GhosttyTabs.xcodeproj/project.pbxproj
  • Sources/App/CmuxCLIPathInstaller.swift
  • Sources/App/MenuBarExtraController.swift
  • Sources/App/ScreenIdentity.swift
  • Sources/App/ShortcutRoutingSupport.swift
  • Sources/App/TerminalDirectoryOpenSupport.swift
  • Sources/AppDelegate.swift

Comment thread Sources/App/CmuxCLIPathInstaller.swift
Comment thread Sources/App/ShortcutRoutingSupport.swift

@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.

2 issues found across 7 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="Sources/App/ShortcutRoutingSupport.swift">

<violation number="1" location="Sources/App/ShortcutRoutingSupport.swift:132">
P2: Ignore Caps Lock in command-palette navigation flag normalization; otherwise arrow and Ctrl+N/Ctrl+P navigation can fail when Caps Lock is enabled.</violation>
</file>

<file name="Sources/App/TerminalDirectoryOpenSupport.swift">

<violation number="1" location="Sources/App/TerminalDirectoryOpenSupport.swift:572">
P1: Clear `readabilityHandler` on EOF to prevent an infinite CPU spin.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread Sources/App/TerminalDirectoryOpenSupport.swift Outdated
Comment thread Sources/App/ShortcutRoutingSupport.swift Outdated

@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 the current code and only fix it if needed.

Inline comments:
In `@Sources/App/CmuxCLIPathInstaller.swift`:
- Around line 268-277: The race occurs because startDraining installs
readabilityHandler callbacks for stdout/stderr that stay active until the defer,
while drainRemainingOutput synchronously calls readDataToEndOfFile on the same
file handles; to fix, stop the handlers before doing the final synchronous
drain: remove or nil-out stdout.fileHandleForReading.readabilityHandler and
stderr.fileHandleForReading.readabilityHandler immediately after
process.waitUntilExit (and before calling drainRemainingOutput), then perform
drainRemainingOutput on stdout and stderr, keeping the existing defer only as a
safety no-op; update the code around startDraining, process.waitUntilExit, and
drainRemainingOutput to reflect this ordering so handlers cannot overlap with
readDataToEndOfFile.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 50b43f9d-f946-4bdc-bdab-1c087763f9d1

📥 Commits

Reviewing files that changed from the base of the PR and between a2729f9 and 2a043f1.

📒 Files selected for processing (1)
  • Sources/App/CmuxCLIPathInstaller.swift

Comment thread Sources/App/CmuxCLIPathInstaller.swift Outdated

@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

♻️ Duplicate comments (1)
Sources/App/CmuxCLIPathInstaller.swift (1)

268-277: ⚠️ Potential issue | 🟡 Minor

Residual race between readabilityHandler and final readDataToEndOfFile.

The prior draining-race concern was marked as addressed, but the current ordering still leaves the readabilityHandler callbacks installed while drainRemainingOutput synchronously calls readDataToEndOfFile on the same file handles (the defer that nils them runs only at scope exit). The handlers self-clear when they observe an empty availableData, but on process exit there's still a window where a background readability callback and the synchronous end-of-file read can both touch the pipe fd, potentially splitting bytes or — on some releases — triggering NSFileHandleOperationException.

Explicitly nil both readabilityHandlers immediately after process.waitUntilExit() and before the drainRemainingOutput(...) calls (option b from the earlier suggestion), or commit fully to option a (rely on the EOF callback and drop the trailing synchronous drain).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/App/CmuxCLIPathInstaller.swift` around lines 268 - 277, After
process.waitUntilExit() nil out the readability handlers on the stdout and
stderr file handles before calling drainRemainingOutput to avoid races:
explicitly set stdout.fileHandleForReading.readabilityHandler = nil and
stderr.fileHandleForReading.readabilityHandler = nil immediately after
process.waitUntilExit() (and keep the existing defer that clears them as a
safety net), so the installed startDraining callbacks are removed prior to
calling drainRemainingOutput on the same handles.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Sources/App/TerminalDirectoryOpenSupport.swift`:
- Around line 45-53: The current deduplication uses the unresolved path string
(created from directoryURL.path(percentEncoded: false) and
canonicalDirectoryPath) while isSameOrDescendant and resolvedDirectoryURL(from:)
operate on resolved (symlink-resolved) URLs, so the same physical directory can
be added twice via symlink and real paths; fix by deriving a single
canonical/resolved identifier before checking and inserting into seen: call
resolvedDirectoryURL(from:) then compute its canonicalDirectoryPath (or another
symlink-resolved path string) and use that resolvedPath for the seen set
membership test and for appending to directories instead of the unresolved path;
keep isSameOrDescendant checks as-is but ensure seen tracks the resolved
canonical path.

---

Duplicate comments:
In `@Sources/App/CmuxCLIPathInstaller.swift`:
- Around line 268-277: After process.waitUntilExit() nil out the readability
handlers on the stdout and stderr file handles before calling
drainRemainingOutput to avoid races: explicitly set
stdout.fileHandleForReading.readabilityHandler = nil and
stderr.fileHandleForReading.readabilityHandler = nil immediately after
process.waitUntilExit() (and keep the existing defer that clears them as a
safety net), so the installed startDraining callbacks are removed prior to
calling drainRemainingOutput on the same handles.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: f2935de7-89d5-449f-a80f-64b63a544431

📥 Commits

Reviewing files that changed from the base of the PR and between 2a043f1 and d0ea053.

📒 Files selected for processing (2)
  • Sources/App/CmuxCLIPathInstaller.swift
  • Sources/App/TerminalDirectoryOpenSupport.swift

Comment thread Sources/App/TerminalDirectoryOpenSupport.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.

🧹 Nitpick comments (1)
Sources/App/TerminalDirectoryOpenSupport.swift (1)

87-92: Wrap the deprecated API call behind a private helper to centralize the warning.

Line 91 directly calls NSWorkspace.shared.fullPath(forApplication:), which spreads the deprecation warning across the codebase. Instead, route this through a private _legacyFullPath(forApplication:) wrapper so the warning stays localized to a single site. Per repository practice, the helper should remain marked available(macOS, deprecated: 11.0) to accept the warning at the point where it has no non-deprecated replacement.

Suggested refactor
        static let live = DetectionEnvironment(
            homeDirectoryPath: FileManager.default.homeDirectoryForCurrentUser.path,
            fileExistsAtPath: { FileManager.default.fileExists(atPath: $0) },
            isExecutableFileAtPath: { FileManager.default.isExecutableFile(atPath: $0) },
-            applicationPathForName: { NSWorkspace.shared.fullPath(forApplication: $0) }
+            applicationPathForName: { Self._legacyFullPath(forApplication: $0) }
         )
     }
+
+    `@available`(macOS, deprecated: 11.0)
+    private static func _legacyFullPath(forApplication applicationName: String) -> String? {
+        NSWorkspace.shared.fullPath(forApplication: applicationName)
+    }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/App/TerminalDirectoryOpenSupport.swift` around lines 87 - 92, The
live DetectionEnvironment currently calls the deprecated
NSWorkspace.shared.fullPath(forApplication:) directly; add a private helper
named _legacyFullPath(forApplication:) annotated with available(macOS,
deprecated: 11.0) that calls NSWorkspace.shared.fullPath(forApplication:), then
change the applicationPathForName closure in DetectionEnvironment.live to call
this helper instead so the deprecation warning is centralized to one location.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@Sources/App/TerminalDirectoryOpenSupport.swift`:
- Around line 87-92: The live DetectionEnvironment currently calls the
deprecated NSWorkspace.shared.fullPath(forApplication:) directly; add a private
helper named _legacyFullPath(forApplication:) annotated with available(macOS,
deprecated: 11.0) that calls NSWorkspace.shared.fullPath(forApplication:), then
change the applicationPathForName closure in DetectionEnvironment.live to call
this helper instead so the deprecation warning is centralized to one location.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fe6e04df-3801-419c-bdc0-d7361e399c44

📥 Commits

Reviewing files that changed from the base of the PR and between d295f48 and 0891c83.

📒 Files selected for processing (2)
  • Sources/App/TerminalDirectoryOpenSupport.swift
  • cmuxTests/OmnibarAndToolsTests.swift

rodchristiansen pushed a commit to rodchristiansen/cmux that referenced this pull request Sep 2, 2026
* Split AppDelegate support code into focused files

* Drain privileged installer output before waiting

* Clear pipe readers at EOF

* Avoid overlapping privileged output reads

* Deduplicate resolved Finder directories

* Harden shortcut routing edge cases

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>

This branch was successfully deployed

1 active deployment
Preview — f7aef0fa Deployed Apr 22, 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