---
name: git-commit
description: 代码提交辅助 - 审查待提交文件、自动生成 Conventional Commits 信息、执行 git add/commit
---

代码提交辅助工具。审查当前工作区所有改动文件，过滤无关/临时文件，与用户确认提交范围后自动生成符合 Conventional Commits 规范的提交信息，执行提交。

## Usage

```
/git-commit           # 审查所有改动并提交
/git-commit 仅审查    # 仅审查文件，不执行提交
```

## 执行流程

### 阶段 1：扫描与分类

1. **收集改动**：执行 `git status --porcelain` 和 `git diff --stat`，获取所有 staged 和 unstaged 文件
2. **获取变更摘要**：对每个改动文件，执行 `git diff` / `git diff --cached` 获取具体变更内容摘要
3. **分类标记**：

| 分类 | 判定标准 | 标记 |
|------|----------|------|
| ✅ 应提交 | 源码/配置/文档/脚本/技能文件，有实质改动 | `✅` |
| ⚠️ 可疑 | 临时脚本（poll_*/ssh*/run_*.sh）、调试日志(.log)、一次性辅助脚本、重复文件(如 phase9_v2 与 phase9_robust 功能重复) | `⚠️` |
| ❌ 不应提交 | 编译产物、.pyc、node_modules、IDE 配置、系统文件(.DS_Store)、本地临时文件 | `❌` |

**关键判断规则：**
- 新 skill 目录（`.claude/skills/<name>/`）→ 如果是完整的功能 skill，✅；如果是空的或测试的，⚠️
- `AuxiliaryTool/ScriptTool/` 下的脚本 → 如果是已有脚本的重复/调试版本（如 `diag_*`、`check_*`、`fix_*`），⚠️ 提醒用户
- `AuxiliaryTool/ScriptTool/` 下的新目录 → 如果是独立功能模块，✅
- `.log` 文件 → ❌
- 以 `_` 开头的文件 → 检查内容，可能是临时文件
- 中文路径文件 → 正常判断，不作为排除依据

### 阶段 2：展示与确认

以结构化表格展示所有文件及其分类：

```
====== 📋 待提交文件审查 ======

✅ 应提交（N 个）：
| # | 文件 | 状态 | 变更概要 |
|---|------|------|----------|
| 1 | .gitignore | M | 新增 xxx 忽略规则 |
| 2 | ... | A | ... |

⚠️ 可疑（M 个）：
| # | 文件 | 状态 | 原因 |
|---|------|------|------|
| 1 | phase9_fix_output.log | ?? | 调试日志，通常不提交 |
| 2 | ... | ?? | 临时诊断脚本 |

❌ 不应提交（K 个）：
| # | 文件 | 原因 |
|---|------|------|

💡 建议排除的可疑文件：
   - xxx（原因）
   - yyy（原因）

是否按建议范围提交？（是/否/自定义）
```

使用 `AskUserQuestion` 让用户确认：
1. 是否按建议范围提交？
2. 如果有可疑文件，是否要包含某些可疑文件？

### 阶段 3：生成 Commit Message

根据用户确认的文件列表和变更内容，自动生成符合 [Conventional Commits](https://www.conventionalcommits.org/) 规范的提交信息。

**类型判定规则：**

| 类型 | 适用场景 |
|------|----------|
| `feat` | 新增功能、新脚本、新 skill、新工具 |
| `fix` | Bug 修复、脚本错误修正 |
| `docs` | 纯文档改动（PRD、README、注释） |
| `refactor` | 代码重构，不改变功能 |
| `chore` | 配置变更、依赖更新、构建脚本 |
| `test` | 测试相关 |
| `style` | 格式调整（不影响逻辑） |
| `perf` | 性能优化 |

**范围（scope）自动推断：**

| 范围 | 匹配规则 |
|------|----------|
| `deploy` | 文件在 `AuxiliaryTool/ScriptTool/RemoteDeploy/` 或 `自动化部署脚本/` |
| `docker` | 文件在 DM8-Docker 相关目录 |
| `monitor` | 文件在 `AuxiliaryTool/ScriptTool/ServiceMonitor/` 或定时脚本 |
| `skills` | 文件在 `.claude/skills/` |
| `middleware` | 文件在 `MiddlewareVerify/` |
| `config` | `.gitignore`、`config.json` 等配置文件 |
| `docs` | `Docs/` 目录 |
| `test` | 测试脚本 |

**生成格式：**
```
<type>(<scope>): <简短中文描述>

<详细说明（可选，列出每个主要变更）>

Co-Authored-By: Claude <noreply@anthropic.com>
```

**多类型混合**：如果改动涉及多种类型，使用主体类型 + 详细说明中列出其他改动。

**示例：**
```
feat(skills): 新增 git-commit 代码提交辅助技能

新增 .claude/skills/GitCommit/SKILL.md，提供文件审查、commit message 自动生成、交互式提交流程

Co-Authored-By: Claude <noreply@anthropic.com>
```

### 阶段 4：执行提交（🚨 双重确认门控，不可跳过）

**两道确认门，任何一道未通过都不执行 git 操作：**

- **门 1（范围确认）**：阶段 2 已确认提交哪些文件 —— 用户明确点头"按此范围提交"才进入下一步
- **门 2（message 确认）**：展示完整 commit message，**必须用 `AskUserQuestion` 让用户选择**：
  - ✅ 确认提交
  - ✏️ 修改 message（用户给出修改意见后重新生成，再确认）
  - ❌ 取消提交

**门 2 用户选"确认提交"后，才执行：**
1. `git add <确认的文件列表>`（**逐文件 add，不使用 `git add -A` 或 `git add .`**）
2. `git commit -m "<生成的 message>"`

3. **不要自动 push**：提交成功后告知用户，并询问是否需要 `git push`（push 也需用户明确同意才执行）

**推送规则（🚨 分支安全确认，不可跳过）：**

在执行 `git push` 之前，必须执行以下检查：

1. **获取当前分支信息**：执行 `git branch --show-current` 获取当前分支名
2. **获取远程关联信息**：执行 `git remote -v` 获取远程仓库地址
3. **向用户确认**：使用 `AskUserQuestion` 展示以下信息并让用户确认：
   - 当前分支名：`<branch-name>`
   - 远程仓库：`<remote-url>`
   - 推送目标：`origin <branch-name>`
   - 确认选项：✅ 确认推送 / ❌ 取消推送

4. **只有用户明确确认后**，才执行 `git push origin <当前分支名>`（**推送的目标分支必须与当前分支同名，不得推送到其他分支**）

**禁止行为：**
- ❌ 跳过分支确认直接 push
- ❌ 将当前分支推送到非当前分支的远程分支（如从 `feature-a` 推送到 `master`）
- ❌ 使用 `git push` 不带参数（依赖默认行为可能推错分支）
- ❌ 使用 `git push --force` 或 `git push -f`
- ❌ 把"提交 + push"打包执行，两者必须分别确认

**禁止行为：**
- ❌ 跳过任一确认门直接 add/commit
- ❌ 把"未明确拒绝"当作"同意"——必须用户主动确认才执行
- ❌ 一次性把"提交 + push"打包执行，两者必须分别确认
- ❌ 推送前不显示分支信息
- ❌ 推送到与当前分支不同的远程分支

## 注意事项

- **🚨 推送分支安全确认（最高优先级）**：push 前必须显示当前分支名和推送目标，用户明确确认后才能执行 `git push origin <当前分支名>`
- **🚨 禁止推送到非当前分支**：只能推送 `origin <当前分支>`，不能推送到其他分支
- **🚨 禁止使用 `git push` 不带参数或 `git push --force`**
- **绝不使用 `git add .` 或 `git add -A`**：必须逐文件 add，只添加用户确认的文件
- **不自动 push**：push 需用户明确指令
- **不修改 .gitignore**：如需添加忽略规则，提醒用户自行添加
- **commit message 末尾必须有 `Co-Authored-By: Claude <noreply@anthropic.com>`**
- **中文描述优先**：commit 摘要使用中文，与仓库已有提交风格保持一致
- **避免宽泛描述**：如"更新代码"、"修复bug"，应具体到"修复 phase9 权限绑定后菜单不刷新问题"
- **审查优先于提交**：可疑文件宁可多确认，不可误提交
