이 저장소가 대체 무엇인가.
herdr는 터미널 멀티플렉서(tmux/zellij처럼 창 여러 개를 유지하는 프로그램)인데, 여기서 끝나지 않는다. 각 창(pane)에서 실행 중인 AI 코딩 에이전트(Claude Code, Codex, Amp 등 16종)의 상태를 자동으로 탐지해 사이드바에 표시한다. "A 에이전트가 권한 요청 중이라 막혔다", "B 에이전트는 열심히 작업 중", "C 에이전트는 완료됐는데 아직 확인 안 했다" — 한 화면에서 에이전트 함대 전체를 조망할 수 있다.
tmux를 써본 적 있다면: tmux + 에이전트 상태 감지 + 마우스 클릭 네이티브 + JSON Socket API라고 이해하면 된다. 에이전트가 herdr의 API를 통해 직접 탭·창을 만들고, 다른 창의 출력을 읽고, 하위 에이전트를 생성하는 것도 가능하다.
tmux·zellij·GUI 에이전트 러너 대비 장점 · 트렌딩 이유.
AI 코딩 에이전트를 쓰는 개발자들이 폭발적으로 늘면서, 에이전트를 동시에 여러 개 돌리는 "에이전트 함대" 워크플로우가 일반화됐다. 기존 tmux는 각 창이 지금 뭐하는지 전혀 모른다 — 개발자가 일일이 창을 전환해 상태를 확인해야 한다. GUI 기반 에이전트 관리자(Conductor, cmux 등)는 상태를 보여주지만, 앱 래퍼 안에 터미널을 흉내 낸 것이라 풀스크린 TUI 에이전트가 제대로 렌더링되지 않고 macOS 전용이 많다.
| 기능 | tmux | zellij | GUI 관리자 (Conductor 등) | herdr |
|---|---|---|---|---|
| 세션 유지 (detach/reattach) | ✓ | ✓ | — | ✓ |
| SSH에서 동작 | ✓ | ✓ | — | ✓ |
| 에이전트 상태 감지 | — | — | ✓ | ✓ |
| 진짜 터미널 뷰 (TUI 에이전트 호환) | ✓ | ✓ | — | ✓ |
| 마우스 네이티브 | 어려움 | 제한적 | ✓ | ✓ |
| 단일 경량 바이너리 | ✓ | ✓ | — | ✓ |
| 에이전트가 API로 제어 가능 | ? | ? | ? | ✓ |
| 크로스 플랫폼 (Linux/macOS/Windows) | ✓ | ✓ | Mac 전용 多 | ✓ (Win Beta) |
tmux는 에이전트를 모른다. GUI 관리자는 에이전트를 알지만 터미널을 흉내낸다. herdr는 둘 다 잡았다. 더 나아가, 에이전트 자체가 herdr의 유닉스 소켓 API를 호출해 탭을 열고, 다른 에이전트를 생성하고, 출력을 읽을 수 있다 — 에이전트가 오케스트레이터 역할을 할 수 있다.
Claude Code 4개, Codex 2개, Amp 1개를 동시에 돌리고 있다. tmux였다면 7개 창을 일일이 전환해야 어떤 게 막혔는지 알 수 있다. herdr 사이드바에는 "🔴 Claude-3 (권한 요청 대기)", "🟡 Codex-1 (작업 중)", "🔵 Amp-1 (완료 — 미확인)" 같은 상태가 한눈에 보인다.
노트북을 닫아도 백그라운드 서버가 에이전트를 살려두고, 나중에 폰으로 SSH 접속하면 그 상태 그대로 재접속된다.
Rust 크레이트 + 의존성 + 인프라 계층 전체.
| 크레이트 | 역할 | 비고 |
|---|---|---|
ratatui 0.30 | TUI 렌더링 프레임워크 — 레이아웃·위젯·색상 | unstable-rendered-line-info 기능 활성화 |
crossterm 0.29 | 크로스 플랫폼 터미널 입출력 — 키보드·마우스 이벤트, 화면 모드 전환 | Windows/Unix 통합 추상화 |
portable-pty 0.9.0 | PTY(pseudo-terminal) 생성·관리 — 각 pane에 실제 터미널 제공 | 벤더 패치 적용 (vendor/portable-pty) |
tokio 1 | 비동기 런타임 — PTY 읽기/쓰기, 소켓 통신, 이벤트 루프 | rt-multi-thread + macros + sync + time |
interprocess 2.4.2 | Unix 도메인 소켓 / Named Pipe — 서버-클라이언트 IPC | Windows Named Pipe도 동일 API |
serde + serde_json | 직렬화 — 설정 파싱, 소켓 API JSON 메시지, 에이전트 매니페스트 | derive 기능 활성화 |
bincode 2 | 바이너리 직렬화 — 서버↔클라이언트 wire protocol 페이로드 | serde 연동 |
regex 1 | 에이전트 상태 감지 — 터미널 출력에서 패턴 매칭 | TOML 매니페스트의 regex/line_regex 규칙 |
toml 0.8 | 설정 파일 파싱 (~/.config/herdr/config.toml) | 에이전트 매니페스트도 TOML |
png 0.17 | PNG 이미지 처리 — Kitty 그래픽 프로토콜 이미지 렌더링 | 터미널 내 이미지 표시 |
sha2 0.10 | SHA-256 체크섬 — 바이너리 업데이트 검증 | 설치 스크립트와 연동 |
schemars 1.2.1 | JSON Schema 자동 생성 — Socket API 스키마 문서화 | derive 기능 |
| 라이브러리 | 역할 | 출처 |
|---|---|---|
libghostty-vt 1.3.2 | VT(가상 터미널) 파서·에뮬레이터 — 터미널 출력 해석, 상태 스냅샷 생성 | Ghostty 터미널 에뮬레이터에서 추출. Zig로 빌드 (build.zig), Rust에서 C FFI로 호출 |
portable-pty (패치) | PTY 백엔드 — Unix openpty/posix_openpt, Windows ConPTY | wez/wezterm의 portable-pty에 herdr 전용 패치 적용 |
| 도구 | 역할 |
|---|---|
| Rust / Cargo | 주 언어 및 빌드 시스템 |
| Zig 0.15 | libghostty-vt 벤더 라이브러리 크로스 컴파일 (x86_64/aarch64 × Linux/macOS/Windows) |
| just | 태스크 러너 — test/check/build/lint/windows-lint 등 레시피 관리 |
| cargo-nextest | 병렬 테스트 러너 (cargo test 대체) |
| Nix / flake.nix | 재현 가능한 개발 환경 및 패키지 |
| Bun | 웹사이트(website/) 빌드 + 플러그인 마켓플레이스 Worker 테스트 |
| 채널 | 방법 |
|---|---|
| 공식 설치 스크립트 | curl -fsSL https://herdr.dev/install.sh | sh |
| Homebrew | brew install herdr |
| mise | mise use -g herdr |
| Nix | nix run github:ogulcancelik/herdr |
| Windows (Beta) | PowerShell 설치 스크립트 |
| GitHub Releases | Linux/macOS 바이너리 직접 다운로드 |
TUI / PTY / 멀티플렉싱 구조도 + 핵심 설계 패턴.
AppState는 순수 데이터 구조체 — PTY도 없고, async도 없고, OS 호출도 없다. 모든 워크스페이스·탭·페인 레이아웃 상태가 여기 있다. PaneRuntime은 실제 PTY 프로세스, 읽기/쓰기 태스크를 담는다. 이 분리 덕분에 AppState::test_new()로 PTY 없이 단위 테스트가 가능하다. AGENTS.md가 "State is separated from runtime"을 첫 번째 원칙으로 명시한다.
각 에이전트마다 src/detect/manifests/claude.toml 같은 규칙 파일이 있다. 규칙은 contains(문자열 포함), regex(정규식), line_regex(줄 단위 정규식)의 AND/OR/NOT 게이트로 구성된다. 감지 엔진은 PTY 버퍼의 스냅샷을 읽어 이 규칙을 평가하고 blocked / working / done / idle을 결정한다. 매니페스트는 핫리로드가 가능해 재시작 없이 업데이트된다.
# src/detect/manifests/claude.toml 일부
id = "claude"
version = "2026.06.10.3"
[[rules]]
id = "live_blocked_form"
state = "blocked"
priority = 980
region = "after_last_horizontal_rule"
visible_blocker = true
contains = ["enter to select", "esc to cancel"] # AND 조건
any = [
{ contains = ["tab/arrow keys to navigate"] },
] # OR 조건
herdr를 실행하면 자동으로 백그라운드 서버 데몬을 띄우고(없으면), TUI 클라이언트로 붙는다 (src/server/autodetect.rs). 서버는 Unix 소켓에서 대기하며 PTY 상태를 유지한다. 클라이언트는 bincode로 직렬화된 wire protocol(src/protocol/wire.rs, PROTOCOL_VERSION=15)로 서버와 통신한다. 클라이언트가 끊어져도 서버는 계속 실행 중이라 에이전트가 살아있다. --remote 플래그로 원격 서버에도 동일 프로토콜로 붙는다.
AGENTS.md 두 번째 원칙: "Render is pure." render()는 &AppState만 받고, 절대 상태를 변경하지 않는다. ratatui의 Frame에 그리기만 한다. 모든 기하학(geometry) 계산과 변이(mutation)는 compute_view()가 사전에 처리한다. 이 덕분에 렌더링 버그를 상태 변경과 분리해 추적할 수 있다.
21개 src 서브디렉토리 + 기타 디렉토리 분석.
vendor/)에 포함시키는 방식. herdr는 libghostty-vt와 portable-pty를 벤더링하고, 자체 패치를 적용한다. 이렇게 하면 인터넷 연결 없이 빌드 가능하고, 업스트림 변경으로 인한 빌드 깨짐을 방지할 수 있다.이 저장소에서 무엇을 배울 수 있는가.
herdr는 ratatui의 실전 대규모 활용 사례다. 단순한 Hello World가 아니라, 마우스 네이티브 드래그·클릭, 사이드바 스크롤, 모달 오버레이, 탭 바, 스플릿 페인 등 복잡한 레이아웃을 처리한다. src/ui/ 14개 파일을 보면 실제 프로덕션 수준 TUI 설계를 배울 수 있다.
배울 것: Layout::vertical/horizontal, Constraint, Rect 기반 레이아웃 계산, Frame 렌더링 패턴, Paragraph/List/Scrollbar 위젯 활용, 팔레트 기반 테마 시스템 (src/app/state.rs의 Palette 구조체).
각 페인에 진짜 터미널을 제공하는 핵심 기술. portable-pty로 PTY master/slave 쌍을 생성하고, slave에 에이전트 프로세스를 붙이고, master에서 출력을 읽는다. src/pty/actor.rs의 PtyIoActor는 tokio 비동기 태스크와 OS 블로킹 PTY 읽기를 연결하는 패턴을 보여준다.
배울 것: PTY 생성, 프로세스 스폰 with PTY, 비동기와 블로킹 IO 브리징 패턴, Windows ConPTY vs Unix openpty 차이.
에이전트의 터미널 출력에서 상태를 감지하려면 ANSI 이스케이프 시퀀스를 해석해야 한다. herdr는 Ghostty의 VT 파서를 Zig로 빌드해 C FFI로 호출한다. build.rs에서 Cargo 빌드 스크립트가 zig build를 실행하는 패턴, Rust에서 C 라이브러리를 연동하는 패턴을 배울 수 있다.
배울 것: Rust build.rs 커스텀 빌드 스크립트, unsafe FFI 바인딩, 크로스 컴파일(Zig cc 활용), ANSI 이스케이프 시퀀스 기초.
서버와 클라이언트가 같은 기계에서 Unix 소켓(파일 경로 기반)으로 통신한다. src/ipc.rs의 connect_local_stream / bind_local_listener가 interprocess 크레이트를 래핑한다. Wire protocol은 길이 프리픽스 + bincode 직렬화 프레임 방식이다. 최대 프레임 크기 2MB, Kitty 그래픽용 32MB 등 DoS 방지 제한도 구현돼 있다.
배울 것: Unix 도메인 소켓, 길이 프리픽스 프레이밍, bincode 직렬화, 소켓 준비 대기 패턴 (polling with timeout), Windows Named Pipe 대체 처리.
src/detect/manifests/의 TOML 파일들이 각 에이전트의 상태 인식 규칙이다. AND/OR/NOT 게이트로 복합 조건을 표현하고, 우선순위(priority)로 규칙 충돌을 해결한다. 새 에이전트 지원을 추가하려면 TOML 파일만 작성하면 된다 — Rust 코드 변경 불필요. 패턴 기반 상태 머신의 좋은 사례다.
배울 것: DSL 설계(TOML 기반 규칙), 우선순위 기반 규칙 평가, 핫리로드 패턴, 에이전트 인식 휴리스틱 (OSC 제목/진행률 시퀀스 활용).
src/api/는 외부에서 herdr를 제어하는 JSON API다. 워크스페이스 생성, 탭 열기, 페인 분할, 에이전트 상태 구독 등을 지원한다. schemars로 JSON Schema를 자동 생성해 문서화한다. 에이전트들이 이 API를 통해 자신을 오케스트레이터로 사용할 수 있다.
배울 것: 소켓 기반 RPC 설계, schemars JSON Schema 자동 생성, 이벤트 구독(subscribe) 패턴, CLI와 프로그래매틱 API 공유.
실행 환경 · 설치 조건.
| 항목 | 요구사항 |
|---|---|
| OS | Linux (x86_64/aarch64), macOS (x86_64/Apple Silicon), Windows (x86_64 — Beta) |
| 바이너리 크기 | ~10 MB (단일 바이너리, 의존성 없음) |
| 메모리 사용 | 적음 — 서버 데몬 자체는 수십 MB 수준 (에이전트 프로세스 제외) |
| 디스크 | 바이너리 ~10 MB + 설정/로그 (소량) |
| 터미널 에뮬레이터 | ANSI 이스케이프 지원 터미널이면 모두 동작. Kitty 그래픽 프로토콜은 Ghostty/Kitty/WezTerm 필요 |
| 빌드 요구사항 | Rust (stable), Zig 0.15 (libghostty-vt 빌드), CMake/Ninja (선택) |
| 네트워크 | 설치 시에만 필요 (업데이트 체크는 선택적 백그라운드) |
herdr를 처음 실행하면 백그라운드 서버 데몬이 시작된다. SSH가 끊기거나 노트북을 닫아도 서버는 계속 살아있다. 재접속 시 herdr만 치면 기존 세션 그대로 복귀된다. herdr --remote ssh://you@yourserver로 원격 서버 세션에도 로컬처럼 붙을 수 있다.
Linux/macOS는 안정 릴리스. Windows는 Preview Beta로 일부 기능이 제한적이다. 프로덕션 에이전트 워크플로우는 Linux/macOS에서 권장한다. Windows는 ConPTY를 통해 PTY를 에뮬레이션하며 일부 에지 케이스에서 동작 차이가 있을 수 있다.
난이도별 5개.
macOS/Linux 기준으로 herdr를 설치하고, 두 개의 탭에서 각각 Claude Code와 다른 에이전트를 실행한 뒤 사이드바에서 상태가 바뀌는 것을 관찰한다.
curl -fsSL https://herdr.dev/install.sh | sh
herdr # 실행
# ctrl+b c : 새 탭
# 각 탭에서 에이전트 실행
확인 포인트: 에이전트가 작업 중일 때 🟡, 권한 요청 시 🔴로 바뀌는지 확인. herdr agent list로 JSON 상태 확인.
herdr JSON API를 활용해 실행 중인 에이전트 상태를 1초마다 출력하는 셸 스크립트를 작성한다.
while true; do
herdr agent list --json | \
python3 -c "import sys,json; \
agents=json.load(sys.stdin); \
[print(f\"{a['name']}: {a['agent_status']}\") for a in agents]"
sleep 1
done
확인 포인트: blocked인 에이전트를 발견하면 알림을 보내도록 확장해본다.
src/detect/manifests/의 기존 TOML을 참고해, 자신이 쓰는 CLI 도구의 상태 감지 규칙을 작성한다. pytest가 실행 중인지, 테스트 실패인지를 감지하는 규칙을 만들어본다.
# ~/.config/herdr/agent-detection/pytest.toml
id = "pytest"
version = "0.1.0"
[[rules]]
id = "test_running"
state = "working"
priority = 100
region = "bottom_non_empty_lines(3)"
contains = ["collecting"]
[[rules]]
id = "test_failed"
state = "blocked"
priority = 200
region = "whole_recent"
contains = ["FAILED", "ERROR"]
확인 포인트: 저장 후 herdr server reload-agent-manifests 실행. herdr agent explain <pane> --json으로 규칙 매칭 결과 확인.
저장소를 클론하고 직접 빌드해본다. Zig 0.15가 필요하므로 Nix 개발 환경을 사용하는 것이 가장 쉽다.
git clone https://github.com/ogulcancelik/herdr
cd herdr
nix develop # Nix 사용 시 (Zig 포함된 환경)
just test # 단위 테스트 실행
just build # 릴리스 빌드
./target/release/herdr --version
확인 포인트: src/app/ 내 #[cfg(test)] 블록을 찾아 PTY 없이 상태 테스트가 어떻게 동작하는지 분석. AppState::test_new() 사용 패턴 학습.
SKILL.md를 읽고, Claude Code 에이전트 안에서 herdr tab create, herdr pane split으로 하위 에이전트 창을 열고 작업을 분배하는 프롬프트를 설계한다.
# 에이전트 스킬 설치
npx skills add ogulcancelik/herdr --skill herdr -g
# 에이전트 내에서 사용 예시
herdr tab create --workspace 1 --label "frontend"
herdr pane split --tab 1:2 --direction right
herdr agent start --name "frontend-agent" \
--argv claude --cwd ./frontend
확인 포인트: Socket API docs(herdr.dev/docs/socket-api/)를 읽어 이벤트 구독 패턴 이해. 에이전트가 다른 에이전트의 완료를 기다리는 패턴 구현.
herdr 이해·기여를 위한 주차별 학습 경로.
목표: Rust 기초 문법, 소유권·빌림 이해, ratatui로 간단한 TUI 만들기.
자료: The Rust Book (doc.rust-lang.org/book), ratatui 공식 예제 (ratatui.rs), crossterm 예제.
실습: ratatui로 카운터 TUI 앱 만들기. crossterm으로 키 입력 처리.
목표: ANSI 이스케이프 시퀀스 이해, PTY 개념 파악.
자료: XTerm Control Sequences, "The TTY demystified" (lwtm.mit.edu), portable-pty README.
실습: Python/Rust로 PTY를 열고 프로세스를 붙여서 출력 캡처하는 코드 작성.
목표: async/await, tokio 채널, 태스크 스폰 패턴 이해.
자료: tokio 공식 튜토리얼 (tokio.rs), "Programming Rust" Ch.20.
실습: tokio로 멀티 태스크 PTY 읽기/쓰기 구현. src/pty/actor.rs의 PtyIoActor 분석.
목표: Unix 도메인 소켓, bincode 직렬화, 프레이밍 패턴.
자료: "The Linux Programming Interface" Ch.57 (유닉스 도메인 소켓), bincode 문서, interprocess 크레이트 README.
실습: Unix 소켓 서버-클라이언트 간단 구현. src/protocol/wire.rs의 PROTOCOL_VERSION, MAX_FRAME_SIZE 분석.
목표: TOML 기반 규칙 DSL 설계 이해, Zig 빌드 시스템 기초, Rust-Zig FFI.
자료: AGENTS.md의 "Agent Detection Updates" 섹션, Zig 공식 문서 (ziglang.org), Rust Nomicon (FFI 챕터).
실습: 새 에이전트 매니페스트 작성. build.rs의 zig build 호출 분석. libghostty-vt의 Zig 소스 일부 읽기.
목표: herdr 이슈 트래커에서 good-first-issue 찾아 기여.
자료: CONTRIBUTING.md, AGENTS.md 전체 정독.
실습: 기존 에이전트 감지 규칙 개선 PR, 새 에이전트 매니페스트 추가, 문서 개선 등. just check로 모든 체크 통과 확인.
이 저장소를 이해하는 데 필요한 핵심 용어.
openpty(), Windows에서는 ConPTY(Console PTY)로 생성.herdr server reload-agent-manifests 명령으로 즉시 새 규칙을 적용한다. 에이전트 감지 디버깅 시 편집-저장-적용 루프를 빠르게 돌릴 수 있다.더 깊이 파고들기 위한 공식 자료.