v0.4.0-alpha — press n with only iTerm2
What's new
If iTerm2 is your whole setup, n works now.
v0.3.0-alpha gave iTerm2 loops the action keys — approve, resume, inject, stop, kill. But you still couldn't start one. Every spawn path went through a multiplexer, and fleetops only knows orca, tmux and cmux. So an iTerm2 user had a cockpit that could watch and steer loops it had no way to create.
Press n and you get a loop in a fresh iTerm2 window. No tmux, no orca, no cmux.
Worktrees are git's job again. Choosing [w] used to require orca, because worktree creation went through orca worktree create. fleetops now runs git worktree add itself — so [w] works on any backend, including none.
It also fetches before branching. Picking origin/main only settles which branch; if your local ref is a week old you get a week-old base, which is the same stale-base bug one layer down. If the fetch fails — offline, expired token — the spawn still happens and says the base may be stale rather than pretending otherwise.
You can tell it what to run. Optional ~/.fleetops/settings.json:
{ "spawn": { "command": ["claude", "--agent", "team", "--dangerously-skip-permissions"] } }An argv array, not a command string — the wrapper most people want to point at is a shell function, which no spawned window has. Write the flags out instead. --demo ignores this entirely, and so does the headless re-drive, which also serves loops you started yourself and has no business inheriting your spawn preferences.
Also fixed
- A window that isn't running claude is no longer reported as a spawned loop. A bare shell satisfied every check the spawn path made — real window, real tty, delivery succeeded — so fleetops now asks the OS whether claude is actually on that tty, and refuses if it can't tell.
- Refusals stopped naming backends you don't have. Pressing
kon an unreachable loop used to answer "no orca/tmux/cmux" on machines with none of them installed, which reads as "go install one". It now says what would actually help, and no longer tells you to install hooks for a loop whose process already exited. - A timed-out spawn no longer prints as a failure. If the window request times out, iTerm2 may well have made the window anyway — so it says the outcome is unknown and tells you to go close the stray one, instead of inviting you to press
nagain and make a second.
Known limits
- Spawning takes focus. iTerm2 has no non-activating window creation, and re-selecting the cockpit window afterwards was measured and does not bring it back. Creating a loop will move you to it.
- Spawn needs the cockpit to be running inside iTerm2. Launching fleetops from Terminal.app on a machine that also has iTerm2 reports unavailable rather than guessing.
- iTerm2 reassigns session ids across a restart. A loop that survived an iTerm2 restart keeps running, but in-place actuation stops reaching it until the loop is restarted — it falls back to the headless re-drive for
r/iand refusesk/p/a. It refuses rather than typing into the wrong window, but it does not currently tell you why. Being tracked. - A rejected
spawn.commandfalls back toclaudesilently.
Reasoning, measurements and what remains unverified are in docs/adr-vendor-independent-actuation.md.