Repository navigation
Releases: cxkctrl24-lgtm/dsh-purge-021
Release list
fork1 b0-2: postinstall 移除 + #83 迁移腿首次随包发出
fork1 b0-2 — 去掉 postinstall,并把 #83 的迁移腿真正发出去
基线 1.1.73-0.2.1.rc.2,已并入上游 1.1.74 / 1.1.75 / 1.76 / 1.78 的修复。本版在 b0-1 之上只改两件事。
1. 不再有构建脚本:市场安装不再要求「放行构建脚本」
pnpm 11 默认拦截依赖的构建脚本。b0-1 带 scripts.postinstall(ensure-profile-bundle),从 DSH 插件市场安装时会停在:
构建脚本被 pnpm 默认拦截(dsh-purge),点击「放行构建脚本并重试」即可放行并重装
而且 allowBuilds 的键是文件说明符,每换一次 tgz 文件名就要再点一次。b0-2 把 postinstall 降级成普通脚本:
npm run ensure-profile-bundle # 需要手工补 dsh.profile.bundles 时再跑包内已没有任何构建脚本,市场安装走正常流程即可。
2. #83 的迁移腿第一次随包发布
DESKTOP_HOST_CLOSE_NO_FATAL(#83)在 fork1 里改过载荷正文:宿主被信号杀死时不再只有一句静默 resolve(),而是往 <userData>/logs/dsh-purge-host-exit.log 追加一行 desktop host closed: code=… signal=… pid=…。
问题在于这一条的 marker 两版都是 [dsh-purge] signal kill:已经落过旧载荷的机器会被判成 applied → 永不重放,purge_status 显示已经修好,实际上宿主死了照样查无任何日志。b0-2 的 lib/core.js 给 #83 的 replacements 最前面加了一条迁移腿(旧注释行 → 新注释 + try{…}catch{} 诊断块,resolve();return; 分支保留)。
b0-1 的 tgz 是迁移腿落盘之前打的,所以 b0-1 用户升到 b0-2 才会真正拿到 F1。
3. 包含的其他改动(同 b0-1)
cordis.patch.yml的主行从「id 覆盖」改回insert+inject: with。fork1 照搬上游1.1.75 6980fe2的 already-queued 修法后,只在dsh.profile.bundles里挂载 dsh-purge 的 profile 没有任何补丁再创建该行,组合器报patch: entry "dsh-purge" not found,父插件永不装载(无[boot]、无钩子、设置面板消失)。lib/probe.js可见性探针:心跳 / apply·dispose·reload 生命周期 / 日志落盘成败,写到%TEMP%/dsh-purge-probe.log(排查时可临时打开)。
校验
| 项 | 值 |
|---|---|
| 文件 | dsh-purge-1.1.79-0.2.1.rc.2-fork1-b0-2.tgz(106 条目,1,462,935 B) |
| sha256 | d6bb10fb47ba6d819496434ff43602e46227c73be9a8c427d6ee7e3cacc309e3 |
| sha512 (base64) | Sp2CUlkQqYByMKddc9rJfFf2lvV6H9H/St0M6nZQiqDo+MFlDPMd0H9Z78wJKLpwMjYVm05j7+Euc/n0toVZtg== |
装法(本地 tgz):
cp dsh-purge-1.1.79-0.2.1.rc.2-fork1-b0-2.tgz ~/.dsh/profiles/<profile>/vendor/
# package.json: "dsh-purge": "file:vendor/dsh-purge-1.1.79-0.2.1.rc.2-fork1-b0-2.tgz"
# 然后重启 dsh生效判据(重启后)
purge_status版本串显示1.1.79-0.2.1.rc.2-fork1-b0-2;- 宿主
resources/app/lib/main.js里出现dsh-purge-host-exit.log(#83 迁移腿已落); - 之后宿主被信号杀死会留一行诊断,而不是什么都没有。
详见 CHANGELOG-fork1.md §八 / §九。
v1.1.73: fix phantom client.inject deps
移除 dsh.client.inject 中 0.2.1 已不存在的包(dsh-client-runtime / dsh-client-ui-slots),使 client bundle graph 依赖声明与实际一致,减少 boot 期对幻影依赖的解析。
v1.1.72-3 hotfix: schtasks /TR 261-char limit
schtasks /TR 参数上限 261 字符,长 PS1 路径+参数超限导致任务创建失败回退直接 spawn(又被 Job 杀)。修复:PS1 参数写进 .cmd 启动器,/TR 只引用短路径。
v1.1.72-2 hotfix: job-safe swap via schtasks
swap 三连败的根因:宿主/主进程把整棵进程树放进 kill-on-close 的 Job Object,
detached spawn 的 PowerShell 与宿主同 Job —— 宿主被杀瞬间 PS1 被强杀(无痕),
MoveFile 永远执行不到。修复:swap 改由 schtasks 一次性任务执行(Task Scheduler
服务创建的进程不在原 Job),PS1 逻辑不变,另注册 60s 后自删清理任务;schtasks
失败时回退原直接 spawn。同版含 v1.1.72-1 的 settle 入口 swap 检测与 1.1.71-1 的
cwd inline 修复。
v1.1.72-0.2.1.rc.2-1 hotfix: swap check placement
修复 v1.1.72 首版 swap 不触发的问题:
- swap 检测原来放在 autoApplyOnStart 分支之后——autoApplyOnStart 默认 false,
settle 在boot:host-untouched早退,永远到不了 swap 分支。现移到
settleInstalledPatches 入口(life 检查之后)。 - hostctl.scheduleRestart 调用原来传 openBrowser:false —— desktop adapter
对 false 直接 skip。现不传该参数,走 restartOfficialHarness 完整链路
(wscript:taskkill 安装 → app.asar→.bak → 重启 exe)。
重启桌面端一次 → settle 自动 swap(~10-20s 自杀重启一次)→ 补丁树生效。
dsh-purge 1.1.72-0.2.1.rc.2 (asar-swap revival)
0.2.1 桌面端适配核心版:asar-swap 复活
根因(逆向实锤)
0.2.1 宿主进程从 app.asar 内加载运行时(argv 实测),而 purge 的补丁写在
磁盘解包树 resources\app\dsh —— 加载路径与补丁路径分裂,69 个宿主补丁全部
不被加载。asar-swap(0.2.0 时代的生效机制)在 0.2.1 升级时解包做了、swap 没做。
本版改动
- desktop.js 新增
detectSealedButUnswapped(exe):sealed(asar 在)+
解包树在 + 解包树已带补丁 marker → 判定 swap 未完成 - index.js settle 流程:sealed-but-unswapped 且补丁树就绪时,自动走一次
asar-swap 重启(杀宿主 → app.asar 改名 .bak → 重启 exe → Electron 加载
resources\app\ 补丁树)。swap 只发生一次(asar 挪走后条件永久消失) - identity.js(承 1.1.71-0.2.1.rc.2-1):persona-suffix 内联 cwd 字面路径 +
interpolate:false,根除unknown prompt variable "{{cwd}}"报错
升级后的行为
重启桌面端一次 → 新宿主 settle 时自动 swap(进程被杀再拉起,约 10-20 秒)→
第二次启动起 69 个宿主补丁全量生效 + preset 正常 + cwd 正常。
回滚
app.asar.sealed.bak(swap 后的备份)改名回 app.asar 即可回到官方原版。
dsh-purge 1.1.71-0.2.1.rc.2 hotfix 1 (cwd inline)
修复 0.2.1-rc.2 桌面端报错:
unknown prompt variable "{{cwd}}" in section "deployment:persona-suffix"; registered variables: provider, model
原因:0.2.1 的 renderPrompt 对 {{var}} 引用做严格校验(dsh-system-prompt/lib/index.js:174),未注册的变量直接抛错。dsh-purge 的 identity.js 在 rewrite 时把 deployment:persona-suffix 替换成 Your working directory is {{cwd}}.,但依赖运行时注册 cwd 变量——注册时序不稳定(settle 延迟 / 隔离层未就绪)时,首轮 assemble 就会炸。
修复:rewrite 时直接把 cwd 解析成字面路径内联进文本,并给该 section 设 interpolate:false,彻底摆脱变量注册时序依赖。dual 保底:last-cwd.txt 缺失时回退常量 + interpolate:false(字面 {{cwd}} 不再触发校验)。
验证:官方 renderPrompt 单元级验证——修复后渲染通过;旧路径精确复现用户报错。
dsh-purge 1.1.71 (0.2.1-rc.2 fork)
基于上游 YuJunZhiXue/dsh-purge v1.1.71,叠加 0.2.1-rc.2 适配补丁(v1.1.68-0.2.1.rc.2 的全部改动)。
本 fork 相对上游 1.1.71 的差异(5 处,全在 lib/core.js + hooks-deny 注释):
- targetFiles 新增
harness-dev-contextkey(0.2.1 起 WEB_SURFACE 文案搬到 dsh-harness-dev-context 包) - #32 WEB_SURFACE_IDENTITY_NEUTRAL:file 加 harness-dev-context + 2 条 0.2.1 pattern + 第 3 个 marker
- #53 WEB_SURFACE_PROHIBITION:file 加 harness-dev-context;do-not-start 句改为 scoped(
`;尾),保住 LEGACY_WEB_SURFACE.suffix;新增链式收成 Local web GUI 的替换 - #40 COMPLETE_PROMPT_KEEP_INJECT:新增 0.2.1 requiredContexts 尾巴 pattern(放首位)
- #77 REWIND_DROP_SENT_ON_APPEND:新增 0.2.1
if (this.revised.size > 0)守卫形态 pattern
上游 1.1.68→1.1.71 引入并已验证兼容 0.2.1: #21/#85/#86/#87/#88(bash timeout 恢复、session followup/steer、hung prompt needle ×2)。hooks 30/31/64/65 在 0.2.1 天然 no-op(hooks 包已移除)。
安装(国内网络):
pnpm add C:\path\dsh-purge-1.1.71-0.2.1.rc.2.tgz
# profile 下 .npmrc: registry=https://registry.npmmirror.com
# cordis.patch.yml: - insert: [- name: dsh-purge, config: { hooksDenyBypass: true, postPromptOrder: 5100 }]
# 重启
github.com 可达:dsh plugin install --profile <name> github:cxkctrl24-lgtm/dsh-purge-021
dsh-purge v1.1.68-0.2.1.rc.2 (for dsh 0.2.1-rc.2)
dsh-purge fork v1.1.68-0.2.1.rc.2
dsh-purge 适配 dsh 0.2.1-rc.2 的 fork(基于上游 1.1.67)。
与上游 1.1.67 的差异(只动 8 处,其余 78 个补丁不变)
- 新增 targetFiles 键
harness-dev-context(dsh 0.2.1 新包) - #32/#53 WEB_SURFACE_* 增加 0.2.1 pattern(dsh-harness-dev-context + web-app description 新文案)
- #40 COMPLETE_PROMPT_KEEP_INJECT 增加 0.2.1 requiredContexts 尾部 pattern
- #77 REWIND_DROP_SENT_ON_APPEND 增加 0.2.1 行序 pattern(保留
if (this.revised.size > 0)guard) - #30/#31/#64/#65 hooks 包在 0.2.1 已移除 → 自动 no-op(无回归)
- 版本号 1.1.68-0.2.1.rc.2,dshTarget 0.2.1-rc.2
已验证(0.2.1-rc.2 全树干跑)
- apply: applied 58 / already 8 / missing 7 / skipped 1 / na 5;二次 apply 幂等零漂移
- 6356 个 JS 文件 node --check 全过;0.2.0-rc.2 tally 与基线一致(零回归)
- 实机安装验证:桌面端独立实例启动 + client 模块图含 dsh-purge + dock UI 下发
安装(其他电脑,dsh 0.2.1-rc.2)
方法 A(git,需网络可达 github.com):
dsh plugin install --profile github:cxkctrl24-lgtm/dsh-purge-021
方法 B(release tarball,国内推荐):
- 下载本 release 的 dsh-purge-021-v1.1.68-0.2.1.rc.2.zip
- 解压到 <DSH_HOME>/profiles//dsh-purge
- 在 <DSH_HOME>/profiles//package.json 加:
"dependencies": { "dsh-purge": "./dsh-purge" } - 在 <DSH_HOME>/profiles//cordis.patch.yml 加:
- insert:
- name: dsh-purge
config:
hooksDenyBypass: true
postPromptOrder: 5100
- name: dsh-purge
- insert:
- 重启 dsh