Skip to content
dsh.fish
Bundle

dsh-skill-picker

DSH Web GUI skill picker: a button beside the composer opens a searchable list of installed skills; picking one inserts the official `/skill-name` gesture into the input box, so the skill loads with your message (WorkBuddy-style skill invocation for DeepSeek Harness).

Source
a735624258
stars
6 stars
License
MIT
Updated
Updated 24 days ago

Readme

# dsh-skill-picker

> **技能记不住名字?官方 `/` 补全靠前缀记忆,装了几十个技能谁记得住?** 本插件让技能**看得见、翻得到、选得快**——点一下 ⚡,全部技能带描述排在你面前,搜索、点选、插入,随消息发出自动加载。

DSH Web GUI 的技能选择器:在输入框(composer)工具行右侧加一个按钮,点开可以**搜索并点选已安装的技能**,选中后把官方 `/技能名` 手势插入发送框——随消息一起发出,DSH 原生机制就会自动加载该技能并执行。WorkBuddy 式"把技能写进发送框"的交互,DeepSeek Harness 复刻版。

English: A skill picker for the DSH Web GUI — a button in the composer's right tool row opens a searchable list of installed skills; picking one inserts the official `/skill-name` gesture into the draft, so DSH's native user-invocation path loads the skill with your message.

## 为什么用它(vs 官方 `/` 补全)

官方内置了 `/` 技能补全,但它是**记忆驱动**的——你得先记得技能名,打 `/` + 前缀才能过滤出来。技能一多就抓瞎:

| | 官方 `/` 补全 | dsh-skill-picker |
|---|---|---|
| 触发 | 输入框打 `/` | 输入框旁 ⚡ 按钮 |
| 查找方式 | 前缀记忆驱动,**忘了名字就找不到** | 全列表浏览 + 关键字搜索,**忘了名字也能翻到** |
| 排序 | 固定 | **最近使用置顶、常用靠前** |
| 描述可见 | 精简 | 完整描述一眼看全 |

**记得名字用官方,忘了名字用本插件——两者互补,可同时使用。**

## 特性

- ⚡ 一键弹出全部技能(闪电图标,人人看得懂)
- 🔍 实时搜索(技能名 / 描述都搜)
- 🧠 **最近使用置顶、常用靠前**的智能排序(WorkBuddy 同款)
- 📋 直接扫描 `~/.dsh/skills`(官方技能 provider 同源目录,标准安装即用)
- 🧩 插入官方 `/技能名` 手势,加载/执行走 DSH 原生机制,**零 agent 侧改动**
- 🎨 跟随 Web UI 主题(CSS 变量),浅色/深色自适应
- 📦 纯 client + host 双半插件,无第三方运行时依赖

## 安装

```sh
# 方式一:GitHub 克隆 + link(推荐,无需发布 npm)
git clone https://github.com/a735624258/dsh-skill-picker.git
dsh plugin --profile web add link:/path/to/dsh-skill-picker

# 方式二:Git 依赖直装
dsh plugin --profile web add "github:a735624258/dsh-skill-picker"

# 方式三:发布到 npm 后(预构建安装,体验最佳)
dsh plugin --profile web add dsh-skill-picker
```

> 注:目前**尚未发布 npm**(`npm view dsh-skill-picker` 会 404),请用方式一或方式二。
> 若 `dsh` 命令因 PowerShell 执行策略被拒(`File ... cannot be loaded`),用:
> `powershell -ExecutionPolicy Bypass -Command "dsh plugin --profile web add link:C:\path\to\dsh-skill-picker"`

重启 `dsh web`(或刷新页面加载新 bundle)后生效。

## 用法

1. 打开任一会话,在输入框工具行右侧找到**⚡ 按钮**
2. 点击弹出技能列表(可输入关键字过滤)
3. 点选技能 → 发送框自动出现 `/技能名 `
4. 继续输入你的话并发送——DSH 会识别 `/技能名` 手势,自动加载该技能并按其指令执行

示例:点选 `duo-xuan-pi-gai` 后发送框变为 `/duo-xuan-pi-gai 帮我批改多选`,发送后技能自动加载。

## 原理

DSH 的 [dsh-tool-skill](https://github.com/deepseek-ai/deepseek-harness) 在 `agent/pre-step` 阶段扫描用户消息中的 `/kebab-case-name` 手势(`SKILL_GESTURE` 正则),命中后把对应技能内容作为 `skill-invocation` 注入对话——即"用户消息里写 `/技能名` 就会自动加载技能"是官方既有能力,只是没有 UI。

本插件只补 UI 一层:

```
[client]  ⚡ 按钮 → fetch('/dsh-skill-picker/skills')
                    ↓
[host]    扫描用户级 $DSH_HOME/skills + 项目级 <cwd>/.dsh/skills 等 → 技能目录(name + description)
                    ↓
[client]  点选 → inputActions.setDraft(draft + '/技能名 ')
                    ↓
[DSH]     agent/pre-step 识别手势 → 自动加载技能 → 执行
```

- client 半:注册到官方 `conversation.input.right` 插槽(composer 工具行、发送按钮左侧的控件位),**技能列表优先走官方宿主 skills API**(`connection.api.skills.list`——与 DSH 内置 `/` 补全同源,会话作用域,自动含用户级/项目级技能),失败时回退到 host 扫描路由;插入文本走框架输入机的 `inputActions.setDraft`(单一路径,撤销/草稿持久化自动处理);最近/常用排序存 localStorage

## 与官方 `/` 补全的关系

DSH 官方已内置技能补全:在输入框输入 `/` 会弹出技能菜单,按前缀过滤(如输入 `/sk` 列出 skill 开头的技能)。本插件不替代它,而是补上官方方案的盲区:

| | 官方 `/` 补全 | dsh-skill-picker |
|---|---|---|
| 触发 | 输入框打 `/` | 输入框旁 ⚡ 按钮 |
| 查找方式 | **前缀记忆驱动**——需要先记得技能名才能打出来 | **全列表浏览 + 关键字搜索**——忘了名字也能翻到 |
| 排序 | 固定顺序 | 最近使用置顶、常用靠前(localStorage) |
| 适合场景 | 记得名字的老手 | 技能多、记不全名字、想翻着选的人 |

一句话:**记得名字用官方,忘了名字用本插件**。两者互补,可同时使用。

## 兼容性与注意事项

- **技能来源**:**优先走官方宿主 skills API**(`connection.api.skills.list`——与 DSH 内置 `/` 补全**完全同一个数据源**,会话作用域,自动覆盖用户级 `~/.dsh/skills`、项目级 `<workspace>/.dsh/skills`、`<workspace>/.agents/skills` 等全部官方目录);官方 API 不可用时**自动回退**到内置扫描(用户级 + 项目级目录)。两条路都支持 `DSH_HOME` 环境变量。
- **暂不扫描**:`~/.agents/skills` 与自定义技能目录(`customSkillDirs` 配置)——需要的话欢迎 PR。
- **失败保护**:client 端用 `ctx.slots.inject`(等 `conversation.input.right` 插槽声明存在才注册,插槽缺失时静默跳过,不会拖垮启动);host 端路由 try/catch,扫描目录不存在时返回空列表而非报错。
- **依赖版本**:按 DSH `0.1.0-rc.6` API 编写(cordis 4 / web profile 标准装配)。如遇 DSH 大版本更新导致 API 变化,插件会以启动日志的插件错误提示为准,卸载 `dsh plugin --profile web remove dsh-skill-picker` 即可回退。

## 开发

```sh
# 安装依赖(提供 esbuild)
npm install

# 构建(源码 src/ → 产物 lib/;client 半自动包 __ModuleLoader__ 握手)
npm run build

# 安装到 web profile(link 模式,改源码即生效)
dsh plugin --profile web add link:$PWD

# 语法自检(产物)
node --check lib/index.js
node --check lib/client.js
```

> ⚠️ 改完源码**必须 `npm run build`**:`lib/client.js` 是构建产物,ESM 源码不能直接作
> 为 client bundle 加载——DSH web shell 要求 client bundle 以
> `window.__ModuleLoader__.load({ id, factory })` 的 CJS 握手格式注册,否则启动报
> `loaded without registering "dsh-skill-picker" via __ModuleLoader__.load`。
> 构建脚本(`build.mjs`)会通过 esbuild 的 banner/footer 自动注入这段握手。

目录结构:

```
dsh-skill-picker/
├── package.json        # dsh.bundle.patch + dsh.client 声明 + build script
├── cordis.patch.yml    # bundle patch:把插件行插入 web profile
├── build.mjs           # esbuild 构建:host ESM + client CJS(__ModuleLoader__握手)
├── src/
│   ├── index.js        # host 半源码:/dsh-skill-picker/skills 路由 + prompt section
│   └── client/
│       └── index.jsx   # client 半源码:conversation.input.right 插槽组件
├── lib/                # 构建产物(勿手改,`npm run build` 生成)
│   ├── index.js
│   └── client.js
└── README.md
```

## 依赖

- host:`@deepseek-ai/cordis`、`@deepseek-ai/dsh-host-webserver`、`@deepseek-ai/dsh-skill`、`@deepseek-ai/dsh-system-prompt`
- client:`@deepseek-ai/dsh-client-runtime`、`@deepseek-ai/dsh-client-ui-slots`、`react`

## License

MIT

Install

dsh plugin --profile web add github:a735624258/dsh-skill-picker

Profile: web

  • 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.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source