dsh-skill-preferences:在 DSH 中分层管理 Skill 开关

前言

DeepSeek Harness(DSH)通过 Skill 扩展智能体能力。Skill 数量一多,模型或用户界面仍可能误触发不合适的 Skill;若只能改预设或删包,又会影响其他账号或项目。下面介绍社区插件 dsh-skill-preferences,在 Settings → Skills 里按全局、用户、工作区三层持久化禁用列表,并在运行时通过 Skill 提供方策略抑制已禁用的 Skill。

这是什么

dsh-skill-preferences(维护者 zc679087)是发布在 npm 的 DSH Web 侧插件,当前资料中的版本为 0.2.2,许可证 MIT。它使用 DSH 公开的 WebServer、Auth、settings、skills、Agent 与 client slot 等 API,无需改 DSH 源码或内置预设;偏好保存在宿主持久化命名空间 skill-preferences 中。社区目录分类为 admin-security,目录页:skillhub.cn/plugins/zc679087/dsh-skill-preferences。SkillHub 为独立社区站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

三层偏好

在 Settings → Skills 中选择一层,搜索 Skill 并切换开关。开关只反映当前选中层的设置;「Current session」状态与层标签展示当前账号与工作区下的合并结果。

选中层 开关修改对象 作用范围
Global 全局 disabled 列表 所有账号与工作区
This user 当前登录账号的 disabled 列表 该账号在各工作区
This workspace 当前项目根的 disabled 列表 在该项目中工作的所有账号

限制按 global → user → workspace 取并集:在上层被禁用的 Skill,下层无法单独「启用」;在某层启用只会清除该层的限制。被继承限制的条目仍可见,并说明应改哪一层。用户层在多用户模式下需已认证账号;工作区层需有活动会话与工作目录。插件用最近的 .git、.dsh 或 .agents 项目根,若无标记则用当前工作目录。

持久化与权限

偏好示例结构(摘自 README):

skill-preferences:
  disabled: [pdf]
  hints: {}
  byUser:
    '<account-userId>':
      disabled: [cad]
      hints: {}
  byWorkspace:
    '/absolute/project/root':
      disabled: [imagegen]
      hints: {}

hints 保存禁用时的描述与来源,不参与 enforcement。用户键为账号 userId,非登录名。多用户模式下,仅宿主 admin 角色可见全局选择器并修改全局偏好;普通用户的全局写请求会被拒绝。0.2.2 起全局选择与全局写入限定为管理员;已废弃的 adminUsers 字段仅为兼容旧配置,不再授权。匿名本地模式仍保留全局访问;有认证账号时按宿主角色判断。工作区写入对普通用户仍可用;普通用户仍可在 Skill 上看到「Globally disabled」状态说明,但不等于能编辑全局层。

写入串行化、成功前即持久化,并保留其他层;保存后会失效插件 Skill 目录缓存,无需重启 DSH。

HTTP 接口

插件提供两个 JSON 端点,多用户请求需 Authorization: Bearer <token>;浏览器使用当前 DSH token。

POST 路径 JSON body
/plugin-skill-preferences/list { "query": {} }
/plugin-skill-preferences/setEnabled { "change": { "name": "pdf", "enabled": false, "target": "workspace", "cwd": "/project" } }

query 与 change 可带可选 cwd、presetId;target 为 global、user 或 workspace,默认 global;工作区写入需 cwd。成功响应形如 { "ok": true, "value": { "skills": [], "userAvailable": true, "isAdmin": true } };错误为 { "ok": false, "error": { "code": "...", "message": "..." } }。

运行时 enforcement

插件注册完整 Skill 提供方,通过 model/user 调用策略抑制已禁用 Skill。Live Agent 绑定持久会话所有者,使用户目录隔离且不改共享宿主缓存;偏好变更在下一步 Agent 生效。需注意:保存后 DSH 根路径建议菜单可能仍是旧列表,需刷新页面;会话尚无 Live Agent 时,原生 skill.list 可能未应用用户层抑制,而设置 API 与 Live Agent 执行路径会应用三层;同一 Web profile 只应挂载一次,避免重复 settings 命名空间。

安装与启用

在 Web profile 从 npm 安装指定版本:

dsh plugin --profile web add dsh-skill-preferences@0.2.2

重启 DSH Web 并刷新浏览器。包内 bundle 会自动挂载宿主插件并暴露浏览器模块,无需再写 dsh-skill-preferences/preset 条目。

本地 tgz 安装:

dsh plugin --profile web add /absolute/path/dsh-skill-preferences-0.2.2.tgz

若手动管理 profile,在 $DSH_HOME/profiles/<profile>/ 用该 profile 的包管理器安装,并在 cordis.patch.yml 中插入(不要与 bundle 安装并存):

- insert:
    - id: skill-preferences
      name: 'dsh-skill-preferences'

升级或卸载重装后,已有偏好一般保留,除非单独删除对应 settings。

典型用法

  1. 安装 0.2.2 并重启 Web 后,打开 Settings → Skills。
  2. 若需全站禁用某 Skill,选 Global,搜索名称并关闭开关。
  3. 若仅当前账号不需要某 Skill,选 This user 再关闭。
  4. 若仅当前仓库禁用(例如避免误触 imagegen),选 This workspace,确认工作区根正确后关闭对应 Skill。
  5. 查看列表中的层标签与「Current session」,确认合并结果是否符合预期;若根路径建议未更新,按页面提示刷新浏览器。

脚本或集成可调用 /plugin-skill-preferences/list 拉取合并状态,或用 /plugin-skill-preferences/setEnabled 按层写入;反向代理部署时,需在插件 composition 的 http.trustedHosts 中配置精确的 host[:port]。

适用场景与注意

  • 适用:多 Skill 的 DSH 部署;多用户或多项目共用同一宿主,又需要按人、按仓关闭 Skill 以防误触发;需要与 admin-security 类管理能力对齐的全局策略。
  • 版本:资料明确安装 0.2.2;peer 依赖为安装约束,不保证与任意未来 DSH commit 兼容。发布验证针对未修改的宿主 commit 4d214f38c9fe03aefdfb9d900219f64f4ca85183,详见仓库 0.2.2 verification report(路径以仓库为准)。
  • 安全:插件以当前 DSH 进程权限运行,安装前请阅读 GitHub 源码与 LICENSE,确认符合你的安全与合规要求。

结尾

dsh-skill-preferences 把 Skill 的启停从「改预设或删包」变成可审计的三层偏好,并在 Agent 侧实际抑制调用,适合需要精细控 Skill 暴露面的 DSH 环境。目录页:https://www.skillhub.cn/plugins/zc679087/dsh-skill-preferences;源码与完整说明:https://github.com/zc679087/dsh-skill-preferences。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye