tdd-gate — хук для Claude Code: тесты раньше кода
Хук блокирует правку production-файлов, пока рядом нет теста. Пригодится, если хотите удержать TDD в работе с агентом.
npx claude-code-templates@latest --hook quality-gates/tdd-gateЧто делает tdd-gate
tdd-gate — хук на событие PreToolUse, который перехватывает Edit, MultiEdit и Write. Перед записью в файл с расширением .cs, .py, .ts, .go, .rs, .rb, .php, .java, .kt, .swift или .dart скрипт ищет тестовый файл по типовым именам: MyClassTest.ext, my-class.test.ext, my_class_test.ext, test_my_class.ext. Не нашёл — правка не проходит.
Проверка не срабатывает на конфигах, миграциях, DTO, инфраструктурных файлах и самих тестах. То есть хук не мешает править settings.json или схему базы, но упрётся, если вы попробуете дописать метод в сервис без теста. Логика целиком в bash-скрипте tdd-gate.sh, который кладётся в .claude/hooks/ и вызывается через $CLAUDE_PROJECT_DIR.
Установка идёт через npx claude-code-templates@latest --hook quality-gates/tdd-gate, после чего запись хука появляется в .claude/settings.json. Скрипту нужен bash в системе. Автор ссылается на методологию Spec-Driven Development из pm-workspace.
Какие задачи решает
- заставить агента писать тест до реализации
- поймать правку сервиса без покрытия
- не пропустить добавление метода в класс без теста
- удержать порядок «тест, потом код» в новой фиче
Примеры запросов агенту
- Добавь метод расчёта скидки в OrderService — сначала тест, потом код
- Напиши тест на этот сценарий и только после этого правь реализацию
- Почему правка не проходит? Проверь, есть ли тестовый файл для этого модуля
Как установить tdd-gate
1Через claude-code-templates
npx claude-code-templates@latest --hook quality-gates/tdd-gate2Вручную: положить файлы
.claude/settings.jsonБлок hooks: событие (PreToolUse, PostToolUse, Stop…) → команда. Личные — ~/.claude/settings.json
По шагам, с командами для каждой платформы: Хуки Claude Code: что это, где настраивать и как запретить опасную команду
Вопросы о tdd-gate
Как установить tdd-gate в Claude?
Выполните npx claude-code-templates@latest --hook quality-gates/tdd-gate. Команда кладёт tdd-gate.sh в .claude/hooks/ и прописывает хук в .claude/settings.json.
Что делает tdd-gate?
Блокирует Edit, MultiEdit и Write для production-файлов, если рядом нет теста с подходящим именем. Конфиги, миграции, DTO и сами тесты пропускаются.
Какие имена тестовых файлов распознаёт хук?
MyClassTest.ext, my-class.test.ext, my_class_test.ext и test_my_class.ext. Если файл назван иначе, правка не пройдёт.
Исходный текст
tdd-gate.json · MIT
{
"description": "Test-Driven Development enforcement hook. Blocks editing production code files (.cs, .py, .ts, .go, .rs, .rb, .php, .java, .kt, .swift, .dart) unless a corresponding test file exists. Forces the TDD workflow: write tests first, then implement. Automatically skips config files, migrations, DTOs, test files themselves, and infrastructure files. Looks for test files with common naming patterns (MyClassTest.ext, my-class.test.ext, my_class_test.ext, test_my_class.ext). Inspired by pm-workspace's Spec-Driven Development methodology.",
"supportingFiles": [
{
"source": "tdd-gate.sh",
"destination": ".claude/hooks/tdd-gate.sh",
"executable": true
}
],
"hooks": {
"PreToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/tdd-gate.sh"
}
]
},
{
"matcher": "MultiEdit",
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/tdd-gate.sh"
}
]
},
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/tdd-gate.sh"
}
]
}
]
}
}
© davila7 · MIT · davila7/claude-code-templates