打造能交互的AI编程CLI:claude-code-from-scratch会话持久化与REPL命令实现解析
【免费下载链接】claude-code-from-scratchBuild your own Claude Code from scratch. 🔍 Claude Code 开源了 50 万行代码,读不动?用 ~5000 行 TypeScript / Python 从零复现核心架构,11 章分步教程带你理解 coding agent 精髓项目地址: https://gitcode.com/gh_mirrors/cl/claude-code-from-scratch
想做一个能交互的 AI 编程 CLI,却不知道会话怎么保存、REPL 命令怎么写?开源教程项目 claude-code-from-scratch 用约 5000 行 TypeScript / Python 代码,从零复现了 Claude Code 的核心架构,其中「CLI 与会话」一章(第 4 章)完整演示了REPL 交互循环、Ctrl+C 优雅中断、会话持久化与 --resume 恢复的全套实现。本文带你用最少的心智负担读懂这套设计,照着写就能给自己的 AI Agent 加上"记得住对话"的能力。
一、项目是什么:读不动 50 万行,就看这 5000 行
claude-code-from-scratch 定位是分步教程:13 章内容,从 Agent Loop 讲到 MCP 集成,每章代码都能一条命令跑起来、无需 API key。本章涉及的两个核心文件非常小:
| 文件 | 职责 |
|---|---|
| src/cli.ts | 命令行入口:参数解析、REPL 循环、命令分发 |
| src/session.ts | 会话持久化:保存 / 加载 / 列出会话 |
Python 版在 python/mini_claude/session.py 和 python/mini_claude/main.py,设计与 TS 版一一对应,适合双语言读者对照阅读。
二、CLI 入口:两种运行模式,一套参数解析
一次 for 循环解析 11 个开关
入口函数 parseArgs() 手写了一个for循环来解析参数,刻意不引 commander.js——理由很简单:参数只有十来个,零依赖更轻。它支持:
- 权限模式:
--yolo、--plan、--accept-edits、--dont-ask、--auto - 运行控制:
--resume、--max-cost 0.50、--max-turns 20 - 模型配置:
--model、--api-base、--thinking
一个易被忽略的细节:API key 只从环境变量读取,禁止走命令行参数,避免密钥泄露到 shell history。
单次模式 vs REPL 交互模式
main() 里的分流逻辑只有一行判断:
命令行带了 prompt →单次模式(执行完即退出);没带 → 进入REPL 交互模式。
mini-claude "修复 src/app.ts 里的 bug" # 单次模式 mini-claude --resume # 恢复上次会话,进入 REPL这正是 AI 编程 CLI 的标准形态:脚本场景走单次模式,日常开发走交互模式。
三、会话持久化:关掉终端,对话不丢失
这是本章最有价值的部分——让 Agent "记得住"。
每轮对话自动写入本地 JSON
Agent 每完成一轮chat()就会调用 autoSave(),把整个消息数组连同元数据(会话 id、模型、工作目录、开始时间、消息数)写成 JSON,落在~/.mini-claude/sessions/<id>.json。两个值得抄的设计:
- 静默容错:保存逻辑包在
try/catch里空吞异常——磁盘满了也不该让正在进行的对话崩掉; - 会话 id 用 8 位随机串(agent.ts 中
randomUUID().slice(0, 8)),多个会话互不覆盖。
saveSession / loadSession 本体只有十几个函数行:writeFileSync写盘、JSON.parse读回,文件不存在就返回null。
--resume 一键恢复上次会话
getLatestSessionId() 扫描会话目录、按startTime倒排,取出最新一个;CLI 启动时--resume分支(cli.ts)把它加载回 Agent,并打印(Session restored (N messages))。
官方演示(无需 API key,本地 mock 模型驱动):
$ node steps/run.mjs 4 mini-claude Remember that my favorite color is blue. mini-claude --resume What is my favorite color? Got it — your favorite color is blue. (resumed 2 messages) Your favorite color is blue.先记住一件事 → 关掉进程 →--resume接着问,AI 还记得。完整文档见 docs/04-cli-session.md。
💡真实 Claude Code 的差异:生产实现用JSONL 追加写入而非整体 JSON 覆盖——写入中途崩溃不会损坏整个文件,恢复时跳过末尾不完整行即可。这是一个很值得进阶研究的方向。
四、REPL 命令大全:让 AI 编程助手听话又好用
REPL 循环由 runRepl() 实现:readline读一行 → 分发命令 →agent.chat()→ 再读一行。内置命令一览:
| 命令 | 作用 |
|---|---|
/clear | 清空对话历史,重新出发 |
/cost | 查看累计 token 用量与费用估算 |
/compact | 手动触发上下文压缩 |
/plan | 切换 Plan 模式(只读规划 ↔ 正常执行) |
/goal <条件> | 设定目标,跨轮次持续执行直到评估器判定达成 |
/loop [间隔] <prompt> | 定时或自主节奏重跑 prompt |
/memory、/skills | 列出已保存记忆 / 可用技能 |
/<技能名> | 直接调用技能,如/commit "fix types" |
两个工程细节让这套 REPL 特别"稳":
- Ctrl+C 双重语义:Agent 正在跑时按下 → 中断当前轮次,回到输入提示;空闲时按下 → 第一次提示"再按一次退出",第二次才退出。既防止手滑丢失会话,也让你能在 Agent 跑偏时 3 秒内叫停——中断的成本永远低于撤销的成本。
rl.once而非rl.on:每次只监听一行,处理完再递归注册下一行,保证严格串行,避免多个chat()并发修改消息历史。
五、为什么坚持终端原生,不做浏览器界面?
这是一个主动选择,好处很实在:
- ✅SSH 环境可用,服务器远程开发不丢工作流
- ✅可接管道:
echo "fix the bug" | mini-claude - ✅tmux 多实例并行,内存开销接近零
- ✅ 像
git、grep一样自然嵌入现有命令行工作流
真实 Claude Code 在终端里跑了一整套 React/Ink 组件框架(流式 Markdown、Vim 模式、多 Tab),本质是弥补终端交互限制、让复杂 UI 可维护——这正是本项目"最小实现"与"生产实现"的分界线。
六、快速上手:安装并跑起来
git clone https://gitcode.com/gh_mirrors/cl/claude-code-from-scratch cd claude-code-from-scratch npm install && npm run build export ANTHROPIC_API_KEY="sk-ant-xxx" npm start # 进入交互式 REPL npm start -- --resume # 恢复上次会话Python 版(3.11+):cd python && pip install -e .后运行mini-claude-py,详见 python/README.md。
不想配 key 也可以直接体验教程:node steps/run.mjs 4一条命令跑第 4 章演示,加--py换 Python 版、--diff看本章新增代码。
写在最后
会话持久化 + REPL 命令 + 优雅中断,三者加起来不过几百行代码,却是 AI 编程 CLI 从"能跑"到"好用"的关键一步。项目里 test/integration/loop-repl.test.mjs 和 test/integration/retry.test.mjs 还给出了这些行为的自动化测试写法,建议跟着 test/TEST-GUIDE.md 一起看。5000 行代码、13 章教程,足以让你彻底理解 coding agent 的会话与交互机制。
【免费下载链接】claude-code-from-scratchBuild your own Claude Code from scratch. 🔍 Claude Code 开源了 50 万行代码,读不动?用 ~5000 行 TypeScript / Python 从零复现核心架构,11 章分步教程带你理解 coding agent 精髓项目地址: https://gitcode.com/gh_mirrors/cl/claude-code-from-scratch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考