
2026/06/12 5:52
Show HN:Boo – libghostty を採用した画面風ターミナルマルチプレクサ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Boo は、Ghostty のエミュレーションコアを使用して画面状態(コンテンツ、スタイル、カーソル位置、スクロールバック、モードなど)を正確に追跡する、Zig で書かれた強力かつ現代的なターミナルマルチプレクサです。
Ctrl-A dによるデタッチと boo attachによるリアタッチを通じて堅牢なセッション管理をサポートし、切断後もセッションが生存するようにしています。生の TTY/セッションとセッションデモンを分離した専用クライアント - デモン構成により、send、peek、waitといった自動化プリミティブを用いた非 TTY 制御が可能になります。
GNU Screen の慣習(例:
Ctrl-aプレフィックス)に沿いつつ、Boo はフルスクリーン UI(boo ui、エイリアス i および at/a)および高度な自動化機能を追加しています。自動化機能には以下が含まれます:
: 文字列入力 (send
)、名前付き制御キー (--text
)、バイナリ安全な stdin モードをサポートします。--key Enter,C-c
: 生ログではなくターミナル状態からレンダリングされた出力を再構築します;peek
フラグで構造化データ(カーソル、サイズ、タイトル)を提供します。--json
: 特定の手書きテキスト、アイドル時間(デフォルト 2 秒)、またはカスタムタイムアウト(500ms〜1 日)にブロックし、タイムアウト時にはコード 4 で終了します。wait
一般的なセッションコマンド(
boo new、boo ls、boo rename、boo kill、boo kill --all)がセッションのライフサイクルを管理します。終了コードは以下の通りです:0(成功)、1(エラー)、2(使用法エラー)、3(セッションなし)、4(wait タイムアウト)。
現在の制限事項には、セッションあたり 1 つのクライアントのみのアタッチ(
-x共有なし)、分割ウィンドウまたはタブの欠如、固定された Ctrl-aプレフィックス、TERM=xterm-256colorでのセッション実行、およびビルド要件として Zig 0.15.2 の必要性が含まれます。全体として、Boo は高忠実度な状態保存を含むインテリジェントでスクリプト可能なワークフローオーケストレーションを提供します。本文
libghostty 기반의 터미널 멀티플렉서 "boo" 소개: 설치, 사용법, 자동화 및 아키텍처
libghostty(libghostty-vt)를 기반으로 Zig 언어로 작성된 GNU screen 스타일의 터미널 멀티플렉서입니다.
Ghostty 의 터미널 에뮬레이션 코어가 모든 세션의 출력을 분석하므로, boo 는 항상 각 세션의 정확한 화면 상태 (콘텐츠, 스타일, 커서 위치, 스크롤 백, 터미널 모드 등) 를 완전히 파악합니다.
이 상태 정보는 재연결 시 터미널 복원, 탈출된 세션에 대한 터미널 쿼리 답변, 스크립트나 AI 에이전트를 통한 실제 화면과 동일한 가시성 확보를 위해 사용됩니다.
기능 (Features)
- 斷線 후에도 지속되는 세션:
로 탈출하고,Ctrl-A d
로 재연결 가능.boo attach - 풀스크린 화면 관리 도구:
명령어로 사이드바 형태의 세션 목록을 확인 가능.boo ui - libghostty 기반의 정확한 재생성: SGR 스타일, 커서 위치, 스크롤 영역, 윈도우 제목, 터미널 모드까지 포함하여 정확히 복구됨.
- 에이전트 친화적 자동화 원시 기능:
,send
,peek
등의 명령어 제공 및wait
출력 지원 (TTY 필요 없음).--json
<!-- 데모 영상 --> 
설치 (Installation)
Linux 와 macOS 대상:
curl -fsSL https://raw.githubusercontent.com/coder/boo/main/install.sh | sh
- 공식 릴리스 페이지에 사전 빌드된 바이너리가 제공됨.
- 특정 버전을 고정하려면 환경 변수
설정.**BOO_VERSION** - 설치 경로를 변경하려면 (기본값:
또는 사용 가능시/usr/local/bin
) 환경 변수~/.local/bin
설정.**BOO_INSTALL_DIR**
사용법 (Usage)
| 명령어 | 설명 | 비고 |
|---|---|---|
| 현재 SHELL 에서 새 세션 생성 후 즉시 연결 | |
| 이름이 "work"인 세션 생성 | |
| "make" 명령 실행용 탈출 세션 생성 | : 배경 실행 (데몬화) |
| 풀스크린 UI 로 세션 관리 (전환, 크기 변경 등) | エイリア스: |
| 세션 목록 표시 | |
| "work" 세션으로 재연결 | エイリア스: , |
| 세션 이름 변경 ("work" → "api") | |
| "work" 세션 종료 | |
| 모든 세션 종료 |
- 무명 세션: 현재 디렉토리 이름이 세션명으로 설정됨. 이미 사용 중인 경우 프로세스 ID(PID) 가 사용됨.
- 헬프 명령어:
- 전체 개요:
**boo help** - 특정 명령어 상세:
**boo help <command>** - 모든 헬프 페이지 인쇄:
**boo help --all**
- 전체 개요:
키 바인딩 (Key Bindings)
기본키:
(GNU screen 스타일, C-x 변종도 동일하게 동작).Ctrl-a
| 키 연동 | 동작 |
|---|---|
, | 탈출 |
, | 재생성 (Redraw) |
| 리터럴인 키 입력 |
boo ui 명령어에서는 세션 전환, 크기 변경, 생성, 종료를 위한 추가 키 바인딩도 제공됨.
자동화 (Automation)
attach 를 제외한 모든 기능은 **단말기 없이 (비인터랙티브 환경)**에서도 동작하므로, 스크립트나 AI 에이전트를 통한 대역 프로그램 제어를 위한 샌드박스로 적합합니다.
표준 처리 흐름
1. boo new build -d -- bash # TTY 를 갖지 않은 세션 생성 2. boo send build --text 'make' --enter # 명령어 입력 3. boo wait build --idle # 출력이 안정화될 때까지 대기 4. boo peek build --scrollback # 화면 조회 (히스토리 포함) 5. boo kill build # 리소스 해제 및 종료
주요 자동화 옵션 상세
1. 상태 읽기 (peek
)
peek
명령어는 생로그가 아닌, 터미널 상태로 재구성된 렌더링 화면 내용을 표시합니다.**peek**- 장점: 순차적으로 완전히 재생성되므로 안정된 출력을 보장합니다.
- 옵션:
: 히스토리 (스크롤 백) 포함하여 표시.**--scrollback**
: 크기, 커서 위치, 윈도우 제목 등을 JSON 형식으로 추가 출력.**--json**
2. 대기 처리 (wait
)
wait
: 화면에 특정 텍스트가 포함될 때까지 블록 (대기).**wait --text <text>**
: 출력이 멈춘 후 2 초를 경과할 때까지 대기.**wait --idle**
:**--timeout <dur>**- 타임아웃 미설정 시 무한 대기 대신 오류 코드 4 반환.
- 허용된 지속시간 예:
,500ms
,2s
,1m
,4h
.1d - "수면 및 폴링" 루프 불필요 (버거).
3. 입력 전송 (send
)
send
: 리터럴 형태로 처리됨 (에스케이프 없음, 묵시적 줄바꿈 없음, quote 층 없이).**send --text**- 옵션:
: 엔터 키 입력 트리거.**--enter**
: 컨트롤 키, 화살표 키 등 특정 키 입력 가능.**--key Enter,C-c,Up**- 표준 입력 (stdin) 모드: 바이너리 데이터 안전성 보장.
4. 기계 가독 출력 (Machine Readable Output)
,**ls --json**
명령어 사용.**peek --json**
5. 종료 상태 코드
| 코드 | 의미 |
|---|---|
| 0 | 성공 |
| 1 | 오류 발생 |
| 2 | 사용법 오류 |
| 3 | 세션 없음 |
| 4 | 대기 처리 타임아웃 |
상세 내용은
boo help automation 참조.
왜 boo 였는가? (Why Boo?)
GNU screen 과 유사한 아키텍처를 가지지만, 내장 터미널 에뮬레이터 대신 libghostty-vt 를 사용합니다.
- 계절 문제 해결: GNU screen 의 에뮬레이터는 수십 년간 구식이 되어 현대 프로세스의 정보를 따라가지 못합니다. (해석 불가한 부분 드롭, 재생성 시 파손)
- 정확한 상태 유지:
를 통해 저장된 상태가 실제 터미널이 표시하는 내용과 일치하게 함. 탈출 중에도 TUI 가 의도치 않게 멈추지 않도록 터미널 쿼리에 즉시 응답 가능.libghostty-vt - 스크립팅 강점:
옵션 같은 복잡한 처리 대신-X
,send
,peek --json
등을 활용하여 하드카피 파일 생성이나 수면 루프를 피할 수 있음.wait --text/--idle
참고:
도 훌륭한 도구이지만, 해결하려는 문제가 다릅니다.tmux는boo의 모델 (세션 단위, 프리픽스 키) 을 고집하며, 각 작업마다 1 개의 세션을 열고screen로 효율적으로 관리합니다.boo ui
아키텍처 (Architecture)
[Your Terminal] <--(Raw TTY)--> [boo Client] <--(Unix Socket)---> [Session Daemon] | [PTY + ghostty-vt Terminal]
- 클라이언트: 사용자의 TTY 를 원시 모드로 설정하고, 프레임화된 유니크 소켓 프로토콜 (
) 을 통해 바이트 전송.src/protocol.zig - 데몬 (세션 생성 시 포크): 세션 내 명령어 관리 및 PTY 와 연결된 자식 프로세스 역할. 출력을 영구적인
(ghostty-vt TerminalStream
) 에 공급.src/window.zig - 연결 중: 출력은 터미널에서 바이트 단위 그대로 전달됨.
- 재연결 시: 데몬이 사용자의 터미널을 보호 (safe mode) 상태로 전환하고, libghostty 의 상태 정보를 사용하여
로 화면 재생성.VT TerminalFormatter - 탈출 중 쿼리: DSR, DA, XTWINOPS 등 arriving 터미널 쿼리는 libghostty 스트림 핸들러가 즉시 답변하여 중복 응답 방지 (연결 중에는 실제 터미널이 답변함).
주의사항 (Caveats)
이 프로젝트는 신규이며 GNU screen 의 완벽한 대체품은 아닙니다.
- 클라이언트 연결: 재연결 시에도 각 세션당 별도의 클라이언트를 연결해야 함 (
옵션 공유 지원 안됨).-x - 창 제한: 세션당 1 개 창만 가능. 세션 내 스플릿 (탭 기능) 은 없음. 각 작업에 1 개의 세션을 사용하고
로 전환하세요.boo ui - 키보드 시뮬레이션:
프릭스 설정 불가. 붙여넣은 바이트열 내C-a
은 프릭스로 해석됨 (GNU screen 과 동일). 하지만0x01
에서의 빈클린 페스트 기능으로 이 문제를 회피 가능.boo ui - 터미널 환경: 세션은
환경 하에서 실행됨.**TERM=xterm-256color**
기여 및 지원 (Contributing & Support)
- 요구사항: Zig 0.15.2 이상 버전 필요.
- 빌드 명령어:
zig build # 바이너리 생성 (출력: zig-out/bin/boo) zig build test # 유닛 테스트 실행 zig build test-integration # 실제 PTY 를 이용한 엔드투엔드 테스트 zig build test-all # 모든 테스트 실행 - Nix 환경:
로 적절한 Zig 버전 쉘 열기,nix develop
로 패키지 빌드 (nix build
)../result/bin/boo
라이선스: MIT 라이선스 (Ghostty 도 MIT 라이선스). 질문, 버그 리포트, 신기능 제안 등은 Issue 등록해 주세요.