happyin.work / 博客

English · Русский · Español · Deutsch · Português (Brasil) · 简体中文 · 日本語

切换账号后,Claude Code 桌面版的会话去了哪里

作者: Anastasiia Butova, ComfyUI 与扩散模型工程师,贝尔格莱德 · 发布于 2026-04-30 · 更新于 2026-09-23

译自英文版: English

我同时使用好几个 Claude 账号,因为每周都有用量上限,账号用完了我就切换到下一个。每次切换后,Claude Code 桌面应用都会重建会话列表,上一个账号的会话就从窗口里消失了,但它们仍然在磁盘上。今年四月,这台机器上有六个账号文件夹,共约 710 个会话、大约 49 MB 的历史记录,而应用只显示其中 69 个。这篇文章讲的是:会话实际存在哪里;我为找到并恢复它们而写的四个脚本;我刻意没有自动化的部分;以及我真正的长期方案,为什么是在自己的代码仓库里保存交接文件。2026 年 9 月修订,加入了更正,以及这些会话之后的变化。

会话存放在哪里

在 macOS 上,桌面应用把每个会话保存在 ~/Library/Application Support/Claude/claude-code-sessions/<accountId>/<orgId>/local_<sid>.json。在 Windows 上,同样的结构位于 %APPDATA%\Claude\claude-code-sessions\ 下。这些都没有官方文档。四月份时,桌面版文档只说每个对话都是一个会话,有自己的聊天记录、项目文件夹和代码改动,并没有说明它存放在哪里。

文件夹名称来自应用打包的 JavaScript:在 .vite/build/index.js 第 771 行有 const $6t="claude-code-sessions"。问题 #29373 的报告者也找到了同一行,而且这个文件夹在我的机器上确实存在。应用只从当前活动账号的文件夹加载会话,所以其他账号的会话在磁盘上保持完好,但在窗口里不可见。我写了一个快速脚本遍历这些文件夹,结果如下:

[372ac280…] sessions=4    size=2K     last=2026-04-13  → a test account
[4d1f33a2…] sessions=330  size=44M    last=2026-04-08  → the main archive (abandoned)
[a4ea2866…] sessions=83   size=4.5M   last=2026-04-10  → archive
[a9e945b6…] sessions=83   size=252K   last=2026-04-26  → recent parallel
[be2110e2…] sessions=69   size=203K   last=2026-04-29  → ACTIVE RIGHT NOW
[c53acc1e…] sessions=141  size=244K   last=2026-04-26  → recent parallel

一共六个账号,而不是我以为的四个。我只是忘了其中两个旧账号,而最容易被忘掉的 4d1f33a2 存放着主要的归档:44 MB、330 个会话、五个月的工作成果。

更正,2026 年 9 月。 四月版文本写的是 715 个会话、48 MB。上表加起来是 710 个会话、约 49 MB,所以本文使用这些数字。

没有官方人员回应

我数过至少十个相关的 GitHub 问题,其中七个在 4 月 30 日仍有人活跃讨论。#48511 于 4 月 15 日开立,标题直接就是 "session history lost when switching accounts"(切换账号时会话历史丢失)。#26452 从二月起一直开着,有 40 条评论,但没有一条来自被标记为仓库成员、所有者或协作者的账号。我逐条手工检查了每条评论:四十条抱怨,没有任何回应。

更新,2026 年 9 月。 #48511 在 5 月 24 日经过一段时间的无人活动后被以 "not planned"(不计划处理)关闭。关闭之后大家仍在评论,而且在 6 月到 9 月之间,讨论串里有人链接了三个社区脚本,用来切换账号或恢复会话。#26452 至今仍开着,评论已增至 53 条,仍然没有任何仓库成员回复。

用于查找和恢复会话的四个脚本

这套工具包含四个跨平台的 Python 脚本,位于我的公开仓库 claude-code-config 中,路径是 skills/operational/desktop-sessions-discovery/:

  • sessions_registry.py,主入口。它读取每个账号的每个会话,生成一个独立的 HTML 仪表板,支持搜索和排序,然后在浏览器中打开。每张卡片显示标题、日期、对话轮数、项目、大小以及可选中的会话 id。当前账号会高亮显示;已经恢复过的会话,会根据迁移日志 ~/.claude/desktop-migrations.jsonl 标记出来,并提供隐藏它们的筛选器。它同时读取当前的 claude-code-sessions/ 和旧的 local-agent-mode-sessions/(后者在 2026 年 2 月改名)。
  • sessions_inventory.py,按账号分组的文本报告,并汇总出现在多个账号中的项目。
  • sessions_find.py,对标题和工作目录做子串搜索,可按账号和时间窗口筛选。
  • sessions_restore.py,把一个会话复制到当前活动账号中,逐字节校验副本,写入一条日志记录,并且从不删除原件。重启桌面应用后,该会话就会出现在窗口中。

实际使用时,我对 Claude 说"把这台机器上所有用于迁移的会话都列出来",技能会识别这句话,然后仪表板就打开了。比如我滚动到一个来自已废弃归档的 392 步会话,复制它的 id,告诉 Claude "恢复这三个",重启应用,会话就都回来了。在 Mac 上还有一个额外的好处:mdfind -onlyin ~/Library/Application\ Support/Claude/ "colour checker" 可以通过 Spotlight 搜索会话文件中的文本内容。Windows 上没有对应的工具,而 sessions_find.py 通过遍历文件,大约半秒就能完成同样的工作。

更新,2026 年 9 月。 四月版文本描述了每张卡片上有一个 Restore(恢复)按钮。我在发布前一天就已经把它去掉了,版本是 3.6.4,因为它的全部作用只是把一条命令复制到剪贴板,却让人以为它做了更多。现在每张卡片上都有一个会话 id,三击即可选中并复制。同一个版本还修复了查找:过去输入 "26" 这样的短查询会匹配到无关 id 的中间部分,现在只匹配 id 的开头。

安装时我不会手动复制任何东西。在任意文件夹中打开 Claude Code,把仓库交给它:

Take https://github.com/AnastasiyaW/claude-code-config, find the
desktop-sessions-discovery skill in skills/operational/, install it into
~/.claude/skills/, then run sessions_registry.py and show me the dashboard.

Claude 会克隆仓库,读取 SKILL.md 了解如何使用这个技能,然后复制并运行它。技能通常就是这样工作的:你把一套工具交给代理,它会像人读 README 一样学会使用。

我刻意没有做的事

  • 不把全部 710 个会话批量合并到当前账号。 侧边栏里有 700 个条目根本没法读,尤其其中还夹杂着大约五十个空的定时任务,比如晨间摘要。批量复制也正是更严格的有效性检查会拒绝的做法。一次只恢复一个任务的一个会话更好用。
  • 不在启动时自动迁移。 绑定在今天存储格式上的工具,一旦格式改变就会变成南瓜马车。搜索加选择性恢复,比自动化更安全。
  • 不在账号文件夹之间建立符号链接。 我的全局规则禁止这样做:它们会在第一次路径变动时断裂,制造看不见的依赖,并在六个月后引出奇怪的 bug。只复制,不链接。
  • 原件从不删除。 恢复之后,源文件作为备份保留在它原来的账号文件夹中,以防将来的检查拒绝这份副本,或者需要重新恢复。

这个工具有保质期

存储结构已经变过一次:local-agent-mode-sessions/ 在二月变成了 claude-code-sessions/(#29373)。第二次变化已经露出苗头。在一位 macOS 用户的报告中(#54428,4 月 28 日),Claude Desktop 1.4758.0 正在写入一个虚拟机包 ~/Library/Application Support/Claude/vm_bundles/claudevm.bundle/,里面有 rootfs.img(10 GB)、sessiondata.img 和 efivars.fd,而同一份日志显示会话仍然从 claude-code-sessions 加载。磁盘镜像不是 JSON。如果会话被迁移进去,复制 local_*.json 文件的做法就会失效。

四月份还有两处裂缝已经很明显。Microsoft Store 版本另有独立的问题(#48362):在 MSIX 沙箱内,把 local_<sid>.json.tmp 原子重命名为 local_<sid>.json 会因 EXDEV 失败,因为虚拟文件系统认为源和目标位于不同的设备上,于是会话根本没有保存。另外在 #18645 中,一位 CLI 用户报告,在不同机器之间复制的会话,在 2.1.5 版本上还能恢复,到了 2.1.9 就不被识别了。该用户猜测现在有一项检查会阻止非当前机器创建的会话。那是 CLI,不是桌面应用,所以这只是一个警示信号,而不是证据。同一台机器上不同账号之间的迁移仍然可用。

更新,2026 年 9 月。 MSIX 问题在 6 月被以 "not planned" 关闭。它的标题建议改用普通的 Win32 安装程序,但 4 月 24 日和 5 月 18 日的评论说,这条路已经不存在了:下载按钮现在提供的是 MSIX 包,外面套着看起来像 Win32 安装程序的壳。#54428 也在 6 月以 "not planned" 关闭。我在四月引用的八个问题中,只有一个以 completed(已完成)关闭:#53717,即 Windows 上自动更新之后会话内容丢失的问题。它在 8 月被关闭,没有任何评论,一周后有用户请求重新打开。

为什么交接文件才是我真正的策略

迁移工具解决的是今天的问题,我并不指望它能撑过一两次版本更新。Anthropic 可能把会话迁移到 SQLite、加密的磁盘镜像或云端;每次变化,自制的恢复工具都会失效。所以长期策略不同:每个重要会话结束后,都写一份交接文件。

记忆(memory)和 CLAUDE.md 保存的是项目的事实和规则。它们回答不了"上一次会话我在做什么,验证过哪些假设,走进过哪些死胡同"这类问题。每次长会话结束时,Claude 会在项目中写入 .claude/handoffs/YYYY-MM-DD_HH-MM_<session-id>.md,包含六个字段:

  • 会话的目标,一句话;
  • 具体做了什么:文件、测试、数字;
  • 什么没有奏效,以及原因,这是最有价值的部分;
  • 当前状态:正常、损坏、受阻;
  • 一个下一步;
  • 一份供下次会话只读的检查清单。

每个会话一个文件,从不覆盖,旁边有一个只追加的 INDEX.md。新会话只需读取约 1,500 个 token 的交接内容,而不必读取 50K token 的历史,也不会重复上一次会话的死胡同。

这两种工具解决的是不同的问题。恢复会深入别人的存储,并依赖于它。交接则把状态写进我自己的地方,写在我脑子里还记得上下文的那一刻。旧会话可能彻底丢失,新会话仍然知道目标、已完成的工作、失败的尝试和下一步。这背后的协调部分,即多个会话同时工作,写在 关于一个仓库里多个 Claude 的文章 和 mclaude 中。

存储布局还决定了另一件事。桌面应用按 <accountId>/<orgId>/ 划分会话,所以写在桌面会话旁边的交接文件,对另一个账号中的会话来说是不可见的。CLI 则不论账号如何,都把一切保存在 ~/.claude/projects/<slug>/ 中:切换账号时,只有 .credentials.json 会变化。这就是我的工作悄然转向 CLI 的原因。

更新,2026 年 9 月。 交接协议从四月以来有所发展。交接现在写入每个项目的子文件夹 .claude/handoffs/<project-slug>/,这样一个繁忙的项目就不会挤掉你回来时要接着做的那个。一个 hook 会拒绝没有收尾审计的交接:请求是否已完成,验证了什么,检查了哪些相关任务,未完成的任务记录在哪里,以及为什么工作在此停止。新会话也不再一上来就问"继续还是重新开始":用户当前的请求优先,相关的交接则会被静默读取。当前的规则是 rules/session-handoff.md。

这些会话后来怎样了

2026 年 9 月新增,于 9 月 23 日在同一台机器上测得。

2026 年 4 月 2026 年 9 月
claude-code-sessions 中的账号文件夹 6 4
会话文件 710 522
大小 约 49 MB 约 10 MB
活动文件夹中最旧的会话 未记录 2026 年 6 月 6 日

到 6 月 6 日,整个会话存储已被复制到另一块硬盘上的恢复备份中:1,003 个文件,49.9 MB,同样的六个账号文件夹。如今活动文件夹中没有任何比这更早的内容:其中的 522 个会话,没有一个是在 6 月 6 日之前创建的。所以应用无法显示四月表格中的任何一个会话。它们的文件都在备份里,而不在应用读取的任何文件夹中。

保留下来的是我自己项目文件夹中的内容。我在 5 月 12 日、属于 tile-memory(分块记忆)项目的那份交接,仍然在项目里,今天打开它依然能看到目标、失败的尝试和下一步(项目本身在这里)。这正是本文的论点,只是被意外地验证了。需要坦白的一点是:那份交接从未提交,只有它的索引被提交了,所以它之所以幸存,是因为文件夹被复制了。按我自己的规则,它本应放在 git 里。

来源

  • #48511:切换账号时历史丢失;2026 年 5 月以 not planned 关闭。
  • #26452:登出或重启后会话消失;仍然开着,截至 2026 年 9 月仓库成员没有任何回复。
  • #48362:MSIX EXDEV。
  • #18645:不同机器之间的会话导出和导入;2.1.9 的假设。
  • #54428:macOS 1.4758.0 上的虚拟机包。
  • #29373:改名为 claude-code-sessions。
  • #53717:Windows 上更新后内容丢失。
  • #54723:macOS 上对话中途会话消失;报告者后来以用户端原因关闭了它:自动归档偏好,加上只显示活动会话的侧边栏筛选。
  • Claude Code 桌面版文档(没有存储路径)以及 .claude 目录文档(CLI 部分有文档)。
  • claude-sync:通过 R2 为 CLI 做多机同步。
  • 工具包:desktop-sessions-discovery。交接背景:同一仓库中的 principles/18-multi-session-coordination.md 和 alternatives/session-handoff.md。

俄文原文发表于 Habr。

更多文章

本站其他内容

Anastasiia Butova - ML engineer, Belgrade, Serbia. Email [email protected] · LinkedIn · GitHub · Telegram · Hugging Face