Claude Code 세션을 여러 개 동시에 돌리면 "Claude가 확인을 기다리고 있어요" 같은 단순한 알림으로는 부족해요. 어느 세션에서 온 건지 알 수 없으니까요. 해결책은 모든 알림에 세션의 프로젝트나 폴더를 넣는 거예요. 각 hook은 세션의 cwd와 session_id를 JSON으로 받으므로, hook에서 이를 읽어 알림에 프로젝트 이름을 넣을 수 있어요. claude -n <name>이나 /rename으로 세션에 알아보기 쉬운 이름을 붙이고, claude --worktree <name>을 사용하면 한 저장소의 병렬 세션마다 별도 폴더가 생기고, 그 폴더 이름이 알림에 표시돼요.
01병렬 세션이 헷갈리는 이유
Claude Code 세션 두세 개를 나란히 돌리는 건 이제 흔한 작업 방식이에요. 하나는 버그를 고치고, 하나는 테스트를 작성하고, 하나는 리팩터링을 살펴보는 식이죠. 각 세션은 저마다의 속도로 멈춰요. 그리고 문제는 늘 똑같아요.
- 알림이 왔는데 어느 terminal 탭에서 온 건지 모르고,
- 다른 세션을 보는 동안 한 세션이 20분째 권한 prompt에서 기다리고 있고,
- 엉뚱한 창에 응답해요.
세 가지 모두 식별의 문제예요. 모든 알림은 어디서 왔는지 알려 줘야 하고, 모든 응답은 요청한 세션으로 돌아가야 해요.
02먼저 세션을 제대로 분리하세요
같은 저장소라면 worktree를 쓰세요
두 세션이 같은 checkout을 수정하면 서로의 변경 사항을 덮어써요. Claude Code의 --worktree 플래그(줄여서 -w)는 격리된 git worktree를 만들고 그 안에서 세션을 시작해요.
claude --worktree feature-auth
claude --worktree fix-login
기본적으로 각 worktree는 저장소 루트의 .claude/worktrees/<name>/ 아래에 worktree-<name>이라는 새 브랜치로 만들어져요. 명령은 각각 별도의 terminal에서 실행하세요. worktree가 추적되지 않은 파일로 표시되지 않도록 .gitignore에 .claude/worktrees/를 추가하세요.
종료하면 Claude Code가 worktree를 확인해요. 변경 사항이 없고 세션에 이름을 붙인 적이 없으면 Claude Code가 worktree와 브랜치를 삭제하고, 그렇지 않으면 유지할지 물어봐요. 유지한 worktree로 나중에 돌아가려면 종료 시 출력되는 claude --worktree <name> --resume 명령을 실행하세요. worktree를 직접 관리하고 싶다면 git worktree add ../project-feature-a -b feature-a도 괜찮아요. 그 폴더 안에서 claude를 실행하면 돼요.
알림 측면에서도 유용한 부수 효과가 있어요. 이제 세션마다 feature-auth 같은 고유한 폴더 이름이 생기는데, 바로 알림에 넣고 싶은 정보예요.
세션에 이름 붙이기
이름을 붙이면 세션을 찾고 재개하기 쉬워져요.
claude -n auth-refactor
실행 중인 세션에서는 /rename auth-refactor로 똑같이 할 수 있고, 이름이 prompt 바에 표시돼요. 나중에 claude --resume auth-refactor로 바로 돌아갈 수 있어요. 세션 선택 화면(이름 없이 claude --resume 실행)에서 Ctrl+W를 누르면 저장소의 모든 worktree로 목록이 확장돼요.
03직접 만든 알림에 프로젝트 넣기
모든 command hook은 표준 입력으로 JSON을 받는데, 여기에는 session_id, cwd, transcript_path, hook_event_name 등 모든 이벤트에 공통인 필드가 들어 있어요. worktree 세션에서 cwd는 worktree 루트이고, Claude가 디렉터리를 옮기면 함께 바뀌어요. hook에서 이 값을 읽고 경로의 마지막 부분을 라벨로 사용하세요.
Mac과 Linux에서는 다음 내용을 ~/.claude/hooks/notify-session.sh로 저장하고 chmod +x로 실행 권한을 주세요. jq가 필요해요.
#!/bin/sh
input=$(cat)
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
case "$event" in
Stop) msg="Claude has finished" ;;
*) msg="Claude needs you" ;;
esac
notify-send "Claude Code: $project" "$msg"
Mac에서는 macOS 가이드에 나온 것처럼 마지막 줄을 osascript 알림으로 바꾸세요. Windows에서는 PowerShell에서 ConvertFrom-Json으로 같은 JSON을 읽으면 돼요. 전체 예시는 Windows 가이드에 있어요.
그다음 ~/.claude/settings.json에서 필요한 이벤트에 등록하세요.
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command", "command": "~/.claude/hooks/notify-session.sh" }] }
],
"Notification": [
{ "matcher": "permission_prompt", "hooks": [{ "type": "command", "command": "~/.claude/hooks/notify-session.sh" }] }
]
}
}
경로와 관련해 두 가지를 기억하세요. 폴더 이름에 공백이 들어갈 수 있으니 "$input"처럼 변수는 따옴표로 감싸세요. 또 ${CLAUDE_PROJECT_DIR}로 스크립트를 참조한다면, Claude가 worktree로 이동한 뒤에도 이 값은 세션을 시작한 폴더를 그대로 가리킨다는 점에 주의하세요. 현재 폴더가 필요하면 입력에서 cwd를 읽으세요.
tmux를 쓴다면 폴더보다 pane이나 window가 더 나은 라벨일 때가 많아요. 올바른 pane을 찾아 전환하는 방법은 tmux 가이드에서 확인하세요.
04어려운 부분: 올바른 세션에 응답하기
라벨이 붙은 알림을 보면 어느 세션이 기다리는지 알 수 있어요. 하지만 응답하려면 여전히 그 terminal로 가야 해요. 세션이 세 개라면 맞는 탭을 찾고, prompt까지 스크롤해서 입력해야 하죠. 직접 만든 hook으로는 답을 다시 보내기 어려워요. Claude Code에 결정을 돌려줄 수 있는 건 해당 세션 안에서 대기 중인 hook뿐이기 때문이에요.
바로 이 빈틈을 Claude Code Notifier가 채워요. Anthropic이 만든 것이 아닌 독립 도구예요. 커맨드라인 도구인 ccn이 Mac, Windows, Linux에서 Claude Code hook으로 설치되기 때문에, 세션별 설정 없이 어떤 terminal에서 시작한 세션이든 모두 적용돼요. 알림마다 프로젝트 이름과 폴더가 표시되니 iPhone이나 Android 폰에서 어느 세션이 보낸 건지 알 수 있어요. 요청을 보낸 hook이 곧 응답을 기다리는 hook이므로, 폰에서 보낸 승인, 선택, 후속 지시는 요청한 그 세션으로 돌아가요.
여러 세션을 쓸 때 중요한 몇 가지:
- 여러 대의 컴퓨터. 폰 하나를 여러 컴퓨터와, 컴퓨터 하나를 여러 폰과 페어링할 수 있어요.
ccn devices로 이 컴퓨터와 페어링된 폰 목록을 볼 수 있어요. - 자리 감지. 최근 30초 안에 입력한 적이 있으면 폰을 기다리지 않고 terminal에서 평소처럼 물어봐요. 자리를 비운 경우에는 설정한 최대 시간(
hold_ceiling_seconds)까지 폰의 응답을 기다리고, 키보드를 건드리는 순간 대기를 멈춰요. - 폰 없이 데스크톱 알림. 폰을 페어링하기 전에도
ccn은 세션이 끝나거나, 권한이 필요하거나, 질문을 할 때 컴퓨터에 데스크톱 알림을 띄워요.
한 번에 세션 하나만 돌리고 책상 앞에 있다면 라벨이 붙은 데스크톱 알림이면 충분할 거예요. 여러 선택지는 비교 가이드에서 나란히 비교해 볼 수 있어요.
05FAQ
어느 Claude Code 세션이 알림을 보냈는지 어떻게 알 수 있나요?
hook의 JSON 입력에서 cwd 필드를 읽어 폴더 이름을 알림 제목에 넣으세요. worktree를 쓰면 세션마다 폴더가 따로 있어서 이름이 모두 달라요. Claude Code Notifier 같은 도구는 알림마다 프로젝트 이름과 폴더를 알아서 넣어줘요.
같은 저장소에서 Claude Code 세션 두 개를 돌릴 수 있나요?
네. 다만 수정 내용이 충돌하지 않도록 세션마다 worktree를 따로 주세요. claude --worktree <name>을 실행하면 새 브랜치로 .claude/worktrees/<name>/ 아래에 worktree를 만들고 그곳에서 세션을 시작해요.
Claude Code 세션에 이름을 붙이려면 어떻게 하나요?
claude -n <name>으로 시작하거나, 세션 안에서 /rename <name>을 실행하세요. 나중에 claude --resume <name>으로 다시 이어갈 수 있어요.
hook은 세션마다 따로 실행되나요?
네. 각 세션은 이벤트가 발생할 때 자기 hook을 실행하고, 입력에 그 세션의 session_id와 cwd를 넘겨요. ~/.claude/settings.json에 있는 hook은 시작하는 모든 세션에 적용돼요.
여러 컴퓨터에서 온 알림이 섞이지 않을까요?
ccn에서는 섞이지 않아요. 컴퓨터마다 폰과 따로 페어링되고 고유한 이름을 가지며, 알림마다 어느 프로젝트에서 왔는지 표시돼요.