🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

插件清道夫 gausszhou/dsh-scavenger

DeepSeek 客户端
gausszhou40 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

扫描并禁用导致启动报错的插件,可一键回滚

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 安装
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 40 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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 — 目录结构与模块职责
预览分享卡片长什么样 ↓gausszhou/dsh-scavenger
分享 · DeepSeek Harness Hub
gausszhou/dsh-scavenger

扫描并禁用导致启动报错的插件,可一键回滚

回到顶部