Skip to content

v0.4.0-alpha — press n with only iTerm2

Choose a tag to compare

@jitokim jitokim released this 19 Jul 06:03
db88937

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 k on 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 n again 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/i and refuses k/p/a. It refuses rather than typing into the wrong window, but it does not currently tell you why. Being tracked.
  • A rejected spawn.command falls back to claude silently.

Reasoning, measurements and what remains unverified are in docs/adr-vendor-independent-actuation.md.