Swift · AppKit · libghostty
AIエージェントを、
並べて走らせる。
Claude Code も Codex も、git worktree ごとに何本でも。崩れない、待たせない、ネイティブな macOS ターミナル。
❯ サイドバーの配色をブランドに合わせて整えて ⏺ 配色トークンを確認します。 ⏺ Read(Sources/VitermApp/UI/SidebarViewController.swift) └ 512 lines ⏺ Edit(SidebarViewController.swift) └ +18 −6 ⏺ ブランドのグラデーションに寄せました。ビルドして確認します。 ✳ Forging… (1m 42s · ↓ 3.1k tokens · esc to interrupt)
Not just tabs
タブは、並列じゃない。切り替えだ。
10 個のタブを開いても、いま誰が入力待ちで、誰が動いていて、どれが終わったのかは、1つずつ開いて確かめるしかない。viterm のタブには状態が宿り、サイドバーが全体を一望させる。
- —アクティブな1枚しか見えない。他は裏
- —どのタブが入力待ちか、開くまで分からない
- —worktree は自分で cd して作って名前をつける
- —タブが増えるほど、頭の中で状態を管理する
- ✓全セッションの busy / 待ち / idle がサイドバーの worktree 行に常時
- ✓タブにも状態ドット。切り替える前に、分かる
- ✓入力待ちは通知が飛び、⌘⇧U で一発ジャンプ
- ✓ブランチから worktree を作って即エージェント起動
Features
並列で走らせるための、四つの土台。
1つの worktree に、何本でも。
同じブランチで Claude に実装させながら、隣で Codex にテストを書かせる。素のシェルも一緒に。⌘T でセッションはタブに並び、⌘1〜9 で行き来する。worktree を離れて戻っても、開いていたタブに帰ってくる。
崩れない。ネイティブだから。
ターミナル描画は Ghostty と同じエンジン(libghostty)がネイティブに担当する。ウィンドウをどうリサイズしても、vim も Claude Code も崩れない。TUI in TUI をやめた構造の勝利。起動は一瞬、Electron じゃない。
┌─ NORMAL ──────────────┐
│ 1 import AppKit │
│ 2 final class View { │
│ 3 override func │
│ 4 layout() { ... │
└───────────────────────┘
✓ リサイズしても行がずれない
作成先は、あなたの流儀で。
worktree をどこに置くかはテンプレートで自由に決められる。~/worktrees/{project}/{branch} でも、リポジトリ隣の ../{branch} でも。作った瞬間にエージェントを起動し、終わったら main に merge か rebase して、サイドバーからそのまま畳む。
入力待ちを、見逃さない。
各セッションは busy / 入力待ち / idle をタブと worktree 行のドットで示す。開いていない worktree の状態も、サイドバーに集約されて常に見える。エージェントが確認を求めたら macOS 通知が飛び、⌘⇧U で最新の入力待ちへ一発でジャンプ。
Keyboard-first
手をホームポジションから離さない。
worktree もセッションも通知も、⌘K のコマンドパレットから全部呼べる。マウスは要らない。