Версия: 1.0
Дата: 2025-11-14
Статус: Активный
Автоматическое обнаружение прерываний сессии и восстановление контекста работы.
При каждом действии Claude Code сохраняет:
- Timestamp последней активности
- Текущую задачу
- Открытые файлы
- Состояние работы
Файл: .claude/sessions/current.json
При запуске новой сессии:
1. Читаем current.json
2. Вычисляем разницу во времени
3. Если разница > 5 минут → прерывание обнаружено
Если прерывание < 30 минут:
- Показать короткое меню восстановления
- Предложить продолжить с того же места
Если прерывание > 30 минут:
- Показать полное меню
- Предложить начать заново или восстановить
$WORKSPACE/.claude/sessions/
├── current.json # Текущая сессия
├── 2025-11-14_06-30.json # Архив сессий
├── 2025-11-14_05-15.json
└── interruptions.log # Лог прерываний
{
"session_id": "20251114_063000",
"started_at": "2025-11-14T06:30:00Z",
"last_activity": "2025-11-14T06:54:00Z",
"current_task": "Тестирование MVP приложения",
"mode": "project:marketplace:code",
"files_open": [
"$WORKSPACE/projects/marketplace/solution/mvp/code/pages/03_Orders.py",
"$WORKSPACE/projects/marketplace/solution/mvp/code/pages/04_Delivery.py"
],
"todos": [
{"task": "Переделать страницу Доставка на 5 вкладок", "status": "pending"},
{"task": "Реализовать массовые операции", "status": "pending"}
],
"context": {
"project": "marketplace",
"branch": "feature/mvp-delivery",
"last_command": "cat /tmp/FINAL_TEST_REPORT.md",
"working_directory": "$WORKSPACE/projects/marketplace/solution/mvp/code"
},
"interruption_count": 2
}
2025-11-14 06:30:00 | SESSION_START | ID: 20251114_063000
2025-11-14 06:45:12 | INTERRUPTION | Duration: 15min | Reason: Context limit
2025-11-14 06:45:15 | SESSION_RESUME | Restored from: 20251114_063000
2025-11-14 06:52:30 | INTERRUPTION | Duration: 8min | Reason: User disconnect
2025-11-14 06:52:35 | SESSION_RESUME | Restored from: 20251114_063000
Логирование:
⚠️ ПРЕРЫВАНИЕ ОБНАРУЖЕНО
Последняя активность: 24 минуты назад
Текущая задача: Тестирование MVP приложения
Прерываний в этой сессии: 2
Показ меню восстановления:
```
═══════════════════════════════════════
🔄 ВОССТАНОВЛЕНИЕ СЕССИИ
═══════════════════════════════════════
Прерывание #3 обнаружено
Время простоя: 24 минуты
Последняя задача:
"Тестирование MVP приложения"
Открытые файлы (2):
- 03_Orders.py
- 04_Delivery.py
TODO (2 задачи):
- [ ] Переделать страницу Доставка на 5 вкладок
- [ ] Реализовать массовые операции
═══════════════════════════════════════
Действия:
1. ✅ Восстановить (продолжить работу)
2. 📋 Показать полный отчёт
3. 🔄 Начать заново
Ваш выбор [1-3]: _
```
## 🔄 АВТОВОССТАНОВЛЕНИЕ (улучшенное)
### ШАГ 0: Проверка прерываний
```bash
1. Проверить: существует ли .claude/sessions/current.json?
2. Прочитать last_activity timestamp
3. Вычислить время простоя
4. Прочитать interruption_count
ЕСЛИ разрыв < 5 минут:
→ Продолжить без меню (тихое восстановление)
ЕСЛИ разрыв 5-30 минут:
→ Показать КОРОТКОЕ МЕНЮ ВОССТАНОВЛЕНИЯ
→ Автоматически выбрать "Восстановить" через 10 секунд
ЕСЛИ разрыв > 30 минут ИЛИ новый день:
→ Показать ПОЛНОЕ МЕНЮ ВОССТАНОВЛЕНИЯ
→ Требовать выбор пользователя
ЕСЛИ interruption_count > 5:
→ ПРЕДУПРЕЖДЕНИЕ: Слишком много прерываний
→ Предложить сохранить состояние в отдельный файл
session_logger.sh#!/bin/bash
# Автоматически вызывается при каждом действии
SESSION_FILE="$WORKSPACE/.claude/sessions/current.json"
LOG_FILE="$WORKSPACE/.claude/sessions/interruptions.log"
# Обновить last_activity
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Обновить current.json
jq ".last_activity = \"$TIMESTAMP\"" "$SESSION_FILE" > "$SESSION_FILE.tmp"
mv "$SESSION_FILE.tmp" "$SESSION_FILE"
# Логировать в файл
echo "$(date '+%Y-%m-%d %H:%M:%S') | ACTIVITY | $1" >> "$LOG_FILE"
check_interruption.sh#!/bin/bash
# Запускается при старте новой сессии
SESSION_FILE="$WORKSPACE/.claude/sessions/current.json"
LOG_FILE="$WORKSPACE/.claude/sessions/interruptions.log"
if [ ! -f "$SESSION_FILE" ]; then
echo "Новая сессия - нет предыдущих данных"
exit 0
fi
# Читаем last_activity
LAST_ACTIVITY=$(jq -r '.last_activity' "$SESSION_FILE")
CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Вычисляем разницу в секундах
LAST_EPOCH=$(date -d "$LAST_ACTIVITY" +%s 2>/dev/null || echo 0)
CURRENT_EPOCH=$(date -d "$CURRENT_TIME" +%s)
DIFF_SECONDS=$((CURRENT_EPOCH - LAST_EPOCH))
DIFF_MINUTES=$((DIFF_SECONDS / 60))
# Обнаружение прерывания
if [ $DIFF_MINUTES -gt 5 ]; then
# Увеличиваем счётчик
INTERRUPTION_COUNT=$(jq -r '.interruption_count // 0' "$SESSION_FILE")
NEW_COUNT=$((INTERRUPTION_COUNT + 1))
jq ".interruption_count = $NEW_COUNT" "$SESSION_FILE" > "$SESSION_FILE.tmp"
mv "$SESSION_FILE.tmp" "$SESSION_FILE"
# Логируем
echo "$(date '+%Y-%m-%d %H:%M:%S') | INTERRUPTION | Duration: ${DIFF_MINUTES}min | Count: $NEW_COUNT" >> "$LOG_FILE"
# Показываем меню восстановления
echo "⚠️ ПРЕРЫВАНИЕ #$NEW_COUNT ОБНАРУЖЕНО"
echo "Время простоя: ${DIFF_MINUTES} минут"
# Возвращаем код для показа меню
exit 1
else
echo "✅ Сессия продолжается (${DIFF_MINUTES} минут с последней активности)"
exit 0
fi
restore_session.sh#!/bin/bash
# Восстанавливает контекст из current.json
SESSION_FILE="$WORKSPACE/.claude/sessions/current.json"
if [ ! -f "$SESSION_FILE" ]; then
echo "❌ Нет данных для восстановления"
exit 1
fi
echo "🔄 Восстановление сессии..."
# Читаем данные
TASK=$(jq -r '.current_task' "$SESSION_FILE")
MODE=$(jq -r '.mode' "$SESSION_FILE")
WORKING_DIR=$(jq -r '.context.working_directory' "$SESSION_FILE")
BRANCH=$(jq -r '.context.branch' "$SESSION_FILE")
echo "📋 Задача: $TASK"
echo "🎯 Режим: $MODE"
echo "📁 Директория: $WORKING_DIR"
echo "🌿 Ветка: $BRANCH"
# Переходим в рабочую директорию
if [ -d "$WORKING_DIR" ]; then
cd "$WORKING_DIR"
echo "✅ Перешли в $WORKING_DIR"
fi
# Показываем открытые файлы
echo ""
echo "📄 Открытые файлы:"
jq -r '.files_open[]' "$SESSION_FILE" | while read file; do
if [ -f "$file" ]; then
echo " ✅ $file"
else
echo " ❌ $file (не найден)"
fi
done
# Показываем TODO
echo ""
echo "✅ TODO список:"
jq -r '.todos[] | " [\(.status)] \(.task)"' "$SESSION_FILE"
echo ""
echo "✨ Контекст восстановлен!"
cat $WORKSPACE/.claude/sessions/interruptions.log | \
grep INTERRUPTION | \
awk '{print $1, $2, $6}' | \
tail -20
Пример вывода:
2025-11-14 06:45:12 Duration: 15min
2025-11-14 06:52:30 Duration: 8min
cat $WORKSPACE/.claude/sessions/interruptions.log | \
grep INTERRUPTION | \
awk '{print $8}' | \
sort | uniq -c | sort -rn
Пример:
15 Context limit
8 User disconnect
3 Network error
⚠️ КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ
Обнаружено 6 прерываний за эту сессию!
Возможные причины:
1. Нестабильное соединение
2. Проблемы с сервером
3. Context limit достигнут слишком часто
Рекомендации:
1. Сохранить текущее состояние в отдельный файл
2. Начать новую чистую сессию
3. Проверить стабильность соединения
Действия:
1. 💾 Сохранить состояние и начать заново
2. 🔄 Продолжить несмотря на риск
3. 📋 Показать детальный отчёт о прерываниях
Ваш выбор [1-3]: _
# Автоматически создаёт snapshot
SNAPSHOT_FILE="$WORKSPACE/.claude/sessions/emergency_snapshot_$(date +%Y%m%d_%H%M%S).json"
cp current.json "$SNAPSHOT_FILE"
echo "🆘 Критическая ситуация: создан emergency snapshot"
echo " Файл: $SNAPSHOT_FILE"
mkdir -p $WORKSPACE/.claude/sessions
# Скопировать все 3 скрипта в .claude/scripts/
chmod +x $WORKSPACE/.claude/scripts/*.sh
Добавить вызов check_interruption.sh в начало CLAUDE.md
# Симулировать прерывание
echo "Test" > $WORKSPACE/.claude/sessions/current.json
sleep 10
bash $WORKSPACE/.claude/scripts/check_interruption.sh
Версия: 1.0
Дата: 2025-11-14
Статус: Готово к использованию