从0到1开发一个命令行工具

AI === 生产力工具,本文将通过使用 Cursor 编辑器 来展示如何快速开发一个具有完备流程的命令行项目。


原起

AI 工具的兴起大大提高了编码的效率,释放了程序员很多的精力。那么这个精力值怎么去度量呢?

在以前我会写一些小工具用于工作当中,但是遗憾的是,这个过程并没有让我感受到代码的乐趣,因为绝大部分的时间耗费在文档查询当中了,而且因为几乎是隔了很久才会用到,所以不得不一遍遍做同样的事情。我们都知道,当工具被代码实现后,这才是第一步,合格一点的项目还有后续各种流程:类型检查、文档编写、测试、版本发布等等,头有点大。《哪吒》导演饺子说过:“有句话说得好,'出来混最重要的是什么?首先是出来'”,最怕的就是好多人连第一步都没走出来,想法是有,但都在脑子里。

我现在的工作区基本都切到了 Cursor 上了,一般新开一个项目的时候,需要新建项目文档和 rules 文件。在 V0.46 版本后,Cursor 允许将规则切分到多个不同的规则文件中,比如:vue.mdcreact.mdc,每个规则文件各司其职,这样做可以让规则文件更专注,更灵活。但于我而言其实是增加了复制的工作量的,所以我希望有一个工具可以帮我自动拉取已经存在的规则文件,减少工作量,我只需要维护好源头的规则集就行。

想法这不就来了吗?

开干

第一条指令

帮我开发一个命令行工具,可以帮我拉取规则文件到本地根目录中。规则文件被按照不同的分类放在不同的文件夹中,每一个文件夹就是一个模块,模块中包含多个规则文件。命令行工具可以将文件显示在命令行中,通过多选的形式,将选中的文件拉取到本地根目录中。大概命令如下:

bash
pullrule --js --common

如果没有参数,那么就罗列出所有的文件,如果指定参数,那么就只罗列出指定模块的文件。如果出现文件冲突,那么就提示用户选择是否覆盖。使用 typescript 开发,模块化使用 esm,最后使用 esbuild 打包。

开始即结束?

没有意外,在第一次输入完整指令后,Cursor 就给出了完整的结构,期间只经历了几次代码的调整,就完成了这个工具的开发。我大概估算了一下时间,10 分钟左右,这个时间点在以前我可能还在看命令行工具的文档,或者在想怎么去实现这个工具。AI === 生产力工具,简直爽爆了,于是我飘了,我决定让这个工具规范化,添加测试、文档、版本发布等流程,尽量让这个项目符合一个开源项目的标准。

噩梦来袭

我首先给 Cursor 添加了测试指令:帮我生成测试用例,尽量让保证测试覆盖率越高越好,测试工具使用 vitest 。首先说一下,以前我没有接触过多少测试,更别提 vitest 了,这对我来说是一个极其陌生的领域。

在生成测试用例之后,我便开始尝试运行测试用例,与我的预期差距很大,很多测试用例都失败了,看着满屏的红色,我有点懵逼,这还是我写的代码吗?——虽然的确也不是。这让我想起了我初学编程的时候,简直是噩梦,我尝试将错误输出喂给 Cursor ,让它帮我解决问题,但是结果并不理想,问题并没有解决,这下就很尴尬了,因为我对 vitest 的了解几乎为 0,意味着我不能像第一步里那样,可以准确的将我排查到的错误信息反馈给 Cursor ,让它帮我解决问题。

期间有些报错涉及到 node 特有的模块标准问题,成功将我引入歧途,排错的方向愈来愈偏。后面我尝试将问询范围尽量缩小,然后结合文档与搜索引擎(我曾一度以为我会离开这个工具了 😭),尝试着将我理解到的错误反馈给 Cursor ,看能不能逐个解决。这个过程对比之前相当“漫长”了,大概花了接近 2 个小时,才将测试用例运行起来。意味和前面有着鲜明的反差,所以这个过程也是很痛苦的。

到了这一步,我开始意识到,在当下,如果在陌生领域,AI 工具的准确率并不高,或者说,AI 工具的准确率与你的知识储备是成正比的。

完善后续

走完测试流程后,我真有点“心累”了,但百步者半九十,我决定继续完善好这个项目。

首先是文档,我让 Cursor 根据代码文件帮我生成了一份文档,文档的内容包括:项目介绍、安装、使用等,同步生成一份中文文档(开发过程当中我尽量让代码注释是英文的)。基本上一步到位,是按照常见的开源项目文档来写的,这里就不赘述了。

然后是 git workflow,我让 Cursor 帮我生成了一份 git workflow,主要是检查代码规范、运行测试、构建、发布等,过程还是相当顺利的。只有在发布这个环节,我花的时间比较多,没错,我之前从未使用 git workflow 来走过发版流程,之前都是通过命令行工具在本地发布的,所以这个环节相对陌生。

最后

这个项目我大概花了 2 个多小时,从无到有,从有到规范,说句玩笑话,90% 的代码我都没看过,我唯一记住的就是一条条对话。如果没有 AI 工具,我可能需要花更多的时间来完成这个项目。回到开头的问题,AI 工具能帮我节省多少精力呢?我认为大概 60% 吧,本来按照代码量应该是 90% 的,但是你不得不为你未接触到的领域支付时间金币。可我觉得这不是重点,因为相比于 AI 工具释放的那些精力,更加令人心动的是,它能够将你的想法一步步去变现,能够带你走入未知的“夜晚”,看见未知的星空,或许脚下不太平坦,但是有句话说得好,'出来混最重要的是什么?首先是出来'

最后,附上地址:pullrule,欢迎 star 和 pr。