WorkBuddy 跨账号记忆迁移
换账号不丢记忆 —— 旧账号的记忆是本地文件,复制到新账号目录即可完整继承。
一、核心机制(先搞懂再动手)
WorkBuddy 的记忆分四层,只有一层跟账号绑定:
| 层级 | 存储位置 | 随账号变 | 说明 |
|---|---|---|---|
| 云端 Profile | 服务端(服务器生成) | ⚠️ 是 | 自动画像摘要,账号隔离 |
| 账号级记忆 | ~/.workbuddy/user-<账号UUID>[-personal]/ |
⚠️ 是(问题源) | MEMORY.md / USER.md / SOUL.md / IDENTITY.md |
| 全局每日日志 | ~/.workbuddy/skills/memory/ |
✅ 否 | 151+ 天工作日志,天然共享 |
| 工作区记忆 | <工作区>/.workbuddy/memory/ |
✅ 否 | 按项目目录,跨账号通用 |
为什么换账号会「失忆」
~/.workbuddy/user-91ba7631-35ff-4c7e-9818-19ebf5f40503-personal/
├── MEMORY.md 44.8 KB / 266 行 ← 偏好、工程铁律、项目约定全在这
├── USER.md 5.3 KB
├── SOUL.md 1.8 KB
├── IDENTITY.md 3.3 KB
└── workspace-state.json
91ba7631-... 就是当前账号的 UUID。换账号登录 → 生成全新 UUID 目录 → 新账号读不到上面这个目录 → 表现为「记忆空白」。
关键结论:这四个文件是本地纯文本,不是云端数据。直接复制过去,新账号即刻完整继承,一个选点都不用重整。
两个易踩的坑
- 必须 ⌘Q 完全退出 WorkBuddy 再打开。 记忆只在启动时加载,关窗口不生效。
~/.workbuddy/memory是符号链接,真实路径在~/.workbuddy/skills/memory/。打包/备份时要用tar -h解引用,否则只会打包出一个链接本身(实测踩过:151 个文件只出 375 字节)。- 账号目录有两种命名,都算账号:
user-<UUID>-personal(较早版本)和user-<UUID>(较新版本,没有-personal后缀)。只匹配user-*-personal会漏掉新版账号——实测就踩过:明明两个账号,--check只报出一个,误以为「还没换过账号」。本技能 1.1.0 起两种都识别。
二、命令
技能自带 scripts/migrate_memory.py,三段式:体检 → 预演 → 执行。
SKILL="~/NAS/onedrive/1-同步文件夹/龙虾技能库/技能/workbuddy-memory-migration"
# 1) 体检:看看有几个账号目录、记忆分布如何
python3 "$SKILL/scripts/migrate_memory.py" --check
# 2) 预演:默认模式,列出将要做的每一步,不动文件
python3 "$SKILL/scripts/migrate_memory.py"
# 3) 执行:真正迁移
python3 "$SKILL/scripts/migrate_memory.py" --apply
# 附:输出 JSON 报告,便于程序化调用
python3 "$SKILL/scripts/migrate_memory.py" --apply --json
# 指定记忆源(默认自动选 MEMORY.md 最大的账号)
python3 "$SKILL/scripts/migrate_memory.py" --apply --source ~/.workbuddy/user-xxx-personal
脚本行为
- 扫描
~/.workbuddy/下所有user-*目录(-personal后缀可有可无,两种都识别) - 自动挑选 MEMORY.md 字节数最大的目录作为记忆源
- 把源的四个记忆文件复制到其余所有账号目录
- 目标目录原内容先备份到
~/.workbuddy/_记忆迁移备份/<目录名>_<时间戳>/ - 合并
workspace-state.json的onboardingCompletedAt→ 新账号跳过新手引导
(注意:目标账号必然自带一份 state,所以要「合并」而非「缺失才复制」) - 归档目标账号的
BOOTSTRAP.md→ 备份目录.migrated,避免每次启动都追问身份 - 若目标账号没有
memory/目录,建立软链 →~/.workbuddy/skills/memory,共享全部每日工作日志
> ⚠️ 源与目标体积接近时请显式 --source:「选最大」在两账号内容几乎相同时会翻向(可能把新账号当源反向覆盖旧账号)。迁移完再跑一次尤其如此——此时用 --source 指明谁是「真源」。
- 全程只复制不删除,原账号目录原样保留,随时可切回
三、完整操作流程(给用户的标准动作)
- 用新账号登录 WorkBuddy,打开一次对话
(必须触发新账号 UUID 目录的创建,否则脚本找不到目标) - 执行
python3 scripts/migrate_memory.py --apply - ⌘Q 完全退出 WorkBuddy → 重新打开
- 在新账号对话里验证:
读一下你的 MEMORY.md,告诉我我有哪些工程铁律?
正确回答应包含核心规则(桌面禁写文件 / 改工程前四项诊断 / 禁自造截图验证 / 废纸篓而非 rm 等)。
答不上来 → 迁移未生效,检查是否真的 ⌘Q 重启过。
四、故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 脚本报「没有找到任何 user-* 目录」 | 新账号还没创建目录 | 先用新账号打开一次对话,再跑脚本 |
--check 只报 1 个账号,但明明登录过两个 |
旧版只匹配 user-*-personal,漏掉无后缀的新版目录 |
升级到 1.1.0+,或手工 ls -d ~/.workbuddy/user-* 核对 |
| 迁移后新账号仍无记忆 | 没重启,或只关了窗口 | ⌘Q 完全退出后重开 |
| 重开后仍在问「你叫什么名字」 | BOOTSTRAP.md 没归档 / 引导状态没合并 |
1.1.0+ 会自动归档 BOOTSTRAP.md 并合并 onboardingCompletedAt |
| 备份是空的(只有几百字节) | 打包时没解引用软链 | 用 tar czfh 而不是 tar czf |
memory/ 软链没建成 |
~/.workbuddy/skills/memory 不存在 |
手动 ln -s ~/.workbuddy/skills/memory <目标>/memory |
| 目标目录里内容是旧的 | 迁移后没再执行 | 重跑脚本(会先备份再覆盖) |
五、长期方案:账号无关的第二大脑
频繁切账号、或需在 Mac / Windows 间共享记忆时,本机已预装两个相关技能:
方案 A:persistent-memory(本地 SQLite + 向量检索,天然跨账号)
- 路径:
~/.workbuddy/skills/persistent-memory/ - 数据库:
~/.workbuddy/skills/.memory/memory.db - 关键优势:DB 在
skills/目录内,不在账号目录里 → 换账号自动继承 - 命令:
pmem add "..."/pmem search "关键词" --limit 8/pmem stats
方案 B:multidevice-memory-sync(Mem9 云端双向同步)
- 路径:
~/.workbuddy/skills/multidevice-memory-sync/ - 能力:本地 ↔ Mem9 云端双向同步,跨设备跨账号
- 现状:未配置(缺
~/.workbuddy/mem9_sync_config.json与 API Key) - 部署:
scripts/install_mem9_sync.sh
长期分工建议
- 硬性规则、偏好、约定 → 放 MEMORY.md(走本技能迁移)
- 历史事实、可检索内容 → 放 persistent-memory(自动跨账号)
两者互补,切换账号时零重复整理。
六、参考
references/机制详解.md— 目录结构、账号 UUID 机制、软链陷阱的完整技术细节references/验证清单.md— 迁移前后的验证步骤与期望输出