← All CLI releases

Rush CLI 0.2.35

Install

macOS / Linux

curl -fsSL https://cdn.getrush.ai/install.sh | bash

Windows

irm https://cdn.getrush.ai/install.ps1 | iex

Homebrew

brew install phnx-labs/tap/rush

Debian / Ubuntu

sudo apt install rush-cli

Already installed?

rush upgrade

Added

  • Grok, Cursor, GitHub Copilot, and Codex run as Rush agents (RUSH-2333, RUSH-2378, RUSH-2381). rush run grok-cli / cursor-cli / copilot-cli / codex-cli wraps the vendor coding CLI you already pay for as an external-runtime agent — Rush spawns it, translates its event stream into the Rush protocol, and streams the work back. The same agents dispatch to the cloud (rush cloud run <agent>), where a factory pod runs the wrapped CLI with your key injected per-run and returns the full transcript and token/cost accounting.
  • Enforced agent compliance policies (RUSH-1927). agent.yaml may declare compliance.certifications, data_residency, and data_handling; rush build rejects unenforceable declarations, and the harness recursively scrubs PII/PHI from tool inputs and results without retaining raw values in sanitization audit events.
  • Ingest per-process Google/Microsoft account tokens in cloud runs (RUSH-1884). A cloud/Factory pod has no ~/.rush/user.yaml and no daemon, so rush run now reads the user's Google/Microsoft account access tokens from the per-process env vars RUSH_GOOGLE_ACCOUNT_TOKENS / RUSH_MICROSOFT_ACCOUNT_TOKENS (minted server-side by rush/cloud from the user's vault-stored refresh tokens) and feeds them into WithGoogleAccountTokens / WithMicrosoftAccountTokens, preserving per-account tokens and the primary account. When set, the env var is authoritative — a malformed payload is a hard error, never a silent fall-through to on-disk accounts. Local runs (env unset) are unchanged.
  • User memory and agent state travel to cloud dispatches (RUSH-856). A cloud run now carries the user's memory and the agent's saved state up to the pod, so a dispatched run continues from the same context a local run would have instead of starting cold.
  • Per-run visibility stats in rush cloud (RUSH-2176, RUSH-2589). rush cloud view <id> now prints the run's Model and a Usage line — tokens in/out (+ cached), dollar cost, tool-call count (with failures), and turns — e.g. 128.4k in · 8.0k out · $1.23 · 387 tools (3 failed) · 14 turns, plus total tokens and the inline transcript; the picker preview (rush cloud list in a TTY) shows the same compact line under each run. The numbers are parsed from the agent's own stream at finalize on the factory pod and stored on the run; runs that finished before this shipped show nothing (no fabricated zeros).
  • First-party connector kit — QuickBooks, Salesforce, NetSuite (RUSH-1930). rush connection install {quickbooks,salesforce,netsuite} now yields a real, runnable MCP connector. QuickBooks' catalog manifest previously declared a bare github.com source-repo link as its mcp_server, which the scalar-string parser turned into an unexecutable Command (a dead connector that "installed" successfully but could never spawn); it now launches npx quickbooks-mcp. Salesforce (npx @salesforce/mcp) and NetSuite (npx netsuite-mcp-server) gain brand-new manifests — neither had a CLI or app catalog entry before. Verified end-to-end: rush connector probe quickbooks connects and exposes 36 tools.
  • rush connection env set <name> KEY=VALUE ... (RUSH-1930). Attaches credentials (API keys / OAuth client secrets) to an already-installed catalog connector without re-declaring its launch command via the catalog-bypassing rush connection add path. It reads the stored row, merges the given keys into its env map, and re-saves the full row so command/args/remote-URL/tools are preserved exactly; the env flows into the MCP subprocess at run time, and only key names are echoed, never the secret values.
  • rush setup command group (RUSH-1881). A consolidated onboarding surface in a new visible "Setup:" help group. Bare rush setup runs an interactive wizard that walks only the incomplete steps; on a non-interactive shell (SSH/CI) it prints the checklist plus each item's fix command instead of prompting, so it never hangs. rush setup status gives a concise "am I ready?" summary; rush setup checklist [--json] lists itemized checkmarks with a per-item fix command; rush setup install <computer|browser|menubar|daemon|cloud> completes one step by delegating to the existing paths and re-probes the live signal before reporting done.
  • Daemon GET /setup/status endpoint (RUSH-1880). Exposes the shared onboarding rollup (internal/setup.Status()) over the daemon's loopback-TCP mux beside /health, so the menu-bar tray and scripts can read "am I set up?" without shelling out. Read-only and secret-free; inherits the existing host-check (DNS-rebind) + Origin/CSRF guards, and stays /health-fast.
  • Import the coding-agent CLIs you already have (#1367). Onboarding now detects installed Kimi and Grok CLIs and imports them, so an agent you already run in the terminal shows up in Rush without a manual setup step.
  • session_continuity: imessage on agent.yaml (RUSH-1984). When set, rush run <agent> without --session/--resume resumes the sticky iMessage DM session the channel gateway uses for that agent, so a phone thread continues at the desk. Implemented via DaemonDB.LatestSessionForChannelAgent (channel_sessions, then executions fallback) and resolveSessionContinuity in rush run.
  • --model deepseek/deepseek-v4-flash is selectable (RUSH-2528). The model is now on the CLI --model allowlist, so a run can target DeepSeek V4 Flash directly.

Changed

  • rush dev enable can now grant Developer access instantly (RUSH-1679). A new signup with a verified email and an account in good standing (no prior rejection, not banned/soft-deleted) is auto-approved by the server on POST /api/v1/developer/applyrush init/rush build/rush publish unblock in one command, no admin round trip. Everyone else still lands in the existing admin-reviewed pending queue.

Fixed

  • rush install <renamed-alias> now actually installs (BUG-1). Installing a registry agent by a renamed alias (e.g. prix/deep-researcher, which redirects to prix/rabbit-hole) printed Installed … with exit 0 but wrote nothing to ~/.rush/agents/. The container was written under the alias slug directory, which the rename-cleanup step then deleted. The container directory now tracks the canonical resolved agent, and the cleanup never removes the directory it just wrote.

  • rush init <dir> writes a valid agent name (BUG-3). rush init /tmp/my-project used to put the full path in name:, so the fresh project failed rush build with an invalid-name error. The name is now derived from the directory basename and sanitized to a build-valid two-word slug.

  • Missing external-runtime dependency is reported at default verbosity (BUG-5). Running an external-runtime agent (codex-cli, copilot-cli, …) with its vendor CLI absent printed a bare Error: Agent run failed; the honest missing dependency: … message only showed under --verbose. The actionable message now surfaces at default verbosity.

  • iMessage stays reachable after a transient relay disconnect (RUSH-1959). ImessageGateway.Start() gated its self-healing goroutines (readLoop/reconnectLoop/pingLoop) behind the first WebSocket dial succeeding, so a single failed initial connect (a network blip, prix-api mid-deploy, a DNS hiccup) permanently killed the channel for the life of the daemon with no retry — the menu bar still showed "Daemon: running" while the relay correctly reported the user offline. Start() now treats the first dial as best-effort and always starts the goroutines; reconnectLoop (already polling every 10s) picks up the retry.

  • Cloud transcripts keep every assistant and tool turn (RUSH-2533). A cloud pod wrote messages.jsonl encrypted at rest with a machine-bound key that nothing in the pod could later read, so a finished cloud run came back with its history stripped. At-rest session encryption is now disabled inside the ephemeral, isolated pod, so the full transcript survives the run.

  • rush whoami no longer says "Not logged in" while the daemon holds a fresh token (RUSH-1918). Post-RUSH-632 the on-disk access_token is always blank (the token lives in the OS keychain). When the CLI's own keychain read missed or was denied, GetValidAuthConfig() bailed on the empty on-disk token before consulting the daemon — the sole token owner, which can serve a fresh token from its in-memory cache. whoami (and the daemon-aware resolver used by rush run / scheduled runs / rush http) now bail only when there is no session identity at all; a present session whose token is only locally unreadable falls through to the daemon consult, and whoami distinguishes daemon-down from signed-out.

  • rush daemon status reports the real last-refresh outcome, not a fantasy clock (RUSH-1918). The status view derived a confident "Next token refresh" time purely from the daemon's start time, so it printed a healthy future clock even while every refresh was failing. The daemon now records the outcome of each refresh tick and the status view prints Last token refresh: HH:MM:SS (ok) or ... (FAILED: <error>).

  • Sign-in stays put on a dead session (RUSH-1843). Reconciled an auth split-brain that looked connected while silently failing, and surfaced a clean re-auth prompt instead of failing silently.

  • Agents are no longer told they're connected to OAuth accounts they have no tools for (RUSH-1035). The connected_<provider> prompt vars are now gated by the agent's ux.yaml declaration — the same signal the builder uses to inject first-party Google/Microsoft/Twitter/LinkedIn tools — so an agent that doesn't declare a provider is no longer injected with that account's context (it had no tools for it, so it could only hallucinate the capability). Declaring agents also report only their declared scopes.

  • Registry agents run headless without a running daemon (RUSH-1310). A manual cloud run of a registry agent no longer dies on "rush daemon not running".

  • Headless token refresh no longer wedges on Linux (RUSH-632). The keychain write that persists a refreshed session token could block forever on a box with no unlocked Secret Service collection, so the token was fetched but never saved and expires_at stayed frozen. Every keychain write is now bounded (5s) and a hung write degrades to the plaintext-user.yaml fallback, so rush refresh-tokens and rush run succeed and persist the new token.

  • Friendlier errors instead of raw Go strings. Quota-exceeded runs show the upgrade message instead of a bare "Model call failed" (RUSH-1841); a daemon round-trip timeout is classified as transient so users see "temporarily unavailable — check your connection and try again" instead of a leaked context deadline exceeded; and rush cloud computers routes its timeout through the shared error classifier ("Request timed out — try again").

  • The daemon reaps an orphaned instance by pidfile (RUSH-1844, RUSH-1855). rush daemon stop / restart now recover instead of wedging against a detached daemon, and re-bootstrap launchd so the daemon restarts onto the re-signed binary.

  • rush uninstall cleans up user-created agents (RUSH-1917). Uninstalling now removes the agent's metadata.db row, so a re-created agent of the same slug no longer collides with a stale record.

  • rush cloud accounts remove/edit accept a short-ID prefix (RUSH-2124). You can pass the short ID shown in rush cloud accounts list instead of the full UUID.

  • Download as PDF no longer crashes on hardened (garble) release builds (RUSH-1840). The html/template palette is denormalized so field reflection survives obfuscation.

  • rush build accepts registered first-party tool groups such as box_tools and dropbox_tools during catalog validation.

  • Smaller CLI-surface fixes. Session-storage init failures emit a structured error_code rather than a raw Go string (RUSH-1838); rush tool accepts -v and applies auth config to dual-registered tools (RUSH-1845); rush exits 1 when signed out and emits side_effect=unknown in run meta (RUSH-1848); rush init scaffolds an agent that passes rush build without a gallery (RUSH-1847); rushx --version prints the version instead of failing with "rushx takes a single agent"; and rush connection disable <name> --for <slug> rejects a connector that was never installed instead of writing an orphan disabled=1 row.

Security

  • agent_slug memory-isolation gate. A subagent may share its parent family's KV / SQL store only when its declared agent_slug equals the root (top-level) agent's slug. Any other override is now ignored and logged, so one agent family can no longer point its agent_slug at another family's store and read or write its memory. Enforced in AgentKVMemoryTool.SetRootAgentName / AgentSQLMemoryTool.SetRootAgentName, wired from AgentBuilder.Build via WithRootAgentName and rootAgentNameForSub on the rush run --sub path.

Downloads

PlatformBinarySHA-256
macOS · Apple Silicondownload
macOS · Inteldownload
Linux · x64download
Linux · arm64download
Windows · x64download
Windows · arm64download

Checksums are published for the current latest release. Verify older binaries against rush --version after install.