Skip to content

Releases

v26.10.5-1

Choose a tag to compare

@Wraindrock Wraindrock released this 05 Oct 13:52

仓库与插件包名从 dsh-agent-rules 整体更名为 dsh-ian-rules(slug ian-rules),并去掉「Felix」个人品牌字样、按 MIT 开源项目表述。

名字改了哪些

按本仓约定(package.json 的 name 是唯一出处,其余标识由它派生),下列标识同步更换:

位置 现在
包名 / 客户端注册 id / 页签实现 id dsh-ian-rules
插件名 / 页签 kind ian-rules
面板接口 /ian-rules/*
系统提示 section plugin:ian-rules
提示变量 ian_rules_body
数据文件 $DSH_HOME/ian-rules.json
模型工具 ian_rules

GitHub 仓库已是 Grant-Felix/dsh-ian-rules,旧地址自动重定向。

升级要做的两步

  1. 依赖键跟着换(否则 profile 里会同时留着两代、bundle 阵容里还挂着旧包名):
    dsh plugin --profile web remove dsh-agent-rules
    dsh plugin --profile web add github:Grant-Felix/dsh-ian-rules
    
  2. 重启 profile。规则不会丢:启动时按由新到旧取第一份存在的旧数据文件(agent-rules.json → dev-rules.json)复制到 ian-rules.json,原文件保留,回退到旧版本插件仍可读。

兼容层:两代旧名都留着

  • 数据文件:agent-rules.json 与 dev-rules.json 都会被迁移到新名字下。
  • 页签 kind:agent-rules、dev-rules 各补一份不带 guide 的兼容注册 —— 升级前已开着的页签不会变成孤儿,页面列表也不会多出一行。
  • 请求路由:宿主进程还没重启时,面板依次退回 /agent-rules、/dev-rules 再问一次(只在主路由 404 且该旧路由有应答时;403 / 500 照旧原样上报)。
  • scripts/check-identity.mjs 把 agent-rules 一并列为禁用旧名,18 处例外逐条写明理由;Gitee 镜像地址被守卫钉死仍是 dev-rules。

验证

  • npm run check:56 个用例 + 身份自检(包名 / cordis patch / 客户端注册 id / 路由 / section / 提示变量 / 数据文件名 / 页签 kind 必须彼此一致)。
  • npm run sandbox:check:在隔离 DSH_HOME 里装本地检出,输出 ✓ 客户端注册 id 与包名一致:dsh-ian-rules,profile 组装通过。

其它

  • LICENSE 版权行改为 dsh-ian-rules contributors;README / NOTICE / 沙箱脚本 / 发布工作流注释同步更新。
  • npm 尚未发布:dsh-ian-rules 在 registry 上未被占用,首发需要一次性凭据,之后由 trusted publishing 接管(npmjs.com 上的 Repository 字段要改成 dsh-ian-rules)。
  • Gitee 镜像地址未随更名改动(仍是 dev-rules);tag 按惯例由 GitHub 单向同步过去。

v26.10.1-5

Choose a tag to compare

@Wraindrock Wraindrock released this 01 Oct 15:13

修「换过路由后、宿主还没重启时的过渡窗口」:面板不再显示「读取失败:HTTP 404」。

为什么会 404

26.10.1-4 把接口路由从 /dev-rules/* 换成了 /agent-rules/*,而两半换代码的时机不同:

  • 浏览器半体在页面加载时就换成新的(开始请求 /agent-rules/*);
  • 宿主半体是 profile 启动时读进内存的,要等重启 profile 才换掉(还在 /dev-rules 应答)。

于是从「插件更新完」到「重启 profile」之间,面板必然一片 404。这不是用户该自己扛的事——重启之前面板完全不可用。

现在怎么处理

新路由 404 时,用旧路由再问一次,旧路由答得上来就切过去并记住。判定收得很紧:

  • 只有「新路由 404 且旧路由答得上来」才回退 —— 路径写错、接口真没了这类 404 不会被误判成「宿主是旧版本」而悄悄换路;403 / 500 照旧原样上报。
  • 已经在旧路由上时不重复请求。

顺带修掉的两个坑(都有用例)

  1. 第一版把「要不要记住切换」和「要不要采用这次重试结果」混成一句判断,并发下(一个请求先把路由切走、另一个的重试随后成功)后者会拿着自己那份 404 继续报错。
  2. 第二版按「当前路由是否已是旧路由」判断,用例当场揪出来它还是错的:并发时这一发是切换之前发出去的。最终依据是这次实际请求的 URL。

验证

在沙箱里把宿主半体换成上一版(只认 /dev-rules)、磁盘上的客户端保持新版,复现出与受影响 GUI 一模一样的状态,录下的请求序列显示两个请求都先 404、随后都退回旧路由拿到 200,面板正常渲染。宿主换回新版重启后,正常路径只请求 /agent-rules/*。

其实宿主重启后这条回退就用不上了——留着它是为了「路由改名」这个动作以后不再制造一段不可用的窗口。

测试

node --test:55 个用例(新增路由回退与并发回归两条)。

v26.10.1-4

Choose a tag to compare

@Wraindrock Wraindrock released this 01 Oct 14:56

把更名做彻底,并让以后的维护/改名变成一件有机器守着的事。清单 version 与本标题、标签同一串:26.10.1-4。

这一版换掉的

层 旧 新
面板接口路由 /dev-rules/* /agent-rules/*
系统提示 section plugin:dev-rules plugin:agent-rules
提示变量 dev_rules_body agent_rules_body
右侧栏页签实现 id / kind dev-rules:panel / dev-rules dsh-agent-rules / agent-rules
样式前缀与设计变量 dr_* / --dr-* ar_* / --ar-*

已开着的页签不会变成孤儿

页签的 kind 是会被持久化的(存在 dsh.sidebar-right.v1.<session>),改名后升级前正开着面板的用户会看到一句「这类内容还没有可用的查看方式」。契约里往页面列表加条目的是 guide,所以补了一份不带 guide 的兼容注册:旧页签照常渲染,页面列表仍然只有一行。实测我的持久化记录里就是旧 kind,重启后页签直接恢复。

维护:npm run check:identity

名字只有一处出处 —— package.json 的 name,slug 由它派生。自检会把 patch 的 name、客户端注册 id、PACKAGE_NAME、页签 id、路由、section、提示变量、数据文件名、页签 kind 逐个对一遍(客户端注册 id 与包名不一致时,界面启动即报「Failed to load plugins」而宿主接口一切正常——只 curl 接口的自检抓不到),并守住两件事:

  • 旧名字不许再出现:允许留下的 11 处例外连理由一起写在脚本的 ALLOWED 里。
  • Gitee 镜像地址必须仍是 dev-rules:镜像没随更名改动。写这条守卫时我自己就误伤过一次——全局替换把文档里那条国内安装路径也改成了新名字,本地测试全绿、发现不了。

改名=三步:改 package.json 的 name → 改两个 lib 里 LEGACY_* 那几行说明 → 跑 npm run check:identity 看还差哪里。反向验证过它抓得住三类错:客户端注册 id 与包名不一致、代码里混进旧名字、Gitee 地址被误改。

测试

node --test:53 个用例(新增身份自检那条;CI 在 node 20 / 22 / 24 上跑语法检查 + 全部用例)。沙箱内实测:新路由 200、旧路由 404、页面列表条目数仍为 1、持久化的旧 kind 页签正常恢复、样式无走样。

v26.10.1-3

Choose a tag to compare

@Wraindrock Wraindrock released this 01 Oct 14:48

更名版:dsh-dev-rules → dsh-agent-rules。清单 version 与本标题、标签同一串:26.10.1-3。

改了什么

层 旧 新
npm 包名 / 插件身份 dsh-dev-rules dsh-agent-rules
GitHub 仓库 Grant-Felix/dev-rules Grant-Felix/dsh-agent-rules(旧地址自动跳转)
模型工具 dev_rules agent_rules
数据文件 $DSH_HOME/dev-rules.json $DSH_HOME/agent-rules.json

数据文件自动迁移

启动时若新名字的文件不存在、而旧的 dev-rules.json 还在,会把旧文件复制一份到新名字下(不是改名 —— 回退到旧版本插件时原文件还得读得到)。面板「更多 → 文件位置」会提示这一次迁移;确认新文件正常后,旧的 dev-rules.json 可以自行删除。

不做迁移的后果很具体:第一次保存会以新文件为基准写出一个只含新改动的文档,攒下来的规则会被留在旧文件里,界面上再也看不到。

故意没改

  • 路由前缀 /dev-rules/*、系统提示 section 名 plugin:dev-rules、提示变量 dev_rules_body —— 纯内部契约,改了没收益。
  • 右侧栏页签的 id / kind 仍是 dev-rules:panel / dev-rules。DSH 把「右侧栏开着哪些页签」持久化在 localStorage,存的正是这个 kind;跟着改名会让已经开着的那个页签变成孤儿(正文挂不上,只剩「这类内容还没有可用的查看方式」)。这是实测踩到的坑,内部标识不值得拿用户的现有页签换。
  • 面板里的中文名仍是「开发规则」(功能名,不是项目名)。

升级提醒

  • 装了旧包名的 profile:dsh plugin --profile web remove dsh-dev-rules 然后 dsh plugin --profile web add github:Grant-Felix/dsh-agent-rules,重启。改成新名字之后 profile 里不能再留着旧条目(会同时装两份)。
  • publish.yml 里 npm trusted publisher 的 Repository 字段现在是 dsh-agent-rules:仓库改名后要在 npmjs.com 上同步改,否则 OIDC 交换会被拒。
  • Gitee 镜像这次没动,仍是 gitee.com/Grant-Felix/dev-rules。

测试

node --test:52 个用例(新增「更名迁移」,并确认它在去掉迁移调用后确实失败)。CI 在 node 20 / 22 / 24 上跑语法检查 + 全部用例。

v26.10.1-2

Choose a tag to compare

@Wraindrock Wraindrock released this 01 Oct 14:32

注入文本改两级标题 + 面板改 3+N 个页签与两列式规则卡。清单 version 与本标题、标签同一串:26.10.1-2(2026-10-01 当天第 2 个版本)。

注入到会话的文本:两级标题

第一级是「全局 / 哪个项目」,第二级才是你的分组:

## 全局规则
### 提交
1. **提交前跑测试**
   npm test 必须绿

## 项目:示例项目(~/项目/foo)
### 依赖
2. **本项目用 pnpm**
   禁止 npm install
  • 第一级写具体项目名(别名 + 路径);原来单占的「适用项目 / 规则来源」两行删掉 —— 标题本身已说清来源。
  • 覆盖模式下不再出现 ## 全局规则 那一段,改为在项目标题下写明挡掉了多少条全局规则。
  • 未命中项目时仍明确写「当前目录未匹配到项目规则集,以下为全局规则」。

面板:3 + N 个页签

全局规则 / 项目(名册)/ 每个项目一页 / 效果预览。项目一多,原先把所有项目挤在同一个页签里就得在几张大卡片之间反复找;现在页签栏本身就是第一序列的目录。页签条横向滚动,不折行。

「项目」页只管每个项目的身份(目录 / 别名 / 与全局的关系 / 启用 / 删除),同一个字段只有一处可改;新建项目后自动跳到它的规则页。

面板:规则卡按分组归拢 + 两列式

  • 卡片按用户分组分块显示(组名 + 条数),顺序与注入文本同一套(组名第一次出现的位置)。此前两边顺序不一致:面板按数组顺序、注入按分组归并。
  • 两列式网格:单张卡片窄下来,同一段文字的横向跨度短了。栏宽够(内容盒 ≥ 520px)才两列,窄栏自动退成单列。
  • 上移下移改为只在本组内换位;跨组做不到,就在组边界禁用按钮。

面板:卡片系统与排版统一

规则卡 / 项目卡 / 空态 / 上手块 / 身份栏 / 横幅共用同一组形状变量(圆角、描边、底色、内边距),差异只用描边样式与颜色表达(例如停用=虚线 + 「已停用」标签)。另修两处观感问题:吸顶条上方 12px 的缝(滚动内容会在它上面露出半行字),等宽预览块限宽 84ch。token 回退值改为中性灰,暗色下不会漏浅色。

测试

node --test:51 个用例(原 47)。CI 在 node 20 / 22 / 24 上跑语法检查 + 全部用例。沙箱内亮 / 暗 × 宽(两列)/ 窄(单列)逐屏核验。

已知未修(沿用上一版清单)

同一 revision 的并发保存会互相覆盖;超过 300 条规则被静默丢弃;Markdown 备份往返三处缺陷;方法不匹配回 404 而非 405;截断可能落在代理对中间。另:组的先后目前只能由「组名第一次出现的位置」决定,面板不提供直接调整组顺序的控件。

v26.10.1-1

Choose a tag to compare

@Wraindrock Wraindrock released this 01 Oct 14:06

面板视觉重排 + 宿主三处修复。清单 version 与本标题、标签同一串:26.10.1-1(2026-10-01 当天第 1 个版本)。

面板(浏览器半体 lib/client.js)

  • 修掉一个把项目卡片撑坏的布局缺陷:列式字段里的 flex-basis 会被当成高度用 —— 项目卡片的「项目目录」「别名」输入框一度是 200px / 120px 高的空盒子(字段块 244px),现在 31px / 74px;.dr_field 作为项目卡片子元素时的第二层同样收口。
  • 卡片从「卡片 + 标题框 + 正文框 + 分组框」四层描边,收敛成「标题与分组读起来是文字、正文一个框」,hover / 聚焦才浮出可编辑形状。
  • 停用规则不再整卡压暗(那会把用来重新启用的「生效」勾选框一起变淡),改为虚线边 + 「已停用」标签 + 只把正文变灰。
  • 删掉重复控件:底部第二个「保存并生效」、空面板里第二处「插入示例」、顶部与「更多」重复的导出入口;搜索 / 分组筛选只在两个规则页签出现(「效果预览」不吃筛选)。
  • 颜色全量走 --dsw-alias-* 主题 token,亮 / 暗两套主题逐屏核验。

宿主(lib/index.js)

  • 假 409:插件自己写盘触发的目录事件不再推高 revision。此前「保存成功后再保存一次」必被拦成「别处改过磁盘上的规则」,而磁盘上没人动过;真冲突检测不受影响(外部真改了内容再存,409 横幅照旧)。
  • 请求体按 UTF-8 逐块解码:多字节字符被 TCP 分段切开时不再在规则正文里写出 U+FFFD。
  • 畸形 JSON 体返回 400(此前 500)。

测试

node --test:47 个用例(原 42)。CI 在 node 20 / 22 / 24 上跑语法检查 + 全部用例。

已知未修(下一轮)

同一 revision 的并发保存会互相覆盖(版本校验与写盘非原子);超过 300 条规则被静默丢弃而工具仍回 ok:true;Markdown 备份往返三处缺陷(正文里的列表行被当成新条目、enabled:false 丢失、同路径项目条目合并时丢规则);方法不匹配回 404 而非 405;截断可能落在代理对中间。