用 rclone 双向同步会话与配置到多台机器
29.8/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Rosa42/dsh-sync该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 37 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 22 处,展示前 20 条)
- 执行外部命令来自配置/变量index.js:179
execFile( - 读取本地文件index.js:291
return normalizeSettings(JSON.parse(await readFile(settingsPath(), 'utf8'))) - 写入本地文件index.js:299
await mkdir(workDir, { recursive: true }) - 写入本地文件index.js:300
await writeFile(settingsPath(), `${JSON.stringify(settings, null, 2)}\n`, 'utf8') - 读取本地文件index.js:332
if (await readFile(filtersPath(), 'utf8') === body) return - 写入本地文件index.js:336
await mkdir(workDir, { recursive: true }) - 写入本地文件index.js:337
await writeFile(filtersPath(), body, 'utf8') - 读取本地文件index.js:358
const names = (await readdir(logsDir())).filter(name => name.endsWith('.log')).sort() - 读取本地文件index.js:362
const info = await stat(full) - 读取本地文件index.js:363
return { name, at: info.mtime.toISOString(), tail: (await readFile(full, 'utf8')).slice(-6000) } - 读取本地文件index.js:375
entries = await readdir(root, { withFileTypes: true }) - 写入本地文件index.js:547
await mkdir(logsDir(), { recursive: true }) - 写入本地文件index.js:549
await appendFile(join(logsDir(), `ui-${stamp.slice(0, 10)}.log`), `# ${stamp} action=${action} target=${target}\n${output}\n`) - 删除本地文件递归index.js:695
await rm(sandbox, { recursive: true, force: true }) - 发起网络请求client.js:382
const response = await fetch('api/dsh-sync.state'); - 发起网络请求client.js:424
const response = await fetch('api/dsh-sync.probe', { - 发起网络请求client.js:451
const response = await fetch('api/dsh-sync.settings', { - 发起网络请求client.js:475
const response = await fetch('api/dsh-sync.settings', { - 发起网络请求client.js:500
const response = await fetch('api/dsh-sync.remote', { - 发起网络请求client.js:532
const response = await fetch('api/dsh-sync.run', {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- rclone双向同步会话
- 同步配置档
- WebDAV引导式设置
DeepSeek Harness 插件:用 rclone bisync 在多台机器间同步会话和配置档配置,同步范围可配置,并提供 WebDAV 引导式设置。
README
由 DeepSeek 最新模型翻译生成dsh-sync
一个 DeepSeek Harness 插件,它添加了一个 设置 → 同步 页面,用于将一台机器的 DSH 主目录(~/.dsh)迁移到其他机器:会话日志和配置文件,通过任意 rclone 远程进行双向同步。
它封装了 rclone bisync,因此以下操作都无需手动完成:编辑 rclone 过滤文件、记住 --resync 的初始化顺序,或交互式运行 rclone config。
该页面的功能
| 区域 | 用途 |
| 当前状态 | rclone 是否已安装、解析出的本地目录和工作目录、生成的规则文件、上次运行情况,以及存在多少个冲突副本 |
| 同步目标 | 从 rclone listremotes 中选择的云远程,加上子路径,组合为 remote:subpath |
| 同步范围 | 针对各机器之间传输内容的逐项开关、额外排除规则、比较模式、冲突处理、删除上限 |
| 配置云存储 | 非交互式创建 WebDAV 远程,并带有坚果云(Nutstore)预设 |
| 操作 | 预览更改(--dry-run)、立即同步、首次初始化(--resync) |
| 运行输出 | 完整的 rclone 输出,同时追加到 logs/ui-.log |
| 冲突副本 | 留下的每个 .conflictN 文件,以便手动合并 |
安装
展开完整文档(README 剩余 1 节)
dsh-sync
一个 DeepSeek Harness 插件,它添加了一个 设置 → 同步 页面,用于将一台机器的 DSH 主目录(~/.dsh)迁移到其他机器:会话日志和配置文件,通过任意 rclone 远程进行双向同步。
它封装了 rclone bisync,因此以下操作都无需手动完成:编辑 rclone 过滤文件、记住 --resync 的初始化顺序,或交互式运行 rclone config。
该页面的功能
| 区域 | 用途 |
| 当前状态 | rclone 是否已安装、解析出的本地目录和工作目录、生成的规则文件、上次运行情况,以及存在多少个冲突副本 |
| 同步目标 | 从 rclone listremotes 中选择的云远程,加上子路径,组合为 remote:subpath |
| 同步范围 | 针对各机器之间传输内容的逐项开关、额外排除规则、比较模式、冲突处理、删除上限 |
| 配置云存储 | 非交互式创建 WebDAV 远程,并带有坚果云(Nutstore)预设 |
| 操作 | 预览更改(--dry-run)、立即同步、首次初始化(--resync) |
| 运行输出 | 完整的 rclone 输出,同时追加到 logs/ui-.log |
| 冲突副本 | 留下的每个 .conflictN 文件,以便手动合并 |
安装
该插件是一个普通的 DSH bundle。在磁盘上的任意位置编写或解压它,然后将其安装到某个 profile 中:
plugin_manager install_bundle target:
安装会将该目录链接到 profile 中并启用该 bundle。之后请重启 dsh web 服务器:Cordis 加载器会缓存它为某个条目解析出的模块路径,因此被替换或移动的插件会继续运行上一代 JavaScript 模块,直到进程重启。更改目录或行 id 并不能绕过该缓存。
配置
设置位于 /settings.json,由页面写入。它们是一个普通的 JSON 文档:
{
"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
}
加载器行的 config 会预置两个路径,在找到设置文件之前必须先知道它们:
- 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
为什么设置不是 Config schema 在配置文件之外安装的 bundle 无法解析 @deepseek-ai/schemastery,因此无法导出 harness 所期望的经过验证的 Config schema。设置文件取代了它,而页面就是编辑界面。从配置文件内部安装此 bundle 的部署可以切换到由 schema 支持的 Config,而无需更改路由契约。
同步范围
每个切片映射到当该切片被禁用时发出的 rclone 过滤规则:
| 键 | 内容 | 默认值 |
| sessions | sessions/ — 每个会话一个仅追加日志 | 开启 |
| attachments | attachments/ — 会话引用的图片和文件 | 开启 |
| profiles | profiles/ — bundle、补丁层、锁文件 | 开启 |
| homeConfig | 主目录根下的 cordis.patch.yml、AGENTS.md | 开启 |
| credentials | .credentials.yaml、.env — 明文 API 密钥 | 关闭 |
| workspaceState | storages/ — 侧边栏分组和派生缓存 | 关闭 |
| providerCache | llm-deepseek/ — 会过期的供应商上传记录 | 关闭 |
| pluginModules | node_modules/ — 平台特定的二进制文件和绝对链接 | 关闭 |
/.anonymous-user-id、session.lock 和 .tmp 始终被排除。
规则文件是生成的;手动编辑它没有任何效果,因为下一次状态读取会根据设置重写它。更改设置还会使 bisync 记住的过滤哈希失效,这就是页面在每次运行前重新生成它的原因。
Nutstore(坚果云)和其他 WebDAV 服务器
页面通过 rclone obscure 后接 rclone config create 来创建远程,因此永远不需要交互式的 rclone config 流程。
对于 Nutstore:URL 为 https://dav.jianguoyun.com/dav/,供应商为 other,并使用在账户信息 → 安全选项 → 添加应用密码下生成的应用密码。登录密码无法通过 WebDAV 使用。
纯 WebDAV 的两个特性对 bisync 很重要:
- 修改时间。 rclone 仅为 Fastmail Files、ownCloud 和 Nextcloud 报告修改时间。在纯 WebDAV 服务器上,远程副本的修改时间是上传时间,这可能会让 bisync 看到虚假的更改。从默认的 size,modtime 开始;如果预览在原本空闲的目录树上列出了大量更改,请将更改比较切换为 size。
- 哈希。 纯 WebDAV 不报告任何哈希,因此校验和比较需要下载每个文件。它被有意不提供为比较模式。
密码作为进程参数传递给 rclone obscure,因此它会短暂地出现在本地进程列表中。它永远不会写入设置文件或日志,并且混淆后的值会从返回给浏览器的所有内容中隐去。
播种顺序
--resync 使两侧都成为超集:仅存在于一侧的文件始终会保留。只有同时存在于两侧且内容不同的文件才需要选出胜者,由 resync 模式决定。
1. 在保存最完整状态的机器上,以胜出方 path1(本地胜出)运行 首次播种。远端为空,因此不会丢失任何内容。
2. 在其他每台机器上,以胜出方 path2(远端胜出)运行 首次播种。该机器上独有的会话会被上传,其同名配置文件会被云端副本替换——这正是“保持各机器一致”的含义。
3. 之后使用 立即同步。--resync 仅用于首次配对、规则文件变更或从失败运行中恢复;日常使用它会让已删除的文件重新出现。
先用 预览变更 预览每次播种。
操作约束
- 不要在两台机器上继续同一个会话。 会话日志是仅追加的;两个写入方会产生分歧,同步只能留下一个冲突副本。
- 保持各机器上的项目路径一致。 会话头会记录其创建时的绝对 cwd,侧边栏按该路径对会话分组。复制到没有该路径的机器上的会话,会被归组到一个在该机器上不存在的工作区路径下。
- 主机侧编辑需要重启服务器——参见安装。
路由
这四个都是 /api/ 下的精确 Fetch 路由,因此 Connection 会应用其 Host/Origin 检查以及浏览器身份验证。浏览器以文档相对方式访问它们,不带前导斜杠。
| 路由 | 方法 | 请求体 | 返回 |
| /api/dsh-sync.state | GET | — | 设置、同步范围目录、rclone 状态、上次运行、冲突 |
| /api/dsh-sync.settings | POST | 部分设置 | { ok, settings } |
| /api/dsh-sync.remote | POST | { name, url, user, pass, vendor } | { ok, remote, output } |
| /api/dsh-sync.run | POST | { action, target, resyncMode } | { ok, exitCode, output } |
action 为 preview、sync 或 seed。
开发
没有构建步骤:Host 部分是纯 ESM,Client 部分是纯 JavaScript 的模块加载器工厂。
node --check index.js && node --check client.js # 语法
npm test # 下面的两个测试套件
test/host-routes.mjs 构建一个桩 Context,其 connection.fetch.register 会记录路由,用重定向到临时目录的两个路径调用 apply(ctx, { localRoot, workDir }),然后用真实的 Request 调用每个路由并断言结果。它从不接触真实的 DSH 主目录。
test/dictionaries.mjs 读取 client.js,检查两个字典定义了相同的键、每个 t('...') 调用都能解析,以及间接引用的 ITEM_TEXT 键存在。
两个测试套件都不需要运行中的服务器或已安装的 rclone:依赖 rclone 的断言覆盖的是在任何进程被启动之前触发的防护。
许可证
MIT——参见 LICENSE。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Rosa42/dsh-sync
用 rclone 双向同步会话与配置到多台机器
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,489已汉化DSH
73.1
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,918已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,453已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
Download DS Bot for Windows 10/11 64-bit / 下载 Windows…
★ 5,293已汉化DSH
71.2
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,797已汉化DSH
71.1
这是你的仓库?认领条目