One-shot промптинг. Как я начал вайбкодить в 10? раз быстрее
Вообще, я менеджер.
Но когда-то писал код и всегда любил это занятие. Серьезно прогал мобильные приложения, и даже заработал за один из ответов на 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. И не пинайте слишком сильно за качество кода, все-таки я не правильный программист, просто очень люблю технологии.
Читать про мои приключения с нейронками вот тут, я не занимаюсь промышленным комментированием новостей, и пишу про свой опыт.
Очень рад, что наконец-то появился повод снова написать на хабр!