26 Commits
Author SHA1 Message Date
叫我小杨同学 f4dcff3c42 chore: 仓库迁到 HunYiSage/dsh-purge;README 改为团队维护口吻
- 代码与文档中的旧账号地址全部换新(自更新 REPO、演练台标签查询、
  package.json 仓库与安装地址、README 徽章与安装命令)
- 三份 README 的「作者说几句 / A note from the author / 作者より」
  改为团队说明,写明由维护团队接手、原作者署名保留
- 署名要求、许可证、免责声明、演练台法律声明、欢迎页文案的责任主体
  统一为维护团队
- 联系方式统一为团队频道 t.me/LLM_PoJia
- NOTICE 增加维护团队行;LICENSE-COMMERCIAL 联系方式改为团队渠道;
  package.json 增加 author 字段
- README 版本号同步当前 1.1.90;适配范围改为「1.1.81 及更高版本」
- 本次仅改文档与地址,不升版本、不发行
2026-11-04 00:38:15 +08:00
叫我小杨同学 c63ba4a720 fix: 工作目录字面量恢复 + 桌面退出留痕,版本 1.1.89(#202/#204/#207) 2026-11-02 14:07:45 +08:00
叫我小杨同学 d1eff01eb6 fix: 补丁 rc.2/rc.5 双版本适配,版本 1.1.88 2026-11-02 01:31:15 +08:00
叫我小杨同学 335ddee90f fix: 全仓审计加固与死代码清理,版本 1.1.87
- 回滚/备份:空 bak 改名 .bad 跳过;升级刷新 bak 补上单数 marker 补丁;统一原子写
- 补丁命中:optional 命中不符记软失败;#42 插入型替换加探针防重复插入
- Windows:进程枚举改用 | 分隔 + UTF-8,修复中文路径换包不杀旧进程;换包失败拉起原版
- 安全:asar 解包防越界;红队路径校验 realpath 防空 symlink;更新仅 https;报告回放去换行注入
- 提示词钩子:停用后 rewriteFn 返回原装配文本并清理 assemble guard;缓存签名纳入红队/策略/override
- 红队:listEngagements 默认不算统计;listVulns/报告支持 evidenceLimit
- 子代理名额占位即时生效并回退;--apply 有失败项退出码 1
- 清理:删除 lib/mnemon-settings.js 及 13 处死代码/未使用 import;移除 test 目录与 test 脚本
2026-11-01 21:47:03 +08:00
叫我小杨同学 1bdf239970 fix: 回收流程防 PID 复用误杀并等待端口释放,版本 1.1.86(#197/#198)
合并 #197/#198 后加固:记录 pid 命令行不可读时必须在监听端口上才杀;杀不掉保留记录下次重试;taskkill 后等待进程退出再绑端口。桌面换包顺序与失败兜底随 PR #198 一并发布。
2026-11-01 01:33:14 +08:00
叫我小杨同学 52d3b2a2f2 Merge pull request #198 from iigzx/fix/desktop-asar-swap
fix(desktop): 换包先杀 Electron main,挪不动时把原版拉起来 (#197)
2026-11-01 01:32:13 +08:00
iigzx 7fddfe3913 fix(desktop): 换包先杀 Electron main,挪不动时把原版拉起来 (#197)
- ASAR_SWAP_PS1 先按安装根路径 + 非 --type= 识别并 kill Electron main,再扫安装目录其余进程:main 是唯一会弹「host stopped」的对话框来源,先杀它就不会出现 host 死了 main 还活着的半死状态
- 挪包失败的分支补上 Start-Process:用户至少拿到原版应用,不再面对空桌面;失败原因写入 %TEMP%\\dsh-purge-desktop.log
- 导出 ASAR_SWAP_PS1 并新增 test/desktop-asar-swap.test.js(3 例,守住顺序与两条重启分支)
- 全量 node --test 94/94 通过
2026-10-31 21:51:32 +08:00
iigzx 8d237baf9b fix(web): boot 前回收 detached 残留 server,修 EADDRINUSE 起不来 (#197)
- restart-web.js 把后台 server 的 pid/url 记到 \/dsh-purge/web-server-<port>.json
- killOldServer 增加按端口兜底:清掉旧版本留下、没有 pid 记录的孤儿
- 新增 lib/bin-preflight.js:把回收钩子注入宿主 bin.js 顶部,早于 Cordis 激活与 webserver 绑端口
- 重启时打印『后台运行、关窗不会停』,避免把提示符返回误判成程序已退出
- 新增 test/web-reclaim.test.js(7 例),全量 node --test 91/91 通过
2026-10-31 21:30:17 +08:00
叫我小杨同学 af473428ed release: 1.1.84,尾部锚点与子代理审批接管,红队模式中文化,#194/#188
- 接线 lib/anchor.js:锚点物理追加到 system prompt sections 末尾,
  identity.js 支持 anchorText(对象/字符串两种入参),已有同名段先滤再追加;
  锚点改为跟随操作者语言,删除写死的英文开头句(红队回答变英文的根因)
- 接线 lib/subagent-control.js:子会话 approval/policy=never 改回 ask,
  并在 approval/request 瀑布放行;anchorMode/subagentControl 提供回滚开关
- index.js:真实 anchorApplied / injectTail 判定、审批策略探针、iso 分支
  注册锚点、applyHostHooks 注册锚点与子代理接管并统一释放
- office 技能自愈:core/desktop 增加 healOfficeSkillsRuntimeOnDisk,桌面端触发
- 红队模式中文化:preset 文案、角色名、五阶段、25 项计分规则与 POC 分类、
  技能修复说明、环境适配提示、面板报错、成果报告与复现报告
- #194:hung-operator 改按内容变更缓存,加风暴/慢调用熔断;WeakMap 去重
  同次 assemble 的重复改写;新增 #91 记录宿主信号退出的持久化日志
- #188(rc.4 专属部分):新增 #89 沙箱策略去品牌、#90 skill-badge 中文描述,
  扩展 #32/#53 的 rc.3 变体与 marker,均 optional
- 新增锚点接线与红队文案测试,81/81 通过
2026-10-31 01:51:15 +08:00
叫我小杨同学andClaude 6f9c500bb5 fix: 补丁失配判定加 drifted,宿主版本门禁与 expect 命中数契约(#188 通用部分)
从 PR #188(Pluto-Yt,fix/drift-detection)手改取通用部分落地,不含
0.2.1-rc.3 专属适配:

- 补丁失配不再静默成 skipped:文件在、marker 没有、pattern 一条都不中
  → 新增 drifted 状态(filePatchOutcome / patchStatus / rollupPatchStatus)。
  以前这种情况一律返回 skipped 并被当软成功,官方一升级插件就静默失效,
  状态页却全绿
- isSelfMarkedPatch() 例外:pattern 本身就是本插件写进宿主的痕迹
  (#80 撤销型),找不到 = 本来没加过或已撤过,仍算 skipped
- ALWAYS_SOFT_STATUSES 去掉 skipped;skipped 改为只有可选/自标记型才算
  软成功;drifted 看得见(状态页标红、不计入 ready)但不阻断 Apply,
  免得把 0.1.6 / 0.2.0 / 0.2.1-rc.2 上的用户堵死
- tallyDisplayPatches / rollupDisplayStatus:drifted 压过 applied
- ensureHostClean 不再过滤 pattern_not_found:没打上就是没打上
- 宿主版本门禁:读 package.json 的 dshTarget,比对宿主真实版本,
  gatherState 暴露 host_version / host_target / host_supported,
  CLI 与状态页在未适配时直接告警
- applyReplacementsToText 支持 { pattern, replace, expect } 命中数契约:
  命中数与声明不符就整条拒写,并回传实际命中数
- #77 锚点容错:写死 5 行改成锚首尾 + 非贪婪窗口 (?:(?!isRewindMarker)[\s\S]){0,300}?,
  官方在中间插一行也照样命中;窗口排除 isRewindMarker 保证二次应用不叠加

额外修的 bug:

- rollupPatchStatus 的 lastError 提到最前:以前只在 strictFiles 分支里返回,
  一个文件写成功就把别的文件 EACCES / read_error 吞成绿
- applyReplacementsToText 的 expect 契约原先只对字面量 pattern 生效,正则
  分支直接 continue 掉了 —— 官方把同一段代码复制成两份时正则会把两处一起
  改掉,补上正则分支的命中数检查
- patchStatus 的 drifted 计数排在 strictFiles 的 unmatched 之前:严格补丁的
  文件宿主一定在,原文对不上只可能是上游漂移,报 drifted 比 unmatched 更准
- 与 PR 的有意偏差:rollupPatchStatus 里 drifted 排在 already 之后。
  多文件补丁(#50/#57/#62)有个别文件本来就不含这段代码(barrel 文件),
  按 PR 的顺序会把这几条从 already/applied 翻成 drifted,制造假告警

未取(0.2.1-rc.3 专属、与通用逻辑无法拆开):新增 targetFiles 键
(harness-dev-context / skill-badge)、#32/#53 扩到 rc.3 新位置、
新增 #89 SANDBOX_POLICY_BRAND_NEUTRAL 与 #90 SKILL_BADGE_DESCRIPTION_NEUTRAL

新增 test/patch-status.test.js(29 条,全量 74 条全过)

Based-on: PR #188 by Pluto-Yt

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-30 13:09:35 +08:00
叫我小杨同学andClaude 6533b08004 fix: cordis.patch.yml 为 [] 时替换而非追加,修复宿主启动解析失败(#191)
宿主生成的 profile 层 cordis.patch.yml 可能整体只有一个空 flow 序列 [],
那本身就是一个完整 YAML 文档。旧实现无条件在文件尾追加 `- insert:`,
结果是第二个文档,宿主启动解析报
"end of the stream or a document separator is expected" 直接崩掉
(macOS DSH Desktop 0.2.1-rc.4)。

- 新增 classifyPatchBody() 判断数据部分形态:empty / empty-flow /
  block-seq / flow-seq / unknown,只看最后一个文档的根节点
- 空 flow 序列([] 或 [ ],可带 --- 前缀)→ 把整行替换成 insert 块,
  绝不追加成第二个文档
- 空文件 / 只有注释和空行 → 写 insert 块,注释保留
- 正常块序列 → 沿用旧的追加行为,前导空行规则不变
- 非空 flow 序列(宿主/用户内容)以及认不准的形态 → 不动,
  返回 { ok: false, wrote: false },宁可留着也别写坏
- postinstall 脚本区分「跳过」和「已有」,跳过时打印说明
- profileHasPurgeBodyInsert() 检测逻辑未动
- 新增 9 条用例(形态分类 / 空文件 / 只有注释 / 注释+[] / ---+[] /
  块序列追加 / 非空 flow 不写 / 已有本体行零写入 / 替换后幂等),
  版本 1.1.83

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-30 12:26:23 +08:00
叫我小杨同学andClaude 97e4e6094d fix: allowBuilds 只写裸包名,清除所有 dsh-purge@* 键,避免 pnpm 11 崩溃(#185)
- pnpm 的 allowBuilds 按包名匹配,裸包名 dsh-purge 对 tarball / git /
  registry 三种安装形态都放行;而 dsh-purge@https://... 这类键在 pnpm 11
  (DSH 内置 11.2.2)会被 semver 解析器当成版本联合,直接报
  [ERR_PNPM_INVALID_VERSION_UNION] Invalid versions union 让 install 崩掉
- purgePnpmBuildSpecs() 只返回 ["dsh-purge"],不再拼 tarball URL 键
- 自愈时所有 dsh-purge@* 历史键(URL 键、旧截断键 dsh-purge@https、
  @1.1.81 之类版本键)一律丢弃,只保留裸包名;非 purge 键原样保留
- 删除随之失效的 readPurgeTarballFromLock() / readPkgTarball()
- 新增用例:输入只含 URL 键时重写后只剩裸包名;健康文件重写输出等于输入,
  零写入

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-30 12:25:32 +08:00
叫我小杨同学 0c933dc7d3 fix: allowBuilds URL 键截断与污染自愈,健康文件零写入(#180)
- parseAllowBuildLine 未引号键只在冒号+空白处切分,URL 键不再截断;
  引号键照旧,行尾无值也能解析
- 含 :// 的键写回加引号,避免 YAML 冒号歧义
- 重写只保留精确等于期望键的 dsh-purge@*,畸形/过期键自动清掉
- 期望键优先读 profile 的 pnpm-lock.yaml 实际 tarball(固定 commit 安装
  不再有双 URL 键),退回 package.json,再退裸包名;profileDir 参数可选
- 重写结果先过最小校验(键不重复、round-trip 无损),不过不写盘;
  健康文件 next === current 零写入
- 新增 test/profile-insert.test.js(13 条,全量 36 条全过),版本 1.1.82
2026-10-28 20:14:18 +08:00
叫我小杨同学 ca7cd47a3d fix: 收录 DSH NEXT 识别与单测(#174 #175)
#171/#173 已在 1.1.80;#174 按官方 asar 路径认 DSH NEXT,不把任意 app.asar 当桌面。
2026-10-28 00:03:24 +08:00
叫我小杨同学 d4d1c16252 1.1.80: 修复 bug,修复稳定性(#168 #169 #170 #172 #176) 2026-10-27 23:34:55 +08:00
叫我小杨同学 bb93c6a2b6 1.1.79: 修复 bug,修复稳定性(#165 #166 #167) 2026-10-27 01:25:57 +08:00
叫我小杨同学 18fe3b51cb fix: 命令撞名只丢那一条;主插件 insert 自愈(#162 #159) 2026-10-26 11:15:56 +08:00
叫我小杨同学 95102b0bb2 fix: Apply 不再覆盖 npm 全局 dsh 软链;pnpm/plugin add 补本体 insert(#157 #154 #155) 2026-10-24 20:38:05 +08:00
叫我小杨同学 90fa8fe894 fix: 停用/卸载时清掉 selectedDefault=redteam(#108) 2026-10-24 14:42:42 +08:00
叫我小杨同学 ac58b3e355 1.1.77: 修复 bug,修复稳定性(长红队任务公网门禁) 2026-10-24 01:51:07 +08:00
叫我小杨同学 5a9b8e1485 1.1.74: 优化 bug(靶场门禁、预设加载、演练台中文、禁止外挂) 2026-10-23 18:15:45 +08:00
叫我小杨同学 51afafdd2c fix: judge lab targets by resolved private IPs, not domain suffixes. 2026-10-23 18:04:32 +08:00
叫我小杨同学 ba12c91ca0 fix: strip leftover toolFilter from installed redteam presets on DSH 0.2.1. 2026-10-23 17:46:57 +08:00
叫我小杨同学 6cb2ac32ba fix: seal object JSON schemas so redteam preset loads on DSH 0.2.1. 2026-10-23 17:44:58 +08:00
叫我小杨同学 ca848d767e fix: restore Chinese UI for the drill console. 2026-10-23 16:08:10 +08:00
叫我小杨同学 679a3db1cc 1.1.73: open-source local-lab only; drop skills and knowledge base. 2026-10-23 15:55:53 +08:00