Commit graph

1905 commits

Author SHA1 Message Date
Haruki Tosa
c6e8d8484b
Fix exclusive-access crash in WindowDragHandleView hitTest (#736)
Add early return for non-leftMouseDown events in DraggableView.hitTest
to prevent re-entering SwiftUI view state during mouseMoved layout
passes, which caused fatal exclusive-access violations.
2026-03-01 21:38:23 -08:00
Lawrence Chen
33242f8780
Fix menubar icon invisible in light mode (#741)
Set isTemplate = true on the menu bar icon image so macOS automatically
renders it black in light mode and white in dark mode. Changed the glyph
fill from white to black per template image convention.

Closes https://github.com/manaflow-ai/cmux/issues/737
2026-03-01 21:35:50 -08:00
Lawrence Chen
944d337fcf Keep localhost visible in SSH omnibar URLs
Remote loopback requests still route through the localtest.me alias for proxy transport, but the omnibar now canonicalizes the alias host back to localhost for display.
2026-03-01 21:29:14 -08:00
Lawrence Chen
0d3d71661d Show SSH heartbeat status on blank browser tabs
Propagate workspace remote state + heartbeat into browser panels, add heartbeat emission in remote session controller, extend docker bootstrap regression for heartbeat continuity after blank browser open, and scrub workspace/surface env vars in tagged reload launches.
2026-03-01 19:40:22 -08:00
Lawrence Chen
aaf6a24165
Show GitHub star badge in mobile header (#735)
Removed the `hidden md:flex` wrapper so the GitHubStarsBadge renders on
all screen sizes. Made the component reusable with optional `location`
and `className` props. Replaced the plain "GitHub" text link in the
mobile drawer with the star badge component.
2026-03-01 19:07:20 -08:00
Lawrence Chen
58bb9bc655
Migrate all workflows from self-hosted Mac Mini to Depot runners (#730)
* Migrate all workflows from self-hosted Mac Mini to Depot runners

Move CI, nightly, and release workflows to depot-macos-latest. Replace
zig GhosttyKit builds with pre-built xcframework downloads. Add virtual
display for CI UI tests. Remove concurrency groups (ephemeral VMs don't
need them).

* Add per-test timeout to CI UI tests to prevent hangs on Depot

SidebarResizeUITests hangs on headless Depot runners due to mouse drag
simulation issues. Adding -maximum-test-execution-time-allowance 120
(matching test-depot.yml) ensures individual tests timeout after 2 min
instead of blocking the entire run.

* Skip SidebarResizeUITests in CI on Depot runners

Mouse drag simulation hangs on headless Depot runners even with a
virtual display. The per-test timeout doesn't prevent the hang either.
Skip this test class in CI; it still runs fine on local machines.

* Handle XCTExpectFailure in CI UI tests (exit 65 with 0 unexpected)

xcodebuild exits 65 even when all failures use XCTExpectFailure. Add
the same expected-failure handling from the unit test step so browser
focus tests (which are expected to fail on headless runners) don't
break CI.
2026-03-01 19:06:45 -08:00
Lawrence Chen
803912a9e3 Route remote localhost browser traffic through SSH proxy 2026-03-01 19:04:36 -08:00
Lawrence Chen
ae79d32494
Add inline VS Code open-directory command palette action (#685)
* Add inline VS Code directory command-palette action

* Harden inline VS Code serve-web lifecycle handling

* Add command-palette actions to stop/restart inline VS Code server

* Fix inline VS Code serve-web review comments

* Fix serve-web stop/start race and add regression test
2026-03-01 18:53:08 -08:00
Lawrence Chen
7f9e04826a
Fade in GitHub stars badge and reduce right padding (#703)
Stars badge now fades in over 500ms instead of popping in abruptly.
Reduced right padding from pr-2 to pr-1.
2026-03-01 18:53:06 -08:00
Lawrence Chen
e97378846c Harden SSH daemon bootstrap and clarify proxy-only errors 2026-03-01 18:49:59 -08:00
Lawrence Chen
3bcf28f3e9 Preserve SSH scrollback across split resize churn 2026-03-01 17:22:17 -08:00
Lawrence Chen
1fcbdc9417
Split self-hosted concurrency groups per workflow (#729)
* Add virtual display for headless Depot runners

Depot macOS runners have no physical display, causing XCUITests to fail
with "Failed to activate application (current state: Running Background)".
This adds a small ObjC tool that creates a virtual display using the
private CGVirtualDisplay API before tests run.

* Split self-hosted concurrency groups per workflow

CI, nightly, and release all shared `self-hosted-build`, so the hourly
nightly cancelled in-progress CI runs. Now each workflow has its own
group (self-hosted-ci, self-hosted-nightly, self-hosted-release).

CI also gets cancel-in-progress: true so rapid pushes cancel stale runs.
2026-03-01 16:34:38 -08:00
Lawrence Chen
9f18ae7f96 fix resize scrollback retention and harden remote ssh cmd+d resize regression 2026-03-01 04:41:11 -08:00
Lawrence Chen
2b66a2f5c1
Add virtual display for headless Depot runners (#721)
Depot macOS runners have no physical display, causing XCUITests to fail
with "Failed to activate application (current state: Running Background)".
This adds a small ObjC tool that creates a virtual display using the
private CGVirtualDisplay API before tests run.
2026-03-01 04:25:36 -08:00
Lawrence Chen
1b160dc5ca
Add display diagnostics, test filter, and per-test timeout to Depot workflow (#720)
- Display diagnostics step to debug headless display issues
- test_filter input to run specific XCUITest classes
- test_timeout input (default 120s) to prevent test hangs
2026-03-01 04:04:32 -08:00
Lawrence Chen
8378bbeaa2
Add dark mode app icon for macOS Sequoia (#702)
* Add dark mode app icon variant for macOS Sequoia

Adds dark appearance entries to the AppIcon asset catalog so macOS 15+
automatically shows a dark-background icon when the system is in dark
mode. The chevron gradient and glow are preserved by recompositing the
foreground over a dark background (#1C1C1E).

Includes a generation script (scripts/generate_dark_icon.py) that
derives the dark PNGs from the light originals.

* Add icon picker in Settings and fix dark icon quality

Use the Figma chevron layer (design/cmux-icon-chevron.png) composited
over a dark background for pixel-perfect results, no white halo or
darkened gradient. Falls back to mathematical recomposition if the Figma
layer is missing.

Add an "App Icon" picker to Settings (under Theme) with three visual
options: Automatic (follows system appearance via asset catalog dark
variants on macOS 15+), Light, and Dark. The selection persists via
UserDefaults and is applied on launch in AppDelegate.ensureApplicationIcon.

* Fix dark icon chevron scale to match light icon

The Figma export was ~25% larger than the repo icon. Scale the Figma
chevron layer by 0.80x before compositing so the chevron size matches
exactly between light and dark variants.

* Use enhanced glow for dark icon

Add a soft blue bloom around the chevron on the dark background using
two Gaussian blur passes (wide at r=25 and tight at r=12) composited
at reduced opacity beneath the sharp chevron. Makes the icon pop more
against the dark squircle.
2026-03-01 03:57:09 -08:00
Lawrence Chen
bc1b6fd9eb
Honor Ghostty background-opacity across all cmux chrome (#667)
* Honor Ghostty background-opacity across all cmux chrome

Parse background-opacity from Ghostty config and propagate it through
the entire chrome pipeline: bonsplit tab bar (via RRGGBBAA hex),
browser panel/omnibar, titlebar, empty panel, and window background.

Decouple glass effect from sidebar blend mode — bgGlassEnabled now
defaults to false so opacity works independently. Add
GhosttyBackgroundTheme helper for consistent color+opacity resolution
across all UI surfaces.

Fixes https://github.com/manaflow-ai/cmux/issues/263

* Titlebar and chrome opacity matches terminal background-opacity

Use CALayer-level opacity for the titlebar background instead of SwiftUI
Color alpha, matching the terminal's Metal compositing path. Account for
the double alpha stacking in the terminal area (Bonsplit container bg +
Ghostty renderer) so the titlebar visually matches.

Also fix opacity-only config changes not triggering titlebar refresh on
Cmd+Shift+, reload.
2026-03-01 03:48:46 -08:00
Lawrence Chen
e295f384fc
Run all XCUITests in CI and add skip_unit_tests to Depot workflow (#718)
* Run all XCUITests in CI instead of just UpdatePillUITests

Removes the -only-testing:cmuxUITests/UpdatePillUITests filter so
new test classes are picked up automatically. No more workflow edits
needed when adding tests.

* Add skip_unit_tests input to test-depot workflow
2026-03-01 02:58:27 -08:00
doug
e01236115e
Fix: use policy constants for minimum window size instead of hardcoded 800×600 (#715)
The root ContentView body had `.frame(minWidth: 800, minHeight: 600)`
hardcoded since the initial commit, preventing users from resizing the
window narrower than 800px even when the sidebar is hidden and a narrow
terminal layout is perfectly usable.

Replace the magic numbers with the existing SessionPersistencePolicy
constants (minimumWindowWidth = 300, minimumWindowHeight = 200), which
were already defined and used for session-restore frame validation.
This gives those constants a second job as the canonical size floor and
makes it easy to tune the minimum in one place.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-01 02:42:41 -08:00
Lawrence Chen
9dd19161be fix: preserve read_text scrollback tail across resize 2026-02-28 23:22:03 -08:00
Austin Wang
dba1e232d3
Fix SwiftPM binary artifact cache collision in CI (#716)
After rm -rf of the SPM cache dir, recreate it as an empty directory
so binary target downloads (e.g. Sentry.xcframework.zip) don't hit
"already exists in file system" errors from stale artifacts on the
self-hosted runner.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:18:21 -08:00
Lawrence Chen
9d00ae9ab0
Move Build GhosttyKit to Depot to avoid self-hosted concurrency cancellations (#713)
build-ghosttykit shared the self-hosted-build concurrency group with
CI tests, causing one to get cancelled when both trigger on the same
push. Most runs are no-ops (xcframework already exists), so Depot is
a good fit. Eliminates the red X on pushes to main.
2026-02-28 22:46:15 -08:00
Lawrence Chen
6fe70e037f test: add ls resize scrollback regression coverage 2026-02-28 22:34:42 -08:00
Lawrence Chen
b6efd73d57
Switch CI and Build GhosttyKit to Depot macOS runners (#710)
* Switch CI and Build GhosttyKit to Depot macOS runners

Moves the tests job (unit + UI) and build-ghosttykit job from
self-hosted to depot-macos-latest so CI doesn't block the local
Mac Mini. CI tests now download the pre-built xcframework from
the ghostty releases instead of building with zig. Nightly and
release workflows stay on self-hosted for signing/notarization.

* Add on-demand Depot test workflow, revert CI changes

Adds test-depot.yml (workflow_dispatch) for running tests on Depot
macOS runners during local dev without tying up the Mac Mini.
Reverts ci.yml and build-ghosttykit.yml back to self-hosted.
2026-02-28 22:32:51 -08:00
Lawrence Chen
8b4abd8ff0
Remove Xcode Cloud CI scripts (#709)
Xcode Cloud workflows have been deleted from App Store Connect. These hook scripts are no longer needed since CI/CD runs through GitHub Actions.
2026-02-28 22:12:10 -08:00
Lawrence Chen
43c1a25db0 test: harden resize content continuity regressions 2026-02-28 21:24:44 -08:00
Austin Wang
aa8fc7232a
Fix Shift+Space IME toggle inserting space (#641) (#670) 2026-02-28 21:12:17 -08:00
Lawrence Chen
f451766d12
Add cmux <path> to open directories and Homebrew binary stanza (#705)
* Add `cmux <path>` to open directories and Homebrew binary stanza

CLI: `cmux .` or `cmux /path/to/dir` opens a new workspace at the
given directory. If the app isn't running, it launches first and waits
for the socket. Also adds `--cwd` flag to `new-workspace`.

Server: `workspace.create` now accepts an optional `cwd` parameter,
passed through to `TabManager.addWorkspace(workingDirectory:)`.

Homebrew: adds `binary` stanza to the cask so `cmux` CLI is globally
available after `brew install --cask cmux`. Updated both the cask file,
the CI workflow template, and the manual release script so automated
version bumps preserve the stanza.

* Address review: validate cwd type, fix socket detection, propagate errors

- looksLikePath now also matches paths containing `/` (e.g. `foo/bar`)
- openPath uses socket connection attempt instead of fileExists to detect
  whether the app is running (Unix sockets may not appear on filesystem)
- launchApp/activateApp now throw instead of swallowing errors with try?
- Server validates that cwd param is a string, returns invalid_params error
  if wrong type is passed
2026-02-28 20:25:41 -08:00
Lawrence Chen
fff1cd786f Fix ssh workspace focus and harden remote daemon bootstrap paths 2026-02-28 19:56:11 -08:00
Lawrence Chen
bfe36f817d Address remaining PR #239 review findings 2026-02-28 19:14:46 -08:00
Lawrence Chen
838d1b07b1
Fix local HTML file routing in open wrapper (#684)
* Route local HTML open targets to cmux browser

* Keep file:// omnibar navigation inside cmux browser

* Load local file URLs via WKWebView file API

* Add browser regression test for local file URL loads

* Address PR feedback on local HTML and file URL handling
2026-02-28 19:08:39 -08:00
Lawrence Chen
47f4b5e55a Address PR review feedback for SSH remote workspace flow 2026-02-28 17:36:07 -08:00
Lawrence Chen
c179ee74ea Merge origin/main into issue-151-ssh-remote-port-proxying 2026-02-28 17:17:30 -08:00
Lawrence Chen
6800cd44bb WIP: advance ssh remote workspace proxying 2026-02-28 17:05:55 -08:00
Lawrence Chen
2e2e190bf4
Add GitHub star count to site header (#673)
* Add GitHub star count to site header

Fetches star count from GitHub API via /api/github-stars with 5-minute
server-side caching (ISR + stale-while-revalidate). Shows formatted
count (e.g. "2.2k") next to the GitHub link in both desktop nav and
mobile drawer.

* Move star count to separate badge left of download button

GitHub icon + formatted count as its own clickable element in the
right header section, separate from the nav links. Desktop only.

* Center GitHub stars badge vertically in header

* Add right padding to GitHub stars badge
2026-02-28 17:02:19 -08:00
Lawrence Chen
7143359c04
Stabilize UI keyboard/focus regressions and flaky omnibar/sidebar tests (#689) 2026-02-28 07:09:37 -08:00
Lawrence Chen
7916b2d418
Fix Xcode Cloud UI tests by running TestAction in Debug (#672)
* Set cmux TestAction to Debug for UI tests

* Broaden XCTest detection for debug launch gate

* Fix AutomationSocketUITests launch hang in CI

* Stabilize CI Swift package resolution for test jobs

* Stabilize Xcode Cloud UI test focus and socket handling

* Add Xcode Cloud pre-xcodebuild submodule bootstrap

* Harden Xcode Cloud bonsplit bootstrap fallback
2026-02-28 01:48:49 -08:00
Lawrence Chen
168e6b9b25
Auto-heal missing CLI listener socket (#679)
* Auto-heal missing CLI socket listener

* Add Sentry socket listener breadcrumbs and failure capture
2026-02-28 01:19:38 -08:00
Lawrence Chen
be89812bea
Harden CI unit tests against SwiftPM artifact flakes (#682) 2026-02-28 00:38:46 -08:00
Lawrence Chen
c3b55e2a9f
Fix Cmd+plus zoom handling on non-US layouts (#680) 2026-02-28 00:16:03 -08:00
Lawrence Chen
f73887154d
Precompute panel ordering to reduce sidebar scroll lag (#661)
Sidebar body was calling sidebarOrderedPanelIds() multiple times per
render for branches, directories, and pull requests. Now computes it
once and passes through. Reduces redundant work during scroll frames.

Closes https://github.com/manaflow-ai/cmux/issues/655
2026-02-27 18:44:07 -08:00
Lawrence Chen
1392bd16d7 Revert "Use workspace color for notification ring and selection bar (#664)"
This reverts commit 4bfe95d125.
2026-02-27 18:24:51 -08:00
Lawrence Chen
4bfe95d125
Use workspace color for notification ring and selection bar (#664)
- Notification/focus flash uses workspace customColor (fallback: accent)
- Selection bar/indicator uses workspace customColor when set
- Flash color propagated through Panel.triggerFlash(color:) API
- Browser panel flash overlay uses workspace color
- Regression tests for flash color resolution

Fixes https://github.com/manaflow-ai/cmux/issues/557
2026-02-27 18:14:19 -08:00
Lawrence Chen
181574586e
Fix --help flag executing commands instead of showing help (#657)
* Fix --help flag executing commands instead of showing help (#650)

The --help check fell through to command dispatch when subcommandUsage
returned nil for a command. Now --help always returns before dispatch,
printing a generic fallback when no specific help text exists.

Also adds missing subcommandUsage entries for: new-window, list-panes,
list-pane-surfaces, surface-health, trigger-flash, list-panels,
focus-panel, set-app-focus, ping, capabilities, identify, list-windows,
current-window, refresh-surfaces, current-workspace, list-notifications,
clear-notifications.

Closes #650

* Document all flags and options in CLI --help output

Every subcommand's help text now shows all accepted flags, options,
environment variable fallbacks, and positional arguments matching the
actual dispatch code. Also adds help entries for commands that were
returning the generic fallback (list-workspaces, list-panes,
list-pane-surfaces, surface-health, trigger-flash, list-panels,
focus-panel, set-app-focus, etc.)

* Show 'Unknown command' for invalid commands, add legacy alias help

Unknown commands now show "Unknown command 'X'. Run 'cmux help' to see
available commands." instead of the misleading "No detailed help
available." Also adds help entries for legacy browser aliases
(open-browser, navigate, etc.) pointing to 'cmux browser --help'.

* Audit all 89 CLI commands for complete help coverage

- Add missing `help` subcommandUsage entry
- Expand id|ref → id|ref|index for move-workspace-to-window,
  close-workspace, select-workspace, rename-workspace
- Document CMUX_WORKSPACE_ID/CMUX_TAB_ID/CMUX_SURFACE_ID env var
  defaults in tab-action, rename-workspace
- Expand browser help: get (--selector, --attr, --property),
  find (--name, --exact, --index), network route (--abort, --body),
  open/open-split/new env var defaults
- Remove duplicate rename-window help case (now handled by
  rename-workspace combined case)
- Upgrade regression test to auto-extract dispatch+subcommandUsage
  switches and flag any commands missing help entries
2026-02-27 17:38:33 -08:00
Austin Wang
c5f749640a
Fix terminal wrap width for overlay scrollbar (#522) 2026-02-27 17:15:32 -08:00
Austin Wang
5c065bcf05
Merge pull request #646 from manaflow-ai/cmux/cmd-w-fails
Fix browser split behavior and prevent tagged app auto-close
2026-02-27 17:03:51 -08:00
Lawrence Chen
1fa0f2bcb6
Add Open Folder command (Cmd+O) (#656)
* Add "Open Folder…" command to open a workspace at a chosen directory

Adds a native folder picker (NSOpenPanel) accessible from:
- Command Palette (⌘⇧P → "Open Folder…")
- File menu with ⌘O shortcut

Selecting a folder opens a new workspace at that path.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Rename openRepository → openFolder, add customizable shortcut

- Rename command ID from palette.openRepository to palette.openFolder
- Register openFolder in KeyboardShortcutSettings (default: Cmd+O)
- Wire menu bar shortcut through settings instead of hardcoding
- Add commandPaletteShortcutAction mapping for shortcut hint display

* Dismiss command palette before showing Open Folder panel

The NSOpenPanel.runModal() call blocked the main thread, keeping the
command palette visible behind the file picker. Wrapping in
DispatchQueue.main.async lets the palette dismiss first.

* Trigger GitHub PR refresh

---------

Co-authored-by: michalstrnadel <michal.strnadel@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 16:28:18 -08:00
austinpower1258
e5aa6f6de7 Revert "Avoid auto-killing tagged app instances in reload script"
This reverts commit fac3b12eb7.
2026-02-27 12:01:29 -08:00
austinpower1258
fac3b12eb7 Avoid auto-killing tagged app instances in reload script 2026-02-27 11:54:37 -08:00
Austin Wang
f72ce07ad5
Merge pull request #585 from manaflow-ai/fix/issue-552-trackpad-scroll-not-working
Fix trackpad scrolling in terminal panes
2026-02-27 11:44:51 -08:00