dsh-click 0.3.27 → 0.3.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -2
- package/README.en.md +450 -0
- package/README.es.md +450 -0
- package/README.hi.md +450 -0
- package/README.md +268 -191
- package/README.pt.md +450 -0
- package/lib/index.js +68 -20
- package/lib/types/platform/runner.d.ts +2 -2
- package/lib/types/platform/runner.d.ts.map +1 -1
- package/lib/types/platform/types.d.ts +38 -3
- package/lib/types/platform/types.d.ts.map +1 -1
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/version.d.ts +1 -1
- package/native/win32/dsh-click-helper.ps1 +420 -79
- package/package.json +1 -1
- package/README-es.md +0 -377
- package/README-hi.md +0 -377
- package/README-pt.md +0 -377
- package/README-zh.md +0 -377
package/README.md
CHANGED
|
@@ -1,198 +1,226 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-click-hero-zh-dark.webp">
|
|
5
|
+
<img src="docs/assets/dsh-click-hero-zh-light.webp" width="100%" alt="dsh-click:窗口的无障碍元素(e12 Edit、e13 Button)经 screen_read 变成 observationId,动作以 basedOn 引用它,穿过新鲜度、审批与进程身份安全边界,由 Windows UIA helper 执行,并写入 dsh-click/observed 与 dsh-click/action 审计事件">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
8
|
+
# dsh-click
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
**让模型看见屏幕、动手操作——每个变更动作都过审批,每次观察与操作都留审计。**
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
面向 DeepSeek Harness 的原生桌面控制插件(Windows 优先):无障碍树与像素提示让纯文本模型也能“看”,窗口级点击与输入让模型“动”,审批、新鲜度与进程身份校验守在中间。
|
|
12
13
|
|
|
13
|
-
[
|
|
14
|
-
[](https://github.com/topics/dsh-plugin)
|
|
15
|
-
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
|
|
16
|
-
[](https://dsh.market/)
|
|
17
|
-
[](#)
|
|
18
|
-
[](https://github.com/PerryLink/dsh-click/actions)
|
|
19
|
-
[](https://github.com/PerryLink/dsh-click/releases)
|
|
20
|
-
[](https://www.npmjs.com/package/dsh-click)
|
|
21
|
-
[](https://www.npmjs.com/package/dsh-click)
|
|
14
|
+
[安装](#三步上手) · [配置](#配置) · [FAQ](#faq) · [简体中文](README.md) · [English](README.en.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
22
15
|
|
|
23
|
-
[
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](#兼容性)
|
|
18
|
+
[](https://www.npmjs.com/package/dsh-click)
|
|
19
|
+
[](https://github.com/PerryLink/dsh-click/actions/workflows/ci.yml)
|
|
20
|
+
[](#兼容性)
|
|
21
|
+
|
|
22
|
+
[](https://github.com/PerryLink/dsh-click/stargazers)
|
|
23
|
+
[](https://www.npmjs.com/package/dsh-click)
|
|
24
|
+
[](https://dshfind.com/plugins/PerryLink/dsh-click?ref=badge)
|
|
25
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-click)
|
|
26
|
+
[](https://dsh.market/)
|
|
27
|
+
[](https://gitee.com/perrylink/dsh-click)
|
|
24
28
|
|
|
25
29
|
```sh
|
|
26
30
|
dsh plugin --profile <name> add dsh-click
|
|
27
31
|
```
|
|
28
32
|
|
|
29
|
-
|
|
30
33
|
</div>
|
|
31
34
|
|
|
32
|
-
|
|
35
|
+
<sub>社区插件,与 DeepSeek 官方无关。唯一仓库:<https://github.com/PerryLink/dsh-click>(Gitee 为镜像)。</sub>
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
## 它是什么
|
|
35
38
|
|
|
36
|
-
|
|
37
|
-
## Install & uninstall
|
|
39
|
+
`dsh-click` 给模型一条完整的「观察 → 行动」通道:先用 `screen_read` 读窗口的无障碍树(元素 id、类型、名称、矩形、支持的模式)与像素位置提示,或用 `screen_shot` 截一张图;再用 `click` / `type` / `scroll` / `key` 按元素 id 或坐标操作同一个窗口。每个变更性动作都必须引用一次新鲜观察(`basedOn`)——屏幕变了或观察过期就拒绝,并给出模型可读的理由;默认还要过 `ctx.approval` 审批,动作前后各校验一次目标进程身份。它默认不抢前台焦点(`focusFallback: never`),所有观察与操作都落成脱敏的 `dsh-click/observed` / `dsh-click/action` 审计事件。
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
41
|
+
<picture>
|
|
42
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-click-flow-v5-dark.svg">
|
|
43
|
+
<img src="docs/assets/dsh-click-flow-v5-light.svg" width="100%" alt="dsh-click 的边界双侧结构:左侧只读观察面(screen_read / screen_shot / screen_find / app_list)产出 observationId;中间 SAFETY BOUNDARY 依次校验 basedOn、新鲜度、审批、helper 派发与进程身份,拒绝路径回到重新观察;右侧变更动作面(click / type / scroll / key / app_launch)经 helper 作用于目标窗口;底部是 dsh-click/observed 与 dsh-click/action 两条脱敏审计事件">
|
|
44
|
+
</picture>
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
## 三步上手
|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
1. **安装**(三选一):
|
|
47
49
|
|
|
48
|
-
|
|
50
|
+
```sh
|
|
51
|
+
# git 渠道(最新 main;等价于 git+https://github.com/PerryLink/dsh-click.git)
|
|
52
|
+
dsh plugin --profile web add github:PerryLink/dsh-click
|
|
53
|
+
# npm 渠道(已发布版本)
|
|
54
|
+
dsh plugin --profile web add dsh-click
|
|
55
|
+
# tarball 渠道:本仓库 pnpm pack 后
|
|
56
|
+
dsh plugin --profile web add ./dsh-click-<version>.tgz
|
|
57
|
+
```
|
|
49
58
|
|
|
50
|
-
|
|
59
|
+
git 渠道的 `prepare` 脚本只用生产依赖构建。
|
|
51
60
|
|
|
61
|
+
2. **最小配置**(默认即可用;只对特定窗口免审批时再动 `autoApproveWindows`):
|
|
52
62
|
|
|
53
|
-
|
|
63
|
+
```yaml
|
|
64
|
+
- insert:
|
|
65
|
+
- id: dsh-click
|
|
66
|
+
name: dsh-click
|
|
67
|
+
config:
|
|
68
|
+
requireApproval: true
|
|
69
|
+
autoApproveWindows: ['^Notepad']
|
|
70
|
+
focusFallback: never
|
|
71
|
+
```
|
|
54
72
|
|
|
55
|
-
|
|
73
|
+
3. **验证已生效**(重启后):
|
|
56
74
|
|
|
57
|
-
|
|
75
|
+
```sh
|
|
76
|
+
dsh --profile web --dump-config | grep -A3 'id: dsh-click'
|
|
77
|
+
```
|
|
58
78
|
|
|
59
|
-
|
|
79
|
+
然后让 agent 观察窗口并操作——每次变更性操作都会弹出审批:
|
|
60
80
|
|
|
61
|
-
|
|
81
|
+
```text
|
|
82
|
+
> 打开记事本,输入 "hello",再读回屏幕上的内容。
|
|
83
|
+
```
|
|
62
84
|
|
|
85
|
+
**卸载**:`dsh plugin --profile web remove dsh-click`(或从 profile patch 删掉该行)。
|
|
63
86
|
|
|
87
|
+
> 如果 pnpm 对本包报 `ERR_PNPM_IGNORED_BUILDS`(esbuild 的平台二进制无害校验),在你的 `pnpm-workspace.yaml` 中加入 `allowBuilds: { esbuild: true }` —— `dsh` CLI 会打印确切片段。
|
|
64
88
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
| Surface | Status |
|
|
68
|
-
|---|---|
|
|
69
|
-
| Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (GitHub tag, verified 2026-09-25). Verified 2026-09-11 against the dsh-v0.1.7-alpha.1 master checkout (full gate chain + profile install smoke). |
|
|
70
|
-
| Node | `^22.19.0 \|\| >=24.0.0` |
|
|
71
|
-
| Platforms | **Windows first** (UIAutomation + Win32 input, via a bundled PowerShell helper); macOS/Linux backends are reserved and fail closed with a clear reason |
|
|
72
|
-
| Model | Text-only models fully supported (`screen_read` returns structured text); vision models additionally get `screen_shot` images |
|
|
73
|
-
|
|
74
|
-
## What you get
|
|
75
|
-
|
|
76
|
-
`dsh-click` gives the harness a complete observe → act loop over native desktop applications:
|
|
77
|
-
|
|
78
|
-
- **`screen_shot`** — screenshot of a window (or the primary screen), downscaled to a configurable bound. With a vision-capable model the result carries the image; otherwise a text description keeps text-only models working.
|
|
79
|
-
- **`screen_read`** — the structured observation: the window's accessibility tree (element ids, types, names, rectangles, supported patterns) plus pixel-location hints with colors — plain text, no image model required.
|
|
80
|
-
- **`click` / `type` / `scroll` / `key`** — window-scoped actions addressed by element id or coordinates. Delivery prefers UIA invoke, falls back to posted window messages — and **never steals foreground focus**.
|
|
81
|
-
- **`app_list` / `app_launch`** — enumerate running applications and their windows; launch one by name or path.
|
|
89
|
+
<details>
|
|
90
|
+
<summary>从 DSH Desktop 市场安装</summary>
|
|
82
91
|
|
|
83
|
-
|
|
92
|
+
所有 PerryLink 插件均可在 DSH Desktop 内置市场中浏览:**市场 → 来源 → 添加来源 → 粘贴** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ 选中**。安装仍需通过市场的 npm 身份校验与你的确认。
|
|
84
93
|
|
|
85
|
-
|
|
86
|
-
2. **Approval** — `ctx.approval` gates every action by default; window-title/executable regexes can allowlist specific windows (still audited).
|
|
87
|
-
3. **Process identity** — the owning process's pid and executable path are verified before **and** after the act; a change refuses the outcome loudly.
|
|
88
|
-
4. **Audit** — observations and actions land in the session log as `dsh-click/observed` / `dsh-click/action` events (sanitized, log-only).
|
|
94
|
+
</details>
|
|
89
95
|
|
|
90
|
-
|
|
91
|
-
model harness
|
|
92
|
-
│ screen_read ──▶ observationId (+ elements, pixels) ← structured text
|
|
93
|
-
│ click {basedOn, target} ──▶ freshness check ──▶ approval ──▶ helper (UIA)
|
|
94
|
-
│ pixel hash changed? ── refuse + re-observe
|
|
95
|
-
│ pid/exe changed after act? ── PROCESS_CHANGED
|
|
96
|
-
│ ◀── canonical JSON + audit events (dsh-click/action)
|
|
97
|
-
```
|
|
96
|
+
## 核心能力
|
|
98
97
|
|
|
99
|
-
|
|
98
|
+
`dsh-click` 把原生桌面拆成可审计的观察面与动作面:
|
|
100
99
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
- **`screen_shot`** —— 截取窗口(或主屏幕),按 `maxScreenshotSide` 缩放。窗口截图优先走 `PrintWindow(PW_RENDERFULLCONTENT)`,不受其它窗口遮挡影响;结果里的 `captureMethod` 写明实际路径。模型支持图像时结果附带图片;纯文本模型则得到文字描述,照常可用。
|
|
101
|
+
- **`screen_read`** —— 结构化观察:无障碍树(元素 id、类型、名称、矩形、支持的模式)加像素位置提示与颜色 —— 纯文本,无需图像模型。
|
|
102
|
+
- **`screen_find`** —— 对没有无障碍树的应用,用可选 OCR(`ocr.*`,挂载时探测 tesseract)或视觉 grounding 按文字/描述找可点目标,返回屏幕坐标与 `observationId`;只读,不需要审批。
|
|
103
|
+
- **`click` / `type` / `scroll` / `key`** —— 以元素 id 或坐标寻址的窗口级操作。优先 UIA invoke,回退到 post 窗口消息,且默认绝不抢占前台焦点;`type` 走 UIA `ValuePattern` 快路径,失败再用 `SendInput` 注入真实按键(CJK 安全);`key` 对忽略 post 输入的应用会大声拒绝。
|
|
104
|
+
- **`app_list` / `app_launch`** —— 枚举运行中的应用及其可见窗口(最小化窗口标 `minimized: true` 且不返回 `rect`);按名称或可执行路径启动应用。
|
|
104
105
|
|
|
105
|
-
|
|
106
|
-
# 1. install the bundle into your profile
|
|
107
|
-
dsh plugin --profile web add github:PerryLink/dsh-click
|
|
106
|
+
每个变更性操作都穿过同一条安全边界:
|
|
108
107
|
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
1. **新鲜度** —— 操作必须引用 `basedOn` 观察;执行前重新捕获窗口,像素哈希(`staleCheckPixels`)或控件树(`staleCheckTree`)变化、或观察超过 `maxObservationAgeMs`,即拒绝并要求重新观察。
|
|
109
|
+
2. **审批** —— 默认经 `ctx.approval` 门禁;`autoApproveWindows` 的窗口标题/可执行路径正则可放行特定窗口(仍做新鲜度与进程身份校验,仍记录审计)。
|
|
110
|
+
3. **进程身份** —— 操作前后分别校验所属进程 pid 与可执行路径;中途换进程即大声拒绝(`PROCESS_CHANGED`)。
|
|
111
|
+
4. **审计** —— 观察与操作以 `dsh-click/observed` / `dsh-click/action` 事件写入会话日志(脱敏、仅日志)。
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
```text
|
|
114
|
+
模型 harness
|
|
115
|
+
│ screen_read ──▶ observationId (+ 元素、像素) ← 结构化文本
|
|
116
|
+
│ click {basedOn, target} ──▶ 新鲜度校验 ──▶ 审批 ──▶ helper (UIA)
|
|
117
|
+
│ 像素哈希变化? ── 拒绝 + 要求重新观察
|
|
118
|
+
│ 操作后 pid/exe 变化? ── PROCESS_CHANGED
|
|
119
|
+
│ ◀── 规范 JSON + 审计事件 (dsh-click/action)
|
|
114
120
|
```
|
|
115
121
|
|
|
116
|
-
|
|
122
|
+
### 工具面
|
|
117
123
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
124
|
+
| 工具 | 只读 | 需要审批 | 说明 |
|
|
125
|
+
|---|---|---|---|
|
|
126
|
+
| `screen_shot` | ✅ | — | 返回 `observationId` 供后续操作在 `basedOn` 中引用;模型支持图像时附带图片 |
|
|
127
|
+
| `screen_read` | ✅ | — | 无障碍树 + 像素提示;元素 id 是操作的寻址方式 |
|
|
128
|
+
| `screen_find` | ✅ | — | 无 UIA 树时的 OCR/视觉定位;返回坐标目标 + `observationId` |
|
|
129
|
+
| `click` | | ✅ | `elementId` 与 `(x, y)` 二选一;优先 UIA invoke,回退 post 消息 |
|
|
130
|
+
| `type` | | ✅ | 仅限 value 模式元素;失败时备份并还原控件文本 |
|
|
131
|
+
| `scroll` | | ✅ | 元素(scroll 模式)或窗口(post 滚轮) |
|
|
132
|
+
| `key` | | ✅ | post 按键组合(`"Ctrl+S"`);忽略 post 输入的应用会大声拒绝 |
|
|
133
|
+
| `app_list` | ✅ | — | 运行中的应用及其可见窗口 |
|
|
134
|
+
| `app_launch` | | ✅ | 按名称或可执行路径启动,可带参数 |
|
|
121
135
|
|
|
122
|
-
###
|
|
136
|
+
### 截图与坐标空间
|
|
123
137
|
|
|
124
|
-
|
|
138
|
+
- **带 `target` 才是窗口截图;不带 `target` 抓的是主屏**(`snapshot.windowId = 0`、`title = "primary screen"`),不是前台窗口。要整个虚拟桌面(多屏,含负坐标)请传 `scope: "virtual"`;该模式标注为**实验性**,多屏几何尚未完整验证。
|
|
139
|
+
- **窗口截图先走 `PrintWindow(hwnd, hdc, PW_RENDERFULLCONTENT)`**:窗口自己绘制,不受其它窗口遮挡影响;失败或空图时依次回退 `PrintWindow(0)` 与 `CopyFromScreen`。结果里的 `captureMethod` 为 `printwindow-fullcontent` / `printwindow` / `copyfromscreen`,直接说明这张图是怎么来的。
|
|
140
|
+
- **`width` / `height` 是位图尺寸,不是窗口尺寸**:它们已被 `maxScreenshotSide` 下采样;`snapshot.rect` 始终是物理像素的窗口(或屏幕)矩形。换算方式:`bitmapX = (screenX - rect.x) * width / rect.width`。
|
|
141
|
+
- **所有矩形都是物理像素**:DPI 感知在 helper 启动时设置(Per-Monitor V2),`app_list`、`screen_read`、`screen_shot` 与 `click` 共用同一坐标空间。
|
|
142
|
+
- **最小化窗口**:`app_list` 标记 `minimized: true` 并且不返回 `rect`(Windows 在最小化时给的是 `-32000` 占位矩形);`screen_shot` / `screen_read` 对它明确报 `WINDOW_MINIMIZED`,请先还原窗口。
|
|
125
143
|
|
|
126
|
-
#### Detailed example
|
|
127
144
|
|
|
128
|
-
|
|
145
|
+
### 示例
|
|
129
146
|
|
|
130
|
-
|
|
131
|
-
app_list
|
|
132
|
-
~~~
|
|
147
|
+
以下为插件真实入口;安装后调用一个即可。
|
|
133
148
|
|
|
134
|
-
|
|
149
|
+
**详细示例** — 命令 `app_list`,输入:
|
|
135
150
|
|
|
136
|
-
|
|
151
|
+
```json
|
|
137
152
|
{}
|
|
138
|
-
|
|
153
|
+
```
|
|
139
154
|
|
|
140
|
-
|
|
155
|
+
输出:
|
|
141
156
|
|
|
142
|
-
|
|
157
|
+
```text
|
|
143
158
|
1 running application(s) with windows:
|
|
144
159
|
- Demo (pid 4242, C:\Apps\demo.exe)
|
|
145
160
|
- [windowId 1122867] "Demo App" at (10, 20) 800x600
|
|
146
|
-
|
|
161
|
+
```
|
|
147
162
|
|
|
148
163
|
*Observed from `plugins/dsh-click/tests/tools.spec.ts:159-185; renderer at src/tools.ts:933-942`*
|
|
149
164
|
|
|
150
|
-
|
|
165
|
+
**失败分支** — 输入:
|
|
151
166
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
~~~text
|
|
167
|
+
```text
|
|
155
168
|
{}
|
|
156
|
-
|
|
169
|
+
```
|
|
157
170
|
|
|
158
|
-
|
|
171
|
+
输出:
|
|
159
172
|
|
|
160
|
-
|
|
173
|
+
```text
|
|
161
174
|
Error: dsh-click backend unavailable on linux: Linux backend is reserved but not implemented yet (Windows-first); only Windows can act today
|
|
162
|
-
|
|
175
|
+
```
|
|
163
176
|
|
|
164
177
|
*Observed from `plugins/dsh-click/src/platform/selection.ts:61-62,81; plugins/dsh-click/src/tools.ts:133-136; plugins/dsh-click/tests/tools.spec.ts:226-245`*
|
|
165
178
|
|
|
166
|
-
|
|
179
|
+
**简短示例**:`screen_read` · `app_list`
|
|
180
|
+
|
|
181
|
+
## 配置
|
|
167
182
|
|
|
168
|
-
|
|
169
|
-
- `app_list`
|
|
183
|
+
所有可调项都是 Schemastery `Config` 字段(可在 cordis.yml 中修改)。按 id 定向覆盖会替换整行 —— 需要重述每个键。`cordis.patch.yml` 逐键内联注释。
|
|
170
184
|
|
|
171
|
-
|
|
185
|
+
最常用键:
|
|
172
186
|
|
|
173
|
-
|
|
187
|
+
| 键 | 默认值 | 含义 |
|
|
188
|
+
|---|---|---|
|
|
189
|
+
| `requireApproval` | `true` | 每个变更性操作都过审批;观察类工具从不询问 |
|
|
190
|
+
| `autoApproveWindows` | `[]` | 跳过审批询问的窗口标题/可执行路径正则(仍做新鲜度与进程身份校验,仍记录审计) |
|
|
191
|
+
| `focusFallback` | `never` | 操作是否可在最后手段下把目标窗口带到前台(`never` / `allow`) |
|
|
192
|
+
| `imageMode` | `auto` | `screen_shot` 渲染:`auto`(模型支持图像时附图像,否则文字)或 `text` |
|
|
193
|
+
| `staleCheckPixels` | `true` | 每次操作前对比新像素哈希,变化即拒绝 |
|
|
194
|
+
| `staleCheckTree` | `target` | 控件树新鲜度:`target` 校验目标元素(默认),`strict` 任一节点变化即拒绝,`off` 跳过整树哈希(身份/年龄/像素检查仍生效) |
|
|
195
|
+
| `maxObservationAgeMs` | `30000` | 操作可引用观察的最大时限(毫秒,1000..600000) |
|
|
196
|
+
| `auditSessionEvents` | `true` | 是否追加 `dsh-click/observed` / `dsh-click/action` 审计事件;设为 `false` 可完全停止审计追加 |
|
|
197
|
+
|
|
198
|
+
<details>
|
|
199
|
+
<summary>完整配置表(17 行)</summary>
|
|
174
200
|
|
|
175
|
-
|
|
|
201
|
+
| 键 | 默认值 | 含义 |
|
|
176
202
|
|---|---|---|
|
|
177
|
-
| `requireApproval` | `true` |
|
|
178
|
-
| `autoApproveWindows` | `[]` |
|
|
179
|
-
| `auditSessionEvents` | `true` |
|
|
180
|
-
| `focusFallback` | `never` |
|
|
181
|
-
| `imageMode` | `auto` | `screen_shot`
|
|
182
|
-
| `helperTimeoutMs` | `30000` |
|
|
183
|
-
| `maxHelperOutputBytes` | `25165824` |
|
|
184
|
-
| `maxScreenshotSide` | `2560` |
|
|
185
|
-
| `staleCheckPixels` | `true` |
|
|
186
|
-
| `staleCheckTree` | `target` |
|
|
187
|
-
| `maxObservationAgeMs` | `30000` |
|
|
188
|
-
| `maxCachedObservations` | `8` | LRU
|
|
189
|
-
| `maxElements` | `500` |
|
|
190
|
-
| `maxTreeDepth` | `32` |
|
|
191
|
-
| `maxTextLength` | `200` |
|
|
192
|
-
| `rollbackEnabled` | `true` |
|
|
193
|
-
| `ocr.enabled` / `command` / `language` | `true` / `tesseract` / `eng` |
|
|
194
|
-
|
|
195
|
-
|
|
203
|
+
| `requireApproval` | `true` | 每个变更性操作都过审批;观察类工具从不询问 |
|
|
204
|
+
| `autoApproveWindows` | `[]` | 跳过审批询问的窗口标题/可执行路径正则(仍做新鲜度与进程身份校验,仍记录审计) |
|
|
205
|
+
| `auditSessionEvents` | `true` | 追加 `dsh-click/observed` / `dsh-click/action` 会话审计事件。自适应门已在无信封宿主(rc.6–rc.8、0.1.1-rc.2,以及对未知类型读取即失败的 0.1.2-rc.1)上跳过追加;设为 `false` 可完全停止审计追加。`0.1.2-rc.1`(2026-09-02 已适配):会话信封保留 ignorable 字段但仅用于存量日志读取兼容——`Session.append` 仍无法盖章,门控行为不变 |
|
|
206
|
+
| `focusFallback` | `never` | 操作是否可在最后手段下把目标窗口带到前台(`never` / `allow`) |
|
|
207
|
+
| `imageMode` | `auto` | `screen_shot` 渲染:`auto`(模型支持图像时附图像,否则文字)或 `text` |
|
|
208
|
+
| `helperTimeoutMs` | `30000` | 每次 helper 调用的超时(毫秒,1..300000) |
|
|
209
|
+
| `maxHelperOutputBytes` | `25165824` | 单次 helper 响应的字节上限(1024..67108864) |
|
|
210
|
+
| `maxScreenshotSide` | `2560` | 截图最长边像素(320..7680);超出即缩放 |
|
|
211
|
+
| `staleCheckPixels` | `true` | 每次操作前对比新像素哈希,变化即拒绝 |
|
|
212
|
+
| `staleCheckTree` | `target` | 控件树新鲜度:`target` 校验目标元素(默认),`strict` 任一节点变化即拒绝,`off` 跳过整树哈希(身份/年龄/像素检查仍生效) |
|
|
213
|
+
| `maxObservationAgeMs` | `30000` | 操作可引用观察的最大时限(毫秒,1000..600000) |
|
|
214
|
+
| `maxCachedObservations` | `8` | 观察缓存 LRU 上限(1..64) |
|
|
215
|
+
| `maxElements` | `500` | 每次 `screen_read` 的无障碍元素上限(1..2000) |
|
|
216
|
+
| `maxTreeDepth` | `32` | 无障碍树遍历最大深度(1..64) |
|
|
217
|
+
| `maxTextLength` | `200` | 脱敏后模型可见字符串的截断长度(16..10000) |
|
|
218
|
+
| `rollbackEnabled` | `true` | `type` 失败时备份并还原控件文本 |
|
|
219
|
+
| `ocr.enabled` / `command` / `language` | `true` / `tesseract` / `eng` | `screen_find` 的可选 OCR(挂载时探测;无 tesseract 时降级为不可用) |
|
|
220
|
+
|
|
221
|
+
</details>
|
|
222
|
+
|
|
223
|
+
profile patch 中的覆盖示例:
|
|
196
224
|
|
|
197
225
|
```yaml
|
|
198
226
|
- insert:
|
|
@@ -204,87 +232,132 @@ Example override in your profile patch:
|
|
|
204
232
|
focusFallback: never
|
|
205
233
|
```
|
|
206
234
|
|
|
207
|
-
##
|
|
235
|
+
## FAQ
|
|
208
236
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
| `screen_shot` | ✅ | — | Returns an `observationId` later actions cite in `basedOn`; image attachment when the model accepts images |
|
|
212
|
-
| `screen_read` | ✅ | — | Accessibility tree + pixel hints; element ids are what actions address |
|
|
213
|
-
| `click` | | ✅ | Exactly one of `elementId` or `(x, y)`; UIA invoke preferred, posted messages fallback |
|
|
214
|
-
| `type` | | ✅ | Value-pattern elements only; backs up and restores control text on failure |
|
|
215
|
-
| `scroll` | | ✅ | Element (scroll pattern) or window (posted wheel) |
|
|
216
|
-
| `key` | | ✅ | Posted key combinations (`"Ctrl+S"`); apps that ignore posted input refuse loudly |
|
|
217
|
-
| `app_list` | ✅ | — | Running applications and their visible windows |
|
|
218
|
-
| `app_launch` | | ✅ | By name or executable path, with optional arguments |
|
|
237
|
+
<details>
|
|
238
|
+
<summary>截图和观察缓存存在哪?会不会把屏幕内容写到磁盘?</summary>
|
|
219
239
|
|
|
220
|
-
|
|
240
|
+
`screen_shot` 的截图存进 harness 的 attachment store(内容寻址,受宿主附件策略约束),并只随该次工具结果提供给你正在用的模型。观察本身只在内存里(`maxCachedObservations` 有界 LRU,重启即失);除此之外插件不落盘、不发网络请求、不存凭据。落进会话日志的只有 `dsh-click/*` 审计事件,窗口标题、可执行路径与自由文本在写入或展示前先脱敏并截断。
|
|
221
241
|
|
|
222
|
-
|
|
223
|
-
- **Data**: the plugin stores nothing on disk except the screenshots the attachment store keeps (content-addressed, under the harness's own attachment policy). Observations are cached in memory (LRU, bounded). No network requests, no credential storage.
|
|
224
|
-
- **Session log**: `dsh-click/observed` and `dsh-click/action` are log-only audit events carrying sanitized window/process facts — titles, paths, and free text are redacted and length-capped before they are written or shown.
|
|
242
|
+
</details>
|
|
225
243
|
|
|
226
|
-
|
|
244
|
+
<details>
|
|
245
|
+
<summary>在 macOS / Linux 上会怎样?会静默失败吗?</summary>
|
|
246
|
+
|
|
247
|
+
不会静默。这两个平台的后端已预留但未实现,每次调用都以模型可读的原因失败关闭(`dsh-click backend unavailable on linux: ...`);profile 在哪个平台都能正常启动。Windows 上若缺 `subprocess` 服务或 helper 不可用,同样大声拒绝,而不是假装成功。
|
|
227
248
|
|
|
228
|
-
|
|
229
|
-
- **Approval is the default.** `requireApproval: true` unless you explicitly opt specific windows in; every action — allowed or not — is audit-logged.
|
|
230
|
-
- **No foreground stealing.** The helper never brings a target window to the foreground (`focusFallback: 'never'` by default); input is delivered through UIA or posted messages so background windows are not disturbed.
|
|
231
|
-
- **Process identity is re-verified** immediately before and after each action; a mid-act process swap fails the outcome (`PROCESS_CHANGED`).
|
|
232
|
-
- **Sanitized output.** Control characters are stripped, tabs collapse, credential-shaped values (keys, tokens, JWTs, bearer headers) are redacted before anything reaches the model or the log.
|
|
233
|
-
- **Fail closed.** Unsupported platforms, a missing subprocess service, or an unavailable helper refuse every call loudly — profiles keep booting everywhere.
|
|
249
|
+
</details>
|
|
234
250
|
|
|
235
|
-
|
|
251
|
+
<details>
|
|
252
|
+
<summary>会和其他插件抢命令、服务或 slot 吗?</summary>
|
|
253
|
+
|
|
254
|
+
不提供任何 service key,只消费两个可选 seam(`dsh-click/backend`、`dsh-click/grounding`,测试/嵌入用);不注册客户端 slot、不注册 `webServer` 路由、不装任何 waterfall 监听器;审计事件全部落在 `dsh-click/*` 命名空间。每次工具注册都包在 `ctx.effect` 里,停止/热重载只撤销自己注册的工具。
|
|
255
|
+
|
|
256
|
+
</details>
|
|
257
|
+
|
|
258
|
+
<details>
|
|
259
|
+
<summary>性能开销多大?每次动作都要重新截图吗?</summary>
|
|
260
|
+
|
|
261
|
+
观察按需产生:`screen_read` 只读无障碍树(纯文本),`screen_shot` 才编码 PNG。每次变更性动作前会重新捕获一次目标窗口做新鲜度对比(默认像素哈希 + 控件树),这是安全边界的一部分;helper 调用有 `helperTimeoutMs` / `maxHelperOutputBytes` 兜底,观察缓存默认只留 8 条。
|
|
262
|
+
|
|
263
|
+
</details>
|
|
236
264
|
|
|
237
|
-
|
|
238
|
-
- **Text-only fidelity.** `screen_read` depends on the application exposing UIAutomation; apps without an accessible tree yield pixel hints only. Coordinate clicks remain available.
|
|
239
|
-
- **Posted-input apps.** Some applications ignore posted window messages (games, some Electron surfaces); `key` reports this honestly instead of pretending success.
|
|
240
|
-
- **Session audit on envelope-less harness builds.** The audit events ride an adaptive gate: hosts that know the vocabulary append plainly, hosts with the `ignorable` envelope append with the marker, and envelope-less hosts — `0.1.0-rc.6`–`0.1.0-rc.8`, `0.1.1-rc.2`, and `0.1.2-rc.1` (which cannot stamp the ignorable marker — the envelope field is retained for stored-log read compatibility only — and fails closed on unknown types at read) — get no audit append; the tool results remain the reconstructable audit trail. Set `auditSessionEvents: false` to stop audit appends entirely.
|
|
265
|
+
## 安全边界
|
|
241
266
|
|
|
242
|
-
|
|
267
|
+
- **先观察后行动,每次如此。** 操作必须引用新鲜观察;屏幕变化(像素哈希)或观察过期即拒绝,并以模型可读的原因要求重新观察。
|
|
268
|
+
- **审批是默认。** 除非你显式放行特定窗口,否则 `requireApproval: true`;每次操作 —— 无论放行与否 —— 都记录审计。
|
|
269
|
+
- **不抢前台焦点。** helper 从不把目标窗口带到前台(默认 `focusFallback: 'never'`);输入经 UIA 或 post 消息送达,不打扰后台窗口。`focusFallback: 'allow'` 是唯一被认可的例外。
|
|
270
|
+
- **进程身份前后复验。** 每个操作前后立即校验进程身份;操作中途进程被替换则判失败(`PROCESS_CHANGED`)。
|
|
271
|
+
- **输出脱敏。** 控制字符被剥离、制表符折叠、凭据形态内容(密钥、token、JWT、bearer 头)在到达模型或日志前一律打码。
|
|
272
|
+
- **失败关闭。** 不支持的平台、缺失的 subprocess 服务或不可用的 helper 都会大声拒绝每个调用 —— profile 在任何地方都能正常启动。
|
|
273
|
+
|
|
274
|
+
## 权限与数据
|
|
275
|
+
|
|
276
|
+
- **权限**:变更性操作走官方 `ctx.approval` 接缝 —— 插件从不重实现或绕过它。`autoApproveWindows` 只会*对特定窗口跳过询问*,不能关闭新鲜度或进程身份校验。`dshWorkshop` manifest 声明 `fs:read`、`subprocess:spawn`、`session:append`、`network:none`、`native-code:none`。
|
|
277
|
+
- **数据**:除 attachment store 保存的截图(内容寻址、受 harness 自身附件策略约束)外,插件不落盘任何东西。观察仅存内存(有界 LRU)。无网络请求,不存凭据。
|
|
278
|
+
- **会话日志**:`dsh-click/observed` 与 `dsh-click/action` 是仅日志的审计事件,携带脱敏后的窗口/进程事实 —— 标题、路径与自由文本在写入或展示前均先脱敏并截断。
|
|
279
|
+
|
|
280
|
+
## 已知限制
|
|
281
|
+
|
|
282
|
+
- **Windows 优先。** macOS 与 Linux 后端已预留;在这些平台上每次调用都以明确原因失败关闭。
|
|
283
|
+
- **纯文本保真度。** `screen_read` 依赖应用暴露 UIAutomation;没有无障碍树的应用只有像素提示与 `screen_find` 的 OCR/grounding 路径。坐标点击仍然可用。
|
|
284
|
+
- **post 输入类应用。** 部分应用忽略 post 窗口消息(游戏、部分 Electron 界面);`key` 会如实报告而非假装成功。0.3.24 起 `type` 的 `SendInput` 回退覆盖了真实键盘输入与 CJK 混排,但仍受目标应用自身的输入模型限制。
|
|
285
|
+
- **无信封 harness 构建上的会话审计。** 审计事件走自适应门:认识该词汇的宿主直接追加,带 `ignorable` 信封的宿主带标记追加,无信封宿主——`0.1.0-rc.6`–`0.1.0-rc.8`、`0.1.1-rc.2` 以及无法盖章 ignorable 标记(信封字段仅为存量日志读取兼容而保留)且对未知类型读取即失败的 `0.1.2-rc.1`——不追加审计事件;工具结果仍是可重建的审计轨迹。设 `auditSessionEvents: false` 可完全停止审计追加。
|
|
286
|
+
|
|
287
|
+
## 与其他 DSH 插件的互操作性
|
|
288
|
+
|
|
289
|
+
`dsh-click` 只暴露工具面,不参与其他插件的接缝:
|
|
290
|
+
|
|
291
|
+
- **只注入两个硬服务。** `inject = ['tools', 'subprocess']`;不提供任何 service key,因此不存在服务键冲突。
|
|
292
|
+
- **不占客户端与 HTTP 资源。** 不注册客户端 slot、不注册 `webServer` 路由、不装 `agent/pre-step` / `tools/post-execute` 等 waterfall 监听器,也不改全局对象。
|
|
293
|
+
- **审计命名空间隔离。** 只写 `dsh-click/observed` 与 `dsh-click/action` 两个事件;宿主不认识该词汇时自适应门直接跳过,工具结果仍是可重建的审计轨迹。
|
|
294
|
+
- **可选 seam 可缺省。** `dsh-click/backend` 与 `dsh-click/grounding` 只服务测试/嵌入;真实部署缺省回退到平台选择,不要求任何其他插件在场。
|
|
295
|
+
- **注册即 effect。** 每次 `ctx.tools.register` 都包在 `ctx.effect` 里,停止/热重载只撤销自己注册的工具。
|
|
296
|
+
|
|
297
|
+
## 兼容性
|
|
298
|
+
|
|
299
|
+
| 维度 | 状态 |
|
|
300
|
+
|---|---|
|
|
301
|
+
| Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1`(GitHub tag,2026-09-25 已核验)。已于 2026-09-11 对照 `dsh-v0.1.7-alpha.1` master checkout 核验(完整门禁链 + profile 安装冒烟)。`engines.dsh`:`>=0.2.1-0 <0.3.0 \|\| >=0.2.2-0 <0.3.0` |
|
|
302
|
+
| Node | `^22.19.0 \|\| >=24.9.0` |
|
|
303
|
+
| 平台 | **Windows 优先**(UIAutomation + Win32 输入,经内置 PowerShell helper);macOS/Linux 后端已预留,失败时以明确原因关闭 |
|
|
304
|
+
| 模型 | 纯文本模型完整可用(`screen_read` 输出结构化文本);视觉模型额外获得 `screen_shot` 图像 |
|
|
305
|
+
|
|
306
|
+
## 生态与质量
|
|
307
|
+
|
|
308
|
+
- [Gitee 镜像](https://gitee.com/perrylink/dsh-click)(同步镜像,以 GitHub 为准)
|
|
309
|
+
- [dshfind 插件页](https://dshfind.com/plugins/PerryLink/dsh-click)(安装量与排名)
|
|
310
|
+
- [OpenSSF Scorecard 报告](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-click)(由 [.github/workflows/scorecard.yml](.github/workflows/scorecard.yml) 驱动)
|
|
311
|
+
- [dsh-plugin-doctor 验证报告](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)(K10–K13 全 `pass`)
|
|
312
|
+
- [DSH Market](https://dsh.market/)(已上架)
|
|
313
|
+
- **1024 商店渠道**:先 `npm i -g dsh1024`,再 `dsh1024 plugin --profile web add dsh-click`(计入 [deepseek1024.com](https://deepseek1024.com) 安装排行)
|
|
314
|
+
- [生态实测知识库](https://perrylink.github.io/dsh-plugin-guide/):插件开发指南 · 选型实测数据 · 维护取舍判据
|
|
315
|
+
|
|
316
|
+
## 开发
|
|
243
317
|
|
|
244
318
|
```sh
|
|
245
319
|
pnpm install # node ^22.19 || >=24
|
|
246
|
-
pnpm run typecheck # tsc
|
|
247
|
-
pnpm run typecheck:ci # tsc
|
|
248
|
-
pnpm test # vitest
|
|
249
|
-
pnpm run build # tsdown bundle + tsc
|
|
250
|
-
pnpm run verify:self-contained #
|
|
251
|
-
pnpm run verify:artifacts #
|
|
252
|
-
pnpm
|
|
320
|
+
pnpm run typecheck # tsc:src + tests,对照本地 harness checkout
|
|
321
|
+
pnpm run typecheck:ci # tsc:对照已发布的宿主类型(无 paths)
|
|
322
|
+
pnpm test # vitest:79 个测试、13 个文件(helper 冒烟在 Windows 上运行)
|
|
323
|
+
pnpm run build # tsdown bundle + tsc 声明(lib/)
|
|
324
|
+
pnpm run verify:self-contained # 依赖声明全部来自 registry
|
|
325
|
+
pnpm run verify:artifacts # 构建产物 ESM 面 + 原生 helper 齐全
|
|
326
|
+
pnpm run check:readmes # 五语 README 一致性
|
|
327
|
+
pnpm pack # 发布用 tarball
|
|
253
328
|
```
|
|
254
329
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `computer-use`, `windows-automation`, `uiautomation`, `desktop-control`, `screen-reader`
|
|
330
|
+
配图由 [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py) 程序化生成(Python + Pillow),可重复执行:`python scripts/gen-readme-assets.py`。
|
|
258
331
|
|
|
259
|
-
|
|
332
|
+
Topics:`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `computer-use`, `windows-automation`, `uiautomation`, `desktop-control`, `screen-reader`
|
|
260
333
|
|
|
261
|
-
|
|
262
|
-
- [@LIU12312-Source](https://github.com/LIU12312-Source) — real `SendInput`/foreground-focus fallback for the Windows helper (PR #21).
|
|
263
|
-
- [@PerryLink](https://github.com/PerryLink) — creator and maintainer: tool surface, action safety boundary, Windows native helper, sanitizers, and the five-language docs.
|
|
264
|
-
- [@Mchsd](https://github.com/Mchsd) — added the `auditSessionEvents` opt-out for harnesses whose session reader rejects the `dsh-click` audit events (#2).
|
|
334
|
+
## 家族与致谢
|
|
265
335
|
|
|
266
|
-
|
|
336
|
+
本项目是 [PerryLink](https://github.com/PerryLink) 维护的 DeepSeek Harness 插件家族成员(全部 Apache-2.0)。如果这个插件帮到了你,**给个 star** —— 它不解锁任何功能,但会让下一个人更容易找到它。
|
|
267
337
|
|
|
268
|
-
|
|
338
|
+
- [Windows helper 冒烟清单](docs/windows-smoke.md) —— 0.3.24+ 的真实输入/焦点验证步骤。
|
|
339
|
+
- [@LIU12312-Source](https://github.com/LIU12312-Source) —— Windows helper 的真实 `SendInput` / 前台聚焦回退(PR #21)。
|
|
340
|
+
- [@Mchsd](https://github.com/Mchsd) —— 为会话读取器拒绝 `dsh-click` 审计事件的主机新增 `auditSessionEvents` 退出开关(#2)。
|
|
341
|
+
- [@PerryLink](https://github.com/PerryLink) —— 创建者与维护者:工具面、操作安全边界、Windows 原生 helper、脱敏层与五语文档。
|
|
269
342
|
|
|
270
343
|
<details>
|
|
271
|
-
<summary
|
|
344
|
+
<summary>展开全部插件</summary>
|
|
272
345
|
|
|
273
|
-
|
|
|
346
|
+
| 插件 | 状态 |
|
|
274
347
|
|---|---|
|
|
275
348
|
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
276
349
|
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
277
350
|
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
278
|
-
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊
|
|
351
|
+
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 已冻结 — 见仓库 README |
|
|
279
352
|
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
280
353
|
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
281
|
-
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊
|
|
354
|
+
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 已冻结 — 见仓库 README |
|
|
282
355
|
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
283
356
|
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
284
357
|
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
285
358
|
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
286
359
|
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
287
|
-
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** |
|
|
360
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 已冻结 — 见仓库 README |
|
|
288
361
|
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
289
362
|
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
290
363
|
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
@@ -317,7 +390,7 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
317
390
|
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
318
391
|
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
319
392
|
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
320
|
-
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** |
|
|
393
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 已冻结 — 见仓库 README |
|
|
321
394
|
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
322
395
|
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
323
396
|
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
@@ -329,10 +402,10 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
329
402
|
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
330
403
|
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
331
404
|
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
332
|
-
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** |
|
|
405
|
+
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 已退役(仓库已归档) |
|
|
333
406
|
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
|
|
334
|
-
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** |
|
|
335
|
-
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** |
|
|
407
|
+
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 已退役(仓库已归档) |
|
|
408
|
+
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 已退役(仓库已归档) |
|
|
336
409
|
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
337
410
|
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
338
411
|
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
@@ -344,7 +417,7 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
344
417
|
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
345
418
|
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
346
419
|
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
347
|
-
| **[dsh-score](https://github.com/PerryLink/dsh-score)** |
|
|
420
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 已冻结 — 见仓库 README |
|
|
348
421
|
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
349
422
|
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
350
423
|
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
@@ -356,20 +429,24 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
356
429
|
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
357
430
|
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
358
431
|
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
359
|
-
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** |
|
|
432
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 已退役(仓库已归档) |
|
|
360
433
|
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
361
434
|
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
|
|
362
|
-
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊
|
|
363
|
-
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊
|
|
364
|
-
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊
|
|
365
|
-
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊
|
|
366
|
-
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊
|
|
367
|
-
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫
|
|
368
|
-
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫
|
|
369
|
-
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫
|
|
435
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 已冻结 — 见仓库 README |
|
|
436
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 已冻结 — 见仓库 README |
|
|
437
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 已冻结 — 见仓库 README |
|
|
438
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 已冻结 — 见仓库 README |
|
|
439
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 已冻结 — 见仓库 README |
|
|
440
|
+
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 已退役(仓库已归档) |
|
|
441
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 已退役(仓库已归档) |
|
|
442
|
+
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 已退役(仓库已归档) |
|
|
370
443
|
|
|
371
444
|
</details>
|
|
372
445
|
|
|
373
446
|
## License
|
|
374
447
|
|
|
375
|
-
[Apache License 2.0
|
|
448
|
+
[LICENSE](LICENSE)(Apache License 2.0)© 2026 dsh-click contributors
|
|
449
|
+
|
|
450
|
+
<p align="center"><sub>Apache-2.0 · 社区插件,与 DeepSeek 无关。</sub></p>
|
|
451
|
+
|
|
452
|
+
<p align="center"><sub>工具链:<a href="https://github.com/PerryLink/dsh-plugin-guide">dsh-plugin-guide</a> · <a href="https://github.com/PerryLink/dsh-standards">dsh-standards</a> · <a href="https://github.com/PerryLink/dsh-plugin-start">dsh-plugin-start</a></sub></p>
|