@nanmicoder/dsh-skills-hub 0.0.2 → 0.0.3
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 +6 -2
- package/README.md +8 -7
- package/README_EN.md +8 -7
- package/README_ZH.md +1 -1
- package/assets/readme/marketplace.png +0 -0
- package/compatibility.json +1 -1
- package/docs/CATALOG.md +39 -0
- package/docs/COMPATIBILITY.md +12 -0
- package/docs/CONTRACT.md +14 -9
- package/docs/RELEASE.md +4 -4
- package/lib/catalog/catalog.js +89 -0
- package/lib/catalog/skills.json +8673 -0
- package/lib/client.js +2549 -1819
- package/lib/client.js.map +1 -1
- package/lib/market/clawhub-provider.js +139 -22
- package/lib/market/install-service.js +19 -8
- package/lib/market/market-service.js +88 -9
- package/lib/market/skillhub-provider.js +6 -2
- package/lib/skills/installed.js +5 -0
- package/lib/types/catalog/catalog.d.ts +73 -0
- package/lib/types/client/api.d.ts +12 -3
- package/lib/types/client/components/CategoryBar.d.ts +13 -0
- package/lib/types/client/components/FilterBar.d.ts +4 -0
- package/lib/types/client/components/InstallConfirmDialog.d.ts +14 -11
- package/lib/types/client/components/InstalledSkillDetail.d.ts +1 -1
- package/lib/types/client/components/InstalledSkills.d.ts +1 -1
- package/lib/types/client/components/MarketSkillDetail.d.ts +34 -0
- package/lib/types/client/components/SkillDetailShell.d.ts +66 -43
- package/lib/types/client/locales.d.ts +64 -0
- package/lib/types/client/skill-insights.d.ts +30 -0
- package/lib/types/client/state.d.ts +23 -3
- package/lib/types/market/clawhub-provider.d.ts +15 -0
- package/lib/types/market/install-service.d.ts +1 -0
- package/lib/types/market/market-service.d.ts +25 -3
- package/lib/types/market/types.d.ts +29 -0
- package/lib/types/skills/installed.d.ts +4 -0
- package/lib/types/web-routes.d.ts +1 -1
- package/lib/web-routes.js +44 -5
- package/package.json +1 -1
- package/release-notes/v0.0.3.md +12 -0
- package/lib/types/client/components/InstallStateBadge.d.ts +0 -11
- package/lib/types/client/components/SecurityBadge.d.ts +0 -16
- package/lib/types/client/components/SkillDetailView.d.ts +0 -19
package/CONTRIBUTING.md
CHANGED
|
@@ -15,7 +15,7 @@ Commit regenerated `lib/` with source changes because Git installations consume
|
|
|
15
15
|
For CLI users and local development, install a specific published version:
|
|
16
16
|
|
|
17
17
|
```sh
|
|
18
|
-
dsh plugin --profile desktop add @nanmicoder/dsh-skills-hub@0.0.
|
|
18
|
+
dsh plugin --profile desktop add @nanmicoder/dsh-skills-hub@0.0.3
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
Replace `desktop` with the target profile. To test a local source build:
|
|
@@ -23,7 +23,11 @@ Replace `desktop` with the target profile. To test a local source build:
|
|
|
23
23
|
```sh
|
|
24
24
|
pnpm install --frozen-lockfile
|
|
25
25
|
pnpm pack --pack-destination artifacts
|
|
26
|
-
dsh plugin --profile desktop add ./artifacts/nanmicoder-dsh-skills-hub-0.0.
|
|
26
|
+
dsh plugin --profile desktop add ./artifacts/nanmicoder-dsh-skills-hub-0.0.3.tgz
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Fully quit and reopen the target Harness instance after a CLI install. Advanced configuration is documented in [CONFIGURATION.md](./docs/CONFIGURATION.md).
|
|
30
|
+
|
|
31
|
+
## Curated catalogue
|
|
32
|
+
|
|
33
|
+
The marketplace home list comes from `catalog/curation.json` (editorial: which skills, category, Chinese summary, picks) and its generated snapshot `src/catalog/skills.json`. To add or remove a skill, edit the curation, run `node scripts/catalog-refresh.mjs`, review the entries it reports as dropped, then `pnpm build`. Selection and security rules are in `docs/CATALOG.md`.
|
package/README.md
CHANGED
|
@@ -19,16 +19,17 @@
|
|
|
19
19
|
|
|
20
20
|
搜索 ClawHub 和 SkillHub 中的技能,阅读使用说明,再安装到 Harness。市场安装的技能和本机已有技能,都可以在「已安装技能」中查看和管理。
|
|
21
21
|
|
|
22
|
-
当前版本:**0.0.
|
|
22
|
+
当前版本:**0.0.3**。首页改为 398 个精选技能、13 个分类,详情页重新设计,并能说明技能安装后会做什么。[更新说明](./release-notes/v0.0.3.md)
|
|
23
23
|
|
|
24
24
|
<p align="center">
|
|
25
|
-
<img src="./assets/readme/marketplace.png" width="100%" alt="Skills Hub
|
|
25
|
+
<img src="./assets/readme/marketplace.png" width="100%" alt="Skills Hub 技能市场:分类、搜索、筛选和精选技能卡片。">
|
|
26
26
|
</p>
|
|
27
27
|
|
|
28
28
|
| 功能 | 说明 |
|
|
29
29
|
| --- | --- |
|
|
30
|
-
|
|
|
31
|
-
|
|
|
30
|
+
| **精选清单** | 398 个 ClawHub 与 SkillHub 热门技能,按 13 个分类整理,随插件发布,打开即看。 |
|
|
31
|
+
| **实时搜索** | 输入关键词即搜索两个市场的全部技能,同名技能按作者区分。 |
|
|
32
|
+
| **安装前预览** | 阅读说明和文件,查看上游安全扫描,以及技能会执行的命令、读取的密钥和访问的网络。 |
|
|
32
33
|
| **管理已安装技能** | 搜索本机技能,查看来源与安装位置,确认后卸载。 |
|
|
33
34
|
| **本地缓存** | 缓存已浏览的分页、详情和文件预览,重启后继续使用。 |
|
|
34
35
|
|
|
@@ -47,18 +48,18 @@ https://github.com/NanmiCoder/dsh-skills-hub
|
|
|
47
48
|
**或 npm 包名**
|
|
48
49
|
|
|
49
50
|
```text
|
|
50
|
-
@nanmicoder/dsh-skills-hub@0.0.
|
|
51
|
+
@nanmicoder/dsh-skills-hub@0.0.3
|
|
51
52
|
```
|
|
52
53
|
|
|
53
54
|
点击 **安装 → 立即启用**,然后从侧栏进入 **技能市场**。
|
|
54
55
|
|
|
55
56
|
## 使用
|
|
56
57
|
|
|
57
|
-
1.
|
|
58
|
+
1. **查找**:按分类浏览精选清单,或输入关键词搜索全部技能。
|
|
58
59
|
2. **预览**:打开技能,查看说明和文件内容。
|
|
59
60
|
3. **安装与管理**:确认安装后,到「已安装技能」中查看或卸载。
|
|
60
61
|
|
|
61
|
-
|
|
62
|
+
技能由第三方社区作者发布;Skills Hub 是社区插件,并非 DeepSeek 官方出品。精选清单只做整理推荐,不构成安全担保,安装前请查看安全报告与 SKILL.md。
|
|
62
63
|
|
|
63
64
|
## 已安装技能
|
|
64
65
|
|
package/README_EN.md
CHANGED
|
@@ -19,16 +19,17 @@
|
|
|
19
19
|
|
|
20
20
|
Search ClawHub and SkillHub, read a skill’s instructions, and install it into Harness. Manage marketplace installations and existing local skills together in **Installed**.
|
|
21
21
|
|
|
22
|
-
Current version: **0.0.
|
|
22
|
+
Current version: **0.0.3**. The home page now opens on 398 curated skills in 13 categories, with a redesigned detail page that explains what a skill will do once installed. [Release notes](./release-notes/v0.0.3.md)
|
|
23
23
|
|
|
24
24
|
<p align="center">
|
|
25
|
-
<img src="./assets/readme/marketplace.png" width="100%" alt="Skills Hub marketplace with search, filters and skill cards.">
|
|
25
|
+
<img src="./assets/readme/marketplace.png" width="100%" alt="Skills Hub marketplace with categories, search, filters and curated skill cards.">
|
|
26
26
|
</p>
|
|
27
27
|
|
|
28
28
|
| Feature | What it does |
|
|
29
29
|
| --- | --- |
|
|
30
|
-
| **
|
|
31
|
-
| **
|
|
30
|
+
| **Curated catalogue** | 398 popular ClawHub and SkillHub skills in 13 categories, shipped with the plugin and shown instantly. |
|
|
31
|
+
| **Live search** | Type a keyword to search every skill on both marketplaces; same-name skills are told apart by author. |
|
|
32
|
+
| **Preview before installing** | Read instructions and files, check upstream scans, and see the commands, secrets and network hosts a skill uses. |
|
|
32
33
|
| **Manage installed skills** | Search local skills, inspect their source and installation path, and confirm removal. |
|
|
33
34
|
| **Local cache** | Reuse browsed pages, details and file previews across desktop restarts. |
|
|
34
35
|
|
|
@@ -47,18 +48,18 @@ https://github.com/NanmiCoder/dsh-skills-hub
|
|
|
47
48
|
**Or the npm package name**
|
|
48
49
|
|
|
49
50
|
```text
|
|
50
|
-
@nanmicoder/dsh-skills-hub@0.0.
|
|
51
|
+
@nanmicoder/dsh-skills-hub@0.0.3
|
|
51
52
|
```
|
|
52
53
|
|
|
53
54
|
Click **Install → Enable now**, then open **Skills Hub** from the sidebar.
|
|
54
55
|
|
|
55
56
|
## Use
|
|
56
57
|
|
|
57
|
-
1. **Find**:
|
|
58
|
+
1. **Find**: browse the curated catalogue by category, or enter a keyword to search every skill.
|
|
58
59
|
2. **Preview**: open a skill to read its instructions and inspect its files.
|
|
59
60
|
3. **Install and manage**: confirm installation, then find or remove it in **Installed**.
|
|
60
61
|
|
|
61
|
-
Skills
|
|
62
|
+
Skills are published by third-party community authors. Skills Hub is a community plugin, not a DeepSeek product. The curated list is a recommendation, not a security guarantee; check the security report and SKILL.md before installing.
|
|
62
63
|
|
|
63
64
|
## Installed skills
|
|
64
65
|
|
package/README_ZH.md
CHANGED
|
Binary file
|
package/compatibility.json
CHANGED
package/docs/CATALOG.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Curated catalogue
|
|
2
|
+
|
|
3
|
+
The marketplace home list is a curated catalogue of a few hundred skills, not the upstream registries' full feeds. ClawHub holds ~81k skills and SkillHub ~110k native ones; a reader cannot choose from that, and the long tail is dominated by near-duplicates, copies and abandoned experiments.
|
|
4
|
+
|
|
5
|
+
## Files
|
|
6
|
+
|
|
7
|
+
| File | Role |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `catalog/curation.json` | Editorial source: categories, and for each skill its `source`, `slug`, `owner`, `category`, `featured`, Chinese `summary`, `tags`, and `allowSuspicious` when applicable. Edited by hand. |
|
|
10
|
+
| `src/catalog/skills.json` | Snapshot generated from the curation plus upstream metadata (name, stats, version, icon, license, security verdict). Shipped in `lib/` and served as the home list. |
|
|
11
|
+
| `scripts/catalog-refresh.mjs` | Regenerates the snapshot. `--check` reports without writing. |
|
|
12
|
+
|
|
13
|
+
Run `node scripts/catalog-refresh.mjs`, review the dropped entries it prints, then rebuild (`pnpm build`) so `lib/catalog/skills.json` follows.
|
|
14
|
+
|
|
15
|
+
## What is served from where
|
|
16
|
+
|
|
17
|
+
- **List, categories, catalogue search:** the snapshot. No upstream request; the source bar shows the snapshot's `generatedAt` as the fetch time.
|
|
18
|
+
- **Detail, files, install:** the owning registry, through the regular cache. Catalogue entries pin the ClawHub owner, because ClawHub slugs are not unique and the registry's first match for a popular slug is often a later copy by another author.
|
|
19
|
+
- **"Search all markets":** an explicit live search across both registries (`scope=market`). Results are labelled as not curated.
|
|
20
|
+
|
|
21
|
+
SkillHub's mirrors of ClawHub skills are not used for ClawHub entries: the mirror pipeline stopped on 2026-07-23, roughly one in ten mirrored skills lags its ClawHub version, and mirror files differ from the original (`skill-card.md` dropped, `_meta.json` added).
|
|
22
|
+
|
|
23
|
+
## Selection policy
|
|
24
|
+
|
|
25
|
+
Candidates were the top 1,500 ClawHub skills by downloads and the top 600 SkillHub native skills, reviewed per category for usefulness, popularity and distinctness (one or two per job, not five wrappers of the same API). Excluded:
|
|
26
|
+
|
|
27
|
+
- skills only meaningful inside OpenClaw/Clawdbot (gateway hooks, OpenClaw configuration, Clawdbot channels);
|
|
28
|
+
- paid versions, crypto trading or anything moving money automatically, fake engagement or mass account automation, adult content;
|
|
29
|
+
- SkillHub slugs that resolve to a different owner than the curated one (SkillHub's detail route is slug-only);
|
|
30
|
+
- ambiguous ClawHub slugs whose remaining owners are low-download copies (`summarize`, `find-skills`, `agent-browser`, `tavily-search`).
|
|
31
|
+
|
|
32
|
+
## Security policy
|
|
33
|
+
|
|
34
|
+
- ClawHub: the moderation verdict and the latest version's scan (VirusTotal, skillspector, LLM review). SkillHub: the vendor security reports.
|
|
35
|
+
- `malicious` or blocked: never listed.
|
|
36
|
+
- `suspicious`: listed only when the curation entry carries `allowSuspicious` with the reason, and shipped as `flagged` with that reason in `securityNote`. This is reserved for widely recommended skills whose finding is about disclosure or permission scope, not hidden behaviour. Skills that upload local content, update their own code from a remote source, or expose credentials are not exempted.
|
|
37
|
+
- A refresh re-checks every entry; a newly suspicious skill without `allowSuspicious` drops out of the snapshot.
|
|
38
|
+
|
|
39
|
+
A clean verdict is upstream's, not ours. Installing still shows the source and verdict, and installation never executes skill scripts.
|
package/docs/COMPATIBILITY.md
CHANGED
|
@@ -63,3 +63,15 @@ Automated regression uses the compiled plugin in separate Node HTTP host process
|
|
|
63
63
|
Adversarial review also covered the actual HTTP install entry point (a withdrawn manifest is rejected despite a fresh disk snapshot), first-response installation annotations without an `/installed` warmup, browser revalidation and per-page provenance, configuration changes during asynchronous cache reads and multi-step installation, snapshot integrity, oversized replacement invalidation, and abandoned temporary writes. Regression tests cover each behavior.
|
|
64
64
|
|
|
65
65
|
The automated evidence above is process-restart coverage rather than a full native acceptance run. Separately, the user authorized installation into the active desktop: a locally packed build was installed using the desktop's bundled package manager while it was stopped, then DeepSeek Harness **0.2.0-rc.2** was relaunched. The actual market loaded 24 entries from each source and wrote two list snapshots with a 60-minute lifetime. This smoke check does not claim a native restart-after-warm acceptance of every cached path. The supported Harness cohort remains unchanged.
|
|
66
|
+
|
|
67
|
+
### Curated catalogue, owner pinning and detail redesign
|
|
68
|
+
|
|
69
|
+
The home list now comes from the shipped curated catalogue, ClawHub reads are pinned to the card's author, and the market detail page follows the redesign (header with stats, overview/files/security/changelog tabs, rule-based "what this skill does" and "when it triggers", redesigned install confirmation). Verified with **ego-browser** against the published `@deepseek-ai/dsh@0.2.0-rc.2` runtime (all 278 Harness packages on the same cohort) in a disposable Web profile with temporary `DSH_HOME`/`DSH_AGENTS_HOME`, macOS arm64 / Node 26.7.0, from a tarball of this revision; the user's real profile and desktop app were not touched.
|
|
70
|
+
|
|
71
|
+
Recorded results: the home list rendered the 13 catalogue categories with counts and editor's picks dealt across categories, with no upstream list request. A flagged ClawHub skill (`self-improving-agent`) showed the suspicious scan chip, per-scanner reports including the LLM review text, the bundled `CHANGELOG.md` entry point, and an install dialog whose confirm button stayed disabled until the acknowledgement was checked. A SkillHub skill (`libai`) showed a passed scan, its catalogue category and sub-category tags. At a 720px panel the side rail moved below the document with no horizontal overflow; dark mode followed the host tokens. Installing `clawhub:weather` through the dialog wrote `"owner": "steipete"` to the sidecar and switched the page to installed; uninstalling removed the directory. `pnpm pack:check` passed 96 tests. Screenshots are kept locally in `artifacts/catalog-redesign-verify/`.
|
|
72
|
+
|
|
73
|
+
The catalogue home and the installed inventory were then brought onto the same visual system (white top band over a grey canvas of 14px-radius cards, shared chips, mono counts, black primary actions), and both detail pages now share one `SkillDetailShell`. Re-verified the same way: the home shows the catalogue total and list date instead of live source health, which appears only for an explicit all-markets search (28 live results for `pdf`, with per-source status); installing from a card switched it to installed; the installed list and its detail rendered in the shared layout; a 720px panel had no horizontal overflow and dark mode followed the host tokens. `pnpm pack:check` passed 96 tests.
|
|
74
|
+
|
|
75
|
+
## 0.0.3 release preparation — 2026-10-02
|
|
76
|
+
|
|
77
|
+
The 0.0.3 release commit changes only version metadata, documentation and the README screenshot on top of the revisions recorded above. The README marketplace screenshot was retaken with ego-browser from the packed 0.0.3 tarball in an isolated Web profile (same `@deepseek-ai/dsh@0.2.0-rc.2` cohort, temporary `DSH_HOME`/`DSH_AGENTS_HOME`). It shows the curated home and the community-plugin disclaimer. `pnpm pack:check` was rerun on the release commit. No package was published and no tag was pushed.
|
package/docs/CONTRACT.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Skills Hub 0.0.
|
|
1
|
+
# Skills Hub 0.0.3 implementation contract
|
|
2
2
|
|
|
3
3
|
This document describes the shipped code, not a migration plan. The TypeScript models in `src/market/types.ts`, `src/skills/installed.ts` and `src/client/api.ts` define the detailed wire shapes. Update this document with API changes.
|
|
4
4
|
|
|
5
5
|
## 1. Package and host
|
|
6
6
|
|
|
7
|
-
The package is `@nanmicoder/dsh-skills-hub`, version `0.0.
|
|
7
|
+
The package is `@nanmicoder/dsh-skills-hub`, version `0.0.3`. Its supported host package cohort is exactly `0.2.0-rc.2`; the desktop release line is 0.2.0. The exact upstream tag and commit are recorded in `compatibility.json` and [COMPATIBILITY.md](COMPATIBILITY.md).
|
|
8
8
|
|
|
9
9
|
`cordis.patch.yml` inserts one row (`id: skills-hub`) named after the scoped package. `lib/index.js` is the host entry. `lib/client.js` is the browser factory registered with `window.__ModuleLoader__.load` under that same package name. The plugin adds a global sidebar panel and does not replace built-in components or require an agent session.
|
|
10
10
|
|
|
@@ -55,7 +55,9 @@ After mutations the plugin refreshes its installed lookup. Harness's filesystem
|
|
|
55
55
|
|
|
56
56
|
## 4. Marketplace models and limits
|
|
57
57
|
|
|
58
|
-
Providers normalize ClawHub and SkillHub into `NormalizedSkill`. A market ID is `clawhub:<slug>` or `skillhub:<slug>`. The model includes name/summary/author, statistics, tags, version, security status and installation state. SkillHub mirrors may be deduplicated into their ClawHub originals.
|
|
58
|
+
Providers normalize ClawHub and SkillHub into `NormalizedSkill`. A market ID is `clawhub:<slug>` or `skillhub:<slug>`. The model includes name/summary/author, statistics, tags, category, version, security status and installation state. SkillHub mirrors may be deduplicated into their ClawHub originals.
|
|
59
|
+
|
|
60
|
+
The home list is the curated catalogue (`docs/CATALOG.md`): a snapshot shipped in `lib/catalog/skills.json`, listed, categorised and searched locally with no upstream request. Its categories are the catalogue's own. Opening, previewing and installing a catalogue skill still read the owning registry; catalogue entries pin the ClawHub owner so an ambiguous slug resolves to the curated skill, and the detail overlays the catalogue's category, pick flag and Chinese summary on the live record. Live upstream listing and search remain available as the explicit `market` scope.
|
|
59
61
|
|
|
60
62
|
`NormalizedSkillDetail` adds Markdown `description`, optional frontmatter/license, `files` and `totalSize`. File metadata includes relative path, byte size, language, optional hash/content type and `tooBig`. File previews include `content`, `size`, `language` and `truncated`.
|
|
61
63
|
|
|
@@ -83,10 +85,11 @@ All paths below are relative to `/api/skills-hub`.
|
|
|
83
85
|
| --- | --- | --- |
|
|
84
86
|
| GET | `/status` | `{ sources }` keyed by market source. |
|
|
85
87
|
| GET | `/stats` | `{ stats }` cache counters: `hits`, `misses`, `staleServed`, `upstreamRequests`, `forcedRefreshes`. |
|
|
86
|
-
| GET | `/
|
|
87
|
-
| GET | `/skills
|
|
88
|
-
| GET | `/skills/:source/:slug
|
|
89
|
-
|
|
|
88
|
+
| GET | `/categories` | `{ items: MarketCategory[], status }`: catalogue categories with their skill counts; `status.fetchedAt` is the snapshot time. |
|
|
89
|
+
| GET | `/skills?q=&scope=&category=&source=&security=&installed=&cursor=&limit=&refresh=` | `{ items, nextCursor, sources }`. |
|
|
90
|
+
| GET | `/skills/:source/:slug?refresh=&owner=` | `{ skill, sourceStatus }`. |
|
|
91
|
+
| GET | `/skills/:source/:slug/file?path=…&owner=` | `{ file }`. |
|
|
92
|
+
| POST | `/install`, JSON `{ id, owner? }` | `{ ok: true, installedPath, skill }`. |
|
|
90
93
|
| POST | `/uninstall`, JSON `{ id }` | `{ ok: true, removedPath, skill }`; market-managed installation only. |
|
|
91
94
|
| GET | `/installed` | `{ items: InstalledSkillRecord[] }`; no provider request. |
|
|
92
95
|
| GET | `/installed/detail?key=…` | `{ item, markdown, frontmatter, files }`; reads the selected local copy, its raw YAML header and its own file inventory. |
|
|
@@ -95,13 +98,15 @@ All paths below are relative to `/api/skills-hub`.
|
|
|
95
98
|
|
|
96
99
|
`refresh` is `1`/`true` or `0`/`false` (absent means false); any other value is a `BAD_REQUEST`, because a refresh the Host cannot honour would let the panel present a cached answer as a fresh one. A refresh skips fresh cache entries for that request and rewrites them with what upstream returned.
|
|
97
100
|
|
|
98
|
-
|
|
101
|
+
ClawHub slugs are shared across authors, so `clawhub:<slug>` does not name one skill. `owner` (`[A-Za-z0-9][A-Za-z0-9_.-]{0,63}`; malformed is `BAD_REQUEST`) pins detail, file and install reads to the author of the card the reader opened; the panel sends it for every ClawHub card, list items carry it in `author.handle`, and the install sidecar records it so the installed view reopens the same skill. Without one, the Host uses the catalogue's pinned owner, then an owner it resolved earlier, and only then resolves a 409 `AMBIGUOUS_SKILL_SLUG` to the most-downloaded candidate — never the registry's first-listed match, which for popular slugs is routinely a later copy. Detail and file cache keys include the owner. An install whose detail resolves to a different author than requested is refused. A live search page shows one card per slug; a SkillHub mirror folds into a ClawHub original only when both name the same author.
|
|
102
|
+
|
|
103
|
+
List `scope` is `catalog` (default) or `market`. With `catalog`, every filter runs on the snapshot before pagination and `sources` carry the snapshot time with `fromCache: true`; `refresh` has nothing to re-read. With `market`, the list is the live merged upstream feed described above and `category` is ignored. `category` is absent, `all`, or a category key (`[a-z0-9][a-z0-9-]{0,63}`). List `source` is `all`, `clawhub` or `skillhub`. `security` is `all`, `verified`, `benign`, `unknown` or `flagged`. `installed` is `all`, `installed` or `installable`; this filters the remote catalog and is distinct from the independent Installed view. `limit` is 1–100, defaulting to configured `pageSize`. Cursors are opaque and `null` means exhausted.
|
|
99
104
|
|
|
100
105
|
### 5.3 Interaction contract
|
|
101
106
|
|
|
102
107
|
The marketplace shows skeleton cards on initial loading and a detail skeleton immediately after opening a card. An intersection observer inside the actual list scroll area loads the next page as the sentinel approaches view. It preserves loaded cards, deduplicates results and avoids concurrent duplicate loads. Pagination failures expose retry without discarding existing results.
|
|
103
108
|
|
|
104
|
-
Search/filter changes cancel superseded requests, reset pagination and reject stale responses. Installed management has its own loading, empty, error, search and refresh states. Its local detail reads the exact selected entry, and removal requires a confirmation showing its path; symlink removals explain that the target is preserved. Successful mutations update the displayed list and installed state. Buttons expose disabled/pending state during mutations.
|
|
109
|
+
A category bar above the filters shows the catalogue categories. A catalogue search offers to repeat the query across all markets (`scope=market`, labelled as not curated); clearing the query returns to the catalogue. Search/filter/category changes cancel superseded requests, reset pagination and reject stale responses. Installed management has its own loading, empty, error, search and refresh states. Its local detail reads the exact selected entry, and removal requires a confirmation showing its path; symlink removals explain that the target is preserved. Successful mutations update the displayed list and installed state. Buttons expose disabled/pending state during mutations.
|
|
105
110
|
|
|
106
111
|
Both detail pages are full-panel views built on one shell (`SkillDetailShell`): the list is replaced, focus moves to the heading, and a back control returns to it. The market page keeps its tab and selected file in `MarketState`; the local page keeps them in its own state and never unmounts the inventory list, so the query and rows survive the round trip. The local page shows only what the filesystem proves — path, provenance, size, installed time, layout, the rendered SKILL.md and its own files — and omits market-only rows (author, downloads, security reports) rather than showing zeros. A skill with valid market provenance also offers "view in marketplace", which switches to the market section and opens its provider-backed page: upstream facts stay upstream, and the local page stays readable offline.
|
|
107
112
|
|
package/docs/RELEASE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Release 0.0.
|
|
1
|
+
# Release 0.0.3
|
|
2
2
|
|
|
3
|
-
Package: `@nanmicoder/dsh-skills-hub`. Repository: `NanmiCoder/dsh-skills-hub`. Tag: `v0.0.
|
|
3
|
+
Package: `@nanmicoder/dsh-skills-hub`. Repository: `NanmiCoder/dsh-skills-hub`. Tag: `v0.0.3`. npm channel: `latest`. This plugin release is independent of the host's `0.2.0-rc.2` version and retains that exact compatibility cohort.
|
|
4
4
|
|
|
5
5
|
## Before publication
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ Package: `@nanmicoder/dsh-skills-hub`. Repository: `NanmiCoder/dsh-skills-hub`.
|
|
|
11
11
|
|
|
12
12
|
## GitHub Actions publication
|
|
13
13
|
|
|
14
|
-
Publication runs online in `.github/workflows/release.yml`, matching the AgentTeams release model. Push `v0.0.
|
|
14
|
+
Publication runs online in `.github/workflows/release.yml`, matching the AgentTeams release model. Push `v0.0.3` to trigger it, or dispatch the workflow with an explicit version. Both Node 22.19 and 24 must pass validation. The Node 24 job uploads the built tarball and SHA-256 checksum; the publication job verifies and publishes that exact artifact using npm 11.19.0. It does not rebuild during publication. A GitHub Release is published only after npm succeeds.
|
|
15
15
|
|
|
16
16
|
Configure npm Trusted Publishing for GitHub owner `NanmiCoder`, repository `dsh-skills-hub`, workflow `release.yml`, environment `npm`, allowing direct publication. OIDC uses `id-token: write`; routine releases need no local npm login and no stored npm token. The existing AgentTeams trust binding is package-specific and does not authorize this new package.
|
|
17
17
|
|
|
@@ -21,4 +21,4 @@ Before tagging, commit all source and generated artifacts, confirm the version a
|
|
|
21
21
|
|
|
22
22
|
## After publication / recovery
|
|
23
23
|
|
|
24
|
-
Install `@nanmicoder/dsh-skills-hub@0.0.
|
|
24
|
+
Install `@nanmicoder/dsh-skills-hub@0.0.3` into an isolated profile and repeat the smoke flow. Compare the downloaded package and expected version before announcing availability. If a release is faulty, publish a new fixed version or deprecate the faulty version with a clear message; do not rewrite published Git tags or assume deleting a GitHub Release retracts npm. Preserve user skills when removing or replacing the plugin.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curated catalogue — the marketplace's home list.
|
|
3
|
+
*
|
|
4
|
+
* The upstream registries hold ~80k ClawHub and ~110k SkillHub skills; nobody
|
|
5
|
+
* chooses from that. The home list is instead a few hundred skills reviewed in
|
|
6
|
+
* this repository (`catalog/curation.json`) and snapshotted by
|
|
7
|
+
* `scripts/catalog-refresh.mjs` into `skills.json`, which ships with the plugin.
|
|
8
|
+
*
|
|
9
|
+
* Only the *list* comes from the snapshot. Opening a card, reading a file and
|
|
10
|
+
* installing still go to the owning registry (through the usual cache), so a
|
|
11
|
+
* reader never installs the snapshot's version of anything.
|
|
12
|
+
*/
|
|
13
|
+
import data from './skills.json' with { type: 'json' };
|
|
14
|
+
import { skillId, } from "../market/types.js";
|
|
15
|
+
const catalog = data;
|
|
16
|
+
export function getCatalog() {
|
|
17
|
+
return catalog;
|
|
18
|
+
}
|
|
19
|
+
const bySkillId = new Map(catalog.skills.map((entry) => [skillId(entry.source, entry.slug), entry]));
|
|
20
|
+
export function catalogEntryFor(source, slug) {
|
|
21
|
+
return bySkillId.get(skillId(source, slug));
|
|
22
|
+
}
|
|
23
|
+
/** Category bar entries, in editorial order, with how many skills each holds. */
|
|
24
|
+
export function catalogCategories() {
|
|
25
|
+
const counts = new Map();
|
|
26
|
+
for (const entry of catalog.skills)
|
|
27
|
+
counts.set(entry.category, (counts.get(entry.category) ?? 0) + 1);
|
|
28
|
+
return catalog.categories
|
|
29
|
+
.map((category, index) => ({ ...category, sortOrder: index, count: counts.get(category.key) ?? 0 }))
|
|
30
|
+
.filter((category) => category.count > 0);
|
|
31
|
+
}
|
|
32
|
+
/** ClawHub owners the catalogue pins, for the provider's slug disambiguation. */
|
|
33
|
+
export function catalogClawhubOwners() {
|
|
34
|
+
return catalog.skills.filter((entry) => entry.source === 'clawhub').map((entry) => [entry.slug, entry.owner]);
|
|
35
|
+
}
|
|
36
|
+
export function catalogEntryToSkill(entry) {
|
|
37
|
+
return {
|
|
38
|
+
id: skillId(entry.source, entry.slug),
|
|
39
|
+
source: entry.source,
|
|
40
|
+
slug: entry.slug,
|
|
41
|
+
name: entry.name,
|
|
42
|
+
summary: entry.summary,
|
|
43
|
+
author: { handle: entry.owner },
|
|
44
|
+
stats: { ...entry.stats },
|
|
45
|
+
tags: [...entry.tags],
|
|
46
|
+
category: entry.category,
|
|
47
|
+
version: entry.version,
|
|
48
|
+
updatedAt: entry.updatedAt,
|
|
49
|
+
iconUrl: entry.iconUrl,
|
|
50
|
+
securityStatus: entry.security,
|
|
51
|
+
requiresApiKey: entry.requiresApiKey,
|
|
52
|
+
featured: entry.featured === true ? true : undefined,
|
|
53
|
+
installState: 'installable',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Fold case and width so `GitHub`, `github` and full-width input all match. */
|
|
57
|
+
function fold(text) {
|
|
58
|
+
return text.normalize('NFKC').toLowerCase();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Entries matching every whitespace-separated term, in catalogue order.
|
|
62
|
+
*
|
|
63
|
+
* A name/slug hit ranks above a summary or tag hit: typing a skill's name
|
|
64
|
+
* should put that skill first, not the one that mentions it most.
|
|
65
|
+
*/
|
|
66
|
+
export function filterCatalog(params) {
|
|
67
|
+
const terms = fold(params.q ?? '').split(/\s+/).filter(Boolean);
|
|
68
|
+
const strong = [];
|
|
69
|
+
const weak = [];
|
|
70
|
+
for (const entry of catalog.skills) {
|
|
71
|
+
if (params.category && entry.category !== params.category)
|
|
72
|
+
continue;
|
|
73
|
+
if (params.source && params.source !== 'all' && entry.source !== params.source)
|
|
74
|
+
continue;
|
|
75
|
+
if (terms.length === 0) {
|
|
76
|
+
strong.push(entry);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const head = fold(`${entry.name} ${entry.slug}`);
|
|
80
|
+
const body = fold(`${entry.summary} ${entry.summaryEn ?? ''} ${entry.tags.join(' ')} ${entry.owner}`);
|
|
81
|
+
if (!terms.every((term) => head.includes(term) || body.includes(term)))
|
|
82
|
+
continue;
|
|
83
|
+
if (terms.every((term) => head.includes(term)))
|
|
84
|
+
strong.push(entry);
|
|
85
|
+
else
|
|
86
|
+
weak.push(entry);
|
|
87
|
+
}
|
|
88
|
+
return [...strong, ...weak];
|
|
89
|
+
}
|