feat(aterm): open agent sessions in kitty instead of Alacritty #1266

Merged
coilyco-ops merged 2 commits from aos/claude/qu74 into main 2026-08-26 03:46:34 +00:00
Member

Swaps aterm's window from Alacritty to kitty. Closes the terminal question in #1264 and unblocks #1261.

Why kitty, and why not Ghostty

Decided on process model rather than features, in #1264. Both terminals were installed and tested against aterm's real launch plan, with a probe inside each window querying OSC 11 and OSC 12 so branding was verified end to end instead of trusted from an accepted flag.

Ghostty's own help says CLI launch is unsupported on macOS. Spawning it exactly the way spawnWindow does, detached with Setsid, left four live processes with windows open that never ran their command, no stderr and nothing to report. Its child also parents to /usr/bin/login rather than the terminal, so aterm cannot observe a startup failure at all, which kills both properties docs/aterm.md sells.

kitty launches directly on macOS, keeps the child parented to the terminal, and takes -o name=value in Alacritty's own flag shape.

What changed in the launcher

  • --working-directory becomes --directory, and the program moves to the trailing arguments since kitty has no -e separator
  • window.dynamic_title=false is gone: kitty's --title permanently fixes the OS window title against the child, which is the job that override existed to do
  • the four brand colors move to background, cursor, selection_background, selection_foreground
  • --alacritty-bin becomes --terminal-bin, reading ATERM_TERMINAL_BIN or KITTY_BIN

What the swap exposed

Nothing asserted the brand survived into the terminal's arguments. A flag-dialect change could have dropped every color and still passed the entire suite. Both a new unit test and the release gate now check it.

Verification

  • go test ./... green in aterm and aos-cli
  • pre-commit run --all-files green
  • end to end on this host: aterm spawns kitty, kitty runs the _session stage, and the probe inside the window reports background #211b28 and cursor #e583f7, matching the composed frontend brand
  • session stage exit semantics re-checked: clean child 0, child exiting 3 gives 3 and holds, missing binary gives 1 and holds naming the cause

Windows

kitty ships no Windows build, so alacritty/alacritty.toml is retained as the Windows baseline. Pointing --terminal-bin at Alacritty there needs its own flag dialect, which is not built. That is the open decision recorded in #1264: either Windows aterm is aspirational and gets dropped, or a two-terminal adapter comes back scoped to exactly two.

Refs #1245, #1261, #1264

Swaps `aterm`'s window from Alacritty to kitty. Closes the terminal question in #1264 and unblocks #1261. ## Why kitty, and why not Ghostty Decided on process model rather than features, in #1264. Both terminals were installed and tested against aterm's real launch plan, with a probe inside each window querying OSC 11 and OSC 12 so branding was verified end to end instead of trusted from an accepted flag. Ghostty's own help says CLI launch is unsupported on macOS. Spawning it exactly the way `spawnWindow` does, detached with `Setsid`, left **four live processes with windows open that never ran their command**, no stderr and nothing to report. Its child also parents to `/usr/bin/login` rather than the terminal, so aterm cannot observe a startup failure at all, which kills both properties `docs/aterm.md` sells. kitty launches directly on macOS, keeps the child parented to the terminal, and takes `-o name=value` in Alacritty's own flag shape. ## What changed in the launcher - `--working-directory` becomes `--directory`, and the program moves to the trailing arguments since kitty has no `-e` separator - `window.dynamic_title=false` is gone: kitty's `--title` permanently fixes the OS window title against the child, which is the job that override existed to do - the four brand colors move to `background`, `cursor`, `selection_background`, `selection_foreground` - `--alacritty-bin` becomes `--terminal-bin`, reading `ATERM_TERMINAL_BIN` or `KITTY_BIN` ## What the swap exposed Nothing asserted the brand survived into the terminal's arguments. A flag-dialect change could have dropped every color and still passed the entire suite. Both a new unit test and the release gate now check it. ## Verification - `go test ./...` green in `aterm` and `aos-cli` - `pre-commit run --all-files` green - end to end on this host: `aterm` spawns kitty, kitty runs the `_session` stage, and the probe inside the window reports `background #211b28` and `cursor #e583f7`, matching the composed frontend brand - session stage exit semantics re-checked: clean child 0, child exiting 3 gives 3 and holds, missing binary gives 1 and holds naming the cause ## Windows kitty ships no Windows build, so `alacritty/alacritty.toml` is retained as the Windows baseline. Pointing `--terminal-bin` at Alacritty there needs its own flag dialect, which is **not built**. That is the open decision recorded in #1264: either Windows aterm is aspirational and gets dropped, or a two-terminal adapter comes back scoped to exactly two. Refs #1245, #1261, #1264
feat(aterm): open agent sessions in kitty instead of Alacritty
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 6s
ci / ward-doctor (pull_request) Successful in 7s
ci / aos-cli-tests (pull_request) Successful in 24s
ci / gate (pull_request) Successful in 48s
eb8bae1333
Alacritty has no background image and no graphics protocol, which blocked
the identity imagery in #1261. A measured showdown against Ghostty and
kitty (#1264) picked kitty, decided on process model rather than features:
Ghostty documents that CLI launch is unsupported on macOS, and spawning it
the way spawnWindow does left four live processes that never ran their
command. kitty launches directly, keeps the child parented to the terminal,
and takes -o name=value in Alacritty's own flag shape.

kitty --title permanently fixes the OS window title against the child, so
the separate dynamic_title=false override is gone, and the program moves to
the trailing arguments since kitty has no -e separator.

Also lands what the swap exposed: nothing asserted the brand survived into
the terminal's arguments, so a flag-dialect change could have dropped every
color and still passed the suite. Both the unit test and the release gate
now check it.

kitty ships no Windows build, so alacritty/alacritty.toml is retained as the
Windows baseline. Pointing --terminal-bin at it there needs its own flag
dialect, which is not built and is tracked in #1264.

Refs #1245, #1261, #1264

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: frontend
Merge remote-tracking branch 'origin/main' into aos/claude/qu74
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 7s
ci / ward-doctor (pull_request) Successful in 7s
ci / aos-cli-tests (pull_request) Successful in 31s
ci / gate (pull_request) Successful in 56s
b1e368c2c1
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: frontend

# Conflicts:
#	docs/FEATURES.md
#	docs/aterm.md
#	docs/native-session-start.md
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os!1266
No description provided.