Show HN: Boo – libghostty 기반 화면형 터미널 멀티플렉서

발행: (2026년 6월 12일 AM 05:52 GMT+9)
8 분 소요

출처: Hacker News

_ .-. | |__ ___ ___ (o o) | ’_ \ / _ \ / _ \ | O
| |) | () | () | \
|
./ _/ ___/ `~~~’

터미널을 괴롭히는 세션들.

Install | Usage | Automation | Architecture

ci release license discord

Zig 로 작성된, libghostty (libghostty‑vt) 위에 구축된 GNU screen 스타일 터미널 멀티플렉서입니다.
각 세션의 출력은 Ghostty의 터미널 에뮬레이션 코어를 통해 파싱되므로, boo는 모든 세션의 정확한 화면 상태(내용, 스타일, 커서, 스크롤백, 터미널 모드)를 항상 알고 있습니다. 이 상태는 세션에 붙을 때 터미널을 복원하고, 분리된 세션에 대한 터미널 질의에 답하며, 스크립트와 AI 에이전트가 인간이 보는 그대로 화면을 읽을 수 있게 해줍니다.

Features

  • 연결이 끊겨도 살아남는 세션: Ctrl‑A d 로 분리하고 boo attach 로 재접속.

  • 전체 화면 세션 관리자: boo ui 로 사이드바에 세션을 나열.

  • libghostty 터미널 상태를 기반으로 한 정확한 재그리기, SGR 스타일, 커서 위치, 스크롤 영역, 창 제목, 터미널 모드 포함.

  • 에이전트 친화적인 자동화 기본 명령: send, peek, wait, --json 출력 등, 모두 TTY 없이 사용 가능.

    demo.mp4

Install

Linux 와 macOS 용:

curl -fsSL https://raw.githubusercontent.com/coder/boo/main/install.sh | sh

사전 컴파일된 바이너리는 릴리즈 페이지에서 제공됩니다. BOO_VERSION 로 특정 릴리즈를 고정하고, BOO_INSTALL_DIR 로 설치 위치를 지정할 수 있습니다(기본값: 쓰기 가능한 경우 /usr/local/bin, 그 외 ~/.local/bin).

Usage

boo new                    # $SHELL 로 새 세션을 만들고 바로 붙음
boo new work               # 이름을 지정한 세션
boo new work -d -- make    # 분리된 상태로 명령 실행
boo ui                     # 전체 화면 UI 로 세션 관리 (alias: i)
boo ls                     # 세션 목록
boo attach work            # 재접속 (alias: at, a)
boo rename work api        # 세션 이름 변경
boo kill work              # 세션 종료
boo kill --all             # 모든 세션 종료

이름을 지정하지 않으면 boo new 가 현재 디렉터리 이름을 사용하고, 이미 사용 중이거나 사용할 수 없을 경우 프로세스 ID를 사용합니다. 전체 개요는 boo help 로, 플래그와 예시는 boo help <command> 로, 모든 도움말 페이지를 한 번에 보려면 boo help --all 을 사용하세요.

Key bindings (prefix Ctrl-a)

바인딩은 GNU screen 기본값을 따르며, C‑x 변형(C‑a C‑dC‑a d 와 동일)도 포함합니다.

KeysAction
C-a d, C-a C-d분리
C-a l, C-a C-l화면 재그리기
C-a a문자 그대로 C-a 전송

boo ui 는 세션 전환, 크기 조정, 생성, 삭제 등을 위한 추가 키바인딩을 제공합니다.

Automation

attach 를 제외한 모든 명령은 터미널 없이 동작하므로, boo는 인터랙티브 프로그램을 구동하는 스크립트와 AI 에이전트에게 자연스러운 샌드박스를 제공합니다. 전형적인 흐름:

boo new build -d -- bash               # 1. 헤드리스 세션
boo send build --text 'make' --enter   # 2. 명령 입력
boo wait build --idle                  # 3. 출력이 정착될 때까지 대기
boo peek build --scrollback            # 4. 화면 읽기
boo kill build                         # 5. 정리

상태 읽기: peek 은 원시 바이트 로그가 아니라 터미널 상태에서 재구성된 화면을 출력합니다. 정렬되고 완전히 재그려지며 안정적입니다. --scrollback 은 히스토리를 포함하고, --json 은 크기, 커서, 제목을 추가합니다.
대기: wait --text <텍스트> 은 화면에 해당 텍스트가 나타날 때까지 차단하고, wait --idle 은 출력이 2초 동안 조용해질 때까지 대기합니다. --timeout <시간> 은 영원히 멈추는 대신 지정된 시간(예: 500ms, 2s, 1m, 4h, 1d) 후 종료 코드 4 로 빠져나갑니다. 이제 sleep‑and‑poll 루프가 필요 없습니다.
입력 전송: send --text 은 문자 그대로 전송합니다. 이스케이프 처리, 자동 개행, 인용 레이어가 없습니다. --enter 로 엔터 전송, --key Enter,C-c,Up 로 제어키를 지정하며, stdin 모드는 바이너리 안전합니다.

  • 머신‑읽기 가능한 출력: ls --jsonpeek --json.

종료 코드: 0 성공, 1 오류, 2 사용법 오류, 3 해당 세션 없음, 4 대기 시간 초과.

전체 자동화 문서는 boo help automation 을 참고하세요.

Contributing

Zig 0.15.2 가 필요합니다.

zig build                       # zig-out/bin/boo 에 바이너리 생성
zig build test                  # 단위 테스트
zig build test-integration       # 실제 PTY 로 엔드‑투‑엔드 테스트
zig build test-all               # 전체 테스트

libghostty 의 의존성은 build.zig.zon 에 고정돼 자동으로 소스에서 가져와 빌드됩니다. Nix 를 사용한다면 nix develop 로 올바른 Zig 버전이 설정된 쉘을 열 수 있고, nix build./result/bin/boo 에 패키지를 빌드합니다.

Architecture

your terminal  boo client  session daemon
                                                         `- PTY + ghostty-vt Terminal

클라이언트는 TTY 를 raw 모드로 전환하고 프레임이 있는 Unix‑socket 프로토콜(src/protocol.zig) 로 바이트를 전송합니다.
데몬(세션 생성 시 포크됨)은 세션의 명령을 소유합니다: PTY 에 연결된 자식 프로세스로, 그 출력은 지속적인 ghostty‑vt TerminalStream(src/window.zig) 으로 전달됩니다.
붙어 있는 동안 출력은 바이트 단위로 그대로 터미널에 전달됩니다. 붙을 때 데몬은 터미널을 정리하고 libghostty 상태를 이용해 VT TerminalFormatter 로 화면을 재생합니다. 분리된 상태에서의 터미널 질의(DSR, DA, XTWINOPS 등)는 libghostty 스트림 핸들러가 답하고, 붙어 있는 동안은 실제 터미널이 답해 이중 응답을 방지합니다.

Caveats

[]

0 조회
Back to Blog

관련 글

더 보기 »