READMESource: main@801aba06
dsh-desktop-menu
把「刷新页面 / 重启应用与 Host」写进 DSH 桌面端左上角「应用」原生菜单的补丁插件。 没有 UI、不往页面注入任何东西;它带的是补丁本身 + 完整思路,换台电脑也能照着做。
它做什么
DSH 桌面端「应用」下拉里的这两项,代码本来就有,只是被开发构建开关挡住:
...development ? [ { role: "reload" }, { app.relaunch() ... } ] : [] // 安装版 development = false
插件把开关换成恒真的等价表达式,两段都是 11 字节,等长替换,不动 asar 任何偏移:
- ...development ? [
+ ...!(0 === 1) ? [
再把这个文件在 asar 头里的 SHA256 integrity 等长同步,归档保持自洽。
完整推导:docs/DESIGN.md;给 AI 的照抄步骤:docs/RECIPE.md。
给 AI 的用法(换台电脑也一样)
dsh_desktop_menu({ action: "status" }) # 只读:app.asar 在哪、补丁是否在位、哈希是否自洽
dsh_desktop_menu({ action: "apply" }) # 写入补丁(幂等;已打过返回 already)
dsh_desktop_menu({ action: "revert" }) # 还原
写完后必须重启桌面端(托盘 → 退出 → 重新打开)才会在菜单里看到,因为 main.js 只在主进程启动时加载。
app.asar 自动探测:工具参数 asar → 环境变量 DSH_DESKTOP_ASAR → 从可执行文件逐级向上找
<dir>/resources/app.asar。纯浏览器版返回 not-desktop。
安装
从 GitHub 装:
dsh plugin --profile desktop add github:YOGEMOW/dsh-desktop-menu
或用插件管理器装本地目录:
plugin_manager(install_bundle, target="<这个包的绝对路径>")
验证
node test/roundtrip.mjs:复制一份真app.asar,revert → apply → apply(幂等), 每步断言状态与哈希自洽、归档大小不变(DSH_ASAR可指定路径);node test/status.mjs:以ELECTRON_RUN_AS_NODE=1跑桌面端 exe,验证original-fs回退和路径探测;python docs/standalone/verify_patch.py "<app.asar 路径>":不依赖插件,直接复核当前安装。
注意
- 桌面端每次自动更新都会换掉
app.asar,补丁随之消失 —— 更新后重新apply一次即可(按内容定位,不依赖偏移)。 - 补丁改的是安装目录文件,需要写权限(装在 Program Files 时可能要管理员)。
- 为什么不做标题栏按钮:没有可用插槽,而且插件无法真正重启(外部进程方案被安全软件/进程树问题挡住)。
原生菜单的
app.relaunch()才是可靠路径,见 DESIGN.md §4。
目录
index.js 宿主半:注册 dsh_desktop_menu 工具
lib/desktop-menu.js 补丁/回滚/探测实现(含 original-fs 处理)
cordis.patch.yml bundle patch
docs/DESIGN.md 设计说明与踩坑复盘
docs/RECIPE.md 给 AI 的照抄步骤
docs/standalone/ 等价的独立 Python 脚本(apply / verify / inspect)
locale/{zh,en}.json 插件显示标题与描述
icon.svg 插件图标
test/ 回归与探测脚本
No comments yet. Be the first to write one.