Rosa42/dsh-sync ↗★ 0

@local/dsh-sync

通过rclone在多台机器间同步DSH主目录 适合需要在多台设备间同步会话、配置和附件的多机用户。

包名
@local/dsh-sync
兼容性
待验证
版本
2.0.0
许可证
MIT
最近更新
2026年9月27日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Rosa42/dsh-sync

Configuration

Settings live in /settings.json and are written by the page. They are a plain JSON document:

{
  "version": 1,
  "target": "nutstore:dsh",
  "sync": {
    "sessions": true,
    "attachments": true,
    "profiles": true,
    "homeConfig": true,
    "credentials": false,
    "workspaceState": false,
    "providerCache": false,
    "pluginModules": false
  },
  "extraExcludes": [],
  "compare": "size,modtime",
  "conflictResolve": "none",
  "maxDelete": 10
}

The loader row's config seeds the two paths that must be known before the settings file can be found:

- id: dsh-sync
  name: '@local/dsh-sync'
  config:
    localRoot: /home/me/.dsh   # default: $DSH_HOME, then ~/.dsh
    workDir: /home/me/.dsh-sync # default: ~/.dsh-sync

Why settings are not a Config schema

A bundle installed outside a profile cannot resolve @deepseek-ai/schemastery, so it cannot export the validated Config schema the harness expects. The settings file replaces it and the page is the editing surface. A deployment that installs this bundle from inside a profile can switch to a schema-backed Config without changing the route contract.

Sync scope

Each slice maps to rclone filter rules emitted when the slice is disabled:

KeyContentDefault
sessionssessions/** — one append-only log per sessionon
attachmentsattachments/** — images and files a session referenceson
profilesprofiles/** — bundles, patch layers, lockfileson
homeConfigcordis.patch.yml, AGENTS.md at the home rooton
credentials.credentials.yaml, .env — plaintext API keysoff
workspaceStatestorages/** — sidebar grouping and derived cachesoff
providerCachellm-deepseek/** — expiring vendor upload recordsoff
pluginModulesnode_modules/** — platform-specific binaries and absolute linksoff

/.anonymous-user-id, session.lock, and *.tmp are always excluded.

The rules file is generated; editing it by hand has no effect, because the next state read rewrites it from the settings. Changing settings also invalidates bisync's remembered filter hash, which is why the page regenerates it before every run.