Привет!
В этой статье расскажи про хорошие практики по работе с Cursor IDE.
Используйте Rules на уровне проекта
Cursor при индексировании проекта в общих чертах может сам понять, что в проекте находится и как должно работать.
Но будет намного лучше, если у него будет описание того, как это должно работать.
Для этого существуют Rules, их можно добавить или через
File -> Preferences -> Cursor Settings -> Rules & Commands -> Project Rules -> Add Rule
Но я советую добавлять другим способом, в корне проекта создает папки
.cursor -> rules -> файл spec_global.mdc
сверху в файле обязательно указываем
--- alwaysApply: true ---
после этого spec_global должен показаться в Project Rule в настройках Cursor
Rules добавляются к новым чатам с агентом.
В Rules можно описать:
- роль агента
- технологический стек проекта
- структуру проекта, например что все сервисы, контроллеры и так далее должны лежать в соответствующих папках, какие то правила, которые вы хотите чтобы соблюдались, например чтобы при создании экрана для него в этой же папке создавался viewmodel, чтобы экраны находились каждый в отдельных папках, чтобы базовые классы находились на один уровень иерархии выше, любые правила по неймингу и так далее
- любые специфические требования для проекта
Используйте глобальные Rules
Вы можете добавить в Cursor Rules, которые будут соблюдаться для любого проекта, в котором написать какие то пожелания по констайлу, какие то общие практики и так далее, сделать это можно здесь
File -> Preferences -> Cursor Settings -> Rules & Commands -> User Rules -> Add Rule
В интернете есть много примеров подобных Rules.
Для разных частей проекта создавайте специфичные для них Rules
Если проект состоит из разных частей, например backend, frontend и так далее, вам не обязательно держать все части в одном репозитории, вы можете добавить в Cursor нужную часть через
File -> Add Folder to Workspace
Для каждой части проекта и для любых папок в проекте вы можете создавать отдельные Rules, для этого создаем файл spec_frontend.mdc в соответствующей папке, в нем вы можете написать например
You act as a Senior Kotlin Multiplatform Engineer with extensive experience in Kotlin Multiplatform (KMP/KMM), clean architecture, modularization, shared business logic, MVI state management, repository patterns, and platform-specific implementations through expect/actual.
в папке backend вы можете написать
You act as a Senior Kotlin Backend Engineer with extensive experience in Kotlin, Ktor framework, REST API development, authentication and authorization, session management, encryption, and microservices architecture.
и так далее.
Для разных задач открывайте новые чаты
В Cursor контекст чата ограничен, поэтому для каждой новой задачи и подзадачи лучше открывать новый чат, снижает нагрузку на LLM и позволяет более эффективно работать в рамках задачи.
Если контекст чата закончился- вы можете использовать команду в окне ввода текста чата
/Summarize
при этом сгенерируется summary чата и контекст освободится.
Используйте Auto модель
В Cursor можно выбирать LLM модели вручную, также использовать свои API Token для OpenAI API, Gemini API и так далее, даже локально запущенные в Ollama или LM Sttudio модели, но я бы не советовал этого делать.
У LLM провайдеров есть глупые и умные модели, например у OpenAI есть модели Pro, обычные, Mini, Nano, более простые модели стоят в 10-20 раз дешевле, также они намного быстрей и для простых задач лучше использовать их.
При работе агента в Cursor работа состоит из разных шагов вроде оценки задачи, запросов в интернет, выполнения, оценки результата и многих других промежуточных шагов. Далеко не для всех этих шагов нужны умные и дорогие модели.
По умолчанию в данный момент Cursor говорит о том, что использование Auto модели безлимитно в рамках тарифов Pro и более высоких.
Также если в кабинете Cursor вы можете выбрать политику использования подписки, здесь есть очень важная опция
On-Demand Usage is Off / On
если она включена, Cursor может использовать более дорогие модели и затем выставлять вам счет за их использование.
Из практики, тарифа Auto в рамках подписки Pro с On-Demand Usage is Off вполне хватает для работы.
Нет никакого смысла добавлять для работы агента какую то кастомную модель и включать On-Demand Usage.
Используйте MCP сервера
MCP (Model Context Protocol) — это открытый стандарт для подключения больших языковых моделей (LLM) к внешним инструментам и данным, позволяющий им выполнять задачи, недоступные в их исходном обучении. Он стандартизирует обмен информацией между моделью (клиент) и сервером (внешние системы, такие как CRM, почта, базы данных) для повышения их полезности.
В Cursor вы можете подключить в
File -> Preferences -> Cursor Settings -> Tools & MCP -> New PCP Server
но я рекомендую другой способ- в папке .cursor создаем mcp.json, для любого подобного сервера вы можете посмотреть нужное содержимое этого json, например:
Вот пример инструкции и json для mcp сервера для n8n, там же находятся Rules для работы сервера
https://github.com/czlonkowski/n8n-mcp
при помощи этого сервера Cursor может подключаться к n8n Workflow, смотреть и редактировать его.
Вот один из серверов, при помощи которого можно подключить к Cursor ваш аккаунт на Confluence
https://github.com/sooperset/mcp-atlassian
благодаря этому Cursor может смотреть описания для разных частей проекта на Confluence и брать оттуда всю необходимую информацию для задачи.
Соглашайтесь с изменениями, сделанными Cursor, если стало лучше, чем было
Может быть много разных мнений на тему того, когда лучше принять сделанные Cursor изменения, но мое мнение здесь такое:
Если стало лучше, чем было, лучше апрувнуть изменения.
Часто Cursor выполняет часть задания, что то выполняет не правильно, но если делать approve только когда все полностью готово, могут быть такие проблемы:
- Когда изменений слишком много, их трудно ревюить
- Cursor что то испортил из того, что работало, и не может понять, что сломалось, при этом 90 процентов кода работает, в этом случае вы рискуете израсходовать контекст до того, как проблема будет исправлена
Поэтому я рекомендую делать Approve изменений, если стало лучше, чем было, и при этом ничего не сломалось.
Работайте с теми IDE, которые вам удобны, используя Cursor только для генерации кода
Cursor как IDE, а не как агент, не очень удобен в большинстве случаев, в нем нет очень многого из того, что есть в IDEA, PyCharm и других специализированных IDE.
Если проект состоит из backend, frontend и других частей, может быть сложно запускать все это в Cursor, так как разные части могут потребовать специфических плагинов и возможностей, которых нет в Cursor.
Поэтому вы можете работать одновременно в Cursor, используя его только как агент для генерации кода, при этом всю остальную работу делать в соответствующих IDE, в которых открыты нужные части проекта.
Делайте избыточное логирование работы приложения
Если при запуске приложения что то пошло не так, максимально подробные логи позволят Cursor понять, что именно пошло не так.
Если для человека излишне перегруженная логами консоль- это существенный минус, у Cursor нет проблем с большим количеством логов, и сравнивая вывод с кодом, он может лучше понять, что именно в ходе выполнения пошло не так.
Делайте возможным независимый запуск отдельных участков приложения или делайте тесты, при ошибках просите Cursor запустить соответствующий кусок кода в консоли и посмотреть stacktrace
Cursor может сам взаимодействовать с консолью, запуская сборку и разные участки кода и смотря процесс выполнения по логам и ошибкам.
Вы можете попросить Cursor — запусти сборку проекта или такой то файл, посмотри вывод в консоль и исправь, делай это в цикле пока не начнет работать.
Эта стратегия может быть намного более эффективной, чем если вы запустите код самостоятельно и скопируете агенту Cursor stacktrace ошибки.
Для разных частей проекта вы можете делать независимый запуск для того, чтобы Cursor мог запустить соответствующий код и посмотреть, что получилось, например в Python вы можете добавлять код
if __name__ == "__main__": ...(some method)
и затем просить Cursor запустить этот код и посмотреть stacktrace.
Также существует подход, когда сначала пишутся тесты, затем пишется код, который их должен проходить, с Cursor такой подход может быть очень эффективен.
У запуска Cursor кода в консоли можно настроить политику через
File -> Preferences -> Cursor Settings -> Agents -> Auto-Run -> Auto-Run Mode
здесь вы можете выбрать, запускать все без approve, или ждать approve от пользователя, последнее более безопасно, так как вы можете просмотреть команду, которая запускается, но при этом увеличивает время работы над кодом.
Всегда проверяйте список изменений перед commit
Это правило было очень важно еще задолго до появления Cursor, но с появлением агентов для генерации кода оно стало еще более важным.
Любые LLM склонны ошибаться, и склонны изменять тот код, о котором не говорилось, что его нужно изменять.
Тут всегда есть баланс между самостоятельностью агента и риском испортить то, что уже работало.
Поэтому перед commit очень важно просматривать полный список всех изменений, которые сделал агент, чтобы не поломать то, что работало, не сделать дыру в security и так далее.
Декомпозируйте большие задачи на мелкие от общего к частному, генерируйте код шаг за шагом, контролируйте каждый шаг, шаги должны быть самодостаточны и не зависеть от последующих шагов
Если вы попросите Cursor написать все и сразу, с большой долей вероятности получится работающий не корректно код, который выглядит совсем не так, как вы бы хотели.
Чтобы такого не получилось, декомпозируйте задачу на максимально мелкие и подробные шаги, например
- Создать базовую архитектуру
- Добавить зависимости
- Обновить зависимости до последних версий
- Создать папки и базовые классы
- и так далее
В результате, когда вы контролируете каждый шаг, скорее всего вы получите то, что ожидаете.
Важно при этом, чтобы на каждом шаге проект собирался и в нем не было ошибок, то есть каждый этап должен быть самодостаточным и не зависеть от последующих шагов.
После каждого шага вы можете делать commit, чтобы всегда иметь возможность откатить все изменения и сгенерировать последующий код заново.
Поскольку Cursor может делать одно и то же разными способами, уточняйте, какой способ актуален для вас
Вы можете давать агенту ссылки на официальные мануалы как референс, ссылки на статьи с понравившимися реализациями и так далее.
Перед генерацией кода вы можете спросить агент, какой способ будет наиболее актуальным, какие плюсы и минусы, чтобы выбрать подходящий, иначе выбор реализации будет на стороне агента, а он в большинстве случаев выбирает реализацию основываясь на своих обучающих данных, а как мы знаем, основной источник данных для LLM это Reddit, Stackoverflow и прочие не надежные источники.
При добавлении библиотек всегда просите агент использовать последние версии и учитывать тип лицензии
По умолчанию агент Cursor, как и все LLM, не смотрит в интернет, какая версия последняя, а добавляет какую то, о которой знает, часто это версия, выпущенная 2-3 года назад.
В этом случае последующий переход на актуальную версию может быть связан с дополнительными трудностями и потерей времени.
Поэтому всегда намного проще попросить агент посмотреть в интернете и использовать актуальную версию библиотеки.
Также будьте внимательны с типом лицензии библиотеки, агент на такое обычно не обращает внимание, и вы рискуете добавить в приватный enterprise проект библиотеку с GPL лицензией, которая подразумевает раскрытие исходного кода.