dsh-skill-import
August 15, 2026 · View on GitHub
给 DeepSeek Harness Web 对话界面加一个「导入 / 管理 Skill」入口(输入框 + 菜单里)。用户输入本地skill文件夹的绝对路径即可导入,导入后每个skill有开关:
- 开启:模型可自主选择调用该skill(出现在
<available_skills>目录里) - 关闭:模型不能自主调用(目录与
skill工具双重拒绝),但用户仍可显式发/skill名手动调用
导入的 skill 持久存放在 $DSH_HOME/skill-imports/,重启不丢。单包布局,根目录即 bundle,一条命令安装。
结构
dsh-skill-import/
├── cordis.patch.yml 单行装配
├── src/index.ts node半边:导入/开关/移除服务+隔离skill provider+web路由
├── src/client/ 浏览器半边
├── lib/ 已提交的构建产物
├── tests/ core逻辑单测
├── sample-skill/ 测试用样例skill
└── dev/probe.ts 一次性功能探针(验证开关语义用)
工作原理
- 导入:把源文件夹复制到
$DSH_HOME/skill-imports/<name>/,在 settings 的skill-imports命名空间登记{ name, enabled, importedAt }。 - 发现:用
FileSystemSkillProvider的隔离模式(includeDefaultRoots: false+customSkillDirs: [导入目录])注册一个skill-importsprovider,列出全部已导入 skill。 - 开关:关闭的 skill 仍在目录里,但
invocation.modelInvocable被降级为false——模型侧目录与skill工具因此拒绝它;userInvocable保留,/name手动调用不受影响。切换后invalidate()刷新目录;不删文件,可随时再开。 - 通信:不走
/apiRPC 通道(该通道被网关独占,一个通道一个拦截器),而是用ctx.webServer.register挂自己的 JSON 路由:POST /skill-import/{list,import,set-enabled,remove},返回{ ok, value } | { ok: false, error }信封;浏览器半边同源 fetch。无 Typert 装饰器,Node 22 原生可解析。
安装
本地 checkout(开发)
pnpm dsh plugin --profile web add ./dsh-skill-import
pnpm dsh web # 重启后刷新页面
GitHub Release 附件(推荐)
#下载Release附件后执行
pnpm dsh plugin --profile web add file:dsh-skill-import-0.1.0.tgz
GitHub 仓库
pnpm dsh plugin --profile web add github:Trank-DTK/dsh-skill-import
使用
点输入框 + → 「导入 / 管理 Skill」→ 填样例路径 ...\dsh-skill-import\sample-skill(注意要绝对路径) → 导入。让模型用 skill 工具即可看到它;关掉开关后模型目录里消失,但你仍可发 /sample-skill 手动调用。
校验规则
- 源文件夹顶层必须有
SKILL.md(或<文件夹名>.md);子目录里的不会被识别。 - frontmatter 必须有
name(kebab-case,如sample-skill)与description。 - 同名 skill 已导入时拒绝覆盖;需先「移除」再重新导入。
- 直接手工复制文件夹进
$DSH_HOME/skill-imports/也生效(默认视为开启,可在对话框里关闭)。
开发
pnpm build # tsdown:node 半边 lib/index.mjs + 浏览器半边 lib/client.js
pnpm typecheck # tsc
pnpm test # vitest 单测
安全提示
Skill 是写给模型的指令,导入即信任。请导入自己制作或来源可信的 skill 包。