ZiYuan258/dsh-skill-router ↗★ 0
dsh-skill-router
DeepSeek Harness plugin adding the skill_search / skill_load / skill_ref tools and a 技能 tab that lists what the session actually loaded, so an agent can find and load any skill from a staged library instead of paying for every skill in the session catalog. 适合需要从本地库动态加载技能以节省每轮常驻Token的用户。
Other repositories with this package name
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:ZiYuan258/dsh-skill-routerREADME
Read the full README ↗使用方法
零、装完就能用(不需要先准备任何东西)
插件自带一个入门技能库(5 个,覆盖"先搜再动手 / 用证据说话 / 带着证据调试 / 先定范围 / 把结果讲清楚")。你没有自己的库时,它就是这个库——重启 DSH 之后 skill_search 立刻有东西可搜:
skill_search "debug"
→ debug-with-evidence ← 来自插件自带的入门库
返回值里会带 starterLibrary: true,以及 library: 指向插件包内的路径。看到这个标记就说明你读的是入门库,不是自己的库——这两种情况的诊断方向完全不同,所以它必须能分辨。
入门技能不会被塞进常驻目录。 它们在插件包的
resources/starter-skills/下,走的是skill_search/skill_load这条路,一个字节都不进每轮的模型目录。把入门技能放进.dsh/skills/会立刻让它们每轮进上下文——那正好毁掉这个插件的全部意义。test/starter-library.mjs里有一条断言专门守这件事。
自带 5 个而不是 1000 个是有意的:这个插件解决的问题就是"大库不要常驻"。往包里塞一个大库会同时带来包体、更新、许可证与版本绑定四类问题。想要真正的能力覆盖,就把你自己的库接上去(下面第一节)。
一、把库放到哪里
插件从会话工作目录往上最多 8 层找 .skill-src/skill-index.tsv。所以惯例是把库放在工作区根:
\ ← 你在这里开 DSH 会话
├─ .skill-src\ ← 库的根,插件找的就是这个名字
│ ├─ skill-index.tsv ← 索引(下一步生成)
│ ├─ remotion-skills\ ← 一个上游仓库 = 一个顶层目录
│ │ └─ skills\remotion-create\
│ │ └─ SKILL.md
│ └─ trailofbits-skills\
│ └─ plugins\semgrep\skills\semgrep\
│ └─ SKILL.md
├─ .dsh\skills\ ← DSH 常驻区(插件不碰这里)
└─ AGENTS.md
两条硬性约定:
- 目录名必须是
.skill-src。 前导点让它对 DSH 的 skill 扫描器不可见——这正是"库不占目录成本"的机制。若命名为skills/或放进.dsh/skills/,DSH 会把里面的技能全部注入每轮上下文,插件就白装了。 - 它必须在会话 cwd 的同级或上级。 若你的 DSH 会话开在
\projects\foo,插件会向上找到\.skill-src——这没问题。 - 内部结构随意。 插件只要求"某层的目录名等于
repo列、其下路径等于relpath列、最后是SKILL.md"。上游仓库那种skills/、plugins//skills/、antigravity/skills/混排的布局原样放着即可。
二、库在别处(别的盘 / 别的目录)
插件按 cwd/.skill-src 找,所以库不在工作区里时,在工作区放一个目录链接指过去即可。已实测可用(Windows junction / POSIX symlink,node tools/check-link-support.mjs 可自行复验):