Boo: libghostty 기반의 현대적인 GNU Screen 스타일 멀티플렉서
Boo는 libghostty-vt 터미널 에뮬레이션 코어를 사용하여 GNU screen 스타일의 세션 모델을 구현하는 Zig로 작성된 터미널 멀티플렉서입니다. 모든 세션 출력을 Ghostty의 코어를 통해 파싱함으로써, Boo는 콘텐츠, 스타일, 커서 위치, 터미널 모드를 포함한 모든 세션의 정확한 내부 상태를 유지합니다. 이를 통해 재연결 시 터미널을 재구성(rehydrate)할 수 있으며, 자동화를 위한 기계 판독 가능한 화면 상태를 제공합니다.
libghostty를 이용한 현대적인 터미널 에뮬레이션
Boo는 GNU screen에서 사용되는 노후화된 터미널 에뮬레이터를 libghostty-vt로 대체합니다. 이러한 아키텍처의 변화는 세션의 저장된 상태가 현대적인 터미널이 실제로 표시하는 것과 일치하도록 보장하며, 오래된 멀티플렉서들이 자주 놓치는 SGR 스타일 및 기타 현대적인 터미널 시퀀스의 손상을 방지합니다.
주요 기술적 장점은 다음과 같습니다:
- 충실한 다시 그리기(Faithful Redraws): 이 도구는 재연결 시 내부 상태로부터 화면을 다시 재생하기 위해 Ghostty의
TerminalFormatter를 사용합니다. - 분리된 쿼리 처리(Detached Query Handling): 세션이 분리(detached)된 동안에도 데몬은 libghostty의 스트림 핸들러를 사용하여 터미널 쿼리(DSR, DA, XTWINOPS 등)에 응답하여, TUI가 방치된 상태에서 멈추는 것을 방지합니다.
- 일관된 상태(Consistent State): 데몬은 각 세션에 대해 지속적인
ghostty-vtTerminalStream을 소유하므로, 클라이언트가 연결되어 있는지 여부에 관계없이 화면 상태가 항상 최신 상태를 유지합니다.
AI 에이전트를 위한 자동화 프리미티브
Boo는 스크립트와 AI 에이전트가 TTY를 요구하지 않고 대화형 프로그램을 구동할 수 있도록 설계된 샌드박스입니다. Boo는 가공되지 않은 바이트 로그 대신 렌더링된 화면 상태를 기반으로 작동하는 일련의 자동화 명령을 제공합니다.
핵심 자동화 워크플로우
AI 에이전트와 스크립트는 일반적으로 다음 루프를 따릅니다:
- 생성:
boo new <name> -d -- <command>는 헤드리스 세션을 생성합니다. - 입력:
boo send <name> --text 'command' --enter는 리터럴 텍스트를 보내고 엔터를 입력합니다. - 동기화:
boo wait <name> --idle는 출력이 2초 동안 조용할 때까지 차단(block)하거나,boo wait <name> --text <text>는 특정 텍스트가 나타날 때까지 차단합니다. - 관찰:
boo peek <name> --scrollback은 렌더링된 화면을 읽습니다.--json을 사용하면 크기, 커서 위치, 제목을 포함한 기계 판독 가능한 메타데이터를 제공합니다. - 정리:
boo kill <name>는 세션을 종료합니다.
아키텍처 및 사용법
Boo는 클라이언트-데몬 아키텍처를 사용합니다. 클라이언트는 로컬 TTY를 raw mode로 설정하고 프레임화된 Unix-socket 프로토콜을 통해 세션 데몬과 통신합니다. 데몬은 PTY-연결된 자식 프로세스를 관리하고 그 출력을 ghostty-vt 터미널 코어에 공급합니다.
일반적인 명령
| 명령 | 동작 |
|---|---|
boo new |
기본 쉘을 실행하는 새로운 세션을 시작합니다 |
boo ui |
전체 화면 세션 관리자 사이드바를 엽니다 |
boo attach <name> |
지정된 이름의 세션에 재연결합니다 |
boo ls |
모든 활성 세션을 나열합니다 |
boo kill <name> |
특정 세션을 종료합니다 |
키 바인딩
Boo는 GNU screen의 기본 접두사 Ctrl-a를 따릅니다:
Ctrl-a d또는Ctrl-a C-d: 현재 세션에서 분리(detach)합니다.Ctrl-a l또는Ctrl-a C-l: 다시 그리기를 트리거합니다.Ctrl-a a: 리터럴Ctrl-a문자를 보냅니다.
현재 한계 및 주의사항
신생 프로젝트로서, Boo는 아직 GNU screen을 완전히 대체할 수 있는 도구는 아닙니다. 사용자는 다음과 같은 제약 사항을 인악해야 합니다:
- 단일 창 모델(Single Window Model): 각 세션은 정확히 하나의 창을 포함합니다. 내부적인 분할(split)이나 탭(tab)이 없습니다. 사용자는 작업당 하나의 세션을 실행하고
boo ui를 통해 관리할 것을 권장합니다. - 클라이언트 액세스: 한 번에 하나의 클라이언트만 세션에 연결될 수 있습니다. (screen의
-x플래그와 유사한) 공유 세션은 지원되지 않습니다. - 접두사 설정:
Ctrl-a접두사는 현재 하드코딩되어 있으며 설정할 수 없습니다. - 터미널 환경: 모든 세션은
TERM=xterm-256color로 실행됩니다.
커뮤니티 관점
이 프로젝트는 미니멀한 접근 방식과 libghostty의 사용으로 찬사를 받고 있지만, 일부 사용자는 세션당 여러 개의 창을 제공하지 않는 것이 기존 GNU screen에 비해 퇴보한 기능이라고 지고합니다. 다른 개발자들은 Cmux 및 zmx와 같이 libghostty를 기반으로 한 유사한 프로젝트들을 언급하며, 멀티플렉싱 도구를 위해 Ghostty의 터미널 코어를 사용하는 추세가 증가하고 있음을 나타냅니다.