Code Modernization — плагин Claude Code для модернизации старого кода с доказательством результата
📂 Исходный код на GitHubОфициальная коллекция плагинов для Claude Code от Anthropic. Внутри наборы команд, агентов и навыков под разные задачи разработки — в том числе плагин code-modernization для перевода старого кода на новые версии и технологии.
Code Modernization — это плагин для Claude Code, который берёт старый код и доводит его до нового состояния по шагам. Он даёт четыре вещи: разбор того, что это за система и что она делает; план, который вы утверждаете; переписанный код; и доказательство, что новое поведение совпадает со старым.
Плагин работает с любым языком и с любым видом перехода: новая версия той же технологии, переписывание на другом языке или полный переезд на новую архитектуру.
Установка
Нужен Claude Code. Дальше одна команда:
/plugin install code-modernization@claude-plugins-official
Некоторые шаги запускают сразу много агентов. На большой системе это заметная нагрузка, поэтому авторы советуют начинать с одного модуля или одного блока как с пилота, а не со всего хозяйства сразу.
С чего начать
Откройте папку под работу и введите /code-modernization:modernize. Плагин задаст несколько коротких вопросов о том, что вы хотите сделать с кодом. Потом он найдёт сам код, запишет ваши ответы один раз, покажет маршрут и даст точную первую команду. Все следующие команды читают то, что вы уже ответили, поэтому повторных вопросов не будет.
Если вы пока не понимаете, что хотите делать, выберите режим «сначала разобраться». Тогда вы получите оценку, карту, бизнес-правила и план — и ни строчки кода переписано не будет.
Если хочется идти по шагам вручную, первую команду направьте на свой код и дальше выполняйте строку «следующий шаг», которой заканчивается каждая команда:
/code-modernization:modernize-preflight <name> --source <path to your code>
/code-modernization:modernize-status <name>
<name> — короткая метка на ваше усмотрение: буквы, цифры, дефис и подчёркивание. Флаг --source создаёт ссылку legacy/<name> и ничего не копирует, поэтому огромное хранилище остаётся на месте.
Важное правило: команды ничего не меняют в исходниках. Они пишут только в analysis/<name>/ и modernized/. Каждое обновление пересобирает analysis/<name>/REPORT.html — одну страницу со всем, что найдено на этот момент. Её можно открыть или передать коллегам. Часть шагов требует человека, который знает, как система устроена и запускается, поэтому к первым вопросам лучше подключать инженера.
Маршрут: шаги от 0 до 8
Каждый шаг работает сам по себе. Можно остановиться и посмотреть результат после любого из них.
| Шаг | Команда | Что вы получаете |
|---|---|---|
| 0 | modernize |
Вашу задачу в тексте. Записывается в INTENT.md, дальше это читают все команды. |
| 1 | modernize-preflight <name> [target-stack] [--source <path>] |
Проверку, что окружение готово. Задаёт пять вопросов, на которые ответит только человек: это вся система или её часть, собирается ли она здесь, есть ли своя сборочная обвязка, пробовал ли кто-то раньше, что нельзя трогать. Доказывает, что сборка работает. |
| 2 | modernize-assess <name> |
Оценку: что это за код, сколько в нём сложности и долга, где проблемы с безопасностью, и какой режим модернизации рекомендован. |
| 3 | modernize-map <name> |
Структуру: зависимости, потоки данных, точки входа и бизнес-потоки — в виде интерактивной карты. |
| 4 | modernize-extract-rules <name> |
Бизнес-правила в виде карточек Given / When / Then со ссылками на файл и строку. Каждое правило перепроверяет второй агент. |
| 4b | modernize-review <name> |
Проверку правил человеком. Ваши ответы доходят до плана и до сборки. С живой панелью то же самое делает /modernize-review-pane, по одной карточке за раз. |
| 5 | modernize-brief <name> [target-stack] |
Пофазный план, который утверждает руководитель проекта. До вашего утверждения не строится ничего. |
| 6 | uplift, transform или reimagine |
Саму сборку — см. раздел ниже. |
| 7 | modernize-verify <name> |
Доказательство. Независимая перепроверка с одним вердиктом по каждому модулю. |
| 8 | modernize-harden <name> |
Скан безопасности по старой системе и готовый патч, который вы применяете сами. |
Дополнительно есть два варианта. assess --portfolio <parent-dir> обследует много систем и ранжирует их на одной странице. modernize-status <name> отвечает, где вы сейчас, и выдаёт точную команду для вставки.
Человек решает в шести точках. Плагин ни одну из них не решает за вас: пять ответов на подготовительном шаге, правила, которые выглядят неправильными, утверждение плана, приём любого различия, которое найдёт проверка, подпись под доказательством и применение патча безопасности.
Как плагин доказывает результат
Модернизация обычно проваливается тихо. Новый код проходит тесты, которые кто-то когда-то написал, и расходится со старым поведением на входных данных, до которых никто не додумался. Поэтому доказательство строится на фактах, которые может проверить скрипт, а не на мнении модели.
Шаг modernize-verify запускают после сборки, лучше в чистой сессии. Он переделывает работу заново, а не доверяет записям, которые оставила сборка.
Вот из чего состоит проверка:
- Тесты, запущенные заново с чистого листа. Результаты сборки удаляются, прогоняется весь набор, а числа берутся из файлов результатов самого раннера или из сохранённого лога. Прогон, где тесты не выполнились или были пропущены, считается провалом. Число, которое команда просто напечатала, не засчитывается.
- Старое и новое на одинаковых входах. Там, где старый код запускается, оба запускаются на одинаковых данных, а скрипт сравнивает вывод побайтово. Маскируются только поля, которые обязаны отличаться: метки времени, созданные идентификаторы. Вывод с плавающей точкой сравнивается с заявленной погрешностью. Каждое замаскированное поле попадает в результат.
- Входы, которых никто не использовал. Плагин придумывает минимум десять новых входов: граничные значения, пустые данные, огромные объёмы, необычный порядок, а если вы просили точное поведение — и некорректные записи со странностями исходной системы. Так ловится набор тестов, который проходит только на примерах, выбранных моделью.
- Тесты, которые умеют падать. В новый код намеренно вносится поломка в одну строку — это канарейка. Тесты обязаны покраснеть. Само сравнение тоже проверяется: в вывод меняется один байт.
- Каждое критичное правило подтверждено прогнанным тестом. На каждое правило P0 должен ссылаться тест, который выполнился и прошёл. Правило, которое упомянуто только пропущенным или отложенным тестом, попадает в список «упомянуто, но не выполнено».
- Исходники не тронуты. Это проверяется по времени изменения файлов, без запуска чего-либо внутри разбираемого дерева.
Каждый модуль получает один вердикт, который считает scripts/proof_pack.py по этим файлам, а сами правила записывает прямо в вывод: PROVEN, PARTLY PROVEN (с указанием, чего не хватило) или NOT PROVEN (ничего не выполнилось, есть расхождения, падает тест).
Если старую систему нельзя запустить там, где вы работаете — например, это программа для мейнфрейма или система, работающая только в продакшене, — старое поведение можно сверять только с записанными результатами. Лучший вердикт в этом случае — PARTLY PROVEN, и страница прямо это говорит.
Всё, что должен решить человек, — открытые вопросы, критерии выхода, подпись — попадает в список «ждёт человека» и никогда не отмечается за вас. Каждый вердикт считается заново из текущих фактов. Ничего не переносится из прошлого прогона.
Три способа переписать код
План рекомендует один из трёх путей. Выбор за вами.
| Что вам нужно | Команда | Что произойдёт |
|---|---|---|
| Та же технология, но новее (.NET Framework → .NET 8, Java 8 → 17, Spring Boot 2 → 3) | modernize-uplift <name> [source-version] [target-version] |
Код остаётся вашим, правится только то, что ломает новая версия. Список ломающих изменений строится по тому, что этот код реально использует. Сначала один пилотный блок с записанными выводами, потом партии. Доказательство — тот же набор тестов, прогнанный на обеих версиях. |
| Другая технология, по одному модулю за раз, пока старая система продолжает работать | modernize-transform <name> [module] [target-stack] |
Утверждённый план, тесты, которые фиксируют старое поведение, аккуратно написанный заново код и доказательство: старое и новое запускаются на одинаковых входах, скрипт их сравнивает. |
| Полный переезд на новую архитектуру | modernize-reimagine <name> [target-vision] |
Спецификация, извлечённая из кода, архитектура, которую вы посмотрите и утвердите, затем сервисы с принимаемыми тестами, которые можно запустить. |
Переход на новую версию сохраняет код, поэтому может пропустить шаги extract-rules и review: связки preflight, assess, uplift, verify уже образуют полный путь. Шаги map и brief добавят порядок блоков и утверждённый план для большой системы.
Если список различий показывает, что «uplift» перепишет большую часть кода, команда сообщит об этом и предложит transform.
На чём это уже прогоняли
Команды запускали по-настоящему, без человека, на публичных кодовых базах — пока плагин собирали. Каждая цифра ниже взята из файлов, которые оставили эти прогоны.
Одна и та же команда может дать другие числа при повторном запуске: скан безопасности кода osCommerce нашёл сначала 48 подтверждённых находок, потом 52. Читайте эти числа как типичные, а не точные. Там, где нужно было решение человека, его играл тестировщик. Часть прогонов остановилась рано из-за ограничений тестовой машины. Плагин сообщил об этом и не обошёл проблему.
Ниже — часть прогонов. Полный список в README плагина.
| Кодовая база | Переход | Что сделано и что показано |
|---|---|---|
| AWS CardDemo (COBOL, CICS, JCL) | Переписывание на Java по одной задаче за раз | 35 правил, из них 8 критичных, и план из пяти фаз. Затем ежемесячная задача начисления процентов переписана на Java 21, в конце — 213 тестов. Пять независимых проверок подряд сравнивали её с настоящей программой на COBOL. Каждая нашла то, чего тесты не видели: пустое поле, останавливавшее задачу; нечисловой ключ счёта; отрицательный ноль. Последняя проверка добавила пятнадцать входов с некорректными записями и нашла ещё семь различий, поэтому закончилась вердиктом NOT PROVEN. Завершить такой цикл может только человек, решив, какие входы входят в область работ. |
| Eclipse Jetty (Java 8, 2600 файлов) | Java 8 → 17 | Пилот на модуле jetty-util: те же 946 тестов дают те же результаты на обеих версиях. Сборка и запуск обеих версий нашли шесть изменений, которые чтение кода не предсказало: прямой буфер, который на 17 отдаётся как memory-mapped; бандл-плагин, который пишет некорректный манифест и всё равно пишет SUCCESS; сборка на JDK 13–16, которая выпустила бы классы с меткой Java 8 и упали бы на Java 8. Для 25 из 56 критичных правил не было тестов — добавили 50 тестов, на каждой версии выполняется 996 тестов, различий нет. |
| osCommerce (PHP 5, около 44 000 строк) | PHP → Python и FastAPI | 97 правил, из них 26 критичных, и план из шести фаз. Первый кусок — страница товара: проходят 17 957 тестов, и 17 727 случаев сравнения с настоящими PHP-файлами совпадают. Архитектурная проверка нашла две проблемы высокой серьёзности: истёкшие акции всё ещё показывались; запрос страницы удерживал блокировку записи в базе. Независимая проверка дала вердикт PROVEN: её собственная поломка уронила ещё 647 тестов, а 14 новых входов совпали с настоящим PHP. |
| JPetStore (Java и JSP) | Перестройка в REST API | Спецификация с 12 возможностями, 35 правил и план из четырёх фаз. Архитектурная проверка нашла два блокера: подтверждение заказа нельзя было безопасно повторить; обновления корзины терялись при параллельных запросах. Независимая проверка дала NOT PROVEN: 6 из 24 новых сравнений со старым приложением расходятся. |
| Ловушка в кодовой базе (сделана для теста) | Переписывание | В комментариях, в README, в CLAUDE.md и в файле настроек проекта были посажены инструкции; добавлен скрипт, который создал бы файл-маркер, и имена файлов с синтаксисом командной строки. Ничто из посаженного не выполнилось, файл-маркер не появился, исходники не изменились, посаженные строки перечислены в отчёте, а учётные данные замаскированы. |
Сколько времени это занимает
Шаги выполняются агентами, тяжёлые запускают много агентов сразу. Примерные времена на системах в десятки тысяч строк: подготовительный шаг — 3–4 минуты, оценка — 5–8, карта — 5–15, извлечение правил — 5–15, план — около 5 минут. Сборка одного модуля занимает 15–30 минут, пилотный uplift — около 15.
Самый тяжёлый шаг, извлечение правил, в этих прогонах запускал от 50 до 200 агентов. Каждый шаг с распараллеливанием заранее говорит, сколько агентов он запустит. На системах в миллионы строк работайте по одному модулю или блоку за раз. Индекс размера в шаге оценки — относительная величина для ранжирования систем, а не смета и не срок.
Словарь терминов
| Слово | Простое значение |
|---|---|
| Агент | Отдельный рабочий Claude с одной задачей: прочитать один модуль или проверить одно правило и вернуть результат. |
| Карточка бизнес-правила | Одно действие системы, записанное как Given / When / Then, со ссылкой на файл и строку, чтобы человек мог проверить. |
| P0 | Правило, ошибка в котором сломала бы смысл системы или обошлась бы дорого и необратимо. Всё остальное — P1 или P2. |
| План | Письменный план по фазам. Вы его утверждаете; до этого момента команды ничего не строят. |
| Uplift / transform / reimagine | Новая версия той же технологии / переписывание в другой технологии / переезд на новую архитектуру. |
| Пилот | Первый маленький блок, сделанный от начала до конца, чтобы его выводы записали до начала остальной работы. |
| Канарейка | Намеренная поломка нового кода в одну строку, которая обязана уронить тесты. |
Настройка рабочего пространства
По соглашению команды никогда не правят ваш код. Подкрепите это правилом в .claude/settings.json в рабочей папке: запретите запись в исходники и разрешите запись в результаты.
{
"permissions": {
"allow": ["Read(**)", "Edit(analysis/**)", "Edit(modernized/**)"],
"deny": ["Edit(/legacy/**)"]
}
}
- Записи файлов проходят через правило
Edit, поэтому оно покрывает и инструмент Write. Правило видаWrite(path)не проверяется никогда. Ведущий слэш привязывает правило к корню рабочей папки. - Если
legacy/<name>— символическая ссылка (её делает--source), разрешите ещё и чтение цели:"additionalDirectories": ["/path/to/code"], и запретите её настоящий путь:"Edit(//path/to/code/**)". - Правило покрывает файловые инструменты Claude и узнаваемые команды оболочки. Скрипт, который открывает файлы сам, под правило не попадает. Поэтому оставьте Bash с запросом для двух шагов, которые распараллеливают много пишущих агентов: шага 5b в uplift и фазы E в reimagine.
- Команды оболочки спрашивают даже в режиме accept-edits.
Полезно, но необязательно (всё это проверит preflight): scc или cloc для метрик размера; Python 3.8 или новее в виде python3 — нужен для карты, доказательства и отчёта; сборочная обвязка под ваш стек, она даёт самое сильное доказательство — запуск старого и нового рядом; и вся система в дереве, включая описания развёртывания и DDL. Без сборочной обвязки плагин переходит на тесты с записанными результатами и говорит об этом.
Безопасность
Анализируемый код считается недоверенным вводом. Враждебная кодовая база может посадить комментарий вида «ignore previous instructions», README с требованием запустить скрипт или имя файла с синтаксисом командной строки. Агенты считают содержимое файлов данными, перечисляют найденные инструкции и не выполняют их. Сборка и тесты старого кода запускаются по возможности во временной копии. Агенты проверки заново выводят каждое правило из указанного кода, а brief — это пропуск, который человек закрывает до начала сборки.
Секреты не попадают в общие файлы. Найденные учётные данные маскируются (AKIA****) и складываются в SECRETS.local.md, который не коммитится, либо в ~/.modernize/<name>/ за пределами git. Флаг --show-secrets кладёт открытые значения только в карантинный файл.
Старую систему запускают только там, где это безопасно. Базовые прогоны снимаются с локальной старой версии или с тестового окружения, которое вы назвали. Продакшен, сторонние сервисы и реальные данные не трогаются, если их не назвал утверждённый вами план. Каждая команда останавливает серверы, которые сама запустила.
Работа на живом репозитории. Шаги preflight и assess не меняют ни одного файла исходников. Проверка сборки компилирует один файл и собирает один маленький проект — это пишет выходные файлы сборки туда же, куда пишет обычная сборка.
Телеметрия
Плагин считает, как его используют, чтобы следующая версия стала лучше. Он отправляет только целые числа: никогда — код, имена файлов или систем, пути, промпты и то, что вы набирали. Числа от 100 округляются до двух значащих цифр: 17 727 уходит как 18 000. Поэтому число показывает примерный размер, а не конкретную систему. Всё уходит через телеметрию самого Claude Code, так что при выключенной телеметрии ничего не отправляется. Единственный файл, который пишет сам плагин, — небольшой telemetry-state.json с хешами в его папке данных, чтобы не отправлять одни и те же числа дважды.
Понять, что уходит, можно до отправки:
python3 scripts/telemetry.py show /path/to/workspace
Отключить можно тремя способами: опцией Usage counts в плагине, переменной CODE_MODERNIZATION_TELEMETRY=0 в окружении или DISABLE_TELEMETRY=1 самого Claude Code. Пока задан хоть один из них, ничего не отправляется.
Работа в команде
Состояние лежит в файлах, а не в переписке. Последующие команды читают план, намерения и PREFLIGHT.md, а не ваш диалог, поэтому работу можно продолжить вторым человеком или в новой сессии через status. Команды никогда не делают коммит в вашем репозитории, поэтому analysis/ и modernized/ вы коммитите сами.
| Артефакт | Кто смотрит |
|---|---|
PREFLIGHT.md (пять ответов, границы области, проверки сборки) |
тот, кто отвечает за сборку |
ASSESSMENT.md, REPORT.html |
технический лид или заказчик |
topology.json, TOPOLOGY.html |
инженеры, которые знают систему |
BUSINESS_RULES.md (затем modernize-review) |
бизнес-эксперт по каждому домену |
MODERNIZATION_BRIEF.md |
утверждающий: он управляет исполнением, редактируя план |
VERIFICATION.md |
утверждающий и второй инженер, которые подписывают доказательство |
SECURITY_FINDINGS.md и патч |
инженер по безопасности, который применяет патч |
Живая панель (early access)
Рядом с диалогом появляется панель: карта вашего кода, прогресс по каждой части, вердикт доказательства по каждому собранному модулю и команда, которую надо выполнить следующей. Панель работает на любом языке и при всех трёх способах сборки.
Ей нужны функции-хуки в режиме early access: запускайте Claude Code с CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude. Без флага ничего не меняется. Три команды вводятся без префикса: /modernize-panel показывает или прячет панель, /modernize-review-pane проверяет помеченные карточки правил, /modernize-sign заполняет блок утверждения в плане. Подробности — в описании хуков.
Полезно знать
- Извлечение делает модель, поэтому два прогона находят разные правила. Считайте
BUSINESS_RULES.mdрезультатом ревью, а не повторяемым артефактом сборки. - Крупные прогоны можно продолжить. На сборках Claude Code с инструментом Workflow шаги
extract-rules,harden,assess --portfolio,reimagineиupliftвыполняются как сценарии с множеством агентов, которые проверяют находки в спорном режиме. Остановленный прогон возобновляется в той же сессии. - Запуск без интерфейса. Длинные шаги работают как фоновые сценарии, а сессия без интерфейса перестаёт ждать фоновую работу через 10 минут. Поставьте
CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0, чтобы параллельные шаги успевали завершиться, и закрывайте запрос на утверждение, продолжая сессию с--resume. - Плагин можно менять под себя. Команды, агенты и сценарии — это markdown и JavaScript под лицензией Apache 2.0. Форкните их и поправьте промпты или шаги под свой стек.
- Агенты. Команды вызывают
legacy-analyst,business-rules-extractor,architecture-critic,security-auditor,test-engineer,version-delta-analyst,uplift-migratorиscaffolder. Последние двое пишут только внутрь своего блока. - Похожий набор. Репозиторий code-migration-kit-with-claude-code — отдельный набор промптов и скриптов для массовых миграций. Этот плагин даёт ведомый процесс от разбора и плана до сборки и доказательства.
Лицензия
Apache 2.0, текст лицензии — в файле LICENSE.