我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的
目标读者 :对 AI 辅助开发感兴趣的开发者,想了解 Rust 迁移实战经验的工程师
核心价值 :展示 Vibe Coding + OpenSpec 开发范式的真实体验,以及 Node.js 到 Rust 迁移的完整路径
阅读时间:8 分钟
一句话摘要:用 OpenSpec 规划 + Vibe Coding 实施,我在4小时内将一个 Node.js CLI 工具迁移到 Rust,启动速度提升 13 倍,内存占用降低 12 倍。

背景:一个 "够用" 的 Node.js CLI 工具
codeagent-wrapper 是我开发的一个 AI CLI 后端封装工具,它能统一调用 Claude、Codex、Gemini、Opencode 等多个 AI 后端。Node.js 版本已经稳定运行了一段时间,功能完善,测试覆盖也不错。
但有个问题一直困扰着我:冷启动时间太长了。
每次执行命令,都要等 80ms 的启动时间。这对于一个需要频繁调用的 CLI 工具来说,体验并不好。更别提 35MB 的内存占用和对 Node.js 运行时的依赖。
"够用"和"好用"之间,差的就是这 80ms。

冲突:传统开发 vs Vibe Coding
传统的 Rust 迁移路径是这样的:
- 花两周学习 Rust 所有权机制
- 写几个练手项目
- 重新设计架构
- 逐行翻译代码
- 调试各种生命周期问题
- 配置 CI/CD
- 发布
这个流程没问题,但太慢了。
我选择了另一条路:Vibe Coding。
什么是 Vibe Coding?
Vibe Coding 不是让 AI 替你写代码,而是一种人机协作的开发范式:
- 你负责设计决策和方向把控
- AI 负责实现细节和问题排查
- 你们通过对话不断迭代
关键在于:你要清楚自己想要什么,AI 帮你实现它。
这次迁移,我和 Claude 的对话记录超过了 50 轮。每一轮都在解决具体问题,推进项目向前。
从 OpenSpec 开始:用规范驱动迁移
Vibe Coding 不是漫无目的的对话。我用 OpenSpec 工作流来管理整个迁移过程。
OpenSpec 是一个变更管理框架,核心流程是:
Proposal(提案)→ Apply(实施)→ Archive(归档)
第一步:创建迁移提案(migrate-to-rust)
在动手写代码之前,我先创建了一个正式的变更提案:
- 目标:将 codeagent-wrapper 从 Node.js 迁移到 Rust
- 范围:核心执行引擎、JSON 解析器、CLI 入口、配置系统
- 验收标准:启动时间 < 10ms,内存 < 10MB,所有测试通过
提案不是形式主义。它强迫你在动手前想清楚:要做什么,不做什么,怎么验证成功。
第二步:任务分解与实施
提案通过后,我把迁移拆解成 21 个具体任务:
- 项目结构初始化
- 核心数据结构定义
- 配置解析模块
- 后端抽象层
- JSON 流解析器
- 执行引擎
- 并行任务调度
- CI/CD 配置
- ...
每个任务都有明确的输入和输出。AI 和我一起逐个完成,每完成一个就标记为 done。
进度可视化让你知道自己在哪里,还差多远。
第三步:归档与复盘
迁移完成后,我把整个变更归档为 2026-01-31-migrate-to-rust。
归档不只是存档。它记录了:
- 做了什么决策,为什么
- 遇到了什么问题,怎么解决的
- 下次类似迁移可以复用什么
好的工程实践不只是把事情做完,而是让做过的事情可复用。
后来我又创建了第二个提案 fix-rust-code-quality,专门处理代码质量问题。21 个任务全部完成,通过 OpenSpec 的验证机制确保了每一项都符合标准。
真实的迁移过程:一路踩坑一路修
第一个坑:GitHub Actions 的 Action 名称
当我满怀信心地推送代码,CI 立刻报错:
Error: Unable to resolve action `dtolnay/rust-action@stable`
我以为是 rust-action,实际上应该是 rust-toolchain。这种命名陷阱,靠记忆几乎不可能避免。
AI 帮我快速定位:
"找到问题了!Action 名称错误:dtolnay/rust-action 不存在,正确的是 dtolnay/rust-toolchain。"
一分钟修复,继续推进。
第二个坑:Linux ARM64 交叉编译
推送后,macOS 和 Linux x86_64 都构建成功,但 Linux ARM64 失败了:
rust-lld: error: is incompatible with elf64-x86-64
这是交叉编译的经典问题:链接器格式不匹配。
传统解决方案是安装 gcc-aarch64-linux-gnu,但这治标不治本。AI 给了一个更优雅的方案:
"使用 cross 工具。cross 通过 Docker 容器提供完整的目标架构编译环境,从根本上解决链接器兼容性问题。"

第三个坑:.gitignore 的意外惊喜
CI workflow 文件怎么都推不上去,git 说被 .gitignore 忽略了。
检查后发现,我的 .gitignore 里有 .github 规则,本意是忽略某些临时文件,结果把整个 .github/workflows 目录都忽略了。
细节决定成败,这种问题人工排查可能要半小时,AI 一眼就看出来了。
第四个坑:GitHub Release 文件名冲突
终于到了发布环节,结果又报错:
Error: Failed to upload release asset checksums.txt. received status code 404
原因:每个平台的构建产物都有自己的 checksums.txt,上传时文件名冲突。
解决方案:将所有二进制文件复制到统一的 release 目录,生成一个合并的 checksums.txt。
第五个坑:Git tag 指向了错误的 commit
打了 tag,推了代码,CI 却跳过了 Release 步骤。
原因:我在打 tag 后又提交了一个格式化修复的 commit,导致 tag 指向的是旧 commit,而不是最新的代码。
解决方案:删除远程 tag,重新在最新 commit 上打 tag:
bash
git push origin :refs/tags/v1.0.0-rust
git tag -a v1.0.0-rust -m "Release v1.0.0-rust"
git push origin v1.0.0-rust
这个坑差点让我以为 CI 配置有问题,AI 帮我从 git log 中发现了真相。
成果:数字说话
迁移完成后,性能提升是实打实的:
| 指标 | Node.js | Rust | 提升 |
|---|---|---|---|
| 冷启动 | ~80ms | 6ms | 快 13 倍 |
| JSON 解析 (1K 事件) | ~23ms | 1.03ms | 快 22 倍 |
| JSON 吞吐量 | ~10 MiB/s | 100 MiB/s | 快 10 倍 |
| 内存占用 | ~35MB | ~3MB | 降低 12 倍 |
| 二进制大小 | N/A | 2.1MB | 单文件零依赖 |
更重要的是:用户不再需要安装 Node.js 环境。
下载二进制,chmod +x,直接运行。这才是 CLI 工具应有的体验。

代码质量:不只是能跑就行
第二天,我又和 AI 一起完成了代码质量修复:
- 移除全局
#![allow(clippy::all, dead_code)]指令 - 使用
cargo clippy --fix自动修复 15 个警告 - 为预留的公开 API 添加带注释的局部
allow(dead_code) - 运行
cargo fmt统一代码格式 - 确保
cargo clippy -- -D warnings零警告
临时方案可以让你快速上线,但代码质量债务要及时还清。
最终,33 个测试全部通过,CI 完全绿灯。
Vibe Coding 的关键心法
回顾这次迁移,我总结了几个 Vibe Coding 的关键点:
1. 先规划,再动手
OpenSpec 工作流强迫我在写第一行代码之前就想清楚:目标是什么,边界在哪里,怎么验证成功。
没有规划的 Vibe Coding 只是在瞎聊。
2. 任务分解,逐个击破
21 个任务看起来很多,但每个任务都足够小,可以在一轮对话中完成。
大象要一口一口吃,复杂项目要一个任务一个任务做。
3. 快速迭代,不怕报错
这次迁移遇到了至少 10 个不同的错误。每一个错误都是学习机会。
与其花时间预防所有可能的问题,不如快速尝试,遇到问题再解决。
4. 信任 AI,但验证结果
AI 给的方案大多是对的,但偶尔也会有偏差。关键是要验证结果:
- CI 是否通过?
- 测试是否全绿?
- 性能是否达到预期?
数字不会说谎。
5. 保持对话上下文
Vibe Coding 的效率很大程度上来自于对话的连续性。AI 记得之前的问题和解决方案,可以在此基础上继续推进。
断开对话意味着丢失上下文,效率大打折扣。
6. 归档复盘,知识复用
完成后归档整个变更过程。下次做类似的迁移,可以直接复用这些经验,而不是从零开始。
好的工程师不只是解决问题,而是让解决方案可复用。
结语:Vibe Coding 是一种技能
Vibe Coding 不是躺平让 AI 干活。它是一种新的技能:
- 知道如何用 OpenSpec 规划变更
- 知道什么问题值得问
- 知道如何描述问题
- 知道如何验证答案
- 知道何时自己动手
这次迁移,我一行 Rust 代码都没手写。但我做了所有的设计决策、问题定义和质量把控。
OpenSpec 提供了规范的变更管理框架,Vibe Coding 提供了高效的人机协作方式。两者结合,让复杂的技术迁移变得可控、可追溯、可复用。
这就是 Vibe Coding:人定义方向,AI 实现细节,规范保障质量,人机协作创造价值。
项目链接
- GitHub: codeagent-wrapper-rs
- Release: v1.0.1-rust