Repository navigation
Releases
v26.10.5-1
仓库与插件包名从 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,旧地址自动重定向。
升级要做的两步
- 依赖键跟着换(否则 profile 里会同时留着两代、bundle 阵容里还挂着旧包名):
dsh plugin --profile web remove dsh-agent-rules dsh plugin --profile web add github:Grant-Felix/dsh-ian-rules - 重启 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
修「换过路由后、宿主还没重启时的过渡窗口」:面板不再显示「读取失败:HTTP 404」。
为什么会 404
26.10.1-4 把接口路由从 /dev-rules/* 换成了 /agent-rules/*,而两半换代码的时机不同:
- 浏览器半体在页面加载时就换成新的(开始请求
/agent-rules/*); - 宿主半体是 profile 启动时读进内存的,要等重启 profile 才换掉(还在
/dev-rules应答)。
于是从「插件更新完」到「重启 profile」之间,面板必然一片 404。这不是用户该自己扛的事——重启之前面板完全不可用。
现在怎么处理
新路由 404 时,用旧路由再问一次,旧路由答得上来就切过去并记住。判定收得很紧:
- 只有「新路由 404 且旧路由答得上来」才回退 —— 路径写错、接口真没了这类 404 不会被误判成「宿主是旧版本」而悄悄换路;403 / 500 照旧原样上报。
- 已经在旧路由上时不重复请求。
顺带修掉的两个坑(都有用例)
- 第一版把「要不要记住切换」和「要不要采用这次重试结果」混成一句判断,并发下(一个请求先把路由切走、另一个的重试随后成功)后者会拿着自己那份 404 继续报错。
- 第二版按「当前路由是否已是旧路由」判断,用例当场揪出来它还是错的:并发时这一发是切换之前发出去的。最终依据是这次实际请求的 URL。
验证
在沙箱里把宿主半体换成上一版(只认 /dev-rules)、磁盘上的客户端保持新版,复现出与受影响 GUI 一模一样的状态,录下的请求序列显示两个请求都先 404、随后都退回旧路由拿到 200,面板正常渲染。宿主换回新版重启后,正常路径只请求 /agent-rules/*。
其实宿主重启后这条回退就用不上了——留着它是为了「路由改名」这个动作以后不再制造一段不可用的窗口。
测试
node --test:55 个用例(新增路由回退与并发回归两条)。
v26.10.1-4
把更名做彻底,并让以后的维护/改名变成一件有机器守着的事。清单 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
更名版: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
注入文本改两级标题 + 面板改 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
面板视觉重排 + 宿主三处修复。清单 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;截断可能落在代理对中间。