ХукБезопасность

branch-guard

Блокирует прямой push в main/master. Предлагает создать PR через GitHub CLI.

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

Описание

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

В разработке есть главная ветка кода — обычно main. Это то что работает в продакшене, на реальном сайте. Прямо туда писать опасно: одна ошибка — и сайт сломан. Этот хук блокирует попытку записать прямо в main.

Раньше AI мог запушить изменения прямо в основную ветку. Теперь хук говорит: нет, сначала создай отдельную ветку, потом Pull Request — чтобы кто-то проверил перед слиянием.


Что делает

Хук branch-guard блокирует прямой git push в ветки main и master. Все изменения должны проходить через Pull Request. Работает как дополнение к GitHub Branch Protection Rules — даже если защита на GitHub не настроена, хук не пустит.

AI иногда уверенно пишет git push origin main как само собой разумеющееся. Этот хук добавляет трение в правильном месте.

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

Триггер: PreToolUse — до выполнения Bash. Условие: команда содержит git push в main или master. Действие: блокировка с предложением создать PR через gh pr create.


Установка

  1. Добавь конфиг PreToolUse на Bash в .claude/settings.json
  2. Создай ~/.claude/hooks/branch-guard.sh с правами chmod +x
  3. Убедись, что установлен GitHub CLI: gh --version

Конфиг settings.json

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/branch-guard.sh"
          }
        ]
      }
    ]
  }
}

Скрипт хука

#!/bin/bash
# branch-guard.sh — защита main/master от прямого push
# PreToolUse: Bash

CMD="${CLAUDE_TOOL_INPUT_COMMAND:-}"

if ! echo "$CMD" | grep -qE 'gits+push'; then
  exit 0
fi

CURRENT_BRANCH=$(git branch --show-current 2>/dev/null)
PROTECTED="main|master|production|release"

if echo "$CMD" | grep -qE "gits+pushs+(origins+)?(${PROTECTED})"; then
  echo "BLOCKED [branch-guard] Прямой push в защищённую ветку запрещён"
  echo ""
  echo "Вместо push в main — создай PR:"
  echo "  git push origin $CURRENT_BRANCH"
  echo "  gh pr create --title 'описание' --base main"
  exit 2
fi

if echo "$CMD" | grep -qE 'gits+pushs+(--force|-f)'; then
  if echo "$CURRENT_BRANCH" | grep -qE "^(${PROTECTED})$"; then
    echo "BLOCKED [branch-guard] force push в $CURRENT_BRANCH запрещён"
    echo "Используй: git push --force-with-lease"
    exit 2
  fi
  echo "WARN [branch-guard] force push в $CURRENT_BRANCH — убедись что это нужно"
fi

exit 0

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

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

  • git push origin feature/auth — feature-ветка проходит свободно
  • git push origin dev — dev-ветка не защищена по умолчанию
  • git push --force-with-lease — безопасный force (допустим)

Что блокирует

  • git push origin main — прямой push в main
  • git push origin master — прямой push в master
  • git push --force origin main — force push в защищённую ветку

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

  • Добавь staging|release в переменную PROTECTED
  • Настрой список через переменную окружения PROTECTED_BRANCHES
  • Интегрируй с gh api для проверки Branch Protection Rules из GitHub
main — это прод. В прод — через ревью. Хук не про бюрократию, а про то чтобы никогда не делать hotfix в 3 ночи потому что кто-то запушил напрямую.
#Hooks#Claude Code#Quality Gates
TG

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

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

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