# ЁЯФБ dsh-translate
- **1024 рд╕реНрдЯреЛрд░ рдЪреИрдирд▓**: рдПрдХ рдмрд╛рд░ `npm i -g dsh1024`, рдлрд┐рд░ `dsh1024 plugin --profile web add dsh-translate` ([deepseek1024.com](https://deepseek1024.com) рдЗрдВрд╕реНрдЯреЙрд▓ рд░реИрдВрдХрд┐рдВрдЧ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
**DeepSeek Harness рдХреЗ рд▓рд┐рдП рд╡реЗрдВрдбрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдирд┐рд░реНрдзрд╛рд░рдХ JSON рдорд░рдореНрдорддред**
*рдПрдХ рд╣реА рдЕрдиреБрд░реЛрдз, рд╣рд░ рд╡реЗрдВрдбрд░ рдкрд░ред рдЯреВрдЯрд╛ JSON, рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдЧрдврд╝реЗ рдареАрдХред*
[](LICENSE)
[](https://gitee.com/perrylink/dsh-translate)
[](https://github.com/topics/dsh-plugin)
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-х╛╜чла)
[](#)
[](https://github.com/PerryLink/dsh-translate/actions)
[](https://github.com/PerryLink/dsh-translate/releases)
[](https://www.npmjs.com/package/dsh-translate)
[](https://www.npmjs.com/package/dsh-translate)
[English](README.md) ┬╖ [чоАф╜Уф╕нцЦЗ](README-zh.md) ┬╖ [Espa├▒ol](README-es.md) ┬╖ [Portugu├кs](README-pt.md) ┬╖ [рд╣рд┐рдиреНрджреА](README-hi.md)
---
## рд╕рдВрдЧрддрддрд╛
| рд╕рддрд╣ | рд╕реНрдерд┐рддрд┐ |
|---|---|
| Harness | рдореБрдЦреНрдп рд╕рдВрд╕реНрдХрд░рдг **`dsh-v0.1.6-alpha.2`** (2026-09-18 рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд: рджреЛрд╣рд░рд╛ typecheck + `node --test` 80/80 + self-contained/artifacts рдЧреЗрдЯ)ред npm dev/test рдкрд┐рди рдЕрдм `0.1.6-alpha.2` рд╣реИрдВ; peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0`ред |
| Node | `^22.19.0 \|\| >=24.0.0` |
| рд░реВрдк | рд╢реБрджреНрдз-host JS рдкреНрд▓рдЧрдЗрди (рдХреЛрдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ) |
| рдореЙрдбрд▓ | рдХреЛрдИ рднреА рдореЙрдбрд▓ тАФ рдорд░рдореНрдордд рдирд┐рд░реНрдзрд╛рд░рдХ рд╣реИ, рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбрд▓ рдХреЙрд▓ рдирд╣реАрдВ |
## рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ
рдПрдХ рдмрдВрдбрд▓ рдореЗрдВ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рд╕рддрд╣реЗрдВ:
- **`/translate`** тАФ рд╡реЗрдВрдбрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрд╡рд╛рдж рддрд╛рд▓рд┐рдХрд╛: `temperature`, `top_p`, `max_tokens`, `stop`, `system` рдФрд░ 8 рдЕрдиреНрдп рдХреИрдирдирд┐рдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░, **11 рд╡реЗрдВрдбрд░реЛрдВ** рдкрд░ рдореИрдк рдХрд┐рдП рдЧрдП (OpenAI, ERNIE, Qwen, Anthropic, Google, DeepSeek, Mistral, Cohere, xAI, Groq, Azure)ред рджреЛ рд╡реЗрдВрдбрд░реЛрдВ рдХреЗ рдмреАрдЪ рдореИрдкрд┐рдВрдЧ рдкреВрдЫреЗрдВ, рд╡реЗрдВрдбрд░/рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рджреЗрдЦреЗрдВ, рдпрд╛ `lib/rosetta.mjs` рдХреЗ `transformRequest` рд╕реЗ рдкреВрд░рд╛ рдорд╛рдирдХ рдЕрдиреБрд░реЛрдз рдмрджрд▓реЗрдВред
- **рдорд░рдореНрдордд рдкрд░рдд** тАФ `tools/post-execute` рд╢реНрд░реЛрддрд╛ + `fix_json` рдЙрдкрдХрд░рдгред рдЬрдм рдХреЛрдИ рд╕рдлрд▓ рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреВрдЯрд╛ JSON рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ (string-рд░реВрдЯ рдпрд╛ рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд `json`-рд░реВрдЯ рд╕реНрдХреАрдорд╛, рдпрд╛ рдирд╛рдо рд╕реЗ рдСрдкреНрдЯ-рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреВрд▓), рддреЛ рдкрд░рдд рдЙрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рдХ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░рддреА рд╣реИ: markdown рдлрд╝реЗрдВрд╕ рдирд┐рдХрд╛рд▓рдирд╛, рдПрд╕реНрдХреЗрдк рдорд░рдореНрдордд, рдЕрдВрддрд┐рдо рдХреЙрдорд╛ рд╣рдЯрд╛рдирд╛, рдЯреНрд░рдВрдХреЗрд╢рди рдмрдВрдж рдХрд░рдирд╛, рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ `null` рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╕реЗ рднрд░рдирд╛ред **рдХреЛрдИ рдорд╛рди рдХрднреА рдЧрдврд╝рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛** тАФ рд╕реНрдХреАрдорд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд░рд┐рдгрд╛рдо fail-closed рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдХрднреА рд╕рдлрд▓рддрд╛ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓реЗ рдЬрд╛рддреЗред
```text
рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо (рд╕рдлрд▓, JSON рдЯреЗрдХреНрд╕реНрдЯ) тФАтФАтЦ╢ рдлрд╝реЗрдВрд╕ рдирд┐рдХрд╛рд▓реЗрдВ тФАтФАтЦ╢ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
тФВ рдареАрдХ? тФАтФАтЦ╢ рд╕реНрдХреАрдорд╛-рд╕рддреНрдпрд╛рдкрди тФАтФАтЦ╢ accept { kind: 'accept', value } (рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкреБрдирдГ рд╕рддреНрдпрд╛рдкрд┐рдд + рдкреБрдирдГ рд░реЗрдВрдбрд░ рдХрд░рддреА рд╣реИ)
тФВ рдЯреВрдЯрд╛ тФАтФАтЦ╢ рдПрд╕реНрдХреЗрдк / рдХреЙрдорд╛ / рдмрдВрдж / null тФАтФАтЦ╢ рд╕рддреНрдпрд╛рдкрди
тФВ рдЕрдорд░рдореНрдордд рдпреЛрдЧреНрдп тФАтФАтЦ╢ next() (рдореВрд▓ рдорд╛рди рд╕реБрд░рдХреНрд╖рд┐рдд) + translate/fix рдСрдбрд┐рдЯ (рдХреЗрд╡рд▓ рдЧрд┐рдирддреА)
```
## рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд
```sh
# 1. рдмрдВрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
dsh plugin --profile web add "github:PerryLink/dsh-translate#main"
# рдпрд╛ npm рд╕реЗ (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝)
dsh plugin --profile web add dsh-translate
# 2. рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ
dsh --profile web --dump-config | grep -A2 'id: dsh-translate'
```
рдлрд┐рд░ рдПрдЬреЗрдВрдЯ рд╕реЗ рдореИрдкрд┐рдВрдЧ рдпрд╛ рдорд░рдореНрдордд рдХрд░рд╡рд╛рдПрдБ:
```
> /translate openai ernie max_tokens
> fix_json рд╕реЗ рдорд░рдореНрдордд рдХрд░реЗрдВ: {"a": 1,} рд╕реНрдХреАрдорд╛ {"type":"object","properties":{"a":{"type":"integer"}},"required":["a"]} рдХреЗ рд╡рд┐рд░реБрджреНрдз
```
## рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓
- **git рдЪреИрдирд▓** (рдирд╡реАрдирддрдо `main`): `dsh plugin --profile web add "github:PerryLink/dsh-translate#main"` тАФ рд╢реБрджреНрдз JS, рдХреЛрдИ рдмрд┐рд▓реНрдб рдЪрд░рдг рдирд╣реАрдВред
- **npm рдЪреИрдирд▓** (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝): `dsh plugin --profile web add dsh-translate`ред
- **tarball рдЪреИрдирд▓**: рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ `pnpm pack`, рдлрд┐рд░ `dsh plugin --profile web add ./dsh-translate-.tgz`ред
- **рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓**: `dsh plugin --profile web remove dsh-translate` (рдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рд╕реЗ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдПрдБ)ред
## рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рд╕рднреА рд╕рдорд╛рдпреЛрдЬрди Schemastery `Config` рдлрд╝реАрд▓реНрдб рд╣реИрдВ (cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред id-рд▓рдХреНрд╖рд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб рдкреВрд░реА рдкрдВрдХреНрддрд┐ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ тАФ рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдХреБрдВрдЬреА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред `cordis.patch.yml` рд╣рд░ рдХреБрдВрдЬреА рдХреЛ рдЗрдирд▓рд╛рдЗрди рд╕рдордЭрд╛рддрд╛ рд╣реИред
| рдХреБрдВрдЬреА | рдбрд┐рдлрд╝реЙрд▓реНрдЯ | рдЕрд░реНрде |
|---|---|---|
| `enabled` | `true` | рдорд╛рд╕реНрдЯрд░ рд╕реНрд╡рд┐рдЪ; `false` рдХреБрдЫ рднреА рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░рддрд╛ |
| `repair.enabled` | `true` | post-execute рдорд░рдореНрдордд рдкрд░рдд рдХрд╛ рд╕реНрд╡рд┐рдЪ |
| `repair.toolNames` | `[]` | рдЕрддрд┐рд░рд┐рдХреНрдд рдЯреВрд▓ рдирд╛рдо рдЬрд┐рдирдХреЗ JSON-рдЯреЗрдХреНрд╕реНрдЯ рдкрд░рд┐рдгрд╛рдо рдорд░рдореНрдордд рдпреЛрдЧреНрдп рд╣реИрдВ (string/`json` рд░реВрдЯ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд) |
| `repair.strategies.escapeRepair` | `true` | рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдВрджрд░ рдХрдЪреНрдЪреЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд░реНрдгреЛрдВ рдХреЛ рдПрд╕реНрдХреЗрдк рдХрд░реЗрдВ |
| `repair.strategies.trailingComma` | `true` | рдмрдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдХреЗ рдХреЙрдорд╛ рд╣рдЯрд╛рдПрдБ |
| `repair.strategies.truncationClosure` | `true` | рдЯреНрд░рдВрдХреЗрд╢рди рд╕реЗ рдХрдЯреА рдЦреБрд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ/рдХрдВрдЯреЗрдирд░ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ |
| `repair.strategies.fieldCompletion` | `true` | рдЕрдиреБрдкрд╕реНрдерд┐рдд рдЕрдирд┐рд╡рд╛рд░реНрдп рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ `null` рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╕реЗ рднрд░реЗрдВ |
| `repair.maxSteps` | `8` | рд░рдгрдиреАрддрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдЬрдЯ (рдорд░рдореНрдордд-рд▓реВрдк рдкрд╛рд╕, 1..64) |
| `diffMaxChars` | `200` | рд▓реЙрдЧ рдХрд┐рдП рдЧрдП рдПрдХ diff рдЦрдВрдб рдХреА рд╡рд░реНрдг рд╕реАрдорд╛ |
| `diffMaxEntries` | `50` | рд▓реЙрдЧ рдХреА рдЧрдИ diff рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕реАрдорд╛ |
| `registerCommand` | `true` | `/translate` рдХрдорд╛рдВрдб рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ |
| `registerTool` | `true` | `fix_json` рдЯреВрд▓ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ |
| `rosettaDataPath` | *(none)* | рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрд╛рд╣рд░реА rosetta рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ (рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП `lib/rosetta-data.json` рдЬреИрд╕рд╛ рдЖрдХрд╛рд░); рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореИрдкрд┐рдВрдЧ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреА рд╣реИ |
рдЖрдкрдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдЙрджрд╛рд╣рд░рдг:
```yaml
- insert:
- id: dsh-translate
name: dsh-translate
config:
enabled: true
repair:
enabled: true
toolNames: ['emit-json']
strategies:
escapeRepair: true
trailingComma: true
truncationClosure: true
fieldCompletion: true
maxSteps: 8
diffMaxChars: 200
diffMaxEntries: 50
registerCommand: true
registerTool: true
```
## рдЯреВрд▓ рдФрд░ рд╕рддрд╣реЗрдВ
| рд╕рддрд╣ | рдкреНрд░рдХрд╛рд░ | рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ |
|---|---|---|
| `/translate` | рдХрдорд╛рдВрдб | `vendors`, `params`, рдпрд╛ ` [param]` рдЬреЛрдбрд╝реАрд╡рд╛рд░ рдореИрдкрд┐рдВрдЧ |
| `fix_json` | рдЯреВрд▓ | `{ text, schema?, strategies? }` тЖТ `{ ok, repaired?, diff?, strategies, truncated, validated, error? }`; diff рдЦрдВрдб рд╕реАрдорд┐рдд рдФрд░ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝реНрдб |
| post-execute рдорд░рдореНрдордд | рд╢реНрд░реЛрддрд╛ | string/`json` рд░реВрдЯ (рдФрд░ `repair.toolNames`) рд╡рд╛рд▓реЗ рд╕рдлрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд; рдЬрдм рддрдХ рдХреЙрд▓ рди рд▓реЗ, рд╣рдореЗрд╢рд╛ `next()` |
## рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдбреЗрдЯрд╛
- **рдЕрдиреБрдорддрд┐рдпрд╛рдБ**: рдХреЛрдИ рдиреЗрдЯрд╡рд░реНрдХ, рдХреЛрдИ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕, рдХреЛрдИ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдирд╣реАрдВ тАФ рдкреНрд▓рдЧрдЗрди рдХреЗрд╡рд▓ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ `commands` рд╡ `tools` рд╕реЗрд╡рд╛рдПрдБ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рддреНрд░ рд▓реЙрдЧ рд▓рд┐рдЦрддрд╛ рд╣реИред
- **рдбреЗрдЯрд╛**: рдорд░рдореНрдордд рдХрднреА рдорд╛рди рдирд╣реАрдВ рдЧрдврд╝рддреА; рдореЙрдбрд▓-рджреГрд╢реНрдп рдЬреЛрдбрд╝ рдХреЗрд╡рд▓ рдорд░рдореНрдордд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреИрдирдирд┐рдХрд▓ рдорд╛рди рдФрд░ `fix_json` рдХрд╛ diff рд╣реИрдВред рд╕рддреНрд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ (`translate/fix`) рдореЗрдВ рдХреЗрд╡рд▓ рдЯреВрд▓ рдирд╛рдо, call id, рд░рдгрдиреАрддрд┐ рдирд╛рдо, рд╕рдВрдкрд╛рджрди рдЧрд┐рдирддреА рдФрд░ рдЯреНрд░рдВрдХреЗрд╢рди рдзреНрд╡рдЬ рд╣реЛрддреЗ рд╣реИрдВ тАФ рдХрднреА payload рдирд╣реАрдВред рдСрдбрд┐рдЯ рд▓реЗрдЦрди рд╣реЛрд╕реНрдЯ рдХреА рд╕рддреНрд░-рдЗрд╡реЗрдВрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ: рдЬреЛ рд╣реЛрд╕реНрдЯ `translate/fix` рдЬрд╛рдирддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рджрд╛ рджреЛ-рддрд░реНрдХ append рдорд┐рд▓рддрд╛ рд╣реИ, `ignorable` envelope рд╡рд╛рд▓реЗ рд╣реЛрд╕реНрдЯ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд append рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдирд╛ envelope рд╡рд╛рд▓реЗ рд╣реЛрд╕реНрдЯ (`0.1.0-rc.6`тАУ`0.1.1-rc.2`, `0.1.2-rc.1`) рдХреЛ рдХреЛрдИ рдСрдбрд┐рдЯ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ тАФ рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо рд╣реА рдореЙрдбрд▓-рджреГрд╢реНрдп рд▓реЙрдЧ рд░рд╣рддрд╛ рд╣реИред
0.1.2-rc.1 (2026-09-04 рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд): рд╕рддреНрд░ рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ рдЕрдкрдирд╛ ignorable рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣реАрдд-рд▓реЙрдЧ рдкрдарди рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд░рдЦрддрд╛ рд╣реИ - Session.append рдЕрднреА рднреА рдЗрд╕реЗ рд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдЧреЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред
## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ
- **рдХреЗрд╡рд▓ рдирд┐рд░реНрдзрд╛рд░рдХред** рдорд░рдореНрдордд рд╕реАрдорд┐рдд рдЯреЗрдХреНрд╕реНрдЯ рд╕рд░реНрдЬрд░реА рд╣реИ; upstream JSON-Schema-Enforcer-Proxy рдХреА LLM-рдкреБрдирд░реНрдкреНрд░рдпрд╛рд╕ рд╢рд╛рдЦрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХреА рдЧрдИ тАФ post-execute рд╢реНрд░реЛрддрд╛ рдХрднреА рдореЙрдбрд▓ рдирд╣реАрдВ рдмреБрд▓рд╛рддрд╛ред
- **Fail closedред** рдЕрдорд░рдореНрдордд рдпреЛрдЧреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╕реНрдХреАрдорд╛ рдЙрд▓реНрд▓рдВрдШрди рдореВрд▓ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдпрдерд╛рд╡рдд рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ (рдпрд╛ `fix_json` рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ); `null` рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рддрднреА рд▓рдЧрддреЗ рд╣реИрдВ рдЬрдм рд╕реНрдХреАрдорд╛ `null` рд╕реНрд╡реАрдХрд╛рд░реЗред
- **рд╢рддреНрд░реБ рдЗрдирдкреБрдЯ рд╕реАрдорд┐рддред** рдЕрд╕рдорд░реНрдерд┐рдд рд╕реНрдХреАрдорд╛ рдХреАрд╡рд░реНрдб рдФрд░ рд╡реГрддреНрддрд╛рдХрд╛рд░ рд╕реНрдХреАрдорд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ; `oneOf` рд╕рддреНрдпрд╛рдкрди рдЧрд╣рд░рд╛рдИ (`MAX_ONE_OF_DEPTH`) рдФрд░ рд╢рд╛рдЦрд╛ рдмрдЬрдЯ (`MAX_ONE_OF_BUDGET`) рд╕реЗ рд╕реАрдорд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдШрд╛рддреАрдп рд╕реНрдХреАрдорд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд╣реАрдВ рдердХрд╛ рд╕рдХрддреАред
- **Payload рд░рд┐рд╕рд╛рд╡ рд╢реВрдиреНрдпред** рд▓реЙрдЧ рдФрд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдореЗрдВ рдХрднреА рдорд░рдореНрдордд рдХрд┐рдпрд╛ рдЧрдпрд╛ payload рдирд╣реАрдВ рд╣реЛрддрд╛; diff рджрд┐рдЦрд╛рдиреЗ рдпрд╛ рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдЯреЗ рдФрд░ рд╕реАрдорд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
## рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ
- рд╕рдорд░реНрдерд┐рдд JSON Schema рдЙрдкрд╕рдореБрдЪреНрдЪрдп рд╣рд╛рд░реНрдиреЗрд╕ рдЯреВрд▓ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдЬреИрд╕рд╛ рд╣реИ (`type`/`oneOf`/`properties`/`required`/`additionalProperties`/`items`/`enum`/`const`); рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рдЕрд╕рдорд░реНрдерд┐рдд рдХрд╣рдХрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЪреБрдкрдЪрд╛рдк рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдирд╣реАрдВред
- рдорд░рдореНрдордд рдХреЗрд╡рд▓ рдЙрди рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ рдЬрд┐рдирдХрд╛ рдХреИрдирдирд┐рдХрд▓ рдорд╛рди JSON-рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ; рд╕реНрдХреАрдорд╛ рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╡рд┐рдлрд▓ рдорд╛рди рд╡рд┐рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдХрднреА рдкрд▓рдЯрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ред
- рддрд╛рд▓рд┐рдХрд╛ 11 рд╡реЗрдВрдбрд░ ├Ч 13 рдХреИрдирдирд┐рдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╡рд░ рдХрд░рддреА рд╣реИ; `extended` рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ API рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИрдВ (upstream рддреНрд░рдпреА рдирд╣реАрдВ) рдФрд░ `lib/rosetta.mjs` рдореЗрдВ рд╡реИрд╕реЗ рд╣реА рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред
- рдЬреЛ рд╣реЛрд╕реНрдЯ рди `translate/fix` рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рди рд╣реА `session.append` рдореЗрдВ `ignorable` envelope рд░рдЦрддреЗ рд╣реИрдВ (рдкреНрд░рдХрд╛рд╢рд┐рдд `0.1.0-rc.6`тАУ`0.1.1-rc.2` рд▓рд╛рдЗрди рдФрд░ `0.1.2-rc.1`, рдЬреЛ рдкрдврд╝рддреЗ рд╕рдордп рдЕрдЬреНрдЮрд╛рдд рдЗрд╡реЗрдВрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ fail closed рд╣реЛрддрд╛ рд╣реИ), рд╡рд╣рд╛рдБ рдЕрдиреБрдХреВрд▓реА рджреНрд╡рд╛рд░ рдСрдбрд┐рдЯ append рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рддреНрд░ рд▓реЙрдЧ рдХрднреА рджреВрд╖рд┐рдд рди рд╣реЛ; рдЗрд╡реЗрдВрдЯ рдкреНрд░рдХрд╛рд░ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдиреЗ рддрдХ рдЙрди рд╣реЛрд╕реНрдЯ рдкрд░ in-log рдСрдбрд┐рдЯ рджрд░реНрдкрдг рдирд╣реАрдВ рдорд┐рд▓рддрд╛ред
## рд╡рд┐рдХрд╛рд╕
```sh
pnpm install # node ^22.19 || >=24
pnpm test # node --test: 57 рдЯреЗрд╕реНрдЯ (рд╢реБрджреНрдз рд╕реБрдЗрдЯ + рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╕реЗрд╡рд╛ рдЕрд╕реЗрдВрдмрд▓реА рд╕реБрдЗрдЯ)
pnpm run check # tsc checkJs types.d.ts рдХреЗ рд╡рд┐рд░реБрджреНрдз
pnpm run verify:self-contained # рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдкреЗрдХ registry рд╕реЗ рд╣рд▓ рд╣реЛрддреА рд╣реИрдВ
pnpm run verify:artifacts # рд╕рд╛рджреЗ Node рдореЗрдВ ESM рдлрд╝реЗрд╕ import рд╣реЛрддрд╛ рд╣реИ + lib рдирд┐рд░реНрдпрд╛рдд рдореМрдЬреВрдж
node scripts/check-readme-sync.mjs # рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ README рд╕рд┐рдВрдХ рджреНрд╡рд╛рд░ (CI рдореЗрдВ рднреА)
pnpm pack # рдкреНрд░рдХрд╛рд╢рд┐рдд tarball
```
## Topics
`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `json-repair`, `schema-validation`, `parameter-mapping`, `llm-api`, `tooling`
## Contributors
- [@PerryLink](https://github.com/PerryLink) тАФ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдореЗрдВрдЯреЗрдирд░: рдЕрдиреБрд╡рд╛рдж рддрд╛рд▓рд┐рдХрд╛ рд╡ рдорд░рдореНрдордд рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдкреЛрд░реНрдЯ, рдкреНрд▓рдЧрдЗрди рд╕рддрд╣реЗрдВ, рдЯреЗрд╕реНрдЯ рдФрд░ рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред
## 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-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-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-reach](https://github.com/PerryLink/dsh-reach)** | рдорд▓реНрдЯреА-рдЪреИрдирд▓ рдЕрдиреБрдореЛрджрди/рдкреНрд░рд╢реНрди рдмреНрд░рд┐рдЬ: WeChat/Telegram/Feishu, рд╕рддреНрд░ рдХрдВрд╕реЛрд▓ |
| **[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-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-translate contributors
### DSH Desktop рдорд╛рд░реНрдХреЗрдЯ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
рд╕рднреА PerryLink рдкреНрд▓рдЧрдЗрди DSH Desktop рдХреЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: **Market тЖТ Sources тЖТ add source тЖТ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **тЖТ рдЪреБрдиреЗрдВ**ред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдорд╛рд░реНрдХреЗрдЯ рдХреЗ npm-identity рд╕рддреНрдпрд╛рдкрди рдФрд░ рдЖрдкрдХреА рдкреБрд╖реНрдЯрд┐ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред