deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
cheshireez/dsh-skill-hub
DeepSeek Harness(dsh)Web GUI 技能中枢:浏览/搜索完整本地技能目录、启用/禁用、查看正文、排查诊断、新建技能,基于官方 ctx.skills 注册表。 In-GUI skill hub for dsh: browse, search, enable/disable, inspect, diagnose and scaffold local skills from the official ctx.skills registry.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:cheshireez/dsh-skill-hub
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
In-GUI skill hub for DeepSeek Harness (dsh).
Browse the full local skill catalog from the official ctx.skills registry, toggle skills on/off, inspect
their bodies, understand why a skill is missing, and scaffold new ones — all from the dsh web GUI.
A skill manager beyond the read-only browser. The host half runs in the dsh process and speaks only official SDKs; the browser half renders inside the GUI through official slots. No dsh source changes.
dsh-skill-manager is a read-only browser, dsh-skill-importer and dsh-find-skill focus on importing and market-style installs. dsh-skill-hub fills the gap between them: a full catalog you can actually manage.
| Capability | dsh-skill-manager (read-only) | dsh-skill-hub (this plugin) |
|---|---|---|
| Catalog source | self-scans disk, user roots only | official ctx.skills registry: project / custom / user / bundled + third-party providers |
| Browse / search | ✅ | ✅ (group by tags or by source repo, search + filter in one row) |
| Enable / disable | ❌ | ✅ (renames SKILL.md; file never deleted, always restorable; per-group tri-state switches) |
| Inspect skill body | ❌ | ✅ |
| Discovery diagnostics | ❌ | ✅ (missing frontmatter / missing name/description / invalid name — each reason listed) |
| New-skill wizard | ❌ | ✅ (writes to ~/.dsh/skills or ~/.agents/skills) |
| Invocation statistics | ❌ | ✅ (per-skill call counts read from session logs; group headers summarize) |
| Upstream source tracking | ❌ | ✅ (repo + commit snapshot; check updates, sync, follow upstream deletion into a restorable trash; delete/restore keeps source + scene membership) |
| Codex-style market | ❌ | ✅ (built-in market catalog + custom repo sources, scan, one-click import, per-source installed/updatable badges, one-click update-all) |
| Live updates | — | filesystem-provider watcher, with a 5s panel poll as fallback |
.dsh/skills & .agents/skills,
custom roots, user ~/.dsh/skills & ~/.agents/skills, bundled, and third-party providers.SKILL.md out of discovery (tracked in a sidecar file), so the
change survives restarts and is trivially reversible. Files are never deleted.skills/ and design-templates/ roots and import with
one click. Each source row aggregates its state — installed / updatable / deleted upstream — and
one "update all" pass syncs every source with pending updates (per-source failures are reported,
never fatal).name/description, illegal name), per skill.~/.dsh/skills or ~/.agents/skills from the GUI.src/
├── index.ts host entry: inject [webServer, skills, systemPrompt]; system-prompt announcement
├── routes.ts /api/skill-hub/{catalog,skill,toggle,toggle-batch,create,stats,config,
│ groups,tag*,market*,repo*,sources*,update} (loopback-only fence)
├── store.ts sidecar state ~/.dsh/dsh-skill-hub.json v3 (disabled, tags, sources, market
│ sources, trash, runtime config; versioned v1→v2→v3 migrations)
├── repo.ts GitHub discovery/import + source tracking (latest commit, tree diff, manifest)
├── skillfs.ts root resolution / toggle rename / trash & restore / scaffold / diagnostics
├── stats.ts invocation stats: session logs → per-skill call counts (optional sessionQuery)
├── protocol.ts host ↔ browser shared API contract (types + endpoint table)
└── client/ browser half: settings card + skill hub panel (React, CSS Modules, Apple-style)
ctx.skills.snapshot()/get(), ctx.webServer.register(),
ctx.systemPrompt.section(). No dsh source is modified./api/skill-hub/config route instead of the settings transport — no namespace mounting required.From the dsh web profile:
dsh plugin --profile web add dsh-skill-hub
Requires Node ^22.19.0 || >=24.0.0 and a dsh web deployment (0.1.0-rc.6 SDK family).
Open Settings → 技能 (Skill Hub) in the dsh web GUI:
The plugin’s own switches live on the Settings → 插件 → Skill Hub card:
| Field | Meaning |
|---|---|
| Enable plugin | Master switch: routes, provider, and announcement all go live with this. |
| Announce to agent | Adds a system-prompt section so agents know how to collaborate when users mention skill management. |
| Model / user dot colors | Override the blue/green invocation dot colors used in the panel. |
| Show invocation count | Show per-skill call-count chips when session stats are available. |
| Show last-used time | Show relative last-used time on each skill row. |
| Show group summaries | Show count/last-used summaries after group titles. |
All endpoints are loopback-only (127.0.0.1/localhost) and JSON.
| Endpoint | Method | Purpose |
|---|---|---|
/api/skill-hub/catalog |
GET | Full catalog: skills, disabled list, discovery diagnostics. |
/api/skill-hub/skill?name= |
GET | One skill’s detail (path, provider, body). |
/api/skill-hub/toggle |
POST | Enable/disable a writable skill ({name, enabled}). |
/api/skill-hub/toggle-batch |
POST | Enable/disable a whole group in one write ({names, enabled}). |
/api/skill-hub/create |
POST | Scaffold a new skill ({name, description?, root?}). |
/api/skill-hub/stats |
GET | Per-skill invocation counts (unavailable when session-query is absent). |
/api/skill-hub/config |
GET/POST | Plugin runtime config ({enabled, announceToAgent}); null clears an override. |
/api/skill-hub/groups |
GET | User tags + source collections + origin map. |
/api/skill-hub/tag |
POST | Create/rename a tag group. |
/api/skill-hub/tag/delete |
POST | Delete a tag group. |
/api/skill-hub/tag/members |
POST | Set a tag’s member list. |
/api/skill-hub/market |
GET | The user’s market source repos. |
/api/skill-hub/market/source |
POST | Add a market source ({repo}). |
/api/skill-hub/market/source/delete |
POST | Remove a market source. |
/api/skill-hub/repo?repo= |
GET | Discover importable skills in a GitHub repo. |
/api/skill-hub/repo/import |
POST | Import selected repo skills (records the source). |
/api/skill-hub/sources |
GET | Source records, derived origins/collections, trash. |
/api/skill-hub/sources/check |
POST | Check upstream updates (throttled, 5 min). |
/api/skill-hub/sources/sync |
POST | Sync selected (or all) skills of a source. |
/api/skill-hub/sources/delete |
POST | Follow upstream deletion (moves to trash). |
/api/skill-hub/sources/restore |
POST | Restore a trashed skill. |
/api/skill-hub/update |
GET | Check the plugin’s own latest release. |
npm install
npm run typecheck # tsc --noEmit
npm test # vitest (151 tests across 9 suites)
npm run build # tsc declarations + tsdown bundles (lib/index.js + lib/client.js)
npm pack # build the installable tarball (dsh-skill-hub-<version>.tgz)
Local testing: do not run two
dsh webinstances against the same$DSH_HOMEand the same project directory at the same time. dsh rc.6 has no cross-process session-log lock, and a second instance resuming the same session can write duplicateseqrows (corrupt session log: seq gap in committed region). Stop the old instance first, or give the preview its ownDSH_HOME.
The test suites cover the route family (including the config route and the disabled gate), the sidecar store, skill filesystem operations, the registry provider, and invocation statistics.
MIT — see LICENSE.
面向 DeepSeek Harness(dsh)的图形化技能中枢。
在 dsh Web GUI 里浏览官方 ctx.skills 注册表提供的完整本地技能目录,启用/禁用技能、查看正文、
排查技能为什么没出现、并新建技能。
一个不止于只读浏览器的技能管理器。宿主半边运行在 dsh 进程内,只使用官方 SDK;浏览器半边通过 官方槽位渲染进 GUI。不改任何 dsh 源码。
dsh-skill-manager 是只读浏览器; dsh-skill-importer 和 dsh-find-skill 专注导入与市场式安装。 dsh-skill-hub 补上两者之间的空白:一份你可以真正管理的完整目录。
| 能力 | dsh-skill-manager(只读版) | dsh-skill-hub(本插件) |
|---|---|---|
| 目录来源 | 自扫盘,仅用户根 | 官方 ctx.skills 注册表:项目 / 自定义 / 用户 / 内置 + 第三方 provider |
| 浏览 / 搜索 | ✅ | ✅(按分组或按来源仓库分组,搜索 + 筛选一行完成) |
| 启用 / 禁用 | ❌ | ✅(重命名 SKILL.md;文件不删除,可随时恢复;分组/来源头部滑动开关一键整组启停) |
| 查看技能正文 | ❌ | ✅ |
| 发现诊断 | ❌ | ✅(缺 frontmatter / 缺 name/description / 非法名称,逐项列明原因) |
| 新建技能向导 | ❌ | ✅(写入 ~/.dsh/skills 或 ~/.agents/skills) |
| 触发统计 | ❌ | ✅(从会话日志读每技能实际调用次数;组头汇总) |
| 来源跟踪 | ❌ | ✅(记录上游 repo + commit 快照;检查更新 / 同步 / 上游删除跟进进回收站;删除→恢复保留来源与场景归属) |
| 市场(codex 式) | ❌ | ✅(内置市场目录 + 自定义仓库源;扫描、一键导入、每源显示已装/可更新数量、一键全部更新) |
| 实时更新 | — | 文件系统 provider 的 watcher 驱动,面板 5s 轮询兜底 |
.dsh/skills 与 .agents/skills、自定义根、
用户 ~/.dsh/skills 与 ~/.agents/skills、内置、以及第三方 provider。SKILL.md 重命名移出发现范围(记录在 sidecar 文件中),重启后仍然
生效且可一键恢复。文件从不删除。skills/ 与 design-templates/ 根目录,一键导入。每个市场源一行聚合显示
「已装 N / 可更新 N / 上游已删 N」,顶部支持「检查全部」与「全部更新」(逐个同步,单个来源
失败不影响其他,汇总报告)。name/description、
非法名称)。~/.dsh/skills 或 ~/.agents/skills。src/
├── index.ts host 入口:inject [webServer, skills, systemPrompt];系统提示公告
├── routes.ts /api/skill-hub/{catalog,skill,toggle,toggle-batch,create,stats,config,
│ groups,tag*,market*,repo*,sources*,update}(仅回环访问)
├── store.ts sidecar 状态 v3 ~/.dsh/dsh-skill-hub.json(禁用、tag、sources、市场源、
│ 回收站、运行时配置;v1→v2→v3 版本化迁移)
├── repo.ts GitHub 发现/导入 + 来源跟踪(最新 commit、tree 差异、manifest)
├── skillfs.ts 根目录解析 / 开关重命名 / 回收站 & 恢复 / 脚手架 / 诊断扫描
├── stats.ts 触发统计:会话日志 → 每技能调用次数(可选 sessionQuery)
├── protocol.ts host ↔ browser 共享 API 契约(类型 + 端点表)
└── client/ browser 半边:设置卡片 + 技能中枢面板(React,CSS Modules,苹果风)
ctx.skills.snapshot()/get()、ctx.webServer.register()、
ctx.systemPrompt.section()。不修改 dsh 源码。/api/skill-hub/config 路由,而不走 settings 传输——无需挂载命名空间。在 dsh web profile 中:
dsh plugin --profile web add dsh-skill-hub
要求 Node ^22.19.0 || >=24.0.0 与 dsh web 部署(0.1.0-rc.6 SDK 家族)。
在 dsh Web GUI 打开 设置 → 技能(Skill Hub):
插件自身的开关在 设置 → 插件 → Skill Hub 卡片上:
| 字段 | 含义 |
|---|---|
| Enable plugin | 总开关:路由、provider 与公告随之启用。 |
| Announce to agent | 在系统提示中加入本插件说明,用户提到技能管理时 Agent 知道如何协作。 |
| 模型/用户圆点颜色 | 覆盖面板中蓝色/绿色调用圆点的颜色。 |
| 显示调用次数 | 有会话统计时显示每个技能的调用次数角标。 |
| 显示最近调用时间 | 在技能行显示相对最近调用时间。 |
| 显示分组汇总 | 在分组标题后汇总调用次数与最近调用时间。 |
所有端点仅限回环(127.0.0.1/localhost),返回 JSON。
| 端点 | 方法 | 用途 |
|---|---|---|
/api/skill-hub/catalog |
GET | 完整目录:技能、禁用列表、发现诊断。 |
/api/skill-hub/skill?name= |
GET | 单个技能详情(路径、provider、正文)。 |
/api/skill-hub/toggle |
POST | 启用/禁用可写技能({name, enabled})。 |
/api/skill-hub/toggle-batch |
POST | 一次写入整组启停({names, enabled})。 |
/api/skill-hub/create |
POST | 脚手架新技能({name, description?, root?})。 |
/api/skill-hub/stats |
GET | 每技能调用次数(无 session-query 时不可用)。 |
/api/skill-hub/config |
GET/POST | 插件运行时配置({enabled, announceToAgent} 等);null 清除覆盖。 |
/api/skill-hub/groups |
GET | 用户标签 + 来源组 + origin 映射。 |
/api/skill-hub/tag |
POST | 新建/重命名标签分组。 |
/api/skill-hub/tag/delete |
POST | 删除标签分组。 |
/api/skill-hub/tag/members |
POST | 设置某标签的成员列表。 |
/api/skill-hub/market |
GET | 用户的市场源仓库列表。 |
/api/skill-hub/market/source |
POST | 添加市场源({repo})。 |
/api/skill-hub/market/source/delete |
POST | 移除市场源。 |
/api/skill-hub/repo?repo= |
GET | 发现 GitHub 仓库中可导入的技能。 |
/api/skill-hub/repo/import |
POST | 导入所选仓库技能(记录来源)。 |
/api/skill-hub/sources |
GET | 来源记录、派生 origin/集合、回收站。 |
/api/skill-hub/sources/check |
POST | 检查上游更新(5 分钟节流)。 |
/api/skill-hub/sources/sync |
POST | 同步某来源所选(或全部)技能。 |
/api/skill-hub/sources/delete |
POST | 跟进上游删除(移入回收站)。 |
/api/skill-hub/sources/restore |
POST | 从回收站恢复技能。 |
/api/skill-hub/sources/trash/clear |
POST | 永久清空回收站。 |
/api/skill-hub/update |
GET | 检查插件自身最新发布。 |
npm install
npm run typecheck # tsc --noEmit
npm test # vitest(9 个套件,151 个用例)
npm run build # tsc 声明 + tsdown 双半边产物(lib/index.js + lib/client.js)
npm pack # 生成可安装的 tgz(dsh-skill-hub-<version>.tgz)
本地联调注意: 不要在同一
$DSH_HOME和同一项目目录下同时运行两个dsh web实例。dsh rc.6 没有跨进程会话日志锁,第二个实例恢复同一会话时会 写入重复seq,导致corrupt session log: seq gap in committed region。 需要预览实例时先停旧实例,或使用独立的DSH_HOME。
测试套件覆盖路由家族(含 config 路由与禁用闸门)、sidecar 存储、技能文件系统操作、注册表 provider 与触发统计。
MIT —— 见 LICENSE。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: agent-skills、skill、skill-hub、skills。