Bundle
dsh-skill-recommender
Skill recommender for DeepSeek Harness: browse local Codex/Claude/DSH session records, derive a user profile, and recommend suitable open-source skills with a tunable weighted match index (higher index = higher-relevance only). Tools + Web settings panel.
- Source
- zhengjy01
- License
- MIT
- Updated
- Updated 18 hours ago
Readme
# dsh-skill-recommender
A **skill recommender** for [DeepSeek Harness](https://github.com/deepseek-ai/dsh). It browses your **local session records across Codex, Claude and DSH**, builds a compact **user profile**, ingests an **open-source skill catalog**, and ranks skills with a **weighted score gated by a tunable match index** — the higher the index, the higher-relevance the recommendations only.
## What it does
1. **Reads sessions** from three agent sources — DSH (`~/.dsh/sessions/**/session.jsonl.zstd`), Codex (`~/.codex/*.jsonl`), Claude (`~/.claude/projects/**/*.jsonl`) — no API keys, purely local file reads.
2. **Builds a profile**: topic distribution, high-frequency tools, task types, common project directories, language/model source.
3. **Ingests a skill catalog**: local skill dirs (`~/.agents/skills`, `~/.dsh/skills`, your Obsidian `2️⃣ AI/Skill`) + remote awesome lists (`awesome-dsh-skills`, `awesome-dsh-plugin`, `awesome-deepseek-harness`, Claude skills ecosystem), plus a small bundled seed so it always returns something.
4. **Scores & ranks** with a weighted model: `score = Σ(w_i × sim_i) / Σ(w_i)`, where dimensions are topic / tool / task / proximity-to-installed. A global **match index** (0–100, default 60) is the gate: only skills with `score ≥ index` are returned, then top-N.
## Why it's different from `dsh-skill-studio`
`dsh-skill-studio` **extracts** reusable skills *from your own sessions*. This plugin **recommends third-party open-source skills** by extrapolating your profile. They complement each other.
## Tools (model-facing)
| Tool | Purpose |
| --- | --- |
| `recommender_scan` | Scan sessions, build the profile, produce an initial recommendation run. |
| `recommender_recommend` | Recommend open-source skills; optionally override `index` / `topN` / `weights` on the fly. |
| `recommender_profile` | Show the current user profile (topics, tools, tasks, projects). |
| `recommender_config` | Configure sources, catalogs, window, match index, per-dimension weights, optional LLM enrichment. |
| `recommender_status` | Show plugin status without leaking secrets. |
## Web settings panel
A **Skill 推荐器** card in the Web settings page: scan button, live **匹配指数 slider** (0–100), four **per-dimension weight sliders** (topic / tool / task / proximity), catalog toggles, and recommendation cards with scores, per-dimension breakdowns and a GitHub link. The index + weights are saved to `~/.dsh/dsh-skill-recommender/config.json` (mode `0600`).
## Compatibility
Requires **DeepSeek Harness ≥ 0.1.5-rc.1** (declared as `dsh.engines.dsh` in the package manifest, so the DSH plugin marketplace can report it) and is verified against **0.1.5-rc.1**. This build carries the DSH 0.1.5 adaptations: the strict tool-result contract (lossless-JSON snapshot, `additionalProperties: false` schema validation, and `output.render` returning `ContentBlock[]`) plus executable resolution that survives a launchd-started host whose `PATH` is only `/usr/bin:/bin`.
## Install (development)
```bash
dsh plugin add --profile web link:/path/to/dsh-skill-recommender
```
Then restart the host (tools + routes) and hard-refresh the browser (client panel). Config key: `skill-recommender` in the bundle patch layer.
## Build
```bash
pnpm install
pnpm bundle # builds lib/index.js (ESM) + lib/client.js (browser bundle)
node tests/smoke.mjs
```
## Notes
- The default weight model is `{topic: 50, tool: 50, task: 35, near: 40}`; the index gate defaults to `60`.
- **Whole-web discovery**: the default `github-discovery` source queries the GitHub search API across the **entire platform** (agent/claude/codex skills, `SKILL.md`, `awesome skills` — 星标排序), so recommendations are not limited to one designated list. Results are cached (6h TTL); the unauthenticated search limit (10 req/min) is respected.
- **Skills vs plugins**: each catalog is tagged `skill` or `plugin`. By default only **skills** are recommended (`types: ['skill']`); tick **含插件** in the panel to also include DSH plugins. Both markdown lists and tables are parsed (DSH *skill* catalogs use tables).
- Remote catalogs are fetched with a 12s timeout and cached (6h TTL); offline runs fall back to the cache + bundled seed.
- **Background auto-scan**: set `autoScanMinutes` (default `60`, `0` = off) in the panel — the host refreshes the cached result in the background, and the panel shows the last result instantly on open. The cache is persisted to `~/.dsh/dsh-skill-recommender/last-result.json` (0600).
- No secrets are stored or echoed; LLM enrichment (optional) reuses OpenAI-compatible config, keys never returned.
## License
MIT
## 安装 / Install
```sh
# from npm (published package)
dsh plugin --profile web add dsh-skill-recommender
# or local development
dsh plugin --profile web add link:/path/to/dsh-skill-recommender
# then restart dsh web to activate
```
Install
dsh plugin --profile web add github:zhengjy01/dsh-skill-recommender
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-skill-recommender from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.