---
name: gencom
description: 根据 Git diff 生成提交信息（严格遵循项目风格）。当用户需要生成 git commit message、提交代码、或提到 commit/提交/commit message 时使用，即使他们没有明确说"生成提交信息"，只要涉及代码提交就该用这个 skill。
---

# 提交信息生成器

## 核心约束（必读）

1. **不展示 git 原始信息**：生成结果中不要输出 STAGED_FILES、DIFF 等内容，只输出最终的提交信息。
2. **实时获取数据**：每次执行必须实时调用 git 命令，不要使用缓存或假设。
3. **严格只读，禁止写操作**：本 skill 只做「读取暂存区 → 生成提交信息」。禁止执行任何改变 git 状态的命令，包括 `git add`、`git restore`、`git reset`、`git commit`、`git rm`、`git stash` 等。**暂存区内容由用户自己管理**，agent 绝不代劳、绝不自行 add。
4. **不脑补暂存区外内容**：分析仅基于 `git diff --cached` 的输出。工作区未暂存的文件（如 Task/ 会话文件、Cargo.toml 等）一律不引用、不纳入提交信息，也不主动提示。
5. **该停就停**：暂存区为空 → 输出「暂存区没有待提交的文件，请先 git add」并结束，绝不自己动手 add。

## 工作流程

### 第 1 步：收集信息（以下 4 条为唯一允许的命令，全部只读，禁止追加写命令）

执行以下 git 命令获取当前状态：

```bash
git diff --cached --name-only
git diff --cached --stat
git branch --show-current
git log --oneline -10
```

### 第 2 步：分析变更内容

根据 `git diff --cached --name-only` 的文件名和 `git diff --cached --stat` 的统计信息，推断变更类型和范围。

读取 `git log --oneline -10` 的输出，分析最近 5-10 条提交的风格，包括：

- emoji 前缀风格（中文 vs 英文）
- 标题格式和长度
- 主体内容格式

**风格一致性很重要**：项目的提交历史形成了团队约定的风格，遵守它能让提交记录保持可读性和专业性。如果历史中没有统一风格，按下方默认规范执行。

### 第 3 步：生成提交信息

根据 diff 内容选择 emoji，按模板生成。

## 提交信息模板

```
[emoji] [中文标题，不超过 50 字]
- 具体变更 1
- 具体变更 2
- 具体变更 3
```

规则：
- 标题必须有 emoji 前缀
- 标题使用中文，简短清晰（不超过 50 字）
- 使用中文标点
- 主体用 `- ` 列表，每个条目描述一个具体变更

## 类型与 Emoji 对照表

这是唯一权威的类型映射表。根据变更内容选择最匹配的类型；如果涉及多种类型，选择主要变更对应的 emoji。

| 场景 | emoji | 示例 |
|------|-------|------|
| 新功能、新增工具/组件 | ✨ | ✨ 新增 sidebar 自动化生成工具 |
| 部署、发布相关 | 🚀 | 🚀 更新部署配置 |
| 性能优化 | ⚡ | ⚡ 优化列表渲染性能 |
| Bug 修复 | 🐛 | 🐛 修复侧边栏显示问题 |
| 紧急热修复 | 🚑️ | 🚑️ 修复线上白屏问题 |
| 安全修复 | 🔒 | 🔒 修复 token 泄露风险 |
| 新增/修改文档 | 📝 | 📝 新增 Vite 打包结构控制文章 |
| 更新文档/教程 | 📚 | 📚 更新 API 文档 |
| UI/样式更新 | 💄 | 💄 调整按钮颜色和间距 |
| 代码格式化 | 🎨 | 🎨 代码格式化优化 |
| 代码重构 | ♻️ | ♻️ 重构文件结构 |
| 重构（语义等价） | 🔄 | 🔄 重构工具函数命名 |
| 新增测试 | ✅ | ✅ 添加鉴权模块测试用例 |
| 新增依赖 | ➕ | ➕ 添加 dayjs 日期库 |
| 删除依赖 | ➖ | ➖ 移除 lodash 依赖 |
| 升级依赖 | ⬆️ | ⬆️ 升级 React 到 19 |
| 构建/打包配置 | 📦 | 📦 新增文章图片资源并优化图片格式 |
| 配置修改、路径调整 | 🔧 | 🔧 优化图片资源路径并更新配置 |
| 删除代码 | 🔥 | 🔥 删除废弃的旧版接口 |
| 删除废弃代码/文件 | 🗑️ | 🗑️ 清理已废弃的 demo 文件 |
| 文件重命名/移动 | 🚚 | 🚚 重命名 GoInt64On32Bit 文件 |

## 边界情况处理

| 场景 | 处理方式 |
|------|----------|
| 暂存区为空 | 输出提示："暂存区没有待提交的文件，请先 git add"，然后结束（不要自己执行 git add） |
| 涉及多种变更类型 | 选择影响最大/文件最多的类型作为主 emoji |
| 新仓库无历史提交 | 直接按上方默认规范（中文 emoji + 中文标题）生成 |
| 变更内容极小（如修改标点） | 标题简洁即可，不需要主体列表 |

## 示例

**示例 1：修复 Bug**
```
Input: git diff --cached 显示修复了 sidebar.tsx 中的溢出 bug，并更新了相关 CSS
Output: 🐛 修复侧边栏内容溢出问题
- 修复 sidebar.tsx 中列表项溢出容器的问题
- 更新 sidebar.css 添加 max-height 和 overflow 控制
```

**示例 2：新增功能**
```
Input: 新增了 login.tsx 和 auth.ts 两个文件
Output: ✨ 新增用户登录功能
- 新增 Login 登录页面组件
- 新增 auth 工具模块，封装登录请求逻辑
```

**示例 3：文档 + 配置混合（选主要变更）**
```
Input: 修改了 vite.config.ts 并更新了 README.md 中的安装说明
Output: 🔧 优化 Vite 构建配置并更新文档
- 优化 vite.config.ts 中的路径别名配置
- 更新 README 安装说明以匹配新配置
```

## 提交执行（仅当用户明确指示）

只有用户明确说「提交」/「commit」时，才允许执行 git 写命令：

1. 提交前先跑 `git diff --cached --name-only` 核对暂存区，确认与生成的提交信息范围一致
2. `git commit` 使用已生成的提交信息原文
3. 除此之外（仅让生成信息）禁止执行任何 git 写命令
