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 eleven 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. 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, CommandCode, CodeM, Hermes, Qwen Code, and Antigravity. OpenCode V1 history and V2 sessions now share one entry; each session keeps its native storage and operations. Existing opencode2, open-code-2, and o2 aliases continue to work, and new migrations target V2.Six enter every release regression pass: Pi, OpenCode, Claude Code, Codex, Antigravity, and Qwen Code. The other four remain compatibility adapters, without a promised end-to-end test on every release. Windows has a separate coverage boundary: VM checks cover setup, indexing, preview, and Codex handoff; native Windows handoff for the other agents remains unverified.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.CodeM now fills two more native cells: rename writes the session_renamed record its own client reads, and archive moves the transcript through CodeM's own archived/ directory. Its resume lookup is tied to the hash of the literal working directory, so moved paths and symlinks used to orphan intact sessions. another now gives CodeM a narrow LINCO_SESSIONS_ROOT bridge to the original project-hash directory: the JSONL stays where it is, CodeM reads it itself, and a same-ID session in another project is never visible.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 r; 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.The same reasoning shows up in the smallest feature I have shipped. You can now take a delete back — but only where taking it back means the same session returns.A Pi or Claude Code session is one file on disk, so another holds those bytes and u writes them back with the same ID, the same path, and the same modification time. The agent resumes it as though it never went. OpenCode 2 is different: its server owns the delete, and pushing the conversation back through the API would create a new session with a new ID. That is a copy wearing the dead one's name, so there is no undo there, and the confirmation tells you which case you are in before you press anything. There is no trash directory either — the offer lasts as long as the list, Esc gives it up, and a path the agent has since reused is never overwritten.Relocation follows the same line. Carrying a session into another project directory uses that agent's own move, never a re-render through the portable model, because a re-render would silently drop the tool calls and reasoning that make the session worth keeping.Titles had one more gap I kept walking into. Ctrl+R and Ctrl+T work on sessions that already exist, so the Claude Code sessions I finished in the morning sat in the list under their first prompt until I went back for them.Claude Code exposes no title agent to override, so the plugin approach that works for OpenCode 2 does not apply. What it does expose is a SessionEnd hook, and a custom-title record that its own rename writes into the transcript. So another ships a hook script. When a session ends, the script checks the transcript for a custom-title row; if there is none, it runs another rename --auto in the background under the same MMDD|Type|Topic contract. A title you set by hand is never overwritten. The transcript is the entire test, and the hook keeps no state of its own.It is a weaker contract than the OpenCode 2 plugin: one extra model call per session, and it cannot suppress a title Claude Code generated itself, only outrank it. It is also the strongest one Claude Code currently offers, so that is what it does. You install it yourself by adding a few lines to ~/.claude/settings.json; another does not edit that file.Claude Code can also leave one session ID in both an old and a renamed project directory. From v0.15.2, another prefers the message-bearing transcript over a newer metadata-only snapshot, so the title, path, and message count in the list match what claude --resume actually opens.OpenCode 2.0 retired the rename endpoint another was calling, which turned every Ctrl+R on an OpenCode session into HTTP 404 Not Found with the title untouched. From v0.15.3, renames go through OpenCode's session update route, and the retired one is kept as a fallback for older builds.From v0.15.4, the optional title plugin for OpenCode 2.0.4 also adds the creation date before the first automatic title is saved. Previously a missed follow-up rename could leave Type|Topic without a date. After upgrading, run another integrations install opencode to refresh the plugin; existing titles are not rewritten.v0.15.5 comes out of running another on real Linux machines — a headless Ubuntu container and an Ubuntu desktop VM with a live OpenCode store. The install path was quietly broken there: curl … | bash leaves SHELL set but unexported, so the installer's own child process read an empty string and skipped the a alias on every install and every another update. It now falls back to the login shell. Copying was worse than broken — with no xclip, xsel, or wl-copy on the machine, c reported a successful copy and put nothing anywhere; it now says so, and the confirmation it prints is visible for the first time on any platform. A repeat migration also used to drop the cd in front of the resume command.v0.15.7 fixed the model list setup offers for OpenCode. It is read from OpenCode's own server now, which is the catalog /models shows inside the client, providers you defined in opencode.json(c) included. The old source, opencode models, resolves a catalog for the directory it starts in, and the probe runs in a throwaway temporary directory — so it answered with whatever that resolution had reached: nothing, then all of models.dev, never your own providers. A build without the endpoint still falls back to it.An earlier release fills a cell in the capability table. Antigravity has no delete command of its own, but everything a conversation owns is filed under its id, so another removes that set and refuses a conversation Antigravity has open. There is no undo there, and the archive cell stays a dash, because Antigravity has no archived state for another to write into.v0.15.8 stops another from adopting a sandboxed agent home. Tools that spawn a coding agent around one run — a memory plugin launching Claude Code to tidy sessions is the known case — point the agent's home environment (CLAUDE_CONFIG_DIR, CODEX_HOME, …) at a throwaway temp directory, your settings and hooks copied in with it. A hook running inside such a session handed that environment to another, which then read the sandbox as the agent's real home: the session list was replaced by the tool's own machine sessions, and those rows refused to be deleted afterwards. A value that names a directory directly inside the temp tree is now ignored in favour of the real home; deliberate relocations through these variables keep working, and one another index rebuild restores a polluted list.v0.15.9 fixes Qwen Code title suggestions on Windows. The model was receiving only the first line of the prompt because npm's qwen.cmd truncated multiline arguments. another now sends the full title rules and session content through stdin, using the existing account and model settings. This was verified with a native Windows regression test and a real Qwen request.v0.16.0 makes relocation work on a set: mark sessions and press m in the TUI, or pass several IDs to another relocate. A target directory that does not exist yet can be created on the way in (--create, or a second Enter), and the relocate box suggests the repository's worktrees, completes the typed path, and offers recent project directories. Relocation stays native-only. Setup no longer offers Cursor, CommandCode, or Hermes to new users; existing configurations keep working. v0.16.1 gives an explicit another aliases install 30 seconds for a cold shell, after Windows PowerShell startup was found exceeding the old 10-second limit, and reports a timeout as one.v0.20.1 keeps the list still while you change the view: g switches between ungrouped, by date, and by directory without moving a single column, and t no longer reshapes the header, which now says all time when no window is set. v0.20.0 put the everyday keys on single letters (r rename, d delete, s refresh; the Ctrl keys still work), added path:folder to /, and gave phone-width terminals rows that show the title. Run another update to upgrade.macOS, Linux, and Windows, amd64 and arm64. The current release is v0.20.1. On macOS/Linux:
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 a shell installer, go install github.com/nxxxsooo/another/cmd/another@latest, and checksum-verified archives on the releases page. Windows uses ZIPs or PowerShell:
Powershell
irm https://mjshao.fun/another/install.ps1 | iex
To upgrade, run another update; it follows the original installation source.The installer adds a → another only when that shell name is free; Homebrew adds it on the first interactive launch, outside its install sandbox. Existing commands, functions, and aliases are left alone. Open a new shell afterwards, or run another aliases install. Local make install adds a-dev and adev for the development binary. Inside the TUI, a always archives the selected session; u undoes the latest archive or reversible delete, and Esc dismisses the offer so browsing can continue.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 resume、claude --resume、pi --session —— 因为它在那边就是一条真会话,不是谁粘进去的一条消息。这个区别比听起来重要。粘贴的摘要只是一轮上下文,模型只能选择相信它。迁移过去的会话是历史:按顺序排列的用户与 assistant 轮次、目标格式支持的时间戳、项目目录、标题。问新 agent「我们当时为什么把重试那层去掉了」,它可以回头去看,而不是猜。有些东西过不去,工具就直说,不装作能带走。供应商特有的推理签名、工具调用与结果、图片和系统记录,在十一种会话格式之间没有可移植的等价物,所以不迁移。跨过边界的是对话本身。我最怕的失败方式是安静的那种:迁移报了成功,几天后你真要用的时候,打开发现里面只剩一半。所以每次迁移都会重新加载刚写进去的东西,比对内容摘要,然后才报告结果。摘要对不上,another 就删掉这次迁移创建的产物,并明确告诉你失败了。来源会话在整个过程中根本不会被改动 —— 最坏的情况就是你回到起点。对一个要碰别人数据的工具来说,这是唯一可以接受的最坏情况。同一套直觉也体现在破坏性操作上。d 默认停在取消,删除前会显示 provider、标题、项目和完整会话 ID。在 setup 里关掉某个 agent,只会从 another 的本地索引里删掉它的行,它自己的会话原封不动。another 支持十个:Pi、Codex、Claude Code、Cursor、OpenCode、CommandCode、CodeM、Hermes、Qwen Code 和 Antigravity。OpenCode V1 历史和 V2 会话现在共用一个入口,每条会话保留原生存储和操作。已有 opencode2、open-code-2、o2 别名继续可用,新迁移写入 V2。六个进入每次发布的回归检查:Pi、OpenCode、Claude Code、Codex、Antigravity、Qwen Code。另外四个保留兼容适配,不承诺每个版本都跑完端到端测试。Windows 的覆盖范围单独说明:实机已验证 setup、索引、预览和 Codex 交接,其他 agent 的 Windows 原生交接仍待实测。还有两条小规则来自同一个立场。重命名、归档、删除只在该 agent 背后有真实原生操作时才出现,界面上没有任何一个「只有 another 知道、刷新就消失」的私有标记。首次 setup 也不预选:在你机器上检测到某个 CLI,只说明它可用,不代表你选了它。Codex 在这里花的功夫最多,因为一条 Codex 会话的名字存在三个地方 —— CLI 的线程库、旧版索引文件,以及 Desktop 侧边栏真正读的 Electron 状态。重命名三处全写。Desktop 正在运行、会用内存里的状态整份覆盖时,界面会告诉你侧边栏要等它重启才更新,而不是报一个根本没发生的失败。CodeM 也补上了两个原生能力:重命名写入它自己客户端读取的 session_renamed 记录,归档则把转录移入 CodeM 自己的 archived/ 目录。它按工作目录字面路径的哈希恢复会话,目录移动或符号链接变化曾会让完好的会话失联。现在 another 用 LINCO_SESSIONS_ROOT 为 CodeM 搭一个只指向原项目哈希目录的窄桥:JSONL 留在原地,由 CodeM 自己读取,另一个项目里的同名 ID 根本不会进入视野。当你能在一个列表里看见所有 agent 的会话,你才会发现名字有多糟。所以 another 可以让一个你已经装好的 agent 生成标题,规则由它自己执行:MMDD|类型|主题,英文则是 MMDD|Type|Topic。日期取自索引里的创建时间并转换到 Asia/Shanghai,不交给模型 —— 让模型猜日期,等于给自己埋一个绕了远路的 bug。不符合格式、在你关掉输入框之后才到达、或者干脆失败的建议,一律丢弃,不会覆盖你已经打的字。要收拾一批旧会话,用 x 标记,按 r;确认页只列出会变更的行,应用时逐行回读验证。有个细节我原本没想到还得专门处理:好几个 CLI 会为每次无头调用记录一条自己的会话,而且没有关闭开关,于是生成四十个标题就在你的历史里多出四十条新会话。another 能认出自己留下的这些残留,把它们挡在索引外面 —— 只是它自己的索引。agent 写下的东西,它一个都不删。同一套判断也出现在我做过的最小的功能里。删除现在可以撤销了 —— 但只在「撤销」真的等于同一条会话回来的地方才提供。Pi 和 Claude Code 的会话就是磁盘上的一个文件,所以 another 先把这份字节留在手里,按 u 原样写回:ID、路径、修改时间都不变,agent 恢复它就像它从没消失过。OpenCode 2 不一样:删除由它的服务端执行,把对话通过 API 推回去,会得到一个新 ID 的新会话。那是一份顶着死者名字的副本,所以那里没有撤销,确认框会在你按下任何键之前说清楚你在哪一种里。也没有回收站目录 —— 撤销机会只在当前列表内有效,按 Esc 即刻放弃,如果 agent 已经往同一路径写了新东西,绝不覆盖。迁目录也是同一条线:把会话搬进另一个项目目录,用的是那个 agent 自己的移动能力,而不是通过可移植模型重新渲染一遍 —— 重新渲染会悄悄丢掉工具调用和推理,而那正是这条会话值得留下的原因。标题这块还有一个我老是撞上的缺口:Ctrl+R 和 Ctrl+T 只处理已经存在的会话,早上做完的那几条 Claude Code 会话,会一直顶着第一句提示词躺在列表里,直到我回头去收拾。Claude Code 没有可以拦截的标题 agent,OpenCode 2 那套插件在它这儿用不上。它有的是 SessionEnd hook,以及它自己改名时写进 transcript 的 custom-title 记录。所以 another 带了一个 hook 脚本:会话结束时先查 transcript 里有没有 custom-title,没有就在后台跑 another rename --auto,规则还是 MMDD|类型|主题。手动起过的标题永远不会被覆盖,transcript 就是全部判据,hook 自己不存任何状态。这比 OpenCode 2 插件的约束弱:每条会话多一次模型调用,Claude Code 自己起的标题也只能被盖过、拦不住。但这已经是 Claude Code 目前给出的最强接口。安装要你自己往 ~/.claude/settings.json 里加几行,another 不碰这个文件。Claude Code 还可能在旧项目目录和改名后的新目录里留下同一个会话 ID。从 v0.15.2 起,another 会优先选择含真实消息的 transcript,而不是更新时间更晚的空状态快照,因此列表里的标题、路径和消息数会与 claude --resume 实际打开的会话一致。OpenCode 2.0 下线了 another 原本调用的重命名接口,于是在新版本上对 OpenCode 会话按 Ctrl+R,只会得到 HTTP 404 Not Found,标题纹丝不动。从 v0.15.3 起,重命名改走 OpenCode 的会话更新接口,旧接口保留为兼容老版本的回退。从 v0.15.4 起,OpenCode 2.0.4 的可选标题插件会在首次自动命名保存前写入创建日期,不再等可能漏掉的重命名事件;升级后运行 another integrations install opencode 更新插件,已有标题不会被追改。v0.15.5 来自在真实 Linux 机器上跑 another——一台无头 Ubuntu 容器,和一台装着真实 OpenCode 数据的 Ubuntu 桌面虚拟机。安装路径在那里一直是坏的:curl … | bash 会把 SHELL 设成非导出变量,安装脚本拉起的子进程读到的是空字符串,于是每次安装、每次 another update,a 这个别名都被静默跳过;现在会回退到登录 shell。复制比坏掉更糟——机器上没有 xclip、xsel 或 wl-copy 时,按 c 会报「已复制」而实际什么都没复制;现在它会如实报错,而那条确认信息也第一次在所有平台上真正可见。重复迁移过去还会把 resume 命令前面的 cd 丢掉。v0.15.7 修好了 setup 给 OpenCode 列模型这一步:列表改为直接问 OpenCode 自己的服务器,也就是客户端里 /models 显示的那一份,你在 opencode.json(c) 里自定义的 provider 也在其中。之前用的 opencode models 要为启动目录现解析一份目录,而探测跑在一次性临时目录里,于是拿回来的是还没解析完的中间态:先是空,再是整个 models.dev,自定义 provider 根本轮不到。旧版本没有这个端点时仍回落到它。更早一个版本还填上了能力表里的一格。Antigravity 自己没有删除命令,但一条会话的所有东西都挂在它的 id 下,another 就把这一组一起删掉,正被 Antigravity 打开的会话会被拒绝。那里没有撤销,归档那格也还是横线,因为 Antigravity 没有归档状态可写。v0.15.8 不再把沙盒目录当成 agent 的真实数据根。围绕一次 agent 运行搭沙盒的工具——记忆类插件拉起 Claude Code 整理会话是已知的一例——会把 agent 的家目录环境变量(CLAUDE_CONFIG_DIR、CODEX_HOME 等)指到一次性临时目录里,连你的设置和钩子一起复制进去;沙盒会话结束时,钩子里跑的 another 继承了那套环境,把沙盒当成了真实目录:整个会话列表被换成工具自己的内部会话,这些行事后还删不掉。指向临时目录正下方的值现在会被忽略、回落到真实目录;正常通过环境变量搬家不受影响,被污染的列表跑一次 another index rebuild 即可恢复。v0.15.9 修复 Windows 下千问标题建议不可用的问题。之前 npm 的 qwen.cmd 会截断多行参数,模型只收到提示词的第一句;现在完整的标题规则和会话正文通过标准输入传递,沿用已有账号与模型配置。已通过 Windows 原生回归测试和真实千问请求验证。v0.16.0 让换目录可以成批处理:TUI 里标记后按 m,命令行给 another relocate 传多个 ID。目标目录还不存在时可以顺手创建(--create,或再按一次 Enter);换目录输入框会列出仓库的 worktree、补全正在输入的路径,并给出最近用过的项目目录。换目录仍只走原生操作。setup 不再向新用户提供 Cursor、CommandCode 和 Hermes,已有配置照常可用。v0.16.1 把显式的 another aliases install 等待 shell 启动的上限放宽到 30 秒(Windows PowerShell 冷启动曾超过原来的 10 秒),超时也会明确报告为超时。v0.20.1 让切换视图时列表保持不动:按 g 在不分组、按日期、按目录之间切换,任何一列都不移动;按 t 也不再改变顶栏宽度,没有时间窗时显示「全部时间」。v0.20.0 把常用键挪到单个字母(r 重命名、d 删除、s 刷新,原来的 Ctrl 组合键仍可用),/ 支持 path:目录,手机宽度的终端里每行把宽度让给标题。运行 another update 升级。支持 macOS、Linux 和 Windows 的 amd64 / arm64,当前版本 v0.20.1。macOS/Linux 安装:
Bash
brew trust nxxxsooo/tap
brew install nxxxsooo/tap/another
another
Homebrew 6 要求先信任第三方 tap,否则拒绝安装;旧版 Homebrew 不认识 brew trust,跳过这行即可。另外还有 shell 安装脚本、go install github.com/nxxxsooo/another/cmd/another@latest,以及 release 页上带校验和的压缩包。Windows 使用 ZIP 或 PowerShell:
Powershell
irm https://mjshao.fun/another/install.ps1 | iex
已有安装运行 another update,会沿用原安装来源升级。安装时,shell 名称空闲才添加 a → another;Homebrew 在首次交互运行时添加,避免安装沙箱写到临时 HOME。已有同名命令、函数或 alias 就跳过,重开 shell 后生效,也可运行 another aliases install。本地 make install 为开发版添加 a-dev 和 adev。TUI 内的 a 始终归档当前会话,u 撤销最近一次归档或可恢复的删除,Esc 关闭撤销提示,随后可继续浏览。首次运行会打开 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 | 中文