Перенеси программу на Rust и проверь, что она ведёт себя так же.

PortCode — терминальный агент. Он изучает оригинал, записывает, что удалось выяснить, переписывает программу на Rust по кусочку и сверяет каждый кусок с настоящим выводом оригинала. Работает с моделями, которые ты запускаешь сам: lakomoor.com/v1, Ollama, LM Studio, llama.cpp, vLLM.

Установка одной строкой
$ curl -fsSL https://raw.githubusercontent.com/LakoMoor/portcode/main/install.sh | sh
Потом откройте любую папку
$ portcode
Windows (PowerShell)
> irm https://raw.githubusercontent.com/LakoMoor/portcode/main/install.ps1 | iex

macOS, Linux, Windows и WSL. Установщик проверяет sha256 загрузки. Работает и на вашей подписке Claude Code или Codex, без API-ключа.

Clean-roomDeep
−150 шагов+
✓Зафиксировать сборку
✓Эталонные случаи
✓Parity PASS
Скриншоты
Запустить parity
контекст
lakomoor/deepseek-chat⌄
lakomoor.github.io/portcode/remote
● подключено · полное управление
Перенеси wordstat на Rust
✓pinE-0001
✓surveyE-0002
bash просит запуститьcargo test --workspace
РазрешитьЗапретить
агентtab
стопesc
меню/
даy
нетn
ввод⏎
Ghidra
ImHex
Unicorn
radare2
Rizin
Capstone
6/6

parity PASS

wordstat · C → Rust

fuzz 400/4001 неизвестное

Элементы управления и страница пульта — копии настоящего интерфейса. Цифры взяты из примера wordstat в репозитории. В скриншотах модель — записанный сценарий, поэтому всё воспроизводимо.

PortCode full-screen UI: port agent with tool calls, evidence and todo sidebar

Терминальный интерфейс

Агент port работает над wordstat: вызовы инструментов, факты и список дел справа. Снято скриптом make_screenshots.sh.

Начните с /create

Введите /create и ответь на несколько вопросов: что воссоздать (сайт, программу, игру, формат файла или пока ничего), насколько близко PortCode может в это заглядывать, на чём строить и чего ты хочешь. Он запустит нужного агента в нужном режиме. Выберите «Just look inside», если нужно только разобраться: получите docs/SPEC.md и журнал фактов, без кода порта.

Экран /create для сайта
Экран /create в режиме «только посмотреть» для программы

Первый запуск

Три шага, все внутри приложения. /setup покажет их снова.

1. Выбери провайдера

Локальная модель, ключ не нужен: /provider ollama qwen3:14b. Просто /provider покажет все и у каких нет ключа.

2. Вставь ключ

/key спросит его. Пока вводишь, он скрыт; сохраняется с правами 600. Или в терминале: portcode auth set <provider>.

3. Проверь и начни

portcode doctor проверит настройку. Потом /create или просто напиши задачу. Подробная инструкция.

Home screen with the no-API-key notice
The /provider menu listing providers and which need a key

Обновления: portcode update или /update сравнивает твою версию с последним релизом. Раз в день приложение проверяет тихо. PORTCODE_NO_UPDATE_CHECK=1 отключает. Сами обновления не ставятся.

Работай на своей подписке Claude или ChatGPT

Ключ API не нужен. PortCode запускает на твоём компьютере официальную программу claude или codex, и она использует твой вход. Свои инструменты PortCode добавляет сам: журнал доказательств, фиксацию оригинала, проверки parity и скриншоты.

PortCode на твоей подписке

portcode -m claude-code/sonnet или portcode -m codex/default. Работа видна в окне PortCode, а доказательства попадают в тот же журнал.

Твой CLI использует PortCode

claude mcp add portcode -- portcode mcp даёт Claude Code (а Codex через codex mcp add) инструменты PortCode в привычной сессии. Подробности и ограничения.

Посмотри настоящий запуск

Это порт wordstat. Вызовы инструментов и их вывод записаны с настоящего запуска, а ответы модели заранее написаны, чтобы запуск повторялся. Ничего не напечатано вручную.

Доказательства

0

Дела

Попробуй /create

Что хочешь сделать?
Что это?
Насколько близко смотреть?
На чём строить
PortCode in 36 seconds: the terminal UI, the evidence ledger, deep mode, permissions and the one-line install

Установка

# Windows (PowerShell), no Rust needed
irm https://raw.githubusercontent.com/LakoMoor/portcode/main/install.ps1 | iex

# macOS / Linux / WSL
curl -fsSL https://raw.githubusercontent.com/LakoMoor/portcode/main/install.sh | sh
# options: PORTCODE_VERSION=v0.1.0 · PORTCODE_INSTALL_DIR=~/bin · PORTCODE_FROM_SOURCE=1 · --with-engines core · --with-skill ~/.claude/skills · --uninstall

cargo install --git https://github.com/LakoMoor/portcode portcode-cli

portcode init && portcode doctor && portcode

Windows, Linux и macOS, x86_64 и aarch64. Установщики проверяют sha256; установщик для Linux/macOS собирает из исходников, если бинарника для твоей системы нет. Сборке для Windows не нужны ни Rust, ни Visual C++.

home screen
slash popup
permission dialog

Clean room или deep

В режиме clean-room PortCode смотрит на оригинал только снаружи: запускает и сравнивает вывод. Дизассемблеры, декомпиляторы и hex-просмотрщики не используются. В режиме deep он работает с Capstone, Unicorn, Ghidra и ImHex. Они ставятся рядом с бинарником, каждый — только после твоего «да».

Ghidra разбирает функцию целиком. Значение по умолчанию записано как inference, пока вывод оригинала его не подтвердит.

Decompile: entryoriginal/wordstat
1void entry(int param_1,long param_2)
2
3{
⋮
27 iVar3 = 1;
28 uVar1 = 10;inference --top defaults to 10
29 uVar17 = 1;
30 pcVar9 = (char *)0x0;
31 do {
32 pcVar14 = *(char **)(param_2 + (long)(int)uVar17 * 8);
33 iVar2 = _strcmp(pcVar14,"--top");
34 uVar15 = (long)(int)uVar17 + 1;
35 if (iVar2 == 0 && (int)uVar15 < param_1) {
36 uVar1 = _atoi(*(char **)(param_2 + uVar15 * 8));
37 uVar17 = uVar15;
38 pcVar14 = pcVar9;
39 }
40 else {
41 iVar2 = _strcmp(pcVar14,"--min-len");
42 if (iVar2 == 0 && (int)uVar15 < param_1) {
43 iVar3 = _atoi(*(char **)(param_2 + uVar15 * 8));
44 uVar17 = uVar15;

Capstone показывает первые инструкции: функция резервирует 416 байт стека.

100000460sub sp, sp, #0x1a0
100000464stp x28, x27, [sp, #0x140]
100000468stp x26, x25, [sp, #0x150]
10000046cstp x24, x23, [sp, #0x160]
100000470stp x22, x21, [sp, #0x170]
100000474stp x20, x19, [sp, #0x180]
10000047cadd x29, sp, #0x190
100000480adrp x8, #0x100004000
100000484ldr x8, [x8, #0x18]

Unicorn запускает.

sp до
0x800ef000
sp после
0x800eee60

8 инструкций · кадр 0x1a0 байт

PortCode работает с

21

инструментами. Каждый ставится только после твоего «да».

ImHex описывает формат файла. Агент пишет шаблон, ты проверяешь его в ImHex.

0000cffaedfe0c000001 00080000000002000000 00101100000020040000 00188500200000000000
u32 magic0xFEEDFACF
u32 cputypeARM64
u32 cpusubtype0
u32 filetypeEXECUTE
u32 ncmds17
u32 sizeofcmds1056
u32 flags0x200085

Рядом rizin, radare2, YARA, Frida, LIEF, capa и Detect It Easy, а для Unity и C# ещё ILSpy, Il2CppDumper, dnfile и UnityPy.

radare2 Rizin YARA Frida LIEF capa Detect It Easy
angrKeystonebinwalkjadxwabtupx

Внутрь никто не заглядывает, пока ты не включишь.

По умолчанию — clean room. Deep включается в терминале или на странице пульта.

clean-room deep

Числа на этих карточках получены запуском инструментов на бинарнике wordstat из репозитория.

The workbench: functions, Ghidra pseudo-C, evidence ledger and the agent

Workbench

Введите /workbench в режиме deep. Слева функции, в центре псевдо-C, дизассемблер или hex, справа журнал фактов, внизу агент. a заставляет агента объяснить функцию и записать, что он нашёл.

Deep mode: strings, ARM64 disassembly and a Unicorn emulation of a function prologue

Две сессии, разделённые стеной

Первая сессия смотрит внутрь и пишет docs/SPEC.md, вторая строит порт только по этой спецификации, в режиме clean-room.

portcode engines install core
portcode --deep -a reverse
portcode --clean-room -a port

Сначала факты, потом код

Изучение

Фиксируем точную сборку, просматриваем файлы, идём по главному циклу. Что только прочитано — inference; observation — только то, что запускали.

Запись

Журнал, в который можно только дописывать. У каждой записи есть id (E-0007), источник и хеш, открытые вопросы помечены unknown. Каждое правило в порте ссылается на запись.

Порт

По одному небольшому куску, сверяя с выводом оригинала, а не с твоим прочтением его кода.

Проверка

parity и фаззинг против оригинала решают, совпадает ли порт. Агент не остановится до PASS.

Работает с локальными и своими моделями

Один OpenAI-совместимый клиент, который переносит то, в чём ошибаются открытые модели: reasoning_content и <think> в тексте, вызовы инструментов обычным текстом, битый или оборванный JSON в аргументах, числа в кавычках, серверы, отвергающие необязательные поля, зависающие потоки. Маленькое окно контекста и ответы, обрезанные лимитом вывода, тоже учтены.

ПровайдерАдрес по умолчаниюКлюч
lakomoorhttps://lakomoor.com/v1LAKOMOOR_API_KEY
ollamahttp://localhost:11434/v1не нужен
lmstudiohttp://localhost:1234/v1не нужен
llamacpp · vllm · sglang:8080 · :8000 · :30000по желанию
deepseek · openrouterоблако, тот же протоколпеременная окружения
Что проверено. Клиент, починка JSON и цикл агента протестированы целиком на сценарном сервере. Профили DeepSeek и Qwen — осторожные догадки, а не результаты бенчмарков. Запустите portcode eval на своей модели и подправьте.
$ portcode models -p lakomoor
$ portcode -m lakomoor/deepseek-chat
$ portcode -m ollama/qwen3:14b -a port

Шесть агентов

build

По умолчанию. Доводит изменения от начала до конца.

port

Процесс rustport, инструменты порта и проверка завершения.

reverse

Изучает оригинал и записывает факты. Код не правит. Использует инструменты deep.

plan

Только чтение: исследует и пишет план.

explore · general

Подагенты с чистым контекстом, запускаются через task.

Правки и команды сначала спрашивают (разрешить, всегда, запретить). Опасные команды отклоняются всегда, файловые инструменты не выходят за проект. Оболочка работает с закрытым stdin, лимитом времени и ограниченным выводом; при таймауте убивается вся группа процессов.

Навык rustport

Он встроен в бинарник и работает также в Claude Code, Codex и OpenCode (portcode skill export ~/.claude/skills). Основной файл — около 100 строк, подробные заметки подгружаются, только когда нужны этапу.

  1. Заявка точность, платформы, clean-room или deep, лицензия → docs/PORT.md
  2. Фиксация и обзор хеш сборки, опись, неизвестные записаны
  3. План карта модулей от листьев; на каждый — переписать, подключить или отбросить
  4. Эталоны детерминированные сценарии, снятые с оригинала
  5. Ядро порта кусок → тест → clippy → parity; искать расхождение бисекцией, допуск не расширять
  6. Платформа и графика только для GUI; wgpu за трейтами, сравнение PNG вне экрана
  7. Доказательство скриншот на каждую функцию, скорость, site_build

Пример порта

wordstat port output
evidence ledger in the terminal

wordstat, C → Rust

Настоящая программа на C, 6 эталонных случаев, 400 прогонов фаззинга против оригинала, 11 записей фактов и один открытый вопрос.

parity 6/6fuzz 400/4001 неизвестное
Открыть сгенерированный сайт

Журнал в терминале

portcode port ledger показывает, что для этого порта наблюдалось, предполагалось и неизвестно.

Всё — инструмент

Терминальный интерфейс, агент и скрипты вызывают одни и те же инструменты. Всё, что умеет модель, можно запустить руками: portcode tool <name> '{json}'.

portcode --help
КомандаЧто делает
portcodeДиалог
portcode run "…" -a port -y --jsonОдин запрос, JSON-строки
portcode doctor · evalПроверка настроек · проверка модели
portcode port …Инструменты порта, без LLM
portcode serveУдалённое управление, см. пульт
portcode skill export <dir>Поставить навык в другой агент

Откуда это

PortCode повторяет архитектуру OpenCode, переписанную на Rust, и объединяет её с навыком rustport и идеями Craft Anything. Это переписывание, а не форк. Таблица соответствия показывает, что покрыто.