# dsh-web-ui

> Community plugin market card in DSH settings page: search and category filtering to browse contributor plugins, with one-click install and uninstall support after the plugin manager is installed.

## Metadata

- Author: [@zhu1090093659](https://github.com/zhu1090093659)
- Repo: <https://github.com/zhu1090093659/dsh-web-ui.git>
- GitHub: [zhu1090093659/dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui)
- Stars: 5,125
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Homepage: <https://gallery.dsh-market.com>
- Topics: `deepseek-harness`, `dsh`, `dsh-plugin`, `web-ui`
- Forks: 310
- Open Issues: 49
- Last push: 2026-08-20T14:37:38.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-community-plugins
```

## Wiki

## 一句话定位
DSH 网页版设置页里的「社区插件」一级分区：用搜索框、分类胶囊与双列卡片网格展示社区贡献者维护的插件，每张卡片都能复制安装命令；装上插件管理器后还能在本机浏览器里直接安装与卸载条目。

## 核心能力
- 在设置页注册一个与「通用设置 / 模式 / 插件 / Agent 预设」同级的一级分区（社区插件），内容直接展开，自带启用开关（社区插件索引设置命名空间持久化）。
- 以市场风格展示条目：按名称 / 作者 / 简介的搜索框，带各分类计数（界面与体验 / Agent 与自动化 / 开发者工具 / 记忆与知识 / 集成与分享 / 安全与运维 / 实用工具）的筛选胶囊，以及双列卡片网格，每张卡片含 npm 已发布或仓库安装徽标、分类·作者元信息行、仓库跳转链接与一键复制安装命令按钮。
- 在本机浏览器且安装了配套的「插件管理器」插件时，卡片提供安装按钮（轮询宿主进度，实时显示 获取信息 / 下载 / 解压 / 写入 阶段行）、「已安装 · 重启后生效」徽标，以及带确认对话框的卸载按钮。
- 优雅降级：未装插件管理器插件或从远程浏览器访问时，分区降级为只读索引，每张卡片仍保留复制安装命令兜底按钮，并显示一行提示解释为什么远程浏览器无法界面内安装。
- 只做索引，不打包任何被索引的代码：条目数据来自 community.json（35 条，14 条已发布 npm），由 `scripts/community-index` 编译进客户端 bundle。
- 与插件管理器标签页状态保持同步：通过 pluginManager.onChange 订阅，任意一方变更安装状态后另一边即时刷新；同一时间只允许一个变更操作进行，进行中其他卡片的操作按钮禁用。

## 技术实现
- **语言**: TypeScript + React (TSX)
- **关键依赖**: @deepseek-ai/dsh-client-ui-settings (settings.section 槽位) / @deepseek-ai/dsh-client-runtime (settingsScope) / @deepseek-ai/dsh-client-ui-slots (settings.section 注入与注入面) / schemastery (Config 校验)
- **架构模式**: 独立 cordis bundle 包（host 半区注册 settings 命名空间 + client 半区渲染卡片），通过 cordis.patch.yml 注入 web profile；browser 半区经 dsh.client.inject 声明对 client-runtime / client-connection / client-ui-settings 的注入依赖；可选 pluginManager 服务通过 ctx.inject 桥接（不在模块级 inject 数组，缺失时降级）
- **入口文件**: src/index.ts (host) / src/client/index.ts (client) / cordis.patch.yml

## 适用场景
刚接触 DSH、希望在网页版设置页里直接浏览社区贡献的插件、对比分类、按需复制安装命令的用户。如果同时装了「插件管理器」插件，可以在不离开浏览器的情况下完成安装与卸载。本插件本身只索引不打包代码，适合用来发现与试用第三方贡献。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 未声明 | 本包 package.json 未声明 dsh engines；运行时通过 `@deepseek-ai/*` SDK 隐式锁定，依赖设置页暴露 `settings.section` 槽位（由 `@deepseek-ai/dsh-client-ui-settings` 提供） |
| Node | ^22.19 \|\| >=24 | 据 packages/AGENTS.md:9；本包 package.json 未声明 engines |
| React | ^18.2.0 | peerDependencies 声明 |
| 平台 | 跨平台 | 浏览器半区为主，宿主 dsh web 跨平台运行即可 |
| 原生模块 | 无 | 全部走 cordis bundle + Web DOM API，无 native binding |

## 安装方式
```bash
dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-community-plugins
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| enabled | 布尔 | 卡片自己的启用开关，决定是否在设置页展开社区插件索引列表；关闭后只在该分区折叠成「已关闭」提示，不影响其他设置 | true |

## 常见问题

**Q: 这个插件是干什么用的？**

A: 在 DSH 网页版设置页新增一个「社区插件」一级分区，用搜索框+分类胶囊+双列卡片网格的形式展示社区贡献者维护的插件，每张卡片带仓库跳转与一键复制安装命令按钮。

**Q: 为什么要装「插件管理器」才能在界面里安装？**

A: 界面内安装/卸载依赖插件管理器插件（@linxin666/dsh-client-ui-plugin-manager）暴露的 pluginManager 服务和本机（loopback）浏览器权限。远程浏览器只能看到只读索引与复制命令按钮。

**Q: 已安装列表和「插件管理」标签页会同步吗？**

A: 同步。本插件订阅 pluginManager.onChange，在卡片上点安装/卸载后立即刷新已安装快照；同一时间只允许一个变更操作，进行中其他卡片按钮会禁用。

**Q: 点完「安装」为什么还没生效？**

A: 卡片上会显示「已安装 · 重启后生效」徽标；必须重启 dsh web，被装插件的开关与配置才会出现在设置页的插件配置区。

**Q: 怎么区分「npm 已发布」和「仓库安装」？**

A: 看卡片上的徽标：写了 npm 字段的条目会显示「Published on npm / npm 已发布」，否则显示「Install from repo / 仓库安装」。

**Q: 这个插件本身需要配置吗？**

A: 默认无需配置。分区自带的「启用社区插件索引」开关是唯一的可配项（默认 true），关闭后只在该分区折叠索引列表，不影响其他设置。

**Q: 可以贡献新的社区插件条目吗？**

A: 可以。条目由维护者审核登记到 community.json，再由 `scripts/community-index` 重新生成 `src/client/generated/community.ts` 打进客户端 bundle。

**Q: 装了社区插件卡后远程访问 DSH web 会有什么不同？**

A: 远程浏览器自动降级为只读索引，每张卡片仍保留复制安装命令按钮；顶部多一行提示说明远程浏览器为什么不能界面内安装。

## 上手难度
入门 — 安装一条命令即生效，默认配置即可使用；想新增社区条目只需维护 community.json 并跑 `scripts/community-index` 重新生成。

## 已知问题与限制
- 仅当依赖的 `@deepseek-ai/dsh-client-ui-settings` 存在时，卡片才会出现在 DSH 设置页；缺失时分区会随依赖一起静默卸载（README.md:42 / README.zh.md:42）。
- 界面内安装/卸载依赖「插件管理器」插件（`@linxin666/dsh-client-ui-plugin-manager`）与本机浏览器；远程浏览器只能得到只读的复制命令索引（README.md:43-44）。
- 从卡片发起的安装与卸载在重启 `dsh web` 后才生效；卡片上的「已安装」徽标已注明（README.md:44-45）。
- 条目由维护者在 community.json 中登记审核，卡片展示构建时的快照：插件登记后必须重新跑 `scripts/community-index` 才会出现在设置页（README.md:45 / src/client/generated/community.ts:1-7）。
- 同一个仓库的 npm 装与 git 装被视为不同来源：写了 npm 字段的条目不会匹配同仓库的 git 安装记录，卡片会继续显示安装按钮，让宿主去裁决（src/client/install-source.ts:71-81）。
- 同一时间只允许一个安装/卸载操作；进行中其他卡片的操作按钮会被禁用，且取消按钮在变更进行中也会被禁用（src/client/CommunityPluginsCard.tsx:248,318）。

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-web-ui](https://deepseek-plugin.org/plugins/zhu1090093659/dsh-web-ui/packages/dsh-community-plugins)
Wiki generated by AI (model: `MiniMax-M3`)
