Skip to content
dsh.fish
Bundle

@w2112515/dsh-plugin-marketplace

Out-of-tree installable plugin marketplace bundle for DeepSeek Harness

Source
w2112515
stars
14 stars
License
MIT
Updated
Updated 14 days ago

Readme

# DSH Plugin Marketplace

**The plugin marketplace for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH): browse, review, and install DSH plugins from inside DSH's own Settings UI — with evidence-based install safety, consent-gated install scripts, curated solution packs, and zero telemetry.**

**中文文档:[README.zh-CN.md](README.zh-CN.md)**(界面语言跟随 DSH 自动切换)

## What is DSH Plugin Marketplace?

DSH Plugin Marketplace is an **out-of-tree, installable DSH bundle** that adds a full plugin marketplace to DeepSeek Harness. It is not part of the official DSH repository, requires no changes to DSH source code, and is not a standalone web product. Once installed into the `web` profile, DSH's Host Loader mounts the marketplace Host plugin, and the package's declared `dsh.client` browser entry registers itself under `Settings → Plugins → Marketplace`. The UI is bilingual and follows DSH's display language automatically (中文 / English).

At a glance:

- **2,200+ plugins** discovered by a daily scan of every GitHub repository carrying the `dsh-plugin` topic — no GitHub account or token needed to browse.
- **Evidence-based install eligibility**: the scanner proves which install targets exist at each plugin's pinned commit, so "one-click" means *proven installable*, not *probably fine*.
- **Consent-gated scripts**: install scripts are shown verbatim and run only after explicit, per-install consent — never persisted, never bulk-approved.
- **Curated solution packs** that install a coherent capability baseline in one reviewed action.
- **No telemetry, no install counts, no server** — the catalog is static JSON on GitHub Pages.

![DSH Settings with the Marketplace tab open: 2,211 plugins across nine categories, with search, freshness meters, and a rating link on every row](docs/screenshots/discover.png)

## Install into your DSH

From npm:

```powershell
dsh plugin --profile web add @w2112515/dsh-plugin-marketplace
```

Or pin an immutable commit from GitHub (this repository commits its built `lib/`, so no `prepare` runs on your machine):

```powershell
dsh plugin --profile web add github:w2112515/dsh-plugin-marketplace#<40-char-commit>
```

Regular users need no GitHub token. Automatic installs require the Host to run `pnpm` 11 (the plugin also tries `corepack pnpm`); consent-gated script installs require pnpm ≥ 11.7. When no package manager exists, the WebUI keeps browsing and shows a recovery hint instead of a fake success. Uninstall: `dsh plugin --profile web remove @w2112515/dsh-plugin-marketplace`.

The default catalog is served from this repository's GitHub Pages. During development you can override it:

```powershell
$env:DSH_PLUGIN_MARKETPLACE_CATALOG_URL = 'https://w2112515.github.io/dsh-plugin-marketplace/plugin-marketplace/catalog-v1.json'
dsh plugin --profile web add D:\Work\dsh-plugin-marketplace
dsh --profile web --dump-config
dsh web
```

## Install safety

Automatic installs pin an immutable 40-character commit and always go through capability preflight → short-lived review plan → confirmed execution, with rollback of the profile manifest, lockfile, and workspace config on failure. Eligibility is decided by evidence at the pinned commit:

| Catalog entry | What the scanner proved | What happens on install |
| --- | --- | --- |
| **Automatic install** | Every install target (entry files, patch) exists in the pinned commit's git tree | `pnpm add --ignore-scripts` — third-party lifecycle scripts never run |
| **Needs script review** | Targets are absent (build output not shipped), but the package declares lifecycle scripts | Scripts are shown **verbatim** in the review step; after your explicit consent, the Host installs once with `--allow-build=<name>` instead of `--ignore-scripts`, scoping script execution to exactly the reviewed package within that single invocation. Nothing is written to `allowBuilds`; consent is never persisted |
| **Manual install** | Neither of the above | Repository link only; the marketplace never runs anything |

![Plugin detail page: description, freshness and activity evidence, community rating, and a capability-checked install panel](docs/screenshots/plugin-detail.png)

## Solution packs

A pack is a curated list of plugin repositories — nothing more. A repository becomes a pack by carrying **both** the `dsh-plugin` and `dsh-plugin-pack` topics plus a `dsh.pack.json` manifest:

```json
{
  "schemaVersion": 1,
  "name": "My Essentials",
  "description": "A curated starter set",
  "items": ["owner/plugin-a", "owner/plugin-b"]
}
```

- `items` holds 1–50 `owner/repo` strings; resolution to stable repository ids happens at scan time against the catalog itself, so renames never rewrite identity silently.
- The marketplace shows every item's explicit status — *will auto-install*, *needs script review*, *manual install*, *not in catalog*, *already installed* — and an honest `install N of M` count. Pack cards also disclose the install composition up front (`7 one-click · 1 script-review · 1 manual`), computed from catalog truth at scan time.
- Installing a pack runs the normal single-plugin plan→execute path serially, stops at the first failure, rolls nothing back, and reports each item's outcome.
- **Packs grant no privilege**: script-gated items still require their own per-plugin review and consent; manual items stay manual.
- **Packs are never ranked by stars.** Star ranking would reward stuffing a pack with the most-starred plugins — a star-sorted category view in disguise, not curation. Order is editorial first (packs reviewed by the marketplace maintainers for coherence and honesty, listed in `FEATURED_MARKETPLACE_PACKS`), then freshness. Curation follows 宁缺毋滥 (*quality over quantity*): a missing capability slot stays empty rather than being filled with an unproven plugin.

If you use Codex, Claude Code, or Cursor to author a pack, install the portable [`dsh-marketplace-publish`](https://github.com/w2112515/dsh-marketplace-publish/tree/main/skills/dsh-marketplace-publish) Skill. This page and the scanner remain the admission rules.

![Solution packs view with the featured DSH Category Star Leaders pack and its disclosed install composition](docs/screenshots/packs.png)

![Pack detail page: per-item install status with an honest 3-of-9 automatic count and no consent taken on your behalf](docs/screenshots/pack-detail.png)

## Community ratings

Ratings borrow GitHub's native reactions: every catalog plugin gets a ballot comment under the [ratings issue](https://github.com/w2112515/dsh-plugin-marketplace/issues/1), and a 👍/👎 reaction on it is a vote — one vote per real GitHub account. Detail pages show an overall window plus a trailing 90-day window, and **no verdict appears below 10 votes**. The client is read-only; voting itself happens entirely on GitHub, so the marketplace never holds your credentials.

## For agents

The marketplace is agent-native: the Host plugin registers four tools the DSH agent can call in any session — `marketplace_search`, `marketplace_detail`, `marketplace_install`, and `marketplace_manual_guide`. Search and detail are read-only. Installs run the **same** plan→execute pipeline as the WebUI, and every call asks for one-time human approval with the plugin name, pinned commit, and risk signals in the prompt — consent is never persisted and never bulk-granted. Script-gated entries are refused by design (verbatim script review stays in Settings → Plugins → Marketplace); manual entries are never executed by the marketplace — the guide tool fetches the repository's own install instructions for the agent to follow with its ordinary shell tools. Plugins activate after a `dsh web` restart. Set `agentTools: false` in the bundle config to disable the agent surface.

An agent can also install the marketplace itself with its ordinary shell tool:

```powershell
dsh plugin --profile web add github:w2112515/dsh-plugin-marketplace#<40-char-commit>
dsh --profile web --dump-config   # verify the bundle layer
# restart dsh web to activate
```

## Privacy stance

The marketplace is **read-only against a static catalog and never phones home**: no install counts, no telemetry, no analytics endpoint. There is deliberately no server to collect them — the catalog is plain JSON on GitHub Pages, and every install decision happens on your machine. Popularity signals come from GitHub's own public data (stars), nothing else.

## How it works

- **Distribution unit**: one npm/Git/tarball package declaring `dsh.bundle.patch`.
- **Host**: downloads and strictly validates the central static catalog (schema + integrity digest), keeps a last-known-good cache, and owns review and mutation of the current profile.
- **Client**: a `settings.plugins.tab` Slot contribution providing search, category filters, detail pages, risk signals, review confirmation, and solution packs.
- **Host/Client channel**: a package-private, same-origin `/api/plugin-marketplace` JSON API. DSH's static Typert Remote manifest is untouched.
- **Catalog production**: a daily GitHub Actions scan of repositories carrying the `dsh-plugin` topic. Only statically validated, non-archived bundles enter the public catalog; rejects are kept in the workflow artifact. Searches that hit GitHub's 1,000-result cap are bisected by creation-date windows. Only the central scanner uses the repository's own `GITHUB_TOKEN`.
- **Categories**: plugins are classified into nine categories (theme, memory, usage, skill, security, channel, UI, tool, provider) from an explicit `dsh-category-<slug>` topic or conservative whole-word tokens; a plugin with no honest signal stays *uncategorized* rather than being misfiled.

## For plugin authors

To be discoverable, your repository needs the `dsh-plugin` topic, a `package.json` declaring `dsh.bundle.patch`, and a valid `cordis.patch.yml`. An optional `dsh-category-theme|memory|usage|skill|security|channel|ui|tool|provider` topic sets your catalog category explicitly.

**To qualify for automatic install**, the files your bundle loads must exist in the git tree at the pinned commit — commit your built output (e.g. `lib/`), the way this repository does. If built output is intentionally not committed and your `prepare`/`install` scripts produce it, users will see your scripts verbatim and can consent to run them per install; the consent never extends beyond the reviewed commit.

If you use Codex, Claude Code, or Cursor to list a plugin, install the same [`dsh-marketplace-publish`](https://github.com/w2112515/dsh-marketplace-publish/tree/main/skills/dsh-marketplace-publish) Skill. It does not replace the rules above.

## Configuration

The bundle's patch row id is `plugin-marketplace`. Override the full config in `$DSH_HOME/profiles/web/cordis.patch.yml` (patch `config` is replaced wholesale, not deep-merged — write every field):

```yaml
- id: plugin-marketplace
  config:
    catalogUrl: https://w2112515.github.io/dsh-plugin-marketplace/plugin-marketplace/catalog-v1.json
    maxAgeMs: 172800000
    timeoutMs: 60000
    maxBytes: 15000000
    agentTools: true
```

The catalog is a daily GitHub Pages snapshot. A plugin that landed on GitHub today appears after the next successful scan. A failed scan leaves the previous snapshot in place.

## Repository layout

```text
dsh-plugin-marketplace/
├── package.json
├── cordis.patch.yml
├── src/
│   ├── index.ts                 # Host plugin & same-origin API
│   ├── catalog*.ts              # schema, network, LKG cache, queries
│   ├── profile-operations.ts    # plan/confirm/rollback, consent-gated execution
│   └── client/                  # WebUI Slot plugin (zh/en)
├── scripts/                     # GitHub scanner (plugins + packs)
├── website/public/              # workflow-generated static catalog
└── .github/workflows/           # CI and the daily Pages publication
```

## Local development

Requires Node.js `^22.19.0 || >=24` and pnpm 11.

```powershell
cd D:\Work\dsh-plugin-marketplace
pnpm install --frozen-lockfile
pnpm run build
pnpm run check
pnpm pack --dry-run
```

## Non-goals

- No code submissions to, or release demands on, `deepseek-ai/deepseek-harness`.
- No modification of DSH's Web bundle, Settings Slot, API Remote, or CLI sources.
- The browser never talks to the GitHub API directly; users never configure tokens.
- Lifecycle scripts never run without the user's explicit, per-install, per-commit consent.
- No telemetry of any kind — including install counts.

## Links

- [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) — the host project
- [DSH Category Star Leaders](https://github.com/w2112515/dsh-essentials-pack) — a solution pack listing each category's highest-starred catalog entry (mechanical, snapshot-dated)
- [DSH Marketplace Publish](https://github.com/w2112515/dsh-marketplace-publish) — portable Agent Skill for listing plugins and creating packs
- [linux.do](https://linux.do) — 新的理想型社区(友链)

Install

dsh plugin --profile web add github:w2112515/dsh-plugin-marketplace#142311b6cc8a75a1a507efe122f057d11d559fa2

Profile: web

  • 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.
Source