# DSH 插件市场（DSH Plugin Marketplace）

**[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)（DSH）的插件市场：在 DSH 自己的设置界面里浏览、审阅、安装插件——基于证据的安装安全、逐次同意的脚本安装、策展整合方案、零遥测。**

**English documentation: [README.md](README.md)**

## 这是什么？

DSH 插件市场是一个**仓外可安装的 DSH bundle**，为 DeepSeek Harness 提供完整的插件市场能力。它不属于 DSH 官方仓库，不要求修改或合并 DSH 源码，也不是独立 Web 产品。安装进 `web` profile 后，DSH 的 Host Loader 挂载市场 Host 插件，包内声明的 `dsh.client` 浏览器入口注册到「设置 → 插件 → 插件市场」。界面语言跟随 DSH 自动切换（中文 / English）。

一览：

- **2200+ 个插件**：每日扫描所有携带 `dsh-plugin` topic 的 GitHub 仓库，浏览不需要 GitHub 账号或 Token。
- **基于证据的安装资格**：扫描器证明每个插件在固定 commit 上哪些安装目标真实存在——「一键安装」意味着*已证明可装*，而不是*大概能装*。
- **脚本逐次同意**：安装脚本逐字展示，显式同意后才运行——永不持久化，绝不批量代同意。
- **策展整合方案**：一次审阅，装出一套完整的能力基线。
- **无遥测、无安装统计、无服务器**——目录就是 GitHub Pages 上的静态 JSON。

![DSH 设置中的插件市场：2211 个插件、九个分类、搜索、新鲜度指示和每行的评分入口](docs/screenshots/discover.png)

## 安装到本机 DSH

从 npm 安装：

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

也可以从 GitHub 安装并固定 commit（本仓库提交了构建后的 `lib/`，因此不会在你的机器上执行 `prepare`）：

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

普通用户不需要 GitHub Token。自动安装需要 Host 能调用 pnpm 11（插件也会自动尝试 `corepack pnpm`）；需确认脚本的安装需要 pnpm ≥ 11.7。两者都不可用时 WebUI 保持浏览能力并给出恢复提示，不会显示假成功。卸载：`dsh plugin --profile web remove @w2112515/dsh-plugin-marketplace`。

默认目录由本仓库的 GitHub Pages 提供。开发时可用环境变量临时覆盖：

```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
```

## 安装安全

自动安装固定 40 位不可变 commit，一律经过 能力预检 → 短期审核 plan → 确认执行，失败时回滚 profile manifest、lockfile 与 workspace 配置。安装资格由固定 commit 上的证据决定：

| 目录条目 | 扫描器证明的内容 | 安装行为 |
| --- | --- | --- |
| **可自动安装** | 所有安装目标（入口文件、patch）在固定 commit 的 git tree 中存在 | `pnpm add --ignore-scripts`，第三方生命周期脚本绝不运行 |
| **需确认脚本** | 目标缺失（未随仓库提交构建产物）但声明了生命周期脚本 | 审核页**逐字展示**脚本内容；你显式勾选同意后，Host 以 `--allow-build=<包名>` 替代 `--ignore-scripts` 执行一次安装，脚本执行被精确限定在本次调用的这一个包上。不写入 `allowBuilds`，同意永不持久化 |
| **手动安装** | 以上都不满足 | 只展示仓库链接，市场不执行任何内容 |

![插件详情页：用途、新鲜度与活跃度证据、社区评分，以及经过能力预检的安装面板](docs/screenshots/plugin-detail.png)

## 整合方案（Solution Packs）

整合包是一个插件仓库策展清单。仓库同时携带 `dsh-plugin` 与 `dsh-plugin-pack` 两个 topic 并提供 `dsh.pack.json` 即成为整合包：

```json
{
  "schemaVersion": 1,
  "name": "我的精选",
  "description": "一套策展的起手组合",
  "items": ["owner/plugin-a", "owner/plugin-b"]
}
```

- `items` 为 1–50 个 `owner/repo`；扫描时解析为稳定的仓库 id，改名不会造成身份错配。
- 市场逐项显式标注：将自动安装 / 需确认脚本 / 需手动安装 / 未收录 / 已在 profile 中，并给出诚实的「可安装 N/M」计数。整合包卡片还会前置展示安装构成（如「7 一键 · 1 需审脚本 · 1 手动」），由扫描时的目录事实计算。
- 安装整合包 = 串行复用单插件的 plan→execute 路径，首个失败即停止、不回滚、逐项报告结果。
- **整合包不放权**：需确认脚本的插件仍需进入其详情页单独审阅同意；手动项保持手动。
- **整合包永不按 star 排序。** star 排序只会奖励「把最高星插件塞进包里」的行为——那是换了皮的 star 榜单，不是策展。排序为编辑精选优先（由市场维护者审阅一致性与诚实度后列入 `FEATURED_MARKETPLACE_PACKS`），其余按新鲜度。策展宁缺毋滥：能力空缺就空着，不用未经验证的插件凑数。

用 Codex、Claude Code 或 Cursor 写整合包时，安装便携 Skill [`dsh-marketplace-publish`](https://github.com/w2112515/dsh-marketplace-publish/tree/main/skills/dsh-marketplace-publish)。收录规则仍以本页和扫描器为准。

![整合方案视图：精选的 DSH 分类星数榜首整合包及其前置展示的安装构成](docs/screenshots/packs.png)

![整合包详情页：逐项安装状态与诚实的 3/9 可自动安装计数，不代替用户做任何同意](docs/screenshots/pack-detail.png)

## 社区评分

评分借用 GitHub 原生 reaction：目录中每个插件在[评分 issue](https://github.com/w2112515/dsh-plugin-marketplace/issues/1) 下有一条投票评论，点 👍/👎 即投票——一票对应一个真实 GitHub 账号。详情页展示总评分与近 90 天两个窗口，**不满 10 票不出结论**。客户端只读，投票全程发生在 GitHub 上，市场绝不持有你的凭据。

## 面向 Agent

市场对 agent 原生开放：Host 插件注册四个工具，DSH agent 在任何会话中都可以调用——`marketplace_search`、`marketplace_detail`、`marketplace_install`、`marketplace_manual_guide`。搜索与详情是只读的；安装走与 WebUI **完全相同**的 plan→execute 管线，且每次调用都要求人工一次性批准——批准提示中带有插件名、固定 commit 与风险信号——同意绝不持久化、绝不批量代授。需脚本审阅的条目会被设计性拒绝（逐字审阅留在「设置 → 插件 → 插件市场」）；手动条目市场绝不执行——guide 工具仅抓取该仓库自己的安装说明，交给 agent 用普通 shell 工具在会话既有权限下执行。插件安装后需重启 `dsh web` 生效。在 bundle 配置中设 `agentTools: false` 可关闭 agent 面。

Agent 也可以用普通 shell 工具安装市场本身：

```powershell
dsh plugin --profile web add github:w2112515/dsh-plugin-marketplace#<40位commit>
dsh --profile web --dump-config   # 验证 bundle 层
# 重启 dsh web 生效
```

## 隐私立场

本市场**只读静态目录，永不回传**：不统计安装次数、没有遥测、没有分析端点——也刻意没有可以收集它们的服务器，目录就是 GitHub Pages 上的一份 JSON，每个安装决定都发生在你自己机器上。流行度信号只来自 GitHub 公开数据（stars），仅此而已。

## 工作原理

- 分发单元：声明 `dsh.bundle.patch` 的 npm/Git/tarball package。
- Host：下载并严格校验中央静态目录（schema + 完整性摘要），维护 last-known-good 缓存，拥有当前 profile 的审核与写入权。
- Client：通过 `settings.plugins.tab` Slot 提供检索、分类筛选、详情、风险信号、审核确认与整合方案界面。
- Host/Client 通道：包私有、同源的 `/api/plugin-marketplace` JSON API，不修改 DSH 的静态 Typert Remote 清单。
- 目录生产：本仓库 GitHub Actions 每日扫描带 `dsh-plugin` topic 的候选仓库；只有静态校验通过且未归档的 Bundle 进入用户目录，拒绝项只保存在 workflow artifact。遇到 GitHub Search 1,000 条上限时按创建时间窗口递归拆分。只有中央扫描器使用仓库自带的 `GITHUB_TOKEN`。
- 分类体系：插件按九个类别归类（主题、记忆、用量、技能、安全、消息渠道、界面、工具、模型接入），依据是显式的 `dsh-category-<slug>` topic 或保守整词匹配；没有任何可靠信号的插件诚实地留在「未分类」。

## 插件作者指南

可被收录的条件：仓库携带 `dsh-plugin` topic、`package.json` 声明 `dsh.bundle.patch`、且 `cordis.patch.yml` 有效。可选 `dsh-category-theme|memory|usage|skill|security|channel|ui|tool|provider` topic 显式决定目录分类。

**获得自动安装资格**：让你的 bundle 要加载的文件存在于固定 commit 的 git tree 中——把构建产物（如 `lib/`）提交进仓库（本仓库即如此）。若刻意不提交构建产物、由 `prepare`/`install` 脚本生成，用户会在安装前逐字看到脚本并可选择按次同意；同意范围永不超出被审阅的 commit。

用 Codex、Claude Code 或 Cursor 上架插件时，安装同一份 [`dsh-marketplace-publish`](https://github.com/w2112515/dsh-marketplace-publish/tree/main/skills/dsh-marketplace-publish)。它不替代上面的规则。

## 配置

bundle 插入的 row id 是 `plugin-marketplace`。可在 `$DSH_HOME/profiles/web/cordis.patch.yml` 覆盖完整配置（patch 对 `config` 是整体替换，必须写全所有字段）：

```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
```

目录是 GitHub Pages 上的每日快照。今天刚出现在 GitHub 上的插件，要等下一次扫描成功才会进市场。扫描失败时继续用上一份快照。

## 仓库结构

```text
dsh-plugin-marketplace/
├── package.json
├── cordis.patch.yml
├── src/
│   ├── index.ts                 # Host 插件与同源 API
│   ├── catalog*.ts              # schema、网络、LKG 缓存、查询
│   ├── profile-operations.ts    # plan/确认/回滚、同意门控执行
│   └── client/                  # WebUI Slot 插件（中/英）
├── scripts/                     # GitHub 扫描器（插件 + 整合包）
├── website/public/              # workflow 生成的静态目录
└── .github/workflows/           # CI 与每日 Pages 发布
```

## 本地构建

要求 Node.js `^22.19.0 || >=24` 和 pnpm 11。

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

## 非目标

- 不向 `deepseek-ai/deepseek-harness` 提交代码或要求官方发布。
- 不修改 DSH 的 Web bundle、Settings Slot、API Remote 或 CLI 源码。
- 浏览器不直接访问 GitHub API，不要求用户配置 Token。
- 未经用户逐次、逐 commit 的显式同意，绝不运行生命周期脚本。
- 不做任何形式的遥测——包括安装次数统计。

## 友情链接

- [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)——宿主项目
- [DSH 分类星数榜首](https://github.com/w2112515/dsh-essentials-pack)——按机械规则收录各分类 star 数最高条目的整合包（标注快照日期）
- [DSH Marketplace Publish](https://github.com/w2112515/dsh-marketplace-publish)——上架插件与创建整合包的便携 Agent Skill
- [linux.do](https://linux.do)——新的理想型社区（友链）
