Skip to main content
Glama

AutoLinker — это библиотека поддержки AI-агентов для EPL. За счёт реверс-инжиниринга она позволяет AI полностью автоматически писать код: автоматически находить и читать нужный код по вашим требованиям, а затем напрямую редактировать, изменять и вставлять его.

Также предоставляется локальный MCP-сервис, который подключает IDE EPL к Codex, Claude Code, Gemini CLI и другим инструментам, позволяя им автоматически писать код на EPL (см. описание MCP ниже).

📖 Практическое руководство EPL × AI Agent · 📖 e-packager: разбираем .e в txt, изменяем и упаковываем обратно

Быстрый старт

Скачав Release, поместите AutoLinker.fne в каталог lib EPL и включите эту библиотеку поддержки.

🔧 Руководство по настройке функций AI / MCP (API-ключи, прокси-серверы, настройки платформ)

📊 Перед выбором модели можно ознакомиться с бенчмарк-оценкой больших языковых моделей для EPL и сравнить реальные ответы с результатами безголовой компиляции.

Related MCP server: 易语言 Universal MCP

Основные функции

⭐ Вкладка сеанса AI-агента

Расскажите AI, что нужно сделать, и он автоматически найдёт, прочитает и отредактирует исходный код текущего проекта.

⭐ AI-функции контекстного меню

  • AI-оптимизация функции — выполняет эквивалентную оптимизацию текущей функции

  • AI-добавление комментариев — генерирует комментарии для текущей функции

  • AI-перевод функции + имён переменных — переименовывает в английский lowerCamelCase

  • AI-перевод выделенного текста

  • AI-добавление кода по типу текущей страницы — генерирует новый код на основе типа текущей страницы, контекста и ваших требований

⭐ Файл правил проекта {文件名}.AGENTS.md

В том же каталоге, где находится .e-файл, создайте одноимённый .AGENTS.md. Его содержимое автоматически внедряется в системные подсказки всех AI-функций как правила проекта (аналог CLAUDE.md в Claude Code и AGENTS.md в Codex).

Исходный файл

Файл правил (в том же каталоге)

test_a.e

test_a.AGENTS.md

MyProject.e

MyProject.AGENTS.md

⭐ Для разных .e-файлов — разные линкеры

Больше не нужно вручную переключать линкеры. Добавьте несколько групп конфигураций link.ini в 【Меню «Инструменты» → Настройки AutoLinker → Линкеры】, а затем переключайте линкер для текущего исходного файла в 【Главное меню → Компиляция】.

⭐ Автоматическое переключение динамических/статических модулей ec при отладке / компиляции

Подготовьте пару файлов ec (динамическую / статическую версию) для одного и того же модуля. AutoLinker автоматически заменит импортированный в проект модуль при начале отладки и начале компиляции. Типичные сценарии — VMP SDK, ExDui: для компиляции нужна статическая версия с объявлениями Lib, а для отладки доступна только динамическая версия с объявлениями Dll.

В меню «Инструменты» IDE откройте Настройки автоматического переключения модулей EC AutoLinker, чтобы вести правила. Примечание: сначала нужно самостоятельно подключить любой из пары ec, а оба ec в паре должны находиться в одной папке (при замене меняется только имя файла).

⭐ Компиляция проекта по конфигурации

В разделе «Инструменты → Настройки AutoLinker → Конфигурации компиляции» можно вести несколько наборов конфигураций вывода для текущего .e/.ec проекта. Поддерживаются auto, оконный EXE, консольный EXE, DLL, целевой модуль EPL, статическая компиляция, а также действия PowerShell до/после компиляции. После сохранения выберите конфигурацию через «Главное меню → Компиляция → Компиляция по конфигурации»; задача создаёт снимок текущего проекта IDE и выполняется асинхронно в отдельном скрытом экземпляре e.exe. Конфигурация сохраняется в файле <文件名>.autolinker.json рядом с исходным файлом; подробные поля и переменные см. в docs/project-build-menu-integration.md.

Локальный MCP-сервис

Чтобы подключить MCP для EPL к Codex, Claude Code, Gemini CLI и другим инструментам, клиент должен поддерживать MCP Streamable HTTP.

Адрес сервиса

  • Внешние клиенты всегда подключаются к http://127.0.0.1:19207/mcp; экземпляры IDE используют внутренние серверные порты начиная с 19208, а шлюзом управляет активный экземпляр.

  • После успешного запуска в окне вывода IDE и в autolinker.log будет записано:

    [AutoLinker][LocalMCP] 本地 MCP 服务已启动:http://127.0.0.1:19207/mcp

Протокол

  • JSON-RPC 2.0, в initialize согласуются 2025-11-25 / 2025-03-26 / 2024-11-05 (для неизвестных версий — откат на 2025-11-25).

  • Поддерживаемые методы: initialize, notifications/initialized, ping, tools/list, tools/call, DELETE /mcp.

  • Границы безопасности: привязка только к 127.0.0.1, запросы браузеров с непустым Origin отклоняются, нет CORS / Bearer Token. Внешние вызовы не показывают окно подтверждения, но по-прежнему выполняют белый список инструментов, проверку схемы параметров, обновление рабочей области и CAS-проверку хэша исходного кода. Для каждого сеанса нативного клиента нужно сначала успешно вызвать refresh_workspace_mirror. Фиксировано 4 рабочих потока, очередь до 32 соединений, при перегрузке возвращается HTTP 503.

Примеры конфигурации клиентов

Claude Code — ~/.claude.json; Gemini CLI — ~/.gemini/settings.json

{
  "mcpServers": {
    "AutoLinker": {
      "transport": "streamable_http",
      "url": "http://127.0.0.1:19207/mcp"
    }
  }
}

Codex — ~/.codex/config.toml

[mcp_servers.AutoLinker]
url = "http://127.0.0.1:19207/mcp"

Cursor / Windsurf / IDE — на странице настроек MCP добавьте: Name — AutoLinker, Type — http / streamable_http, URL — http://127.0.0.1:19207/mcp.

Модель чтения/записи исходного кода проекта

  • Встроенный AI автоматически подготавливает зеркало в режиме full перед каждым запросом; внешний MCP-сеанс перед первым чтением/записью должен вызвать refresh_workspace_mirror. Зеркало распаковывается e-packager в %TEMP%/AutoLinker/workspace-mirror/ (включая несохранённые изменения) и не затрагивает каталог исходников. mode поддерживает auto / main_only / full.

  • Только когда пользователь явно просит разобрать, просмотреть, использовать как справочник или скопировать внешний .e / .ec файл, вызывается e_packager, и текущий MCP-сеанс должен сначала успешно вызвать refresh_workspace_mirror. Аргументом является обязательный file_path (абсолютный путь или путь относительно текущего каталога проекта; принимаются только существующие обычные файлы .e / .ec). Файл распаковывается в доступный только для чтения каталог unimported_code/{文件名}/ текущего зеркала. Используйте list_files / search_code для поиска файлов, затем читайте их через read_file / read_files; для неимпортированных исходников не используйте read_code_item и не используйте инструменты записи. Каталог с тем же именем заменяется только после успешной распаковки; в случае успеха возвращаются operation="unpack", output_directory, file_count, новая mirror_generation и read_hint. Распаковка меняет поколение зеркала, поэтому постраничное чтение нужно начинать заново с первой страницы.

  • Чтение всегда идёт по относительным путям зеркала (list_files, search_code, read_file, read_files, read_code_item); для больших файлов возвращается next_source_byte_offset для продолжения чтения. При чтении следующей страницы рекомендуется без изменений передавать ненулевую mirror_generation предыдущей страницы; если её не передать, автоматически привязывается текущее поколение зеркала, а явно переданные устаревшие поколения по-прежнему отклоняются.

  • Перед редактированием получите через read_real_file постраничное представление и code_hash как базовую линию CAS. Инструменты записи (edit_file, multi_edit_file, write_file и т. д.) нацелены на file_path, сопоставляются с элементами программы в IDE и записываются напрямую в IDE, без компиляции и обратной отправки.

  • При записи необходимо передавать SHA-256 expected_base_hash (для восстановления — expected_current_hash), чтобы старая базовая линия не перезаписывала новые изменения; результат возвращает только хэши, снимки, проверку и статистику изменений, полный результат — в structuredContent.

  • src/*.xml — это собственные файлы оконных интерфейсов EPL, они предназначены только для чтения и поиска. Текущие инструменты не поддерживают изменение положения, размера, порядка слоёв и свойств окон и элементов управления, не поддерживают добавление и удаление элементов управления, а также добавление, удаление или изменение привязок событий элементов управления. Соответствующий код оконных модулей и существующие обработчики событий в src/*.txt по-прежнему можно редактировать, однако добавление подпрограммы события не означает, что привязка события элемента управления уже установлена. Фиксированные таблицы (константы, глобальные переменные, объявления DLL, типы данных) можно редактировать по соответствующим путям; переменные программных модулей при записи обратно приводятся к формату, принимаемому IDE.

  • Если одновременно открыто несколько IDE, сначала вызовите list_instances, чтобы просмотреть целевой проект, а затем выберите экземпляр с помощью select_instance; выбор изолируется по Mcp-Session-Id, и после выхода экземпляра не происходит тихого переключения.

Публичные инструменты (tools/list)

Категория

Метод

Описание

Чтение

refresh_workspace_mirror

Обновляет зеркало из проекта IDE (auto / main_only / full)

Чтение

e_packager

Распаковывает другие .e / .ec в обновлённом зеркале в доступную только для чтения справочную папку unimported_code/{文件名}/, возвращает новую mirror_generation

Чтение

list_files

Список файлов в зеркале по glob

Чтение

search_code

Поиск по каждому файлу зеркала: массовые patterns, glob, контекст, постранично

Чтение

read_file / read_files

Чтение одного / нескольких файлов или диапазонов, с номерами строк

Чтение

read_code_item

Чтение полной подпрограммы / блока объявлений по имени элемента верхнего уровня

Чтение

read_real_file

Возвращает постраничное представление и code_hash из реальной страницы IDE (базовая линия перед записью)

Редактирование

edit_file / multi_edit_file

Точная замена текста (одиночная / массовая)

Редактирование

write_file

Полная перезапись реальной страницы исходным кодом, поддерживает expected_base_hash

Редактирование

diff_file

Просмотр структурной разницы, без записи

Редактирование

restore_file_snapshot

Восстановление снимка перед записью

Текущая страница

get_current_page_info

Имя текущей страницы, тип и источник разбора

Текущая страница

get_current_eide_info

Путь к исходнику, путь к процессу IDE, MCP-порт и т. д.

Маршрутизация

list_instances

Список запущенных экземпляров IDE AutoLinker и выбор текущего сеанса

Маршрутизация

select_instance

Направляет текущий MCP-сеанс на указанный экземпляр

Компиляция

compile_with_output_path

target по умолчанию — auto, успех проверяется по отпечатку артефакта

Взаимодействие

run_powershell_command

Выполнение PowerShell после подтверждения, при таймауте завершает дерево процессов

Сеть

search_web_tavily

Поиск в интернете

Сеть

fetch_url

Загружает текст из публичного HTTP(S), блокирует loopback / частные сети / редиректы

Сеть

extract_web_document

Извлекает основной текст веб-страницы и сводку абсолютных ссылок

Другие функции

⭐ Безголовая компиляция из командной строки

Рекомендуется запускать e.exe через AutoLinkerTest headless-compile: автоматически закрываются всплывающие окна при запуске, скрывается IDE, вызывается compile_with_output_path, а результат JSON выводится в консоль. Этот лаунчер поддерживает одновременные вызовы из нескольких процессов: задания для одного и того же .e проекта выстраиваются в очередь в порядке вызова, разные проекты могут компилироваться параллельно; выходной путь по-прежнему должен оставаться уникальным, и это должен обеспечивать вызывающий.

.\bin\fne_release\AutoLinkerTest.exe headless-compile `
  "C:\path\to\e571.exe" "D:\demo\demo.e" "D:\demo\build\demo.exe" `
  --target auto --static --result "D:\demo\build\compile-result.json" --timeout 120

target поддерживает auto, win_exe, win_console_exe, win_dll, ecom; --static применим только к EXE/DLL. Если --result опущен, каждый вызов создаёт отдельный <输出文件>.headless.<invocation-id>.json и атомарно обновляет совместимый файл <输出文件>.headless.json. {易语言目录}\AutoLinker\Log\headless_compile_last.json также атомарно обновляется и содержит «результат последнего вызова»; конкурентные вызывающие не должны полагаться на него для различения своих результатов. При явном указании --result конкурентные вызывающие должны использовать разные пути.

Также можно запустить главную программу напрямую (она отвечает только за безголовую компиляцию; для ранних всплывающих окон и координации параллельных запусков одного проекта по-прежнему рекомендуется использовать лаунчер):

"C:\path\to\e571.exe" "D:\demo\demo.e" `
  --autolinker-headless-compile `
  --autolinker-output "D:\demo\build\demo.exe" `
  --autolinker-target auto `
  --autolinker-result "D:\demo\build\compile-result.json" `
  --autolinker-invocation-id "compile-001"

⭐ Переписывание функций базовой библиотеки

Замена функций базовой библиотеки современным C++ позволяет значительно повысить производительность, а также даёт защиту от взлома по сигнатурам e-функций и эффект обхода антивируса; это же применимо к сторонним библиотекам.

Как использовать

  1. Определите в IDA правильную сигнатуру функции (большинство функций базовой библиотеки находятся в LibFn.obj из krnln_static.lib); можно опираться на открытую реализацию базовой библиотеки BlackMoon.

  2. Реализуйте функцию в своей собственной Lib (см. проект TestCore) и скомпилируйте Release как 32-битную lib. Пример:

    // C++20(需 VC2022)重写核心库「寻找文本」,约为核心库 300% 速度
    extern "C" void __cdecl krnln_fnInStr(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf) {
        std::string_view inputString = pArgInf[0].m_pText;
        std::string_view searchString = pArgInf[1].m_pText;
        if (inputString.empty() || searchString.empty()) { pRetData->m_int = -1; return; }
        size_t start = (pArgInf[2].m_dtDataType == _SDT_NULL || pArgInf[2].m_int <= 1) ? 0 : pArgInf[2].m_int - 1;
        auto r = (pArgInf[3].m_bool)
            ? std::search(inputString.begin() + start, inputString.end(), searchString.begin(), searchString.end(),
                          [](char a, char b) { return std::tolower(a) == std::tolower(b); })
            : std::search(inputString.begin() + start, inputString.end(), searchString.begin(), searchString.end());
        pRetData->m_int = (r != inputString.end()) ? std::distance(inputString.begin(), r) + 1 : -1;
    }
  3. В меню «Инструменты» IDE откройте Настройки переопределения функций базовой библиотеки AutoLinker, чтобы вести список .lib, которые нужно принудительно подключить:

    • Путь к Lib: дополнительно подключаемый при компоновке .lib (указывается перед krnln_static.lib, чтобы перекрыть одноимённые символы)

    • Совпадение линкера: если оставить пустым, действует для всех линкеров; если указать текст, правило действует только когда имя выбранного линкера содержит этот текст (например vc2022+pf)

    • Включение: позволяет временно отключить отдельное правило

  4. После сохранения статическая компиляция сразу применит изменения; появятся предупреждения LNK4006 / LNK4088 и т. п., которые не влияют на работу.

Внимание

  • Этот метод автоматически включает у линкера /FORCE, чтобы игнорировать конфликты.

  • В вашей собственной Lib нужно отключить /GL, иначе при повторной компоновке будет проигнорирован порядок Lib, скорректированный AutoLinker.

  • Пример TestCore использует C++20 и требует линкер VC2022; страница настроек основана на WebView2, убедитесь, что среда выполнения установлена.

⭐ Возврат к предыдущему изменению кнопкой мыши «назад»

Обычная функция в других IDE, личное предпочтение.

Related MCP Connectors

Related MCP Servers