dsh-click 0.3.26 → 0.3.28
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 +14 -5
- package/README.en.md +441 -0
- package/README.es.md +441 -0
- package/README.hi.md +441 -0
- package/README.md +262 -194
- package/README.pt.md +441 -0
- package/lib/index.js +31 -16
- package/lib/types/version.d.ts +1 -1
- package/native/win32/dsh-click-helper.ps1 +70 -0
- package/package.json +32 -29
- 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,217 @@
|
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
**📖 Ecosystem knowledge base** — measured data, not marketing: [plugin development guide · plugin-selection data · maintenance criteria](https://perrylink.github.io/dsh-plugin-guide/).
|
|
35
|
-
|
|
36
|
-
<!-- star-cta -->
|
|
37
|
-
## Install & uninstall
|
|
38
|
-
|
|
39
|
-
- **git channel** (latest `main`): `dsh plugin --profile web add github:PerryLink/dsh-click` — the `prepare` script builds with production dependencies only.
|
|
40
|
-
- **npm channel** (published releases): `dsh plugin --profile web add dsh-click`.
|
|
41
|
-
- **tarball channel**: `pnpm pack` in this repo, then `dsh plugin --profile web add ./dsh-click-<version>.tgz`.
|
|
42
|
-
- **uninstall**: `dsh plugin --profile web remove dsh-click` (or remove the row from the profile patch).
|
|
43
|
-
|
|
44
|
-
> If pnpm reports `ERR_PNPM_IGNORED_BUILDS` for this package (esbuild's harmless platform-binary validation), add `allowBuilds: { esbuild: true }` to your `pnpm-workspace.yaml` — the `dsh` CLI prints the exact snippet.
|
|
35
|
+
<sub>社区插件,与 DeepSeek 官方无关。唯一仓库:<https://github.com/PerryLink/dsh-click>(Gitee 为镜像)。</sub>
|
|
45
36
|
|
|
46
|
-
##
|
|
37
|
+
## 它是什么
|
|
47
38
|
|
|
48
|
-
|
|
39
|
+
`dsh-click` 给模型一条完整的「观察 → 行动」通道:先用 `screen_read` 读窗口的无障碍树(元素 id、类型、名称、矩形、支持的模式)与像素位置提示,或用 `screen_shot` 截一张图;再用 `click` / `type` / `scroll` / `key` 按元素 id 或坐标操作同一个窗口。每个变更性动作都必须引用一次新鲜观察(`basedOn`)——屏幕变了或观察过期就拒绝,并给出模型可读的理由;默认还要过 `ctx.approval` 审批,动作前后各校验一次目标进程身份。它默认不抢前台焦点(`focusFallback: never`),所有观察与操作都落成脱敏的 `dsh-click/observed` / `dsh-click/action` 审计事件。
|
|
49
40
|
|
|
50
|
-
|
|
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>
|
|
51
45
|
|
|
46
|
+
## 三步上手
|
|
52
47
|
|
|
53
|
-
|
|
48
|
+
1. **安装**(三选一):
|
|
54
49
|
|
|
55
|
-
|
|
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
|
+
```
|
|
56
58
|
|
|
57
|
-
|
|
59
|
+
git 渠道的 `prepare` 脚本只用生产依赖构建。
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
2. **最小配置**(默认即可用;只对特定窗口免审批时再动 `autoApproveWindows`):
|
|
60
62
|
|
|
61
|
-
|
|
63
|
+
```yaml
|
|
64
|
+
- insert:
|
|
65
|
+
- id: dsh-click
|
|
66
|
+
name: dsh-click
|
|
67
|
+
config:
|
|
68
|
+
requireApproval: true
|
|
69
|
+
autoApproveWindows: ['^Notepad']
|
|
70
|
+
focusFallback: never
|
|
71
|
+
```
|
|
62
72
|
|
|
73
|
+
3. **验证已生效**(重启后):
|
|
63
74
|
|
|
75
|
+
```sh
|
|
76
|
+
dsh --profile web --dump-config | grep -A3 'id: dsh-click'
|
|
77
|
+
```
|
|
64
78
|
|
|
65
|
-
|
|
79
|
+
然后让 agent 观察窗口并操作——每次变更性操作都会弹出审批:
|
|
66
80
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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 |
|
|
81
|
+
```text
|
|
82
|
+
> 打开记事本,输入 "hello",再读回屏幕上的内容。
|
|
83
|
+
```
|
|
73
84
|
|
|
74
|
-
|
|
85
|
+
**卸载**:`dsh plugin --profile web remove dsh-click`(或从 profile patch 删掉该行)。
|
|
75
86
|
|
|
76
|
-
`
|
|
87
|
+
> 如果 pnpm 对本包报 `ERR_PNPM_IGNORED_BUILDS`(esbuild 的平台二进制无害校验),在你的 `pnpm-workspace.yaml` 中加入 `allowBuilds: { esbuild: true }` —— `dsh` CLI 会打印确切片段。
|
|
77
88
|
|
|
78
|
-
|
|
79
|
-
|
|
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` 缩放。模型支持图像时结果附带图片;纯文本模型则得到文字描述,照常可用。
|
|
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`** —— 枚举运行中的应用及其可见窗口;按名称或可执行路径启动应用。
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
> Open Notepad, type "hello", then read back what is on screen.
|
|
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)
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
###
|
|
123
|
-
|
|
124
|
-
These are the plugin's real entry points; install once, then call one.
|
|
122
|
+
### 工具面
|
|
125
123
|
|
|
126
|
-
|
|
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` | | ✅ | 按名称或可执行路径启动,可带参数 |
|
|
127
135
|
|
|
128
|
-
|
|
136
|
+
### 示例
|
|
129
137
|
|
|
130
|
-
|
|
131
|
-
app_list
|
|
132
|
-
~~~
|
|
138
|
+
以下为插件真实入口;安装后调用一个即可。
|
|
133
139
|
|
|
134
|
-
|
|
140
|
+
**详细示例** — 命令 `app_list`,输入:
|
|
135
141
|
|
|
136
|
-
|
|
142
|
+
```json
|
|
137
143
|
{}
|
|
138
|
-
|
|
144
|
+
```
|
|
139
145
|
|
|
140
|
-
|
|
146
|
+
输出:
|
|
141
147
|
|
|
142
|
-
|
|
148
|
+
```text
|
|
143
149
|
1 running application(s) with windows:
|
|
144
150
|
- Demo (pid 4242, C:\Apps\demo.exe)
|
|
145
151
|
- [windowId 1122867] "Demo App" at (10, 20) 800x600
|
|
146
|
-
|
|
152
|
+
```
|
|
147
153
|
|
|
148
154
|
*Observed from `plugins/dsh-click/tests/tools.spec.ts:159-185; renderer at src/tools.ts:933-942`*
|
|
149
155
|
|
|
150
|
-
|
|
156
|
+
**失败分支** — 输入:
|
|
151
157
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
~~~text
|
|
158
|
+
```text
|
|
155
159
|
{}
|
|
156
|
-
|
|
160
|
+
```
|
|
157
161
|
|
|
158
|
-
|
|
162
|
+
输出:
|
|
159
163
|
|
|
160
|
-
|
|
164
|
+
```text
|
|
161
165
|
Error: dsh-click backend unavailable on linux: Linux backend is reserved but not implemented yet (Windows-first); only Windows can act today
|
|
162
|
-
|
|
166
|
+
```
|
|
163
167
|
|
|
164
168
|
*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
169
|
|
|
166
|
-
|
|
170
|
+
**简短示例**:`screen_read` · `app_list`
|
|
171
|
+
|
|
172
|
+
## 配置
|
|
167
173
|
|
|
168
|
-
|
|
169
|
-
- `app_list`
|
|
174
|
+
所有可调项都是 Schemastery `Config` 字段(可在 cordis.yml 中修改)。按 id 定向覆盖会替换整行 —— 需要重述每个键。`cordis.patch.yml` 逐键内联注释。
|
|
170
175
|
|
|
171
|
-
|
|
176
|
+
最常用键:
|
|
177
|
+
|
|
178
|
+
| 键 | 默认值 | 含义 |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `requireApproval` | `true` | 每个变更性操作都过审批;观察类工具从不询问 |
|
|
181
|
+
| `autoApproveWindows` | `[]` | 跳过审批询问的窗口标题/可执行路径正则(仍做新鲜度与进程身份校验,仍记录审计) |
|
|
182
|
+
| `focusFallback` | `never` | 操作是否可在最后手段下把目标窗口带到前台(`never` / `allow`) |
|
|
183
|
+
| `imageMode` | `auto` | `screen_shot` 渲染:`auto`(模型支持图像时附图像,否则文字)或 `text` |
|
|
184
|
+
| `staleCheckPixels` | `true` | 每次操作前对比新像素哈希,变化即拒绝 |
|
|
185
|
+
| `staleCheckTree` | `target` | 控件树新鲜度:`target` 校验目标元素(默认),`strict` 任一节点变化即拒绝,`off` 跳过整树哈希(身份/年龄/像素检查仍生效) |
|
|
186
|
+
| `maxObservationAgeMs` | `30000` | 操作可引用观察的最大时限(毫秒,1000..600000) |
|
|
187
|
+
| `auditSessionEvents` | `true` | 是否追加 `dsh-click/observed` / `dsh-click/action` 审计事件;设为 `false` 可完全停止审计追加 |
|
|
172
188
|
|
|
173
|
-
|
|
189
|
+
<details>
|
|
190
|
+
<summary>完整配置表(17 行)</summary>
|
|
174
191
|
|
|
175
|
-
|
|
|
192
|
+
| 键 | 默认值 | 含义 |
|
|
176
193
|
|---|---|---|
|
|
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
|
-
|
|
194
|
+
| `requireApproval` | `true` | 每个变更性操作都过审批;观察类工具从不询问 |
|
|
195
|
+
| `autoApproveWindows` | `[]` | 跳过审批询问的窗口标题/可执行路径正则(仍做新鲜度与进程身份校验,仍记录审计) |
|
|
196
|
+
| `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` 仍无法盖章,门控行为不变 |
|
|
197
|
+
| `focusFallback` | `never` | 操作是否可在最后手段下把目标窗口带到前台(`never` / `allow`) |
|
|
198
|
+
| `imageMode` | `auto` | `screen_shot` 渲染:`auto`(模型支持图像时附图像,否则文字)或 `text` |
|
|
199
|
+
| `helperTimeoutMs` | `30000` | 每次 helper 调用的超时(毫秒,1..300000) |
|
|
200
|
+
| `maxHelperOutputBytes` | `25165824` | 单次 helper 响应的字节上限(1024..67108864) |
|
|
201
|
+
| `maxScreenshotSide` | `2560` | 截图最长边像素(320..7680);超出即缩放 |
|
|
202
|
+
| `staleCheckPixels` | `true` | 每次操作前对比新像素哈希,变化即拒绝 |
|
|
203
|
+
| `staleCheckTree` | `target` | 控件树新鲜度:`target` 校验目标元素(默认),`strict` 任一节点变化即拒绝,`off` 跳过整树哈希(身份/年龄/像素检查仍生效) |
|
|
204
|
+
| `maxObservationAgeMs` | `30000` | 操作可引用观察的最大时限(毫秒,1000..600000) |
|
|
205
|
+
| `maxCachedObservations` | `8` | 观察缓存 LRU 上限(1..64) |
|
|
206
|
+
| `maxElements` | `500` | 每次 `screen_read` 的无障碍元素上限(1..2000) |
|
|
207
|
+
| `maxTreeDepth` | `32` | 无障碍树遍历最大深度(1..64) |
|
|
208
|
+
| `maxTextLength` | `200` | 脱敏后模型可见字符串的截断长度(16..10000) |
|
|
209
|
+
| `rollbackEnabled` | `true` | `type` 失败时备份并还原控件文本 |
|
|
210
|
+
| `ocr.enabled` / `command` / `language` | `true` / `tesseract` / `eng` | `screen_find` 的可选 OCR(挂载时探测;无 tesseract 时降级为不可用) |
|
|
211
|
+
|
|
212
|
+
</details>
|
|
213
|
+
|
|
214
|
+
profile patch 中的覆盖示例:
|
|
196
215
|
|
|
197
216
|
```yaml
|
|
198
217
|
- insert:
|
|
@@ -204,87 +223,132 @@ Example override in your profile patch:
|
|
|
204
223
|
focusFallback: never
|
|
205
224
|
```
|
|
206
225
|
|
|
207
|
-
##
|
|
226
|
+
## FAQ
|
|
208
227
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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 |
|
|
228
|
+
<details>
|
|
229
|
+
<summary>截图和观察缓存存在哪?会不会把屏幕内容写到磁盘?</summary>
|
|
230
|
+
|
|
231
|
+
`screen_shot` 的截图存进 harness 的 attachment store(内容寻址,受宿主附件策略约束),并只随该次工具结果提供给你正在用的模型。观察本身只在内存里(`maxCachedObservations` 有界 LRU,重启即失);除此之外插件不落盘、不发网络请求、不存凭据。落进会话日志的只有 `dsh-click/*` 审计事件,窗口标题、可执行路径与自由文本在写入或展示前先脱敏并截断。
|
|
232
|
+
|
|
233
|
+
</details>
|
|
219
234
|
|
|
220
|
-
|
|
235
|
+
<details>
|
|
236
|
+
<summary>在 macOS / Linux 上会怎样?会静默失败吗?</summary>
|
|
221
237
|
|
|
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.
|
|
238
|
+
不会静默。这两个平台的后端已预留但未实现,每次调用都以模型可读的原因失败关闭(`dsh-click backend unavailable on linux: ...`);profile 在哪个平台都能正常启动。Windows 上若缺 `subprocess` 服务或 helper 不可用,同样大声拒绝,而不是假装成功。
|
|
225
239
|
|
|
226
|
-
|
|
240
|
+
</details>
|
|
227
241
|
|
|
228
|
-
|
|
229
|
-
|
|
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.
|
|
242
|
+
<details>
|
|
243
|
+
<summary>会和其他插件抢命令、服务或 slot 吗?</summary>
|
|
234
244
|
|
|
235
|
-
|
|
245
|
+
不提供任何 service key,只消费两个可选 seam(`dsh-click/backend`、`dsh-click/grounding`,测试/嵌入用);不注册客户端 slot、不注册 `webServer` 路由、不装任何 waterfall 监听器;审计事件全部落在 `dsh-click/*` 命名空间。每次工具注册都包在 `ctx.effect` 里,停止/热重载只撤销自己注册的工具。
|
|
246
|
+
|
|
247
|
+
</details>
|
|
236
248
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
249
|
+
<details>
|
|
250
|
+
<summary>性能开销多大?每次动作都要重新截图吗?</summary>
|
|
251
|
+
|
|
252
|
+
观察按需产生:`screen_read` 只读无障碍树(纯文本),`screen_shot` 才编码 PNG。每次变更性动作前会重新捕获一次目标窗口做新鲜度对比(默认像素哈希 + 控件树),这是安全边界的一部分;helper 调用有 `helperTimeoutMs` / `maxHelperOutputBytes` 兜底,观察缓存默认只留 8 条。
|
|
253
|
+
|
|
254
|
+
</details>
|
|
241
255
|
|
|
242
|
-
##
|
|
256
|
+
## 安全边界
|
|
257
|
+
|
|
258
|
+
- **先观察后行动,每次如此。** 操作必须引用新鲜观察;屏幕变化(像素哈希)或观察过期即拒绝,并以模型可读的原因要求重新观察。
|
|
259
|
+
- **审批是默认。** 除非你显式放行特定窗口,否则 `requireApproval: true`;每次操作 —— 无论放行与否 —— 都记录审计。
|
|
260
|
+
- **不抢前台焦点。** helper 从不把目标窗口带到前台(默认 `focusFallback: 'never'`);输入经 UIA 或 post 消息送达,不打扰后台窗口。`focusFallback: 'allow'` 是唯一被认可的例外。
|
|
261
|
+
- **进程身份前后复验。** 每个操作前后立即校验进程身份;操作中途进程被替换则判失败(`PROCESS_CHANGED`)。
|
|
262
|
+
- **输出脱敏。** 控制字符被剥离、制表符折叠、凭据形态内容(密钥、token、JWT、bearer 头)在到达模型或日志前一律打码。
|
|
263
|
+
- **失败关闭。** 不支持的平台、缺失的 subprocess 服务或不可用的 helper 都会大声拒绝每个调用 —— profile 在任何地方都能正常启动。
|
|
264
|
+
|
|
265
|
+
## 权限与数据
|
|
266
|
+
|
|
267
|
+
- **权限**:变更性操作走官方 `ctx.approval` 接缝 —— 插件从不重实现或绕过它。`autoApproveWindows` 只会*对特定窗口跳过询问*,不能关闭新鲜度或进程身份校验。`dshWorkshop` manifest 声明 `fs:read`、`subprocess:spawn`、`session:append`、`network:none`、`native-code:none`。
|
|
268
|
+
- **数据**:除 attachment store 保存的截图(内容寻址、受 harness 自身附件策略约束)外,插件不落盘任何东西。观察仅存内存(有界 LRU)。无网络请求,不存凭据。
|
|
269
|
+
- **会话日志**:`dsh-click/observed` 与 `dsh-click/action` 是仅日志的审计事件,携带脱敏后的窗口/进程事实 —— 标题、路径与自由文本在写入或展示前均先脱敏并截断。
|
|
270
|
+
|
|
271
|
+
## 已知限制
|
|
272
|
+
|
|
273
|
+
- **Windows 优先。** macOS 与 Linux 后端已预留;在这些平台上每次调用都以明确原因失败关闭。
|
|
274
|
+
- **纯文本保真度。** `screen_read` 依赖应用暴露 UIAutomation;没有无障碍树的应用只有像素提示与 `screen_find` 的 OCR/grounding 路径。坐标点击仍然可用。
|
|
275
|
+
- **post 输入类应用。** 部分应用忽略 post 窗口消息(游戏、部分 Electron 界面);`key` 会如实报告而非假装成功。0.3.24 起 `type` 的 `SendInput` 回退覆盖了真实键盘输入与 CJK 混排,但仍受目标应用自身的输入模型限制。
|
|
276
|
+
- **无信封 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` 可完全停止审计追加。
|
|
277
|
+
|
|
278
|
+
## 与其他 DSH 插件的互操作性
|
|
279
|
+
|
|
280
|
+
`dsh-click` 只暴露工具面,不参与其他插件的接缝:
|
|
281
|
+
|
|
282
|
+
- **只注入两个硬服务。** `inject = ['tools', 'subprocess']`;不提供任何 service key,因此不存在服务键冲突。
|
|
283
|
+
- **不占客户端与 HTTP 资源。** 不注册客户端 slot、不注册 `webServer` 路由、不装 `agent/pre-step` / `tools/post-execute` 等 waterfall 监听器,也不改全局对象。
|
|
284
|
+
- **审计命名空间隔离。** 只写 `dsh-click/observed` 与 `dsh-click/action` 两个事件;宿主不认识该词汇时自适应门直接跳过,工具结果仍是可重建的审计轨迹。
|
|
285
|
+
- **可选 seam 可缺省。** `dsh-click/backend` 与 `dsh-click/grounding` 只服务测试/嵌入;真实部署缺省回退到平台选择,不要求任何其他插件在场。
|
|
286
|
+
- **注册即 effect。** 每次 `ctx.tools.register` 都包在 `ctx.effect` 里,停止/热重载只撤销自己注册的工具。
|
|
287
|
+
|
|
288
|
+
## 兼容性
|
|
289
|
+
|
|
290
|
+
| 维度 | 状态 |
|
|
291
|
+
|---|---|
|
|
292
|
+
| 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` |
|
|
293
|
+
| Node | `^22.19.0 \|\| >=24.9.0` |
|
|
294
|
+
| 平台 | **Windows 优先**(UIAutomation + Win32 输入,经内置 PowerShell helper);macOS/Linux 后端已预留,失败时以明确原因关闭 |
|
|
295
|
+
| 模型 | 纯文本模型完整可用(`screen_read` 输出结构化文本);视觉模型额外获得 `screen_shot` 图像 |
|
|
296
|
+
|
|
297
|
+
## 生态与质量
|
|
298
|
+
|
|
299
|
+
- [Gitee 镜像](https://gitee.com/perrylink/dsh-click)(同步镜像,以 GitHub 为准)
|
|
300
|
+
- [dshfind 插件页](https://dshfind.com/plugins/PerryLink/dsh-click)(安装量与排名)
|
|
301
|
+
- [OpenSSF Scorecard 报告](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-click)(由 [.github/workflows/scorecard.yml](.github/workflows/scorecard.yml) 驱动)
|
|
302
|
+
- [dsh-plugin-doctor 验证报告](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)(K10–K13 全 `pass`)
|
|
303
|
+
- [DSH Market](https://dsh.market/)(已上架)
|
|
304
|
+
- **1024 商店渠道**:先 `npm i -g dsh1024`,再 `dsh1024 plugin --profile web add dsh-click`(计入 [deepseek1024.com](https://deepseek1024.com) 安装排行)
|
|
305
|
+
- [生态实测知识库](https://perrylink.github.io/dsh-plugin-guide/):插件开发指南 · 选型实测数据 · 维护取舍判据
|
|
306
|
+
|
|
307
|
+
## 开发
|
|
243
308
|
|
|
244
309
|
```sh
|
|
245
310
|
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
|
|
311
|
+
pnpm run typecheck # tsc:src + tests,对照本地 harness checkout
|
|
312
|
+
pnpm run typecheck:ci # tsc:对照已发布的宿主类型(无 paths)
|
|
313
|
+
pnpm test # vitest:79 个测试、13 个文件(helper 冒烟在 Windows 上运行)
|
|
314
|
+
pnpm run build # tsdown bundle + tsc 声明(lib/)
|
|
315
|
+
pnpm run verify:self-contained # 依赖声明全部来自 registry
|
|
316
|
+
pnpm run verify:artifacts # 构建产物 ESM 面 + 原生 helper 齐全
|
|
317
|
+
pnpm run check:readmes # 五语 README 一致性
|
|
318
|
+
pnpm pack # 发布用 tarball
|
|
253
319
|
```
|
|
254
320
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `computer-use`, `windows-automation`, `uiautomation`, `desktop-control`, `screen-reader`
|
|
321
|
+
配图由 [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py) 程序化生成(Python + Pillow),可重复执行:`python scripts/gen-readme-assets.py`。
|
|
258
322
|
|
|
259
|
-
|
|
323
|
+
Topics:`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `computer-use`, `windows-automation`, `uiautomation`, `desktop-control`, `screen-reader`
|
|
260
324
|
|
|
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).
|
|
325
|
+
## 家族与致谢
|
|
265
326
|
|
|
266
|
-
|
|
327
|
+
本项目是 [PerryLink](https://github.com/PerryLink) 维护的 DeepSeek Harness 插件家族成员(全部 Apache-2.0)。如果这个插件帮到了你,**给个 star** —— 它不解锁任何功能,但会让下一个人更容易找到它。
|
|
267
328
|
|
|
268
|
-
|
|
329
|
+
- [Windows helper 冒烟清单](docs/windows-smoke.md) —— 0.3.24+ 的真实输入/焦点验证步骤。
|
|
330
|
+
- [@LIU12312-Source](https://github.com/LIU12312-Source) —— Windows helper 的真实 `SendInput` / 前台聚焦回退(PR #21)。
|
|
331
|
+
- [@Mchsd](https://github.com/Mchsd) —— 为会话读取器拒绝 `dsh-click` 审计事件的主机新增 `auditSessionEvents` 退出开关(#2)。
|
|
332
|
+
- [@PerryLink](https://github.com/PerryLink) —— 创建者与维护者:工具面、操作安全边界、Windows 原生 helper、脱敏层与五语文档。
|
|
269
333
|
|
|
270
334
|
<details>
|
|
271
|
-
<summary
|
|
335
|
+
<summary>展开全部插件</summary>
|
|
272
336
|
|
|
273
|
-
|
|
|
337
|
+
| 插件 | 状态 |
|
|
274
338
|
|---|---|
|
|
275
339
|
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
276
340
|
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
277
341
|
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
278
|
-
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** |
|
|
342
|
+
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 已冻结 — 见仓库 README |
|
|
279
343
|
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
280
344
|
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
281
|
-
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** |
|
|
345
|
+
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 已冻结 — 见仓库 README |
|
|
282
346
|
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
283
347
|
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
284
348
|
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
285
349
|
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
286
350
|
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
287
|
-
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** |
|
|
351
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 已冻结 — 见仓库 README |
|
|
288
352
|
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
289
353
|
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
290
354
|
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
@@ -317,7 +381,7 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
317
381
|
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
318
382
|
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
319
383
|
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
320
|
-
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** |
|
|
384
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 已冻结 — 见仓库 README |
|
|
321
385
|
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
322
386
|
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
323
387
|
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
@@ -329,10 +393,10 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
329
393
|
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
330
394
|
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
331
395
|
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
332
|
-
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** |
|
|
396
|
+
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 已退役(仓库已归档) |
|
|
333
397
|
| **[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)** |
|
|
398
|
+
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 已退役(仓库已归档) |
|
|
399
|
+
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 已退役(仓库已归档) |
|
|
336
400
|
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
337
401
|
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
338
402
|
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
@@ -344,7 +408,7 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
344
408
|
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
345
409
|
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
346
410
|
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
347
|
-
| **[dsh-score](https://github.com/PerryLink/dsh-score)** |
|
|
411
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 已冻结 — 见仓库 README |
|
|
348
412
|
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
349
413
|
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
350
414
|
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
@@ -356,20 +420,24 @@ This project is part of the DeepSeek Harness plugin family from [PerryLink](http
|
|
|
356
420
|
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
357
421
|
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
358
422
|
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
359
|
-
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** |
|
|
423
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 已退役(仓库已归档) |
|
|
360
424
|
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
361
425
|
| **[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)** | 🚫
|
|
426
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 已冻结 — 见仓库 README |
|
|
427
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 已冻结 — 见仓库 README |
|
|
428
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 已冻结 — 见仓库 README |
|
|
429
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 已冻结 — 见仓库 README |
|
|
430
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 已冻结 — 见仓库 README |
|
|
431
|
+
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 已退役(仓库已归档) |
|
|
432
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 已退役(仓库已归档) |
|
|
433
|
+
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 已退役(仓库已归档) |
|
|
370
434
|
|
|
371
435
|
</details>
|
|
372
436
|
|
|
373
437
|
## License
|
|
374
438
|
|
|
375
|
-
[Apache License 2.0
|
|
439
|
+
[LICENSE](LICENSE)(Apache License 2.0)© 2026 dsh-click contributors
|
|
440
|
+
|
|
441
|
+
<p align="center"><sub>Apache-2.0 · 社区插件,与 DeepSeek 无关。</sub></p>
|
|
442
|
+
|
|
443
|
+
<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>
|