@viraatdas/rudder 1.0.72 → 1.0.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,14 +11,10 @@
11
11
  [![Node >=20](https://img.shields.io/badge/node-%3E%3D20-43853d.svg)](https://nodejs.org/)
12
12
  [![Website](https://img.shields.io/badge/site-rudder.viraat.dev-111111.svg)](https://rudder.viraat.dev)
13
13
 
14
- Rudder leans into how coding agents should be used: massively parallel,
14
+ Rudder runs coding agents the way they should be used: several at once,
15
15
  isolated, reviewable, and easy to merge. It opens a native three-pane dashboard,
16
- creates an isolated git worktree for each task, and runs real Claude Code or
17
- Codex processes in the worker pane.
18
-
19
- Rudder Cloud lives behind `/login`, `/cloud`, and `/sail`. It keeps the same
20
- local dashboard and worktree flow, with an optional Fly Machines worker path for
21
- tasks that should continue away from your laptop.
16
+ gives every task its own git worktree, and runs real Claude Code or Codex
17
+ processes in the worker pane.
22
18
 
23
19
  ## Install
24
20
 
@@ -27,589 +23,240 @@ npm install -g @viraatdas/rudder@latest
27
23
  rudder
28
24
  ```
29
25
 
30
- Upgrade with the same command:
31
-
32
- ```bash
33
- npm install -g @viraatdas/rudder@latest
34
- ```
35
-
36
- Run without a global install:
37
-
38
- ```bash
39
- npx @viraatdas/rudder@latest
40
- ```
26
+ Upgrade with the same command. Run without a global install using
27
+ `npx @viraatdas/rudder@latest`.
41
28
 
42
29
  ## Requirements
43
30
 
44
31
  - Node.js 20 or newer
45
32
  - Git
46
33
  - Claude Code and/or Codex installed and logged in
47
- - macOS, Linux, or another Unix-like terminal environment
34
+ - macOS, Linux, or another Unix-like terminal
48
35
 
49
- Check the local setup:
36
+ Check your setup at any time:
50
37
 
51
38
  ```bash
52
39
  rudder doctor
53
40
  ```
54
41
 
55
- ## Onboarding
42
+ ## Quick start
56
43
 
57
44
  ```bash
58
- rudder onboard
45
+ rudder
59
46
  ```
60
47
 
61
- Onboarding checks for `claude`, Codex auth, git, auth files, env vars, and acpx.
62
- It uses the auth you already have whenever possible:
63
-
64
- - Claude Code auth from macOS Keychain or `~/.claude/.credentials.json`
65
- - Codex auth from `~/.codex/auth.json`
66
- - `ANTHROPIC_API_KEY` and `OPENAI_API_KEY`
67
-
68
- If auth is missing, Rudder lets you skip it and set up the backend later. It
69
- does not require API keys when you already use Claude Code or Codex login.
70
-
71
- Config is written to `~/.rudder/config.json`. Mirrored auth metadata is written
72
- to `~/.rudder/auth-profiles.json`.
73
-
74
- ## Rudder Cloud
48
+ With no arguments, `rudder` opens the dashboard. Type a task in the bottom input
49
+ and press `Enter`. Rudder creates a git worktree for it and starts your agent
50
+ (Claude Code or Codex) in the worker pane. Start more tasks the same way; each
51
+ gets its own worktree so they never step on each other.
75
52
 
76
- Rudder Cloud is the hosted worker mode for Rudder. The local app remains the
77
- control surface: you start in your repo, choose a task, and decide whether it
78
- should run locally or be handed to a cloud worker.
53
+ You can also start a task directly from the shell:
79
54
 
80
55
  ```bash
81
- rudder login
82
- rudder cloud
83
- rudder cloud list
84
- rudder cloud byoc rudder-workstation
85
- rudder cloud onload
86
- rudder cloud onload <runId>
87
- rudder cloud logs <id>
88
- rudder cloud migration-lab
89
- rudder sail staging-worker
90
- ```
91
-
92
- By default the CLI points at the hosted Rudder Cloud control plane:
93
- `https://rudder-cloud-control.fly.dev`. Set `RUDDER_CLOUD_URL` to
94
- override it for local development or another deployment. If the public Fly
95
- edge is unavailable from the current network, Rudder automatically retries
96
- through a local `flyctl proxy` to `rudder-cloud-control.internal`, so startup
97
- still reaches the same control plane without a manual proxy command.
98
-
99
- Inside the dashboard, `/login` starts browser auth and `/cloud list` lists
100
- cloud workers after you are logged in. `rudder cloud` starts or attaches a fast
101
- fresh Fly workspace for the current repo name; it does not upload the local repo
102
- snapshot first. Use `rudder cloud onload` only when you explicitly want to move
103
- the current Rudder workspace state to the cloud, including the repo snapshot,
104
- selected HOME auth/config paths, `RUDDER.md`, and saved
105
- `.rudder/runs/*/run.json` metadata. `/cloud help` shows the cloud command
106
- reference.
107
-
108
- Cloud workers use Fly Machines by default. To bring your own workstation or
109
- server instead, add it to `~/.ssh/config` and run:
110
-
111
- ```bash
112
- rudder cloud byoc rudder-workstation
56
+ rudder "fix the failing tests"
57
+ rudder claude "fix the auth redirect bug"
58
+ rudder codex --model gpt-5.5 "refactor the parser"
113
59
  ```
114
60
 
115
- That SSH host should use key-based auth and have Docker available to your SSH
116
- user. Rudder checks the host and stores it in `~/.rudder/cloud.json`.
117
- After setup, `rudder cloud vm <task>` prepares a BYOC run and Rudder tries to
118
- start it on that host over SSH. Plain `rudder cloud` and dashboard `/cloud`
119
- always use Fly for the fresh workspace shortcut so startup behaves
120
- consistently. Use `rudder cloud runtime [fly|byoc]` to inspect or change the
121
- saved CLI runtime.
122
- Set `RUDDER_BYOC_AUTOSTART=0` if you always want Rudder to print the Docker
123
- command instead of starting it over SSH.
124
-
125
- `rudder login` connects this machine to Rudder Cloud by opening the browser for
126
- the control plane's Better Auth login. If that browser login endpoint is
127
- unavailable, Rudder falls back to local GitHub CLI auth and then GitHub's
128
- browser device flow. It is separate from Claude Code and Codex login: provider
129
- auth still belongs to the official CLIs unless you explicitly configure
130
- otherwise.
131
-
132
- Cloud admins can attach existing OAuth clients without redeploying the control
133
- plane:
61
+ ## Onboarding and auth
134
62
 
135
63
  ```bash
136
- rudder cloud login
137
- rudder cloud setup-github <github-client-id>
138
- rudder cloud setup-google <google-client-id>
64
+ rudder onboard
139
65
  ```
140
66
 
141
- Both setup commands prompt for the client secret without echoing it and persist
142
- the provider credentials into Rudder Cloud's S3-backed state. For automation,
143
- use `RUDDER_GITHUB_CLIENT_ID`, `RUDDER_GITHUB_CLIENT_SECRET`,
144
- `RUDDER_GOOGLE_CLIENT_ID`, and `RUDDER_GOOGLE_CLIENT_SECRET`.
145
-
146
- `rudder cloud list` will show cloud-capable runs and remote workers. `rudder
147
- cloud onload` uploads the current Rudder workspace. `rudder cloud onload
148
- <runId>` keeps the older single-run path for moving one local run to the cloud
149
- from the same task context. `rudder cloud logs <id>` currently shows worker
150
- status while full cloud log streaming is being wired up.
67
+ Onboarding uses the auth you already have, so you usually do not need API keys:
151
68
 
152
- Cloud onload is designed around Rudder's existing worktree model. If a task is
153
- already in a worktree, that worktree is the unit Rudder prepares for the cloud.
154
- If a task is still in the main checkout, Rudder prepares a worktree first so the
155
- cloud run does not mutate your local branch directly. Completed cloud work comes
156
- back through the same review and merge path as local work.
157
-
158
- Rudder includes selected HOME config paths in the launch snapshot so cloud
159
- workers can behave like your local environment where that is useful: Claude,
160
- Codex, GitHub CLI, git config, npm, Vercel, and Hunk config are considered. It
161
- filters obvious high-risk material such as AWS credentials, `.env` files, SSH
162
- keys, Docker auth, kube config, and private key directories.
163
-
164
- The cloud control plane code lives in `cloud/`. It uses Better Auth for
165
- Google/GitHub login, stores launch snapshots in an encrypted S3 bucket, and
166
- starts Fly Machines workers with one-hour presigned snapshot URLs. The local CLI
167
- package stays small; cloud state and worker orchestration run in the separate
168
- control plane.
169
-
170
- ## Architecture
171
-
172
- Rudder has three layers:
173
-
174
- ```text
175
- ┌────────────────────────────────────────────────────────────┐
176
- │ Local Rudder CLI │
177
- │ native OpenTUI dashboard, task input, panes, worktrees │
178
- ├────────────────────────────────────────────────────────────┤
179
- │ Agent Process Layer │
180
- │ real claude or codex terminals, not mocked transcript UIs │
181
- ├────────────────────────────────────────────────────────────┤
182
- │ Optional Rudder Cloud │
183
- │ Better Auth, S3 snapshots, Fly Machines, BYOC Docker runs │
184
- └────────────────────────────────────────────────────────────┘
185
- ```
69
+ - Claude Code auth from the macOS Keychain or `~/.claude/.credentials.json`
70
+ - Codex auth from `~/.codex/auth.json`
71
+ - `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` if you prefer keys
186
72
 
187
- ### Local Dashboard
73
+ If auth is missing you can skip it and set up a backend later. Config is written
74
+ to `~/.rudder/config.json`.
188
75
 
189
- `rudder` starts the native dashboard. The native binary owns the terminal, draws
190
- the three-pane UI, creates PTYs for workers, and routes keyboard and mouse input.
76
+ ## The dashboard
191
77
 
192
78
  ```text
193
79
  ┌───────────────┬────────────────────────────────────────────┐
194
- │ agents │ worker
195
- │ task list │ live Claude Code or Codex PTY
196
- │ status/model │ scrollback, review view, copy selection
80
+ │ agents │ worker
81
+ │ task list │ live Claude Code or Codex terminal
82
+ │ status/model │ scrollback, review view, copy selection
197
83
  ├───────────────┴────────────────────────────────────────────┤
198
- │ task input: new tasks, slash commands, cloud launch prompts
199
- └────────────────────────────────────────────────────────────┘
200
- ```
201
-
202
- The worker pane is an actual terminal process. When you focus it, keystrokes go
203
- to Claude Code or Codex. Rudder only intercepts global controls such as
204
- `Ctrl-C`, pane focus, review mode, merge, and delete.
205
-
206
- ### Worktrees And Context
207
-
208
- Each normal task gets its own git worktree so agents do not compete inside the
209
- same checkout.
210
-
211
- ```text
212
- main checkout
213
- ├─ .rudder/runs/<run-id>/run.json local run metadata
214
- ├─ RUDDER.md current agent map, gitignored
215
- └─ ~/.rudder-worktrees/<repo>/<run-id> isolated agent checkout
84
+ │ task input: new tasks, slash commands, cloud launch prompts
85
+ └──────────────────────────────────────────────────────────────┘
216
86
  ```
217
87
 
218
- `RUDDER.md` is regenerated as agents start, finish, restart, or delete. Rudder
219
- injects a short prompt telling each agent to read it, so a new agent can see
220
- what other agents are doing without Rudder rewriting the user task.
221
-
222
- Merging is intentionally git-native:
88
+ - **agents** (left): one row per task with its backend, model, effort, and status.
89
+ - **worker** (right): the real Claude Code or Codex terminal. When it is focused,
90
+ your keystrokes go straight to the agent, so its prompts, slash commands,
91
+ selection, and `Tab` all work normally.
92
+ - **task** (bottom): start the next agent without leaving the dashboard.
223
93
 
224
- ```text
225
- agent worktree -> optional commit -> git merge --no-ff -> main checkout
226
- ```
94
+ Mouse wheel and trackpad scroll the pane under the pointer. Over the worker or
95
+ review pane they scroll Rudder's captured scrollback.
227
96
 
228
- If a merge conflicts, Rudder leaves the merge in place and offers to start an
229
- AI resolver in the main checkout. It does not hide the conflicted git state.
97
+ ## Keyboard shortcuts
230
98
 
231
- ### Review Flow
99
+ **Direct (work from any pane):**
232
100
 
233
- Review mode uses Hunk when available, with git diff as the fallback path.
234
-
235
- ```text
236
- selected run worktree
237
- └─ hunk diff --watch
238
- └─ embedded PTY in the worker/review pane
239
- ```
240
-
241
- The review pane is also a real terminal. Mouse wheel and trackpad events scroll
242
- Rudder's captured scrollback first; if there is no Rudder scrollback to move,
243
- events can pass through to the inner TUI.
244
-
245
- ### Cloud Auth
246
-
247
- Rudder Cloud auth is separate from Claude Code and Codex auth.
248
-
249
- ```text
250
- /login or rudder login
251
- -> browser opens Rudder Cloud
252
- -> Better Auth handles Google or GitHub
253
- -> control plane issues a Rudder CLI token
254
- -> local CLI writes ~/.rudder/cloud.json
255
- ```
256
-
257
- Claude Code and Codex credentials stay in their normal locations such as
258
- `~/.claude`, `~/.codex`, Keychain, or existing environment variables. Cloud
259
- workers receive a filtered snapshot of useful HOME config, excluding obvious
260
- high-risk material such as SSH keys, AWS credentials, Docker auth, kube config,
261
- and `.env` files.
262
-
263
- ### Fly Cloud Path
264
-
265
- Plain `rudder cloud` always uses the Fly workspace path. This keeps startup
266
- predictable even if the CLI default runtime was changed to BYOC.
267
-
268
- ```text
269
- rudder cloud
270
- -> control plane creates or reuses a Fly workspace machine
271
- -> worker initializes a fresh git repo on its workspace volume
272
- -> worker starts Rudder
273
-
274
- If the public Fly hostname resets or times out, the CLI falls back to a local
275
- Fly proxy and retries the same request. This keeps the default path usable when
276
- Fly public ingress is flaky, while `RUDDER_CLOUD_URL` still overrides the
277
- control plane for explicit local or custom deployments.
278
-
279
- rudder cloud onload
280
- -> local CLI creates repo snapshot with selected Rudder state
281
- -> control plane stores snapshot in S3
282
- -> control plane creates Fly Machine
283
- -> worker downloads snapshot and starts Rudder
284
- ```
285
-
286
- The cloud indicator in the agents pane shows whether the local dashboard is
287
- connected to Rudder Cloud.
288
-
289
- ### BYOC Path
290
-
291
- BYOC is for a server you own, reachable through SSH.
292
-
293
- ```text
294
- rudder cloud byoc <ssh-host>
295
- -> read ~/.ssh/config
296
- -> verify SSH and Docker
297
- -> save host in ~/.rudder/cloud.json
298
-
299
- rudder cloud vm "task"
300
- -> upload snapshot to Rudder Cloud
301
- -> receive docker run bootstrap command
302
- -> run it over SSH with nohup
303
- ```
304
-
305
- On ARM hosts, the bootstrap command switches from
306
- `public.ecr.aws/exla/rudder-worker:latest` to
307
- `public.ecr.aws/exla/rudder-worker:arm64`, so Jetson-style machines do not try
308
- to run an amd64 worker image.
101
+ | Key | Action |
102
+ | --- | --- |
103
+ | `Option-1` / `Option-2` / `Option-3` | Focus the agents, worker, or task pane |
104
+ | `Option-v` | Toggle the selected agent's review view |
105
+ | `Cmd-C` | Copy the active Rudder selection |
106
+ | `Ctrl-C` | Quit (asks to confirm if agents are still running) |
309
107
 
310
- ### Control Plane
108
+ `Option-1/2/3` work out of the box on macOS terminals, whether or not "Use Option
109
+ as Meta" is enabled.
311
110
 
312
- The hosted control plane is in `cloud/`.
111
+ **Leader: press `Ctrl-W`, then one key.** A reliable way to run a dashboard
112
+ command, even while typing inside the worker pane:
313
113
 
314
- ```text
315
- cloud/src/server.ts
316
- ├─ Better Auth pages and API routes
317
- ├─ /api/rudder/sail launch/list/pause/resume/onload/bootstrap
318
- ├─ S3 snapshot storage and persisted state
319
- ├─ Fly Machines API client
320
- └─ BYOC bootstrap command generation
321
-
322
- cloud/worker/entrypoint.sh
323
- ├─ download snapshot
324
- ├─ restore selected HOME config
325
- ├─ initialize git baseline if needed
326
- ├─ run Rudder/Codex task
327
- └─ heartbeat completion back to the control plane
328
- ```
114
+ | Then press | Action |
115
+ | --- | --- |
116
+ | `1` / `2` / `3` | Focus agents / worker / task |
117
+ | `v` | Toggle review |
118
+ | `m` | Merge the selected completed worktree |
119
+ | `M` | Merge all completed worktrees |
120
+ | `R` | Review all completed worktrees (Codex review-all agent) |
121
+ | `r` | Rename the selected agent |
122
+ | `u` | Sync (rebase) the selected worktree onto its base branch |
123
+ | `d` | Delete the selected agent and its worktree |
124
+ | `j` / `k` | Move the agent selection |
125
+ | `q` | Quit |
126
+ | `Esc` | Cancel the leader |
329
127
 
330
- ## Dashboard
128
+ `Ctrl-G` toggles the same command set as a sticky "nav mode" (`Esc` exits) if you
129
+ prefer a held mode over the one-shot leader.
331
130
 
332
- Start the native dashboard:
131
+ **In the worker pane:** keystrokes go to the agent. `Tab` / `Shift+Tab` are
132
+ forwarded to it, `Shift+Enter` inserts a newline, and `PageUp` / `PageDown`
133
+ scroll the pane.
333
134
 
334
- ```bash
335
- rudder
336
- ```
337
-
338
- The dashboard has three panes:
339
-
340
- - `agents`: the left pane with one row per task, its backend, model, effort, and
341
- completion status
342
- - `worker`: the right pane with the actual Claude Code or Codex terminal
343
- - `task`: the bottom input for starting a new agent
344
-
345
- Type a task in the task pane and press `Enter`. Rudder creates a worktree,
346
- writes the current agent context to `RUDDER.md`, and starts the selected backend
347
- inside the worker pane.
348
-
349
- When the worker pane is focused, your keystrokes go directly to Claude Code or
350
- Codex. Their slash commands, cursor movement, copy/paste, and terminal UI
351
- continue to work normally. `Ctrl-C` is reserved by Rudder and leaves the
352
- dashboard from any pane.
353
-
354
- Rudder owns mouse input inside the dashboard. Wheel or trackpad scrolling is
355
- routed to the pane under the pointer. Over the worker or review pane, it scrolls
356
- Rudder's captured pane output, not the underlying Claude Code, Codex, or Hunk
357
- chat. Use the worker's up and down arrow keys when you want to move through the
358
- agent's own prompt history or menus. Drag selection inside the worker pane
359
- copies selected text, including when you drag upward past the top of the pane.
360
- For full-screen alternate-screen workers, Rudder keeps its own pane history so
361
- trackpad scrolling moves the pane instead of depending on the child app. If the
362
- pane has no Rudder scrollback to move and the inner TUI has explicitly requested
363
- mouse input, Rudder passes the wheel event through so Claude Code, Codex, Hunk,
364
- or another full-screen app can scroll its own view.
365
-
366
- Codex needs one extra guard. Rudder launches its pinned `rudder-codex` fork with
367
- `--no-alt-screen`, `CODEX_RUDDER_SCROLLBACK_SAFE=1`, `-c notify=[]`,
368
- `-c features.plugins=false`, and `-c features.computer_use=false`, so Codex keeps
369
- its normal renderer without clearing the parent pane's scrollback and does not
370
- inherit desktop-app notification hooks or bundled plugin helpers that expect the
371
- official signed app launch chain. Codex still inserts finalized transcript rows with
372
- top-origin terminal scroll regions rather than ordinary newlines. Rudder's
373
- embedded `vt100` parser does not expose those rows as normal scrollback, so the
374
- native worker pane mirrors rows that leave a top-origin scroll region into
375
- Rudder-owned pane scrollback before applying the bytes to the parser. Wheel and
376
- trackpad events then scroll that pane history first, which makes Codex and
377
- Claude worker panes follow the same rule: Rudder scrolls the visible worker
378
- transcript, and only forwards wheel events to an inner TUI when Rudder has no
379
- pane scrollback to move.
380
-
381
- Keep that behavior covered with:
135
+ **In the agents pane:** `j` / `k` or arrows move the selection, `Enter` focuses
136
+ the worker, and `m` / `M` / `R` / `r` / `u` / `d` act on the selection.
382
137
 
383
- ```bash
384
- npm run test:worker-scroll
385
- ```
138
+ **In the task pane:** `Enter` starts the task, `Up` / `Down` browse history,
139
+ `Alt-Left` / `Alt-Right` move by word, `Alt-Backspace` (or `Ctrl-Backspace`)
140
+ deletes the previous word, and `/` opens command suggestions.
386
141
 
387
- That script includes the Codex-style top-origin scroll-region test plus the
388
- worker wheel routing tests for normal screen, alternate screen, and edge
389
- forwarding. If a local dashboard still behaves like an older build, check
390
- `rudder --version`, upgrade with `npm install -g @viraatdas/rudder@latest`, and
391
- restart existing Rudder dashboards so no stale `rudder-native` or managed Codex
392
- process is still running.
142
+ ## Task pane commands
393
143
 
394
- ## Dashboard Shortcuts
395
-
396
- | Key | Action |
397
- | --- | --- |
398
- | `Enter` | Start the typed task, or focus the selected worker when the task input is empty |
399
- | `Option-1` / `Option-2` / `Option-3` | Focus agents, worker, or task directly |
400
- | `Tab` / `Shift+Tab` in worker | Forward to the focused agent TUI |
401
- | `Ctrl-G` | Toggle Rudder nav mode while focused inside a worker |
402
- | `Alt-v` | Toggle the selected agent's review view from any pane |
403
- | `Shift+Enter` | Insert a new line in the focused worker prompt |
404
- | `PageUp` / `PageDown` | Scroll the focused worker pane by roughly one page |
405
- | `j` / `k` or arrows | Move through agents when the agents pane is focused |
406
- | `Up` / `Down` | Browse task history when the task pane is focused |
407
- | `Alt-Left` / `Alt-Right` | Move by word in the task pane and in supported worker prompts |
408
- | `Alt-Backspace` / `Ctrl-W` | Delete the previous word in the task pane and in supported worker prompts |
409
- | `Cmd-C` / `Meta-C` | Copy the active Rudder text selection without forwarding `c` to the worker |
410
- | `Ctrl-C` | Leave Rudder from any pane |
411
- | `v` | Toggle the selected agent's review view |
412
- | `Esc` | Leave the review view when it is focused |
413
- | `r` | Restart the selected stopped agent in its worktree |
414
- | `m` | Merge the selected completed worktree |
415
- | `R` | Combine completed worktrees and start a Codex review-all agent when the agents pane or nav mode is active |
416
- | `M` | Merge all completed worktrees when the agents pane or nav mode is active |
417
- | `dd` | Delete the selected agent and remove its worktree; if it has changes, Rudder gives you a merge chance first |
418
- | `q` | Quit when the worker is not consuming input |
419
-
420
- ## Task Pane Commands
421
-
422
- Type `/` in the task pane to open command suggestions. Use `Up`/`Down` to move
423
- through suggestions and `Enter` to choose one.
144
+ Type `/` in the task pane to open suggestions. Move with `Up` / `Down`, choose
145
+ with `Enter`.
424
146
 
425
147
  | Command | Action |
426
148
  | --- | --- |
427
- | `/model` | Open the provider-first model picker: choose Claude or Codex, then model, then effort when supported |
428
- | `/main` or `/m` | Start a new main-branch agent pane |
429
- | `/plan` | Toggle Rudder's read-only plan mode for task pane submissions |
430
- | `/plan <task>` | Start one read-only planning session without toggling plan mode |
431
- | `/rudder-plan <task>` | Start a planning coordinator that decomposes the task and spawns worker agents |
149
+ | `/model` | Pick provider, then model, then effort |
150
+ | `/main` or `/m` | Start a new main-branch agent |
151
+ | `/plan` | Toggle read-only plan mode |
152
+ | `/plan <task>` | Run one read-only planning session |
153
+ | `/rudder-plan <task>` | Plan, then spawn worker agents for the steps |
432
154
  | `/run <task>` | Start an implementation run even when plan mode is on |
155
+ | `/sync` | Rebase the selected worktree onto its base branch |
433
156
  | `/review-all` | Combine completed worktrees and start a Codex review-all agent |
434
157
  | `/merge-all` | Merge all completed worktrees |
435
- | `/login` | Open browser login for Rudder Cloud |
436
- | `/cloud` | Start or attach a fast fresh Fly workspace |
437
- | `/cloud <task>` | Start a cloud task worker |
438
- | `/cloud byoc <ssh-host>` | Use an SSH host from `~/.ssh/config` for BYOC cloud workers |
439
- | `/cloud runtime [fly\|byoc]` | Show or set the saved cloud runtime |
158
+ | `/login` | Browser login for Rudder Cloud |
159
+ | `/cloud` | Onload the current workspace or start a fresh cloud worker |
440
160
  | `/cloud list` | List cloud workers |
441
- | `/cloud logs <id>` | Show cloud worker status while log streaming is pending |
442
- | `/cloud help` | Show cloud command help |
443
- | `/sail <name or task>` | Short alias for starting a cloud worker |
444
161
  | `/help` | Show the short command hint |
445
162
 
446
- Use `Ctrl-G` before a Rudder shortcut if the worker pane is focused and you want
447
- the key handled by Rudder instead of by Claude Code or Codex.
448
-
449
- If trackpad scrolling does not behave as expected, run
450
- `rudder mouse-test parsed` to confirm your terminal is sending `ScrollUp` and
451
- `ScrollDown` events. For lower-level escape bytes, run `rudder mouse-test raw`.
452
- To inspect live dashboard routing, start Rudder with `RUDDER_MOUSE_DEBUG=1`.
453
- Rudder scrolls one terminal row per wheel event by default so trackpad scrolling
454
- feels smooth in worker and review panes. Override with
455
- `RUDDER_WHEEL_SCROLL_ROWS=<n>` if your terminal is configured differently.
456
-
457
163
  ## Models
458
164
 
459
- Run `/model` in the task pane. Rudder first asks for the provider, then the
460
- model, then the effort level supported by that model.
165
+ Run `/model` and pick the provider, then the model, then the effort level the
166
+ model supports. Claude offers aliases like `sonnet`, `opus`, `haiku` (and the
167
+ `[1m]` long-context variants); Codex offers `gpt-5.5`, `gpt-5.4-codex`, and other
168
+ discovered models. `auto` effort means Rudder passes no override.
461
169
 
462
- - Claude models put Opus choices first and show the resolved family/version in
463
- the picker, for example `opus -> Opus 4.8`, `opus[1m] -> Opus 4.8`, and
464
- `sonnet -> Sonnet 4.6`, followed by explicit IDs such as `claude-opus-4-8`.
465
- - Codex models include Codex-relevant OpenAI model IDs such as `gpt-5.5`,
466
- `gpt-5.4`, `gpt-5.4-mini`, and discovered GPT-5/Codex models.
467
- - `auto` effort means Rudder does not pass an effort override.
170
+ Your last provider, model, and effort are saved in `~/.rudder/config.json` and
171
+ reused next time. Rudder refreshes model metadata from
172
+ `https://models.dev/api.json` and falls back to local caches when offline.
468
173
 
469
- Rudder saves the last selected provider and model, plus effort when chosen, in
470
- `~/.rudder/config.json`, so the same defaults are used when you open a new
471
- dashboard or shell session.
174
+ ## Plan mode
472
175
 
473
- Rudder refreshes model metadata from `https://models.dev/api.json` before the
474
- dashboard starts and caches it in `~/.rudder/models-dev.json`. If the network is
475
- unavailable, it falls back to local Claude session history and Codex's local
476
- model cache.
176
+ Type `/plan` to toggle planning on or off. While on, `Enter` starts a read-only
177
+ planner instead of an implementation run. Use `/plan <task>` for a one-off plan,
178
+ or `/run <task>` to bypass plan mode. `/rudder-plan <task>` plans and then starts
179
+ each resulting step as its own worktree agent. Planners run in the current
180
+ checkout and use each backend's native read-only mode, so they do not write
181
+ files.
477
182
 
478
- ## Agent Launch
183
+ ## Worktrees and merging
479
184
 
480
- Native dashboard workers launch Claude Code directly and launch Codex through
481
- Rudder's pinned `rudder-codex` fork. Set `RUDDER_CODEX_BIN` to test another
482
- Codex-compatible binary explicitly.
185
+ Every dashboard task runs in its own git worktree under `~/.rudder-worktrees/...`,
186
+ so parallel agents never edit the same checkout. Run records live under
187
+ `.rudder/runs/`. If you quit Rudder, live workers stop but the agents stay listed
188
+ the next time you open Rudder in that repo.
483
189
 
484
- Claude Code:
190
+ - Press `m` to merge the selected completed agent back into its branch.
191
+ - Press `M` to merge all completed agents. Rudder confirms first.
192
+ - Press `u` (or run `/sync`) to only rebase a worktree onto its base.
485
193
 
486
- ```bash
487
- CLAUDE_CODE_NO_FLICKER=0 claude \
488
- --permission-mode bypassPermissions \
489
- --model <model> \
490
- --effort <effort> "<task>"
491
- ```
194
+ Clean merges become merge commits. If git reports conflicts, Rudder leaves the
195
+ conflicted state in place and can open an agent in the main checkout to help
196
+ resolve it.
492
197
 
493
- Codex:
198
+ Choose the merge behavior in `~/.rudder/config.json`:
494
199
 
495
- ```bash
496
- CODEX_RUDDER_SCROLLBACK_SAFE=1 rudder-codex --no-alt-screen \
497
- --dangerously-bypass-approvals-and-sandbox \
498
- -c model_reasoning_summary="detailed" \
499
- -c model_supports_reasoning_summaries=true \
500
- -c model_reasoning_effort="<effort>" \
501
- -m <model> "<task>"
200
+ ```json
201
+ { "mergeStrategy": "rebase" }
502
202
  ```
503
203
 
504
- The exact model and effort flags are omitted when set to `auto`.
505
-
506
- ## Plan Mode
507
-
508
- Type `/plan` to toggle planning on or off. While it is on, pressing `Enter`
509
- starts a planner instead of an
510
- implementation run. You can also use `/plan <task>` for a one-off plan, or
511
- `/run <task>` to bypass plan mode and start a normal worktree agent.
512
-
513
- Planning sessions use the currently selected Claude or Codex model and lean on
514
- the backend's native planning/read-only controls:
515
-
516
- - The planner runs in the current checkout instead of creating a worktree.
517
- - Codex planners launch with `--sandbox read-only`, `--ask-for-approval never`,
518
- `--enable goals`, and `--search`, so filesystem writes are blocked, Codex
519
- goals are available, and the native Responses `web_search` tool is available.
520
- - Claude planners launch with Claude Code's native `--permission-mode plan`.
521
-
522
- `/rudder-plan <task>` uses the same read-only planner controls, but asks the
523
- planner to emit a structured `RUDDER_PLAN_TASKS` block. When Rudder sees that
524
- block, it starts each listed task as a normal isolated worktree agent. For
525
- larger tasks with a clear validation loop, the planner can attach a durable
526
- Codex `/goal` objective; Rudder passes that into the worker prompt so Codex can
527
- set the goal before implementation. If the planner asks follow-up questions
528
- instead of emitting the block, Rudder does not spawn workers.
529
- - Rudder only prefixes the task with a short planning request; it no longer
530
- injects a custom planner contract.
531
- - Normal implementation runs are unchanged: they still create worktrees and use
532
- the full-permission worker launch described above.
533
-
534
- ## Worktrees And Merging
535
-
536
- Every dashboard task runs in its own git worktree under
537
- `~/.rudder-worktrees/...`, so parallel agents do not edit the same checkout.
538
- Run records are saved under `.rudder/runs/`. If you exit Rudder, live worker
539
- processes stop, but the agents remain listed next time you open Rudder in the
540
- same repo.
541
-
542
- Press `m` to merge the selected completed agent back into the original branch.
543
- Press `M` to merge all completed agents. Rudder asks for confirmation before
544
- merging. Clean merges become merge commits; if git reports conflicts, Rudder can
545
- open an agent in the main checkout to help resolve them.
204
+ - `"merge"` (default): `git merge --no-ff`.
205
+ - `"rebase"`: rebase the worktree onto the latest base, then `git merge --ff-only`.
546
206
 
547
207
  Command-line equivalents:
548
208
 
549
209
  ```bash
550
210
  rudder merge <runId>
211
+ rudder sync <runId>
551
212
  rudder cleanup
552
213
  ```
553
214
 
554
- ## Steering
215
+ ## Review
555
216
 
556
- Before a task starts, Rudder writes `RUDDER.md` into the worktree and adds it to
557
- `.gitignore` once. The file lists active agents, their worktrees, and what they
558
- are doing. The worker prompt tells Claude Code or Codex to read it first.
217
+ Press `v` on an agent to toggle a review of its worktree. Rudder uses
218
+ [Hunk](https://hunk.dev) when available (installing `hunkdiff` on first use) and
219
+ falls back to a live `git diff` otherwise. Press `v` or `Esc` to return to the
220
+ worker. Set `RUDDER_REVIEW_TOOL=git` to force the diff fallback, or
221
+ `RUDDER_HUNK_THEME=<name>` to change the review theme.
559
222
 
560
- After a worker appears to finish, Rudder can wait briefly and send a focused
561
- follow-up asking the same agent to verify what remains. When an agent finishes
562
- or fails, Rudder plays the bundled completion sound.
223
+ Press `R` to review all completed worktrees as one bundle: Rudder builds an
224
+ aggregate branch and starts a Codex review-all agent over the combined diff. When
225
+ that row is done, press `m` on it to merge the reviewed bundle into your checkout.
563
226
 
564
- ## Review
227
+ ## Rudder Cloud
565
228
 
566
- Press `v` on an agent to toggle a review view for that agent's worktree:
229
+ Rudder Cloud is an optional hosted worker mode. The local dashboard stays your
230
+ control surface; you decide whether a task runs locally or is handed to the cloud.
567
231
 
568
232
  ```bash
569
- hunk diff --watch
233
+ rudder login # connect this machine to Rudder Cloud
234
+ rudder cloud # onload the current workspace or start a worker
235
+ rudder cloud list # list cloud workers
236
+ rudder cloud logs <id> # worker status
237
+ rudder cloud onload [runId] # upload the current workspace (or one run)
238
+ rudder sail <name> # short alias for starting a cloud worker
570
239
  ```
571
240
 
572
- Hunk provides the multi-file review UI, sidebar navigation, mouse support,
573
- watch mode, inline agent notes, and untracked-file handling. Rudder forwards
574
- keyboard input into Hunk while the review pane is focused and keeps wheel or
575
- trackpad scrolling on Rudder's review scrollback. Press `v` or `Esc` to return
576
- to the live Claude Code or Codex worker.
241
+ Inside the dashboard, `/login` starts browser auth and `/cloud` opens a
242
+ confirmation pane: the default option onloads the current workspace (repo
243
+ snapshot plus selected auth/config) to a Fly worker; press Down to start a fresh
244
+ scratch worker instead. Completed cloud work returns through the same review and
245
+ merge path as local work.
577
246
 
578
- Press `R` to review all completed worktrees as one bundle. Rudder creates a new
579
- aggregate worktree, commits pending source-worktree changes, merges the
580
- completed agent branches into that aggregate branch, and starts a Codex
581
- `gpt-5.5` review-all agent with a `/review` prompt. If the pre-merge hits a
582
- conflict, that same review agent starts in the conflicted aggregate worktree and
583
- is instructed to resolve it before continuing.
584
-
585
- When the Codex review-all row is done, press `m` on that row to merge the
586
- reviewed aggregate branch back into the main checkout. Rudder then marks the
587
- source agent rows as merged too.
588
-
589
- Rudder writes a per-worktree `.hunk/config.toml` in Hunk's light mode and
590
- ignores that config through git's local info exclude, so it does not get merged.
591
- Set `RUDDER_HUNK_THEME=paper` or another Hunk theme name to override it.
592
-
593
- On dashboard startup, Rudder installs `hunkdiff@latest` automatically if neither
594
- `hunk` nor `hunkdiff` is available. If the install fails, or if you set
595
- `RUDDER_REVIEW_TOOL=git`, the review pane falls back to a live `git diff` view
596
- instead of downloading anything when you first press `v`.
597
-
598
- Rudder also injects Hunk review guidance into `RUDDER.md` and the worker prompt.
599
- Agents are told to run `hunk skill path`, load the Hunk review skill, and use
600
- `hunk session review --repo . --json` plus `hunk session comment ...` commands
601
- against the live review.
602
-
603
- ## One-Shot Commands
247
+ Cloud workers use Fly Machines by default. To use your own server over SSH:
604
248
 
605
249
  ```bash
606
- rudder "fix the failing tests"
607
- rudder claude "fix the auth redirect bug"
608
- rudder codex --model gpt-5.5 "refactor the parser"
609
- rudder run --worktree "try the alternate implementation"
250
+ rudder cloud byoc <ssh-host> # an entry from ~/.ssh/config, key auth + Docker
251
+ rudder cloud vm "task" # run on that host
252
+ rudder cloud runtime [fly|byoc]
610
253
  ```
611
254
 
612
- ## Run Management
255
+ The CLI points at the hosted control plane `https://rudder-cloud-control.fly.dev`.
256
+ Set `RUDDER_CLOUD_URL` to use your own deployment. Rudder Cloud login is separate
257
+ from Claude Code and Codex login; provider auth stays in the official CLIs.
258
+
259
+ ## Run management
613
260
 
614
261
  ```bash
615
262
  rudder status
@@ -619,30 +266,42 @@ rudder logs <runId> --follow
619
266
  rudder stop <runId>
620
267
  rudder delete <runId>
621
268
  rudder merge <runId>
269
+ rudder sync <runId>
622
270
  rudder cleanup
623
271
  ```
624
272
 
625
- ## Legacy Interfaces
273
+ ## Other interfaces
626
274
 
627
- The native dashboard is the default. Older interfaces are still available:
275
+ The native dashboard is the default. Older interfaces remain available:
628
276
 
629
277
  ```bash
630
- rudder tmux
631
- rudder tui
632
- rudder --no-native
278
+ rudder tmux # legacy tmux dashboard
279
+ rudder tui # Ink-based interactive TUI
280
+ rudder --no-native # skip the native binary
633
281
  ```
634
282
 
635
- ## Development
283
+ ## Troubleshooting
284
+
285
+ - Stale behavior after an upgrade: check `rudder --version`, reinstall with
286
+ `npm install -g @viraatdas/rudder@latest`, and restart any running Rudder
287
+ dashboards so no old `rudder-native` process lingers.
288
+ - Trackpad scrolling: confirm your terminal sends scroll events with
289
+ `rudder mouse-test parsed`. Set `RUDDER_WHEEL_SCROLL_ROWS=<n>` to change the
290
+ scroll step, or `RUDDER_MOUSE_DEBUG=1` to inspect routing.
291
+
292
+ ## Building from source
636
293
 
637
294
  ```bash
638
295
  git clone https://github.com/viraatdas/rudder.git
639
296
  cd rudder
640
- npm install
641
- cargo test --manifest-path native/Cargo.toml
642
- npm run check
643
- npm run build
297
+ ./setup.sh
644
298
  ```
645
299
 
300
+ `setup.sh` checks prerequisites (Node >=20, git, npm, Rust/`cargo`), installs
301
+ dependencies, builds (`tsc` + `cargo build --release`), typechecks, and smoke
302
+ tests the CLI. It is safe to re-run after pulling. For architecture and
303
+ implementation details, see [`AGENTS.md`](./AGENTS.md).
304
+
646
305
  ## License
647
306
 
648
307
  MIT