Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
9225 commits
Select commit Hold shift + click to select a range
922394a
Allow switching accounts on CLI authorization (#12679)
Sep 15, 2026
0447a31
Stop internal memory pressure diagnostics from creating notifications…
Sep 15, 2026
6052c56
Allow deleting non-Iroh mobile routes (#12691)
Sep 15, 2026
9314041
Fix recursive Codex autoresume after nightly regression (#12697)
Sep 15, 2026
1bbb37e
Guard production IROH v2 deploy against Stack Auth drift (#12686)
Sep 15, 2026
b9fbbe4
Keep iOS Iroh connections alive through stalls and traffic bursts (#1…
Sep 15, 2026
f5da007
Bump version to 0.64.24 (#12698)
Sep 15, 2026
15d375d
Preserve older iOS access to v2 Macs and saved computer metadata (#12…
Sep 15, 2026
5b71a4f
Harden production deployment rollback guards (#12699)
Sep 15, 2026
88945c8
Cloud VM create: remove redundant network announcement wait (#12687)
Sep 15, 2026
d815ff6
test: retain local image files through terminal delivery
Sep 15, 2026
68edbe2
fix: keep local image transfer files alive
Sep 15, 2026
f2b8723
Test Cloud creation name reconciliation and rename races
Sep 15, 2026
14e146f
Reconcile Cloud workspace names and initiating selection
Sep 15, 2026
2066c07
iOS: preserve pixel scroll through reconnect gaps (#12649)
Sep 15, 2026
fc963ce
Scope Cloud name reconciliation to bound workspace
Sep 15, 2026
19ce61d
Preserve generated provenance for Cloud projections
Sep 15, 2026
1056f32
Carry creation title provenance through Cloud workspace opens
Sep 15, 2026
3822baf
Fix Cloud creation request initialization
Sep 15, 2026
83bfdf9
Preserve user workspace titles during binding
Sep 15, 2026
9e07507
Fix Xcode project entry for selection helper
Sep 15, 2026
76cda4a
Preserve legacy Cloud placeholder compatibility
Sep 15, 2026
bb824e5
Cover initiating-window Cloud workspace selection
Sep 15, 2026
31ead62
Avoid duplicate Cloud directory reconciliation
Sep 15, 2026
83a585c
fix: read guest stats directly in the dev backend
Sep 15, 2026
4858b68
Update legacy mobile transport call for current API
Sep 15, 2026
121aa30
Fix delayed discovery fixture setup
Sep 15, 2026
bf03a63
fix: align legacy mobile host call with first-frame timeout API
Sep 15, 2026
ec88fed
test: reproduce remote-disabled Cloud dogfood override refusal
Sep 15, 2026
f727997
fix: scope Cloud local overrides to Nightly and debug builds
Sep 15, 2026
f231c08
cmux182: #12538 cloud inline metrics
Sep 15, 2026
f148fc2
fix(ci): make nightly universal build bounded and diagnosable (#12704)
Sep 15, 2026
239cf23
Merge pull request #12707 from manaflow-ai/issue-12705-cloud-nightly-…
Sep 15, 2026
985dcdc
Merge origin/main into issue-12677-cloud-workspace-naming
Sep 16, 2026
846c732
Require web compilation and behavior checks before merge (#12711)
Sep 16, 2026
48d1f7a
test: reject releases missing SSH daemon assets (#12648)
Sep 16, 2026
58390fe
fix: restore and verify the SSH daemon release contract
Sep 16, 2026
52b9ca9
test: synchronize restored daemon log capture under race detection
Sep 16, 2026
decdf48
test: use synchronized sinks for asynchronous daemon fixtures
Sep 16, 2026
400b43a
test: preserve coalition pressure above physical RAM
Sep 16, 2026
3313655
fix: retain coalition pressure and report complete resource diagnostics
Sep 16, 2026
c5cb262
test: cover restored daemon permissions and non-launch behavior
Sep 16, 2026
1bc6d9a
fix: preserve public topology for protected processes
Sep 16, 2026
1c0ca12
fix: harden restored daemon boundaries and address review findings
Sep 16, 2026
e9a19e9
fix: keep resource diagnostics within one process snapshot
Sep 16, 2026
cca1de8
fix: authenticate local CLI bridge peers before forwarding
Sep 16, 2026
86b9aad
refactor: own resource sampling and reduction in CmuxFoundation
Sep 16, 2026
4c73412
test: reject credential lookup errors even with a matching UID
Sep 16, 2026
47a0131
fix: explicitly sample Sentry resources off the caller actor
Sep 16, 2026
90244cb
Report previous-run crashes to PostHog Error Tracking with app versio…
Sep 16, 2026
415e56d
test: reject unproven hibernation process scopes
Sep 16, 2026
66f69fa
fix: require complete ownership evidence for hibernation
Sep 16, 2026
e436e63
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 16, 2026
00d1ae6
Merge remote-tracking branch 'origin/main' into issue-11371-memory-re…
Sep 16, 2026
0dead9c
Fix Mac Nightly v2 registration with empty build settings (#12729)
Sep 16, 2026
56e67cc
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 16, 2026
5868fce
Merge remote-tracking branch 'origin/main' into issue-11371-memory-re…
Sep 16, 2026
a9ca449
Require explicit opt-in for iOS pairing (#12316)
Sep 16, 2026
90ca2ad
test: require live resource and pressure diagnostics from tagged app
Sep 16, 2026
a2a365c
test: use existing descendant telemetry field names
Sep 16, 2026
f35747e
feat: expose shared resource telemetry and observed memory pressure
Sep 16, 2026
01ec688
test: preserve active owners while reaping closed agent descendants
Sep 16, 2026
8ba7cca
Remove terminal render health overlay
Sep 16, 2026
211f9cd
Bump iOS beta to 1.0.5 (#12742)
Sep 16, 2026
40ce8f9
fix: supervise managed agent process groups through owner teardown
Sep 16, 2026
cdcea70
test: keep CLI memory totals within the captured topology
Sep 16, 2026
567ea0e
fix: use one topology for CLI memory accounting
Sep 16, 2026
19e5fa6
Merge pull request #12702 from manaflow-ai/issue-12677-cloud-workspac…
Sep 16, 2026
a5b91d2
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
Sep 16, 2026
ff8f866
Merge pull request #12738 from manaflow-ai/issue-12732-terminal-rende…
Sep 16, 2026
1f5bf18
test: exercise restored daemon on native macOS
Sep 16, 2026
be7a72e
test: cover macOS daemon filesystem behavior without instrumentation
Sep 16, 2026
df776cb
fix: create the tmux compatibility lock atomically on macOS
Sep 16, 2026
9d554de
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 16, 2026
bd056d4
test: reproduce Cloud surface ownership violations
Sep 16, 2026
484c980
fix: disambiguate app and test build file identities
Sep 16, 2026
42631af
Fix duplicate Xcode build file IDs after main merge
Sep 16, 2026
cadea32
build: restore omitted mobile auth observer dependency
Sep 16, 2026
7d57661
build: repair inherited Xcode ID and localization blockers
Sep 16, 2026
38dcda7
Restore auth observer required by merged mobile runtime
Sep 16, 2026
ebd50b4
Update official cmux.app internal TestFlight hourly (#12749)
Sep 16, 2026
7bb15c6
build: restore missing and colliding legacy runtime dependencies
Sep 16, 2026
4882b9e
fix: enforce Cloud surface ownership across drag and move paths
Sep 16, 2026
714c306
Merge pull request #12724 from manaflow-ai/issue-11371-memory-reclaim…
Sep 16, 2026
b3daf57
Revert "Restore auth observer required by merged mobile runtime"
Sep 16, 2026
d7ac49c
Revert "Fix duplicate Xcode build file IDs after main merge"
Sep 16, 2026
5d3616c
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
Sep 16, 2026
739fc83
fix: restore the IRX sign-out lifecycle contract
Sep 16, 2026
72a77bd
Merge remote-tracking branch 'origin/main' into issue-12745-cloud-sur…
Sep 16, 2026
d5678f3
Revert "build: restore omitted mobile auth observer dependency"
Sep 16, 2026
4cb176a
build: restore complete legacy runtime settings companions
Sep 16, 2026
64270ee
build: align the Mac mobile facade with the v2 transport owner
Sep 16, 2026
6b82924
Add localized cmux Computer Use landing page and documentation (#12712)
Sep 16, 2026
7827038
fix: distinguish Dock origins from workspace rollback
Sep 16, 2026
2477680
Cache client config evaluations in Vercel Runtime Cache (#12709)
Sep 16, 2026
d47280c
test: reproduce legacy ownership loss and pairing recovery gaps
Sep 16, 2026
4ec20ab
fix: retain Cloud ownership and bound pairing preparation
Sep 16, 2026
ac343dc
fix: show ownership feedback over Cloud tree destinations
Sep 16, 2026
844a508
test: cover Cloud tree rejection and document auth scope generations
Sep 16, 2026
55273be
fix(web): align bottom Computer Use CTA vertical spacing (#12761)
Sep 16, 2026
8a21abf
Restore TUI publishing and detect undelivered releases (#12763)
Sep 16, 2026
01cfdec
Fix iOS archive after the pairing opt-in merge (#12765)
Sep 16, 2026
0ad24aa
Preserve existing Mac identity across the v2 upgrade (#12754)
Sep 16, 2026
81e4e0a
perf: throttle CodeRouter API key metadata writes
Sep 16, 2026
6b6fc99
Pin detached TUI sessions to the client terminal identity (#12767)
Sep 16, 2026
8c53ab5
Fix cmux-tui build: use the crate-root child term re-export (#12774)
Sep 16, 2026
78f4c82
web: simplify the settings gear in the account dropdown (#12708)
Sep 16, 2026
57b0073
Add monthly Max pricing and gate the Go starter plan (#12415)
Sep 16, 2026
5994f5e
Rename Tailscale Pairing to Mobile Pairing
Sep 16, 2026
d68ae17
test: cover targeted tmux compat read budget
Sep 16, 2026
4b00ea5
test: cover committed terminal pane geometry
Sep 16, 2026
f174e18
fix: commit portal-owned terminal geometry before rendering
Sep 16, 2026
0c7ccb4
Fix iOS crash on duplicate WebSocket ping completion (#12787)
Sep 16, 2026
8292cbe
test: restore portal refresh test extension
Sep 16, 2026
64a665a
Fix delayed build labels in iOS computer picker (#12786)
Sep 16, 2026
df3ea68
fix: cache targeted tmux pane reads per connection
Sep 16, 2026
956104e
fix: explain local workspace workaround for cloud drops
Sep 16, 2026
c5a666a
Merge origin/main into issue-12745-cloud-surface-ownership
Sep 16, 2026
aed23e6
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
Sep 16, 2026
72e2daa
fix: close committed geometry review gaps
Sep 16, 2026
5228f1f
Merge pull request #12799 from manaflow-ai/issue-12745-cloud-surface-…
Sep 16, 2026
fd5d49d
test: preserve image paste payloads with auxiliary URLs
Sep 16, 2026
5395d85
fix: prefer copied image payloads over auxiliary URLs
Sep 16, 2026
e57f6de
ci: route the release delivery guard through the configured runner
Sep 16, 2026
872f46e
test: isolate App Store lane versions from release bumps
Sep 16, 2026
89c573a
test: exercise tmux commands against production polling limiter
Sep 16, 2026
a50e75f
test: reproduce stale pane appearance reverting terminal themes
Sep 16, 2026
ae639d3
fix: honor polling backpressure within the CLI request deadline
Sep 16, 2026
f16bdc0
fix: resolve terminal appearance from the live application
Sep 16, 2026
7713752
test: recognize mapped pane resize actions in Dock routing audit
Sep 16, 2026
1e75269
test: make polling admission and protocol failure checks deterministic
Sep 16, 2026
fe8e7af
test: use a generic flag in cache round-trip fixtures
Sep 16, 2026
a5ab2bf
test: await causal transport and dashboard events
Sep 16, 2026
cdb73a1
test: synchronize client config concurrency through request admission
Sep 16, 2026
efb20d4
chore: keep transport extraction and test fixture focused
Sep 16, 2026
c082946
test: cover drag payload priority and bracketed image delivery
Sep 16, 2026
1b332f7
fix: preserve complete image payloads through terminal drop routing
Sep 16, 2026
7898723
Merge origin/main into issue-12048-ssh-split-cwd
Sep 16, 2026
ddf32d3
test: type mock implementations in Bun test declarations
Sep 16, 2026
14d9ccf
fix: keep portal geometry pending through viewport transitions
Sep 16, 2026
83f62ff
Merge remote-tracking branch 'origin/main' into issue-12681-terminal-…
Sep 16, 2026
5b8eca4
test: reproduce light terminal appearance with font-only config
Sep 16, 2026
e07ed87
test: use supported terminal accessibility query
Sep 16, 2026
9b3b242
test: allow main-actor terminal startup during image delivery capture
Sep 16, 2026
99efdeb
fix: preserve adaptive terminal colors with non-color settings
Sep 16, 2026
dcb60aa
test: verify terminal screen and PTY converge after portal changes
Sep 16, 2026
9d0cb80
Merge pull request #12054 from manaflow-ai/issue-12048-ssh-split-cwd
Sep 16, 2026
89d02bd
Merge pull request #12811 from manaflow-ai/issue-11307-light-terminal…
Sep 17, 2026
b99c964
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 17, 2026
03134f3
test: await portal commits without starving the main actor
Sep 17, 2026
cbda7d4
test: cover geometry settlement after retry exhaustion
Sep 17, 2026
2f36e55
fix: retain pending geometry until layout settles
Sep 17, 2026
4ca686d
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
Sep 17, 2026
b1ee541
refactor: keep pasteboard context limited to file insertion
Sep 17, 2026
c08bcd3
test: preserve Finder originals when the pasteboard includes a TIFF p…
Sep 17, 2026
5373b4a
fix: preserve backing files before decoding Finder paste previews
Sep 17, 2026
9fe20d7
Merge pull request #12752 from manaflow-ai/issue-12684-image-drop-att…
Sep 17, 2026
ec442c4
fix: keep PTY resize independent from input writes
Sep 17, 2026
8051e48
test: await settled viewport geometry in portal regressions
Sep 17, 2026
68df8ee
fix: apply TUI rustfmt before release (#12823)
Sep 17, 2026
e604d8d
test: reject incomplete bundled SSH daemon assets
Sep 17, 2026
ec4cbd4
Use PlanetScale for Cloud VM migrations and operator guidance (#12821)
Sep 17, 2026
4ac2570
fix: bundle verified SSH daemons for unpublished builds
Sep 17, 2026
860aa16
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 17, 2026
3f669c7
chore: remove fixture trailing blank lines
Sep 17, 2026
9a916eb
Add the cmux RC release channel (com.cmuxterm.app.rc) (#12777)
Sep 17, 2026
be7d9fa
iOS: make the keyboard button Liquid Glass by default
Sep 17, 2026
65033c2
Merge remote-tracking branch 'origin/main' into issue-12797-light-mod…
Sep 17, 2026
e2545e1
docs: localize adaptive terminal appearance in every web locale
Sep 17, 2026
dad840d
test: reproduce restored daemon closeout regressions
Sep 17, 2026
dc6c414
fix: import workspace model for iOS release build (#12829)
Sep 17, 2026
52fa496
Merge remote-tracking branch 'origin/main' into issue-12797-light-mod…
Sep 17, 2026
78c15bf
fix: close out restored daemon review findings
Sep 17, 2026
fa424e6
chore: restore unrelated daemon test formatting
Sep 17, 2026
3ea0ec5
test: cover signal state inherited by CLI exec children
Sep 17, 2026
bb2f674
fix: exec restored agents with the default signal state
Sep 17, 2026
bbe64f6
ci: verify PlanetScale access before migration (#12828)
Sep 17, 2026
abc88f2
test: guard every CLI exec and spawn site for default signal state
Sep 17, 2026
6efd462
fix: exec restored agents through the signal-state reset wrapper
Sep 17, 2026
3df8e4e
test: verify resize signals through actual CLI restore and fork
Sep 17, 2026
6dc1794
Merge pull request #12812 from manaflow-ai/issue-12797-light-mode-ter…
Sep 17, 2026
f39c6ba
Render pricing before subscription checks finish (#12836)
Sep 17, 2026
8986181
test: verify portal settlement and presentation at resize end
Sep 17, 2026
3283ee9
ci: pin and serialize Cloud VM migration source (#12839)
Sep 17, 2026
c765ac2
Merge pull request #12796 from manaflow-ai/issue-12681-terminal-resiz…
Sep 17, 2026
3773d55
fix: recover iOS Iroh runtime after sign-in (#12837)
Sep 17, 2026
41b3540
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 17, 2026
60668a9
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 17, 2026
27131a2
test: bound workspace listing requests in tmux batch output
Sep 17, 2026
1a58732
Merge remote-tracking branch 'origin/main' into issue-12757-tmux-rate…
Sep 17, 2026
a056a2d
fix: reuse tmux workspace snapshots and sanitize shell diagnostics
Sep 17, 2026
a8989a2
Merge remote-tracking branch 'origin/main' into issue-12648-remote-da…
Sep 17, 2026
f5ad88a
Scope Cloud VM coderouter access to its team and account pool (#12771)
Sep 17, 2026
18c628a
test: SSH attach must not hang when the remote session can never beco…
Sep 17, 2026
7247ee6
fix: end SSH attach loudly when the remote session can never become r…
Sep 17, 2026
cf97ee6
Merge remote-tracking branch 'origin/main' into 12813-ssh-attach-hang
Sep 17, 2026
8052214
Fix dropped socket-send bytes and GHOSTTY_BIN_DIR use-after-free (gho…
Sep 17, 2026
9c5b6a6
Cloud: keep terminal creation targets and errors visible (#12478)
Sep 17, 2026
40ad414
Fix SSH PTY terminal ownership and reject mismatched daemons (#12726)
Sep 17, 2026
90265e6
Let the nightly universal build fan out again (#12848)
Sep 17, 2026
c11cad5
Investigate macOS 27 native browser hover (#12683)
Sep 17, 2026
178e325
First RC build fixes: cold-cache build budget, WebAuthn check follows…
Sep 17, 2026
a4cf484
test: wait for the parking block before reading released waiters
Sep 17, 2026
a15556a
fix: scope the readiness deadline to sessions that bootstrap over SSH
Sep 17, 2026
3bdfaaa
ghostty: targeted upstream picks (input encoding, erase/scroll state,…
Sep 17, 2026
53eb96e
fix: report a rejected ControlMaster adoption to a waiting attach
Sep 17, 2026
a40278b
Revert "ghostty: targeted upstream picks (input encoding, erase/scrol…
Sep 17, 2026
380db00
docs: record parked remote sessions and the remote_session_parked con…
Sep 17, 2026
8c43c63
Merge pull request #12720 from manaflow-ai/issue-12648-remote-daemon-…
Sep 17, 2026
7ef0f7a
fix: let an explicit PTY cleanup outrank the parked verdict
Sep 17, 2026
228a876
Merge remote-tracking branch 'origin/main' into 12813-ssh-attach-hang
Sep 17, 2026
34dc675
test: a ControlMaster reap must not repaint a parked session
Sep 17, 2026
519b5b5
fix: keep a parked session parked when its ControlMaster is reaped
Sep 17, 2026
69f5b5d
fix(l10n): name the Reconnect button as each locale labels it
Sep 17, 2026
4e73d97
test: restore pairing preparation deadline coverage (#12850)
Sep 17, 2026
c06913a
Merge pull request #12851 from manaflow-ai/12813-ssh-attach-hang
Sep 17, 2026
8bcf5b2
Merge remote-tracking branch 'origin/main' into issue-12757-tmux-rate…
Sep 17, 2026
c01e9b5
test: bound tmux-compat backpressure checks by causality, not wall-cl…
Sep 17, 2026
a149b7e
feat: add prefix shortcuts for smart panes and resizing
Sep 17, 2026
8008b7c
test: order renderer windows before presentation setup
Sep 16, 2026
97c6088
test: align renderer fixtures with native callback lifecycle
Sep 16, 2026
5c30554
test: keep renderer presentation suite within budget
Sep 16, 2026
f6a67df
test: sync the CLI help contract with the shipped vm sizes and Cloud …
Sep 17, 2026
88ad621
test: keep exec-based transfer progress coverage to pull
Sep 17, 2026
0633852
fix: clear the Swift warnings that put main over its warning budget
Sep 17, 2026
7037793
test: let the custom-path re-entry fixture answer inject-settings
Sep 17, 2026
e58fbe7
test: expect the Campfire extension's queued hook delivery
Sep 17, 2026
ebe4f61
chore: match #12759's text for two CI fixes so the branches merge cle…
Sep 17, 2026
3bab274
Update app-host fixtures for current remote and group behavior
Sep 16, 2026
accdec4
Fix app-host fixture contracts
Sep 16, 2026
5f94b9c
Align Cloud fixtures with current projection contracts
Sep 16, 2026
48d73a0
test: keep Cloud fixture updates within source budgets
Sep 16, 2026
7bda7ff
Stabilize portal visibility test lifecycle fixtures
Sep 16, 2026
e58e599
test: fit visibility lifecycle fixture budget
Sep 16, 2026
993d91a
fix: import terminal surface in visibility fixtures
Sep 16, 2026
f9178e0
test: preserve visibility fixture budget after import
Sep 16, 2026
8d7a3c2
Authorize portal test surfaces through isolated workspaces
Sep 16, 2026
7907779
Exercise workspace reveal through noninteractive layout settlement
Sep 17, 2026
e9a53ed
Merge remote-tracking branch 'origin/main' into issue-12757-tmux-rate…
Sep 17, 2026
d9d87d3
chore: keep CloudTreeNodeActions within its file length budget
Sep 17, 2026
c56d008
Add v0.64.25 changelog, highlights, and iOS pairing translations
Sep 17, 2026
8083442
Bump version to 0.64.25
Sep 17, 2026
b685a27
Merge pull request #12866 from manaflow-ai/release/v0.64.25
Sep 17, 2026
8aaad8c
Merge pull request #12832 from manaflow-ai/issue-12757-tmux-rate-limited
Sep 17, 2026
9bf6cb8
Show pane-centered Cloud terminal failures with useful diagnostics
Sep 17, 2026
3a277f8
Add cmux vm command aliases
Jun 18, 2026
dbf7633
Resolve vm alias docs against current Cloud CLI
Sep 17, 2026
5f8dd51
Merge original vm alias branch history
Sep 17, 2026
7e0da6b
Polish merged VM alias contract text
Sep 17, 2026
01faafe
Keep connect on the current SSH command path
Sep 17, 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
27 changes: 18 additions & 9 deletions CLI/cmux.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3992,11 +3992,11 @@ struct CMUXCLI {
)
Self.clearVMCreateIdempotency(idempotency)

case "shell", "attach":
case "shell", "attach", "connect":
let (windowOpt, vmArgs) = parseOption(rest, name: "--window")
guard let vmId = vmArgs.first else {
throw CLIError(message: """
Usage: cmux \(command) shell <id>
Usage: cmux vm ssh <id>
Comment thread
cursor[bot] marked this conversation as resolved.
Outdated

Find an id:
cmux vm ls
Expand All @@ -4012,7 +4012,7 @@ struct CMUXCLI {
idFormat: idFormat
)

case "rm", "destroy", "delete":
case "rm", "remove", "destroy", "delete":
guard let vmId = rest.first else {
throw CLIError(message: """
Usage: cmux vm rm <id>
Expand Down Expand Up @@ -4118,13 +4118,19 @@ struct CMUXCLI {

default:
throw CLIError(message: """
Usage: cmux \(command) <ls|new|shell|rm|exec|ssh> [args...]
Usage: cmux \(command) <new|ls|rm|exec|ssh|ssh-info> [args...]

Common commands:
cmux vm ls
cmux vm new
cmux vm ssh <id>
cmux vm rm <id>

Aliases are available for familiar spelling:
create -> new
list -> ls
shell, attach, connect -> ssh
remove, delete, destroy -> rm
""")
}

Expand Down Expand Up @@ -14436,7 +14442,7 @@ struct CMUXCLI {
"""
case "vm", "cloud":
return """
Usage: cmux \(command) <new|ls|rm|exec|shell|attach|ssh|ssh-info> [args...]
Usage: cmux \(command) <new|ls|rm|exec|ssh|ssh-info> [args...]

Manage cloud VMs. `cloud` is an alias for `vm`. Requires `cmux auth login`.

Expand All @@ -14446,9 +14452,6 @@ struct CMUXCLI {
Create a new VM. By default drops you into a shell on
the VM (like `docker run -it`). Pass --detach/-d to
just print the id and exit (scripting primitive).
shell <id> [--window <id|ref|index>]
Drop into an interactive shell on an existing VM.
Alias: `attach <id>`.
ssh <id> [--window <id|ref|index>]
Drop into a cmux-managed SSH workspace for an existing
VM, using the same session path as `cmux ssh`.
Expand All @@ -14457,6 +14460,12 @@ struct CMUXCLI {
rm <id> Destroy a VM.
exec <id> -- <command...> Run a shell command inside the VM and print stdout.

Aliases:
create Alias for `new`; prefer `new` in docs and scripts.
list Alias for `ls`; prefer `ls` in docs and scripts.
shell, attach, connect Aliases for `ssh`; prefer `ssh` in docs and scripts.
remove, delete, destroy Aliases for `rm`; prefer `rm` in docs and scripts.

Env:
CMUX_VM_API_BASE_URL Override the backend origin (default: the cmux website).
`bun run dev` derives this from CMUX_PORT/PORT for
Expand Down Expand Up @@ -34262,7 +34271,7 @@ export default function cmuxPiSessionExtension(pi: ExtensionAPI) {
events [--after <seq>] [--cursor-file <path>] [--name <event>] [--category <category>] [--reconnect] [--limit <n>] [--no-ack] [--no-heartbeat]
auth <status|login|logout>
login | logout (aliases for auth login/logout)
vm <new|ls|rm|exec|shell|ssh> [args...] (alias: cloud)
vm <new|ls|rm|exec|ssh|ssh-info> [args...] (alias: cloud; accepts create/list/attach/remove aliases)

ghost Jun 18, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Incomplete alias list in global command documentation.

The parenthetical note says "accepts create/list/attach/remove aliases", but this omits several aliases that are documented in the detailed help (lines 14463-14468) and the default error message (lines 4129-4133):

  • Missing: shell, connect (aliases for ssh)
  • Missing: delete, destroy (aliases for rm)

This creates inconsistency between the comprehensive alias list in the detailed help and this brief global summary.

📝 Proposed fix for completeness
-          vm <new|ls|rm|exec|ssh|ssh-info> [args...]    (alias: cloud; accepts create/list/attach/remove aliases)
+          vm <new|ls|rm|exec|ssh|ssh-info> [args...]    (alias: cloud; accepts create/list/shell/attach/connect/remove/delete/destroy aliases)

Or for brevity while staying accurate:

-          vm <new|ls|rm|exec|ssh|ssh-info> [args...]    (alias: cloud; accepts create/list/attach/remove aliases)
+          vm <new|ls|rm|exec|ssh|ssh-info> [args...]    (alias: cloud; see `cmux vm` for full alias list)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CLI/cmux.swift` at line 34274, The global command documentation for the vm
command contains an incomplete list of aliases in the parenthetical note. Update
the text that currently reads "accepts create/list/attach/remove aliases" to
include all documented aliases: create, list, attach, remove, shell, connect
(for ssh), and delete, destroy (for rm). This will ensure consistency between
the global command summary and the comprehensive alias lists documented in the
detailed help sections and default error messages for the vm command.

remotes <list|add|remove> [--route <host:port>] [--tag <tag>] [--json] (alias: remote)
rpc <method> [json-params]
identify [--workspace <id|ref|index>] [--surface <id|ref|index>] [--window <id|ref|index>] [--no-caller]
Expand Down
205 changes: 205 additions & 0 deletions cmuxTests/VMSSHCommandTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,211 @@ import XCTest
import Darwin

extension CLINotifyProcessIntegrationRegressionTests {
func testVMCreateAliasDispatchesThroughVMCreate() throws {
let cliPath = try bundledCLIPath()
let socketPath = makeSocketPath("vm-create-alias")
let listenerFD = try bindUnixSocket(at: socketPath)
let state = MockSocketServerState()
let tempHome = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
.appendingPathComponent("cmux-vm-create-alias-\(UUID().uuidString)", isDirectory: true)
try FileManager.default.createDirectory(at: tempHome, withIntermediateDirectories: true)

defer {
Darwin.close(listenerFD)
unlink(socketPath)
try? FileManager.default.removeItem(at: tempHome)
}

let serverHandled = startMockServer(listenerFD: listenerFD, state: state) { line in
guard let payload = self.jsonObject(line),
let id = payload["id"] as? String,
let method = payload["method"] as? String else {
return self.malformedRequestResponse(raw: line)
}
guard method == "vm.create" else {
return self.v2Response(id: id, ok: false, error: ["code": "unexpected", "message": "Unexpected method \(method)"])
}
let params = payload["params"] as? [String: Any] ?? [:]
XCTAssertEqual(params["provider"] as? String, "freestyle")
XCTAssertNotNil(params["idempotency_key"] as? String)
return self.v2Response(
id: id,
ok: true,
result: [
"id": "vm-create-alias",
"provider": "freestyle",
"image": "default",
]
)
}

var environment = ProcessInfo.processInfo.environment
environment["CMUX_SOCKET_PATH"] = socketPath
environment["CMUX_CLI_SENTRY_DISABLED"] = "1"
environment["CMUX_CLAUDE_HOOK_SENTRY_DISABLED"] = "1"
environment["CFFIXED_USER_HOME"] = tempHome.path

let result = runProcess(
executablePath: cliPath,
arguments: ["vm", "create", "--provider", "freestyle", "--detach"],
environment: environment,
timeout: 5
)

wait(for: [serverHandled], timeout: 5)
XCTAssertFalse(result.timedOut, result.stderr)
XCTAssertEqual(result.status, 0, result.stderr)
XCTAssertTrue(result.stdout.contains("OK vm-create-alias"), result.stdout)
XCTAssertEqual(
state.commands.compactMap { self.jsonObject($0)?["method"] as? String },
["vm.create"]
)
}

func testVMRemoveAliasDispatchesThroughVMDestroy() throws {
let cliPath = try bundledCLIPath()
let socketPath = makeSocketPath("vm-remove-alias")
let listenerFD = try bindUnixSocket(at: socketPath)
let state = MockSocketServerState()
let vmID = "vm-remove-alias"

defer {
Darwin.close(listenerFD)
unlink(socketPath)
}

let serverHandled = startMockServer(listenerFD: listenerFD, state: state) { line in
guard let payload = self.jsonObject(line),
let id = payload["id"] as? String,
let method = payload["method"] as? String else {
return self.malformedRequestResponse(raw: line)
}
guard method == "vm.destroy" else {
return self.v2Response(id: id, ok: false, error: ["code": "unexpected", "message": "Unexpected method \(method)"])
}
let params = payload["params"] as? [String: Any] ?? [:]
XCTAssertEqual(params["id"] as? String, vmID)
return self.v2Response(id: id, ok: true, result: ["ok": true])
}

var environment = ProcessInfo.processInfo.environment
environment["CMUX_SOCKET_PATH"] = socketPath
environment["CMUX_CLI_SENTRY_DISABLED"] = "1"
environment["CMUX_CLAUDE_HOOK_SENTRY_DISABLED"] = "1"

let result = runProcess(
executablePath: cliPath,
arguments: ["vm", "remove", vmID],
environment: environment,
timeout: 5
)

wait(for: [serverHandled], timeout: 5)
XCTAssertFalse(result.timedOut, result.stderr)
XCTAssertEqual(result.status, 0, result.stderr)
XCTAssertEqual(result.stdout, "OK \(vmID)\n")
XCTAssertEqual(
state.commands.compactMap { self.jsonObject($0)?["method"] as? String },
["vm.destroy"]
)
}

func testVMConnectAliasOpensManagedWorkspaceThroughSharedSSHPath() throws {
let cliPath = try bundledCLIPath()
let socketPath = makeSocketPath("vm-connect")
let listenerFD = try bindUnixSocket(at: socketPath)
let state = MockSocketServerState()
let vmID = "vm-connect-1234567890"
let workspaceID = "11111111-1111-1111-1111-111111111111"
let workspaceRef = "workspace:connect"

defer {
Darwin.close(listenerFD)
unlink(socketPath)
}

let serverHandled = startMockServer(listenerFD: listenerFD, state: state) { line in
guard let payload = self.jsonObject(line),
let id = payload["id"] as? String,
let method = payload["method"] as? String else {
return self.malformedRequestResponse(raw: line)
}

switch method {
case "vm.attach_info":
let params = payload["params"] as? [String: Any] ?? [:]
XCTAssertEqual(params["id"] as? String, vmID)
XCTAssertEqual(params["require_daemon"] as? Bool, true)
return self.v2Response(
id: id,
ok: true,
result: [
"transport": "ssh",
"host": "gateway.freestyle.sh",
"port": 2222,
"username": "cmux",
"credential": [
"kind": "password",
"value": "lease-token",
],
]
)
case "workspace.create":
return self.v2Response(
id: id,
ok: true,
result: [
"workspace_id": workspaceID,
]
)
case "workspace.rename":
return self.v2Response(id: id, ok: true, result: ["workspace_id": workspaceID])
case "workspace.remote.configure":
return self.v2Response(
id: id,
ok: true,
result: [
"workspace_id": workspaceID,
"workspace_ref": workspaceRef,
"remote": [
"enabled": true,
"state": "connecting",
],
]
)
case "workspace.select":
return self.v2Response(id: id, ok: true, result: ["workspace_id": workspaceID])
default:
return self.v2Response(
id: id,
ok: false,
error: ["code": "unexpected", "message": "Unexpected method \(method)"]
)
}
}

var environment = ProcessInfo.processInfo.environment
environment["CMUX_SOCKET_PATH"] = socketPath
environment["CMUX_CLI_SENTRY_DISABLED"] = "1"
environment["CMUX_CLAUDE_HOOK_SENTRY_DISABLED"] = "1"

let result = runProcess(
executablePath: cliPath,
arguments: ["vm", "connect", vmID],
environment: environment,
timeout: 5
)

wait(for: [serverHandled], timeout: 5)
XCTAssertFalse(result.timedOut, result.stderr)
XCTAssertEqual(result.status, 0, result.stderr)
XCTAssertEqual(result.stdout, "OK workspace=\(workspaceRef) target=cmux@gateway.freestyle.sh state=connecting\n")
XCTAssertEqual(
state.commands.compactMap { self.jsonObject($0)?["method"] as? String },
["vm.attach_info", "workspace.create", "workspace.rename", "workspace.remote.configure", "workspace.select"]
)
}
Comment on lines +143 to +207

ghost Jun 18, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Connect-alias test asserts fewer RPC params than the base SSH test

testVMConnectAliasOpensManagedWorkspaceThroughSharedSSHPath verifies only the method sequence, not the content of the workspace.remote.configure call. The base testVMSSHOpensManagedWorkspaceThroughSharedSSHPath (line 315–326) additionally asserts destination, port, local_socket_path, skip_daemon_bootstrap, terminal_startup_command, and relay_port on that request — which are the fields that prove the SSH path is wired correctly end-to-end. Without those assertions, a regression that routes connect through the code path but forwards the wrong host/port/socket would still pass this test.


func testVMSSHOpensManagedWorkspaceThroughSharedSSHPath() throws {
let cliPath = try bundledCLIPath()
let socketPath = makeSocketPath("vm-ssh")
Expand Down
13 changes: 6 additions & 7 deletions docs/cli-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,10 @@ VM subcommands:

| Command | Contract |
| --- | --- |
| `vm ls`, `vm list` | List VMs. |
| `vm new`, `vm create` | Create a VM. Supports `--image`, `--provider`, `--detach`, and `-d`. |
| `vm shell`, `vm attach` | Open an interactive shell for an existing VM. |
| `vm rm`, `vm destroy`, `vm delete` | Destroy a VM. |
| `vm ssh` | Open a cmux-managed SSH workspace for an existing VM. |
| `vm ls` | List VMs. Alias: `list`. Prefer `ls` in docs and scripts. |
| `vm new` | Create a VM. Supports `--image`, `--provider`, `--detach`, and `-d`. Alias: `create`. Prefer `new` in docs and scripts. |
| `vm ssh` | Open a cmux-managed SSH workspace for an existing VM. Aliases: `shell`, `attach`, `connect`. Prefer `ssh` in docs and scripts. |
| `vm rm` | Destroy a VM. Aliases: `remove`, `destroy`, `delete`. Prefer `rm` in docs and scripts. |
| `vm ssh-info` | Print SSH connection info. |
| `vm ssh-attach` | Internal attach helper. |
| `vm exec` | Run a shell command inside a VM. |
Expand Down Expand Up @@ -444,8 +443,8 @@ the expected text without connecting to a cmux socket.
- `cmux capabilities --help` -> `Usage: cmux capabilities`
- `cmux events --help` -> `Usage: cmux events [options]`
- `cmux auth --help` -> `Usage: cmux auth <status|login|logout>`
- `cmux vm --help` -> `Usage: cmux vm <new|ls|rm|exec|shell|attach|ssh|ssh-info> [args...]`
- `cmux cloud --help` -> `Usage: cmux cloud <new|ls|rm|exec|shell|attach|ssh|ssh-info> [args...]`
- `cmux vm --help` -> `Usage: cmux vm <new|ls|rm|exec|ssh|ssh-info> [args...]`
- `cmux cloud --help` -> `Usage: cmux cloud <new|ls|rm|exec|ssh|ssh-info> [args...]`
- `cmux remotes --help` -> `Usage: cmux remotes <list|add|remove> [options]`
- `cmux remote --help` -> `Usage: cmux remotes <list|add|remove> [options]`
- `cmux rpc --help` -> `Usage: cmux rpc <method> [json-params]`
Expand Down