Commit graph

1949 commits

Author SHA1 Message Date
Lawrence Chen
441118b1bb
Merge pull request #2030 from manaflow-ai/task-titlebar-folder-icon-left
Shift titlebar folder icon 7px left
2026-03-23 23:46:59 -07:00
Lawrence Chen
7f1e8835fe
Nudge titlebar folder icon right by 1px 2026-03-23 23:06:10 -07:00
Lawrence Chen
c544d49b79
Shift titlebar folder icon left 2026-03-23 19:54:18 -07:00
Lawrence Chen
22c50a4416
Merge pull request #2023 from manaflow-ai/task-fix-add-workspace-insert-index-crash
Avoid crash when creating a new workspace
2026-03-23 19:27:02 -07:00
austinpower1258
836360db36 fix: hide stale terminal portal after restore churn 2026-03-23 19:19:05 -07:00
austinpower1258
e41f39bd75 test: cover stale terminal portal after restore-like rebind 2026-03-23 19:18:53 -07:00
Lawrence Chen
4f5a3174e6
Clarify workspace insertion regression test 2026-03-23 19:16:39 -07:00
Lawrence Chen
1c45915a86
Avoid crash in workspace insert index 2026-03-23 19:10:33 -07:00
Lawrence Chen
202a699747
Add regression test for workspace insertion 2026-03-23 19:10:33 -07:00
Lawrence Chen
142c62c756
Add dual licensing (AGPL + commercial) (#2021)
* Add dual licensing (AGPL + commercial)

Add commercial license option for organizations that cannot comply with
AGPL. Contact founders@manaflow.com for details. Updates LICENSE preamble,
all README translations, and CONTRIBUTING.md.

* Fix AGPL identifier and strengthen contributor license grant

- Use AGPL-3.0-or-later (not AGPL-3.0) in all READMEs to match LICENSE
- Replace weak "retains the right" clause in CONTRIBUTING.md with explicit
  contributor license grant for commercial sublicensing

---------

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
2026-03-23 18:53:39 -07:00
austinpower1258
b5fb304af0 Handle headless CI runners in browser find focus UI test
On WarpBuild runners without a GUI session, XCUIApplication.launch()
blocks ~60s then fails with "Failed to activate application (current
state: Running Background)". Wrap launch() in XCTExpectFailure so the
test can continue — keyboard and element APIs work via accessibility
even when the app is in .runningBackground.

Increase test execution time allowance from 120s to 180s to account
for the 60s activation timeout on headless runners.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 04:46:18 -07:00
austinpower1258
381aab0d83 Add persistent virtual display for all UI regression tests
The browser find focus test was failing because XCUIApplication.launch()
cannot foreground-activate the app on headless CI runners (WarpBuild)
without a display. The display resolution test already had its own virtual
display, but it was scoped to that step only.

Create a persistent virtual display at the start of the ui-regressions job
that stays alive for all test steps. Also switch the browser test from
`test` to `test-without-building` since the build step already ran.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 04:35:43 -07:00
austinpower1258
81aaa8e2d0 Fix UI test harness validation: make startPath optional
The CI display helper now uses --start-delay-ms instead of --start-path
because the XCTest sandbox prevents writing to /tmp/. The harness manifest
no longer includes startPath, but the test guard still required it, causing
"Incomplete external display harness configuration" errors.

Make startPath optional in both the manifest and environment variable
harness loading paths, and gate the start signal write on displayStartPath
being non-empty.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 04:26:30 -07:00
austinpower1258
82a9ccf218 Fix sandbox file write issue: use start-delay-ms for display helper
The sandboxed XCTest runner can't write the start signal file to /tmp/.
Added --start-delay-ms to create-virtual-display.m as alternative to
--start-path. CI uses 10s delay so the test captures baseline render
stats before churn begins. Test skips start signal write when
pre-launched.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 04:16:57 -07:00
austinpower1258
0c4415ceba Pre-launch app from CI shell to escape XCTest sandbox
The XCTest runner is sandboxed, causing Process-spawned apps to
inherit sandbox restrictions. The CI step now:
1. Builds for testing first (separate step)
2. Launches display helper and app from the shell (non-sandboxed)
3. Waits for app diagnostics and render stats
4. Writes manifests for the test to find the pre-launched state
5. Runs test-without-building

The test detects the pre-launch manifest and skips its own app launch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 04:05:46 -07:00
austinpower1258
94c656fbbd Force windows visible on headless CI runners for UI test rendering
Two fixes:
1. Use FileManager.temporaryDirectory for diagnostics path instead of
   hardcoded /tmp/ — Process-spawned app inherits the test runner's
   sandbox and can't write to /tmp/.
2. Add orderFrontRegardless() after activate() in the UI test window
   creation path — on headless CI runners, activate() silently fails
   and windows stay invisible, preventing terminal rendering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:53:19 -07:00
austinpower1258
6233f1b2f0 Use Process with sandbox-aware temp paths for UI test app launch
The Process-spawned app inherits the test runner's sandbox. Previous
attempts failed because diagnostics used hardcoded /tmp/ which the
sandboxed app can't write to. Now using FileManager.temporaryDirectory
for all temp paths (resolves to the sandbox container's tmp), and
inheriting the full test runner environment so the child shares the
same sandbox context.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:43:26 -07:00
austinpower1258
79aae4fe83 Use NSWorkspace with activates=false to launch app in UI test
Root cause: Process inherits the XCTest runner's sandbox, preventing
the app from writing diagnostics to /tmp/. NSWorkspace.openApplication
goes through LaunchServices, which launches the app in its own process
context outside the sandbox. Using activates=false avoids the 60s
foreground activation timeout that killed the previous NSWorkspace
attempt on headless CI runners.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:34:56 -07:00
austinpower1258
eee5862ca7 Add verbose diagnostics to display resolution UI test launch failure
Include the app's stdout/stderr log contents and full env dump in the
error message so we can see what happens on CI when the app runs but
doesn't write diagnostics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:23:25 -07:00
austinpower1258
e4ef74c8b2 Fix env contamination in Process-based UI test app launch
The test runner's environment contains XCTest variables
(DYLD_INSERT_LIBRARIES, XCInjectBundle, etc.) that cause the app to
hang when inherited by a Process-launched binary. Pass only system
essentials + our CMUX_UI_TEST_* vars, matching how the smoke test
launches the app with a clean environment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 03:14:29 -07:00
austinpower1258
88751b2d12 Launch app binary directly via Process in display resolution UI test
The smoke test (smoke-test-ci.sh) passes on the same WarpBuild runners
because it launches the binary directly. XCUIApplication.launch() and
NSWorkspace.openApplication both require foreground activation which
fails on headless CI runners since ~04:00 UTC 2026-03-23. Running the
binary directly via Process works without WindowServer activation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:59:49 -07:00
austinpower1258
ae064802c6 Use NSWorkspace to launch app in display resolution UI test
XCUIApplication.launch() hard-fails with a 60-second timeout when
it can't foreground the app on headless CI runners. This test never
uses XCUIApplication for interaction (no taps/keys) — it only reads
a diagnostics file.

Replace with NSWorkspace.openApplication which launches through
Launch Services, passes env vars via OpenConfiguration, and returns
immediately without blocking on activation failure.

Also add CI retry loop since runner environment is flaky.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:48:31 -07:00
austinpower1258
fc858fcfa4 Revert UI test foreground activation changes back to 56a4d258
Reverts cbb21872, 54ec524a, 10fd323b, 75375ab7, 82a16aa7 — all
attempts to fix display resolution UI test foreground activation
on CI that introduced regressions. Restores the state from the
last fully green CI run (56a4d258).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:38:06 -07:00
austinpower1258
82a16aa746 Replace XCUIApplication with NSWorkspace for display regression test
XCUIApplication.launch() blocks for 60 seconds trying to foreground
the app on headless CI runners, then hard-fails the test (not
recoverable with continueAfterFailure). This test doesn't need
XCUIApplication — it never taps buttons or types keys, it only reads
a diagnostics file.

Switch to NSWorkspace.openApplication which:
- Launches through Launch Services (proper macOS app lifecycle)
- Passes environment vars via OpenConfiguration
- Returns immediately with NSRunningApplication handle
- Doesn't block or hard-fail on activation issues

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:29:45 -07:00
austinpower1258
75375ab7af Fix display resolution UI test foreground activation on CI
XCUIApplication.launch() fails to activate the app on headless CI
runners, reporting "Failed to activate application (current state:
Running Background)". With continueAfterFailure=false, this kills the
test before ensureForegroundAfterLaunch can retry.

Fix by temporarily setting continueAfterFailure=true around launch(),
then retrying activation via app.activate(). Also add a retry loop in
the CI workflow since foreground activation is inherently flaky on
headless runners.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 02:19:12 -07:00
austinpower1258
10fd323bb0 Fix display regression UI test launch gating 2026-03-23 02:05:07 -07:00
austinpower1258
54ec524a63 Fix display regression launch on CI runner 2026-03-23 01:54:29 -07:00
Austin Wang
cbb2187260
Fix UI test foreground activation on CI (#1981) 2026-03-23 01:42:03 -07:00
Austin Wang
56a4d25836
Fix blank terminal renders after workspace switches (#1964) 2026-03-22 18:57:30 -07:00
BillionToken
59f526a452
fix(terminal): prevent cursor movement on double-click selection (#1709)
Double-clicking to select text in the terminal was causing unwanted cursor
movement because the mouse position was being updated on both the first and
second clicks. This disrupted the selection gesture and caused the cursor to
jump to a different position than intended.

Fix by only updating the mouse position on the first click (clickCount == 1),
allowing the terminal's selection logic to handle multi-click gestures without
cursor interference.

Fixes manaflow-ai/cmux#1698

Co-authored-by: BillionClaw <267901332+BillionClaw@users.noreply.github.com>
2026-03-22 18:54:12 -07:00
Lawrence Chen
da1bfedb87
Merge pull request #1965 from manaflow-ai/task-scrollbar-fix-mainline
Preserve explicit wheel scrollback against passive follow
2026-03-22 18:51:15 -07:00
Gale
ef9d917bef
Fix reload.sh build failure exit handling (#1888) 2026-03-22 18:40:08 -07:00
Lawrence Chen
c1c028e628
Preserve explicit wheel scrollback against passive follow 2026-03-22 18:11:06 -07:00
Lawrence Chen
7634abe616
Add regression test for wheel scrollback follow bug 2026-03-22 18:11:00 -07:00
Austin Wang
fd279bdcec
Fix splitter hitbox overlap and terminal scrollbar width resync (#1950)
* test: add splitter and scrollbar regressions

* fix: narrow sidebar overlap and resync terminal width

* test: unwrap pending surface width in scrollbar regression

* fix: restore hosted inspector divider drag path
2026-03-22 18:06:11 -07:00
Apptah
5ced3134d3
Fix browser freeze after pane split by reattaching WKWebView rendering state (#1852)
When a pane split occurs, SwiftUI recreates host views and the portal
system rebinds the WKWebView to a new container. However, the bind path
never called BrowserWindowPortalRegistry.refresh(), so WebKit's internal
rendering state (_exitInWindow/_enterInWindow) was never cycled. This
left the WKWebView frozen in the original pane after a split.

Add refresh() calls after every portal bind that changes the host, in
three code paths: the main update path (shouldBindNow), onDidMoveToWindow,
and onGeometryChanged. The refresh is a no-op when no reattach is needed
(browserPortalNeedsRenderingStateReattach == false), so normal rendering
is unaffected.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 18:05:39 -07:00
Lawrence Chen
5be9edaf5e
Merge pull request #1957 from che-3/fix/esc-not-working-in-panels
Fix Escape key not working in terminal panels (e.g. lazygit)
2026-03-22 17:49:00 -07:00
Austin Wang
e8cf83ca57
Fix claude-hook stop teardown races (#1954)
* Add regression test for claude-hook stop teardown errors

* Handle claude-hook stop teardown races
2026-03-22 17:34:33 -07:00
Lawrence Chen
c9616c59e9
Merge pull request #1937 from rerun0510/fix/macos26-background-thread
Fix terminal black screen on macOS 26.3.1 by dispatching Ghostty callbacks to main thread
2026-03-22 17:28:29 -07:00
Lawrence Chen
4c92271137
Merge pull request #1913 from centraldogma99/fix/korean-input-keyboard-shortcuts
Fix keyboard shortcuts not working with Korean input mode
2026-03-22 17:18:47 -07:00
Lawrence Chen
c5b306655d
Merge pull request #1915 from elvistranhere/fix/split-crash-intel-1870
Fix #1870: prevent split crash on Intel Macs caused by stale font pointer
2026-03-22 17:14:03 -07:00
Austin Wang
100612d96e
Fix locale page crashes under Google Translate (#1956)
* fix(web): fall back to English for missing locale keys

* fix(web): stabilize translated homepage typing
2026-03-22 16:55:00 -07:00
Matthew Z.
eb248a1cdb
Fix Cmd+Shift+key combos being swallowed for unbound keys (#1959)
Use charactersIgnoringModifiers instead of characters when redispatching
Cmd-modified key events in performKeyEquivalent. Cmd-modified keys don't
produce text characters, so event.characters returns an empty string for
Cmd+Shift combos, preventing Ghostty from encoding them as kitty protocol
sequences. charactersIgnoringModifiers returns the actual key character
(e.g. "k" for Cmd+Shift+K) while modifiers are preserved in modifierFlags.

Fixes #1718

Co-authored-by: CHE-3 <schumannzheng@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 16:52:42 -07:00
CHE-3
5de59cd4ed fix: stop consuming repeated Escape keys after command palette dismissal
The `shouldConsumeSuppressedEscape` function had an early return that
unconditionally consumed all repeated Escape key events (`isARepeat`),
regardless of whether the suppression window had expired. This caused
Escape presses to be swallowed in TUI apps (e.g. lazygit) running in
panels, because the repeat events never reached the active responder.

Removing the `isARepeat` guard lets repeated Escapes fall through to
the existing time-based check (0.35s window), which correctly expires
and stops consuming events after the command palette is dismissed.

Fixes #1610

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:42:24 -04:00
Lawrence Chen
e0e0e35279
Merge pull request #1834 from lifrary/fix/replace-force-unwrapped-utf8-data-encoding
Replace force-unwrapped .data(using: .utf8)! with Data(string.utf8)
2026-03-22 15:38:40 -07:00
Lawrence Chen
01ffeb3f44
Merge pull request #1898 from manaflow-ai/feat-tmux-notification-attention-state
Improve tmux notification attention routing
2026-03-22 15:36:36 -07:00
austinpower1258
fd1376d2d5 fix: update WorkspaceShortcutMapper tests to match renamed API from #1951
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 15:04:36 -07:00
Austin Wang
33dcc606bf
Customizable number shortcuts (#1951)
* Allow customizing numbered workspace and surface shortcuts

* Update bonsplit submodule to squashed main commit

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 14:54:54 -07:00
Austin Wang
661a4e8c7f
Merge pull request #1908 from manaflow-ai/issue-1906-update-dialog-double-press
Fix Sparkle update dialog requiring two presses
2026-03-22 13:19:01 -07:00
Hiroki Kajiwara
ad57e10772 fix: dispatch UI updates to main thread for macOS 26 compatibility
Publishing changes from background threads is not allowed in macOS 26
(Tahoe). Ghostty action callbacks run on I/O threads but were modifying
AppKit view properties and posting notifications without dispatching to
the main thread.

Fixes:
- GHOSTTY_ACTION_SCROLLBAR: wrap in DispatchQueue.main.async
- GHOSTTY_ACTION_CELL_SIZE: wrap in DispatchQueue.main.async
- GHOSTTY_ACTION_COLOR_CHANGE: wrap background color updates in main async
- GHOSTTY_ACTION_CONFIG_CHANGE: wrap background color clear in main async
2026-03-22 14:45:53 +09:00