Pi 에이전트가 작업마다 자체 git worktree를 생성하도록 만들기 (bare checkout, main은 읽기 전용)
Make Pi agents natively create their own git worktree for every task (bare checkout, main is read-only)
핵심 요약
Pi 에이전트의 세션 충돌과 main 브랜치 오수정을 방지하는 bare worktree 관리 플러그인을 개발했습니다.
- 작업 격리 — 에이전트별로 독립적인 worktree를 생성하여 세션 간 충돌 방지
- main 보호 — main 브랜치를 읽기 전용으로 설정하여 실수로 인한 코드 수정 차단
- 성능 최적화 — git 명령어 대신 파일 시스템을 직접 읽어 세션 시작과 도구 호출 속도 향상
- 환경 공유 — .shared-env 폴더를 통해 .env 등 필수 설정 파일을 모든 worktree에 심볼릭 링크로 공유

한 레포지토리에서 Pi 세션을 여러 개 동시에 돌리는데, 자꾸 문제가 터지더라고:
-
에이전트가 main을 건드림. 대충 빨리 고쳐달라고 하면 바로 main에 커밋을 박아버림.
-
MCP는 워크트리 관리에 너무 느림. 근데 Pi에서는 네이티브 워크트리 관리 기능을 하네스에 넣어서 미친 듯이 빠르게 만들 수 있음.
-
세션끼리 충돌함. 한 폴더에 에이전트 두 개가 있는데, 하나가 `git stash`를 날리면 다른 놈 작업물이 다 날아감.
-
(서브)에이전트가 계속 cd를 해야 함. 모든 명령어마다 cd를 쳐야 해서 토큰만 낭비함.
-
새 워크트리가 안 돌아감. `.env`도 없고 키도 없어서 앱 실행이 안 됨.
그래서 pi-bare-worktrees를 만들었음. 영상 보면 45초 만에 다 나옴.
왜 bare 체크아웃인가
일반 체크아웃에서는 레포 루트가 곧 main임. 거기서 시작하는 모든 에이전트가 기본적으로 main을 수정하게 됨. 워크트리는 ../acme-login, ~/tmp/fix-2처럼 아무 데나 흩어지고.
게다가 main이 루트에 박혀 있어서 옮기거나 지울 수도 없음.
bare 체크아웃은 이걸 해결함. 모든 브랜치가 폴더 하나씩 차지하고, 특별한 놈은 하나도 없음:
acme/
├── .bare/ bare repo
├── .shared-env/ gitignored files/folders to share, like .env
├── main/
├── feat/login-typo/
└── fix/footer/
경로가 곧 브랜치 이름임. 루트에는 수정할 코드가 없으니 실수로 건드릴 일도 없음.
이 플러그인이 하는 일
-
main은 읽기 전용. 에이전트가 main을 처음 수정하려고 하면 막히고,
worktree create를 호출하라는 메시지가 뜸. 시키는 대로 하면 재시도할 때 새 워크트리에 작업이 들어감. -
cd필요 없음. 이후에는 모든 툴 호출이 워크트리 안으로 라우팅되니까, 모델이 계속 상대 경로로 작업할 수 있음.

