Releases: sperictao/dsh-pro-max
Release list
v0.6.0
v0.6.0
插件市场结构性升级:Plugins 页拆分「发现 / 已安装」二级导航(发现为默认页),已安装页与发现页同一卡片观感,并支持插件更新检测、单插件更新与一键全部更新。同版交付企业治理增强(市场目录镜像、内置插件 tarball 装机完整性复核)与主页一键重启。
Changes
- 市场二级导航:点击 Plugins 后在顶部导航下方显示「发现 / 已安装」二级导航,发现(目录浏览)为默认页;已装列表从发现页内联区块收敛为独立整页,两页共用同一卡片骨架,目录能匹配上的已装插件透传描述/分类/星标/链接
- 插件更新检测:npm 形态安装的非受管插件自动比对 npm registry latest——进入市场页即检测,已安装页可手动重跑;spec 能解析出具体版本(
pkg@1.2.3、npm:pkg@1.0.0、裸版本)才参与,范围 spec(^ ~)与github:/file:等协议形态如实不可检;部分包查询失败不放大为整体失败,全部可检包都失败才报错 - 插件更新:有新版本的插件显示「更新」按钮与
v当前 → v最新;更新 = 以name@latest重装,与一键安装同一 dsh 闸门、插件策略白名单、审计台账与构建脚本审批流;「全部更新(N)」顺序执行(共享同一 profile,pnpm 并发会争锁),结束汇总,中途撞上审批挂起即停 - 市场目录镜像(企业):设置页新增「插件目录源」,可指向返回同一 plugins.json 契约的内网镜像;留空 = 内置官方源;非空必须显式带
https:///http:// - 内置插件完整性复核(企业):构建链为两个内置授权插件 tarball 产出 sha256 摘要并随安装包分发;装机后每次使用前复核,校验和文件缺失或摘要不符一律拒绝启用(fail closed,无绕过出口)
- 一键重启 dsh web:主页新增重启按钮(服务运行中可用);先关后启并沿用当前访问模式,关闭失败即中止重启,不在未知状态上强行拉起
- README 勘误:目录源名称对齐 awesome-dsh-plugin.com curated 目录(2700+ 插件)
- e2e smoke 修复:补齐
market_snapshot未 mock 导致 plugins 步骤中断的既有断裂,断言对齐二级导航后的页面结构
验证
cargo test:77 项全部通过(含 spec 版本解析、registry 响应解析、策略合并、校验和复核等新增测试)cargo clippy --all-targets:无告警vitest:41 项全部通过(含二级导航、更新检测、单更新与全部更新用例)pnpm run test:e2e:9 步全部通过pnpm run check:release -- --tag v0.6.0:版本三处一致、release notes 存在、bundle resources 路径有效
升级说明
- 无破坏性变更与配置迁移:
market_catalog_url默认为空即官方源,行为与上一版一致 - 已装插件中
github:/file:形态的条目不出更新按钮(来源不是 npm registry),列表管理与移除照常可用 - 首次从旧版升级后,内置授权插件在首次修复/安装时即走校验和复核;正常分发的安装包不受影响
v0.5.6
v0.5.6
修复插件市场一键安装在 pnpm 12 预发布环境下必然 404 的问题。市场目录给出的安装标识是 npm:包名 形态(如 npm:dsh-context),此前原样传给 dsh plugin add 裸转发给 pnpm;pnpm 12(next 线)新增的 package-manager add 特性把裸 npm: 前缀的 spec 走"记录包管理器"分支,将 npm:dsh-context 整体当包名查询 registry(registry.npmjs.org/npm%3Adsh-context),报 ERR_PNPM_PACKAGE_MANAGER_ADD_RESOLVE_LATEST 404。版本矩阵实测:pnpm 9.15–11.25 全部正常,12.2.1 复现。
Changes
- 安装 specifier 投影层规范化:目录解析时剥掉 npm registry spec 开头的
npm:前缀(npm:dsh-context→dsh-context,npm:@scope/pkg@1.0→@scope/pkg@1.0),与目录自身展示的 command 文本一致;pnpm 9–12 全版本等价 - 非 npm 协议不受影响:
github:owner/repo#ref、file:tarball 原样保留;只剥开头前缀,alias 形态(name@npm:other)不动 - 新增投影规范化测试:无版本、带版本、scope 包、github:、裸名五种形态
验证
cargo test:61 项全部通过(含新增规范化测试)cargo clippy --all-targets:无告警vitest:25 项全部通过pnpm run check:release -- --tag v0.5.6:版本三处一致、release notes 存在、bundle resources 路径有效
升级说明
- 已装插件不受影响:profile 依赖里旧时代留下的
npm:形态值按原样展示与工作;仅新安装路径使用规范化后的裸名 - 遇到本问题的环境无需降级 pnpm:升级 Launcher 到本版即可;临时规避也可
npm i -g pnpm@latest降到 11 稳定线
v0.5.5
v0.5.5
修复本地一键启动在重启场景下必然 401 的死 token 问题。dsh-web.log 只追加不轮转,旧实例的 token 行会一直留在文件里,而 dsh web 每次重启都换 launch token;原实现对全量日志取最后一条 ?token= 行、找到即返回,点击时 web 已在跑(走重启路径)就会把上一实例的死 token 交给浏览器,新实例数秒后才打印自己的 token 行——401 必现。Windows 等无授权插件的原生 token 鉴权环境直接暴露,macOS 开发机因 web profile 装有授权插件、鉴权被整个旁路而死 token 也放行,问题被掩盖。
Changes
- token 解析绑定本次启动:
dsh_start_web在 spawn/restart 动作前记录日志字节锚点,解析只看锚点之后追加的区域(fresh_log_region)——重启后只认本次实例自己打印的 token 行,旧实例的死行永远进不了候选 - 兜底回退保持不变:新区域始终无 token 行(如 web 由外部手工启动、token 只落在终端)仍回退裸地址;锚点越界(日志被清空/轮转)按空区域处理,不再交出来历不明的旧行
- 重试窗口 10→20×500ms:打印与端口就绪先后无保证,加长窗口减少无谓的裸地址回退;拿到 token 行立即返回,正常路径无额外等待
- 新增区域绑定单元测试:新区域无 token 行时返回空、本次打印后只认新 token、锚点越界与多字节字符中间两个安全兜底
验证
cargo test:60 项全部通过(含新增区域绑定测试)cargo clippy --all-targets:无告警vitest:25 项全部通过pnpm run check:release -- --tag v0.5.5:版本三处一致、release notes 存在、bundle resources 路径有效
已知边界
- dsh 检测的
local_url(集成卡 Open/复制按钮)无启动锚点,web 被外部手段重启后仍可能给出死 token,后续以探测裁决或 dsh 侧查询端点解决 - 连续多次点击一键启动无并发互斥,互相顶掉刚拉起的实例(日志中 EADDRINUSE 假失败),后续单独处理
v0.5.4
v0.5.4
本地访问模式改走 dsh 原生 token 访问。实测 dsh 0.1.2 线上,无授权插件的 web 以原生 launch token 鉴权(裸请求 401),启动时把带 token 的地址打印进 dsh-web.log;一键启动改为解析该地址交给浏览器打开——换取 30 天持久 cookie 后即进入 dsh 原生会话。本地模式从此不依赖授权插件,"卸载授权插件"回归纯本地可用形态。
Changes
- 本地一键启动原生 token 访问:
dsh_start_web启动成功后从日志解析最后一次打印的?token=地址返回,前端直接打开;解析不到(web 由外部手工启动、日志被清)回退裸地址,由 dsh 自身的 401 页提示。新增日志解析单元测试(多轮启动取最后一条、无 token 行不匹配) - 本机地址与插件栈解耦:dsh 检测的
local_url在 web 运行中即可用(优先 token 地址),不再以授权插件安装为前置;集成卡地址行 Open/复制即用 - 纯本地形态回归一等公民:卸载授权插件后本地访问照常工作(走原生 token),远程授权链路如实停在「插件未安装」
- AGENTS.md 设计理念补充裁决规则:需求中的明确约束(如"本地模式无需安装授权插件")是硬边界,与上游行为冲突时在约束内寻找原生机制,不得擅自放宽
验证
cargo test:59 项全部通过(含新增 token 日志解析测试)vitest:25 项全部通过- 端到端实测:无插件启动 → 日志解析 token URL → 303 换取持久 cookie → 带 cookie 200、裸请求 401
pnpm run check:release -- --tag v0.5.4:版本三处一致、release notes 存在、bundle resources 路径有效
v0.5.3
v0.5.3
修复 v0.5.2 跟线 dsh 0.1.2-alpha.2 后的探测与验证路径:上游 0.1.2 改了 RPC 方法命名与 WebSocket 端点,旧路径会导致一键启动验证全部失败。vendored 授权插件同步跟线适配。
Changes
- 适配 dsh 0.1.2 Connection 合约:
dsh-client-connection-authzbump 至1192947(上游提交 "fix: 适配 dsh 0.1.2 Connection 合约");submodule 指针、构建脚本 pin 校验、tauri.conf.jsonbundle resources 三处同步 - RPC 探测路径更新:
settings.describe→settings/describe、llm.providers→llm/listProviders;RPC body 补payload.args空对象以符合新合约 - WebSocket 探测端点更新:
/api/events.host→/api/remote.mux(本地与经代理两条探测路径同步;路径提取为REMOTE_WS_PATH单一来源) - 修复 WS_PROBE_JS 语法错误:脚本模板中误混入的
pub(crate)前缀已清理,并新增「脚本必须可被 Node 解析」的测试防止回归 - 验证失败列表逐行展示:一键启动失败原因改为按行分隔,不再把 URL 与下一项拼接成不可读文本;时间线样式同步支持换行
- 升级 dsh 后同步 compat 注释:重写 web profile
cordis.patch.yml时,"Launcher managed: installed dsh CLI is ..." 注释中的版本号随实际安装版本更新
验证
cargo test:全部通过(含新增的 WS 脚本可解析性测试与验证列表分隔测试)pnpm run check:release -- --tag v0.5.3:版本三处一致、release notes 存在、bundle resources 路径有效
v0.5.2
v0.5.2
dsh 跟线升级到 0.1.2-alpha.2,内置授权插件栈同步跟线;修复导致 v0.5.1 全平台构建失败的 Cargo.lock 幻影版本。
Changes
- dsh 锁定线升级 0.1.1-rc.2 → 0.1.2-alpha.2:版本闸门同线判定随
SUPPORTED_DSH_VERSION常量收敛,0.1.2 线(alpha/rc/稳定版)现在可安装;旧线 0.1.1 及以下按跨线规则拒绝(跨线会重排 credentials 格式与插件运行时) - vendored 授权插件栈跟线:
dsh-client-connection-authz升级到 0.1.2-alpha.2-authz.1(上游 client.js 的isLoopback初始化新增transport.ownsHost析取支,构建期替换锚点同步;插件 typecheck/41 测试/构建全绿),dsh-auth-tailscale升级到 0.1.2-alpha.2-auth.1(22 测试通过);submodule 指针、构建脚本 pin 校验、bundle resources 三处已同步 - 修复 v0.5.1 构建失败根因:Cargo.lock 中 heck/auto-launch 等 8 个包被标成 crates.io 从未发布的 0.5.1(checksum 实为 0.5.0),全部构建 job 在依赖解析阶段失败;已修正回 0.5.0 并对全部 556 个依赖逐包校验 index checksum 确认无其他异常
验证
- 插件栈:
dsh-client-connection-authz与dsh-auth-tailscale各自pnpm run check(typecheck + 测试 + 构建)全绿 - 主仓:
cargo test57 通过;pnpm run check:release -- --tag v0.5.2通过 - v0.5.1 重打 tag 后 build-release 全 job(validate/四平台构建/release)成功,确认幻影版本修复有效
v0.5.1
v0.5.1
修复 macOS 浅色/深色外观切换(含系统自动切换的过渡段)时主窗口持续闪烁的问题。
Changes
- 主题同步去抖:macOS 在亮暗过渡期间会连发多个
prefers-color-schemechange 事件,每次都同步重写<html data-theme>会反复触发整窗样式重算,表现为窗口闪烁。系统主题监听抽为useSystemThemeSynchook,事件静默 250ms 后只按最终外观应用一次 - 同值不写 DOM:
applyDataTheme记录已落 DOM 的data-theme,解析结果与当前值相同时直接跳过属性写入,消除过渡期间的冗余重绘
验证
tsc --noEmit无报错;vitest通过- 实机验证:macOS 自动外观切换过渡段窗口不再闪烁,手动切换亮暗主题即时生效
pnpm run check:release -- --tag v0.5.1通过
v0.5.0
v0.5.0
新增两个功能域:插件市场与模型配置。导航从 Home / Settings 扩展为 Home / Plugins / Models / Settings。
Changes
- 插件市场(Plugins 视图):浏览 dsh-plugins-store 社区目录(api.dshmk.com,7400+ 插件),支持搜索、分类筛选、星标/名称排序、滚动分页;一键安装/移除 web profile 插件,安装前内联二次确认;已装插件列表集中管理,Launcher 自管的授权插件标记「managed by launcher」且不提供移除入口
- 市场安全边界:目录在 Rust 侧拉取并投影成精简列表(约 27MB 原文不进 WebView);「已验证」标记只认目录
validation.overall == "verified"(沙箱安装检查,非安全审计);安装 specifier 经字符白名单校验(拒绝相对路径、..、空白与控制字符);安装走dsh plugin --profile web add,pnpm ≥10 默认拦截第三方生命周期脚本 - 模型配置(Models 视图):编辑
~/.dsh/settings.yaml的模型域——默认模型(provider + model + reasoningEffort 七档思考等级)与自定义提供商路由(显示名 / Base URL / wire 协议 openai-completions|openai-responses|anthropic-messages / API Key 环境变量名 / 模型列表) - 模型配置边界:API 密钥只保存环境变量名,永不落盘;提供商高级字段原样透传保留(混入管理键时以 UI 为准);模型域之外的顶层键(llm-deepseek、agent-presets 等)保存时原样保留;保存后提示需重启 dsh web 生效
- Rust 依赖:新增 serde_yaml 0.9(settings.yaml 读写)与 reqwest 0.12(blocking + rustls-tls + gzip,目录拉取,免系统 openssl)
- 文档:CONTEXT.md 新增「插件市场」「模型配置」两域术语与语义边界;双语 README 亮点同步
- 测试补充:市场目录投影与 identifier 白名单、已装列表受管标记、模型配置 round-trip / 外来键保留 / extra 剥离 / 空配置共 9 项 Rust 单测;市场与模型视图 6 项前端测试;E2E 冒烟扩展至 9 步(新增 Plugins/Models 导航)
验证
cargo test57 项通过(另有 1 项#[ignore]真实目录拉取冒烟本地通过,3.2s 投影 7000+ 条)- 实机闭环:安装市场插件 → dependencies 键名与已装匹配逻辑一致 → 卸载 → 与安装前备份逐字节一致,profile 无残留
vitest25 项通过;tsc --noEmit无报错;pnpm build通过pnpm run check:i18n通过:前端 178 key、Rust 表 136 条,无缺失无死 key- E2E 冒烟 9 步全绿
pnpm run check:release -- --tag v0.5.0通过
v0.4.1
v0.4.1
商业化整改批次交付:修复一个真实缺陷(应用内帮助死链)、补齐可访问性与键盘快捷键、建立 E2E 冒烟门禁、拆分 dsh 域模块、补全开源仓库门面。dsh 集成行为无变化。
Changes
- 修复应用内帮助死链:补写
docs/updater/SETUP.md(更新源密钥、环境变量、CI 配置与故障排查),更新源未配置时关于页的「Setup Guide」链接不再必然报错,并附仓库布局回归测试 - 可访问性补齐:无
href链接触发器改为键盘可达的链接样式按钮;顶部导航、设置侧栏、选择卡补:focus-visible主题焦点环;toast 经role="status" aria-live="polite"对屏幕阅读器可感知 - 新增键盘快捷键:
Cmd/Ctrl + ,打开设置,按钮 tooltip 双语提示 - E2E 冒烟门禁:基于 playwright-core 与 mock Tauri IPC 的 7 步冒烟(壳渲染、Home/Settings/About 导航、快捷键、启动链 IPC 面与无错误 toast),接入 quality workflow,未 mock 命令即失败
- dsh 模块拆分:4,043 行单文件按域拆为 process / components / auth / detect / setup / start / update / probe / autostart 九个模块 + tests,main.rs 注册路径不变,显式跨模块导入,行为无变化
- 死代码清理:删除零引用 Modal 组件与 22 个遗留 CSS 类、3 个死 keyframes;摘除 4 处私人备注标记
- 仓库门面:CONTRIBUTING.md(质量门禁、插件 pin 与发布清单)、SECURITY.md(私密漏洞报告与范围边界)、bug/feature issue 表单
- 测试补充:updater 重试退避、可重试错误分类、错误文案与帮助路径回归测试
验证
cargo test49 项通过;cargo clippy --all-targets -- -D warnings无警告tsc --noEmit无报错;pnpm run check:i18n通过:前端 130 key、Rust 表 120 条,无缺失无死 key- E2E 冒烟 7 步本地与 CI 全绿
pnpm run check:release -- --tag v0.4.1通过
v0.4.0
v0.4.0
移除主页顶部的“Integrations / 集成”标题,Home 页直接展示 dsh 卡片,避免与顶部导航产生重复的入口感。
Changes
- 移除 Home 页标题:删除
IntegrationView中的h2标题,主页不再显示“Integrations / 集成” - 清理 i18n 死 key:同步删除英文与中文词典中不再使用的
Integrations项
验证
pnpm run check:i18n通过:前端 129 key、Rust 表 120 条,无缺失无死 keyvitest19 项通过;tsc --noEmit无报错pnpm build通过pnpm run check:release -- --tag v0.4.0通过