Overview
dsh-plugin-catalog
README / EN
Package documentation
Registry summary
dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.
Read the full README on GitHubLIMITATIONS
Known limitations
0. **安装 / 升级 / 卸载插件与 Skill 不归本插件管(刻意如此)**:装东西走 `dsh-plugin-installer` (`install_hub_search_plugins` / `install_hub_submit_request` / `install_hub_status`)或官方 `plugin_manager`。 本插件只做**清点、判据、处置清单、对账、导出**。★ 曾计划过一个 `catalog_import`,评估后**主动不做**: 两套安装路径会各写各的快照与回滚,出问题时谁也没法证明是哪一套写的。两边的关系是"它装、我核"—— 装完回面板看 `loadState` 是否 loaded、进了 `catalog_mcp` / `catalog_list` 没有。 **R35 的卡片动作是例外,且只走面板**:卸载 / 停用 / 删 Skill / 删 MCP 由人点、服务端两段式确认; 它们**没有注册成工具**(模型拿不到"删用户东西"这个动作)。 0b. **R35 动作层的三条边界**:MCP 只处置 profile 自己那两份组合文件(bundle 自带的 patch 层阻断); 插件卸载不删源码(junction 只去掉依赖与入口);随插件安装的 Skill 不给删。详见「运行期真相与卡片操作(R35)」。 0c. **运行期真相依赖宿主 `pluginManager.listPlugins()`**:没有它的老宿主上这一层退化为「读不到」 (面板与工具都会如实说原因),其余功能不受影响。`fiberPhase=failed` 只能告诉你"它失败了", 具体错误仍在宿主日志 / `plugin_manager set_plugin` 的 `diagnostic` 里。 1. **私有仓拿不到平台级安全扫描**:GitHub 的 Secret Scanning / Dependabot / Push Protection 需要付费 GHAS。 所以「依赖已知高危」只能靠本地规则与模型常识,**准确度低于平台级扫描**。 2. **Skill 的调用统计只能到「次数 + 最近一次时间」**,无法细分到会话 —— 这是机制限制,界面上有标注。 3. **个人免费账户的私有仓没有「只读分享」档位**:要么私有(仅本人/受邀协作者),要么公开(所有人可读)。 需要精细权限得建 Organization。 4. **工具归属是推断**,但实测覆盖率很高(196 个工具里 193 个靠描述指纹唯一命中,覆盖 85.2% 的调用量; 歧义 0、未归属 0)。剩下 2 个判为宿主核心(`plugin_manager` / `exit_plan_mode`), 仍可在面板手工指定工具归属覆盖。 5. **星标/下载量等生态数据不采集**(本插件不联网,只读本机事实)。 6. **官方包(asar 内)的磁盘体积量不到**:它们在宿主安装包里,没有独立目录,所以列表与合计都按"不参与"处理。 要知道它们占多少,只能看 DSH 安装包本身的大小。 7. **体积快照是"上次量的时候"**:装/删/升级插件后,面板不会立刻知道变化 —— 超过 24 小时自动重量一次,也可以随时点「重量体积」(量完覆盖快照)。 8. **体积有预算**:单个目录最多 2 万文件 / 1.5 秒。超过的条目报下限(界面上带「+」,本机实测 1 条)。 这是为了不让一个巨型目录把整次测量拖住。 9. **「无人依赖」是启发式**:只读 profile 里 `node_modules` 下**一层**嵌套的 `package.json`, 更深的嵌套(`a/node_modules/b/node_modules/c`)或运行时 `require` 出来的包可能漏判成"没人依赖"。 所以它只做**候选**,界面上永远带"用 `npm ls` / `pnpm why` 确认"。本机实测 220 个包里 2 个候选 (`dpi-probe-bundle`、`dsh-toolfold`),都被更深的依赖链排除过一轮。 10. **依赖图不区分 devDependencies**:装进 profile 的包本来就不该有 dev 依赖,这里只按运行时声明判断。 11. **pnpm 的 `.pnpm` 虚拟仓库不展开**(本机 `nodeLinker: hoisted`,不存在该目录);换成 isolated 链接模式时,依赖图会退化。 12. **MCP 的「来源」是启发式**(R30):本地路径 / 环回 url → 自己配置,`@deepseek-ai/` → 官方,其余 → 第三方。 它判的是"这条声明长什么样",不是"这个服务器的作者是谁";判错可在浮窗里手工改。 13. **MCP 读的是声明层,不是运行态**:条目写了 `command` 也可能启动失败(缺依赖、端口占用、token 过期), 本面板不连服务器、不握手。真正的连接状态看宿主日志与工具是否出现。 14. **MCP 的 `disabled` 若是 `!!js` 表达式不求值**:面板只显示原文,到底开没开以宿主为准。 15. **MCP 的调用归属按第一个 `__` 切 serverName**:`serverName` 与工具名都允许下划线, 理论上存在歧义(`mcp__a__b__c`);本面板与报告用同一个切法,不在别处再猜一次。 16. **MCP 没有体积 / 依赖 / 加载态**:它是组合文件里的一条声明,不在 `node_modules` 里, 所以「量体积」「无人依赖」「不会被加载」这三档对它一律不适用(卡片上也不会出现)。
