WorkBuddy 账号迁移
WorkBuddy 的会话归属由 ~/.workbuddy/workbuddy.db 的 sessions.user_id 字段决定。切换账号后,旧账号的会话在新账号 UI 中不可见。本 skill 通过修改数据库归属字段实现迁移。
迁移流程
第 1 步:识别当前账号 UID
从最新启动日志读取 accountUid 字段:
grep -oE 'accountUid=[a-f0-9-]{36}' ~/.workbuddy/logs/AppStartup.log | tail -1 | cut -d= -f2
此值即当前登录账号的 UID,作为迁移目标。
第 2 步:查询旧账号 UID 及会话分布
sqlite3 ~/.workbuddy/workbuddy.db \
"SELECT user_id, COUNT(*) as cnt,
datetime(MIN(created_at)/1000,'unixepoch','localtime') as earliest,
datetime(MAX(created_at)/1000,'unixepoch','localtime') as latest
FROM sessions WHERE deleted_at IS NULL GROUP BY user_id ORDER BY cnt DESC;"
输出会列出所有账号及其会话数。排除当前账号 UID 后,其余即为待迁移的旧账号。若有多个旧账号,向用户确认迁移哪一个(或全部)。
第 3 步:备份数据库(必做)
cp ~/.workbuddy/workbuddy.db ~/.workbuddy/workbuddy.db.bak-$(date +%Y%m%d-%H%M)
第 4 步:询问是否同时迁移自动化任务
主动询问用户是否要同时迁移 automations 表(定时任务)。automations 有独立的 owner_user_id 字段,与 sessions 分开迁移。
查询 automations 归属分布供用户决策:
sqlite3 ~/.workbuddy/workbuddy.db \
"SELECT owner_user_id, COUNT(*) as cnt,
SUM(CASE WHEN deleted_at IS NULL THEN 1 ELSE 0 END) as active,
SUM(CASE WHEN deleted_at IS NOT NULL THEN 1 ELSE 0 END) as deleted
FROM automations GROUP BY owner_user_id;"
注意:owner_user_id 为空、owner_status='legacy_unassigned' 的任务属于无主历史任务,迁移时一并纳入。
第 5 步:执行迁移
迁移会话(sessions)
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE sessions SET user_id = '<新账号UID>' WHERE user_id = '<旧账号UID>';"
迁移自动化任务(automations,用户同意时)
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE automations
SET owner_user_id = '<新账号UID>',
owner_status = 'inferred',
owner_source = 'history_unique'
WHERE owner_user_id = '<旧账号UID>'
OR (owner_user_id = '' AND owner_status = 'legacy_unassigned');"
将无主任务(legacy_unassigned)一并归到新账号下,确保 UI 可见。
如需同时恢复被软删除的 automations,追加:
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE automations SET deleted_at = NULL WHERE owner_user_id = '<新账号UID>' AND deleted_at IS NOT NULL;"
仅在用户明确要求恢复已删除任务时执行。
第 6 步:验证
sqlite3 ~/.workbuddy/workbuddy.db \
"SELECT user_id, COUNT(*),
SUM(CASE WHEN deleted_at IS NULL THEN 1 ELSE 0 END) as active
FROM sessions GROUP BY user_id;"
确认旧账号 UID 不再出现,新账号会话数 = 迁移前 + 迁移量。
第 7 步:提醒用户重启
迁移完成后必须告知用户重启 WorkBuddy(完全退出 Cmd+Q 再重新打开),否则 UI 内存缓存不会刷新。
回滚命令(如需):cp ~/.workbuddy/workbuddy.db.bak-YYYYMMDD-HHMM ~/.workbuddy/workbuddy.db
注意事项
- WorkBuddy 运行中可直接执行 sqlite3 写入(WAL 模式),但 UI 需重启才生效。
sessions/目录下的.json文件是进程心跳文件(pid/sessionId/url),不是会话内容,无需迁移。sessions.json是快捷访问缓存(仅几条),非完整索引,无需迁移。- 数据库 schema 详见 references/db-schema.md。
- 若需自动执行完整流程,可使用 scripts/migrate.sh(交互式脚本,自动处理上述步骤)。