本文永久链接https://tonybai.com/2026/08/02/ccsa-claude-code-session-alias-tool

你有没有过这样的时刻:打开终端想 resume 昨天的某个 Claude Code session,却在 --resume 的列表里翻来翻去,最后干脆重开一个——于是好不容易攒下的上下文,又得从头喂一遍。

大家好,我是Tony Bai。

假设你同时在推进三条线:一个前端鉴权改造、一个后端 API 重构、一份技术调研。按最佳实践,每条线各开一个 Claude Code session,让上下文保持聚焦、互不污染。

头几天还好。可等你退出、隔天回来想接着干的时候,问题来了:

  • session ID 是一串 UUID(198d4193-3a16-4051-8dfa-a9dac573c933),你根本记不住哪条线对应哪个;
  • claude --resume 不带参数倒是弹个 picker,但它只列当前目录下的 session,你在 backend-api 目录里看不到 frontend-auth 那条;
  • claude --name xxx 只能在启动时设名,事后想起要改个名?没门;
  • 自动派生的名字(像 multi-agent-d5)也看不出具体在干嘛。

于是你只能要么重开 session 重喂上下文,要么把几个 UUID 存进备忘录贴来贴去。这件事很小,但每天都在发生。

Claude Code 的 session 机制,速览

为了说清痛点从哪来,先补一句背景。Claude Code 用 session 保留工作记忆,本地存成两类文件:

  • ~/.claude/sessions/<pid>.json —— 活跃 session 的注册表(含 sessionId、cwd、name、status);
  • ~/.claude/projects/<编码路径>/<sessionId>.jsonl —— 按项目存的 session 转录。

原生 CLI 给了三个相关能力:启动时 --name 命名、--resume <uuid> 恢复、--continue 续上当前目录最近一个。能力都有,但都卡在"要么事前、要么局部"——偏偏我们最缺的是"事后、跨项目、语义化"的别名。

ccsa 登场

cc-session-alias(命令名 ccsa)就是来填这个空白的。一句话定位:它不替代 claude --resume,只替你维护"别名 → UUID"的映射,并在恢复时把别名解析回 UUID 再交给 claude

它是个单二进制的 Go CLI,零运行时依赖、无 CGO、约 4MB,go install github.com/bigwhite/cc-session-alias@latest 即装即用。

五分钟上手

装好之后,最常见的链路长这样:

# 在某项目目录下,给当前最近活跃的 session 起个名
ccsa set agent-evolution

# 跨项目一览(短 ID + 项目名 + 创建日期)
ccsa list

# 看详情和存活态
ccsa info agent-evolution

# 一键 resume,还能透传参数给 claude
ccsa r agent-evolution --model fable

ccsa set 不带 --id 时,会自动发现当前工作目录最近的 session——它做了双层扫描:先扫活跃的 sessions/*.json,没有再 fallback 到历史转录 projects/<编码路径>/*.jsonl。所以你不需要手动去找 UUID。

恢复 session 有三种姿势,任选其一:

  • ccsa r <alias> —— 最短,进程直接被 claude --resume <uuid> 替换;
  • claude --resume <alias> —— 装个可选 shell wrapper 后,原生命令也透明支持别名(UUID 格式零开销透传,不认识的原样丢给 claude);
  • claude --resume $(ccsa get <alias>) —— 不装 wrapper,显式管道组合,最稳。

顺带还有 ccsa renameccsa rmccsa prune(清理指向已消失 session 的过期别名)和 ccsa info 显示的存活态——active (idle) / active (busy) / exited / gone,一眼看出这条 session 还在不在。

几个值得一提的小设计

不展开实现,只点三个让我觉得"这工具想清楚了"的地方:

一是双轨 resume。 ccsa r 走进程替换(syscall.Exec),没有多一层进程包装、TTY 控制干净;shell wrapper 则走 shell 函数拦截,对 UUID 输入零侵入。两条路独立工作,按你的习惯选。

二是存储很克制。 别名就存成一个 JSON:~/.cc-session-alias/aliases.json,目录 0700、文件 0600,写入走 tmp+rename 原子替换,文件坏了自动备份成 .bak 再起空表。人类可读可手改,没有数据库、没有后台进程。

三是 shell wrapper 的边界感。拦截 --resume/-r 的第一个参数,且只在参数不是 UUID 格式时才去解析;其它任何 claude 用法(claude -pclaude --continue、无参数等)一概不碰。装上之后你既有的肌肉记忆完全不受影响。

谁适合用

  • Claude Code 多线并行的重度用户:收益最直接,别名表一建,resume 不再翻列表。
  • 常在不同项目目录间跳的开发者ccsa list 给你一个跨项目的全局视图,--project 还能按项目过滤。
  • 喜欢把上下文管理做得干净的人:每个 session 一个语义化名字,配 prune 定期清理,别名表常年清爽。

上手建议与避坑

如果你打算试一下,给三条建议:

  1. 先在当前项目跑 ccsa set <一个你看一眼就知道在干嘛的名字>,体验下自动发现;命名规则是 [a-zA-Z0-9_-]、1–64 字符,别带空格和点。
  2. ccsa r 启用了 DisableFlagParsing,所以 --model 这类参数会原样透传给 claude——但也因此 r -h 不走 cobra 自动 help(工具自己处理了,会打一行用法)。这是有意的取舍。
  3. shell wrapper 是可选的。不装也能用 ccsa r 和管道姿势完整跑通;装了只是多一种"原生 claude --resume <别名>“的写法。装/卸用 ccsa install-hook / ccsa uninstall-hook,幂等、可回滚。

小结

回顾一下:Claude Code 的 session 机制本身够用,但"事后命名 + 跨项目视图 + 语义化恢复"这一块是空白。ccsa 用一个 4MB 的单二进制填上了它——set 自动发现、list 跨项目、info 三态存活、r 一键 resume,外加可选的透明 shell wrapper。

升华一句:好的工具不是替你做决定,而是把你已经在做的、重复而琐碎的那一步,缩短到三字符。 如果你也常在 --resume 的列表里翻找,不妨给 ccsa 一个机会。

如果哪天claude code原生自带session alias机制,那就果断丢掉这个工具就好^_^。不过在那之前,可以试用一下ccsa:

# From source (recommended)
go install github.com/bigwhite/cc-session-alias@latest

觉得好用的话,给个 ⭐ 是对开源作者最直接的鼓励。



还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。