Правила проекта - это постоянные инструкции, которые живут в репозитории и применяются автоматически. Хранятся они в отдельном каталоге и требуют собственного формата с заголовком: обычный markdown-файл там просто игнорируется, потому что в нём нет полей, по которым правило подключается. Эта деталь ловит почти всех при первой настройке - файл лежит на месте, выглядит правильно и при этом не действует. Ошибка тихая: никакого сообщения не появляется, правило просто не участвует в работе, и понять это можно только по поведению.
Способов применения четыре, и выбор между ними определяет всё. Правило может применяться всегда; может подключаться агентом по описанию, когда тот сочтёт его релевантным; может привязываться к путям файлов; может вызываться только вручную по имени. Разница не косметическая: постоянное правило платит контекстом в каждой задаче, правило по путям - только там, где вы действительно работаете с этими файлами. В большом репозитории эта разница измеряется не процентами, а тем, останется ли место под сам код задачи.
Полезно один раз увидеть правило целиком. Ниже - заголовок с описанием и маской путей плюс короткое тело: проверять ввод на границе сервиса, возвращать структурированные ошибки, читать образец перед созданием нового сервиса. Обратите внимание на длину: правило - это контракт, а не документация. Чем оно короче и конкретнее, тем выше шанс, что модель ему последует. Обратите внимание и на последний пункт: ссылка на образцовый файл работает лучше, чем пересказ того, что в нём написано, потому что образец не устаревает вместе с текстом правила.
Сочетание полей заголовка задаёт поведение, и его стоит держать в голове. Признак постоянного применения включает правило всегда и делает описание и маски бессмысленными. Без него, но с масками, правило прикрепляется к совпавшим файлам. Без него, но с описанием, решение принимает агент. Если нет ни описания, ни масок, правило доступно только по явному вызову. Это ровно четыре комбинации, и каждая из них - осознанный выбор цены и охвата: от постоянной платы за гарантию до нулевой платы без всякой гарантии.
| Поля заголовка | Поведение |
|---|---|
| alwaysApply: true | Всегда; описание и маски путей игнорируются |
| alwaysApply: false и маски путей |
|---|
| Прикрепляется к совпавшим файлам |
| alwaysApply: false и описание | Агент выбирает по релевантности |
|---|
| Ни описания, ни масок | Только явный вызов по имени |
|---|
Рядом существует альтернатива в виде обычного markdown-файла контракта. Он проще: не требует особого формата и читается человеком как обычная документация. Поддерживается вложенность - инструкция ближе к рабочему файлу получает более узкую область действия. Это удобная модель для монорепозитория: общие инварианты сверху, специфика пакета рядом с его кодом. Командная строка дополнительно читает корневой файл соглашений другого агентного инструмента, так что один репозиторий может обслуживать несколько инструментов без дублирования смысла.
Командные правила стоят особняком, потому что управляются централизованно и имеют приоритет над проектными и пользовательскими. Принудительное правило нельзя отключить локально, и в этом его смысл: организация фиксирует обязательный минимум. Обратная сторона - такие правила надо писать особенно аккуратно: то, что нельзя отключить, будет мешать в каждом проекте, где оно не к месту. Хорошее командное правило описывает инвариант, одинаково верный для всех репозиториев, а не привычку одной команды.
Правило, которое не срабатывает, диагностируют по порядку, а не перебором. Сначала формат: лежит ли файл в нужном каталоге и с нужным расширением, есть ли заголовок. Потом режим: правило по маскам не включится, если открытый файл под маску не подходит, а правило по описанию не включится, если описание говорит о способности, а не о поводе. Формулировка соглашения о вызовах для сервисов бэкенда даёт агенту повод, формулировка полезные советы - нет. И только потом стоит подозревать содержание: слишком длинное правило теряется среди остального контекста, даже когда подключилось.
Самое важное ограничение этой части настройки: правила направляют, но не блокируют. Фраза никогда не читай секреты в правиле не заменяет ни файла исключений, ни ограничений файловой системы, ни hook. Кроме того, область действия у них разная: пользовательские правила применяются к разговору с агентом, но не к точечной правке, а подсказками в редакторе они не управляют вовсе. Ожидать от текста гарантии - самая частая ошибка здесь, и она тем опаснее, что правило выглядит выполненным ровно до того случая, когда его нарушение чего-то стоит.
Отсюда практическая манера писать правила. Одно правило - одно требование, сформулированное так, чтобы по коду было видно, выполнено оно или нет. Проверяй ввод на границе сервиса проверяемо, пиши качественный код - нет. Правило живёт рядом с кодом, меняется вместе с ним и проходит ревью как код: если требование устарело, его удаляют, а не оставляют на всякий случай. Набор из десятка коротких проверяемых правил работает лучше, чем один длинный документ о том, как у нас принято.
Типичные провалы предсказуемы. Положить обычный markdown в каталог правил и не понять, почему он не действует. Сделать все правила постоянными и оплачивать их контекстом в каждой задаче. Написать описание про способность вместо повода и получить правило, которое агент не выбирает. Записать в правило требование безопасности вместо детерминированного механизма. И ждать, что пользовательское правило подействует на подсказки в редакторе.
---
description: Соглашения RPC для сервисов бэкенда
globs: services/**/*.ts
alwaysApply: false
---
- Проверяй входные данные на границе сервиса.
- Возвращай структурированные ошибки с кодом и сообщением.
- Прочитай @services/example-service.ts перед созданием нового сервиса.