architect/arh/history/claude-code-setup/SESSION_RECOVERY.md

🔄 МЕХАНИЗМ ВОССТАНОВЛЕНИЯ СЕССИЙ

Версия: 1.0
Дата: 2025-11-14
Статус: Активный


🎯 НАЗНАЧЕНИЕ

Автоматическое обнаружение прерываний сессии и восстановление контекста работы.


📊 КАК ЭТО РАБОТАЕТ

1. ЛОГИРОВАНИЕ АКТИВНОСТИ

При каждом действии Claude Code сохраняет:
- Timestamp последней активности
- Текущую задачу
- Открытые файлы
- Состояние работы

Файл: .claude/sessions/current.json

2. ОБНАРУЖЕНИЕ ПРЕРЫВАНИЙ

При запуске новой сессии:
1. Читаем current.json
2. Вычисляем разницу во времени
3. Если разница > 5 минут → прерывание обнаружено

3. АВТОМАТИЧЕСКОЕ ВОССТАНОВЛЕНИЕ

Если прерывание < 30 минут:
- Показать короткое меню восстановления
- Предложить продолжить с того же места

Если прерывание > 30 минут:
- Показать полное меню
- Предложить начать заново или восстановить


🔧 РЕАЛИЗАЦИЯ

Структура файлов сессии

$WORKSPACE/.claude/sessions/
├── current.json          # Текущая сессия
├── 2025-11-14_06-30.json # Архив сессий
├── 2025-11-14_05-15.json
└── interruptions.log     # Лог прерываний

Формат current.json

{
  "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
}

Формат interruptions.log

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

🚀 АВТОМАТИЧЕСКИЕ ДЕЙСТВИЯ

При обнаружении прерывания:

  1. Логирование:
    ⚠️ ПРЕРЫВАНИЕ ОБНАРУЖЕНО Последняя активность: 24 минуты назад Текущая задача: Тестирование MVP приложения Прерываний в этой сессии: 2

  2. Показ меню восстановления:
    ```
    ═══════════════════════════════════════
    🔄 ВОССТАНОВЛЕНИЕ СЕССИИ
    ═══════════════════════════════════════

Прерывание #3 обнаружено
Время простоя: 24 минуты

Последняя задача:
"Тестирование MVP приложения"

Открытые файлы (2):
- 03_Orders.py
- 04_Delivery.py

TODO (2 задачи):
- [ ] Переделать страницу Доставка на 5 вкладок
- [ ] Реализовать массовые операции

═══════════════════════════════════════

Действия:
1. ✅ Восстановить (продолжить работу)
2. 📋 Показать полный отчёт
3. 🔄 Начать заново

Ваш выбор [1-3]: _
```

  1. Автоматическое восстановление контекста:
    - Открыть файлы
    - Восстановить TODO list
    - Показать последнюю команду
    - Перейти в рабочую директорию

📝 ИНТЕГРАЦИЯ С CLAUDE.MD

Добавить в начало CLAUDE.md:

## 🔄 АВТОВОССТАНОВЛЕНИЕ (улучшенное)

### ШАГ 0: Проверка прерываний

```bash
1. Проверить: существует ли .claude/sessions/current.json?
2. Прочитать last_activity timestamp
3. Вычислить время простоя
4. Прочитать interruption_count

ЕСЛИ разрыв < 5 минут:
  → Продолжить без меню (тихое восстановление)

ЕСЛИ разрыв 5-30 минут:
  → Показать КОРОТКОЕ МЕНЮ ВОССТАНОВЛЕНИЯ
  → Автоматически выбрать "Восстановить" через 10 секунд

ЕСЛИ разрыв > 30 минут ИЛИ новый день:
  → Показать ПОЛНОЕ МЕНЮ ВОССТАНОВЛЕНИЯ
  → Требовать выбор пользователя

ЕСЛИ interruption_count > 5:
  → ПРЕДУПРЕЖДЕНИЕ: Слишком много прерываний
  → Предложить сохранить состояние в отдельный файл

🛠️ РЕАЛИЗАЦИЯ СКРИПТОВ

1. Скрипт логирования: 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"

2. Скрипт обнаружения: 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

3. Скрипт восстановления: 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

🚨 ДЕЙСТВИЯ ПРИ КРИТИЧЕСКИХ СИТУАЦИЯХ

Если прерываний > 5 за сессию:

⚠️ КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ

Обнаружено 6 прерываний за эту сессию!

Возможные причины:
1. Нестабильное соединение
2. Проблемы с сервером
3. Context limit достигнут слишком часто

Рекомендации:
1. Сохранить текущее состояние в отдельный файл
2. Начать новую чистую сессию
3. Проверить стабильность соединения

Действия:
1. 💾 Сохранить состояние и начать заново
2. 🔄 Продолжить несмотря на риск
3. 📋 Показать детальный отчёт о прерываниях

Ваш выбор [1-3]: _

Автосохранение при > 10 прерываниях:

# Автоматически создаёт 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"

✨ ПРЕИМУЩЕСТВА СИСТЕМЫ

  1. Автоматическое обнаружение - без участия пользователя
  2. Умное восстановление - учитывает время простоя
  3. Полный контекст - файлы, задачи, команды
  4. Статистика - анализ причин прерываний
  5. Защита от потери данных - emergency snapshots

🔧 УСТАНОВКА

Шаг 1: Создать директории

mkdir -p $WORKSPACE/.claude/sessions

Шаг 2: Скопировать скрипты

# Скопировать все 3 скрипта в .claude/scripts/
chmod +x $WORKSPACE/.claude/scripts/*.sh

Шаг 3: Интегрировать с CLAUDE.md

Добавить вызов check_interruption.sh в начало CLAUDE.md

Шаг 4: Протестировать

# Симулировать прерывание
echo "Test" > $WORKSPACE/.claude/sessions/current.json
sleep 10
bash $WORKSPACE/.claude/scripts/check_interruption.sh

Версия: 1.0
Дата: 2025-11-14
Статус: Готово к использованию