前言¶
在 DeepSeek Harness(DSH)里用 Skill 给模型加能力时,内置的 skill-filesystem 把用户技能根目录固定在 ~/.dsh/skills,并且每个会话一视同仁:要么全部技能都进入上下文,要么都没有。技能一多,没用到的也会占 token。工作流类需求往往是「这台机器上技能放哪、这个仓库里开哪几个」,而不是全局全开。下面介绍社区插件 dsh-skill-workspace(维护者 liufeicc,分类:工作流),它把技能集中到可配置目录,并由各工作区自行勾选可用项。
插件定位¶
dsh-skill-workspace 是 DSH 生态中的独立插件,源码托管于 GitHub 仓库 liufeicc/dsh-skill-workspace,可在社区目录页 skillhub.cn/plugins/liufeicc/dsh-skill-workspace 查阅。包名 @local/dsh-skill-workspace,版本 1.0.0,许可证 MIT。
一句话:技能库目录可在设置里改,当前工作区在聊天标题栏用复选框决定启用哪些库内技能;项目级目录 <workspace>/.dsh/skills 不受复选框约束,始终可用。
与内置 skill-filesystem 的差异¶
内置扫描器不被本插件修改。本插件注册自己的 provider,对目录里每个技能返回同名候选:
- 工作区已勾选 → 正常候选,
get()可读正文; - 未勾选 → 同名候选,但
modelInvocable/userInvocable均为false。
注册表按层级合并:同层靠 rank 决胜,更近层直接覆盖更远层,调用策略随胜出项走。因此未勾选的技能会从模型目录中真正消失,/name 也无法调用。
内置 skill-filesystem 挂在每个 agent preset 内,候选落在 preset 层。插件在 apply() 中注册两次:全局一次(rank 350,早于内置用户根的 400,作为无更近 provider 时的兜底);在 agent/created 里再挂到 agent.ctx(比 preset 更近,实测才能压过内置层)。卸载或热重载时 releaseAll() 清理 agent 上的注册,避免指向已失效服务。
项目技能(<workspace>/.dsh/skills,rank 100)与本插件管理的「技能库目录」是不同来源,不受标题栏复选框影响。
两个入口¶
| 位置 | 作用 |
|---|---|
| Settings → Skills | 配置技能库目录(默认 ~/.dsh/skills) |
| 聊天标题栏 ✦ 图标 | 为当前工作区勾选要启用的库内技能 |
持久化与生效时机¶
策略写在 $DSH_HOME/storages/skill_workspace_policy.json:
{
"version": 1,
"dir": "/home/liufei/.dsh/skills",
"byWorkspace": {
"/abs/path/to/workspace": ["git-commit-zh", "review"]
}
}
某工作区在 byWorkspace 里没有记录,表示该工作区未选中任何库内技能——与 MCP 策略一致,未选中的不应消耗上下文。手改该文件不会立刻生效:宿主在插件加载时读入并驻留内存,不监视文件;在 UI 勾选会写盘并 invalidate(),下一轮对话刷新目录。
- 勾选 / 取消勾选:立即 invalidate,该工作区会话在下一轮看到新目录(进行中的轮次在
agent/pre-step已定格目录,不变)。 - 修改目录:同上;目录不存在时会
mkdir -p。 - 无需重启或重新挂载。
目录结构与 SKILL 文件¶
只扫描一层:<dir>/<name>/SKILL.md 或 <dir>/<name>.md,不支持嵌套 **/SKILL.md(与内置一致)。
示例:
---
name: git-commit-zh
description: Write Chinese commit messages following the team convention. Use when committing code or summarising changes.
---
# The actual instructions
name必填,kebab-case;description必填,模型只靠它做路由;- 可选:
whenToUse、disable-model-invocation、user-invocable(布尔可用true/false、yes/no、on/off、1/0)。
格式错误的文件会在 UI 中列出,而不是像内置扫描器那样静默跳过。
远程 API(客户端)¶
经 ctx.remote.skillWorkspace 调用:
| 方法 | 输入 | 返回 |
|---|---|---|
list |
{} |
{ dir, defaultDir, missing, skills, errors, shadowed, byWorkspace, storePath, recentErrors } |
set |
{ workspace, selected } |
{ applied, workspace, selected, unknown, persisted } |
setDir |
{ dir }(空字符串恢复默认) |
{ applied, dir, created, persisted } |
安装与启用¶
已抓取 README 未给出 dsh plugin add 一类安装命令。安装与更新请以社区目录页说明为准:https://www.skillhub.cn/plugins/liufeicc/dsh-skill-workspace。插件在 DSH 进程权限下运行,启用前请自行审阅源码与 MIT 许可证。
典型用法¶
- 在 Settings → Skills 把技能库指到统一目录(或保持默认
~/.dsh/skills)。 - 按上述单层布局放入
SKILL.md,保证 frontmatter 合法。 - 打开目标工作区对话,点标题栏 ✦,勾选本仓库需要的技能;其他工作区可保留另一组勾选。
- 项目专属技能仍放在
<workspace>/.dsh/skills,无需勾选即可用。
开发自检(仓库内,无构建步骤):
node test/skill-workspace.mjs
适用场景与注意¶
适合:多工作区、多仓库并行,希望共享技能库但按项目精简上下文;需要把技能目录迁出默认路径的团队环境。
注意:未勾选即不占上下文,是产品设计而非数据缺失。2026-10-26 首发:可配置目录 + 按工作区复选框;Skill 弹层每次打开会重载列表(改目录后无需整页刷新)。社区目录站 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,DSH 本身遵循「一切皆插件」的扩展方式。
结尾¶
dsh-skill-workspace 在不改内置扫描器的前提下,用双层注册和工作区策略把「技能放哪」和「当前仓库用哪些」拆开,减少无关 Skill 带来的上下文成本。详情见 GitHub 与 SkillHub 目录页。