# deepseek-harness-desktop

> DSH 网页版全家桶聚合包，一键安装 task-board、git-graph、pet、远程访问等十余个 UI 扩展与全部皮肤，并内置兼容垫片。

## Metadata

- Author: [@ningbainb](https://github.com/ningbainb)
- Repo: <https://github.com/ningbainb/deepseek-harness-desktop.git>
- GitHub: [ningbainb/deepseek-harness-desktop](https://github.com/ningbainb/deepseek-harness-desktop)
- Stars: 156
- Language: TypeScript
- License: [BSD-3-Clause](https://spdx.org/licenses/BSD-3-Clause.html)
- Homepage: <https://ningbainb.github.io/deepseek-harness-desktop/>
- Topics: `ai-agent`, `ai-coding-assistant`, `codex`, `deepseek`, `deepseek-harness`, `desktop-app`, `dsh`, `dsh-plugin`, `electron`, `electron-app`, `gui`, `open-source`, `plugin-system`, `plugins`, `remote-access`, `skills`, `ssh-client`, `windows`, `windows-desktop`
- Forks: 5
- Open Issues: 6
- Last push: 2026-08-20T05:29:52.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:ningbainb/deepseek-harness-desktop/packages/dsh-web-ui-all
```

## Wiki

## 一句话定位
DSH 网页版全家桶聚合包：一次安装自动拉入 task-board、git-graph、pet、远程访问、皮肤中心等十余个 UI 扩展与全部皮肤资源。它自身没有业务功能，仅作为分发载体与老式 DOM 钩子的兼容垫片。

## 核心能力
- 聚合 14 个子包为单一安装：一次声明即自动引入 aionui-panel / task-board / git-graph / mode-switcher / pet / particle-theme / remote-web-ui / live-stats / ssh / tool-describe-image / liangshen / web-ui-settings / skins / skin-center，避免逐个挑选与逐次安装。
- 兼容垫片 (compat shim)：当 dsh web 当前外壳只渲染 css-module 类名（如 `*_sidebarCol` / `*_centerCol` / `*_detailsCol`）而没有老式 `data-pane` / `data-dsh-frame` 属性时，浏览器半区按选择器给三列容器与根容器补写属性，让按老选择器挂载的子插件与皮肤继续生效。
- React 重渲染自动重打属性：通过 MutationObserver 监听 DOM 变化，下一帧合并为一次扫描（`requestAnimationFrame` + done 标记），React 重建列容器时自动补回；幂等检查确认所有属性就位后短路退出，不会反复刷选区。
- 设定卡优先就位：聚合顺序故意把 `ui-web-ui-settings` 排在 self 之后、其他插件之前，先声明 `web-ui.plugin.item` 子槽位，让设置组在任何卡片之前就位，避免观感上的注册顺序歧义（aggregate.yml:11-12）。
- 不破坏 React 协调：垫片只写入已有的属性值，不删节点、不改结构，与外壳的 React 渲染互不干扰。

## 技术实现
- **语言**: TypeScript
- **关键依赖**: @linxin666/dsh-client-ui-task-board / @linxin666/dsh-skins / @linxin666/dsh-client-ui-skin-center / @linxin666/dsh-client-ui-web-ui-settings / @linxin666/dsh-remote-web-ui
- **架构模式**: cordis bundle 聚合包；`aggregate.yml` 是唯一手写清单（`patchFrom` 贡献子包 `cordis.patch.yml` 的 insert 行并按顺序嵌套展开，`deps` 解析子包 name 写入 `package.json#dependencies` 作为 `workspace:*`），由 `scripts/aggregate.mjs` 自动生成 `cordis.patch.yml`；host 半区无业务逻辑，浏览器半区是 DOM 兼容垫片
- **入口文件**: src/index.ts (host，空 apply) / src/client/index.ts (compat shim)

## 适用场景
刚接触 DSH 网页版、希望立刻拿到完整增强体验（任务面板、Git 视图、宠物、远程访问、自定义皮肤）但不想逐个挑选插件的用户。同时作为官方 dsh web 外壳更新后老插件失效时的兜底垫片，保证子插件按老选择器仍能挂载。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 未声明 | 本包 package.json 未声明 dsh engines；运行时通过 `@deepseek-ai/*` SDK 隐式锁定 |
| Node | ^22.19 \|\| >=24 | 据 packages/AGENTS.md:9；本包 package.json 未声明 engines |
| 平台 | 跨平台 | 以浏览器端 patch 为主，宿主 dsh web 跨平台运行即可 |
| 原生模块 | 无 | 全部走 cordis bundle + Web DOM API，无 native binding |

## 安装方式
```bash
dsh plugin --profile web add github:ningbainb/deepseek-harness-desktop/packages/dsh-web-ui-all
```

## 配置项
本插件无需额外配置（聚合包本身无独立配置面；各子插件的配置详见其各自 README 与设置页的 Web UI 插件分组）。

## 常见问题

**Q: 安装完还需要做什么才能让插件生效？**

A: 重启 dsh web。如果是源码开发模式，除 dsh plugin add 外还需先 `pnpm install && pnpm -r build && node scripts/link-profile.mjs`，最后重启 dsh web 才生效。

**Q: 只想装其中一两个插件，不想全家桶一起装，怎么办？**

A: 直接装对应独立子包即可（如 `dsh plugin add @linxin666/dsh-client-ui-task-board`），不必走本全家桶；本包安装会激活全部子插件，无法只挑其中一部分。

**Q: 跟同名独立插件包同时安装会冲突吗？**

A: 会冲突。聚合行 id（如 `task-board`、`pet`）与独立子包 id 完全相同，cordis loader 会拒绝重复注册。切换前请先 `dsh plugin remove` 移除旧包，再装本全家桶。

**Q: 升级到新版本后新版没有生效，怎么排查？**

A: 改 profile 的 `package.json` 版本号后执行 `pnpm install`，顶层 `node_modules/@linxin666/*` 条目可能仍链接到旧版 store 目录。需要确认这些链接已指向新版（Windows: `cmd /c rmdir <link>` 再 `cmd /c mklink /J <link> <target>`），然后重启 dsh web。

**Q: 本包代码里到底装了什么自定义逻辑？**

A: host 半区没有任何业务逻辑（`apply` 是空函数）；浏览器半区只有一个 compat shim，给 dsh web 外壳侧栏/中间/详情三列容器补上老式 `data-pane` / `data-dsh-frame` 属性，让按老选择器挂载的子插件能继续工作。

**Q: 官方 dsh web 外壳升级后，本包还能正常工作吗？**

A: 可以。compat shim 用 MutationObserver 监听 DOM 变化，在下一帧合并重打属性，React 重渲染重建列容器后会自动补回属性，幂等不会重复触发。

## 上手难度
入门 — 安装一条命令即生效，无配置项；如需理解底层行为可读 README 与源码，但日常使用无需介入。

## 已知问题与限制
- 全家桶激活即全部子插件一并加载，无法只挑选部分；如需部分安装请改用对应独立子包（README.md:34）。
- 聚合行 id 与独立子包 id 完全相同（如 `task-board`、`pet`），不能与对应独立包同时安装；切换前先 `dsh plugin remove` 移除旧包（README.md:36）。
- 依赖的 `@deepseek-ai/*` SDK 版本已锁定，兼容性跟随本仓库的发版节奏，跨大版本升级前需确认 SDK 兼容（README.md:38）。
- 严格（isolated）profile 布局需在 profile 配 hoist（`nodeLinker: hoisted` 或 `public-hoist-pattern`），否则依赖解析失败（aggregate.yml:1-4）。
- 皮肤启用互斥由 `dsh-skin use` 管理，皮肤资产只进 `skins/` 目录、不进 `patchFrom` 段，更换皮肤后必须重跑 `pnpm --filter @linxin666/dsh-skins build`，否则 npm 安装后 `useSkin` 的 insert 行无法 resolve（packages/dsh-skins/AGENTS.md:18-20）。

---

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