# Changelog [English](CHANGELOG.en.md) | 中文 本插件的全部重要变更都记录在这里。格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 ## [1.0.4] - 2026-10-18 ### Fixed - **界面切到英文后,区块里仍是中文。** 三个互不相关的缺陷叠在一起: 1. **读错了 locale 快照的字段。** 活动语言存放在 `active` (`packages/client/locale/src/client/index.ts` 的 `LocaleSnapshot`),代码读的是 `id`, 于是永远得到 `undefined`、永远回退中文。 2. **标题组件自己推导语言。** `Chrome` 从 `props.locale` 取语言,而它的三处调用都传 `null`, 所以标题「REA 版本」在任何界面语言下都是中文 —— 这正是「有些地方仍然是中文」。 现在改为接收已绑定语言的 `t`:忘记传会直接抛错,而不是静默显示错误的语言。 3. **两处用中文全角冒号 `:` 拼接译文**(加载失败提示、「仓库最新」提示), 英文界面下会显示成 `Could not load:…`。改为整句词条,由每种语言自己决定措辞与标点。 ### Changed - **语言回退由中文改为英文。** 只有界面语言为中文时才用中文,其余一律用英文。 这与 DSH 自身的文本回退一致:其 `resolveText` 的兜底语言就是英文。 ### Added - `test/render.mjs` 现在断言**英文界面下输出不含任何 CJK**,并覆盖「挂载后再切换语言」。 这是强断言:弱形式(「标题是英文」)会漏掉中英混排的区块,而那正是本次的形状。 - `test/dictionary.mjs` 新增两条:英文字典不得含 CJK;**字典之外不得出现 CJK** (即未翻译的硬编码文案,以及中文标点)。 ## [1.0.3] - 2026-10-17 ### Changed - **「卸载」按钮改名为「卸载REA」**(英文 `Uninstall REA`)。 插件卡片**头部**本来就有一个「卸载」—— 那是卸载插件包本身;本区块里的「卸载」卸载的是 REA。 两个按钮同名且在同一张卡片上,改名的目的就是让人一眼分得清哪个是哪个。 确认弹窗的文案本就写明「固定版本的 rea-agents」,未作改动。 ## [1.0.2] - 2026-10-17 ### Fixed - **「检测最新版本」报 `HTTP 404`。** `api()` 曾用「有没有传 body」来推断请求方法, 于是两个**不接收参数**的动作 —— 检测注册表(`/check`)与移除固定(`/unpin`)—— 被发成了 GET,而宿主只接受 POST。宿主对一个它确实能处理的路由回了 404, 读起来像「没有这个路由」,实际是「方法不对」。现在由 `apiGet` / `apiPost` 显式声明方法, 猜的那一步消失了。「卸载」按钮此前受同一个原因影响。 ### Changed - **图标由黑色改为蓝色。** 原先描边用 `currentColor`,但插件管理器是通过 `` 渲染它的 —— 这样加载的 SVG 无法继承页面颜色,`currentColor` 只能退化成 SVG 自身的默认值(黑)。 改为写死的蓝色 `#247bbf`,这是跨越该边界唯一有效的写法。 ### Removed - 排查过程中加入的全部诊断埋点:浏览器半边的 `report()` 上报、宿主的 `POST/GET /report` 端点、 挂载自检 effect 与 `data-rea-section` 标记。它们完成了使命,不再随插件发布。 ## [1.0.1] - 2026-10-17 ### Fixed - **控件在插件卡片上完全不显示。** 这是两个互不相关的缺陷叠加在一起: - **槽注册被拒。** 最初注册到 `plugins.detail.section` —— 一个 **list** 槽, 而 list 槽的注册必须带 `id`。契约里该槽是给「评论别人家插件」用的, 管理**自己**的槽是 `plugins.bundle.config`(keyed,必须带 `key`)。 这两种缺失都会让 slot ledger 抛错,而该错误被插件页的 entry reconciliation 吞掉, 页面上没有任何可见提示,控件就此消失。 - **组件改名后残留旧引用。** 区块容器改名为 `Chrome` 后,两处**多行** `h(...)` 调用 仍写着旧名 `Section`(单行形式的批量替换没能匹配到它们)。 loading 状态用的是新名、正常渲染,数据一到走 ready 分支就抛 `ReferenceError`, React 随即卸载整块贡献 —— 现象是「闪一下就没了」,且不会再有第二次上报。 ### Changed - **控件从顶层「设置」区移到插件自己的卡片上。** 由 `settings.section` 改为 `plugins.bundle.config`(按包名键控),位置在卡片描述与「包含的组件」之间。 后者才是契约里为「bundle 自己的配置」准备的位置,因此也更显眼。 ### Added - `GET /rea-agents/diagnose`:报告浏览器半边是否进入页面的模块图,以及 Loader 行是否通过 composer 的逐行门禁 —— 这是离线无法回答的那个问题。 - `test/render.mjs` 改为完整驱动 loading / ready / failed 三种状态。 原测试只覆盖 loading:测试桩不执行 effect,`load()` 从不运行,状态永远停在 loading, 恰好绕过了真正崩溃的那条分支。 - 静态检查:`h(大写标识符, …)` 引用的每个组件都必须在文件内定义。 它一次覆盖所有调用点,而不只是测试恰好走到的那些。 ## [1.0.0] - 2026-10-17 首个版本。 ### Added - 把 `rea-agents` 固定在当前配置档内的一个确切版本,并从该副本启动 MCP 服务, 因此一次 harness 启动不会拉取或执行新发布的版本。 - 插件卡片上的「REA 版本」区块:安装、检测最新版本、更新、卸载、刷新。 每个动作之后都从磁盘回读状态,所以显示的版本就是服务将要启动的那一份。 - 更新落地到比仓库最新更旧的版本时,点名 pnpm 的 `minimumReleaseAge` 策略, 而不是把它当作成功来呈现。 - 可选的 `frida` 依赖报 `ERR_PNPM_IGNORED_BUILDS` 时,**以磁盘结果**判断安装是否成功, 并把被扣留的构建作为一条较温和的事实报告,而不是安装失败。 - 独立的 `rea-agents-mcp` 条目 id,使 profile 里遗留的手写 `rea-mcp` 覆盖行 无法静默关掉本插件的 MCP 服务。 - 引擎全部自备:本插件不安装 Ghidra、IDA、jadx、apktool、adb 等任何分析引擎。 [1.0.4]: ../../compare/v1.0.3...v1.0.4 [1.0.3]: ../../compare/v1.0.2...v1.0.3 [1.0.2]: ../../compare/v1.0.1...v1.0.2 [1.0.1]: ../../compare/v1.0.0...v1.0.1 [1.0.0]: ../../releases/tag/v1.0.0