Repository navigation
Releases: daha1216/dsh-update-checker
Release list
v0.7.3 — 一键更新真的会新建对话了
一键更新真的会新建对话了
在 0.2.1-rc.3 宿主上,点「一键更新」现在会:新建(或复用)一个对话 → 把更新清单填进它的输入框 → 不发送,等你按发送。
之前为什么点了没反应
宿主的 startSession() 在建会话时会复用已有的空白会话。插件原先自己调 startSession(),然后等「主会话绑定换到另一个 session」再填草稿——复用的情况下绑定根本不会变,这个等待永远不成立;10 秒后提示词被丢进剪贴板,而面板在点击瞬间就关闭了,于是看起来就是「什么都没发生」。
修法
rc.3 的 startSession(workspaceId, options) 原生支持草稿:插件把 { prompt, whenDraftExists: 'replace' } 交给它,宿主在建好会话后自己把文本填进输入框(内部走 conversation.input.requestDraftInitialization)。一次调用完成「新建 + 预填 + 不发送」,也不再有绑定轮询、定时器和时序假设。宿主侧失败会走它自己的通知通道,不再静默。
whenDraftExists: 'replace' 保证一次点击一个结果:不管会话是新建的还是复用的空白会话,点完输入框里就是那份清单。
对忽略选项参数的旧宿主,保留原来的自填路径,并补了 500 毫秒宽限期:绑定没变(说明复用了空白会话)就填当前输入框,不再空等 10 秒。
测试
test/batch-update.test.mjs 增至 54 项断言(+11),新增:走原生草稿接口、传给宿主的参数与 whenDraftExists 正确、原生路径不直接写 composer、复用空白会话时草稿落到当前会话、两条路径都不提交。
11 个套件全绿:checker 69 / http 28 / integration 30 / md 33 / render-harness 23 / lifecycle 5 / reminder 77 / reminder-panel 16 / host 19 / batch-update 54 / scheduler 35。
生效方式
客户端 bundle 由宿主按需从磁盘读取,刷新页面即可(Ctrl+Shift+R 更稳妥),不用重启桌面端。
更新
dsh plugin --profile desktop add github:daha1216/dsh-update-checkerv0.7.2 — 安全与健壮性巡检修复 + npm CDN 备用源
安全与健壮性巡检修复
- 宿主不再被一次断连打崩:
node:http→ fetch 桥的全部异步路径收敛进 try/catch/finally;客户端中途断开时取消响应体,500 只回update check failed,不把内部错误文本或绝对路径带回渲染层。 - loopback 栅栏改为解析 Host:
127.0.0.1:56185@evil.example这类 userinfo 前缀不再被当作回环,IPv6[::1]:56185恢复正常。 check.run强制刷新加 30 秒下限,避免连点烧掉 GitHub 匿名配额。- 输入边界收紧:profile
package.json非法 JSON 显式失败;依赖名按 npm 形状校验;packument 名称统一编码;主 registry 404 不再回源 npmmirror(避免泄露私有包名)。 - 版本判定修正:超过 2^53 的版本段按字符串比较;
1/1.2视为范围;#semver:^1.2.0按范围选最高满足 tag;git+ssh/ssh:///git:///scp形式恢复识别。 - 进程级内存与文件卫生:HTTP 响应缓存加 400 条上限;配置/状态/快照以 0700/0600 写入;配置写失败不再回报「保存成功」。
npm 元数据 CDN 备用源
TLS 中间人环境下(证书不被 Node 信任)两个 registry 全部 UNABLE_TO_VERIFY_LEAF_SIGNATURE 时,回退到 unpkg / jsDelivr 读取 package.json 的 version。
- registry 明确 404 时不向第三方主机回源,私有包名不会被二次泄露;
- 传输层失败的主机熔断 60 秒(实测一轮请求 40 → 24,耗时 5.4s);
- 非法包名不拼进 CDN URL;scoped 名保留
@scope/斜杠。
无新增运行时依赖,正常网络下不产生 CDN 流量。验证:npm test 11 套件 / 362 断言全绿,npm run test:e2e 17/17。
v0.7.1 — 侧栏入口不再挤掉同行插件
侧栏入口不再被同行插件挤掉
这一版只修一个具体问题:侧栏底部是多个插件共用的 flex 行,本插件写死 width: 100% 加 flex: none。同一行只要还有别的入口——比如「破甲」的状态点——空间就被全额占走,对方被压成几像素宽的灰点,基本看不见。
改了什么
.dsh-uc-reminder 从 width: 100%; flex: none 改成 flex: 1 1 0%; min-width: 0:有空间就铺开,没空间就自己收,标题过长交给既有的省略号。
折叠态(只剩图标那条 36px 轨道)显式写了 flex: 0 0 36px,宽度与改动前完全一致。原来它靠父容器的 width: 36px 覆盖兜底,现在基础规则变成可伸缩了,得自己钉死,否则图标会被拉满一行。
没改什么
后端、状态机、存储格式、检查逻辑全都没动。改动是一个 8 行的 CSS diff,加两段注释说明为什么不能写死宽度。
测试
十个套件全绿:checker 38 / http 19 / integration 24 / md 23 / render-harness / lifecycle 5 / reminder 57 / reminder-panel 16 / batch-update 43 / scheduler 33。
顺手把英文 README 的测试矩阵补齐了——它还停在只有八个套件的时候,integration 写 21、reminder 写 56,与实际的断言数对不上;现在中英两份一致。
生效方式
客户端 CSS,刷新页面即可,不用重启宿主。
安装 / 更新
dsh plugin --profile desktop add github:daha1216/dsh-update-checkerv0.7.0 — 设置页改为更新优先、设置收起
设置页重做:把「更新」推上前,把「设置」折起来
这一版只改设置页的呈现,不动检查逻辑。原来的问题是:后台提醒那张卡片占了首屏最贵的位置,而它一个月也未必改一次;插件行里塞着完整介绍和安装 spec,一屏看不下几个插件。
改了什么
后台提醒收成一行。 开关、状态、频率并排:自动检查 · 已开启 · 每 2 小时。频率选择器、说明文字、保存失败的错误都进「设置」展开区。只看不改的人一眼扫完。
插件行瘦身。 名称、状态、版本合到同一行,介绍默认只留一行(悬停看全文,展开看完整),安装 spec 和发行说明移进展开区。原来一行占 130px 上下,现在 90px 左右。
状态和来源拆成两个筛选。 安装来源(npm / GitHub / 本地)从状态 Chips 里拿出来,做独立下拉框,只列出你实际装了的来源。原来「本地」和「有更新」挤在一排,读起来像互斥选项——可本地检出恰恰也可能落后上游,这两件事本来就不同维度。
按钮说人话。 「一键更新」下面常驻一行「新建对话并填入更新清单,由你发送」,不再只藏在悬停提示里。
顺带修的两处口径不一致
local-behind 行补上更新按钮。 本地安装(file: / link:)且上游有新版的插件,会进「有更新」筛选,也会进批量清单,但行内没有「让 AI 更新」按钮——同一个「可更新」概念,两处判定不同。现在行内按钮和批量清单共用 isActionable。
健康状态安静下来。 「已是最新」这类正常状态从绿色改成中性色,红色只留给真正失败的检查行。一屏里需要处理的才显眼。
测试
九个套件全绿,共 258 项断言:checker 38 / http 19 / integration 24 / md 23 / render-harness / lifecycle 5 / reminder 57 / reminder-panel 16 / batch-update 43 / scheduler 33。
test/render-harness.mjs 的状态种子随新增的 sourceFilter / expanded 更新,行内按钮断言从「锁 status=update」改成锁 isActionable 判定。
截图
README 里两张图都是重新渲染的——旧图还停在改版前的界面。
生效方式
客户端 bundle 由宿主按需从磁盘读取,刷新页面即可,不用重启。
安装 / 更新
dsh plugin --profile desktop add github:daha1216/dsh-update-checkerv0.6.0 — 一键更新改为新建对话、只填不发
一键更新改为「新建对话、只填不发」
v0.5.0 的「一键更新」点一下就把整份清单塞进当前会话并直接发送,等于替你按了发送键。这个版本改成:新建一个对话,把清单填进它的输入框,不发送——发不发、什么时候发,由你决定。
行为
- 点「一键更新」→ 侧边栏切到一个新对话,输入框里已经填好整份更新清单,光标在末尾,等你按发送。
- 草稿填的是新会话的输入框,不会污染你正在进行的那个对话。
- 新会话的 composer 是异步挂载的,插件会等它真正就绪再填(最长 10 秒);等待期间不会退而填到旧会话——填错地方比不填更糟。
- 降级链:新会话创建失败 → 填当前输入框;连输入框都没有 → 复制到剪贴板并提示。
清单内容(与 v0.5.0 一致)
帮我更新这些检测到新版本的 DSH 插件,逐个更新,完成后告诉我每个插件的结果。
profile:desktop,插件装在该 profile 下。
1. dsh-pocket 3.0.1 → v3.0.2(file:C:/csh/dsh-pocket-pure)
2. dsh-retrace 0.4.55 → v0.4.77(github:daha1216/dsh-retrace)
安装来源那一项是刻意保留的:file: / link: 是本地检出,AI 得去对应目录拉取;github: / npm 才是重新 add。少了这条信息,AI 很容易对着本地目录空跑一遍。
实现
新增 draftInNewSession(ctx, text):调 uiWorkspace.startSession() 新建会话,订阅 uiSession.adapter.current,等主绑定切到一个不同的 session 且它的 inputActions 就绪后再 setDraft。原有的 sendComposerText(setDraft + submit)整个移除——批量路径现在没有任何地方能碰到 submit。
测试
test/batch-update.test.mjs 重写为 43 项断言,新增的回归覆盖:会调用 startSession、草稿不落到旧会话、新会话无 composer 时不乱填、无 workspace 服务时回退当前输入框、批量路径绝不调用 submit、旧 API 已彻底移除。
九个套件全绿:checker 38 / http 19 / integration 24 / md 23 / render-harness 5 / lifecycle 5 / reminder 57 / reminder-panel 16 / batch-update 43 / scheduler 33。
生效方式
客户端 bundle 由宿主按需从磁盘读取,刷新页面即可,不用重启。
安装 / 更新
dsh plugin --profile desktop add github:daha1216/dsh-update-checkerv0.5.0 — 一键更新:把待更新清单交给 AI
一键更新:把整份待更新清单交给 AI
检测到多个插件可更新时,气泡底部与设置页头部现在都有「一键更新」按钮。点一下,插件把整份清单整理成一条提示词并直接发送给当前会话的 AI,由它逐个执行更新。
清单不是只列名字,而是带上 AI 执行需要的信息:
帮我更新这些检测到新版本的 DSH 插件,逐个更新,完成后告诉我每个插件的结果。
profile:desktop,插件装在该 profile 下。
1. dsh-pocket 3.0.1 → v3.0.2(file:C:/csh/dsh-pocket-pure)
2. dsh-watcher 0.7.0 → v0.7.1(file:D:/dsh work/dsh-watcher)
3. billion-context 0.1.206 → 0.1.207(^0.1.206)
安装来源(file: / link: / github: / npm 版本范围)是关键:npm 与 GitHub 安装的插件要重新 add,而 file: / link: 是本地检出,得去对应目录拉取,AI 需要这个信息才不会装错。
行为细节
- 一键更新会发送,单行按钮只填不发送:设置页每行的「让 AI 更新」仍然只把提示词填进输入框(你保留发送权);批量「一键更新」是明确的一次性动作,填好即发。
- 降级链:宿主没有
submit通道时只填草稿并提示「按发送即可」;没有打开的会话时回退复制到剪贴板并提示。 - 设置页按钮带数量:「一键更新 (3)」;没有可更新项时不显示,点了也只提示「当前没有可更新的插件」。
- 覆盖范围:
update(npm / GitHub 安装)与local-behind(本地安装但上游有新版)都算可更新,与角标提醒的口径一致。
实现
buildBatchPrompt负责拼装,sendComposerText复用宿主的inputActions(setDraft+submit)真正发送。reminder.state载荷新增profileDir,面板因此也能拼出 profile 名。- 新增
test/batch-update.test.mjs:39 条断言,覆盖可更新判定、提示词内容(含 spec 与 profile 名、缺失版本降级为?)、发送降级链(sent / draft / clipboard / none)、中英 i18n 键齐备、两个入口的接线。
验证
九个套件全部通过:checker 38、http 19、integration 24、md 23、render-harness 5、lifecycle 5、reminder 57、reminder-panel 16、batch-update 39、scheduler 33。
安装 / 更新
dsh plugin --profile web add github:daha1216/dsh-update-checker客户端 bundle 由宿主按需从磁盘读取,刷新页面即可生效,无需重启。
v0.4.3 — 立即检查按钮每次点击都有反应
立即检查按钮每次点击都有反应
- 手动点击不再被 90 秒新鲜窗口吞掉:弹层与设置页的「立即检查」都带
force: true,连点也会真的重新扫描,不会静默复用缓存。 - 检查中有反馈:按钮显示已用秒数(
检查中… 3s),结束后状态行提示「刚刚已检查」或「上次检查:x 分钟前」;失败与超时各有独立文案,不再只留一个转圈。 - busy 一定复位:原先
reload抛错会让按钮永久卡在禁用态,现在异常路径也复位,并加 90 秒看门狗兜底。
测试基础设施(社区贡献 + 维护者补充)
test/md.test.mjs去掉作者本机绝对路径(file:///D:/dsh work/...),改用import.meta.url相对解析;cordis 路径解析抽到test/cordis-path.mjs,支持DSH_CORDIS_PATH→ 模块解析 → 显式 SKIP 三级降级,拿不到 cordis 时打印明确提示而不是静默 exit 0。(感谢 @qiao-obs,#4)@deepseek-ai/cordis加为 devDependency:该仓库此前没有任何 dependencies,全新克隆npm install后 lifecycle 与 reminder-scheduler 两个套件才能真正执行(否则一直是 SKIP)。- 新增
test/reminder-panel.test.mjs(16 项断言)覆盖立即检查按钮的 busy/超时/秒数/状态行语义,并接入npm test。
验证
npm test 九个套件全绿:checker 38 断言、http 19、integration 24、md 23、render-harness、lifecycle 5/5、reminder 57、reminder-panel 16、reminder-scheduler 33。
安装 / 更新
dsh plugin --profile web add github:daha1216/dsh-update-checkerv0.4.2
变更
- 声明 DSH 兼容范围:
package.json新增engines.dsh: ^0.2.0-rc.1(即 DSH 0.2.0-rc.1 及以上、0.3.0 之前)。此前本插件只有@deepseek-ai/cordis的 peer 依赖,没有 dsh 相关要求,DSH 的兼容门禁根本不会校验它——装到旧版宿主上不会被拒绝,只会在运行时出问题。 - 现在宿主版本不匹配时,插件管理器会以
incompatible-version明确拒绝安装;确实要在别的版本上试,可用dsh plugin allow-version加一次性豁免。DSH 升到 0.3.x 后需要本插件发新版放开范围。 README.md/README.en.md同步补了这段兼容性说明。
本次没有功能代码改动,从 v0.4.1 升级不需要调整任何配置。
安装 / 更新
dsh plugin --profile web add github:daha1216/dsh-update-checker装完完全退出并重启 DSH 桌面端,再刷新一次 GUI 页面。更新巡检器自身同样是重跑这条 add 命令。
v0.4.1 — 无 ref 的 GitHub 安装按最新 tag 判更新
本次修复
无 ref 的 GitHub 安装不再漏判更新(16447a1)
以 github:owner/repo 形式安装的插件,之前拿不到可比较的 ref,巡检时会被当成「无法判断」而漏掉;现在改为按「已装版本 vs 上游最新 tag」比较,落后即判定有更新。
改动落在 lib/checker.js(+15/-5),并补了 test/integration.test.mjs 三条用例;README 同步说明了这一判定规则。
安装 / 更新
dsh plugin --profile desktop add github:daha1216/dsh-update-checker更新到新版本:dsh plugin --profile desktop update github:daha1216/dsh-update-checker --latest -w