跳到主要内容

送给开发者的新年礼物 - Oh My Commit !

· 阅读需 20 分钟

在 2024 年的最后一天,我想向大家分享发布这个月基于 AI 全勤投入开发完成的项目 - Oh My Commit,它支持 Cli/VSCode 等多端环境、支持通知/面板视图、支持 DIY 插件式开发,致力于成为企业级 AI Commit 解决方案!

image.png

image.png

从痛点说起

image.png

说实话,如果不是有人和我提,我甚至都没能意识到自己其实是也需要一款 AI commit 工具的,可能是因为我长期独立开发,不太需要和别人合作,所以没能意识到规范自己 commit 的重要性。

从这个角度出发,人确实还是需要”多在企业里呆着好“,才能实打实地发现企业的痛点,也就是”真需求“,从而解决问题,从而”换取报酬”,至于是否需要打着一个”创业“的名号,除非要”融资“,否则也没那么重要,甚至也无那么必要。

但作为一个有代码洁癖的程序员,我自然也对混乱的代码提交信息深恶痛绝:

# 真实项目中的提交记录
git log --oneline
a123456 update
b234567 fix bug
c345678 修改了一下
d456789 改了改

每次看到这样的提交历史,总会想 - 身为程序员,写出规范、专业的提交信息难道不是基本素养吗?

然而现实是:

  • 一天写了十几个提交,每次都要绞尽脑汁想措辞
  • 有时想用英文写得专业点,但总觉得不够地道
  • 团队有统一的提交规范,但每次都要翻文档查格式
  • ……

而且就像垃圾分类推了这么多年还是分不清干湿,程序员也往往分不清 feat/fix/perf/... 啊……

我有时候为了尽可能记录足够完备的历史,commit 的频率非常高,以至于都不知道怎么 commit 才好,最后就 git add . && git commit -m "." …… (狗头)

* 2c8c412 - . (12 days ago) <markshawn2020>
* db43470 - . (12 days ago) <markshawn2020>
* 01e0a26 - . (12 days ago) <markshawn2020>
* e30cd98 - . (12 days ago) <markshawn2020>
* 10da285 - . (12 days ago) <markshawn2020>
* 83903eb - :sparkles: better tsconfig path aliaas (12 days ago) <markshawn2020>

“懒”真地是人类进步的原动力(不是)。

虽然市面上已经有一些 AI Commit 工具,比如 130 star 的 mefengl/vscode-i-dont-care-about-commit-message: Yet another AI git commit plugin, but without the need for manual confirmation.(下文代称 I Dont Care

image.png

我觉得他做的很不错,使用了 vscode 的原生通知,还是挺优雅的,但有几个缺点:

  1. UIUX:生成的信息不支持修改,以及不支持多行友好显示 body 部分(这个是 vscode 的限制,所以我额外支持了 webview 的交互模型)。
  2. 算法:大部分ai commit 工具基本都是拿到 diff,然后调用一次大模型,基于 function call 生成符合目标格式的 commit message,但总会有一些缺陷,比如在diff 过长超出 token 限制的时候,就不得不转为手动commit。
  3. 生态:目前它只支持 vscode 插件,但我们有时候会用其他 IDE,或者在 terminal 环境里,所以光做 vscode 插件可能是不够的。
  4. 产品理念:参考 feat(extension): add option to generate commit messages in Chinese 作者提到自己开发这款插件是为了“Don't Care”,所以尽量不支持配置,与我 "Do Care" 的理念是不一致的,这种冲突就无法通过提 PR 去完善了,只能自己再造一个,尽管我确实有在它基础上改过。

image.png

由于写 UIUX 这个是比较烦的,但是写 prompt 是比较简单的,所以我就想要不我来封装一个框架,定义一套 ai commit 的工作流,然后用户只需关心最核心的 prompt、data 等即可?

于是,一款产品就此诞生了。

实际效果演示

经过一个月的打磨,Oh My Commit 现在支持三种使用方式:

1. CLI 命令行

# 安装 cli
npm install -g @oh-my-commit/cli

changed 118 packages in 10s

27 packages are looking for funding
run `npm fund` for details


# 安装模型(可自行开发与发布,这样自己就可以装自己的模型了)
npm install -g @oh-my-commit/provider-official

changed 46 packages in 712ms

5 packages are looking for funding
run `npm fund` for details


# 检查模型是否注册成功
ls -lah ~/.oh-my-commit/providers/official
total 9992
drwxr-xr-x@ 6 mark staff 192B 12 31 16:24 .
drwxr-xr-x@ 3 mark staff 96B 12 31 16:24 ..
-rw-r--r--@ 1 mark staff 5.8K 12 31 16:24 CHANGELOG.md
-rw-r--r--@ 1 mark staff 2.4M 12 31 16:24 index.js
-rw-r--r--@ 1 mark staff 2.4M 12 31 16:24 index.mjs
-rw-r--r--@ 1 mark staff 1.2K 12 31 16:24 package.json


# 查看命令行
✗ omc
____ _ __ __ _____ _ _
/ __ \| | | \/ | / ____| (_) |
| | | | |__ | \ / |_ _ | | ___ _ __ ___ _ __ ___ _| |_
| | | | '_ \ | |\/| | | | | | | / _ \| '_ ` _ \| '_ ` _ \| | __|
| |__| | | | | | | | | |_| | | |___| (_) | | | | | | | | | | | | |_
\____/|_| |_| |_| |_|\__, | \_____\___/|_| |_| |_|_| |_| |_|_|\__|
__/ |
|___/
✨ AI-powered commit message generator
📦 Version 0.23.0

Usage: Oh My Commit [options] [command]

Oh My Commit - AI-powered commit message generator

Options:
-v, -V, --version output the version number
-h, -H, --help display help for command

Commands:
init Initialize Oh My Commit configuration
list-models List all available AI Commit models
select-model <modelId> Set the default model to use for commit generation
gen [options] Generate commit message
help [command] display help for command


# 查看当前版本
✗ omc -v
0.23.0


# 查看支持的模型列表(注册的插件都会显示在这里)
✗ omc list-models
2024-12-31T08:23:02.749Z INFO | [console] Listing models...
2024-12-31T08:23:05.938Z INFO | [console] Available models:
2024-12-31T08:23:05.938Z INFO | [console] ✓ ohMyCommit.standard - omc-standard-claude-3.5 (default)


# 配置代理与自己的 API_KEY,基于当前的 git 环境自动生成 commit
HTTP_PROXY=http://localhost:7890 ANTHROPIC_API_KEY=sk-xxx omc gen
2024-12-31T08:23:08.496Z INFO | [console] Generating commit message...
2024-12-31T08:23:14.423Z INFO | [console] Generated commit message:
no-op: no changes
---
There are no changes in the provided diff, so no commit message is needed.
2024-12-31T08:23:14.423Z INFO | [console]
Use -y flag to commit automatically, or run git commit manually with the message above

2. VSCode

您可以直接在 VSCode 插件市场搜索 oh-my-commit 进行安装:

Windsurf 等软件使用 open-vsx 插件市场,我需要一点时间评估一下是否同步发布 open-vsx 版本,亦或直接基于 CICD 为大家分发 vsix 文件。

image.png

安装完成后,使用 Cmd + Shift + P 打开快捷菜单,搜索 omc 即可看到我们预设的一些命令,其中 Quick Commit 将直接生成提交信息,Select Model 用于切换模型,Focus View 用于打开 primary sidebar 面板。

image.png

在插件安装模式下,我们已经预设了一些模型(例如 ohMyCommit.standard,它基于 Claude-3.5、支持设置语言、生成 Convention 风格的 Commit ),您可能需要额外配置代理与 API_KEY。

项目顺利的话,我将考虑对接硅基流动,额外接入登录系统以减少配置复杂度,但基于开源 DIY 的理念,API_KEY 的独立配置能力将始终为大家保留。

image.png

由于这款产品的目标是 AI 自动 Commit,因此在产品设计的思考上,我在视图级别上基于信息干扰层次做了一些划分。

2.1 弹窗视图

这种在 commit 生成后会弹出一个独立的窗口,就像网页的 Dialog 一样,之前我已经实现了一版,但后续在学习了 VSCode 的 VCS 面板设计后,我 放弃 了这种过于干扰的视图。

2.2 面板视图

面板会静静地栖息在您的侧边栏视图区域,主要用于展示 message 主体、一些快捷操作、最佳实践等,长期来看不会增加过多的东西,尽量保持简洁优雅。

个人目前更喜欢拖到 Secondary Sidebar (右侧边栏),这样左边看文件右边看 Commit(Changed File 是可以点击后打开 VSCode 默认支持的 Diff 视图的)。

Changed Files 里支持文件夹操作是一个小亮点,我也不明白为啥其他插件都没做这个,有了这个之后,就很方便文件夹级别的勾选,以生成更精准的提交,为我下一个支持多步 commit 的 MVP 做准备。

框选功能已实现,但暂未放开,因为还有一些交互没想明白,技术产品经理有兴趣可以就这个与我交流交流。

image.png

2.3. 通知视图

通知视图下的功能基本和 I Dont Care 差不多,区别在于我们的 Edit 按钮点击后会自动打开面板视图,以方便用户修改。(因为 VSCode 默认的快捷输入框是不支持多行的……)

image.png

2.4. 状态栏视图

实际在 generate commit 的时候,状态栏始终会实时显示进度,因此是默认的,如果您不希望在 generate commit 的过程中有任何干扰,可以切换 UiMode 为 panel,然后把它折叠即可。

image.png

3. Jetbrains

我过去几年首选的 IDE 都是 Jetbrains,因此对它的支持,我一旦有心情、有时间、有必要就会去做。

当然也欢迎 pr,基于 monorepo 的代码架构,您可以非常方便地适配您期望的其他平台。

如何定制您自己的 AI Commit 实现?

请阅读:https://oh-my-commit.github.io/guide/provider-docs.html,核心就是基于我们预设的 Context,实现对应的接口,并参考我们 provider 的打包配置到指定目录即可。

文档、社区、开源、商业化与 Roadmap

项目采用 MIT + Commons Clause 协议开源,这意味着:

  • ✅ 个人和团队可以免费使用
  • ✅ 可以自由修改和分发
  • ❌ 不能直接商业化

本项目的主要链接:

合作、社群与答疑:

目前正在开发的功能:

  • 基础的 AI 提交信息生成
  • CLI & VSCode 双平台支持
  • 插件化架构
  • 完整的提交工作流
  • Changeset 集成 (进行中)
  • prompt 管理系统 (计划中)
  • 提交历史分析 (计划中)

一些设想:

如果我们在 commit 这个事情上打穿,把用户散落在各个 IDE、项目里的 commit 都贯穿起来,这个工具可以进化成?

  1. 程序员的编程画像

    • 你最常改动哪些类型的文件
    • 你的代码偏好是什么
    • 你的提交习惯如何
  2. 团队的协作仪表盘

    • 团队的代码修改热力图
    • 成员间的协作网络
    • 项目的演进历史
  3. 智能输入法

# 自动根据上下文推荐提交信息
$ git commit -m "
> 推荐 1: fix(login): resolve undefined user object issue
> 推荐 2: feat(auth): add token refresh mechanism
> 推荐 3: style(ui): update login form layout
"
  1. ……

特别感谢

  • 送我 cursor vip 的继刚兄,他打破了我对所谓“代码洁癖”坚持的幻想,结束了我十年人工编程的生涯,加速将我从一名程序员转变为技术型产品经理
  • 提供 idea 与友情支持的春宇、胡博、宋奇、震杰、承平、子弹等一众朋友们
  • Anthropic、Windsurf 等杰出的 AI 公司

写在最后

作为 2024 年的收官之作,Oh My Commi 虽小,却承载了我对 AI 时代开发工具的诸多思考。

这一个月的开发经历让我深深体会到:工具的价值不仅在于解决问题,更在于激发可能

通过跟 AI 的密切协作,我看到了未来开发方式的一种可能性: 让 AI 处理重复性的工作,让开发者专注于更有创意的部分

这不仅仅是一个工具的诞生,更是对未来开发方式的一次探索。如果你也对此感兴趣,欢迎一起来玩:

echo "LLM YYDS \!"

花絮

1. 本项目的作者有两个

1% 的部分属于我,剩余 99% 属于 AI。

image.png

2. 起个名字真难

起初名字叫 Yet Another AI Commit,后来叫 YAAC(雅刻),最后它的名字叫 Oh My Commit。

致敬:

3. 初期一点微不足道的思考

image.png

4. 最近密集使用 AI 开发的一些小东西

得益于 AI,现在一有 idea 就会去用 AI 实现一番,毕竟干活的是 AI 不是自己(实质还是自己,只不过自己的劳动被抽象了,原先可能是 labor intensive,现在是 mind intensive)。

  • 2024-10-09:通宵用cursor写了一个飞机大战游戏
  • 2024-10-11:完全用 cursor 实现的飞机大战 V0.1.0(两小时初版,十小时趟坑)
  • 2024-10-13:完全用 cursor 实现的飞机大战第二版(对 AI 来说,最难的是数值计算系统的正确性),拥有四种子弹:火焰弹、激光、导弹、散弹,额外的三种背包:生命回复、护罩、加速,三种敌军 + boss(boss 还没加完)
  • 2024-10-15:基于 cursor 做的一个羽毛球预约系统(一个通宵实现)
  • 2024-11-16:基于 AI 实现的一套数据解析方案 Sentiment based PDF Parser,目标是在 444.个长篇论文里挖掘某种语义的表格数据
  • 2024-11-17:基于 AI 实现的 一种平替硬件录音的解决方案,可以实现自动录音,录完自动存储到本地文件,然后自动上传到我的后端服务器,然后就可以在我的前端页面上看到上传的录音了,后续只要基于大模型做一些酷炫的分析,再配一个美观的 UI 即可,计划作为未来某主产品的一部分
  • 2024-11-19:基于 AI 尝试复刻 eqMac 实现调节基于 HDMI 的外接接显示器音量,遗憾地是未能成功
  • 2024-11-21:基于 Cursor 两小时实现 auto-gui agent(实验性质),代码开源在 cs-magic/auto-gui: AI Browser Assistant (experimental) 基于大语言模型的浏览器自动化助手,能够通过自然语言指令完成各种浏览器操作任务。,随缘不保证更新,但会争取实现一些可用的案例,并逐步扩展到整个操作系统级别,计划作为未来某主产品的一部分
  • 2024-11-21:基于 Windsurf 十分钟生成了监测网络请求列表的谷歌插件(首战大捷,自此我开始重度使用 Windsurf,并为他付费)
  • 2024-11-27:基于 Windsurf 开发的颜值很高的今日图腾小程序(正在内测阶段)
  • 2024-12-21:基于 Windsurf 两小时开发的统一 zsh 相对路径显示的脚本,源码:github.com/cs-magic-open/zsh-git-relative-path

5. 三个月依赖 AI 编程的经验汇总

先放个简单暴力好用的 prompt,它实测下来非常好用,尤其适合 Windsurf + Claude 模型,如果你(或者我)有一天忘了可以回来看看:

每当我提出一个问题时,请您:


1. 这个问题是什么意思

2. 为什么会发生这个问题

3. 你打算怎么解决这个问题,置信度多少

4. 需要我怎么帮助你,能进一步提高你解决这个问题的信心

其他的,关于 Windsurf VS Cursor VS Bolt VS Devin, 关于 ChatGPT VS Claude VS Qwen VS Deepseek……

太多了,晚点单开一篇吧。