Bundle
@chengdb/capability-panel
dsh plugin: browse and manage project-level and global capabilities (skills, MCP servers, …) from the web GUI
- Source
- chengdb
- stars
- 4 stars
- License
- MIT
- Updated
- Updated 10 days ago
Readme
# @chengdb/capability-panel
一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)插件:
在 Web GUI 里**可视化管理项目的全部能力**——Skills、MCP 服务器、快捷消息,
全部支持**项目级 / 全局级**双作用域,全部可以**不离开浏览器**完成安装、启停与分发。

## 它能做什么
| 能力域 | 浏览/搜索 | 新增/安装 | 编辑 | 启用/禁用 | 删除 | 导入/导出 |
|---|---|---|---|---|---|---|
| **Skills** | ✅ 双作用域 + 详情 | ✅ 上传 / 宿主路径 / URL 三种来源 | ✅ | ✅ 状态按钮 + 项目级禁用全局项 | ✅ 两击确认 | ✅ 下载 zip / 复制到宿主目录 |
| **MCP 服务器** | ✅ 双作用域 + 实时挂载状态 | ✅ 表单新增(stdio/sse/http) | ✅ | ✅ 热重挂 + 项目级禁用全局项 | ✅ | ✅ `.mcp.json` 与 Claude Code 格式兼容 |
| **快捷消息** | ✅ 双作用域 + 搜索 | ✅ 多行正文 | ✅ | ✅ 状态按钮 + 项目级禁用全局项 | ✅ | ✅ JSON 配置文件即数据 |
## 亮点
### 🗂 一个面板,管住三个能力域
侧栏底部(Settings 旁)新增「能力面板」入口,点击弹出锚定浮层。面板顶部在
**快捷消息 / Skills / MCP** 三个域之间切换,每个域内部再按
**全部 / 项目 / 全局** 过滤,支持关键词搜索。头部下拉框还可以把"项目"
钉选到任意已知工作区——不切 session 也能管理别的项目。

### 📥 Skills:三种方式安装,一键导出分享
- **浏览器上传**:拖入单个 `.md`、整个 skill 目录、或 `.zip` 压缩包
(浏览器端 DecompressionStream 解压,零依赖);路径防穿越,
200 文件 / 20MB 上限。
- **宿主路径**:把磁盘上已有的 skill 目录或 `.md` 复制进受管根。
- **URL 下载**:GitHub 仓库(`https://github.com/<owner>/<repo>`,可带
`/tree/<branch>/<子目录>`)、任意 `.zip`、raw `.md`
(宿主端 30MB / 30s 限速)。
压缩包/仓库归档自动剥离公共顶层目录并定位唯一 `SKILL.md`;落盘名以
frontmatter 的 `name` 为准,同名冲突报错、可选覆盖。磁盘格式与官方
filesystem provider **逐字节兼容**(flat `<name>.md` / 目录型
`<name>/SKILL.md`),装完立刻可被 agent 调用。
导出同样简单:flat skill 直接下载 `.md`,目录型 skill 在浏览器端打成
store-only zip;也可以复制到宿主任意目录。

### ⚡ 一键启用/禁用,不动正文
每个 skill 详情卡片上有「已启用 / 已禁用」状态按钮(文字与颜色随状态
变化)。禁用只写入 `user-invocable: false` + `disable-model-invocation: true`
两个扁平键——正文与其它元数据原样保留,启用即清除恢复。禁用的 skill 会
立刻从输入框的 Skills 快捷弹层中消失。只读条目(custom / bundled)不显示
操作按钮。

### 🔌 MCP:改配置即热挂载,不重启、不改 preset
- 配置文件与 **Claude Code 的 `.mcp.json` 格式兼容**:项目级
`<projectRoot>/.mcp.json`,全局级 `<dshHome>/mcp.json`,同名 key
项目级覆盖全局级;`env`/`headers`/`args` 支持 `${VAR}` 环境变量插值。
- host 插件监听 `agent/created`,把启用的 server 逐个挂进 agent 自己的
Cordis context——工具以 `mcp__<serverName>__<tool>` 出现在**该 session
内**,按 session 隔离,agent 销毁自动卸载。
- 面板里每次新增/编辑/删除/启停,都会**自动重挂受影响 session** 的
MCP 连接;列表圆点与 Skills / 快捷消息同一套语义(绿=已启用,灰=已禁用,
橙=本项目禁用),挂载失败/冲突/未挂载等实时状态用行内标签与 tooltip
呈现,详情卡「状态」字段保留完整挂载信息与错误。

### 💬 快捷消息:常用提示词,一键入草稿、一键直发
把高频提示词存成快捷消息(项目级 `.dsh/quick-messages.json` +
全局 `<dshHome>/quick-messages.json`),面板里增删改、启停、搜索。
禁用的消息只从输入框弹层隐藏,配置仍然保留。

### 🎯 全局能力,可以只在这个项目里禁用
全局的 skill / MCP server / 快捷消息默认对所有项目生效。如果某个全局能力
只想在当前项目里关掉,不必动全局配置:打开该条目的详情卡,点击
**「项目已启用 / 项目已禁用」状态按钮**(绿=生效,橙=禁用)即可。
- 声明写入项目级覆写文件 `<项目根>/.dsh/capability-overrides.json`,
全局配置原样保留,其他项目完全不受影响;
- 效果真实生效:Skills / 快捷消息立刻从输入框弹层消失,MCP server 从
本项目所有 session 里**热卸载**(恢复时自动重挂);
- 列表行用橙色圆点 + 「本项目禁用」标签标出,一眼可辨;
- 详情卡上「全局已启用 / 全局已禁用」按钮仍然只管全局配置本身,与
「本项目」按钮并排但语义自明。
### ⌨️ 输入框里的「能力工具组」
输入框左下角注册了一组三个按钮(顺序与面板域 Tab 一致):
**快捷消息 / Skills / MCP**。点击在输入框上方展开弹层,三个弹层共用
同一锚点,切换不跳位;Esc / 点击外部关闭,彼此互斥。

- **Skills 弹层**:按项目/全局分组列出 user-invocable 的 skill(可搜索),
点击把 `/name ` 追加进草稿——与宿主 `/` 菜单同一口令形式,发送后宿主
自动注入 skill 正文。草稿里已含已知口令时按钮实心变绿。
- **快捷消息弹层**:点击把正文追加进草稿;行尾 hover 浮现纸飞机按钮,
**一键直发**整条消息(不经过草稿)。

- **MCP 弹层**:逐行开关控制 server 的**本项目启用/禁用**——项目条目直接写
项目配置,全局条目走项目级覆写(不翻全局配置,其他项目不受影响),
全局已禁用的 server 不在此列出(启用全局请到能力面板);写配置 +
自动热重挂,与面板同一语义。

## 工作原理
```
浏览器客户端 宿主(host)
┌─────────────────────┐ RPC ┌──────────────────────────────┐
│ sidebar.footer │ ────────► │ ctx.capabilityPanel 服务 │
│ └ 能力面板浮层 │ /capability│ ├ skills 磁盘 CRUD │
│ conversation.input │ -panel │ ├ mcp 配置 CRUD + │
│ └ 能力工具组×3 │ 通道 │ │ 热挂载 loader │
│ conversation.input │ │ ├ quickMessages 配置 CRUD │
│ └ 弹层×3 │ │ └ overrides 项目级禁用声明 │
└─────────────────────┘ │ agent/created → dsh-mcp-client│
└──────────────────────────────┘
```
- **不重复注册 skills provider**:读取复用 `ctx.skills` 与受管根目录直读,
与官方 filesystem provider 口径一致。
- **MCP 按 session 隔离**:挂在 agent 自己的 Cordis context 上,agent
dispose 即自动卸载;已知限制是 `serverName` 预留为进程级,同项目两个
session 并存时后到者显示黄色冲突圆点,不影响先挂载者。
- **UI 纯增量**:侧栏入口与输入框按钮都注册在宿主的列表槽(list slot)里,
不顶替、不遮蔽任何内置 UI,也不绑定特定 session。
## 安装
安装最新 release(推荐,版本钉死):
```powershell
dsh plugin --profile web add "github:chengdb/dsh-plugin-capability-panel#v0.8.0"
dsh web # 打开 Web GUI,侧栏底部可见「能力面板」
```
跟随 `master` 最新代码(无 release 时可临时用):
```powershell
dsh plugin --profile web add "github:chengdb/dsh-plugin-capability-panel#master"
```
## 卸载
```powershell
dsh plugin --profile web remove @chengdb/capability-panel
```
移除后重新运行 `dsh web` 即可,侧栏入口与输入框工具组随之消失。卸载**不会**触碰
你已经管理的任何数据——`.dsh/skills`、`.mcp.json`、`quick-messages.json`
等文件全部原样保留,随时可重新安装接管。
## 本地开发
```powershell
cd <本仓库路径>
pnpm install
pnpm build # tsc(lib/*.js + .d.ts)→ tsdown(lib/client.js 包裹版)
dsh plugin --profile web add "link:<本仓库路径>"
dsh web
```
## 发布新版本
```powershell
pnpm build # 重新构建 lib/ 产物
git add -A
git commit -m "chore: release vX.Y.Z" # 与 package.json 版本号一致
git tag vX.Y.Z
git push origin master --tags
gh release create vX.Y.Z --generate-notes # 可选,创建 GitHub Release 页面
```
- `lib/` 构建产物随提交进入 git,GitHub 安装(`github:...#<tag>`)直接可用,无需
在发布机上额外构建;**每次发版前务必重新 `pnpm build` 并提交 `lib/`**。
- tag 名即安装时 `#` 后面的版本号,`#master` 始终跟随最新提交。
## 目录结构
```
src/
index.ts 宿主插件入口——暴露 ctx.capabilityPanel 服务
client.ts 客户端插件入口(侧栏入口 + 输入框工具组 + 弹层)
remote.ts host↔client RPC 接线(endpoint 按域前缀路由)
shared/ 项目根探测 / 文件写锁 / skill 根定位(两域共用)
skills/ skills 域:磁盘读写、CRUD、安装/导出、URL 下载、校验
mcp/ MCP 域:.mcp.json 读写、agent 自动挂载、写后热重挂
quick-messages/ 快捷消息域:JSON 配置读写、CRUD
overrides/ 项目级禁用域:.dsh/capability-overrides.json 读写、覆写切换
client/ React 面板、三个 composer 弹层、zip 工具、自含样式
```
## License
[MIT](LICENSE)
Install
dsh plugin --profile web add github:chengdb/dsh-plugin-capability-panel#00ee34a8d76cb456c7d1f33a21ee6e33b6fc2e48
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install chengdb-capability-panel from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.