我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的

我是如何 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 迁移路径是这样的:

  1. 花两周学习 Rust 所有权机制
  2. 写几个练手项目
  3. 重新设计架构
  4. 逐行翻译代码
  5. 调试各种生命周期问题
  6. 配置 CI/CD
  7. 发布

这个流程没问题,但太慢了

我选择了另一条路: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 个具体任务

  1. 项目结构初始化
  2. 核心数据结构定义
  3. 配置解析模块
  4. 后端抽象层
  5. JSON 流解析器
  6. 执行引擎
  7. 并行任务调度
  8. CI/CD 配置
  9. ...

每个任务都有明确的输入和输出。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 一起完成了代码质量修复:

  1. 移除全局 #![allow(clippy::all, dead_code)] 指令
  2. 使用 cargo clippy --fix 自动修复 15 个警告
  3. 为预留的公开 API 添加带注释的局部 allow(dead_code)
  4. 运行 cargo fmt 统一代码格式
  5. 确保 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 实现细节,规范保障质量,人机协作创造价值。


项目链接

相关推荐
下午写HelloWorld2 小时前
生成对抗网络GAN的简要理解
人工智能·神经网络·生成对抗网络
Lethehong2 小时前
探索高效工作流的秘密:GLM-4.7 与 Dify 平台深度集成实践
大数据·人工智能·算法
Yeats_Liao2 小时前
微调决策树:何时使用Prompt Engineering,何时选择Fine-tuning?
前端·人工智能·深度学习·算法·决策树·机器学习·prompt
传说故事2 小时前
【论文自动阅读】GREAT MARCH 100:100项细节导向任务用于评估具身AI agent
人工智能·具身智能
李昊哲小课2 小时前
基于NLP的检索式聊天机器人
人工智能·自然语言处理·机器人
听麟2 小时前
HarmonyOS 6.0+ PC端智能监控助手开发实战:摄像头联动与异常行为识别落地
人工智能·深度学习·华为·harmonyos
wasp5202 小时前
【开源】Banana Slide:一个基于nano banana pro[特殊字符]的原生AI PPT生成应用,迈向真正的"Vibe PPT"
人工智能·开源
说私域2 小时前
破局互联网产品开发困境:开源AI智能名片链动2+1模式S2B2C商城小程序的实践与启示
人工智能·小程序·开源·私域运营
开源技术3 小时前
深入了解Turso,这个“用Rust重写的SQLite”
人工智能·python