# dsh-skill-panel

[English](README.md) | 中文 | [日本語](README.ja.md)

一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 插件。
在侧边栏加一个技能按钮，点开是一份当前会话已加载技能的列表；鼠标悬停在某一行
上会浮现按钮，点击即可打开该技能在磁盘上的目录。

## 兼容性

在 **DSH 0.2.0-rc.2**（web profile）上实测通过，0.1.5-rc.1 与 0.1.2-rc.1 上也能正常运行。
这些版本就是 `package.json` 里 `dsh.engines.dsh` 声明的范围，宿主和插件管理器
不必解析这份文档就能读到同样的信息。

这里**故意不声明** `@deepseek-ai/*` 的 `peerDependencies`：预发布范围会排除掉更新的
DSH 版本，导致宿主的兼容门禁直接跳过本插件。

插件只用公开的插件接口：`sidebar.footer.action` 槽位、`remote.skills.list`、
`session.openWorkspacePath`。它不改 DSH 本体，卸载后不留残留。

「打开目录」按钮从宿主投射的字段里取技能目录：0.2.0 起是 `SkillEntry.path`
（`SKILL.md` 的绝对路径），老核心上则可能是可选的 `directoryPath`。
以 URL 或不透明资源为后端的技能没有目录，因此不渲染该按钮。

## 安装

1. 安装插件 —— 从 npm（包名带 scope，因为 npm 上无 scope 的 `dsh-skill-panel` 属于别人）：

   ```sh
   dsh plugin --profile web add @lywusichen/dsh-skill-panel
   ```

   或直接从 GitHub：

   ```sh
   dsh plugin --profile web add github:lywusichen/dsh-skill-panel
   ```

2. 重启 DSH。

3. 左侧栏底部（设置按钮旁）会出现技能图标，点击即可打开弹窗。

## 功能

- 列出**当前会话**的技能：名称、路由说明，以及适用的 `仅用户` 徽标。列表按会话
  获取，与输入框 `/` 技能菜单共用同一份缓存。
- 点击技能行上的按钮，用系统默认文件管理器打开该技能的本地目录。
- 技能在磁盘上发生变化时，已打开的弹窗会自动同步。新版 DSH 会发
  `skills/change` 事件，是即时的；老核心退化为 30 秒轮询。
- 界面文案跟随 Web UI 语言（简体中文 / English / 日本語）。

## 截图

![侧栏底部的技能按钮](assets/skill-trigger.png)

![已加载技能弹窗](assets/skill-dialog.png)

![打开本地目录](assets/open-folder.png)

## 目录路径从哪来

不需要任何宿主补丁。弹窗通过 `remote.skills.list` 取技能列表、通过
`session.openWorkspacePath` 打开目录；目录按钮用的是宿主投射出来的路径：

- **DSH 0.2.0 及以后**投射 `SkillEntry.path`（`SKILL.md` 的绝对路径），插件取它的父目录；
- **老核心**可能带上可选的 `directoryPath` 增强字段（把 `skill.resourceBase.path` 投射出来）。

以 URL 或不透明资源为后端的技能两种情况都没有目录，此时不渲染按钮，不会报错。

## 构建

```sh
npm install        # 只需要 esbuild
npm run build      # 打包 src/client.jsx -> lib/client.js
```

客户端产物是单个 CJS 文件。`@deepseek-ai/*` 与 react 系列保持 external，
因为 DSH 外壳把它们作为平台静态模块提供。**请把 `lib/client.js` 提交进仓库** ——
git 方式安装直接消费构建产物，不会重新构建。

## 许可

[MIT](LICENSE)
