Средний

Настройка CLAUDE.md для Claude Code

Алексей Кузнецов
Алексей Кузнецов
Системный администратор21 октября 2026 г.12 мин чтения

Разбираем, как файл CLAUDE.md на основе наблюдений Андрея Карпаты помогает сделать работу Claude Code более предсказуемой и эффективной в разработке.

Настройка CLAUDE.md для Claude Code

Разбираем, как файл CLAUDE.md на основе наблюдений Андрея Карпаты помогает сделать работу Claude Code более предсказуемой и эффективной в разработке.

Проблема непредсказуемости LLM в кодинге

Проблема непредсказуемости LLM в кодинге

Когда я впервые начал использовать Claude Code в своих проектах, я столкнулся с той же проблемой, что и многие коллеги: модель ведет себя как очень способный, но крайне рассеянный стажёр. Она понимает синтаксис, знает алгоритмы, но совершенно не чувствует контекст конкретно вашего проекта.

В работе с LLM существует понятие «галлюцинаций», но в контексте разработки я бы назвал это «контекстным дрейфом». Это когда модель предлагает решение, которое технически верно, но нарушает архитектуру вашего приложения или принятые в команде стандарты. Без чётких рамок работа превращается в бесконечный цикл правок: вы просите исправить баг, а в ответ получаете код, который ломает тесты или использует устаревшие библиотеки.

Типичные ошибки при работе с кодом

Если не задать модели жёсткие правила игры, она начнет совершать ошибки, которые в реальной инфраструктуре стоят дорого. С практической точки зрения я выделил три наиболее частых сценария:

  1. Нарушение архитектурных паттернов. Допустим, в вашем проекте вы используете чистую архитектуру (Clean Architecture) и строго разделяете слои. Claude может внезапно решить, что проще всего будет вызвать репозиторий напрямую из контроллера, минуя слой бизнес-логики. Это создаёт технический долг прямо в процессе генерации кода.
  2. Игнорирование специфики окружения. Модель может предложить команду, которая сработает в стандартном Ubuntu, но упадет в вашем контейнере на базе Alpine из-за отсутствия нужных утилит. Например, вместо использования musl-совместимых инструментов она попытается вызвать glibc-зависимые функции.
  3. Стилевой хаос. В одном файле она пишет код в функциональном стиле, в другом — в объектно-ориентированном, а в третьем — вообще забывает про обработку ошибок.

Пример того, как выглядит типичный «непредсказуемый» запрос к терминалу или коду:

bash
# Модель может предложить установить пакет через apt, 
# хотя в вашем проекте используется строго менеджер пакетов внутри Docker
sudo apt-get install python3-pip 

Вместо этого, если бы модель знала контекст, она бы использовала существующий Dockerfile или requirements.txt.

Почему стандартных инструкций недостаточно

Многие пытаются решить эту проблему через системный промпт или длинные инструкции в начале чата. Но у этого подхода есть фундаментальный изъян: контекстное окно не бесконечно, а внимание модели распределяется по всему объёму данных. Чем больше «воды» в инструкциях, тем меньше веса модель придает критически важным правилам.

Стандартные инструкции — это как общие правила поведения в офисе: «будьте вежливы», «соблюдайте дедлайны». Это полезно, но не помогает инженеру понять, как именно нужно разворачивать базу данных в этом конкретном кластере.

Нам же нужна предсказуемость. А предсказуемость в разработке достигается через локальные, жестко зафиксированные правила, которые всегда под рукой. Именно здесь на помощь приходит подход, который популяризировал Андрей Карпаты. Вместо того чтобы надеяться на общие знания модели, мы создаём локальный файл конфигурации, который служит «единым источником истины» для текущей сессии.

Этот метод позволяет превратить Claude Code из универсального чат-бота в узкоспециализированного участника вашей команды, который знает не только, как писать код, но и как именно это нужно делать в вашем проекте.

Роль файла CLAUDE.md в рабочем процессе

Роль файла CLAUDE.md в рабочем процессе

Когда я начинал работать с первыми LLM, основной проблемой была их «амнезия» и склонность к галлюцинациям при работе с крупными проектами. Вы даёте модели задачу, она делает её, но через десять минут обсуждения забывает, какую библиотеку вы используете или какой стиль именования принят в вашем репозитории. С появлением Claude Code эта проблема стала ещё острее: инструмент обладает огромной мощностью, но без чётких рамок он начинает превращаться в «черный ящик», чьи действия трудно предсказать.

Файл CLAUDE.md — это попытка решить проблему контекста не через бесконечные промпты, а через структурированное описание правил игры внутри самого проекта. Это своего рода «инструкция по эксплуатации» вашего кода для ИИ.

Принципы Андрея Карпаты для работы с моделями

В основе эффективного взаимодействия с нейросетями лежат идеи, которые транслирует Андрей Карпата. Если упростить, то работа с моделью — это не магия, а управление контекстом и ожидаемым результатом. Карпата часто подчёркивает, что модели лучше всего работают, когда им предоставляют чёткие паттерны и ограничения.

В контексте CLAUDE.md это означает переход от модели «сделай что-нибудь» к модели «делай вот так». Вместо того чтобы каждый раз объяснять Claude Code, что в вашем проекте тесты запускаются через pytest с определёнными флагами, вы фиксируете это один раз.

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

  1. Build/Test commands: как собрать проект и как проверить, что ничего не сломалось.
  2. Code style: правила оформления, которые не позволят модели превратить ваш чистый код в кашу.
  3. Architecture notes: краткие пояснения, почему система устроена именно так.

Это делает поведение агента предсказуемым. Если в CLAUDE.md прописано, что для работы с базой данных мы используем только SQLAlchemy и определённый паттерн репозитория, модель не начнет предлагать сырые SQL-запросы.

Как контекст влияет на качество генерации

Качество генерации напрямую зависит от плотности полезного контекста. В больших репозиториях Claude Code может «заблудиться», пытаясь проанализировать сотни файлов. Файл CLAUDE.md выступает в роли навигатора.

Если мы не задаём правила, модель опирается на свои общие знания, полученные при обучении. Но ваши общие знания о Python могут не совпадать с тем, как вы используете его в конкретном микросервисе.

Рассмотрим пример. Допустим, у вас проект на FastAPI, где вы строго придерживаетесь асинхронности и используете Pydantic v2. Без файла конфигурации Claude может предложить решение, использующее синхронные вызовы или синтаксис первой версии Pydantic.

Вот пример того, как может выглядеть минимальный, но эффективный CLAUDE.md для такого проекта:

markdown
# Claude Code Project Guide

## Build and Test Commands
- Install dependencies: `pip install -r requirements.txt`
- Run tests: `pytest tests/ --cov=app`
- Linting: `ruff check .`

## Code Style and Patterns
- Use asynchronous patterns (async/await) for all I/O operations.
- Pydantic models must use V2 syntax (e.g., `Field` instead of `constring`).
- Error handling: use custom exceptions defined in `app/exceptions.py`.
- Type hinting: mandatory for all function signatures.

## Project Structure
- `app/api/`: route handlers.
- `app/core/`: configuration and security.
- `app/models/`: database schemas.

С точки зрения системного инженера, такой подход напоминает создание конфигурационного файла для сервиса. Вы не надеетесь на то, что сервис «сам поймёт», как работать с сетью, вы явно прописываете bind и port. Здесь то же самое: вы явно прописываете правила «жизни» кода внутри репозитория.

Когда контекст структурирован, количество итераций «исправь это, ты написал не по нашему стандарту» сокращается в разы. Это и обеспечивает ту самую предсказуемость, которая необходима при автоматизации разработки.

Практическое применение и настройка

Структура идеального CLAUDE.md

С практической точки зрения, файл CLAUDE.md — это не просто текстовая заметка, а набор инструкций, которые задают контекст для ИИ-агента. Если оставить его пустым или написать там общие фразы, Claude Code будет вести себя как стажёр: много спрашивать, ошибаться в стиле кода и предлагать команды, которые не работают в вашей среде.

Чтобы добиться предсказуемости, я рекомендую придерживаться чёткой структуры. Файл должен содержать три ключевых блока: правила оформления кода (Style Guide), команды для управления проектом (Build/Test/Lint) и архитектурные особенности.

Вот пример того, как может выглядеть такой файл для типичного проекта на Python и FastAPI:

markdown
# CLAUDE.md — Project Guidelines

## Build and Test Commands
- Install dependencies: `pip install -r requirements.txt`
- Run tests: `pytest tests/`
- Run linter: `flake8 .`
- Run migrations: `alembic upgrade head`

## Code Style Guidelines
- Use type hints for all function signatures.
- Follow PEP 8 strictly.
- Prefer asynchronous patterns (async/await) for I/O operations.
- Use Pydantic models for all request/response schemas.
- Error handling: Use custom exception classes defined in `app/core/exceptions.py`.

## Project Architecture
- API routes are located in `app/api/`.
- Business logic must reside in `app/services/`, not in the route handlers.
- Database models are in `app/models/`.

Если вы посмотрите на подход, который обсуждал Андрей Карпаты, то заметите общую идею: ИИ эффективен тогда, когда у него есть «карта местности». В моем домашнем сервере, когда я настраиваю новые сервисы через Ansible, я придерживаюсь того же принципа — сначала определяю стандарты, а потом приступаю к реализации.

Интеграция в существующий проект

Когда вы внедряете CLAUDE.md в уже работающий проект, не пытайтесь сразу прописать там все правила мира. Это создаст избыточный контекст, и модель начнет путаться. Лучше действовать итеративно.

Во-первых, начните с команд сборки и тестирования. Это самое важное. Если Claude Code знает, как запустить тесты, он сможет сам проверить свою работу перед тем, как предложить вам правки. Сначала создайте файл в корне проекта:

bash
touch CLAUDE.md

Во-вторых, добавьте специфические для вашего окружения команды. Например, если вы используете Docker для локальной разработки, обязательно укажите это:

markdown
## Development Environment
- Run application in Docker: `docker-compose up -d`
- Access shell in container: `docker exec -it app_container bash`

В-третьих, зафиксируйте правила именования. Это избавит вас от необходимости поправлять каждый второй Pull Request. Если в вашем проекте принято использовать snake_case для переменных и PascalCase для классов, это должно быть в файле.

С точки зрения системного инженера, интеграция этого файла — это своего рода «документация как код». Вместо того чтобы объяснять Claude Code в каждом новом чате, что «мы не используем библиотеку X, используйте Y», вы один раз фиксируете это в конфиге. Это делает поведение агента стабильным.

Если вы видите, что Claude Code начинает предлагать решения, которые противоречат вашему стеку, не спорьте с ним в чате. Просто откройте CLAUDE.md, добавьте новое правило и скажите: «Обнови инструкции согласно CLAUDE.md». Это самый быстрый путь к предсказуемому результату.

Результаты и ограничения метода

Когда файл приносит максимальную пользу

С практической точки зрения, CLAUDE.md работает как «внешняя память» для ИИ-агента. Без него Claude Code каждый раз пытается угадать архитектуру вашего проекта, основываясь на случайных файлах, которые он успел прочитать. Это приводит к тому, что агент может предложить использовать npm там, где вы привыкли к pnpm, или написать тест на Jest, хотя в проекте настроен Vitest.

Файл приносит максимальную пользу в трёх сценариях:

  1. Соблюдение стандартов кодинга. Если в вашей домашней лаборатории или рабочем проекте есть жёсткие правила (например, обязательное использование Type Guards в TypeScript или запрет на any), пропишите это в секции Code Style. Это избавляет от необходимости править один и тот же стиль в каждом PR.
  2. Ускорение контекстного старта. Когда проект разрастается, Claude тратит много времени на сканирование директорий. Если в CLAUDE.md чётко указано, где лежат основные эндпоинты или конфигурации, агент сразу переходит к делу.
  3. Стандартизация команд окружения. Вместо того чтобы каждый раз спрашивать «как запустить тесты?», агент видит готовый список в секции Commands.

Пример эффективной структуры файла для небольшого проекта на Node.js:

markdown
# CLAUDE.md — Project Guidelines

## Build and Test Commands
- Install dependencies: `pnpm install`
- Run development server: `pnpm dev`
- Run tests: `pnpm test`
- Run linting: `pnpm lint`

## Code Style
- Use functional components with TypeScript.
- Prefer `interface` over `type` for public APIs.
- Error handling: always wrap async calls in try/catch blocks and use our custom `AppError` class.
- Naming: use PascalCase for components, camelCase for functions and variables.

С какими сложностями можно столкнуться

Несмотря на то что подход, вдохновленный идеями Андрея Карпаты, выглядит изящно, он не является «серебряной пулей». Есть нюансы, которые могут превратить этот инструмент из помощника в источник шума.

Во-первых, проблема актуальности. Если вы изменили процесс сборки (например, перешли с npm на bun), но забыли обновить CLAUDE.md, агент начнет генерировать нерабочие команды. Это снижает предсказуемость, к которой мы стремимся. Я рекомендую относиться к этому файлу как к части кода: он должен проходить через те же проверки и изменения, что и основной проект.

Во-вторых, избыточность инструкций. Если перегрузить файл слишком детальными правилами, Claude может начать «галлюцинировать» или игнорировать важные части контекста из-за переполнения окна внимания.

Некоторые типичные ошибки:

  • Слишком много мелких правил. Не стоит писать «используй пробелы вместо табуляции» — это базовый стандарт, который ИИ и так понимает. Пишите только то, что специфично для вашего проекта.
  • Противоречия с существующим кодом. Если в файле написано использовать async/await, а в проекте полно старых callbacks, агент может войти в ступор или начать агрессивно рефакторить всё подряд, что не всегда уместно.

Чтобы минимизировать эти риски, придерживайтесь принципа: одна инструкция — одна конкретная задача. Если вы видите, что Claude начинает ошибаться в командах, сначала проверьте секцию Commands в файле. Скорее всего, там просто устаревший синтаксис.

Часто задаваемые вопросы

Нужно ли добавлять CLAUDE.md в .gitignore?

Нет, этот файл должен быть закоммичен в репозиторий. Его задача — обеспечить предсказуемость работы модели для всех участников команды, которые используют Claude Code в этом проекте. Если вы оставите файл только у себя локально, ваши коллеги продолжат сталкиваться с контекстным дрейфом и нарушением архитектурных паттернов.

Чем CLAUDE.md отличается от обычного README.md?

README.md предназначен для людей: он описывает, что делает проект и как его запустить. CLAUDE.md — это техническая спецификация для LLM, где вместо описания ценности продукта вы прописываете жесткие правила: команды для запуска тестов, стандарты именования переменных и запрещённые библиотеки. Если README — это «витрина» проекта, то CLAUDE.md — это его «инструкция по эксплуатации» для ИИ-агента.

Можно ли использовать один CLAUDE.md для нескольких разных проектов?

С практической точки зрения это плохая идея. Каждый проект имеет свою специфику: в одном вы используете Alpine Linux и musl, в другом — полноценный Debian, в одном принят функциональный стиль, в другом — строгое ООП. Чтобы избежать ошибок, конфигурация должна быть максимально локальной и соответствовать конкретному стеку технологий и архитектуре текущего репозитория.

Что делать, если Claude Code всё равно игнорирует правила из файла?

Если модель продолжает нарушать инструкции, значит, правила сформулированы слишком абстрактно. Вместо «пиши чистый код» используйте конкретные примеры: «всегда используй интерфейсы для внедрения зависимостей» или «не используй библиотеку X, используй Y». Также проверьте, не слишком ли большой объем контекста вы передаёте модели — иногда избыток лишней информации заставляет ИИ терять фокус на критически важных инструкциях.

Поделиться:TelegramX / TwitterVK