010 / 025 · 开发 · v0.22.0 · MIT
reunite
reunite 解决的是两种时刻:你用另一个账号登录,侧边栏突然只剩寥寥几条;或者你在一个账号里归档、删掉了某条对话,换到另一个账号它还在。Claude 桌面端为每个登录过的账号单独存一份对话索引,只显示当前登录那一份,而每一次改动也只写进那一份。这个技能让每个账号都持有同一批对话、同一个状态,逐字节一致。
- 参数
都是可选的。
[--apply][--into=all|current|<accountUuid>][--from=current|<accountUuid>][--sidebar-from=current|<accountUuid>][--no-environments][--undo][--undo-sidebar][--install-service|--uninstall-service|--service-status]
- 什么时候触发
这些是 CI 用来评测这个技能的 prompt,每次发布都会跑。
会触发
- I signed in with my other Claude account and now the sidebar is almost empty. Where did all my conversations go?
- 换了个账号登录,session 全没了
- Can my two accounts on this machine share the same conversation list?
- I renamed a bunch of conversations under one account but my other account still shows the old titles.
- 我在一个账号里把一堆 session 归档了、删掉了,换到另一个账号它们还在,能不能让几个账号完全一致?
不触发
- Rename these conversations onto the dated scheme.
- Move my Claude history over to my new laptop.
什么都没丢,而且可以自己验证
一次对话落在两个地方,其中只有一个知道账号这回事。
对话正文 —— 每一条消息、每一次工具调用 —— 是 ~/.claude/projects/ 下的一个 JSONL 文件,按你当时所在的目录归档。打开来看,里面从头到尾没有账号字段。所以不管当前登录的是哪个账号,终端里的 claude --resume 一直都列得出你的全部对话。
侧边栏读的是另一组小得多的文件:每条对话一份索引,存放路径以账号标识开头。换一个账号登录,app 就去读另一个目录。对话本身还在硬盘上,完整、未动。
所以要修的东西比症状小得多。没有什么需要恢复,需要对齐的是那几份列表。
它做什么
对每一条对话,取你最后动过的那一份副本,让它成为每个账号的副本 —— 哪个账号没有就新建,哪个账号的副本过期了就覆盖。
Plan: align 5 account index(es)
891 copies to create, +47.6MB
6912 copies to overwrite with the canonical copy
103 change title
2702 change isArchived
17 change isStarred
5536 change other fields only the app reads
0 copies to remove — 0 conversations deleted under one account
110 conversations have no transcript left; they are kept, archived默认跑一次就到这份报告为止。不加 --apply 它一个字节都不写 —— 几千个文件被改写,这种事没把数字摆出来之前,不该替人做决定。写完之后它会重新扫一遍,核对每条对话在每个账号里是否真的一致,并明说结果;不一致的会点名列出。
归档和删除也会同步
归档决定侧边栏显示什么,所以不交给「哪份最新」来定。每次运行都会记下每个账号持有哪些对话、哪些已归档,下一次拿它来比。你在一个账号里做的归档或取消归档,会到达其它账号。你在一个账号里删掉的对话,会从所有账号里移除,而且再也不会被复制回来 —— 以前就是这样被复制回来的,所以清理过的侧边栏总会重新变满。
第一次运行没有记录可比,几份副本意见不一时一律归档。藏起来是可以挽回的那种错法。正文已经不在的条目也会保留,好让列表一致,但会被归档,因为点开是空的。
它改过的一切都能还原
新建的每个文件都记在清单里;被覆盖或移除的每个文件,原件都先备份。--undo 删掉它新建的,把每个原件连同时间戳一起放回去。它从不碰对话正文,也从不删除你自己没删过的东西。
侧边栏分组也能同步
对话列表只是侧边栏的一半。你建的分组 —— 名字、每组里有哪些对话、排列顺序、哪些折叠着 —— 另外按账号存在 app 自己的浏览器存储里。--sidebar-from=<账号> 把一个账号的布局复制给其它所有账号,那个账号里没有的对话会从分组里去掉。
这一步要求先彻底退出 app(Cmd-Q):app 把布局放在内存里,运行时改了也会被它写回去覆盖掉。脚本会检查,app 还开着就拒绝执行,所以要在终端里跑,而不是在 app 里面跑。写之前它会把整个存储目录复制一份,写完回读核对,有任何不对就把那份复制放回去;--undo 也会恢复它。只想撤回最近一次布局改动、保留已经对齐的对话列表,就用 --undo-sidebar。它只管这台机器上桌面端的侧边栏:artifacts 以及 claude.ai 在服务器上按账号保存的东西,都同步不了。
环境和星标
环境选择器也是按账号分开存的。现在每次运行都会让每个账号拥有同一批环境 —— 开新会话时可选的那些命名工作目录 —— 在一个账号里删掉的环境会从所有账号移除,而且再也不会被复制回来。某个账号突然一个环境都没有了,会被原样保留,而不是被当成「全部删除」,因为 app 重置账号时就会把它清空。哪些环境加了星标是跟侧边栏布局存在一起的,所以 --sidebar-from 会连同分组一起把星标复制过去。
在后台保持同步
--install-service 会装一个 macOS 后台小进程:会话索引或环境一有变化就重新对齐,另外每五分钟跑一次。它要等你自己先跑过一次 --apply 才开始工作;你没删的东西它不会删,删掉的对话和环境它也绝不会带回来;侧边栏布局只在 app 退出时才会动。--service-status 查看最近一次运行;--uninstall-service 把它卸掉,--undo 之前必须先卸。
有些东西在这台机器上根本同步不了,因为 claude.ai 把它们按账号存在服务器上:云端环境、artifacts、项目、聊天,以及 routines 和定时任务。
关于重启
运行结果要等桌面端重启才看得见。app 只在启动时读这份索引,运行期间不会再看那个目录。
这一点比听起来重要,因为重启会打断还在跑的对话。这个技能只告诉你需要重启,不替你动手;先花十秒看一眼哪些还活着,是值得的。
开发 里的其它技能
还有 5 个 · 一次安装sync
/dev:syncsync 只做一件事:把本地和远端的差异摊开给你看,并且只执行其中绝对安全的那部分。
ship
/dev:shipship 把一次改动从工作区送到一个已合并的 PR:开分支、跑项目自己的测试、提交、开 PR、等 CI、合并,最后清理 worktree。
cleanup
/dev:cleanup一次改动发布之后,残留会留下来:本地分支、它在远端的副本、当时用的 worktree,有时还有一个只装着被忽略文件的目录。
retitle
/dev:retitle对话列表乱,不是因为名字不好听,是因为名字里没有可排序的信息。
steward
/dev:stewardsync、ship、cleanup 都只管你当下所在的那一个仓库。