DSH Web 技能选择器,在输入框旁加 ⚡ 按钮,一键搜索/点选已安装技能并把官方 `/技能名` 手势插入发送框。
- 语言
- JavaScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add dsh-skill-picker在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 a735624258/dsh-skill-picker:先查看仓库 https://github.com/a735624258/dsh-skill-picker 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
DSH Web GUI 的技能选择器,在输入框工具行右侧加一个 ⚡ 按钮,点开可以搜索并点选已安装的全部技能,自动把官方 /技能名 文本插入发送框——消息发出后由 DSH 原生机制加载并执行。
核心能力
- 在会话输入框工具行(发送按钮左侧)注入一个 ⚡ 按钮,点击弹出可搜索的技能列表弹窗
- 弹窗内按「最近使用优先 → 使用次数 → 名称字母序」智能排序,支持关键字模糊搜索(同时匹配技能名与描述)
- 选中技能后把
/技能名(含末尾空格)追加到当前草稿末尾,自动补分隔;插入文本走官方输入契约,撤销与草稿持久化由宿主处理 - 改造官方
/补全:输入/直接列出全部技能(无前缀也能翻),输入关键字用模糊搜索;按相同使用规则排序,与 ⚡ 面板共享一份排序逻辑 - 技能列表数据源优先走官方宿主 skills API(与 DSH 自带
/补全完全同源、会话作用域),不可用时自动回退到插件内置目录扫描 - 弹窗样式跟随 Web UI 主题(CSS 变量),浅色/深色自适应;点击弹窗外区域自动关闭
技术实现
- 语言: JavaScript(host 端 ESM + client 端 JSX/React 18)
- 关键依赖:
@deepseek-ai/dsh-host-webserver(host 路由注册)+@deepseek-ai/dsh-client-runtime与@deepseek-ai/dsh-client-ui-slots(client 插槽与运行时)+react ^18.2.0(弹窗 UI)+fuzzysort(构建时打进 client bundle 的模糊搜索) - 架构模式: 双半部(host + client)Cordis 插件;通过
cordis.patch.yml把插件 ID 插入 web profile 层栈,host 端注册/dsh-skill-picker/skillsJSON 路由与系统提示片段,client 端通过conversation.input.right插槽与inputTriggers注册源挂载 UI 与改造/触发器;client bundle 必须以window.__ModuleLoader__.load({ id, factory })CJS 握手格式注册(由build.mjs的 esbuild banner/footer 自动注入) - 入口文件:
src/index.js(host,编译产物lib/index.js,ESM)+src/client/index.jsx(client,编译产物lib/client.js,CJS)
适用场景
在 DSH Web 装了几十个技能、但记不清或记不全名字时,避免在输入框里反复试错 /xxx 前缀。点 ⚡ 浏览/搜索列表,按最近使用和常用度找到目标技能,一键把官方 /技能名 手势写进草稿,特别适合技能量大、跨项目切换工作区、希望「看着选」而不是「背着用」的用户。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | ^0.1.0-rc.6 | 通过 peerDependencies 显式声明 @deepseek-ai/cordis / @deepseek-ai/dsh-host-webserver / @deepseek-ai/dsh-client-runtime / @deepseek-ai/dsh-client-ui-slots / @deepseek-ai/dsh-client-locale / @deepseek-ai/dsh-skill / @deepseek-ai/dsh-system-prompt;dsh.client.platform 固定为 web,仅 web profile 扫描 |
| 客户端契约 | 官方 web client | ⚡ 按钮依赖 slots.inject(在 conversation.input.right 插槽)、connection.api.skills.list(技能数据源)、inputActions.setDraft(写入草稿)、sessions.list(跟踪工作区路径)、inputTriggers(改造 / 补全) |
| Node.js | 未声明 | 源码未声明 engines;构建脚本 build.mjs 显式以 node22 为构建目标,运行时由宿主 DSH Node 版本决定 |
| 平台 | macOS / Windows / Linux | 纯客户端 UI 与 Node 端 fs 目录扫描,跨平台无差异;扫描路径均尊重 DSH_HOME 环境变量 |
| 原生模块 | 无 | 仅使用 Node.js 内置 node:fs/promises / node:os / node:path,无 node-gyp 编译依赖 |
安装方式
dsh plugin --profile web add github:a735624258/dsh-skill-picker
配置项
本插件无需额外配置。安装后重启 dsh web 并刷新浏览器即在输入框工具行出现 ⚡ 按钮。源码中未发现 Schema、process.env 读取(仅读取 DSH_HOME 用于定位用户技能目录)或用户级配置入口;行为由插件内置默认值与宿主 Web UI 主题自动决定。
常见问题
Q: 安装后输入框旁没有出现 ⚡ 按钮怎么办?
A: 必须用 dsh --profile web 安装(命令带 --profile web),安装后重启 dsh web 进程并刷新浏览器。package.json 里 dsh.client.platform 固定为 web,只有 web profile 会扫描并加载这个 client bundle。
Q: ⚡ 按钮和 DSH 自带的 / 补全有什么区别?能同时用吗?
A: 可以同时用。官方 / 补全是「前缀记忆驱动」——必须先打 /+ 前缀才能过滤;⚡ 按钮是「全列表浏览 + 关键字模糊搜索」,并且按最近使用/常用频率排序。两种交互最终都把 /技能名 文本插入草稿,由同一套原生机制加载。
Q: 选好技能后是如何被 DSH 加载并执行的?
A: 本插件只负责把 /技能名 文本写入草稿框,并不直接调用任何 agent。消息发出后由 DSH 官方 agent/pre-step 阶段的 SKILL_GESTURE 正则扫描用户消息中的 /kebab-case-name 手势,命中后把对应技能内容作为 skill-invocation 注入对话,由模型按技能指令执行。
Q: 安装了很多技能后,怎么快速找到常用那几个?
A: 每次点选技能都会被记录到浏览器 localStorage(key dsh-skill-picker:usage),含使用次数与最近使用时间戳;弹窗默认按「最近使用优先 → 使用次数 → 名称字母序」排序,搜索框在此基础上再做关键词模糊匹配。
Q: 哪些技能会被列出来?是不是和 DSH 内置补全一致?
A: 优先走官方宿主 skills API(connection.api.skills.list,与 DSH 内置 / 补全同源,会话作用域,自动覆盖用户级与项目级全部技能);官方 API 不可用时回退到插件内置目录扫描——扫描 $DSH_HOME/skills、<workspace>/.dsh/skills、<workspace>/.agents/skills,都尊重 DSH_HOME 环境变量。
Q: 改完源码直接重启为什么没生效?
A: lib/client.js 是构建产物,DSH web shell 要求它以 window.__ModuleLoader__.load({ id, factory }) 的 CJS 握手格式注册。改完 src/ 后必须执行 npm run build 重新生成 lib/,否则 web shell 启动时会报 loaded without registering "dsh-skill-picker" via __ModuleLoader__.load。
Q: 输入框里已经写了别的话,再点 ⚡ 会不会把之前内容覆盖掉?
A: 不会覆盖。插件会读取当前草稿内容(优先 input.draft,回退到 useInput 状态机),把 /技能名 追加到草稿末尾,自动补一个空格做分隔;如果草稿为空或结尾已经是空格/换行则不重复加分隔符。
上手难度
入门 — 安装一条命令、重启 web 一次即可使用,无 Schema、无环境变量、无需选择工作模式;默认行为覆盖 90% 用法,进阶用户可在浏览器 localStorage 中清空 dsh-skill-picker:usage 重置使用排序。
已知问题与限制
- 内置目录扫描的 host 端回退路径不扫描用户级
~/.agents/skills,只扫<workspace>/.agents/skills;自定义技能目录(DSH_HOME/customSkillDirs配置)同样不在扫描范围内——需要扫描这些目录的话欢迎 PR(README.md:96 / src/index.js:88-94) - 「最近使用/常用」排序存浏览器 localStorage(key
dsh-skill-picker:usage),清缓存、隐私模式、换浏览器都会重置;多端不会同步(src/client/index.jsx:25-46) lib/client.js是构建产物,源码改动必须npm run build,ESM 源码直接作为 client bundle 加载会导致 web shell 启动失败并报__ModuleLoader__.load握手错误(README.md:117-121 / build.mjs:11-13)- host 端系统提示片段向模型宣告「输入框旁有技能按钮」,依赖 DSH
systemPrompt服务;老版本 DSH 缺少该服务时插件仍可加载 UI,但模型不会自动理解「用户说『技能选择器/选个技能』即指本插件」的语义(src/index.js:26,119-123) - 技能数据优先走
connection.api.skills.list官方 RPC;在某些 DSH 早期版本里该 RPC 可能未挂载,会自动回退到 host 内置扫描,回退路径不包含官方 provider 的全部分层(src/client/index.jsx:192-215)
技能记不住名字?官方
/补全靠前缀记忆,装了几十个技能谁记得住? 本插件让技能看得见、翻得到、选得快——点一下 ⚡,全部技能带描述排在你面前,搜索、点选、插入,随消息发出自动加载。
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 | |
|---|---|---|
| 触发 | 输入框打 / | 输入框旁 ⚡ 按钮 |
| 查找方式 | 前缀记忆驱动,忘了名字就找不到 | 全列表浏览 + 关键字搜索,忘了名字也能翻到 |
| 排序 | 固定 | 最近使用置顶、常用靠前 |
| 描述可见 | 精简 | 完整描述一眼看全 |
记得名字用官方,忘了名字用本插件——两者互补,可同时使用。
特性
- ⚡ 一键弹出全部技能(闪电图标,人人看得懂)
/直接补全:输入斜杠即列出全部技能,模糊搜索(技能名+描述任意匹配)+ 常用排序(v0.2.0)- 🔍 实时搜索(技能名 / 描述都搜)
- 🧠 最近使用置顶、常用靠前的智能排序(WorkBuddy 同款)
- 📋 走官方宿主 skills API(与 DSH 内置
/补全同一数据源,自动覆盖用户级+项目级技能) - 🧩 插入官方
/技能名手势,加载/执行走 DSH 原生机制,零 agent 侧改动 - 🎨 跟随 Web UI 主题(CSS 变量),浅色/深色自适应
- 📦 纯 client + host 双半插件,无第三方运行时依赖
安装
# 方式一: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)后生效。
用法
- 打开任一会话,在输入框工具行右侧找到**⚡ 按钮**
- 点击弹出技能列表(可输入关键字过滤)
- 点选技能 → 发送框自动出现
/技能名 - 继续输入你的话并发送——DSH 会识别
/技能名手势,自动加载该技能并按其指令执行
示例:点选 duo-xuan-pi-gai 后发送框变为 /duo-xuan-pi-gai 帮我批改多选,发送后技能自动加载。
原理
DSH 的 dsh-tool-skill 在 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.6API 编写(cordis 4 / web profile 标准装配)。如遇 DSH 大版本更新导致 API 变化,插件会以启动日志的插件错误提示为准,卸载dsh plugin --profile web remove dsh-skill-picker即可回退。
开发
# 安装依赖(提供 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
查看使用指南 →
该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。
收录徽章
[](https://deepseek-plugin.org/plugins/a735624258/dsh-skill-picker)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。