| feat(v0.5.0): 插件同步工具链 + 代码审计修复(逻辑 / 性能 / 内存 / 发布流程) 插件源码在各自仓库,本仓库 plugins/ 是生成的内置副本: - 新增 scripts/sync-bundled-plugins.mjs:全量镜像、删源里已删的、保持副本行尾约定、校验 name/version/dsh.bundle.patch/cordis.patch.yml 与中英双 README 互链;自动发现插件仓库; 支持 --check(漂移退出码 1)/--strict/--only/--repos - 接进 dist:* 构建前置;找不到源仓库时降级为「跳过并保留现有副本」(CI 只 checkout 本仓库), --strict 时才是错误 - 新增 scripts/lib/download.mjs:构建脚本共用的下载/哈希,补上超时、Content-Length 校验与 失败清理(此前卡住会永久挂起,而截断的归档会被当成有效缓存),含 3 项离线测试 - README / CHANGELOG 记录工作区布局与「改插件请改插件仓库,别手改 plugins/」的规矩 代码审计(5 路并行审计约 80 条发现,逐条核实后修 37 项,另否掉 4 条误报): - 逻辑:旧包名清理会删掉**现役**插件的禁用行(row id 与旧包同名,高危;已加回归测试); 旧包只残留 dependencies 时永不清理;「登记在案但文件已丢」永不重装;引擎就绪后崩溃会无限 重启(计数被 onUrl 清零且无退避);有意停止被当成启动失败;npm 通道缺 dist-tags 时静默退回 alpha;非法版本号让 boot 崩溃;插件 IPC 无并发闸;补丁层锁的忙等可钉死主进程;runDshPlugin 无超时;removePatchRows 正则钉死缩进导致清理静默失效;settings.yaml 有 YAML 错误时主题/语言 静默不生效;macOS 包没有内置 Node(少一层 .app 且失败只 warn);README 承诺的 mac zip 从不生成 - 性能:每行 pnpm 输出都发一次 IPC → 150ms 合并;shortPathIfSpaced / bundledNodeExecutable / pluginBundledPluginsDir 进程内缓存;删旧引擎树改后台异步(不再冻结窗口);zip level 9 → 6 - 安全:被拒引擎 URL 里的 token 不再进日志;恢复安装前校验 spec 形状(-开头=argv 注入、 带协议前缀=任意安装源);三个 PS 脚本读 secrets 指定 UTF-8(BOM 会让第一行 key 静默丢失); 发布 notes 的 PATCH 加 -f;Gitee 的 100MB 保护不再是死参数;无凭据的平台改为计入失败 (此前静默跳过却仍 exit 0 报「已发布」) - 死代码:engine-patch 的 stripLegacyPatch(生产代码无人调用)删除、其测试改为覆盖生产实际 使用的 stripInjectedBlocks(12→17 项);删除零引用的 resources/icons/harness.ico; exe-icon-info 退出码反映结果;CI 增加 test job | 1 month ago |
| release(v0.3.0): 图标修复 + 打包提速 + 插件「安装/启用」分离 + 用量插件加 DeepSeek 余额 版本 0.2.0 -> 0.3.0。自 v0.2.0 以来的全部改动: 图标(Windows 上终于到处可见) - build/icon.ico 改为「BMP 16..128 + PNG 256」混合帧:BMP 帧兼容 Maye 等只认未压缩帧的 老解析器;256 必须是 PNG,否则 Windows「更改图标」会报「文件不包含图标」。 - BMP 帧的 AND 掩码用紧凑 1bpp 长度,保证 DIB 头/载荷/组条目三者一致(否则 electron-builder 嵌入时会截断,严格解析器同样拒收)。 - 新增 scripts/ico-info.cjs 与 scripts/exe-icon-info.cjs 供自查。 打包提速 - bundle-node.mjs 幂等跳过 + resources/.node-cache/ 归档缓存(SHA-256 sidecar 自校验)。 - 新增 scripts/ensure-electron.mjs:Electron 发行 zip 本地缓存 + 官方 SHASUMS256.txt 校验, dist:win 经 --config.electronDist 直接使用 —— 不再每轮下载,断网也能打包。 第三方插件:安装与启用拆成两个状态,均与插件市场双向同步 - 设置窗口新增「启用」开关(关掉不卸载,只是引擎不加载),走市场自己的 POST /dsh-market/toggle(显式 Origin 头过同源校验):在线生效、保护规则、 restart/refresh 信号与市场一致;带客户端半体的插件切换后提供「刷新页面」。 - 修复「市场禁用了但引擎仍在加载」的 BOM 根因:补丁层读写一律先剥 UTF-8 BOM。 - 新增启用/禁用对账(启动维护 + 修复/重试)。 用量插件:dsh-opencode-go-usage -> dsh-model-usage,新增 DeepSeek 余额 - 宿主路由 /opencode-go-usage -> /model-usage,一次返回 opencode-go 用量与 deepseek 余额 两段,各段独立报告 ok/reason、独立缓存;密钥仍在宿主侧解析,不下发浏览器。 - 门控映射改由宿主下发(sections),页内不再硬编码 provider 列表。 - 改名迁移:LEGACY_PLUGIN_PKGS + pruneProfilePackages,bundle 与 dependencies 一起摘, 并搬运「原本装着/原本禁用」的意图 —— 修复旧包被引擎 reconcile 复活导致控件显示两遍。 其他 - 设置窗口精简(语言/外观统一到 Harness 页面,外壳热跟随;autoPlugins 废弃)。 - profile bundle 自愈 + 引擎「stage + 原子替换」安装,坏安装/卸载不再挡启动。 - 三平台发布脚本加固(Gitee/GitCode 中文说明乱码修复、失败不中断其它平台)。 - 文档:README 中英文、CHANGELOG 重写为 v0.3.0、新增 RELEASE-NOTES-v0.3.0.md、 marketing/v0.3.0/(CSDN/知乎/掘金/少数派/B站/PH/HN + 首支视频脚本)。 - 测试:新增 plugin-enable / plugin-manager / settings-ui / plugin-state 单测与 smoke-plugin-enable.ps1、smoke-profile-watch.ps1、check-settings-html.cjs(npm test)。 | 1 month ago |
| docs: 重构 README(简单明了:能做什么/安装/首次启动/配置/兼容性/FAQ/开发) | 1 month ago |
| feat(v0.5.0): 插件同步工具链 + 代码审计修复(逻辑 / 性能 / 内存 / 发布流程) 插件源码在各自仓库,本仓库 plugins/ 是生成的内置副本: - 新增 scripts/sync-bundled-plugins.mjs:全量镜像、删源里已删的、保持副本行尾约定、校验 name/version/dsh.bundle.patch/cordis.patch.yml 与中英双 README 互链;自动发现插件仓库; 支持 --check(漂移退出码 1)/--strict/--only/--repos - 接进 dist:* 构建前置;找不到源仓库时降级为「跳过并保留现有副本」(CI 只 checkout 本仓库), --strict 时才是错误 - 新增 scripts/lib/download.mjs:构建脚本共用的下载/哈希,补上超时、Content-Length 校验与 失败清理(此前卡住会永久挂起,而截断的归档会被当成有效缓存),含 3 项离线测试 - README / CHANGELOG 记录工作区布局与「改插件请改插件仓库,别手改 plugins/」的规矩 代码审计(5 路并行审计约 80 条发现,逐条核实后修 37 项,另否掉 4 条误报): - 逻辑:旧包名清理会删掉**现役**插件的禁用行(row id 与旧包同名,高危;已加回归测试); 旧包只残留 dependencies 时永不清理;「登记在案但文件已丢」永不重装;引擎就绪后崩溃会无限 重启(计数被 onUrl 清零且无退避);有意停止被当成启动失败;npm 通道缺 dist-tags 时静默退回 alpha;非法版本号让 boot 崩溃;插件 IPC 无并发闸;补丁层锁的忙等可钉死主进程;runDshPlugin 无超时;removePatchRows 正则钉死缩进导致清理静默失效;settings.yaml 有 YAML 错误时主题/语言 静默不生效;macOS 包没有内置 Node(少一层 .app 且失败只 warn);README 承诺的 mac zip 从不生成 - 性能:每行 pnpm 输出都发一次 IPC → 150ms 合并;shortPathIfSpaced / bundledNodeExecutable / pluginBundledPluginsDir 进程内缓存;删旧引擎树改后台异步(不再冻结窗口);zip level 9 → 6 - 安全:被拒引擎 URL 里的 token 不再进日志;恢复安装前校验 spec 形状(-开头=argv 注入、 带协议前缀=任意安装源);三个 PS 脚本读 secrets 指定 UTF-8(BOM 会让第一行 key 静默丢失); 发布 notes 的 PATCH 加 -f;Gitee 的 100MB 保护不再是死参数;无凭据的平台改为计入失败 (此前静默跳过却仍 exit 0 报「已发布」) - 死代码:engine-patch 的 stripLegacyPatch(生产代码无人调用)删除、其测试改为覆盖生产实际 使用的 stripInjectedBlocks(12→17 项);删除零引用的 resources/icons/harness.ico; exe-icon-info 退出码反映结果;CI 增加 test job | 1 month ago |
| docs: 主窗口截图补上 Command Code 一列;重拍设置窗口截图 - 新增 主窗口-commandcode余量与模型总额.png / -english.png,接进中英 README 主窗口表格由两列改成三列(OpenCode Go / Command Code / DeepSeek) - 重拍 设置窗口.png / -english.png:原图拍于 09-22,插件列表里还是旧名 「OpenCode Go 路由」,与已改名的正文矛盾 - check-doc-images:18 文档 12 图全部解析 | 1 month ago |
| fix: R4 —— 取消数据目录切换时,单选回滚用的是过期快照 取消迁移(main 返回 {...settings, applied:false} 且不广播)时,回滚读的是**页面加载时**的 s。 只要之前成功切换过一次,那个值就是过期的:它会把单选框勾回一个**并不生效**的值,而且——因为单选框 只在选中项真的变化时才触发 change——被错误勾上的那个选项再也点不动,无法重试(只能等下一次无关的 广播把它纠正回来)。 现在按可信度取:**这次答复里的 res.dshHomeMode**(main 返回的就是它保留的设置)→ 上次广播的 window.__lastPayload.dshHomeMode → 最后才退到页面快照;三者都没有时**不动界面**,而不是断然写一个 无法佐证的值。 验证/防回归: - check-settings-html.cjs 新增一条结构检查:回滚必须读 res.dshHomeMode、必须有 __lastPayload 兜底、且不得再出现「只看页面快照」的写法; - npm test 全绿。 | 1 month ago |
| fix: M2 窄版 —— 恢复上一份安装时,放过「我们 staging 根内的路径」与「纯 registry spec」 isRestorableSpec 管的是「重装失败时把原来那份装回去」这道闸门。它读的 spec 来自 profile 的 package.json —— 那文件市场与第三方插件都能写 —— 所以它允许的形状是**安全边界**,不是外观问题。 旧判据对内置条目过严:只肯恢复「当前那一条 staging 路径」。于是**旧版 GUI 留下的同一目录下的 staging 路径**、以及**来自 registry 的安装**都被算作来路不明 —— 而后者恰是真正的恢复场景 (用户的插件本来就是我们装的、只是某次例行重装失败了)。恢复被跳过,插件就被摘掉,用户得自己 发现并重新勾选安装。 现在允许两类: 1. file: 指向**我们自己 staging 根目录内**的任意路径(当前或旧版),且没有逃逸出该根; 2. 纯 registry 形状(name / @scope/name,可带 @版本),与 GUI 自己安装时同一信任级别。 仍然拒绝:- 开头(argv 注入)、任何带 scheme 的(git:/github:/https:/ssh:)、**无 scheme 的 user/repo GitHub 简写**(这条旧判据其实漏了)、以及逃逸出 staging 根的 file:。 顺带补上它一直缺失的测试:isRestorableSpec 此前既没导出也没用例,现在导出并新增 checkIsRestorableSpec(10 种形状 + 无 stagingRoot 的 file:)。 验证: - npm test 全绿(含新用例); - verify:builtin ALL CHECKS PASSED; - smoke-plugin-update STEP3-8 PASS(随包更新路径,正是会走恢复分支的地方),尾部无 timeout/FAIL。 已知边界(刻意为之):指向**别的目录**的 file: 旧 staging 路径仍被拒绝 —— 放开它就等于接受 「按文件内容去任意本地目录取代码」。registry 与「我们自己目录内」这两类已覆盖真实故障。 | 1 month ago |
| docs: 截图移入独立的 screenshots/ 目录,推广物料不再随仓库推送,并修正截图说明 1) 图片说明修正 - README 中那张 DSH设置.png 描述写成了「设置窗口(第三方插件)」,实际是 **Harness 页面里的设置弹窗**(通用设置 / 模型 / 插件 / 插件市场 …)。中文改为 「DSH 设置弹窗」,英文改为 "DSH settings dialog"。 2) 最新界面截图独立存放(screenshots/) - 新增仓库根目录 screenshots/,存放当前版本的界面截图(主窗口 / 设置窗口 / DSH 设置弹窗 / 模型用量两张,中英文各一份,共 8 张)。 - README 中英文改用 screenshots/...,路径不再带版本号 —— 以后换截图只替换文件, README 不用跟着改,也不会再出现「README 指向旧版本目录」的问题。 3) 推广物料不再随仓库推送(marketing/) - marketing/ 加入 .gitignore 并 git rm -r --cached(本地文件完整保留,只是不再 纳入版本控制)。各平台文章草稿、B站脚本等物料留在本地,不随仓库推送到 三个开源平台;此前已推送的 marketing/ 内容会在本次推送后从三个平台的仓库中移除 (本地副本仍在,git 历史里也可随时找回)。 4) 图片引用检查随之改为「只看会被推送的文档」 - scripts/check-doc-images.cjs 改为以 git ls-files 取文档范围:被 git 跟踪的 markdown 就是会被推送的内容,因此本地专属的 marketing/ 草稿不再参与检查, 而新增的公开文档一提交就自动被覆盖。 | 1 month ago |
| release: v0.7.0 — 首次启动「一键开启」内置插件 + 一轮代码审计修复 新功能:随包插件默认一个都不装(勾选框全关),于是「下载解压打开」之后那四个修复 一个都没生效。现在引擎就绪后自动检测,主动打开设置窗口给出「一键开启」卡片:一次 点击 = 装齐 + 自动重启一次引擎;「不用了我自己选」只记一句、一个插件都不动。 审计修复(含一个会破坏引擎文件、一个会丢打包产物、一个装插件假成功): - engine-patch 的 stripInjectedBlocks 用「下一个 const slots」当结束边界,会把注入块 与它之间的引擎代码一起删掉(仍是合法 JS,语法检查发现不了)→ 改为按块自身括号配平。 - installPlugin 只看退出码,而 dsh plugin add 会 exit 0 却什么都不改 → 改为校验真的 落地(bundles 登记 + node_modules 存在)。 - fix-unpacked 归档前先删旧 zip、失败再删唯一副本 → 改为临时名 + 校验完整 zip + 原子换入。 - ensurePnpm 先 rm 共享目录再装(并发会互删)→ 改为临时目录原子换入。 - runNpm 超时只 kill 不 settle(Promise 永不 settle)→ 与 runDshPlugin 一致。 - settings.yaml 顶层非映射时静默丢配置;healProfileBundles 用过期快照覆盖别人; removePatchRows 并发重试重复计数;setPluginEnabled 把没写报成 changed。 - watcher 重试定时器不可取消(句柄泄漏);killProcessTree 可能回调两次。 - 两个 smoke 曾直接写用户真实数据目录;5 个 smoke 去掉写死用户名。 - 发布脚本:tag 改在推送前建(Gitee/GitCode 才拿得到)、-Skip 两种写法都认、 输出抹掉 token、补 ;check-ps1-encoding 改递归。 - 设置窗口 16 个 i18n 键终于接上(原先 52 处手写三元);两个按钮状态 bug; 渲染去重;死 CSS/死代码/死导出清理。 - 三个 CDP smoke 的重复样板收拢到 scripts/lib/cdp.cjs。 测试:新增 first-run 单测 11 项、engine-patch 回归 4 项、update-sources 1 项、 smoke-first-run 端到端 5 步(两条回答路径)。npm test 全绿;smoke-first-run 与 smoke-profile-watch 端到端全绿。 | 1 month ago |
| docs: 添加知乎/CSDN 平台文章与 LICENSE,新增多平台构建工作流 | 2 months ago |
| docs: 重构 README(简单明了:能做什么/安装/首次启动/配置/兼容性/FAQ/开发) | 1 month ago |
| docs: 重构 README(简单明了:能做什么/安装/首次启动/配置/兼容性/FAQ/开发) | 1 month ago |
| docs: 新增 v0.2.0 GitHub Release 发布说明(结构化更新描述) | 1 month ago |
| docs: 移除「Maye 等老工具可显示图标」「更改图标不再报不包含图标」两处未成立的描述 这两个结论经用户实测**并未成立**,因此从项目中与三平台 Release 正文里全部去掉, 只保留确实成立的部分(主图标改为白色圆角 + 品牌蓝字形、icon.ico 改由 make-icons 直接生成)。 - README.md / README.en.md:v0.3.0 亮点改为「应用图标改为白色底」;打包说明去掉 帧构成与工具兼容性理由;图标缓存提示只保留资源管理器。 - CHANGELOG.md:图标小节改为「应用图标改为白色底」;一句话摘要去掉「图标终于对了」 与「快了一个数量级」两处未经证实的表述。 - RELEASE-NOTES-v0.3.0.md:摘要与图标小节同步改写,移除两处结论。 - electron-builder.yml、scripts/make-icons.mjs、scripts/ico-info.cjs、 scripts/exe-icon-info.cjs:注释里去掉对上述结论的引用,只留实现事实 (帧构成、掩码长度自洽、与官方 electron.exe 的布局一致)。 - marketing/v0.3.0/:9 份物料(CSDN / 知乎 / 掘金 / 少数派 / B站脚本与简介 / Show HN / Product Hunt / 推广文案包)中的相关段落改写为只讲白底图标, B 站分镜与素材清单里的 Maye 镜头改为桌面/开始菜单特写。 - 三平台 Release 正文已用 scripts/update-release-notes.ps1 同步更新并逐项验证。 新增 scripts/update-release-notes.ps1:把 RELEASE-NOTES 文件同步到 GitHub / Gitee / GitCode 的 Release 正文(含平台差异:Gitee 更新必须带 tag_name、GitCode 无 id 用 tag 作句柄)。 | 1 month ago |
| release(v0.4.0): OpenCode 插件合并 + 用量插件加每模型月上限 + 设置窗口插件区优化 版本 0.3.0 -> 0.4.0。自 v0.3.0 以来的全部改动: 插件合并(dsh-opencode-go) - dsh-opencode-go-session + dsh-opencode-go-api 合并为「OpenCode Go 增强」: 声明 opencode-go 路由协议(修 needs an api)、自动补 DeepSeek V4.1 模型、 附加按会话 x-opencode-session 头(修 400 MissingSessionID) - 修复原 api 插件从未 insert 自身 row 导致 lib/index.js 是死代码的缺陷; patch 与 insert 分离,启用/禁用只写 insert 行,不会打掉协议声明 - LEGACY_PLUGIN_PKGS 登记两个旧包名,装过旧插件的用户自动迁移并保留禁用选择 用量插件(dsh-model-usage 0.3.0) - 新增当前选中模型的每月额度上限(标题栏「上限 $X」+ 悬停三段额度) - 额度表自动更新:内建 28 模型兜底 + 启动抓官方文档页解析 + 本地缓存 + 失败回退 (官方无额度接口;抓的是公开文档页,无需密钥) - rate-limited 时标红并给重置时间 - 单测 16 -> 27 项 设置窗口 - 插件区:标题成行、描述两行省略、行距收紧 - 五个插件的中英文描述精简为一句 | 1 month ago |
| release(v0.4.1): 安全与可靠性修复 + 自动检查新版本 + 输入框快捷键插件 版本号 0.4.0 → 0.4.1(package.json / package-lock.json),并写入发布物料。 零散内容: - RELEASE-NOTES-v0.4.1.md:面向用户的发布说明(按影响面组织:安全修复 → 可靠性 → 新功能)。 - CHANGELOG.md:完整改动清单(本版本详情)。 - README(中/英):「亮点」段替换为 v0.4.1,并指向新的发布说明。 本版本重点(详见 CHANGELOG.md): - 三个插件的浏览器路由此前完全没有鉴权(可读到账户用量与余额、可写入设置); - 补丁层写入改为跨进程锁 + 原子 + 校验(此前并发写会静默丢行却报成功); - 主窗口导航围栏、权限围栏(此前麦克风/摄像头/定位/通知默认放行)、全部特权 IPC 校验发送方; - 任意第三方插件可用越界/未声明的补丁文件认领并禁用引擎自己的行(已封堵); - 新增:DSH GUI 自身自动检查新版本(国内外网络自动择优)、输入框快捷键插件。 插件版本号已提升(model-usage 0.3.1 / gui-last-session 0.1.1 / opencode-go 0.1.1 / composer-keys 0.2.0)—— 不升版本时「随包更新」不会替换已装副本,安全修复送不到用户手里。 | 1 month ago |
| feat+rename: 随包插件 dsh-model-surplus 增加 Command Code 用量;dsh-opencode-go-path 改名为 dsh-gateway-models 1) dsh-model-surplus 0.4.0:新增 Command Code 分区 - 会话标题右侧显示 5 小时 / 周窗口百分比 + 剩余额度 - 查的是额度接口 /alpha/billing/credits,不是聊天接口;/provider/v1 会被自动剥掉 - 响应体形状按**实测**校正:credits 与 windowLimits 是平级,不是嵌套 (原先按第三方实现的包装结构推断,实际会让解析返回 null、静默显示『用量不可用』) - 不显示月度百分比:接口不给月度总额度,凭空算就是猜 2) dsh-opencode-go-path → dsh-gateway-models(纯改名 + Command Code 供给) - 它已不只管 OpenCode Go,且原 -path 后缀当年只为绕开 npm 重名 - 新增:为 commandcode 路由声明 api + baseURL(用户不必再手填 API 地址), 并按接口地址识别所有网关路由,从公开目录补齐模型清单(只增不改、幂等) - 默认路由名 opencode-go → commandcode:套餐由账号/密钥决定,一个名字覆盖 Go/GOAT/Pro/MAX;旧名 commandcode-goat 等仍可用 - 补丁层行 id 仍是 opencode-go(与包名解耦),启用/禁用选择不丢; 旧包名加进 LEGACY_PLUGIN_PKGS 做一次性清理 3) GUI 侧同步:CATALOG 条目、plugins/ 镜像目录、verify-builtin、测试脚本、 README 插件表;CHANGELOG / RELEASE-NOTES 是 v0.5.0 的发布记录,只加署名日期的 改名说明,不改写历史 验证:npm test 全绿;npm run verify:builtin 用真实引擎跑通 (staging → 安装 → 注册 → 二次启动幂等 → 四个插件齐全启动) | 1 month ago |
| release: v0.6.0 — 网关路由插件扩展成 OpenCode Go + Command Code;修好发布工具链 内容(从 v0.5.0 累积): - dsh-gateway-models 0.2.0(原 dsh-opencode-go-path):Command Code 声明协议+地址、 从公开目录补全模型清单;默认路由名改为 commandcode,一个名字覆盖 Go/GOAT/Pro/MAX - dsh-model-surplus 0.4.0:会话标题旁显示 Command Code 窗口用量与剩余额度 - GUI:旧插件自动清除并换成新插件(bundles + dependencies 都摘干净,共用行 id 保住用户的启用/禁用选择);修掉「旧包 staging 拷贝只在后面恰好 staging 时才清」的缺陷 检查中发现并修掉的问题: 1. 含中文的 .ps1 没有 UTF-8 BOM —— 本机只有 PowerShell 5.1,按 ANSI 读取会把中文解成 乱码,release-plugin-tarballs.ps1 直接 14 个语法错误、一行都跑不了。 已补 BOM,并新增 scripts/check-ps1-encoding.cjs 接进 npm test 防回归。 2. 上述脚本的 param 默认值用 \,5.1 下取到空串 → Split-Path 抛错; 改为在函数体里推导。 3. release-plugin-tarballs.ps1 / update-plugin-readmes.ps1 写死了插件清单与版本: 改名后前者静默不再为新名字发 tarball,后者会把 README 的 tarball 链接改回旧版 (实测 README 写 0.4.0、release 只有 0.3.2 → 404)。改为清单从磁盘推导、 版本从各插件 package.json 读。 4. 注册表提交包仍指向旧仓库名 —— 换成 dsh-gateway-models 条目并更新描述。 5. dsh-model-surplus 的 Command Code 改动此前只存在于 GUI 随包镜像里、插件仓库本身 未提交,且 README 指向不存在的 v0.4.0。已在插件仓库提交并发布 v0.4.0(四个插件 README 的 tarball 链接现全部 200)。 文档:CHANGELOG 增加 v0.6.0 段;新增 RELEASE-NOTES-v0.6.0.md。 验证:npm test 全绿;npm run verify:builtin ALL CHECKS PASSED。 | 1 month ago |
| release: v0.6.1 — Command Code 余量「未配置密钥」修复 + 插件更新提示 + 审计修复 从 v0.6.0 累积: 1) 修(用户可见):Command Code 余量在换过数据目录后报「未配置密钥」,即便卸载重装也没用。 原因是插件按写死的 COMMANDCODE_GOAT_API_KEY 找密钥,而引擎按路由声明的 apiKeyEnv 取 —— 路由改名成 commandcode 后密钥名变成 COMMANDCODE_API_KEY,于是对话正常、余量报无密钥。 插件改为跟着路由走;随包 dsh-model-surplus 0.4.0 → 0.4.1(已单独发布 v0.4.1)。 2) 新:内置插件自动更新后弹角标提示(只报真正变了的;首次安装不误报;引擎就绪后才提示; 与引擎更新提示共用角标时不抢占;切换数据目录后重新允许提示)。 3) 审计修复:更新缓存临时名只带 pid(同进程两个写者会互相覆盖字节);Command Code 目录接口 每次设置变更都请求(加 TTL);settings:autosize 的发送者校验写法与其它 12 个不一致; Electron 下载临时名固定;preload 注释与事实不符;plugin-manager 10 个无人使用的导出。 4) 测试:verify:builtin 新增两幕(旧包名环境整体换新、四个随包插件全部降级后一次性更新 + 不降级 + 非随包条目不受管理);engine-patch 补 injectedState 6 条断言。 文档:CHANGELOG 增加 v0.6.1 段;新增 RELEASE-NOTES-v0.6.1.md。 验证:npm test 全绿;npm run verify:builtin ALL CHECKS PASSED。 推送标签会触发 build-all.yml 的四平台矩阵打包。 | 1 month ago |
| release: v0.7.0 — 首次启动「一键开启」内置插件 + 一轮代码审计修复 新功能:随包插件默认一个都不装(勾选框全关),于是「下载解压打开」之后那四个修复 一个都没生效。现在引擎就绪后自动检测,主动打开设置窗口给出「一键开启」卡片:一次 点击 = 装齐 + 自动重启一次引擎;「不用了我自己选」只记一句、一个插件都不动。 审计修复(含一个会破坏引擎文件、一个会丢打包产物、一个装插件假成功): - engine-patch 的 stripInjectedBlocks 用「下一个 const slots」当结束边界,会把注入块 与它之间的引擎代码一起删掉(仍是合法 JS,语法检查发现不了)→ 改为按块自身括号配平。 - installPlugin 只看退出码,而 dsh plugin add 会 exit 0 却什么都不改 → 改为校验真的 落地(bundles 登记 + node_modules 存在)。 - fix-unpacked 归档前先删旧 zip、失败再删唯一副本 → 改为临时名 + 校验完整 zip + 原子换入。 - ensurePnpm 先 rm 共享目录再装(并发会互删)→ 改为临时目录原子换入。 - runNpm 超时只 kill 不 settle(Promise 永不 settle)→ 与 runDshPlugin 一致。 - settings.yaml 顶层非映射时静默丢配置;healProfileBundles 用过期快照覆盖别人; removePatchRows 并发重试重复计数;setPluginEnabled 把没写报成 changed。 - watcher 重试定时器不可取消(句柄泄漏);killProcessTree 可能回调两次。 - 两个 smoke 曾直接写用户真实数据目录;5 个 smoke 去掉写死用户名。 - 发布脚本:tag 改在推送前建(Gitee/GitCode 才拿得到)、-Skip 两种写法都认、 输出抹掉 token、补 ;check-ps1-encoding 改递归。 - 设置窗口 16 个 i18n 键终于接上(原先 52 处手写三元);两个按钮状态 bug; 渲染去重;死 CSS/死代码/死导出清理。 - 三个 CDP smoke 的重复样板收拢到 scripts/lib/cdp.cjs。 测试:新增 first-run 单测 11 项、engine-patch 回归 4 项、update-sources 1 项、 smoke-first-run 端到端 5 步(两条回答路径)。npm test 全绿;smoke-first-run 与 smoke-profile-watch 端到端全绿。 | 1 month ago |
| revert(v0.5.0): 四个随附插件改回内置(npm 发布走不通) v0.5.0 原本把四个插件拆出去发布到 npm、壳改成像 dsh-market 那样从 registry 安装。 但 npm 账号注册走不通,包发不出去;而 profile 里登记着一个 registry 上不存在的包, 会让插件直接从 dsh.profile.bundles 里消失(引擎少一个功能),并且让这个 profile 里 每一次安装操作一起失败——两条都在本机实测到了。所以改回内置。 - plugins/ 回到仓库(四个插件,源码/测试/LICENSE 与各自独立仓库一致) - electron-builder.yml:plugins/**/* 重新打进 app.asar - plugin-manager.js:恢复 staging(bundledSourceDir / copyDirRecursive / stageBundledPlugin / bundledStagedSpec / isBundledStagedSpec)与「随包版本更新 才重装」;新增预清理:**先把所有「即将安装、但来源不对」的内置条目登记摘掉,再 统一安装**——实测顺序反过来时,一条解析不了的 file: 依赖会让别的插件的安装一起 报 ENOENT,四个插件只修好两个,剩下的要等下一次启动 - main.js:恢复 pluginBundledPluginsDir() / shortPathIfSpaced() 与 stagingRoot 传递 - 包名改动与旧包名清理(LEGACY_PLUGIN_PKGS)保持不变:补丁层行 id 与设置命名空间 不变,用户保存的键位和启用/禁用选择不受影响 - 删掉 isLegacyStagedInstall:判定收窄成「不是随包那一份就换回来」,来源指向 checkout / npm / 旧 staging 目录的内置条目都会被修好;装不回去时把原来那份装回 | 1 month ago |
| feat(v0.5.0): 改名为 DSH Ready GUI 旧名既不唯一也不说明自己是什么:dsh-gui 被四个别人的仓库占用(8/4/4/3 star), ScannerVpn/DeepSeekHarnessGui(6 star)与旧仓库名只差大小写、星数是两倍,npm 上 dsh-gui / deepseek-harness-gui / dsh-desktop 也全被占。新名 dsh-ready-gui 实测三项全零 (npm 空闲、GitHub 无同名仓库、DSH 生态注册表 4000+ 条目无占用)。 - appId com.dsh.guishell -> com.dshready.gui;productName -> DSH Ready GUI - 仓库名 DeepSeekHarnessGUI -> dsh-ready-gui(GitHub / Gitee / GitCode) - 包名 dsh-gui-shell -> dsh-ready-gui;构建产物 DSH-GUI-* -> DSH-READY-GUI-* - 窗口标题 / 托盘提示 / update-sources 三平台地址 / 全部文档;165 处、24 个文件 新增 src/userdata-migrate.js + 7 项单测。userData 由 productName 推导,改名会把 引擎 / dsh-home / settings.json / pnpm-tools 留在旧目录里、看起来像全新安装。启动时在 任何代码读 userData 之前一次性搬移:只 rename、幂等、绝不删除、失败绝不影响启动。 其中一条单测专门守住「旧目录名必须是 DSH GUI」—— 批量改名曾把它也替换成新名,使 legacy 与 current 变成同一目录、迁移静默失效。 刻意不改(内部标识与历史契约):引擎补丁标记 // dsh-gui:、旧版 staging 路径 .dsh-gui/bundled-plugins、插件名 dsh-gui-last-session、DSH_SHELL_* 环境变量、 dsh-gui:* IPC 通道。RELEASE-NOTES-v0.2.0/0.3.0/0.4.0/0.4.1 与 CHANGELOG 的历史段落 按原文保留(它们记录的是当时真实发布的名称)。 测试:npm test exit 0(含 userdata-migrate 7 项) | 1 month ago |
| docs: 重构 README(简单明了:能做什么/安装/首次启动/配置/兼容性/FAQ/开发) | 1 month ago |