September 3, 2026
Rush CLI 0.2.39
Install
macOS / Linux
curl -fsSL https://cdn.getrush.ai/install.sh | bashWindows
irm https://cdn.getrush.ai/install.ps1 | iexHomebrew
brew install phnx-labs/tap/rushDebian / Ubuntu
sudo apt install rush-cliAlready installed?
rush upgradeAdded
rush run <agent> --clouddispatches to Rush Cloud instead of running locally (PHNX-1933). The flag did not exist before — cobra returnedunknown flag: --cloud. It bridges--prompt/--model/--modeonto the existingrush cloud rundispatcher, so auth, repo resolution, the interactive wizard, and agent support are identical between the two commands rather than a second implementation. Cloud-only flags (--repo,--harness,--workflow,--compute-provider,--isolation-tier) are not registered onrush run; userush cloud runfor those.rush ssh <run-id>opens an interactive shell inside a running cloud run's engine pod (PHNX-3595). Takes the same id asrush cloud logs, over the factory WebSocket PTY endpoint with the bearerrush cloudalready uses. The local terminal is put in raw mode and always restored on exit, window resizes forward to the remote PTY, and the shell exits with the remote process's exit code; a dropped socket (pod eviction, network loss) ends the session instead of stranding the terminal. Authz failures map to explicit messages (forbidden / not-found / not-ready / no-pod). The same brokered shell is reachable asrush ssh <run-id>and its top-levelrush attach <run-id>alias, and under the managed surface asrush cloud attach <run-id>(itself aliasedrush cloud ssh). Requires the factory WS PTY route deployed in the target environment.rush cloud run --project <name>dispatches against a saved Project (PHNX-3741, PHNX-3845). The Project supplies the authorized installation, repository, and default branch, so no repo is passed — mutually exclusive with a positional or--repotarget, matching the API's own guard.- OpenCode joins Claude Code and Codex as a managed cloud harness, transcripts included (PHNX-3845). It dispatches under its bare
opencodename (noprix/*wrapper) and is treated as a coding agent — repo or Project required, auto-PR flow. OpenCode stores sessions in one SQLite database rather than JSONL, so the factory selects the run's session and normalizes it to JSONL at capture time;rush cloud transcriptand the run picker render it like any other harness. rush cloud run claude@2.1.219(orcodex@…,opencode@…) pins the harness CLI version for a dispatch (PHNX-3736), without rebuilding an image. The pinned form routes to the bare native ref instead of theprix/*-cliwrapper. The pod installs and verifies the exact version before the agent starts, matching on version components rather than substrings, so a2.1.21pin is never satisfied by an installed2.1.219. Fails closed — non-zero exit, no silent downgrade — if the version cannot be installed or verified. A bare, unpinned agent name behaves exactly as before.rush cloud run --isolation-tier <shared|isolated>requests a per-tenant isolation boundary (PHNX-3485).isolatedgives the run its own namespace with its own resource quota and network policy. Sent only when the flag is set, so an unset flag leaves the dispatch byte-for-byte unchanged against the server default (shared).rush cloud logs -f/--follow. A live run already streams; on a run that has already finished, the durable logs print followed by an explicit note that there is nothing left to follow, instead of exiting as though the stream had ended.rush cloud cancel --reason <text>— printed with the confirmation and sent on the request body — and the command now reports the terminal status the API returns.rush cloud viewshows the requested and resolved harness CLI version and the trajectory-capture state when the run reports them; each is omitted when absent.- Managed-surface aliases:
rush cloud get(forview), andrush cloud login/rush cloud whoami, which reuse the Phoenix ID commands verbatim. rush cloud artifacts <run-id> [name]lists or downloads a finished run's output files (PHNX-3845). A managed run already uploads its artifacts to R2 on completion and the API already served them back — but nothing called those endpoints, so a run's outputs were unreachable from the CLI. With no name it prints the manifest (name, size, type) as a table, browse picker, or--json; with a name it downloads that artifact to a file (default./<name>, or-o <path>/-o <dir>). Downloads always go to disk, never stdout, since artifacts are arbitrary binary content; a name containing a slash is URL-escaped so it round-trips as a single path segment.
Changed
- Curated capability and connection manifests moved from
data/toprix/catalog/(PHNX-3826). This is the source treerush capability install,rush connection install, andrush skill installread with--from github:muqsitnawaz/agents; their repo-relative roots now resolve underprix/catalog/{capabilities,connections}, and skill discovery walks one level deeper (depth 6) to match the added nesting. The~/.rush/data/connectionshome-directory fallback is unchanged. - Cloud harness routing derives from a single catalog (PHNX-3860). Three hand-synced maps — alias, wrapper, coding-agent set — collapsed into one spec they are all derived from, so they cannot drift. Behavior-preserving:
opencodestill dispatches bare,claude/codexstill route through their wrapper when unpinned and the bare native ref when pinned.
Fixed
rush loginpersists the refresh token and a real expiry, so a logged-in machine stays logged in (PHNX-3803). The device-token poll returns a Supabase session JWT (roughly 60-minute lifetime) alongside a working refresh token, but login discarded both and storedexpires_at: 0— which the daemon's refresh registry reads as permanently fresh, so it never rotated. The JWT then died server-side about an hour after login and every headlessrush cloud runreturned 401 until a human re-ranrush login. Both fields are now captured and stored with a real millisecond expiry, and the daemon's existing refresher rotates ahead of it. Supersedes the "no refresh token, and no local expiry" behavior documented under 0.2.38; the opaque-bearer path (noexpires_in) still storesexpires_at: 0and is unaffected.- A cloud run that ends
exitedwith exit code 0 is reported as success. The factory can observe the native process exit before its poller has durably finalized the run, and the CLI treated that terminal event as a failure. Exit code 0 now prints a clean finish; any other or malformed exit code still fails closed with a non-zero CLI exit. --cloudrejects--sub,--model-all,--var, and--resumeinstead of silently dropping them. These are registered on the same flag set but have no equivalent in the cloud dispatch body, and the--cloudbranch returns before the local code that would use them.rush run agent --sub foo --cloudwas accepted and dispatched the root agent, and--resume <session>started a brand-new contextless run rather than continuing the session its own help text promises — both with no error. All four now fail loudly; userush cloud messageto steer an in-flight cloud run.FindSkillDirInRegistry's not-found error no longer cites a stale depth-5 limit after the walk cap moved to 6.
Security
- Managed cloud runs no longer inherit a human Rush session, and their internal LLM capability is scoped (PHNX-3847). The managed run path is selected only by two explicit, non-secret markers (
RUSH_MANAGED_CLOUD_EXECUTION=1plus a well-formedRUSH_CLOUD_EXECUTION_ID), so a strayRUSH_SESSION_TOKEN, package-install capability, lease credential, or provider key cannot select it. On that path the token inRUSH_SESSION_TOKENis validated as a capability — issuerprix-cloud-run, audienceprix:cloud:llmand nothing else, bound to the execution id — and is cleared from the environment before the runtime starts, with nouser.yamlread or write and no daemon self-heal. rush installisolates the package-bootstrap credential (PHNX-3847). A managed install authorizes only the package-key request viaRUSH_PACKAGE_INSTALL_TOKEN, which is read and unset before any registry or dependency subprocess can inherit the CLI environment; that narrow bearer is never mistaken for a human session in download tracking. A local install never uses it.- BYOK credential redaction is fail-closed (PHNX-3775, PHNX-2689, PHNX-3655). Redaction previously matched a fixed set of key shapes, so a leased credential in an unrecognized format — an opaque or rotated tenant token — passed through verbatim into transcripts and logs, and
.shell_history.jsonlwas written with raw command, stdout, and stderr. The exact leased value is now registered as a literal at every mint point, both the pod credential helper and the localResolveBYOKForModelresolver, and scrubbed first regardless of shape; memory writes, log lines, and the shell-history sink all route through it, and a redaction failure drops the line or writes a placeholder rather than emitting the raw value. - Pod runs fetch BYOK provider keys just-in-time from the credential-helper socket, scoped by run id and provider, instead of carrying them for the life of the run; a helper miss or error falls back to server-side keys.
Downloads
| Platform | Binary | SHA-256 |
|---|---|---|
| macOS · Apple Silicon | download | — |
| macOS · Intel | download | — |
| Linux · x64 | download | — |
| Linux · arm64 | download | — |
| Windows · x64 | download | — |
| Windows · arm64 | download | — |
Checksums are published for the current latest release. Verify older binaries against rush --version after install.