Code Retype
Задумка:
Хочется сделать расширение для vscode которое по определенной конфигурации (файлы + интервалы строк) (надо проработать формат) даст тебе переписать код руками в этих местах.
Зачем: упросить понимание важных участков кода для понимания проекта и pull request'ов которые делают нейросети.
Переписывание кода требует большей концентрации и не позволяет по диагонали просматривать изменения.
Как это работает
- В корне проекта лежит
.retype.json со списком участков (файл + диапазоны строк).
Retype: Start Session открывает два редактора рядом:
- слева оригинал (read-only зеркало файла), нужный диапазон подсвечен, текущая строка выделена ярче;
- справа пустой редактор, в который вы перепечатываете участок строка за строкой. Подсветка синтаксиса, автоотступы и автозакрытие скобок работают как в обычном файле.
- Пока вы печатаете, строки сравниваются с оригиналом:
- зелёная — совпала;
- без подсветки — ещё набирается (является префиксом ожидаемой строки);
- красная с волнистым подчёркиванием от первого расхождения — ошибка, при наведении показывается ожидаемая строка;
- совпавшие строки в оригинале слева приглушаются.
- Вставка из буфера (Ctrl+V, Shift+Insert, контекстное меню, многострочные сниппеты) в правом редакторе блокируется и откатывается. Автодополнение коротких идентификаторов разрешено.
- Когда все строки совпали, участок отмечается выполненным, всплывает предложение перейти к следующему. Прогресс сохраняется в workspace и привязан к содержимому кода: если участок в файле поменялся, его придётся набрать заново.
Реальные файлы проекта расширение никогда не изменяет: правый редактор живёт в памяти (схема retype:), левый доступен только для чтения.
Формат конфига
.retype.json (допускаются комментарии и висячие запятые, в редакторе есть валидация по схеме):
{
"targets": [
// Короткая форма: путь:диапазоны через запятую. Строки нумеруются с 1, границы включительно.
"src/parser.ts:12-40,55",
// Развёрнутая форма
{ "file": "src/lexer.ts", "lines": "1-30" },
{ "file": "src/vm.ts", "lines": ["100-140", "203"], "note": "горячий цикл интерпретатора" }
]
}
Пути указываются относительно корня workspace. Поле note показывается в списке участков и в подсказке статус-бара.
Заполнять конфиг руками не обязательно:
Retype: Create Config from Git Diff — берёт добавленные строки из git diff (незакоммиченные изменения, последний коммит, текущая ветка против main/master, или произвольные аргументы вроде main...feature) и записывает их как участки. Это основной сценарий для ревью PR, написанных нейросетью. Lock-файлы, .min.js, .map, .svg и т.п. пропускаются (список — в настройке retype.gitDiffExclude). Если конфиг уже есть, предложит заменить или дополнить.
Retype: Add Selection to Config — выделите строки в любом файле проекта (или в левом окне с оригиналом), вызовите команду из палитры или контекстного меню, и диапазон допишется в конфиг.
Для агентов (Claude Code, Cursor и т.п.)
Конфиг — обычный JSON в корне проекта, поэтому агент может собрать его сам, без участия расширения: перечислить файлы и диапазоны, которые он считает ключевыми в своём PR. Файлов может быть сколько угодно, у каждого несколько диапазонов. Если .retype.json закоммитить вместе с PR, ревьюер получит готовый маршрут.
Готовый фрагмент для CLAUDE.md / системного промпта:
Когда заканчиваешь PR, создай или обнови .retype.json в корне репозитория.
Формат: {"targets": [{"file": "<путь от корня>", "lines": ["<от>-<до>", ...], "note": "<почему это важно>"}]}.
Строки нумеруются с 1, границы включительно. Включи только участки, которые ревьюеру
стоит понять по-настоящему: новую логику, инварианты, обработку ошибок. Не включай
тесты-заглушки, импорты и сгенерированный код. Суммарно не больше ~150 строк.
Альтернатива без участия агента: Retype: Create Config from Git Diff соберёт конфиг из всех добавленных строк PR, а лишнее можно вычистить руками.
Команды
| Команда |
Что делает |
Retype: Start Session |
Загружает конфиг и открывает первый незавершённый участок |
Retype: Next Target / Previous Target |
Переход между участками (кнопки есть и в заголовке правого редактора) |
Retype: Pick Target... |
Список всех участков с отметками о выполнении; открывается и по клику на статус-бар |
Retype: Stop Session |
Закрывает окна сессии |
Retype: Add Selection to Config |
Добавляет выделенные строки в конфиг |
Retype: Create Config from Git Diff |
Генерирует конфиг из diff |
Retype: Open Config |
Открывает .retype.json (создаёт шаблон, если его нет) |
Retype: Reset Progress |
Забывает выполненные участки и набранный текст |
Настройки
| Настройка |
По умолчанию |
Смысл |
retype.configPath |
.retype.json |
Путь к конфигу относительно корня workspace |
retype.ignoreTrailingWhitespace |
true |
Не учитывать пробелы в конце строк |
retype.ignoreLeadingWhitespace |
false |
Не учитывать отступы (для Python лучше оставить false) |
retype.blockPaste |
true |
Блокировать вставку и многострочные вставки в редакторе набора |
retype.maxInsertLength |
30 |
Одиночная вставка длиннее этого числа символов считается пастой и откатывается |
retype.gitDiffExclude |
lock-файлы, .min.js, .map, … |
Суффиксы путей, которые пропускаются при генерации из diff |
Сборка и установка
С установленным Node.js:
npm install
npm run compile
npx @vscode/vsce package # -> code-retype-0.1.0.vsix
code --install-extension code-retype-0.1.0.vsix
Без Node.js (используется Electron из самого VS Code и Python для упаковки; зависимости из node_modules уже должны быть на месте):
scripts/build.sh # компиляция tsc через VS Code-овский Electron
scripts/package.py # -> code-retype-0.1.0.vsix
code --install-extension code-retype-0.1.0.vsix
Для разработки: откройте папку в VS Code и нажмите F5 (Run Extension).
Сквозной тест (scripts/smoke.sh) поднимает отдельный экземпляр VS Code с расширением и прогоняет сценарий из test/smoke/index.js: старт сессии, откат вставки, набор строк с ошибкой и исправлением, завершение участка, переходы, остановка. Юнит-тесты чистых модулей лежат рядом в test/unit.js (запуск: node test/unit.js или через scripts/build.sh-подобный трюк с Electron).
Публикация
Сейчас расширение живёт в .vsix и ставится командой code --install-extension. Чтобы оно появилось у всех через Extensions в VS Code:
- Завести publisher на https://marketplace.visualstudio.com/manage (нужен аккаунт Microsoft и Personal Access Token в Azure DevOps с правом Marketplace → Manage).
- В
package.json выставить publisher равным id этого publisher'a и добавить repository (ссылку на git-репозиторий), по желанию icon.
npx @vscode/vsce login <publisher> и npx @vscode/vsce publish (нужен Node.js). Через несколько минут расширение доступно всем по id <publisher>.code-retype.
- Для VSCodium, Cursor и подобных дополнительно опубликовать на https://open-vsx.org (
npx ovsx publish).
После публикации в проектах можно добавить в .vscode/extensions.json рекомендацию "<publisher>.code-retype", и VS Code сам предложит установку всем участникам. Без Marketplace остаётся вариант выкладывать .vsix в GitHub Releases и ставить руками.
Структура
src/configFormat.ts — формат конфига, парсинг JSONC, слияние диапазонов (без зависимостей от VS Code)
src/compare.ts — сравнение набранных строк с оригиналом
src/gitDiff.ts — запуск git diff -U0 и разбор hunk-заголовков
src/memfs.ts — in-memory файловая система для редактора набора
src/session.ts — сессия: открытие пары редакторов, декорации, блокировка вставки, прогресс
src/extension.ts — команды
schemas/retype.schema.json — JSON-схема конфига