Commit graph

368 commits

Author SHA1 Message Date
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
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
Lawrence Chen
1d246b2bbd Fix omnibar focus intent races for Cmd+L 2026-02-19 00:35:25 -08:00
Lawrence Chen
7e0cbb18ff Update homebrew-cmux submodule to latest 2026-02-18 23:40:53 -08:00
Lawrence Chen
e818aa21d7
Bump version to 0.54.0 (#98) 2026-02-18 23:26:56 -08:00
Lawrence Chen
5fc4df467a
Fix omnibar Cmd+L infinite focus loop causing 100% CPU (#97)
The browser omnibar's updateNSView and controlTextDidEndEditing
were both dispatching makeFirstResponder calls without any guard
against re-dispatch. Each makeFirstResponder triggers SwiftUI's
FirstResponderObserver, which re-evaluates the view graph, which
calls updateNSView again, creating an infinite loop via the main
dispatch queue.

Fix: Add a pendingFocusRequest flag on the coordinator to prevent
re-dispatching while a focus/blur request is already in flight.
Also add nsView.currentEditor() != nil to the isFirstResponder
check so the field is recognized as focused during the transition
when the field editor (not the field itself) is first responder.
2026-02-18 23:18:08 -08:00
Lawrence Chen
2b026215ca
Bump version to 0.53.0 (#96) 2026-02-18 22:54:26 -08:00
Lawrence Chen
97085be775
Remove index-based CLI APIs, make commands workspace-relative (#89)
* Remove index-based CLI APIs and make commands workspace-relative

Migrate 14 CLI commands from v1 text protocol to v2 JSON-RPC, making them
workspace-relative via CMUX_WORKSPACE_ID env var fallback. Update 7 more
commands to use normalize functions instead of legacy resolvers. Remove dead
code (5 structs, 5 parsers, 3 functions). Add regression tests.

Commands migrated v1→v2: send, send-key, send-panel, send-key-panel,
new-split, new-pane, new-surface, close-surface, list-panes,
list-pane-surfaces, list-panels, surface-health, focus-pane, focus-panel.

Commands updated: move-workspace-to-window, list-workspaces,
close-workspace, select-workspace, trigger-flash, resolveWorkspaceId,
resolveSurfaceId.

* Fix CMUX_SURFACE_ID env fallback when --workspace is overridden

When --workspace is explicitly passed, don't fall back to CMUX_SURFACE_ID
from the caller's environment. The caller's surface belongs to a different
workspace, causing "surface not found" errors. Only use the env var fallback
when the workspace is implicit (from CMUX_WORKSPACE_ID or server default).

Affects: send, send-key, new-split, close-surface, trigger-flash, identify,
notify, claude-hook.

* Validate surface before close and respect -- option terminator in send

P1: close-surface now validates the surface handle exists before sending
surface.close, preventing silent fallback to focused surface when a stale
or mistyped ref is provided.

P2: parseOption now respects -- as an option terminator. send, send-key,
send-panel, send-key-panel strip the -- marker from payload args. This
prevents payload tokens like --workspace from being consumed as routing
flags (e.g. `cmux send -- echo --workspace foo` sends all text correctly).

* Fix test_send_workspace_relative: add to main() and send valid text

The test was never called from main() and sent empty string which would
raise immediately via _run_cli. Send a space character instead and add
the test to the main() call list.

* Respect --id-format in text output and resolve workspace refs across windows

Text-mode list commands (list-workspaces, list-panes, list-panels,
list-pane-surfaces, surface-health) now honor --id-format for plain output,
not just --json. Added textHandle() helper that picks ref/id/both based on
the selected format.

resolveWorkspaceId now enumerates all windows when resolving a workspace
ref, so notify/claude-hook work correctly in multi-window sessions where
the target workspace may be in a non-active window.

* Preserve escape-sequence semantics for send text

The v1 server unescaped \n, \r, \t in send payloads before injecting into
the terminal. The v2 surface.send_text handler sends text verbatim. Add
CLI-side unescapeSendText() to restore the same behavior: \n and \r map
to carriage return (Enter key), \t maps to tab. Applied to send and
send-panel commands.

* Reject malformed handles instead of passing through to server

All four normalize functions (window, workspace, pane, surface) now throw
a clear error for unrecognized handle formats instead of passing them
through. Previously, a typo like `--panel foo` would forward `foo` to the
server which would silently fall back to the focused surface.

* Allow cross-workspace surface refs in close-surface and strip plural ID arrays

Remove workspace-scoped pre-validation from close-surface so explicit
surface refs/UUIDs from other workspaces work without requiring
--workspace. The server resolves workspace from surface_id directly.
Malformed handles are already caught by normalizeSurfaceHandle.

Extend formatIDs to strip plural _ids/_refs array pairs (e.g.
surface_ids/surface_refs in pane.list output) based on --id-format,
matching the existing singular _id/_ref stripping behavior.

* Honor explicit --window over CMUX_WORKSPACE_ID env fallback

When --window is passed globally, skip the CMUX_WORKSPACE_ID env var
fallback so commands operate on the targeted window's selected workspace
instead of the caller's workspace from a different window. Affects all
migrated commands that use workspaceFromArgsOrEnv or inline env fallback.
2026-02-18 22:50:02 -08:00
Lawrence Chen
7ac7c37de2
Bump version to 0.52.0 (#95) 2026-02-18 22:34:24 -08:00
Lawrence Chen
d08f28d770
Merge pull request #83 from manaflow-ai/perf/portal-hosting-selected-mount
Reduce terminal input latency via portal hosting + selected-only workspace mounting
2026-02-18 22:31:45 -08:00
Lawrence Chen
ee4848c008 Speed up workspace switching: reduce portal churn and enforce selected z-order 2026-02-18 22:13:40 -08:00
Lawrence Chen
75b25217b5
Bump version to 0.51.0 (#94) 2026-02-18 22:11:58 -08:00
Lawrence Chen
699db2a9ed
Fix menubar lag on M1 Macs by using universal xcframework target (#93)
Remove -Dxcframework-target=native from CI and release workflows,
defaulting to universal (matching upstream ghostty). The native target
produces a macos-arm64 xcframework slice that causes Xcode to link the
final binary differently (~70KB more __text), resulting in menubar and
right-click lag on M1 Max. The arm64 static libraries are byte-for-byte
identical between native and universal builds - the difference is purely
in how Xcode resolves the xcframework slice.
2026-02-18 22:09:13 -08:00
Austin Wang
ab89fab897
Fix browser opening new tabs on link click (#92)
* Fix browser panel opening new tabs on every link click

Navigate target=_blank and window.open() links in the current webview
instead of spawning new browser tabs.

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

* Preserve cmd+click new tab behavior in createWebViewWith

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:53:36 -08:00
Lawrence Chen
442eb1f01d Rename test targets to cmuxTests and cmuxUITests 2026-02-18 21:19:56 -08:00
Lawrence Chen
7aa80b9cdc Stabilize rapid workspace switching handoff 2026-02-18 21:17:53 -08:00
Austin Wang
0851cff378
Bump version to 0.50.0 (#91)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:10:34 -08:00
Austin Wang
2d64ecfc44
fixes crashes and filedrop fatal issue 2026-02-18 20:46:31 -08:00
Lawrence Chen
915e34bd38
Revert xcframework-target removal that broke CI (#86) (#90)
The -Dxcframework-target flag controls platform slices (native=macOS
only, universal=macOS+iOS), not CPU microarchitecture. Removing it
caused CI to attempt iOS builds which fail due to missing Metal
iOS toolchain on the runner.
2026-02-18 20:37:59 -08:00
Austin Wang
65ac29d827
Fix zsh git branch refresh race after cwd change (#71)
* Fix zsh git branch refresh race after cwd change

* Clarify intentional duplicate cwd check in git refresh path

* Add Metal Toolchain download step to CI and release workflows

Fixes build failure when compiling Metal shaders for iOS xcframework
targets — the self-hosted runner needs `xcodebuild -downloadComponent
MetalToolchain` installed before `xcrun metal` can run.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 20:36:27 -08:00
Lawrence Chen
a723bbaa6a Fix Finder file drop routing for portal-hosted terminals 2026-02-18 20:33:35 -08:00
Lawrence Chen
57db48eca1 Merge remote-tracking branch 'origin/main' into perf/portal-hosting-selected-mount 2026-02-18 20:29:12 -08:00
Lawrence Chen
27df9cd171 Remove SwiftUI dimming fallback for portal terminals 2026-02-18 20:28:00 -08:00
Lawrence Chen
b05347884d Restore unfocused pane dimming for portal-hosted terminals 2026-02-18 20:24:54 -08:00
Lawrence Chen
d24030db58
Use universal xcframework target instead of native (#86)
The self-hosted runner (M4 Mac Mini) was building GhosttyKit with
-Dxcframework-target=native, producing M4-tuned binaries. This caused
menubar and right-click lag on M1 machines. Dropping the flag defaults
to universal, which works well across all Apple Silicon chips.
2026-02-18 20:21:34 -08:00
Lawrence Chen
22aa4d48da Fix portal lifecycle retention and add regression tests 2026-02-18 20:17:44 -08:00