# DSH 插件管理器

<div align="right">

[English](README.md) · [中文](README.zh.md)

</div>

这是一个可独立发布的 DSH 组合包，在 **设置 → 插件** 中增加分类插件管理器。

这个仓库按照社区插件的标准形态组织：

- 根目录 `package.json` 就是可安装的 npm 包；
- `dsh.bundle.patch` 挂载 Host 网关；
- `dsh.client` 在原生 Web 客户端加载浏览器设置页；
- `lib/` 保存已经构建并验证过的 Host/Client 产物；
- GitHub 用于源码、文档和 `dsh-plugin` 市场发现；
- npm 是普通用户安装和更新的渠道。

## 界面预览

![插件管理 Tab — 按分类展示已安装的组合包](./assets/screenshots/plugin-manager-tab.png)

![插件市场搜索 — `dsh` 主题仓库发现](./assets/screenshots/plugin-market-search.png)

## 功能

- 按分类整理当前 profile 的所有已安装包；
- 搜索 GitHub `dsh-plugin` 市场；
- 已安装插件去重提示；
- 市场仓库有正式 npm 包时优先从 npm 安装；
- 没有 npm 发布时回退到 GitHub 源码安装；
- 卸载、单个更新、更新检查和启动时自动检查；
- 对带语义化版本标签的 GitHub 源码插件检查 Releases；没有 Release 时对未固定 commit 的源码回退到最新提交比较；
- 捕获 pnpm 构建许可错误，并提供明确的允许/重试流程；
- 安装完成后询问是否立即重启生效；
- DSH Desktop 与 `npx @deepseek-ai/dsh web` 使用同一套 profile 逻辑。

## 发布后安装

如果发布者更换了包名，请替换下面命令中的包名：

```sh
dsh plugin --profile desktop add dsh-plugin-manager-community@latest

# 原生 Web profile
npx -y @deepseek-ai/dsh plugin --profile web add dsh-plugin-manager-community@latest
npx -y @deepseek-ai/dsh web
```

安装新版本后，需要重启当前 DSH 进程才能加载新的组合层；从市场安装成功后，设置页会询问是否立即重启。

原生 Web 重启会替换当前 Node 进程。根据浏览器时序，触发重启的 HTTP 请求可能显示为 `Failed to fetch`；当前 `lib/client.js` 会仅把 Web 端这种预期断连识别为重启过程，并显示正在恢复连接。发布时请确保 `lib/index.js` 与 `lib/client.js` 来自同一个版本。

## 兼容性

插件管理器已验证支持 **DeepSeek Harness（DSH）桌面版** 以及同一应用的原生 Web profile。`dsh.client.platform: "web"` 表示浏览器端部分的目标平台，不代表只能从 GitHub 安装。远程浏览器实际操作的是运行 DSH 的那台机器，其 npm/pnpm 操作也发生在对应的 Host/profile 上。

Windows 原生 Web 端会按以下顺序寻找 pnpm：`DSH_PNPM_BIN`、当前 profile/共享 DSH pnpm 包、`PNPM_HOME`/npm 全局目录、PATH，最后尝试 Node.js 自带的 Corepack。直接运行 `.exe`/pnpm 脚本，避免 `C:\\Program Files` 这类路径被 shell 截断；需要运行 `.cmd` 时会自动加引号。命令输出优先按 UTF-8 解码，检测到 Windows GBK/GB18030 输出时自动回退，避免中文错误变成乱码。如果这些位置都没有 pnpm，请安装 Node.js/Corepack，或把 `DSH_PNPM_BIN` 设置为完整的 `pnpm.cmd` 路径，然后重启 Web 进程。

## 开发说明

`lib/` 是从已经验证过的 Harness 构建中复制出的发布产物；`src/` 用于审阅和后续维护。当前交接流程直接发布已验证产物，不要求发布 AI 先准备 Harness monorepo。

具体发布步骤见 [`HANDOFF.zh.md`](HANDOFF.zh.md) 和 [`PUBLISH.zh.md`](PUBLISH.zh.md)。
