---
name: git-commit
description: 代码提交辅助 - 审查待提交文件、自动生成 Conventional Commits 信息、执行 git add/commit/push（仅限当前分支）
---

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

**🚨 重要限制：**
- **仅限当前分支**：只能提交到当前分支，禁止切换分支或提交到其他分支
- **推送需确认**：每次 push 到远程仓库前必须与用户确认

## Usage

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

## 执行流程

### 阶段 0：分支检查（前置步骤）

**在执行任何 git 操作前，必须先检查当前分支：**

1. **获取当前分支信息**：
   ```bash
   git branch --show-current      # 获取当前分支名
   git rev-parse --abbrev-ref HEAD # 备用方法
   ```

2. **获取远程分支信息**：
   ```bash
   git remote -v                  # 查看远程仓库
   git branch -vv                 # 查看分支跟踪关系
   ```

3. **明确告知用户**：
   - 当前分支名
   - 远程仓库名（通常是 origin）
   - 远程跟踪分支

4. **锁定分支**：
   - ✅ 只能在当前分支执行 `git add` 和 `git commit`
   - ❌ 禁止执行 `git checkout`、`git switch`、`git push origin <other-branch>`
   - ❌ 禁止提交到非当前分支

### 阶段 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. **🚨 推送确认（三重门控）**：
   - 提交成功后，**必须**询问用户是否需要 `git push`
   - 使用 `AskUserQuestion` 让用户选择：
     - ✅ 推送到远程仓库（当前分支）
     - ❌ 不推送，仅本地提交
   - 如果用户选择推送，**必须再次确认**：
     - 显示即将推送的分支：`git push origin <当前分支名>`
     - 用户确认后才执行推送
   - **禁止行为**：
     - ❌ 自动推送（必须用户明确同意）
     - ❌ 推送到其他分支（只能推送到当前分支的远程跟踪分支）
     - ❌ 执行 `git push --all` 或 `git push --tags`（除非用户明确要求）

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

## 注意事项

- **🚨 三重确认门控（最高优先级）**：
  1. 范围确认（门1）- 用户确认提交哪些文件
  2. Message 确认（门2）- 用户确认 commit message
  3. 推送确认（门3）- 用户确认是否推送及推送目标
- **🚨 分支限制（严格执行）**：
  - 只能在当前分支操作，禁止切换分支
  - 只能推送到当前分支的远程跟踪分支
  - 禁止使用 `git push origin <其他分支名>`
- **绝不使用 `git add .` 或 `git add -A`**：必须逐文件 add，只添加用户确认的文件
- **推送必须确认**：每次 push 前必须与用户确认，显示完整的推送命令和目标分支
- **不修改 .gitignore**：如需添加忽略规则，提醒用户自行添加
- **commit message 末尾必须有 `Co-Authored-By: Claude <noreply@anthropic.com>`**
- **中文描述优先**：commit 摘要使用中文，与仓库已有提交风格保持一致
- **避免宽泛描述**：如"更新代码"、"修复bug"，应具体到"修复 phase9 权限绑定后菜单不刷新问题"
- **审查优先于提交**：可疑文件宁可多确认，不可误提交
