ftima-w / dsh-plugin-manager

Listed

DSH plugin-manager-ui: MCP/Skills management + plugin stop/enable/delete. Derived from liqichen/dsh-plugin-manager (MIT).

mainToolSkill View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:ftima-w/dsh-plugin-manager

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit 189238aSynced Aug 18, 2026

🧩 DSH 插件管理器

dsh-plugin-manager — 在 DeepSeek Harness 设置面板里内嵌的图形化管理器,让你像操作普通 App 一样管理 MCP 服务 / Skills / 已装插件 / 内置插件包,开关、停止、删除实时热生效,无需重启 dsh web

License Version Platform DeepSeek Harness

ℹ️ 二次加工声明(Important)

本项目是对 liqichen/dsh-plugin-manager二次加工(fork / derivative work),原始作品及其 MIT 许可证版权归原作者所有(见 LICENSE)。

在保留原版全部能力(MCP 开关/删除、Skills 管理、内置插件包浏览)的基础上,本版本新增:

  • ⏯️ 插件停止 / 启用 —— 通过写入/移除 cordis.patch.ymldisabled 条目,HMR 热生效
  • 🗑️ 插件删除 —— 移除 package.json 引用与 bundles 条目,插件目录移入 ~/.dsh/.trash/plugins/ 回收站,可恢复
  • 🪟 自绘确认弹窗 —— 替代浏览器原生 confirm,样式精简、跟随 DSH 主题
  • 🛡️ 备份去重、更完整的插件元信息(版本 / cordis id / 本地·npm 来源 / 链接路径)

使用本项目请保留上述原作品链接与版权声明。


📑 目录


✨ 功能特性

能力说明生效方式
🎛️ MCP 开关一键禁用/启用任意 MCP 服务(写入 disabled: true 或移除)实时热生效,无需重启
🗑️ MCP 删除cordis.patch.yml 删除整个 MCP 条目(上方注释保留)实时热生效,无需重启
📚 Skills 管理浏览全部 skill 及描述;删除 = 移入 .trash-* 目录,可恢复立即生效
⏯️ 插件停止/启用一键停止/启用已装插件(写入/移除 cordis.patch.ymldisabled 条目)实时热生效,无需重启
🗑️ 插件删除移除 package.json 依赖与 bundles 条目、清理 patch 条目,插件目录移入 ~/.dsh/.trash/plugins/ 可恢复重启 dsh web 后完全卸载
📦 插件包浏览只读查看 DSH 本体 160+ 内置插件包的名称/版本/说明只读
🛡️ 自动备份每次写操作前自动备份配置为 *.bak-<时间戳>
🔌 零额外进程后端内嵌在 dsh web 宿主里,同源 API,不占端口、无 CORS 暴露

📸 界面预览

管理页位于 DSH 设置面板 → 「插件管理」,四个标签页:

MCP 服务Skills已装插件内置插件包
MCP 服务页Skills 页已装插件页内置插件包页

🚀 安装

前提:已安装 DeepSeek Harness(dsh web),并了解 ~/.dsh 目录结构。

方式一:从本仓库安装(推荐)

# 1. 克隆并放入用户插件目录
git clone https://github.com/liqichen/dsh-plugin-manager.git
mkdir -p ~/.dsh/plugins/dsh-plugin-manager
cp -r dsh-plugin-manager/{index.js,client.js,package.json} ~/.dsh/plugins/dsh-plugin-manager/

# 2. 通过 dsh CLI 注册插件
dsh plugin --profile web add ~/.dsh/plugins/dsh-plugin-manager

# 3. 声明依赖(让 Node 端可解析)
#    编辑 ~/.dsh/profiles/web/package.json,dependencies 加入:
#    "dsh-plugin-manager": "file:../../plugins/dsh-plugin-manager"

# 4. 在 ~/.dsh/profiles/web/cordis.patch.yml 的 plugins 列表加入:
#    - id: plugin-manager-ui
#      name: dsh-plugin-manager

# 5. 重启 dsh web,打开「设置」→「插件管理」即可使用

方式二:legacy 独立网页版(不依赖插件系统)

如果插件机制不适用,仓库提供了早期独立版 Python 服务:

python3 legacy/server.py --port 17891
# 浏览器打开 http://127.0.0.1:17891/

🖥️ 使用说明

打开 DSH 设置 → 插件管理,你会看到四个标签页:

🎛️ MCP 服务

  • 每个 MCP 一张卡片,显示名称、传输方式(stdio/http 徽章)、运行状态、配置 id
  • 右侧开关:一键禁用/启用;删除按钮:移除该条目(有二次确认)
  • 顶部显示配置文件路径与总数量

📚 Skills

  • 列出所有 skill 及 SKILL.md 中的描述、目录路径
  • 删除 = 移入 ~/.dsh/skills/.trash-*,可手动恢复

⏯️ 已装插件(v0.2 新增)

  • 列出 ~/.dsh/profiles/web/package.json 里声明的全部用户插件(本地 link: 与 npm 包), 以及 ~/.dsh/plugins/~/.dsh/profiles/web/plugins/ 下未被引用的孤儿目录
  • 每张卡片显示版本、cordis id、来源(本地/npm)、安装路径与运行状态
  • 开关:停止 = 向 cordis.patch.yml 写入 - id: <id> + disabled: true(宿主 HMR 热生效); 启用 = 移除对应条目(整条仅剩 disabled 时连条目一起删)
  • 删除:从 package.json 移除依赖与 dsh.profile.bundles 条目、清理 patch 条目, 插件目录移入 ~/.dsh/.trash/plugins/<时间戳>-<名称> 回收站;重启 dsh web 后完全卸载
  • ⚠️ 停止/删除本管理器自身(dsh-plugin-manager)会带走此界面, 恢复需手动编辑 cordis.patch.yml 或从回收站还原

📦 内置插件包

  • 表格展示 DSH 本体全部插件包(只读),升级请使用 npm update -g @deepseek-ai/dsh

操作完成后,页面会提示「✅ 改动已实时热生效」;已打开的会话建议开新会话,以刷新工具列表。


⚙️ 工作原理

本插件是标准 DSH 双端插件,随 dsh web 一同启动,无需独立进程:

┌─────────────────────────── dsh web 宿主 ───────────────────────────┐
│                                                                     │
│  浏览器端 (client.js)                 Node 端 (index.js)            │
│  ┌───────────────────────┐            ┌─────────────────────────┐  │
│  │ 设置面板「插件管理」页 │   fetch    │ 注册 /plugin-manager/   │  │
│  │ React UI · 同源 API   │ ─────────▶ │ api/* 路由(内嵌后端)     │  │
│  └───────────────────────┘            │ 读 / 写:                │  │
│                                       │  · ~/.dsh/profiles/web/ │  │
│                                       │    cordis.patch.yml     │  │
│                                       │  · ~/.dsh/skills/       │  │
│                                       │  · ~/.dsh/profiles/     │  │
│                                       │    node_modules/@deep-  │  │
│                                       │    seek-ai/             │  │
│                                       └─────────────────────────┘  │
└────────────────────────────────────────────────────────────────────┘

涉及的文件路径:

路径作用
~/.dsh/profiles/web/cordis.patch.ymlMCP 服务配置(补丁层),修改后宿主 HMR 热生效
~/.dsh/skills/Skill 目录,删除时重命名为 .trash-<时间戳>-<名称>
~/.dsh/profiles/node_modules/@deepseek-ai/DSH 本体插件包(只读)

📡 API 参考

后端内嵌在 dsh web 宿主,同源提供两个接口:

GET /plugin-manager/api/state

返回当前全部状态:

{
  "mcp": [
    { "id": "mcp-scrapling", "serverName": "scrapling", "transport": "stdio", "command": "scrapling", "disabled": false }
  ],
  "skills": [ { "name": "obsidian-cli", "desc": "…", "path": "/Users/me/.dsh/skills/obsidian-cli" } ],
  "installedPlugins": [
    {
      "name": "dsh-plugin-manager", "version": "0.2.0", "desc": "…",
      "ids": ["plugin-manager-ui"], "disabled": false, "installed": true,
      "isLink": true, "location": "/Users/me/.dsh/plugins/dsh-plugin-manager",
      "source": "local", "depSpec": "link:…"
    }
  ],
  "plugins": [ { "name": "dsh-client-web", "version": "1.2.3", "desc": "…" } ],
  "patchFile": "/Users/me/.dsh/profiles/web/cordis.patch.yml",
  "profilePkgFile": "/Users/me/.dsh/profiles/web/package.json",
  "skillsDir": "/Users/me/.dsh/skills",
  "trashDir": "/Users/me/.dsh/.trash/plugins"
}

POST /plugin-manager/api/action

五种操作,kind 区分:

{ "kind": "mcp-toggle",    "id": "mcp-scrapling", "disable": true }
{ "kind": "mcp-delete",    "id": "mcp-scrapling" }
{ "kind": "skill-delete",  "name": "obsidian-cli" }
{ "kind": "plugin-toggle", "name": "dsh-plugin-manager", "disable": true }
{ "kind": "plugin-delete", "name": "dsh-plugin-manager" }

响应统一为 { "ok": true, "message": "…" }。 所有写操作先备份目标文件(cordis.patch.yml / package.json)为 .bak-<时间戳>,再改文件; plugin-delete 的插件目录移入 ~/.dsh/.trash/plugins/ 回收站,不真删。


🛠️ 用 DSH 开发(吃自己的狗粮)

本项目就是用 DeepSeek Harness 开发出来的 —— 从想法到上线,整个开发过程由运行在 DSH 里的 AI 编码智能体完成:

  • 通过 DSH 的 MCP 工具(浏览器自动化、文件读写等)逆向研究官方双端插件的扫描与注入机制(dsh-client-modulesdsh-cordis-host-runnersettings.section slot 契约)
  • 直接读写 cordis.patch.yml / ~/.dsh/skills/ 反复实验,验证「配置改动 → 宿主 HMR 热生效」链路
  • 用 Playwright / Chrome DevTools 自动化截图、检查 UI 效果
  • 最终产物又作为标准 DSH 插件被安装回 DSH,用来管理 DSH 自己 —— DSH 管理 DSH 自己

这正是 DeepSeek Harness 的设计哲学:Everything is a Plugin

🗂️ 目录结构

dsh-plugin-manager/
├── index.js          # Node 半:内嵌后端,注册 /plugin-manager/api/* 路由
├── client.js         # 浏览器半:设置面板「插件管理」React UI
├── package.json      # DSH 双端插件元数据(dsh.client.inject 声明宿主依赖)
├── docs/
│   └── screenshots/  # 界面截图
├── legacy/
│   └── server.py     # 早期独立 Python 网页服务版本(备用)
├── README.md
└── LICENSE           # MIT

❓ 常见问题

Q: 页面提示「插件后端未响应」? 浏览器端连不上 /plugin-manager/api。检查安装步骤 3、4 是否都完成,以及 ~/.dsh/profiles/node_modules/dsh-plugin-manager 是否正确指向插件目录,然后重启 dsh web。

Q: 开关/删除后工具列表没变? 配置改动是热生效的,但当前已打开的会话仍持有旧的工具列表,请新开一个会话。

Q: 删掉的 MCP 怎么恢复? mcp-delete 只删除配置条目,不会卸载 npm 包。用最近的备份 cordis.patch.yml.bak-* 恢复,或手动把条目加回 cordis.patch.yml 即可。

Q: 删掉的 Skill 怎么恢复?~/.dsh/skills/.trash-<时间戳>-<名称> 重命名回 ~/.dsh/skills/<名称> 即可。

Q: 想彻底删除 Skill? 管理器只做「移入回收站」;彻底删除请手动 rm -rf 对应的 .trash-* 目录。

Q: 能从管理器升级 DSH 本体吗? 不能。内置插件包页是只读的,DSH 本体升级请用 npm update -g @deepseek-ai/dsh


⚠️ 注意事项

  1. 操作的是真实配置 —— 所有改动直接写 cordis.patch.ymlpackage.json~/.dsh/skills/。每次写前自动备份,出问题可用最近的 .bak-* 恢复。
  2. MCP 删除 ≠ 卸载包 —— 只删配置条目,包体仍在,重新配置即可恢复。
  3. Skill 删除可恢复 —— 是「移入 .trash-*」而非真删。
  4. 插件停止热生效,删除需重启 —— 停止/启用通过 patch 层的 Cordis HMR 立即生效;删除在重启 dsh web 后才完全卸载(目录已进回收站,可手动还原)。
  5. 别停止/删除管理你自己 —— 停掉 dsh-plugin-manager 会连界面一起停掉;删除它则该界面在重启后消失。恢复:编辑 cordis.patch.yml 或把 ~/.dsh/.trash/plugins/<…> 移回原位并改回 package.json
  6. 热生效有边界 —— 配置实时生效,但已开会话的工具列表不自动刷新,请开新会话。
  7. 只作用于当前 profile —— 默认管理 ~/.dsh/profiles/web/,其他 profile 需相应调整路径。

📜 许可证

本项目基于 liqichen/dsh-plugin-manager 二次加工,沿用其 MIT 许可证,原始版权归 liqichen 所有。


本项目为 liqichen/dsh-plugin-manager 的二次加工版本;觉得好用的话点个 ⭐,问题欢迎提 Issue,原作品见 原仓库

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

TestsDetected
DocumentationDetected

Repository information

Language
JavaScript
License
MIT
Last updated
Aug 16, 2026, 4:37 PM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.