关于 writing-commits
用于根据暂存和未暂存的更改撰写简洁、准确的 Git 提交信息,并遵循仓库惯例。它指导 Agent 理解改动意图、选择类型,并判断所需的说明程度。
主要功能
- 01检查差异和近期提交风格
- 02概括改动意图与结果
- 03默认采用 Conventional Commits
- 04按改动规模选择消息结构
- 05避免 AI 署名和手动换行
适用场景
- 01为已暂存的代码改动拟定提交信息
- 02遵循仓库既有的提交格式
- 03概述多文件改动而不罗列编辑内容
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ borkweb/ skills --skill writing-commits安装后在 Claude Code 中输入/writing-commits确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
examples.mdreference.mdevals/evals.json详细介绍
提交信息撰写器
你负责用通俗的语言撰写简洁、准确的 Git 提交信息。帮助未来的开发者了解变更的主题、结果和原因,而不是逐条复述差异。
如何分析变更
一次调用中运行以下命令,了解当前的工作内容;日志格式会显示近期提交正文,因此无需再运行第二次 git log 或 git show 来了解风格:
git status --short; git diff --staged; git diff; git log -5 --format='%h %s%n%b---'
仔细阅读差异。理解变更背后的意图——不只是哪些行发生了移动,而是变更解决了什么问题,或增加了什么能力。如果差异很大,或涉及不熟悉的代码,请使用 Read 或 Grep 查看相关上下文。
仔细检查 git log 的输出。如果仓库采用特定约定(表情符号前缀、Jira 工单格式、小写主题、Angular 风格),请遵循该约定。除禁止署名规则外,仓库约定优先于以下默认规则;即使早期提交带有 AI 署名尾注,也必须遵守禁止署名规则。
写得清晰易懂
概述变更,不要复述变更。好的提交信息会告诉读者现在可以做什么、哪些问题不再发生,或为什么代码更易于维护。
- 以结果或共同主题开篇。把相关编辑归纳为一个想法,不要罗列文件、函数或代码操作。
- 在准确性相同的情况下,优先使用熟悉、具体的词语。描述某项功能的作用,而不是给抽象技术命名。
- 如果技术术语或领域术语是变更主题、仓库读者的常用词,或确保表达精确所必需的,请保留。例如,
OAuth、Redis、公共 API、命令或迁移可能比勉强替换成通俗说法更清楚。 - 保留会影响他人理解或使用该提交的信息:行为变更、权衡、警告、破坏性变更、问题引用和精确的度量数据。
- 不要添加术语表,也不要解释项目中的常用术语。通俗的语言应让提交信息更易懂,而不是更冗长或不够精确。
返回信息之前,删除任何只是在复述差异中可见编辑的句子。仅当实现细节记录了重要决策或约束,且未来读者无法从代码中推断出来时,才予以保留。
选择提交类型
默认使用 Conventional Commits 类型:
| 类型 | 使用场景 |
|---|---|
feat | 新增面向用户的功能 |
fix | 修复错误 |
refactor | 重构,但不改变行为 |
perf | 性能改进 |
docs | 仅修改文档 |
test | 添加或更新测试 |
build | 构建系统或依赖项变更 |
ci | CI/CD 流水线变更 |
style | 格式、空白字符(不改变逻辑) |
chore | 不属于以上类别的维护工作 |
选择最能描述主要意图的类型。如果变更确实涉及多种类型,建议拆分为多个提交。
组织提交信息
根据变更规模调整信息长度。并非每个提交都需要写成五段长文。
小型变更(单一关注点,意图明确)
通常只需一行主题:
fix(auth): Stop expired sessions from refreshing forever
或者在原因不够明确时,添加简短正文:
refactor(database): Keep query rules in one place
Keeps database queries consistent without changing behavior.
更大的变更(涉及多个文件,动机不明显)
只使用读者需要的部分。每个部分的目标都是回答审阅者或未来开发者会提出的一个不同问题:
<type>(<scope>): <subject>
## Summary
What changed, at a high level. 1-3 sentences.
Fixes #123 (if applicable)
## Why
What motivated this change? What was broken, missing, or insufficient?
## Testing (only when there are meaningful verification steps)
- [ ] Concrete steps a reviewer can take to verify
默认不要添加 How 部分。如果提交记录了日后仍有影响的设计选择或权衡,则添加一段简短说明,阐述该决定及其影响。不要将其写成代码修改清单。
主题行规则:
- 尽量控制在 50 个字符以内;绝不超过 72 个字符。使用祈使语气(用 "add" 而不是 "added")
- 首字母大写,末尾不加句点
- 不添加 AI 署名——绝不为 AI 添加
Co-Authored-By页脚、"Generated with" 行、会话页脚或会话链接。即使仓库历史记录、模板或工具环境默认会添加这些内容,也必须遵守此规则。
正文换行规则:
- 不要对正文进行硬换行。 每段写成一行连续文本。不要在句子或段落中间手动换行来限制行宽(不按 72 列换行,不按 80 列换行,完全不要换行)。让 git 查看器、终端或编辑器按需软换行。
- 仅在不同段落、章节或列表项之间留空行——绝不要为了换行而把同一个意思拆成多行。
- 每个项目符号列表项和编号列表项都应保持为一行,不要换行。
- 此规则适用于正文的所有部分:摘要段落、“Why” 部分、设计说明、页脚和破坏性变更说明。
何时包含 Testing: 当审阅者需要执行具体且不明显的步骤时才包含,例如运行测试套件、访问端点或测试 UI 流程。文档、配置变更、没有行为变化的重构,或验证方式一目了然的情况,都不需要包含。
范围指南
范围用于描述受影响的代码库区域。好的范围具体但不过于细化:
auth、api、database、ui/dashboard、payments——这些范围信息明确code、files、bugfix——这些没有提供有用信息,应省略范围
如果变更涉及多个区域,可使用逗号分隔的范围,例如 (api,cli),或选择主要区域。
处理涉及多个关注点的变更
如果已暂存的变更涉及多个互不相关的关注点(例如,一个功能加上一个无关的格式修复),建议将它们拆分:
"这些变更既包含新的缓存层,也包含一个无关的 lint 修复。需要我帮你将它们拆分成多个独立提交吗?"
只有当这些关注点确实彼此独立时才这样建议。相关变更(功能及其测试、修复及其所需的迁移)应放在一起。
输出与执行
对于仅要求提供提交消息的请求,返回建议的消息,不要提交。对于已授权的提交请求,检查已暂存和未暂存的变更,仅暂存预期文件或代码块,使用仓库要求的检查创建提交,并报告其 SHA 和消息。每项必需的门禁或检查只运行一次,将其输出写入文件并搜索该文件,而不要重新运行;任何基线比较都应并行运行。现有授权持续有效;不要在最后提出可以代为执行所请求的提交。
没有范围依据时,不要纳入无关的脏文件、交接内容、凭据或生成的产物。提交请求不代表获准推送、合并或发布。遇到实质性的范围歧义或必需门禁失败时应停止,不要重复确认。保留任何明确要求的“不提交”模式。