Актуально на апрель 2026.
Каждый CLAUDE.md, который я писал, проходил через одну и ту же траекторию: начинаешь с “полного” файла, смотришь как Claude игнорирует половину, вырезаешь всё лишнее, злишься на время потраченное на остальное. Файл на этом проекте — 113 строк, и я до сих пор считаю, что он длинный. Глобальный — 29, вот его я готов защищать.
Приоритетный контекст, а не конфиг
Первые несколько месяцев я относился к CLAUDE.md как к файлу заметок — сваливал туда всё что знал о проекте, из соображения что лишний контекст не помешает. Ещё как мешает. Слишком расплывчато, слишком длинно, слишком много общих советов, а Claude игнорирует половину файла.
На практике это Markdown-файл, который Claude загружает в начале каждой сессии. Не конфиг и не жёсткая система правил — просто приоритетный контекст. Claude читает его и старается следовать, но только если инструкции достаточно конкретные, чтобы не утонуть среди всего остального в сессии.
Короткий и острый файл лучше “полного справочника проекта”. Если правило нужно мне в каждой сессии — оно живёт здесь. Всё что мягче — в auto memory.
Где размещать
| Файл | Scope | Кто видит |
|---|---|---|
./CLAUDE.md или ./.claude/CLAUDE.md |
Проект | Команда через git |
./CLAUDE.local.md |
Проект (локально) | Только ты (gitignored) |
~/.claude/CLAUDE.md |
Все проекты | Только ты |
CLAUDE.md загружается по дереву директорий вверх от текущей папки. Если запускаешь Claude в foo/bar/ — загрузятся и foo/bar/CLAUDE.md и foo/CLAUDE.md.
Именно поэтому маленькие локальные файлы почти всегда лучше, чем один гигантский универсальный.
Рабочий скелет
Лучшие CLAUDE.md скучные в хорошем смысле: практичные, конкретные и легко сканируются глазами.
# Project Overview
Короткое описание что это за проект и зачем.
Одно-два предложения.
# Tech Stack
- Runtime: Bun (не Node.js)
- ORM: Drizzle
- Linter: Biome (не ESLint/Prettier)
- Testing: Vitest
# Project Structure
src/
├── api/ # API handlers
├── db/ # database schema и migrations
└── utils/ # shared utilities
# Commands
- `bun run dev` — запустить dev сервер
- `bun test` — тесты
- `bun run lint` — линтинг
- `bun run build` — production сборка
# Coding Conventions
- 2-space indentation
- Именуй файлы kebab-case
- Предпочитай named exports над default
- Типизация обязательна, no `any`
# Workflow
- Создавай feature branch перед изменениями
- Запускай тесты перед коммитом
- Не коммить в main напрямую
- Commit messages на английском
Это форма, а не шаблон для копирования. Обязательными я бы назвал только Commands и неочевидные факты про стек — именно на них Claude ошибается без подсказки. Остальное либо оправдывает своё место, либо вырезается.
Принципы написания
Конкретность вместо расплывчатости
❌ "Format code properly"
✅ "Use 2-space indentation, no semicolons"
❌ "Test your changes"
✅ "Run `bun test` before every commit"
❌ "Keep files organized"
✅ "API handlers live in src/api/handlers/"
❌ "Write good commit messages"
✅ "Commit messages: type(scope): description — например feat(auth): add JWT refresh"
До 200 строк
Длиннее — это сразу две проблемы: слабее adherence и больше контекста тратится на сам файл. Если CLAUDE.md растёт, разбивай на .claude/rules/ или используй импорты.
Без противоречий
Если два правила конфликтуют, Claude выберет одно и не скажет какое. Периодически просматривай файл.
Заголовки и bullets
Claude сканирует структуру как человек. Стены текста воспринимаются как стены текста.
Что писать, что не писать
Дольше всего я ошибался именно здесь. Записывал всё, что знал о проекте, хотя Claude на старте нужен куда более короткий список.
Пиши:
- Команды запуска, тестов, линтинга
- Нестандартные решения (“мы используем Bun а не Node”)
- Структура проекта — где что лежит
- Coding conventions специфичные для проекта
- Архитектурные решения и почему они приняты
- Вещи которые Claude не может обнаружить из кода
Не пиши:
- Что Claude и так поймёт прочитав код
- Общие best practices (Claude их знает)
- Детали которые часто меняются
- Личные предпочтения (они в
~/.claude/CLAUDE.md)
Сложнее всего удержаться от общих best practices, которые пишешь в любой onboarding-документации. Claude не нужно говорить “пиши чистый код”. Ему нужно знать, что в этом проекте используется Bun, а не Node — потому что именно здесь он реально ошибается без контекста.
Импорты для модульности
Используй @path синтаксис чтобы не дублировать контент:
# Git Workflow
@docs/git-workflow.md
# Personal preferences (не попадёт в git)
@~/.claude/my-preferences.md
Импорты разворачиваются и загружаются в контекст при старте, вложенность — до 5 уровней. Ловушка в том, что импорт тянет файл целиком: @package.json стоит тебе всех строк с зависимостями каждую сессию — ради того, чтобы не выписывать четыре команды руками.
Я импортами здесь не пользуюсь. Один файл на 113 строк — ниже того порога, где разбиение начинает окупаться.
.claude/rules/ — модульные правила
Для больших проектов вместо одного монолитного файла:
.claude/rules/
├── testing.md # правила тестирования
├── api-design.md # правила API
├── security.md # требования безопасности
└── frontend.md # правила фронтенда
Path-specific rules
Блок paths: во фронтматтере означает, что правило загружается только когда Claude трогает подходящие файлы — всё остальное время оно не стоит ничего:
---
paths:
- "src/api/**/*.ts"
---
# API Rules
- Валидация на все inputs обязательна
- Стандартный формат ошибок: { error, code, message }
- Все endpoints документировать через JSDoc
Glob-паттерны обычные — **/*.ts, src/**/*, src/**/*.{ts,tsx}.
На проекте такого размера мне это ни разу не понадобилось. Штука начинает окупаться, когда у разных частей репозитория реально разные правила и ты устал смотреть, как Claude применяет фронтендовые конвенции к миграциям базы.
Глобальный CLAUDE.md для личных предпочтений
~/.claude/CLAUDE.md — загружается во всех проектах. Хорошее место для персональных предпочтений которые не нужно шарить с командой:
# My Working Style
- Объясняй что собираешься делать перед тем как делать
- Предпочитай маленькие атомарные коммиты
- Если задача неоднозначна — спроси прежде чем начинать
- При ошибках показывай полный stack trace
# Code Preferences
- Предпочитаю функциональный стиль над ООП
- Явные типы везде, никакого any
- Комментарии только для неочевидной логики
# Workflow
- Всегда запускай линтер после изменений
- Commit messages на английском в формате conventional commits
Мой — 29 строк, и большая часть это вообще не предпочтения, а факты про окружение. macOS с BSD-юзерлендом, поэтому sed -i требует аргумент. Homebrew лежит в /opt/homebrew. Использовать fd и rg, а не find и grep. Вот это соблюдается всегда — потому что это то, на чём Claude на моей машине ошибается без подсказки. Стилевые предпочтения под ними подхватываются в лучшем случае через раз.
Auto memory
Auto memory — поддерживающий слой: Claude сам записывает заметки по ходу работы, команды билда, паттерны отладки, выведенные предпочтения. Работает пока остаётся маленьким и скучным. Думай о нём как об индексе “что стоит помнить”, а не как о журнале всего, что происходило.
При старте Claude Code подхватывает MEMORY.md примерно до первых 200 строк (или ~25KB) — это и есть настоящий аргумент держать его индексом, а не свалкой.
Я держу его выключенным на общих проектах и включённым на личных. Для соло-работы заметки реально полезны — quirks сборки, вещи упомянутые вскользь, которые не хочется повторять. В командных проектах начинается странное: memory накапливает шум из разных контекстов и превращается в “память” с устаревшей информацией.
Хранится в:
~/.claude/projects/<project>/memory/
├── MEMORY.md # индекс, загружается каждую сессию
├── debugging.md # паттерны отладки
└── ...
Посмотреть, отредактировать или выключить:
/memory
Говоришь Claude “запомни что…” → сохраняет в auto memory. Говоришь “добавь это в CLAUDE.md” → добавляет в файл.
Что стоит знать до того, как начнёшь на неё полагаться: memory локальная и не синхронизируется между машинами, а все worktrees одного репо шарят одну папку памяти.
Генерируем первую версию
Если у тебя ещё нет CLAUDE.md, не пытайся сразу написать идеальную версию.
/init # Claude проанализирует кодовую базу и сгенерирует CLAUDE.md
После /init агрессивно редактируй результат: вырезай воду, оставляй команды, добавляй только те правила, которые Claude не смог бы сам вывести из репозитория. Сгенерированный файл — это отправная точка, не цель. Относись к нему как к драфту от нового человека в команде, который только что прочитал README: полезно, но не отфильтровано.
После /compact
Это и есть практический тест, должна ли инструкция жить в CLAUDE.md.
CLAUDE.md переживает компакцию, потому что Claude перечитывает его с диска. Если инструкция “исчезла” после /compact, обычно это значит, что она существовала только в чате и так и не стала проектной памятью.
Debugging
Если Claude не следует CLAUDE.md:
/memory # проверить что файл вообще загружен
Если файла нет в списке, Claude его не видит. Сначала проверь расположение, а уже потом переписывай содержимое.
Для подробного логирования какие файлы загружаются и когда — используй hook InstructionsLoaded в settings.json.
AGENTS.md совместимость
Если в репо уже есть AGENTS.md для других AI инструментов — импортируй его в CLAUDE.md:
@AGENTS.md
## Claude-specific
- Используй plan mode для изменений в src/billing/