Claude Code 记忆同步进阶——canonical 软链、白名单 .stignore 与跨工作区 skill
#ClaudeCode #Syncthing #开发环境 #服务器运维
上一篇用 Syncthing 打通了三端
~/.claude/,但直接同步各工作区的memory/目录会遇到一个坑:不同设备的工作区路径编码不一样。本文记录把记忆层重构成 canonical_shared/+ 软链、把.stignore从黑名单改成白名单,并新增两个跨工作区 skill 与记忆治理约定的过程——一次完整的"开发环境梳理"。
一、上一版留下的坑:per-encoding 路径错位
Claude Code 把每个工作区的记忆存在 projects/<路径编码>/memory/ 下,而路径编码含绝对路径:
-
Mac:
projects/-Users-lin-infra/memory/ -
Windows:
projects/C--Users-milin-infra/memory/
同一个 ~/infra 工作区,两台机器编码不同。若直接同步 projects/*/memory,两端各写各的目录,记忆根本对不上,同步等于白做。
二、方案:canonical _shared/ + 软链/junction
把真实记忆文件收敛到一个与设备无关的规范目录,各工作区的 memory 只做符号链接指过去:
1 | ~/.claude/projects/ |
只同步 _shared/**(真实文件),软链本身不同步。这样绕开了路径编码差异——两端各自的软链指向本地同一个 canonical 目录,内容天然一致。
验证是否落到 canonical:
1 | readlink -f ~/.claude/projects/-Users-lin-infra/memory |
三、.stignore 从黑名单改白名单
上一版是黑名单(逐条排除凭证/缓存),隐患是:将来任何新文件(含新凭据)默认会被同步出去。改成白名单(默认拒绝,! 显式放行)后,新文件默认不出本机,要共享才主动加行:
1 | // WHITELIST 模式:最后一行 * 之前,没被 ! 放行的一切都不同步 |
安全姿态从"记得排除敏感文件"变成"默认什么都不外泄",更符合最小权限。
四、自检:回执标记验证双向同步
在 canonical 目录放一份 SYNC-CHECK.md,任一设备的 ~/infra 会话跑一段验证 prompt,核对软链落点并追加一行回执:
1 | ## 回执标记 |
判定:memory 解析到 _shared 且能看到另一台设备之前追加的回执行 = 双向同步成功。看不到 → 查 .stignore md5 是否一致、junction 是否建、Syncthing 是否在跑。
五、新增同步产物:跨工作区 skill
个人 skill(~/.claude/skills/)在任意工作区的会话都可见,很适合放"跨项目的做事规范"。把 skills/ 也纳入白名单后,两个 skill 随记忆一起跨设备:
blog-post——解决"大多数写博客的会话不在博客工作区里"的问题。博客的写作流程与脱敏规则原本写在博客仓库 CLAUDE.md,只有在博客工作区才自动加载。该 skill 让任意会话在落盘博文前,先读当前设备博客 CLAUDE.md 的权威规则,并内联硬性脱敏底线(Key/Token/账号绝不写),读不到就停手。
memory-audit——记忆多了会有错的/过期的/重复的。该 skill 按四类信号打分:可证伪(point 到的文件/服务/端口去实时核对)、重复(与 CLAUDE.md 或其它记忆重叠)、出处/置信(是否单次推断)、过期(lastConfirmed 超阈值),输出 KEEP/FIX/MERGE/DELETE 清单,确认后清理。注意:本系统没有记忆调用计数,所以不假装能测"使用频率",用置信+重复+可证伪当代理指标。
六、记忆治理约定
-
frontmatter 加两个字段:
source(出处,排信任度用)、lastConfirmed(上次真正复核日期)。 -
诚实红线:不给没核对过的记忆乱盖当天
lastConfirmed——那等于谎报已验证。 -
清理示例:一条"运维只给内联命令、不建 .sh"的偏好,因语义已被工作区
CLAUDE.md的"不新建抽象"覆盖(记忆准则:不记 repo/CLAUDE.md 已有的),判为重复直接删。
延伸阅读
-
《Claude Code 多设备记忆同步——Syncthing 方案实录》(本文的上一篇,三端 Syncthing 打通)
-
《milin_desktop v2rayA 点启动弹错——孤儿 core 占端口排查》(同一轮开发环境梳理里的代理维护)
