Plugin Markets & Managers
dsh-marketplace
ouyangyipeng/dsh-marketplace · ★ 2
A safe, live plugin marketplace for DeepSeek Harness
安装
dsh plugin --profile web add github:ouyangyipeng/dsh-marketplaceGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
For install and environment setup, plus plugin development tutorials, see DSH community docs ↗
README
Table of contents
dsh-marketplace is itself a DeepSeek Harness bundle. It projects GitHub's live topic:dsh-plugin community into Settings → Plugins → Marketplace, keeping discovery, search, inspection, installation, updates, and removal inside one Harness surface.
[!IMPORTANT] Marketplace checks packaging and narrows installation behavior; it cannot prove that third-party code is trustworthy. A plugin runs inside the DSH process after restart. Read its source before enabling it.
Install
DS-Harness Desktop
DS-Harness Desktop bundles a verified, offline Marketplace version from desktop-v0.2.0. Open Settings → Plugins → Marketplace without installing this plugin first.
The bundled entry is labeled “Desktop built-in” and cannot update or remove itself in Marketplace. It updates with verified Desktop releases. Other plugins still install into Desktop's isolated web profile.
Standard DSH Web profile
Requires a current DeepSeek Harness, Node.js ^22.19.0 || >=24.0.0, and pnpm on PATH:
dsh plugin --profile web add "github:ouyangyipeng/dsh-marketplace#v0.1.1"
Restart dsh web, then open Settings → Plugins → Marketplace.
Update or remove a standalone Marketplace installation with the native DSH command:
dsh plugin --profile web update dsh-marketplace
dsh plugin --profile web remove dsh-marketplace
From discovery to activation
flowchart LR
Topic["GitHub topic:dsh-plugin"] --> Cache["Catalog cache + ETag"]
Cache --> UI["Marketplace Client"]
UI --> Stage["pnpm add --ignore-scripts"]
Stage --> Inspect["Manifest + exports + path checks"]
Inspect --> Profile["Atomic profile edit"]
Profile --> Restart["Restart DSH"]
- The Host reads up to ten 100-item pages from GitHub Search.
- The Client searches names, owners, descriptions, and topics locally and sorts by update time, stars, or name.
- Install first stages the candidate in an isolated temporary project without modifying the user profile.
- Only a candidate with prebuilt entries, a valid bundle patch, and contained real paths reaches the profile dependency step.
dsh.profile.bundlesuses atomic file replacement. Failed installs stay inactive; failed removal restores the previous manifest.- Package lifecycle changes take effect after restarting DSH.
Security boundary
| Marketplace does | Marketplace does not promise |
|---|---|
Parses strict owner/repository coordinates |
Audits plugin logic or author identity |
Always stages and installs with pnpm add --ignore-scripts |
Sandboxes the plugin after installation |
Requires a safe name, prebuilt Host, and standard dsh.bundle.patch |
Proves a repository contains no malicious code |
Requires a prebuilt ./client export when a Web Client is declared |
Reads private repositories or stores GitHub tokens |
| Verifies entry and patch real paths stay inside the package | Makes source-only or lifecycle-build packages compatible |
| Passes subprocess arguments individually, never through a shell string | Bypasses DSH restart activation semantics |
| Restricts mutations to same-origin loopback plus a process nonce | Acts as a remote-management API |
| Renders GitHub values as React text, never remote HTML | Loads remote avatars or repository HTML |
Source-only repositories, packages that require prepare/postinstall, standalone applications, and repositories without a standard DSH bundle remain discoverable but fail installation with an explicit reason. Marketplace never falls back to running their scripts.
Native DSH architecture
flowchart LR
Patch["cordis.patch.yml"] --> Host["Host face"]
Host --> API["/dsh-marketplace/v1"]
Manifest["package.json#dsh.client"] --> Client["Client face"]
API --> Client
Client --> Slot["settings.plugins.tab"]
Host --> Profile["$DSH_HOME/profiles/web"]
cordis.patch.ymlmounts the Host face.package.json#dsh.bundle.patchdeclares an installable profile bundle.package.json#dsh.clientdeclares the Web Client and injected DSH services.- Host registers one effect-scoped route prefix; Client registers one Settings tab.
- Host never guesses its distribution from process names or paths. Desktop and other hosts declare immutable content through
bundledRepositories.
HTTP API
Every response is JSON with Cache-Control: no-store.
| Method | Path | Purpose |
|---|---|---|
GET |
/dsh-marketplace/v1/bootstrap |
Nonce, mutation capability, profile inventory, and host-bundled repositories |
GET |
/dsh-marketplace/v1/catalog |
Cached live catalog; ?refresh=1 forces revalidation |
POST |
/dsh-marketplace/v1/install |
Stage, validate, install/update, and activate a repository |
POST |
/dsh-marketplace/v1/remove |
Deactivate and remove by package plus repository |
Mutation routes require loopback TCP peer, Host, optional Origin, and the process nonce returned by same-origin bootstrap. LAN clients, remote origins, invalid nonces, non-JSON content, bodies above 16 KiB, and host-bundled repository mutations are rejected. A bundled conflict returns HTTP 409.
Configuration
Standalone installation uses conservative defaults:
- insert:
- id: dsh-marketplace
name: dsh-marketplace
config:
profile: web
cacheTtlMs: 600000
Optional fields:
home: DSH Home override; empty usesDSH_HOME, then~/.dsh.bundledRepositories: host-owned immutableowner/repositoryvalues; default[]. Values normalize at load. Invalid coordinates and case-insensitive duplicates fail plugin startup.
Catalog and rate limits
- GitHub Search exposes at most 1,000 results for one query.
- The unauthenticated Search API has a low rate limit; Marketplace never collects or persists a GitHub token.
- Host uses a ten-minute cache, ETag revalidation, visible rate-limit state, and stale-on-error fallback.
- Compatibility is checked when Install or Update is clicked, avoiding 1,000 speculative clones.
- GitHub unavailability never blocks Harness or Desktop startup.
Development and verification
git clone https://github.com/ouyangyipeng/dsh-marketplace.git
cd dsh-marketplace
pnpm install
pnpm test
pnpm run typecheck
pnpm run build
pnpm site:check
pnpm pack --dry-run
Install a local checkout into DSH:
dsh plugin --profile web add "link:$(pwd)"
dsh web
Tests cover catalog paging and caching, repository coordinates, manifest/entry/patch validation, real-path and symlink escapes, scripts-disabled subprocess arguments, atomic profile edits and rollback, Host HTTP policy, bundled mutations, remote-text rendering, Client search, and static product-site constraints.
License
MIT. DeepSeek Harness, the DeepSeek name, and community plugins retain their respective licenses and trademarks. This is an unofficial, community-maintained plugin.