DeepSeek Harness Hub
← 返回列表

nianchen8/dsh-skill-panel

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

一个用于 DeepSeek Harness Web…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/20 · 已提供中文文档

DeepSeek Harness Web 应用的技能管理面板

综合分
28.6
GitHub 分
28.6
用户评分
★ Stars
2
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add nianchen8/dsh-skill-panel
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-storage-domain
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-skill-panel

一个用于 DeepSeek Harness Web 应用的技能管理面板:在设置页面或侧边栏中浏览、搜索、筛选、启用/禁用以及卸载你的智能体技能。

完全基于 harness 的公开插件接口构建——宿主端是一个 Typert Remote 服务,浏览器端是槽位注册的 React UI。无需 fork,不使用内部 API,无需构建步骤(纯 JS);运行时导入仅限于 harness 提供的 @deepseek-ai/dsh-storage-domain 和 zod(声明为依赖项)。

功能

- 技能列表,包含名称、描述、来源标签以及各来源的数量统计
- 搜索和来源筛选(用户 .agents、用户 .dsh、项目根目录、自定义、内置)
- Model / User 调用开关(重写 SKILL.md frontmatter;未指定的开关会被保留)
- 禁用 / 启用按钮——完全禁用一个技能,同时记住其先前的状态,并在启用时精确恢复该状态
- 卸载,带两步确认(删除技能目录,内置技能受保护)
- 详情视图,包含 whenToUse、磁盘路径以及 SKILL.md 正文
- 技能分组——创建 / 重命名 / 删除分组,按分组管理成员(添加 / 移除技能),按分组浏览技能;通过官方 ctx.storageDomain 持久化(不使用自制的存储文件)
- 所有读取均以会话为作用域——面板精确显示当前会话所提供的内容目录
- 写入会同步使发现缓存失效,斜杠菜单缓存通过官方转发事件刷新

要求

- DeepSeek Harness 0.1.0-rc.6+(Web 配置)
- 可用 pnpm(corepack enable 即可提供)

安装

corepack enable                                   # 每台机器执行一次
dsh plugin --profile web add dsh-skill-panel     # 从 npm 安装
或:dsh plugin --profile web add github:nianchen8/dsh-skill-panel
dsh web                                           # 重启以加载该包

随后面板会出现在设置 → 技能下以及侧边栏的技能按钮中。

工作原理

SKILL.md 文件(项目 / 用户 / 内置根目录)
│  发现(skill-filesystem 提供程序,按作用域分层)
▼
宿主技能注册表  ── snapshot({cwd, scope: agent}) ──► SkillPanelService (Typert Remote)
▲                                                       │  /api/skillPanel/*
│  fs/observed 失效                                     ▼
└── frontmatter 写入 / 删除                      浏览器客户端(fetch RPC)
│  slots.register
▼
设置页面 · 侧边栏按钮 · 覆盖层
- 宿主端(index.js):一个 TypertRemoteService,带有十二个 Remote 端点——getConfig、listDetailed、getDetail、setInvocation、setDisabled、uninstall,以及分组 CRUD groupList、groupCreate、groupUpdate、groupDelete、groupAddSkill、groupRemoveSkill。读取操作解析会话作用域的 skill 视图(与模型所见相同的目录);写入操作重写 SKILL.md frontmatter 或删除 skill 目录,然后发出 fs/observed 以同步失效发现结果,并重放 agent-preset/selected,使官方斜杠菜单丢弃其缓存的目录。分组存放在 ctx.storageDomain 域(skill_groups)中,惰性打开并在卸载时关闭;当存储不可用时,面板降级为只读分组视图。
- 浏览器端(client.js):通过平台模块表使用纯 React,注册到 sidebar.footer.action、shell.overlay 和 settings.section。所有数据都通过标准 API 网关经由 /api/skillPanel/ 传输。

放置配置

三个 UI 入口(侧边栏按钮、覆盖层、设置页)默认位于其槽位的末尾:注册时,浏览器端读取槽位的实时条目,并将自身放置在现有最大 order 之后,因此无论槽位中已有多少条目,全新部署总是落在列表底部。

到达语义(为什么采用相同策略的插件不会互相争抢): 末尾顺序在注册时计算一次——浏览器端到达后不会重新注册。每次注册都是一次原子的读取→计算→注册,因此下一个到达者总是能看到前一个,并严格追加在其后(max + 1,无并列)。一旦某个条目落位,其位置就固定了;如果它之后卸载又重新加载(fiber 重启),它会再次追加到末尾。因此,两个使用这一相同策略的插件可以共存为 A(0)、B(1)、C(2)、……,最新到达者始终在最后——无需追逐,也不会活锁。

每个条目都可以通过 profile 组合(profiles//cordis.patch.yml)中 loader 条目的 config 单独覆盖:

- id: skill-panel
config:
entries:
sidebar:
enabled: true        # show the sidebar button (default true)
order: 5             # explicit position; omit = dynamic tail
slot: conversation.session.header.actions   # optional relocation
overlay:
enabled: true
order: 10
settings:
enabled: false       # hide the settings page

- enabled — 该条目是否注册。
- order — 槽位中的精确升序位置;缺省表示动态末尾(注册时的 max existing order + 1)。
- slot — 目标槽位键;对于上述内置席位可省略。重新定位时,组件会优雅降级以适应新槽位提供的 props(useSessions/wide 在面板代码中是可选的)。
解析后的放置配置通过 skillPanel/getConfig 暴露给浏览器;如果该端点不可用(例如在重启之前),浏览器端会回退到上述默认值。

开发

该包是纯 JavaScript;编辑 index.js / client.js,然后重启 dsh web(客户端 bundle 会在启动时重新扫描)。

node --check index.js client.js
npx oxlint --deny-warnings index.js client.js

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群