Руководство · Cursor
Где в Cursor хранить контекст проекта
Перед задачей я даю агенту структуру репо, стек, ограничения, команды test/lint и критерий готовности - один brief в AGENTS.md или rules, плюс @ на 1-3 файла.

Почему агенту нужен контекст проекта до первой задачи

Cursor agent в документации собирается из трёх частей: Instructions, Tools и Model (overview). Instructions - это не только ваш промпт, но и Project Rules, AGENTS.md, User Rules и то, что вы явно прикрепили через @. Когда brief пустой, модель опирается на общие знания о «типичном React-проекте» и начинает угадывать: другой тест-раннер, чужие папки, лишние зависимости.
Симптом, который я ловлю на первом созвоне: агент уверенно пишет код, но не тот стек. В репо Vitest, а в ответе Jest. Monorepo с apps/crm и apps/web, а правки уходят в корневой src/. Это не «глупая модель», это пустой cursor context. Cursor agent mode без карты репо превращает автономный режим в лотерею: инструменты search и edit работают, но цель выбирается вслепую.
Я разделяю два слоя. Долгая память - rules и AGENTS.md в git, подключаются по правилам проекта (rules). Тактика на задачу - чат, @ на файлы, diff ветки, узкий scope в промпте (prompting). Без первого слоя второй каждый раз начинается с нуля: вы снова объясняете, где backend, какие команды verify, что трогать нельзя.
На новостных разборах всплывает отдельный риск: публичные логи агента, куда случайно попали пароли из промпта. Угол простой - не кормить секретами ни чат, ни rules, ни вложения. Cloud Agent умеет redact runtime secrets (security), но это не отменяет здравый смысл: ключ в промпте уже ушёл в историю.
Чеклист «готов ли репо к Agent» из пяти пунктов:
- 01
Есть
AGENTS.mdили один project rule с картой папок и стеком. - 02
Verify-команды скопированы дословно из
package.jsonили Makefile. - 03
.cursorignoreзакрывает.env*, ключи и тяжёлые артефакты. - 04
В git отдельная ветка под задачу, commit «до агента».
- 05
В промпт добавлены 1-3
@на entrypoint, а не весьsrc/.
Подробнее про режимы и когда включать Agent - в cursor agent mode. Здесь фокус на том, что положить в контекст до клика Build.
Как собрать project brief: структура репо и стек

Project brief - это не копипаст всего дерева файлов и не dump README на три экрана. Я укладываю карту в 5-10 строк: где frontend и backend, entrypoints, «священные» папки, monorepo-пакеты. Остальное агент находит через search, если вы указали якоря.
Пример карты для вымышленного CRM-бота (без реальных ключей):
bot/ - Telegraf, entry bot/index.ts
web/ - Vite + React, entry web/src/main.tsx
shared/ - типы заявок, не трогать без задачи
deploy/ - только по явному запросу
prisma/ - migrations только с моего OKСтек пишу конкретными именами: «Node 20, Telegraf 4, Prisma, Vitest», а не «веб на React». Пакетный менеджер, ORM, линтер - одной строкой. Если в monorepo три приложения, я перечисляю, какое из них в scope сегодняшней задачи, и какие соседние модули закрыты.
Про env без секретов: в brief указываю названия переменных (DATABASE_URL, TELEGRAM_BOT_TOKEN), но не значения. Файлы .env* лежат в .gitignore и .cursorignore. Если агенту нужен формат - даю пример .env.example без боевых строк. В чат не вставляю production-токен «чтобы заработало» - после публикации логов это уже не откатить.
Cursor context used в интерфейсе - счётчик того, что попало в окно: rules, @-файлы, сжатая история, tool output (prompting). Отсюда правило: не грузите полные дампы логов, весь node_modules через @, скриншоты с PII. Лучше ссылка @src/handlers/lead.ts и две строки симптома.
Как создать проект cursor в смысле «готов к агенту»: File → Open Folder на репозиторий, затем brief. Отдельного мастера «New Cursor Project» нет - проект это папка с кодом плюс контекстный пакет. Первый вечер с веткой и diff я разбирал в первом проекте в Cursor.
Минимальный .cursorignore для того же CRM-бота:
.env
.env.*
secrets/
deploy/production.*
node_modules/
dist/
coverage/
*.pem
*.keyПомните оговорку из доки: .cursorignore блокирует read и @ для Agent, Tab и Inline Edit, но не блокирует terminal и MCP (ignore-file). Если агент запускает shell, он теоретически может прочитать то, что вы закрыли от индекса. Нужны approvals на команды и права на файлы в ОС.
Команды test, lint и критерий «готово»

Verify-команды в brief - дословно из вашего package.json, не из головы модели. Документация советует не дублировать очевидные git status в rules (rules), но ваши скрипты - да: npm run lint, npm test, npm run build, pnpm exec vitest run, что реально есть в репо.
Я добавляю критерий «готово» в двух формулировках - для агента и для себя:
| Кто проверяет | Критерий | Почему |
|---|---|---|
| Агент (до отчёта) | exit code 0 у lint и test из brief | Меньше ложных «всё ок» |
| Я (перед merge) | тот же набор + ручной smoke | Чат не заменяет CI |
| Merge | diff не шире согласованного scope | Нет «улучшил заодно» |
Типичный блок в brief:
## Verify
npm run lint && npm test && npm run build
## Готово когда
- lint/test/build - exit 0
- изменены только файлы из scope задачи
- нет новых зависимостей в package.json
- .env* не в diffПосле Agent я не верю словам «тесты прошли». Открываю терминал и гоняю те же команды. Скрипт, который копирую ученикам:
#!/usr/bin/env bash
set -euo pipefail
npm run lint
npm test
npm run build
git diff --stat
git diff | grep -E '\.env|SECRET|TOKEN|password' && echo "STOP: secrets in diff" && exit 1 || trueПоследняя строка - грубый smoke на утечку в diff, не замена секрет-сканера. Полный чеклист ревью diff - в как проверять код от ИИ.
Порядок verify, который я держу на разборах:
- 01
Agent закончил - не принимать всё сразу.
- 02
npm run lintиnpm testвручную в терминале. - 03
git diffпо файлам из scope. - 04
Ручной клик по изменённому UI или один API-запрос.
- 05
Commit только после зелёного verify.
Если verify падает, в следующий промпт иду с логом ошибки и @ на failing test, а не с «ну попробуй ещё раз».
Cursor git: ветка и diff без секретов в истории
Cursor git для меня - не отдельная магия редактора, а обычный Git плюс дисциплина scope. Checkpoints в Agent откатывают файлы внутри сессии, но не заменяют историю между вечерами (overview). Я всегда завожу ветку под задачу и commit до первого промпта агента.
Что пишу в brief про git:
## Git
- Ветка: feat/lead-form-validation (от main)
- Scope diff: web/src/components/LeadForm/*, shared/validators/lead.ts
- Не коммитить: .env*, *.pem, credentials.json
- Checkpoints - undo в сессии; постоянная история - только gitCursor git в промпт иногда дополняю @Branch (Diff with Main) - агент видит, что уже изменено, и не дублирует правки (prompting). Маленькие коммиты после каждого зелёного verify проще ревьюить, чем один ком «агент сделал всё».
Секреты в истории - отдельная боль. Если .env попал в commit, git rm не стирает его из прошлых коммитов. Я учу не paste содержимое .env в чат «для контекста» и держать шаблон в .env.example. Для облачного агента - Secrets tab и Runtime Secret, который redacted в transcript (security).
На разборе видел типичный сценарий: ученик скинул токен бота в промпт, потом запушил ветку на GitHub. Откат - ротация ключа и чистка истории, не «удали строку в Cursor». Профилактика дешевле: brief с запретом, ignore-файлы, никаких секретов в rules.
Пять шагов git-страховки перед Agent:
- 01
git checkout -b task/короткое-имя - 02
Commit чистого состояния.
- 03
Brief с путями scope и запретом
.env*. - 04
Agent + пофайловый просмотр diff.
- 05
Merge только после verify и проверки, что в diff нет ключей.
Подробный вечерний сценарий - в первом проекте в Cursor.
Brief сессии vs cursor rules: что в Rules и что в чат
Cursor rules - постоянная память репозитория: .cursor/rules/*.mdc, приоритет Team → Project → User (rules). AGENTS.md в корне или подпапке подхватывается автоматически по пути файла. Brief сессии - то, что вы добавляете в конкретный чат: формулировка задачи, @ на файлы, diff, ссылка на тикет.
Я не дублирую в чат то, что уже в rules. Если verify-команды лежат в project rule, в промпт пишу задачу и scope, а не третий раз npm test. Rules держу короче 500 строк - рекомендация из доки. Длинный brief разбиваю: архитектура в AGENTS.md, стилевые мелочи в User Rules, политики команды - в Team Rules на dashboard.
Cursor rules и skills - смежные, но разные механизмы. Skills scoped по paths (skills) - отдельные инструкции под glob. Rules задают базовый контекст на каждую сессию. Разовый промпт из промптов для Cursor не заменяет rule «не трогать deploy/».
Таблица, которую я даю на созвоне:
| Слой | Где живёт | Когда обновлять | Пример содержания |
|---|---|---|---|
| Project Rules / AGENTS.md | git | редко, при смене стека | карта репо, verify, запреты |
| User Rules | Cursor settings | личные привычки | язык ответов, формат diff |
Чат + @ | сессия | каждая задача | «почини валидацию email в LeadForm» |
| Skills | .cursor/skills | под домен | сценарий для src/api/* |
User Rules не работают в Inline Edit (Cmd/Ctrl+K) - только в Agent Chat (rules). Если привыкли править строку через K, туда контекст не подтянется из User Rules.
Когда @ уместен: вы знаете entrypoint. Когда нет - агент ищет сам (search), но с brief поиск уже не блуждает по monorepo. Синтаксис rules и типы .mdc - в cursor rules.
Типовые ошибки и как исправить
Ошибки ниже - с разборов, не абстрактный список «будьте внимательны». У каждой пары симптом и конкретный фикс.
| Симптом | Вероятная причина | Как исправить |
|---|---|---|
| Правит не те файлы | нет scope в brief и rules | globs в .mdc, список путей, @ на entrypoint |
Тащит .env в diff или чат | файл не в ignore | .cursorignore + rule «не читать .env»; ротация ключа при утечке |
| Путает Jest/Vitest, ORM, роутер | нет one-liner стека | строка стека в AGENTS.md + verify из package.json |
| «Улучшил» полрепозитория | нет запрета на scope | rule: max N файлов, не рефакторить соседние модули |
| Окно контекста забито | dump README и логов в чат | ссылка @file, /summarize в CLI (cli/using) |
| Агент обошёл ignore через shell | terminal не блокируется ignore | approvals, права FS, не давать cat .env в задаче |
Отдельно про cursor context used: если счётчик улетает в красную зону, режьте историю, убирайте лишние @, выносите повторяющееся в rules. Не лечите переполнение новым простынным промптом.
Три истории с поля, без выдуманных цифр. Разбор А: CRM-бот, агент добавил axios, хотя в проекте уже fetch wrapper - в brief не было «не добавлять зависимости». Фикс - одна строка в AGENTS.md и откат package.json. Разбор Б: лендинг на Vite, агент положил API-ключ в src/config.ts «временно» - не было .cursorignore на .env и запрета в rule. Фикс - ключ в env, example в репо, ключ ротирован. Разбор В: monorepo, правки ушли в соседнее app - brief не указал apps/crm как scope. Фикс - globs в rule и @apps/crm/src/... в промпт.
Шаблон brief и разбор процесса
Ниже шаблон, который я даю на наставничестве для вымышленного CRM-бота. Скопируйте в AGENTS.md или в .cursor/rules/project-context.mdc с alwaysApply: true. Подставьте свой стек, не копируйте чужие пути вслепую.
# AGENTS.md - CRM-бот (учебный шаблон, без секретов)
## Проект
- Node 20, Telegraf 4, Prisma, Vitest
- bot/index.ts - entry бота; web/src/main.tsx - entry фронта
- Monorepo: bot/, web/, shared/, deploy/, prisma/
- Не трогать без явного запроса: deploy/, prisma/migrations/, .env*
## Verify
npm run lint && npm test && npm run build
## Scope Agent
- Разрешено: src/handlers/*.ts, web/src/components/LeadForm/*
- Запрещено: новые npm-пакеты, рефактор «заодно», секреты в коде
- Max файлов в одной задаче: 5
## Git
- Работаем в feature-ветке от main
- Commit после зелёного verify
- .env* не в diff и не в чат
## Секреты
- Токены только в .env (в .gitignore и .cursorignore)
- В промпт - имена переменных, не значения
- Terminal/MCP могут читать файлы вне ignore - не просить cat .envПроцесс на 15 минут до первой задачи:
- 01
Open Folder на репозиторий.
- 02
Создать или обновить
AGENTS.mdпо шаблону выше. - 03
Добавить
.cursorignoreна секреты и мусор. - 04
Проверить, что verify-команды из brief реально существуют (
npm run). - 05
Ветка + commit «до агента».
- 06
Промпт: задача + 1-3
@на файлы + ссылка на scope из brief. - 07
Agent → diff → verify → commit.
Если brief уже есть, а агент всё равно плутает - смотрю три места: конфликт Team Rules с project rule, дубли противоречивых инструкций, слишком широкий auto-search без @. Часто помогает один alwaysApply rule на 30 строк вместо пяти разрозненных .mdc.
По теме в блоге: cursor rules - оформление после brief; cursor agent mode - когда жать Build; как проверять код от ИИ - после diff.
Частые вопросы
Что такое cursor context used?
Это счётчик того, сколько материала попало в окно контекста агента: Project Rules, AGENTS.md, файлы через @, сжатая история чата, вывод tools. Cursor context used растёт, если тащить в чат полные логи, дампы README и десятки @-файлов. Секреты и PII в prompt тоже увеличивают окно и риск утечки - держите brief коротким, повторяющееся выносите в rules.
Как создать проект cursor с готовым контекстом?
Проект в Cursor - это папка с кодом: File → Open Folder. Как создать проект cursor правильно: после открытия положите AGENTS.md или project rule с картой папок (5-10 строк), стеком, verify-командами и запретами; добавьте .cursorignore на .env*. Отдельного мастера New Project нет - контекст вы собираете сами за 15 минут до Agent.
Можно ли включать cursor agent mode без brief?
Можно, но агент будет искать файлы сам и часто путает стек или лезет в чужие папки monorepo. Я сначала кладу brief в репо, потом включаю cursor agent mode с узким scope и 1-3 @ на entrypoint. Без brief cursor agent полезен для эксперимента, не для боевого CRM или бота под дедлайн.
Что указать в cursor git для агента?
В brief или rule: имя feature-ветки, scope путей в diff, запрет коммита .env* и ключей. Cursor git - обычный Git плюс @Branch (Diff with Main) в промпт, если продолжаете задачу. Checkpoints в Agent - undo внутри сессии, не замена git между вечерами. Маленькие коммиты после зелёного lint/test проще ревьюить.
Cursor rules или brief в чате - что куда?
Cursor rules и AGENTS.md - постоянная память репо в git: стек, verify, архитектурные запреты. Brief в чате + @ - тактика на одну задачу: формулировка, файлы, тикет. Не дублируйте verify-команды в каждом промпте, если они уже в rules. Разовые промпты из статей не заменяют project rule; cursor rules и skills дополняют друг друга, не конкурируют.
Что не отправлять агенту в контекст?
Не отправляйте: содержимое .env и API-ключи, production-токены, PII клиентов, полные prod-логи, дампы всего src/, скриншоты с паролями. .cursorignore блокирует read и @, но не terminal и MCP - агент теоретически может прочитать файл через shell. Cloud Secrets и Runtime Secret помогают в облаке, но ключ в чате уже в истории.
AGENTS.md или .cursor/rules - что выбрать?
AGENTS.md проще: markdown без frontmatter, nested файлы в подпапках для monorepo. .cursor/rules/*.mdc даёт globs, alwaysApply и типы правил - удобнее, когда разный контекст для backend и frontend. Я часто начинаю с AGENTS.md на 30-40 строк, при росте проекта выношу verify и запреты в один alwaysApply .mdc.
Связанные страницы

Обсудить вашу задачу
Напишите в Telegram цель, что уже сделано и где стопор.
Отвечаю сам — без бота и «оставьте заявку».




