WorkBuddy会话搬迁-随风 (ym-workbuddy-session-migrate)
让一个账号下的对话,出现在另一个账号名下,并且能用目标账号原生接着聊——
上下文完整、不用重新交代前情。对话原文一个字都不动,只改「这条对话属于谁」。
何时使用
- 用户有个人版 + 企业版两个账号,切换后看不到另一边的对话
- 用户说「我想接着企业版那个记录继续聊」「换个账号怎么找回之前的对话」
- 用户要把某个账号的对话归拢到主账号,避免记录分散
- 用户要清理/停用某个账号,但想保留其中的对话
不适用:想看某条对话的内容(直接读 jsonl 或导出即可);想跨设备同步(本技能只操作本机)。
关键前提(必须让用户知道)
执行搬迁时 WorkBuddy 客户端必须关闭,而 Agent 活在客户端进程里——客户端一关,Agent 就停了。
所以绝不能由 Agent 直接执行搬迁。正确做法是生成一个双击运行的启动器:
双击 .bat 启动的是 explorer.exe 的子进程,不在客户端进程树里,
因此「关闭客户端 → 改库 → 重新启动客户端」这条链能在 Agent 停止后继续跑完。
第 0 步 · 版本自检
python scripts/sync.py
退出码:0 最新 · 10 有新版 · 20 主版本不同须重装 · 30 联网失败按旧版继续 · 1 出错。
只读比对,不下载、不改写技能自身文件。
使用流程
1. 预检(只读,先确认环境兼容)
python scripts/migrate.py check
会验证 ~/.workbuddy/workbuddy.db 存在、sessions 表具备必需字段
(id / user_id / cwd / deleted_at / created_at / updated_at)。
字段缺失会直接拒绝运行——跨版本盲写会把别人的数据写坏。
2. 看本机有哪些账号
python scripts/migrate.py accounts
会列出每个账号的:会话数、时间范围、最近 3 条会话标题。
拼 user_id 认不出谁是谁,靠标题才能让用户对上号。账号类型由
~/.workbuddy/user-<uuid>-<后缀> 目录名推断,后缀 personal 即个人版。
3. 生成启动器(交给用户双击)
python scripts/make_launcher.py --out <输出目录>
自动探测并写入:Python 解释器(优先 WorkBuddy 自带)、WorkBuddy.exe
(常见安装路径 → 注册表 → 运行中进程,三级回退),不写死任何绝对路径。
产物是自包含文件夹,可整个拷给别人:
<输出目录>/一键搬迁会话.bat
<输出目录>/migrate.py
然后让用户双击那个 bat。 Agent 的工作到此为止,剩下的由 bat 完成。
4. 用户双击后会发生什么
- 显示说明 →
check预检 stage1:选源账号 → 选目标账号 → 勾选会话 → 确认
(这一步不关客户端,中途取消不会有任何损失)stage2:自动关客户端 → 备份 → 改user_id→ 校验 → 重启客户端
原理(已实测验证)
- 对话原文存放在
~/.workbuddy/projects/<cwd编码>/<sessionId>.jsonl,
文件内容不含任何账号标识字段 - 归属只由
workbuddy.db的sessions.user_id一个字段决定 - 因此改
user_id即可让目标账号看到并续聊,原文零改动
更细的机制与验证过程见 references/design.md。
安全约束(本技能已内建)
| 约束 | 实现 |
|---|---|
| 默认不写库 | 所有写操作必须显式 --yes |
| 写前必备份 | sqlite3 backup API 做一致性快照,非文件拷贝 |
| 客户端在跑就拒绝 | 写库前查进程,避免改动被内存状态覆盖 |
| 改完立即校验 | 回查「仍不属于目标账号的条数」,非 0 返回非 0 |
| 随时可回滚 | backups 列表 + restore <文件名> --yes |
| 原文缺失不硬搬 | 自动跳过没有 jsonl 的会话,避免搬完却续不上 |
本技能会做什么、不会做什么(作用范围)
会终止的进程:仅 WorkBuddy.exe,按进程名精确匹配,不使用通配符,
不触碰任何其他进程。这是写库前的必要前置步骤——客户端运行中改库会被其内存
状态覆盖回去。触发时机已被压缩到最后一步:用户在选择阶段(stage1)随时可以
取消,取消时不会关闭客户端,数据零改动。
不会做的事:
| 项目 | 说明 |
|---|---|
| 不改对话原文 | projects/**/*.jsonl 只读,全程不写入 |
| 不删任何文件 | 备份是新增文件,没有删除动作 |
| 不改工作区路径 | 只回滚过一版错误的批量改写,现已移除该能力 |
| 不上传任何数据 | 纯本地操作,无网络请求(sync.py 自检除外,且只发技能名) |
| 不碰其他进程 | 进程操作只针对 WorkBuddy.exe |
会写入的只有两处:sessions.user_id 字段;以及 backups/ 下的备份文件。
两个必须提前讲清的预期
一、搬完要打开对应工作区才能看到。
WorkBuddy 的会话列表只显示「当前打开的工作区」。搬迁改变的是归属,
不会把对话搬到用户当前的工作区。执行完 bat 会打印出这些会话所属的完整目录清单,
照着用「打开文件夹」切过去即可,不需要再切账号。
二、只在本机有效。
记录存在本地磁盘,不跨设备同步,换电脑或重装客户端后即失效。
重要对话建议定期导出归档。
常见问题
「搬完看不到」 → 九成是没切工作区,先按上面打印的目录逐个打开。
「预检报字段缺失」 → 客户端版本差异,本工具会拒绝运行,不要绕过。
「提示客户端正在运行」 → 完全退出,包括托盘图标,再重试。
「原文缺失」 → 该会话的 jsonl 已被清理,改归属也续不上,工具会自动跳过。
关于「路径正斜杠 / 反斜杠不统一要不要修」:不要修。
客户端写入与查询两侧各自做路径规范化,两种写法并存属正常状态,
不影响显示与续聊。可用 migrate.py check-path 只读确认,切勿批量改写。