Skip to content
Open
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
2107bcb
Rewrite amux backend in Rust
lawrencecchen Apr 6, 2026
4fba953
Fix Rust daemon event semantics and verification
lawrencecchen Apr 6, 2026
997876a
Fix Ghostty build drift on macOS and iOS
lawrencecchen Apr 6, 2026
2be1639
Fix amux backend compat and review gaps
lawrencecchen Apr 6, 2026
a72c88e
Fix cross-platform termios ioctls for session CLI
lawrencecchen Apr 6, 2026
fd12865
Fix remote daemon release asset CI
lawrencecchen Apr 6, 2026
0b73637
Fix compat and cross-target daemon builds
lawrencecchen Apr 6, 2026
246a668
Bundle Ghostty CLI helper in Xcode builds
lawrencecchen Apr 6, 2026
ef6c6ea
ci: skip Ghostty helper zig build on macOS workflows
lawrencecchen Apr 6, 2026
6b67bc3
fix: close remaining Rust daemon compat gaps
lawrencecchen Apr 6, 2026
90b5984
test: run remote compat suite against Rust daemon
lawrencecchen Apr 6, 2026
3edf1a7
build: link the Rust daemon against the right C++ runtime
lawrencecchen Apr 6, 2026
95c6190
fix: restore websocket startup and session guards
lawrencecchen Apr 6, 2026
c7ab5d3
fix: detach failed Go CLI attachments
lawrencecchen Apr 6, 2026
2f46fec
test: serialize websocket compat coverage
lawrencecchen Apr 6, 2026
aa6625c
test: report daemon exits in compat failures
lawrencecchen Apr 6, 2026
d283fcc
ci: run remote daemon tests without cgo
lawrencecchen Apr 6, 2026
05c65a3
debug: trace remote daemon stream failures
lawrencecchen Apr 6, 2026
a38314f
fix: keep ghostty vt stream bound to its terminal
lawrencecchen Apr 6, 2026
d5d6e45
test: run ghostty shim coverage in CI
lawrencecchen Apr 6, 2026
3afd9aa
ci: prepare ghostty shim for tests
lawrencecchen Apr 6, 2026
39d190a
app: default local daemon to rust
lawrencecchen Apr 6, 2026
6f5b2a2
Move local PTY path to direct Rust daemon bridge
lawrencecchen Apr 7, 2026
d23cbc5
Tighten PTY migration verification plan
lawrencecchen Apr 7, 2026
8603339
Add tmux parity and PTY bridge regressions
lawrencecchen Apr 7, 2026
36abf35
Fix CI artifact env paths
lawrencecchen Apr 7, 2026
241b097
Install zig for PTY bridge CI smoke
lawrencecchen Apr 7, 2026
8c95d73
test: stabilize Linux PTY parity regressions
lawrencecchen Apr 7, 2026
253014f
test: preserve TUI size across reattach coverage
lawrencecchen Apr 7, 2026
8f32c7c
fix Linux session attach resize parity
lawrencecchen Apr 7, 2026
c136b53
fix Linux PTY parity regressions
lawrencecchen Apr 7, 2026
dbe90cb
stabilize attach CLI exit coverage
lawrencecchen Apr 7, 2026
1f44572
fix Linux PTY test polling
lawrencecchen Apr 7, 2026
4431bd4
force WINCH after pane resize
lawrencecchen Apr 7, 2026
d083f7e
signal PTY foreground group on resize
lawrencecchen Apr 7, 2026
80815ac
wait for TUI repaint before reattach
lawrencecchen Apr 7, 2026
99a3593
use raw python fixture for tui resize tests
lawrencecchen Apr 7, 2026
0c7092a
Add cmux pty vs tmux parity regression in CI
lawrencecchen Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci-macos-compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ jobs:
- os: warp-macos-15-arm64-6x
timeout: 30
smoke: true
skip_zig: false
skip_zig: true
- os: warp-macos-26-arm64-6x
timeout: 30
smoke: false
skip_zig: true # zig 0.15.2 MachO linker can't resolve libSystem on macOS 26
runs-on: ${{ matrix.os }}
timeout-minutes: ${{ matrix.timeout }}
env:
CMUX_SKIP_ZIG_BUILD: ${{ matrix.skip_zig && '1' || '0' }}
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
Expand Down Expand Up @@ -119,8 +121,6 @@ jobs:
done

- name: Run unit tests
env:
CMUX_SKIP_ZIG_BUILD: ${{ matrix.skip_zig && '1' || '0' }}
run: |
set -euo pipefail
SOURCE_PACKAGES_DIR="$PWD/.ci-source-packages"
Expand Down
154 changes: 154 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,24 @@ jobs:

remote-daemon-tests:
runs-on: ubuntu-latest
env:
CGO_ENABLED: "0"
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: recursive

- name: Setup Go
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
with:
go-version-file: daemon/remote/go.mod

- name: Install tmux
run: |
sudo apt-get update
sudo apt-get install -y tmux

- name: Install zig
run: |
set -euo pipefail
Expand All @@ -65,13 +74,122 @@ jobs:
zig version
fi

- name: Prepare Ghostty shim dependency
working-directory: daemon/remote/rust/ghostty-shim
run: ln -sfn ../../../../ghostty ghostty

- name: Run Ghostty shim tests
working-directory: daemon/remote/rust/ghostty-shim
run: zig build test

- name: Run remote daemon tests
working-directory: daemon/remote
run: go test ./...

- name: Validate remote daemon release assets
run: ./tests/test_remote_daemon_release_assets.sh

remote-daemon-tmux-parity:
runs-on: ubuntu-latest
env:
CGO_ENABLED: "0"
CMUX_REMOTE_TEST_ARTIFACT_DIR: /tmp/remote-daemon-tmux-parity
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: recursive

- name: Setup Go
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
with:
go-version-file: daemon/remote/go.mod

- name: Install tmux
run: |
sudo apt-get update
sudo apt-get install -y tmux

- name: Install zig
run: |
set -euo pipefail
ZIG_REQUIRED="0.15.2"
if command -v zig >/dev/null 2>&1 && zig version 2>/dev/null | grep -q "^${ZIG_REQUIRED}"; then
echo "zig ${ZIG_REQUIRED} already installed"
else
echo "Installing zig ${ZIG_REQUIRED} from tarball"
curl -fSL "https://ziglang.org/download/${ZIG_REQUIRED}/zig-x86_64-linux-${ZIG_REQUIRED}.tar.xz" -o /tmp/zig.tar.xz
tar xf /tmp/zig.tar.xz -C /tmp
sudo mv /tmp/zig-x86_64-linux-${ZIG_REQUIRED}/zig /usr/local/bin/zig
sudo rm -rf /usr/local/lib/zig
sudo mv /tmp/zig-x86_64-linux-${ZIG_REQUIRED}/lib /usr/local/lib/zig
zig version
fi

- name: Prepare Ghostty shim dependency
working-directory: daemon/remote/rust/ghostty-shim
run: ln -sfn ../../../../ghostty ghostty

- name: Run tmux parity regression
working-directory: daemon/remote
run: go test ./compat -run TestTmuxParityCommonCommands -count=1 -v

- name: Upload tmux parity artifacts
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: remote-daemon-tmux-parity-artifacts
path: /tmp/remote-daemon-tmux-parity
if-no-files-found: ignore

remote-daemon-tui-resize:
runs-on: ubuntu-latest
env:
CGO_ENABLED: "0"
CMUX_REMOTE_TEST_ARTIFACT_DIR: /tmp/remote-daemon-tui-resize
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: recursive

- name: Setup Go
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
with:
go-version-file: daemon/remote/go.mod

- name: Install zig
run: |
set -euo pipefail
ZIG_REQUIRED="0.15.2"
if command -v zig >/dev/null 2>&1 && zig version 2>/dev/null | grep -q "^${ZIG_REQUIRED}"; then
echo "zig ${ZIG_REQUIRED} already installed"
else
echo "Installing zig ${ZIG_REQUIRED} from tarball"
curl -fSL "https://ziglang.org/download/${ZIG_REQUIRED}/zig-x86_64-linux-${ZIG_REQUIRED}.tar.xz" -o /tmp/zig.tar.xz
tar xf /tmp/zig.tar.xz -C /tmp
sudo mv /tmp/zig-x86_64-linux-${ZIG_REQUIRED}/zig /usr/local/bin/zig
sudo rm -rf /usr/local/lib/zig
sudo mv /tmp/zig-x86_64-linux-${ZIG_REQUIRED}/lib /usr/local/lib/zig
zig version
fi

- name: Prepare Ghostty shim dependency
working-directory: daemon/remote/rust/ghostty-shim
run: ln -sfn ../../../../ghostty ghostty

- name: Run TUI and resize regression
working-directory: daemon/remote
run: go test ./compat -run 'TestSessionAttachPropagatesPTYResize|TestSessionAttachTUIResizeAndReattach' -count=1 -v

- name: Upload TUI and resize artifacts
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: remote-daemon-tui-resize-artifacts
path: /tmp/remote-daemon-tui-resize
if-no-files-found: ignore

web-typecheck:
runs-on: ubuntu-latest
defaults:
Expand All @@ -92,6 +210,8 @@ jobs:

tests:
runs-on: warp-macos-15-arm64-6x
env:
CMUX_SKIP_ZIG_BUILD: "1"
timeout-minutes: 30
steps:
- name: Checkout
Expand Down Expand Up @@ -130,6 +250,7 @@ jobs:
./scripts/download-prebuilt-ghosttykit.sh

- name: Install zig
if: env.CMUX_SKIP_ZIG_BUILD != '1'
run: |
ZIG_REQUIRED="0.15.2"
if command -v zig >/dev/null 2>&1 && zig version 2>/dev/null | grep -q "^${ZIG_REQUIRED}"; then
Expand Down Expand Up @@ -250,12 +371,41 @@ jobs:

CMUX_CLI_BIN="$CLI_BIN" python3 tests/test_cli_version_memory_guard.py

- name: Run cmux pty bridge regression
run: |
set -euo pipefail

if ! command -v zig >/dev/null 2>&1; then
ZIG_REQUIRED="0.15.2"
curl -fSL "https://ziglang.org/download/${ZIG_REQUIRED}/zig-aarch64-macos-${ZIG_REQUIRED}.tar.xz" -o /tmp/zig.tar.xz
tar xf /tmp/zig.tar.xz -C /tmp
sudo mkdir -p /usr/local/bin /usr/local/lib
sudo cp -f /tmp/zig-aarch64-macos-${ZIG_REQUIRED}/zig /usr/local/bin/zig
sudo cp -rf /tmp/zig-aarch64-macos-${ZIG_REQUIRED}/lib /usr/local/lib/zig
export PATH="/usr/local/bin:$PATH"
fi

CLI_BIN="$(
find "$HOME/Library/Developer/Xcode/DerivedData" -path "*/Build/Products/Debug/cmux" -exec stat -f '%m %N' {} \; \
| sort -nr \
| head -1 \
| cut -d' ' -f2-
)"
if [ -z "${CLI_BIN:-}" ] || [ ! -x "$CLI_BIN" ]; then
echo "cmux CLI binary not found in DerivedData" >&2
exit 1
fi

CMUX_CLI_BIN="$CLI_BIN" ./tests/test_cmux_pty_cli_bridge.sh

tests-build-and-lag:
# Build the full cmux scheme and run the lag regression on WarpBuild.
# Keep lag validation separate from UI regressions so functional UI failures
# and performance regressions stay isolated. Broader interactive UI suites
# still run via test-e2e.yml on GitHub-hosted runners.
runs-on: warp-macos-15-arm64-6x
env:
CMUX_SKIP_ZIG_BUILD: "1"
timeout-minutes: 20
steps:
- name: Checkout
Expand Down Expand Up @@ -294,6 +444,7 @@ jobs:
./scripts/download-prebuilt-ghosttykit.sh

- name: Install zig
if: env.CMUX_SKIP_ZIG_BUILD != '1'
run: |
ZIG_REQUIRED="0.15.2"
if command -v zig >/dev/null 2>&1 && zig version 2>/dev/null | grep -q "^${ZIG_REQUIRED}"; then
Expand Down Expand Up @@ -418,6 +569,8 @@ jobs:

ui-regressions:
runs-on: warp-macos-15-arm64-6x
env:
CMUX_SKIP_ZIG_BUILD: "1"
timeout-minutes: 25
steps:
- name: Checkout
Expand Down Expand Up @@ -448,6 +601,7 @@ jobs:
run: ./scripts/download-prebuilt-ghosttykit.sh

- name: Install zig
if: env.CMUX_SKIP_ZIG_BUILD != '1'
run: |
ZIG_REQUIRED="0.15.2"
if command -v zig >/dev/null 2>&1 && zig version 2>/dev/null | grep -q "^${ZIG_REQUIRED}"; then
Expand Down
Loading
Loading