| name | recover-sessions |
| description | Обработка незафиксированных сессий — создание минимальных логов, очистка breadcrumbs.
Триггеры: «recover-sessions», «обработай сессии», «незафиксированные сессии»
|
Recover Sessions — обработка pending breadcrumbs
Назначение
Обработать незавершённые сессии (прерванные без /wrap-up). Создать минимальные session logs, очистить breadcrumbs.
Запрос пользователя
$ARGUMENTS
Workflow
1. Сканирование pending
Через Glob прочитать все .claude/hooks/pending-sessions/*.json.
Для каждого файла извлечь:
session_id — ID сессии
date — дата (YYYY-MM-DD)
timestamp — момент последней записи breadcrumb, UTC. Источник HH-MM для имени лога: у breadcrumb, созданных до починки хука, start_time пуст
transcript_path — путь к транскрипту сессии. Главный признак непустоты
message_count — число строк транскрипта. Справочно: у старых breadcrumb всегда 0, опираться на это поле нельзя
elapsed_seconds — длительность. Ноль, если tmp-файла начала сессии не было
start_time — время начала. Может быть пустым
2. Классификация
Непустота сессии определяется наличием транскрипта, а НЕ значением message_count.
| Категория | Условие | Действие |
|---|
current | session_id совпадает с текущей сессией | Пропустить, не трогать |
recoverable | Файл по transcript_path существует и непуст | Создать лог, затем удалить breadcrumb |
empty | Файл по transcript_path существует, но пуст (0 байт) | Создать лог с пометкой «сессия без содержимого», затем удалить breadcrumb |
orphan | transcript_path пуст или файл по нему не найден | Ничего не удалять. Вынести в список «требуют ручного решения» и показать пользователю |
Запрещено определять пустую сессию по message_count: до починки .claude/hooks/session-save.sh это поле всегда равнялось нулю, и фильтр по нему удалил бы 100% сессий, не создав ни одного лога.
message_count использовать только как справочную величину в теле лога и только если он больше нуля.
3. Извлечение контекста
Для каждой сессии категории recoverable определить тему по её transcript_path.
Ограничения на чтение:
- Читать не более первых 50 строк транскрипта — этого достаточно для темы
- Транскрипт может весить десятки мегабайт. Никогда не загружать его целиком:
head -n 50 "$transcript_path"
- Если после 50 строк тема неясна — записать «не определена» и идти дальше
Невозможность определить тему не отменяет создание лога.
4. Создание session logs
Для каждой сессии категорий recoverable и empty создать Cache/sessions/YYYY-MM-DD_HH-MM.md:
YYYY-MM-DD — из поля date
HH-MM — из start_time, если оно непусто; иначе из timestamp (записан в UTC — отметить это в логе)
- Если файл с таким именем уже существует — добавить суффикс
_2, _3 и т.д. Существующий лог не перезаписывать
# Сессия YYYY-MM-DD HH:MM (recovered)
- **ID:** {session_id}
- **Длительность:** ~{elapsed} мин (если `elapsed_seconds` > 0, иначе «неизвестна»)
- **Сообщений:** ~{message_count} (если > 0, иначе строку не выводить)
- **Транскрипт:** {transcript_path}
- **Статус:** recovered (прервана без wrap-up)
## Тема
{тема или «не определена»}
## Примечание
Сессия восстановлена автоматически через `/recover-sessions`.
Контекст ограничен — полные данные в транскрипте по пути выше.
5. Очистка breadcrumb
Жёсткое правило: breadcrumb удаляется только после того, как лог сессии создан и записан на диск. Порядок строго такой:
- Создать лог
- Убедиться, что файл
Cache/sessions/…md существует и непуст
- Только после этого удалить
.claude/hooks/pending-sessions/{session_id}.json
Обратный порядок и удаление «заодно» запрещены. Если создание лога не удалось — breadcrumb остаётся на месте, сессия попадает в отчёт как необработанная.
Для сессий категории orphan breadcrumb не удалять ни при каких условиях — без транскрипта содержимое сессии восстановить неоткуда, и удаление breadcrumb уничтожит последний след о ней.
Сопутствующий .claude/hooks/session-start-{session_id}.tmp удалить, если он есть. Его отсутствие — нормальная ситуация, а не ошибка: хук создаёт его не всегда. Не выводить это как проблему.
6. Коммит
Только если что-то изменилось — новых логов может не быть вовсе (все breadcrumb оказались orphan или относились к текущей сессии).
git status --porcelain Cache/sessions/ .claude/hooks/pending-sessions/
Если вывод пуст — коммит не делать. Иначе:
git add Cache/sessions/ .claude/hooks/pending-sessions/
git commit -m "fix: recover N sessions"
7. Отчёт
✅ Обработано сессий: N
- [дата] — [тема] (recovered, лог создан, breadcrumb очищен)
- [дата] — сессия без содержимого (лог создан, breadcrumb очищен)
⚠️ Требуют ручного решения: M
- [дата] — {session_id}: транскрипт не найден ({transcript_path или «поле пусто»})
Breadcrumb оставлен: .claude/hooks/pending-sessions/{session_id}.json
Что можно сделать с ними:
1. Вспомнить содержание сессии и создать лог вручную
2. Удалить breadcrumb, если сессия точно не важна — только по твоему решению
Логи: Cache/sessions/
Секцию «Требуют ручного решения» показывать всегда, когда M > 0. Не скрывать и не решать за пользователя.
Правила
- Не трогать текущую сессию
- Никогда не удалять breadcrumb, если лог сессии не создан. Порядок: лог → проверка существования файла → удаление
- Непустоту определять по транскрипту, а не по
message_count
- Сессии без транскрипта (
orphan) не удалять — выносить пользователю на ручное решение
- Не блокировать работу — если тему определить не удалось, создать лог без темы
- Транскрипты читать частично (первые 50 строк), никогда не загружать целиком
- Отсутствие
session-start-*.tmp — не ошибка, не сообщать о нём
- Коммит только если были изменения
Критерий завершения: каждый breadcrumb отнесён к одной из четырёх категорий; для всех recoverable и empty созданы файлы логов и их существование проверено; удалены только те breadcrumbs, для которых лог подтверждён на диске; все orphan остались на месте и перечислены в отчёте.