dsh-plugin-shop README

The project's README from github.com/LivXue/dsh-plugin-shop. As one markdown file: README.md.

dsh-plugin-shop

The plugin shop for DeepSeek Harness — discover, install, enable and update dsh plugins from a browsable, git-auditable catalog.

npm plugins filtered license plugin CI catalog

English | 中文


📦 Install the shop

Two tracks. They do the same thing; pick the one that matches who is reading.

🧑 For people

Prerequisites: Node.js. Running the harness itself needs no install — the upstream-documented form is npx -y @deepseek-ai/dsh web. Plugin management goes through dsh plugin, which spawns both the dsh command and pnpm — install them once with npm install -g @deepseek-ai/dsh pnpm and verify with dsh --version and pnpm --version.

# dsh on PATH (global install). Pin the version: pnpm 11 holds back very
# recent releases, so a bare `add dsh-plugin-shop` can hand you an older
# version for a while. This is the current release — refresh it with
# `npm view dsh-plugin-shop version`.
dsh plugin --profile web add [email protected]
# or straight through npx, nothing installed:
npx -y @deepseek-ai/dsh plugin --profile web add [email protected]

Replace web with your profile if you use another one. Restart dsh once — a newly added bundle is not applied to a running process — then open

Settings → Plugins → Plugin shop

🤖 For agents

Non-interactive. --profile is mandatory; without it dsh plugin exits with error: required option '--profile <name>' not specified.

# 1. resolve a profile name ($DSH_HOME defaults to ~/.dsh; node_modules is not a profile)
ls -1 "${DSH_HOME:-$HOME/.dsh}/profiles" | grep -v '^node_modules$'

# 2. install — pin the version: it bypasses pnpm's release cooldown and
#    deterministic installs are the point of the agent path
dsh plugin --profile <profile> add [email protected]

# 3. verify — a zero exit above only means pnpm resolved the package
dsh plugin --profile <profile> list --depth 0   # dsh-plugin-shop must appear

# 4. restart the profile; a new bundle is not hot-applied
dsh --profile <profile>

The same fact as step 3 lives in $DSH_HOME/profiles/<profile>/package.json under dsh.profile.bundles, if you would rather read the manifest than parse CLI output. Per-failure diagnostics are in the package README.

🖼️ Screenshots

The plugin shop shelf inside dsh Settings
Installing an unreviewed plugin requires an explicit acknowledgement The same shelf in the dark theme
Installing an unreviewed plugin requires an explicit acknowledgement The same shelf in the dark theme

✨ Highlights

🗺️ How it fits together

In this repository — the daily build. Everything here is registry/.

flowchart TB
  subgraph HARVEST["1 · Harvest — the whole public registry, every day"]
    direction LR
    NPM(["npm packages<br/>keyword dsh-plugin<br/>keyword deepseek-harness"])
    GH(["GitHub repositories<br/>the same keywords,<br/>used as topics"])
  end

  subgraph GATE["2 · Gate — every candidate must clear all five, on every build"]
    direction LR
    G1["a plugin at all?<br/><br/>a dsh.bundle the<br/>loader can mount"]
    G2["auditable?<br/><br/>a license,<br/>a live repository"]
    G3["installable?<br/><br/>not deprecated on npm ·<br/>repo listings also need<br/>no build scripts and<br/>no workspace: deps"]
    G4["what it claims?<br/><br/>tarball integrity, publish time,<br/>not a near-miss of another name"]
    G5["anything to show?<br/><br/>a valid dsh.catalog,<br/>or an npm description"]
  end

  subgraph SHELVE["3 · Shelve — what the catalog records"]
    direction LR
    CAT["one of 7 categories"]
    PEER["the declared peer NAMES,<br/>never their version ranges"]
  end

  NPM --> G1
  GH --> G1
  G1 -.-> REJ
  G2 -.-> REJ
  G3 -.-> REJ
  G4 -.-> REJ
  G5 -.-> REJ
  REJ[["rejected — one author-readable reason per name"]]
  G5 ==>|"all five clear"| CAT
  PEER ==> PUB[["4 · Publish — content-addressed JSON, committed to git, then GitHub Pages and npm"]]

On your machine — the npm package. Everything here is packages/dsh-plugin-shop/. The two halves share no code, only the schema.

flowchart LR
  CAT[["the catalog<br/>index.json + plugins.sha256.json"]]
  CAT ==> HOST["5 · Host half<br/>races every origin<br/>verifies sha256 · caches"]
  HOST ==> DEP{"6 · Dependency check<br/>resolve each recorded peer<br/>against YOUR profile"}
  DEP -->|"one or more absent"| BAD["Incompatible<br/>the card names<br/>what is missing"]
  DEP -->|"all resolve"| GOOD["installable"]
  BAD --> CLIENT["Client half — the Settings tab<br/>nine shop/* methods<br/>no network · no filesystem"]
  GOOD --> CLIENT
  CLIENT ==>|"dsh plugin add"| PROF[("your dsh profile")]

Two parts are worth naming, because they are the ones people expect to work differently:

✅ What it is

Public and community-run Publishing to npm with the dsh-plugin or deepseek-harness keyword is all it takes to be discovered. Nothing is submitted to this project.
Git-auditable Every daily catalog change is a reviewable diff, not a row in someone's database.
Tiered trust, honestly reported A review is pinned to the exact version it covered, so an author who passes review once cannot publish a malicious version and inherit the trust. Today registry/verified.yml is empty: no listing has been read by a human, every entry is community-tier, and every install asks for the acknowledgement. The filtering above is mechanical, and it is not a substitute for reading the code you are about to run.
Zero-privilege UI Compromising the browser interface does not compromise the runtime.

🚫 What it is not

It is not a sandbox. A dsh plugin, once mounted, holds the full ctx — your filesystem, your shell, and the requests going to the model. Installing one is complete trust. This project does not change that; it tells you the truth before you click.

It also carries no download counts, ratings, or reviews, and it will never offer an "install from arbitrary URL" button. That capability stays in dsh plugin add, where enabling build scripts and pinning a commit are decisions you make explicitly.

📚 The catalog

Built daily and published as static JSON, to two places at once: the npm package dsh-plugin-shop-catalog and GitHub Pages. Your installation races them — the registry you have configured, npmmirror, npmjs, then Pages — and takes whichever answers first, because the link to one of them can be far slower than the link to another from where you sit. All of them carry the same bytes, and the sha256 in the pointer is checked before any of them is trusted. DSH_SHOP_CATALOG_URL opts out of the race and reads only what you name.

Artifact Purpose
/v1/index.json The pointer — schemaVersion, builtAt, the entry count and rejected totals (the badges above read them live), and the content hash. Small enough to poll.
/v1/plugins.<sha256>.json The data — content-addressed, safe to cache indefinitely.
/v1/stars.<sha256>.json GitHub star counts by package name, when the daily build could fetch them

Each build's rejection report, carrying an author-readable reason for every rejected package, is attached to the workflow run. Nothing disappears without a reason attached to its name.

The data files are content-addressed, so each build publishes new names and the previous ones stop existing, while the pointer above them is cached for ten minutes. If you fetch /v1/ yourself, re-read index.json whenever a data URL answers 404 — or read the same bytes from the npm package dsh-plugin-shop-catalog, where the pointer and the data it names always ship in one tarball.

🏷️ Listing a plugin

Add a harvest keyword (dsh-plugin or deepseek-harness) to your package.json and publish to npm; the daily build picks it up. A plugin that never publishes to npm is listed from its GitHub repository instead: add the same keyword as a repo topic and keep a package.json at the root with a name and dsh.bundle — the catalog pins the default-branch commit as the version. A dsh.catalog section is optional — declare it to control your own category, summary and capabilities, or omit it and the catalog derives a listing from your npm description instead.

{
  "name": "dsh-hello-plugin",
  "keywords": ["dsh-plugin"],
  "dsh": {
    "bundle":  { "patch": "./cordis.patch.yml" },
    "catalog": {
      "category": "tool",
      "summary": { "en": "...", "zh": "..." },
      "capabilities": ["fs", "shell"]
    }
  }
}

Full field reference: docs/schema.md.

Not listed, and why: a package without dsh.bundle is a library rather than an installable plugin. A package without a license or a repository cannot be audited. A package with neither a dsh.catalog section nor an npm description has nothing to show.

🗂️ Repository layout

Path What lives there
registry/ The catalog pipeline — a pure core (gate, tier, emit, pipeline) behind an impure shell (npm-client, build)
registry/verified.yml The human review record, pinned per version
registry/denied.yml The denylist; every entry states why
registry/snapshots/ manifest.lock, committed daily
packages/dsh-plugin-shop/ The npm package — Host half and Client half
docs/design/ The specification. It is the authority; code follows it.

🛠️ Development

pnpm install
pnpm test        # vitest
pnpm typecheck

pnpm build:catalog runs the real harvest against npm and GitHub — thousands of live requests and several minutes. The tests cover every policy decision without a network, so reach for it only when you have changed the fetching or writing layer.

Status and open work: docs/plans/2026-08-18-remaining-work.md. Specification: docs/design/2026-08-18-dsh-plugin-shop-design.md.

🤝 Contributing

Three ways in, cheapest first.

All three in full: CONTRIBUTING.md. Be decent to each other: Code of Conduct. Vulnerabilities and malicious plugins go privately, never to a public issue.

📄 License

Apache-2.0 © LivXue

dsh-plugin-shop (LivXue/dsh-plugin-shop)

Searching Database…

这是什么?这是 DeepSeek Harness(dsh)的一个可浏览、可用 git 审计的插件市场——一个用于发现、安装、启用和更新 dsh 插件的目录。
这是隔离插件的沙箱,还是只是一个目录界面?它只是目录和安装界面,不是沙箱。你安装的插件会获得完整的运行时上下文——你的文件系统、你的 shell 和模型请求——这个项目只是在你点击安装之前告诉你这一事实。
怎么在插件市场里浏览和安装插件?全局安装 dsh 和 pnpm,运行一次 dsh,然后在 dsh 界面中打开 Settings → Plugins → Plugin shop;添加 bundle 后要重启 dsh,因为它不会应用到正在运行的进程。代理(agent)则以非交互方式运行 dsh plugin,此时 --profile 是必填项。
试用之前需要 Node.js 和 pnpm 吗?需要——Node.js 是必需的,而且插件管理会同时调用 dsh CLI 和 pnpm,所以两者都要事先全局安装。
这些插件上架前真的有人审查过吗?还没有——人工审查文件目前是空的,所以每个上架的插件都属于社区级别,安装任何一个都需要明确确认风险,而不是暗示它已经过审核。
使用这个插件市场需要先安装 DeepSeek Harness(dsh)吗?需要——这是一个叠加在现有 dsh 安装之上的插件管理器;运行 harness 本身是单独一步,上游文档写的是 npx -y @deepseek-ai/dsh web。
目录多久刷新一次?它每天重建一次并把结果提交到 git,因此每个新插件、每次更改和每次移除都会以可审查的 diff 形式呈现,而不是悄悄更新数据库。
兼容性检查是怎么判定插件「不兼容」的?目录只记录每个插件的 peer 依赖名称,从不记录版本范围;你自己的安装会根据你的实际配置解析这些名称,所以只有当某个模块在你的机器上确实缺失时,卡片才会显示 Incompatible。
怎么让我自己的插件上架到插件市场?给你的 npm 包打上 dsh-plugin 或 deepseek-harness 关键字并发布,或者用同样的方式标记一个 GitHub 仓库,要求根目录的 package.json 包含 dsh.bundle——下一次每日构建会自动收录,无需提交申请。
为什么不显示下载量、评分或从 URL 安装的按钮?该项目有意省略了这些:它跟踪 GitHub 星数但不跟踪安装热度,并且永远不会提供任意 URL 安装,把这种风险更高的能力限制在显式的 dsh plugin add 命令中。
Creator
LivXue
Size
50.3 MB
Stars
706
Age
1mo
Commits · 90 Days