技能开关(dsh-plugin-skill-gate)
在 DSH 设置页里开关技能:关掉的技能不再进入每次请求的 <available_skills> 清单,从而少占上下文。不改任何 SKILL.md,也不把文件移出扫描目录。
关闭后:
- 模型看不到、也不能用
skill 工具加载
/ 斜杠菜单里仍可手动点(与官方 disable-model-invocation 同一语义)
- 技能文件还在原处,重新打开立刻恢复
安装
从 npm(发布后):
dsh plugin --profile web add dsh-plugin-skill-gate
本地开发(本仓库,link: 直连源码):
cd /Users/biaoge/web/t-team/dsh-plugin-skill-gate
npm run verify
bash ops/tz.sh install # 等价于 dsh plugin --profile web add "$PWD"
link: 直连时没有"运行副本"这一层:改完 host / 客户端源码后跑 npm run build 重新生成
lib/client.js,再重启 DSH 即可生效(早期那套往 plugin-skill-gate 拷贝的装法已经不用了)。
装完重启 DSH。打开 设置 → 技能开关。
维护者:bash ops/tz.sh 进专属运维台(状态 / 安装 / 卸载 / 构建 / 自检 / 发布预演 / 一键发布到 npm),
版本变更见 CHANGELOG.md。
用法
- 搜索技能名或简介
- 按来源分组(用户目录 / 随包 / 项目…)
- 单个开关,或对当前筛选结果批量启用 / 停用
- 本身已带
disable-model-invocation 的技能显示为「原生关闭」,不能用本插件强行打开
视角
列表默认是全部来源的并集:宿主全局层、默认 preset、每个活跃会话,加上直接扫描 ~/.dsh/skills 与 ~/.agents/skills 的结果。这是管理的口径——要关掉一个技能,先得看得见它。
但模型实际读到的是它自己那条 scope 链,两者并不相等:data-agent 这类没挂 skill-filesystem 的 preset,会话里一个本地技能都没有,并集里却会全部列出。
所以顶部的「视角」下拉可以切到具体来源,计数也随视角变成该视角的真实值:
| 视角 | 含义 |
|---|
| 全部来源(并集) | 各来源合并后的管理清单 |
| 宿主全局层 | 不带 scope 的调用结果(web 上通常只有随包技能) |
默认 preset · <id> | 默认 preset 的 standing scope,即新会话起步时读到的目录 |
会话 · <目录名> | 某个活跃会话的 scope 链 |
| 磁盘扫描 | 直接读 ~/.dsh/skills、~/.agents/skills 的结果 |
名单写在 ~/.dsh/skill-gate.json(可用 Config storePath 覆盖)。改完下一轮模型请求即生效,不必再重启。
原理
宿主启动时包装 ctx.skills.snapshot / list / get:把本插件名单里的技能的 modelInvocable 置为 false。dsh-tool-skill 生成目录时本来就会 filter(isModelInvocable),所以清单自然变短。list() 内部走的是 this.snapshot(),自有属性会遮蔽原型方法,因此 self-call 同样命中包装。
设置页的视角来自各来源各读一次的结果,并集落成清单、每行记住自己出现在哪些视角(views),面板据此过滤。该字段必须在 lib/remote-schemas.js 里声明——Typert 的 strict 结果模式会丢掉 schema 未声明的字段。