TrendShift 딥다이브 · 2026-07-01

herdr 딥다이브
— 터미널에서 AI 에이전트 함대를 지휘하는 Rust 멀티플렉서

herdr에이전트 인식 터미널 멀티플렉서다. tmux처럼 터미널 세션을 유지하되, 각 창에서 어떤 AI 에이전트가 막혔는지(🔴 blocked), 작업 중인지(🟡 working), 완료됐는지(🔵 done)를 실시간으로 감지해 사이드바에 보여준다. 코드 변경 없이 SSH로 원격 서버에 붙고, 폰에서도 붙고, 노트북을 닫아도 에이전트는 계속 돌아간다. Rust + ratatui + libghostty-vt(Ghostty의 VT 파서) + portable-pty로 만든 단일 바이너리(~10 MB), GUI 없음, Electron 없음, 계정 없음, 텔레메트리 없음. (저장소: ogulcancelik/herdr · Rust · v0.7.1 · AGPL-3.0)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 저장소가 대체 무엇인가.

핵심 메시지

"tmux를 AI 에이전트 시대에 맞게 다시 만든 것 — 각 창이 지금 뭘 하는지 한눈에 보인다."

herdr는 터미널 멀티플렉서(tmux/zellij처럼 창 여러 개를 유지하는 프로그램)인데, 여기서 끝나지 않는다. 각 창(pane)에서 실행 중인 AI 코딩 에이전트(Claude Code, Codex, Amp 등 16종)의 상태를 자동으로 탐지해 사이드바에 표시한다. "A 에이전트가 권한 요청 중이라 막혔다", "B 에이전트는 열심히 작업 중", "C 에이전트는 완료됐는데 아직 확인 안 했다" — 한 화면에서 에이전트 함대 전체를 조망할 수 있다.

tmux를 써본 적 있다면: tmux + 에이전트 상태 감지 + 마우스 클릭 네이티브 + JSON Socket API라고 이해하면 된다. 에이전트가 herdr의 API를 통해 직접 탭·창을 만들고, 다른 창의 출력을 읽고, 하위 에이전트를 생성하는 것도 가능하다.

용어
터미널 멀티플렉서(Terminal Multiplexer)
하나의 터미널 창 안에서 여러 터미널 세션을 동시에 실행·관리하는 프로그램. SSH 연결이 끊겨도 내부 세션이 계속 살아있고, 재접속하면 그대로 돌아올 수 있다. tmux가 가장 유명하다. herdr는 거기에 "AI 에이전트 인식" 기능을 추가한 것.

2왜 주목받는가

tmux·zellij·GUI 에이전트 러너 대비 장점 · 트렌딩 이유.

AI 코딩 에이전트를 쓰는 개발자들이 폭발적으로 늘면서, 에이전트를 동시에 여러 개 돌리는 "에이전트 함대" 워크플로우가 일반화됐다. 기존 tmux는 각 창이 지금 뭐하는지 전혀 모른다 — 개발자가 일일이 창을 전환해 상태를 확인해야 한다. GUI 기반 에이전트 관리자(Conductor, cmux 등)는 상태를 보여주지만, 앱 래퍼 안에 터미널을 흉내 낸 것이라 풀스크린 TUI 에이전트가 제대로 렌더링되지 않고 macOS 전용이 많다.

경쟁 도구 상세 비교

기능tmuxzellijGUI 관리자 (Conductor 등)herdr
세션 유지 (detach/reattach)
SSH에서 동작
에이전트 상태 감지
진짜 터미널 뷰 (TUI 에이전트 호환)
마우스 네이티브어려움제한적
단일 경량 바이너리
에이전트가 API로 제어 가능???
크로스 플랫폼 (Linux/macOS/Windows)Mac 전용 多✓ (Win Beta)
herdr의 핵심 차별점 세 가지
① 에이전트 인식 + ② 진짜 터미널 + ③ API로 에이전트가 직접 제어

tmux는 에이전트를 모른다. GUI 관리자는 에이전트를 알지만 터미널을 흉내낸다. herdr는 둘 다 잡았다. 더 나아가, 에이전트 자체가 herdr의 유닉스 소켓 API를 호출해 탭을 열고, 다른 에이전트를 생성하고, 출력을 읽을 수 있다 — 에이전트가 오케스트레이터 역할을 할 수 있다.

이런 상황을 상상해봐

Claude Code 4개, Codex 2개, Amp 1개를 동시에 돌리고 있다. tmux였다면 7개 창을 일일이 전환해야 어떤 게 막혔는지 알 수 있다. herdr 사이드바에는 "🔴 Claude-3 (권한 요청 대기)", "🟡 Codex-1 (작업 중)", "🔵 Amp-1 (완료 — 미확인)" 같은 상태가 한눈에 보인다.

노트북을 닫아도 백그라운드 서버가 에이전트를 살려두고, 나중에 폰으로 SSH 접속하면 그 상태 그대로 재접속된다.

3기술 스택 전체 지도

Rust 크레이트 + 의존성 + 인프라 계층 전체.

핵심 Rust 크레이트 (Cargo.toml 기반)

크레이트역할비고
ratatui 0.30TUI 렌더링 프레임워크 — 레이아웃·위젯·색상unstable-rendered-line-info 기능 활성화
crossterm 0.29크로스 플랫폼 터미널 입출력 — 키보드·마우스 이벤트, 화면 모드 전환Windows/Unix 통합 추상화
portable-pty 0.9.0PTY(pseudo-terminal) 생성·관리 — 각 pane에 실제 터미널 제공벤더 패치 적용 (vendor/portable-pty)
tokio 1비동기 런타임 — PTY 읽기/쓰기, 소켓 통신, 이벤트 루프rt-multi-thread + macros + sync + time
interprocess 2.4.2Unix 도메인 소켓 / Named Pipe — 서버-클라이언트 IPCWindows 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.17PNG 이미지 처리 — Kitty 그래픽 프로토콜 이미지 렌더링터미널 내 이미지 표시
sha2 0.10SHA-256 체크섬 — 바이너리 업데이트 검증설치 스크립트와 연동
schemars 1.2.1JSON Schema 자동 생성 — Socket API 스키마 문서화derive 기능

벤더링된 핵심 라이브러리

라이브러리역할출처
libghostty-vt 1.3.2VT(가상 터미널) 파서·에뮬레이터 — 터미널 출력 해석, 상태 스냅샷 생성Ghostty 터미널 에뮬레이터에서 추출. Zig로 빌드 (build.zig), Rust에서 C FFI로 호출
portable-pty (패치)PTY 백엔드 — Unix openpty/posix_openpt, Windows ConPTYwez/wezterm의 portable-pty에 herdr 전용 패치 적용

빌드 도구

도구역할
Rust / Cargo주 언어 및 빌드 시스템
Zig 0.15libghostty-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
Homebrewbrew install herdr
misemise use -g herdr
Nixnix run github:ogulcancelik/herdr
Windows (Beta)PowerShell 설치 스크립트
GitHub ReleasesLinux/macOS 바이너리 직접 다운로드

4아키텍처 심화 분석

TUI / PTY / 멀티플렉싱 구조도 + 핵심 설계 패턴.

전체 시스템 구조도

┌─────────────────────────────────────────────────────────────────┐ │ 사용자 터미널 │ │ (iTerm2 / Ghostty / SSH / 폰 SSH 앱 / Windows Terminal) │ └────────────────────────────┬────────────────────────────────────┘ │ crossterm 이벤트 │ (키보드, 마우스, 리사이즈) ┌──────────▼──────────┐ │ Client Layer │ │ src/client/ │ │ - 입력 인코딩 │ │ - ANSI 렌더 스트림 │ │ - 이미지(Kitty) │ └──────────┬──────────┘ │ bincode wire protocol (Unix socket) │ interprocess LocalStream ┌──────────▼──────────────────────────────┐ │ Server Layer │ │ src/server/ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │headless.rs │ │ render_stream.rs │ │ │ │(daemon 모드)│ │ (프레임 → ANSI) │ │ │ └─────────────┘ └──────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ App (src/app/) │ │ │ │ AppState (순수 데이터, 테스트 가능) │ │ │ │ ┌──────────┐ ┌────────────────┐ │ │ │ │ │WorkSpace │ │ AgentDetector │ │ │ │ │ │ Tab │ │ (src/detect/) │ │ │ │ │ │ Pane │ │ TOML manifest │ │ │ │ │ └────┬─────┘ └────────────────┘ │ │ │ └───────┼─────────────────────────────┘ │ │ │ │ │ ┌───────▼──────────────────────────┐ │ │ │ PTY Layer (src/pty/) │ │ │ │ PtyIoActor (tokio task) │ │ │ │ portable-pty → OS PTY master │ │ │ │ libghostty-vt → VT 파싱 → 스냅샷 │ │ │ └──────────────┬───────────────────┘ │ └─────────────────┼──────────────────────--┘ │ ┌─────────────────▼───────────────────────┐ │ 실제 프로세스들 │ │ [ Claude Code ] [ Codex ] [ Amp ] ... │ │ 각각 독립된 PTY에서 실행 │ └─────────────────────────────────────────┘ JSON Socket API (src/api/) ←→ herdr CLI / 에이전트 스크립트 Unix domain socket: ~/.local/share/herdr/herdr.sock

핵심 설계 패턴 4가지

패턴 1

State-Runtime 분리 (AppState vs PaneRuntime)

AppState는 순수 데이터 구조체 — PTY도 없고, async도 없고, OS 호출도 없다. 모든 워크스페이스·탭·페인 레이아웃 상태가 여기 있다. PaneRuntime은 실제 PTY 프로세스, 읽기/쓰기 태스크를 담는다. 이 분리 덕분에 AppState::test_new()로 PTY 없이 단위 테스트가 가능하다. AGENTS.md가 "State is separated from runtime"을 첫 번째 원칙으로 명시한다.

패턴 2

에이전트 감지 — 증거 기반 TOML 매니페스트

각 에이전트마다 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 조건
패턴 3

서버-클라이언트 분리 + Wire Protocol

herdr를 실행하면 자동으로 백그라운드 서버 데몬을 띄우고(없으면), TUI 클라이언트로 붙는다 (src/server/autodetect.rs). 서버는 Unix 소켓에서 대기하며 PTY 상태를 유지한다. 클라이언트는 bincode로 직렬화된 wire protocol(src/protocol/wire.rs, PROTOCOL_VERSION=15)로 서버와 통신한다. 클라이언트가 끊어져도 서버는 계속 실행 중이라 에이전트가 살아있다. --remote 플래그로 원격 서버에도 동일 프로토콜로 붙는다.

패턴 4

렌더 순수성 — compute_view → render(&AppState)

AGENTS.md 두 번째 원칙: "Render is pure." render()&AppState만 받고, 절대 상태를 변경하지 않는다. ratatuiFrame에 그리기만 한다. 모든 기하학(geometry) 계산과 변이(mutation)는 compute_view()가 사전에 처리한다. 이 덕분에 렌더링 버그를 상태 변경과 분리해 추적할 수 있다.

PTY 동작 원리 (PtyIoActor)

에이전트 프로세스 (예: claude) │ stdout/stderr ▼ PTY Master (OS 제공) portable-pty 크레이트 │ ▼ PtyIoActor (tokio 태스크) ┌─────────────────────────┐ │ Reader 스레드 │ │ OS PTY → on_read 콜백 │ │ libghostty-vt 파서 │ │ → VT 상태 스냅샷 갱신 │ └──────────┬──────────────┘ │ 이벤트 채널 ▼ AgentDetector ┌─────────────────────────┐ │ 스냅샷 텍스트 추출 │ │ TOML 규칙 평가 │ │ → AgentState 결정 │ │ blocked/working/done │ └──────────┬──────────────┘ │ ▼ AppState.terminal.agent_state 갱신 → TUI 사이드바에 🔴/🟡/🔵 표시

5디렉토리 구조 해부

21개 src 서브디렉토리 + 기타 디렉토리 분석.

herdr/ ├── src/ # Rust 소스 (21개 서브디렉토리) │ ├── main.rs # 진입점 — 중첩 실행 차단, ratatui 초기화, tokio 런타임 │ ├── app/ # 핵심 앱 로직 │ │ ├── state.rs # AppState (순수 데이터), Palette (테마 색상) │ │ ├── actions.rs # 상태 변이 액션들 │ │ ├── agents.rs # 에이전트 시작/이름변경/정보 수집 │ │ ├── input/ # 키보드·마우스 입력 처리 (6개 파일) │ │ └── api/ # 내부 API — 워크스페이스/탭/페인/플러그인 (12개 파일) │ ├── ui/ # TUI 렌더링 (14개 파일) │ │ ├── sidebar.rs # 에이전트 패널, 워크스페이스 목록 │ │ ├── panes.rs # 페인 렌더링 (에이전트 출력 화면) │ │ ├── tabs.rs # 탭 바 │ │ └── dialogs.rs # 모달 다이얼로그들 │ ├── server/ # 서버 데몬 (12개 파일) │ │ ├── autodetect.rs # herdr 실행 시 서버/클라이언트 자동 판별 │ │ ├── headless.rs # 백그라운드 데몬 모드 │ │ ├── render_stream.rs # 프레임 → ANSI 스트림 변환 │ │ └── handoff.rs # 라이브 세션 핸드오프 │ ├── detect/ # 에이전트 상태 감지 엔진 │ │ ├── mod.rs # AgentState (blocked/working/done/idle) │ │ ├── manifest.rs # TOML 매니페스트 로더·규칙 컴파일러 │ │ └── manifests/ # 에이전트별 TOML 규칙 (18개 파일) │ │ ├── claude.toml │ │ ├── codex.toml │ │ └── amp.toml ... │ ├── pty/ # PTY 레이어 │ │ ├── actor.rs # PtyIoActor — 비동기 읽기/쓰기 태스크 │ │ └── backend.rs # portable-pty 백엔드 추상화 │ ├── protocol/ # Wire protocol │ │ ├── wire.rs # ClientMessage / ServerMessage (bincode) │ │ └── render_ansi.rs # ANSI 렌더 스트림 인코더 │ ├── client/ # 클라이언트 레이어 (서버 연결) │ ├── config/ # 설정 (~/.config/herdr/config.toml) │ ├── workspace/ # 워크스페이스·탭·페인 모델 (+ git 상태 감지) │ ├── cli/ # CLI 서브커맨드 (12개 — workspace/tab/pane/agent 등) │ ├── integration/ # 에이전트 통합 (herdr integration install <agent>) │ ├── api/ # JSON Socket API (에이전트가 herdr를 제어) │ ├── ipc.rs # Unix 소켓 / Named Pipe 추상화 (interprocess) │ ├── remote.rs # --remote 원격 서버 연결 │ └── kitty_graphics.rs # Kitty 그래픽 프로토콜 (터미널 내 이미지) ├── vendor/ # 벤더링된 의존성 │ ├── libghostty-vt/ # Ghostty VT 파서 (Zig, 패치 적용) │ └── portable-pty/ # PTY 크레이트 (패치 적용) ├── docs/ # 미출시 문서 (next/), API 스키마 ├── website/ # 공식 사이트 소스 (Bun 빌드) ├── workers/ # Cloudflare Workers (플러그인 마켓플레이스) ├── scripts/ # 유지보수 스크립트 (Python) ├── Cargo.toml # 패키지 정의 + 의존성 ├── build.rs # Zig로 libghostty-vt 크로스 컴파일 ├── justfile # 태스크 러너 레시피 └── flake.nix # Nix 개발 환경
용어
벤더링(Vendoring)
외부 의존성의 소스코드를 직접 프로젝트 내부(vendor/)에 포함시키는 방식. herdr는 libghostty-vt와 portable-pty를 벤더링하고, 자체 패치를 적용한다. 이렇게 하면 인터넷 연결 없이 빌드 가능하고, 업스트림 변경으로 인한 빌드 깨짐을 방지할 수 있다.

6학습 포인트 (기술별)

이 저장소에서 무엇을 배울 수 있는가.

1. Rust TUI 개발 — ratatui

herdr는 ratatui의 실전 대규모 활용 사례다. 단순한 Hello World가 아니라, 마우스 네이티브 드래그·클릭, 사이드바 스크롤, 모달 오버레이, 탭 바, 스플릿 페인 등 복잡한 레이아웃을 처리한다. src/ui/ 14개 파일을 보면 실제 프로덕션 수준 TUI 설계를 배울 수 있다.

배울 것: Layout::vertical/horizontal, Constraint, Rect 기반 레이아웃 계산, Frame 렌더링 패턴, Paragraph/List/Scrollbar 위젯 활용, 팔레트 기반 테마 시스템 (src/app/state.rs의 Palette 구조체).

2. PTY (Pseudo-Terminal) 제어

각 페인에 진짜 터미널을 제공하는 핵심 기술. portable-pty로 PTY master/slave 쌍을 생성하고, slave에 에이전트 프로세스를 붙이고, master에서 출력을 읽는다. src/pty/actor.rsPtyIoActor는 tokio 비동기 태스크와 OS 블로킹 PTY 읽기를 연결하는 패턴을 보여준다.

배울 것: PTY 생성, 프로세스 스폰 with PTY, 비동기와 블로킹 IO 브리징 패턴, Windows ConPTY vs Unix openpty 차이.

3. VT(가상 터미널) 파싱 — libghostty-vt

에이전트의 터미널 출력에서 상태를 감지하려면 ANSI 이스케이프 시퀀스를 해석해야 한다. herdr는 Ghostty의 VT 파서를 Zig로 빌드해 C FFI로 호출한다. build.rs에서 Cargo 빌드 스크립트가 zig build를 실행하는 패턴, Rust에서 C 라이브러리를 연동하는 패턴을 배울 수 있다.

배울 것: Rust build.rs 커스텀 빌드 스크립트, unsafe FFI 바인딩, 크로스 컴파일(Zig cc 활용), ANSI 이스케이프 시퀀스 기초.

4. IPC — Unix 도메인 소켓 통신

서버와 클라이언트가 같은 기계에서 Unix 소켓(파일 경로 기반)으로 통신한다. src/ipc.rsconnect_local_stream / bind_local_listenerinterprocess 크레이트를 래핑한다. Wire protocol은 길이 프리픽스 + bincode 직렬화 프레임 방식이다. 최대 프레임 크기 2MB, Kitty 그래픽용 32MB 등 DoS 방지 제한도 구현돼 있다.

배울 것: Unix 도메인 소켓, 길이 프리픽스 프레이밍, bincode 직렬화, 소켓 준비 대기 패턴 (polling with timeout), Windows Named Pipe 대체 처리.

5. 에이전트 상태 감지 — 증거 기반 규칙 엔진

src/detect/manifests/의 TOML 파일들이 각 에이전트의 상태 인식 규칙이다. AND/OR/NOT 게이트로 복합 조건을 표현하고, 우선순위(priority)로 규칙 충돌을 해결한다. 새 에이전트 지원을 추가하려면 TOML 파일만 작성하면 된다 — Rust 코드 변경 불필요. 패턴 기반 상태 머신의 좋은 사례다.

배울 것: DSL 설계(TOML 기반 규칙), 우선순위 기반 규칙 평가, 핫리로드 패턴, 에이전트 인식 휴리스틱 (OSC 제목/진행률 시퀀스 활용).

6. JSON Socket API 설계

src/api/는 외부에서 herdr를 제어하는 JSON API다. 워크스페이스 생성, 탭 열기, 페인 분할, 에이전트 상태 구독 등을 지원한다. schemars로 JSON Schema를 자동 생성해 문서화한다. 에이전트들이 이 API를 통해 자신을 오케스트레이터로 사용할 수 있다.

배울 것: 소켓 기반 RPC 설계, schemars JSON Schema 자동 생성, 이벤트 구독(subscribe) 패턴, CLI와 프로그래매틱 API 공유.

7하드웨어 / 시스템 요구사항

실행 환경 · 설치 조건.

항목요구사항
OSLinux (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로 원격 서버 세션에도 로컬처럼 붙을 수 있다.

현실적 주의사항
Windows는 아직 Beta

Linux/macOS는 안정 릴리스. Windows는 Preview Beta로 일부 기능이 제한적이다. 프로덕션 에이전트 워크플로우는 Linux/macOS에서 권장한다. Windows는 ConPTY를 통해 PTY를 에뮬레이션하며 일부 에지 케이스에서 동작 차이가 있을 수 있다.

8직접 해볼 수 있는 실습 과제

난이도별 5개.

난이도: 입문

실습 1 — herdr 설치하고 에이전트 2개 동시에 돌려보기

macOS/Linux 기준으로 herdr를 설치하고, 두 개의 탭에서 각각 Claude Code와 다른 에이전트를 실행한 뒤 사이드바에서 상태가 바뀌는 것을 관찰한다.

curl -fsSL https://herdr.dev/install.sh | sh
herdr                    # 실행
# ctrl+b c : 새 탭
# 각 탭에서 에이전트 실행

확인 포인트: 에이전트가 작업 중일 때 🟡, 권한 요청 시 🔴로 바뀌는지 확인. herdr agent list로 JSON 상태 확인.

난이도: 초급

실습 2 — Socket API로 에이전트 상태 모니터링 스크립트 작성

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인 에이전트를 발견하면 알림을 보내도록 확장해본다.

난이도: 중급

실습 3 — 새 에이전트 감지 규칙 작성 (TOML 매니페스트)

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으로 규칙 매칭 결과 확인.

난이도: 중급

실습 4 — herdr 소스 빌드 + 단위 테스트 실행

저장소를 클론하고 직접 빌드해본다. 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() 사용 패턴 학습.

난이도: 고급

실습 5 — herdr 에이전트 스킬로 멀티 에이전트 오케스트레이션

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/)를 읽어 이벤트 구독 패턴 이해. 에이전트가 다른 에이전트의 완료를 기다리는 패턴 구현.

9관련 기술 심화 학습 로드맵

herdr 이해·기여를 위한 주차별 학습 경로.

1~2주차 — Rust 기초 + TUI 입문

목표: Rust 기초 문법, 소유권·빌림 이해, ratatui로 간단한 TUI 만들기.

자료: The Rust Book (doc.rust-lang.org/book), ratatui 공식 예제 (ratatui.rs), crossterm 예제.

실습: ratatui로 카운터 TUI 앱 만들기. crossterm으로 키 입력 처리.

3주차 — 터미널 에뮬레이션 기초

목표: ANSI 이스케이프 시퀀스 이해, PTY 개념 파악.

자료: XTerm Control Sequences, "The TTY demystified" (lwtm.mit.edu), portable-pty README.

실습: Python/Rust로 PTY를 열고 프로세스를 붙여서 출력 캡처하는 코드 작성.

4주차 — tokio 비동기 프로그래밍

목표: async/await, tokio 채널, 태스크 스폰 패턴 이해.

자료: tokio 공식 튜토리얼 (tokio.rs), "Programming Rust" Ch.20.

실습: tokio로 멀티 태스크 PTY 읽기/쓰기 구현. src/pty/actor.rs의 PtyIoActor 분석.

5주차 — Unix IPC + Wire Protocol

목표: Unix 도메인 소켓, bincode 직렬화, 프레이밍 패턴.

자료: "The Linux Programming Interface" Ch.57 (유닉스 도메인 소켓), bincode 문서, interprocess 크레이트 README.

실습: Unix 소켓 서버-클라이언트 간단 구현. src/protocol/wire.rs의 PROTOCOL_VERSION, MAX_FRAME_SIZE 분석.

6주차 — 에이전트 감지 시스템 + Zig 빌드

목표: TOML 기반 규칙 DSL 설계 이해, Zig 빌드 시스템 기초, Rust-Zig FFI.

자료: AGENTS.md의 "Agent Detection Updates" 섹션, Zig 공식 문서 (ziglang.org), Rust Nomicon (FFI 챕터).

실습: 새 에이전트 매니페스트 작성. build.rs의 zig build 호출 분석. libghostty-vt의 Zig 소스 일부 읽기.

7~8주차 — 오픈소스 기여

목표: herdr 이슈 트래커에서 good-first-issue 찾아 기여.

자료: CONTRIBUTING.md, AGENTS.md 전체 정독.

실습: 기존 에이전트 감지 규칙 개선 PR, 새 에이전트 매니페스트 추가, 문서 개선 등. just check로 모든 체크 통과 확인.

10핵심 키워드 사전

이 저장소를 이해하는 데 필요한 핵심 용어.

터미널 멀티플렉서
Terminal Multiplexer
tmux, screen, zellij처럼 하나의 터미널 창 안에서 여러 세션을 동시에 관리하는 프로그램. 핵심 기능은 "detach" — SSH를 끊어도 세션이 살아있고, 나중에 재접속(reattach)할 수 있다. herdr는 여기에 에이전트 인식 기능을 추가했다.
PTY / 가상 터미널
PTY (Pseudo-Terminal)
운영체제가 제공하는 가상 터미널 장치. Master/Slave 쌍으로 구성된다. Slave를 실제 터미널처럼 사용해 프로세스를 실행하고, Master에서 그 출력을 읽는다. 터미널 에뮬레이터, SSH, tmux, herdr 모두 PTY를 사용한다. Unix에서는 openpty(), Windows에서는 ConPTY(Console PTY)로 생성.
TUI
TUI (Text-based User Interface)
터미널 안에서 동작하는 그래픽 인터페이스. ANSI 이스케이프 시퀀스로 색상, 위치, 텍스트 스타일을 제어해 GUI처럼 보이게 만든다. htop, vim, ncurses 앱들이 TUI다. Rust에서는 ratatui가 대표 TUI 프레임워크.
VT 파서
VT Parser (Virtual Terminal Parser)
터미널 출력에 섞인 ANSI/VT100 이스케이프 시퀀스를 파싱해 화면 상태로 변환하는 컴포넌트. herdr는 Ghostty의 libghostty-vt를 사용해 각 에이전트 PTY 출력을 화면 버퍼로 변환한 뒤 상태 감지에 활용한다.
Wire Protocol
Wire Protocol / Binary Protocol
네트워크나 IPC(프로세스 간 통신)에서 데이터를 주고받는 형식. herdr는 길이 프리픽스 + bincode(바이너리 직렬화) 방식을 사용한다. 메시지 앞에 4바이트 길이를 붙이고, 실제 페이로드는 bincode로 직렬화된 Rust 구조체. 현재 PROTOCOL_VERSION = 15.
에이전트 상태
AgentState (blocked / working / done / idle)
herdr가 자동으로 감지하는 4가지 에이전트 상태. blocked(🔴 권한 요청 등으로 사용자 입력 대기), working(🟡 처리 중), done(🔵 완료 — 아직 사용자가 확인 안 함), idle(🟢 아무것도 안 함). 규칙은 TOML 매니페스트로 정의.
Workspace / Tab / Pane
워크스페이스 / 탭 / 페인 계층
herdr의 세션 조직 3단계. Workspace(프로젝트/폴더 단위) > Tab(서브컨텍스트) > Pane(실제 터미널 창). ID 형식: workspace=1, tab=1:2, pane=1-2. ID는 세션 중 동적으로 변할 수 있으니 저장 금지.
Kitty 그래픽 프로토콜
Kitty Graphics Protocol
터미널 안에서 이미지를 표시하는 현대적 프로토콜. Ghostty, Kitty, WezTerm 등이 지원한다. herdr는 이 프로토콜로 터미널 내 이미지 렌더링을 지원하며, 원격 서버에서도 이미지 페이스트가 동작하도록 특별 처리한다.
OSC 시퀀스
OSC (Operating System Command) Sequence
터미널 이스케이프 시퀀스의 한 종류. ESC ] 로 시작한다. 터미널 제목 변경(OSC 0), 진행률 표시(OSC 9;4), 색상 테마 알림(OSC 11) 등에 사용된다. herdr의 에이전트 감지 엔진은 OSC 제목/진행률을 추가 신호로 활용해 더 정확한 상태 감지를 한다.
Hot reload
매니페스트 핫리로드
herdr를 재시작하지 않고 에이전트 감지 규칙(TOML 매니페스트)을 업데이트하는 기능. herdr server reload-agent-manifests 명령으로 즉시 새 규칙을 적용한다. 에이전트 감지 디버깅 시 편집-저장-적용 루프를 빠르게 돌릴 수 있다.

11참고 링크

더 깊이 파고들기 위한 공식 자료.