
Вообще, я менеджер.
Но когда-то писал код и всегда любил это занятие. Серьезно прогал мобильные приложения, и даже заработал за один из ответов на SO больше 100 звездочек.
Но с тех пор прошла куча времени.
И последнее время меня вновь увлекла эта тема. А как она может увлечь современного человека, измученного миллиардом фреймворков и отставшего от прогресса лет на 15?
Конечно-же курсором и вайб-кодингом.
И я начал кодить.
Собрал несколько ботов, потом замахнулся на CMS. Сейчас даже делаю свою тулзу для запуска LLM-пайплайнов с импортом их из n8n.
Но в процессе всего этого неизменно сталкивался с двумя проблемами
1) Cursor (и брат его Windsurf) паршивейшим образом обходится с нетипизированными и слабо-типизированными языками. Изобретает названия переменных, меняет их по ходу, и вообще, забивает на это огромный и толстый... За пределами этого кодит он неплохо. Но данная штука лично у меня порождает 90% багов.
2) Как только нужно внести сложное по логике изменение, затрагивающее не парочку, а шесть-семь файлов - все, вилы. Теряется логика, консистетность и зачатки разума, если можно так говорить про ЛЛМ.
Мучался я мучался, а потом начал подмечать, что агент в курсоре очень творчески относится к контексту. Скажем так - он его забывает, причем забывает это мягко сказано.
Даже если прямо указать, дескать, используй такие-то файлы, то он может в упор игнорировать то, что в них описано, просто потому что это указано не в первых ста строчках, а где-нибудь на пятисотой.
Еще хуже с поиском. Ну вот же - вся структура проекта перед тобой. Нет, он упорно ее не видит, и нехотя запускает поиск только после напоминания. А иногда и просто придумывает, что какие-то файлы существуют, тогда как их нет.
Это меня очень сильно бесило.
И я начал действовать, творчески модифицируя мои промпты.
Начал со структуры каталогов
Оказалось, можно прогнать скрипт который выводит дерево каталогов/файлов и скопировать его в промпт. И о чудо - курсор начинает искать файлы сразу, не придумывая их наличие.
Похоже, создатели этой многомиллиардной компании не дошли до того, чтобы показывать ему структуру внутренними инструментами.
Аналогичное открытие произошло с текстами файлов.
Он их реально лучше видит, если ему копировать полный листинг, а не просто залинковать встроенными инструментами.
Так я и начал делать, а скорость разработки заметно выросла.
Итак, я открыл чит-код
Оказывается, можно насильно кормить курсор контекстом, как гуся для фуа-гры, скармливая ему километровые промпты.
И результат будут значительно лучше.
Но у подхода обнаружился и минус.
Делать это ОЧЕНЬ НАПРЯЖНО. Копипастить код каждого файла - ну такое. Делать же это из командной строки неудобно для человека измученного менеджментом.
Но я поделился подходом с товарищами в AI чатике, и оказалось, не я один занимаюсь такими извращениями. Много людей сами собой пришли к такому, более того, со мной поделились продвинутой техникой.
Зачем тебе нужен курсор, если можно все копировать в Google AI studio?
Туда загружается практически бесконечный контекст, и минимум 25 запросов в день являются бесплатными. Для хобби этого более чем за глаза.
Одна проблема. Неудобство компоновки таких промптов никуда не делось.
Ну и я решил ее исправить.
Вайбкодим аппку с помощью нее самой (рекурсия!)
Итак, раз есть проблема, значит нужно ее решить. И в качестве инструмента я решил взять Go.
Го мне нравится кроссплатформенностью и фашистскими настройками линтера из коробки - многие баги не доходят до продакшена просто потому что билд не запускается. Это не позволяет ЛЛМ вольностей в духе придумать новое название переменной и никому об этом не сказать. А значит, подходит для вайб-кода!
GUI фреймворк я выбрал Fyne, но сделав на нем hello world понял, что гемини очень плохо на нем пишет. И быстро переключился на вебоподобный стек Wails, который оказался очень надежным и приятным.
Итого, делаем десктопное Go приложение с UI на Wails. В качестве фронтенд-фреймворка выбрал Vue, потому что давно хотел его попробовать (спойлер - хороший фреймворк, никаких претензий).
Разработка
Первым делом мне нужно было сделать основу, с помощью которой я бы начал быстро помогать себе в написании кода.
И основа оказалась крайне простой. Это программка которая просто выводит листинг директории в виде дерева и текста файлов.

Сделал я ее буквально за пару часов, из которых большая часть времени ушла на то, чтобы как нужно работало дерево каталогов.
Сразу стало понятно, что нужно игнорировать часть каталогов. Node modules надежно вешали приложение. Поэтому add gitignore rules стали первой фичой помимо основы.
Разработка промпта
Итак, у нас был листинг. Но листинг это еще не все. Для классного ответа от ЛЛМ нужно соблюдать правильную структур промпта.
А значит теперь нужно было сделать промпт, в который этот листинг вставлять. А в идеале - прямо работающий шаблон, то есть получать результат автоматом.
Сказано - сделано. И я начал конструировать промпт, который бы выдавал мне результат. И тут встал вопрос. А что я, собственно, хочу сделать?
И оказалось, что хочу я вот что:
Отдать ЛЛМ задание
Дать контекст
Дать правила
Вставить в AI studio в один клик
Получить diff файлов для вставки в свою кодовую базу
Ну я и пошел к ChatGPT с просьбой сконструировать мне такое чудо.
И оно сделало нечто, но очень слабое.
Ну ничего. Я взял это нечто и принес к сетке снова, с примечанием "Вот мне сетка сконструировала промпт для такого-то и такого-то, оцени и улучши его"
Она оценила и улучшила. На этом я конечно не остановился.
И мы сделали порядка 8 циклов. Причем последние мне делала O3 на пару с Gemini, а потом только Gemini (брал gemini 2.5 pro)
И что ж, в результате она сконструировала замечательный промпт, который стабильно работает, а я практически не приложил к этому своей руки, кроме творчества при кормлении промптами.
Там получился своеобразный формат диффов, но сетки его понимают, так что пока что менять его не планирую (но PR принимаю, велкам)
Полировка и сборка
Когда у меня появился промпт для разработки, то дальнейший цикл фичестроения стал напрочь тривиальным.
Вставлял в AI студию шаблон промпта
Заполнял там задачу
Копировал туда контекст, который мне готовило мое же приложение
Получал дифф
Тащил дифф в курсор и говорил "примени diff". На что он беспрекословно его применял.
И мое удивление - фичи начали залетать с первого раза почти без багов. Буквально, описываешь задачу, применяешь дифф и оно работает.
Удивительное ощущение по сравнению с ванильным курсором.
В этот момент я понял, что я на верном пути. И начал с космической скоростью доделывать софтину с помощью ее самой.
Доделка
Самой большой проблемой для меня стало понимание, а как я хочу чтобы все это хозяйство выглядело?
Ну что ж, думать это прошлый век, поэтому я спросил идеи у гемини. Ну и оно подсказало паттерн - аккордеон. То есть раз у нас процесс по стадиям, то и GUI делаем по стадиям.
Сказано-сделано.

Первым делом мне нужно было автоматизировать сборку самого промпта, поэтому быстро реализовал ключевой - второй экран приложения.

Ну а далее уже наводил штрихи по просьбам зрителей.
В этот момент у меня родилось название.
Shotgun
Потому что если нужно застрелить моба с одного выстрела, то, очевидно, нужно брать шотган. Оставьте пулемет тем, у кого безлимитная подписка в курсоре :)
Кстати, иконку мне тоже сделал ИИ.

Выкладываем в оупенсорс
Каюсь, поначалу я подумал, что на приложении можно как-то заработать.
Но потом понял, что вряд ли.
Есть куча бесплатных инструментов, да и это может повторить любой.
Поэтому было решено фармить славу, а не деньги, и выложить все в оупенсорс.
Кучу времени убил на то, чтобы понять - "что ты такое мать твою Github CLI" и научиться собирать бинарники, но справился, хотя времени заняло знатно.
Лицензию выбрал смешную. Я ее назвал "вайб-код MIT". Вы можете использовать софтину свободно и менять ее как хотите, но только если подписаны на меня в твиттере (телеграм тоже ок). По-моему это лучше всего соответствует духу времени, поэтому менять не буду =)
Итог
Написание и полировка приложения заняла у меня два плотных дня 8-9 мая и половина выходных 10-11.
Вы будете смеяться, но это мой первый опыт серьезного программирования за последние 15 лет. И в принципе первый опыт написания какого-либо оупенсорса. Но мне он понравился.
С Гошкой и GUI под нее дел не имел, программировать под нее оказалось приятно, по крайней мере курсор делает это прекрасно.
Результат сейчас вот такой:

Софтиной пользуюсь теперь сам и не представляю без нее своей жизни, выручает она очень сильно. Экономия токенов в курсоре теперь x10, а качество патчей тоже x10, потому что я кормлю Гемини полной кодовой базой и прошу делать сложные фичи, которые она делает с первого раза.
Буду признателен отзывам, звездочкам и PR. И не пинайте слишком сильно за качество кода, все-таки я не правильный программист, просто очень люблю технологии.
Читать про мои приключения с нейронками вот тут, я не занимаюсь промышленным комментированием новостей, и пишу про свой опыт.
Очень рад, что наконец-то появился повод снова написать на хабр!
Комментарии (40)
YuraPlusEV
13.05.2025 06:09Напишите плз, когда начнёте разворачивать по 20+ проектов для решения в k8 с нуля, если между ними будет неочевидная интеграция вообще замечательно, ну и поддержка кодовой базы в работающем проде. Очень интересен ваш прогресс!
gleb_kudr Автор
13.05.2025 06:09Не в ближайшее время. Из того что заметил - администрирование инфры пока наименее затронуто AI, модели в этом довольно сильно тупят. Даже хороший докер композ написать - занятие не на парочку промптов. Но мб и до этого дойдет.
javax
13.05.2025 06:09Следующий этап должен быть без ручной работы - пишешь задание. на его основе LLM составляет список файлов которые изменение должно затронуть и составляет следующий промпт, который сейчас делается этим Вашим инструментом
Ну и переносить диффы тоже, кстати, не курсор должен делать, это легко делается кодом или даже баш скриптомgleb_kudr Автор
13.05.2025 06:09Все верно, первое что хочу сколхозить - сделать применялку диффов прямо из приложения. А вообще, тут просится собрать свой курсор на минималках, да.
javax
13.05.2025 06:09Да, и проще конечно не писать IDE, а сделать плагин к VS Code или WebStrorm/PyCharm/IDEA
barabashka
13.05.2025 06:09И такие плагины уже даже есть:
https://github.com/cline/cline
https://github.com/RooVetGit/Roo-Codegleb_kudr Автор
13.05.2025 06:09Я пользовался Cline. Он хорош если у тебя есть безлимитный ключик к апи, там сценарии не предусматривают копипасты в AI studio и использование этого бесплатно :)
Но в целом да - это оупенсорсный курсор, который нужно уметь готовить.Мне кажется, что в каком-то смысле фишка моего приложения именно в том, что оно работает не как плагин к IDE. Т.к. есть куча народа, которым не подходят предлагаемые IDE, либо связки IDE/плагин для кодинга на рынке.
VPryadchenko
13.05.2025 06:09Интересно, а можно без потери эффективности реструктурировать промпт так, чтобы более менее неизменяемые части шли вначале (гайдлайны, структура, листинг), а наиболее подверженная изменениям часть (собственного, задача) - в конце? Если не ошибаюсь, это на кэшировании положительно отразится.
gleb_kudr Автор
13.05.2025 06:09Все так, для кэширования стабильные части промпта должны быть в начале. И вот тут фундаментальная проблема, что это плохо для качества выполнения - так как чем дальше в длину, тем сильнее теряется точность инструкций. А наболее важны они именно в изменяемой части самого задания. Какой-то трейдофф тут, думаю, можно поймать - нужны эксперименты.
GitVerse
13.05.2025 06:09Привет, это команда GitVerse! У тебя крутая статья, будем рады видеть тебя в сезоне open source. Для этого просто поставь тег "сезон open source" – и ты участвуешь :)
jamaze
13.05.2025 06:09aider делает лучше. Он собирает структуру проекта tree-sitter'ом и скармливает ее как контекст в любой запрос. LLM видит все файлы, классы и методы в сжатом виде.
alhimik45
13.05.2025 06:09Даже если прямо указать, дескать, используй такие-то файлы, то он может в упор игнорировать то, что в них описано, просто потому что это указано не в первых ста строчках, а где-нибудь на пятисотой.
А это тоже было с Gemini как моделью? А то может эффект больше от смены модели с несильно большим контекстом на Gemini, чем от тонкостей промпта
gleb_kudr Автор
13.05.2025 06:09По моим ощущениям сильно от модели не зависит, тримят все. В какой степени - оценить тяжело, т.к. они не показывают реального контекста
javax
Очень интересно, а действительно в Google AI studio можно выгладывать простыни соурсов любой длины?
Подписался
gleb_kudr Автор
У меня получалось до 100к токенов, народ пишет до 500к примерно удается работать. Но там проблема начинается, что он думает по 10 минут, а потом падает с ошибкой. Но до 500к достаточно надежно работает у многих.
Alex_Mage
Контекст до млн. Все работает. "Но есть нюанс" - чем больше вы работаете в рамках одного диалога, тем больше возникает путаница. Причем и как до 500к - если было множество маленьких взаимодействий и особенно, если меняли темы, так и после, даже если самих итераций было мало.
Что я заметил и что помогает мне:
Четко следовать теме - 1 "проблема" (то есть даже например разработка 1 функции в одном файле) - 1 диалог.
После того, как тема решена - просить составить описание проекта, файлов, их взаимосвязи, текущее состояние, глобальную цель и дальнейшие шаги.
Это позволяет относительно "безболезненно" начинать новый диалог.
Имейте ввиду, что модель может выдумывать версии библиотек, методов и т.д. - по возможности прикладывайте документацию, а еще лучше спрашивайте периодически "Какие файлы тебе нужны" - часто можно обойтись 1-2 файлами с гитхаба и модель здорово решает вопрос, на котором ходила кругами.
Если "ходите кругами" - иногда новый диалог помогает.
Еще заметил что запрос в ЧатГПТ 03 - его краткий ответ часто решает проблему замкнутого круга. Просто потом пересылаешь это обратно в ГуглСтудио и продлолжаешь. (Осознанно, а не просто копировать)
Модель может больше верить комментариям, чем коду!
По возможности разбить код на блоки и заменять и просить выводить только блоки (так быстрее и меньше путаницы)
Очень хорошо помогает посте постановки задачи и приложения файлов попросить сеть сперва написать как и что она поняла и что будет делать. Помогает отсеять ошибки мышления уже в начале и "не утонуть".
Ну и последнее - это логи - нужно больше логов хороших и разных.! Это в разы облегчает работу.
Вот такие мои наблюдения. П.с. я не проф. программист - скорее хобби и пет проекты, но может кому поможет.
gleb_kudr Автор
Согласен, я даже более скажу. У меня строго один пост - новый диалог. Никогда не продолжаю. На больших контекстах это прямо критично.
MSZX
Я просто собираю в один промпт весь нужный код, описание проекта, комментарии должны быть хорошо прописаны, точные требования, архитектура проекта очень подробно простыми словами описана. Если так делать, то качество генерации практически стопроцентное даже на очень объёмных кусках кода. Промпт, правда, в сто килобайт выходит в среднем, но практически не делаю лишних запросов. Очень сильно качество генерации зависит от того, как LLM умеет разгребать контекст. Gemini вроде контекст большой, но он плохо понимает что ему кормят, приходится до мельчайших мелочей логику прописывать, Claude тут намного лучше. Но, в целом, можно даже от самых элементарных моделей добиться качественной генерации, вопрос желания и усилий. Сейчас уже можно свой проект прямо в LLM встроить, тогда контекст безлимитный, если LLM локальная.