/
Блог Хекслета
/
Код
/

Cursor Rules: как писать правила, чтобы они реально работали

Cursor Rules: как писать правила, чтобы они реально работали

18 марта 2026 г.

9 минут
Cursor Rules: как писать правила, чтобы они реально работали

Cursor Rules: как писать правила, чтобы они реально работали

Знакомая сцена. Вы открыли awesome-cursorrules на GitHub, нашли подходящий набор правил под свой стек — React, Next.js, TypeScript. Скачали, положили в проект, перезапустили Cursor. Просите написать новый компонент. Cursor пишет его так, как будто никаких правил вы не клали — с default-экспортами, с лишними useMemo, с тем же магическим any в типах. В чём дело?

Дело в том, что в 2026 году правила Cursor — это не просто текстовый файл с пожеланиями. Это структурированные документы с YAML-фронтматтером, специальным расширением .mdc и чёткими условиями применения. Без всего этого правила либо не загружаются, либо срабатывают непредсказуемо. По данным независимых исследований, до 100% популярных наборов правил из открытых репозиториев имеют проблемы, из-за которых работают не так, как ожидается.

Дальше — конкретно: что изменилось в структуре правил, какой формат рабочий, как написать правило, которое реально влияет на поведение Cursor, и как проверить чужие правила перед тем, как тащить их в свой проект. Все примеры — рабочие, проверенные на реальных проектах.

Что вообще такое правила Cursor

Cursor Rules — это постоянные инструкции для ИИ-агента редактора. Стиль кода, архитектурные соглашения, антипаттерны проекта, форматы импортов — всё то, что обычно живёт в неписаных договорённостях команды. Без правил Cursor каждый раз начинает работу с нуля и угадывает стиль по открытым файлам. Иногда угадывает, иногда нет.

С явными правилами поведение становится предсказуемым. Когда вы говорите «напиши новый компонент», Cursor смотрит в правила и знает: компонент функциональный, экспорт именованный, валидация через zod, тесты в той же папке. Не нужно повторять это в каждом промпте.

Без правил

С хорошими правилами

Cursor угадывает стиль по соседним файлам

Cursor знает конвенции проекта явно

Каждый раз надо повторять «не используй default export»

Это уже зафиксировано — Cursor помнит

Разные участники команды получают разные результаты

Все работают в одном контексте

Сгенерированный код регулярно нужно править под стиль

Код сразу соответствует — меньше ревью-итераций

Что изменилось: от .cursorrules к .cursor/rules/

Если последний раз вы настраивали Cursor в 2023 или 2024 году, у вас в голове формат «один файл .cursorrules в корне проекта». В 2026 году это устаревший подход. Cursor официально пометил его как deprecated и рекомендует переходить на новую систему.

cursor_02_old_vs_new.png

Что было (2023–2024)

Что стало (2025–2026)

Один файл .cursorrules в корне

Папка .cursor/rules/ с несколькими файлами

Расширение .txt или без расширения

Расширение .mdc (Markdown с метаданными)

Без управления тем, когда применять

YAML frontmatter с условиями применения

Один длинный файл со всеми правилами вперемешку

Один файл — одна область ответственности

Применяется всегда

Четыре режима: всегда, по путям, по контексту, вручную

Миграция простая: создаёте папку .cursor/rules/ в корне проекта, переносите содержимое старого .cursorrules в новые файлы, добавляете фронтматтер. Старый файл пока работает, но в любой момент может перестать — лучше мигрировать сейчас, чем потом разбираться, почему всё сломалось.

Анатомия рабочего правила: фронтматтер обязателен

Главное, что нужно понять про новый формат: без YAML-фронтматтера правило либо не загрузится, либо будет работать непредсказуемо. Это самая частая ошибка в наборах правил, которые лежат в открытых репозиториях.

Вот пример минимального рабочего правила. Файл .cursor/rules/react-components.mdc:

---
description: Стиль React-компонентов и именование
globs: ["src/**/*.tsx"]
alwaysApply: false
---

# React-компоненты

- Функциональные компоненты с хуками. Классовые не использовать.
- Именование: PascalCase для компонентов, camelCase для пропсов.
- Экспорт именованный: `export function Button()`, не default.
- Функции внутри компонента — не длиннее 20 строк.

## Что не делать
- Не добавлять useMemo/useCallback без измеренной проблемы перформанса.
- Не создавать HOC «на будущее».
- Не смешивать запросы и разметку — выносить данные в хуки.

Разберём по частям, что в этом файле важно.

Поле

Зачем

Можно пропустить?

description

Краткое описание для режима «Apply Intelligently» — агент по нему решает, релевантно ли правило

Нет, если используется этот режим

globs

Шаблоны путей, для которых правило применяется автоматически

Можно, если alwaysApply: true или Manual mode

alwaysApply

Применять ли правило в каждой сессии

По умолчанию false, если не указано

Если в файле нет ни одного из этих полей — Cursor не знает, когда правило должно срабатывать, и поведение становится непредсказуемым. Может загрузиться случайно, может не загружаться вообще.

Четыре режима правил: когда какой выбирать

В новой системе есть четыре способа задать, когда правило применяется. Выбор зависит от области применения и стоимости токенов.

cursor_03_modes.png

Режим

Когда срабатывает

Frontmatter

Когда использовать

Always Apply

В каждой сессии и каждом запросе

alwaysApply: true

Общие правила проекта: язык ответов, стиль коммитов

Apply to Files

Когда работаете с файлами по шаблону

globs: ["**/*.tsx"]

Технологичные правила: React-компоненты, тесты, миграции

Apply Intelligently

Когда агент сам решит, что релевантно (по description)

description: "..."

Узкие правила, которые применимы не везде, но автоматически

Apply Manually

Только когда вы пишете @rule-name в чате

Без alwaysApply и globs

Специальные сценарии: «как делать миграцию», «как писать миграцию БД»

Важная деталь, которая многих сбивает: правила работают только в Agent (Composer и Chat). В Tab completion и в Cmd+K (Inline Edit) они не подгружаются. Если вы пишете правило в надежде, ��то оно повлияет на автодополнение — оно не повлияет.

Самая частая ошибка новичков — ставить везде alwaysApply: true. Это сжирает токены. Правило, которое подгружается в каждый запрос, всегда висит в контексте. Если оно длинное, реального места для кода остаётся меньше. Используйте Always Apply только для общих вещей, специфичные — через globs.

Один файл — одна тема

Соблазн большой: написать один длинный файл с правилами на все случаи жизни. Не делайте этого.

Когда в одном файле перемешаны именование, обработка ошибок, структура папок и стилизация, происходит две неприятные вещи. Первая: агент не может применить правило точечно — он либо подгружает всё, либо ничего. Вторая: контекстное окно забивается лишним. Если общий файл правил весит 4000 символов, это примерно 1000 токенов в каждом запросе — токенов, которые могли бы идти на ваш код.

Правильная организация — один файл на одну область:

.cursor/rules/
  general.mdc           # язык, общие соглашения (alwaysApply: true)
  naming.mdc            # именование (globs: src/**/*.ts)
  components.mdc        # React-компоненты (globs: src/**/*.tsx)
  errors.mdc            # обработка ошибок (globs: src/**/*.ts)
  testing.mdc           # тесты (globs: **/*.test.ts)
  database.mdc          # запросы и миграции (globs: src/db/**)
  markdown.mdc          # документация (globs: **/*.md)

Рекомендуемый размер каждого файла — до 2000 символов в теле (примерно 500 токенов). Если получилось больше — разбейте на два файла с разными globs или сократите. Скорее всего, там есть размытые формулировки, которые можно выкинуть.

Конкретно и императивно — без «старайся» и «consider»

Это, наверное, главное правило хороших правил. Модель почти не реагирует на размытые формулировки. «Старайся писать чистый код», «consider best practices», «try to use modern patterns» — для агента это шум, который занимает токены, но не влияет на поведение.

Сравнение, как это выглядит на практике:

Размытое (не работает):

- Try to keep functions reasonably short
- Consider using modern React patterns where appropriate
- Aim for clean and maintainable code
- Use best practices for error handling

Конкретное (работает):

- Функции не длиннее 20 строк. Если длиннее — выноси в отдельную функцию.
- Используй функциональные компоненты с хуками. Классовые не пиши.
- Имена переменных описательные: `userOrders`, не `data` или `arr`.
- Все запросы к БД оборачивай в try/catch с конкретным типом ошибки.

Разница между этими двумя вариантами на уровне поведения Cursor — порядок раз. Первый набор Cursor пропустит мимо ушей. Второй — будет реально применять.

Императивная форма «делай так» работает лучше, чем описательная «правильно делать так». Это специфика LLM: они лучше следуют чётким командам, чем абстрактным принципам.

Блок «Что НЕ делать» — секретное оружие

Один из самых эффективных приёмов в Cursor Rules — раздел с явными запретами. Он часто работает лучше, чем длинный список «делай так».

Причина простая: LLM по умолчанию склонна к переусложнению. Добавить лишний слой абстракции, обернуть простую функцию в HOC, поставить useMemo «на всякий случай» — это её естественное поведение. Если явно сказать «не делай этого», модель удерживается от лишних движений.

Примеры рабочих запретов для разных стеков:

Стек

Что стоит запретить явно

React / Next.js

useMemo и useCallback без измеренной проблемы; default exports; обёртки HOC «на будущее»; смешивание данных и разметки в одном компоненте

Python / Django

Импорт через звёздочку (from module import *); голые except без типа; вложенные тернарные операторы; print для отладки в коммитах

TypeScript

any в типах (только unknown с проверкой); !.value (non-null assertion); enum (использовать union типов вместо)

Node.js / Express

Глобальные переменные кроме конфига; require() вместо import; sync-операции на критическом пути; необработанные промисы

Тесты

Тесты с зависимостью от порядка; sleep в тестах; реальные API-вызовы вместо моков; общие фикстуры между независимыми тестами

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

Полный пример работающего правила

Сводим всё вместе. Реалистичное правило для проекта на React + TypeScript + TanStack Query, которое реально влияет на поведение Cursor.

Файл .cursor/rules/react-components.mdc:

---
description: React-компоненты с TanStack Query
globs: ["src/components/**/*.tsx", "src/pages/**/*.tsx"]
alwaysApply: false
---

# React-компоненты

## Структура

- Один компонент — один файл. Имя файла = имя компонента в PascalCase.
- Хуки данных (useQuery, useMutation) в отдельной папке src/hooks/api/.
- Компонент не делает прямых fetch-вызовов — только через хуки.

## Именование

- Компоненты: PascalCase (UserProfile, OrderList).
- Пропсы: camelCase, типизированы интерфейсом.
- Интерфейс пропсов: ИмяКомпонентаProps (UserProfileProps).
- Бизнес-логика — функции с глаголом: handleSubmit, formatPrice.

## Экспорт

- Именованный экспорт: `export function Button()`.
- Никаких default exports.
- Барелы (index.ts с реэкспортами) — только для публичного API модуля.

## Данные

- Все запросы через TanStack Query (useQuery, useMutation).
- Состояния загрузки и ошибок обрабатываем явно — без скрытых fallback.
- Ключи запросов в src/queries/keys.ts — не разбрасывать по компонентам.

## Что НЕ делать

- Не добавлять useMemo и useCallback без профилировки.
- Не оборачивать в memo() без необходимости.
- Не использовать default exports — поломает рефакторинг.
- Не делать прямые fetch-вызовы в компонентах.
- Не использовать any — только unknown с явной валидацией.

Это правило весит примерно 1100 символов в теле (без фронтматтера). Влезает в рекомендуемые 2000 символов с запасом. Применяется только к компонентам и страницам — не нагружает контекст в других местах. Содержит конкретные команды и блок запретов. Cursor с таким правилом будет вести себя предсказуемо.

Как проверять чужие правила перед использованием

Прежде чем тащить готовое правило из открытого репозитория в свой проект, пройдитесь по короткому чек-листу из пяти пунктов.

cursor_04_checklist.png

#

Что проверить

Если нет

1

Есть ли YAML-фронтматтер с description и globs/alwaysApply?

Правило может не загружаться вообще

2

Тело правила укладывается в 2000 символов?

Сжирает токены, можно сократить или разбить

3

Одна тема в одном файле?

Разбить на отдельные файлы

4

Формулировки конкретные, в повелительном наклонении?

Заменить «consider», «try to» на «делай», «не делай»

5

Нет ли конфликта с правилами, которые уже в проекте?

Например, точка с запятой в одном и без неё в другом

Признаки правила, которое лучше не брать и написать своё с нуля:

  • Это просто список технологий: «Next.js 15, React 19, TypeScript 5.4, Tailwind»

  • Половина файла — это «You are an expert developer with 20 years of experience...»

  • Файл больше 5000 символов

  • Используются конструкции вида «think step by step» и другие промпт-инжиниринг-рудименты

  • Нет ни одного конкретного запрета — только «делай хорошо»

Когда правило проходит чек-лист — копируйте, иногда правьте под свой проект. Когда не проходит — не пытайтесь его починить, напишите своё. Своё короче, понятнее и будет работать.

Правила в git: командная работа

Папку .cursor/rules/ нужно класть в git. Cursor официально это рекомендует, и для команды это даёт несколько вещей сразу.

Первое — единый контекст у всех разработчиков. Когда коллега открывает проект, у него те же правила, что у вас. Не нужно по чату объяснять «мы тут не используем дефолтные экспорты». Это уже зафиксировано в репозитории.

Второе — упрощённый онбординг. Новый разработчик клонирует репо, открывает в Cursor, и его агент сразу знает соглашения проекта. Без долгого ввода в курс дела.

Третье — версионирование. Когда правила меняются, это видно в истории git. Можно посмотреть, почему какое-то правило добавили, обсудить в pull request, откатить, если что-то идёт не так.

Приоритет правил, если их несколько источников:

Уровень

Где живёт

Кому видно

Team Rules (высший приоритет)

В дашборде Cursor для команды

Всем участникам команды

Project Rules

.cursor/rules/ в репо

Всем, кто склонировал проект

User Rules (низший приоритет)

Личные настройки Cursor

Только вам на этой машине

На практике большинство команд работает только с Project Rules в репо — этого хватает. Team Rules в дашборде — для крупных компаний с десятками проектов и едиными корпоративными стандартами.

Применимость в других AI-IDE: Claude Code, Windsurf, Continue

Cursor — не единственный AI-редактор в 2026 году. Похожие системы правил есть в большинстве серьёзных инструментов, и принципы там одинаковые. Поэтому навык писать хорошие правила для Cursor легко переносится.

Инструмент

Где живут правила

Что общего с Cursor

Claude Code

CLAUDE.md в корне проекта + skills/

Markdown с метаданными, область применения через файлы

Windsurf

.windsurfrules + .windsurf/rules/

Очень похожий формат на Cursor — почти один в один

Continue

config.json с rules-массивом

Менее гибко, но та же идея с триггерами по путям

GitHub Copilot

.github/copilot-instructions.md

Один файл в стиле старого .cursorrules

Если в вашей команде используется несколько разных AI-IDE — стоит держать общий источник правды (например, в виде Markdown-документации проекта) и оттуда генерировать формат под каждый инструмент. Иначе правила быстро разъезжаются.


FAQ

Что делать, если правило явно не применяется?

Сначала проверьте фронтматтер: есть ли description, globs или alwaysApply. Дальше проверьте, что вы работаете в Agent (Composer или Chat), а не в Tab или Cmd+K — в них правила не подгружаются. Третье — посмотрите консоль Cursor (Developer Tools), там обычно видно, какие правила загрузились в текущей сессии.

Можно ли подключать одно правило из другого?

Нет, в Cursor нет директивы вроде @include. Каждое правило самостоятельно. Если нужны общие принципы для нескольких правил — напишите их в general.mdc с alwaysApply: true, и они будут подгружаться вместе с любым другим.

Стоит ли писать правила на русском или английском?

Современные LLM одинаково понимают оба языка. Русский удобнее для команды, где все говорят по-русски — проще читать и поддерживать. Английский удобнее, если в команде есть зарубежные участники или если правила копируете из открытых источников. Главное — не смешивать в одном файле.

Что важнее — Cursor Rules или хороший промпт?

Они работают вместе. Правила задают постоянный контекст, который не нужно повторять. Промпт задаёт конкретную задачу здесь и сейчас. Без правил каждый промпт становится длиннее, потому что приходится встраивать в него стиль. Без хорошего промпта правила не помогут, если запрос сформулирован размыто.

Сколько правил оптимально иметь в проекте?

5–10 файлов в .cursor/rules/ — нормально для типичного проекта. Если меньше пяти — возможно, вы упускаете важные области. Если больше пятнадцати — скорее всего, есть дубли или слишком мелкое дробление. Оптимально: один файл на каждую крупную область (компоненты, тесты, ошибки, БД, документация).

Cursor не учитывает правило — что-то с globs?

Проверьте синтаксис globs внимательно. Частые ошибки: src/*.tsx вместо src/**/*.tsx (одна звёздочка — только файлы в этой папке, две — рекурсивно), забытый префикс пути, неправильное расширение. Также Cursor применяет globs к пути относительно корня проекта, не относительно текущего файла.

Можно ли проверить правила автоматически?

Да, есть несколько утилит. Самая известная — cursor-doctor, запускается командой npx cursor-doctor lint. Проверяет наличие фронтматтера, длину, размытые формулировки, конфликты между правилами. Полезно прогонять в CI, чтобы не коммитили сломанные правила.

А что насчёт безопасности — правила могут быть вредными?

Правила сами по себе — не код, который выполняется. Это инструкции для модели. Но через них теоретически можно скомпрометировать контекст — например, попросить модель «всегда добавлять этот скрипт в HTML». Поэтому правила из непроверенных источников читайте внимательно. Особенно подозрительно смотрите на правила со ссылками на внешние ресурсы или специфическими URL — это не норма.

Никита Вихров

3 месяца назад

0

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845