dsh-market 端到端测试专用夹具:在 DSH_HOME 写入存在性标记文件,证明插件安装与卸载链路真实生效。
ⓘ 此插件是大仓库 dsh-market/dsh-market 的子包,星数与活跃度统计的是整个仓库。
- 语言
- TypeScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add github:dsh-market/dsh-market/tests/web/fixtures/fixture-a在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 dsh-market/dsh-market/tests/web/fixtures/fixture-a:先查看仓库 https://github.com/dsh-market/dsh-market.git 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
这是 dsh-market 仓库内嵌的一个 E2E 测试夹具(fixture),通过向 DSH_HOME 目录写入一个 .alive 标记文件,让测试代码判断插件是否真的被 cordis 加载并按预期卸载。它不是给普通用户安装的功能插件。
核心能力
- 在
DSH_HOME目录下创建名为e2e-dshm-e2e-fixture-a.alive的标记文件,写入当前时间戳 - 通过
ctx.effect注册一次性副作用:插件加载时建立标记,卸载时自动删除 - 在
cordis.patch.yml中声明自身的 bundle 插入规则,模拟一个真实的社区插件注册流程 - 作为 ground-truth 探针,证明 install 链路(cordis 解析包 → 加载模块 → 执行
apply()→ 满足注入)完整跑通
技术实现
- 语言: JavaScript (ESM)
- 关键依赖:
node:fs、node:path(仅使用 Node 内置模块,无第三方依赖) - 架构模式: Cordis 注入式插件 ——
apply(ctx)通过ctx.inject(['webServer'], ...)等待宿主注入 webServer 服务,再用host.effect()注册可撤销的副作用 - 入口文件:
tests/web/fixtures/fixture-a/index.js
适用场景
仅供 dsh-market 自身的 tests/web/install.e2e.ts 等端到端测试使用。测试需要一种独立于插件市场内置 activation[name].state 推断的"插件是否真的活着"的判定方式 —— 因为该推断在历史 issue #103/#135/#147 中曾出过错。fixture-a 通过磁盘上文件的存在与否给出确定性答案,作为 ground truth。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 未声明 | 仅在 dsh-market 仓库的 e2e 测试场景中被引用 |
| Node | 未声明 | 使用了 node:fs、node:path,对应 Node.js 内置模块 |
| 平台 | 跨平台 | 仅依赖 Node.js 标准库,无系统调用 |
| 原生模块 | 无 | 全部为内置模块 |
安装方式
dsh plugin --profile web add github:dsh-market/dsh-market/tests/web/fixtures/fixture-a
配置项
本插件无需额外配置。
常见问题
Q: 这个插件能给普通用户用吗?
A: 不能。它是测试夹具,没有任何面向用户的功能;装上后只会生成一个隐藏的标记文件,看不到任何界面。
Q: 安装之后会留下什么痕迹?
A: 会在 DSH_HOME 环境变量指定的目录(未设置时是当前目录)下生成 e2e-dshm-e2e-fixture-a.alive 文件,里面是一段毫秒级时间戳。卸载时该文件会被自动移除。
Q: 标记文件为什么不用 HTTP 路由来做?
A: 源码注释说明:插件注册的 HTTP 路由在插件被 dispose 后仍然存活,所以基于路由的探针会把已禁用的插件误判为仍然活着。文件存在性则与 ctx.effect 的 dispose 回调严格绑定,更可靠。
Q: 它和 cordis.patch.yml 是什么关系?
A: package.json#dsh.bundle.patch 指向 ./cordis.patch.yml,后者声明把这个 fixture 以 dshm-fixture-a 的 id 插入到 profile 的 bundle 层栈中。这样它能像普通社区插件一样走完整的 hot-mount 流程,而无需重启宿主。
Q: 安装来源为什么是 GitHub 而不是 npm?
A: 因为这个包 private: true,从未发布到 npm。它只能通过 github: 形式的源码 spec 直接安装。
上手难度
入门 — 单文件、32 行、无第三方依赖、无配置项,主要理解成本来自 ctx.effect 这类 cordis 注入语义。
已知问题与限制
- 仅作为测试夹具存在,没有 README、配置项或用户可见功能
- 标记文件路径会回退到当前工作目录(当
DSH_HOME未设置时),可能污染运行目录 - 与 fixture-b / fixture-clash / fixture-cross / fixture-carrier 等其它夹具共享同一组 e2e 测试假设,需同时运行才能形成完整断言
dsh-market
English | 中文
dsh-marketis independent of any particular client — it works in any host that speaks the standard DeepSeek Harness protocol. We're currently in discussions withanywhere-labs/deepseek-harness-desktopabout future cooperation, and we'll share updates here as they happen. Use dsh-desktop or deepseek-harness-desktop — both ship with this plugin market built in — or another excellent third-party client.
The plugin market inside DeepSeek Harness. Open Settings → Plugin Market → browse, search, one-click install.

One-click themes: install, switch live, no restart.
Install
dsh plugin --profile web add dshmarket
Restart dsh web, then open Settings → Plugin Market.
Requires dsh web 0.1.0-rc.6 or newer. On an older host the market
disables itself and says so in the browser console rather than rendering
against primitives that are not there — if the Plugin Market entry never
appears, that is usually why. Worth checking when a desktop build bundles
its own dsh: it may be older than the one npm would give you (#139).
What you get
-
Browse & search the full community catalog (1550+ plugins, growing daily) — category filters, star counts, top/new sorting, bilingual descriptions that follow your UI language
-
Screenshots — AppStore-style screenshots, auto-carousel when there's more than one, click to preview full-size: author-curated shots show right on the card (zero extra requests); plugins without curated shots fall back to automatic README extraction once you open the install dialog. Images load from GitHub hosting only
-
Themes — a dedicated tab for community themes and skins: install → active immediately, switch with one click (themes are mutually exclusive, your choice survives restarts), uninstall to revert
-
One-click install — confirm the source, watch live progress; most plugins go live after a page refresh, no restart
-
Backup & restore — export your profile's plugin list and configuration as readable JSON, import it on another machine, store it on WebDAV with daily auto-backup, or sync through a private GitHub Gist; restores merge (plugins installed after the backup are kept), validate before writing, and roll back on failure
-
Updates — per-plugin update checks (npm version or pinned commit vs HEAD), one-click update, or update everything at once; the market updates itself the same way
-
Uninstall — two-step confirm; plugins installed this session are removed live
-
Hot disable / enable — toggles write
- id: …+disabled: true|falseinto the profile'scordis.patch.yml(the official patch layer, mechanism ported from dsh-plugin-hub): DSH's HMR re-composes within ~1s, no restart, and the loader re-applies the choice on every boot; hand-edited patch rows show as badges, host-infrastructure plugins are protected from toggling, and a malformed patch file is never made worse -
Restart when needed — changes that cannot hot-load show a one-click restart beside the pending-change banner; the action is restricted to same-origin loopback requests
-
Zero jargon — if a component is missing (pnpm), the market detects it and offers a one-click automatic setup
-
Log export — one click produces a sanitized plain-text log for bug reports (home paths and credential shapes are masked; nothing is ever sent anywhere). The market's version sits next to the page heading, so a screenshot of a problem already carries it
-
Settings card — on dsh 0.1.0-rc.7 and newer the market manages itself from Settings → Plugins → Plugin configuration, next to every other plugin: see the running version, pick a release channel (stable, or beta to try builds still being verified — the market only, never your other plugins; a third dev channel appears once developer mode is switched on, and carries builds published straight off a branch), update, or remove the market — with an opt-in cleanup that also drops the disable rows it wrote, so plugins it switched off start running again rather than staying off with no UI left to switch them back on
-
Diagnostics — the plugin load order and conflict surface, one page: bundle stack with official/community badges, duplicate loader entries, dependency version mismatches, multi-version core packages, overrides and invalid config entries. Plain-language terms, problem blocks highlighted, everything collapsible
-
Load order — drag community bundles into the order you want, or take the suggested one derived from the plugins' own before/after rules. Nothing is written until a trial composition passes, and the panel tells you what the new order would change (overrides, invalid or duplicate entries) before you apply it
-
AI fix — one click copies a diagnostics-driven fix prompt (errors/warnings/order conflicts + conservative scope instructions) to the clipboard; you paste it into a new conversation and decide whether to send
Speed
Installs prefer npm tarballs over full-repo GitHub downloads whenever a plugin publishes to npm (registry-verified against the repo to prevent name squatting). Registry installs are typically seconds; GitHub-only plugins depend on your connection to GitHub.
Security
-
Installs are restricted to sources listed in the curated awesome-dsh-plugin registry — anything else is rejected
-
Build scripts stay blocked by default (pnpm ≥10); allowing one is your explicit per-package choice
-
Terminal/CLI-surface plugins are flagged before you install them into the web profile
-
The install endpoint accepts same-origin POST only; the market never phones home
-
Backups can contain credentials from your profile config — the UI warns before export and upload; WebDAV sync is https-only, refuses private-network targets, and never stores your password in the browser
-
The restart endpoint additionally requires a direct loopback client (forwarded requests are rejected) and relaunches the exact DSH entry, arguments, environment, and working directory
-
One-click restart launches a detached replacement. When this host is systemd's own service process the button is hidden automatically — the market would otherwise kill the takeover process along with the unit's cgroup and the service would not come back. The pending-change notice stays visible and says so. Detection requires both a systemd marker AND being the unit's main process, because
INVOCATION_IDis inherited by every descendant of a unit (an ordinary terminal included) and hiding the button for those would be the worse bug. pm2 and launchd are not detected, so those deployments need the explicit setting below. Either flip Allow restart off in Settings → Plugins → Plugin configuration, or write it into the profile patch — where it has to sit underconfig:, because the loader passes only that sub-object to a plugin and a top-levelallowRestart:is silently ignored (#227 by @Fantasymax):- id: dsh-market name: dshmarket config: allowRestart: false # NOT at the top level beside `name:`GET /dsh-market/statusreports"restart": falseonce it has taken effect. -
For terminal-attached launches, the detached replacement keeps running after the original terminal closes
-
Listing ≠ endorsement: plugins are third-party code, install sources you trust
Submit your plugin
This repo is the market app, not the catalog. The plugin list comes from the curated awesome-dsh-plugin registry — to get your plugin listed in the market, open a PR there (one entry in the list; the site and this market pick it up automatically, usually within a day). Please don't PR plugin entries against this repo.
Roadmap & feedback
- Bugs go in issues — attaching the market's "Export log" makes diagnosis roughly ten times faster
- Feature ideas go on the Roadmap. Issues are kept for things that are broken, so a proposal filed as an issue gets moved there and closed; the discussion stays where you wrote it either way
- Every roadmap item welcomes community PRs — say so on the item before starting, so two people don't build it twice
Data source
Fetched live on every open from awesome-dsh-plugin.com/plugins.json — curated entries, npm mapping, and star counts refreshed daily by CI, with no stale cache behind it. A failure reports the actual reason and elapsed time, with a Retry button.
There is deliberately no bundled snapshot to fall back on: for a catalog that grows daily, a stale answer is not a degraded one but a wrong one — a plugin published this morning would read as "does not exist".
If that host is unreachable from your network, point the market at a mirror instead. Set DSHM_REGISTRY_URL in the environment dsh runs in, to anything serving the same plugins.json shape:
DSHM_REGISTRY_URL=https://your-mirror.example/plugins.json dsh web
Friends
DSH Desktop (dataelement)
dsh-desktop — a desktop app for DeepSeek Harness: run and manage a local Harness without installing Node.js yourself. Ships with this plugin market preset as the default. dshdesktop.com
DeepSeek Harness Desktop (hairyf)
deepseek-harness-desktop — a native desktop app for DeepSeek Harness built with Tauri (Rust + Web): one-click local install and launch with no Node.js setup required. On first run it offers to install this plugin market as a recommended preset.
DSH Get
DSH Get — a searchable web directory for discovering DeepSeek Harness plugins: category filters, bilingual descriptions, install commands and per-plugin detail pages. Its normalized catalog snapshot is public at bobby-sheng/dshget-data.
modlens
modlens — the first vision plugin for DeepSeek Harness: bolts visual understanding onto text-only models like DeepSeek and GLM. Paste an image, get structured JSON evidence back — OCR, layout, semantics. Available right in this market:
dsh plugin --profile web add @liustack/modlens
License
MIT · dshmarket.com
收录徽章
[](https://deepseek-plugin.org/plugins/dsh-market/dsh-market/tests/web/fixtures/fixture-a)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。