Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
c8372f4
Merge remote-tracking branch 'origin/main' into feat-tui-native-windows
lawrencecchen Aug 6, 2026
fba5cd6
test(tui): require native Windows remote probe
lawrencecchen Aug 6, 2026
51c909e
feat(tui): support native Windows SSH machines
lawrencecchen Aug 6, 2026
0d0102a
fix(tui): finish native Windows bootstrap
lawrencecchen Aug 6, 2026
7da2013
fix(tui): skip Windows shell aliases
lawrencecchen Aug 6, 2026
52ce98a
fix(tui): document native Windows lifecycle
lawrencecchen Aug 6, 2026
65138d3
test(tui): require carrier-scoped Windows cleanup
lawrencecchen Aug 6, 2026
4832a83
fix(tui): release carrier-scoped Windows sessions
lawrencecchen Aug 6, 2026
2b115c3
docs(tui): describe retained machine connections
lawrencecchen Aug 6, 2026
210a0dc
test(tui): reproduce Windows carrier-owned mux loss
lawrencecchen Aug 6, 2026
02a61e3
test(tui): reproduce blocked machine connector shutdown
lawrencecchen Aug 6, 2026
b25e7e4
test(tui): require Windows terminal carrier survival
lawrencecchen Aug 6, 2026
0d97b47
test(tui): reject stale Windows terminals after owner restart
lawrencecchen Aug 6, 2026
03be8f8
fix(tui): keep Windows terminals alive across SSH carriers
lawrencecchen Aug 6, 2026
8347295
build(tui): lock Windows owner dependencies
lawrencecchen Aug 6, 2026
2a1cf64
fix(tui): bound Windows owner diagnostics
lawrencecchen Aug 6, 2026
c7e3245
ci(tui): retain exact macOS dogfood binary
lawrencecchen Aug 6, 2026
c884785
test(tui): reproduce legacy Windows owner upgrade failure
lawrencecchen Aug 6, 2026
5236c84
fix(tui): migrate legacy Windows remote owners
lawrencecchen Aug 6, 2026
55d0f5b
fix(tui): satisfy strict sidebar lints
lawrencecchen Aug 6, 2026
46699f9
fix(tui): expose sidebar width overrides to tests
lawrencecchen Aug 6, 2026
99ab846
test(tui): reproduce legacy Windows probe upgrade failure
lawrencecchen Aug 6, 2026
ef73158
fix(tui): upgrade legacy Windows helpers without probing them
lawrencecchen Aug 6, 2026
7a16c9d
test(tui): diagnose slow Windows owner startup
lawrencecchen Aug 6, 2026
2077b5a
fix(tui): preserve proven Windows owner readiness
lawrencecchen Aug 6, 2026
1b497cb
test(tui): isolate Windows owner from CI carrier job
lawrencecchen Aug 6, 2026
698621c
ci(tui): publish macOS dogfood before broad tests
lawrencecchen Aug 6, 2026
2fa2781
test(tui): reproduce Windows carrier handshake hang
lawrencecchen Aug 6, 2026
f2ee135
test(tui): bound Windows carrier regressions
lawrencecchen Aug 6, 2026
a051585
test(tui): gate Unix daemon fixture imports
lawrencecchen Aug 6, 2026
a73314c
fix(tui): make Windows carrier shutdown explicit
lawrencecchen Aug 6, 2026
c8cc7ff
test(tui): reproduce dropped Windows socket stall
lawrencecchen Aug 6, 2026
ad4994f
fix(tui): close dropped Windows socket bridges
lawrencecchen Aug 6, 2026
33e1c20
fix(tui): bound Windows socket worker I/O
lawrencecchen Aug 6, 2026
5eccc77
test(tui): reproduce stale Windows owner socket
lawrencecchen Aug 6, 2026
600165a
fix(tui): recover stale Windows owner sockets
lawrencecchen Aug 6, 2026
d4a57a5
test(tui): exercise stale Windows owner recovery
lawrencecchen Aug 6, 2026
50ddbe2
test(tui): accept Windows stale socket errno variants
lawrencecchen Aug 6, 2026
33a5a14
test(tui): reproduce Windows stdio carrier boundary
lawrencecchen Aug 6, 2026
556f066
fix(tui): flush Windows remote carrier replies
lawrencecchen Aug 6, 2026
84bae2e
Merge current main into native Windows SSH
lawrencecchen Aug 11, 2026
cb74f3e
fix(tui): add native Windows SSH lifecycle
lawrencecchen Aug 11, 2026
6debe02
test: replace assigned timing sleeps with signals
lawrencecchen Aug 11, 2026
7c1bc54
fix(tui): align generated inventory metadata
lawrencecchen Aug 11, 2026
082eba3
fix(tui): record remote test deadline dependency
lawrencecchen Aug 11, 2026
296e557
style(tui): apply hosted rustfmt output
lawrencecchen Aug 11, 2026
273735c
fix(tui): preserve OpenSSH option markers
lawrencecchen Aug 11, 2026
35da9b8
test(tui): lock managed SSH option pairing
lawrencecchen Aug 11, 2026
c7b6bed
fix(tui): resolve replayed sidebar definition
lawrencecchen Aug 11, 2026
69255df
fix(tui): retain machine attempt identity
lawrencecchen Aug 11, 2026
bf44c28
fix(tui): align hosted platform recovery
lawrencecchen Aug 11, 2026
e373433
style(tui): apply hosted timing format
lawrencecchen Aug 11, 2026
e036a94
fix(tui): guard Unix renderer handshake
lawrencecchen Aug 11, 2026
8b02444
fix(tui): compile Windows SSH bridge
lawrencecchen Aug 11, 2026
0036c22
fix(tui): flush Windows SSH relay responses
lawrencecchen Aug 11, 2026
206535f
fix(tui): surface Windows SSH failures
lawrencecchen Aug 11, 2026
56e07d3
fix(tui): use secure Windows SSH state
lawrencecchen Aug 11, 2026
799b2e7
fix(tui): observe public Windows shutdown
lawrencecchen Aug 11, 2026
228c4c0
fix(tui): bound failed machine connection retries
lawrencecchen Aug 11, 2026
4e61d51
fix(tui): preserve active provider connections
lawrencecchen Aug 11, 2026
ad52cfc
fix(tui): harden native Windows SSH lifecycle
lawrencecchen Aug 11, 2026
3bea4b1
fix(tui): close native Windows SSH review findings
lawrencecchen Aug 11, 2026
b697ed1
fix(tui): expose scoped SSH target state
lawrencecchen Aug 11, 2026
5cf7bba
fix(tui): align Windows owner SID storage
lawrencecchen Aug 11, 2026
433203c
test(tui): return Windows shell marker success
lawrencecchen Aug 11, 2026
59edbc7
ci: exclude unix-only SDK from Windows tests
lawrencecchen Aug 11, 2026
62ddd5c
test: gate Unix browser runtime integration
lawrencecchen Aug 11, 2026
f472981
ci: skip Unix terminal client on Windows
lawrencecchen Aug 11, 2026
88d18f5
test: recognize audited injected clocks (#9944)
lawrencecchen Aug 11, 2026
a396831
test(tui): import cross-platform CLI IO traits
lawrencecchen Aug 11, 2026
24a59a6
test(tui): align Windows workspace gate fixtures
lawrencecchen Aug 11, 2026
5359530
fix(tui): set Windows secure directory owner
lawrencecchen Aug 11, 2026
4e33d2d
ci: target Windows-native TUI tests
lawrencecchen Aug 11, 2026
11fef61
fix(tui): stabilize hosted Windows carrier gates
lawrencecchen Aug 11, 2026
f55fcd3
style(tui): apply hosted Rust formatting
lawrencecchen Aug 11, 2026
e137e4f
test(tui): gate authenticated Windows carrier exit
lawrencecchen Aug 11, 2026
39195a6
style(tui): format Windows carrier fixture
lawrencecchen Aug 11, 2026
e9b03ae
test(tui): preserve hosted SSH startup diagnostics
lawrencecchen Aug 11, 2026
d59cdab
fix(tui): accept Windows short state paths
lawrencecchen Aug 11, 2026
b0475d8
style(tui): format Windows path validation
lawrencecchen Aug 11, 2026
6731e09
fix(tui): release killed terminal image quota
lawrencecchen Aug 11, 2026
0454420
style(tui): format dead Kitty pruning
lawrencecchen Aug 11, 2026
4225760
test(tui): cover automatic Windows owner upgrade
lawrencecchen Aug 11, 2026
e8ef99c
fix(tui): stop Windows owner before automatic upgrade
lawrencecchen Aug 11, 2026
f82ed4e
test(tui): use async Windows upgrade guard
lawrencecchen Aug 11, 2026
38c3029
fix(tui): release killed terminal quota immediately
lawrencecchen Aug 11, 2026
48c4b9b
test(tui): cover pending killed quota expansion
lawrencecchen Aug 11, 2026
6693269
ci(tui): isolate Windows native test temp root (#9984)
lawrencecchen Aug 11, 2026
1e774e6
fix(tui): discard killed quota expansions
lawrencecchen Aug 11, 2026
5a0f88d
Merge current main into native Windows SSH
lawrencecchen Aug 11, 2026
ff8520a
Merge concurrent Windows gate hardening
lawrencecchen Aug 11, 2026
2308d69
fix(tui): scope graceful quota cleanup to tests
lawrencecchen Aug 11, 2026
826f787
fix(tui): flush local Windows SSH replies (#9955)
lawrencecchen Aug 11, 2026
b27a277
Merge remote-tracking branch 'origin/main' into feat-tui-native-windows
lawrencecchen Aug 11, 2026
f7a3dc1
test(tui): repair hosted reconnect fixtures
lawrencecchen Aug 11, 2026
8fd23cb
test(tui): use current mux shutdown API
lawrencecchen Aug 11, 2026
6e81fc6
test(tui): preserve exited terminal replay
lawrencecchen Aug 11, 2026
9c03d01
test(tui): use imported JSON value
lawrencecchen Aug 11, 2026
1a2ba25
fix(tui): reconcile terminal close replay revisions
lawrencecchen Aug 11, 2026
de38146
Merge current main into feat-tui-native-windows
lawrencecchen Aug 11, 2026
0dfc7df
test(tui): cover native Windows SSH defaults
lawrencecchen Aug 11, 2026
eaf3fee
fix(tui): use native Windows SSH companion default
lawrencecchen Aug 11, 2026
c4b69ee
test(tui): cover nested Windows remote help
lawrencecchen Aug 11, 2026
0ee682b
fix(tui): route Windows remote help before execution
lawrencecchen Aug 11, 2026
9a2b458
test(tui): cover Windows SSH configuration defaults
lawrencecchen Aug 11, 2026
3f05517
style(tui): apply hosted rustfmt
lawrencecchen Aug 11, 2026
68f69ca
test(tui): serialize crossterm color parsing
lawrencecchen Aug 12, 2026
87ad711
Remove APNs test wall-clock waits (#9931)
lawrencecchen Aug 12, 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
255 changes: 242 additions & 13 deletions .github/workflows/cmux-tui-build-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ jobs:
TARGET_SET: ${{ inputs.target_set }}
PACKAGE_NPM: ${{ inputs.package_npm }}
PACKAGE_PYPI: ${{ inputs.package_pypi }}
INCLUDE_WINDOWS: ${{ inputs.include_windows }}
MACOS_RUNNER: ${{ inputs.macos_runner != '' && inputs.macos_runner || vars.MACOS_RUNNER_15 || 'blacksmith-6vcpu-macos-15' }}
LINUX_RUNNER: ${{ inputs.linux_runner != '' && inputs.linux_runner || vars.LINUX_RUNNER || 'blacksmith-4vcpu-ubuntu-2404' }}
LINUX_ARM64_RUNNER: ${{ vars.LINUX_ARM64_RUNNER || 'ubuntu-24.04-arm' }}
Expand Down Expand Up @@ -141,6 +142,8 @@ jobs:
)
if packages_requested and target_set != "all":
raise SystemExit("npm and PyPI packaging require target_set=all")
if packages_requested and os.environ["INCLUDE_WINDOWS"] != "true":
raise SystemExit("npm and PyPI packaging require include_windows=true")

print("matrix=" + json.dumps({"include": selected}, separators=(",", ":")))

Expand Down Expand Up @@ -480,6 +483,185 @@ jobs:
cd ../cmux-tui
cargo build -p cmux-tui --bin cmux-tui --bin cmux-tui-hook --release --locked --target x86_64-pc-windows-gnu

- name: Prepare owned Windows native test temp root
shell: pwsh
run: |
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;

public static class NativeDirectory {
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CreateDirectoryW(string path, IntPtr securityAttributes);
}
'@
$localAppData = [IO.Path]::GetFullPath($env:LOCALAPPDATA).TrimEnd([IO.Path]::DirectorySeparatorChar)
$originalTemp = $env:TEMP
$originalTmp = $env:TMP
if ([string]::IsNullOrWhiteSpace($originalTemp) -or [string]::IsNullOrWhiteSpace($originalTmp)) {
throw "The Windows runner must define TEMP and TMP"
}
$createdTemp = $false
try {
for ($attempt = 0; $attempt -lt 32; $attempt++) {
# Keep the owned root short enough for Windows AF_UNIX test sockets.
$testTempName = "c$([guid]::NewGuid().ToString('N').Substring(0, 7))"
$candidate = [IO.Path]::GetFullPath((Join-Path $localAppData $testTempName))
if (-not $candidate.StartsWith("$localAppData$([IO.Path]::DirectorySeparatorChar)", [StringComparison]::OrdinalIgnoreCase)) {
throw "Native Windows test temp root escaped LOCALAPPDATA: $candidate"
}
if ([NativeDirectory]::CreateDirectoryW($candidate, [IntPtr]::Zero)) {
$testTemp = $candidate
$createdTemp = $true
break
}
$errorCode = [Runtime.InteropServices.Marshal]::GetLastWin32Error()
if ($errorCode -ne 183) {
throw "Could not create the Windows native test temp root (error $errorCode)"
}
}
if (-not $createdTemp) {
throw "Could not reserve a unique Windows native test temp root"
}

$ownerMarker = Join-Path $testTemp ".cmux-ci-owner-$([guid]::NewGuid().ToString('N'))"
$marker = [IO.File]::Open($ownerMarker, [IO.FileMode]::CreateNew, [IO.FileAccess]::Write, [IO.FileShare]::None)
$marker.Dispose()
$env:TEMP = $testTemp
$env:TMP = $testTemp
$env:CMUX_EXPECTED_TEMP_ROOT = $testTemp

$probeSource = Join-Path $testTemp "temp-dir-probe.rs"
$probeBinary = Join-Path $testTemp "temp-dir-probe.exe"
@'
use std::path::PathBuf;

fn comparable(path: PathBuf) -> String {
path.to_string_lossy()
.replace('/', "\\")
.trim_end_matches('\\')
.to_lowercase()
}

fn main() {
let temp = std::env::temp_dir();
let local = std::env::var_os("LOCALAPPDATA")
.map(PathBuf::from)
.expect("LOCALAPPDATA must be set");
let expected = std::env::var_os("CMUX_EXPECTED_TEMP_ROOT")
.map(PathBuf::from)
.expect("CMUX_EXPECTED_TEMP_ROOT must be set");
let temp_key = comparable(temp.clone());
let local_key = comparable(local);
let expected_key = comparable(expected);
let is_inside = temp_key == local_key
|| temp_key.starts_with(&(local_key.clone() + "\\"));
assert!(
is_inside,
"std::env::temp_dir() escaped LOCALAPPDATA: {}",
temp.display()
);
assert_eq!(
temp_key,
expected_key,
"std::env::temp_dir() did not use the owned test root"
);
println!("std::env::temp_dir()={}", temp.display());
}
'@ | Set-Content -LiteralPath $probeSource -Encoding utf8
rustc --target x86_64-pc-windows-gnu $probeSource -o $probeBinary
& $probeBinary
if ($LASTEXITCODE -ne 0) {
throw "Rust temp directory probe failed with exit code $LASTEXITCODE"
}
Remove-Item Env:CMUX_EXPECTED_TEMP_ROOT
@(
"CMUX_WINDOWS_NATIVE_TEST_TEMP=$testTemp"
"CMUX_WINDOWS_NATIVE_TEST_OWNER_MARKER=$ownerMarker"
"CMUX_WINDOWS_NATIVE_TEST_ORIGINAL_TEMP=$originalTemp"
"CMUX_WINDOWS_NATIVE_TEST_ORIGINAL_TMP=$originalTmp"
"TEMP=$testTemp"
"TMP=$testTemp"
) | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
} catch {
if ($createdTemp -and (Test-Path -LiteralPath $testTemp)) {
Remove-Item -LiteralPath $testTemp -Recurse -Force -ErrorAction Stop
}
throw
}

- name: Verify native Windows remote probe
shell: bash
run: |
output="$(cmux-tui/target/x86_64-pc-windows-gnu/release/cmux-tui.exe remote-probe --json)"
printf '%s\n' "$output"
python -c 'import json,sys; probe=json.load(sys.stdin); assert probe["app"] == "cmux-tui"; assert probe["os"] == "windows"' <<<"$output"

- name: Verify native Windows remote startup is bounded
shell: bash
run: |
set +e
output="$(timeout 15s cmux-tui/target/x86_64-pc-windows-gnu/release/cmux-tui.exe remote-link --stdio --session ci-smoke </dev/null 2>&1)"
status=$?
set -e
printf '%s\n' "$output"
test "$status" -ne 124
if [[ "$status" -ne 0 ]]; then
# Hosted Windows jobs forbid process breakaway. Production must
# fail instead of starting an owner that dies with its carrier.
grep -F "could not start Windows mux owner: Access is denied" <<<"$output"
fi
if [[ "$status" -eq 0 ]]; then
cmux-tui/target/x86_64-pc-windows-gnu/release/cmux-tui.exe remote-stop --session ci-smoke
fi

- name: Verify native Windows SSH through hosted OpenSSH
shell: pwsh
run: |
cmux-tui/scripts/smoke-windows-native-ssh.ps1 `
-Binary cmux-tui/target/x86_64-pc-windows-gnu/release/cmux-tui.exe

- name: Verify native Windows ConPTY terminal
shell: bash
run: cmux-tui/scripts/smoke-windows-native.sh cmux-tui/target/x86_64-pc-windows-gnu/release/cmux-tui.exe

- name: Run native Windows tests
shell: pwsh
run: |
Remove-Item Env:CMUX_GHOSTTY_SRC -ErrorAction SilentlyContinue
Set-Location cmux-tui
$failedSuites = @()

# Preserve the complete Windows-native test commands from the owner branch.
cargo test --workspace --exclude cmux-sdk --exclude cmux-sidebar --exclude cmux-terminal-client --exclude cmux-tui-core --exclude cmux-tui --locked --target x86_64-pc-windows-gnu
if ($LASTEXITCODE -ne 0) {
$failedSuites += "workspace"
}
cargo test -p cmux-tui-core --lib --locked --target x86_64-pc-windows-gnu windows
if ($LASTEXITCODE -ne 0) {
$failedSuites += "core Windows"
}
cargo test -p cmux-tui --bin cmux-tui --locked --target x86_64-pc-windows-gnu windows
if ($LASTEXITCODE -ne 0) {
$failedSuites += "TUI unit"
}
cargo test -p cmux-tui --test cli --locked --target x86_64-pc-windows-gnu local_and_authenticated_remote_namespaces_do_not_cross_target
if ($LASTEXITCODE -ne 0) {
$failedSuites += "remote help"
}
cargo test -p cmux-tui --bin cmux-tui --locked --target x86_64-pc-windows-gnu config_overrides_defaults
if ($LASTEXITCODE -ne 0) {
$failedSuites += "configuration defaults"
}
cargo test -p cmux-tui --test windows_remote_owner --locked --target x86_64-pc-windows-gnu
if ($LASTEXITCODE -ne 0) {
$failedSuites += "remote owner"
}
if ($failedSuites.Count -ne 0) {
throw "Native Windows test suites failed: $($failedSuites -join ', ')"
}

- name: Verify long Windows state path
shell: bash
run: |
Expand All @@ -505,17 +687,6 @@ jobs:
python cmux-tui/scripts/smoke-windows-conpty-resize.py \
--binary cmux-tui/target/x86_64-pc-windows-gnu/release/cmux-tui.exe

- name: Verify remote commands fail clearly on Windows
shell: bash
run: |
set +e
output="$(cmux-tui/target/x86_64-pc-windows-gnu/release/cmux-tui.exe remote-probe --json 2>&1)"
status=$?
set -e
printf '%s\n' "$output"
test "$status" -eq 1
grep -F "remote daemon commands require Unix sockets" <<<"$output"

- name: Stage binary
shell: bash
run: |
Expand All @@ -533,10 +704,57 @@ jobs:
dist/cmux-tui-hook-x86_64-pc-windows-gnu.exe
if-no-files-found: error

- name: Clean owned Windows native test temp root
if: ${{ always() }}
shell: pwsh
run: |
$testTemp = $env:CMUX_WINDOWS_NATIVE_TEST_TEMP
if ([string]::IsNullOrWhiteSpace($testTemp)) {
return
}

$localAppData = [IO.Path]::GetFullPath($env:LOCALAPPDATA).TrimEnd([IO.Path]::DirectorySeparatorChar)
$testTemp = [IO.Path]::GetFullPath($testTemp).TrimEnd([IO.Path]::DirectorySeparatorChar)
$parent = [IO.Path]::GetDirectoryName($testTemp)
$leaf = [IO.Path]::GetFileName($testTemp)
if (-not $parent.Equals($localAppData, [StringComparison]::OrdinalIgnoreCase)) {
throw "Refusing to clean Windows temp root outside LOCALAPPDATA: $testTemp"
}
if ($leaf -notmatch '^c[0-9a-f]{7}$') {
throw "Refusing to clean an unowned Windows temp root: $testTemp"
}
$ownerMarker = [IO.Path]::GetFullPath($env:CMUX_WINDOWS_NATIVE_TEST_OWNER_MARKER)
$markerParent = [IO.Path]::GetDirectoryName($ownerMarker)
$markerLeaf = [IO.Path]::GetFileName($ownerMarker)
if (-not $markerParent.Equals($testTemp, [StringComparison]::OrdinalIgnoreCase)) {
throw "Refusing to clean a Windows temp root without its exact ownership marker"
}
if ($markerLeaf -notmatch '^\.cmux-ci-owner-[0-9a-f]{32}$' -or -not (Test-Path -LiteralPath $ownerMarker -PathType Leaf)) {
throw "Refusing to clean a Windows temp root without its job ownership marker"
}
$originalTemp = $env:CMUX_WINDOWS_NATIVE_TEST_ORIGINAL_TEMP
$originalTmp = $env:CMUX_WINDOWS_NATIVE_TEST_ORIGINAL_TMP
if ([string]::IsNullOrWhiteSpace($originalTemp) -or [string]::IsNullOrWhiteSpace($originalTmp)) {
throw "Refusing to clean without the original Windows TEMP and TMP values"
}
@(
"TEMP=$originalTemp"
"TMP=$originalTmp"
"CMUX_WINDOWS_NATIVE_TEST_TEMP="
"CMUX_WINDOWS_NATIVE_TEST_OWNER_MARKER="
"CMUX_WINDOWS_NATIVE_TEST_ORIGINAL_TEMP="
"CMUX_WINDOWS_NATIVE_TEST_ORIGINAL_TMP="
) | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
if (Test-Path -LiteralPath $testTemp) {
Remove-Item -LiteralPath $testTemp -Recurse -Force -ErrorAction Stop
}

package:
name: package distributions
needs: build
if: inputs.package_npm || inputs.package_pypi
needs:
- build
- build-windows
Comment thread
coderabbitai[bot] marked this conversation as resolved.
if: inputs.include_windows && (inputs.package_npm || inputs.package_pypi)
runs-on: ${{ inputs.linux_runner != '' && inputs.linux_runner || vars.LINUX_RUNNER || 'blacksmith-4vcpu-ubuntu-2404' }}
timeout-minutes: 30
permissions:
Expand Down Expand Up @@ -582,6 +800,12 @@ jobs:
name: cmux-tui-aarch64-unknown-linux-musl
path: dist/binaries

- name: Download Windows companion binary
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
with:
name: cmux-tui-x86_64-pc-windows-gnu
path: dist/binaries

- name: Build npm package directories
if: inputs.package_npm
run: |
Expand Down Expand Up @@ -622,6 +846,9 @@ jobs:
if deps != {name: version for name in platforms}:
print(f"optionalDependencies mismatch: {deps}", file=sys.stderr)
raise SystemExit(1)
companion = root / "cmux" / "bin" / "cmux-tui-x86_64-pc-windows-gnu.exe"
if not companion.is_file():
raise SystemExit(f"missing Windows companion: {companion}")
for name, (os_name, cpu) in platforms.items():
package_json = json.loads((root / name / "package.json").read_text())
if package_json["version"] != version:
Expand Down Expand Up @@ -676,6 +903,8 @@ jobs:
set -euo pipefail
for wheel in dist/pypi-wheels/*.whl; do
python3 -m zipfile -l "$wheel" >"/tmp/$(basename "$wheel").list"
grep -F "cmux_tui/bin/cmux-tui-x86_64-pc-windows-gnu.exe" \
"/tmp/$(basename "$wheel").list"
done
python3 - <<'PY'
import glob
Expand Down
14 changes: 14 additions & 0 deletions .github/workflows/cmux-tui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,20 @@ jobs:
socket_browser_attach_streams_frames_input_and_cell_pixels \
-- --exact

- name: Build macOS debug binary
if: runner.os == 'macOS'
working-directory: cmux-tui
run: cargo build -p cmux-tui --locked

- name: Upload macOS debug binary
if: runner.os == 'macOS'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: cmux-tui-macos-debug
path: cmux-tui/target/debug/cmux-tui
if-no-files-found: error
retention-days: 3

- name: cargo test
working-directory: cmux-tui
env:
Expand Down
Loading
Loading