@chumikov/opencode-sync
v1.2.7
Published
Git-based session synchronization for OpenCode
Readme
opencode-sync
Синхронизация сессий 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 linkНастройка
Шаг 1: Создать приватный репозиторий на GitHub
[!IMPORTANT] Репозиторий рекомендую обязательно сделать приватным. Файлы ваших сессий в OpenCode могут содержать промпты, фрагменты кода и результаты работы.
- Откройте github.com/new
- Repository name — любое, например
opencode-sessions - Visibility — Private
- Не добавляйте README, .gitignore или license (пустой репозиторий)
- Нажмите Create repository
Шаг 2: Настроить доступ к GitHub
Вариант A: Personal Access Token (рекомендуется)
Токен достаточно создать один раз и использовать на всех устройствах — не нужно переносить 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
Вариант B: SSH-ключ
Потребуется настроить SSH-ключ на каждом устройстве.
Проверьте, настроен ли ключ:
ssh -T [email protected]
# Hi username! You've successfully authenticated — ключ работаетЕсли Permission denied — сгенерируйте и добавьте ключ:
# Генерация ключа
ssh-keygen -t ed25519 -C "[email protected]"
# Копирование публичного ключа
cat ~/.ssh/id_ed25519.pub
# Добавьте ключ на GitHub: Settings → SSH and GPG keys → New SSH key
# Вставьте содержимое ~/.ssh/id_ed25519.pubURL для setup: [email protected]:YOUR_USERNAME/<opencode-sessions>.git
Шаг 3: Запустить opencode-sync setup
opencode-sync setupИнтерактивный мастер:
- Проверяет OpenCode — если не установлен, процесс дальше не пойдёт
- Запрашивает URL репозитория — HTTPS с токеном или SSH
- Проверяет доступ — если доступа нет, покажет конкретную ошибку и подсказку:
- Нет интернета → проверьте подключение
- Нет SSH-доступа → инструкция по генерации ключа
- Репозиторий не найден → проверьте URL
- Ошибка аутентификации → инструкция по токену/SSH
- Предлагает повторить или изменить URL при ошибке
- Запрашивает имя устройства — будет видно в коммитах (по умолчанию — hostname)
- Клонирует репозиторий, определяет ветку
- Настраивает автосинхронизацию — добавляет shell-функцию (bash, zsh, fish или PowerShell)
Конфигурация сохраняется в ~/.config/opencode/sync.json.
Шаг 4: Перезапустить shell
Linux / macOS:
source ~/.zshrc # или source ~/.bashrcWindows (PowerShell):
. $PROFILEfish:
# Функция загрузится автоматически при следующем запуске fishАвтосинхронизация
При setup автоматически определяется ваш shell и добавляется функция-обёртка для OpenCode.
Поддерживаемые shell
| 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 # Показать что будет импортировано, без измененийКак работает синхронизация
Область видимости (scope)
Push и pull фильтруют сессии по текущему проекту:
- Из папки git-репозитория → синхронизируются только сессии этого проекта. Project ID определяется как SHA-1 первого коммита git-репозитория.
- Из папки без git → синхронизируются только глобальные сессии (project_id = "global").
- Первый push (манифест устройства ещё не создан) → экспортируются все сессии без фильтрации.
Каждое устройство записывает в git манифест — список всех своих текущих сессий (manifests/{device}.json). Манифест всегда содержит полный список (не только scoped-сессии) — это нужно для корректного удаления.
Push
- Проверяет интернет и доступ к репозиторию (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
Pull
- Проверяет интернет и доступ к репозиторию (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