Browse the awesome-dsh-plugin catalog from a dedicated page opened through the DSH left sidebar. Search, filter by category or installed state, and sort by stars, downloads, name or date added. Three tabs show all, installed and updatable plugins, with a separate count when update status cannot be determined. Install into the active Web or Desktop profile using the package manager supplied by DSH, while preserving disabled bundles. Reload the profile through HMR when available, with restart guidance otherwise. Installed state is isolated per profile, installation and reload requests are mutually exclusive, and pagination keeps the submitted search. The catalog is cached locally for one hour, with mirror, CDN and npm fallbacks.
Install
# from npm (prebuilt)
dsh plugin --profile web add @99galaxy/dsh-plugin-market
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:99galaxy/dsh-plugin-market
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
This plugin publishes its README in Chinese only.
从 DeepSeek Harness 的左侧栏打开插件市场,一键安装。
A sidebar plugin-market page for DeepSeek Harness: browse the community catalog, see what you already have on its own tab, and install with one click.
数据来自 awesome-dsh-plugin 维护的
官方目录 plugins.json —— 约 4,400+ 个插件、23 个双语分类,带 Star 数、下载量、收录日期,
以及每个条目的官方安装命令。
它做什么
左侧栏新增 「插件市场」 入口,点击后在主区域打开独立页面。页面内有三个标签:
| 标签 | 内容 |
|---|---|
| 全部插件 | 完整目录。可按分类筛选、按 Star/下载量/名称/收录时间排序、搜索插件名或简介 |
| 已安装 | 只列出你已经装过的插件,标签上直接显示数量 |
| 可更新 | 只列出装了但目录里有更新版本的插件,标签上直接显示数量 |
- 一键安装:点「安装」即执行该条目的官方安装命令,装到当前 profile
- 安装状态:已安装的条目带绿色徽章;若目录名与你实际装的包名不同,会标出真实包名
- 更新检测:拿目录里的
version和 profile 里实际装的版本比对,有更新的挂橙色徽章 「可更新 1.47.0(当前 1.46.1)」,按钮从「重新安装」变成「更新」 - 中英切换:简介可切中文/英文
- 本地缓存:目录存到本地,1 小时内直接复用;要最新的点「强制重新获取」
- 一键重载 profile:装完插件点「重载 profile」,通过 DSH 的 HMR 重新组合当前 profile,不必重启;没有 HMR 的 profile 会提示你重启
- 四级降级:官方域名 → 镜像 → CDN → npm,任一条通即可
安装
这是一个 DSH bundle:装进 profile 后重启 DSH 自动加载。
cd ~/.dsh/profiles/web # Web 版;DSH 桌面版换成 desktop
pnpm add github:99galaxy/dsh-plugin-market
也可以显式用 HTTPS 地址:
pnpm add https://github.com/99galaxy/dsh-plugin-market
装进来的包名是 @99galaxy/dsh-plugin-market —— 与仓库名不同,所以下面层列表里要写这个
带 scope 的名字。
DSH 0.2.x 桌面版跑的是
desktopprofile。插件会通过ctx.profileContext.name自动识别当前 profile,所以页面里的「安装」不需要你在命令里写死--profile。
然后把它加进 package.json 的层列表 —— 声明了 dsh.bundle 的依赖才会被加载:
{
"dsh": {
"profile": {
"bundles": ["...", "@99galaxy/dsh-plugin-market"]
}
}
}
重启 DSH。
github:前缀在部分 git 配置下会被解析成git+ssh,而匿名 HTTPS 不需要任何凭据。 若 pnpm 报找不到仓库或索要 SSH 密钥,改用上面的 HTTPS 形式。
使用
- 点击左侧栏的 插件市场
- 浏览或搜索;点卡片右侧「安装」
- 安装完成后点工具栏的「重载 profile」;没有启用 HMR 的 profile 仍需重启 DSH
「已安装」标签里可以确认某个插件是否已经在你的 profile 里;「可更新」标签里是可以升级的那些。
关于「更新」:它执行的仍是目录里那条安装命令,所以装的是目录指定的那个来源 —— 一个用
github:装的插件,如果目录对应的条目是 npm 包名,更新后会变成 npm 包。 想留在固定 commit 上就别点更新。判断不了的插件:目录里没有
version、或目录根本没收录的插件,无法判断有没有更新。 它们不会出现在「可更新」标签里,但标签内会单独说明有多少个 —— 免得把「判断不了」误读成「已经是最新」。
架构
┌─ 浏览器半边 ────────────────────────────────────────────────┐
│ window.__ModuleLoader__.load({ id, factory(require) }) │
│ require('react');槽位服务由 ctx 注入 │
│ sidebar.panellist → 左侧栏「插件市场」入口 │
│ main → 独立的「DSH 插件市场」页面 │
│ 页面内三个标签:全部插件 / 已安装 / 可更新 │
│ 筛选、排序、分页、更新比对全部在宿主侧完成 │
└───────────────┬─────────────────────────────────────────────┘
│ fetch() ← 不是动态插件的私有 RPC,也不是 ctx.remote
┌───────────────▼─────────────────────────────────────────────┐
│ 宿主半边 index.js │
│ ctx.inject(['webServer']) → │
│ GET /dsh-plugin-market/list │
│ POST /dsh-plugin-market/install │
│ POST /dsh-plugin-market/reload │
│ 子进程输出经**文件描述符**捕获(非管道、非 shell) │
└───────────────┬─────────────────────────────────────────────┘
│ spawn(node, [market-core.mjs, …])
┌───────────────▼─────────────────────────────────────────────┐
│ market-core.mjs(真实文件,可单独运行) │
│ catalog 抓取/缓存目录(官方 → 镜像 → CDN → npm) │
│ installed 读 profile 依赖 + node_modules + 已装版本 │
│ install 优先用 DSH 提供的包管理器;CLI 回退到 pnpm │
└─────────────────────────────────────────────────────────────┘
为什么用 HTTP 而不是 ctx.remote
浏览器半边要调用宿主能力,但 ctx.remote.<ns> 的方法来自 DSH 的 Typert 代码生成 ——
本地手写的插件无法注册自己的命名空间(ctx.remote.$mount() 只接受生成的贡献)。
而 webserver 的命名路由注册是公开服务:
ctx.inject(['webServer'], (host) => {
host.webServer.register({ kind: 'exact', path: '…', handler: (req, res) => {} })
})
于是宿主暴露三条路由,浏览器半边用 fetch 调用。
HTTP 接口
| 方法 | 路径 | 入参 | 出参 |
|---|---|---|---|
GET |
/dsh-plugin-market/list |
bypass, category, q, sort, only, limit, offset(only 取 all / installed / notinstalled / updatable) |
{ ok, payload: { items, categories, count, total, matched, installedTotal, updatableTotal, unknownTotal, offset, sort, only, category, q, catalogFromCache, fetchedAt, catalogUpdated, source, note } } |
POST |
/dsh-plugin-market/install |
{ install, name? } |
{ ok, spec, seconds, log } |
POST |
/dsh-plugin-market/reload |
{} |
{ ok, warnings, pending, restartReason } |
items 里的每个条目除了插件本身,还带 installed / installedAs / installedVersion / update。
updatableTotal 是可更新数,unknownTotal 是判断不了的数(目录里没有版本,或目录没收录已声明的 bundle);普通 profile 依赖不计入。
更新判断只比对目录里的 version,不额外发任何网络请求。
bypass=1 是唯一的强制重新抓取旗标;只有「强制重新获取」按钮发它,其余调用都只做新鲜度检查。
三个标签都是页面内的:插件注册一个 sidebar.panellist 入口和对应的 main 页面,标签由页面自己渲染。
三条路由只接受同源调用(校验 Sec-Fetch-Site 与 Origin),安装和重载接口还要求
Content-Type: application/json —— 直接挂在 webServer 上的路由不受 DSH /api 那道
browser-trust fence 保护,所以插件自己拦。安装命令里的包名若以 - 开头会被拒绝
(它会成为 pnpm 的一个选项而不是包名)。
重载走 DSH 的 hmr 服务:hmr.runExclusive(() => hmr.reconcileProfile()),会把新装的
bundle 重新组合进运行中的 Loader 树。返回里的 pending 是仍需重启才能替换的模块,
restartReason 是 profile 级重启原因;两者都为空才会自动刷新页面。安装进行中会拒绝重载。
包内容
package.json 声明 dsh.bundle.patch 与 dsh.client.platform
cordis.patch.yml 把自己插进 profile 的层栈
index.js 宿主半边:三条 HTTP 路由
market-core.mjs 市场逻辑(生成物,请勿手改)
client/client.js 浏览器半边:左侧栏入口 + 主区域页面 + 页内三个标签
market-core.mjs 由源生成后一并提交,所以 clone 下来即可安装,不需要任何构建步骤。
许可
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-plugin-manager★ 9321
Plugin manager tab in DSH Settings → Plugins: install from npm or git with progress, enable/disable switches effective at next startup, conflict reconciliation with undo, and one-click hand-off to a fix session.
dsh-market/dsh-market★ 8235
Browse, search and install community plugins from inside DeepSeek Harness settings, with category filters, one-click updates, enable/disable, theme switching and configuration backup.
kingOfSoySauce/dsh-skin-market★ 246
Native skin marketplace and lifecycle manager that discovers community skins, displays previews and compatibility status, and provides verified one-click or manual installation paths.
awesome-dsh-plugin/dsh-find-plugin★ 204
Find plugins without leaving the agent: search this curated registry by keyword or category, with ready-to-run install commands.
bradeGithub/DSH-Plugins-Marketplace★ 188
GitHub-topic-driven plugin & skill marketplace: a Settings page that browses the auto-collected registry (the whole dsh-plugin topic plus the skills index, CI-refreshed every 2 hours) with one-click install, type detection, install-script and host-shadow-dependency safety confirmations, env-key management, and the STANDARD.md recognition spec.
Sanqi-normal/dsh-webui-market-plugin★ 104
In-harness plugin market for the dsh web GUI: browse the awesome-dsh-plugin.com catalog and install/uninstall plugins into a profile from Settings → Plugins → Plugin Market.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.