03 / 06 · Продвинутый

📋 CLAUDE.md: правила, спецификации, обучение

Полное руководство по созданию структурированных CLAUDE.md файлов: анатомия идеального конфига, импорт спецификаций, ADR паттерн, топ-15 критических правил.

🤔 Зачем структурировать CLAUDE.md

CLAUDE.md — это единственный файл, который Claude Code читает автоматически при каждом запуске в папке проекта. Без него Claude угадывает ваши правила из контекста кода, что ненадёжно и непредсказуемо.

Без CLAUDE.md
Claude каждый раз угадывает стек, соглашения и правила. Пишет PHPUnit в проекте на Pest. Использует Options API вместо Composition API. Создаёт миграции без backup-предупреждения.
С хорошим CLAUDE.md
«Память» проекта всегда активна. Claude знает стек, соглашения, запрещённые паттерны и workflow с первого промпта. Снижает количество итераций на 40–60%.
Ограничение по размеру
Файл обрезается после ~150–200 строк (≈25 KB контекстного веса). Поэтому краткость критична: только то, что нельзя вывести из кода. Детали — во внешних spec-файлах со ссылками.
Живой документ
CLAUDE.md обновляется по мере принятия архитектурных решений. Каждый новый ADR, новая зависимость или запрещённый паттерн — повод добавить строку. Это «закон» проекта для Claude.
⚠️
Частая ошибка новичков: пишут очень длинный CLAUDE.md — добавляют туда весь контекст проекта, историю решений, инструкции по каждому компоненту. Файл вырастает до 500+ строк. Результат: CC читает его частично (обрезает после ~200 строк), правила в конце файла игнорируются, и разработчик не понимает почему CC нарушает написанные правила. Держите CLAUDE.md ниже 150 строк — детали выносите в spec-файлы со ссылками через @путь/к/файлу.
Рекомендуемый размер CLAUDE.md
Идеально
≤ 80 стр.
Допустимо
≤ 150 стр.
Опасная зона
> 200 стр.
Свыше 200 строк файл может читаться частично. Выносите детали в spec-файлы и ссылайтесь на них.

🔬 Анатомия идеального CLAUDE.md

Оптимальный CLAUDE.md состоит из 8 разделов в строгом порядке. Каждый раздел отвечает на конкретный вопрос Claude.

1
Мета-раздел Обязательный
Название, цель, продакшн-URL, имена Docker-контейнеров. Claude использует это для формирования команд docker exec и понимания контекста проекта.
2
Стек Обязательный
Конкретные версии всех технологий. Без версий Claude может использовать синтаксис другой мажорной версии. PHP 8.3 ≠ PHP 8.1, Laravel 11 ≠ Laravel 10.
3
Модель по умолчанию Рекомендуемый
Когда использовать Sonnet, Opus, Haiku. Экономит бюджет: большинство задач решает Sonnet, а Opus нужен только для архитектурных решений и объёмного рефакторинга.
4
Workflow новой фичи Обязательный
Пронумерованные шаги с конкретными командами. Claude следует этому порядку автоматически, не пропуская /brainstorm и /write-plan перед реализацией.
5
Стандарты кода Обязательный
Стандарт + команда запуска линтера. Без команды Claude не знает, как проверить результат. Указывайте: PSR-12, ESLint, PEP 8 + точный CLI-вызов.
6
Критические правила Обязательный
Запреты для БД, Git, чувствительных файлов. Это страховочная сетка: даже если Claude не спросит разрешения, эти правила блокируют опасные операции.
7
При буксовании Рекомендуемый
Конкретные ситуации: Claude дважды ошибся → /clear. Claude «фейкает» результат → запросить вывод команды. Снижает фрустрацию при зависших задачах.
8
Запрещённые паттерны Рекомендуемый
Антипаттерны конкретно для вашего стека: $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` — работаем по плану, верификация на каждом шаге
💡
Как это работает: Claude видит путь к файлу и автоматически читает его содержимое при обращении к задаче. Вам не нужно вставлять содержимое spec-файла в промпт — достаточно упомянуть имя файла или попросить «следовать архитектуре из плана».

Пример реального 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` — стейт-менеджер фронтенда
Когда создавать ADR: любое решение, которое может вызвать вопрос «а почему не X?» через 3 месяца. Смена ORM, выбор между двумя библиотеками, решение не использовать популярный подход — всё это заслуживает ADR.

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 находить файлы предсказуемо. Следуйте этому шаблону независимо от стека — только содержимое меняется.

🔴
Laravel / PHP
PHP 8.3 · Laravel 11 · Pest
  • docs/adr/ Architecture Decision Records
  • docs/superpowers/specs/ Feature specifications
  • docs/superpowers/plans/ Implementation plans
  • docs/api/ OpenAPI / Postman collections
  • examples/controller.example.php Эталон Controller
  • examples/service.example.php Эталон Service
  • examples/test.example.php Эталон Pest-теста
🐍
Python ETL / FastAPI
Python 3.12 · FastAPI · Alembic
  • docs/adr/ Architecture Decision Records
  • docs/superpowers/specs/ Pipeline specifications
  • docs/superpowers/plans/ Implementation plans
  • docs/etl/ Описание пайплайнов и схем
  • examples/router.example.py Эталон FastAPI router
  • examples/service.example.py Эталон Service layer
  • examples/etl_step.example.py Эталон ETL-шага
💚
Nuxt / Vue Frontend
Nuxt 3 · Vue 3 · TypeScript
  • docs/adr/ Architecture Decision Records
  • docs/superpowers/specs/ Feature specifications
  • docs/superpowers/plans/ Implementation plans
  • docs/design/ Figma-ссылки, дизайн-токены
  • examples/component.example.vue Эталон SFC
  • examples/composable.example.ts Эталон Composable
  • examples/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-безопасность
🚫
Правило 1. Запрещены git push --force, git push --force-with-lease, git reset --hard без явной просьбы пользователя с подтверждением.
🚫
Правило 2. Запрещён --no-verify при коммите — хуки должны проходить. Если хук падает → исправить причину, не обходить хук.
⚠️
Правило 3. Перед любой миграцией БД — сделать pg_dump вручную. Не запускать миграцию до подтверждения пользователя.
📝
Правило 4. Коммит только по явной просьбе. Формат сообщения: feat: <что> / fix: <что> / refactor: <что>. Всегда добавлять Co-Authored-By: Claude Sonnet 5.
🗄️ Работа с базой данных
🔍
Правило 5. MCP доступ к БД — только read-only через mcp__postgres__query. Запись только через миграции или явные INSERT-запросы с подтверждением.
📦
Правило 6. При массовых ETL-операциях — max_parallel_workers_per_gather=1 на время работы, затем вернуть. Batch-size: не более 10K строк за транзакцию.
🏷️
Правило 7. Имена таблиц и столбцов — snake_case. SQL-ключевые слова — UPPERCASE. Ключи внешние: table_id, не tableID или tableid.
✨ Качество кода
🧹
Правило 8. После любого изменения PHP-кода запускать ./vendor/bin/pint. После изменения TS/Vue — pnpm lint:fix. Не коммитить до чистого линтера.
🧪
Правило 9. Перед завершением задачи — запустить тесты: ./vendor/bin/pest (PHP) / pnpm test (Vue) / pytest (Python). Показать вывод, не «всё работает».
🔒
Правило 10. TypeScript: strict: true. Запрещён тип any без явного обоснования в комментарии. Pydantic v2 — обязательный model_config = ConfigDict(strict=True).
📐 Размер и планирование задач
💡
Правило 11. /brainstorm обязателен для любой фичи, затрагивающей >5 файлов. Не переходить к реализации без утверждённой спецификации в docs/superpowers/specs/.
🗺️
Правило 12. /write-plan обязателен для задач >3 часов работы. План должен содержать чекпоинты верификации после каждого крупного шага.
🔀
Правило 13. Git worktree для каждой фичи: git worktree add E:/Clients/wt/<feature> feat/<feature>. Никогда не работать над двумя фичами в одной рабочей директории.
🔧 Поведение при ошибках и буксовании
🔄
Правило 14. Claude дважды дал неправильный ответ на одну задачу → сказать пользователю «предлагаю /clear и переформулировать». Не пытаться в третий раз тем же путём.
📋
Правило 15. При сжатии контекста (compaction) — сохранить список изменённых файлов, последнюю успешно пройденную точку плана, команды запуска тестов.
## Критические правила

### 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 в корень своего проекта и адаптируйте под свой стек.
example/projects/laravel-project/CLAUDE.md
Полный шаблон для Laravel 11 + Vue 3 + PostgreSQL. Содержит все 8 разделов, включая Workflow, ADR-индекс и примеры кода.
example/projects/python-etl/CLAUDE.md
Шаблон для Python 3.12 + FastAPI + Alembic. Специфичные правила для ETL-пайплайнов: batch-size, атомарность, rollback.
example/projects/nuxt-frontend/CLAUDE.md
Шаблон для Nuxt 3 + Vue 3 + TypeScript. Правила SSR-совместимости, Composition API, Playwright для e2e.
example/projects/laravel-project/docs/adr/0001-choose-pest-over-phpunit.md
Пример реального ADR: выбор Pest над PHPUnit с обоснованием, альтернативами и последствиями.
example/projects/laravel-project/docs/superpowers/specs/2026-05-08-payment-subscriptions-design.md
Пример спецификации после /brainstorm: архитектура, модель данных, API-эндпоинты, scope, риски.
example/projects/laravel-project/examples/
Эталонные файлы Controller, Service, Pest-теста, Vue SFC — основа для обучения Claude паттернам вашего проекта.

Минимальный 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
🚀
Итоговая схема работы: CLAUDE.md (краткий, <150 строк) → ссылки на docs/adr/ (архитектурные решения) → ссылки на docs/superpowers/specs/ (детали фич) → @путь/к/файлу в промпте для загрузки нужного контекста. Claude получает ровно столько информации, сколько нужно для задачи — не больше и не меньше.