扫描并禁用导致启动报错的插件,可一键回滚
29.4/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/gausszhou/dsh-scavenger.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 40 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 52 处,展示前 40 条)
- 读取本地文件src/checker/compose.ts:123
return parsePatchText(readFileSync(path, 'utf8')) - 读取本地文件src/checker/compose.ts:334
if (!existsSync(path)) { - 读取本地文件src/checker/index.ts:80
for (const entry of readdirSync(join(dshInstallDir, 'node_modules', '@deepseek-ai'), { withFileTypes: true })) { - 读取本地文件src/checker/index.ts:92
const manifest = JSON.parse(readFileSync(join(base, 'node_modules', name, 'package.json'), 'utf8')) as { version?: unknown } - 读取本地文件src/checker/index.ts:114
const root = readdirSync(join(profileDir, 'node_modules'), { withFileTypes: true }) - 读取本地文件src/checker/index.ts:123
for (const scoped of readdirSync(join(profileDir, 'node_modules', name), { withFileTypes: true })) { - 读取本地文件src/checker/index.ts:137
text = readFileSync(join(profileDir, 'pnpm-lock.yaml'), 'utf8') - 读取本地文件src/checker/index.ts:157
if (!existsSync(path)) return { label, kind: 'user', patches: [], parseError: null, path } - 读取本地文件src/checker/resolve.ts:56
if (existsSync(join(candidate, 'package.json'))) return candidate - 读取本地文件src/checker/resolve.ts:69
if (existsSync(join(candidate, 'package.json'))) return candidate - 读取本地文件src/checker/resolve.ts:87
if (env !== undefined && env !== '') return existsSync(env) ? env : null - 读取本地文件src/checker/resolve.ts:105
let dir = existsSync(resolved) && !existsSync(join(resolved, 'package.json')) ? dirname(resolved) : resolved - 读取本地文件src/checker/resolve.ts:109
if (existsSync(manifest)) { - 读取本地文件src/checker/resolve.ts:111
const pkg = JSON.parse(readFileSync(manifest, 'utf8')) as { name?: string } - 读取本地文件src/cleaner.ts:87
targetMissing: !existsSync(target), - 读取本地文件src/cleaner.ts:173
const original = existsSync(target) ? readFileSync(target, 'utf8') : '' - 读取本地文件src/cleaner.ts:173
const original = existsSync(target) ? readFileSync(target, 'utf8') : '' - 写入本地文件src/cleaner.ts:199
writeFileSync(target, next, 'utf8') - 写入本地文件src/cleaner.ts:207
mkdirSync(backupDir, { recursive: true }) - 写入本地文件src/cleaner.ts:210
if (existsSync(target)) copyFileSync(target, backupFile) - 读取本地文件src/cleaner.ts:210
if (existsSync(target)) copyFileSync(target, backupFile) - 写入本地文件src/cleaner.ts:221
writeFileSync(join(backupDir, STATE_MANIFEST), `${JSON.stringify(state, null, 2)}\n`, 'utf8') - 读取本地文件src/cleaner.ts:236
if (!existsSync(base)) return [] - 读取本地文件src/cleaner.ts:238
for (const entry of readdirSync(base, { withFileTypes: true }).filter((e) => e.isDirectory()).sort((a, b) => b.name.localeCompare(a.name))) { - 写入本地文件src/cleaner.ts:274
copyFileSync(match.backupFile, match.target) - 删除本地文件递归src/cleaner.ts:275
rmSync(match.dir, { recursive: true, force: true }) - 读取本地文件src/cli.ts:143
raw = readFileSync(file, 'utf8') - 读取本地文件src/cli.ts:172
return readdirSync(join(home, 'profiles'), { withFileTypes: true }) - 读取本地文件src/cli.ts:173
.filter((e) => e.isDirectory() && existsSync(join(home, 'profiles', e.name, 'package.json'))) - 写入本地文件src/cli.ts:184
writeFileSync(file, `${JSON.stringify(plan, null, 2)}\n`, 'utf8') - 读取本地文件src/gate.ts:58
if (existsSync(candidate) && existsSync(join(candidate, 'package.json'))) { - 读取本地文件src/gate.ts:82
manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) - 读取本地文件src/gate.ts:120
if (!existsSync(patchPath)) { - 读取本地文件src/gate.ts:232
if (existsSync(selfPath)) { - 读取本地文件src/gate.ts:233
const self = JSON.parse(readFileSync(selfPath, 'utf8')) as { name?: unknown; version?: unknown } - 读取本地文件src/gate.ts:236
const manifest = JSON.parse(readFileSync(join(base, 'node_modules', name, 'package.json'), 'utf8')) as { version?: unknown } - 读取本地文件src/inspector/services.ts:31
text = readFileSync(path, 'utf8') - 读取本地文件src/inspector/services.ts:64
entries = readdirSync(dir, { withFileTypes: true }) - 读取本地文件src/inspector/services.ts:88
for (const entry of readdirSync(scope, { withFileTypes: true })) { - 读取本地文件src/inspector/services.ts:91
if (statSync(libDir, { throwIfNoEntry: false })?.isDirectory()) {
扫描于 2026/11/1(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 扫描启动报错插件
- 禁用问题插件
- 一键回滚
README
由 DeepSeek 最新模型翻译生成dsh-scavenger 🧹🛡️
清扫 DeepSeek Harness (DSH) profile:静态分析找出导致报错的插件并清理它们(plan → apply,自动备份可回滚)。不启动 DSH、不导入插件代码(契约检查在隔离的 worker 线程沙箱里进行)。
状态:可用(v0.1.0)。静态分析(组合/解析/契约层)+ 清理(plan/dry-run、--apply 写盘、rollback 回滚)+ 安装前 gate。TypeScript + ESM。
前身 dsh-plugin-guardian(原定位:纯检查守卫)已并入本仓库并重构。
定位
一个独立的 DSH 插件静态分析 CLI:扫描 profile 的组合 / 解析 / 契约三层,找出会导致 DSH 启动报错的插件行(缺包、坏 specifier、非 Cordis 插件形态、Config schema 不合法、inject 服务无提供者等),并安全地清理它们(--apply 追加 disabled: true 禁用行,自动备份、可回滚),另提供安装前门禁 gate。
展开完整文档(README 剩余 1 节)
dsh-scavenger 🧹🛡️ 清扫 DeepSeek Harness (DSH) profile:静态分析找出导致报错的插件并清理它们(plan → apply,自动备份可回滚)。不启动 DSH、不导入插件代码(契约检查在隔离的 worker 线程沙箱里进行)。 状态:可用(v0.1.0)。静态分析(组合/解析/契约层)+ 清理(plan/dry-run、--apply 写盘、rollback 回滚)+ 安装前 gate。TypeScript + ESM。 前身 dsh-plugin-guardian(原定位:纯检查守卫)已并入本仓库并重构。 定位 一个独立的 DSH 插件静态分析 CLI:扫描 profile 的组合 / 解析 / 契约三层,找出会导致 DSH 启动报错的插件行(缺包、坏 specifier、非 Cordis 插件形态、Config schema 不合法、inject 服务无提供者等),并安全地清理它们(--apply 追加 disabled: true 禁用行,自动备份、可回滚),另提供安装前门禁 gate。 实现上不启动 DSH、不导入插件代码:契约检视在隔离的 worker 线程沙箱中只读插件声明(默认导出 / .inject / .Config,从不调用 apply());组合层语义精确镜像 DSH boot 的 applyEntryPatches。 安装与使用 npm install -g @gausszhou/dsh-scavenger # 全局安装 CLI(Node >= 20) 本地开发构建: pnpm install && npm run build # tsdown → lib/(esm + d.ts) 主命令:找出导致报错的插件(dry-run,绝不会写盘) dsh-scavenger --profile web 清理:把导致报错的插件行禁用到 profile 的 cordis.patch.yml(自动备份) dsh-scavenger --profile web --apply 回滚/查看备份 / 纯检查 / 安装前门禁 dsh-scavenger rollback [backupId] --profile web dsh-scavenger backups --profile web dsh-scavenger check --profile web [--json] dsh-scavenger gate ./my-plugin-bundle [--host-profile web] [--json] 退出码:主命令与 check 均为 0 = 干净(或已清理干净);1 = 存在会阻断启动的插件(plan 已展示,--apply 才会动手)。--apply 后仍有 1 = 残余错误不可通过禁用行清除。2 = 用法/IO 故障。 常见组合: dsh-scavenger --profile web --apply && dsh web # 先清后启 文档 - docs/design.md — 设计方案(生态定位、总体架构、检查项分级 A–E、里程碑)与实现要点 - docs/research.md — DSH 插件体系调研(架构、错误形态实测、生态对照、版本差异) - docs/verification.md — 实测验证与测试(坏插件夹具全链、真实 profile 结果、单测说明) - docs/structure.md — 目录结构与模块职责
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
gausszhou/dsh-scavenger
扫描并禁用导致启动报错的插件,可一键回滚
相关插件 · 其他
模型破甲清洗YuJunZhiXue/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 14,822已汉化DeepSeek 客户端
73
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 718已汉化DSH
71.2
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,261已汉化DSH
70.7
破甲评测WoYun520/dsh-purge
在本机分离宿主拦截与模型拒绝,做受控红队评测
★ 199已汉化DSH
69.7