Синхронизация сессий OpenCode между вашими устройствами через приватный git-репозиторий.
Начинайте сейссию работы с OpenCode с одного устройства, а продолжайте на другом. Даже еслиу вас одно устройство - просто синхронизируйте свои сессии, чтобы не потерять их. Opencode-sync экспортирует сессии OpenCode в JSON-файлы, хранит их в вашем приватном git-репозитории. Каждое устройство push'ит свои сессии и pull'ит с других.
- Проектная область видимости — push/pull синхронизируют только сессии текущего проекта (определяется по git-репозиторию)
- Автосинхронизация — shell-функция
opencode()автоматически синхронизирует перед/после работы - Manifest-based удаление — сессия удаляется когда все устройства её удалили
- Deleted set — удалённые локально сессии не возвращаются при pull
- Защита первого запуска — при первой синхронизации локальные сессии не удаляются
- Preflight-проверки — перед каждой операцией проверяется интернет, доступ к GitHub, наличие OpenCode
- TUI-setup — интерактивный мастер настройки с валидацией доступа к репозиторию
- Нативные команды OpenCode — все операции производятся через CLI OpenCode (
db,export,import,session delete)
| Зависимость | Минимальная версия |
|---|---|
| Node.js | >= 20 |
| git | любой |
| opencode | >= 1.14 |
| PAT-токен или SSH-ключ | для доступа к GitHub |
Почему opencode ≥ 1.14? Начиная с версии 1.14, OpenCode хранит сессии в SQLite и поддерживает команду
opencode db, которая необходима для экспорта всех сессий (а не только текущего проекта). Приopencode-sync setupверсия проверяется автоматически.
Из npm:
npm install -g @chumikov/opencode-syncИз исходников:
git clone https://github.com/Chumikov/opencode-sync.git
cd opencode-sync
npm install && npm run build
npm linkImportant
Репозиторий рекомендую обязательно сделать приватным. Файлы ваших сессий в OpenCode могут содержать промпты, фрагменты кода и результаты работы.
- Откройте github.com/new
- Repository name — любое, например
opencode-sessions - Visibility — Private
- Не добавляйте README, .gitignore или license (пустой репозиторий)
- Нажмите Create repository
Токен достаточно создать один раз и использовать на всех устройствах — не нужно переносить SSH-ключи.
- GitHub → Settings → Developer settings → Personal access tokens → Generate new token (classic)
- Выберите scope
repo(полный доступ к приватным репозиториям) - Скопируйте токен
- URL для setup:
https://<TOKEN>@github.com/YOUR_USERNAME/<opencode-sessions>.git
Потребуется настроить SSH-ключ на каждом устройстве.
Проверьте, настроен ли ключ:
ssh -T git@github.com
# Hi username! You've successfully authenticated — ключ работаетЕсли Permission denied — сгенерируйте и добавьте ключ:
# Генерация ключа
ssh-keygen -t ed25519 -C "your-email@example.com"
# Копирование публичного ключа
cat ~/.ssh/id_ed25519.pub
# Добавьте ключ на GitHub: Settings → SSH and GPG keys → New SSH key
# Вставьте содержимое ~/.ssh/id_ed25519.pubURL для setup: git@github.com:YOUR_USERNAME/<opencode-sessions>.git
opencode-sync setupИнтерактивный мастер:
- Проверяет OpenCode — если не установлен, процесс дальше не пойдёт
- Запрашивает URL репозитория — HTTPS с токеном или SSH
- Проверяет доступ — если доступа нет, покажет конкретную ошибку и подсказку:
- Нет интернета → проверьте подключение
- Нет SSH-доступа → инструкция по генерации ключа
- Репозиторий не найден → проверьте URL
- Ошибка аутентификации → инструкция по токену/SSH
- Предлагает повторить или изменить URL при ошибке
- Запрашивает имя устройства — будет видно в коммитах (по умолчанию — hostname)
- Клонирует репозиторий, определяет ветку
- Настраивает автосинхронизацию — добавляет shell-функцию (bash, zsh, fish или PowerShell)
Конфигурация сохраняется в ~/.config/opencode/sync.json.
Linux / macOS:
source ~/.zshrc # или source ~/.bashrcWindows (PowerShell):
. $PROFILEfish:
# Функция загрузится автоматически при следующем запуске fishПри setup автоматически определяется ваш shell и добавляется функция-обёртка для OpenCode.
| Shell | Файл | ОС |
|---|---|---|
| bash | ~/.bashrc или ~/.bash_profile |
Linux, macOS |
| zsh | ~/.zshrc |
macOS (default), Linux |
| fish | ~/.config/fish/functions/opencode.fish |
Linux, macOS |
| PowerShell | Documents/PowerShell/Microsoft.PowerShell_profile.ps1 |
Windows, Linux, macOS |
bash / zsh:
opencode() {
local _sync_log="$HOME/.local/share/opencode-sync/sync.log"
mkdir -p "$(dirname "$_sync_log")" 2>/dev/null
command opencode-sync pull 2>>"$_sync_log" || echo "opencode-sync: ошибка pull (подробности: $_sync_log)" >&2
command opencode "$@"
local exit_code=$?
command opencode-sync push 2>>"$_sync_log" || echo "opencode-sync: ошибка push (подробности: $_sync_log)" >&2
return $exit_code
}При каждом запуске OpenCode:
- Pull — подтягивает сессии с других устройств
- OpenCode — запускается как обычно
- Push — отправляет ваши сессии в репозиторий
Ошибки записываются в ~/.local/share/opencode-sync/sync.log. При ошибке показывается краткое сообщение со ссылкой на лог-файл.
opencode-sync setup # Первичная настройка (TUI)
opencode-sync push # Экспортировать сессии в git
opencode-sync pull # Импортировать сессии из git
opencode-sync sync # Полный цикл: pull + push
opencode-sync status # Конфигурация + проверка доступа к remote
opencode-sync push --dry-run # Показать что будет отправлено, без изменений
opencode-sync pull --dry-run # Показать что будет импортировано, без измененийPush и pull фильтруют сессии по текущему проекту:
- Из папки git-репозитория → синхронизируются только сессии этого проекта. Project ID определяется как SHA-1 первого коммита git-репозитория.
- Из папки без git → синхронизируются только глобальные сессии (project_id = "global").
- Первый push (манифест устройства ещё не создан) → экспортируются все сессии без фильтрации.
Каждое устройство записывает в git манифест — список всех своих текущих сессий (manifests/{device}.json). Манифест всегда содержит полный список (не только scoped-сессии) — это нужно для корректного удаления.
- Проверяет интернет и доступ к репозиторию (preflight)
- Определяет scope по текущей директории (git root → первый коммит = project ID)
- Получает все сессии через
opencode db, фильтрует по scope - Экспортирует новые/изменённые сессии через
opencode export - Сохраняет JSON-файлы в
sessions/{project_id}/{session_id}.json - Сравнивает старый и новый манифест — удалённые id записываются в deleted set (
manifests/{device}-deleted.json) - Записывает полный манифест устройства
- Удаляет orphan-файлы в scoped-папке (сессии, которых нет ни в одном манифесте)
- Push в git
- Проверяет интернет и доступ к репозиторию (preflight)
- Pull из git
- Сканирует только
sessions/{project_id}/(илиsessions/global/) - Пропускает сессии из deleted set — они не возвращаются после локального удаления
- Импортирует новые/обновлённые сессии через
opencode import - Если манифест устройства существует в репо — удаляет локальные сессии, которые удалены на всех устройствах (через
opencode session delete) и добавляет их в deleted set - Если манифест устройства не существует (первая синхронизация) — шаг удаления пропускается
- Пользователь удаляет сессию на устройстве А
- Push на А: id сессии исчезает из манифеста А, добавляется в deleted set А
- Если id нет ни в одном манифесте — JSON-файл удаляется из git
- Pull на Б: если id нет в global alive set — сессия удаляется из локальной БД opencode, id добавляется в deleted set Б
- Сессия из deleted set не вернётся при следующем pull
Сессия удаляется с устройства только когда все устройства синхронизировались без неё.
Приоритет выше файла конфигурации.
| Переменная | Описание |
|---|---|
OPENCODE_SYNC_REPO |
URL git-репозитория |
OPENCODE_SYNC_DEVICE |
Имя устройства |
OPENCODE_SYNC_PATH |
Локальный путь к клону |
OPENCODE_SYNC_BRANCH |
Ветка в sync-репозитории |
OPENCODE_BIN |
Путь к бинарнику opencode |
OPENCODE_DB |
Путь к SQLite БД opencode |
- Установите OpenCode и opencode-sync
opencode-sync setup— укажите тот же URL репозитория (токен одинаковый для всех устройств)- Готово — сессии автоматически синхронизируются при запуске opencode
- Репозиторий обязательно приватный — файлы содержат промпты и фрагменты кода
- Все операции через нативные команды OpenCode CLI
- На Windows используется
cmd /cдля совместимости с.cmd/.exeshim'ами - URL маскируется в логах и сообщениях об ошибках
- Preflight-проверки перед каждой операцией — понятные ошибки вместо сырого git stderr
- Ошибки синхронизации записываются в
~/.local/share/opencode-sync/sync.log
sync-repo/
├── sessions/
│ ├── global/
│ │ └── {session_id}.json # глобальные сессии
│ ├── e89b5fab.../
│ │ └── {session_id}.json # сессии проекта (project_id = SHA первого коммита)
│ └── 3129bae8.../
│ └── {session_id}.json # сессии другого проекта
├── manifests/
│ ├── laptop.json # манифест "laptop" (все живые id)
│ ├── laptop-deleted.json # deleted set "laptop" (удалённые id)
│ ├── desktop.json # манифест "desktop"
│ └── desktop-deleted.json # deleted set "desktop"
└── .gitignore