Commit graph

542 commits

Author SHA1 Message Date
Lawrence Chen
ca09a7a6d5
Fix nightly icon to match debug icon style (#167)
Recolor the debug icon (orange DEV → purple NIGHTLY) instead of
pasting a banner onto the production icon. This preserves the exact
same chevron positioning, glow effects, and banner integration.
2026-02-20 04:19:10 -08:00
Lawrence Chen
ec9b80f389
Add nightly-specific app icon with purple NIGHTLY banner (#166)
Follows the same pattern as AppIcon-Debug (orange DEV banner) but with
a purple banner and "NIGHTLY" text. The nightly CI workflow now passes
ASSETCATALOG_COMPILER_APPICON_NAME=AppIcon-Nightly to xcodebuild so
the nightly app gets its own distinct icon.

Includes scripts/generate_nightly_icon.py for regenerating the icons
from the production AppIcon source files.
2026-02-20 04:10:32 -08:00
Lawrence Chen
ecee9386cf
Add GitHub issue templates for bug reports and feature requests (#165)
Bug reports now require cmux version, macOS version, chip type,
install method, repro steps, and expected behavior. Blank issues
are disabled to encourage structured reports.
2026-02-20 04:02:26 -08:00
Lawrence Chen
707be44aaf
Separate cmux NIGHTLY as standalone app with its own bundle ID (#164)
The nightly build is now a distinct app called "cmux NIGHTLY" with
bundle ID com.cmuxterm.app.nightly, allowing side-by-side installation
with the stable release. The nightly appcast URL is baked into the
app's Info.plist by CI, so no in-app channel switching is needed.

- Nightly workflow: rename app to "cmux NIGHTLY", set bundle ID to
  com.cmuxterm.app.nightly, hardcode nightly Sparkle feed URL, publish
  DMG as cmux-nightly-macos.dmg
- Remove "Receive Nightly Builds" toggle from settings
- Remove UpdateChannelSettings enum and simplify feed URL resolution
  to just use SUFeedURL from Info.plist
- Remove UpdateChannelSettingsTests (no longer applicable)
2026-02-20 03:54:07 -08:00
Lawrence Chen
c11453fa6c
Merge pull request #132 from manaflow-ai/issue-126-notification-ring
Fix notification ring not appearing on terminal panes
2026-02-20 02:53:52 -08:00
Lawrence Chen
eb5c52d239 Render unread notification ring above portal-hosted terminal view 2026-02-20 02:41:52 -08:00
Lawrence Chen
4588c3b0d1 Avoid O(N) re-renders by passing derived Bool instead of ObservableObject
Replace @ObservedObject notificationStore in TerminalPanelView and
PanelContentView with a plain `let hasUnreadNotification: Bool`.
The parent WorkspaceContentView already subscribes to the store
via @EnvironmentObject; it now computes the per-panel Bool and
passes it down, so child views only re-render when their own
notification state actually changes.
2026-02-20 02:41:52 -08:00
Lawrence Chen
cef1513ceb Fix notification ring not appearing on terminal panes
TerminalPanelView and PanelContentView held notificationStore as a
plain `let` property. Since it's a reference type (class), SwiftUI's
structural diffing saw no change when notifications were added and
skipped re-evaluating the view body. Changed to @ObservedObject var
so the views properly subscribe to the store's @Published changes.

Closes #126
2026-02-20 02:41:52 -08:00
Lawrence Chen
d74d2afb01
Merge pull request #146 from manaflow-ai/cmux/browserpanel-issues
Fix terminal portals covering browser panes on workspace switch
2026-02-20 02:10:23 -08:00
Lawrence Chen
b17249fa30 Fix test command: allowAll socket mode + correct socket path
Tests run via SSH and aren't cmux descendants, so cmuxOnly mode
rejects the connection. Also fix socket path from /tmp/cmux.sock
to /tmp/cmux-debug.sock for debug builds.
2026-02-20 02:07:28 -08:00
Lawrence Chen
153b73c952 Add earlier devtools shortcut snapshots and geometry probes 2026-02-20 01:04:16 -08:00
austinpower1258
b739e918c9 works 2026-02-19 23:52:09 -08:00
Lawrence Chen
5b2be45f3a
Fix browser panel mouse back/forward buttons and middle-click (#131) (#139)
Handle multi-button mouse events in the browser panel's WKWebView:

- Mouse back button (button 3) triggers goBack(), forward button
  (button 4) triggers goForward(), enabling side-button navigation
  on mice like Logitech
- Middle-click (button 2) on a link opens it in a new browser tab
  by hit-testing the click position via JavaScript and routing through
  the existing openLinkInNewTab mechanism
2026-02-19 23:38:21 -08:00
Lawrence Chen
db66fc4bb0 Stabilize browser portal bounds and log inspector height metrics 2026-02-19 23:19:00 -08:00
Lawrence Chen
463c6baabb
Fix CJK IME input (Korean, Chinese, Japanese) (#125)
* Fix CJK IME input not working (#118)

CJK (Korean, Japanese, Chinese) IME input was completely broken because
cmux never forwarded preedit/composition state to Ghostty's libghostty.

Root causes and fixes:

1. Missing preedit sync: Added syncPreedit() that calls
   ghostty_surface_preedit() to notify Ghostty about IME composition
   text. Called from setMarkedText, unmarkText, and after
   interpretKeyEvents in keyDown.

2. Wrong composing flag: The composing flag on key events now correctly
   accounts for when composition just ended (markedTextBefore was true
   but markedText is now empty), preventing spurious deletions when
   canceling composition.

3. Event interception during IME: Added early exits in
   performKeyEquivalent, the NSWindow swizzle, and the local event
   monitor (handleCustomShortcut) to avoid stealing key events while
   IME has active marked text.

4. IME popup positioning: firstRect(forCharacterRange:) now uses
   ghostty_surface_ime_point() for accurate cursor-relative positioning
   of the IME candidate window.

* Add regression tests for CJK IME composition (#118)

31 tests covering Korean, Japanese, and Chinese IME input scenarios:

- Korean jamo combining: ㅎ -> 하 -> 한 composition lifecycle
- Chinese pinyin: multi-letter marked text and candidate selection
- Japanese hiragana-to-kanji: romaji -> hiragana -> kanji conversion
- insertText correctly commits composed text and clears marked state
- unmarkText properly clears composition state (idempotent)
- performKeyEquivalent returns false during active composition for
  all key types (plain, shift, space, return, escape)
- Shortcut bypass: hasMarkedText gates the handleCustomShortcut bypass
- Multi-syllable sequences, backspace correction, and rapid transitions
- keyTextAccumulator lifecycle tests

Also adds #if DEBUG test accessors for keyTextAccumulator on
GhosttyNSView to enable unit testing the accumulator path.
2026-02-19 22:37:41 -08:00
Lawrence Chen
eb86606841
Fix --help/-h on subcommands being silently ignored (#119) (#128)
Previously, --help/-h was only checked at the top level before command
dispatch. Running e.g. `cmux new-workspace --help` would execute the
command instead of printing help.

Add per-subcommand help text for all commands that take arguments/flags.
The help check runs before socket connect so it works even when cmux is
not running. Commands without dedicated help (ping, help, list-windows,
etc.) fall through to normal behavior.
2026-02-19 22:29:28 -08:00
Lawrence Chen
010403fee2
CLI: add --command flag to new-workspace (#121)
* CLI: add --command flag to new-workspace

Allows running an initial command in the new workspace's terminal:
  cmux new-workspace --command "cd /path && claude"

After creating the workspace, waits 500ms for the shell to initialize,
then sends the command text via surface.send_text.

Closes #120

* CLI: error on unknown flags for new-workspace

Typos like `--comand` were silently ignored. Now reports the
unknown flag and lists known flags.

* CLI: skip --command send when workspace creation fails

If new_workspace returns an error instead of "OK <uuid>",
don't attempt to send the command (which would hit the wrong workspace).
2026-02-19 22:13:33 -08:00
Lawrence Chen
7490ff93ef Update homebrew-cmux submodule to latest 2026-02-19 21:36:15 -08:00
Lawrence Chen
3972f39e49 Bump version to 0.59.0 2026-02-19 21:29:27 -08:00
Lawrence Chen
943858acff Defer and auto-arm devtools refresh across reparent 2026-02-19 21:17:55 -08:00
Lawrence Chen
54a0f78d75 Harden browser devtools split reparent flow 2026-02-19 21:13:41 -08:00
Lawrence Chen
6170143b6d Add deep split/devtools reparent diagnostics 2026-02-19 20:41:22 -08:00
Lawrence Chen
f546c289c3 Preserve devtools webview during split teardown 2026-02-19 20:38:31 -08:00
Lawrence Chen
397e46a667 Add devtools split diagnostics and restore retries 2026-02-19 20:31:00 -08:00
Lawrence Chen
c186cb5722 Add regression tests for browser devtools visibility persistence 2026-02-19 20:24:32 -08:00
Lawrence Chen
743cfcdc6d Fix browser devtools persistence and Safari shortcut wiring 2026-02-19 20:21:01 -08:00
Lawrence Chen
031b0fcb30 todos 2026-02-19 18:36:53 -08:00
Austin Wang
3b50c6594c
Fix panel resize hitbox and stale portal frame behavior (#114)
* ok

* Drop GhosttyTerminalView changes from resize PR
2026-02-19 18:32:57 -08:00
Lawrence Chen
fc1de08561
Fix homebrew SHA mismatch race condition (#111)
Root cause: update-homebrew.yml triggered on release:published, which fires
before softprops/action-gh-release finishes uploading assets. The workflow
downloaded a 404 page instead of the DMG and committed its SHA.

Fix:
- Change trigger from release:published to workflow_run (fires after the
  release workflow completes, guaranteeing assets are uploaded)
- Add download validation with retries and file size checks
- Add SHA verification step before committing to the cask
- Add homebrew cask update to build-sign-upload.sh for local releases
- Add regression test (tests/test_homebrew_sha.sh)
- Update /release and /release-local skills with homebrew verification steps

Fixes #110
2026-02-19 17:44:00 -08:00
Lawrence Chen
41639d226c Add /pull skill and remove auto-push from /sync-branch
- New /pull command: pulls main and updates submodules locally
- sync-branch: never pushes automatically, asks user first
- No pushing to submodules; all changes land via PRs
2026-02-19 17:28:49 -08:00
Lawrence Chen
9a8e5f9d13 Bump version to 0.58.0 2026-02-19 17:24:10 -08:00
Lawrence Chen
fd9dadf3dc Update homebrew-cmux submodule to latest 2026-02-19 17:22:53 -08:00
Lawrence Chen
c239cb1bf9
Merge pull request #109 from manaflow-ai/fix/split-blackout-focus-race
Fix split blackout during drag split and stabilize focus handoff
2026-02-19 17:20:53 -08:00
Lawrence Chen
de666ff05b Fix split blackout race and stabilize focus handoff 2026-02-19 17:10:27 -08:00
Lawrence Chen
b624c580a7 Bump version to 0.57.0 2026-02-19 16:53:21 -08:00
Lawrence Chen
e86501c078
Merge pull request #106 from manaflow-ai/fix/drop-overlay-animation-routing-regression
Stabilize terminal drop overlay animation and guard stale tabtransfer routing
2026-02-19 15:29:39 -08:00
Lawrence Chen
1b2688233f Animate terminal drop overlay and add stale tabtransfer click regression 2026-02-19 15:22:30 -08:00
austinpower1258
1af5b02629 Make drop zone overlay non-interactive
Use GhosttyFlashOverlayView (hitTest returns nil) instead of plain
NSView so the overlay doesn't steal drag/mouse routing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 15:02:00 -08:00
austinpower1258
5d79d63af8 Fix blue hover not showing when dragging tabs onto terminal panes
The drop placeholder rendered in SwiftUI was hidden behind the
portal-hosted terminal surface. Add an AppKit overlay directly on
GhosttySurfaceScrollView driven by a new paneDropZone environment key
from Bonsplit so it renders above the Metal layer.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:50:45 -08:00
austinpower1258
bd58a42dd8 terminal drop target 2026-02-19 14:43:18 -08:00
Lawrence Chen
02f305ccd2 Update homebrew-cmux submodule to latest 2026-02-19 14:36:36 -08:00
Lawrence Chen
48914b89c1
Merge pull request #102 from manaflow-ai/release/v0.56.0
Release v0.56.0
2026-02-19 05:23:12 -08:00
Lawrence Chen
631f689aba Fix stale drag overlay click routing and add real-click regression test 2026-02-19 05:21:15 -08:00
Lawrence Chen
b2415020ec Bump version to 0.56.0 2026-02-19 04:36:36 -08:00
Lawrence Chen
09a85e93d2 Extract build/sign/notarize into scripts/build-sign-upload.sh 2026-02-19 04:33:42 -08:00
Lawrence Chen
4f84166e5b Bump version to 0.55.0 2026-02-19 04:25:35 -08:00
Lawrence Chen
4b9098fe23
Merge pull request #101 from manaflow-ai/fix/split-close-right-stretch-replay
Fix one-frame stretch when closing right split
2026-02-19 04:19:23 -08:00
Lawrence Chen
cd0b8da82b Fix split-close stale-frame stretch and add regression coverage 2026-02-19 04:15:50 -08:00
Lawrence Chen
9642bb59fc
Move port scanning from shell to app-side with batching (#100)
* Move port scanning from shell to app-side with batching

Replace per-shell `ps -axo + lsof` scanning with a centralized
PortScanner singleton in the app. Each shell now sends lightweight
`report_tty` (once per session) and `ports_kick` (on preexec/precmd)
socket messages. The app coalesces kicks across all panels and runs a
single `ps -t <ttys> + lsof -p <pids>` covering every active panel.

Also fixes a macOS 26 Tahoe regression where `getsockopt(LOCAL_PEERPID)`
returns ENOTCONN on accepted sockets when the peer disconnects before
the handler thread starts. This was silently breaking ALL socket
commands sent via ncat --send-only. The fix captures the peer PID in
the accept loop immediately after accept(), and falls back to
LOCAL_PEERCRED (uid check) when the PID lookup fails.

* Fix PR review feedback: burst timing and auth comment clarity

- P2: burstDelays were accumulating (0.5+1.5+3+... = ~22.5s) instead of
  firing at absolute offsets from burst start. Now uses burstStart anchor
  so scans fire at 0.5s, 1.5s, 3s, 5s, 7.5s, 10s as intended.

- P1: Clarify LOCAL_PEERCRED fallback rationale — same security boundary
  as socket file permissions (0600), does not widen attack surface.
  Long-lived connections still get full descendant check via LOCAL_PEERPID.
2026-02-19 01:04:47 -08:00
Lawrence Chen
3193e602d4
Merge pull request #99 from manaflow-ai/fix/omnibar-focus-intent
Fix omnibar focus intent races for Cmd+L / Cmd+Shift+L
2026-02-19 00:51:17 -08:00