dsh-skill-hub 0.0.1 → 0.2.0
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 +56 -0
- package/README.md +355 -20
- package/cordis.patch.yml +12 -0
- package/lib/client.js +4514 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +3119 -0
- package/lib/invariant.js +6 -0
- package/lib/types/client/SkillHubSettingsCard.d.ts +53 -0
- package/lib/types/client/api-config-scope.d.ts +48 -0
- package/lib/types/client/api.d.ts +64 -0
- package/lib/types/client/grouping.d.ts +64 -0
- package/lib/types/client/helpers.d.ts +11 -0
- package/lib/types/client/index.d.ts +42 -0
- package/lib/types/client/locales.d.ts +216 -0
- package/lib/types/client/market-catalog.d.ts +14 -0
- package/lib/types/client/panel/DisabledRow.d.ts +12 -0
- package/lib/types/client/panel/GroupSummary.d.ts +10 -0
- package/lib/types/client/panel/MarketView.d.ts +11 -0
- package/lib/types/client/panel/ScenesView.d.ts +11 -0
- package/lib/types/client/panel/SkillDetailView.d.ts +31 -0
- package/lib/types/client/panel/SkillHubPanel.d.ts +18 -0
- package/lib/types/client/panel/SkillRow.d.ts +11 -0
- package/lib/types/client/panel/SourceStatusBadge.d.ts +18 -0
- package/lib/types/client/panel/SourcesView.d.ts +10 -0
- package/lib/types/client/panel/TagEditorView.d.ts +29 -0
- package/lib/types/client/panel/dialogs.d.ts +73 -0
- package/lib/types/client/panel/format.d.ts +14 -0
- package/lib/types/client/panel/useSkillHub.d.ts +183 -0
- package/lib/types/client/settings-card.d.ts +81 -0
- package/lib/types/client/settings-form.d.ts +95 -0
- package/lib/types/client/settings-nav-icon.d.ts +8 -0
- package/lib/types/index.d.ts +36 -0
- package/lib/types/invariant.d.ts +3 -0
- package/lib/types/protocol.d.ts +571 -0
- package/lib/types/provider.d.ts +47 -0
- package/lib/types/repo.d.ts +133 -0
- package/lib/types/routes.d.ts +51 -0
- package/lib/types/skillfs.d.ts +95 -0
- package/lib/types/stats.d.ts +49 -0
- package/lib/types/store.d.ts +142 -0
- package/lib/types/update.d.ts +20 -0
- package/package.json +115 -11
- package/src/client/SkillHubSettingsCard.tsx +161 -0
- package/src/client/api-config-scope.test.ts +79 -0
- package/src/client/api-config-scope.ts +119 -0
- package/src/client/api.ts +327 -0
- package/src/client/css-modules.d.ts +5 -0
- package/src/client/grouping.test.ts +109 -0
- package/src/client/grouping.ts +120 -0
- package/src/client/helpers.ts +23 -0
- package/src/client/index.tsx +104 -0
- package/src/client/locales.ts +432 -0
- package/src/client/market-catalog.ts +22 -0
- package/src/client/panel/DisabledRow.tsx +32 -0
- package/src/client/panel/GroupSummary.tsx +27 -0
- package/src/client/panel/MarketView.tsx +173 -0
- package/src/client/panel/ScenesView.tsx +75 -0
- package/src/client/panel/SkillDetailView.tsx +95 -0
- package/src/client/panel/SkillHubPanel.tsx +347 -0
- package/src/client/panel/SkillRow.tsx +54 -0
- package/src/client/panel/SourceStatusBadge.tsx +61 -0
- package/src/client/panel/SourcesView.tsx +104 -0
- package/src/client/panel/TagEditorView.tsx +89 -0
- package/src/client/panel/dialogs.tsx +185 -0
- package/src/client/panel/format.ts +31 -0
- package/src/client/panel/panel.module.css +219 -0
- package/src/client/panel/useSkillHub.ts +797 -0
- package/src/client/settings-card.module.css +52 -0
- package/src/client/settings-card.tsx +237 -0
- package/src/client/settings-form.ts +227 -0
- package/src/client/settings-nav-icon.ts +42 -0
- package/src/index.ts +181 -0
- package/src/invariant.ts +4 -0
- package/src/protocol.ts +622 -0
- package/src/provider.test.ts +112 -0
- package/src/provider.ts +168 -0
- package/src/repo.test.ts +212 -0
- package/src/repo.ts +528 -0
- package/src/routes.test.ts +786 -0
- package/src/routes.ts +1252 -0
- package/src/skillfs.test.ts +290 -0
- package/src/skillfs.ts +306 -0
- package/src/stats.test.ts +168 -0
- package/src/stats.ts +124 -0
- package/src/store.test.ts +253 -0
- package/src/store.ts +628 -0
- package/src/update.test.ts +73 -0
- package/src/update.ts +136 -0
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for considering a contribution to **dsh-skill-hub**. This project is a
|
|
4
|
+
[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh) plugin with two halves:
|
|
5
|
+
|
|
6
|
+
- the **host half** (`src/index.ts` + `src/routes.ts`) runs in the dsh process and speaks only official
|
|
7
|
+
dsh SDKs, and
|
|
8
|
+
- the **browser half** (`src/client/`) renders inside the web GUI through official slots.
|
|
9
|
+
|
|
10
|
+
Please keep both halves on official APIs — no dsh source patches.
|
|
11
|
+
|
|
12
|
+
## Development setup
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install
|
|
16
|
+
npm run typecheck # tsc --noEmit
|
|
17
|
+
npm test # vitest (54 tests across 5 suites)
|
|
18
|
+
npm run build # tsc declarations + tsdown bundles (lib/index.js + lib/client.js)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Before opening a pull request
|
|
22
|
+
|
|
23
|
+
1. **Typecheck** — `npm run typecheck` must pass.
|
|
24
|
+
2. **Tests** — `npm test` must pass; add/adjust tests for any behavior change. The suites live in
|
|
25
|
+
`src/*.test.ts` and mirror the real route/store/filesystem/provider behavior.
|
|
26
|
+
3. **Build** — `npm run build` must produce `lib/index.js` and `lib/client.js`.
|
|
27
|
+
4. **Keep the diff focused** — one logical change per PR, with a clear title and description.
|
|
28
|
+
5. **Documentation** — update `README.md` (including the embedded Chinese collapsible section) when
|
|
29
|
+
behavior or the API surface changes.
|
|
30
|
+
|
|
31
|
+
## Code style
|
|
32
|
+
|
|
33
|
+
- TypeScript, strict mode. ESM (`"type": "module"`).
|
|
34
|
+
- Host routes are loopback-only by construction — keep the trust fence intact.
|
|
35
|
+
- The browser half uses CSS Modules; keep the settings-card chrome family-bucket-compatible.
|
|
36
|
+
- Comments explain *why* (routing decisions, dsh host behaviors) more than *what*.
|
|
37
|
+
|
|
38
|
+
## Testing the plugin in a live dsh web GUI
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# after a change:
|
|
42
|
+
npm run build
|
|
43
|
+
cp lib/index.js lib/client.js ~/.dsh/profiles/web/node_modules/dsh-skill-hub/lib/
|
|
44
|
+
# restart the dsh web process, then verify Settings → 技能 and Settings → 插件 → Skill Hub
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Issues
|
|
48
|
+
|
|
49
|
+
- **Bugs**: include the dsh version, Node version, the plugin version, and the exact steps.
|
|
50
|
+
- **Feature requests**: describe the workflow you are trying to accomplish; a short motivation helps
|
|
51
|
+
scope the change.
|
|
52
|
+
|
|
53
|
+
## License
|
|
54
|
+
|
|
55
|
+
By contributing, you agree that your contributions will be licensed under the
|
|
56
|
+
[MIT License](LICENSE).
|
package/README.md
CHANGED
|
@@ -1,34 +1,369 @@
|
|
|
1
1
|
# dsh-skill-hub
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
<p align="center">
|
|
4
|
+
<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>
|
|
5
|
+
<img alt="license" src="https://img.shields.io/npm/l/dsh-skill-hub">
|
|
6
|
+
<img alt="node" src="https://img.shields.io/badge/node-%3E%3D22.19-339933">
|
|
7
|
+
<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
|
+
</p>
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
<details>
|
|
11
|
+
<summary><b>English</b>(英文)— 点击在本页展开 / 收起,无需跳转</summary>
|
|
6
12
|
|
|
7
|
-
**
|
|
13
|
+
**In-GUI skill hub for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh).**
|
|
14
|
+
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, and scaffold new ones — all from the dsh web GUI.
|
|
8
16
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
| Catalog source | Own fs scan, user roots only | Official `ctx.skills` service — all six roots + third-party providers |
|
|
12
|
-
| Browse / search | ✅ | ✅ |
|
|
13
|
-
| Group by source root | ❌ | ✅ |
|
|
14
|
-
| Enable / disable skills | ❌ | ✅ |
|
|
15
|
-
| Frontmatter diagnostics (why a skill is ignored) | ❌ | ✅ |
|
|
16
|
-
| New-skill wizard (agent-guided) | ❌ | ✅ |
|
|
17
|
-
| Per-session skill set / usage stats | ❌ | ✅ (v2) |
|
|
17
|
+
> A skill manager beyond the read-only browser. The host half runs in the dsh process and speaks only
|
|
18
|
+
> official SDKs; the browser half renders inside the GUI through official slots. No dsh source changes.
|
|
18
19
|
|
|
19
|
-
##
|
|
20
|
+
## Why another skill manager?
|
|
20
21
|
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
22
|
+
[dsh-skill-manager](https://www.npmjs.com/package/dsh-skill-manager) is a read-only browser,
|
|
23
|
+
[dsh-skill-importer](https://github.com/saitamahang/dsh-skill-importer) and
|
|
24
|
+
[dsh-find-skill](https://github.com/Moximxxx/dsh-find-skill) focus on importing and market-style installs.
|
|
25
|
+
**dsh-skill-hub fills the gap between them: a full catalog you can actually manage.**
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
| Capability | dsh-skill-manager (read-only) | **dsh-skill-hub (this plugin)** |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| Catalog source | self-scans disk, user roots only | official `ctx.skills` registry: project / custom / user / bundled + third-party providers |
|
|
30
|
+
| Browse / search | ✅ | ✅ (group by **tags** or by **source repo**, search + filter in one row) |
|
|
31
|
+
| Enable / disable | ❌ | ✅ (renames `SKILL.md`; file never deleted, always restorable; per-group tri-state switches) |
|
|
32
|
+
| Inspect skill body | ❌ | ✅ |
|
|
33
|
+
| Discovery diagnostics | ❌ | ✅ (missing frontmatter / missing `name`/`description` / invalid name — each reason listed) |
|
|
34
|
+
| New-skill wizard | ❌ | ✅ (writes to `~/.dsh/skills` or `~/.agents/skills`) |
|
|
35
|
+
| Invocation statistics | ❌ | ✅ (per-skill call counts read from session logs; group headers summarize) |
|
|
36
|
+
| Upstream source tracking | ❌ | ✅ (repo + commit snapshot; check updates, sync, follow upstream deletion into a restorable trash; delete/restore keeps source + scene membership) |
|
|
37
|
+
| Codex-style market | ❌ | ✅ (built-in market catalog + custom repo sources, scan, one-click import, per-source installed/updatable badges, one-click update-all) |
|
|
38
|
+
| Live updates | — | filesystem-provider watcher, with a 5s panel poll as fallback |
|
|
39
|
+
|
|
40
|
+
## Features
|
|
41
|
+
|
|
42
|
+
- **Full catalog** — every skill the official registry knows: project `.dsh/skills` & `.agents/skills`,
|
|
43
|
+
custom roots, user `~/.dsh/skills` & `~/.agents/skills`, bundled, and third-party providers.
|
|
44
|
+
- **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 stays visible.
|
|
46
|
+
- **Group switches** — every group header carries a sliding switch: enable/disable the whole group in one
|
|
47
|
+
click. Closing a group whose member is also enabled elsewhere opens a conflict dialog (close all / keep on →
|
|
48
|
+
the group falls into a half-filled mixed state). Read-only skills are skipped with per-name reports.
|
|
49
|
+
- **Enable / disable** — disable renames `SKILL.md` out of discovery (tracked in a sidecar file), so the
|
|
50
|
+
change survives restarts and is trivially reversible. Files are never deleted.
|
|
51
|
+
- **Source tracking** — skills imported from GitHub (market sources or direct URLs) record the repo, ref,
|
|
52
|
+
and upstream commit snapshot. Check for updates per source (1–2 GitHub API requests, 5-minute throttle),
|
|
53
|
+
sync selected skills (overwrite confirm), and follow upstream deletion into a restorable trash.
|
|
54
|
+
Deleting and restoring a tracked skill keeps its source and scene membership (snapshotted in the
|
|
55
|
+
trash entry). Personal skills (no source) are never tracked.
|
|
56
|
+
- **Market** — codex-style: a built-in catalog of curated repos (one-click add) plus custom repo
|
|
57
|
+
sources (owner/repo or a GitHub URL); scan `skills/` and `design-templates/` roots and import with
|
|
58
|
+
one click. Each source row aggregates its state — installed / updatable / deleted upstream — and
|
|
59
|
+
one "update all" pass syncs every source with pending updates (per-source failures are reported,
|
|
60
|
+
never fatal).
|
|
61
|
+
- **Skill detail** — read a skill’s rendered body straight from disk.
|
|
62
|
+
- **Discovery diagnostics** — the catalog reports *why* a skill was ignored (missing YAML frontmatter,
|
|
63
|
+
missing `name`/`description`, illegal name), per skill.
|
|
64
|
+
- **New-skill wizard** — scaffold a valid skill into `~/.dsh/skills` or `~/.agents/skills` from the GUI.
|
|
65
|
+
- **Invocation statistics** — the panel shows how many times each skill was actually called, read from
|
|
66
|
+
session logs (optional; absent session-query deployments simply omit the data).
|
|
67
|
+
- **Settings card** — enable the plugin, toggle the agent announcement, and adjust panel display preferences from **Settings → 插件 → Skill Hub**.
|
|
68
|
+
|
|
69
|
+
## How it works
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
src/
|
|
73
|
+
├── index.ts host entry: inject [webServer, skills, systemPrompt]; system-prompt announcement
|
|
74
|
+
├── routes.ts /api/skill-hub/{catalog,skill,toggle,toggle-batch,create,stats,config,
|
|
75
|
+
│ groups,tag*,market*,repo*,sources*,update} (loopback-only fence)
|
|
76
|
+
├── store.ts sidecar state ~/.dsh/dsh-skill-hub.json v3 (disabled, tags, sources, market
|
|
77
|
+
│ sources, trash, runtime config; versioned v1→v2→v3 migrations)
|
|
78
|
+
├── repo.ts GitHub discovery/import + source tracking (latest commit, tree diff, manifest)
|
|
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)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- **Host half** uses only official SDKs: `ctx.skills.snapshot()/get()`, `ctx.webServer.register()`,
|
|
86
|
+
`ctx.systemPrompt.section()`. No dsh source is modified.
|
|
87
|
+
- **Browser half** mounts through official slots: a **Settings → 技能** section and a
|
|
88
|
+
**Settings → 插件 → Skill Hub** configuration card.
|
|
89
|
+
- **Configuration** is plugin-owned. The host’s settings service refuses to expose third-party
|
|
90
|
+
namespaces to the web client, so the settings card reads/writes the plugin’s own
|
|
91
|
+
`/api/skill-hub/config` route instead of the settings transport — no namespace mounting required.
|
|
92
|
+
|
|
93
|
+
## Installation
|
|
94
|
+
|
|
95
|
+
From the dsh web profile:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
dsh plugin --profile web add dsh-skill-hub
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Requires Node `^22.19.0 || >=24.0.0` and a dsh web deployment (`0.1.0-rc.6` SDK family).
|
|
102
|
+
|
|
103
|
+
## Usage
|
|
104
|
+
|
|
105
|
+
Open **Settings → 技能** (Skill Hub) in the dsh web GUI:
|
|
106
|
+
|
|
107
|
+
- **Browse** — the full catalog, searchable; search, source filter, and flat/grouped view share one row.
|
|
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.
|
|
121
|
+
|
|
122
|
+
The plugin’s own switches live on the **Settings → 插件 → Skill Hub** card:
|
|
123
|
+
|
|
124
|
+
| Field | Meaning |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| Enable plugin | Master switch: routes, provider, and announcement all go live with this. |
|
|
127
|
+
| Announce to agent | Adds a system-prompt section so agents know how to collaborate when users mention skill management. |
|
|
128
|
+
| Model / user dot colors | Override the blue/green invocation dot colors used in the panel. |
|
|
129
|
+
| Show invocation count | Show per-skill call-count chips when session stats are available. |
|
|
130
|
+
| Show last-used time | Show relative last-used time on each skill row. |
|
|
131
|
+
| Show group summaries | Show count/last-used summaries after group titles. |
|
|
132
|
+
|
|
133
|
+
## HTTP API
|
|
134
|
+
|
|
135
|
+
All endpoints are **loopback-only** (`127.0.0.1`/`localhost`) and JSON.
|
|
136
|
+
|
|
137
|
+
| Endpoint | Method | Purpose |
|
|
138
|
+
| --- | --- | --- |
|
|
139
|
+
| `/api/skill-hub/catalog` | GET | Full catalog: skills, disabled list, discovery diagnostics. |
|
|
140
|
+
| `/api/skill-hub/skill?name=` | GET | One skill’s detail (path, provider, body). |
|
|
141
|
+
| `/api/skill-hub/toggle` | POST | Enable/disable a writable skill (`{name, enabled}`). |
|
|
142
|
+
| `/api/skill-hub/toggle-batch` | POST | Enable/disable a whole group in one write (`{names, enabled}`). |
|
|
143
|
+
| `/api/skill-hub/create` | POST | Scaffold a new skill (`{name, description?, root?}`). |
|
|
144
|
+
| `/api/skill-hub/stats` | GET | Per-skill invocation counts (unavailable when session-query is absent). |
|
|
145
|
+
| `/api/skill-hub/config` | GET/POST | Plugin runtime config (`{enabled, announceToAgent}`); `null` clears an override. |
|
|
146
|
+
| `/api/skill-hub/groups` | GET | User tags + source collections + origin map. |
|
|
147
|
+
| `/api/skill-hub/tag` | POST | Create/rename a tag group. |
|
|
148
|
+
| `/api/skill-hub/tag/delete` | POST | Delete a tag group. |
|
|
149
|
+
| `/api/skill-hub/tag/members` | POST | Set a tag’s member list. |
|
|
150
|
+
| `/api/skill-hub/market` | GET | The user’s market source repos. |
|
|
151
|
+
| `/api/skill-hub/market/source` | POST | Add a market source (`{repo}`). |
|
|
152
|
+
| `/api/skill-hub/market/source/delete` | POST | Remove a market source. |
|
|
153
|
+
| `/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). |
|
|
155
|
+
| `/api/skill-hub/sources` | GET | Source records, derived origins/collections, trash. |
|
|
156
|
+
| `/api/skill-hub/sources/check` | POST | Check upstream updates (throttled, 5 min). |
|
|
157
|
+
| `/api/skill-hub/sources/sync` | POST | Sync selected (or all) skills of a source. |
|
|
158
|
+
| `/api/skill-hub/sources/delete` | POST | Follow upstream deletion (moves to trash). |
|
|
159
|
+
| `/api/skill-hub/sources/restore` | POST | Restore a trashed skill. |
|
|
160
|
+
| `/api/skill-hub/update` | GET | Check the plugin’s own latest release. |
|
|
161
|
+
|
|
162
|
+
## Development
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
npm install
|
|
166
|
+
npm run typecheck # tsc --noEmit
|
|
167
|
+
npm test # vitest (151 tests across 9 suites)
|
|
168
|
+
npm run build # tsc declarations + tsdown bundles (lib/index.js + lib/client.js)
|
|
169
|
+
npm pack # build the installable tarball (dsh-skill-hub-<version>.tgz)
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
> **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.6 has no
|
|
174
|
+
> cross-process session-log lock, and a second instance resuming the same
|
|
175
|
+
> session can write duplicate `seq` rows (`corrupt session log: seq gap in
|
|
176
|
+
> committed region`). Stop the old instance first, or give the preview its own
|
|
177
|
+
> `DSH_HOME`.
|
|
178
|
+
|
|
179
|
+
The test suites cover the route family (including the config route and the disabled gate), the sidecar
|
|
180
|
+
store, skill filesystem operations, the registry provider, and invocation statistics.
|
|
181
|
+
|
|
182
|
+
## Roadmap
|
|
183
|
+
|
|
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 tri-state
|
|
186
|
+
switches · upstream source tracking (check / sync / follow-delete into a restorable trash) ·
|
|
187
|
+
codex-style market with built-in catalog, per-source state badges, and one-click update-all ·
|
|
188
|
+
delete/restore keeps source + scene membership.
|
|
189
|
+
- **Next** — SSE realtime push to replace polling · market catalog expansion · optional auto-update.
|
|
190
|
+
|
|
191
|
+
## License
|
|
192
|
+
|
|
193
|
+
MIT — see [LICENSE](LICENSE).
|
|
194
|
+
|
|
195
|
+
</details>
|
|
196
|
+
|
|
197
|
+
**面向 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(dsh)的图形化技能中枢。**
|
|
198
|
+
在 dsh Web GUI 里浏览官方 `ctx.skills` 注册表提供的完整本地技能目录,启用/禁用技能、查看正文、
|
|
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 中:
|
|
26
276
|
|
|
27
277
|
```bash
|
|
28
278
|
dsh plugin --profile web add dsh-skill-hub
|
|
29
279
|
```
|
|
30
280
|
|
|
31
|
-
|
|
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 实时推送替代轮询 · 内置市场扩充 · 自动更新选项。
|
|
366
|
+
|
|
367
|
+
## License
|
|
32
368
|
|
|
33
|
-
|
|
34
|
-
- License: MIT
|
|
369
|
+
MIT —— 见 [LICENSE](LICENSE)。
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# dsh-skill-hub bundle patch: inserts the dual-face plugin row into the web
|
|
2
|
+
# profile roster. Applied as a profile bundle layer (the `dsh.bundle.patch`
|
|
3
|
+
# manifest field) over dsh-base; activate with
|
|
4
|
+
# `dsh plugin --profile <name> add dsh-skill-hub`.
|
|
5
|
+
#
|
|
6
|
+
# The row is a bare plugin by package name: the node half (exports ".") runs
|
|
7
|
+
# in the host process (skill catalog routes, toggle/create operations), and
|
|
8
|
+
# the `dsh.client` declaration in package.json makes the browser half
|
|
9
|
+
# (exports "./client", served at /plugins/<id>/client.js) load in the web GUI.
|
|
10
|
+
- insert:
|
|
11
|
+
- id: skill-hub
|
|
12
|
+
name: 'dsh-skill-hub'
|