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/README-zh.md DELETED
@@ -1,377 +0,0 @@
1
- <div align="center">
2
-
3
- # 🖱️ dsh-click
4
- - **1024 商店渠道**:先 `npm i -g dsh1024`,再 `dsh1024 plugin --profile web add dsh-click`(计入 [deepseek1024.com](https://deepseek1024.com) 安装排行)。
5
-
6
- **DeepSeek Harness 的跨平台原生桌面控制 —— Windows 优先。**
7
-
8
- *先看清屏幕,再动手 —— 每次点击都过审批,每次操作都留审计。*
9
-
10
- [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
- [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-click)
12
- [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
- [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-click.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
- [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-zh.svg)](https://dsh.market/)
15
- [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
16
- [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-click/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-click/actions)
17
- [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-click?label=version)](https://github.com/PerryLink/dsh-click/releases)
18
- [![npm version](https://img.shields.io/npm/v/dsh-click)](https://www.npmjs.com/package/dsh-click)
19
- [![npm downloads](https://img.shields.io/npm/dm/dsh-click)](https://www.npmjs.com/package/dsh-click)
20
- [![dshfind](https://dshfind.com/api/badge/PerryLink/dsh-click?metric=downloads&lang=zh)](https://dshfind.com/zh/plugins/PerryLink/dsh-click?ref=badge)
21
-
22
- [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
23
-
24
- ```sh
25
- dsh plugin --profile <name> add dsh-click
26
- ```
27
-
28
-
29
- </div>
30
-
31
- ---
32
-
33
-
34
- **📖 生态实测知识库**(实测数据,不是营销):[插件开发指南 · 选型实测数据 · 维护取舍判据](https://perrylink.github.io/dsh-plugin-guide/)。
35
-
36
- <!-- star-cta -->
37
- ## ⭐ 如果它帮到了你
38
-
39
- 这个插件是 [DSH 插件家族](https://github.com/PerryLink)的一员(95 个,全部 Apache-2.0)。如果你在用,**给个 star** —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。
40
-
41
- *English:* part of a 95 plugin family for DeepSeek Harness. If it is useful, **a star helps the next person find it** — nothing is gated behind it.
42
-
43
- ## What is dsh-click?
44
-
45
- DeepSeek Harness 的跨平台原生桌面控制 —— Windows 优先。
46
-
47
- 先看清屏幕,再动手 —— 每次点击都过审批,每次操作都留审计。
48
-
49
- ![dsh-click 工作流图:安装 → 打开面板 → 操作。](docs/assets/dsh-click-flow.svg)
50
-
51
- *工作流概览:安装 → 打开面板 → 操作。下面的示例使用实际命令面。*
52
-
53
-
54
- *同一次运行,动图版。*
55
-
56
- ## 兼容性
57
-
58
- | 方面 | 状态 |
59
- |---|---|
60
- | Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1`(GitHub tag,2026-09-24 已核验)。已于 2026-09-11 对照 dsh-v0.1.7-alpha.1 master checkout 核验(完整门禁链 + profile 安装冒烟)。 |
61
- | Node | `^22.19.0 \|\| >=24.0.0` |
62
- | 平台 | **Windows 优先**(UIAutomation + Win32 输入,经由内置 PowerShell 辅助进程);macOS/Linux 后端已预留,失败时以明确原因关闭 |
63
- | 模型 | 纯文本模型完整可用(`screen_read` 输出结构化文本);视觉模型额外获得 `screen_shot` 图像 |
64
-
65
- ## 你能得到什么
66
-
67
- `dsh-click` 为 harness 提供完整的「观察 → 行动」闭环,作用于原生桌面应用:
68
-
69
- - **`screen_shot`** —— 截取窗口(或主屏幕)截图,按可配置上限缩放。视觉模型会附带图像;纯文本模型则获得文字描述,照常可用。
70
- - **`screen_read`** —— 结构化观察:窗口的无障碍树(元素 id、类型、名称、矩形、支持的模式)加像素位置提示与颜色 —— 纯文本,无需图像模型。
71
- - **`click` / `type` / `scroll` / `key`** —— 以元素 id 或坐标寻址的窗口级操作。优先 UIA invoke,回退到 post 窗口消息 —— 且**绝不抢占前台焦点**。
72
- - **`app_list` / `app_launch`** —— 枚举运行中的应用及其窗口;按名称或路径启动应用。
73
-
74
- 每个变更性操作都穿过同一条安全边界:
75
-
76
- 1. **新鲜度** —— 操作必须引用 `basedOn` 观察;执行前重新捕获窗口,屏幕变化(像素哈希 + 最大时限)即拒绝。
77
- 2. **审批** —— 默认经 `ctx.approval` 门禁;可用窗口标题/可执行路径正则放行特定窗口(仍记录审计)。
78
- 3. **进程身份** —— 操作前后分别校验所属进程 pid 与可执行路径;发生变化即大声拒绝。
79
- 4. **审计** —— 观察与操作以 `dsh-click/observed` / `dsh-click/action` 事件写入会话日志(脱敏、仅日志)。
80
-
81
- ```text
82
- 模型 harness
83
- │ screen_read ──▶ observationId (+ 元素、像素) ← 结构化文本
84
- │ click {basedOn, target} ──▶ 新鲜度校验 ──▶ 审批 ──▶ helper (UIA)
85
- │ 像素哈希变化? ── 拒绝并要求重新观察
86
- │ 操作后 pid/exe 变化? ── PROCESS_CHANGED
87
- │ ◀── 规范 JSON + 审计事件 (dsh-click/action)
88
- ```
89
-
90
- ## 快速开始
91
-
92
- ```sh
93
- dsh plugin --profile web add github:PerryLink/dsh-click
94
- ```
95
-
96
- ```sh
97
- # 1. 把 bundle 装进你的 profile
98
- dsh plugin --profile web add github:PerryLink/dsh-click
99
-
100
- # 或从 npm 安装(正式发布版)
101
- dsh plugin --profile web add dsh-click
102
-
103
- # 2. 重启并核实行
104
- dsh --profile web --dump-config | grep -A2 'id: dsh-click'
105
- ```
106
-
107
- 然后让 agent 观察窗口并操作 —— 每次变更性操作都会弹出审批:
108
-
109
- ```
110
- > 打开记事本,输入 "hello",再读回屏幕上的内容。
111
- ```
112
-
113
- ## 安装与卸载
114
-
115
- - **git 通道**(最新 `main`):`dsh plugin --profile web add github:PerryLink/dsh-click` —— `prepare` 脚本仅用生产依赖构建。
116
- - **npm 通道**(正式发布版):`dsh plugin --profile web add dsh-click`。
117
- - **tarball 通道**:在本仓库执行 `pnpm pack`,然后 `dsh plugin --profile web add ./dsh-click-<version>.tgz`。
118
- - **卸载**:`dsh plugin --profile web remove dsh-click`(或从 profile patch 中删除该行)。
119
-
120
- > 如果 pnpm 对本包报 `ERR_PNPM_IGNORED_BUILDS`(esbuild 的平台二进制无害校验),在你的 `pnpm-workspace.yaml` 中加入 `allowBuilds: { esbuild: true }` —— `dsh` CLI 会打印确切片段。
121
-
122
- ### 示例
123
-
124
- 以下为插件真实入口;安装后调用一个即可。
125
-
126
- #### 详细示例
127
-
128
- **命令**
129
-
130
- ~~~sh
131
- app_list
132
- ~~~
133
-
134
- **输入**
135
-
136
- ~~~json
137
- {}
138
- ~~~
139
-
140
- **输出**
141
-
142
- ~~~text
143
- 1 running application(s) with windows:
144
- - Demo (pid 4242, C:\Apps\demo.exe)
145
- - [windowId 1122867] "Demo App" at (10, 20) 800x600
146
- ~~~
147
-
148
- *来源 `plugins/dsh-click/tests/tools.spec.ts:159-185; renderer at src/tools.ts:933-942`*
149
-
150
- #### 失败分支
151
-
152
- **输入**
153
-
154
- ~~~text
155
- {}
156
- ~~~
157
-
158
- **输出**
159
-
160
- ~~~text
161
- Error: dsh-click backend unavailable on linux: Linux backend is reserved but not implemented yet (Windows-first); only Windows can act today
162
- ~~~
163
-
164
- *来源 `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
-
166
- #### 简短示例
167
-
168
- - `screen_read`
169
- - `app_list`
170
-
171
- ## 配置
172
-
173
- 所有可调项都是 Schemastery `Config` 字段(可在 cordis.yml 中修改)。按 id 定向覆盖会替换整行 —— 需要重新声明每个键。`cordis.patch.yml` 内联说明了每个键。
174
-
175
- | 键 | 默认值 | 含义 |
176
- |---|---|---|
177
- | `requireApproval` | `true` | 每个变更性操作都过审批;观察类工具从不询问 |
178
- | `autoApproveWindows` | `[]` | 跳过审批询问的窗口标题/可执行路径正则(仍做新鲜度校验并审计) |
179
- | `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 仍无法盖章,门控行为不变。 |
180
- | `focusFallback` | `never` | 操作是否可在最后手段下把目标窗口带到前台(`never` / `allow`) |
181
- | `imageMode` | `auto` | `screen_shot` 渲染:`auto`(模型支持图像时附图像,否则文字)或 `text` |
182
- | `helperTimeoutMs` | `30000` | 每次 helper 调用的超时(毫秒,1..300000) |
183
- | `maxHelperOutputBytes` | `25165824` | 单次 helper 响应的字节上限(1024..67108864) |
184
- | `maxScreenshotSide` | `2560` | 截图最长边像素(320..7680);超出即缩放 |
185
- | `staleCheckPixels` | `true` | 每次操作前对比新像素哈希,变化即拒绝 |
186
- | `staleCheckTree` | `target` | 控件树新鲜度:`target` 校验目标元素(默认),`strict` 任一节点变化即拒绝,`off` 跳过整树哈希(身份/年龄/像素检查仍生效) |
187
- | `maxObservationAgeMs` | `30000` | 操作可引用观察的最大时限(毫秒,1000..600000) |
188
- | `maxCachedObservations` | `8` | 观察缓存 LRU 上限(1..64) |
189
- | `maxElements` | `500` | 每次 `screen_read` 的无障碍元素上限(1..2000) |
190
- | `maxTreeDepth` | `32` | 无障碍树遍历最大深度(1..64) |
191
- | `maxTextLength` | `200` | 脱敏后模型可见字符串的截断长度(16..10000) |
192
- | `rollbackEnabled` | `true` | `type` 失败时备份并还原控件文本 |
193
- | `ocr.enabled` / `command` / `language` | `true` / `tesseract` / `eng` | `screen_find` 的可选 OCR(挂载时探测;无 tesseract 时降级为不可用) |
194
-
195
- profile patch 中的覆盖示例:
196
-
197
- ```yaml
198
- - insert:
199
- - id: dsh-click
200
- name: dsh-click
201
- config:
202
- requireApproval: true
203
- autoApproveWindows: ['^Notepad']
204
- focusFallback: never
205
- ```
206
-
207
- ## 工具与界面
208
-
209
- | 工具 | 只读 | 需要审批 | 说明 |
210
- |---|---|---|---|
211
- | `screen_shot` | ✅ | — | 返回 `observationId` 供后续操作在 `basedOn` 中引用;模型支持图像时附带图片 |
212
- | `screen_read` | ✅ | — | 无障碍树 + 像素提示;元素 id 是操作的寻址方式 |
213
- | `click` | | ✅ | `elementId` 与 `(x, y)` 二选一;优先 UIA invoke,回退 post 消息 |
214
- | `type` | | ✅ | 仅限 value 模式元素;失败时备份并还原控件文本 |
215
- | `scroll` | | ✅ | 元素(scroll 模式)或窗口(post 滚轮) |
216
- | `key` | | ✅ | post 按键组合(`"Ctrl+S"`);忽略 post 输入的应用会大声拒绝 |
217
- | `app_list` | ✅ | — | 运行中的应用及其可见窗口 |
218
- | `app_launch` | | ✅ | 按名称或可执行路径启动,可带参数 |
219
-
220
- ## 权限与数据
221
-
222
- - **权限**:变更性操作走官方 `ctx.approval` 接缝 —— 插件从不重实现或绕过它。白名单只会*对特定窗口跳过询问*,不能关闭新鲜度或进程身份校验。
223
- - **数据**:除 attachment store 保存的截图(内容寻址、受 harness 自身附件策略约束)外,插件不落盘任何东西。观察仅存内存(有界 LRU)。无网络请求,不存凭据。
224
- - **会话日志**:`dsh-click/observed` 与 `dsh-click/action` 是仅日志的审计事件,携带脱敏后的窗口/进程事实 —— 标题、路径与自由文本在写入或展示前均先脱敏并截断。
225
-
226
- ## 安全边界
227
-
228
- - **先观察后行动,每次如此。** 操作必须引用新鲜观察;屏幕变化(像素哈希)或观察过期即拒绝,并以模型可读的原因要求重新观察。
229
- - **审批是默认。** 除非你显式放行特定窗口,否则 `requireApproval: true`;每次操作 —— 无论放行与否 —— 都记录审计。
230
- - **不抢前台焦点。** helper 从不把目标窗口带到前台(默认 `focusFallback: 'never'`);输入经 UIA 或 post 消息送达,不打扰后台窗口。
231
- - **进程身份前后复验。** 每个操作前后立即校验进程身份;操作中途进程被替换则判失败(`PROCESS_CHANGED`)。
232
- - **输出脱敏。** 控制字符被剥离、制表符折叠、凭据形态内容(密钥、token、JWT、bearer 头)在到达模型或日志前一律打码。
233
- - **失败关闭。** 不支持的平台、缺失的 subprocess 服务或不可用的 helper 都会大声拒绝每个调用 —— profile 在任何地方都能正常启动。
234
-
235
- ## 已知限制
236
-
237
- - **Windows 优先。** macOS 与 Linux 后端已预留;在这些平台上每次调用都以明确原因失败关闭。
238
- - **纯文本保真度。** `screen_read` 依赖应用暴露 UIAutomation;没有无障碍树的应用只有像素提示。坐标点击仍然可用。
239
- - **post 输入类应用。** 部分应用忽略 post 窗口消息(游戏、部分 Electron 界面);`key` 会如实报告而非假装成功。
240
- - **无信封 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` 可完全停止审计追加。
241
-
242
- ## 开发
243
-
244
- ```sh
245
- pnpm install # node ^22.19 || >=24
246
- pnpm run typecheck # tsc:src + tests,对照本地 harness checkout
247
- pnpm run typecheck:ci # tsc:对照已发布的 0.1.7-rc.2 类型(无 paths)
248
- pnpm test # vitest:66 个测试、11 个文件(helper 冒烟在 Windows 上运行)
249
- pnpm run build # tsdown bundle + tsc 声明(lib/)
250
- pnpm run verify:self-contained # 依赖声明全部来自 registry
251
- pnpm run verify:artifacts # 构建产物 ESM 面 + 原生 helper 齐全
252
- pnpm pack # 发布用 tarball
253
- ```
254
-
255
- ## Topics
256
-
257
- `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `computer-use`, `windows-automation`, `uiautomation`, `desktop-control`, `screen-reader`
258
-
259
- ## Contributors
260
-
261
- - [@PerryLink](https://github.com/PerryLink) —— 创建者与维护者:工具面、操作安全边界、Windows 原生 helper、脱敏层与五语文档。
262
- - [@Mchsd](https://github.com/Mchsd) —— 新增 `auditSessionEvents` 开关,供会话读取器拒绝 `dsh-click` 审计事件的主机退出审计追加(#2)。
263
-
264
- ## PerryLink DSH Plugin Family
265
-
266
- 本项目是 [PerryLink](https://github.com/PerryLink) 维护的 DeepSeek Harness 插件家族成员。完整名单默认折叠,避免每个 README 的首屏被长表淹没;点击展开可查看每一行及其状态。
267
-
268
- <details>
269
- <summary>展开全部插件</summary>
270
-
271
- | 插件 | 状态 |
272
- |---|---|
273
- | **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
274
- | **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
275
- | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
276
- | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | |
277
- | **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
278
- | **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
279
- | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | |
280
- | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
281
- | **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
282
- | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
283
- | **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
284
- | **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
285
- | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | |
286
- | **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
287
- | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
288
- | **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
289
- | **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
290
- | **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
291
- | **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
292
- | **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
293
- | **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
294
- | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
295
- | **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
296
- | **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
297
- | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
298
- | **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
299
- | **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
300
- | **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
301
- | **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
302
- | **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
303
- | **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
304
- | **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
305
- | **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
306
- | **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
307
- | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
308
- | **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
309
- | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
310
- | **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
311
- | **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
312
- | **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
313
- | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
314
- | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
315
- | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
316
- | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
317
- | **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
318
- | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | |
319
- | **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
320
- | **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
321
- | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
322
- | **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
323
- | **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
324
- | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
325
- | **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
326
- | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
327
- | **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
328
- | **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
329
- | **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
330
- | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | |
331
- | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
332
- | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | |
333
- | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | |
334
- | **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
335
- | **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
336
- | **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
337
- | **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
338
- | **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
339
- | **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
340
- | **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
341
- | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
342
- | **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
343
- | **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
344
- | **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
345
- | **[dsh-score](https://github.com/PerryLink/dsh-score)** | |
346
- | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
347
- | **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
348
- | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
349
- | **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
350
- | **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
351
- | **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
352
- | **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
353
- | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
354
- | **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
355
- | **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
356
- | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
357
- | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | |
358
- | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
359
- | **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
360
- | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 已冻结 — 见仓库 README |
361
- | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 已冻结 — 见仓库 README |
362
- | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 已冻结 — 见仓库 README |
363
- | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 已冻结 — 见仓库 README |
364
- | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 已冻结 — 见仓库 README |
365
- | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 已退役 — 见仓库 README |
366
- | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 已退役 — 见仓库 README |
367
- | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 已退役 — 见仓库 README |
368
-
369
- </details>
370
-
371
- ## License
372
-
373
- [Apache License 2.0](LICENSE) © 2026 dsh-click contributors
374
-
375
- ### 从 DSH Desktop 市场安装
376
-
377
- 所有 PerryLink 插件均可在 DSH Desktop 内置市场中浏览:**市场 → 来源 → 添加来源 → 粘贴** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ 选中**。安装仍需通过市场的 npm 身份校验与你的确认。