背景

DeepSeek Harness(dsh)本身已经内置了 skills 发现机制,并不要求把其他 Agent 的 skill 复制进 ~/.dsh/skills。与其维护大量符号链接,更推荐使用官方提供的 customSkillDirs 配置,直接把其他 Agent 的 skills 根目录注册给 DSH。

以 CC Switch 的共享 skill 目录为例:

C:\Users\<用户名>\.cc-switch\skills

只需要在 DSH 配置中增加这一条,DSH 就能扫描其中所有技能,且后续新增、删除、修改 skill 都会自动同步。

DSH 实际扫描的技能目录

按源码 packages/skill/skill-filesystem 的定义,DSH 会按以下优先级扫描,rank 越小越优先:

优先级 来源 本机路径
1 项目 DSH <项目根>\.dsh\skills
2 项目 Agents <项目根>\.agents\skills
3 自定义目录 customSkillDirs
4 用户 DSH C:\Users\--sora--\.dsh\skills
5 用户 Agents C:\Users\--sora--\.agents\skills
6 内置目录 $DSH_BUNDLED_SKILL_DIR

为什么优先使用 customSkillDirs,而不是软链

方案 优点 缺点
逐个 skill 建软链 可以精确挑选 新增/删除 skill 时要手动维护软链
把整个目录软链成 .dsh\skills 自动同步 Windows 软链权限要求较高,且会占用 DSH 原生用户技能目录
customSkillDirs 配置 官方配置入口,支持多个目录,自动同步,无软链权限问题 修改配置后需要重启 DSH

另一个关键点是:DSH 的技能发现只扫描一层,只识别:

<skill-root>/<skill-name>/SKILL.md
<skill-root>/<skill-name>.md

因此直接使用 customSkillDirs 指向一个已经是平铺结构的 skill 根目录,是最稳定、最省事的方案。

配置方法

1. 编辑 DSH 的 home 级配置

文件位置:

C:\Users\<用户名>\.dsh\cordis.patch.yml

如果文件不存在就新建,然后写入:

- id: skill-filesystem
  name: '@deepseek-ai/dsh-skill-filesystem'
  config:
    customSkillDirs:
      - 'C:/Users/<用户名>/.cc-switch/skills'
      - 'C:/Users/<用户名>/.claude/skills'
      - 'C:/Users/<用户名>/.codex/skills'
      - 'C:/Users/<用户名>/.qoder/skills'
      - 'C:/Users/<用户名>/.config/opencode/skills'

本机实际生效配置示例:

- id: skill-filesystem
  name: '@deepseek-ai/dsh-skill-filesystem'
  config:
    customSkillDirs:
      - 'C:/Users/--sora--/.cc-switch/skills'

2. 路径注意事项

  • 必须使用绝对路径
  • 推荐使用 /,并用单引号包起来。
  • customSkillDirs 不会展开 ~,所以不要写 ~/.cc-switch/skills
  • 想引用多个 Agent 的目录时,直接追加多个 - 项即可。

3. 重启 DSH

cordis.patch.yml 是 home 级 patch,只在 DSH 启动时组合。修改后需要:

# 先停止正在运行的 dsh web
# 然后重新启动
npx @deepseek-ai/dsh web

配置生效后,skill 目录内部的增删改由 watcher 自动发现,后续不需要因为改 skill 内容再重启。

验证是否生效

第一步:确认配置已进入组合树

npx @deepseek-ai/dsh web --dump-config

在输出中找到 skill-filesystem 行,确认包含:

customSkillDirs:
  - C:/Users/--sora--/.cc-switch/skills

第二步:让 DSH 实际加载一个 skill(以code-review为例)

在 DSH Web 中新建会话,输入:

请调用 skill 工具,参数 name=code-review,并返回 <skill_resources> 中的 Base directory 路径

如果返回:

C:\Users\--sora--\.cc-switch\skills\code-review

说明 customSkillDirs 已经生效,DSH 确实从 CC Switch 目录加载了该 skill。

可引用的常见 Agent Skill 目录

Agent / 工具 常用路径
CC Switch C:/Users/<用户名>/.cc-switch/skills
Claude Code C:/Users/<用户名>/.claude/skills
Codex C:/Users/<用户名>/.codex/skills
Qoder C:/Users/<用户名>/.qoder/skills
OpenCode C:/Users/<用户名>/.config/opencode/skills
通用 agents 目录 C:/Users/<用户名>/.agents/skills
项目级目录 <项目根>/.dsh/skills<项目根>/.agents/skills

其他 Agent 目录的兼容性要求

引用的目录必须满足 DSH 的发现规则:

  1. 必须是平铺结构:
skills/
├── code-review/
│   └── SKILL.md
└── tdd/
    └── SKILL.md
  1. SKILL.md 中必须包含合法的 YAML frontmatter:
---
name: code-review
description: 代码评审技能
---
  1. name 必须是 kebab-case,且必须有非空 description

  2. 不支持递归发现嵌套的 **/SKILL.md。如果某个 Agent 的目录是嵌套结构,应单独整理成一个平铺目录后再引用。

可选配置

如果希望只使用 customSkillDirs,完全忽略项目级和用户级默认目录,可以设置:

- id: skill-filesystem
  name: '@deepseek-ai/dsh-skill-filesystem'
  config:
    includeDefaultRoots: false
    customSkillDirs:
      - 'C:/Users/<用户名>/.cc-switch/skills'

如果遇到 watcher 在 Windows 上无法及时感知外部目录变化,可以显式启用轮询:

- id: skill-filesystem
  name: '@deepseek-ai/dsh-skill-filesystem'
  config:
    customSkillDirs:
      - 'C:/Users/<用户名>/.cc-switch/skills'
    watchUsePolling: true

结论

推荐方案是:不要为每个 skill 创建软链,而是把 CC Switch 或其他 Agent 的整个 skills 根目录通过 customSkillDirs 注册给 DSH。这是 DSH 原生支持的配置入口,能自动同步新增和删除,也避免了 Windows 软链权限和生命周期维护问题。