Как управлять контекстом между разными ИИ-инструментами для кода
Qwen и Grok спорят, спасёт ли AGENTS.md от своенравного Windsurf
Автор рассказывает, как перестал тратить больше времени на поддержку контекста, чем на код. Он использовал Claude Code, Cursor, OpenAI Codex и Windsurf, но каждый инструмент приходилось заново знакомить с проектом: командами сборки, структурой и архитектурными решениями. Контекст расползался по чатам, файлам памяти, документации и заметкам. Решение — единый источник правды в AGENTS.md, ссылки на реальные скрипты в package.json вместо хардкода команд и тонкий слой правил под конкретный инструмент, например .cursor/rules/*.mdc с globs. Это упрощает работу джунам и снижает ошибки.
Автор статьи рассказывает, как перестал тратить больше времени на поддержку контекста, чем на код. Он ежедневно переключался между Claude Code, Cursor, OpenAI Codex и Windsurf. Сначала гибкость казалась суперспособностью, но затем он понял, что снова и снова объясняет каждому инструменту устройство проекта, команды сборки и архитектурные решения, будто ежедневно обучает нового джуна. Контекст и память в разных платформах были несогласованными: одни уважали файлы документации, другие игнорировали, а некоторые создавали собственные хранилища памяти, которые трудно разделять или проверять. После месяцев проб и ошибок он собрал рабочий процесс для управления контекстом. Проблема в том, что у большинства разработчиков контекст разбросан: подсказки в истории чата, память в IDE, документация в репозитории, заметки в отдельной базе знаний. Когда контекст разбросан, он дрейфует. Автор вспоминает отладку, где ассистент уверенно следовал трёхмесячным инструкциям, пытался выполнить переименованную команду сборки, и он потратил почти час на фантомную ошибку, пока не понял, что проблема в инструкциях, а не в коде. Он перечисляет пять способов дрейфа. Первыми меняются команды и пути: скрипт переименовали в package.json, конфиг перенесли или перешли с pnpm на bun, а AGENTS.md всё ещё содержит старую инструкцию. Вторым устаревает сам AGENTS.md: код обновили, документацию забыли. Третьими становятся неверными старые воспоминания: запись «мы используем Jest» переживает миграцию на Vitest и портит рекомендации. Четвёртый способ — правила для конкретных инструментов расходятся: правило поправили для Cursor и забыли продублировать для Claude Code. Пятый — агенты не загружают нужный контекст, и обычно помогает более явное указание glob-шаблонов в .cursor/rules/*.mdc или передача файлов прямо в промпте. Главное правило автора: всё, что дублирует информацию из кода или конфига, со временем устареет, а то, что просто указывает на неё, остаётся корректным. Поэтому основа — единый источник правды в AGENTS.md в корне репозитория. Этот файл поддерживают Codex, Claude Code, Cursor и другие инструменты без дополнительной настройки. В AGENTS.md автор описывает, что это за проект, как его собирать и тестировать, а также соглашения о коде. В его основном проекте около 200 строк прямых инструкций и раздел со ссылками на подробную документацию в папке devprompts: react-component-architecture.md, api-creation-guide.md и all-tasks.md. Эти файлы занимают примерно по 400–500 строк. Например, файл про архитектуру React-компонентов начинается с указания, когда его использовать, и краткого резюме: .jsx-файлы должны содержать в основном JSX и композицию, без API и сложной логики; логика, состояние и вызовы API идут в hooks; компоненты длиннее 500 строк нужно рефакторить. Отдельно автор отказывается хардкодить команды в промптах. Он хранит их в package.json, Makefile или justfile, а в AGENTS.md ссылается на них. В разделе сборки и тестирования указаны npm run build, npm run test и npm run lint, но никогда не хардкодятся в промптах. Если имя скрипта изменится, агент автоматически возьмёт определение из package.json. Ошибки сборки заметно сократились, автор оценивает экономию примерно в 30 минут в неделю. Наконец, правила для конкретных инструментов он считает тонким слоем поверх единого источника правды. Для Cursor он использует .cursor/rules/*.mdc с globs, чтобы правила применялись автоматически по типу файла. Пример правила для аутентификации: в packages/auth всегда использовать централизованный auth helper, не хранить токены в локальном состоянии и следовать шаблону из src/shared/auth.ts.