Skip to main content
Glama

AutoLinker 是易语言的 AI Agent 支持库,通过逆向让 AI 全自动编写代码:根据你的需求自动查找、读取相关代码,并直接编辑、修改、插入。

同时提供本地 MCP 服务,可将易语言 IDE 接入 Codex、Claude Code、Gemini CLI 等工具,让它们调用易语言全自动编码(见下方 MCP 说明)。

📖 易语言 × AI Agent 实践白皮书 · 📖 e-packager:拆解 .e 为 txt 修改后再打包

快速开始

下载 Release 后,将 AutoLinker.fne 放入易语言 lib 目录并启用该支持库。

🔧 AI / MCP 功能配置指南(API Key、中转站、各平台配置)

📊 选择模型前,可查看易语言大模型基准评分,对比真实回包与无头编译成绩。

Related MCP server: 易语言 Universal MCP

核心功能

⭐ AI Agent 会话页签

告诉 AI 你要做什么,它会自动搜索、读取、编辑当前工程源码。

⭐ 右键菜单 AI 功能

  • AI 优化函数 — 对当前函数做等价优化

  • AI 添加注释 — 为当前函数生成注释

  • AI 翻译函数 + 变量名 — 重命名为英文 lowerCamelCase

  • AI 翻译选中文本

  • AI 按当前页类型添加代码 — 依据当前页类型、上下文和你的需求生成新增代码

⭐ 项目规范文件 {文件名}.AGENTS.md

在 .e 源文件同目录下创建同名 .AGENTS.md,其内容会自动注入所有 AI 功能的系统提示词,作为项目规范(类似 Claude Code 的 CLAUDE.md、Codex 的 AGENTS.md)。

源文件

规范文件(同目录)

test_a.e

test_a.AGENTS.md

MyProject.e

MyProject.AGENTS.md

⭐ 不同 .e 源文件使用不同链接器

再也不用手动来回切换链接器。在【工具菜单 → AutoLinker 设置 → 链接器】中添加多组 link.ini 配置,并在【主菜单 → 编译】下切换当前源文件所用的链接器。

⭐ 调试 / 编译时动静态 ec 模块自动切换

为同一模块准备一对 ec 文件(动态版 / 静态版),AutoLinker 会在开始调试和开始编译时自动替换工程中已导入的对应模块。典型场景如 VMP SDK、ExDui:编译需 Lib 声明的静态版,调试只能用 Dll 声明的动态版。

在 IDE「工具」菜单打开 AutoLinker EC 模块自动切换设置 维护规则。注意:需先自行引用动/静任一 ec,且成对的两个 ec 必须放在同一文件夹中(替换时只改文件名)。

⭐ 项目级按配置编译

在“工具菜单 → AutoLinker 设置 → 编译配置”中为当前 .e/.ec 工程维护多套输出配置,支持 auto、窗口 EXE、控制台 EXE、DLL、易模块目标、静态编译,以及编译前/后 PowerShell 动作。 保存后从“主菜单 → 编译 → 按配置编译”选择配置;任务会生成当前 IDE 工程快照,在独立隐藏的 e.exe 实例中异步执行。配置保存在源文件旁的 <文件名>.autolinker.json,详细字段和变量见 docs/project-build-menu-integration.md。

本地 MCP 服务

将易语言 MCP 接入 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。外部调用不弹审批窗,但仍执行工具白名单、参数 Schema、工作区刷新与源码哈希 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 为易语言原生窗口界面文件,仅供读取搜索。当前工具不支持调整窗口或控件的位置、大小、层级和属性,不支持添加、删除控件,也不支持新增、删除或修改控件事件绑定。对应 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

从 IDE 真实页返回分页视图与 code_hash(写前基线)

编辑

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

列出运行中的 AutoLinker IDE 实例和当前会话选择

路由

select_instance

将当前 MCP 会话路由到指定实例

编译

compile_with_output_path

target 默认 auto,以产物指纹验证成功

交互

run_powershell_command

经确认后执行 PowerShell,超时终止进程树

联网

search_web_tavily

联网搜索网页

联网

fetch_url

抓取公网 HTTP(S) 文本,拦截回环 / 私网 / 重定向

联网

extract_web_document

提取网页正文与绝对链接摘要

其他功能

⭐ 无头命令行编译

推荐用 AutoLinkerTest headless-compile 启动 e.exe:自动关闭启动期弹窗、隐藏 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 中确定正确的 函数签名(核心库函数大多在 krnln_static.lib 的 LibFn.obj),可参考黑月核心库开源实现。

  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,否则二次链接会忽略 AutoLinker 调整的 Lib 顺序。

  • 示例 TestCore 使用 C++20,须用 VC2022 链接器;设置页基于 WebView2,请确保已安装运行时。

⭐ 鼠标后退键回退到上个修改

其他 IDE 常见的功能,个人喜好。

Related MCP Connectors

Related MCP Servers