Skip to content

Releases: cxkctrl24-lgtm/dsh-purge-021

fork1 b0-2: postinstall 移除 + #83 迁移腿首次随包发出

Choose a tag to compare

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

生效判据(重启后)

  1. purge_status 版本串显示 1.1.79-0.2.1.rc.2-fork1-b0-2;
  2. 宿主 resources/app/lib/main.js 里出现 dsh-purge-host-exit.log(#83 迁移腿已落);
  3. 之后宿主被信号杀死会留一行诊断,而不是什么都没有。

详见 CHANGELOG-fork1.md §八 / §九。

v1.1.73: fix phantom client.inject deps

Choose a tag to compare

@cxkctrl24-lgtm cxkctrl24-lgtm released this 24 Oct 05:55

移除 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

Choose a tag to compare

schtasks /TR 参数上限 261 字符,长 PS1 路径+参数超限导致任务创建失败回退直接 spawn(又被 Job 杀)。修复:PS1 参数写进 .cmd 启动器,/TR 只引用短路径。

v1.1.72-2 hotfix: job-safe swap via schtasks

Choose a tag to compare

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

Choose a tag to compare

修复 v1.1.72 首版 swap 不触发的问题:

  1. swap 检测原来放在 autoApplyOnStart 分支之后——autoApplyOnStart 默认 false,
    settle 在 boot:host-untouched 早退,永远到不了 swap 分支。现移到
    settleInstalledPatches 入口(life 检查之后)。
  2. 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)

Choose a tag to compare

@cxkctrl24-lgtm cxkctrl24-lgtm released this 22 Oct 16:37

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 没做。

本版改动

  1. desktop.js 新增 detectSealedButUnswapped(exe):sealed(asar 在)+
    解包树在 + 解包树已带补丁 marker → 判定 swap 未完成
  2. index.js settle 流程:sealed-but-unswapped 且补丁树就绪时,自动走一次
    asar-swap 重启(杀宿主 → app.asar 改名 .bak → 重启 exe → Electron 加载
    resources\app\ 补丁树)。swap 只发生一次(asar 挪走后条件永久消失)
  3. 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)

Choose a tag to compare

修复 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)

Choose a tag to compare

@cxkctrl24-lgtm cxkctrl24-lgtm released this 20 Oct 12:42

基于上游 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 注释):

  1. targetFiles 新增 harness-dev-context key(0.2.1 起 WEB_SURFACE 文案搬到 dsh-harness-dev-context 包)
  2. #32 WEB_SURFACE_IDENTITY_NEUTRAL:file 加 harness-dev-context + 2 条 0.2.1 pattern + 第 3 个 marker
  3. #53 WEB_SURFACE_PROHIBITION:file 加 harness-dev-context;do-not-start 句改为 scoped( `; 尾),保住 LEGACY_WEB_SURFACE.suffix;新增链式收成 Local web GUI 的替换
  4. #40 COMPLETE_PROMPT_KEEP_INJECT:新增 0.2.1 requiredContexts 尾巴 pattern(放首位)
  5. #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)

Choose a tag to compare

@cxkctrl24-lgtm cxkctrl24-lgtm released this 20 Oct 10:55

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,国内推荐):

  1. 下载本 release 的 dsh-purge-021-v1.1.68-0.2.1.rc.2.zip
  2. 解压到 <DSH_HOME>/profiles//dsh-purge
  3. 在 <DSH_HOME>/profiles//package.json 加:
    "dependencies": { "dsh-purge": "./dsh-purge" }
  4. 在 <DSH_HOME>/profiles//cordis.patch.yml 加:
    • insert:
      • name: dsh-purge
        config:
        hooksDenyBypass: true
        postPromptOrder: 5100
  5. 重启 dsh