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

插件稳定性审计 chunfenxiazhi-collab/dsh-stability-audit

DeepSeek Harnessv0.13.2
chunfenxiazhi-collab57 天前有提交已提供中文文档扫描:含敏感能力

扫描已装插件,分级风险并给出修复建议

30/100
综合分
1
GitHub 星标
70
npm 周下载
—/5
用户评分

数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-stability-audit
npm 源 · dsh-stability-audit 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/10/29·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 57 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-stability-audit @ 0.13.2
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/7 16:40:42

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 50 处,展示前 40 条)
  • 读取本地文件
    lib/scanner.js:42
    if (!c || !existsSync(c)) continue
  • 读取本地文件
    lib/scanner.js:49
    const self = JSON.parse(readFileSync(path.join(pkgRoot, "package.json"), "utf8"))
  • 读取本地文件
    lib/scanner.js:52
    if (!existsSync(scoped)) continue
  • 读取本地文件
    lib/scanner.js:56
    const p = JSON.parse(readFileSync(pp, "utf8"))
  • 读取本地文件
    lib/scanner.js:66
    try { return readdirSync(dir) } catch { return [] }
  • 读取本地文件
    lib/scanner.js:99
    try { return existsSync(path.join(dir, "packages")) } catch { return false }
  • 读取本地文件
    lib/collect.js:13
    if (!existsSync(pkgPath)) return { plugins: [], preflight: null }
  • 读取本地文件
    lib/collect.js:15
    try { pkg = JSON.parse(readFileSync(pkgPath, "utf8")) } catch { return { plugins: [], preflight: null } }
  • 读取本地文件
    lib/collect.js:23
    const dir = existsSync(nm) ? nm : (existsSync(src) ? src : null)
  • 读取本地文件
    lib/collect.js:28
    if (existsSync(pf)) {
  • 读取本地文件
    lib/collect.js:29
    try { preflight = JSON.parse(readFileSync(pf, "utf8")) } catch { }
  • 写入本地文件
    lib/report-store.js:33
    try { mkdirSync(path.dirname(p), { recursive: true }) } catch { }
  • 读取本地文件
    lib/report-store.js:35
    if (existsSync(p)) {
  • 读取本地文件
    lib/report-store.js:36
    try { prev = JSON.parse(readFileSync(p, "utf8")) } catch { }
  • 写入本地文件
    lib/report-store.js:38
    writeFileSync(p, JSON.stringify(audit, null, 2))
  • 读取本地文件
    lib/dyncheck.js:23
    if (c && existsSync(c)) return c
  • 执行外部命令固定命令
    lib/dyncheck.js:33
    const r = spawnSync("cmd", ["/c", `mklink /J "${link}" "${dir}"`], { timeout: 15000 })
  • 删除本地文件递归
    lib/dyncheck.js:34
    if (r.status !== 0) return { dir, cleanup: () => rmSync(stage, { recursive: true, force: true }) }
  • 删除本地文件递归
    lib/dyncheck.js:35
    return { dir: link, cleanup: () => rmSync(stage, { recursive: true, force: true }) }
  • 执行外部命令来自配置/变量
    lib/dyncheck.js:53
    const inst = spawnSync(process.execPath, [bin, "plugin", "--profile", "headless", "add", addTarget],
  • 执行外部命令来自配置/变量
    lib/dyncheck.js:59
    const boot = spawnSync(process.execPath, [bin, "--profile", "headless", task],
  • 删除本地文件递归
    lib/dyncheck.js:94
    rmSync(home, { recursive: true, force: true })
  • 读取本地文件
    lib/lockscan.js:9
    if (!existsSync(lockPath)) return null
  • 读取本地文件
    lib/lockscan.js:11
    try { text = readFileSync(lockPath, "utf8") } catch { return null }
  • 发起网络请求
    lib/osv.js:18
    return globalThis.fetch(url, opts)
  • 写入本地文件
    lib/remote.js:25
    mkdirSync(destDir, { recursive: true })
  • 读取本地文件
    lib/remote.js:26
    for (const name of readdirSync(srcDir)) {
  • 读取本地文件
    lib/remote.js:29
    const st = lstatSync(s)
  • 写入本地文件
    lib/remote.js:32
    else copyFileSync(s, d)
  • 执行外部命令固定命令
    lib/remote.js:38
    const r = spawnSync("git", ["clone", "--depth", "1", url, dest], { timeout: 120000, encoding: "utf8" })
  • 发起网络请求
    lib/remote.js:50
    const reg = await fetch(regUrl, { signal: AbortSignal.timeout(20000) })
  • 发起网络请求
    lib/remote.js:58
    const dl = await fetch(tarball, { signal: AbortSignal.timeout(30000) })
  • 写入本地文件
    lib/remote.js:60
    writeFileSync(tgz, Buffer.from(await dl.arrayBuffer()))
  • 执行外部命令固定命令
    lib/remote.js:62
    const list = spawnSync('tar', ['-tf', tgz], { timeout: 20000, encoding: 'utf8' })
  • 删除本地文件递归
    lib/remote.js:68
    finally { if (tmp) { try { rmSync(tmp, { recursive: true, force: true }) } catch { } } }
  • 执行外部命令固定命令
    lib/remote.js:87
    sourceCommit = spawnSync("git", ["-C", dest, "rev-parse", "--short", "HEAD"], { timeout: 15000, encoding: "utf8" }).stdout?.trim() || null
  • 执行外部命令固定命令
    lib/remote.js:89
    const ts = spawnSync("git", ["-C", dest, "log", "-1", "--format=%ct"], { timeout: 15000, encoding: "utf8" }).stdout?.trim()
  • 读取本地文件
    lib/remote.js:115
    try { return JSON.parse(readFileSync(path.join(dest, "package.json"), "utf8")).name } catch { return null }
  • 读取本地文件
    lib/remote.js:130
    const pkg = JSON.parse(readFileSync(path.join(dest, "package.json"), "utf8"))
  • 删除本地文件递归
    lib/remote.js:146
    rmSync(stage, { recursive: true, force: true })
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 扫描已装插件
  • 分级稳定性风险
  • 给出修复建议

扫描已安装的 dsh 插件,评估稳定性风险(钩子面、启动开销、预检、依赖),可选隔离安装验证

v0.13.22026-09-08
2026-09-08 实战测试(15 个问题,9/1-9/7 全部修复)又发现 2 个问题: · FIX-5:inject 变量声明用 var/let(变量声明问题,var inject--memgas 报 missing-inject 错误) · FIX-6:package.json 校验报 not-a-plugin(误报,green--plugin-developer-skill 相关) 全部 86 项测试通过,详见 docs/BATTLE-TEST-20260908.md。
v0.13.12026-08-31
?? 2026-08-31 battle-test(13 项检查)发现 4 个问题: · FIX-1:no-entry 与 exports["."]/exports["./client"] 冲突(empty-fort 测试用例) · FIX-2:monorepo workspace 解析(skin-pack/sshworkspaces 测试用例) · FIX-3:unbuilt-entry 在 npm 安装时(git 依赖与 npm 依赖,filesnap 测试用例) · FIX-4:client 入口(dsh.client + client 字段)与 no-bundle 冲突 ?? 84 个测试通过(6 个新增,TDD)?
v0.13.02026-08-27
v0.13.0:--online 聚合 OSV 漏洞(D1 路线图)。 · lib/osv.js:调用 OSV querybatch API,零依赖 · 命令行 --online:从依赖查出已知漏洞 · auditRemote 返回依赖 · 真实验证:dsh-taskboard 的 7 个依赖查出 3 条 GHSA 结果 · 78 个测试全部通过 · npm:dsh-stability-audit@0.13.0
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-stability-audit(插件稳定性审计) 扫描已安装的 DeepSeek Harness (dsh) 插件,在它们搞坏你的 harness 之前给出稳定性风险分级 + 修复建议——静态分析 + 可选隔离安装验证 + 机器可读输出,供任何 agent 快速发现问题和修复方法。 真实案例驱动:本项目每一条判级规则都源自 dsh 生态真实故障案例——barricade 钩子拦截全工具链、codegraph 启动冻结事件循环、trailmap 依赖版本冲突废掉工具层、dsh-tools 单实例破坏、doc-guard/secret-guard inject 缺失启动崩溃、7 插件未构建加载即崩、memento/taskboard 依赖未声明 Cannot find package……规则即排障手册的代码化。 社区插件往往是年轻项目。本插件只回答一个问题:装/留这个插件会不会伤到我的 dsh? 它对每个已装插件给出 🔴/🟡/🟢 分级、证据和 🔧 修复建议,让你用事实决策,而不是凭感觉。
展开完整文档(README 剩余 1 节)
dsh-stability-audit(插件稳定性审计)

扫描已安装的 DeepSeek Harness (dsh) 插件,在它们搞坏你的 harness 之前给出稳定性风险分级 + 修复建议——静态分析 + 可选隔离安装验证 + 机器可读输出,供任何 agent 快速发现问题和修复方法。

真实案例驱动:本项目每一条判级规则都源自 dsh 生态真实故障案例——barricade 钩子拦截全工具链、codegraph 启动冻结事件循环、trailmap 依赖版本冲突废掉工具层、dsh-tools 单实例破坏、doc-guard/secret-guard inject 缺失启动崩溃、7 插件未构建加载即崩、memento/taskboard 依赖未声明 Cannot find package……规则即排障手册的代码化。

社区插件往往是年轻项目。本插件只回答一个问题:装/留这个插件会不会伤到我的 dsh? 它对每个已装插件给出 🔴/🟡/🟢 分级、证据和 🔧 修复建议,让你用事实决策,而不是凭感觉。

为什么需要

- 一个插件可以废掉整个工具层(钩子面——barricade 事故;dsh-tools 单实例——trailmap 事故)
- 启动扫描可以在大工作区上冻结事件循环几分钟(codegraph 事故)
- 坏插件配置让 dsh 静默半激活插件(预检失败)
- @deepseek-ai/* 依赖版本冲突可以杀掉整条工具管线
- 每次故障期都会污染活跃会话(悬空 tool-call),恢复后需清理

这些就是本插件要静态检测的真实故障模式——在踩坑之前。

安装

方式一:npm(推荐,免 allowBuilds 授权,一键安装)
dsh plugin --profile web add dsh-stability-audit

方式二:GitHub 源
dsh plugin --profile web add github:chunfenxiazhi-collab/dsh-stability-audit

重启 dsh web 后,agent 即可调用 stability_audit 工具(直接说"跑插件稳定性审计");也可以命令行使用:

git clone https://github.com/chunfenxiazhi-collab/dsh-stability-audit.git
cd dsh-stability-audit && npm test
node cli.mjs # 扫描真实 web profile
node cli.mjs --dynamic # 附带隔离安装验证(约 2 秒/插件)
node cli.mjs --json # 机器可读输出(其他 agent 消费)
node cli.mjs --remote owner/repo # 远程插件静态预检(clone 到临时目录,不安装)
node cli.mjs --remote owner/repo --dynamic # 远程插件完整预检(clone + 隔离安装冒烟)
node cli.mjs --remote owner/repo --json # 远程预检 JSON 输出

判级维度

| 信号 | 判级 | 案例 |
| 工具钩子/中间件注册(pre/post-execute) | 🔴 | 可拦截整条工具链(barricade) |
| 启动时顶层同步扫描/索引 | 🔴 | 阻塞事件循环(codegraph) |
| 加载期同步访问服务未在 inject 声明 | 🔴 | 启动崩溃(doc-guard/barricade 事故) |
| main 指向未构建源码(TS/缺失文件) | 🔴 | 加载即崩溃(7 插件未构建事故) |
| 预检报告 critical | 🔴 | dsh 启动时已标记 |
| setInterval 轮询 | 🟡 | 更新检查常见;注意频率 |
| ≥10 处全局事件监听 | 🟡 | 每个广播事件都变慢 |
| 未声明 dsh.bundle manifest | 🟡 | 装了但不激活(research-plugins) |
| 依赖 >50 | 🟡 | 依赖树污染风险 |
| 非构建类安装脚本(prepare 等) | 🟡 | npm 生命周期执行任意代码 |
| 延迟访问服务未在 inject 声明 | 🟡 | 运行时可能 undefined(cron 式延迟访问) |
| @deepseek-ai/* 依赖区间不含宿主同步包版本 | 🟡 | pnpm 提升旧版 → 工具层全废(trailmap 事故) |
| 隔离安装 + 启动冒烟 | ✅/❌ | 临时 DSH_HOME + dsh plugin add + headless 启动无 loader 错误 |
| 入口 import 未声明依赖(missing-dep) | 🔴 | 安装后 Cannot find package(taskboard/memento 案例) |
| 无 main 且无候选入口(no-entry) | 🔴 | 加载器按包名导入失败(verify 案例) |
| 数据外泄(process.env 经 fetch/WebSocket 外发) | 🔴 | OpenClaw 341 恶意技能第一大模式 |
| 硬编码远程端点(URL/WebSocket) | 🟡 | 供人工审查(正常 API 调用常见) |
| 工具 schema 非法类型(type: null/undefined) | 🔴 | dsh 0.1.2+ 严格校验拒绝整个请求(codegraph 案例) |

每条命中都附 🔧 修复建议(可执行命令或人工动作),可直接交给用户或其他 agent 执行。

批量测控:--remote 支持多仓库(逗号分隔或空格隔开),可一次预检一批网上插件(clone → 静态 → 隔离安装冒烟,全程不影响宿主)。实测样例见 docs/audit-report.md(18 个插件核查后判定)。

工作原理

1. 从 ~/.dsh/profiles//package.json 收集插件(node_modules + plugin-src)
2. 静态扫描:入口文件 + package.json 信号(正则实现,零依赖、无 AST)
3. 可选动态验证(lib/dyncheck.js):临时 DSH_HOME → 隔离 dsh plugin add → headless 启动 → loader 错误扫描 → 清理
4. 可选远程预检(lib/remote.js):git 浅克隆到临时目录 → 静态规则 →(可选)隔离安装冒烟 → 清理
5. 渲染报告:Markdown(人读)或 JSON(--json,schema dsh-stability-audit/v1,agent 读)

原则:只读、绝不运行被审插件、零副作用。分级是"供人工确认的建议",不是判决。

架构图

dsh-stability-audit 运行时架构图

运行时架构图由 dsh-archify 绘制(MIT——tt-a1i/archify 的 dsh 移植版,上游亦 MIT,源出 Cocoon AI 的 "architecture-diagram-generator")。MIT 声明已内嵌于渲染 HTML 的 head;规格与评估记录随仓库保存:

- 规格(中文):runtime.architecture.json
- 渲染版(交互、引导视图):docs/dsh-stability-audit-architecture.html
- English version: README.md — architecture diagram in English
- 评估记录:docs/ARCHIFY-EVALUATION.md

JSON 输出(供 agent 消费)

node cli.mjs --json

每插件输出:name / version / grade / source / dynamic / findings[],每条 finding 含 ruleId / severity / desc / evidence / fix(修复建议)。其他 agent 可直接据此自动修复或提示用户。

已知局限(诚实清单)

- 静态分析测不了运行时行为(钩子抛错、真实卡顿时长)——🔴 表示"需要查",不是"必然坏"
- 隔离启动用 headless profile:依赖 web 专属服务(如 storageDomain)的插件在隔离环境显示 ❌ 但 web 里可能正常——当作"环境依赖提示"
- 运行时探针(事件循环延迟、钩子耗时)在 v2 路线图
- 修复建议是提示而非自动执行:环境差异大(junction/overrides 等修复依赖具体机制),agent 应先确认再执行

隔离测控 vs 真实环境(能测到什么、测不到什么)

隔离测控(临时 DSH_HOME + headless 冒烟)回答的是:"这个插件能不能独立装上去、能不能正常启动"——过滤掉约 80% 的坑(未构建、inject 缺失、依赖冲突、加载崩溃)。

| 维度 | 隔离环境 | 真实 web profile | 影响 |
| 服务 | headless 启动 | web 服务 + 全部宿主服务 | 依赖 webServer/webRuntime 的插件在隔离里 pending,判不出真实行为 |
| 插件共存 | 只装被测 1 个 | 多个插件互相作用 | 插件间冲突测不出(钩子互踩、服务覆盖) |
| 配置 | 空配置 | 真实 config(API key、模型、路径) | 依赖配置的插件路径测不到 |
| 凭据/网络 | 无 API key | 有模型 API | 需真实调 LLM 的功能只冒烟不实跑 |
| 数据 | 空存储 | 真实会话/库 | 数据迁移类插件测不到 |
| 运行时长 | 启动冒烟(秒级) | 常驻运行(小时/天) | setInterval 泄漏、内存增长测不到 |
| 权限/构建 | 同机器同权限 | 同机器同权限 | ✅ 一致 |

建议用法:隔离测控做批量筛查,🔴/❌ 直接排除;筛选后想用的插件再走"手动装 + 观察"的谨慎流程。不建议自动在真实环境试插件——插件有真实破坏力(见 dsh-troubleshooting 系列事故)。

发布与版本

- 发布流程见 RELEASE.md(GitHub + npm + Release 三渠道同步)
- npm: https://www.npmjs.com/package/dsh-stability-audit
- GitHub Release(含 tarball 资产): https://github.com/chunfenxiazhi-collab/dsh-stability-audit/releases

许可

MIT (c) 2026 chunfenxiazhi

贡献

欢迎 issue 和 PR。测试:npm test(node:test,零依赖)。

提交约定:commit message 用英文标题 + 中文正文(如 feat: remote plugin pre-audit),兼顾国际可读性。
预览分享卡片长什么样 ↓chunfenxiazhi-collab/dsh-stability-audit
分享 · DeepSeek Harness Hub
chunfenxiazhi-collab/dsh-stability-audit

扫描已装插件,分级风险并给出修复建议

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部