ХукКачество кода

backup-before-edit

Создаёт бэкап файла перед каждым редактированием. Если что-то пойдёт не так — можно откатиться.

Закинь в Claude, Cursor или любой AI

Описание

Простым языком

Перед тем как AI правит твой файл, хук делает его копию — как черновик перед чистовиком. Если AI напортачил, ты находишь копию в папке .backups/ и восстанавливаешь одной командой.

Раньше после неудачного редактирования нужно было вспоминать как откатить изменения через git. Теперь есть папка с копиями: зашёл, скопировал нужную версию — и дело сделано.


Что делает

Хук backup-before-edit создаёт копию файла с временной меткой в директории .backups/ перед каждым редактированием. Если AI неудачно изменил файл — есть бэкап для быстрого восстановления без git stash и git checkout.

Особенно полезен при рефакторинге больших файлов или экспериментах. Хранит последние 5 версий каждого файла — старые удаляются автоматически.

Когда срабатывает

Триггер: PreToolUse — до операции Edit (не Write). Условие: файл существует и не в node_modules, .git, dist. Действие: копирует файл в .backups/ с временной меткой.


Установка

  1. Добавь конфиг PreToolUse на Edit в .claude/settings.json
  2. Создай скрипт ~/.claude/hooks/backup-before-edit.sh с правами chmod +x
  3. Добавь .backups/ в .gitignore проекта

Конфиг settings.json

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/backup-before-edit.sh"
          }
        ]
      }
    ]
  }
}

Скрипт хука

#!/bin/bash
# backup-before-edit.sh — бэкап файла перед редактированием
# PreToolUse: Edit

FILE="${CLAUDE_TOOL_INPUT_PATH:-}"
[ -z "$FILE" ] && exit 0
[ ! -f "$FILE" ] && exit 0

case "$FILE" in
  */node_modules/*|*/.git/*|*/dist/*|*/.next/*|*/build/*) exit 0 ;;
esac

FILE_SIZE=$(stat -c%s "$FILE" 2>/dev/null || stat -f%z "$FILE" 2>/dev/null || echo 0)
if [ "$FILE_SIZE" -gt 5242880 ]; then
  exit 0
fi

PROJECT_DIR=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
BACKUP_DIR="$PROJECT_DIR/.backups"
mkdir -p "$BACKUP_DIR"

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BASE=$(basename "$FILE")
BACKUP_PATH="$BACKUP_DIR/${BASE}.${TIMESTAMP}.bak"

cp "$FILE" "$BACKUP_PATH"
echo "BACKUP [backup-before-edit] $BACKUP_PATH"

ls -t "$BACKUP_DIR/${BASE}."*.bak 2>/dev/null | tail -n +6 | xargs rm -f 2>/dev/null

exit 0

Примеры работы

Восстановление файла из бэкапа — одна команда:

# Смотрим список бэкапов
ls .backups/auth.ts.*.bak

# Восстанавливаем конкретную версию
cp .backups/auth.ts.20260227_143022.bak src/auth.ts

# Берём самый свежий бэкап
ls -t .backups/auth.ts.*.bak | head -1 | xargs -I{} cp {} src/auth.ts

Что пропускает

  • Write — только новые файлы, бэкапить нечего
  • Файлы в node_modules, dist, .next, .git
  • Бинарные файлы и файлы больше 5MB

Что обрабатывает

  • Каждый Edit на существующем файле — создаёт .bak
  • Множественные правки одного файла — несколько версий с метками
  • Автоочистка: оставляет только 5 последних бэкапов на файл

Настройка под себя

  • Измени tail -n +6 на tail -n +N для другого лимита версий
  • Используй ~/.claude-backups/ для централизованного хранения
  • Добавь фильтр по расширениям: бэкапить только .ts, .py, .go
  • Интегрируй с rsync для зеркалирования бэкапов на другой диск
git — это история, бэкап — это страховка. git помогает когда ты коммитишь. Бэкап помогает когда ты нет.
#Hooks#Claude Code
TG

> Пока нет комментариев

Связанный контент

Похожие инструменты