Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
3606617
Stop CLI Sentry floods from caller state and unattributed journal fai…
lawrencecchen Sep 28, 2026
b7ce8d0
Bound the Iroh release-gate launcher
azooz2003-bit Sep 28, 2026
f1c54d0
ci: charge newer runs one root runner each when gui runners are on (#…
teamleaderleo Sep 28, 2026
b23420c
Document and tool in-place cmux-tui upgrades for running Cloud machin…
lawrencecchen Sep 28, 2026
18abc85
Report a non-running terminal as surface_unavailable in read_text (#1…
lawrencecchen Sep 28, 2026
22835e8
Docs: raise search field contrast (#14365)
lawrencecchen Sep 28, 2026
10505af
fix(cloud): recover machine list on app foreground (#15100) (#15104)
austinywang Sep 28, 2026
55b4049
Keep Cloud sidebar drags free of hints (#15123)
austinywang Sep 28, 2026
beb4c14
Test that socket discovery and remote forwarding stay on this user's …
austinywang Sep 28, 2026
6ce2e23
Keep socket discovery and remote forwarding on this user's socket
austinywang Sep 28, 2026
10c4d52
Fix Mac discovery consent, live terminal resizing, and blank hibernat…
austinywang Sep 28, 2026
dcacaab
docs: add cmux Cloud documentation section in all locales (#15143)
lawrencecchen Sep 28, 2026
426248d
docs: stop table code cells wrapping per character (#15165)
lawrencecchen Sep 28, 2026
80dfbb3
zsh integration: use zsh/zselect for poll-loop sleeps (no fork) (#6032)
jsamuel1 Sep 28, 2026
b4d72a9
Keep cmux's own keys out of the config error card; end restored scrol…
teamleaderleo Sep 28, 2026
744176a
docs: group the docs sidebar into sections (#15164)
lawrencecchen Sep 28, 2026
4438a2e
Bump bonsplit: fix tab hover landing on the first tab (#15121)
lawrencecchen Sep 28, 2026
f807908
ci: run changed suites inside an owned compile admission when its gui…
teamleaderleo Sep 28, 2026
d0cf4f1
Keep OSC terminal titles across Cloud resizes and reattaches (#15163)
lawrencecchen Sep 28, 2026
91df106
ci: clone node-cache products into jobs instead of hard-linking them …
teamleaderleo Sep 28, 2026
47a223c
Fix live Codex restore lease contention hanging indefinitely (#15120)
austinywang Sep 28, 2026
214448a
ios: report active v2 peer transport path (#15182)
azooz2003-bit Sep 28, 2026
a49afca
read_text: explain why a terminal is not running and how to wake it (…
lawrencecchen Sep 28, 2026
5bf1b45
perf(claude-wrapper): skip redundant settings validation and overlap …
teamleaderleo Sep 28, 2026
05e0598
Keep tmux reattach bindings through update relaunch saves (#15187)
teamleaderleo Sep 28, 2026
ec90c2a
ci: post a one-click dogfood link on app pull requests (#15130)
teamleaderleo Sep 28, 2026
b76db12
ci: clone owned build state in one clonefile call and start the seed …
teamleaderleo Sep 28, 2026
528c5a8
Keep a finished agent turn idle when a late tool result arrives (#15173)
austinywang Sep 28, 2026
3412812
Restore the Cloud template terminal in place after a daemon restart (…
lawrencecchen Sep 28, 2026
48d662a
ci: ui-tests dispatches UI tests with main's dispatcher (#15193)
teamleaderleo Sep 28, 2026
714ec53
ci: stop at a full disk on clonefile, and never nest a seed clone (#1…
teamleaderleo Sep 28, 2026
f225777
Ghostty config live reload: keep saves during a reload, reload a them…
teamleaderleo Sep 28, 2026
89519d8
ci: expand an empty E2E -only-testing list under bash 3.2 (#15208)
teamleaderleo Sep 28, 2026
3c2cb96
Pane focus memory and New Pane (Auto Layout) (#15125)
lawrencecchen Sep 28, 2026
d5f71c5
ci: iOS picker charges runs by their live jobs, not their titles (#15…
teamleaderleo Sep 28, 2026
b17bc18
ui-tests: empty Diagnostics Reporter's queue before closing it (#15189)
teamleaderleo Sep 28, 2026
0bb41fa
test: restore the first responder before the dictation paste test's C…
teamleaderleo Sep 28, 2026
c74b646
License the cmux server software under the Business Source License 1.…
lawrencecchen Sep 28, 2026
147a616
ci: cmux-tui's release-path macOS builds take the owned side lane fir…
teamleaderleo Sep 28, 2026
454f191
ci: read the gui backlog eight runs at a time in late placement (#15207)
teamleaderleo Sep 28, 2026
53395a8
Recover a missing team scope instead of failing Mac pairing (#15083)
lawrencecchen Sep 28, 2026
5171e34
docs: say Cloud turns on per Mac through a staged rollout (#15194)
lawrencecchen Sep 28, 2026
a3d6070
Fix Cloud projection reads mutating observation state (#15126)
austinywang Sep 28, 2026
0e1ab96
ci: force relay rollover renewal in release gate (#15212)
azooz2003-bit Sep 28, 2026
1b55596
Move saved sessions between cmux installs: restore-session --from / -…
teamleaderleo Sep 28, 2026
a98c560
test: pin font magnification in the Cloud outline attention test (#15…
teamleaderleo Sep 28, 2026
0ebf8d7
Fix main-thread freeze during SSH paste detection (#15113)
austinywang Sep 28, 2026
fd96369
Check the owner of the Claude shim directory in the app, workspace co…
austinywang Sep 28, 2026
eae4994
Pin password badge actions to their source runtime (#14921)
teamleaderleo Sep 28, 2026
61083e3
test: keep workspace cwd inheritance tests off the shared standard de…
teamleaderleo Sep 28, 2026
97fe6b4
test: keep the Cloud notification harness workspace unselected (#15215)
teamleaderleo Sep 28, 2026
4c15bb3
cmux-browser: stop requiring GPL for web/package.json (#15231)
teamleaderleo Sep 28, 2026
758aaeb
fix(ios): clear read notifications on foreground return (#14725)
azooz2003-bit Sep 28, 2026
0fc4975
test: pin the fixture PATH inside the zsh watcher sleep test (#15237)
teamleaderleo Sep 28, 2026
1255448
test: fix three app-host tests that keep main red (#15204)
teamleaderleo Sep 28, 2026
b0d5083
ci: dispatch UI tests from a default-branch workflow; PR CI keeps no …
teamleaderleo Sep 28, 2026
b3a73f0
chatmux-relay: keep cmux-tui sockets and journal cursors private to t…
austinywang Sep 28, 2026
1220252
codex-teams: keep the watcher's socket password out of its arguments …
austinywang Sep 28, 2026
c307ab0
cmux-tui: only connect to derived local sockets served by this user (…
austinywang Sep 28, 2026
9971c2c
Keep newer iOS connections alive when a recovery is superseded (#15141)
azooz2003-bit Sep 28, 2026
71a921c
fix(web): stop orphaned Cloud VM alert pages (#15138)
austinywang Sep 28, 2026
ba94a13
CI: let Iroh release gate reuse unchanged TUI artifact
azooz2003-bit Sep 28, 2026
b36339a
Add a timed Cloud VM dogfood journey workflow (#15242)
teamleaderleo Sep 28, 2026
d960a13
cmux-tui: route agent hooks from tmux sessions started outside cmux-t…
teamleaderleo Sep 28, 2026
b7ff006
Recover agent sessions from the journal after an unclean exit (#14870)
teamleaderleo Sep 28, 2026
2e0750b
Localization: read Swift multi-line help defaults in the change helpe…
teamleaderleo Sep 28, 2026
8714160
Let dogfood tours hold modifiers while clicking (#15239)
teamleaderleo Sep 28, 2026
f4115d7
Center cloud row icon glyphs by their visible pixels (#15149)
lawrencecchen Sep 28, 2026
3887653
docs: hide the Cloud beta note on nightly docs (#15317)
lawrencecchen Sep 28, 2026
dc5a21a
ci: place the Iroh release gate's Tailscale job on the owned minis (#…
teamleaderleo Sep 28, 2026
f66d18a
Dial every discovered Mac concurrently on iOS (#15127)
azooz2003-bit Sep 28, 2026
447eb04
Keep focused-pane notifications silent unless opted in (#15233)
teamleaderleo Sep 28, 2026
1755ea8
ci: place release-build and main's side lanes on the owned minis (#14…
teamleaderleo Sep 28, 2026
8e6357b
Add pr-media.py for putting a clip or screenshot on a PR (#15295)
teamleaderleo Sep 28, 2026
fc882fe
Cloud: rebake the devbox ladder with cmux-tui 3412812 (#15323)
lawrencecchen Sep 28, 2026
436909b
Keep an exited terminal's tab edge consistent with its revision (#15205)
teamleaderleo Sep 28, 2026
62cde14
Place config error notice below the tab bar (#15218)
lawrencecchen Sep 28, 2026
0c753fe
ci: give each Python lane test an empty Foundation home (#15289)
teamleaderleo Sep 28, 2026
bdb6920
Keep the mail broker from orphaning a reply to an unknown parent (#15…
teamleaderleo Sep 28, 2026
42f93d4
Re-verify the session against a body-supplied VM billing team (#15339)
teamleaderleo Sep 28, 2026
0975d0b
Release discarded CodeRouter response bodies after retry (#15253)
teamleaderleo Sep 28, 2026
3fd61eb
Sidebar: show the most urgent pane's status when panes share an agent…
teamleaderleo Sep 28, 2026
16f1270
cli: answer queued agent hooks inside the agent's hook timeout (#14834)
teamleaderleo Sep 28, 2026
e5231be
CI: post screenshots and a GIF of each app PR's build in its dogfood …
teamleaderleo Sep 28, 2026
94a6387
Add an agent activity mode to workspace auto-reordering (#15216)
teamleaderleo Sep 28, 2026
fff0b82
UI fuzzer: seeded action sequences, oracles, minimized repros and ded…
teamleaderleo Sep 28, 2026
558d6b9
ci: move owned gui jobs to Blacksmith only when its queue is shorter …
teamleaderleo Sep 28, 2026
96e7a27
reload.sh: expand the empty resolver args safely under bash 3.2 (#15352)
teamleaderleo Sep 28, 2026
ee20686
fix: keep SSH exit prompt off PTY output drain (#15337)
teamleaderleo Sep 28, 2026
3843dd6
ci: queue main's whole full-suite run on the owned pool (#15356)
teamleaderleo Sep 28, 2026
b8afe20
Add notifications.suppressWhenAppFocused setting (#14701)
teamleaderleo Sep 28, 2026
5a3ca1a
ci: price mini contention in distance routing and keep SwiftPM builds…
teamleaderleo Sep 28, 2026
31b2619
Recover routed Claude sessions through cmux restore; journal closed p…
teamleaderleo Sep 28, 2026
1a7467a
dogfood: give the agent activity reorder tour paths globs (#15360)
lawrencecchen Sep 28, 2026
842d580
ci: prebuild selected Swift packages in parallel before the serial te…
teamleaderleo Sep 28, 2026
7b6ad14
PR media: tour-only pushes load the earlier build of the same inputs …
teamleaderleo Sep 28, 2026
4898cde
ci: bound the SwiftPM scratch holder and cache scratch sizes (#15366)
teamleaderleo Sep 28, 2026
56ec600
PR media: prune media of long-closed pull requests (#15364)
teamleaderleo Sep 28, 2026
1b857ac
test: cover a live Codex turn owner keeping its turn on SessionStart …
teamleaderleo Sep 28, 2026
24ee0ee
Exit 1 when cmux terminal screen wait times out (#15282)
teamleaderleo Sep 28, 2026
cd030e9
Keep a named Cloud machine's prompt name instead of flipping to its s…
teamleaderleo Sep 28, 2026
634a155
test: expect injected pane attention accent (#15370)
teamleaderleo Sep 28, 2026
9373164
ci: queue a pull request's admission for a root runner when Blacksmit…
teamleaderleo Sep 28, 2026
6e4f1da
ci: drain the snapshot's owned queue by what the machines finished si…
teamleaderleo Sep 28, 2026
8743ec8
test: stop Computer Use onboarding tests waiting out the helper statu…
teamleaderleo Sep 28, 2026
7171ea8
Add app.tabBarVisibility to hide the pane tab bar when a pane has one…
teamleaderleo Sep 28, 2026
9ed83fd
Dogfood journey: record whether a paused Cloud machine is asleep (#15…
teamleaderleo Sep 28, 2026
2638d56
Agent activity reorder follow-ups: group on-top check, search, subtit…
teamleaderleo Sep 28, 2026
48258b4
fix(iroh-v2): check the team socket cap before opening the session (#…
teamleaderleo Sep 28, 2026
03a2f6e
Record that cloud_vm_sessions.attachment_count is cumulative (#15321)
teamleaderleo Sep 28, 2026
b681e7e
Keep a pending banner quiet once its pane is focused (#15357)
teamleaderleo Sep 28, 2026
3088273
ci: UI test runs adopt compile admission's product, skip the re-uploa…
teamleaderleo Sep 28, 2026
0e298fb
ci: wait for the product's canonical root instead of compiling beside…
teamleaderleo Sep 28, 2026
ebd1f4f
fix(iroh-v2): commit delivery accounting only after the frame is sent…
teamleaderleo Sep 28, 2026
e02c385
PR media: compile once when CI's build cannot load, and say why a tou…
teamleaderleo Sep 28, 2026
b4f5dc5
ci: move UI runs pinned to Blacksmith macOS 26 onto owned Macs (#15383)
teamleaderleo Sep 28, 2026
20ef7c9
Keep the main window floor on the animating setFrame path (#15368)
teamleaderleo Sep 28, 2026
0f2d3d3
Show Claude sessions that stop on an API error instead of leaving the…
teamleaderleo Sep 28, 2026
6760c93
iOS: Add Computer never disturbs the active Mac (#15102)
azooz2003-bit Sep 28, 2026
bc28bc4
Release the Base generation when a create is refused for credits (#15…
teamleaderleo Sep 28, 2026
2f6716c
PR media: classify app changes by CI's build inputs; a reuse error is…
teamleaderleo Sep 28, 2026
906926a
ci: dogfood builds are opt-in with the dev-build label (#15380)
teamleaderleo Sep 28, 2026
4f14fa3
ci: move CLI regressions to CLI product tests and rebalance the seven…
teamleaderleo Sep 28, 2026
7b0a15f
Keep agent- and script-opened workspaces and panes in the background …
teamleaderleo Sep 28, 2026
2890f0b
Roll the Base create back when the owner network resolve fails (#15358)
teamleaderleo Sep 28, 2026
41ad40d
fix: keep the terminal area when the window is too narrow for the sid…
teamleaderleo Sep 28, 2026
1028a08
test: isolate background workspace git probe fixture (#15388)
teamleaderleo Sep 28, 2026
31a59ab
Cloud machine list reports who created each machine (#15261)
teamleaderleo Sep 28, 2026
192ee4c
Stabilize minimal-mode workspace routing test (#15385)
teamleaderleo Sep 28, 2026
54473f6
Serialize async test app contexts (#15390)
teamleaderleo Sep 28, 2026
78c566c
triage: severity and area labels, with the rules in the repo (#15228)
teamleaderleo Sep 28, 2026
cd9d1c9
test: release offscreen terminal fixtures before the next suite (#15322)
teamleaderleo Sep 28, 2026
f12f578
PR media: keep each tour's folder through the artifact hand-off (#15405)
teamleaderleo Sep 28, 2026
93d0706
ci: explicit owned E2E runs take root runners; rescue jobs waiting in…
teamleaderleo Sep 28, 2026
da27bbc
ci: passing guard tests print no ::error annotations (#15399)
teamleaderleo Sep 28, 2026
56eacd4
Describe memory-pressure hibernation the way it works (#15290)
teamleaderleo Sep 28, 2026
c9b235a
Refuse a split that would leave a pane below its minimum size (#15392)
teamleaderleo Sep 28, 2026
734cff3
ci: let the UI test lane replay the fuzzer regressions (#15401)
teamleaderleo Sep 28, 2026
8b23dd7
ci: re-run lost-runner jobs; end the UI wait when compile admission f…
teamleaderleo Sep 28, 2026
defccda
fix(cloud): say a machine's id and age in its accessibility label (#1…
teamleaderleo Sep 28, 2026
0b2d3e0
ci: run CmuxCloud package tests and move 22 Cloud logic suites out of…
teamleaderleo Sep 28, 2026
9eb402d
Sidebar: opt-in compact status glyph for agent, PR and branch state (…
teamleaderleo Sep 28, 2026
d2a290b
Let an explicit cmux ssh open's control options reach an idle carrier…
teamleaderleo Sep 28, 2026
f9204c4
Crash recovery: pace recovered launches, record the account pin on it…
teamleaderleo Sep 28, 2026
62ee70e
Remove the duplicated Claude stop-failure strings from Localizable.xc…
teamleaderleo Sep 28, 2026
d2877b2
tests: find the Settings window by identifier; Settings UI tests run …
teamleaderleo Sep 28, 2026
5663c13
Finish the destroy work where a Cloud machine is first found gone (#1…
teamleaderleo Sep 28, 2026
7f08715
ci(seed): keep the trusted seed on the Mac before the R2 upload (#15411)
teamleaderleo Sep 28, 2026
0abac32
PR media: adopt CI's build only, start when CI completes, run for eve…
teamleaderleo Sep 28, 2026
97491a7
Let the Cloud toolbar name the machine-list failure it has (#15236)
teamleaderleo Sep 28, 2026
818d475
Let a user's Cloud open dial even right after a background link failu…
teamleaderleo Sep 28, 2026
524ebff
ci: replay the fuzz regressions on sidebar, split and window changes …
teamleaderleo Sep 28, 2026
762c3ed
Recover a Cloud machine graph stuck on an equal-cursor conflict (#15328)
teamleaderleo Sep 28, 2026
90e6862
Fix split-space admission after sidebar pane changes (#15422)
teamleaderleo Sep 28, 2026
eb2331c
Add a dragAt step to the dogfood tour format (#15315)
teamleaderleo Sep 28, 2026
16f0f97
Fix Cloud graph freezing on daemons that send no cursor (#15283)
teamleaderleo Sep 28, 2026
1b3fbff
ci: accept dynamic app-host shard names (#15426)
teamleaderleo Sep 28, 2026
04c8747
ci: scope contributor web complexity to web changes (#15424)
teamleaderleo Sep 28, 2026
03a30c0
Add btop-style agent activity sidebar example (#15393)
teamleaderleo Sep 28, 2026
5410299
dogfood: make modifier-clicks-tour click on its own URL (#15421)
teamleaderleo Sep 28, 2026
881de65
ci: reject masked Swift Testing failures (#15425)
teamleaderleo Sep 28, 2026
fc799b6
Merge project.pbxproj by union of added entries instead of by line (#…
teamleaderleo Sep 28, 2026
d6b6daf
test: await fork probe process teardown (#15430)
teamleaderleo Sep 28, 2026
c313a97
test: compare header alignment with tolerance (#15431)
teamleaderleo Sep 28, 2026
ce5cb45
Give split tests a realistic window before splitting (#15434)
teamleaderleo Sep 28, 2026
3ccc32b
Merge main (ce5cb45d55d9) into socket-discovery-owner-checks
austinywang Sep 28, 2026
cae5f92
socket: make the remote local-socket resolver an instantiated value
austinywang Sep 28, 2026
7792b9a
remote tests: set SO_NOSIGPIPE on the fake socket listeners
austinywang Sep 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 8 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,11 @@ Resources/markdown-viewer/diff-viewer-app/** linguist-generated
# merges per key and defers to the default driver whenever both sides changed
# the same key. Register it with scripts/install-git-hooks.sh (run by setup.sh);
# without that config git silently uses the default driver.
*.xcstrings merge=xcstrings
*.xcstrings merge=xcstrings-v2

# The Xcode project file collides the same way, and for a sharper reason: no
# target here is filesystem-synchronized, so adding one source file writes four
# entries, and two branches adding different files append to all four of the
# same regions. scripts/merge-pbxproj.py takes the union of entries each side
# added and defers whenever a hunk is anything else. Same registration.
cmux.xcodeproj/project.pbxproj merge=pbxproj-v1
130 changes: 121 additions & 9 deletions .github/actions/e2e-run-tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,16 @@ inputs:
description: Every selector, comma-separated (the filter job's `selectors`).
required: true
count:
description: How many selectors there are (the filter job's `count`).
description: >-
How many selectors there are (the filter job's `count`). Zero when the
run only replays the fuzz regressions.
required: true
fuzz-regressions:
description: >-
"true" to replay the UI fuzzer's checked-in repros against the app after
the selected tests (the filter job's `fuzz_regressions`).
required: false
default: "false"
record-video:
description: Whether to record the virtual display, "true" or "false".
required: true
Expand Down Expand Up @@ -236,6 +244,7 @@ runs:
echo "CMUX_DERIVED_DATA_PATH=$DERIVED_DATA_PATH" >> "$GITHUB_ENV"

- name: Restore the compiled test product
id: restore
env:
ARTIFACT_ID: ${{ inputs.artifact-id }}
ARTIFACT_PROVIDER_DIGEST: ${{ inputs.artifact-digest }}
Expand Down Expand Up @@ -342,16 +351,58 @@ runs:
echo "Closed $process (its dialogs are cancelled; launchd restarts it on demand)"
fi
done
# Diagnostics Reporter draws "cmux DEV cannot be opened because of a
# problem" after a crashed launch; on owned macOS runners (2026-09-27)
# one sat over UI tests from boot. Its name is longer than the 16
# bytes -x compares, so match the executable path.
# Diagnostics Reporter draws "Your computer was restarted because of a
# problem" after a kernel panic and "cmux DEV cannot be opened because
# of a problem" after a crashed launch; on owned macOS runners
# (2026-09-27) one sat over UI tests from boot. launchd starts it
# whenever one of its QueueDirectories (/var/db/PanicReporter,
# /var/db/DiagnosticsReporter) holds an entry, and an entry stays
# until someone answers the dialog. Killing it alone therefore only
# relaunched it with the same dialog about two minutes into the tests
# (seen 2026-09-27, for a panic queued two days earlier). So empty the
# queues first, then close it; with nothing queued it stays closed.
# The owned runners' job-started hook does the same for every job;
# this keeps it for a runner without that hook.
# A queue entry only points at a report (a panic's is a symlink to
# /Library/Logs/DiagnosticReports/.contents.panic, the summary the
# dialog shows), so the reports themselves are kept: panic-full-*.panic
# and every crash report stay. The queue directories are
# world-writable, so this needs no sudo.
for queue in /var/db/PanicReporter /var/db/DiagnosticsReporter; do
[ -d "$queue" ] || continue
for entry in "$queue"/* "$queue"/.[!.]*; do
[ -e "$entry" ] || [ -L "$entry" ] || continue
target=""
if [ -L "$entry" ]; then
target="$(readlink "$entry" 2>/dev/null || true)"
fi
if rm -rf "$entry" 2>/dev/null && [ ! -e "$entry" ] && [ ! -L "$entry" ]; then
echo "Dequeued $entry${target:+ -> $target} (Diagnostics Reporter would redraw its dialog for it)"
# The summary of a panic whose dialog was never answered; the
# full panic report stays. Best effort: its directory is
# writable by _analyticsusers, which owned runner users are in.
# Only a `.contents.*` file directly in DiagnosticReports: `*`
# matches `/` in a case pattern, so reject any deeper path.
case "$target" in
*/../*|/Library/Logs/DiagnosticReports/.contents.*/*) ;;
/Library/Logs/DiagnosticReports/.contents.*)
rm -f "$target" 2>/dev/null || true
;;
esac
else
echo "::warning title=Diagnostics Reporter queue::Could not remove $entry, so its dialog may reappear during the tests."
fi
done
done
# Its name is longer than the 16 bytes -x compares, so match the
# executable path.
if pkill -KILL -u "$uid" -f "/Diagnostics Reporter.app/Contents/MacOS/" 2>/dev/null; then
echo "Closed Diagnostics Reporter (its crash dialogs are dismissed)"
fi

- name: Run selected tests
id: tests
if: ${{ inputs.count != '0' }}
env:
TEST_FILTER: ${{ inputs.test-filter }}
TEST_TARGET: ${{ inputs.target }}
Expand Down Expand Up @@ -495,7 +546,7 @@ runs:
-xctestrun "$XCTESTRUN_PATH"
-destination "platform=macOS"
-maximum-test-execution-time-allowance "$TEST_TIMEOUT"
"${ONLY_TESTING[@]}"
${ONLY_TESTING[@]+"${ONLY_TESTING[@]}"}
test-without-building
)
else
Expand All @@ -507,7 +558,7 @@ runs:
-resultBundlePath "$RUNNER_TEMP/cmux-app-host-xcresults/cmuxUITests.xcresult"
-destination "platform=macOS"
-maximum-test-execution-time-allowance "$TEST_TIMEOUT"
"${ONLY_TESTING[@]}"
${ONLY_TESTING[@]+"${ONLY_TESTING[@]}"}
test-without-building
)
fi
Expand Down Expand Up @@ -632,6 +683,59 @@ runs:
exit 1
fi

# The UI fuzzer's checked-in repros (dogfood/fuzz/regressions), replayed
# against the app restored above: one fresh launch per repro, driven over
# its debug socket in the console session, as the XCUITests are. A repro
# that reproduces fails the job. Socket steps only (--no-pointer): a
# pointer step needs cua-driver, and the repros are kept to socket steps.
# scripts/fuzz is the tested revision's.
- name: Replay the UI fuzzer regressions
id: fuzz
# After the XCUITests even when they failed, but not on a runner whose
# own setup (display, activation, restore) already failed.
if: ${{ !cancelled() && inputs.fuzz-regressions == 'true' && steps.restore.outcome == 'success' && (success() || steps.tests.outcome == 'failure') }}
shell: bash
run: |
set -euo pipefail
if [ ! -f scripts/fuzz ]; then
echo "::error::This revision has no scripts/fuzz, so there are no fuzz regressions to replay."
exit 1
fi
app="$CMUX_DERIVED_DATA_PATH/Build/Products/Debug/cmux DEV.app"
if [ ! -d "$app" ]; then
echo "::error::The restored product has no $app."
exit 1
fi
out="$RUNNER_TEMP/fuzz-regressions"
rm -rf -- "$out"
mkdir -p "$out"
# The fuzzer writes here as the console user, who may not be this one.
chmod 0777 "$out"
status=0
bash scripts/ci/run-and-capture.sh "$out/replay.log" \
scripts/ci/run-in-console-session.sh \
python3 scripts/fuzz regressions --app "$app" --out "$out" --no-pointer || status=$?
{
echo "### Fuzz regressions"
echo
echo '```'
grep -E '^(ok|FAIL) ' "$out/replay.log" || echo "(no repro reported a result)"
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
if [ "$status" -ne 0 ]; then
echo "::error::A fuzz regression reproduced, or the replay could not run (exit $status). Replay one locally with scripts/fuzz replay <repro> --app <cmux DEV.app>; the fuzz-regressions artifact has each replay's steps, frames and debug log."
exit "$status"
fi

- name: Upload the fuzz regression replays
if: ${{ always() && steps.fuzz.outcome == 'failure' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: fuzz-regressions
path: ${{ runner.temp }}/fuzz-regressions
if-no-files-found: ignore
retention-days: 14

- name: Stop recording and trim
if: ${{ always() && inputs.record-video == 'true' && env.RECORD_PID != '' }}
shell: bash
Expand Down Expand Up @@ -736,7 +840,8 @@ runs:
- name: Publish test summary
if: always()
env:
TEST_RESULT: ${{ steps.tests.outputs.test_result || 'failed' }}
TEST_RESULT: ${{ steps.tests.outputs.test_result || (inputs.count == '0' && steps.fuzz.outcome == 'success' && 'skipped') || 'failed' }}
FUZZ_RESULT: ${{ steps.fuzz.outcome }}
TEST_SUMMARY: ${{ steps.tests.outputs.test_summary }}
TEST_OUTPUT: ${{ steps.tests.outputs.test_output }}
TEST_FILTER: ${{ inputs.test-filter }}
Expand All @@ -749,8 +854,12 @@ runs:
run: |
set -euo pipefail

if [ "$TEST_RESULT" = "passed" ]; then
if [ "$FUZZ_RESULT" = "failure" ]; then
STATUS_EMOJI="FAILED"
elif [ "$TEST_RESULT" = "passed" ]; then
STATUS_EMOJI="PASSED"
elif [ "$TEST_RESULT" = "skipped" ]; then
STATUS_EMOJI="NO TESTS SELECTED"
else
STATUS_EMOJI="FAILED"
fi
Expand All @@ -763,6 +872,9 @@ runs:
echo "**Ref:** \`$REF_DISPLAY\`"
echo "**SHA:** [\`${COMMIT_SHA:0:12}\`](https://github.com/${{ github.repository }}/commit/$COMMIT_SHA)"
echo "**Test:** \`$TEST_FILTER\`"
if [ -n "$FUZZ_RESULT" ] && [ "$FUZZ_RESULT" != "skipped" ]; then
echo "**Fuzz regressions:** $FUZZ_RESULT"
fi
echo "**Workflow run:** $RUN_URL"

if [ "$RECORD_VIDEO" = "true" ]; then
Expand Down
150 changes: 150 additions & 0 deletions .github/labels.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
{
"comment": "Triage vocabulary for issues. scripts/ci/sync_labels.py applies this to the repository; docs/triage.md says what each label means and which rule assigns it. Labels not listed here are left alone, so CI plumbing labels are safe.",
"labels": [
{
"name": "S1: critical",
"color": "B60205",
"description": "Data loss, a build that will not start, or a security exposure"
},
{
"name": "S2: major",
"color": "D93F0B",
"description": "A crash, hang, lost state, broken connection, or a regression on a path people use"
},
{
"name": "S3: minor",
"color": "FBCA04",
"description": "Wrong behavior with a workaround"
},
{
"name": "S4: cosmetic",
"color": "C5DEF5",
"description": "Wording or appearance, with no effect on what cmux does"
},
{
"name": "needs-triage",
"color": "FEF2C0",
"description": "Auto-triage could not pick an area; a person decides"
},
{
"name": "area: terminal",
"color": "BFD4F2",
"description": "Ghostty surface, rendering, scrollback, escape sequences, fonts"
},
{
"name": "area: input",
"color": "BFD4F2",
"description": "Keyboard, shortcuts, IME, mouse, clipboard and paste"
},
{
"name": "area: layout",
"color": "BFD4F2",
"description": "Splits, panes, tabs, windows, resizing, full screen"
},
{
"name": "area: sidebar",
"color": "BFD4F2",
"description": "The workspace sidebar: list, groups, status, reordering"
},
{
"name": "area: workspaces",
"color": "BFD4F2",
"description": "Workspaces, sessions, restore after relaunch, worktrees"
},
{
"name": "area: agents",
"color": "BFD4F2",
"description": "Agent integrations (Claude Code, Codex, ACP), agent chat, hooks, status"
},
{
"name": "area: cloud",
"color": "BFD4F2",
"description": "Cloud machines and workspaces, relay transport"
},
{
"name": "area: remote",
"color": "BFD4F2",
"description": "cmux ssh, remote daemon, tunnels, device pairing"
},
{
"name": "area: ios",
"color": "BFD4F2",
"description": "The iOS app and mobile clients"
},
{
"name": "area: cli",
"color": "BFD4F2",
"description": "The cmux CLI, cmux-tui, the socket API and SDKs"
},
{
"name": "area: settings",
"color": "BFD4F2",
"description": "Settings UI and the config file"
},
{
"name": "area: browser",
"color": "BFD4F2",
"description": "The embedded browser, web surfaces, inline VS Code"
},
{
"name": "area: command-palette",
"color": "BFD4F2",
"description": "Command palette, quick open, find"
},
{
"name": "area: appearance",
"color": "BFD4F2",
"description": "Themes, light and dark mode, window chrome"
},
{
"name": "area: notifications",
"color": "BFD4F2",
"description": "Notifications, banners, badges, the bell"
},
{
"name": "area: updates",
"color": "BFD4F2",
"description": "Install, Homebrew, updates, nightly and release builds, signing"
},
{
"name": "area: auth",
"color": "BFD4F2",
"description": "Sign-in, accounts, teams, billing"
},
{
"name": "area: performance",
"color": "BFD4F2",
"description": "Latency, CPU, memory, launch time"
},
{
"name": "area: localization",
"color": "BFD4F2",
"description": "Translations and internationalization"
},
{
"name": "area: accessibility",
"color": "BFD4F2",
"description": "VoiceOver, the accessibility API, reduced motion, focus order"
},
{
"name": "area: docs",
"color": "BFD4F2",
"description": "README, docs pages, the site, contributor guides"
},
{
"name": "area: build-and-ci",
"color": "BFD4F2",
"description": "Build system, CI workflows, test infrastructure"
},
{
"name": "good first issue",
"color": "7057FF",
"description": "Small and self-contained, with a pointer to the code. Read docs/triage.md first"
},
{
"name": "help wanted",
"color": "008672",
"description": "Nobody on the team is working on this and we would take a patch"
}
]
}
Loading