Plugin Markets & Managers

dsh-marketplace

ouyangyipeng/dsh-marketplace · ★ 2

ouyangyipeng

A safe, live plugin marketplace for DeepSeek Harness

License
MIT
Added
2026-08-23
Maintenance
active
Install kind
github

No manifest check is available; listing does not imply compatibility or security review.

安装

dsh plugin --profile web add github:ouyangyipeng/dsh-marketplace

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

README

Source README · body: en · Read Chinese README

Table of contents
  1. Install
  2. DS-Harness Desktop
  3. Standard DSH Web profile
  4. From discovery to activation
  5. Security boundary
  6. Native DSH architecture
  7. HTTP API
  8. Configuration
  9. Catalog and rate limits
  10. Development and verification
  11. License

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"]
  1. The Host reads up to ten 100-item pages from GitHub Search.
  2. The Client searches names, owners, descriptions, and topics locally and sorts by update time, stars, or name.
  3. Install first stages the candidate in an isolated temporary project without modifying the user profile.
  4. Only a candidate with prebuilt entries, a valid bundle patch, and contained real paths reaches the profile dependency step.
  5. dsh.profile.bundles uses atomic file replacement. Failed installs stay inactive; failed removal restores the previous manifest.
  6. 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.yml mounts the Host face.
  • package.json#dsh.bundle.patch declares an installable profile bundle.
  • package.json#dsh.client declares 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 uses DSH_HOME, then ~/.dsh.
  • bundledRepositories: host-owned immutable owner/repository values; 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.