WorkBuddy 会话跨账号迁移(同机)
原理
换号后旧会话"消失"不是文件丢失,而是列表按账号过滤。
| 内容 | 位置 | 与账号的关系 |
|---|---|---|
| 会话正文 | ~/.workbuddy/projects/<cwd 编码>/<session-id>.jsonl |
无关,按工作区路径平铺 |
| 账号归属 | ~/.workbuddy/workbuddy.db → sessions.user_id |
唯一隔离点 |
| 进程态 | ~/.workbuddy/sessions/*.json(pid/endpoint) |
无关,运行态残留 |
| 长期记忆 | ~/.workbuddy/memory/<user_id>_memory.md |
按账号分文件,不随会话迁移 |
结论:只改 sessions.user_id 一列,不动任何 .jsonl。
步骤
所有操作走 scripts/migrate.py(默认只读)。
1. 识别源账号与目标账号
python scripts/migrate.py --list
判定规则:max(created_at) 最大且包含"刚刚创建"会话的那个是目标账号 B;其余为源账号 A。
不确定时,用最新会话的 created_at 对照当前时间确认,不要猜。
2. 备份(强制)
python scripts/migrate.py --backup
用 sqlite3.Connection.backup() 出一致快照。WAL 模式下直接复制 .db 文件会丢 -wal 里的数据,禁止用 cp 代替。
3. 迁移
python scripts/migrate.py --apply --from <A> --to <B>
脚本在写入前自动再备份一次。
4. 生效
必须完全退出 WorkBuddy(含托盘图标)后重启。运行中进程的会话列表是内存态,不重启看不到。
验证
重启后复查 --list:目标账号名下会话数 = 原 A + 原 B,且 distinct cwd 数与 ~/.workbuddy/projects/ 下目录数一致。
若仍是旧数字,说明运行中进程在退出时把内存态回写覆盖了。退出客户端后重跑一次 --apply 即可。
回滚
python scripts/migrate.py --rollback --backup-file <备份路径>
按备份中的 (id, user_id) 映射逐条还原,只改 user_id,不动主库其他数据和期间新增的会话。
边界(不做的事)
- 不迁移长期记忆:
~/.workbuddy/memory/<user_id>_memory.md按账号分离。用户要继承时另做,需明确确认。 - 不处理跨机器、跨版本、云端同步场景:那是
workbuddy-asset-migration/workbuddy-migration-assistant(推荐市场)的范围,走导出/导入包。本技能只解决同机同目录的账号归属。 - 不写
session_usage、edge_sync_mapping等表:这些按session_id组织,与账号无关。 - 客户端运行中写入有回写覆盖风险:优先让用户先退出客户端;用户选择在线写入时,把"可能需重跑一次"讲清楚。