severin-ye/uagent-sync 预览 preview

severin-ye/uagent-sync

Cross-device agent workspace sync for OpenCode, Codex, and DeepSeek Harness — backup, restore, update, and configuration inspection.

项目介绍Project Overview

uagent-sync 是一个开发环境同步插件,通过一条命令将代理工作区(子模块、配置、技能、API 密钥模板)备份到私有 GitHub 仓库,并在新机器上自动还原。适合多机同步 opencode 或 Codex 环境。注意:DSH 与 all 还原范围因缺少写入器而默认失败关闭。

uagent-sync is a workspace-sync plugin that backs up your agent environment—submodules, configs, skills, API key templates—to a private GitHub repo with one command, and restores it on a new machine automatically. Use it to keep opencode or Codex setups consistent across multiple machines. Caveat: DSH and all restore scopes fail closed due to missing restore writers.

或使用命令行安装(适合开发者)Or use CLI install (for developers)

命令行安装CLI Install

dsh plugin --profile web add uagent-sync-dsh

severin-ye/uagent-sync 加入你的 DSH 配置(web profile)即可启用。

READMEREADME

uagent-sync

Node.js 18+ CI Release MIT 中文

uagent-sync

One command to backup. One command to restore. Your entire dev environment, synced across machines.

Export your agent workspace — submodules, configs, skills, API keys — to a private GitHub repo.
On a new machine, pull it back and everything installs itself.


Why?

You have multiple machines. Each runs opencode and/or Codex with different plugins, MCP servers, skills, and submodules checked out at different commits. Keeping them in sync is a nightmare of git submodule update, npx skills add, and copy-pasting config files.

uagent-sync makes it a single command:

# On your main machine
opencode-sync push "Friday backup"

# On your new laptop
opencode-sync pull

That's it. Submodules reset to exact commits. MCP servers rebuilt. Skills reinstalled. Config merged. API keys templated. Everything just works.


Installation

uagent-sync ships one CLI and three agent entry points. Install the one you use:

DeepSeek Harness

# From npm (recommended — bundles the CLI as a dependency)
dsh plugin --profile <name> add uagent-sync-dsh

# Or from GitHub (monorepo sub-package, pure JS — no build authorization needed)
dsh plugin --profile <name> add "github:severin-ye/uagent-sync#master&path:packages/dsh"

OpenCode

npm install -g uagent-sync        # global CLI (commands: uagent-sync / opencode-sync)
# or run without installing:
npx uagent-sync <cmd>

Then add to your opencode config (config/opencode.json) and restart:

{ "plugin": ["file:///absolute/path/to/uagent-sync/dist/plugin.js"] }

Codex

codex plugin marketplace add severin-ye/uagent-sync
# Then open /plugins in the Codex CLI, install uagent-sync, and start a new session.

Codex extension deduplication

Migration analysis is the single Dashboard module for coverage/gaps, compatibility, functional overlap/deduplication, migration decisions, and execution verification. Choose either uagent-sync dashboard --page migration-analysis with a single Agent (functional duplicates) or an explicit source/target pair (migration comparison); no scope means no comparison scan. Sources are labeled official, third-party, local, or unknown, and official provenance requires controlled install evidence. The agent-browser → browser/chrome mapping is one grouped review item with multiple evidence edges.

The V1 audit ledger usync-dotfiles/agents/codex/policies/extension-conflicts.json is never changed by scans. New confirmed decisions use usync-dotfiles/policies/capability-decisions.json; creation/import happens inside the first write transaction. Codex changes require a staged decision, exact byte-preserving config/ledger diff, and a second confirmation with a one-use token. Timestamped backups are created; restart Codex after applying. OpenCode and DeepSeek are always read-only, and no extension is uninstalled or deleted. The legacy extension write endpoint is disabled; /extension-conflicts is a compatibility alias for the unified Dashboard.

First backup

opencode-sync init          # detect your workspace
opencode-sync push "init"   # first backup

From source instead? git clone https://github.com/severin-ye/uagent-sync && cd uagent-sync && npm install && npm run build, then use node dist/cli.js <cmd>.

New machine? opencode-sync init --init-type sync --github-url <url> then opencode-sync pull.


Codex Support

uagent-sync is also a Codex plugin (skills + hooks, no MCP): the same CLI and the same skills are shared across both agents.

Install (Codex CLI)

codex plugin marketplace add severin-ye/uagent-sync
# Then open /plugins in the Codex CLI, install uagent-sync, and start a new session.

Install (ChatGPT desktop app / Codex desktop app)

  1. Open PluginsPersonal → add the marketplace source https://github.com/severin-ye/uagent-sync
  2. Install uagent-sync and start a new session

What you get after installing

  • 3 skills: uagent-sync-backup (backup workflow), uagent-sync-restore (new-device restore), uagent-sync-update (ecosystem update) — loaded on demand, guiding the agent to use the CLI
  • SessionStart hook: injects CLI usage hints at session start (PLUGIN_ROOT resolves the plugin root; on Windows it goes through a Git-bash wrapper)
  • CLI (the single execution channel): node <plugin>/dist/cli.js <command> — 18 commands shared with the opencode plugin

How it works

uagent-sync/
├── .codex-plugin/plugin.json   # Codex plugin manifest (skills + hooks, mcpServers slot reserved)
├── hooks/                      # hooks-codex.json + run-hook.cmd + session-start
├── skills/                     # 3 SKILL.md files — shared by opencode and Codex
├── src/plugin.ts               # opencode plugin (config hook auto-registers the skills dir)
├── packages/dsh/               # DeepSeek Harness bundle (16 sync_* tools → CLI bridge)
└── src/cli.ts                  # 18-command CLI — the single execution channel for all three

DeepSeek Harness Support

uagent-sync ships as a DeepSeek Harness bundle (packages/dsh/): 16 sync_* tools bridged to the same CLI. 中文名:U同步 / 优同步

Install

# From npm (recommended — uagent-sync-dsh depends on uagent-sync, so the CLI ships along)
dsh plugin --profile <name> add uagent-sync-dsh

# From GitHub (monorepo sub-package, pure JS — no build authorization needed):
dsh plugin --profile <name> add "github:severin-ye/uagent-sync#master&path:packages/dsh"

# Or from a local checkout (auto-discovers dist/cli.js):
dsh plugin --profile <name> add ./packages/dsh

The plugin locates the CLI in this order: cordis.yml config.cliPath → env OPENCODE_SYNC_UAGENT_SYNC_CLI → local-checkout relative path → npm dependency uagent-sync/dist/cli.js → workspace recursion (walk up to .gitmodules, then find uagent-sync/dist/cli.js). Details: packages/dsh/README.md.

DeepSeek Harness is currently Developer Preview; see the plugin docs for the current bundle/patch format.


Workspace Root Resolution

Every node dist/cli.js * command needs to know the workspace root (the directory containing .gitmodules). Resolution order:

  1. Env var OPENCODE_SYNC_WORKSPACE_ROOT=<path> (explicit, highest priority)
  2. Fixed cache ~/.config/opencode/sync-cache.json (reachable from any working directory)
  3. Legacy cache auto-migration (usync-dotfiles/state/sync-cache.json, written by v1.0.0)
  4. Walk up from the opencode process working directory looking for .gitmodules

Launching opencode from the desktop, home directory, or the OpenChamber default directory works fine — no need to start inside the workspace. If all four paths fail, the error message includes actionable guidance.


What It Syncs

Category What How
Submodules All repos, exact commit hash git clone + git reset --hard
OpenCode Config plugins, MCP servers, providers Deep-merge, never overwrite
Skills Installed skills from git sources skills add <source> -g
API Keys Names + descriptions (never values) Template file at keys/API.md — the keys/ directory is gitignored in usync-dotfiles, so real values only ever exist locally
Dependencies gh CLI, Ralph, Skills CLI Auto-install via winget/brew/apt/npm
Windows Fixes NTFS path issues Auto-detects problematic filenames, applies git config core.protectNTFS
Install Log Every install, its source, any pitfalls state/install-log.json — provenance you can trust

Multi-agent configuration console

Inspect Codex, OpenCode, and DeepSeek Harness configuration without changing it:

opencode-sync inventory --json
opencode-sync dashboard

The dashboard binds to 127.0.0.1 by default and prints the actual local URL. Phase 1 is read-only: it visualizes Skills, instructions, MCP declarations, hooks, plugins/tools, portability, and migration gaps. Secret values, sessions, memories, provider credentials, permissions, themes, shortcuts, UI state, and caches are excluded. DeepSeek MCP remains marked unverified until local evidence proves support.

🌐 Language (English / 中文)

Output defaults to English and can be switched to Chinese per run or persistently:

  • CLI: --lang zh flag, or UAGENT_SYNC_LANG=zh environment variable (system locale is the fallback, then English).
  • Dashboard: use the 中文 / EN toggle in the top bar — the choice is remembered in localStorage (uagent-lang).
  • Generated documents (SYNC-GUIDE.md, know-how files) follow the active language.
opencode-sync api-keys detect            # English by default
opencode-sync api-keys detect --lang zh  # Chinese
UAGENT_SYNC_LANG=zh opencode-sync guide  # Chinese guide

CLI (18 commands)

Run any command as node dist/cli.js <command> (or opencode-sync <command> after npm link).

Command What it does
init Detect workspace, guide first-time setup. Only asks once.
push Export state → commit → push to GitHub. One command.
pull Pull from GitHub → restore everything. One command.
export Export full workspace state as JSON
import Restore from JSON (with --dry-run preview)
diff Compare current state vs saved state
status Show every submodule: commit, branch, dirty?
verify Health check: gh, git, config, ralph, skills, submodules
setup Install everything: gh, submodules, config, ralph, skills CLI, skill packages
create-repo Create a private GitHub repo (warns if public)
api-keys Detect, template, or add API keys
guide Generate guide/SYNC-GUIDE.md — the restore playbook
log Read/write install provenance log
crystallize Record install + regenerate docs + export state + commit in one shot
update Update the agent ecosystem: plugins, skills, MCP tools, sync repo, config deps
changelog Draft categorized changelog from the latest update report
inventory Inspect Codex/OpenCode/DeepSeek Harness configuration (read-only, secrets excluded)
dashboard Start a local read-only configuration dashboard (127.0.0.1 by default)

The MCP-server form (v1.0.0) was removed — since v1.1.0 only the opencode plugin form and the standalone CLI exist. Tool/command names keep the opencode_sync_* / node dist/cli.js prefixes for compatibility.


Architecture

uagent-sync/                  # ← This repo (code only, never modified at runtime)
├── src/
│   ├── application/           # Shared verify/export/import/setup/update/push/pull use cases
│   ├── ports/                 # File system, Git, process, and Agent contracts
│   ├── adapters/              # Node/Git/process and Agent scanner implementations
│   ├── artifacts/             # Versioned WorkspaceState read codec and migrations
│   ├── entrypoints/           # Presentation-only formatters
│   ├── lib/                   # Existing domain implementation and compatibility modules
│   ├── sync.ts                # Public compatibility + architecture barrel
│   ├── plugin.ts              # OpenCode plugin entrypoint
│   └── cli.ts                 # Standalone 18-command entrypoint
├── skills/                    # 3 shared skills (opencode + Codex)
├── hooks/                     # Codex SessionStart hook
├── .codex-plugin/             # Codex plugin manifest + marketplace
├── test/                      # node:test suites (run `npm test`)
├── .github/workflows/         # CI + Release automation
├── CHANGELOG.md               # Keep a Changelog
├── RELEASING.md               # Release playbook
└── dist/                      # Compiled output

usync-dotfiles/             # ← Runtime data (separate repo, synced via Git)
├── state/                     # Runtime state files
├── guide/                     # Auto-generated docs
├── keys/                      # API key templates
├── config/                    # OpenCode config templates
├── sessions/                  # Chat history (from session-recorder plugin)
└── scripts/                   # Bootstrap scripts

Code never touches data. The plugin lives in one directory. All generated files go to usync-dotfiles/. Clean separation.

The implemented dependency direction is Entry → Application → Domain/Ports ← Adapters. WorkspaceState v3 is the validated in-memory read contract; current wire exports remain backward-compatible. DSH and all restore scopes fail closed because they do not yet have restore writers/contracts. See docs/ARCHITECTURE.md for concrete boundaries, Codex-only isolation, permanent codebase-memory-mcp deletion, and the runtime scanner extension boundary. A supported fourth Agent still requires explicit AgentId, paths, Dashboard, migration-context, and host-contract work.


Development

git clone https://github.com/severin-ye/uagent-sync
cd uagent-sync
npm install
npm run typecheck    # tsc --noEmit
npm run build        # TypeScript → dist/
npm test             # full node:test suite
npx playwright install chromium  # one-time browser setup
npm run test:e2e     # real dashboard browser workflow

CI gate (GitHub Actions, Windows, Node 20/22): build, unit tests, and the Playwright browser E2E must all pass before merge.


Release

See RELEASING.md. Flow: update CHANGELOG → npm run release:patch|minor|major (version + tag + push) → GitHub Actions builds, tests, and creates a Release with the tarball attached.


Security

  • Command injection hardened: shellEscape() wraps all user input before shell execution. Git commits use -F file input instead of -m string interpolation.
  • Path traversal guarded: isPathSafe() validates all file paths resolve within workspace root.
  • Zod schema enforced: Every input validated with .min(), .max(), .strict() before touching the filesystem.
  • Secrets never exported: Only environment variable names are recorded. Values stay on your machine.
  • Private repos by default: create_repo creates --private. Warns if existing repo is public.

Contributing

PRs welcome. Test-first: new features ship with tests, bug fixes ship with a failing-then-passing regression test. Check evaluation.xml for the test suite design.

🤖 For AI Agents: See AGENTS.md — a complete step-by-step guide that enables any AI agent to install, configure, and run full backup/sync workflows with zero additional prompts. Just point the agent at this repo.


License

MIT © 2026 uagent-sync contributors


简体中文 | English

上一个 Prev deepseek-desktop 下一个 Next dsh-undo