# Память Claude Code: CLAUDE.md, @импорты и правила для папок

Канонический URL: https://zero2claude.ru/blog/claude-md-imports-rules
Дата: 2026-10-16
Теги: claude-code, claude.md, практика

Когда CLAUDE.md разрастается, каждая его строка загружается в каждую сессию. Разбираем импорты @path, правила в .claude/rules с полем paths, связку с AGENTS.md и два способа проверить, что инструкция вообще загрузилась.

В начале проекта [CLAUDE.md](/glossary/claude-md) — это десяток строк: как запускать тесты, как называть ветки. Через пару месяцев в нём правила для API, для тестов, для вёрстки, для миграций базы и ещё абзац про то, почему мы не используем одну библиотеку. И вся эта простыня **загружается в каждую сессию** — даже когда ты просто правишь опечатку в README.

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

<Cover src="/blog/claude-md-imports-rules.jpg" alt="Раскрытый блокнот на столе рядом с аккуратной полкой папок" />

## Импорт @path: порядок, но не экономия

Строка с `@` и путём подгружает другой файл вместе с CLAUDE.md:

```markdown
# Проект linkcheck

@AGENTS.md

- Команды npm: @package.json
- Архитектура: @docs/architecture.md
```

Импорт удобен, когда хочется разложить память по тематическим файлам. Но запомни главное: **контекст он не экономит**. Импортированный файл загружается всегда, вместе с тем файлом, который его импортирует. Это способ упорядочить, а не способ облегчить.

Две мелочи, на которых спотыкаются чаще всего:

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

Если импортировать файл вне рабочей папки, например `@~/notes.md`, при первом использовании в проекте Claude Code попросит одобрения. Откажешь — импорт так и останется выключенным.

## Ловушка с AGENTS.md

Многие проекты уже держат инструкции для ИИ-агентов в `AGENTS.md`. Тут важная деталь: **если в проекте есть CLAUDE.md, Claude читает его вместо AGENTS.md**. Правила из AGENTS.md молча пропадают.

Лечится одной строкой. Поставь первой строкой CLAUDE.md импорт:

```markdown
@AGENTS.md
```

Теперь правила живут в одном месте, и их видят и Claude, и другие агенты.

## Правило для папки: загружается, только когда нужно

Вот что действительно экономит контекст. Правило — это Markdown-файл в папке `.claude/rules/`. Без заголовка `paths` оно загружается при старте, как обычный CLAUDE.md. А с заголовком — только когда Claude работает с подходящим файлом:

```markdown
---
paths:
  - "test/**/*.js"
---

# Тесты

- Используй node:test и node:assert/strict, других библиотек не подключай.
```

Правила про тесты больше не занимают место, пока ты правишь вёрстку. Шаблоны считаются от корня проекта: `*` не выходит за пределы одной папки, `**/` проходит через любое число папок, а фигурные скобки вроде `src/**/*.{ts,tsx}` тоже работают.

И главная тонкость, из-за которой правило «не работает»: оно срабатывает, когда Claude читает подходящий файл **своим инструментом Read**. Если Claude посмотрел файл командой `cat` в оболочке, правило не подгрузится.

## Что и когда попадает в контекст

| Файл инструкций | Когда загружается |
|---|---|
| CLAUDE.md в корне и правило без `paths` | при старте сессии |
| файл из импорта `@path` | вместе с файлом, который его импортирует |
| правило с `paths` | когда Claude читает подходящий файл инструментом Read |
| автопамять — заметки, которые Claude ведёт сам | при старте: первые 200 строк или 25 КБ индекса MEMORY.md |

Для личных инструкций к проекту, которые не нужны команде, есть `CLAUDE.local.md`: его создают руками и не коммитят.

## Claude не слушается? Сначала проверь загрузку

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

**Способ 1: `/context all`.** Обычный `/context` может свернуть список, а `all` раскрывает его. В разделе **Memory files** видно, что загружено при старте. Правила с `paths` появятся там только после того, как Claude прочитает подходящий файл.

**Способ 2: хук `InstructionsLoaded`.** Он срабатывает при каждой загрузке CLAUDE.md, правила или импорта и сообщает причину. Положи его в отдельный файл, например `.practice/loaded-hook.json`:

```json
{
  "hooks": {
    "InstructionsLoaded": [
      { "hooks": [ { "type": "command", "command": "jq -r '[.load_reason, .file_path] | @tsv' >> \"$CLAUDE_PROJECT_DIR/.practice/loaded.txt\"" } ] }
    ]
  }
}
```

Запусти сессию с ним: `claude --settings .practice/loaded-hook.json`. В логе у каждой строки будет причина: `session_start` — загружено при старте, `include` — подтянуто импортом, `path_glob_match` — правило сработало по шаблону.

Нет строки `path_glob_match` для твоего правила? Сравни шаблон с реальными файлами через git:

```bash
git ls-files ':(glob)src/api/**/*.js'
```

Пустой вывод — шаблон ни с чем не совпадает. Классика жанра: правило для `source/**` в проекте, где код лежит в `src/`.

<Callout type="note" title="Правка посреди сессии">
Claude Code читает CLAUDE.md проекта один раз, при старте. Поправил файл — правка дойдёт до сессии после /clear, /compact или перезапуска. А чтобы найти инструкции, которые противоречат друг другу или ссылаются на удалённые файлы, запусти /doctor prompt-audit: он предложит правки и ничего не изменит, пока ты не попросишь.
</Callout>

## Что не стоит класть в память

CLAUDE.md — это контекст, а не настройка, которую Claude обязан исполнить. Правило, которое нельзя нарушать никогда, оформляй [хуком](/blog/claude-code-hooks-pretooluse), а не строчкой в памяти. А длинные процедуры для редких задач выноси в навыки: каждая строка CLAUDE.md загружается в каждую сессию, и короткий файл работает лучше длинного.

## Частые вопросы

<Faq>
<FaqItem q="Экономит ли импорт @path место в контексте?">

Нет. Импортированный файл загружается всегда, вместе с файлом, который его импортирует. Импорт помогает разложить память по файлам, а экономят контекст правила в .claude/rules с полем paths.

</FaqItem>
<FaqItem q="Читает ли Claude Code файл AGENTS.md?">

Если в проекте есть CLAUDE.md, Claude читает его вместо AGENTS.md. Чтобы использовать правила из AGENTS.md, поставь в первую строку CLAUDE.md импорт `@AGENTS.md`.

</FaqItem>
<FaqItem q="Почему правило из .claude/rules не загрузилось?">

Правило с paths загружается, только когда Claude читает подходящий файл инструментом Read, — не командой cat. Если и после этого его нет в /context all, проверь шаблон через git ls-files: скорее всего, он не совпадает с настоящими путями.

</FaqItem>
</Faq>

## Потренируйся

Всё это — тема урока [«Память проекта по-взрослому»](/learn/claude-code-pro/5-1-pamyat-proekta) пятого уровня курса «Claude Code: уровень профи». В тренажёре нужно собрать CLAUDE.md с импортом и выбрать черновик правила, чей шаблон совпадает с настоящей папкой. Если CLAUDE.md для тебя пока в новинку, начни с нашего вводного [гайда по CLAUDE.md](/blog/claude-md-guide), а команды под рукой — в [шпаргалке по Claude Code](/claude-code-shpargalka).
