Мой набор инструментов для AI-кодинга: что работает, а что сожрало нервы
Несколько вечеров назад я подключал к Claude Code очередной MCP-сервер, про который «все пишут». Включил, посмотрел на счётчик контекста, который только что съело шестьдесят описаний tools, и тихо выключил обратно. Сел и впервые честно нарисовал свой стек не как список любимых тулз, а как набор слоёв. Получилось ровно шесть. И оказалось, что у меня дыры не там, где я искал.
За полгода плотной работы с AI-кодингом — назовите это vibe coding или harness engineering, смотря кто в разговоре — я понял простую штуку. Инструменты вокруг агента не равноценны. Каждый закрывает свой режим отказа: без «глаз» агент не видит результат в браузере, без «знания» галлюцинирует API годовалой давности, без «наблюдаемости» ты теряешь по полчаса на сессию, потому что забыл, что он уже закончил...
Шесть слоёв, а не десять серверов
Главная идея, ради которой всё это пишется. Стек для AI-кодинга — или, если угодно, для серьёзного vibe coding — это не каталог любимых инструментов, а шесть слоёв обвязки. Если внутри слоя пусто, режим отказа гарантирован. Если в слое каша из десяти инструментов, начинается деградация качества и токенов.
Про сам подход я уже писал отдельно: harness engineering на практике, вот это вот всё про «инфраструктура важнее модели». Здесь я раскладываю эту инфраструктуру на конкретные оси и говорю, чем закрываю каждую. И где каждая из них не закрывается.
Глаза: чтобы агент увидел, что наделал
Боль очень конкретная. Агент написал фронтенд и понятия не имеет, как оно выглядит в браузере. Кнопки на месте? Лейаут поехал? Текст читается? Без визуальной обратной связи он остаётся слепым исполнителем, а вы превращаетесь в его QA-инженера.
У меня в стеке тут стоит MCP Playwright. Это MCP-сервер, который даёт агенту управлять браузером: открыть страницу, кликнуть, сделать скриншот, прочитать DOM. Самый ценный кейс был на игре, которую я делал на Defold. Агент правил логику доски, после каждого изменения сам открывал страницу, проверял, что фишки на местах и интерактив не пропал. Без Playwright это была бы карусель «поправь, переключись в браузер, опиши, что не так, повтори».
Рядом стоят, и я туда не пошёл: Penpot MCP (открытый аналог Figma), Builder.io Visual Copilot, скриншот-в-код через vision-возможности GPT-4o. И отдельно скажу про Figma MCP. Первое впечатление было «вау»: подключил, агент увидел макет, верстал почти один-в-один. Я уже мечтал о пайплайне «Figma → код → Playwright → итерация без меня». А потом выяснилось, что на бесплатном плане Figma даёт шесть запросов в месяц. Не в день, в месяц. Я выжег лимит за вечер на тестовых прогонах. Урок: перед тем как строить пайплайн вокруг чужого MCP, проверяйте лимиты. Звучит банально, но я узнал это вечером впустую.
Цена слоя: Playwright поднимает полноценный браузер, на 16 гигах RAM это заметно. И главное, агент видит DOM и скриншоты, но «красиво или нет» интерпретировать пока не умеет. Слепое пятно остаётся.
Знание: чтобы агент не галлюцинировал на ровном месте
Боль ровно в двух местах. Первое: агент знает мир до cutoff модели, и новые API ему недоступны. Второе: ваш проект и его конвенции он не знает в принципе. Каждая сессия начинается с чистой памяти.
Я закрываю это сразу несколькими штуками, и они работают вместе. Локальная папка docs/ в проекте с выжимками API ключевых зависимостей: то, что точно понадобится, агент читает напрямую. CLAUDE.md (или AGENTS.md для Codex) с командами проекта, конвенциями и ссылками на эти выжимки. Скиллы под фреймворки: чужие я ищу по запросу «название фреймворка skill for claude code», свои пишу за полчаса, когда готового нет. Так я нашёл скиллы для Phaser и Defold, не идеальные, но дают агенту фору.
Раньше у меня вместо локальных docs/ стоял Context7: MCP-сервер, который подтягивает свежую документацию по запросу. Сейчас он у меня на отходе. Почему: подтягивает не то и часто слишком общие куски. Я хочу контролировать, что именно агент видит. Папка refs/ менее изящна, зато предсказуема. Глобально такая же мысль есть у OpenAI в их разборе harness engineering: длинные дефолтные инструкции превращаются в шум, лучше короткая карта и точные ссылки на знание в репозитории.
И отдельно отмечу инструмент, который тихо переворачивает работу: claude-reflect. Каждый раз, когда я поправляю агента («у нас так не делают», «используй этот паттерн»), коррекция сохраняется. Потом по команде /reflect накопленные правила, с моего одобрения, мигрируют в CLAUDE.md и скиллы. Это система обучения наоборот: не вы учитесь работать с агентом, а агент учится работать с вашим проектом. Я подробно разбирал, как у меня устроена связка Skills, Agents и Commands, сюда не дублирую.
Рядом, но я не использую: .cursorrules, Cline rules, ai-rules, репозиторий чужих скиллов aitmpl.com. Все они про одно: как накопить и переиспользовать «знание о проекте» в формате, который агент читает каждую сессию.
Тезис, в котором я уверен: хорошо оформленное представление о задаче бьёт мощность модели. Один и тот же агент с подробным CLAUDE.md и без него выдаёт два разных уровня результата. С контекстом он попадает в нужные паттерны с первого раза. Без контекста выдаёт формально правильный, но чужеродный код, который потом приходится переписывать руками.
Руки: MCP-серверы и оркестраторы
Боль: агент может советовать, но не действовать. Без слоя «рук» он генератор кода, а не участник вашего workflow.
Тут моя главная позиция, и она спорная: свои узкие MCP я предпочитаю готовым жирным. Когда сервер даёт агенту тридцать tools, контекст забивается описаниями инструментов, модель путается в выборе, и качество падает. Я пришёл к этому не из умозрения, а после того как подключил один «популярный» сервер с кучей интеграций, провозился вечер и обнаружил, что агент треть сессии потратил на выбор из пятнадцати похожих инструментов вместо работы. Теперь пишу Python-скрипт или мини-MCP с двумя командами под одну задачу. Дольше на старте, дешевле в работе.
Из готового я в режиме осторожного эксперимента щупаю vibe-kanban (доска задач, распределяет их между несколькими агентами) и Symphony от OpenAI (похожая идея, но под Codex). Звучит как мечта: один агент пилит фронтенд, другой бэкенд, третий тесты. Меня тут смущает одна штука. Эти инструменты запускают агентов без ограничений. Полный доступ к файловой системе, к терминалу, ко всему. Sandbox по умолчанию нет, approve-deny на опасные операции нет. Для пет-проекта на отдельной ветке это ок, для рабочего репо с .env, секретами и CI это лотерея.
В соседней зоне живут Paperclip multi-agent оркестратор на VPS, я с ним уже экспериментировал и обжёгся на 200 миллионах токенов, OmniRoute (AI-гейтвей с маршрутизацией по провайдерам). Каждый чуть под своим углом, но базовая идея одна.
Контр-вес к этому слою важнее самого слоя. DevContainer для всего, что трогает файлы или терминал: агент гадит в песочнице, ваш хост чистый. Git worktrees: параллельные ветки в отдельных папках, чтобы пару агентов запустить одновременно и не положить основной репо. Без этих двух штук оркестраторы я не разрешаю себе включать в проектах, где есть что терять.
Невидимая обвязка: hooks, sub-agents, slash-команды
Это слой, про который обычно молчат. Все обсуждают, какую модель выбрать, мало кто говорит, какими хуками её обвязать. А реальное качество живёт здесь.
Расскажу по этапам, как у меня этот слой собрался.
Этап 1. Первый хук на auto-format. Простейшая вещь: после каждого изменения файла прогоняется prettier и линтер. Агенту больше не надо помнить, надо ли вызывать форматтер: его вызывает обвязка. Уже на этом шаге количество мусорных правок «поставь точку с запятой» упало в разы.
Этап 2. Скиллы под мой пайплайн. Скилл это шаблон под повторяющуюся задачу: написать новый компонент, сделать ревью PR, оформить миграцию. Внутри скилла прописано, что читать, какому стилю следовать, что проверять. Это уже не разовый промпт, а целый контекст под задачу.
Этап 3. Sub-agents с изолированным контекстом. Лёгкая модель (Haiku) для рутинных проверок, тяжёлая (Opus) для архитектурных решений. Sub-agent работает в своём окне, основное окно остаётся чистым. Это и про качество, и про экономию: основной контекст не пожирается результатами поиска по 200 файлам.
Этап 4. Slash-команды в репо. У меня их сейчас около тридцати. /long-outline, /sync-posts, /reflect, и так далее. Каждая это маленький пайплайн, который я однажды описал словами, а теперь он запускается одной строкой. Один из самых высоких ROI во всём стеке.
Рядом, и я туда не пошёл: Cursor commands, GitHub Copilot extensions. Идея та же, реализация под другую среду.
Тезис, в котором я уверен сильнее всего: модель меняется раз в три месяца, обвязка меняется каждую неделю, и именно она определяет, в каком виде модель до вас доходит.
Наблюдаемость: знать, что агент закончил
Боль внешне мелкая, по факту жрущая много энергии. Отправил агенту задачу на десять минут, переключился, забыл. Возвращаешься через полчаса. Или наоборот, дёргаешься в чат каждые две минуты проверить, не закончил ли.
В моём стеке тут стоит Ghostty. Это современный терминал, в котором нормально работают системные уведомления macOS. Стандартный Terminal.app так не умеет. Звучит как мелочь, по факту экономит кучу ментальной энергии: больше не нужно держать в голове «как там агент».
Поверх Ghostty я ставлю peon-ping: звуковые уведомления через хук Claude Code, разные звуки на завершение, на запрос подтверждения, на длинную задачу. Полезно, когда работаешь в наушниках. Минус один: в опен-спейсе оно может отвлекать, лечится категориями и mute-режимом.
Третья штука нестандартная: я гоняю часть событий в n8n как в простейший логгер. Каждый раз, когда я надиктовываю промпт голосом, в n8n уезжает строчка: сколько слов, какой инструмент, какое время. Через месяц видно, где я реально живу и где у меня дыры.
Рядом, и я туда не пошёл: tmux notifications, Wezterm, телеграм-бот для очень длинных задач. Для домашнего сетапа точно избыточно.
Экономия: токены и память хоста
Объединяю две вещи в один слой, потому что обе про «сколько ресурсов съедает обвязка, чтобы хватило места на полезное».
Сначала про токены. Я долго не думал про них, пока не упёрся в лимиты Claude Code. Типичная сессия за полчаса жрёт около ста тысяч токенов. И большая часть это не ваши промпты, а вывод команд: git status, npm test, логи сборки. Агент честно читает всю эту простыню, хотя ему нужны три строчки из двухсот.
У меня тут стоит RTK, CLI-прокси на Rust, который перехватывает вывод терминальных команд и сжимает его. Установка через rtk init -g, дальше всё работает через хуки прозрачно: вы пишете git status, под капотом выполняется rtk git status с компактным выводом. Цифры по моему опыту: git-операции жмутся примерно на 85%, тесты на 90% (показывает только упавшие, не все пройденные), линтеры и сборка на 80%. В сумме за сессию экономия около 80%. Вместо того чтобы упереться в потолок за час, спокойно работаешь весь день.
Sub-agents из предыдущего слоя тоже сюда: изолированный контекст это экономия по определению.
Теперь про память хоста, потому что RAM тоже бюджет. У Codex есть UI-приложение, у Claude Code тоже. Удобно: мышка, кнопки, мультисессии. Цена: Electron-клиенты заметно жрут память. На моём MacBook с 16 гигами, когда параллельно работают пара агентов, браузер и IDE, каждый лишний процесс на счету. Поэтому я остался на CLI. Если у вас 32+ ГБ, разницы скорее всего не заметите, берите UI спокойно.
Рядом, и я туда не пошёл: ccusage для учёта токенов по локальным логам Claude Code, ручные пайпы и обёртки под шумные команды.
Тезис: каждый сэкономленный токен это место для полезного контекста. Каждый сэкономленный гигабайт это место для второго агента.
Где это не работает
Не все слои нужны всем. Если вы делаете трёхдневный пет-проект, слой «наблюдаемости» вам не упёрся. Если у вас фронтенд без бэкенда и нет ничего вырубать на проде, слой «рук» можно свести к нулю. Карта это инструмент мышления, а не обязательный комплект.
Обвязка устаревает. Тот же CLAUDE.md, который вы написали полгода назад, сегодня может направлять агента по старой архитектуре. Хуже, чем его отсутствие. Я живу с этим: примерно раз в месяц прохожусь по обвязке и выкидываю то, что больше не правда.
Переинжиниринг harness это реальная ловушка. Я в неё попадал. Вместо того чтобы писать код, неделю настраивал хуки. В какой-то момент нужно остановиться и сказать «достаточно, теперь работаем». Слой это средство, не цель.
Модель всё равно может сломать что угодно. Шесть слоёв снижают вероятность, не отменяют её. Я до сих пор читаю каждый PR от агента глазами. Просто PR-ы стали меньше и чище.
Минимальный стек: с чего начать
Если вы сейчас работаете с голым AI-кодером и хотите закрыть слои самым дешёвым способом, вот мой минимум по одному пункту на слой:
- Глаза: MCP Playwright. Один сервер, одна история «агент сам открыл свою же страницу».
- Знание: CLAUDE.md на одну страницу + папка docs/ с тремя ключевыми API. MCP-доки на старте не нужны.
- Руки: ваши узкие скрипты или один MCP под конкретную задачу. Не «подключим всё». В оркестраторы лезть только из-под DevContainer.
- Невидимая обвязка: один хук на форматирование и один на уведомление. Этого достаточно, чтобы почувствовать слой.
- Наблюдаемость: терминал с системными уведомлениями. Ghostty, Wezterm, что угодно, лишь бы уведомление прилетало.
- Экономия: RTK или аналог. Если RAM меньше 32 ГБ, оставайтесь на CLI.
Бонусом, не слой, но без него мой день длиннее на пару часов: voice-to-text для длинных промптов. Я переключаюсь по кругу между Wispr Flow и Handy, потому что у каждого свой лимит, и наговорил так около сорока тысяч слов. Подробнее как я перешёл с печати на голос, какой стек собрал и что меня в нём держит. Если коротко: промпты для агентов часто длинные, голосом выходит и быстрее, и живее, канцелярщина уходит, и агент лучше понимает естественный язык.
А у вас какой из шести слоёв сейчас самый дырявый? И есть ли инструмент, который вы поставили только потому, что «все ставят», а пользы так и не увидели? Делитесь в комментариях, мне правда интересно посмотреть на чужие карты.