Asia/Shanghai
September 7, 2026

Move the session, not a summary

换个 agent 继续,别再粘摘要

Mingjian Shao
Move the session, not a summary
A summary is a retelling. The session is the original. another moves the original.
You know the moment. Thirty turns into something that finally works, the model runs out of quota — or the work turns out to want a different one. The usual escape is to ask for a summary, paste it into a different agent, and spend the next ten minutes re-explaining the parts the summary flattened.I did that enough times to notice what actually annoyed me. It was not the switch. It was that the conversation, the artifact both of us had spent an hour building, was treated as disposable, while a paragraph about the conversation was treated as the thing worth keeping.another reads each agent's own local session store and writes the conversation into the target agent's native format. Afterwards the session opens with that agent's own command — codex resume, claude --resume, pi --session — because over there it is a real session, not a message someone pasted in.That distinction matters more than it sounds. A pasted summary is one turn of context that the model has to trust. A migrated session is history: ordered user and assistant turns, timestamps where the target supports them, the project directory, the title. Ask the new agent "why did we drop the retry wrapper" and it can look, instead of guessing.Some things do not travel, and the tool says so rather than pretending. Provider-specific reasoning signatures, tool calls, tool results, images, and system records have no portable equivalent across ten different session formats, so they are excluded. What crosses the boundary is the conversation.The failure mode I was most afraid of is the quiet one: a migration that reports success and produces a session that opens half-empty, days later, when you actually need it.So every migration reloads what it just wrote and compares a content digest before reporting anything. If the digest does not match, another removes the artifact that migration created and tells you it failed. The source session is never touched by a migration at all — worst case you are exactly where you started, which is the only acceptable worst case for a tool that touches other tools' data.The same instinct shows up in the destructive operations. Ctrl+D defaults to Cancel and shows the provider, title, project, and full session ID before deleting anything. Disabling an agent in setup drops that agent's rows from another's local index and leaves its actual sessions alone.another speaks to ten: Pi, Codex, Claude Code, Cursor, OpenCode, OpenCode 2, CommandCode, Hermes, Qwen Code, and Antigravity. But "supports ten agents" is the kind of claim that quietly turns into a lie, so there is a line drawn through the middle of it.Six are continuously tested and enter every release regression pass: Pi, OpenCode 2, Claude Code, Codex, Antigravity, and Qwen Code. The other four remain compatibility adapters — they work, they are maintained, but I do not promise an end-to-end test on every release. You can read which is which on the product page before you rely on one.Two smaller rules come from the same place. Rename, archive, and delete appear only where an agent has a real native operation behind them, so nothing in the interface is an another-only marker that would vanish on refresh. And first-run setup starts with nothing selected: detecting a CLI on your machine means it is available, never that you chose it.Codex needed the most work here, because a Codex session's name lives in three places — the CLI thread store, the legacy index file, and the Electron state the Desktop sidebar actually reads. Rename writes all three. When Desktop is running and would overwrite its own state from memory, the interface tells you the sidebar catches up on restart, rather than reporting a failure that did not happen.Once you can see every agent's sessions in one list, you discover how bad the names are. So another can ask an agent you already have installed for one title, under a contract it enforces itself: MMDD|Type|Topic, or MMDD|类型|主题 in Chinese. The date comes from the indexed creation time converted to Asia/Shanghai, never from the model, because a model guessing a date is a bug with extra steps.Suggestions that miss the contract, arrive after you closed the box, or fail outright are discarded without touching what you typed. For a backlog, mark sessions with x and press Ctrl+T; the review page lists only rows that would change and verifies each one on apply.One detail I did not expect to have to build: several CLIs record a session for every headless run, with no way to opt out, so generating forty titles litters your history with forty new sessions. another recognizes its own leftovers and keeps them out of its index — its own index only. It does not delete anything an agent wrote.macOS and Linux, amd64 and arm64. The current release is v0.6.2.
Bash
brew trust nxxxsooo/tap
brew install nxxxsooo/tap/another
another
Homebrew 6 refuses third-party taps until you trust them; older versions treat brew trust as an unknown command, so skip that line there. There is also an install script, go install github.com/nxxxsooo/another/cmd/another@latest, and checksum-verified tarballs on the releases page.The first run opens setup: pick the interface language, choose which agents to index, and optionally name one agent for title suggestions. Then press on a session and send it somewhere else.If you use a coding agent, paste this and let it handle the install:
Bash
Install the `another` CLI and migrate one of my coding-agent sessions into a different agent.
Reference: https://mjshao.fun/blog/another-migrate-coding-agent-sessions

My setup:
- Platform: [ask me]
- Install method (homebrew / script / go install): [ask me]
- Agents I want indexed: [ask me]
- Target agent for the first migration: [ask me]

Steps:
1. Detect which coding-agent CLIs I actually have and show me the list.
2. Install another with my chosen method; run `brew trust nxxxsooo/tap` first only if Homebrew requires it.
3. Verify `another --version` and show me `another providers doctor`.
4. Tell me to run `another setup` myself do not write its config file directly.
5. Run `another list --limit 20`; if empty, run `another index update` once before declaring failure.
6. Let me choose one low-stakes session, then run `another migrate SESSION_ID --to TARGET -y`.
7. Show me the resume command it printed. Never touch a session I did not choose.
The source is at nxxxsooo/another, and the full product page is here.
摘要是转述,会话才是原件。another 搬的是原件。
那个场景你一定熟悉:聊到第三十轮,东西终于跑通了,模型额度用完了 —— 或者这段活其实更适合另一个模型。常规操作是让它总结一遍,粘到另一个 agent 里,然后花十分钟把摘要压扁的那些细节重新讲一遍。这么干过几次之后我才想明白真正让我烦的是什么。不是换 agent 这件事,而是那段对话 —— 两边一起花了一个小时攒出来的东西 —— 被当成一次性的,而一段「关于这段对话」的文字反而被当成值得留下的部分。another 读取各个 agent 自己的本地会话存储,把对话按目标 agent 的原生格式写进去。之后这条会话用那个 agent 自己的命令打开 —— codex resumeclaude --resumepi --session —— 因为它在那边就是一条真会话,不是谁粘进去的一条消息。这个区别比听起来重要。粘贴的摘要只是一轮上下文,模型只能选择相信它。迁移过去的会话是历史:按顺序排列的用户与 assistant 轮次、目标格式支持的时间戳、项目目录、标题。问新 agent「我们当时为什么把重试那层去掉了」,它可以回头去看,而不是猜。有些东西过不去,工具就直说,不装作能带走。供应商特有的推理签名、工具调用与结果、图片和系统记录,在十种会话格式之间没有可移植的等价物,所以不迁移。跨过边界的是对话本身。我最怕的失败方式是安静的那种:迁移报了成功,几天后你真要用的时候,打开发现里面只剩一半。所以每次迁移都会重新加载刚写进去的东西,比对内容摘要,然后才报告结果。摘要对不上,another 就删掉这次迁移创建的产物,并明确告诉你失败了。来源会话在整个过程中根本不会被改动 —— 最坏的情况就是你回到起点。对一个要碰别人数据的工具来说,这是唯一可以接受的最坏情况。同一套直觉也体现在破坏性操作上。Ctrl+D 默认停在取消,删除前会显示 provider、标题、项目和完整会话 ID。在 setup 里关掉某个 agent,只会从 another 的本地索引里删掉它的行,它自己的会话原封不动。another 支持十个:Pi、Codex、Claude Code、Cursor、OpenCode、OpenCode 2、CommandCode、Hermes、Qwen Code 和 Antigravity。但「支持十个 agent」这种说法很容易慢慢变成谎话,所以中间画了一条线。六个持续实测,进入每次发布的回归检查:Pi、OpenCode 2、Claude Code、Codex、Antigravity、Qwen Code。另外四个保留兼容适配 —— 能用,也在维护,但我不承诺每个版本都跑完端到端测试。哪个是哪个,产品页上写着,你在依赖它之前就能看到。还有两条小规则来自同一个立场。重命名、归档、删除只在该 agent 背后有真实原生操作时才出现,界面上没有任何一个「只有 another 知道、刷新就消失」的私有标记。首次 setup 也不预选:在你机器上检测到某个 CLI,只说明它可用,不代表你选了它。Codex 在这里花的功夫最多,因为一条 Codex 会话的名字存在三个地方 —— CLI 的线程库、旧版索引文件,以及 Desktop 侧边栏真正读的 Electron 状态。重命名三处全写。Desktop 正在运行、会用内存里的状态整份覆盖时,界面会告诉你侧边栏要等它重启才更新,而不是报一个根本没发生的失败。当你能在一个列表里看见所有 agent 的会话,你才会发现名字有多糟。所以 another 可以让一个你已经装好的 agent 生成标题,规则由它自己执行:MMDD|类型|主题,英文则是 MMDD|Type|Topic。日期取自索引里的创建时间并转换到 Asia/Shanghai,不交给模型 —— 让模型猜日期,等于给自己埋一个绕了远路的 bug。不符合格式、在你关掉输入框之后才到达、或者干脆失败的建议,一律丢弃,不会覆盖你已经打的字。要收拾一批旧会话,用 x 标记,按 Ctrl+T;确认页只列出会变更的行,应用时逐行回读验证。有个细节我原本没想到还得专门处理:好几个 CLI 会为每次无头调用记录一条自己的会话,而且没有关闭开关,于是生成四十个标题就在你的历史里多出四十条新会话。another 能认出自己留下的这些残留,把它们挡在索引外面 —— 只是它自己的索引。agent 写下的东西,它一个都不删。支持 macOS 与 Linux 的 amd64 / arm64,当前版本 v0.6.2
Bash
brew trust nxxxsooo/tap
brew install nxxxsooo/tap/another
another
Homebrew 6 要求先信任第三方 tap,否则拒绝安装;旧版 Homebrew 不认识 brew trust,跳过这行即可。另外还有安装脚本、go install github.com/nxxxsooo/another/cmd/another@latest,以及 release 页上带校验和的压缩包。首次运行会打开 setup:选界面语言、勾选要索引的 agent,可选一个用来生成标题的 agent。然后在会话上按 ,把它送到别处。如果你在用 coding agent,把下面这段粘给它:
Markdown
帮我安装 `another` CLI,并把我的一条 coding agent 会话迁移到另一个 agent。
参考:https://mjshao.fun/blog/another-migrate-coding-agent-sessions

我的情况:
- 平台:[ask me]
- 安装方式(homebrew / 脚本 / go install):[ask me]
- 想索引的 agent:[ask me]
- 第一次迁移的目标 agent:[ask me]

步骤:
1. 检测我本机实际装了哪些 coding agent CLI,把清单给我看。
2. 用我选的方式安装 another;只有 Homebrew 版本要求时才先跑 `brew trust nxxxsooo/tap`
3. 验证 `another --version`,并把 `another providers doctor` 的输出给我。
4. 让我自己运行 `another setup`,不要直接改它的配置文件。
5. 运行 `another list --limit 20`;如果为空,先跑一次 `another index update` 再判断失败。
6. 让我挑一条不重要的会话,然后运行 `another migrate SESSION_ID --to TARGET -y`
7. 把它打印的恢复命令给我看。绝不动我没有选的会话。
源码在 nxxxsooo/another,完整产品页在这里

For AI Agents

This post ships a machine-readable execution plan. Paste the prompt into OpenCode / Claude Code / Cursor / Codex CLI (any agent with shell + file write tools) and it will reproduce the setup with pre-flight checks. Chat-only LLMs without tools should refuse, per the embedded SAFETY clause.
Share this post:
Enjoy this post? Subscribe via RSS: English | 中文