Модуль 2.2 · Урок 4
Урок 4: Hooks и CLAUDE.md — Автоматизация и инструкции
Содержание
- Чему вы научитесь
- Что такое Hooks?
- Типы Hooks
- 1. pre-tool-use (перед действием Claude)
- 2. post-tool-use (после действия Claude)
- 3. notification hooks (уведомления)
- Структура: .claude/
- Инициализация: /init
- CLAUDE.md: Инструкции для Claude
- Зачем нужен CLAUDE.md?
- Структура CLAUDE.md
- Running the Project
- Important Rules
- Dependencies
- Useful Commands
- Naming Conventions
- Docstrings (Google style)
- Testing & Quality
- Run Tests
- Code Quality
- Running Locally
- Important Rules
- Примеры Hooks
- Hook 1: Проверка линтера (Python)
- Hook 2: Форматирование кода (Python)
- Hook 3: Запуск тестов
- Попробуйте сами
- Ключевые выводы
- Следующий урок
Чему вы научитесь
- Что такое hooks и как они работают
- Создавать и настраивать hooks для автоматизации
- Написать CLAUDE.md файл с инструкциями проекта
- Использовать settings.json для конфигурации
- Применить best practices для документирования проекта
Что такое Hooks?
Hooks — это скрипты, которые автоматически запускаются, когда Claude выполняет определённые действия.
Думайте о hooks как о автоматических фильтрах:
flowchart LR
A["pre-tool-use\nПроверка перед действием\n(синтаксис, безопасность)"] --> B["Выполнение\nClaude меняет файл"]
B --> C["post-tool-use\nЛинтер, форматирование\nавтоматически"]
C --> D["Результат\nФайл проверен и готов"]
E["pre-commit\nПроверка перед коммитом"] --> F["git commit\nСоздание коммита"]
F --> G["post-commit\nУведомление, деплой,\nобновление статуса"]
Типы Hooks
1. pre-tool-use (перед действием Claude)
Запускается перед выполнением операции:
Пример:
- Claude хочет удалить файл
- pre-hook проверяет: "это не критический файл?"
- Если OK → разрешить удаление
- Если NOT OK → заблокировать с объяснением
2. post-tool-use (после действия Claude)
Запускается после выполнения операции:
Пример:
- Claude создал Python файл
- post-hook запускает: python -m py_compile new_file.py
- post-hook запускает: black new_file.py (форматирование)
- Результат: файл создан и отформатирован
3. notification hooks (уведомления)
Отправляют результаты на внешние сервисы:
Пример:
- Claude завершил задачу
- Hook отправляет уведомление в Slack
- Hook создает коммит в git
- Hook обновляет статус в issue tracker
Структура: .claude/
Все конфигурационные файлы хранятся в .claude/ директории:
your-project/
├── .claude/
│ ├── settings.json # Конфигурация hooks и моделей
│ ├── hooks/
│ │ ├── pre-lint.sh # Проверить синтаксис перед коммитом
│ │ ├── post-format.py # Форматировать код после изменения
│ │ └── notify-slack.sh # Отправить уведомление
│ └── CLAUDE.md # Инструкции для Claude (опционально)
├── src/
├── tests/
└── requirements.txt
Инициализация: /init
Команда /init создает шаблон конфигурации:
$ cd your-project
$ claude
> /init
Claude:
┌────────────────────────────────────────────────────────┐
│ Initializing Claude Code for this project... │
│ │
│ [+] Created .claude/ directory │
│ [+] Created CLAUDE.md template │
│ [+] Created settings.json template │
│ [+] Ready for customization │
│ │
│ Next steps: │
│ 1. Edit CLAUDE.md with project instructions │
│ 2. Add hooks to .claude/hooks/ if needed │
│ 3. Customize settings.json │
└────────────────────────────────────────────────────────┘
CLAUDE.md: Инструкции для Claude
CLAUDE.md — это файл, где вы объясняете Claude правила вашего проекта.
Зачем нужен CLAUDE.md?
Claude будет помнить эти правила на весь сеанс:
CLAUDE.md содержит:
→ Описание проекта
→ Архитектура и структура
→ Соглашения кодирования
→ Команды для тестирования и запуска
→ Правила и запреты (что Claude НЕ должен делать)
→ Рекомендуемые инструменты
Структура CLAUDE.md
# My Python Project
## Project Overview
Brief description of what the project does.
- Build status: [status badge]
- Main language: Python 3.10+
- Framework: FastAPI
## Architecture
[Short explanation of how code is organized]
### Directory Structure
src/ ├── api/ # FastAPI routes ├── models/ # Database models ├── services/ # Business logic └── utils/ # Helper functions
## Code Conventions
### Python Style
- Use type hints for all functions
- Follow PEP 8 (use black for formatting)
- Docstrings: Google style
### Naming
- Functions: snake_case
- Classes: PascalCase
- Constants: UPPER_CASE
## Testing
```bash
# Run all tests
pytest
# Run with coverage
pytest --cov=src
Running the Project
# Start dev server
uvicorn src.main:app --reload --port 8000
# Run migrations
alembic upgrade head
Important Rules
- Never commit directly to main branch
- Never hardcode secrets or API keys
- [+] Always write tests for new features
- [+] Update CHANGELOG.md for each release
- [+] Keep docstrings up to date
Dependencies
pip install -r requirements.txt
pip install -r requirements-dev.txt # For development
Useful Commands
pytest- Run testsblack src/- Format codeflake8 src/- Lint codemypy src/- Type checking
### Пример CLAUDE.md для реального проекта
```markdown
# Chat API Backend
## Overview
RESTful API для приложения чата, написанный на FastAPI.
- HTTP API с JWT аутентификацией
- WebSocket поддержка для real-time сообщений
- PostgreSQL база данных
## Technology Stack
- FastAPI 0.100+
- SQLAlchemy ORM
- Pydantic v2
- PostgreSQL 15
- Redis для кеширования
- Docker для deployment
## Project Structure
src/ ├── api/ │ ├── auth.py # Аутентификация и регистрация │ ├── messages.py # CRUD операции с сообщениями │ ├── users.py # Пользователи и профили │ └── ws.py # WebSocket эндпоинты ├── models/ # SQLAlchemy ORM модели ├── schemas/ # Pydantic схемы валидации ├── services/ # Бизнес-логика ├── database.py # Подключение к БД └── main.py # Точка входа приложения
## Coding Standards
### Python
- Python 3.10+ only
- Type hints everywhere (use mypy for checking)
- Use `from __future__ import annotations` in all files
### Imports
```python
# Order: standard library, third-party, local
import os
from typing import Optional
import fastapi
from sqlalchemy import create_engine
from src.models import User
Naming Conventions
get_user()notgetUser()class UserSchemanotclass user_schemaAPI_KEY = ...notapi_key = ...
Docstrings (Google style)
def create_message(user_id: int, content: str) -> Message:
"""Create a new message for the given user.
Args:
user_id: ID of the user creating the message
content: Message content (max 500 chars)
Returns:
Created Message object
Raises:
UserNotFoundError: If user_id doesn't exist
ValidationError: If content is empty
"""
Testing & Quality
Run Tests
# All tests with coverage
pytest --cov=src --cov-report=html
# Just unit tests
pytest tests/unit/
# Integration tests (needs DB)
pytest tests/integration/
Code Quality
# Format code
black src/ tests/
# Check style
flake8 src/
# Type checking
mypy src/
Running Locally
# 1. Setup environment
python -m venv venv
source venv/bin/activate # or venv\Scripts\activate on Windows
# 2. Install dependencies
pip install -r requirements-dev.txt
# 3. Setup database
docker run -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:15
alembic upgrade head
# 4. Run server
uvicorn src.main:app --reload --port 8000
Important Rules
[-] NEVER:
- Commit sensitive data (.env, secrets, API keys)
- Add to requirements.txt without testing
- Write code without type hints
- Skip tests for new features
[+] ALWAYS:
- Write tests before/alongside code
- Update docstrings when changing functions
- Check with
mypybefore pushing - Review diffs carefully
## Размер и лучшие практики CLAUDE.md
| Аспект | Рекомендация |
|--------|-------------|
| Размер | не более `200` строк на файл; для больших проектов — модульные инструкции в `.claude/rules/*.md` |
| Содержание | Самое важное только! |
| Обновление | После изменений в архитектуре |
| Язык | Язык проекта (для команды) |
| Детальность | Высокоуровневое описание |
**Чего НЕ включать:**
- Длинные примеры кода
- Вся документация (ссылка на docs/ если есть)
- Детали каждого файла
- История версий (это для CHANGELOG)
## settings.json: Конфигурация Hooks
Пример конфигурации:
```json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit|GitCommit",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/prevent-main.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/format-python.py"
}
]
}
],
"FileChanged": [
{
"matcher": "src/**/*.py",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/run-tests.sh"
}
]
}
]
},
"models": {
"default": "claude-sonnet-4-6",
"fast": "claude-haiku-4-5"
},
"permissions": {
"deny": [
".git/**",
"__pycache__/**",
"*.pyc",
"venv/**"
]
}
}
Примеры Hooks
Hook 1: Проверка линтера (Python)
Hook: Автопроверка Python-кода
Hook 2: Форматирование кода (Python)
Hook: Автоформатирование Python-файлов
Hook 3: Запуск тестов
#!/bin/bash
# .claude/hooks/run-tests.sh
echo "Running tests..."
pytest tests/ -v --tb=short
if [ $? -eq 0 ]; then
echo "[+] All tests passed"
exit 0
else
echo "[-] Tests failed - review before proceeding"
exit 1
fi
Попробуйте сами
Задание 1: Инициализация
cd your-project
claude
> /init
# Изучите созданные файлы
ls -la .claude/
cat .claude/CLAUDE.md
cat .claude/settings.json
Задание 2: Создание CLAUDE.md
Отредактируйте .claude/CLAUDE.md:
# My Project
## Overview
[Краткое описание]
## Technology Stack
[Основные технологии]
## Project Structure
[Структура папок]
## How to Run
[Команды для запуска]
## Important Rules
[Что Claude должен помнить]
Задание 3: Настройка простого hook
Создайте файл .claude/hooks/format.sh:
#!/bin/bash
echo "Formatting code..."
# Добавьте свою команду форматирования
Ключевые выводы
- Hooks автоматизируют повторяющиеся задачи (линтинг, тестирование, форматирование)
- CLAUDE.md файл содержит правила и инструкции для Claude
/initкоманда инициализирует конфигурацию проекта- settings.json управляет hooks и настройками моделей
- Хороший CLAUDE.md улучшает качество работы Claude на 50%+
- Hooks экономят время и гарантируют соответствие стандартам
Следующий урок
В следующем уроке мы разберём продвинутые техники, работу с git, оптимизацию затрат и частые ошибки.