简介说明
AutoLinker 是易语言的 AI Agent 支持库。它的做法有点逆向:不是让 AI 写一段代码给你粘贴,而是让 AI 直接进到 IDE 里干活,根据需求自动查找、读取相关代码,然后编辑、修改、插入。
它还提供本地 MCP 服务,可以把易语言 IDE 接入 Codex、Claude Code、Gemini CLI 这类工具,让它们调用易语言完成全自动编码,细节见下文的 MCP 说明。
快速开始
下载 Release 后,把 AutoLinker.fne 放进易语言 lib 目录,并启用该支持库即可。
🔧 AI / MCP 功能配置指南(API Key、中转站、各平台配置)
📊 选模型前可以先看易语言大模型基准评分,对比真实回包与无头编译成绩。
核心功能
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。
- 删除普通程序集或类使用 delete_file:先调用 read_real_file,再传入 file_path 和返回的 code_hash 作为 expected_base_hash。删除包含其成员与全部子程序,不自动改写其他页面的引用,也不自动保存工程;窗口绑定程序集、窗口 XML、固定表和导入模块文件不支持此入口。成功返回 deleted=true、verified=true 和 workspace_mirror_refreshed=true;若已删除但镜像刷新失败,应先刷新镜像,不要直接重试删除。
- src/*.xml 为易语言原生窗口界面文件,仅供读取搜索。当前工具不支持调整窗口或控件的位置、大小、层级和属性,不支持添加、删除控件,也不支持新增、删除或修改控件事件绑定。对应 src/*.txt 中的窗口程序集代码和已有事件处理代码仍可编辑,但新增事件子程序不代表已经建立控件事件绑定。固定表(常量、全局变量、DLL 声明、数据类型)可经对应路径编辑,程序集变量写回会按 IDE 可接受格式处理。
- 模块管理工具仅在用户明确要求列出、导入或移除模块时调用,不用于自动探索或推测依赖。移除工程引用使用 remove_module_from_project,不要使用 delete_file。
- 同时打开多个 IDE 时,先调用 list_instances 查看目标工程,再用 select_instance 选择实例;选择按 Mcp-Session-Id 隔离,实例退出后不会静默切换。
公开工具(tools/list):当前代码对外公开 26 个工具(含两个实例路由工具),连接后的实际清单以 tools/list 为准。下表只列外部 MCP 工具,内置 AI 的计划、技能读取、通用命令执行等工具不对外开放。
| 类别 | 方法 | 说明 |
|---|---|---|
| 读取 | 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 | 精确文本替换(单个 / 批量),外部调用须带 expected_base_hash |
| 编辑 | write_file | 以 full_code 完整覆盖真实页,外部调用须带 expected_base_hash |
| 编辑 | diff_file | 基于真实页预览结构化差异,不写回;外部调用须带 expected_base_hash |
| 编辑 | restore_file_snapshot | 恢复最近一次或指定 snapshot_id 的真实页快照,外部调用须带 expected_current_hash |
| 编辑 | add_new_file | 新建程序集或类,可直接写入完整源码并刷新镜像 |
| 编辑 | delete_file | 删除普通程序集或类及其全部子程序,须带 expected_base_hash;验证删除并刷新镜像,不自动保存工程 |
| 模块 | list_imported_modules | 按用户明确要求列出当前工程已导入的 .ec 模块 |
| 模块 | add_module_to_project | 按 module_path 或 module_name 导入指定模块,实际导入须设置 allow_blocking_import=true |
| 模块 | remove_module_from_project | 按 module_index、module_path 或 module_name 移除工程中指定的模块引用 |
| 当前页 | get_current_page_info | 当前页名称、类型与解析来源 |
| 当前页 | get_current_eide_info | 源码路径、IDE 进程路径、MCP 端口等 |
| 路由 | list_instances | 列出运行中的 AutoLinker IDE 实例和当前会话选择 |
| 路由 | select_instance | 将当前 MCP 会话路由到指定实例 |
| 编译 | compile_with_output_path | 编译到指定 output_path;支持易语言原生 / 黑月编译,target 默认 auto,以更新后的产物和配置恢复结果验证成功 |
| 联网 | search_web_tavily | 联网搜索网页 |
| 联网 | fetch_url | 抓取公网 HTTP(S) 文本,拦截回环 / 私网 / 重定向 |
| 联网 | extract_web_document | 提取网页正文与绝对链接摘要 |
其他功能
无头命令行编译:黑月编译使用 --blackmoon asm|cxx|vcxx,不要同时传 --static。直接调用 compile_with_output_path 时必须显式设置 compiler="blackmoon",完全省略 static_compile,目标仅允许 auto 或当前 EXE/DLL 工程类型。普通编译省略 blackmoon_mode;参数冲突会返回 error 和可操作的 hint,不会隐式切换编译器。配置在跨进程锁保护下临时切换,编译结果收集后恢复。详细说明及回归方法见 黑月编译验证。
推荐用 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。需要黑月编译时增加 --blackmoon asm|cxx|vcxx(分别对应汇编、C/C++、VC++ 模式),启动器会在 IDE 进程内确认 BlackMoon.fne 已加载且配置可用,不可用时直接返回错误。省略 --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 函数特征破解与免杀效果,同样适用于第三方库。
使用方法:
- 在 IDA 中确定正确的函数签名(核心库函数大多在 krnln_static.lib 的 LibFn.obj),可参考黑月核心库开源实现。
- 在自己的 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; } - 在 IDE「工具」菜单打开 AutoLinker 核心库函数重写设置,维护要强制链接的 .lib 列表:
- Lib 路径:追加链接的 .lib(排在 krnln_static.lib 之前以覆盖同名符号)
- 链接器匹配:留空对所有链接器生效;填文本则仅当所选链接器名称包含该文本时生效(如 vc2022+pf)
- 启用开关:可临时停用某条规则
- 保存后进行静态编译即生效,会出现 LNK4006 / LNK4088 等告警,不影响运行。
注意:
- 此方法会自动开启链接器 /FORCE 忽略冲突。
- 自己的 Lib 需关闭 /GL,否则二次链接会忽略 AutoLinker 调整的 Lib 顺序。
- 示例 TestCore 使用 C++20,须用 VC2022 链接器;设置页基于 WebView2,请确保已安装运行时。
鼠标后退键回退到上个修改:其他 IDE 常见的功能,这里算个人喜好。
图片预览








下载地址
https://github.com/aiqinxuancai/AutoLinker
https://pan.baidu.com/s/1LMUNjkN8afbUlh3Yq9lm1Q?pwd=rief 提取码: rief




评论抢沙发