每次装载插件时拦截重复条目,防止启动崩溃
28.1/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/Lstalu/dsh-bundle-dedup-guard.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 74 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 32 处,展示前 15 条)
- 读取本地文件lib/check.mjs:35
return JSON.parse(await readFile(filePath, 'utf8')) - 读取本地文件lib/check.mjs:45
entries = await readdir(root, { withFileTypes: true }) - 读取本地文件lib/check.mjs:67
entries = readdirSync(root, { withFileTypes: true }) - 读取本地文件lib/check.mjs:75
const manifest = JSON.parse(readFileSync(join(root, entry.name, 'package.json'), 'utf8')) - 读取本地文件lib/check.mjs:98
if (statSync(join(dir, 'package.json')).isFile()) return dir - 读取本地文件lib/check.mjs:215
text = await readFile(patchPath, 'utf8') - 写入本地文件lib/check.mjs:349
await mkdir(dir, { recursive: true }) - 写入本地文件lib/check.mjs:359
await writeFile(file, JSON.stringify(body, null, 2), 'utf8') - 写入本地文件lib/check.mjs:360
await writeFile(join(dir, `${safeName}.latest.json`), JSON.stringify(body, null, 2), 'utf8') - 读取本地文件lib/site-health.mjs:55
const real = await realpath(anchor) - 读取本地文件lib/site-health.mjs:67
if ((await stat(lock)).isFile()) return root - 读取本地文件lib/site-health.mjs:91
lock = JSON.parse(await readFile(lockPath, 'utf8')) - 读取本地文件lib/site-health.mjs:114
st = await stat(dir) - 读取本地文件lib/site-health.mjs:136
pkg = JSON.parse(await readFile(join(dir, 'package.json'), 'utf8')) - 读取本地文件lib/site-health.mjs:165
for (const entry of await readdir(scopeDir)) {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 拦截重复加载器条目
- 防止启动崩溃
DSH 插件守卫:每次加载插件时捕获重复的加载器条目 id,防止「duplicate loader entry id」启动崩溃
README
由 DeepSeek 最新模型翻译生成dsh-bundle-dedup-guard
CI
npm version
[node]()
License
DeepSeek Harness 插件守卫:每次装载插件时检查 profile 的 bundles 列表是否存在重复 loader 条目,并对整机插件环境做站点级体检(vendor 依赖树、插件 @deepseek-ai junction、已知冲突对)。
当 profile 的 dsh.profile.bundles 同时列出聚合包(其 patch 一次性插入全部子插件条目,如 @linxin666/dsh-web-ui-all)和它的子插件时,loader 会对同一 loader 条目 id 收到两次 insert。EntryGroup.update 在任何插件条目创建之前就抛 duplicate loader entry id: ,整个 profile 启动失败。本插件让这类问题不再无声发生。
为什么存在
2026-08-18 事故:web profile 同时列出了 @linxin666/dsh-web-ui-all(聚合 13 个子插件为一个 patch)和全部 13 个子插件。每个子插件 id 被 insert 两次,第一个被撞上的是 duplicate loader entry id: ui-dsh-aionui-panel。
展开完整文档(README 剩余 1 节)
dsh-bundle-dedup-guard CI npm version [node]() License DeepSeek Harness 插件守卫:每次装载插件时检查 profile 的 bundles 列表是否存在重复 loader 条目,并对整机插件环境做站点级体检(vendor 依赖树、插件 @deepseek-ai junction、已知冲突对)。 当 profile 的 dsh.profile.bundles 同时列出聚合包(其 patch 一次性插入全部子插件条目,如 @linxin666/dsh-web-ui-all)和它的子插件时,loader 会对同一 loader 条目 id 收到两次 insert。EntryGroup.update 在任何插件条目创建之前就抛 duplicate loader entry id: ,整个 profile 启动失败。本插件让这类问题不再无声发生。 为什么存在 2026-08-18 事故:web profile 同时列出了 @linxin666/dsh-web-ui-all(聚合 13 个子插件为一个 patch)和全部 13 个子插件。每个子插件 id 被 insert 两次,第一个被撞上的是 duplicate loader entry id: ui-dsh-aionui-panel。只修 bundles 列表还不够—— dsh plugin 的 reconcilePlugins 会在每次 pnpm 操作后把 *dependencies 里所有声明了 dsh.bundle 的包按依赖顺序追加回 bundles,一小时后子插件被重新写回,下次启动又崩。 2026-08-21 事故:插件批量更新清空了各插件的 node_modules(8 个插件以 Cannot find package 崩溃);修复时 npm install 顺着 @deepseek-ai junction 跑进 vendor 树把它搅坏;依赖修好后 dsh-better-sidebar 又被双入口挂载(/sidebar/api 重复路由崩溃)。v0.2.0 把这些红线变成自动的站点级体检,见下文站点级体检。 完整事故记录:docs/KNOWN-ISSUE-bundle-duplicate.md (2026-08-18),以及 2026-08-21 的自修复手册(由站点体检自动提示位置)。 工作原理 loader 的故障链路是:cordis-plugin-include 的 applyEntryPatches 平铺累加各 bundle 的 insert 条目不去重,随后 cordis-plugin-loader 的 EntryGroup.update 按 id 去重、碰到第一个重复就抛错——此时任何插件条目都还没创建。本插件用纯 Node 复刻这套「平铺累加 + 按 id 去重」语义,报告违规 id、来源(哪个 bundle/patch 插入的)与修复指引。 每次装载插件都检查 | 时机 | 触发 | 说明 | | 启动装载 | 插件 apply | 每次启动体检一次 | | loader 事件 | loader/entry-init / loader/partial-dispose | 运行时热装载/新增插件,800ms 防抖复查 | | 清单文件变化 | fs.watch 监听 profile 目录 | dsh plugin add、插件市场安装、手改 package.json / cordis.patch.yml 的瞬间立刻警告,无需等重启 | 报告内容 - 重复 loader 条目 id——每个被多个来源插入的 id 及完整来源链(如 ui-dsh-aionui-panel: @linxin666/dsh-web-ui-all ← @linxin666/dsh-client-ui-aionui-panel)。 - 未解析 bundle——列在 bundles 里但解析不到(loader 同样会 loud fail)。 - 无 patch 的包——列了但没有 dsh.bundle.patch 段(按 loader 契约属配置错误)。 - reconcile 预测警告——dependencies 里声明了 dsh.bundle 但不在 bundles 列表的包。 dsh plugin 的 reconcile 会在下次装/更新插件时把它追加进 bundles;若它是聚合包已覆盖的 子插件,将重新造成崩溃。警告会点名已被覆盖的 id。处理:把这些包移入 devDependencies (reconcile 只读 dependencies)。 报告落盘 $DSH_HOME/dsh-bundle-dedup-guard/reports/-.json 与 .latest.json。 站点级体检(v0.2.0 新增) 除上述 profile 清单检查外,每次检查还做一次整机站点体检(lib/site-health.mjs,零依赖纯只读),把 2026-08-21 事故的红线变成自动检查: | 检查 | 命中形态 | 对应事故 | | 已知冲突对 | bundles 同时列出 @linxin666/dsh-web-ui-all 和 dsh-better-sidebar——两个入口执行同一份 lib/index.js,都注册 /sidebar/api 路由(apply 阶段 duplicate prefix route 崩溃) | 2026-08-21 | | vendor 完整性 | vendor 的 @deepseek-ai/ 包 vs resources/vendor/dsh/node_modules/.package-lock.json:缺失 / 空目录 / package.json name 不符(内容装错)/ 版本不符;.名字- 临时目录残留(提示) | 2026-08-21 | | 插件 junction 完整性 | 运行时代码 import 了 @deepseek-ai/ 的插件,其 package/node_modules/@deepseek-ai junction 缺失(08-21 崩溃同款 Cannot find package)/ 指向错误目标 / 悬空;真实目录替代(可用,提示);.npmbak 残留(在含 junction 目录跑过 npm install 的痕迹) | 2026-08-21 | | 自修复手册指针 | 提示最新的 $DSH_HOME/incidents//README.md 位置 | — | 每个问题都附可直接复制的修复命令(重建 junction / 跑 repair-vendor.ps1 / 删 bundles 条目),守卫自身绝不修改任何文件。 junction 体检判定「插件是否需要 junction」的依据是源码扫描运行时的 import/require '@deepseek-ai/…'(不是 package.json 声明),且只审计当前在某个 profile 的 bundles 里激活的插件——休眠插件目录(如 dsh-workflow)不误报。 已知限制 loader 在创建任何插件条目之前就去重,所以「启动即崩溃」的场景下进程内检查无法运行(插件树根本没装载)。此时请用下面的独立 CLI:纯读盘,崩溃状态下也能跑。 安装 作为 profile bundle(开发期推荐): 1. 在 profile 的 package.json dependencies 加: "dsh-bundle-dedup-guard": "link:F:/path/to/dsh-bundle-dedup-guard" 2. dsh.profile.bundles 加 "dsh-bundle-dedup-guard"(放最前面即可)。 3. 在 profile 的 node_modules 建立链接(dsh plugin add 会自动做)。 从 npm: dsh plugin --profile web add dsh-bundle-dedup-guard 用法 插件自动检查,无需交互。手动诊断(含启动已崩溃时): 检查全部 profile + 站点体检(DSH_HOME 缺省 ~/.dsh) node bin/check.mjs 指定 profile node bin/check.mjs --profile web 指定清单文件(如修复前的备份,测试用) node bin/check.mjs --manifest 机器可读 JSON、不落盘报告 node bin/check.mjs --profile web --json --no-write 跳过站点级体检 node bin/check.mjs --no-site 退出码:0 = 健康;1 = 发现重复 / 未解析 bundle / 无 patch bundle / 站点体检问题(可做 CI 门禁)。 修复重复 编辑 dsh.profile.bundles,每个 id 只保留一个来源。最常见的形态是「聚合包 + 子包」: - 保留聚合包(如 @linxin666/dsh-web-ui-all) - 删除单独列出的子包条目 - 同时把子插件从 dependencies 移入 devDependencies——否则 dsh plugin 的 reconcile 会在下次装/更新插件时把它们重新追加回 bundles(2026-08-18 复发的根因) 然后重跑 node bin/check.mjs --profile 直到绿灯,再重启。 开发 npm test # node --test,零依赖 npm run check # 对本机 profile 运行守卫 - lib/check.mjs — 检查核心(纯 Node,无第三方依赖) - lib/site-health.mjs — 站点级体检(v0.2.0:冲突对 / vendor 完整性 / junction 完整性) - index.mjs — Cordis 插件入口(apply + 监听器) - bin/check.mjs — 独立 CLI(无需装载插件树) - test/ — 带 fixture profile 的单元测试 License MIT
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Lstalu/dsh-bundle-dedup-guard
每次装载插件时拦截重复条目,防止启动崩溃
相关插件 · 其他
模型破甲清洗HunYiSage/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,993已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,269已汉化DSH
70.8
这是你的仓库?认领条目