# ЁЯЫбя╕П dsh-defend
- **1024 рд╕реНрдЯреЛрд░ рдЪреИрдирд▓**: рдПрдХ рдмрд╛рд░ `npm i -g dsh1024`, рдлрд┐рд░ `dsh1024 plugin --profile web add dsh-defend` ([deepseek1024.com](https://deepseek1024.com) рдЗрдВрд╕реНрдЯреЙрд▓ рд░реИрдВрдХрд┐рдВрдЧ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
**DeepSeek Harness рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдореНрдкреНрдЯ-рдЗрдВрдЬреЗрдХреНрд╢рди, рдЬреЗрд▓рдмреНрд░реЗрдХ рдФрд░ рд╕реАрдХреНрд░реЗрдЯ-рд▓реАрдХ рд╕реБрд░рдХреНрд╖рд╛ред**
*рдирд┐рдпрдо рдЬреНрдЮрд╛рдд рдХреЛ рддрдп рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рддрдп рдХрд░рддрд╛ рд╣реИ тАФ рдФрд░ рд╕рдм рдХреБрдЫ рдСрдбрд┐рдЯреЗрдб рд░рд╣рддрд╛ рд╣реИред*
[](LICENSE)
[](https://gitee.com/perrylink/dsh-defend)
[](https://github.com/topics/dsh-plugin)
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-х╛╜чла)
[](#)
[](https://github.com/PerryLink/dsh-defend/actions)
[](https://github.com/PerryLink/dsh-defend/releases)
[](https://www.npmjs.com/package/dsh-defend)
[](https://www.npmjs.com/package/dsh-defend)
[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.6-alpha.2` (2026-09-18 рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд; peer рд░реЗрдВрдЬ `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0`)ред рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ `Session.append` рдХрд╛ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рд╕рд░рдлрд╝реЗрд╕-рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рд╡рд╣ `SurfaceIntent` рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреИрд░-рд╕рд░рдлрд╝реЗрд╕ `defend/detection` рдЕрдм рднреА `ignorable` рдорд╛рд░реНрдХрд░ рд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛: рд╕рддреНрд░-рд▓реЙрдЧ рдСрдбрд┐рдЯ fail-closed рд░реВрдк рд╕реЗ рдмрдВрдж рд░рд╣рддрд╛ рд╣реИ рдФрд░ `/defend` рдЕрдм рд╡рд╣ рд╕реНрдерд┐рддрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред 2026-09-18 рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд (рджреЛрд╣рд░рд╛ typecheck + рдкреВрд░реА рдЯреЗрд╕реНрдЯ рд╕реВрдЯ + self-contained/artifacts рдЧреЗрдЯ)ред |
| Node | `^22.19.0 \|\| >=24.0.0` |
| рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо | рд╕рднреА (рдХреЗрд╡рд▓ host; рдХреЛрдИ рдиреЗрдЯрд┐рд╡ рдХреЛрдб рдирд╣реАрдВ, рдХреЛрдИ рдиреЗрдЯрд╡рд░реНрдХ рдирд╣реАрдВ) |
| рдореЙрдбрд▓ | рдХреЛрдИ рднреА (рдкрд╣рдЪрд╛рди рдореЙрдбрд▓ рддрдХ рд╕рд╛рдордЧреНрд░реА рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддреА рд╣реИ) |
## рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ
`dsh-defend` рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рдордиреЗ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдкрд░рддреЗрдВ рд░рдЦрддрд╛ рд╣реИ:
1. **рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА-рдбрд┐рд▓реАрдЯ рдЧрд╛рд░реНрдб** тАФ 8┬╖14/8┬╖16 рдкреЛрд╕реНрдЯрдореЙрд░реНрдЯрдо рд╕рдмрдХ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд░реВрдкред `tools/pre-execute` рдкрд░, рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрд▓ рдХрдорд╛рдВрдб рддрдм рддрдХ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рддрдХ **рд╣рд░** рд▓рдХреНрд╖реНрдп рд╕рддреНрд░ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░рдкреЗрдХреНрд╖ рдкрде рди рд╣реЛ рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЙрдкрд╕рд░реНрдЧреЛрдВ (рд╣реЛрдо рдХреЙрдиреНрдлрд╝рд┐рдЧ, `.dsh`/`.claude`, рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ) рд╕реЗ рдмрд╛рд╣рд░ рди рд╣реЛред dry-run рдЪрд┐рд╣реНрди (`-WhatIf`, `--dry-run`, `git clean -n`) рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ тАФ рд╡реЗ рдареАрдХ рд╡рд╣реА рдЬрд╛рдБрдЪ рд╣реИрдВ рдЬреЛ рд╕рдмрдХ рдорд╛рдБрдЧрддрд╛ рд╣реИред
2. **рдкрд╣рдЪрд╛рди рдкрд░рдд** тАФ рдЪрд╛рд░ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рд╕реЗ рдкреЛрд░реНрдЯреЗрдб (рд╕рднреА Apache-2.0, рджреЗрдЦреЗрдВ THIRD_PARTY_NOTICES.md): 25 Prompt-Injection-Payloads рдирд┐рдпрдо, рд╢реБрджреНрдз-TypeScript Aho-Corasick рдСрдЯреЛрдореЗрдЯрди рдкрд░ 25 Jailbreak-Detector рдкреИрдЯрд░реНрди, Secret-Key-Leaker-Detect рд╡ рдЬрд╛рд░реАрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ 12 рд╕реАрдХреНрд░реЗрдЯ рд╡реНрдпрд╛рдХрд░рдг, рдФрд░ Prompt-Attack-Dataset рдХреЛ рд░рд┐рдЧреНрд░реЗрд╢рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╕ рдХрд╛ рддрд╕ рд░рдЦрд╛ рдЧрдпрд╛ред
рддреАрди рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдмрд┐рдВрджреБ, рдПрдХ рдирд┐рд░реНрдгрдп рдореЙрдбрд▓:
| рдмрд┐рдВрджреБ | рд╕реНрдХреИрди рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА | рдирд┐рд░реНрдгрдп |
|---|---|---|
| `agent/pre-step` | рдЖрд╡рдХ рд╕рдВрджреЗрд╢ | allow тЖТ `next()`; ask тЖТ рд╕реНрд╡реАрдХреГрддрд┐; block тЖТ рдЪрд░рдг рдЕрд╕реНрд╡реАрдХрд╛рд░ |
| `tools/pre-execute` | рдЯреВрд▓ рддрд░реНрдХ | allow тЖТ `next()`; ask тЖТ рд╕реНрд╡реАрдХреГрддрд┐; block тЖТ deny |
| `tools/post-execute` | рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо | allow тЖТ `next()`; ask тЖТ рд╕реНрд╡реАрдХреГрддрд┐; block тЖТ рд╕реБрдзрд╛рд░рд╛рддреНрдордХ рдлрд╝реАрдбрдмреИрдХ |
рдбрд┐рдлрд╝реЙрд▓реНрдЯ: рд╣рд░ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд▓рд┐рдП `ask`, **critical** рд╕реАрдХреНрд░реЗрдЯ рдХреЗ рд▓рд┐рдП `block` (рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреА рддреБрд░рдВрдд-рдмрд╛рдзрд┐рдд рд╢реИрд▓реА)ред рдХреЛрдИ рд╕реНрд╡реАрдХреГрддрд┐ рдЙрддреНрддрд░рджрд╛рддрд╛ рдирд╣реАрдВ = fail closedред рд╣рд░ рдкрд╛рд╕-рдереНрд░реВ `next()` рдмреБрд▓рд╛рддрд╛ рд╣реИ тАФ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдиреАрддрд┐ рдкреНрд▓рдЧрдЗрди рдХрднреА рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗред
## рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд
```sh
# 1. рдмрдВрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
dsh plugin --profile web add "github:PerryLink/dsh-defend#main"
# рдпрд╛ npm рд╕реЗ (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝)
dsh plugin --profile web add dsh-defend
# 2. рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ
dsh --profile web --dump-config | grep -A3 'id: dsh-defend'
```
## рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓
- **git рдЪреИрдирд▓** (рдирд╡реАрдирддрдо `main`): `dsh plugin --profile web add "github:PerryLink/dsh-defend#main"` тАФ `prepare` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рдкреНрд░реЛрдбрдХреНрд╢рди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдмрд┐рд▓реНрдб рдХрд░рддреА рд╣реИред
- **npm рдЪреИрдирд▓** (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝): `dsh plugin --profile web add dsh-defend`ред
- **tarball рдЪреИрдирд▓**: рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ `pnpm pack`, рдлрд┐рд░ `dsh plugin --profile web add ./dsh-defend-.tgz`ред
- **рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓**: `dsh plugin --profile web remove dsh-defend` (рдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рд╕реЗ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдПрдБ)ред
## рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рд╕рднреА рд╕рдорд╛рдпреЛрдЬрди Schemastery `Config` рдлрд╝реАрд▓реНрдб рд╣реИрдВ (cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред id-рд▓рдХреНрд╖рд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб рдкреВрд░реА рдкрдВрдХреНрддрд┐ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ тАФ рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдХреБрдВрдЬреА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред `cordis.patch.yml` рд╣рд░ рдХреБрдВрдЬреА рдХреЛ рдЗрдирд▓рд╛рдЗрди рд╕рдордЭрд╛рддрд╛ рд╣реИред
| рдХреБрдВрдЬреА | рдбрд┐рдлрд╝реЙрд▓реНрдЯ | рдЕрд░реНрде |
|---|---|---|
| `enabled` | `true` | рджреЛрдиреЛрдВ рдкрд░рддреЛрдВ рдХрд╛ рдореБрдЦреНрдп рд╕реНрд╡рд┐рдЪ |
| `action` | `deny` | рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА-рдбрд┐рд▓реАрдЯ рдЧрд╛рд░реНрдб рдХреНрд░рд┐рдпрд╛ (`deny` / `ask`) |
| `toolNames` | `['bash','persistent-bash','terminal-bash']` | рд╡реЗ рдЯреВрд▓ рдирд╛рдо рдЬрд┐рдирдХреЗ рддрд░реНрдХ рдЧрд╛рд░реНрдб рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ |
| `detection.enabled` | `true` | рдкрд╣рдЪрд╛рди рдкрд░рдд рд╕реНрд╡рд┐рдЪ |
| `detection.maxScanChars` | `10000` | рдкреНрд░рддрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рд╕реНрдХреИрди рд╕реАрдорд╛ (рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖) |
| `detection.normalizeUnicode` | `true` | рд╕реНрдХреИрди рд╕реЗ рдкрд╣рд▓реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ NFKC-рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░реЗрдВ (lookalike-Unicode рдмрд╛рдпрдкрд╛рд╕ рд░реЛрдХрддрд╛ рд╣реИ) |
| `detection.secretMinEntropy` | `3.0` | рд╕реАрдХреНрд░реЗрдЯ рд╣рд┐рдЯ рд╕реНрд╡реАрдХрд╛рд░рдиреЗ рд╣реЗрддреБ рдиреНрдпреВрдирддрдо Shannon рдПрдВрдЯреНрд░реЙрдкреА (bits/char); `0` рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ |
| `detection.injectionAction` | `ask` | рдЗрдВрдЬреЗрдХреНрд╢рди рдкрд░рд┐рд╡рд╛рд░: `allow` / `ask` / `block` |
| `detection.jailbreakAction` | `ask` | рдЬреЗрд▓рдмреНрд░реЗрдХ рдкрд░рд┐рд╡рд╛рд░: `allow` / `ask` / `block` |
| `detection.secretAction` | `ask` | рд╕реАрдХреНрд░реЗрдЯ рдкрд░рд┐рд╡рд╛рд░: `allow` / `ask` / `block` |
| `detection.secretBlockCritical` | `true` | critical рд╕реАрдХреНрд░реЗрдЯ `secretAction` рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╣рдореЗрд╢рд╛ block |
| `detection.audit` | `true` | `defend/detection` рд╕рддреНрд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рд▓рд┐рдЦреЗрдВ |
| `detection.allowUnmarkedAudit` | `false` | рдРрд╕реЗ рд╣реЛрд╕реНрдЯ рдкрд░ рд╕рддреНрд░ рдСрдбрд┐рдЯ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдЬрд┐рдирдХрд╛ `Session.append` `ignorable` рдорд╛рд░реНрдХрд░ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИ (рдЕрдм рддрдХ рдХреА рд╕рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓рд╛рдЗрдиреЗрдВ), рдЕрдкреНрд░рд╛рдкреНрдп рд╕рддреНрд░ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП |
| `detection.maxReportEntries` | `200` | рдореЗрдореЛрд░реА рдореЗрдВ рд░рд┐рдВрдЧ-рдмрдлрд╝рд░ рд╕реАрдорд╛ |
| `registerCommand` | `true` | `/defend` рдХрдорд╛рдВрдб рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ |
| `registerTool` | `true` | `defend_report` рдЯреВрд▓ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ |
## рдЯреВрд▓ рдФрд░ рд╕рддрд╣реЗрдВ
| рд╕рддрд╣ | рдкреНрд░рдХрд╛рд░ | рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ |
|---|---|---|
| `defend_report` | рдЯреВрд▓ | рдпреЛрдЧ (рджрд░реНрдЬ/рдмреНрд▓реЙрдХ/рдкреВрдЫреЗ), рдкреНрд░рддрд┐-рдкрд░рд┐рд╡рд╛рд░ рдЧрд┐рдирддреА рдФрд░ рд╣рд╛рд▓ рдХреА 20 рдкрд╣рдЪрд╛рди тАФ рдХрднреА рдорд┐рд▓рд╛рди рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ |
| `/defend` | рдХрдорд╛рдВрдб | рд╡рд╣реА рд╕рд╛рд░рд╛рдВрд╢ рдЯреЗрдХреНрд╕реНрдЯ рд░реВрдк рдореЗрдВ |
| `agent/pre-step` | рд╢реНрд░реЛрддрд╛ | рдЖрд╡рдХ рд╕рдВрджреЗрд╢ рд╕реНрдХреИрди (enter/reject) |
| `tools/pre-execute` | рд╢реНрд░реЛрддрд╛ | рддрд░реНрдХ рд╕реНрдХреИрди (deny/ask) + рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА-рдбрд┐рд▓реАрдЯ рдЧрд╛рд░реНрдб |
| `tools/post-execute` | рд╢реНрд░реЛрддрд╛ | рдкрд░рд┐рдгрд╛рдо рд╕реНрдХреИрди (block рдлрд╝реАрдбрдмреИрдХ) |
## рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдбреЗрдЯрд╛
- **рдЕрдиреБрдорддрд┐рдпрд╛рдБ**: `ask` рдирд┐рд░реНрдгрдп рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд╡реАрдХреГрддрд┐ рд╕реАрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ; рдХреБрдЫ рднреА рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдпрд╛ рдмрд╛рдпрдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ред рдкреНрд▓рдЧрдЗрди рдЕрдкрдиреЗ рд╡рд░реНрдХрд╢реЙрдк рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ `session:append` рд╡ `network:none` рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
- **рдбреЗрдЯрд╛**: рдбрд┐рд╕реНрдХ рдкрд░ рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛; рд░рд┐рдкреЛрд░реНрдЯ рд░рд┐рдВрдЧ-рдмрдлрд╝рд░ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдФрд░ рд╕реАрдорд┐рдд рд╣реИред рдХреЛрдИ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ, рдХреЛрдИ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдирд╣реАрдВред
- **рд╕рддреНрд░ рд▓реЙрдЧ**: `defend/detection` рдЗрд╡реЗрдВрдЯ рдореЗрдВ рдирд┐рдпрдо id, рдкрд░рд┐рд╡рд╛рд░, рд╢реНрд░реЗрдгреА, рдЧрдВрднреАрд░рддрд╛, рд╕реАрдХреНрд░реЗрдЯ рдкреНрд░рдХрд╛рд░, рдирд┐рд░реНрдгрдп рд╡ рд╕реНрдХреИрди рддрдереНрдп рд╣реЛрддреЗ рд╣реИрдВ тАФ рдорд┐рд▓рд╛рди рдЯреЗрдХреНрд╕реНрдЯ рдХрднреА рд▓реЙрдЧ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪрддрд╛, рдФрд░ рд╕реАрдХреНрд░реЗрдЯ рдкрд╣рдЪрд╛рди рдирд┐рд░реНрдорд╛рдг рд╕реЗ рд╣реА рдХреЗрд╡рд▓-рдкреНрд░рдХрд╛рд░ рд╣реЛрддреА рд╣реИред
## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ
- **рдкрд╣рдЪрд╛рди, рдкреНрд░рд╡рд░реНрддрди рдирд╣реАрдВред** рдЧрд╛рд░реНрдб рдФрд░ рдкрд╣рдЪрд╛рди рдкрд░рдд рдХреЗрд╡рд▓ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реАрдо рдкрд░ deny/ask/block рдирд┐рд░реНрдгрдп рдмрдирд╛рддреА рд╣реИрдВ; рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╡ рд╕реНрд╡реАрдХреГрддрд┐ рдкреНрд░рдгрд╛рд▓рд┐рдпрд╛рдБ рд╣реА рдкреНрд░рд╡рд░реНрддрди рдкреНрд░рд╛рдзрд┐рдХрд╛рд░ рд╣реИрдВред
- **Fail closedред** рд╕реНрд╡реАрдХреГрддрд┐ рдЙрддреНрддрд░рджрд╛рддрд╛, рд╕рддреНрд░ рдпрд╛ рд╕реЗрд╡рд╛ рд╕рддрд╣ рдХреЗ рдмрд┐рдирд╛, рд╕рдЦреНрддрддрдо рдирд┐рд░реНрдгрдп рдкрд░ рдЧрд┐рд░рддрд╛ рд╣реИ тАФ рдХрднреА рдореВрдХ рдкрд╛рд╕-рдереНрд░реВ рдирд╣реАрдВред
- **рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЬрд╛рддреАред** рд╕реНрдХреИрди рд╕реНрдерд╛рдиреАрдп рд╣реИ; рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб рд╣реИрдВ; рд╕реАрдХреНрд░реЗрдЯ рдХрднреА рд▓реЙрдЧ, рджрд┐рдЦрд╛рдП рдпрд╛ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗред
- **рд╕реАрдорд┐рдд рдХрд╛рд░реНрдпред** рд╕реНрдХреИрди рд╕реАрдорд╛рдПрдБ, рдкреНрд░рддрд┐ рдирд┐рдпрдо рдПрдХ рдкрд╣рдЪрд╛рди рд╡ рд░рд┐рдВрдЧ-рдмрдлрд╝рд░ рдХреЛрдЯрд╛ рд╢рддреНрд░реБрддрд╛рдкреВрд░реНрдг рдЗрдирдкреБрдЯ рдХреЛ рдЕрд╕реАрдорд┐рдд рд╕рдВрд╕рд╛рдзрди рдЦрд╛рдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред
## рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ
- **рдкрд╣рдЪрд╛рди рдЕрдВрддрд░рд╛рд▓ред** рдирд┐рдпрдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреЛрд░реНрдЯреЗрдб рд╢рдмреНрджрд╛рд╡рд▓реА рд╡ рдЙрдирдХреЗ рд╕рд╣рд┐рд╖реНрдгреБ рд░реВрдкреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ; рдирдИ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛, lookalike-Unicode рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (NFKC рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рднрд╛рд╡реА рдХрд╛рд░реНрдп рд╣реИ) рдФрд░ рдмрд╣реБ-рдЪрд░рдгреАрдп рд╣рдорд▓реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдорд╛рдкрд╛ рдЧрдпрд╛ рдЖрдзрд╛рд░ (рдЕрдкрд╕реНрдЯреНрд░реАрдо рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ 27/28) рдЯреЗрд╕реНрдЯ рдореЗрдВ рдХреАрд▓рд┐рдд рд╣реИ рддрд╛рдХрд┐ рд░рд┐рдЧреНрд░реЗрд╢рди рджрд┐рдЦреЗред
- **рдореЙрдбрд▓-рд╕реНрддрд░ рдХреЗ рдлрд╝реИрд╕рд▓реЗ рдирд╣реАрдВред** `dsh-defend` рдирд┐рдпрддрд╛рддреНрдордХ рд╣реИ; рдХрднреА рдореЙрдбрд▓ рдирд╣реАрдВ рдмреБрд▓рд╛рддрд╛ рдФрд░ рдирдИ рдордВрд╢рд╛ рдирд╣реАрдВ рдЖрдБрдХ рд╕рдХрддрд╛ред
- **рд╕рдВрджреЗрд╢ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдореВрдХ рд╣реИред** `agent/pre-step` рдХрд╛ reject рдореЙрдбрд▓ рдХреЛ рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрддрд╛ (рд╕реАрдо рдореЗрдВ рдХрд╛рд░рдг рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ); рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдирд┐рдпрдо рддрдереНрдп рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИред
- **рд╕рддреНрд░ рдСрдбрд┐рдЯ рдФрд░ `ignorable` рдорд╛рд░реНрдХрд░ред** рдСрдбрд┐рдЯ рдРрдкреЗрдВрдб рдПрдирд╡рд▓рдк рдХреЗ `ignorable: true` рдорд╛рд░реНрдХрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рд╣рд╛рд░реНрдиреЗрд╕ рдмрд┐рд▓реНрдб рд▓реЙрдЧ рд▓реЛрдб рдХрд░ рд╕рдХреЗред рдЕрдм рддрдХ рдХреА рд╕рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓рд╛рдЗрдиреЗрдВ (`0.1.0-rc.1`тАУ`0.1.0-rc.8`, `0.1.1-rc.1`тАУ`0.1.1-rc.2`) рдЙрд╕реЗ рдЪреБрдкрдЪрд╛рдк рдЧрд┐рд░рд╛ рджреЗрддреА рд╣реИрдВ тАФ рдЗрд╡реЗрдВрдЯ рдмрд┐рдирд╛ рдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдбрд╝реЗ рдмрд┐рд▓реНрдб рдкрд░ рд╕рддреНрд░ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ; рд╣реЛрд╕реНрдЯ `0.1.2-rc.1` рдПрдирд╡рд▓рдк рдлрд╝реАрд▓реНрдб рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣реАрдд-рд▓реЙрдЧ рдкрдарди рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди `Session.append` рдЕрдм рднреА рдЙрд╕реЗ рд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ рд░реАрдб рдкрде рдмрд┐рдирд╛-рдорд╛рд░реНрдХ рд╡рд╛рд▓реЗ рдЕрдЬреНрдЮрд╛рдд рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ (`defend/detection` рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реИ), рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдБ рд▓рд┐рдЦрдирд╛ рднреА рд╕рддреНрд░ рдХреЛ рд▓реЛрдб-рдЕрдпреЛрдЧреНрдп рдмрдирд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП dsh-defend рдРрд╕реЗ рд╣реЛрд╕реНрдЯ рдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ (рдкреАрдпрд░-рд╕рдВрд╕реНрдХрд░рдг рдкреВрд░реНрд╡-рдЬрд╛рдВрдЪ + рд▓реМрдЯрд╛рдП рдЧрдП рдПрдирд╡рд▓рдк рдХреА рдЬрд╛рдВрдЪ) рдФрд░ рдПрдХ рдмрд╛рд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рд╕рддреНрд░-рд▓реЙрдЧ рдСрдбрд┐рдЯ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред `detection.allowUnmarkedAudit: true` рд╕реЗрдЯ рдХрд░рдХреЗ рджреЛрдмрд╛рд░рд╛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ; рдореМрдЬреВрджрд╛ рдмрд┐рдирд╛-рдорд╛рд░реНрдХ `defend/detection` рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдПрдирд╡рд▓рдк рдореЗрдВ `"ignorable": true` рдЬреЛрдбрд╝рдХрд░ рдорд░рдореНрдордд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рджреЗрдЦреЗрдВ [issue #2](https://github.com/PerryLink/dsh-defend/issues/2)ред
## рд╡рд┐рдХрд╛рд╕
```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: 75 рдЯреЗрд╕реНрдЯ, 8 рд╕реБрдЗрдЯ (рдкрд╣рдЪрд╛рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕рд╣рд┐рдд)
pnpm run build # tsdown рдмрдВрдбрд▓ + tsc рдШреЛрд╖рдгрд╛рдПрдБ (lib/)
pnpm run verify:self-contained # рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдкреЗрдХ registry рд╕реЗ рд╣рд▓ рд╣реЛрддреА рд╣реИрдВ
pnpm run verify:artifacts # рдирд┐рд░реНрдорд┐рдд ESM рдлрд╝реЗрд╕ + рдкреНрд░рдХрд╛рд╢рд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдореМрдЬреВрдж
pnpm pack # рдкреНрд░рдХрд╛рд╢рд┐рдд tarball
```
### Benchmark
рд░реЗрдб-рдЯреАрдо рдмреЗрдВрдЪрдорд╛рд░реНрдХ (105 рдирдореВрдиреЛрдВ рдкрд░ рдкреНрд░рддрд┐-рд╢реНрд░реЗрдгреА P/R/F1 + 27/28 fixture рдлрд╝реНрд▓реЛрд░) [`benchmark/RESULTS.md`](benchmark/RESULTS.md) рдореЗрдВ рд╣реИ; `node --experimental-strip-types benchmark/run.mjs` рд╕реЗ рджреЛрдмрд╛рд░рд╛ рдмрдирд╛рдПрдБ (рдХреЛрдИ рдирдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ, рдХреЛрдИ build рдирд╣реАрдВ)ред
## Topics
`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `security`, `prompt-injection`, `jailbreak`, `secret-scanning`, `ai-safety`
## Contributors
- [@PerryLink](https://github.com/PerryLink) тАФ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдореЗрдВрдЯреЗрдирд░: рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА-рдбрд┐рд▓реАрдЯ рдЧрд╛рд░реНрдб, рдЪрд╛рд░-рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рдкрд╣рдЪрд╛рди рдкреЛрд░реНрдЯ, рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рд╡рд╛рдпрд░рд┐рдВрдЧ, рдСрдбрд┐рдЯ рд╕рддрд╣ рдФрд░ рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред
- [@cuohua](https://github.com/cuohua) тАФ рдмрд┐рдирд╛ рдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП `defend/detection` рдЗрд╡реЗрдВрдЯ рд╕реЗ рдХрдбрд╝реЗ рдмрд┐рд▓реНрдб рдкрд░ рд╕рддреНрд░ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реЛрдиреЗ рдХреА рд╕рдЯреАрдХ рд░рд┐рдкреЛрд░реНрдЯ ([#2](https://github.com/PerryLink/dsh-defend/issues/2)); runtime рд╣реЛрд╕реНрдЯ-рдХреНрд╖рдорддрд╛ рдкрд╣рдЪрд╛рди рдФрд░ `ignorable` рдорд╛рд░реНрдХрд░ рдЕрдиреБрд╢рд╛рд╕рди рд╕реАрдзреЗ рдЙрд╕реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдирд┐рдХрд▓реЗ рд╣реИрдВред
## 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-click](https://github.com/PerryLink/dsh-click)** | DeepSeek Harness рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдиреЗрдЯрд┐рд╡ рдбреЗрд╕реНрдХрдЯреЙрдк рдирд┐рдпрдВрддреНрд░рдг тАФ Windows рдкрд╣рд▓реЗред | |
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | рд╡реЗрдм рдХрдВрдкреЛрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓-рд╢реИрд▓реА рдЗрдирдкреБрдЯ рдЗрддрд┐рд╣рд╛рд╕: рддреАрд░, Ctrl+R рдЦреЛрдЬ | |
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | рдбреЗрдЯрд╛рд╕реЗрдЯ рдЧреБрдгрд╡рддреНрддрд╛ рдЬрд╛рдБрдЪ рд╡ рдЙрджреНрдзрд░рдг рд╕рддреНрдпрд╛рдкрди (рдпрд╣рд╛рдБ рдЙрдкрднреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрдЦреНрдпрд╛-рд╕реЗрддреБ) | |
| **[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-defend contributors
### DSH Desktop рдорд╛рд░реНрдХреЗрдЯ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
рд╕рднреА PerryLink рдкреНрд▓рдЧрдЗрди DSH Desktop рдХреЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: **Market тЖТ Sources тЖТ add source тЖТ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **тЖТ рдЪреБрдиреЗрдВ**ред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдорд╛рд░реНрдХреЗрдЯ рдХреЗ npm-identity рд╕рддреНрдпрд╛рдкрди рдФрд░ рдЖрдкрдХреА рдкреБрд╖реНрдЯрд┐ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред