📋 CLAUDE.md: правила, спецификации, обучение
Полное руководство по созданию структурированных CLAUDE.md файлов: анатомия идеального конфига, импорт спецификаций, ADR паттерн, топ-15 критических правил.
🤔 Зачем структурировать CLAUDE.md
CLAUDE.md — это единственный файл, который Claude Code читает автоматически при каждом запуске в папке проекта. Без него Claude угадывает ваши правила из контекста кода, что ненадёжно и непредсказуемо.
PHPUnit в проекте на Pest. Использует Options API вместо Composition API. Создаёт миграции без backup-предупреждения.@путь/к/файлу.
🔬 Анатомия идеального CLAUDE.md
Оптимальный CLAUDE.md состоит из 8 разделов в строгом порядке. Каждый раздел отвечает на конкретный вопрос Claude.
docker exec и понимания контекста проекта./brainstorm и /write-plan перед реализацией.PSR-12, ESLint, PEP 8 + точный CLI-вызов./clear. Claude «фейкает» результат → запросить вывод команды. Снижает фрустрацию при зависших задачах.$request->all() без $fillable, Eloquent в Controller, any в TypeScript, jQuery в Vue-проекте. Без этого Claude их воспроизводит из «типичного кода».Полный пример для Laravel-проекта
# CLAUDE.md — Laravel Project
> Читается Claude Code автоматически при открытии этой папки.
> Держать **< 150 строк** (длинные файлы игнорируются).
## Проект
**Название:** `phone-rosveb-ru`
**Цель:** API на Laravel 11 + Vue 3/Nuxt, PostgreSQL, Redis, Docker Compose.
**Прод:** `https://phone.rosveb.ru`
**Контейнеры:** `phone-rosveb-ru-backend-1`, `phone-rosveb-ru-db-1`
## Стэк
- PHP 8.3 / Laravel 11
- Vue 3 + Nuxt 3 (SSR)
- PostgreSQL 16, Redis 7
- Docker Compose, Caddy reverse proxy
## Модель
- **Default:** Sonnet 5 (быстро, дешевле).
- **Opus 4.8:** только `/brainstorm`, `/write-plan`, архитектурные решения на 50K+ строк.
- **Haiku 4.5:** rename, format, простой regex.
## Workflow новой фичи
1. `/brainstorm` → spec в `docs/superpowers/specs/YYYY-MM-DD-<feature>-design.md`
2. `/write-plan` → план в `docs/superpowers/plans/YYYY-MM-DD-<feature>-plan.md`
3. `git worktree add E:/Clients/wt/<feature> feat/<feature> main`
4. `cd E:/Clients/wt/<feature> && claude`
5. `/execute-plan` — верификация на каждом шаге
6. `/request-code-review` → PR → squash → `git worktree remove`
## Стандарты кода
- **PHP:** PSR-12 + Pint (`./vendor/bin/pint`). Всегда `declare(strict_types=1)`.
- **Vue/TS:** ESLint flat config + Prettier. Composition API, `<script setup lang="ts">`.
- **SQL:** keywords UPPERCASE, identifiers snake_case.
## Примеры кода (эталоны)
Claude должен следовать паттернам из `examples/`:
- `examples/controller.example.php` — структура Controller
- `examples/service.example.php` — структура Service
- `examples/test.example.php` — структура Pest-теста
## Критические правила
- **БД:** только `mcp__postgres__query` (read-only). Перед миграцией — pg_dump вручную.
- **Git:** запрещены `--force`, `--no-verify`, `reset --hard`.
- **Файлы:** `database/migrations/`, `.env.production` — требуют подтверждения.
- **Тесты:** `/brainstorm` и `/write-plan` обязательны для любой фичи > 5 файлов.
## При буксовании
- Claude дважды дал неправильный ответ → `/clear` + переформулируй prompt
- Claude добавляет лишнее → «Реализуй ТОЛЬКО X. Не трогай Y.»
- Claude фейкает «всё работает» → «Запусти `./vendor/bin/pest` и покажи output»
## Запрещённые паттерны
- `$request->all()` без явного `$fillable` — уязвимость mass assignment
- Eloquent-запросы в Controller (только через Service/Repository)
- `any` в TypeScript без явного обоснования
- jQuery — проект использует Vue 3
Пример для Python ETL / FastAPI
# CLAUDE.md — Python ETL / FastAPI Project
## Проект
**Название:** `python-etl`
**Цель:** ETL-пайплайны + FastAPI REST API, PostgreSQL, Docker.
**Контейнер:** `python-etl-app-1`
## Стэк
- Python 3.12, FastAPI, SQLAlchemy 2, Alembic
- PostgreSQL 16, Redis (очереди Celery)
- Docker Compose, Pydantic v2
## Стандарты кода
- **PEP 8** + Ruff (`ruff check --fix && ruff format`)
- **Type hints везде** — проверяется mypy/pyright
- **Docstrings:** Google style (Args / Returns / Raises / Example)
- Max line: 100 символов
- `from __future__ import annotations` в начале файла
## Правила ETL
- Тестовая БД: SQLite in-memory (никакого prod-коннекта в тестах)
- Каждый шаг — атомарный, с логированием start/end/count
- При ошибке — rollback + запись в таблицу `etl_errors`
- Batch-size: не > 10K строк за транзакцию при INSERT
## Critical rules
- БД: только через `mcp__postgres__query` (read-only)
- Миграции — через Alembic вручную
- Никаких секретов в коде — только через `os.getenv()` или pydantic Settings
- `except Exception: pass` запрещён — логировать или пробрасывать
📎 Импорт спецификаций из CLAUDE.md
Ключевой паттерн: CLAUDE.md остаётся кратким, а вся «тяжёлая» документация живёт в отдельных файлах. Claude умеет читать их по ссылкам и через @-синтаксис промптов.
3а. Ссылки на файлы спецификаций
В CLAUDE.md достаточно указать путь к spec-файлу в разделе Workflow. Claude прочитает его при первом запросе о реализации этой фичи.
## Workflow новой фичи
1. `/brainstorm` → spec в `docs/superpowers/specs/YYYY-MM-DD-<feature>-design.md`
2. `/write-plan` → план в `docs/superpowers/plans/YYYY-MM-DD-<feature>-plan.md`
3. `git worktree add ...`
4. `/execute-plan` — работаем по плану, верификация на каждом шаге
Пример реального spec-файла, который создаётся после /brainstorm:
# Спецификация: Рекуррентные подписки через Tinkoff API
**Date:** 2026-05-08
**Status:** Approved
**Author:** (сгенерировано через `/brainstorm`)
## Цель
Добавить в `phone.rosveb.ru` возможность оформлять рекуррентные подписки
через Tinkoff Recurrent API. Пользователь один раз вводит карту →
каждый месяц деньги списываются автоматически.
## Архитектура
POST /api/v1/subscriptions
→ CreateSubscriptionRequest (валидация)
→ SubscriptionController::store
→ SubscriptionService::createRecurrentSubscription
→ TinkoffGateway::initRecurrent (HTTP call)
→ Subscription::create (БД)
## Модель данных
CREATE TABLE subscriptions (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
recurrent_token TEXT NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'active',
next_billing_at TIMESTAMP NOT NULL,
...
);
## Что НЕ входит в scope
- Email-уведомления — отдельная задача
- Промокоды и скидки — отдельная задача
3б. @-синтаксис подключения файлов в промпте
В любом промпте можно написать @путь/к/файлу — Claude прочитает файл и использует его содержимое как контекст. Это работает как для spec-файлов, так и для планов, ADR и примеров кода.
# Реализация по готовому плану:
Реализуй шаг 2.1 из @docs/superpowers/plans/2026-05-08-payment-plan.md
Соблюдай архитектуру из @docs/superpowers/specs/2026-05-08-payment-design.md
# Ссылка на архитектурное решение:
Напиши тесты согласно @docs/adr/0001-pest-over-phpunit.md
# Несколько файлов сразу:
Реализуй SubscriptionService, следуя
@docs/superpowers/specs/2026-05-08-payment-design.md
и паттернам из @examples/service.example.php
@-синтаксис принимает пути относительно корня проекта (папки, где лежит CLAUDE.md). Если claude запущен из подпапки — укажите полный путь от рабочей директории.
3в. ADR — Architecture Decision Records
ADR — это короткие файлы (20–50 строк), фиксирующие каждое архитектурное решение: почему выбрали именно это, какие были альтернативы, каковы последствия. Хранятся в docs/adr/NNNN-название.md.
# 0001. Использовать Pest вместо PHPUnit
**Date:** 2026-05-08
**Status:** Accepted
**Deciders:** команда разработки
## Context
В проекте нужна стратегия тестирования PHP-кода.
Альтернативы: оставить PHPUnit, перейти на Pest, использовать оба.
## Decision
**Pest** — как единственный тест-раннер поверх PHPUnit.
Причины:
- Нативная поддержка в Laravel 11
- Fluent синтаксис (`expect($x)->toBe($y)`)
- Тест занимает 30–40% меньше строк
- `describe()` блоки — естественная группировка
## Consequences
- Позитивное: меньше boilerplate, быстрее писать тесты
- Нейтральное: PHPUnit остаётся engine под капотом
- Негативное: разработчики без опыта Pest требуют ~2ч онбординга
Держите краткий индекс всех ADR прямо в CLAUDE.md:
## Архитектурные решения (ADR)
- `docs/adr/0001-pest-over-phpunit.md` — тест-раннер: Pest
- `docs/adr/0002-redis-sessions.md` — хранение сессий: Redis
- `docs/adr/0003-repository-pattern.md` — паттерн доступа к данным
- `docs/adr/0004-pinia-over-vuex.md` — стейт-менеджер фронтенда
3г. Файлы-примеры кода (examples/)
Эталонные файлы — это ещё один способ передать Claude понимание ваших паттернов. В отличие от правил в тексте, примеры демонстрируют точную структуру, именование и стиль.
## Примеры кода (эталоны)
Claude должен следовать паттернам из `examples/`:
- `examples/controller.example.php` — структура Controller
- `examples/service.example.php` — структура Service
- `examples/test.example.php` — структура Pest-теста
- `examples/component.example.vue` — структура Vue SFC
- `examples/composable.example.ts` — структура Composable
<?php
declare(strict_types=1);
namespace App\Services;
use App\Models\Subscription;
use App\Repositories\SubscriptionRepository;
use Illuminate\Support\Facades\Log;
final class SubscriptionService
{
public function __construct(
private readonly SubscriptionRepository $repository,
) {}
/**
* @throws \App\Exceptions\PaymentException
*/
public function createRecurrentSubscription(
int $userId,
int $planId,
string $token,
): Subscription {
// Логика — только здесь, не в Controller
return $this->repository->create([
'user_id' => $userId,
'plan_id' => $planId,
'recurrent_token' => encrypt($token),
'status' => 'active',
]);
}
}
📁 Рекомендуемая структура docs/ для разных стеков
Единая структура папок помогает Claude находить файлы предсказуемо. Следуйте этому шаблону независимо от стека — только содержимое меняется.
docs/adr/Architecture Decision Recordsdocs/superpowers/specs/Feature specificationsdocs/superpowers/plans/Implementation plansdocs/api/OpenAPI / Postman collectionsexamples/controller.example.phpЭталон Controllerexamples/service.example.phpЭталон Serviceexamples/test.example.phpЭталон Pest-теста
docs/adr/Architecture Decision Recordsdocs/superpowers/specs/Pipeline specificationsdocs/superpowers/plans/Implementation plansdocs/etl/Описание пайплайнов и схемexamples/router.example.pyЭталон FastAPI routerexamples/service.example.pyЭталон Service layerexamples/etl_step.example.pyЭталон ETL-шага
docs/adr/Architecture Decision Recordsdocs/superpowers/specs/Feature specificationsdocs/superpowers/plans/Implementation plansdocs/design/Figma-ссылки, дизайн-токеныexamples/component.example.vueЭталон SFCexamples/composable.example.tsЭталон Composableexamples/store.example.tsЭталон Pinia store
docs/
├── adr/ # Архитектурные решения
│ ├── 0001-pest-over-phpunit.md
│ ├── 0002-redis-sessions.md
│ └── README.md # Индекс всех ADR
│
├── superpowers/
│ ├── specs/ # После /brainstorm
│ │ ├── 2026-05-08-payment-subscriptions-design.md
│ │ └── 2026-05-10-notifications-design.md
│ └── plans/ # После /write-plan
│ ├── 2026-05-08-payment-subscriptions-plan.md
│ └── 2026-05-10-notifications-plan.md
│
└── api/ # OpenAPI / документация эндпоинтов
examples/ # Эталонные файлы кода
├── controller.example.php
├── service.example.php
└── test.example.php
🏆 Топ-15 правил для CLAUDE.md
Готовые к копированию правила, разбитые по категориям. Выберите подходящие для своего проекта и вставьте в соответствующие разделы CLAUDE.md.
git push --force, git push --force-with-lease, git reset --hard без явной просьбы пользователя с подтверждением.--no-verify при коммите — хуки должны проходить. Если хук падает → исправить причину, не обходить хук.pg_dump вручную. Не запускать миграцию до подтверждения пользователя.feat: <что> / fix: <что> / refactor: <что>. Всегда добавлять Co-Authored-By: Claude Sonnet 5.mcp__postgres__query. Запись только через миграции или явные INSERT-запросы с подтверждением.max_parallel_workers_per_gather=1 на время работы, затем вернуть. Batch-size: не более 10K строк за транзакцию.table_id, не tableID или tableid../vendor/bin/pint. После изменения TS/Vue — pnpm lint:fix. Не коммитить до чистого линтера../vendor/bin/pest (PHP) / pnpm test (Vue) / pytest (Python). Показать вывод, не «всё работает».strict: true. Запрещён тип any без явного обоснования в комментарии. Pydantic v2 — обязательный model_config = ConfigDict(strict=True)./brainstorm обязателен для любой фичи, затрагивающей >5 файлов. Не переходить к реализации без утверждённой спецификации в docs/superpowers/specs/./write-plan обязателен для задач >3 часов работы. План должен содержать чекпоинты верификации после каждого крупного шага.git worktree add E:/Clients/wt/<feature> feat/<feature>. Никогда не работать над двумя фичами в одной рабочей директории./clear и переформулировать». Не пытаться в третий раз тем же путём.## Критические правила
### Git-безопасность
- Запрещены `--force`, `--no-verify`, `reset --hard` без явного подтверждения
- Коммит — только по явной просьбе. Формат: `feat:` / `fix:` / `refactor:`
- Перед миграцией БД — pg_dump вручную + подтверждение
### Работа с БД
- Только read-only через `mcp__postgres__query`
- Запись — только через миграции с явным подтверждением
- Batch INSERT: не более 10K строк за транзакцию
### Качество кода
- После PHP-изменений: `./vendor/bin/pint` обязательно
- После TS/Vue: `pnpm lint:fix` обязательно
- Запрещён `any` в TypeScript без комментария-обоснования
### Размер задач
- `/brainstorm` обязателен для фич > 5 файлов
- `/write-plan` обязателен для задач > 3 часов
### При буксовании
- Дважды ошибся → предложи `/clear` + переформулировать
- «Всё работает» недопустимо — показать реальный вывод команды
📂 Реальные примеры в example/
В директории example/projects/ находятся готовые шаблоны CLAUDE.md и связанных документов. Используйте их как отправную точку для своего проекта.
example/projects/ — в папке Claude Code документации. Скопируйте нужный CLAUDE.md в корень своего проекта и адаптируйте под свой стек.
/brainstorm: архитектура, модель данных, API-эндпоинты, scope, риски.Минимальный CLAUDE.md для быстрого старта
Если нет времени на полный шаблон — вот абсолютный минимум, который даёт 80% пользы:
# CLAUDE.md — [Название проекта]
## Проект
**Название:** `my-project`
**Цель:** [Одно предложение]
**Прод:** `https://example.ru`
**Контейнеры:** `my-project-backend-1`, `my-project-db-1`
## Стэк
- [Язык] [Версия] / [Фреймворк] [Версия]
- [БД] [Версия], [Кэш] [Версия]
- Docker Compose, Caddy reverse proxy
## Стандарты кода
- [Стандарт]: команда проверки `[команда]`
- [Дополнительные соглашения]
## Критические правила
- БД: только read-only через MCP
- Git: запрещены `--force`, `--no-verify`, `reset --hard`
- Перед миграцией — backup вручную
## При буксовании
- Дважды ошиблись → `/clear` + переформулировать
- «Всё работает» — недопустимо, показать вывод команды
## Запрещённые паттерны
- [Антипаттерн 1 для вашего стека]
- [Антипаттерн 2 для вашего стека]
Nuxt-специфичный шаблон
# CLAUDE.md — Nuxt/Vue Frontend
## Проект
**Название:** `nuxt-frontend`
**Цель:** SSR фронтенд на Nuxt 3, без собственного бэкенда.
**API:** потребляет Laravel API (`/api/v1/*`)
## Стэк
- Nuxt 3 (SSR), Vue 3 (Composition API), TypeScript
- Pinia, TailwindCSS, VeeValidate
- Vitest + Testing Library, Playwright (e2e)
## Стандарты
- ESLint flat config + Prettier (`pnpm lint:fix`)
- TypeScript `strict: true`
- Никакого Options API — только Composition API + `<script setup>`
- CSS: только Tailwind (никаких кастомных классов)
## Critical rules
- SSR: все composables должны работать server-side
- `useRuntimeConfig()` для env-переменных
- Никакого `localStorage/window` без `import.meta.client` guard
- Playwright — только для e2e тестов, не смешивать с chrome-devtools MCP
docs/adr/ (архитектурные решения) → ссылки на docs/superpowers/specs/ (детали фич) → @путь/к/файлу в промпте для загрузки нужного контекста. Claude получает ровно столько информации, сколько нужно для задачи — не больше и не меньше.