DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Bundle Dedup Guard — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
B

dsh-bundle-dedup-guard

Bundle Dedup Guard

DSH 插件防护:每次加载插件时检查配置文件 bundle 列表中是否存在重复的 loader 条目(聚合 bundle 与子插件同时列出 → “duplicate loader entry id” 启动崩溃),并运行站点级健康检查 — 已知冲突对、vendor @deepseek-ai 树与锁文件的一致性、插件 @

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:Lstalu/dsh-bundle-dedup-guard#ff4ddc79a57b4c60d1af2fa5d8ed08150edff2f9
README兼容性版本

说明

DSH 插件防护:每次加载插件时检查配置文件 bundle 列表中是否存在重复的 loader 条目(聚合 bundle 与子插件同时列出 → “duplicate loader entry id” 启动崩溃),并运行站点级健康检查 — 已知冲突对、vendor @deepseek-ai 树与锁文件的一致性、插件 @deepseek-ai junction 完整性 — 防护 2026-08-18 和 2026-08-21 的事件。只读诊断。

兼容性与来源证明

Bundle Dedup Guard 以 dsh-bundle-dedup-guard 发布,当前版本为 0.2.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/8/21

版本

0.2.0stable
2026/8/21

相关插件

正在加载相关插件…

最新版
0.2.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
MIT
发布源
github
GitHub
★ 2
周下载
0
最近提交
2026/8/21
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 developer-tools 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Sdk Minimal@deepseek-ai/dsh-sdk-minimal独立的最小 SDK 配置包:JSON-RPC、一个 DeepSeek 适配器、持久化 Shell 和 JSONL 会话Sdk App@deepseek-ai/dsh-sdk-appdsh SDK 配置包:基于 dsh-base 提供 stdio JSON-RPC 服务和进程生命周期管理Subagent Codex@deepseek-ai/dsh-subagent-codex基于官方 app-server 协议的一次性 Codex 子代理提供程序

README

dsh-bundle-dedup-guard

A DeepSeek Harness plugin that catches duplicate loader entry ids in profile bundle lists — on every plugin load.

If a profile's dsh.profile.bundles lists an aggregate bundle (a bundle whose patch inserts all of its sub-plugins, e.g. @linxin666/dsh-web-ui-all) and its sub-plugins individually, the loader receives the same loader-entry id twice. EntryGroup.update throws duplicate loader entry id: <id> before any plugin starts, and the whole profile fails to boot. This plugin exists so that never happens silently again.


Why this exists

Incident, 2026-08-18: a web profile listed @linxin666/dsh-web-ui-all (which aggregates 13 sub-plugins into one patch) and all 13 sub-plugins separately. Every sub-plugin id was inserted twice; the first collision reported was duplicate loader entry id: ui-dsh-aionui-panel. Fixing only the bundles list was not enough — the dsh plugin command's reconcilePlugins re-appends every dependencies entry that declares dsh.bundle to the bundle list after each pnpm operation, so the sub-plugins came back an hour later and crashed the next boot.

Full incident record: docs/KNOWN-ISSUE-bundle-duplicate.md.

How it works

The loader's failure path is: cordis-plugin-include's applyEntryPatches flattens every bundle's insert entries without deduplicating, then cordis-plugin-loader's EntryGroup.update dedups by id and throws on the first duplicate — before any plugin entry is created. This plugin re-implements exactly that "flatten + dedup by id" semantics in pure Node, and reports the offending ids, their sources (which bundle/patch inserted each), and the fix.

Checks on every plugin load

TriggerWhenNotes
Applyevery bootinstant health check as the plugin mounts
Loader eventsloader/entry-init / loader/partial-disposeruntime hot loads / plugin additions, debounced 800 ms
Manifest watchfs.watch on the profile dirthe moment package.json or cordis.patch.yml changes — i.e. dsh plugin add, marketplace installs, or hand edits — warn immediately, before the next restart

What it reports

  • Duplicate loader entry ids — each id inserted by more than one source, with the full source chain (e.g. ui-dsh-aionui-panel: @linxin666/dsh-web-ui-all ← @linxin666/dsh-client-ui-aionui-panel).
  • Unresolved bundles — listed in bundles but not resolvable (the loader would loud-fail too).
  • Bundle-less packages — listed but without a dsh.bundle.patch (a misconfiguration per the loader contract).
  • Predictive reconcile warning — a dependencies entry that declares dsh.bundle but is not in bundles. dsh plugin's reconcile will append it on the next install/update; if it's a sub-plugin covered by an aggregate, that re-creates the crash. The warning names the covered ids. Fix: move such packages to devDependencies (reconcile only reads dependencies).

Reports are written to $DSH_HOME/dsh-bundle-dedup-guard/reports/<profile>-<timestamp>.json and <profile>.latest.json.

Site-level health checks (v0.2.0)

Beyond the bundle-list checks, every run also audits the whole plugin environment, turning the 2026-08-21 incident's red lines into automatic checks (lib/site-health.mjs, zero-dependency, read-only):

CheckDetectsIncident
Known conflict pairsbundles lists @linxin666/dsh-web-ui-all and dsh-better-sidebar together — both entries execute the same lib/index.js and register the same /sidebar/api route (duplicate prefix route crash at apply time)2026-08-21
Vendor tree integrityevery @deepseek-ai/* package vs resources/vendor/dsh/node_modules/.package-lock.json: missing / empty dir / package.json name mismatch (wrong content installed) / version mismatch; .name-* temp-dir leftovers (informational)2026-08-21
Plugin junction integrityplugins whose runtime code imports @deepseek-ai/* but whose package/node_modules/@deepseek-ai junction is missing (the exact Cannot find package boot crash), points at the wrong target, or dangles; real-dir copies (works, informational) and .npmbak leftovers (an npm install ran inside a junction dir)2026-08-21
Incident manual pointersurfaces the latest $DSH_HOME/incidents/<date>/README.md self-repair manual—

Every problem is reported with a copy-paste fix command (recreate the junction / run repair-vendor.ps1 / remove the bundles entry). The guard never modifies anything itself.

The junction check decides "does this plugin need a junction" by source-scanning runtime import/require of @deepseek-ai/* (not by package.json declarations), and only audits plugins actually listed in some profile's bundles — dormant plugin dirs are skipped.

Known limitation

The loader deduplicates before creating any plugin entry, so when duplicates already exist at boot, an in-process check cannot run — the tree never mounts. For that case use the standalone CLI below: it is pure disk reads and works even when boot is broken.

Installation

As a profile bundle (recommended while in development):

  1. Add to the profile's package.json dependencies:
    "dsh-bundle-dedup-guard": "link:F:/path/to/dsh-bundle-dedup-guard"
    
  2. Add "dsh-bundle-dedup-guard" to dsh.profile.bundles (first entry is fine).
  3. Link it into the profile's node_modules (pnpm does this for dsh plugin add).

From npm:

dsh plugin --profile web add dsh-bundle-dedup-guard

Usage

The plugin checks automatically — no interaction needed. For manual diagnosis (including when boot already crashed):

# check all profiles + site-level health (DSH_HOME defaults to ~/.dsh)
node bin/check.mjs

# a specific profile
node bin/check.mjs --profile web

# a specific manifest file (e.g. a pre-fix backup, for testing)
node bin/check.mjs --manifest <path-to-package.json>

# machine-readable JSON, skip report files
node bin/check.mjs --profile web --json --no-write

# skip the site-level health audit
node bin/check.mjs --no-site

Exit codes: 0 = healthy, 1 = duplicates / unresolved bundles / bundle-less packages / site-level problems found (useful as a CI gate).

Fixing duplicates

Edit dsh.profile.bundles so each id has exactly one source. The common shape is "aggregate + sub-plugins":

  • keep the aggregate (e.g. @linxin666/dsh-web-ui-all)
  • remove the individually listed sub-plugin entries
  • also move the sub-plugins from dependencies to devDependencies — otherwise dsh plugin reconcile re-appends them on the next install/update (the exact recurrence from 2026-08-18)

Then re-run node bin/check.mjs --profile <name> until green, and restart.

Development

npm test          # node --test, zero dependencies
npm run check     # run the guard against your local profiles
  • lib/check.mjs — the check core (pure Node, no third-party deps)
  • lib/site-health.mjs — site-level health checks (v0.2.0: conflict pairs, vendor tree, junctions)
  • index.mjs — the Cordis plugin entry (apply + listeners)
  • bin/check.mjs — standalone CLI (works without a booted tree)
  • test/ — unit tests with fixture profiles

License

MIT