Когда одновременно запущено несколько сессий Claude Code, простого уведомления «Claude требует Вашего внимания» недостаточно: непонятно, какая сессия его отправила. Решение — указывать проект или папку сессии в каждом уведомлении. Каждый hook получает cwd и session_id сессии в формате JSON, так что hook может прочитать их и добавить название проекта в уведомление. Давайте сессиям понятные имена через claude -n <name> или /rename и используйте claude --worktree <name>, чтобы у каждой параллельной сессии в одном репозитории была своя папка — она и будет видна в уведомлении.
01Почему в параллельных сессиях легко запутаться
Запускать две-три сессии Claude Code параллельно — теперь обычная практика: одна исправляет баг, другая пишет тесты, третья пробует рефакторинг. Каждая останавливается в своём темпе. Проблемы всегда одни и те же:
- приходит уведомление, и непонятно, из какой вкладки terminal;
- одна сессия двадцать минут ждёт ответа на prompt, пока Вы следите за другой;
- Вы отвечаете не в том окне.
Все три сводятся к идентификации. Каждое уведомление должно сообщать, откуда оно пришло, а каждый ответ — возвращаться в ту сессию, которая спросила.
02Сначала как следует разделите сессии
Используйте worktrees для одного репозитория
Две сессии, редактирующие один и тот же checkout, будут затирать изменения друг друга. Флаг --worktree в Claude Code (сокращённо -w) создаёт изолированный git worktree и запускает сессию в нём:
claude --worktree feature-auth
claude --worktree fix-login
По умолчанию каждый worktree создаётся в .claude/worktrees/<name>/ в корне репозитория, на новой ветке worktree-<name>. Запускайте каждую команду в отдельном terminal. Добавьте .claude/worktrees/ в .gitignore, чтобы worktrees не отображались как неотслеживаемые файлы.
При выходе Claude Code проверяет worktree. Если в нём нет изменений и Вы не давали сессии имя, Claude Code удаляет worktree и его ветку; иначе спрашивает, сохранить ли его. Чтобы позже вернуться к сохранённому worktree, выполните команду claude --worktree <name> --resume, которую он выводит при выходе. Если Вы предпочитаете управлять worktrees сами, подойдёт и 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 расширяет список на все worktrees репозитория.
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 замените последнюю строку на уведомление через osascript, как показано в руководстве по macOS. В Windows читайте тот же JSON в PowerShell с помощью ConvertFrom-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, панель или окно часто подходят для метки лучше, чем папка. В руководстве по tmux показано, как найти нужную панель и переключиться на неё.
04Самое сложное: ответить нужной сессии
Уведомление с меткой подскажет, какой сессии Вы нужны. Но чтобы ответить, всё равно придётся добраться до этого терминала. При трёх сессиях это значит найти нужную вкладку, прокрутить до prompt и ввести ответ. Самодельный hook не может просто так отправить Ваш ответ обратно: вернуть решение в Claude Code может только тот hook, который ждёт внутри этой сессии.
Именно этот пробел закрывает Claude Code Notifier. Это независимый инструмент, не от Anthropic. Его утилита командной строки ccn устанавливается как hooks Claude Code на Mac, Windows и Linux, поэтому охватывает каждую запущенную сессию в любом терминале без настройки для каждой из них. В каждом уведомлении указаны имя и папка проекта, так что на iPhone или Android видно, какая сессия его отправила. Поскольку ответа ждёт тот самый hook, который отправил запрос, одобрение, выбор или дальнейшая инструкция с телефона возвращаются в ту сессию, которая спрашивала.
Несколько деталей, важных при работе с несколькими сессиями:
- Несколько компьютеров. Один телефон можно связать с несколькими компьютерами, а компьютер — с несколькими телефонами.
ccn devicesпоказывает телефоны, связанные с этим компьютером. - Присутствие. Если Вы печатали в последние 30 секунд, телефон не ждут, и терминал спрашивает как обычно. Если Вас нет на месте, сессия ждёт ответа с телефона до заданного Вами предела (
hold_ceiling_seconds) и перестаёт ждать, как только Вы коснётесь клавиатуры. - Уведомления на компьютере без телефона. Пока телефон не связан,
ccnпоказывает уведомление на компьютере, когда любая сессия завершает работу, запрашивает разрешение или задаёт вопрос.
Если Вы запускаете только одну сессию и сидите за столом, скорее всего, Вам хватит уведомления на компьютере с меткой. В сравнительном руководстве варианты сопоставлены рядом.
05FAQ
Как понять, какая сессия Claude Code отправила уведомление?
Прочитайте поле cwd из JSON-входа hook и подставьте имя папки в заголовок уведомления. С worktrees у каждой сессии своя папка, так что имя будет уникальным. Инструменты вроде Claude Code Notifier сами добавляют имя и папку проекта в каждое уведомление.
Можно ли запустить две сессии Claude Code в одном репозитории?
Да, но дайте каждой свой worktree, чтобы их правки не конфликтовали. claude --worktree <name> создаёт его в .claude/worktrees/<name>/ на новой ветке и запускает там сессию.
Как назвать сессию Claude Code?
Запустите её командой claude -n <name> или выполните /rename <name> внутри сессии. Позже её можно продолжить через claude --resume <name>.
Запускаются ли hooks отдельно для каждой сессии?
Да. Каждая сессия запускает свои hooks при срабатывании своих событий и передаёт во входных данных свои session_id и cwd. Hooks из ~/.claude/settings.json действуют для всех запускаемых Вами сессий.
Не перепутаются ли уведомления с разных компьютеров?
С ccn — нет. Каждый компьютер связывается с телефоном отдельно и имеет своё имя, а в каждом уведомлении указан проект, из которого оно пришло.