# 更新日志 本文件记录 dsh-plugin-nickname 的所有版本变更。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本遵循语义化版本规范。 ## [v0.3.6] - 2026-10-14 ### 优化 - **MutationObserver 忽略插件自身 UI 引发的变更**:编辑面板每次重建(建/删/切标签、搜索防抖重渲染)都会扰动 `document.body`,此前会触发一次全量重扫(`replaceNicknames`)。现让 observer 在「所有变更都发生在 `[data-nickname-ui]` 内」时直接跳过,避免每次面板交互都引发全量扫描、降低主线程占用 - 经真实浏览器复核:标签的 建/删/切 逻辑均正常(删标签后可立即再建、切换即时生效,「不分组」与「按标签分组」两种模式均验证通过) ### 说明 - 插件代码只在**完全退出并重开 dsh** 时重载;页面软刷新不会重载插件。若遇到「改动不生效 / 像要刷新」,先完全重启 dsh 确认加载的是最新版 ## [v0.3.5] - 2026-10-14 ### 新增 - **条目内联删除标签**:每个自定义标签 chip 右侧新增内联 `✕`,点击即从所有插件删除该标签(带确认,防误触),无需再去「高级 → 标签管理」。chip 本体仍是点击切换是否打标;`✕` 为独立元素、`stopPropagation`,不与切换冲突 ### 说明 - 经真实浏览器连建 5 个标签实测:**不存在「只能创建 3 个标签」的上限**,`createCustomTag` 直接入列、无数量限制(新增回归断言固化此行为) ### 验证 - 新增/扩展真实浏览器闭环断言:连建 5 个标签(无 3 上限)、高级管理区删「1」、条目内联 `✕` 删「标签B」,均校验设置项/条目 chip/管理区三处同步 - 浏览器验证由 22 条增至 25 条,全通过;静态 54 条保持全通过;合计 79 断言全绿 ## [v0.3.4] - 2026-10-13 ### 修复 - **高级区「标签管理」不随增/删标签刷新**:新建/删除自定义标签后,`#nickname-tag-manager` 只在面板打开时渲染一次,导致新建的标签在管理区没有删除按钮、已删除的标签仍残留在管理区,需关闭再开面板才同步。现抽出 `buildTagManagerHtml()` + `refreshTagManager()`,在 `createCustomTag` / `deleteCustomTag` 后同步刷新管理区并重绑删除按钮 ### 验证 - 新增真实浏览器闭环断言 3 条(`tests/harness/index.html` 加 `?tagflow=1` 自检 + `tests/browser-check.mjs` 断言):真实点击「+标签→建」与高级区「✕」,校验设置项 `tags.custom`/`tags.assignments`、条目 chip、管理区删除按钮三处同步增删 - 浏览器验证由 19 条增至 22 条,全通过;静态 54 条保持全通过;合计 76 断言全绿 ## [v0.3.3] - 2026-10-13 ### 优化 - **P0 正确性** - 修复输入框重复 `style` 属性:条目输入框原本带两个 `style`,第二个 `style="margin-top: 0;"` 按 HTML 规范被静默忽略,现合并为单个 `style` - 修复 `matchPackage` 前缀误命中:`text.startsWith(pkgName)` 会让 `dsh-context` 误中 `dsh-context-extra` 这类更长包名,现加边界判定(前缀后紧跟字母/数字/`.`/`/`/`-` 视为不同包名) - **P1 性能** - 设置项与备注映射改为内存缓存(`settingsCache` / `nickCache`),每次 MutationObserver 触发不再重复 `JSON.parse` 读写 localStorage;`storageRemove` 对应失效缓存 - `saveNickname` / 导入均走缓存版 `saveNicknames`,导入路径也复用缓存,避免缓存与磁盘不一致 - 替换扫描范围收窄到 `[data-plugin-package]` 卡片内部(无卡片时回退全局扫描),避免每次全文档 `div/span/button/h2/h3` 扫描 - `findTextTarget` 由 `querySelectorAll` 全量收集改为直接子树遍历,定位承载文本的叶子节点 - 搜索框输入做 120ms 防抖(`searchTimer`),避免逐字符全量重渲染 - **P2 整洁与体验** - 分组重渲染前记录并恢复面板滚动位置(`scrollTop`),切标签/搜索时不再跳到顶部 - 编辑面板支持 `Esc` 关闭(新增 `escHandler`,关闭/卸载时一并解绑),打开时自动聚焦搜索框 - 移除面板构建/挂载/卸载过程中的 5 处遗留 `console.log` 调试输出(保留自动启动失败的唯一 `console.warn`) ### 验证 - 静态测试 4 套共 54 条保持全通过 - 真实浏览器 19 条保持全通过 - 合计 73 条断言全绿 ## [v0.3.2] - 2026-10-13 ### 新增 - **分组标签**:面板顶部「按…分组」新增「按标签分组」选项,与原有的「按是否有备注分组」并存、可自由切换 - **固定分类(自动)**:每个插件自动带 `官方` / `已修改` / `未修改` 三类之一(官方插件且未开启「改官方」时为「官方」;设过备注为「已修改」,否则「未修改」),作为蓝底固定 chip 展示于插件条目内,点击无效、不可删除 - **自定义标签(用户自建)**:条目内「+ 标签」弹出行内输入框,输入即新建标签并直接打给当前插件;已存在的自定义标签为可切换 chip(绿底=已打、虚线框=未打);面板「高级」区新增标签管理,可删除自定义标签(删除同时解除所有插件的打标关系) - 按标签分组时分组顺序为固定分类 `官方 / 已修改 / 未修改` 在前、自定义标签在后;一个插件可命中多个标签同时出现在多组;空分组自动隐藏 - 数据持久化于设置项 `tags.assignments`(包名 → 标签名数组)与 `tags.custom`(标签名列表);搜索框同时匹配插件名、备注名、固定/自定义标签名 ### 验证 - 浏览器验证由 14 条增至 19 条(新增:标签分组含固定分类 官方/已修改/未修改、预置自定义标签成组、自定义标签分组包含被打标插件、插件条目内固定标签 chip、高级区列出自定义标签且可删除),全通过 - 静态测试 4 套共 54 条保持全通过 ## [v0.3.1] - 2026-10-13 ### 新增 - **分组可折叠**:面板使用「分组」显示时,每个分组标题可点击展开/收起;折叠状态持久化于设置项 `groupCollapsed`,关闭面板再打开仍保持;标题左侧指示符 `▾` 展开 / `▸` 收起;「不分组」模式下的单一分组同样可折叠 - 折叠仅隐藏面板内列表展示,不影响备注保存与列表改名替换 ### 验证 - 浏览器验证由 9 条增至 14 条(新增分组渲染、分组默认展开、折叠后内容隐藏、指示符变化、仅被折叠分组隐藏),全通过 ## [v0.3.0] - 2026-10-13 ### 新增 - **官方插件保护**:`@deepseek-ai/*` 命名空间与 dsh 内置 bundle(`@deepseek-ai/dsh-base`、`dsh-web-app`、`dsh-headless`、`dsh-sdk-app`、`dsh-acp-app`、`dsh-sdk-minimal`,取自 dsh 自己的 `BUILTIN_PROFILE_BUNDLES`)默认不参与改名 - `replaceNicknames` 过滤掉官方包 - `saveNickname` 在写入前拦截,绕过界面(如 `window.__setPluginNickname`)也改不动 - 面板里官方条目带「官方」角标,输入框 `disabled`,占位文案为「官方插件,默认不可改名」 - **「改官方」开关**:面板「高级」区的复选框(设置项 `allowOfficial`,默认 `false`),勾上后官方插件恢复正常改名能力;面板头部改为 `flex-wrap` 布局,避免控件过多时挤爆 ### 说明 - 官方插件改名后容易在 dsh 的更新、排障、官方支持场景下造成混淆,因此改为默认屏蔽 - 此改动会停掉此前对官方插件已设的备注(备注数据保留,勾上开关即恢复生效) ## [v0.2.9] - 2026-10-13 ### 修复 - **真实浏览器下备注不生效**:替换守卫写的是 `el.children.length !== 0 && el.childNodes.length > 2`,其中 `childNodes` 会把换行产生的空白文本节点算进去。同一份 DOM 由 React 渲染(元素之间无空白文本节点)时 `childNodes.length` 为 1,手写 HTML 带缩进换行时为 3 —— 后者直接被守卫挡掉。改为只按**元素子节点**计数(`el.children.length > 2`),与渲染方式无关 - **插件改写自己的界面**:编辑面板里每个条目的包名标签,文本恰好就是包名,会被自己的替换逻辑命中并改成备注名,导致面板上「标签」和「输入框」显示成同一个值。现在 `replaceNicknames` 跳过所有位于 `[data-nickname-ui]` 内部的节点 ### 新增 - `tests/harness/index.html`:按 dsh `CardHead` / `PackageCard` 结构复刻的插件列表页 - `tests/browser-check.mjs` + `npm run test:browser`:用本机 Chromium 加载该页面并断言 7 项(替换生效、按钮完好、图标描述未丢、面板渲染、面板标签仍是包名)。找不到 Chromium 时打印 SKIP 并以 0 退出 ## [v0.2.8] - 2026-10-13 ### 修复 - **备注完全不生效**:dsh 的插件名是 `