Installation
npx -y @deepseek-ai/dsh plugin --profile web add github:1e0zj/dsh-plugin-mallThis installation command is an unverified starting point generated from the GitHub repository address.
README
Maintainer-authored documentation snapshot.
dsh-plugin-mall
An open plugin marketplace for DeepSeek Harness (dsh): search every GitHub repo tagged topic:dsh-plugin, automatically verify which ones are real dsh plugins, install and update with one click.
中文说明 · Install · Why another marketplace
Two surfaces: a Settings → Plugins → Marketplace tab in the dsh web UI, and five agent tools usable from any session.
Why another marketplace?
Curated lists only show what has been reviewed and merged. This marketplace is open by construction: any repo tagged topic:dsh-plugin is discoverable the moment it is pushed — no submission, no approval queue. To keep that openness usable:
- Automatic verification — every search result's
package.jsonis fetched (jsDelivr/raw dual-source CDN, no API quota) and checked for the officialdsh.bundle/dsh.clientmanifest. Verified plugins get a green badge; the default "verified only" view filters out ~73% of topic noise (empty repos and unrelated projects riding the tag). - Anti-squatting — an install prefers the npm tarball only when the registry entry's
repositoryURL points back to the same GitHub repo; anything else falls back to the explicitgithub:spec. - npm-first installs — registry tarballs are smaller than whole-repo GitHub downloads and come with integrity checks. Lookups follow the registry pnpm actually installs from (profile
.npmrc→pnpm config get registry→ npmjs), so a mirror user keeps npm-first instead of silently falling back to whole-repo clones. - Update management — installed plugins are compared against the registry
latest; one-click update per plugin. - Resilience — rate-limit circuit breaker, GitHub's 1000-result search window handled gracefully,
corepack enable pnpmself-heal when pnpm is missing, one-click dsh restart (loopback-only,allowRestart: falseto disable).
Install
# from npm
dsh plugin --profile web add @1e0zj/dsh-plugin-mall
# from GitHub
dsh plugin --profile web add github:1e0zj/dsh-plugin-mall
# local development — currently unusable, see the note below
dsh plugin --profile web add link:C:\path\to\dsh-plugin-mall
Restart dsh after installing.
link:cannot be set up right now, for reasons upstream of this plugin. Underlink:Node loads from the project's real path, so bare imports must resolve from the project's ownnode_modules— which requiresnpm installinside the project first. That fails: the framework packages' registry dist-tags currently straddle two release trains (dsh-toolslatest is still0.0.1-rc.xwhiledsh-app-bootis on0.1.0-rc.x), their peer ranges do not intersect, and npm stops with ERESOLVE. Neither escape hatch helps —--legacy-peer-depsskips peers so bare imports still will not resolve, and--forceplants a mixed-train copy of the framework inside the project, whichlink:would then load instead of the host's, causing exactly the duplicate-module crash described under 开发说明. Until those dist-tags line up, develop against a local tarball —npm pack, then install the.tgzwith afile:spec (recipe in the 安装 section below). Do not hand-overwrite files undernode_modules: they are hard-linked into pnpm's global store, and any laterpnpm add/removerebuilds the tree and restores them anyway.
Agent tools
| Tool | What it does |
|---|---|
market_search | Search GitHub repos tagged topic:dsh-plugin (star-ranked, keyword filter, server-side stars:>=1 noise floor) |
market_info | Inspect one repo: stars, license, package.json, whether it declares dsh.bundle.patch / dsh.client |
market_install | Install a plugin into a profile as a background job (npm-first spec resolution) |
market_uninstall | Remove a plugin: pnpm remove + bundle-layer reconcile + client-row cleanup |
market_installed | List a profile's installed plugins and their bundle status |
中文说明
dsh 插件市场 — 搜索 GitHub dsh-plugin 话题下的 DeepSeek Harness 插件仓库,自动验证哪些是真 dsh 插件,一键安装与更新。
与策展列表不同:任何打上 topic:dsh-plugin 的仓库推送后立即可被发现——无需投稿、无需审批。为保证开放性可用,做了这些事:
- 自动验证:逐仓库拉取
package.json(jsDelivr/raw 双源 CDN,不占 API 配额),按官方dsh.bundle/dsh.client声明打徽章;默认"只看已验证"视图过滤约 73% 的话题噪音 - 防抢注:仅当 npm registry 条目的
repository指回同一 GitHub 仓库时才用 npm 安装,否则回退github:源 - npm 优先安装:registry tarball 比整仓库下载更小且带完整性校验;查询用的 registry 跟随 pnpm 实际安装源(profile
.npmrc→pnpm config get registry→ npmjs),换了镜像也不会退化成整仓库克隆 - 更新管理:已装插件与 registry
latest比对,逐个一键更新 - 工程韧性:限流熔断、GitHub 1000 条搜索上限优雅处理、pnpm 缺失时
corepack自愈、一键重启 dsh(仅 loopback,可allowRestart: false关闭)
安装
# 从 npm
dsh plugin --profile web add @1e0zj/dsh-plugin-mall
# 从 GitHub
dsh plugin --profile web add github:1e0zj/dsh-plugin-mall
# 本地开发 —— 目前装不起来,见下方说明
dsh plugin --profile web add link:C:\path\to\dsh-plugin-mall
装完重启 dsh(dsh web 进程)后生效。
link:目前用不了,原因在上游、与本插件无关。link:下 Node 从项目的真实 路径加载模块,裸导入只能从项目自己的node_modules解析,所以得先在项目里npm install一次 —— 而这一步会失败:框架包在 registry 上的 dist-tags 眼下横跨 两条发布线(dsh-tools的 latest 还停在0.0.1-rc.x,dsh-app-boot已经是0.1.0-rc.x),二者对dsh-invariants的 peer 区间无交集(^0.0.1-rc.x只收0.0.1-rc.x,^0.1.0-rc.x只收0.1.x),npm 以 ERESOLVE 中止。 两个逃生口都不解决问题:--legacy-peer-deps跳过 peer,裸导入照样解析不了;--force会在项目里装一套混版本的框架副本,link:加载的就是那套而不是宿主 那套 —— 正好踩中下面「开发说明」里讲的双副本身份分裂崩溃。在上游 dist-tags 对齐前,本地开发用本地 tarball:
npm pack # 产出 1e0zj-dsh-plugin-mall-<ver>.tgz dsh plugin --profile web remove @1e0zj/dsh-plugin-mall dsh plugin --profile web add file:C:\code\dsh-plugin-mall\1e0zj-dsh-plugin-mall-0.1.13.tgz这样 pnpm 的规范副本本身就是新代码,后续任何
pnpm add/remove重建依赖树都不会 把它换掉;顺带还验证了files字段没漏文件。改完代码重新npm pack+ 重装即可。不要用直接覆盖
node_modules里文件的办法。 它有两个坑: 一是 pnpm 装出来的文件是硬链接(与全局 store 共享 inode),直接cp覆盖会 穿透硬链接改掉 store 里的内容且 pnpm 不会察觉,必须先rm再写;二是任何一次 pnpm 操作都会重建整棵树,按 lockfile 从 store 把你覆盖的文件还原回去 —— 而通过 本插件装/卸任何插件都会触发pnpm add/remove,也就是说测试市场的安装功能这个动作 本身就会抹掉被测代码。(已加载进内存的模块不受影响,重启后才会退回旧版。)通过 npm/GitHub 安装则没有上述任何问题:pnpm 把真实拷贝装进 profile 的
node_modules,框架包由宿主经profiles/node_modules里指向全局 dsh 的软链提供, 版本天然一致。另:Windows 上
file:/link:的路径不能含空格。pnpm 是经 cmd 拉起的, Node 只把参数用空格拼接、不逐参加引号,带空格的路径会被拆成两个参数; 自己加引号也不行("属于被拦截的 shell 元字符)。市场会直接拒绝并说明原因。
工作原理
- 双面包(dual-face)插件:
dsh.bundle半边挂在 host 平面(profile bundle 层), 注册 5 个 agent 工具(进 global 层,所有会话可见,与 MCP 工具同理);dsh.client半边是浏览器插件,往设置页插件区注册「插件市场」tab (settings.plugins.tabslot;手写无构建,经window.__ModuleLoader__加载)。 - 浏览器 → 服务端走 Connection 服务的独立 RPC 通道
/market(loopback-only,与/api通道互不干扰);页面发起的安装任务用进程内 tracker 跟踪 —— web host 层没有 job 控制器,ctx.jobs无法在会话外起任务。 market_install复刻官方dsh plugin add的流程:在 profile 目录跑pnpm add <spec>,成功后把声明了dsh.bundle.patch的依赖登记进dsh.profile.bundles(layer 列表),声明了dsh.client的依赖自动在 profile 的cordis.patch.yml注册加载行,与官方 reconcile 逻辑一致。market_uninstall复刻官方dsh plugin remove的流程:在 profile 目录跑pnpm remove <package>,成功后从dsh.profile.bundles剔除该依赖的 bundle 条目,并删掉cordis.patch.yml里由安装流程注册的客户端加载行 (文本级精准移除,用户手写的行不受影响)。- 安装源解析:
github:owner/repo优先改写为同名 npm 包(仅当 registry 条目的 repository 指回该仓库,防止抢注),否则用 GitHub 全仓库 spec。 - GitHub 源的插件安装时要跑 prepare 构建脚本,pnpm 默认拦截;本插件检测到
拦截后会把包名自动合并进 profile 的
pnpm-workspace.yaml的allowBuilds并自动重试一次(解析只认合法 npm 包名,写入一律加引号,不会写坏 YAML)。 - 配置(
cordis.patch.yml中可改):defaultProfile(默认装进哪个 profile, 默认web)、apiBase(GitHub API 地址)、npmRegistry(npm 查询源,留空 则跟随 pnpm 实际安装源)、rawSources(验证用的 package.json 源模板列表,{repo}会替换成 owner/name,留空用内置的 jsDelivr + raw 双源)、perPageMax(搜索单页上限)、allowRestart(是否允许一键重启,默认true)。
发布
npm publish --access public
# 或在 GitHub 建仓库并打上 topic:dsh-plugin
开发说明
- 插件形态:
package.json里"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }, patch 文件把dsh-plugin-mall这一行 insert 进装配树;同一行同时是 client 插件行(dsh.client声明让 client-modules 扫描并服务/plugins/<id>/client.js)。 @deepseek-ai/*框架包必须声明为peerDependencies:装成 dependencies 会把宿主模块副本 hoist 进 profile,cordis loader 双副本加载、Symbol 身份 分裂,宿主的工具调度全线崩溃。宿主经profiles/node_modulesfallback 提供框架包。- node 半边导出具名成员
{ name, inject, Config, apply },不要export default(cordis loader 会做exports.default ?? exports解包,default 会吞掉 inject/Config); client 半边是window.__ModuleLoader__.load({id, factory}),导出{ apply, inject }。 - 单测
src/github.js(无 harness 依赖):node src/github.js --self-test。
Repository information
- Language
- JavaScript
- License
- MIT
- Last updated
- Aug 17, 2026, 8:05 AM
Install deliberately
Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.