# ЁЯФД 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://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![DSH plugin](https://img.shields.io/badge/dsh--plugin-тЬЕ-green)](https://github.com/topics/dsh-plugin) [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#) [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-session-sync/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-session-sync/actions) [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-session-sync?label=version)](https://github.com/PerryLink/dsh-session-sync/releases) [![npm version](https://img.shields.io/npm/v/dsh-session-sync)](https://www.npmjs.com/package/dsh-session-sync) [![npm downloads](https://img.shields.io/npm/dm/dsh-session-sync)](https://www.npmjs.com/package/dsh-session-sync) [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.3-alpha.1` (GitHub рдЯреИрдЧ, 2026-09-06 рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд: рдкреВрд░реНрдг рдЧреЗрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛ + рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓ рд╕реНрдореЛрдХ)ред npm рдирд┐рд░реНрднрд░рддрд╛-рд▓рд╛рдЗрди `0.1.2-rc.1`, peers `>=0.1.2-rc.1 <0.2.0`ред (2026-09-04 рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд): рд╕рддреНрд░ рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ рдЕрдкрдирд╛ ignorable рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣реАрдд-рд▓реЙрдЧ рдкрдарди рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд░рдЦрддрд╛ рд╣реИ - Session.append рдЕрднреА рднреА рдЗрд╕реЗ рд╕реНрдЯреИрдореНрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдЧреЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред | | 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` рдореЗрдВ рдШреЛрд╖рд┐рдд рд╣реИрдВ; рд╡реЗ рдХреЗрд╡рд▓ рддрднреА рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ (рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ рджреЗрдЦреЗрдВ)ред рдЬреЛ рдХреБрдЫ рднреА рд▓рд┐рдЦрд╛ рдпрд╛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ - **рдХрднреА рдЪреБрдкрдЪрд╛рдк рдУрд╡рд░рд░рд╛рдЗрдЯ рдирд╣реАрдВред** 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` рдкрд░ рд╕рддреНрд░ рдИрд╡реЗрдВрдЯред** рд╣рд╛рд░реНрдиреЗрд╕ рдЕрднреА `sync/*` рдкреНрд░рдХрд╛рд░ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░рддрд╛, рдЗрд╕рд▓рд┐рдП рд╕рддреНрд░-рд▓реЙрдЧ рдЬреЛрдбрд╝ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рд╕рддреНрд░ рд▓реЛрдб рд╣реЛрддреЗ рд░рд╣рддреЗ рд╣реИрдВ); рдкреНрд▓рдЧрдЗрди рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рддрдГ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╣реЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ `Session.append` рдкрд░ `ignorable` рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред - **рдЯрд░реНрди рдХреЗ рдмреАрдЪ `approval`ред** `/sync` рдЯрд░реНрди рдХреЗ рдмреАрдЪ рдЪрд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ `approval` рдЪреИрдирд▓ рдХреЗ рдкрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЦреБрд▓рд╛ рдЯрд░реНрди рдирд╣реАрдВ рд╣реЛрддрд╛; рдХрдорд╛рдВрдб-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╕рд┐рдВрдХ рдХреЗ рд▓рд┐рдП `confirmVia: userQuestions` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдЯрд░реНрди рдХреЗ рдЕрдВрджрд░ рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рд┐рдВрдХ рдЪрд▓рд╛рдПрдБред ## рд╡рд┐рдХрд╛рд╕ ```sh pnpm install # node ^22.19 || >=24 pnpm run typecheck && pnpm run typecheck:ci # рдкреНрд░рдХрд╛рд╢рд┐рдд 0.1.2-rc.1 peers рдХреЗ рд╡рд┐рд░реБрджреНрдз tsc --checkJs pnpm test # node --test (12 рдЯреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВ; 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 рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ [PerryLink](https://github.com/PerryLink) рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░рдХреНрд╖рд┐рдд [37 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-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-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/PerryLink/dsh-wechat)** | WeChat тЖФ DSH рдмреНрд░рд┐рдЬ (Tencent iLink bot): рдЯреЗрдХреНрд╕реНрдЯ/рдЗрдореЗрдЬ/рдлрд╝рд╛рдЗрд▓/рдЖрд╡рд╛рдЬрд╝, рдЪреИрдЯ рдореЗрдВ рдЕрдиреБрдореЛрджрди | ### 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