关于 aif-commit
aif-commit 是面向开发者的 Conventional Commits 提交信息生成技能。它会分析暂存差异,并可依据项目配置和活动计划检查提交分组与上下文。
主要功能
- 01分析暂存文件与差异
- 02生成 Conventional Commits 信息
- 03读取项目规则与配置
- 04支持活动计划提交分组
适用场景
- 01为暂存改动拟定提交信息
- 02按计划将改动分成多次提交
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ lee-to/ ai-factory --skill aif-commit安装后在 Claude Code 中输入/aif-commit确认已加载。
详细介绍
Conventional Commit 生成器
生成符合 Conventional Commits 规范的提交消息。
工作流
首先: 如果 .ai-factory/config.yaml 存在,则读取它以确定:
- 路径:
paths.description、paths.architecture、paths.rules_file、paths.roadmap、paths.rules、paths.plan和paths.plans - 语言: 用于提示词和提交消息规范的
language.ui - 工作流: 用于只读式活跃计划发现的
workflow.plan_id_format(默认为slug;sequential使用带编号的完整计划查找) - Git 偏好: 用于活跃计划发现和提交后推送行为的
git.enabled、git.create_branches和git.skip_push_after_commit - 规则层级:
rules.base以及任何命名的rules.<area>条目
如果 config.yaml 不存在,则使用默认值:
- 路径:上下文资料使用
.ai-factory/,paths.plan使用.ai-factory/PLAN.md,paths.plans使用.ai-factory/plans/ - 语言:
en(英语) - 工作流:
workflow.plan_id_format: slug - Git:
git.enabled: true、git.create_branches: true - Git 偏好:
skip_push_after_commit: false
读取 .ai-factory/skill-context/aif-commit/SKILL.md——如果该文件存在,则必须读取。
此文件包含 /aif-evolve 根据补丁、代码库惯例和技术栈分析积累的项目专属规则。这些规则针对当前项目进行了定制。
如何应用 skill-context 规则:
- 将其视为对本技能通用说明的项目级覆盖规则
- 当 skill-context 规则与此 SKILL.md 中的通用规则冲突时,以 skill-context 规则为准(更具体的上下文优先级更高——遵循与嵌套 CLAUDE.md 文件相同的原则)
- 如果没有冲突,则同时应用:SKILL.md 中的通用规则和 skill-context 中的项目规则
- 即使 skill-context 规则似乎与本技能的默认规则矛盾,也不要忽略它们——这些规则源于项目经验,证明默认规则并不足够
- 重要: skill-context 规则适用于本技能的所有输出,包括提交消息格式和规范。如果 skill-context 规则要求“提交必须遵循格式 X”或“消息必须包含 Y”,则必须遵守。生成违反 skill-context 规则的提交消息属于错误。
强制执行: 生成任何输出内容后,都要根据所有 skill-context 规则进行检查。如果违反了任何规则,请先修正输出,再呈现给用户。
-
分析变更
- 运行
git status查看已暂存的文件 - 运行
git diff --cached查看已暂存的变更 - 如果没有暂存内容,显示警告并建议暂存文件
- 运行
-
解析活动计划上下文(只读,可选)
- 按以下只读优先级解析活动计划:
@<plan-file-or-directory>参数(当参数以@开头时)paths.plans中基于分支的完整计划或 ultra 包paths.plans中的单个完整计划,或其中的单个 ultra 包paths.plan中的快速计划
- 如果参数不以
@开头,则继续将其视为提交范围/上下文。 - 旧版
@<plan-file>语法仍然有效;扩展形式还接受 ultra 目录或其index.md。 - 查找基于分支的完整计划时:
- 当
git.enabled = true时,使用git branch --show-current获取当前分支 - 将每个
/替换为-,得到<branch-stem> - 当
workflow.plan_id_format = sequential时,对以下两种路径都使用Glob:paths.plans/[0-9][0-9][0-9][0-9]_<branch-stem>.md和paths.plans/[0-9][0-9][0-9][0-9]_<branch-stem>/index.md - Read 每个目录候选项,仅保留其中
index.md恰好包含一个 `` - 使用编号最高的有效产物;如果存在多个有效候选项,则发出
WARN [aif-commit];如果两种形态的最高前缀相同,则优先选择 ultra - 如果没有有效的顺序编号匹配项,则检查
paths.plans/<branch-stem>/index.md,然后检查paths.plans/<branch-stem>.md;选择前先 Read 目录入口文件,仅当其中恰好包含一个 ultra 标记时才保留;如果两种形态都有效,则发出警告并优先选择 ultra
- 当
- 如果 git 模式关闭、无法解析分支,或不存在基于分支的计划,则统计根目录下的
*.md完整计划,以及直接子目录中包含 `` 的*/index.md入口文件;排除已解析的快速计划路径,不统计阶段文件。 - 在规范化显式指定的 ultra 目录,或将显式指定的
index.md视为 ultra 之前,先 Read 并要求其中恰好包含一个 ``;否则以计划完整性错误 STOP。 - 自动发现的目录入口文件仅当包含 `` 时才计入;忽略无关的
*/index.md文件。 - 如果无法解析出活动计划,或活动计划入口文件没有
## Commit Plan,则保持当前暂存差异行为不变。 - 此命令绝不修改活动计划。
- 按以下只读优先级解析活动计划:
-
有可用的提交计划分组时使用它
-
如果当前计划包含
## Commit Plan,请解析:- 提交组编号/名称
- 任务范围,例如
after tasks 1-3或tasks 4-6 - 建议的 Conventional Commits 提交消息
-
阅读计划中的
## Tasks或## Implementation Tasks部分,将任务范围映射到任务描述和任何Files:提示。 -
对于超大型计划,将当前提交组中的每项任务映射到其阶段索引/详情链接,阅读每个对应的阶段文件,并根据
## Files to Change表格和完整的## Task N规范构建暂存路径映射。仅阅读index.md并不足够。 -
如果一个阶段包含多个提交组中的任务,请使用各个
## Task N部分区分文件/代码块的归属;没有任务级证据时,不要将该阶段的整个文件表分配给每个组。 -
更改暂存区之前,先将已暂存文件/代码块与计划分组进行比对:
- 使用
git diff --cached --name-only获取已暂存文件路径 - 如果某个文件可能跨多个组,则使用
git diff --cached检查已暂存代码块的依据
- 使用
-
如果无法将文件映射到各组,请停止并要求用户调整分组。
-
使用整文件暂存前,先将分组文件与
git diff --name-only中未暂存的工作区路径进行比对。 -
只有在每个计划组的文件集合互不重叠,且
git diff --name-only中未出现任何分组文件时,才能使用git add <files>。 -
如果同一文件跨多个计划组,请为每个组使用代码块级暂存(
git add -p或git apply --cached)。 -
如果分组文件与未暂存的工作区路径重叠,请按组保留并应用原始已缓存补丁(
git diff --cached+git apply --cached)、使用代码块级暂存,或在更改暂存区之前停止。 -
如果无法有把握地进行代码块级暂存,请在更改暂存区之前停止,并要求用户调整分组或将所有内容一起提交。
-
存在可用分组时,请询问:
AskUserQuestion: 当前计划包含 Commit Plan。应如何提交这些已暂存更改? 选项: 1. 遵循 Commit Plan 2. 将所有内容一起提交 3. 调整分组 -
遵循 Commit Plan → 确认计划分组和消息,然后按用户确认的多次提交暂存/提交流程继续。
-
将所有内容一起提交 → 本次忽略计划分组,继续当前的单条消息流程。
-
调整分组 → 询问用户调整后的分组,然后在提交前根据已暂存文件进行验证。
-
-
运行上下文检查(只读)
- 检查已解析的架构和描述文档(使用配置中的路径),以发现明显的范围/边界偏差。
- 检查已解析的 RULES.md 和路线图文档(使用配置中的路径),以发现规则和里程碑对齐问题。
- 检查规则层级(已解析的
paths.rules_file+rules.base+ 命名的rules.<area>)中的提交约定。 - 缺失的可选文件(
ROADMAP.md、RULES.md)属于WARN,不构成阻碍。 - 绝不通过此命令修改上下文文档。
- 如果用户希望单独检查规则,请建议使用
/aif-rules-check;/aif-commit的检查标签应保持为WARN/ERROR。
-
确定提交类型
feat:新功能fix:修复错误docs:仅修改文档style:代码风格(格式化、分号)refactor:既不修复错误也不增加功能的代码更改perf:性能改进test:添加或修改测试build:构建系统或依赖项ci:CI 配置chore:维护任务
-
确定范围
- 根据文件路径确定(例如,
src/auth/→auth) - 根据提供的参数确定
- 可选——如果更改涉及多个领域,则省略
- 根据文件路径确定(例如,
-
生成消息
- 主题行控制在 72 个字符以内
- 使用祈使语气(用“add”,而不是“added”)
- 类型后面的首字母不要大写
- 主题末尾不要加句号
格式
<type>(<scope>): <subject>
<body>
<footer>
示例
简单功能:
feat(auth): add password reset functionality
包含正文的错误修复:
fix(api): handle null response from payment gateway
The payment API can return null when the gateway times out.
Added null check and retry logic.
Fixes #123
破坏性变更:
feat(api)!: change response format for user endpoint
BREAKING CHANGE: user endpoint now returns nested profile object
行为
调用时:
-
检查暂存的更改
-
分析差异内容
-
解析可选的活动计划上下文,并在可用时使用
## Commit Plan分组 -
执行只读上下文检查,并以
WARN/ERROR总结发现 -
如果提交类型为
feat/fix/perf,且存在路线图,则检查里程碑关联;如果缺少关联,则发出警告,并建议在提交正文/页脚中添加关联 -
提议一条提交消息
-
在提交前向用户确认:
AskUserQuestion: Proposed commit message: <type>(<scope>): <subject> Options: 1. Commit as is 2. Edit message 3. Cancel -
处理用户响应:
- 按原样提交 → 继续执行第 9 步
- 编辑消息 → 通过
AskUserQuestion请用户提供修正后的消息,然后使用新消息返回第 7 步 - 取消 → 停止,切勿提交。结束工作流
-
使用确认后的消息执行
git commit -
提交后的推送处理:
-
如果解析后的配置中
git.skip_push_after_commit = true:- 完全跳过推送提示
- 本地提交成功后结束工作流
-
否则(默认行为),询问是否推送:
- 显示分支/领先状态:
git status -sb - 如果分支没有上游分支,使用:
git push -u origin <branch> - 否则使用:
git push
AskUserQuestion: 推送到远程? 选项: 1. 立即推送 2. 跳过推送- 立即推送 → 根据上游状态执行推送命令:
- 如果分支没有上游分支 →
git push -u origin <branch> - 否则 →
git push
- 如果分支没有上游分支 →
- 跳过推送 → 结束工作流
- 显示分支/领先状态:
如果提供了参数(例如,/aif-commit auth):
- 将其用作范围
- 或用作提交消息的上下文
重要事项
- 切勿提交密钥或凭据
- 提交前仔细检查大型差异
/aif-commit不会隐式启用严格模式——除非用户明确要求阻止操作,否则上下文门控仅发出警告- 在此命令中,将已解析的架构、路线图、RULES.md、描述和计划文档视为只读上下文
- 如果没有解析到有效计划,或有效计划中没有
## Commit Plan,则保持当前暂存差异行为不变。 - 如果暂存的更改包含无关工作(例如,一个功能加一个错误修复,或对独立模块的更改),建议拆分为多个提交:
-
展示哪些文件/代码块属于哪个提交
-
与用户确认拆分计划:
AskUserQuestion: Split into separate commits? Options: 1. Yes, split as suggested 2. No, commit everything together 3. Let me adjust the grouping -
处理用户的回复:
- Yes, split as suggested → 继续执行第 4 步
- No, commit everything together → 继续执行第 5 步(提出一条提交说明)
- Let me adjust the grouping → 通过
AskUserQuestion请用户调整分组,然后返回第 2 步并使用新计划
-
更改暂存状态之前,确认每个计划分组的文件集合是否互不重叠、是否有文件横跨多个分组,以及分组中的文件是否与
git diff --name-only列出的未暂存工作区路径重叠。 -
如果所有分组的文件集合互不重叠,且没有分组文件出现在
git diff --name-only中,则使用git reset HEAD取消暂存所有更改,然后分别使用git add <files>+git commit暂存并提交各分组。 -
如果分组文件与未暂存的工作区路径重叠,则在取消暂存前保留每个分组原有的暂存补丁,并使用
git apply --cached仅重新应用该补丁;否则使用按代码块暂存,或在更改暂存状态前停止。 -
如果一个文件横跨多个分组,则对每个分组使用按代码块暂存:通过
git add -p或git apply --cached仅暂存该分组的代码块,提交后再处理下一个分组。 -
如果无法有把握地进行按代码块暂存或应用缓存补丁,则在更改暂存状态前停止,并请用户调整分组或将所有内容一起提交。
-
仅在所有提交完成后询问是否需要推送
-
- 绝不要添加
Co-Authored-By或任何其他标注 AI 作者身份的提交尾注。提交中不得包含 AI 共同作者行