#ClaudeCode #Syncthing #Windows #开发环境 #服务器运维

同一用户在 Mac、N100、Windows 三台设备上使用 Claude Code CLI,各自的 ~/.claude/ 完全独立,导致跨设备会话反复重建上下文、浪费 token。本文记录用 Syncthing 打通三端记忆层的完整方案,以及在会话中主动向同步体系注入信息的方法。


一、问题描述

Claude Code 的跨会话记忆存储在 ~/.claude/ 下,核心是各项目的 memory/ 目录:

1
2
3
4
5
6
7
8
9
~/.claude/
projects/
-Users-lin-Documents-MyBlog/
memory/
MEMORY.md ← 索引
project_homelab_infra.md ← 设备拓扑、服务配置
feedback_openclaw_*.md ← 排查经验
settings.json ← 全局设置
plugins/ ← 插件配置

问题:Mac 上积累的 OpenClaw 故障排查经验、设备 IP、SSH alias 等,在 Windows 上打开新会话时完全不可见,需要重新描述背景。


二、方案设计

两步走:

步骤一(即时生效):将高频重复的设备拓扑、服务配置、协作偏好写入项目 CLAUDE.md,通过 git commit 固化。Claude Code 每次打开项目时自动读取,无需依赖记忆文件。

步骤二(持续同步):在 N100 部署 Syncthing Docker 容器作为中继节点,实时同步三端 ~/.claude/,排除凭证、会话历史等机器私有文件。

架构:

1
2
3
MacBook (192.168.2.13)        N100 (192.168.2.14)         milin_desktop (192.168.2.10)
~/.claude/ ←→ /claude-sync/ (relay) ←→ C:\Users\milin\.claude\
Syncthing (brew 服务) Syncthing (Docker) Syncthing (winget,注册表自启)

N100 作为常驻中继,保证 Mac 和 Windows 不同时在线时也能完成同步。


三、步骤一:写入项目 CLAUDE.md

MyBlog/CLAUDE.md 中固化以下内容(不含敏感信息):

  • 家庭网络设备 IP 与 SSH alias 对照表

  • OpenClaw 活跃配置文件路径(data/openclaw.json)及热重载限制

  • llama-server 启动方式、端口、参数说明

  • 各 Docker 服务实际端口(通过 docker ps 确认)

  • 协作偏好(语言、commit 风格、注释原则)

关键点CLAUDE.md 在所有打开该项目的 Claude Code 会话中自动加载,无需每次手动说明背景,效果等同于系统提示前置。


四、步骤二:部署 Syncthing

4.1 N100(Docker 容器)

/home/milin/dockerfile/syncthing/docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services:
syncthing:
image: syncthing/syncthing:latest
container_name: syncthing
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
volumes:
- ./data:/var/syncthing
- ./claude-sync:/claude-sync
ports:
- "127.0.0.1:8384:8384" # Web UI(仅本机)
- "22000:22000/tcp"
- "22000:22000/udp"
- "21027:21027/udp"

启动:

1
2
cd /home/milin/dockerfile/syncthing
docker compose up -d

访问 Web UI(SSH 端口转发):

1
2
ssh -L 8384:127.0.0.1:8384 MyUbuntuLocal
# → http://localhost:8384

4.2 Mac(brew 服务)

1
2
3
brew install syncthing
brew services start syncthing
# Web UI: http://localhost:8384

4.3 milin_desktop(Windows,winget)

1
2
# SSH 到 Windows 执行
winget install --id Syncthing.Syncthing --source winget --silent

启动并注册开机自启(注册表 Run 键):

1
2
3
4
$ST = "C:\Users\milin\AppData\Local\Microsoft\WinGet\Packages\Syncthing.Syncthing_...\syncthing.exe"
Start-Process $ST -ArgumentList "--no-browser" -WindowStyle Hidden
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" `
-Name "Syncthing" -Value "`"$ST`" --no-browser"

4.4 三端配对

通过各端 Web UI(或 API)互相添加设备,共享同一个 folder(ID: claude-config):

设备 路径 Device ID(截断)
MacBook ~/.claude/ T6HFX5E-DLUZ3GZ-...
N100 /claude-sync/ HSBUDEO-GSTVQAW-...
milin_desktop C:\Users\milin\.claude\ XAQUD4K-OEMM7XQ-...

五、.stignore 排除规则

在各端 ~/.claude/.stignore 放置以下排除规则,防止凭证和机器私有文件扩散:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Auth(绝对不同步)
.credentials.json
.claude.json
auth

// 机器专属运行时
daemon
daemon.lock
daemon.log
daemon.status.json
.update.lock

// 本地缓存
cache
backups
paste-cache
statsig
telemetry
debug
file-history
shell-snapshots

// 会话历史
sessions
session-env
history.jsonl
ide

// 项目内 session 数据
projects/*/sessions
projects/*/sessions/**

// 机器专属设置和状态
jobs
tasks
settings.local.json

六、同步内容说明

同步(三端共享):

路径 内容
projects/*/memory/*.md 各项目 auto-memory 文件(设备拓扑、排查经验、项目规则)
settings.json 全局设置(主题、权限规则等)
plugins/ 插件配置和 marketplace 缓存
plans/todos/ 计划和待办列表

不同步(机器私有):

路径 原因
.credentials.json 各机器独立持有的 Anthropic API key
sessions/history.jsonl 当前 session 对话历史,体积大且无跨设备意义
cache/daemon* 运行时临时文件
settings.local.json 机器专属快捷键、本地路径配置
projects/*/sessions/ session 内消息记录

七、在会话中向同步体系注入信息

方式一:口头告知(最常用)

直接在会话中说「记住:xxxxx」,Claude Code 会写入当前项目的 memory 文件,Syncthing 在 30 秒内同步到其他设备。适合记录一次性发现的事实。

方式二:修改项目 CLAUDE.md

编辑 MyBlog/CLAUDE.md,适合写设备 IP、服务路径等不会变化的配置。该文件不依赖记忆系统,所有会话都能直接读取。

方式三:全局 CLAUDE.md

~/.claude/CLAUDE.md(若存在)对所有项目的所有会话生效,也会被 Syncthing 同步。适合写跨项目的用户偏好。

方式四:手动写 memory 文件

1
2
3
4
5
6
7
8
9
10
cat > ~/.claude/projects/-Users-lin-Documents-MyBlog/memory/my_note.md << 'EOF'
---
name: my-note
description: "一句话描述(用于检索时判断相关性)"
metadata:
type: project # user / feedback / reference / project
---

内容...
EOF

30 秒内自动同步到 N100 和 milin_desktop。


八、踩坑记录

初始 rsync 漏传 .credentials.json:rsync 排除规则写的是 .credentials/(目录),漏掉了同名 json 文件。已从 N100 删除,更新 .stignore 补全。

Syncthing sync-conflict 文件:首次同步时 Windows 端已有文件(settings.json.last-cleanup),Syncthing 生成了 conflict 文件。保留 Mac 版本,手动删除 conflict 文件即可。

npm install 失败(ENOTEMPTY):Claude Code daemon 持有 claude.exe 文件句柄,npm 无法重命名旧目录。解决方案:用 npm pack 下载 tarball 后 rsync 覆写,再补装 native optional dep(@anthropic-ai/claude-code-darwin-arm64)并运行 install.cjs

Windows Syncthing 启动需显式指定 home 目录:直接 syncthing --no-browser 不生成配置,需加 --home=C:\Users\milin\AppData\Local\Syncthing


延伸阅读