Skip to content

0016. worktree 위치를 plan 방식에서 떼어 내 worktree 훅으로 둔다

This content is not available in your language yet.

plan은 저장소와 브랜치에 따라 정해지는 파일이고, worktree는 브랜치를 어느 폴더에 체크아웃하느냐의 문제라 서로 의존하지 않는다. 그런데 worktree 위치가 plan 방식에 묶여 있었다. plan 방식이 “기본 틀”이나 “위치만”이면 plan 훅이 “worktree는 ~/.belloga/worktrees/...에 만들어라”는 문장을 넣고 앱도 그 위치를 채웠으며, “사용 안 함”이면 형제 폴더를 채우고 아무것도 알리지 않았다.

그래서 plan은 Belloga 것을 쓰고 worktree는 자기 하네스 규칙을 따르는 조합이나 그 반대가 막혀 있었다. 또 plan 훅의 문장은 AI가 묻지 않고 그 위치에 만들게 해서, 사용자의 ~/.claude/나 rules/가 다른 위치를 말하면 두 지시가 부딪혔다.

worktree 위치 안내를 plan 훅에서 빼고, Belloga 훅 탭에서 따로 켜는 넷째 훅(belloga-claude-worktree-hook.mjs, SessionStart)으로 둔다. worktree 훅은 Belloga 터미널의 세션이고 git 저장소의 브랜치에서 열렸을 때만 안내를 넣는다. plan 방식은 보지 않는다.

  • 안내는 “worktree를 만들기 전에 사용자에게 위치를 물어라. {worktreeRuleDir}을 첫 번째 추천 선택지로 제안하고, 다른 지시가 다른 위치를 말하면 그것도 선택지에 넣어라”는 영어 문장이다(WORKTREE_ASK_RULE).
  • {worktreeRuleDir}은 ~/.belloga/worktrees/{owner}/{repo}/{branch}이고, 원격이 없으면 _local/{이름}/{branch}다. 로컬 이름이 아직 없으면 경로 없이 “만들기 전에 물어라”만 넣는다(WORKTREE_ASK_ONLY).
  • 경로 앞부분은 worktreeSegments 하나로 계산하고, 훅 스크립트에는 그 본문을 toString()으로 넣는다. 원격 해석 함수(remotePath, parseRemoteUrl, pickRemote)도 같은 방식으로 넣는다.

worktree 훅의 켜짐을 곧 “Belloga 규칙이냐 사용자 하네스냐”의 선택으로 쓴다. 별도 설정 값을 두지 않는다. 앱의 “워크트리 추가” 창도 같은 켜짐을 보고, 켜져 있으면 Belloga 위치를, 꺼져 있으면 형제 폴더를 채운다. 훅이 켜져 있으면 원격이 없는 저장소의 이름을 plan 방식과 상관없이 만든다.

worktree 훅은 사용자가 켤 때만 설치한다. 앱을 켤 때는 설치되어 있을 때만 스크립트를 다시 쓴다(0015와 같음).

  • plan 훅에 남기고 plan 방식에 따라 켜고 끈다(이전 동작). 설정 항목이 늘지 않지만, 서로 의존하지 않는 두 선택을 하나로 묶어 위 조합을 막는다. 기각했다.
  • “worktree 위치: Belloga / 내 하네스” 같은 별도 설정 값을 둔다. 선택이 이름으로 드러난다. 그러나 훅 탭의 스위치와 같은 뜻의 값이 둘이 되어, 스위치는 켜져 있는데 설정은 “내 하네스”인 모순된 상태가 생긴다. 훅 켜짐 하나로 두었다.
  • 묻지 않고 Belloga 위치에 만들게 한다(이전 문장). 대화가 한 번 줄지만, 사용자 하네스의 규칙과 부딪히면 AI가 어느 쪽을 따를지 알 수 없다. 만들기 전에 묻고, 다른 지시가 말하는 위치도 선택지에 넣게 해서 사용자의 하네스와 함께 쓸 수 있게 했다.
  • 앱의 미리 채우기는 plan 방식을 계속 본다. AI에게 알리는 위치와 앱이 채우는 위치가 어긋난다. 같은 켜짐과 같은 worktreeSegments를 보게 했다.
  • 이 버전으로 앱을 켜면 plan 훅 스크립트가 갱신되어 worktree 문장이 빠진다. worktree 훅은 자동으로 설치하지 않으므로, 지금까지 “기본 틀”이나 “위치만” 저장소에서 Belloga 위치로 worktree를 만들던 사용자도 worktree 훅을 켜기 전까지는 형제 폴더가 채워진다. 이 동작 변화는 받아들였다.
  • 이미 있는 worktree는 옮기지 않는다. Belloga는 위치와 상관없이 worktree를 찾아 보여 준다(0005).
  • SessionStart에 Belloga가 거는 스크립트가 셋이 된다. 모두 켜면 세션마다 git을 부르는 스크립트가 둘(plan 훅, worktree 훅) 돈다.
  • 훅 스크립트에 넣는 함수는 다른 모듈 값을 참조하지 않아야 한다. worktreeSegments는 _local을 상수 대신 글자로 적는다.