에이전트 5개를 가지처럼 키운다: max-sixty/worktrunk 0.81.0의 worktree UX·훅·CoW 캐시·머지 워크플로와 박스 실측

2026년 11월 6일 GitHub Trending(전체·Rust 근처)에 max-sixty/worktrunk가 올랐습니다. 이 글 작성 시점 API 기준 스타 11,663, 최신 릴리스 v0.81.0(2026-10-20), 라이선스 MIT OR Apache-2.0(이중), 홈페이지 worktrunk.dev. Claude Code·Codex·OpenCode처럼 장시간 돌아가는 에이전트를 5~10개 병렬로 붙일 때, 네이티브 git worktree의 UX 마찰을 줄이는 Rust CLI입니다.

이 글은 초보 튜토리얼이 아닙니다. 브랜치 주소 지정·경로 템플릿·훅 생명주기·reflink CoW 캐시·머지 파이프라인·저장소/크레이트 구조·Windows git-wt 충돌, 그리고 이 박스(ext4)에서 실제로 돌린 wt switch --create/list/remove 실측을 실무자 기준으로 정리합니다. 오늘 오전 Opensource 딥다이브(vercel-labs/agent-browser)와는 계층이 다릅니다 — 브라우저는 AXTree, 이쪽은 저장소 작업 공간입니다.

에이전트 5개를 가지처럼: max-sixty/worktrunk 0.81.0의 switch·list·remove·merge와 CoW 캐시
에이전트 5개를 가지처럼: max-sixty/worktrunk 0.81.0의 switch·list·remove·merge와 CoW 캐시

한 줄 정의와 핵심 숫자

worktrunk(기본 바이너리 이름 wt)는 worktree를 브랜치 이름으로 다루게 만드는 CLI입니다. 경로는 설정 가능한 템플릿(worktree-path, MiniJinja)으로 계산되고, 같은 인자에 경로를 넣어도 됩니다. 문서가 강조하는 문제는 단순합니다. 에이전트마다 작업 디렉터리가 필요하지만, git worktree add -b feat ../repo.feat && cd ../repo.feat처럼 브랜치 이름을 세 번 치는 UX는 병렬 스케일에 맞지 않는다는 것.

항목 값 (이 글 검증)
저장소 max-sixty/worktrunk
버전 0.81.0 (GitHub release / crates.io / wt --version 일치)
라이선스 MIT OR Apache-2.0 (LICENSE 파일·crates.io·Homebrew 동일)
스타 / forks 11,663 / 447 (GitHub API 2026-11-06)
crates.io 다운로드 41,549 (누적, crates.io API)
언어·에디션 Rust, edition 2024, rust-version 1.98
기본 바이너리 wt (Windows Winget 추가 이름 git-wt)
문서 https://worktrunk.dev

왜 worktree인가: 병렬 에이전트의 충돌면

한 워킹 트리에서 에이전트 여러 개가 동시에 파일을 고치면, 스테이징·머지 컨플릭트·미완성 리팩터가 서로 밟습니다. Git worktree는 브랜치마다 별도 디렉터리를 주므로 에이전트 Isolatation의 기본 단위가 됩니다. Worktrunk는 그 위에 생성·전환·목록·제거·머지를 브랜치 UX로 압축하고, 훅으로 의존성/캐시/서버 기동을 붙입니다.

작업 Worktrunk Plain git
전환 wt switch feat cd ../repo.feat
생성 + Claude wt switch -c -x claude feat git worktree add -b feat ../repo.feat && cd … && claude
정리 wt remove git worktree remove + git branch -d
상태 목록 wt list (ahead/CI/메시지) git worktree list (경로 위주)
로컬 머지+정리 wt merge main squash/rebase/ff/remove를 수동 연쇄
PR 브랜치 점프 wt switch pr:123 forge CLI로 브랜치 확인 후 worktree add
브랜치 이름 → MiniJinja 경로 템플릿 → 셸 래퍼 cd. 통합 없으면 생성만 되고 디렉터리는 안 바뀐다
브랜치 이름 → MiniJinja 경로 템플릿 → 셸 래퍼 cd. 통합 없으면 생성만 되고 디렉터리는 안 바뀐다

코어 UX: switch · list · remove · merge

wt switch --create feature-auth는 기본 브랜치에서 새 브랜치+worktree를 만들고 전환을 시도합니다. 셸 통합이 없으면 생성은 성공하지만 Cannot change directory 경고가 납니다(박스 실측에서 재현). wt list는 Status·HEAD±·main↕·Remote⇅·Path·Commit·Age·Message를 progressive하게 채웁니다. @는 현재, ↑1은 기본 브랜치 대비 1커밋 ahead입니다.

wt merge는 커밋(옵션으로 LLM 메시지) → rebase/squash → 타깃 fast-forward → worktree/브랜치 정리까지 한 파이프라인으로 묶습니다. v0.81.0의 wt merge --branch는 현재 worktree를 떠나지 않고 다른 worktree 브랜치를 머지할 수 있습니다. wt remove는 머지된 브랜치를 지우고, 같은 커밋이면 백그라운드 삭제로 넘깁니다(실측에서 feature-b 제거 시 확인).

커맨드 역할 실무 메모
wt switch 전환/생성/실행(-x)/PR --path로 템플릿 밖 배치(실험적, 0.81.0)
wt list / --full 상태·CI·LLM 요약 forge CLI 미로그인 시 CI 칸 공란
wt remove worktree+조건 브랜치 삭제 -y로 승인 스킵; untracked면 stash 안내
wt merge 로컬 통합 파이프라인 훅 pre/post-merge와 결합
wt step … commit/squash/rebase/copy-ignored 등 원자 연산 훅·alias에서 재사용
wt hook 훅 수동 실행 foreground 훅은 stdin 상속(0.81.0)
wt config 셸·경로·alias·state wt config shell install 필수에 가깝다

아키텍처: 경로 템플릿 · 훅 · CoW · LLM

훅 생명주기: pre-*는 연산을 막고 post-*는 백그라운드에서 돕는다 (pre-start/post-start 포함)
훅 생명주기: pre-*는 연산을 막고 post-*는 백그라운드에서 돕는다 (pre-start/post-start 포함)

경로 템플릿 (MiniJinja 3)

기본은 형제 디렉터리 패턴(../repo.branch류)이고, 사용자 설정 예시는 ~/.config/worktrunk/config.toml의 worktree-path = ".worktrees/{{ branch | sanitize }}"입니다. v0.81.0은 MiniJinja 3로 올라갔고, 객체/리스트 렌더는 Python 스타일이라 JSON이 필요하면 | tojson을 씁니다. hash_port 필터로 worktree마다 고유 개발 서버 포트를 줄 수 있습니다.

훅 생명주기

이벤트는 switch / create(start) / commit / merge / remove 축에 pre-*(차단)와 post-*(백그라운드)가 붙습니다. 문서상 create 쪽 이름은 pre-start/post-start입니다. pre-* 실패는 연산을 중단하고, post-*는 로그를 남기며 비동기로 돕니다. 콜드 스타트 제거 레시피는 post-start = "wt step copy-ignored"입니다. 0.81.0부터 foreground 훅은 stdin을 상속해 gum confirm 같은 대화형 확인이 가능합니다(동시/백그라운드 훅은 EOF).

이벤트 pre (blocking) post (background)
switch pre-switch post-switch
create/start pre-start post-start
commit pre-commit post-commit
merge pre-merge post-merge
remove pre-remove post-remove

CoW 빌드 캐시: wt step copy-ignored

Gitignored 파일(target/, node_modules/, .env 등)을 worktree 사이에 복사합니다. 파일시스템은 지원 시 reflink합니다: APFS(macOS), btrfs·XFS(Linux), ReFS(Windows). ext4·NTFS는 full copy로 떨어지고 요약에 (full copy)가 뜹니다. 문서의 14GB target/ 예시(업스트림 벤치 수치, 이 박스에서 재현하지 않음):

방식 시간 (문서) 추가 디스크 (문서)
cp -R full copy 2m 14GB
cp -Rc / wt step copy-ignored (reflink) 20s ~0

Rust 쪽 문서 노트는 reflink 복사 후 첫 빌드가 ~68s→~3s로 줄어든다고 적습니다(의존성 재사용). 제한은 .worktreeinclude(gitignore 스타일 교집합)와 [step.copy-ignored] exclude입니다. 이 박스 루트 FS는 ext4라서 CoW 이득은 기대하지 않는 것이 맞습니다.

LLM 커밋 · 목록 요약 · 에이전트 플러그인

[commit.generation]에 Claude 등 외부 명령을 걸어 diff 기반 커밋 메시지를 만들 수 있습니다. wt list --full은 CI 상태와 AI 요약을 붙입니다. Claude Code / OpenCode 플러그인은 에이전트가 만든 worktree를 wt switch --create/wt remove 경로로 우회시킵니다(0.81.0 OpenCode 2 지원 강화).

wt step copy-ignored의 reflink CoW: APFS·btrfs·XFS·ReFS에서 디스크를 거의 안 쓰고, ext4는 full copy
wt step copy-ignored의 reflink CoW: APFS·btrfs·XFS·ReFS에서 디스크를 거의 안 쓰고, ext4는 full copy

저장소·크레이트 구조

경로 역할
src/main.rs, src/cli/ CLI 엔트리·도움말
src/commands/ switch/list/remove/merge/step/hooks/picker…
src/copy.rs reflink_or_copy + rayon 병렬 디렉터리 복사
src/config/, src/shell/ 설정·셸 래퍼
src/llm.rs 커밋/요약 LLM 호출 경로
src/git_wt.rs Windows git-wt 바이너리 이름 대응
plugins/, skills/ Claude/에이전트 스킬·플러그인
docs/ worktrunk.dev Astro 문서 소스
hooks/, templates/ 예제 훅·템플릿
바이너리 타깃 wt(default-run), git-wt, 라이브러리 worktrunk

설치·실행 (검증된 경로)

# 문서 권장
brew install worktrunk && wt config shell install
cargo install worktrunk && wt config shell install

# 이 박스 실측: GitHub release musl 바이너리
# worktrunk-x86_64-unknown-linux-musl.tar.xz (v0.81.0)
./wt --version   # → wt v0.81.0

Windows는 wt가 Windows Terminal과 충돌하므로 Winget이 git-wt를 추가로 설치합니다. Terminal 앱 실행 별칭을 끄면 wt를 직접 쓸 수 있습니다. Arch는 pacman -S worktrunk, conda-forge/Pixi 피드스톡도 있습니다.

배포 채널 명령 비고
Homebrew brew install worktrunk macOS·Linux bottle, 0.81.0
Cargo cargo install worktrunk 소스 빌드, rustc ≥1.98
GitHub Release 플랫폼별 .tar.xz/.zip 이 글 스모크에 사용 (musl x86_64, ~27.7 MB)
Winget winget install max-sixty.worktrunk git-wt 별칭
Arch pacman -S worktrunk 공식 레포

박스 실측 (2026-11-06 KST)

박스 실측(2026-11-06 KST): wt v0.81.0 musl, switch --create 34ms, remove 32ms, FS ext4
박스 실측(2026-11-06 KST): wt v0.81.0 musl, switch –create 34ms, remove 32ms, FS ext4

환경: 박스 Linux x86_64, 루트 FS ext4, 바이너리 worktrunk-x86_64-unknown-linux-musl/wt 29,099,264 bytes (~27.7 MB), 버전 wt v0.81.0. 셸 통합은 설치하지 않은 채 호출했습니다.

단계 결과 벽시계
wt --version wt v0.81.0 —
throwaway git init + 초기 커밋 main @ 6fe48d9 —
wt switch --create feature-auth 형제 경로 demo-repo.feature-auth 생성; cd 경고 34 ms
wt switch --create feature-b 세 번째 worktree 21 ms
feature-auth에 커밋 ↑1, message “Add auth note” —
wt list Status/ahead/Path/Commit 컬럼 정상 —
wt remove feature-b -y 백그라운드 제거(main과 동일 커밋) 32 ms
최종 worktree main + feature-auth만 잔존 —

해석: 생성/제거 자체는 수십 밀리초 수준으로 가볍습니다. 병목은 보통 post-start의 copy-ignored·패키지 설치·에이전트 기동 쪽입니다. 셸 통합 없이는 자동화 스크립트가 경로를 직접 추적해야 합니다.

비교: plain git · 역할 인접 도구

역할 지도: worktrunk는 저장소 슬롯, agent-browser는 웹, agent-desktop은 네이티브 GUI
역할 지도: worktrunk는 저장소 슬롯, agent-browser는 웹, agent-desktop은 네이티브 GUI
축 plain git worktree worktrunk 0.81.0
주소 지정 경로 중심 브랜치(+경로) 중심
상태 표 경로·HEAD ahead/CI/메시지/Age
자동화 직접 스크립트 훅·alias·step 조합
캐시 공유 수동 cp/rsync reflink copy-ignored
머지 UX 다단계 wt merge 파이프라인
에이전트 결합 없음 -x, Claude/OpenCode 플러그인
대가 표준만 알면 됨 셸 래퍼·설정·Windows 이름 충돌

유사 ‘매니저’ 이름을 지어 비교표를 부풀리지는 않습니다. 검증 가능한 대비는 네이티브 git worktree와, 오늘 오전 다룬 agent-browser(브라우저 자동화) / 11-03 agent-desktop(네이티브 GUI)처럼 다른 계층의 에이전트 도구입니다. Worktrunk는 그 도구들이 돌아갈 저장소 슬롯을 병렬로 늘리는 쪽에 있습니다.

트레이드오프·주의점

이슈 내용 대응
셸 통합 필수에 가까움 서브프로세스는 부모 cwd를 못 바꿈 wt config shell install 후 셸 재시작
Windows wt 충돌 Windows Terminal 예약 git-wt 사용 또는 실행 별칭 해제
CoW FS 의존 ext4/NTFS는 full copy btrfs/XFS/APFS/ReFS에서 이득; 아니면 디스크·시간 예산
LLM 기능 외부 CLI·API 필요 [commit.generation] 미설정 시 해당 경로 비활성
훅 동시성 (0.81.0) prune/remove pre-hook 동시 실행 공유 상태 쓰는 훅은 조율 필요
템플릿 브레이킹 MiniJinja 3·undefined filter 엄격화 default/tojson 가드
바이너리 크기 musl 릴리스 ~27.7 MB CI 캐시·설치 채널 선택

실무 레시피 (짧게)

# 병렬 에이전트 세 칸
wt switch -x claude -c feature-a -- 'Add user authentication'
wt switch -x claude -c feature-b -- 'Fix the pagination bug'
wt switch -x claude -c feature-c -- 'Write tests for the API'

# 프로젝트 훅 예 (문서)
# .config/wt.toml
# [post-start]
# copy = "wt step copy-ignored"

# PR로 바로 점프
wt switch pr:123

정리하면, Worktrunk 0.81.0은 ‘git worktree를 조금만 감싼 스크립트’가 아니라 병렬 에이전트 운영을 위한 worktree 런타임에 가깝습니다. 경로 템플릿·훅·CoW·머지·forge 연동을 한 CLI에 모았고, 박스에서 확인한 생성/제거 지연은 무시할 수준이었습니다. 남는 숙제는 셸 통합 정착과, 파일시스템이 reflink를 주는지 먼저 재는 일입니다.