本文永久链接 – 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 rename、ccsa rm、ccsa 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 -p、claude --continue、无参数等)一概不碰。装上之后你既有的肌肉记忆完全不受影响。
谁适合用
- Claude Code 多线并行的重度用户:收益最直接,别名表一建,resume 不再翻列表。
- 常在不同项目目录间跳的开发者:
ccsa list给你一个跨项目的全局视图,--project还能按项目过滤。 - 喜欢把上下文管理做得干净的人:每个 session 一个语义化名字,配
prune定期清理,别名表常年清爽。
上手建议与避坑
如果你打算试一下,给三条建议:
- 先在当前项目跑
ccsa set <一个你看一眼就知道在干嘛的名字>,体验下自动发现;命名规则是[a-zA-Z0-9_-]、1–64 字符,别带空格和点。 ccsa r启用了DisableFlagParsing,所以--model这类参数会原样透传给 claude——但也因此r -h不走 cobra 自动 help(工具自己处理了,会打一行用法)。这是有意的取舍。- 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技能再上一个新台阶!

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