Rosa42/dsh-sync ↗★ 0

@local/dsh-sync

DeepSeek Harness plugin: a Settings page that syncs the DSH home directory across machines with rclone bisync, with a configurable sync scope and guided cloud-remote setup. 适合需要在多台设备间同步会话、配置和附件的多机用户。

Package
@local/dsh-sync
Compatibility
Unverified
Version
2.0.0
License
MIT
Last updated
Sep 27, 2026

Install

$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.