# ЁЯЦ▒я╕П dsh-click
- **1024 рд╕реНрдЯреЛрд░ рдЪреИрдирд▓**: рдПрдХ рдмрд╛рд░ `npm i -g dsh1024`, рдлрд┐рд░ `dsh1024 plugin --profile web add dsh-click` ([deepseek1024.com](https://deepseek1024.com) рдЗрдВрд╕реНрдЯреЙрд▓ рд░реИрдВрдХрд┐рдВрдЧ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
**DeepSeek Harness рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдиреЗрдЯрд┐рд╡ рдбреЗрд╕реНрдХрдЯреЙрдк рдирд┐рдпрдВрддреНрд░рдг тАФ Windows рдкрд╣рд▓реЗред**
*рдкрд╣рд▓реЗ рд╕реНрдХреНрд░реАрди рджреЗрдЦреЗрдВ, рдлрд┐рд░ рдХрд╛рдо рдХрд░реЗрдВ тАФ рд╣рд░ рдХреНрд▓рд┐рдХ рд╕реНрд╡реАрдХреГрдд, рд╣рд░ рдХреНрд░рд┐рдпрд╛ рдСрдбрд┐рдЯреЗрдбред*
[](LICENSE)
[](https://gitee.com/perrylink/dsh-click)
[](https://github.com/topics/dsh-plugin)
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-х╛╜чла)
[](#)
[](https://github.com/PerryLink/dsh-click/actions)
[](https://github.com/PerryLink/dsh-click/releases)
[](https://www.npmjs.com/package/dsh-click)
[](https://www.npmjs.com/package/dsh-click)
[English](README.md) ┬╖ [чоАф╜Уф╕нцЦЗ](README-zh.md) ┬╖ [Espa├▒ol](README-es.md) ┬╖ [Portugu├кs](README-pt.md) ┬╖ [рд╣рд┐рдиреНрджреА](README-hi.md)
---
## рд╕рдВрдЧрддрддрд╛
| рд╕рддрд╣ | рд╕реНрдерд┐рддрд┐ |
|---|---|
| Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, 2026-09-11 рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд)ред 2026-09-11 рдХреЛ dsh-v0.1.5-rc.2 master checkout рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕рддреНрдпрд╛рдкрд┐рдд (рдкреВрд░реНрдг gate chain + profile install smoke)ред |
| Node | `^22.19.0 \|\| >=24.0.0` |
| рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо | **Windows рдкрд╣рд▓реЗ** (UIAutomation + Win32 рдЗрдирдкреБрдЯ, рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП PowerShell рд╣реЗрд▓реНрдкрд░ рдХреЗ рдЬрд╝рд░рд┐рдП); macOS/Linux рдмреИрдХрдПрдВрдб рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдХреЗ рд╕рд╛рде fail-closed рд╣реЛрддреЗ рд╣реИрдВ |
| рдореЙрдбрд▓ | рдХреЗрд╡рд▓-рдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбрд▓ рдкреВрд░реА рддрд░рд╣ рд╕рдорд░реНрдерд┐рдд (`screen_read` рд╕рдВрд░рдЪрд┐рдд рдЯреЗрдХреНрд╕реНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ); рд╡рд┐рдЬрд╝рди рдореЙрдбрд▓ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ `screen_shot` рдХреА рдЫрд╡рд┐рдпрд╛рдБ рдорд┐рд▓рддреА рд╣реИрдВ |
## рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ
`dsh-click` рд╣рд╛рд░реНрдиреЗрд╕ рдХреЛ рдиреЗрдЯрд┐рд╡ рдбреЗрд╕реНрдХрдЯреЙрдк рдРрдкреНрд╕ рдкрд░ рдкреВрд░рд╛ observe тЖТ act рд▓реВрдк рджреЗрддрд╛ рд╣реИ:
- **`screen_shot`** тАФ рдХрд┐рд╕реА рд╡рд┐рдВрдбреЛ (рдпрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд╕реНрдХреНрд░реАрди) рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реАрдорд╛ рддрдХ рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╡рд┐рдЬрд╝рди-рд╕рдХреНрд╖рдо рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЫрд╡рд┐ рд╣реЛрддреА рд╣реИ; рдЕрдиреНрдпрдерд╛ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рд╡рд░рдг рдХреЗрд╡рд▓-рдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбрд▓ рдХреЛ рдЪрд╛рд▓реВ рд░рдЦрддрд╛ рд╣реИред
- **`screen_read`** тАФ рд╕рдВрд░рдЪрд┐рдд рдЕрд╡рд▓реЛрдХрди: рд╡рд┐рдВрдбреЛ рдХрд╛ рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЯреНрд░реА (рдПрд▓рд┐рдореЗрдВрдЯ рдЖрдИрдбреА, рдкреНрд░рдХрд╛рд░, рдирд╛рдо, рдЖрдпрдд, рд╕рдорд░реНрдерд┐рдд рдкреИрдЯрд░реНрди) рдФрд░ рд░рдВрдЧреЛрдВ рд╕рд╣рд┐рдд рдкрд┐рдХреНрд╕реЗрд▓-рд╕реНрдерд┐рддрд┐ рд╕рдВрдХреЗрдд тАФ рд╕рд╛рджрд╛ рдЯреЗрдХреНрд╕реНрдЯ, рдХрд┐рд╕реА рдЫрд╡рд┐ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВред
- **`click` / `type` / `scroll` / `key`** тАФ рдПрд▓рд┐рдореЗрдВрдЯ рдЖрдИрдбреА рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рд╡рд┐рдВрдбреЛ-рд╕реНрдХреЛрдкреНрдб рдХреНрд░рд┐рдпрд╛рдПрдБред рдбрд┐рд▓реАрд╡рд░реА UIA invoke рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреА рд╣реИ рдФрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╡рд┐рдВрдбреЛ рд╕рдВрджреЗрд╢реЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЧрд┐рд░рддреА рд╣реИ тАФ рдФрд░ **рдХрднреА рдЕрдЧреНрд░рднреВрдорд┐ рдлрд╝реЛрдХрд╕ рдирд╣реАрдВ рдЫреАрдирддреА**ред
- **`app_list` / `app_launch`** тАФ рдЪрд▓ рд░рд╣реЗ рдРрдкреНрд╕ рдФрд░ рдЙрдирдХреА рд╡рд┐рдВрдбреЛ рдХреА рд╕реВрдЪреА; рдирд╛рдо рдпрд╛ рдкрде рд╕реЗ рдПрдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред
рд╣рд░ рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╣реА рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛ рдкрд╛рд░ рдХрд░рддреА рд╣реИ:
1. **рддрд╛рдЬрд╝рдЧреА** тАФ рдХреНрд░рд┐рдпрд╛ рдХреЛ `basedOn` рдЕрд╡рд▓реЛрдХрди рдЙрджреНрдзреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдХрд╛рд░реНрдп рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рд╡рд┐рдВрдбреЛ рдлрд┐рд░ рд╕реЗ рдХреИрдкреНрдЪрд░ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдмрджрд▓рдиреЗ рдкрд░ рдХреНрд░рд┐рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реЛрддреА рд╣реИ (рдкрд┐рдХреНрд╕реЗрд▓-рд╣реИрд╢ + рдЕрдзрд┐рдХрддрдо рдЖрдпреБ рд╕реАрдорд╛)ред
2. **рд╕реНрд╡реАрдХреГрддрд┐** тАФ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `ctx.approval` рд╣рд░ рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкрд╣рд░рд╛ рджреЗрддрд╛ рд╣реИ; рд╡рд┐рдВрдбреЛ-рд╢реАрд░реНрд╖рдХ/рдирд┐рд╖реНрдкрд╛рджрди-рдкрде regex рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдВрдбреЛ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ (рдлрд┐рд░ рднреА рдСрдбрд┐рдЯ рд╣реЛрддреА рд╣реИ)ред
3. **рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рдЪрд╛рди** тАФ рд╕реНрд╡рд╛рдореА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ pid рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдХрд╛рд░реНрдп рд╕реЗ рдкрд╣рд▓реЗ **рдФрд░** рдмрд╛рдж рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ; рдмрджрд▓рд╛рд╡ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдЬрд╝реЛрд░ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
4. **рдСрдбрд┐рдЯ** тАФ рдЕрд╡рд▓реЛрдХрди рдФрд░ рдХреНрд░рд┐рдпрд╛рдПрдБ рд╕рддреНрд░ рд▓реЙрдЧ рдореЗрдВ `dsh-click/observed` / `dsh-click/action` рдЗрд╡реЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рд╣реЛрддреА рд╣реИрдВ (рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб, рдХреЗрд╡рд▓-рд▓реЙрдЧ)ред
```text
рдореЙрдбрд▓ harness
тФВ screen_read тФАтФАтЦ╢ observationId (+ рдПрд▓рд┐рдореЗрдВрдЯ, рдкрд┐рдХреНрд╕реЗрд▓) тЖР рд╕рдВрд░рдЪрд┐рдд рдЯреЗрдХреНрд╕реНрдЯ
тФВ click {basedOn, target} тФАтФАтЦ╢ рддрд╛рдЬрд╝рдЧреА рдЬрд╛рдБрдЪ тФАтФАтЦ╢ рд╕реНрд╡реАрдХреГрддрд┐ тФАтФАтЦ╢ рд╣реЗрд▓реНрдкрд░ (UIA)
тФВ рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИрд╢ рдмрджрд▓рд╛? тФАтФА рдЕрд╕реНрд╡реАрдХрд╛рд░ + рдкреБрдирдГ рдЕрд╡рд▓реЛрдХрди
тФВ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж pid/exe рдмрджрд▓рд╛? тФАтФА PROCESS_CHANGED
тФВ тЧАтФАтФА рдХреИрдирдирд┐рдХрд▓ JSON + рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ (dsh-click/action)
```
## рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд
```sh
# 1. рдмрдВрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
dsh plugin --profile web add "github:PerryLink/dsh-click#main"
# рдпрд╛ npm рд╕реЗ (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝)
dsh plugin --profile web add dsh-click
# 2. рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ
dsh --profile web --dump-config | grep -A2 'id: dsh-click'
```
рдлрд┐рд░ рдПрдЬреЗрдВрдЯ рд╕реЗ рдХрд╣реЗрдВ рдХрд┐ рд╡рд╣ рдХрд┐рд╕реА рд╡рд┐рдВрдбреЛ рдХреЛ рджреЗрдЦреЗ рдФрд░ рдХрд╛рд░реНрдп рдХрд░реЗ тАФ рд╣рд░ рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╕реНрд╡реАрдХреГрддрд┐ рд╕рдВрдХреЗрдд рджрд┐рдЦрддрд╛ рд╣реИ:
```
> рдиреЛрдЯрдкреИрдб рдЦреЛрд▓реЗрдВ, "рдирдорд╕реНрддреЗ" рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдЬреЛ рд╣реИ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдкрдврд╝реЗрдВред
```
## рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓
- **git рдЪреИрдирд▓** (рдирд╡реАрдирддрдо `main`): `dsh plugin --profile web add "github:PerryLink/dsh-click#main"` тАФ `prepare` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рдкреНрд░реЛрдбрдХреНрд╢рди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдмрд┐рд▓реНрдб рдХрд░рддреА рд╣реИред
- **npm рдЪреИрдирд▓** (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝): `dsh plugin --profile web add dsh-click`ред
- **tarball рдЪреИрдирд▓**: рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ `pnpm pack`, рдлрд┐рд░ `dsh plugin --profile web add ./dsh-click-.tgz`ред
- **рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓**: `dsh plugin --profile web remove dsh-click` (рдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рд╕реЗ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдПрдБ)ред
> рдпрджрд┐ pnpm рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП `ERR_PNPM_IGNORED_BUILDS` рджрд┐рдЦрд╛рддрд╛ рд╣реИ (esbuild рдХрд╛ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдмрд╛рдЗрдирд░реА рд╕рддреНрдпрд╛рдкрди), рддреЛ рдЕрдкрдиреЗ `pnpm-workspace.yaml` рдореЗрдВ `allowBuilds: { esbuild: true }` рдЬреЛрдбрд╝реЗрдВ тАФ `dsh` CLI рд╕рдЯреАрдХ рд╕реНрдирд┐рдкреЗрдЯ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
## рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рд╕рднреА рд╕рдорд╛рдпреЛрдЬрди Schemastery `Config` рдлрд╝реАрд▓реНрдб рд╣реИрдВ (cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред id-рд▓рдХреНрд╖рд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб рдкреВрд░реА рдкрдВрдХреНрддрд┐ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ тАФ рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдХреБрдВрдЬреА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред `cordis.patch.yml` рд╣рд░ рдХреБрдВрдЬреА рдХреЛ рдЗрдирд▓рд╛рдЗрди рд╕рдордЭрд╛рддрд╛ рд╣реИред
| рдХреБрдВрдЬреА | рдбрд┐рдлрд╝реЙрд▓реНрдЯ | рдЕрд░реНрде |
|---|---|---|
| `requireApproval` | `true` | рд╣рд░ рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡реАрдХреГрддрд┐ рдХреЗ рдкреАрдЫреЗ рд░рдЦреЗрдВ; рдСрдмреНрдЬрд╝рд░реНрд╡рд░ рдХрднреА рдирд╣реАрдВ рдкреВрдЫрддреЗ |
| `autoApproveWindows` | `[]` | рд╡рд┐рдВрдбреЛ-рд╢реАрд░реНрд╖рдХ/рдирд┐рд╖реНрдкрд╛рджрди-рдкрде regex рдЬреЛ рд╕реНрд╡реАрдХреГрддрд┐ рдкреНрд░рд╢реНрди рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ (рдлрд┐рд░ рднреА рддрд╛рдЬрд╝рдЧреА рдЬрд╛рдБрдЪ рдФрд░ рдСрдбрд┐рдЯ) |
| `auditSessionEvents` | `true` | рд╕рддреНрд░ рдореЗрдВ `dsh-click/observed`/`dsh-click/action` рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдЬреЛрдбрд╝реЗрдВред рдЕрдиреБрдХреВрд▓реА рджреНрд╡рд╛рд░ рдмрд┐рдирд╛-рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рд╡рд╛рд▓реЗ hosts (rc.6тАУrc.8, 0.1.1-rc.2, рдФрд░ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкрдарди-рд╡рд┐рдлрд▓-рдмрдВрдж 0.1.2-rc.1) рдкрд░ append рдкрд╣рд▓реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ; рдСрдбрд┐рдЯ append рдкреВрд░реА рддрд░рд╣ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП `false` рд░рдЦреЗрдВ 0.1.2-rc.1 (2026-09-02 рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд): рд╕рддреНрд░ рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ рдЕрдкрдирд╛ ignorable рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣реАрдд-рд▓реЙрдЧ рдкрдарди рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд░рдЦрддрд╛ рд╣реИ - Session.append рдЕрднреА рднреА рдЗрд╕реЗ рд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдЧреЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред |
| `focusFallback` | `never` | рдХреНрдпрд╛ рдХреЛрдИ рдХреНрд░рд┐рдпрд╛ рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╡рд┐рдВрдбреЛ рдХреЛ рдЕрдЧреНрд░рднреВрдорд┐ рдореЗрдВ рд▓рд╛ рд╕рдХрддреА рд╣реИ (`never` / `allow`) |
| `imageMode` | `auto` | `screen_shot` рд░реЗрдВрдбрд░рд┐рдВрдЧ: `auto` (рдореЙрдбрд▓ рдЫрд╡рд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ рддреЛ рдЫрд╡рд┐, рдЕрдиреНрдпрдерд╛ рдЯреЗрдХреНрд╕реНрдЯ) рдпрд╛ `text` |
| `helperTimeoutMs` | `30000` | рдкреНрд░рддрд┐ рд╣реЗрд▓реНрдкрд░-рдХреЙрд▓ рдЯрд╛рдЗрдордЖрдЙрдЯ ms рдореЗрдВ (1..300000) |
| `maxHelperOutputBytes` | `25165824` | рдПрдХ рд╣реЗрд▓реНрдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдмрд╛рдЗрдЯ рд╕реАрдорд╛ (1024..67108864) |
| `maxScreenshotSide` | `2560` | рдХреИрдкреНрдЪрд░ рдХреА рд╕рдмрд╕реЗ рд▓рдВрдмреА рднреБрдЬрд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ (320..7680); рдмрдбрд╝реА рдХреИрдкреНрдЪрд░ рдЫреЛрдЯреА рдХреА рдЬрд╛рддреА рд╣реИрдВ |
| `staleCheckPixels` | `true` | рд╣рд░ рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ рддрд╛рдЬрд╝рд╛ рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИрд╢ рдорд┐рд▓рд╛рдПрдБ рдФрд░ рдмрджрд▓рд╛рд╡ рдкрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ |
| `maxObservationAgeMs` | `30000` | рдХрд┐рд╕реА рдЕрд╡рд▓реЛрдХрди рдХреА рдЕрдзрд┐рдХрддрдо рдЖрдпреБ ms рдореЗрдВ рдЬрд┐рд╕реЗ рдХреЛрдИ рдХреНрд░рд┐рдпрд╛ рдЙрджреНрдзреГрдд рдХрд░ рд╕рдХрддреА рд╣реИ (1000..600000) |
| `maxCachedObservations` | `8` | рдХреИрд╢ рдХрд┐рдП рдЧрдП рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреА LRU рд╕реАрдорд╛ (1..64) |
| `maxElements` | `500` | рдкреНрд░рддрд┐ `screen_read` рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдПрд▓рд┐рдореЗрдВрдЯ рдХреА рд╕реАрдорд╛ (1..2000) |
| `maxTreeDepth` | `32` | рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЯреНрд░реА-рд╡реЙрдХ рдХреА рдЕрдзрд┐рдХрддрдо рдЧрд╣рд░рд╛рдИ (1..64) |
| `maxTextLength` | `200` | рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб рдореЙрдбрд▓-рджреГрд╢реНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдХрд╛рдЯ-рдЫрд╛рдБрдЯ рд▓рдВрдмрд╛рдИ (16..10000) |
| `rollbackEnabled` | `true` | `type` рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдмреИрдХрдЕрдк рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрди |
| `ocr.enabled` / `command` / `language` | `true` / `tesseract` / `eng` | `screen_find` рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ OCR (рдорд╛рдЙрдВрдЯ рдкрд░ рдЬрд╛рдБрдЪ; tesseract рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЕрдиреБрдкрд▓рдмреНрдз) |
рдЖрдкрдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдЙрджрд╛рд╣рд░рдг:
```yaml
- insert:
- id: dsh-click
name: dsh-click
config:
requireApproval: true
autoApproveWindows: ['^Notepad']
focusFallback: never
```
## рдЯреВрд▓ рдФрд░ рд╕рддрд╣реЗрдВ
| рдЯреВрд▓ | рдХреЗрд╡рд▓-рдкрдарди | рд╕реНрд╡реАрдХреГрддрд┐ рдЪрд╛рд╣рд┐рдП | рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ |
|---|---|---|---|
| `screen_shot` | тЬЕ | тАФ | `observationId` рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдж рдХреА рдХреНрд░рд┐рдпрд╛рдПрдБ `basedOn` рдореЗрдВ рдЙрджреНрдзреГрдд рдХрд░рддреА рд╣реИрдВ; рдореЙрдбрд▓ рдЫрд╡рд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ рддреЛ рдЫрд╡рд┐ рдЕрдЯреИрдЪрдореЗрдВрдЯ |
| `screen_read` | тЬЕ | тАФ | рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЯреНрд░реА + рдкрд┐рдХреНрд╕реЗрд▓ рд╕рдВрдХреЗрдд; рдПрд▓рд┐рдореЗрдВрдЯ рдЖрдИрдбреА рд╣реА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╕рдВрдмреЛрдзрди рд╣реИ |
| `click` | | тЬЕ | `elementId` рдпрд╛ `(x, y)` рдореЗрдВ рд╕реЗ рдареАрдХ рдПрдХ; UIA invoke рдкреНрд░рд╛рдердорд┐рдХрддрд╛, рдкреЛрд╕реНрдЯ рдХрд┐рдП рд╕рдВрджреЗрд╢ рдлрд╝реЙрд▓рдмреИрдХ |
| `type` | | тЬЕ | рдХреЗрд╡рд▓ value-рдкреИрдЯрд░реНрди рдПрд▓рд┐рдореЗрдВрдЯ; рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдмреИрдХрдЕрдк рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрди |
| `scroll` | | тЬЕ | рдПрд▓рд┐рдореЗрдВрдЯ (scroll рдкреИрдЯрд░реНрди) рдпрд╛ рд╡рд┐рдВрдбреЛ (рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╡реНрд╣реАрд▓) |
| `key` | | тЬЕ | рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреБрдВрдЬреА рд╕рдВрдпреЛрдЬрди (`"Ctrl+S"`); рдкреЛрд╕реНрдЯ рдЗрдирдкреБрдЯ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдРрдкреНрд╕ рдЬрд╝реЛрд░ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ |
| `app_list` | тЬЕ | тАФ | рдЪрд▓ рд░рд╣реЗ рдРрдкреНрд╕ рдФрд░ рдЙрдирдХреА рджреГрд╢реНрдп рд╡рд┐рдВрдбреЛ |
| `app_launch` | | тЬЕ | рдирд╛рдо рдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкрде рд╕реЗ, рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХреЛрдВ рд╕рд╣рд┐рдд |
## рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдбреЗрдЯрд╛
- **рдЕрдиреБрдорддрд┐рдпрд╛рдБ**: рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдХреНрд░рд┐рдпрд╛рдПрдБ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ `ctx.approval` рд╕реАрдо рдкрд╛рд░ рдХрд░рддреА рд╣реИрдВ тАФ рдкреНрд▓рдЧрдЗрди рдЙрд╕реЗ рдХрднреА рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдпрд╛ рдмрд╛рдпрдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ред рдЕрдиреБрдорддрд┐-рд╕реВрдЪреА рдХреЗрд╡рд▓ *рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди рдЫреЛрдбрд╝рддреА рд╣реИ*; рдпрд╣ рддрд╛рдЬрд╝рдЧреА рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛-рдкрд╣рдЪрд╛рди рдЬрд╛рдБрдЪ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреАред
- **рдбреЗрдЯрд╛**: рдкреНрд▓рдЧрдЗрди рдЕрдЯреИрдЪрдореЗрдВрдЯ рд╕реНрдЯреЛрд░ рджреНрд╡рд╛рд░рд╛ рд░рдЦреЗ рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ (рдХреЙрдиреНрдЯреЗрдВрдЯ-рдПрдбреНрд░реЗрд╕реНрдб, рд╣рд╛рд░реНрдиреЗрд╕ рдХреА рдЕрдкрдиреА рдЕрдЯреИрдЪрдореЗрдВрдЯ рдиреАрддрд┐ рдХреЗ рддрд╣рдд) рдХреБрдЫ рднреА рдбрд┐рд╕реНрдХ рдкрд░ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ред рдЕрд╡рд▓реЛрдХрди рдореЗрдореЛрд░реА рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ (рд╕реАрдорд┐рдд LRU)ред рдХреЛрдИ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ, рдХреЛрдИ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рднрдВрдбрд╛рд░рдг рдирд╣реАрдВред
- **рд╕рддреНрд░ рд▓реЙрдЧ**: `dsh-click/observed` рдФрд░ `dsh-click/action` рдХреЗрд╡рд▓-рд▓реЙрдЧ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб рд╡рд┐рдВрдбреЛ/рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдереНрдп рд╣реЛрддреЗ рд╣реИрдВ тАФ рд╢реАрд░реНрд╖рдХ, рдкрде рдФрд░ рдореБрдХреНрдд рдЯреЗрдХреНрд╕реНрдЯ рд▓рд┐рдЦреЗ рдпрд╛ рджрд┐рдЦрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░рд┐рдбреИрдХреНрдЯ рдФрд░ рдХрд╛рдЯреЗ рдЬрд╛рддреЗ рд╣реИрдВред
## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ
- **рдкрд╣рд▓реЗ рджреЗрдЦреЗрдВ, рдлрд┐рд░ рдХрд╛рд░реНрдп тАФ рд╣рд░ рдмрд╛рд░ред** рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рддрд╛рдЬрд╝рд╛ рдЕрд╡рд▓реЛрдХрди рдЙрджреНрдзреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдмрджрд▓реА рд╕реНрдХреНрд░реАрди (рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИрд╢) рдпрд╛ рд╕рдорд╛рдкреНрдд рдЕрд╡рд▓реЛрдХрди рдХреЛ рдореЙрдбрд▓-рдкрдардиреАрдп рдХрд╛рд░рдг рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреБрдирдГ рдЕрд╡рд▓реЛрдХрди рдХреА рдорд╛рдБрдЧ рдХрд░рддрд╛ рд╣реИред
- **рд╕реНрд╡реАрдХреГрддрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред** рдЬрдм рддрдХ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдВрдбреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝рддреЗ, `requireApproval: true`; рд╣рд░ рдХреНрд░рд┐рдпрд╛ тАФ рдЕрдиреБрдордд рд╣реЛ рдпрд╛ рдирд╣реАрдВ тАФ рдСрдбрд┐рдЯ рд╣реЛрддреА рд╣реИред
- **рдлрд╝реЛрдХрд╕ рдирд╣реАрдВ рдЫреАрдирд╛ рдЬрд╛рддрд╛ред** рд╣реЗрд▓реНрдкрд░ рдХрднреА рд▓рдХреНрд╖реНрдп рд╡рд┐рдВрдбреЛ рдХреЛ рдЕрдЧреНрд░рднреВрдорд┐ рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рддрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ `focusFallback: 'never'`); рдЗрдирдкреБрдЯ UIA рдпрд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рд╡рд┐рдВрдбреЛ рдХреЛ рдЫреЗрдбрд╝рд╛ рди рдЬрд╛рдПред
- **рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рдЪрд╛рди рджреЛрдмрд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рд╣реЛрддреА рд╣реИ** тАФ рд╣рд░ рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ; рдмреАрдЪ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрджрд▓рдиреЗ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ (`PROCESS_CHANGED`)ред
- **рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб рдЖрдЙрдЯрдкреБрдЯред** рдирд┐рдпрдВрддреНрд░рдг рд╡рд░реНрдг рд╣рдЯрддреЗ рд╣реИрдВ, рдЯреИрдм рд╕рд┐рдХреБрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓-рдЖрдХрд╛рд░ рдХреЗ рдорд╛рди (рдХреБрдВрдЬрд┐рдпрд╛рдБ, рдЯреЛрдХрди, JWT, bearer рд╣реЗрдбрд░) рдореЙрдбрд▓ рдпрд╛ рд▓реЙрдЧ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░рд┐рдбреИрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред
- **Fail closedред** рдЕрд╕рдорд░реНрдерд┐рдд рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо, рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рд╕реЗрд╡рд╛ рдпрд╛ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЗрд▓реНрдкрд░ рд╣рд░ рдХреЙрд▓ рдХреЛ рдЬрд╝реЛрд░ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ тАФ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╣рд░ рдЬрдЧрд╣ рдмреВрдЯ рд╣реЛрддреА рд░рд╣рддреА рд╣реИрдВред
## рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ
- **Windows рдкрд╣рд▓реЗред** macOS рдФрд░ Linux рдмреИрдХрдПрдВрдб рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ; рдЙрди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╣рд░ рдХреЙрд▓ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рд╕реЗ fail-closed рд╣реЛрддреА рд╣реИред
- **рдХреЗрд╡рд▓-рдЯреЗрдХреНрд╕реНрдЯ рдирд┐рд╖реНрдард╛ред** `screen_read` рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдРрдк UIAutomation рдЙрдЬрд╛рдЧрд░ рдХрд░реЗ; рдмрд┐рдирд╛ рдПрдХреНрд╕реЗрд╕рд┐рдмрд▓ рдЯреНрд░реА рд╡рд╛рд▓реЗ рдРрдкреНрд╕ рдХреЗрд╡рд▓ рдкрд┐рдХреНрд╕реЗрд▓ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреНрд▓рд┐рдХ рдЙрдкрд▓рдмреНрдз рд░рд╣рддреЗ рд╣реИрдВред
- **рдкреЛрд╕реНрдЯ-рдЗрдирдкреБрдЯ рдРрдкреНрд╕ред** рдХреБрдЫ рдРрдкреНрд╕ рдкреЛрд╕реНрдЯ рдХрд┐рдП рд╡рд┐рдВрдбреЛ рд╕рдВрджреЗрд╢ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЧреЗрдо, рдХреБрдЫ Electron рд╕рддрд╣реЗрдВ); `key` рд╕рдлрд▓рддрд╛ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИред
- **рдмрд┐рдирд╛-рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рд╡рд╛рд▓реЗ рд╣рд╛рд░реНрдиреЗрд╕ рдмрд┐рд▓реНрдб рдкрд░ рд╕рддреНрд░ рдСрдбрд┐рдЯред** рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдПрдХ рдЕрдиреБрдХреВрд▓реА рджреНрд╡рд╛рд░ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ: рд╢рдмреНрджрд╛рд╡рд▓реА рдЬрд╛рдирдиреЗ рд╡рд╛рд▓реЗ hosts рд╕реАрдзреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, `ignorable` рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рд╡рд╛рд▓реЗ hosts рдорд╛рд░реНрдХрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдмрд┐рдирд╛-рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рд╡рд╛рд▓реЗ hosts тАФ `0.1.0-rc.6`тАУ`0.1.0-rc.8`, `0.1.1-rc.2`, рдФрд░ `0.1.2-rc.1` (рдЬреЛ ignorable рдорд╛рд░реНрдХрд░ рдХреЛ рд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ тАФ рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣реАрдд-рд▓реЙрдЧ рдкрдарди рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд░рдХрд░рд╛рд░ рд░рд╣рддрд╛ рд╣реИ тАФ рдФрд░ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкрдарди-рд╡рд┐рдлрд▓-рдмрдВрдж рд╣реИ) тАФ рдХреЛ рдСрдбрд┐рдЯ append рдирд╣реАрдВ рдорд┐рд▓рддрд╛; рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо рд╣реА рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг-рдпреЛрдЧреНрдп рдСрдбрд┐рдЯ рдкрде рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВред рдСрдбрд┐рдЯ append рдкреВрд░реА рддрд░рд╣ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП `auditSessionEvents: false` рд░рдЦреЗрдВред
## рд╡рд┐рдХрд╛рд╕
```sh
pnpm install # node ^22.19 || >=24
pnpm run typecheck # tsc: src + tests рд╕реНрдерд╛рдиреАрдп рд╣рд╛рд░реНрдиреЗрд╕ рдЪреЗрдХрдЖрдЙрдЯ рдХреЗ рд╡рд┐рд░реБрджреНрдз
pnpm run typecheck:ci # tsc рдкреНрд░рдХрд╛рд╢рд┐рдд 0.1.5-rc.2 рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз (рдмрд┐рдирд╛ paths)
pnpm test # vitest: 66 рдЯреЗрд╕реНрдЯ, 11 рдлрд╝рд╛рдЗрд▓реЗрдВ (рд╣реЗрд▓реНрдкрд░ рд╕реНрдореЛрдХ Windows рдкрд░ рдЪрд▓рддрд╛ рд╣реИ)
pnpm run build # tsdown рдмрдВрдбрд▓ + tsc рдШреЛрд╖рдгрд╛рдПрдБ (lib/)
pnpm run verify:self-contained # рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдкреЗрдХ registry рд╕реЗ рд╣рд▓ рд╣реЛрддреА рд╣реИрдВ
pnpm run verify:artifacts # рдирд┐рд░реНрдорд┐рдд ESM рдлрд╝реЗрд╕ + рдиреЗрдЯрд┐рд╡ рд╣реЗрд▓реНрдкрд░ рдореМрдЬреВрдж
pnpm pack # рдкреНрд░рдХрд╛рд╢рд┐рдд tarball
```
## Topics
`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `computer-use`, `windows-automation`, `uiautomation`, `desktop-control`, `screen-reader`
## Contributors
- [@PerryLink](https://github.com/PerryLink) тАФ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдореЗрдВрдЯреЗрдирд░: рдЯреВрд▓ рд╕рддрд╣, рдХреНрд░рд┐рдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛, Windows рдиреЗрдЯрд┐рд╡ рд╣реЗрд▓реНрдкрд░, рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝рд░ рдФрд░ рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред
- [@Mchsd](https://github.com/Mchsd) тАФ рдЙрди harnesses рдХреЗ рд▓рд┐рдП `auditSessionEvents` рдСрдкреНрдЯ-рдЖрдЙрдЯ рдЬреЛрдбрд╝рд╛ рдЬрд┐рдирдХрд╛ рд╕рддреНрд░ рд░реАрдбрд░ `dsh-click` рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ (#2)ред
## PerryLink DSH Plugin Family
рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ [PerryLink](https://github.com/PerryLink) рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░рдХреНрд╖рд┐рдд [40 DeepSeek Harness рдкреНрд▓рдЧрдЗрдиреЛрдВ](https://github.com/PerryLink) рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмрд╛рдХреА рднреА рдХрд░реЗрдВрдЧреЗ:
| Plugin | One-liner |
|---|---|
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | рдЕрдиреБрдореЛрджрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рджреНрд╡рд┐рддреАрдп-рдореЙрдбрд▓ рд╕реНрд╡рддрдГ-рд╕рдореАрдХреНрд╖рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓-рдмрдВрдж | |
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | рд╡реЗрдм UI рд╕рд╛рдЗрдбрдмрд╛рд░, рд╕рдВрджреЗрд╢ рдФрд░ рдЕрд╡рд░реЛрдзрди рдХреЗ рд╕рд╛рде рдЯрд┐рдХрд╛рдК рдкреГрд╖реНрдарднреВрдорд┐ рдЪрд╛рдЗрд▓реНрдб рдПрдЬреЗрдВрдЯ | |
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд рдкреНрд░рд╢рд╛рд╕рди: рдмрдЬрдЯ, рдХрд╛рд░реНрдмрди рдФрд░ рд╡рд┐рд▓рдВрдмрддрд╛ рдПрдХ рдкреИрдирд▓ рдореЗрдВред | |
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-рд╕рдорддреБрд▓реНрдп: рд╕реНрдиреИрдкрд╢реЙрдЯ, рд╕рддреНрд░ рдлрд╝реЙрд░реНрдХ, рдПрдХ-рдмрд╛рд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ | |
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Claude Code рд╕рддреНрд░, рдореЗрдореЛрд░реА, рдХреМрд╢рд▓ рдФрд░ CLAUDE.md рдХреЛ DSH рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ | |
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | рд╡реЗрдм рдХрдВрдкреЛрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓-рд╢реИрд▓реА рдЗрдирдкреБрдЯ рдЗрддрд┐рд╣рд╛рд╕: рддреАрд░, Ctrl+R рдЦреЛрдЬ | |
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | рдбреЗрдЯрд╛рд╕реЗрдЯ рдЧреБрдгрд╡рддреНрддрд╛ рдЬрд╛рдБрдЪ рд╡ рдЙрджреНрдзрд░рдг рд╕рддреНрдпрд╛рдкрди (рдпрд╣рд╛рдБ рдЙрдкрднреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрдЦреНрдпрд╛-рд╕реЗрддреБ) | |
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдореНрдкреНрдЯ-рдЗрдВрдЬреЗрдХреНрд╢рди, рдЬреЗрд▓рдмреНрд░реЗрдХ рдФрд░ рд╕реАрдХреНрд░реЗрдЯ-рд▓реАрдХ рд░рдХреНрд╖рд╛ред | |
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ-рдЕрдиреБрд╢рд╛рд╕рди рд░рдХреНрд╖рдХ: рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдкреВрдЫрддрд╛рдЫ, рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░, рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рд╕рдореАрдХреНрд╖рд╛ | |
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдПрдХреАрдХреГрдд рд╕реНрдереИрддрд┐рдХ-рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рд░реВрдЯрд┐рдВрдЧред | |
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд░реАрдб-рдУрдирд▓реА рдкреНрд░рджрд░реНрд╢рди рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕ред | |
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | рдЪреАрдиреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдореНрдпреВрдЪреБрдЕрд▓ рдлрдВрдб рдХреЗ рд▓рд┐рдП рдирд┐рдпрддрд╛рддреНрдордХ рдЕрдиреБрд╕рдВрдзрд╛рди рд░рд┐рдкреЛрд░реНрдЯ | |
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | DSH рдХреЗ рд▓рд┐рдП GitHub PR/issues рдПрдХреАрдХрд░рдг, рд╣рд░ рд▓реЗрдЦрди рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд | |
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | рдЙрджреНрдпреЛрдЧ-рдЕрдиреБрд╕рдВрдзрд╛рди рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рдЬреЛ рдЗрд╕ рдкреНрд▓рдЧрд┐рди рдХреЗ `ctx.researchReport.assemble` рд╕реЗ рдбрд┐рд▓реАрд╡рд░реЗрдмрд▓ рд╕реАрд▓ рдХрд░рддрд╛ рд╣реИ | |
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреНрдЮрд╛рдирдХреЛрд╢ред | |
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп-рдореЙрдбрд▓ (Ollama) рдПрдХреАрдХрд░рдгред | |
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | рднрд╛рд╖рд╛ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ LSP рдирд┐рджрд╛рди, рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ, рдкреВрд░реНрдгрддрд╛, рдХреЛрдб рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░ рдирд╛рдо рдмрджрд▓рдирд╛ | |
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII рдорд╛рд╕реНрдХрд┐рдВрдЧ рдорд┐рдбрд▓рд╡реЗрдпрд░: рдореЙрдбрд▓ рд╕реАрдорд╛ рдкрд░ рдЕрдирд╛рдо рдХрд░реЗрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ рд▓реЗрдпрд░ рдкрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ | |
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ MCP рд░рдирдЯрд╛рдЗрдо рдкреИрдирд▓: /mcp рдХрдорд╛рдВрдб + рд╕реНрдерд┐рддрд┐, рдЯреВрд▓ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓рд╛ Settings рдЯреИрдм | |
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд рдХреНрд░реЙрд╕-рд╕рддреНрд░ рдореЗрдореЛрд░реА: ctx.memory рд╕реАрдо + SQLite + рдореЗрдореЛрд░реА рдЯреВрд▓ | |
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП OpenTelemetry рдФрд░ Langfuse рдЕрд╡рд▓реЛрдХрдиреАрдпрддрд╛ рдирд┐рд░реНрдпрд╛рддрдХред | |
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-рд╕рдорддреБрд▓реНрдп рд░рдирдЯрд╛рдЗрдо рд╢реИрд▓реА рдмрджрд▓рд╛рд╡ | |
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | рдорд▓реНрдЯреА-рдЪреИрдирд▓ рдЕрдиреБрдореЛрджрди/рдкреНрд░рд╢реНрди рдмреНрд░рд┐рдЬ: WeChat/Telegram/Feishu, рд╕рддреНрд░ рдХрдВрд╕реЛрд▓ |
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | рдСрдбрд┐рдЯ рдХреЗ рд╕рд╛рде Claude Code-рд╢реИрд▓реА рдШреЛрд╖рдгрд╛рддреНрдордХ allow/deny/ask рдЕрдиреБрдорддрд┐ рдирд┐рдпрдо | |
| **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | рд╢реАрд░реНрд╖-рдмрд╛рд░ рдЯреЙрдЧрд▓ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рдЧрдд рдирд┐рд░реНрджреЗрд╢ рдЗрдВрдЬреЗрдХреНрдЯрд░ (рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг) |
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | рдорд╛рдБрдЧ рдкрд░ рдПрдЬреЗрдВрдЯ рдХреМрд╢рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд▓рдЧрдЗрди-рд╡рд┐рдХрд╛рд╕ рдЬреНрдЮрд╛рди рдЖрдзрд╛рд░ | |
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | рд╕рд╛рдордЧреНрд░реА-рдкрддрд╛ рд╕рд╛рдХреНрд╖реНрдп рдФрд░ рд╕реАрд▓рдмрдВрдж рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╡рд╛рд▓рд╛ рд╕рддреНрдпрд╛рдкрди-рдпреЛрдЧреНрдп рдЕрдиреБрд╕рдВрдзрд╛рди-рд░рд┐рдкреЛрд░реНрдЯ рдЗрдВрдЬрди | |
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | DeepSeek Harness рдкреНрд▓рдЧрд┐рдиреЛрдВ рдХреА рдмрд╣реБ-рдЖрдпрд╛рдореА рдЧреБрдгрд╡рддреНрддрд╛ рд╕реНрдХреЛрд░рд┐рдВрдЧред | |
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | рдЯрд┐рдХрд╛рдК рдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╡реЗрдм рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рд╕рддреНрд░ рдкрд┐рди рдХрд░реЗрдВ | |
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдбрд┐рд╡рд╛рдЗрд╕ рд╕рддреНрд░ рд╕рд┐рдВрдХ тАФ рдЖрдкрдХреЗ рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХрд╛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд git рдорд┐рд░рд░ред | |
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | рд╕реБрд░рдХреНрд╖рд╛-рдСрдбрд┐рдЯ рдХреМрд╢рд▓ рдкреИрдХ: рдЧреБрдкреНрдд рд╕реНрдХреИрди, рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЖрдкреВрд░реНрддрд┐-рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдореАрдХреНрд╖рд╛ | |
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдЖрд╡рд╛рдЬрд╝-рдкреНрд░рдердо рд╕рддреНрд░ рд▓реВрдк: рдмреЛрд▓реЗрдВ рдФрд░ рдЙрддреНрддрд░ рд╕реБрдиреЗрдВред | |
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness рдкреНрд▓рдЧрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреГрдердХ рдЗрдВрд╕реНрдЯреЙрд▓-рдПрдВрдб-рд╕реНрдореЛрдХ рдЯреЗрд╕реНрдЯ рдбреНрд░рд╛рдЗрд╡ред | |
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 рдХрд╛рд░реНрдп рдмреНрд░рд┐рдЬ: рд╕рддреНрд░-рд╣реЗрдбрд░ рдкреИрдирд▓ + 11 рдЯреВрд▓ |
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╡реЗрдВрдбрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдирд┐рдпрддрд╛рддреНрдордХ JSON рдорд░рдореНрдорддред | |
| **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat тЖФ DSH рдмреНрд░рд┐рдЬ (Tencent iLink bot): рдЯреЗрдХреНрд╕реНрдЯ/рдЗрдореЗрдЬ/рдлрд╝рд╛рдЗрд▓/рдЖрд╡рд╛рдЬрд╝, рдЪреИрдЯ рдореЗрдВ рдЕрдиреБрдореЛрджрди |
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
| **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
| **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
| **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
| **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
| **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` тЖТ `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
## License
[Apache License 2.0](LICENSE) ┬й 2026 dsh-click contributors
### DSH Desktop рдорд╛рд░реНрдХреЗрдЯ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
рд╕рднреА PerryLink рдкреНрд▓рдЧрдЗрди DSH Desktop рдХреЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: **Market тЖТ Sources тЖТ add source тЖТ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **тЖТ рдЪреБрдиреЗрдВ**ред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдорд╛рд░реНрдХреЗрдЯ рдХреЗ npm-identity рд╕рддреНрдпрд╛рдкрди рдФрд░ рдЖрдкрдХреА рдкреБрд╖реНрдЯрд┐ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред