# dsh-plugin
**Repository Path**: szjay/dsh-plugin
## Basic Information
- **Project Name**: dsh-plugin
- **Description**: DeepSeek Harness 的自研插件
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-30
- **Last Updated**: 2026-11-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DSH Plugin · DeepSeek Harness 自研插件合集
给 **DeepSeek Harness 桌面版(DSH)** 写的一组本地插件与配套工具,覆盖 **Git 提交、工作区文件树、通配符搜索、任务完成提醒、手机任务台** 五个日常场景。
插件全部以本地 `link:` 方式挂载进 DSH,不改动 DSH 本体:Host 端复用 DSH 的 connection / workingDirectory / llm / workspaceFiles 等扩展点,Client 端通过右侧栏 tab 与 slot 注入界面,零构建、只依赖 `react` 和 DSH 主题 token。
> 仓库地址:[gitee.com/szjay/dsh-plugin](https://gitee.com/szjay/dsh-plugin)
> 实测环境:DSH 桌面版 0.2.1-rc.3 · Windows 11 · Edge / Chromium 内核
---
## 插件一览
| 插件 | 目录 | 功能 | 版本 |
| --- | --- | --- | --- |
| **Git 提交面板**
`dsh-git-commit-panel` | [`dsh-git-commit/`](dsh-git-commit/README.md) | 右侧栏分析工作区改动,生成中文 Conventional Commits 提交信息,一键提交 / 推送 | 0.3.1 |
| **工作区文件树**
`dsh-workspace-tree` | [`dsh-workspace-tree/`](dsh-workspace-tree/README.md) | 浏览会话工作区文件树、预览文本、内容查找,把选中片段或文件以 `@路径 第 a–b 行` 插入任务编辑器 | 0.1.0 |
| **通配符搜索**
`dsh-wildcard-search` | [`dsh-wildcard-search/`](dsh-wildcard-search/README.md) | 用 `*` 搜索整个工作区的文本内容(行内 / 跨行、忽略大小写、可含被忽略文件),同时注册 `wildcard_search` 工具 | 0.1.0 |
| **任务完成提醒**
`dsh-task-alert` | [`dsh-task-alert/`](dsh-task-alert/README.md) | 任务跑完、或模型停下来问你问题 / 等你确认时,右下角弹提示卡 + 播放提示音(可选系统原生通知),可点回会话、一键静音 | 0.2.0 |
| **手机任务台**
`dsh-mobile` | [`dsh-mobile/`](dsh-mobile/README.md) | 手机 PWA + Node bridge,通过 Wi-Fi 或 frp + HTTPS 远程给桌面版 DSH 下任务、看实时进度 | — |
### 界面预览
| Git 提交面板 | 工作区文件树 |
| :---: | :---: |
|  |  |
| 通配符搜索 | 手机任务台 |
| :---: | :---: |
|  |  |
| 任务完成提醒 |
| :---: |
|  |
---
## 快速开始
### 环境要求
- **DSH 桌面版 0.2.1-rc.3 及以上**(各插件都按该版本宿主 API 实现)
- Windows 10 / 11(`dsh-mobile` 的启动脚本为 PowerShell;插件本身跟随 DSH 运行)
- Node.js **22+**(仅运行本仓库的验证脚本或 `dsh-mobile` 时需要)
- DSH 桌面版需**正在运行**:插件通过 Host 的 `pluginManager/installBundle` 安装
```powershell
git clone https://gitee.com/szjay/dsh-plugin.git
cd dsh-plugin
```
### 安装插件
**方式 A:图形界面**
1. 打开 DSH 桌面版 → 左侧栏 **Plugins** → **Add plugin**
2. 包字段填插件目录的**绝对路径**,例如 `<仓库路径>\dsh-git-commit`
3. 点 **Install**,等待状态变成 `applied`
4. 右侧栏「新标签页(+)」里即可看到插件入口;已有窗口可 `Ctrl+R` 重载一次
**方式 B:命令行**(插件都自带安装脚本,作用同上)
```powershell
node .\dsh-git-commit\tools\install.mjs "<仓库路径>\dsh-git-commit"
node .\dsh-workspace-tree\tools\install.mjs "<仓库路径>\dsh-workspace-tree"
node .\dsh-wildcard-search\tools\install.mjs "<仓库路径>\dsh-wildcard-search"
```
> `dsh-task-alert` 没有独立安装脚本:它只是一个普通的 bundle 包,按上面方式 A 填目录绝对路径安装即可(或在会话里让 DSH 用 `plugin_manager` 的 `install_bundle` 安装)。
> 安装方式是 `link:` 依赖:**源码目录不能移动或删除**,否则插件失效;插件代码更新后需要重启 DSH(或重载窗口)才会加载新模块。卸载:`node tools\install.mjs --remove <插件名>`,或在 Plugins 页面 Remove。
### 手机任务台
`dsh-mobile` 不是 DSH 插件,而是一套独立的手机端入口,需要单独启动:
```powershell
cd dsh-mobile
.\start-mobile.bat # 启动本机 bridge(默认 7788),控制台会显示手机访问地址和 6 位 PIN
.\status-mobile.bat # 查看状态
.\stop-mobile.bat # 停止
.\diag.bat # 手机连不上时自检
```
- **局域网**:手机与电脑同一 Wi-Fi,浏览器打开控制台给出的 `http://<电脑IP>:7788`,输入 PIN;可「添加到主屏幕」当 App 用。
- **外网远程**(可选):通过 frp + HTTPS,把手机流量转发到本机 `tls-front`,详见 [`dsh-mobile/remote/README-远程访问.md`](dsh-mobile/remote/README-远程访问.md)。
- 手机端与桌面版共享同一份会话:手机上下发的任务在桌面 GUI 里能继续看,桌面端发起的任务手机也能实时监控。
---
## 各插件说明
### Git 提交面板 `dsh-git-commit`
在会话右侧栏提供「Git 提交」面板:
- **变更分析**:`git status` + `git diff --numstat` + 限长 diff,区分新增 / 修改 / 删除 / 重命名 / 冲突 / 二进制 / 疑似密钥;暂存与未暂存分开统计
- **生成提交信息**:把结构化变更摘要交给模型,输出**中文** `type(scope): 摘要` + 要点正文(Conventional Commits);模型不可用时回退规则草稿
- **四个动作**:提交 / 推送 / 提交并推送 / **生成提交信息并推送**(默认),支持「提交时自动暂存全部变更」
- **多仓库工作区**:工作区本身不是仓库、子目录里有多份 `.git` 时,先列出全部仓库供选择,之后可随时切换
- **编码兼容**:git 输出优先 UTF-8,非法时回退 GBK;diff 按文件分段解码,UTF-8 / GBK 混排不会互相污染
- **模型工具**:额外注册只读工具 `git_commit_status`,对话里可直接问「有哪些改动」
配置项(`~/.dsh/profiles/desktop/cordis.patch.yml` 的 `config`):`gitPath`、`gitTimeoutMs`、`provider`、`model`。详见 [插件 README](dsh-git-commit/README.md)。
### 工作区文件树 `dsh-workspace-tree`
在右侧栏提供「工作区文件树」tab:
- **文件树**:以会话 `cwd` 为根,懒加载、目录优先、dotfiles 常显
- **文本预览**:等宽字体 + 行号,首屏 2000 行,支持「加载更多」(Host 单页上限 5000 行 / 2 MiB)
- **内容查找**:按关键字(大小写不敏感、纯文本子串)定位并高亮,逐一「下一个」,跨页自动续查
- **选区定位**:在预览里选中一段 → 「添加选区定位到任务」,插入 `@路径 第 a–b 行` 的原子 chip,**不插入正文**,由模型按定位自行读文件
- **@文件引用 / 插入整文件**:把当前文件以 `@` 引用 chip 插入 composer,或把整个文件内容原文按项补齐插入
- **全工作区模糊搜索**:支持子序列与多词(`plgncntrct`、`client api`),自动跳过 `node_modules` / `.git` / `dist` 等重型目录,带预算与缓存
- **会话跟随**:切会话自动按新 `cwd` 重载;`keepMounted` 保留树、文件状态;中英双语、跟随深浅色主题
规格文档:[`docs/SEARCH-SPEC.md`](dsh-workspace-tree/docs/SEARCH-SPEC.md)、[`docs/FIND-SPEC.md`](dsh-workspace-tree/docs/FIND-SPEC.md)、[`docs/PLUGIN-CONTRACT.md`](dsh-workspace-tree/docs/PLUGIN-CONTRACT.md)。
### 通配符搜索 `dsh-wildcard-search`
- **`*` 语义**:`*Service*Async*` = 先出现 `Service`、之后出现 `Async`;其余字符按字面量匹配(`\*` 表示字面量星号)
- **两种入口**:右侧栏「通配符搜索」面板 + agent 工具 `wildcard_search`
- **三个开关**:行内 / 跨行匹配、区分大小写、包含被 `.gitignore` 忽略的文件
- **只读、无索引**:复用 DSH 自带的 ripgrep,逐文件流式扫描,结果按文件分组并显示行号
- **性能参考**(本机实测):34,116 个文本文件 / 507.6 MB 源码,行内或跨行 2–3 段约 1.8–2.0 s;全量 14.4 万文件 / 12 GB 约 10 s
Host ↔ Client ↔ Tool 契约见 [`API.md`](dsh-wildcard-search/API.md),测试与验收脚本见 [`tools/README.md`](dsh-wildcard-search/tools/README.md)。
### 任务完成提醒 `dsh-task-alert`
该你出手时把人叫回来——**任务跑完**、**模型停下来问你问题 / 让你选**、**等你确认工具操作**,三种时刻各有一套提示卡与提示音:
- **浮层提示卡**:注册在 `shell.overlay` 全局浮层,右下角弹出,状态圆点 + 标题(任务已完成 / 任务出错 / 需要你回答 / 需要你确认 / 测试提醒)+ 工作区目录 + 本轮耗时,问题类卡片还会显示问句预览;9 秒自动消失、最多 4 张、点卡片回到会话
- **提示音**:Web Audio 实时合成(完成两声上行、出错两声下行、提问三声上行、确认两声同音),**不需要任何音频文件**;首次点击页面后解锁播放
- **系统原生通知**:已授予通知权限时额外弹一条(`silent: true`),窗口最小化也能看到
- **一键静音**:状态存 `localStorage`,静音时仍弹卡片但不出声
- **判定在 Host 侧**:监听 `agent/status`(running ⇄ idle),并**旁听** `user-questions/request`、`approval/request` 两个瀑布事件(只旁听、必调 `next()`,提醒坏了也不影响提问/审批);`settleMs` 静默确认期保证一轮只响一次;等你回答期间不误报「已完成」;只提醒根会话
- **传输**:SSE 长连接优先(`/api/task-alert.stream`),连不上自动退化为轮询(`/api/task-alert.pending`),带游标不丢不重,Host 重启也能恢复
三条路由与事件契约见 [`API.md`](dsh-task-alert/API.md),验收脚本(路由冒烟 / 真回合 / 真提问 / 无头 Edge 截图)见 [`tools/README.md`](dsh-task-alert/tools/README.md)。
### 手机任务台 `dsh-mobile`
- **登录**:6 位 PIN,一次登录 30 天免打扰;同 IP 连错 5 次锁 5 分钟
- **任务列表**:同步桌面版最近 50 个会话,状态点 + 相对时间 + 摘要 + 所属工作区
- **新建 / 追加 / 停止**:自然语言下发任务、运行中追加指令(按队列处理)、一键中止当前轮次
- **实时监控**:助手文字/步骤、工具调用卡片、待办清单、状态徽标实时推送
- **工作区**:手机端添加/删除工作区登记(与桌面版一致),只删登记不删任务和目录
- **运行形态**:Node 零依赖 bridge + 静态 PWA;后台进程隐藏窗口运行,登录后自启,看门狗每 60 秒自愈
架构、接口、运行说明见 [`dsh-mobile/README.md`](dsh-mobile/README.md) 与 [`dsh-mobile/CONTRACT.md`](dsh-mobile/CONTRACT.md)。
---
## 仓库结构
```text
dsh-plugin/
├─ dsh-git-commit/ # Git 提交面板插件(Host 路由 + 右侧栏 Client)
│ ├─ index.js / client.js / lib/ / locale/ / icon.svg
│ ├─ test/ # 单元自测(node test/run.mjs)
│ └─ tools/ # install / status / e2e / ui-check + 截图
├─ dsh-workspace-tree/ # 工作区文件树插件(零构建 Client + 规格文档)
│ ├─ client.js / index.js / locale/ / docs/
│ ├─ tools/ # install / ui-check + 截图
│ └─ probe/ # 独立验证脚本与验收报告(截图与结果 JSON 不入库)
├─ dsh-wildcard-search/ # 通配符搜索插件(面板 + agent 工具)
│ ├─ index.js / client.js / lib/ / tests/ / API.md
│ └─ tools/ # install / smoke / ui-check + 夹具
├─ dsh-task-alert/ # 任务完成提醒插件(Host 事件源 + shell.overlay 浮层 + 提示音)
│ ├─ index.js / client.js / API.md
│ └─ tools/ # smoke(路由)/ e2e-turn(真回合)/ ui-check(无头 Edge)+ 截图
├─ dsh-mobile/ # 手机任务台(PWA + bridge + 远程访问)
│ ├─ bridge/ # Node 后端(server / desktop-host / desktop-engine / mock)
│ ├─ pwa/ # 手机端静态页面(零构建)
│ ├─ remote/ # frp + HTTPS 远程访问脚本(本机配置与证书不入库)
│ ├─ docs/ # 协议、桌面 Host 对接、使用说明
│ └─ tools/ # 探针与端到端验收脚本
├─ .gitignore
└─ README.md
```
---
## 仓库不包含什么(安全说明)
本仓库**只提交源码、文档与验收脚本**。以下内容被 `.gitignore` 排除,也不会出现在远程仓库:
| 类别 | 说明 |
| --- | --- |
| `node_modules/`、`dsh-mobile/tools/dsh-home/` | 依赖与独立 DSH_HOME(含会话记录、凭据缓存) |
| `dsh-mobile/app-asar-extracted/`、`.research/`、`.bench/` | 第三方应用解包副本与研究/基准数据 |
| 日志、PID、运行状态 | `*.log`、`run/`、`*.pid`、`bridge/state.json`、`*.jsonl` |
| 远程访问配置与密钥 | `remote/remote.json`(含访问令牌、证书口令)、`remote/frpc-dsh.ini`(frp 令牌)、`remote/certs/`(CA 与私钥)、`remote/手机访问地址.txt` |
远程访问所需的 `frp privilege_token` **不写死在脚本里**:`start-remote.ps1` 优先读取环境变量 `FRP_PRIVILEGE_TOKEN`,其次读取本机 `remote.json` 的 `privilegeToken` 字段。首次自建远程访问时:
```powershell
cd dsh-mobile\remote
.\gen-certs.ps1 # 生成自签名 CA / 服务器证书,写入 remote.json
# 编辑 remote.json,增加: "privilegeToken": "<你的 frp 服务端 privilege_token>"
.\start-remote.ps1 # 启动 HTTPS 前门 + frpc
```
> 各插件 README 中的 `D:\Project\...` 等路径是本机开发时的示例,克隆后请替换成自己的实际路径。
---
## 开发与自测
| 插件 | 命令 |
| --- | --- |
| Git 提交面板 | `node test/run.mjs`(单元自测);`node test/inspect.mjs <仓库> all`(只读分析) |
| 工作区文件树 | `node --check client.js`;`node docs/search-reference.mjs --selftest`;`node tools/ui-check.mjs`(无头 Edge 端到端 + 截图) |
| 通配符搜索 | `node --test tests/*.test.mjs`;`node tools/smoke.mjs`;`node tools/ui-check.mjs` |
| 任务完成提醒 | `node tools/smoke.mjs`(路由 + SSE 冒烟);`node tools/e2e-turn.mjs`(真跑一轮任务,消耗一次模型调用);`node tools/ui-check.mjs`(无头 Edge:浮层 + 提示音 + 截图) |
| 手机任务台 | `node bridge/selftest.mjs --base http://127.0.0.1:7794`(先以 `--mock` 启动 bridge);`node tools/verify-desktop-share.mjs --read-only` |
> UI 验收脚本依赖 DSH 桌面版正在运行、插件已安装,并通过系统 Edge 的 headless + CDP 操作真实 GUI;首次运行前请确认 `tools/install.mjs` 已返回 `applied`。
---
## 文档索引
- [Git 提交面板 README](dsh-git-commit/README.md)
- [工作区文件树 README](dsh-workspace-tree/README.md) · [插件契约](dsh-workspace-tree/docs/PLUGIN-CONTRACT.md) · [搜索规格](dsh-workspace-tree/docs/SEARCH-SPEC.md) · [查找规格](dsh-workspace-tree/docs/FIND-SPEC.md)
- [通配符搜索 README](dsh-wildcard-search/README.md) · [API 契约](dsh-wildcard-search/API.md)
- [任务完成提醒 README](dsh-task-alert/README.md) · [API 契约](dsh-task-alert/API.md) · [验收脚本](dsh-task-alert/tools/README.md)
- [手机任务台 README](dsh-mobile/README.md) · [Bridge 契约](dsh-mobile/CONTRACT.md) · [使用说明](dsh-mobile/docs/使用说明.md) · [远程访问](dsh-mobile/remote/README-远程访问.md)
---
## 说明
- 本仓库是个人自用的插件集合,随 DSH 版本演进;插件依赖 DSH 宿主内部扩展点,升级 DSH 后可能需要同步调整。
- 各插件的 `package.json` 标注为 MIT;`dsh-mobile` 为本地工具集合,未作为 npm 包发布。
- 插件均为只读或需用户显式点击才执行写操作,不会自动提交、自动发送消息或上传数据。