Asia/Shanghai
ProjectsSeptember 7, 2026

another

image
another is a local terminal tool that browses coding-agent sessions across ten agents and carries one into a different agent's own native store. The migrated session opens with that agent's own resume command — codex resume, claude --resume, pi --session — because it is a real session there, not a pasted summary. It is not a hosted service, a proxy, or a chat client. It reads each agent's local storage, keeps a private SQLite index under ~/.cache/another/ (%LOCALAPPDATA%\another on Windows), and writes only where the target agent expects its sessions to be. When a model runs out of quota, or the work turns out to want a different one, the usual escape is to summarize the conversation and paste it somewhere else. That throws away the original and asks you to re-explain what was already understood. The interesting artifact is the session, so the tool moves the session. Every migration reloads what it wrote and compares a content digest before reporting success. A failed verification removes only the artifact that migration created; the source session is never mutated. What crosses the boundary: ordered user and assistant text, timestamps the target supports, the project directory, the title, and a migration marker used for deduplication and verification. What does not: provider-specific reasoning signatures, tool calls, tool results, images, and system records, because they have no portable equivalent. Three context modes decide how much of a long session travels. auto keeps all cleaned turns when they fit and otherwise selects recent working context, full preserves every cleaned turn even when the destination may compact it, and recent always produces a bounded recent view. Pi, OpenCode, Claude Code, Codex, Antigravity, and Qwen Code enter every release regression pass. CodeM remains a compatibility adapter offered in setup; Cursor, CommandCode, and Hermes keep their adapters for existing configurations, but setup no longer offers them to new users. OpenCode V1 history and V2 sessions share one provider, while operations use each session's actual store and matching CLI. Existing opencode2, open-code-2, and o2 aliases continue to work; new migrations target V2. Session management is capability-driven. Rename, archive, relocate, and delete appear only where that agent implements the corresponding native operation, and they change the agent's own state rather than an another-only marker that would disappear on refresh. First-run setup starts with nothing selected: detection means available, never chosen. The same rule decides what can be taken back. A Pi or Claude Code session is one file, so a delete keeps those exact bytes and u writes them back under the same ID, path, and modification time. OpenCode 2's server owns its deletes, and replaying the conversation through the API would produce a copy under a new ID, so there is no undo there and the confirmation says which case you are in before you commit. Relocation follows the same line: carrying a session into another project directory uses the agent's own move, never a re-render that would quietly drop tool calls. Antigravity has no delete of its own, but everything a conversation owns is filed under its id: the brain directory, the trajectory database beside it, the annotation that holds the title, and an older summary row. another removes that set, refuses a conversation Antigravity currently has open, and offers no undo, because there is no single file to hold. The archive cell stays a dash for the same reason: Antigravity keeps no archived state anywhere, so filling it would mean another remembering it alone. Codex needed more than one write path. It keeps a session's name in the CLI thread store, the legacy session_index.jsonl, and the Electron state its Desktop sidebar actually reads, so rename writes all three — and when Desktop is running and would overwrite its own state, the interface says the sidebar catches up on restart instead of reporting a failure. CodeM now exposes its native title and archive state too. another writes the same session_renamed record CodeM reads and moves transcripts through CodeM's own archived/ directory. Because CodeM keys sessions by a hash of the literal working directory, moved paths and symlinks used to orphan otherwise intact sessions. another now resumes the original JSONL in place through CodeM's own LINCO_SESSIONS_ROOT, exposing only that session's original project-hash directory and never a same-ID session elsewhere. With an agent named in setup, r asks it in the background for one title under a fixed contract: MMDD|类型|主题 in Chinese, MMDD|Type|Topic in English. The date comes from the indexed creation time converted to Asia/Shanghai, never from the model, and suggestions that miss the contract, arrive after the box closes, or fail outright are discarded without touching what you typed. Batch renaming marks sessions with x and runs on r. The review page lists only rows that would change, folds frozen, failed, and unchanged rows into counts, retries transient failures once, and verifies each row on apply. Headless title runs leave their own sessions behind in several CLIs; another recognizes those leftovers and keeps them out of its index without touching the agent's own files. On OpenCode 2.0.4, the optional title plugin now adds the session's creation date before OpenCode saves the first automatic title. This avoids relying on a later rename event, which could be missed and leave Type|Topic without a date. After upgrading another, run another integrations install opencode to refresh the plugin. Existing session titles are not rewritten. Claude Code sessions can be named on their way out as well. A SessionEnd hook, added by hand to ~/.claude/settings.json, runs another rename --auto in the background once the session has ended and skips any session that already carries a hand-set title. It is a weaker contract than the OpenCode 2 plugin, one extra model call per session and no way to suppress a title Claude Code wrote itself, and it is the strongest one Claude Code offers. The same command works from a shell: another rename <id> --title "..." or --auto.
  • Sessions are read from each agent's native local store; nothing is uploaded.
  • On Unix, the configuration directory is mode 0700; configuration and index files are 0600.
  • d defaults to Cancel and shows provider, title, project, and full session ID; identified active sessions are protected.
  • Title suggestions borrow an agent CLI you already authenticated. another stores no API keys of its own.
  • Disabling an agent in setup removes only its local index rows, never its native sessions.
  • If one session ID remains in both an old and a new project directory, the message-bearing transcript wins over a newer metadata-only snapshot, keeping the listed title, path, and count aligned with native resume.
The current release is v0.20.1 for macOS, Linux, and Windows on amd64 and arm64. macOS/Linux use Homebrew or the shell installer; Windows uses the PowerShell installer or a checksum-verified ZIP. Source installation through go install is also available. Existing installations can run another update, which delegates to their install source. 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. 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. The model list setup offers for OpenCode now comes from OpenCode's own server, so it matches what /models shows inside the client, custom providers from your opencode.json(c) included. The previous source resolved a catalog for the probe's own throwaway directory and answered with a half-resolved one; a build without the endpoint still falls back to it. The browser and setup recheck terminal dimensions and redraw the full frame every two seconds without clearing first. Returning focus, when supported, or resuming the process triggers immediate screen repair; Ctrl+L redraws manually. Input, selection, and dialogs stay intact. This repairs display state without rescanning sessions; s refreshes the data. Script installs add a → another if the shell name is free; Homebrew, manual, and source installs do so on the first interactive launch. Existing commands, functions, and aliases are preserved, and repeat installs do not duplicate definitions. Open a new shell to use it, or run another aliases install explicitly. make install adds a-dev and adev for another-dev. Inside the TUI, a always archives the current session, u undoes the latest archive or reversible delete, and Esc dismisses the offer even while the list refreshes.
Powershell
irm https://mjshao.fun/another/install.ps1 | iex
Windows CI runs the full suite. Real Windows VM checks cover setup, indexing, preview, Codex handoff, and live-executable replacement; other agents' native Windows handoff remains a coverage gap. Linux is verified the same way on two real machines — a headless Ubuntu container and an Ubuntu desktop VM — covering the installer, XDG paths, detection, migration, handoff into real codex resume and OpenCode, self-update, and the clipboard with and without wl-clipboard. another began as a fork of CyrusSE/agenthop under the MIT License and now has its own module path, provider contracts, TUI, setup flow, and release surface.
another 是一个本地终端工具:在十个 coding agent 的会话之间浏览、管理,并把其中一条迁移到另一个 agent 自己的原生存储里。迁移后的会话用那个 agent 自己的命令打开 —— codex resume、claude --resume、pi --session —— 因为它在那边就是一条真实会话,不是粘贴进去的摘要。 它不是托管服务,不是代理,也不是聊天客户端。它读取各 agent 的本地存储,在 ~/.cache/another/(Windows 为 %LOCALAPPDATA%\another)下维护一份私有 SQLite 索引,只往目标 agent 存放会话的位置写。 模型用完额度,或者手上这段活更适合另一个模型时,常规做法是总结一遍再粘到另一边。这等于丢掉原件,然后把已经讲清楚的事重讲一次。真正有价值的东西是会话本身,所以这个工具搬的就是会话本身。 每次迁移都会重新加载写入结果并比对内容摘要,通过后才报告成功。校验失败只删除这次迁移创建的产物,来源会话自始至终不动。 会跨过边界的:按顺序排列的用户与 assistant 文本、目标格式支持的时间戳、项目目录、标题,以及一个用于去重和校验的迁移标记。不会跨过去的:供应商特有的推理签名、工具调用与结果、图片和系统记录 —— 它们没有可移植的等价物。 长会话带多少由三种上下文模式决定:auto 在放得下时保留清理后的全部轮次,否则选择近期工作上下文;full 保留全部轮次,即使目标端可能压缩;recent 始终生成有长度上限的近期上下文。 Pi、OpenCode、Claude Code、Codex、Antigravity 和 Qwen Code 进入每次发布的回归检查。CodeM 保留兼容适配并在 setup 中提供;Cursor、CommandCode 和 Hermes 的适配仍在,已有配置照常可用,但 setup 不再向新用户提供。OpenCode V1 历史和 V2 会话共用一个 provider,操作仍使用会话实际存储和匹配的 CLI。已有 opencode2、open-code-2、o2 别名继续可用,新迁移写入 V2。 会话管理按能力提供。重命名、归档、迁目录、删除只在该 agent 有对应原生操作时出现,而且改的是这个 agent 自己的状态,不是一份刷新后就消失的 another 私有标记。首次 setup 不预选任何 provider:检测到只代表「可用」,不代表「已选」。 能不能撤销也按同一条线判断。Pi 和 Claude Code 的会话就是一个文件,删除时 another 先留住这份字节,按 u 原样写回,ID、路径、修改时间都不变。OpenCode 2 的删除由服务端执行,把对话通过 API 推回去只会得到一个新 ID 的副本,所以那里没有撤销,确认框会先说清楚你在哪一种里。迁目录同理:把会话搬进另一个项目目录,用的是 agent 自己的移动能力,绝不重新渲染一遍、悄悄丢掉工具调用。Antigravity 自己没有删除命令,但一条会话的东西都挂在它的 id 下:brain 目录、旁边的轨迹数据库、存标题的 annotation 文件,以及老版本留下的 summary 行。another 把这一组一起删掉,正在被 Antigravity 打开的会话会被拒绝,也没有撤销,因为没有一个单文件可以先攥在手里。归档那格保持横线,原因相同:Antigravity 没有任何归档状态,填上就等于 another 自己记一份。 Codex 需要不止一条写入路径。它把会话名存了三处:CLI 的线程库、旧版 session_index.jsonl,以及 Codex Desktop 侧边栏实际读的 Electron 状态,重命名三处全写。Desktop 正在运行、会整份重写自己状态时,界面会说明侧边栏需等它重启才更新,而不是把这次重命名报成失败。 CodeM 现在也开放了原生标题和归档状态。another 写入 CodeM 自己读取的 session_renamed 记录,并通过 CodeM 的 archived/ 目录归档和恢复转录。CodeM 用工作目录字面路径的哈希定位会话,目录移动或符号链接曾会让完好的会话失联。现在 another 通过 CodeM 自己的 LINCO_SESSIONS_ROOT 原地恢复原 JSONL,只暴露该会话原来的项目哈希目录,不会碰到别处的同名 ID。 setup 里指定 agent 后,r 会在后台请求一个标题,规则固定:中文 MMDD|类型|主题,英文 MMDD|Type|Topic。日期取自索引里的创建时间并转换到 Asia/Shanghai,不交给模型猜;不符合格式、晚到或失败的建议一律丢弃,不覆盖已经输入的文字。 批量重命名用 x 标记会话,r 触发。确认页只列出会变更的行,冻结、失败和无变化折成计数,瞬时失败自动重试一次,应用时逐行回读验证。几个 CLI 会为每次无头调用留下自己的会话,another 能认出这些残留并挡在索引之外,同时不动 agent 自己的文件。 OpenCode 2.0.4 的可选标题插件现在会在首次自动命名保存前补上会话创建日期,不再依赖可能漏掉的后续重命名事件。升级 another 后运行 another integrations install opencode 更新已装插件;已有会话标题不会被追改。 Claude Code 的会话也可以在结束时补上名字。一个 SessionEnd hook 在会话结束后于后台运行 another rename --auto,已经有手动标题的会话会跳过;hook 要你自己加进 ~/.claude/settings.json,another 不改你的配置。这比 OpenCode 2 插件的约束弱:每条会话多一次模型调用,Claude Code 自己起的标题也只能被盖过、不能被拦下,但这已经是 Claude Code 目前能给的最强接口。同一条命令在 shell 里也能用:another rename <id> --title "..." 或 --auto。
  • 会话来自各 agent 的原生本地存储,不上传任何内容。
  • Unix 下配置目录为 0700,配置与索引文件为 0600。
  • d 默认停在取消,并显示 provider、标题、项目和完整会话 ID;已识别的活动会话受保护。
  • 标题建议借用你已经登录的 agent CLI,another 不保存自己的 API key。
  • 在 setup 里关掉某个 agent,只删除它的本地索引行,不动它的原生会话。
  • 同一个会话 ID 同时留在新旧项目目录时,含真实消息的 transcript 优先于较新的空状态快照,列表里的标题、路径和消息数会与原生恢复结果一致。
当前版本 v0.20.1,支持 macOS、Linux 和 Windows 的 amd64 / arm64。macOS/Linux 使用 Homebrew 或 shell 安装脚本,Windows 使用 PowerShell 安装脚本或带校验和的 ZIP,也可通过 go install 从源码安装。已有安装运行 another update,会沿用原安装来源升级。 v0.20.1 让切换视图时列表保持不动:按 g 在不分组、按日期、按目录之间切换,任何一列都不移动;按 t 也不再改变顶栏宽度,没有时间窗时显示「全部时间」。v0.20.0 把常用键挪到单个字母(r 重命名、d 删除、s 刷新,原来的 Ctrl 组合键仍可用),/ 支持 path:目录,手机宽度的终端里每行把宽度让给标题。运行 another update 升级。 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 秒),超时也会明确报告为超时。 setup 里给 OpenCode 选模型的那份列表,现在直接问 OpenCode 自己的服务器,与客户端里 /models 看到的完全一致,opencode.json(c) 里自定义的 provider 也在其中。之前那条路要为探测用的一次性临时目录现解析一份目录,拿回来的是还没解析完的中间态;旧版本没有这个端点时仍回落到它。 主界面和设置页每两秒复测终端尺寸并完整重画,不先清空屏幕;支持焦点通知时,切回窗口立即修复,进程恢复时也会立即修复。Ctrl+L 可手动重绘,输入、选择和弹窗保持原样。这只修复显示状态,不重新扫描会话;刷新数据按 s。 脚本安装时,名称空闲才添加 a → another;Homebrew、手动下载和源码安装在首次交互运行时添加。已有同名命令、函数或 alias 就跳过,重复安装不重复追加,打开新 shell 后生效,也可运行 another aliases install 手动补装。make install 为 another-dev 添加 a-dev 和 adev。TUI 内的 a 始终归档当前会话,u 撤销最近一次归档或可恢复的删除,Esc 关闭撤销提示,列表刷新中也能返回普通列表。
Powershell
irm https://mjshao.fun/another/install.ps1 | iex
Windows CI 运行全量测试;Windows 实机已验证 setup、索引、预览、Codex 交接和运行中二进制替换,其他 agent 的 Windows 原生交接仍是覆盖缺口。Linux 同样在两台真机上验证——一台无头 Ubuntu 容器和一台 Ubuntu 桌面虚拟机——覆盖安装脚本、XDG 路径、检测、迁移、交接进真实的 codex resume 与 OpenCode、自更新,以及有无 wl-clipboard 两种剪贴板情况。another 起自 CyrusSE/agenthop 的 fork,遵循 MIT 许可,如今拥有自己的模块路径、provider 契约、TUI、setup 流程和发布体系。

Related projects

Clean Design

Clean Design

Use the AI tools you already have to create editable visual projects that stay on your Mac.
Codex Minus

Codex Minus

面向 macOS 与 Windows 的精简 Codex 管理工具:安全切换供应商,管理官方与自定义模型目录,并保护 OAuth 与 Context。
JumpOTP

JumpOTP

面向授权 SSH/JumpServer 会话的按需 TOTP 助手。仅在严格匹配提示后调用已解锁的 Bitwarden CLI,每条连接最多自动提交一次,并保留可见手输回退。
Codex Doubao Pets

Codex Doubao Pets

六个可以直接安装到 Codex Desktop 的豆包桌宠。用真实角色图完成选择,用一条 npm 命令完成安装。
loop

loop

一次显式触发,按产物就绪状态自动连接 deep-grill、deep-design 和 deep-build,持续推进到已确认规格或可验证结果。
Slash Saver

Slash Saver

一个只为物理斜杠键做一件事的原生 macOS 工具:在原始按键进入当前应用前,切到用户指定的 ASCII 输入源。
deep-grill

deep-grill

同一个 Agent Skill,用探索模式把原始想法变成已确认 Product Brief,用审查模式压力测试成形方案,并在普通回复中持续当前会话。
Mingjian AI Services

Mingjian AI Services

A focused collaboration entry for teams moving from AI ideas to working products, Agent systems, and operable business workflows.
opencode-sub2api-haiku-fix

opencode-sub2api-haiku-fix

A focused OpenCode plugin that fixes Claude Haiku extra-usage failures through Sub2API while preserving thinking and leaving Sub2API, OpenCode, and OMO untouched.
opencode-metrics

opencode-metrics

OpenCode TUI 的分会话侧边栏指标插件。按 sessionID 记录速度、TTFT、token、缓存、计时,只显示你当前 attach 的会话,而不是 serve 模式下的全局汇总。
opencode-plugin-fixes

opencode-plugin-fixes

Archived OpenCode guardrail experiment. The final source tree covers four narrow tool-call repairs; no npm package was ever published.
opencode-vibe-island-plugin

opencode-vibe-island-plugin

让 Vibe Island 在装了 oh-my-openagent 时仍然把 OpenCode 会话当成 OpenCode。修好 source 误标和 Ghostty 点击跳转。
OpenCode Themes

OpenCode Themes

Terminal-inspired dark themes for Obsidian, Typora, and Ghostty, all synced to the official OpenCode TUI palette.
wechat-mp-publisher

wechat-mp-publisher

从个人公众号 Skill 到可公开安装的 npm 包:本地校验与沙箱预览在前,用户确认后只创建草稿。
SIGINT

SIGINT

已归档的内容情报实验:曾把小红书/抖音采集、AI 分析、n8n 编排与实时仪表盘接成一条完整链路。
MdictLive

MdictLive

Modern web reader for MDict dictionaries with React 19 SPA, dark mode, and faithful rendering.
SiliconLM

SiliconLM

Local LLM dashboard for Apple Silicon Macs, currently preserved without an active local deployment.
mdx2apple

mdx2apple

Convert complete MDict entries into native macOS dictionaries, with pronunciation, illustrations and Oxford dark-mode styling.