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

conventional-commit

Проверяет формат коммит-сообщения: feat/fix/refactor/docs/test/chore. Блокирует нестандартные коммиты.

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

Описание

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

Коммит — это сохранение изменений в истории проекта. К нему пишут описание что сделано. Если описывать как попало — через месяц история выглядит как мусор: "fix", "изменил", "WIP". Этот хук заставляет писать по формату.

Раньше AI писал коммиты как ему вздумается. Теперь хук блокирует коммит без правильного формата и подсказывает как надо. Выглядит как: feat: добавить авторизацию или fix: исправить кнопку.


Что делает

Хук conventional-commit проверяет каждое коммит-сообщение на соответствие спецификации Conventional Commits. Только feat:, fix:, refactor:, docs:, test:, chore: — ничего другого. Случайные "WIP", "fix bug", "изменения" не пройдут.

Стандартные коммиты важны не только для красоты: они дают возможность автогенерации CHANGELOG, семантического версионирования и понятной истории проекта.

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

Триггер: PreToolUse — до выполнения Bash с git commit. Условие: команда содержит git commit -m. Действие: проверка regex, блокировка при несоответствии.


Установка

  1. Добавь конфиг PreToolUse на Bash в .claude/settings.json
  2. Создай ~/.claude/hooks/conventional-commit.sh с правами chmod +x
  3. Проверь: попроси AI сделать коммит с сообщением "fix bug" — должен получить ошибку

Конфиг settings.json

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

Скрипт хука

#!/bin/bash
# conventional-commit.sh — проверка формата коммит-сообщения
# PreToolUse: Bash

CMD="${CLAUDE_TOOL_INPUT_COMMAND:-}"

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

MSG=$(echo "$CMD" | grep -oP '(?<=-m ")[^"]+' | head -1)

if [ -z "$MSG" ]; then
  exit 0
fi

TYPES="feat|fix|refactor|docs|test|chore|style|perf|ci|build|revert"

if ! echo "$MSG" | grep -qP "^(${TYPES})(([a-zA-Z0-9-]+))?!?: .{3,}"; then
  echo "BLOCKED [conventional-commit] Неверный формат коммита"
  echo ""
  echo "Ожидаемый формат: тип: описание"
  echo "Разрешённые типы: feat fix refactor docs test chore style perf ci build revert"
  echo ""
  echo "Примеры:"
  echo "  feat: добавить авторизацию через Telegram"
  echo "  fix(auth): исправить валидацию JWT токена"
  exit 2
fi

echo "OK [conventional-commit] Формат корректен"
exit 0

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

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

  • feat: добавить авторизацию через Telegram — корректный формат
  • fix(auth): исправить валидацию JWT — с scope в скобках
  • refactor!: переписать API — breaking change с !
  • chore: обновить зависимости — рутинные задачи

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

  • "fix bug" — нет типа с двоеточием
  • "WIP" — незавершённая работа в коммите
  • "изменения" — неинформативное сообщение
  • "update: что-то" — тип update не разрешён

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

  • Добавь hotfix|security в переменную TYPES
  • Убери типы которые команда не использует
  • Настрой минимальную длину описания (сейчас 3 символа)
  • Добавь проверку максимальной длины строки (рекомендуется 72 символа)
История git — это документация проекта. Conventional Commits делают её читаемой через год, не только через день.
#Hooks#Claude Code#Quality Gates
TG

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

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

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