dsh-skill-hub 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +1 -1
- package/README.md +181 -249
- package/README.zh.md +275 -0
- package/lib/client.js +395 -257
- package/lib/client.js.map +1 -1
- package/lib/index.js +126 -26
- package/lib/types/client/SkillHubSettingsCard.d.ts +23 -17
- package/lib/types/client/api.d.ts +9 -3
- package/lib/types/client/grouping.d.ts +3 -0
- package/lib/types/client/index.d.ts +12 -6
- package/lib/types/client/locales.d.ts +8 -4
- package/lib/types/client/market-catalog.d.ts +1 -1
- package/lib/types/client/panel/MarketView.d.ts +5 -5
- package/lib/types/client/panel/SkillHubPanel.d.ts +1 -1
- package/lib/types/client/panel/SourcesView.d.ts +5 -3
- package/lib/types/client/panel/useSkillHub.d.ts +4 -0
- package/lib/types/client/settings-card.d.ts +5 -4
- package/lib/types/index.d.ts +12 -1
- package/lib/types/protocol.d.ts +23 -0
- package/lib/types/skillfs.d.ts +1 -1
- package/lib/types/update.d.ts +1 -1
- package/package.json +28 -27
- package/src/client/SkillHubSettingsCard.tsx +25 -14
- package/src/client/api.ts +9 -6
- package/src/client/grouping.test.ts +12 -0
- package/src/client/grouping.ts +10 -1
- package/src/client/index.tsx +25 -19
- package/src/client/locales.ts +16 -8
- package/src/client/market-catalog.ts +1 -1
- package/src/client/panel/MarketView.tsx +77 -64
- package/src/client/panel/SkillHubPanel.tsx +18 -1
- package/src/client/panel/SkillRow.tsx +17 -2
- package/src/client/panel/SourcesView.tsx +92 -5
- package/src/client/panel/panel.module.css +9 -1
- package/src/client/panel/useSkillHub.ts +25 -11
- package/src/client/settings-card.tsx +5 -4
- package/src/index.ts +78 -31
- package/src/protocol.ts +24 -0
- package/src/routes.test.ts +55 -0
- package/src/routes.ts +90 -10
- package/src/skillfs.ts +1 -1
- package/src/update.ts +1 -1
- package/lib/types/client/api-config-scope.d.ts +0 -48
- package/src/client/api-config-scope.test.ts +0 -79
- package/src/client/api-config-scope.ts +0 -119
package/CONTRIBUTING.md
CHANGED
|
@@ -14,7 +14,7 @@ Please keep both halves on official APIs — no dsh source patches.
|
|
|
14
14
|
```bash
|
|
15
15
|
npm install
|
|
16
16
|
npm run typecheck # tsc --noEmit
|
|
17
|
-
npm test # vitest (
|
|
17
|
+
npm test # vitest (152 tests across 8 suites)
|
|
18
18
|
npm run build # tsc declarations + tsdown bundles (lib/index.js + lib/client.js)
|
|
19
19
|
```
|
|
20
20
|
|
package/README.md
CHANGED
|
@@ -1,22 +1,44 @@
|
|
|
1
1
|
# dsh-skill-hub
|
|
2
2
|
|
|
3
|
+
[中文版](README.zh.md) | [English](README.md)
|
|
4
|
+
|
|
3
5
|
<p align="center">
|
|
4
6
|
<a href="https://www.npmjs.com/package/dsh-skill-hub"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-skill-hub?color=2f81f7&label=npm"></a>
|
|
7
|
+
<img alt="downloads" src="https://img.shields.io/npm/dm/dsh-skill-hub">
|
|
5
8
|
<img alt="license" src="https://img.shields.io/npm/l/dsh-skill-hub">
|
|
6
9
|
<img alt="node" src="https://img.shields.io/badge/node-%3E%3D22.19-339933">
|
|
7
10
|
<a href="https://github.com/cheshireez/dsh-skill-hub/actions"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/cheshireez/dsh-skill-hub/ci.yml?branch=main"></a>
|
|
8
11
|
</p>
|
|
9
12
|
|
|
10
|
-
<
|
|
11
|
-
<
|
|
13
|
+
<p align="center">
|
|
14
|
+
<img src="https://raw.githubusercontent.com/cheshireez/dsh-skill-hub/main/promo/real-skill-hub.png" alt="dsh-skill-hub panel" width="640">
|
|
15
|
+
</p>
|
|
12
16
|
|
|
13
17
|
**In-GUI skill hub for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh).**
|
|
14
18
|
Browse the full local skill catalog from the official `ctx.skills` registry, toggle skills on/off, inspect
|
|
15
|
-
their bodies, understand why a skill is missing,
|
|
19
|
+
their bodies, understand why a skill is missing, install from the built-in market, and scaffold new
|
|
20
|
+
ones — all from the dsh web GUI.
|
|
16
21
|
|
|
17
22
|
> A skill manager beyond the read-only browser. The host half runs in the dsh process and speaks only
|
|
18
23
|
> official SDKs; the browser half renders inside the GUI through official slots. No dsh source changes.
|
|
19
24
|
|
|
25
|
+
> **Disclaimer** — source tracking, market sync, and the restorable trash are implemented by this
|
|
26
|
+
> plugin; they are not guarantees of the dsh runtime itself. Screenshots may lag the latest UI.
|
|
27
|
+
|
|
28
|
+
## Table of Contents
|
|
29
|
+
|
|
30
|
+
- [Why another skill manager?](#why-another-skill-manager)
|
|
31
|
+
- [Features](#features)
|
|
32
|
+
- [Quick start](#quick-start)
|
|
33
|
+
- [How it works](#how-it-works)
|
|
34
|
+
- [Usage](#usage)
|
|
35
|
+
- [Troubleshooting](#troubleshooting)
|
|
36
|
+
- [HTTP API](#http-api)
|
|
37
|
+
- [Development](#development)
|
|
38
|
+
- [Roadmap](#roadmap)
|
|
39
|
+
- [Community](#community)
|
|
40
|
+
- [License](#license)
|
|
41
|
+
|
|
20
42
|
## Why another skill manager?
|
|
21
43
|
|
|
22
44
|
[dsh-skill-manager](https://www.npmjs.com/package/dsh-skill-manager) is a read-only browser,
|
|
@@ -28,96 +50,157 @@ their bodies, understand why a skill is missing, and scaffold new ones — all f
|
|
|
28
50
|
| --- | --- | --- |
|
|
29
51
|
| Catalog source | self-scans disk, user roots only | official `ctx.skills` registry: project / custom / user / bundled + third-party providers |
|
|
30
52
|
| Browse / search | ✅ | ✅ (group by **tags** or by **source repo**, search + filter in one row) |
|
|
53
|
+
| Workspace skills | ❌ | ✅ (enter a project path → its `.dsh/skills` & `.agents/skills` appear, read-only) |
|
|
31
54
|
| Enable / disable | ❌ | ✅ (renames `SKILL.md`; file never deleted, always restorable; per-group tri-state switches) |
|
|
32
55
|
| Inspect skill body | ❌ | ✅ |
|
|
33
56
|
| Discovery diagnostics | ❌ | ✅ (missing frontmatter / missing `name`/`description` / invalid name — each reason listed) |
|
|
34
57
|
| New-skill wizard | ❌ | ✅ (writes to `~/.dsh/skills` or `~/.agents/skills`) |
|
|
35
58
|
| Invocation statistics | ❌ | ✅ (per-skill call counts read from session logs; group headers summarize) |
|
|
36
59
|
| Upstream source tracking | ❌ | ✅ (repo + commit snapshot; check updates, sync, follow upstream deletion into a restorable trash; delete/restore keeps source + scene membership) |
|
|
37
|
-
|
|
|
60
|
+
| Market | ❌ | ✅ (unified market list: built-in curated catalog + custom repos; scan, one-click import, per-source installed/updatable badges, one-click update-all) |
|
|
38
61
|
| Live updates | — | filesystem-provider watcher, with a 5s panel poll as fallback |
|
|
39
62
|
|
|
40
63
|
## Features
|
|
41
64
|
|
|
65
|
+
### Catalog & switches — manage local skills
|
|
66
|
+
|
|
67
|
+
> **Browse everything, change anything you own.** The full registry is visible and searchable;
|
|
68
|
+
> writes are confined to your user-level roots and never delete files.
|
|
69
|
+
|
|
42
70
|
- **Full catalog** — every skill the official registry knows: project `.dsh/skills` & `.agents/skills`,
|
|
43
71
|
custom roots, user `~/.dsh/skills` & `~/.agents/skills`, bundled, and third-party providers.
|
|
44
72
|
- **Search & grouping** — one row combines search, source filter, and flat/grouped view; groups are
|
|
45
|
-
user **tags** plus **source collections** (auto-aggregated by upstream repo); uncategorized
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
73
|
+
user **tags (scenes)** plus **source collections** (auto-aggregated by upstream repo); uncategorized
|
|
74
|
+
stays visible.
|
|
75
|
+
- **Workspace discovery** — known workspaces (from dsh’s workspace registry) are merged into the
|
|
76
|
+
default view and grouped in a project-level tree (per project, optionally split into
|
|
77
|
+
`.dsh`/`.agents`); the header path field pins the view to one workspace.
|
|
78
|
+
- **Group switches** — every group header carries a sliding switch: enable/disable the whole group in
|
|
79
|
+
one click. Closing a group whose member is also enabled elsewhere opens a conflict dialog (close all /
|
|
80
|
+
keep on → the group falls into a half-filled mixed state). Read-only skills are skipped with
|
|
81
|
+
per-name reports.
|
|
82
|
+
- **Enable / disable** — disable renames `SKILL.md` out of discovery (tracked in a sidecar file), so
|
|
83
|
+
the change survives restarts and is trivially reversible. Files are never deleted.
|
|
84
|
+
- **Skill detail** — read a skill’s body straight from disk, with its source card (repo, commit,
|
|
85
|
+
check/sync/follow-delete actions).
|
|
86
|
+
- **New-skill wizard** — scaffold a valid skill into `~/.dsh/skills` or `~/.agents/skills` from the GUI.
|
|
87
|
+
|
|
88
|
+
### Market & updates
|
|
89
|
+
|
|
90
|
+
> **Add a repo, install in one click, stay updated forever.** Imports are tracked upstream
|
|
91
|
+
> automatically; updates surface per source and can be applied all at once.
|
|
92
|
+
|
|
93
|
+
- **Unified market list** — one list on the Market tab: built-in catalog entries show a description
|
|
94
|
+
and an **Add** button until added; once added (or custom sources entered by hand) the same row
|
|
95
|
+
becomes a full source row. No duplicate entries.
|
|
96
|
+
- **Scan → install** — scan any repo’s `skills/` and `design-templates/` roots, tick the skills you
|
|
97
|
+
want, import with one click. Imports record the upstream repo/commit automatically.
|
|
98
|
+
- **State badges** — every source row aggregates its state: installed count, updatable count, and
|
|
99
|
+
deleted-upstream count.
|
|
100
|
+
- **Check all / update all** — “Check all” refreshes every source (release + skill diffs); “Update
|
|
101
|
+
all” syncs every source with pending updates in one pass (per-source failures are reported, never
|
|
102
|
+
fatal). A daily auto-check (24h, timestamped in localStorage) covers the “forgot to click” case;
|
|
103
|
+
manual buttons are never throttled.
|
|
104
|
+
- **Source tracking** — per-source check (1–2 GitHub API requests, 5-minute server throttle), sync
|
|
105
|
+
selected skills (overwrite confirm), and follow upstream deletion into a restorable trash.
|
|
54
106
|
Deleting and restoring a tracked skill keeps its source and scene membership (snapshotted in the
|
|
55
107
|
trash entry). Personal skills (no source) are never tracked.
|
|
56
|
-
- **
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- **
|
|
66
|
-
|
|
67
|
-
- **Settings card** — enable the plugin, toggle the agent announcement, and adjust panel display
|
|
108
|
+
- **Self-update check** — the panel header checks the plugin’s own latest GitHub release.
|
|
109
|
+
|
|
110
|
+
### Stats & diagnostics
|
|
111
|
+
|
|
112
|
+
> **Know what your agents actually use.** Invocation counts come from your own session logs —
|
|
113
|
+
> no telemetry leaves the machine.
|
|
114
|
+
|
|
115
|
+
- **Invocation statistics** — per-skill call counts and last-used times read from session logs
|
|
116
|
+
(optional; absent session-query deployments simply omit the data); group headers summarize.
|
|
117
|
+
- **Discovery diagnostics** — the catalog reports *why* a skill was ignored (missing YAML
|
|
118
|
+
frontmatter, missing `name`/`description`, illegal name), per skill.
|
|
119
|
+
- **Settings card** — enable the plugin, toggle the agent announcement, and adjust panel display
|
|
120
|
+
preferences from **Settings → 插件 → Skill Hub**.
|
|
121
|
+
|
|
122
|
+
## Quick start
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
dsh plugin --profile web add dsh-skill-hub
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Restart `dsh web`, open **Settings → 技能**, and on the **Market** tab pick a repo from the
|
|
129
|
+
built-in catalog (or paste an `owner/repo`), scan it, tick the skills you want, and import. They are
|
|
130
|
+
tracked upstream from then on: check for updates and sync with one click.
|
|
131
|
+
|
|
132
|
+
A skill is just a directory with a `SKILL.md` — the panel can also scaffold one for you:
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
---
|
|
136
|
+
name: my-skill
|
|
137
|
+
description: One line describing when the agent should use this skill.
|
|
138
|
+
---
|
|
139
|
+
# my-skill
|
|
140
|
+
|
|
141
|
+
What the skill does, when to use it, and what output is expected.
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Requires Node `^22.19.0 || >=24.0.0` and a dsh web deployment (`0.1.0-rc.7` SDK family).
|
|
68
145
|
|
|
69
146
|
## How it works
|
|
70
147
|
|
|
71
148
|
```text
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
│
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
├── skillfs.ts root resolution / toggle rename / trash & restore / scaffold / diagnostics
|
|
80
|
-
├── stats.ts invocation stats: session logs → per-skill call counts (optional sessionQuery)
|
|
81
|
-
├── protocol.ts host ↔ browser shared API contract (types + endpoint table)
|
|
82
|
-
└── client/ browser half: settings card + skill hub panel (React, CSS Modules, Apple-style)
|
|
149
|
+
GitHub repo ──scan / import──▶ ~/.dsh/skills (user level)
|
|
150
|
+
▲ │
|
|
151
|
+
│ check / sync / delete ▼
|
|
152
|
+
│ ctx.skills registry ◀── skill-hub provider (registers user + project roots)
|
|
153
|
+
│ │ snapshot / get
|
|
154
|
+
└────── daily auto-check ▼
|
|
155
|
+
/api/skill-hub/* routes ──▶ Browser panel (Settings → 技能)
|
|
83
156
|
```
|
|
84
157
|
|
|
158
|
+
| File | Responsibility |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| `src/index.ts` | host entry: inject `[webServer, skills, systemPrompt, settings]`; registers the `dsh-skill-hub` settings namespace; system-prompt announcement |
|
|
161
|
+
| `src/routes.ts` | declarative route wrapper: `/api/skill-hub/*` (loopback / method / master-switch / JSON-body fences handled once; handlers stay business-only) |
|
|
162
|
+
| `src/store.ts` | sidecar state `~/.dsh/dsh-skill-hub.json` v3 (disabled, tags, sources, market sources, trash; versioned v1→v2→v3 migrations) |
|
|
163
|
+
| `src/repo.ts` | GitHub discovery/import + source tracking (latest commit, tree diff, manifest) |
|
|
164
|
+
| `src/skillfs.ts` | root resolution / toggle rename / trash & restore / scaffold / diagnostics |
|
|
165
|
+
| `src/stats.ts` | invocation stats: session logs → per-skill call counts (optional sessionQuery) |
|
|
166
|
+
| `src/protocol.ts` | host ↔ browser shared API contract (types + endpoint table) |
|
|
167
|
+
| `src/client/` | browser half: settings card + skill hub panel. State and flows live in `useSkillHub.ts`; views are thin components (`SourcesView` / `ScenesView` / `MarketView` / `SkillRow` / dialogs / …). CSS Modules, Apple-style |
|
|
168
|
+
|
|
85
169
|
- **Host half** uses only official SDKs: `ctx.skills.snapshot()/get()`, `ctx.webServer.register()`,
|
|
86
170
|
`ctx.systemPrompt.section()`. No dsh source is modified.
|
|
87
171
|
- **Browser half** mounts through official slots: a **Settings → 技能** section and a
|
|
88
172
|
**Settings → 插件 → Skill Hub** configuration card.
|
|
89
|
-
- **Configuration** is
|
|
90
|
-
|
|
91
|
-
|
|
173
|
+
- **Configuration** is dsh-native. Since rc.7 the host serves every registered settings namespace to
|
|
174
|
+
the web client (the old namespace allowlist is gone), so the plugin registers a `dsh-skill-hub`
|
|
175
|
+
settings namespace and the card reads/writes it through the official settings transport — the
|
|
176
|
+
configurable-plugins tab dispatches the card by that namespace, and the host consumes the same
|
|
177
|
+
resolved value (single source of truth). Installations upgraded from the older sidecar-configured
|
|
178
|
+
build migrate their saved config into the namespace once.
|
|
92
179
|
|
|
93
|
-
##
|
|
180
|
+
## Usage
|
|
94
181
|
|
|
95
|
-
|
|
182
|
+
Open **Settings → 技能** (Skill Hub) in the dsh web GUI. Three tabs:
|
|
96
183
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
184
|
+
- **来源 (Sources)** — the skill list, flat or grouped: a project-level tree (workspaces merged by
|
|
185
|
+
default, per project optionally split into `.dsh`/`.agents`) plus source collections and
|
|
186
|
+
uncategorized. Search, source filter and sort share one row; group headers carry tri-state
|
|
187
|
+
switches; the source-group badge doubles as the re-check entry. *(see the screenshot at the top)*
|
|
188
|
+
- **场景 (Scenes)** — your own enable/disable units (e.g. a “Godot” scene vs a “Java” scene): create
|
|
189
|
+
tags, assign members, and flip a whole scene on/off with one switch.
|
|
100
190
|
|
|
101
|
-
|
|
191
|
+
<p align="center">
|
|
192
|
+
<img src="https://raw.githubusercontent.com/cheshireez/dsh-skill-hub/main/promo/real-skill-hub-scenes.png" alt="场景 tab" width="560">
|
|
193
|
+
</p>
|
|
194
|
+
- **市场 (Market)** — one unified list: built-in curated repos (Add button until added) and your
|
|
195
|
+
custom sources; scan to install, check for updates, update all in one pass.
|
|
102
196
|
|
|
103
|
-
|
|
197
|
+
<p align="center">
|
|
198
|
+
<img src="https://raw.githubusercontent.com/cheshireez/dsh-skill-hub/main/promo/real-skill-hub-catalog.png" alt="市场 tab" width="560">
|
|
199
|
+
</p>
|
|
104
200
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
- **Groups** — user tags and source collections (upstream repos). Group headers carry tri-state sliding
|
|
109
|
-
switches (on / off / mixed) with a conflict dialog when closing affects skills enabled elsewhere.
|
|
110
|
-
- **Market** — a built-in catalog of curated repos (one-click add), plus custom sources (add a repo
|
|
111
|
-
source, scan, one-click install) or direct URLs; every import records the upstream repo/commit.
|
|
112
|
-
Each source row shows installed / updatable / deleted-upstream counts; "check all" refreshes every
|
|
113
|
-
source, and "update all" syncs every pending source in one pass.
|
|
114
|
-
- **Trash** — skills removed after upstream deletion (or deleted manually) land in a restorable trash;
|
|
115
|
-
restoring brings back the skill's source and scene membership.
|
|
116
|
-
- **Toggle** — enable/disable any skill from a user-writable root; disabled skills list separately and
|
|
117
|
-
can be re-enabled any time.
|
|
118
|
-
- **Diagnose** — the discovery diagnostics explain why a skill is not showing up.
|
|
119
|
-
- **New skill** — scaffold a new skill from the form and start writing.
|
|
120
|
-
- **Statistics** — per-skill invocation counts when session-query data is available; group headers summarize.
|
|
201
|
+
Everywhere: **work space field** in the header (enter a project path to see its read-only project
|
|
202
|
+
skills), **trash** section (restorable, restores source + scene membership), **diagnostics** section
|
|
203
|
+
(why a skill is missing), and the **new-skill** form.
|
|
121
204
|
|
|
122
205
|
The plugin’s own switches live on the **Settings → 插件 → Skill Hub** card:
|
|
123
206
|
|
|
@@ -130,14 +213,28 @@ The plugin’s own switches live on the **Settings → 插件 → Skill Hub** ca
|
|
|
130
213
|
| Show last-used time | Show relative last-used time on each skill row. |
|
|
131
214
|
| Show group summaries | Show count/last-used summaries after group titles. |
|
|
132
215
|
|
|
216
|
+
## Troubleshooting
|
|
217
|
+
|
|
218
|
+
- **⚠️ `duplicate loader entry id: skill-hub`** — the plugin was mounted twice (for example both
|
|
219
|
+
through `dsh plugin add` and a local `file:` install). Keep exactly one installation method; on
|
|
220
|
+
upgrade, replace rather than add.
|
|
221
|
+
- **A skill is not in the catalog** — open the **发现诊断** (diagnostics) section: missing
|
|
222
|
+
frontmatter, a name mismatch with the directory, or an over-short description are each listed with
|
|
223
|
+
their reason.
|
|
224
|
+
- **Update check shows nothing** — the server throttles checks (5 min per source) and the panel
|
|
225
|
+
auto-checks once per day; manual buttons are never throttled.
|
|
226
|
+
- **Read-only boundary** — only user-level skills (`~/.dsh/skills`, `~/.agents/skills`) are writable;
|
|
227
|
+
project, bundled, and runtime skills are displayed read-only.
|
|
228
|
+
|
|
133
229
|
## HTTP API
|
|
134
230
|
|
|
135
231
|
All endpoints are **loopback-only** (`127.0.0.1`/`localhost`) and JSON.
|
|
136
232
|
|
|
137
233
|
| Endpoint | Method | Purpose |
|
|
138
234
|
| --- | --- | --- |
|
|
139
|
-
| `/api/skill-hub/catalog
|
|
140
|
-
| `/api/skill-hub/skill?name=` | GET | One skill’s detail (path, provider, body). |
|
|
235
|
+
| `/api/skill-hub/catalog?cwd=` | GET | Full catalog: skills, disabled list, discovery diagnostics (`cwd` adds project skills). |
|
|
236
|
+
| `/api/skill-hub/skill?name=&cwd=` | GET | One skill’s detail (path, provider, body). |
|
|
237
|
+
| `/api/skill-hub/skill/delete` | POST | Move a skill into the restorable trash (snapshots source + scenes). |
|
|
141
238
|
| `/api/skill-hub/toggle` | POST | Enable/disable a writable skill (`{name, enabled}`). |
|
|
142
239
|
| `/api/skill-hub/toggle-batch` | POST | Enable/disable a whole group in one write (`{names, enabled}`). |
|
|
143
240
|
| `/api/skill-hub/create` | POST | Scaffold a new skill (`{name, description?, root?}`). |
|
|
@@ -150,13 +247,17 @@ All endpoints are **loopback-only** (`127.0.0.1`/`localhost`) and JSON.
|
|
|
150
247
|
| `/api/skill-hub/market` | GET | The user’s market source repos. |
|
|
151
248
|
| `/api/skill-hub/market/source` | POST | Add a market source (`{repo}`). |
|
|
152
249
|
| `/api/skill-hub/market/source/delete` | POST | Remove a market source. |
|
|
250
|
+
| `/api/skill-hub/market/source/ref` | POST | Pin a market source to a release/branch ref. |
|
|
251
|
+
| `/api/skill-hub/market/check` | GET | Check market sources for newer releases (throttled). |
|
|
252
|
+
| `/api/skill-hub/market/source/sync` | POST | Align a market source to its pinned ref; returns tracked skills. |
|
|
153
253
|
| `/api/skill-hub/repo?repo=` | GET | Discover importable skills in a GitHub repo. |
|
|
154
|
-
| `/api/skill-hub/repo/import` | POST | Import selected repo skills (records the source). |
|
|
254
|
+
| `/api/skill-hub/repo/import` | POST | Import selected repo skills (records the source + default scene). |
|
|
155
255
|
| `/api/skill-hub/sources` | GET | Source records, derived origins/collections, trash. |
|
|
156
256
|
| `/api/skill-hub/sources/check` | POST | Check upstream updates (throttled, 5 min). |
|
|
157
257
|
| `/api/skill-hub/sources/sync` | POST | Sync selected (or all) skills of a source. |
|
|
158
258
|
| `/api/skill-hub/sources/delete` | POST | Follow upstream deletion (moves to trash). |
|
|
159
|
-
| `/api/skill-hub/sources/restore` | POST | Restore a trashed skill. |
|
|
259
|
+
| `/api/skill-hub/sources/restore` | POST | Restore a trashed skill (re-attaches source + scenes). |
|
|
260
|
+
| `/api/skill-hub/sources/trash/clear` | POST | Permanently clear the trash. |
|
|
160
261
|
| `/api/skill-hub/update` | GET | Check the plugin’s own latest release. |
|
|
161
262
|
|
|
162
263
|
## Development
|
|
@@ -164,13 +265,13 @@ All endpoints are **loopback-only** (`127.0.0.1`/`localhost`) and JSON.
|
|
|
164
265
|
```bash
|
|
165
266
|
npm install
|
|
166
267
|
npm run typecheck # tsc --noEmit
|
|
167
|
-
npm test # vitest (
|
|
268
|
+
npm test # vitest (152 tests across 8 suites)
|
|
168
269
|
npm run build # tsc declarations + tsdown bundles (lib/index.js + lib/client.js)
|
|
169
270
|
npm pack # build the installable tarball (dsh-skill-hub-<version>.tgz)
|
|
170
271
|
```
|
|
171
272
|
|
|
172
273
|
> **Local testing:** do not run two `dsh web` instances against the same
|
|
173
|
-
> `$DSH_HOME` and the same project directory at the same time. dsh rc
|
|
274
|
+
> `$DSH_HOME` and the same project directory at the same time. dsh rc releases have no
|
|
174
275
|
> cross-process session-log lock, and a second instance resuming the same
|
|
175
276
|
> session can write duplicate `seq` rows (`corrupt session log: seq gap in
|
|
176
277
|
> committed region`). Stop the old instance first, or give the preview its own
|
|
@@ -181,189 +282,20 @@ store, skill filesystem operations, the registry provider, and invocation statis
|
|
|
181
282
|
|
|
182
283
|
## Roadmap
|
|
183
284
|
|
|
184
|
-
- **v0.1.0** — full catalog, enable/disable, diagnostics, new-skill wizard, settings card.
|
|
185
|
-
- **v0.2.0** — invocation statistics · tags/scenes + source-collection grouping with
|
|
186
|
-
switches · upstream source tracking (check / sync / follow-delete into a restorable
|
|
187
|
-
|
|
188
|
-
delete/restore keeps source + scene membership.
|
|
189
|
-
- **
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
MIT — see [LICENSE](LICENSE).
|
|
285
|
+
- **v0.1.0** *(released)* — full catalog, enable/disable, diagnostics, new-skill wizard, settings card.
|
|
286
|
+
- **v0.2.0** *(released)* — invocation statistics · tags/scenes + source-collection grouping with
|
|
287
|
+
tri-state switches · upstream source tracking (check / sync / follow-delete into a restorable
|
|
288
|
+
trash) · unified market with built-in catalog, per-source state badges, and one-click
|
|
289
|
+
update-all · delete/restore keeps source + scene membership.
|
|
290
|
+
- **Built, pending release** — workspace discovery (project-path field → read-only project skills).
|
|
291
|
+
- **Planned** — SSE realtime push to replace polling · market catalog expansion · optional
|
|
292
|
+
auto-update.
|
|
194
293
|
|
|
195
|
-
|
|
294
|
+
## Community
|
|
196
295
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
排查技能为什么没出现、并新建技能。
|
|
200
|
-
|
|
201
|
-
> 一个不止于只读浏览器的技能管理器。宿主半边运行在 dsh 进程内,只使用官方 SDK;浏览器半边通过
|
|
202
|
-
> 官方槽位渲染进 GUI。不改任何 dsh 源码。
|
|
203
|
-
|
|
204
|
-
## 为什么还需要一个技能管理器?
|
|
205
|
-
|
|
206
|
-
[dsh-skill-manager](https://www.npmjs.com/package/dsh-skill-manager) 是只读浏览器;
|
|
207
|
-
[dsh-skill-importer](https://github.com/saitamahang/dsh-skill-importer) 和
|
|
208
|
-
[dsh-find-skill](https://github.com/Moximxxx/dsh-find-skill) 专注导入与市场式安装。
|
|
209
|
-
**dsh-skill-hub 补上两者之间的空白:一份你可以真正管理的完整目录。**
|
|
210
|
-
|
|
211
|
-
| 能力 | dsh-skill-manager(只读版) | **dsh-skill-hub(本插件)** |
|
|
212
|
-
| --- | --- | --- |
|
|
213
|
-
| 目录来源 | 自扫盘,仅用户根 | 官方 `ctx.skills` 注册表:项目 / 自定义 / 用户 / 内置 + 第三方 provider |
|
|
214
|
-
| 浏览 / 搜索 | ✅ | ✅(按分组或按来源仓库分组,搜索 + 筛选一行完成) |
|
|
215
|
-
| 启用 / 禁用 | ❌ | ✅(重命名 `SKILL.md`;文件不删除,可随时恢复;分组/来源头部滑动开关一键整组启停) |
|
|
216
|
-
| 查看技能正文 | ❌ | ✅ |
|
|
217
|
-
| 发现诊断 | ❌ | ✅(缺 frontmatter / 缺 `name`/`description` / 非法名称,逐项列明原因) |
|
|
218
|
-
| 新建技能向导 | ❌ | ✅(写入 `~/.dsh/skills` 或 `~/.agents/skills`) |
|
|
219
|
-
| 触发统计 | ❌ | ✅(从会话日志读每技能实际调用次数;组头汇总) |
|
|
220
|
-
| 来源跟踪 | ❌ | ✅(记录上游 repo + commit 快照;检查更新 / 同步 / 上游删除跟进进回收站;删除→恢复保留来源与场景归属) |
|
|
221
|
-
| 市场(codex 式) | ❌ | ✅(内置市场目录 + 自定义仓库源;扫描、一键导入、每源显示已装/可更新数量、一键全部更新) |
|
|
222
|
-
| 实时更新 | — | 文件系统 provider 的 watcher 驱动,面板 5s 轮询兜底 |
|
|
223
|
-
|
|
224
|
-
## 功能
|
|
225
|
-
|
|
226
|
-
- **完整目录** —— 官方注册表知道的每个技能:项目 `.dsh/skills` 与 `.agents/skills`、自定义根、
|
|
227
|
-
用户 `~/.dsh/skills` 与 `~/.agents/skills`、内置、以及第三方 provider。
|
|
228
|
-
- **搜索与分组** —— 搜索框、来源筛选、平铺/分组视图合并为一行;分组 = 用户 tag + 来源集合(按上游
|
|
229
|
-
仓库自动聚合),未归类兜底可见。
|
|
230
|
-
- **组开关(三态)** —— 每个分组头部一个滑动开关,一键启用/禁用整组;关闭时若成员在其他组开启,
|
|
231
|
-
弹窗询问(全部关闭 / 保留开启 → 该组开关进入半开混合态)。只读技能跳过并逐名报告。
|
|
232
|
-
- **启用 / 禁用** —— 禁用时把 `SKILL.md` 重命名移出发现范围(记录在 sidecar 文件中),重启后仍然
|
|
233
|
-
生效且可一键恢复。文件从不删除。
|
|
234
|
-
- **来源跟踪** —— 从 GitHub 导入(市场源或直接地址)的技能记录上游 repo 与 commit 快照;按来源
|
|
235
|
-
检查更新(每来源 1–2 次 GitHub API 请求,5 分钟节流)、选择同步(确认覆盖)、上游删除跟进移入
|
|
236
|
-
可恢复的回收站。删除后再恢复的技能会保留来源与场景归属(回收站条目里存有快照)。
|
|
237
|
-
个人技能(无来源记录)不跟踪。
|
|
238
|
-
- **市场(codex 式)** —— 内置市场目录(精选仓库一键添加)+ 自定义仓库源(owner/repo 或 GitHub
|
|
239
|
-
链接),扫描 `skills/` 与 `design-templates/` 根目录,一键导入。每个市场源一行聚合显示
|
|
240
|
-
「已装 N / 可更新 N / 上游已删 N」,顶部支持「检查全部」与「全部更新」(逐个同步,单个来源
|
|
241
|
-
失败不影响其他,汇总报告)。
|
|
242
|
-
- **技能详情** —— 直接从磁盘读取技能的渲染正文。
|
|
243
|
-
- **发现诊断** —— 目录会逐项报告技能被忽略的原因(缺 YAML frontmatter、缺 `name`/`description`、
|
|
244
|
-
非法名称)。
|
|
245
|
-
- **新建技能向导** —— 在 GUI 里把合法技能脚手架写入 `~/.dsh/skills` 或 `~/.agents/skills`。
|
|
246
|
-
- **触发统计** —— 面板显示每个技能被实际调用的次数,数据来自会话日志(可选;没有 session-query
|
|
247
|
-
的部署直接省略该数据)。
|
|
248
|
-
- **设置卡片** —— 在 **设置 → 插件 → Skill Hub** 启用插件、开关向 Agent 的公告、调整面板显示偏好。
|
|
249
|
-
|
|
250
|
-
## 工作原理
|
|
251
|
-
|
|
252
|
-
```text
|
|
253
|
-
src/
|
|
254
|
-
├── index.ts host 入口:inject [webServer, skills, systemPrompt];系统提示公告
|
|
255
|
-
├── routes.ts /api/skill-hub/{catalog,skill,toggle,toggle-batch,create,stats,config,
|
|
256
|
-
│ groups,tag*,market*,repo*,sources*,update}(仅回环访问)
|
|
257
|
-
├── store.ts sidecar 状态 v3 ~/.dsh/dsh-skill-hub.json(禁用、tag、sources、市场源、
|
|
258
|
-
│ 回收站、运行时配置;v1→v2→v3 版本化迁移)
|
|
259
|
-
├── repo.ts GitHub 发现/导入 + 来源跟踪(最新 commit、tree 差异、manifest)
|
|
260
|
-
├── skillfs.ts 根目录解析 / 开关重命名 / 回收站 & 恢复 / 脚手架 / 诊断扫描
|
|
261
|
-
├── stats.ts 触发统计:会话日志 → 每技能调用次数(可选 sessionQuery)
|
|
262
|
-
├── protocol.ts host ↔ browser 共享 API 契约(类型 + 端点表)
|
|
263
|
-
└── client/ browser 半边:设置卡片 + 技能中枢面板(React,CSS Modules,苹果风)
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
- **宿主半边** 只用官方 SDK:`ctx.skills.snapshot()/get()`、`ctx.webServer.register()`、
|
|
267
|
-
`ctx.systemPrompt.section()`。不修改 dsh 源码。
|
|
268
|
-
- **浏览器半边** 通过官方槽位挂载:一个 **设置 → 技能** 分区,和一个
|
|
269
|
-
**设置 → 插件 → Skill Hub** 配置卡片。
|
|
270
|
-
- **配置为插件自有**。宿主 settings 服务拒绝向 Web 客户端暴露第三方命名空间,因此设置卡片读写插件
|
|
271
|
-
自己的 `/api/skill-hub/config` 路由,而不走 settings 传输——无需挂载命名空间。
|
|
272
|
-
|
|
273
|
-
## 安装
|
|
274
|
-
|
|
275
|
-
在 dsh web profile 中:
|
|
276
|
-
|
|
277
|
-
```bash
|
|
278
|
-
dsh plugin --profile web add dsh-skill-hub
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
要求 Node `^22.19.0 || >=24.0.0` 与 dsh web 部署(`0.1.0-rc.6` SDK 家族)。
|
|
282
|
-
|
|
283
|
-
## 使用
|
|
284
|
-
|
|
285
|
-
在 dsh Web GUI 打开 **设置 → 技能**(Skill Hub):
|
|
286
|
-
|
|
287
|
-
- **浏览** —— 完整目录,可搜索;搜索框、来源筛选、平铺/分组视图合并为一行。
|
|
288
|
-
- **分组** —— 用户标签分组与来源组(上游仓库)。分组头部有三态滑动开关(开 / 半开 / 关),关闭时
|
|
289
|
-
若影响在其他分组开启的技能会弹窗确认(全部关闭 / 保留开启)。
|
|
290
|
-
- **市场** —— 内置市场目录(精选仓库一键添加)+ 自定义来源(添加仓库源 → 扫描 → 一键安装)或直接
|
|
291
|
-
输入仓库地址;每次导入都记录上游 repo/commit。每个市场源行显示已装 / 可更新 / 上游已删数量;
|
|
292
|
-
「检查全部」一次刷新所有来源,「全部更新」一次同步所有待更新来源。
|
|
293
|
-
- **回收站** —— 上游删除跟进移除(或手动删除)的技能进入可恢复的回收站;恢复时自动挂回来源与
|
|
294
|
-
场景分组。
|
|
295
|
-
- **开关** —— 启用/禁用任意用户可写根下的技能;被禁用的技能单独列出,可随时重新启用。
|
|
296
|
-
- **诊断** —— 发现诊断解释某个技能为什么没有出现。
|
|
297
|
-
- **新建** —— 从表单脚手架一个新技能,立即开始编写。
|
|
298
|
-
- **统计** —— 有 session-query 数据时显示每个技能的调用次数;分组标题汇总。
|
|
299
|
-
|
|
300
|
-
插件自身的开关在 **设置 → 插件 → Skill Hub** 卡片上:
|
|
301
|
-
|
|
302
|
-
| 字段 | 含义 |
|
|
303
|
-
| --- | --- |
|
|
304
|
-
| Enable plugin | 总开关:路由、provider 与公告随之启用。 |
|
|
305
|
-
| Announce to agent | 在系统提示中加入本插件说明,用户提到技能管理时 Agent 知道如何协作。 |
|
|
306
|
-
| 模型/用户圆点颜色 | 覆盖面板中蓝色/绿色调用圆点的颜色。 |
|
|
307
|
-
| 显示调用次数 | 有会话统计时显示每个技能的调用次数角标。 |
|
|
308
|
-
| 显示最近调用时间 | 在技能行显示相对最近调用时间。 |
|
|
309
|
-
| 显示分组汇总 | 在分组标题后汇总调用次数与最近调用时间。 |
|
|
310
|
-
|
|
311
|
-
## HTTP API
|
|
312
|
-
|
|
313
|
-
所有端点**仅限回环**(`127.0.0.1`/`localhost`),返回 JSON。
|
|
314
|
-
|
|
315
|
-
| 端点 | 方法 | 用途 |
|
|
316
|
-
| --- | --- | --- |
|
|
317
|
-
| `/api/skill-hub/catalog` | GET | 完整目录:技能、禁用列表、发现诊断。 |
|
|
318
|
-
| `/api/skill-hub/skill?name=` | GET | 单个技能详情(路径、provider、正文)。 |
|
|
319
|
-
| `/api/skill-hub/toggle` | POST | 启用/禁用可写技能(`{name, enabled}`)。 |
|
|
320
|
-
| `/api/skill-hub/toggle-batch` | POST | 一次写入整组启停(`{names, enabled}`)。 |
|
|
321
|
-
| `/api/skill-hub/create` | POST | 脚手架新技能(`{name, description?, root?}`)。 |
|
|
322
|
-
| `/api/skill-hub/stats` | GET | 每技能调用次数(无 session-query 时不可用)。 |
|
|
323
|
-
| `/api/skill-hub/config` | GET/POST | 插件运行时配置(`{enabled, announceToAgent}` 等);`null` 清除覆盖。 |
|
|
324
|
-
| `/api/skill-hub/groups` | GET | 用户标签 + 来源组 + origin 映射。 |
|
|
325
|
-
| `/api/skill-hub/tag` | POST | 新建/重命名标签分组。 |
|
|
326
|
-
| `/api/skill-hub/tag/delete` | POST | 删除标签分组。 |
|
|
327
|
-
| `/api/skill-hub/tag/members` | POST | 设置某标签的成员列表。 |
|
|
328
|
-
| `/api/skill-hub/market` | GET | 用户的市场源仓库列表。 |
|
|
329
|
-
| `/api/skill-hub/market/source` | POST | 添加市场源(`{repo}`)。 |
|
|
330
|
-
| `/api/skill-hub/market/source/delete` | POST | 移除市场源。 |
|
|
331
|
-
| `/api/skill-hub/repo?repo=` | GET | 发现 GitHub 仓库中可导入的技能。 |
|
|
332
|
-
| `/api/skill-hub/repo/import` | POST | 导入所选仓库技能(记录来源)。 |
|
|
333
|
-
| `/api/skill-hub/sources` | GET | 来源记录、派生 origin/集合、回收站。 |
|
|
334
|
-
| `/api/skill-hub/sources/check` | POST | 检查上游更新(5 分钟节流)。 |
|
|
335
|
-
| `/api/skill-hub/sources/sync` | POST | 同步某来源所选(或全部)技能。 |
|
|
336
|
-
| `/api/skill-hub/sources/delete` | POST | 跟进上游删除(移入回收站)。 |
|
|
337
|
-
| `/api/skill-hub/sources/restore` | POST | 从回收站恢复技能。 |
|
|
338
|
-
| `/api/skill-hub/sources/trash/clear` | POST | 永久清空回收站。 |
|
|
339
|
-
| `/api/skill-hub/update` | GET | 检查插件自身最新发布。 |
|
|
340
|
-
|
|
341
|
-
## 开发
|
|
342
|
-
|
|
343
|
-
```bash
|
|
344
|
-
npm install
|
|
345
|
-
npm run typecheck # tsc --noEmit
|
|
346
|
-
npm test # vitest(9 个套件,151 个用例)
|
|
347
|
-
npm run build # tsc 声明 + tsdown 双半边产物(lib/index.js + lib/client.js)
|
|
348
|
-
npm pack # 生成可安装的 tgz(dsh-skill-hub-<version>.tgz)
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
> **本地联调注意:** 不要在同一 `$DSH_HOME` 和同一项目目录下同时运行两个
|
|
352
|
-
> `dsh web` 实例。dsh rc.6 没有跨进程会话日志锁,第二个实例恢复同一会话时会
|
|
353
|
-
> 写入重复 `seq`,导致 `corrupt session log: seq gap in committed region`。
|
|
354
|
-
> 需要预览实例时先停旧实例,或使用独立的 `DSH_HOME`。
|
|
355
|
-
|
|
356
|
-
测试套件覆盖路由家族(含 config 路由与禁用闸门)、sidecar 存储、技能文件系统操作、注册表
|
|
357
|
-
provider 与触发统计。
|
|
358
|
-
|
|
359
|
-
## 路线图
|
|
360
|
-
|
|
361
|
-
- **v0.1.0** —— 完整目录、启用/禁用、诊断、新建向导、设置卡片。
|
|
362
|
-
- **v0.2.0** —— 触发统计 · tag/场景与来源集合分组(三态开关)· 上游来源跟踪(检查 / 同步 /
|
|
363
|
-
跟进删除进回收站)· codex 式市场(内置目录、每源状态徽章、一键全部更新)· 删除→恢复保留
|
|
364
|
-
来源与场景归属。
|
|
365
|
-
- **Next** —— SSE 实时推送替代轮询 · 内置市场扩充 · 自动更新选项。
|
|
296
|
+
- [Issues](https://github.com/cheshireez/dsh-skill-hub/issues) — bug reports and feature requests.
|
|
297
|
+
- [Contributing](CONTRIBUTING.md) — development setup and contribution guidelines.
|
|
366
298
|
|
|
367
299
|
## License
|
|
368
300
|
|
|
369
|
-
MIT
|
|
301
|
+
MIT — see [LICENSE](LICENSE).
|