关于 commit-message-storyteller
将 Git diff 或变更描述整理为符合 Conventional Commits 规范、突出意图的提交信息,适用于希望改善提交记录和 Pull Request 的开发者。还能识别无关变更并建议拆分提交。
主要功能
- 01从 diff 推断变更背景
- 02选择 Conventional Commits 类型
- 03撰写主题、正文和页脚
- 04拆分无关变更的提交
- 05说明提交信息的缘由
适用场景
- 01根据暂存变更生成提交信息
- 02概括代码变更的意图
- 03为 Pull Request 准备有意义的提交
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ ilteoood/ harness --skill commit-message-storyteller安装后在 Claude Code 中输入/commit-message-storyteller确认已加载。
附带文件references/conventional-commits-guide.md
详细介绍
提交信息故事讲述者
将原始的 git diff 和变更描述转化为清晰、有故事性的提交信息,并遵循 Conventional Commits 规范。你得到的不再是“update file.js”,而是能够传达意图、上下文和影响的提交信息。
何时使用此技能
- 用户说“写一条提交信息”、“帮我提交”或“生成一次提交”
- 用户粘贴 git diff 或描述代码变更
- 用户说“我应该把它作为什么提交?”或“总结我的 diff”
- 用户希望为团队或开源项目获得更好的提交历史
- 用户正在准备 pull request,并希望获得有意义的提交信息
前置条件
至少准备好以下一项:
git diff或git diff --staged的输出- 对你改了什么以及为什么改的描述
- 已修改文件的列表
工作方式
第 1 步:收集变更上下文
向用户询问(或从 diff 中推断)以下内容:
- 改了什么 — 受影响的文件、函数、逻辑
- 为什么改 — bug 修复、新功能、重构、性能等
- 由谁/什么触发 — issue 编号、用户请求、技术债等
如果用户提供的是原始 git diff,请从 diff 中自动提取这些上下文。
第 2 步:确定提交类型
使用以下指南将变更映射到 Conventional Commits 类型:
| 类型 | 使用时机 |
|---|---|
feat | 添加了新功能或能力 |
fix | 修复了 bug 或不正确的行为 |
refactor | 在不改变行为的情况下重构代码 |
perf | 提升性能的变更 |
docs | 仅文档变更 |
style | 格式、空白、缺少分号(无逻辑变更) |
test | 添加或更新测试 |
chore | 构建流程、依赖更新、配置变更 |
ci | CI/CD 流水线变更 |
revert | 回滚之前的提交 |
详细示例见 references/conventional-commits-guide.md。
第 3 步:编写提交信息
遵循以下结构:
<type>(<optional scope>): <short imperative summary>
<body — the story: why this change was made, what problem it solves>
<footer — issue refs, breaking change notices>
各部分规则
主题行(第一行):
- 使用祈使语气:“add”、“fix”、“remove” —— 而不是“added”或“fixes”
- 最多 72 个字符
- 末尾不加句号
- 冒号后使用小写
正文(故事):
- 解释 为什么,而不是 是什么(diff 已经展示了是什么)
- 描述此变更之前存在的问题
- 如相关,提及考虑过的其他方案
- 每行保持在 100 个字符以内
- 用空行与主题行分隔
页脚:
- 引用 issue:
Closes #123、Fixes #456、Refs #789 - 标记破坏性变更:
BREAKING CHANGE: <description>
第 4 步:生成输出
将提交信息放入可复制的代码块中,随后用一行通俗英文解释你讲述的故事。
示例输出:
fix(auth): prevent token refresh loop on expired sessions
When a user's session expired mid-request, the auth middleware was
triggering a token refresh, which itself failed validation and triggered
another refresh — causing an infinite retry loop that crashed the app.
This adds a recursion guard flag that aborts the refresh cycle if a
refresh is already in progress, returning a clean 401 instead.
Closes #312
讲述的故事: 会话过期时出现的静默无限循环导致应用崩溃;此变更提前终止该循环并返回清晰的错误。
从一个 Diff 生成多个提交
如果 diff 包含逻辑上相互独立的变更,请将它们拆分为多条提交信息,并告知用户。使用以下启发式方法:
- 不同文件且用途无关 → 可能是不同的提交
- 同一文件但关注点不同(例如 bug 修复 + 重构)→ 建议拆分
- 所有内容紧密耦合 → 一次提交即可
边界情况
| 情况 | 如何处理 |
|---|---|
| 用户除 diff 外没有提供任何上下文 | 根据文件名和变更的符号推断类型和范围 |
| 变更跨越许多文件且没有明确主题 | 询问:“这是一个逻辑变更,还是多个?” |
| 检测到破坏性变更 | 自动添加 BREAKING CHANGE: 页脚 |
| 用户说“保持简短” | 省略正文,只写一条有力的主题行 |
| 没有可用的 issue 编号 | 完全省略页脚 |
快速参考
# Get your staged diff to paste into Copilot
git diff --staged
# Or get the last uncommitted working tree changes
git diff
类型示例和范围指南见 references/conventional-commits-guide.md。
评论
支持 Markdown