# ЁЯФД dsh-session-sync
- **1024 рд╕реНрдЯреЛрд░ рдЪреИрдирд▓**: рдПрдХ рдмрд╛рд░ `npm i -g dsh1024`, рдлрд┐рд░ `dsh1024 plugin --profile web add dsh-session-sync` ([deepseek1024.com](https://deepseek1024.com) рдЗрдВрд╕реНрдЯреЙрд▓ рд░реИрдВрдХрд┐рдВрдЧ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
**DeepSeek Harness рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдбрд┐рд╡рд╛рдЗрд╕ рд╕рддреНрд░ рд╕рд┐рдВрдХ тАФ рдЖрдкрдХреЗ рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХрд╛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд git рдорд┐рд░рд░ред**
*рдЕрдкрдиреЗ рд╕рддреНрд░реЛрдВ рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдХреЗ рдмреАрдЪ рд╕рд┐рдВрдХ рдХрд░реЗрдВ, рдХрд┐рд╕реА рднреА рдЯрдХрд░рд╛рд╡ рдореЗрдВ рджреЛрдиреЛрдВ рдкрдХреНрд╖ рд░рдЦреЗрдВ, рдХрднреА рдХреЛрдИ рдЯрд░реНрди рди рдЦреЛрдПрдБред*
[](LICENSE)
[](https://gitee.com/perrylink/dsh-session-sync)
[](https://github.com/topics/dsh-plugin)
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-х╛╜чла)
[](https://dsh.market/)
[](#)
[](https://github.com/PerryLink/dsh-session-sync/actions)
[](https://github.com/PerryLink/dsh-session-sync/releases)
[](https://www.npmjs.com/package/dsh-session-sync)
[](https://www.npmjs.com/package/dsh-session-sync)
[](https://dshfind.com/hi/plugins/PerryLink/dsh-session-sync?ref=badge)
[English](README.md) ┬╖ [чоАф╜Уф╕нцЦЗ](README-zh.md) ┬╖ [Espa├▒ol](README-es.md) ┬╖ [Portugu├кs](README-pt.md) ┬╖ [рд╣рд┐рдиреНрджреА](README-hi.md)
---
## тнР хжВцЮЬхоГх╕охИ░ф║Жф╜а
рдпрд╣ рдкреНрд▓рдЧрдЗрди [DSH рдкреНрд▓рдЧрдЗрди рдкрд░рд┐рд╡рд╛рд░](https://github.com/PerryLink) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ (40+ рдкреНрд▓рдЧрдЗрди, рд╕рднреА Apache-2.0)ред рдЕрдЧрд░ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗ, рддреЛ **рдПрдХ рд╕реНрдЯрд╛рд░ рджреЗрдВ** тАФ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛ рдЕрдирд▓реЙрдХ рдирд╣реАрдВ рд╣реЛрддреА, рдкрд░ рдЕрдЧрд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕реЗ рдЦреЛрдЬ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛ рд▓реЗрддрд╛ рд╣реИред
*English:* part of a 40+ plugin family for DeepSeek Harness. If it is useful, **a star helps the next person find it** тАФ nothing is gated behind it.
## рд╕рдВрдЧрддрддрд╛
| рд╕рддрд╣ | рд╕реНрдерд┐рддрд┐ |
|---|---|
| Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (GitHub рдЯреИрдЧ, 2026-09-25 рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд: рдкрд┐рди рдХрд┐рдП рдЧрдП `0.1.7-rc.2` peers рдХреЗ рд╡рд┐рд░реБрджреНрдз рдкреВрд░реНрдг рдЧреЗрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛)ред npm рдирд┐рд░реНрднрд░рддрд╛-рд▓рд╛рдЗрди `0.1.7-rc.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 || >=0.1.7-0 <0.2.0`ред (2026-10-04 рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд): рдЯрдХрд░рд╛рд╡ рдлрд╝реЛрд░реНрдХ рд╕реВрдЪрдирд╛ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЕрдкрдирд╛ producer-owned source kind рд░рдЦрддреА рд╣реИ - рд╣рд╛рд░реНрдиреЗрд╕ рдиреЗ рд╕рд╛рдЭрд╛ `plugin` kind рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдкреБрдирдГ-рдкрдарди рдкрд░ рдЙрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред |
| Node | `^22.19.0 \|\| >=24.0.0` |
| рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо | рдЬрд╣рд╛рдБ рднреА `git` рдФрд░ DSH рдЪрд▓рддреЗ рд╣реИрдВ (git-рдЖрдзрд╛рд░рд┐рдд рдорд┐рд░рд░; рдХреЛрдИ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдирд╣реАрдВ) |
| рдореЙрдбрд▓ | рдХреЗрд╡рд▓-рдЯреЗрдХреНрд╕реНрдЯ рдореЙрдбрд▓ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд; рд╡рд┐рдЬрд╝рди рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ |
## рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ
`dsh-session-sync` рдЖрдкрдХреЗ DSH рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХреЛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд git рд╡рд░реНрдХрдЯреНрд░реА рдореЗрдВ рдорд┐рд░рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдПрдХ рдРрд╕реЗ рд░рд┐рдореЛрдЯ рд╕реЗ рд╕рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ **рдЖрдк** рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ тАФ рдХреЛрдИ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛ рдирд╣реАрдВ, рдХреЛрдИ рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реНрдЯреЛрд░реЗрдЬ рдирд╣реАрдВ:
- **`/sync` рдХрдорд╛рдВрдб** тАФ `status` (рдмреНрд░рд╛рдВрдЪ, рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд░рд┐рдореЛрдЯ, рдЖрдЧреЗ/рдкреАрдЫреЗ, рдЧрдВрджреА рдлрд╝рд╛рдЗрд▓реЗрдВ, рдлрд╝реЛрд░реНрдХ), `diff`, `log`, `pull`, `push`, `help`ред
- **`sync_status` / `sync_pull` / `sync_push` рдЯреВрд▓** тАФ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╡рд╣реА рд╕рддрд╣, рдПрдХ рдЯрд░реНрди рдХреЗ рдЕрдВрджрд░ред
- **Append-only рдЯрдХрд░рд╛рд╡ рд╕рдорд╛рдзрд╛рди** тАФ рд╕рддреНрд░ рд▓реЙрдЧ append-only рд╣реЛрддреЗ рд╣реИрдВ; рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд▓рди рдкрд░ рдкреНрд▓рдЧрдЗрди **рджреЛрдиреЛрдВ** рдкрдХреНрд╖ рд░рдЦрддрд╛ рд╣реИ (рд╕реНрдерд╛рдиреАрдп рд╕рдВрд╕реНрдХрд░рдг рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд░рд┐рдореЛрдЯ рд╕рдВрд╕реНрдХрд░рдг рдлрд╝реЛрд░реНрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рд░рд╣рддрд╛ рд╣реИ) рдФрд░ рдХрднреА рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ред рд╡рд┐рдЪрд▓рд┐рдд рд╕рддреНрд░ рд╕рддреНрд░-рд╕реНрддрд░ рдкрд░ рднреА рдлрд╝реЛрд░реНрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
- **рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЛрдб** тАФ рд╕реНрдЯрд╛рд░реНрдЯ рдкрд░ pull, рд╣рд░ рдмрдВрдж рдЯрд░реНрди рдХреЗ рдмрд╛рдж push, рдФрд░ рдЖрд╡рдзрд┐рдХ pull, рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдкреНрд░рддрд┐рд╡рд░реНрддреАред
- **рдкреБрд╖реНрдЯрд┐-рдЧреЗрдЯреЗрдб рд▓реЗрдЦрди** тАФ `pull`/`push` рдкрд╣рд▓реЗ рдкреВрдЫрддреЗ рд╣реИрдВ (`userQuestions` рдпрд╛ `approval` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ); рдХреЗрд╡рд▓-рдкрдарди рд╕рддрд╣реЗрдВ рдХрднреА рдирд╣реАрдВ рдкреВрдЫрддреАрдВ; рдмрд┐рдирд╛ рдЙрддреНрддрд░рджрд╛рддрд╛ рдХреЗ рдСрдкрд░реЗрд╢рди рдмрдВрдж-рдЕрд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИред
```text
рдбрд┐рд╡рд╛рдЗрд╕ A рд░рд┐рдореЛрдЯ (рдЖрдкрдХрд╛ git рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА) рдбрд┐рд╡рд╛рдЗрд╕ B
$DSH_HOME/sessions тФАтФАрдорд┐рд░рд░тФАтФАтЦ╢ commit тФАтФАpushтФАтФАтЦ╢ [sessions] тФАтФАpullтФАтФАтЦ╢ merge (рджреЛрдиреЛрдВ рд░рдЦреЗрдВ + fork)
```
## рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд
```sh
# 1. рдмрдВрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
dsh plugin --profile web add "github:PerryLink/dsh-session-sync#main"
# рдпрд╛ npm рд╕реЗ (рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕рдВрд╕реНрдХрд░рдг)
dsh plugin --profile web add dsh-session-sync
# 2. рдЗрд╕реЗ рдПрдХ рдирд┐рдЬреА git рд░рд┐рдореЛрдЯ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ
dsh --profile web --dump-config | grep -A2 'id: session-sync'
```
рдлрд┐рд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рдореЗрдВ рд░рд┐рдореЛрдЯ рд╕реЗрдЯ рдХрд░реЗрдВ (рдПрдХ **рдирд┐рдЬреА** рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдЖрдзрд╛рд░ рд╣реИ) рдФрд░ рд╕рд┐рдВрдХ рдХрд░реЗрдВ:
```yaml
- insert:
- id: session-sync
name: dsh-session-sync
config:
remote: git@github.com:you/your-dsh-sessions.git
```
```
> /sync status
> /sync pull
> /sync push
```
## рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓
- **git рдЪреИрдирд▓** (рдирд╡реАрдирддрдо `main`): `dsh plugin --profile web add "github:PerryLink/dsh-session-sync#main"` (`git+https://github.com/PerryLink/dsh-session-sync.git` рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░)ред рдХреЛрдИ рдмрд┐рд▓реНрдб рдЪрд░рдг рдирд╣реАрдВ тАФ `index.mjs` рдФрд░ `lib/` рд╣реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдЖрд░реНрдЯрд┐рдлрд╝реИрдХреНрдЯ рд╣реИрдВред
- **npm рдЪреИрдирд▓** (рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕рдВрд╕реНрдХрд░рдг): `dsh plugin --profile web add dsh-session-sync`ред
- **tarball рдЪреИрдирд▓**: рдЗрд╕ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ `pnpm pack` рдЪрд▓рд╛рдПрдБ, рдлрд┐рд░ `dsh plugin --profile web add ./dsh-session-sync-.tgz`ред
- **рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓**: `dsh plugin --profile web remove dsh-session-sync` (рдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рд╕реЗ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдПрдБ)ред
## рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рд╕рднреА рдЯреНрдпреВрдиреЗрдмрд▓ Schemastery `Config` рдлрд╝реАрд▓реНрдб рд╣реИрдВ (cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред id-рд▓рдХреНрд╖рд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб рдкреВрд░реА рдкрдВрдХреНрддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ тАФ рдЬреЛ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЪрд╛рд╣рд┐рдП рдЙрдиреНрд╣реЗрдВ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦреЗрдВред `cordis.patch.yml` рд╣рд░ рдХреБрдВрдЬреА рдХреЛ рдЗрдирд▓рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рдХрд░рддрд╛ рд╣реИред
| рдХреБрдВрдЬреА | рдбрд┐рдлрд╝реЙрд▓реНрдЯ | рдЕрд░реНрде |
|---|---|---|
| `enabled` | `true` | рдорд╛рд╕реНрдЯрд░ рд╕реНрд╡рд┐рдЪ; `false` рдХрдорд╛рдВрдб, рдЯреВрд▓, рд▓рд┐рд╕рдирд░ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЛрдб рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ |
| `backend` | `git` | рд╕рд┐рдВрдХ рдмреИрдХрдПрдВрдб: `git` (рд╕рд╛рджрд╛-рдкрд╛рда рдорд┐рд░рд░) рдпрд╛ `encrypted` (age-рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдорд┐рд░рд░ рд╕рд╛рдордЧреНрд░реА) |
| `sessionRoot` | `''` | рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рд░реВрдЯ; рдЦрд╛рд▓реА = `$DSH_HOME/sessions` (рджреЛрдиреЛрдВ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдкрд░ рд▓реЛрдб рдЕрд╕рдлрд▓) |
| `repoDir` | `''` | рд╕рд┐рдВрдХ рд╡рд░реНрдХрдЯреНрд░реА рд░реВрдЯ; рдЦрд╛рд▓реА = `$DSH_HOME/dsh-session-sync/repo` |
| `remote` | `''` | рд░рд┐рдореЛрдЯ рдкрддрд╛ (pull/push рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ; status/diff рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ) |
| `branch` | `main` | рд░рд┐рдореЛрдЯ рдмреНрд░рд╛рдВрдЪ рдХрд╛ рдирд╛рдо |
| `gitBin` | `git` | git рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдкрде |
| `ageBin` | `age` | age рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдкрде (`backend: encrypted` рдкрд░ рдЬрд╛рдБрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕рд╛рджреЗ-рдкрд╛рда рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб) |
| `ageRecipient` | `''` | age рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдпрд╛ рдкрд╣рдЪрд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧ); рдЦрд╛рд▓реА = рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рд╕рд╛рджреЗ-рдкрд╛рда рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб |
| `ageIdentity` | `''` | рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝-рд░рд╣рд┐рдд age рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдХрд╛ рдкрде (рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП); рдЦрд╛рд▓реА = рд╕рд╛рджреЗ-рдкрд╛рда рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб |
| `autoPullOnStart` | `false` | рдкреНрд▓рдЧрдЗрди рдорд╛рдЙрдВрдЯ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдмрд╛рд░ pull рдХрд░реЗрдВ (рдХреЙрдиреНрдлрд╝рд┐рдЧ рд╣реА рдЕрдиреБрдорддрд┐ рд╣реИ; рдкреБрдирдГ рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ) |
| `autoPushOnTurnEnd` | `false` | рд╣рд░ рдмрдВрдж рдЯрд░реНрди рдХреЗ рдмрд╛рдж push рдХрд░реЗрдВ |
| `pullIntervalMinutes` | `0` | рд╣рд░ N рдорд┐рдирдЯ рдореЗрдВ рдЖрд╡рдзрд┐рдХ pull (`0` = рдмрдВрдж, рдЕрдзрд┐рдХрддрдо `10080`) |
| `confirmVia` | `auto` | рдкреБрд╖реНрдЯрд┐ рдЪреИрдирд▓: `auto` (рдкрд╣рд▓реЗ userQuestions, рдлрд┐рд░ approval), `userQuestions`, `approval` |
| `graceMs` | `10000` | git рдХреЛ рдорд╛рд░рдиреЗ рдХреА рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ (ms) |
| `commandTimeoutMs` | `120000` | рдкреНрд░рддрд┐-рдХрдорд╛рдВрдб рдЯрд╛рдЗрдордЖрдЙрдЯ (ms) |
| `maxOutputBytes` | `262144` | рдкреНрд░рддрд┐-рд╕реНрдЯреНрд░реАрдо рдПрдХрддреНрд░рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рд╕реАрдорд╛ (рдмрд╛рдЗрдЯреНрд╕) |
| `commitName` | `dsh-session-sync` | рдХрдорд┐рдЯ рд▓реЗрдЦрдХ рдирд╛рдо |
| `commitEmail` | `dsh-session-sync@localhost` | рдХрдорд┐рдЯ рд▓реЗрдЦрдХ рдИрдореЗрд▓ |
| `registerCommand` | `true` | `/sync` рдХрдорд╛рдВрдб рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ |
| `registerTools` | `true` | tools рд╕реЗрд╡рд╛ рдЙрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдкрд░ `sync_*` рдЯреВрд▓ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ |
рдЖрдкрдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
```yaml
- insert:
- id: session-sync
name: dsh-session-sync
config:
remote: git@github.com:you/your-dsh-sessions.git
branch: main
autoPushOnTurnEnd: true
pullIntervalMinutes: 30
confirmVia: userQuestions
```
## рдЯреВрд▓ рдФрд░ рд╕рддрд╣реЗрдВ
| рд╕рддрд╣ | рдХреЗрд╡рд▓-рдкрдарди | рдкреБрд╖реНрдЯрд┐ рдЖрд╡рд╢реНрдпрдХ | рдиреЛрдЯреНрд╕ |
|---|---|---|---|
| `/sync status` | тЬЕ | тАФ | рдмреНрд░рд╛рдВрдЪ, рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рд░рд┐рдореЛрдЯ, рдЖрдЧреЗ/рдкреАрдЫреЗ, рдЧрдВрджреА рдлрд╝рд╛рдЗрд▓реЗрдВ, рдлрд╝реЛрд░реНрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ, рдЕрдВрддрд┐рдо pull/push |
| `/sync diff` | тЬЕ | тАФ | рдЕрдирдХрдорд┐рдЯреЗрдб рдмрджрд▓рд╛рд╡ + `HEAD..remote` рдЖрдБрдХрдбрд╝реЗ (рдХреЗрд╡рд▓-рдкрдарди) |
| `/sync log` | тЬЕ | тАФ | рд╕рд┐рдВрдХ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреЗ рдЕрдВрддрд┐рдо рдХрдорд┐рдЯ |
| `/sync pull` | | тЬЕ | Fetch + merge рджреЛрдиреЛрдВ-рд░рдЦреЗрдВ рдЕрд░реНрде рдХреЗ рд╕рд╛рде; рд╕реНрдерд╛рдиреАрдп рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд░рд┐рдореЛрдЯ рдлрд╝реЛрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд |
| `/sync push` | | тЬЕ | рдорд┐рд░рд░ + commit + push; рдХрднреА force-push рдирд╣реАрдВ рдХрд░рддрд╛, рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдкрд░ рдПрдХ рдмрд╛рд░ рд╕реБрд▓рд╣ рдХрд░рдХреЗ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ |
| `sync_status` | тЬЕ | тАФ | рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП `/sync status` рдЬреИрд╕реЗ рд╣реА рддрдереНрдп |
| `sync_pull` | | тЬЕ | рдореЙрдбрд▓-рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп pull |
| `sync_push` | | тЬЕ | рдореЙрдбрд▓-рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп push |
## рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдбреЗрдЯрд╛
- **рдЕрдиреБрдорддрд┐рдпрд╛рдБ**: рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдСрдкрд░реЗрд╢рди рдкреБрд╖реНрдЯрд┐ рджреНрд╡рд╛рд░ (`confirmVia`) рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ; рдкреНрд▓рдЧрдЗрди рдХрднреА рднреА рд╣рд╛рд░реНрдиреЗрд╕ рдХреА `userQuestions`/`approval` рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдпрд╛ рдмрд╛рдпрдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЛрдб рдХреЙрдиреНрдлрд╝рд┐рдЧ рдЕрдиреБрджрд╛рди рд╕реЗ рдЖрдЪреНрдЫрд╛рджрд┐рдд рд╣реИрдВ рдФрд░ рдХрднреА рдкреБрдирдГ рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рдХрд░рддреЗред
- **рдбреЗрдЯрд╛**: рд╕рд┐рдВрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдбрд┐рд╡рд╛рдЗрд╕ id, рдЕрдВрддрд┐рдо pull/push, рдЕрдВрддрд┐рдо push head, рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐) `session-sync` рд╕реНрдЯреЛрд░реЗрдЬ рдбреЛрдореЗрди рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рд╕рддреНрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдкреА рд╣реЛрддреА рд╣реИрдВ тАФ рдкреНрд▓рдЧрдЗрди рдЙрдиреНрд╣реЗрдВ рдХрднреА рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ред рдбрд┐рд╡рд╛рдЗрд╕ id рдХреНрд░реЙрд╕-рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝реЛрд░реНрдХ рд╢реНрд░реЗрдп рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ `device.txt` рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
- **рд╕рддреНрд░ рд▓реЙрдЧ**: `sync/push`, `sync/pull`, рдФрд░ `sync/conflict` `types.d.ts` рдореЗрдВ рдШреЛрд╖рд┐рдд рд╣реИрдВ; рд╡реЗ рдХреЗрд╡рд▓ рддрднреА рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ (рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ рджреЗрдЦреЗрдВ)ред рдЬреЛ рдХреБрдЫ рднреА рд▓рд┐рдЦрд╛ рдпрд╛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд▓рдЧрдЗрди рдЬреЛ рдПрдХрдорд╛рддреНрд░ рдЯрд┐рдХрд╛рдК рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрддрд╛ рд╣реИ тАФ рдЯрдХрд░рд╛рд╡ рдлрд╝реЛрд░реНрдХ рд╕реВрдЪрдирд╛ тАФ рд╡рд╣ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЕрдкрдирд╛ producer-owned source kind (`dsh-session-sync`) рд░рдЦрддреА рд╣реИ; рд╣рд╛рд░реНрдиреЗрд╕ рдиреЗ рд╕рд╛рдЭрд╛ `plugin` kind рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рддреНрд░ рдкреБрдирдГ-рдкрдарди рдкрд░ рдЙрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ
- **рдХрднреА рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рдирд╣реАрдВред** Append-only рддреАрди-рддрд░рдлрд╝рд╛ рдорд░реНрдЬ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд▓рди рдкрд░ рджреЛрдиреЛрдВ рдкрдХреНрд╖ рд░рдЦрддрд╛ рд╣реИ; рдлрд╝реЛрд░реНрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рдХрднреА рдирд╣реАрдВ рд╣рдЯрддреАрдВ, рдФрд░ git рдХрднреА force-push, reset, rebase рдпрд╛ рдмреНрд░рд╛рдВрдЪ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░рддрд╛ред
- **рдкрде рд╕рдВрд░реЛрдзрдиред** рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд░рд░ рд╣реЛрддреА рд╣реИрдВ, рд╕рд┐рдорд▓рд┐рдВрдХ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╣рд░ рдЬреЛрдбрд╝реЗ рдЧрдП рдкрде рдХреА рд╕рдВрд░реЛрдзрди рдЬрд╛рдБрдЪ рд╣реЛрддреА рд╣реИ (`PATH_UNSAFE` рддреЗрдЬрд╝реА рд╕реЗ рдЕрд╕рдлрд▓)ред
- **рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЖрдЙрдЯрдкреБрдЯред** рд░рд┐рдореЛрдЯ-URL рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓, рдЯреЛрдХрди рдФрд░ `key=value` рд░рд╣рд╕реНрдп рдореЙрдбрд▓ рдпрд╛ рд▓реЙрдЧ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ; рдкрде рдкреНрд░рджрд░реНрд╢рди рдЕрдкрдиреА рд░реВрдЯ рдХреЗ рдмрд╛рд╣рд░ рд╕рдм рдХреБрдЫ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
- **рдХреЛрдИ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдирд╣реАрдВред** рдкреНрд▓рдЧрдЗрди рд╕реНрд╡рдпрдВ рдХреЛрдИ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛; git рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдЖрдкрдХреЗ рд╕рд╛рдорд╛рдиреНрдп git credential helper рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред age рдкрд╣рдЪрд╛рди/рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЖрдкрдХреЗ рдкреНрд░рдмрдВрдзрди рдХреА рд╣реИрдВ, рдФрд░ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдХрднреА рд╕рд┐рдВрдХ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддреАрдВред
- **git рдХрдареЛрд░реАрдХрд░рдгред** git `GIT_TERMINAL_PROMPT=0` рдФрд░ `GIT_OPTIONAL_LOCKS=0` рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рд╕рдордп-рд╕реАрдорд╛ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рд╕реАрдорд┐рдд, рдкреНрд░рддрд┐-рд╕реНрдЯреНрд░реАрдо рдЖрдЙрдЯрдкреБрдЯ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рдеред
- **рдмрдВрдж-рдЕрд╕рдлрд▓ред** рдкреБрд╖реНрдЯрд┐ рдЙрддреНрддрд░рджрд╛рддрд╛, рд░рд┐рдореЛрдЯ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкрде рдСрдкрд░реЗрд╢рди рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
## рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдЦрд╝рддрд░рд╛ рдореЙрдбрд▓
`backend: encrypted` рдорд┐рд░рд░ рдХреЗ рдКрдкрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ **age** рдкрд░рдд рдЬреЛрдбрд╝рддрд╛ рд╣реИ: рд╕рддреНрд░ рдмрд╛рдЗрдЯреНрд╕ рдХрдорд┐рдЯ рдФрд░ push рд╕реЗ рдкрд╣рд▓реЗ `encrypted/**/*.age` рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдорд░реНрдЬ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рдиреАрдп рд╕рд╛рджреЗ-рдкрд╛рда рдорд┐рд░рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рддреАрди-рддрд░рдлрд╝рд╛ рдорд░реНрдЬ рд╣рдореЗрд╢рд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рд╛рджреЗ-рдкрд╛рда рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП append-only рджреЛрдиреЛрдВ-рд░рдЦреЗрдВ рдЕрд░реНрде рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВред
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреНрдпрд╛ **рд╕реБрд░рдХреНрд╖рд┐рдд** рдХрд░рддрд╛ рд╣реИ:
- **рд░рд┐рдореЛрдЯ рдореЗрдВ рдорд┐рд░рд░ рд╕рд╛рдордЧреНрд░реАред** рдЖрдк рдЬреЛ рд╕рддреНрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ push рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ age рд╕рд┐рдлрд░рдЯреЗрдХреНрд╕реНрдЯ рд╣реЛрддреА рд╣реИрдВ; рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯ, рдЙрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рдХ рдФрд░ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреНрд▓реЛрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рдмрд┐рдирд╛ рд╕рд╛рджреЗ-рдкрд╛рда рд╕рддреНрд░ рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред
рдХреНрдпрд╛ рдпрд╣ **рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ** рдХрд░рддрд╛ (рд╕реАрдорд╛):
- **рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ age рдкрд╣рдЪрд╛рди рдЖрдкрдХреЗ рдкреНрд░рдмрдВрдзрди рдХреА рд╣реИрдВред** рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛/рдкрд╣рдЪрд╛рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рдХрднреА рд╢рд┐рдк, рд╕реНрдЯреЛрд░ рдпрд╛ рд░реЛрдЯреЗрдЯ рдирд╣реАрдВ рд╣реЛрддреАрдВред рдХреБрдВрдЬреА рд▓реАрдХ рд╣реЛрдиреЗ рдкрд░ рдЙрд╕рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд┐рд░рд░ рд╕рд╛рдордЧреНрд░реА рдЙрдЬрд╛рдЧрд░ рд╣реЛрддреА рд╣реИред рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝-рд░рд╣рд┐рдд рдкрд╣рдЪрд╛рди рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦреЗрдВред
- **рд░рд┐рдореЛрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдирд┐рдЬреА рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рд╣реА рд░рд╣рддрд╛ рд╣реИред** git рдореЗрдЯрд╛рдбреЗрдЯрд╛ тАФ рдХрдорд┐рдЯ рд╕рдВрджреЗрд╢, `.gitignore`, `encrypted/` рдкрде рд╕рдВрд░рдЪрдирд╛, рдмреНрд░рд╛рдВрдЪ рдирд╛рдо рдФрд░ push/fetch рдЧрддрд┐рд╡рд┐рдзрд┐ тАФ рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯ рдХреЛ рджрд┐рдЦрддрд╛ рд░рд╣рддрд╛ рд╣реИред рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди *рд╕рд╛рдордЧреНрд░реА* рдЫрд┐рдкрд╛рддрд╛ рд╣реИ, рдпрд╣ рддрдереНрдп рдирд╣реАрдВ рдХрд┐ рдЖрдк рд╕рд┐рдВрдХ рдХрд░рддреЗ рд╣реИрдВ, рди рд╣реА рдЖрдкрдХреЗ рд╕рддреНрд░ рд╡реГрдХреНрд╖ рдХрд╛ рдЖрдХрд╛рд░ред
- **рд╕рд╛рджрд╛ рдкрд╛рда рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд░рд╣рддрд╛ рд╣реИред** `/sessions/` рдХрд╛ рдорд┐рд░рд░ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╛рджрд╛ рдкрд╛рда рд╣реИ; рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░реЗрд╖рд┐рдд/рд░рд┐рдореЛрдЯ рдкреНрд░рддрд┐ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рд╕реНрдерд╛рдиреАрдп рдбрд┐рд╕реНрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдпрд╛ рд▓рд╛рдЗрд╡ рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХреА рдирд╣реАрдВред
- **graceful degradation рдХрд╛ рдЕрд░реНрде рд╕рд╛рджрд╛ рдкрд╛рда рд╣реИред** `backend: encrypted` рдХреЗ рд╕рд╛рде, рдпрджрд┐ `age` рдЧрд╛рдпрдм рд╣реИ, рдпрд╛ `ageRecipient`/`ageIdentity` рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдкреНрд▓рдЧрдЗрди рд╕рд╛рджреЗ-рдкрд╛рда git рдкрде рдкрд░ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИ **рдФрд░ рд╕реНрдерд┐рддрд┐/рд▓реЙрдЧ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ** тАФ рдпрд╣ рдХрднреА рдЪреБрдкрдЪрд╛рдк рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред рд░рд┐рдореЛрдЯ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдорд╛рдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ `/sync status` рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рдБрдЪреЗрдВред
рдЖрдзрд╛рд░: `backend: git` (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдХреЗ рд╕рд╛рде рд╕рддреНрд░ рдмрд╛рдЗрдЯреНрд╕ **рдЖрдкрдХреЗ** git рд░рд┐рдореЛрдЯ рдореЗрдВ рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░рд╣рддреЗ рд╣реИрдВ тАФ рдирд┐рдЬреА рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
## рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ
- **рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред** `backend: encrypted` рдПрдХ age рдкрд░рдд рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдКрдкрд░ ┬лрдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдЦрд╝рддрд░рд╛ рдореЙрдбрд▓┬╗ рджреЗрдЦреЗрдВ); `age` рдпрд╛ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рд╕рд╛рджреЗ-рдкрд╛рда рдкрд░ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИред `backend: git` (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдХреЗ рд╕рд╛рде рд╕рддреНрд░ рдмрд╛рдЗрдЯреНрд╕ **рдЖрдкрдХреЗ** git рд░рд┐рдореЛрдЯ рдореЗрдВ рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░рд╣рддреЗ рд╣реИрдВ тАФ рдПрдХ рдирд┐рдЬреА рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
- **git рдЖрд╡рд╢реНрдпрдХред** рдкреНрд▓рдЧрдЗрди рдХреЛ `git` рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдФрд░ `subprocess` рд╕реЗрд╡рд╛ рдЪрд╛рд╣рд┐рдП; рдЙрдирдХреЗ рдмрд┐рдирд╛, рд╕рд┐рдВрдХ рдСрдкрд░реЗрд╢рди рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рд╕реЗ рдЕрд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ (рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓реЗрдВ рдмреВрдЯ рд╣реЛрддреА рд░рд╣рддреА рд╣реИрдВ)ред
- **`0.1.0-rc.6`/`0.1.0-rc.8`/`0.1.1-rc.2`/`0.1.2-alpha.2`/`0.1.2-alpha.3`/`0.1.2-rc.1`/`0.1.7-alpha.2` рдкрд░ рд╕рддреНрд░ рдИрд╡реЗрдВрдЯред** рд╣рд╛рд░реНрдиреЗрд╕ рдЕрднреА `sync/*` рдкреНрд░рдХрд╛рд░ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░рддрд╛, рдЗрд╕рд▓рд┐рдП рд╕рддреНрд░-рд▓реЙрдЧ рдЬреЛрдбрд╝ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рд╕рддреНрд░ рд▓реЛрдб рд╣реЛрддреЗ рд░рд╣рддреЗ рд╣реИрдВ); рдкреНрд▓рдЧрдЗрди рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рддрдГ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ `Session.append` рдкрд░ `ignorable` рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред
- **рдЯрд░реНрди рдХреЗ рдмреАрдЪ `approval`ред** `/sync` рдЯрд░реНрди рдХреЗ рдмреАрдЪ рдЪрд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ `approval` рдЪреИрдирд▓ рдХреЗ рдкрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЦреБрд▓рд╛ рдЯрд░реНрди рдирд╣реАрдВ рд╣реЛрддрд╛; рдХрдорд╛рдВрдб-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╕рд┐рдВрдХ рдХреЗ рд▓рд┐рдП `confirmVia: userQuestions` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдЯрд░реНрди рдХреЗ рдЕрдВрджрд░ рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рд┐рдВрдХ рдЪрд▓рд╛рдПрдБред рдЦреБрд▓реЗ рдЯрд░реНрди рдХреА рдЬрд╛рдБрдЪ рд╣реЛрд╕реНрдЯ рдХреЗ `turnBoundary` рд╕рддреНрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рд╕реЗ рд╣реЛрддреА рд╣реИ: `@deepseek-ai/dsh-session-projection` рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдпреЛрдЬрди рдЯрд░реНрди рд╕реНрдерд┐рддрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ рдЙрд╕реА рдХрд╛рд░рдг рдХреЗ рд╕рд╛рде рдлрд╝реЗрд▓-рдХреНрд▓реЛрдЬрд╝реНрдб рд░рд╣рддрд╛ рд╣реИред
- **рд╣реЛрд╕реНрдЯ-рдирд┐рдЬреА рдЖрд░реНрдЯрд┐рдлрд╝реИрдХреНрдЯ рд╕рд┐рдВрдХ рдирд╣реАрдВ рд╣реЛрддреЗред** `session.lock` (рд╣рд╛рд░реНрдиреЗрд╕ рд╕рддреНрд░ рд▓реАрдЬрд╝) рдФрд░ `session.migration.*.tmp` рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓реЗрдВ рдХрднреА рдорд┐рд░рд░ рдпрд╛ рд╣рдЯрд╛рдИ рдирд╣реАрдВ рдЬрд╛рддреАрдВ тАФ рдпреЗ рд░рдирдЯрд╛рдЗрдо рд╕реНрдерд┐рддрд┐ рд╣реИрдВ, рд╕рд┐рдВрдХ-рдпреЛрдЧреНрдп рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВред рд╕рддреНрд░ рд▓реЙрдЧ (`session.jsonl`, `session.v[1-9]*.jsonl[.zstd]`) рд╣реА рдорд┐рд░рд░ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреЗрд▓реЛрдб рд░рд╣рддреЗ рд╣реИрдВред
## рд╡рд┐рдХрд╛рд╕
```sh
pnpm install # node ^22.19 || >=24
pnpm run typecheck && pnpm run typecheck:ci # рдкреНрд░рдХрд╛рд╢рд┐рдд 0.1.7-alpha.2 peers рдХреЗ рд╡рд┐рд░реБрджреНрдз tsc --checkJs
pnpm test # node --test (13 рдЯреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВ; git рдЗрдВрдЬрди рд╕реБрдЗрдЯ рдмрд┐рдирд╛ git рдХреЗ рдЫреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ)
pnpm run verify:self-contained # рдирд┐рд░реНрднрд░рддрд╛ spec рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рд╣рд▓ рд╣реЛрддреА рд╣реИрдВ
pnpm run verify:artifacts # рдкреНрд░рдХрд╛рд╢рд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдЙрдкрд╕реНрдерд┐рдд + index.mjs import рдпреЛрдЧреНрдп
pnpm run check:readmes # рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ README рд╕рдВрдЧрддрддрд╛
pnpm pack # рдкреНрд░рдХрд╛рд╢рд┐рдд tarball
```
рдХреЛрдИ рдмрд┐рд▓реНрдб рдЪрд░рдг рдирд╣реАрдВ: рд╢реБрджреНрдз ESM, `index.mjs` рдФрд░ `lib/` рд╣реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдЖрд░реНрдЯрд┐рдлрд╝реИрдХреНрдЯ рд╣реИрдВред
## Topics
`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `session-sync`, `session`, `git`, `sync`, `cross-device`
## рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛
- [@PerryLink](https://github.com/PerryLink) тАФ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдЕрдиреБрд░рдХреНрд╖рдХ: git рдорд┐рд░рд░ рдЗрдВрдЬрди, append-only рджреЛрдиреЛрдВ-рд░рдЦреЗрдВ рдорд░реНрдЬ, `/sync` рдХрдорд╛рдВрдб рдФрд░ `sync_*` рдЯреВрд▓, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЛрдб, рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝рд░, рдФрд░ рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред
## PerryLink DSH Plugin Family
This project is one of the **44 DeepSeek Harness plugins** maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
| Plugin | One-liner |
|---|---|
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | ЁЯЪл **рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд** тАФ рдКрдкрд░ рджреЗрдЦреЗрдВ |
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | | ЁЯзК FROZEN тАФ see the repo README |
| **[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-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | | ЁЯзК FROZEN тАФ see the repo README |
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness тАФ Windows first. | |
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) | |
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | | ЁЯзК FROZEN тАФ see the repo README |
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | | ЁЯзК FROZEN тАФ see the repo README |
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics for DeepSeek Harness. | |
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
| **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | Laya typed decisions (`noul`/`choice`/`score`) as a first-class Cordis service and model-visible tools | |
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | | ЁЯзК FROZEN тАФ see the repo README |
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
| **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | One-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card | |
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | | ЁЯзК FROZEN тАФ see the repo README |
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | ЁЯЪл **рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд** тАФ рдКрдкрд░ рджреЗрдЦреЗрдВ |
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Cross-device session sync for DeepSeek Harness тАФ a dedicated git mirror of your session store. | |
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | ЁЯЪл **рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд** тАФ рдКрдкрд░ рджреЗрдЦреЗрдВ |
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools | |
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
### DSH Desktop рдорд╛рд░реНрдХреЗрдЯ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
рд╕рднреА PerryLink рдкреНрд▓рдЧрдЗрди DSH Desktop рдХреЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: **Market тЖТ Sources тЖТ add source тЖТ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **тЖТ рдЪреБрдиреЗрдВ**ред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдорд╛рд░реНрдХреЗрдЯ рдХреЗ npm-identity рд╕рддреНрдпрд╛рдкрди рдФрд░ рдЖрдкрдХреА рдкреБрд╖реНрдЯрд┐ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред
## рд▓рд╛рдЗрд╕реЗрдВрд╕
[LICENSE](LICENSE) (Apache License 2.0) ┬й 2026 dsh-session-sync contributors