# dsh-armory — 军械库 / Armory 中文 | [English](README.en.md) > **DeepSeek Harness 的一体化管理看板**:MCP · 技能 · 专家 · 插件 · 工具账本 · 四大市场,浏览、搜索、一键安装、一键召唤。 > fork 自 [Imzl-zl/dsh-mcp-manager-ui](https://github.com/Imzl-zl/dsh-mcp-manager-ui)(MIT),现已扩展为完整军械库。 > > **最新 v2.4.2**:文档版——README(中 / 英)与实机功能对齐:三个入口席位与六种档位、悬浮按钮怎么隐藏、看板打开时它如何自动让位,以及 v2.4.1 的 SkillHub 详情修正都写进来了;运行代码与 v2.4.1 完全相同。详见 [更新日志](.github/release-notes/v2.4.2.md)。
## 一键安装 ```sh # npm(推荐:免构建授权,装完即用) dsh plugin --profile web add dsh-armory # GitHub dsh plugin --profile web add github:2026heshao/dsh-armory ``` 装完**重启 DSH**,侧栏顶部「全局面板」里点 **大肥鱼军械库**(或在右下角悬浮按钮、左侧栏底部入口,三个席位见下文)。桌面端装在 `desktop` profile 时把 `--profile web` 换成 `--profile desktop`。 ## 它解决什么 | 痛点 | 本插件的做法 | |---|---| | MCP 配置要手改 YAML,改完不知道连没连上 | 可视化面板:状态、工具 Schema、启停、重连,全局与项目双作用域,项目级改完即对存活会话生效 | | 装技能要去各处翻 `SKILL.md` 仓库 | **市场直连**:SkillHub 19 万+ 技能、WorkBuddy 316 个连接器,搜索/筛选/一键安装,逐文件 sha256 校验 | | 在市场装了技能,回看板却找不到,也分不清哪个是刚装的 | **技能安装可辨识**:卡片标「装于 …」,7 天内高亮并给相对时间;筛选条按安装时间倒序成「最近安装」;看板名与市场原名不一致时标出「来自市场 原名」 | | 技能列表有两行摘要,点进详情反而整块空白,标题还退化成 slug | **详情读得到**:SkillHub 把名称与介绍放在接口的 `skill` 子对象(`displayName` / `summary_zh`),映射按此取值;详情回包里的空串不会覆盖已显示的内容,加载中也先给摘要 | | 详情里的「来源主页」跳过去是 `api.skillhub.cn`,浏览器只会拿到 405 | **链接点得开**:接口域名统一改写成 `https://skillhub.cn/` 横幅)——
- **按需、只取一次**:README 不进目录的瘦身缓存,点开才拉;按 `README.md` / `readme.md` / `Readme.md` / `README.MD` / `README.markdown` / `README_EN.md` 顺序试;仓库填的是 npm 包名时,先问 `registry.npmjs.org` 取 `repository`,拿到再去 GitHub 取原文
- **限额与缓存**:单次 20s 超时、正文 16 万字符上限(超了截断并在界面标注);取到后按「仓库或 npm 包名」落盘缓存 7 天,同一插件再点秒开,断网 / 限流 / 仓库被删回落缓存并标明「这是缓存」
- **图片与安全**:`http(s)` 图片过 `wsrv.nl` 只读代理(`output=webp&q=72&w=880`,仅对白名单主机生效),相对路径按仓库地址还原成绝对 URL、还原不了就跳过;正文由自写解析器生成 React 元素,**不碰 `dangerouslySetInnerHTML`**,`javascript:` / `data:` / `vbscript:` 伪协议链接一律降级成纯文本
- **长文跳转**:弹层右下角常驻「跳到末尾」按钮(sticky 在弹层内,滚动时不消失,键盘可聚焦),点一下平滑滚到 README 底部;贴底时按钮排在「关闭 / 安装 / 重新读取」之后,不会盖住操作行
- **社区目录与更新探测修正(2.1.0)**:秒开快照不再顶掉真实目录(此前快照一渲染真实结果就被丢弃,目录于是一直停在旧快照);更新探测与目录改走同一条源链(先问这份缓存实际来自哪个源、再兜底其余源,首个拿到 ETag 的源胜出),修掉「主源不通的机器上目录能开、点检查更新却每次 `probe-failed`」
- **谁在做、还在维护吗(2.3.0 新增)**:市场卡片先给一层不联网的「人」信号——发布方头像 / 名称与最近更新日期(技能看 SkillHub 发布方或 GitHub 仓库 owner,插件与社区条目看仓库 owner,专家看目录自带头像与更新时间);打开详情再按需查一次 GitHub 公开接口,补上维护者主页、最近提交、开放 issue 数、Star、License、主语言,并用标签直说「近 30 天有提交 / 超过半年未更新 / 已归档」。请求按 6 小时缓存与 ETag 复用,单次最多 8 个仓库,未认证限流时回落旧缓存并标明;查不到只收起这一行,不阻塞详情正文
- **最近动静(2.3.0 新增)**:市场页顶部有一条只属于这台机器的时间线——对比「上次成功读取目录」与「这一次」的新增、移除、版本或核验状态变化,并标出条目名与相对时间。它不联网、不埋点、不伪造在线人数或实时消息;没有变化就直说「暂无新变化」。事件 7 天过期、最多保留 8 条,可一键清除;技能只在默认页 / 无关键词 / 默认排序时记录,翻页与搜索不会制造假动静
- **装备清单(2.3.0 新增)**:市场页右上「装备清单」把本机的 MCP、技能、专家与插件导出成一份可分享的 JSON——只含名称、类型、来源、版本与必要的身份字段,**绝不写入密钥、header、URL 查询参数或环境变量的值**,技能正文与专家人设也不进清单。朋友发来的清单可以粘贴或选文件导入,面板按 `已安装 / 可更新 / 本机没有` 三态逐项对比,`去市场` 只负责跳到对应市场并带上搜索词,**不自动安装、不自动写配置**。上限 200 条 / 256KB,超限截断并标注
- **找到真实的人(2.3.0 新增)**:详情底部给出真实出口——能解析到仓库的,给出去仓库、看讨论 / 提 Issue;有来源主页的,给出源站;任何条目都可以「向军械库反馈」(预填 GitHub Issue),或先复制反馈模板(条目、类型、来源、版本、环境)自己改完再发。所有链接在新标签页打开,内容先由用户过目、确认后才提交。**刻意不做站内论坛、点赞或收藏**:社区在哪,就把人送到哪,而不是在插件里搭一个没有人的布景
## 安装
```sh
# 从 npm 安装(推荐)
dsh plugin --profile web add dsh-armory
# 从 GitHub 安装
dsh plugin --profile web add github:2026heshao/dsh-armory
```
装完**重启 DSH**(桌面端重启应用,Web 端重启 `dsh web`;桌面端把 `--profile web` 换成 `--profile desktop`)。升级:npm 安装可在面板「一键升级」提示条上直接点,GitHub 安装换新版 tag 重新 `add`。卸载(不会删除 profile 里已有的 MCP 条目):
```sh
dsh plugin --profile web remove dsh-armory
```
细节、本地开发安装与故障排查见 [安装与升级](docs/installation.md)。
> 不要把 `dsh-armory` 手工插进 profile 的 `cordis.patch.yml`、Agent preset 或额外的 `--patch` 文件——插件命令已经完成这件事,重复装配会明确报错。
## 使用
### 打开面板
三个入口席位,同一个面板:
- **左上角「全局面板」里的「大肥鱼军械库」一行**:走宿主官方的面板列表,在「插件」旁边,是主入口;
- **右下角悬浮按钮**:可拖拽移动,位置会被记住;
- **左侧栏底部入口**:展开态是 42px 的一行(图标 + 文字),侧栏收起成轨道时只剩一个圆钮。
面板浮在会话之上,关掉它(右上角「关闭」或 Esc)不会影响会话。
席位怎么留由面板右上角的「入口」菜单决定,共六档:`全局面板 + 悬浮按钮(推荐,默认)` / `仅全局面板(左上角,"插件"旁)` / `全局面板 + 侧栏底部入口(无悬浮按钮)` / `仅悬浮按钮` / `仅侧栏底部入口` / `三个入口全开`。**三个不能全关**——面板只能从这三个席位打开,所以它是「至少留一个」的组合,而不是三个互不相干的开关。选择存在浏览器本地(localStorage),换浏览器或清缓存要重选一次。
悬浮按钮另外两条自助规则(2.4.1 起):
- **右键或长按(约半秒)它**弹出菜单,可直接「隐藏悬浮按钮」——不必再去面板里找「入口」;隐藏后有 6 秒提示说明从哪儿重新打开。若它是当前唯一入口,这一项会置灰并指路到「入口」菜单:先留好别的入口,再关这一个。
- **看板占据中栏时它自动收起**:悬浮按钮是浮层,看板打开时正好盖住列表与详情的文字;离开看板页它就回来,不改变你选的档位。
### 全局 vs 项目
顶部标签页在「全局」与各项目之间切换:
| 标签页 | 存哪 | 谁可见 | 改动何时生效 |
|---|---|---|---|
| 全局 | Web profile 的 `cordis.patch.yml` | 所有项目 | DSH 热加载,通常立即生效 |
| 某项目 | 该项目 `.dsh/mcp.json` | 只该项目会话 | 写盘即生效(见下) |
`serverName` 按作用域判重:不同项目之间、全局与项目之间**可以同名**,各自独立连接;同一作用域内不能重名。
### 常用操作
在列表行或详情页里:
- **开关**:启用 / 禁用(全局写 profile 补丁的 `disabled`,项目写 `.dsh/mcp.json`);
- **重连**:全局条目重载 loader 条目;项目连接会拆掉旧连接、按当前配置重建并重新投射给存活会话(`mcp-client` 的重连预算耗尽后必须靠它恢复);
- **编辑 / 移除**:移除只影响当前作用域;
- **屏蔽**(项目页里对全局 MCP):写 `exclude`,该项目的新会话不再看到它——全局实例仍在跑,所以不影响其他项目。
### 添加 MCP
两条路,都从面板顶部工具栏进:
1. **添加 MCP**:表单填 `command`/`args`/`env`/`cwd`(stdio)或 `url`/`headers`(HTTP),可设调用超时、启动失败策略与重连策略;常用服务器有预设模板可一键套用。
2. **导入 JSON**:粘贴其他客户端的配置,先预览再写入。支持「合并(同名更新)」与「替换」,字段映射与限制见 [JSON 导入](docs/json-import.md)。
### 看工具与敏感值
详情页列出该 MCP 当前注册的工具;展开可看完整输入 Schema。凭据类字段默认掩码,点眼睛图标会向 Host 读取**有效运行值**(已解析过的环境变量)并临时显示,再点一次恢复;已显示的值可一键复制。编辑时若没实际改动输入,保存仍保留原来的引用写法,不会把密钥写回配置文件。
## 配置生效时机(重要)
| 作用域 | 修改后何时生效 |
|---|---|
| 全局 | DSH 热加载,通常立即生效(含运行中的会话) |
| 项目 | **写盘即生效**:新增立刻挂上存活会话、删除立刻撤掉工具、改动就地重载连接(工具名不变) |
项目 MCP 由本项目所有会话共用一份连接,配置写在 `.dsh/mcp.json`。面板保存的那一刻就会对齐到正在运行的会话,**不需要重开会话,也不需要重启 Host**;手工编辑该文件则在**下一次会话挂载**时被采纳。
> **连接跟配置走,不跟会话走**:最后一个会话结束不会拆掉连接,它只进入空闲等待,下一次会话直接复用——这样"要用的时候"它已经就绪(这也是宿主自己的契约:工具必须在首轮之前出现)。两个旋钮写在 server 条目里:`idleTimeoutMs`(空闲保留多久,默认 5 分钟,`0` = 永不回收)与 `readyTimeoutMs`(挂载时等就绪的总预算,默认 5s,`0` = 不等)。字段速查与边界见 [设计与限制](docs/design.md#项目级专有字段dshmcpjson-里每个-server-可写)。
>
> **状态怎么看**:项目行把两件独立的事分开说,不合成一个状态。
> - **连接在不在**:`已连接 · 当前无会话使用(连接保留,下次直接用)` / `已连接 · N 个会话在用` / `连接中…` / `连接失败` / `尚未建立连接(新会话自动挂载)`。
> - **几个会话在用**:见上一行的 `N 个会话在用`;不再出现「待会话挂载」那种把两者压成一句、容易被读成"还没连上"的写法。
>
> **重连是必需出口**:mcp-client 的自动重连有次数上限,耗尽后它会注销工具并停止,只能靠重载配置或重启宿主恢复(它的 README 明写)。项目 MCP 又不是常驻服务,所以面板的「重连」按钮会拆掉旧连接、按当前配置重建,并重新投射给存活会话。
## 常见问题
**面板里显示「已禁用」,但模型调用报 `unknown tool "mcp__xxx__..."`**
那个 MCP 被禁用了,所以它没有注册任何工具。在面板里点「启用」即可(全局会写 profile 补丁并热加载,项目写 `.dsh/mcp.json`、写盘即生效)。
**那一行显示「挂载失败」「连接失败」或「作用域隔离失败」,怎么区分?**
三类是不同的事,详情页会给出具体原因:**挂载失败** = **会话挂载阶段**(`agent/created` 监听器)就没挂上(变量求值为空、`failOnStartupError` 下启动失败、工具注册被拒);**连接失败** = `mcp-client` 连不上或重连耗尽(原因取自它的日志);**作用域隔离失败** = 连接正常但工具不在共享作用域层(宿主里出现了两份 `@deepseek-ai/dsh-scope`)。排查与原理见 [设计与限制](docs/design.md#连接状态语义)。
**项目行那些状态文案分别是什么意思?**
它们把两件独立的事分开说:**连接在不在** —— `已连接 · 当前无会话使用(连接保留,下次直接用)`(最后一个会话结束了,连接按空闲策略留着)/ `已连接 · N 个会话在用 · M 工具` / `连接中…` / `连接失败` / `尚未建立连接(新会话自动挂载)`;**几个会话在用** —— 就是那句里的 `N 个会话在用`。旧版本的「待会话挂载」正是把这两件事压成一句,所以容易被读成"还没连上"。
**升级后技能详情页还是空的,或者悬浮按钮的行为没变?**
两步确认。先确认新包真装上去了:`dsh plugin --profile web update dsh-armory` 之后,升级后第一次打开面板会弹出一张「vX.Y.Z 的更新」卡片,标题里的版本号就是当前安装的版本;也可以直接看本机 `~/.dsh/profiles/