# Commit

> 把项目当前所有变更按内容分组，一组一组地调用 /msg 生成提交消息并输出 git commit 命令，由用户逐组执行后再继续下一组。带 --auto 参数时自动执行所有组的 git add 和 git commit，无需用户介入。

- Skill: `orangeviolin/commit` (Agent Skill)
- Install (CLI): `npx skillmds@latest add orangeviolin/commit`
- Raw SKILL.md: https://api.skillmd.com/api/skills/orangeviolin/commit/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: OrangeViolin (https://skillmd.com/u/orangeviolin)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/orangeviolin/commit

---


# /commit — 分组提交助手

## 参数

| 参数 | 说明 |
|------|------|
| （无） | 交互模式：每组输出命令，等用户手动执行后再继续 |
| `--auto` | 自动模式：依次对所有组自动执行 `git add` + `git commit`，无需用户介入 |

## 工作原理

### 交互模式（默认）

每次调用 `/commit` 只处理**一组**变更：

1. 用 `git status` 扫描当前所有未提交变更（staged + unstaged + untracked）
2. 若无变更 → 输出"无未提交变更"并退出
3. 将变更按**内容领域**分组（见"分组策略"）
4. 展示完整分组计划（首次）或当前剩余组（后续调用）
5. 取**第一组**，执行 `/msg` 流程（stage → 生成消息 → 写临时文件）
6. 输出 `bash wiki/scripts/skill_commit.sh -F <tmpfile>` 命令
7. 告知用户执行该命令后再次调用 `/commit` 处理下一组

用户工作流：`/commit` → 执行命令 → `/commit` → 执行命令 → … 直到所有组完成。

### 自动模式（`--auto`）

一次调用处理**所有组**：

1. 用 `git status` 扫描全部变更，按分组策略归类
2. 若无变更 → 输出"无未提交变更"并退出
3. 展示完整分组计划
4. 逐组执行（无需用户确认）：
   a. `git add <该组所有文件路径>`
   b. `git diff --cached` 生成提交消息草稿
   c. 写入 `/tmp/gitmsg_*.txt`
   d. 执行 `bash wiki/scripts/skill_commit.sh -F <tmpfile>`
   e. 输出该组提交结果（commit hash + 消息首行）
5. 所有组完成后输出汇总

**注意**：`--auto` 模式下 Claude 有权直接执行 `git add` 和 `git commit`，这是用户明确授权的行为。

## 分组策略

**按功能语义**分组，不按目录前缀。每组代表一类独立的变更意图，一个文件只属于一组。

| 优先级 | 组名 | 功能 | 典型路径 |
|--------|------|------|----------|
| 1 | **skills** | Claude skill / 基因 | `.claude/skills/`、`local/skills/`、`local/gene/` |
| 2 | **scripts** | 自动化脚本与构建工具 | `local/script/*.py`、`local/script/*.sh` |
| 3 | **frontend** | 浏览器端渲染（JS + CSS 合并） | `docs/wiki/js/`、`docs/wiki/css/`、`docs/wiki/plugins/` |
| 4 | **pages** | Wiki 词条内容 | `docs/wiki/pages/` |
| 5 | **history** | 词条修订历史 | `docs/wiki/history/` |
| 6 | **logs** | 流程日志（RFC / butler / 审计） | `logs/` |
| 7 | **config** | 项目配置 | `docs/wiki/pages.json`、`*.json`、`.gitignore` |
| 8 | **ref** | 文档、规范、说明 | `ref/`、`README.md`、`CHANGELOG.md`、`CLAUDE.md`、`LAW.md`、`TODO.md`、`CONSTITUTION.md` |
| 9 | **local** | 本地私有数据（不进主仓） | `local/config/`、`local/memory/` |
| 10 | **other** | 其他所有文件 | — |

**判断原则**：先看文件的**用途**，再看路径。路径是辅助线索，不是唯一依据。
若某组只有 1 个文件且与相邻组强相关，可合并（由 Claude 判断）。

## 执行步骤

### Step 1 — 扫描变更

```bash
git status --short
```

收集所有 `M`、`A`、`D`、`??` 状态的文件路径。

### Step 2 — 分组并展示计划

按分组策略归类，输出如下格式：

```
📦 分组计划（共 N 组）：

[1/N] scripts（3 个文件）
  - wiki/scripts/record_revision.py
  - wiki/scripts/publish.sh
  - wiki/scripts/rebuild_recent.py

[2/N] skills（1 个文件）
  - .claude/skills/wiki/SKILL.md

[3/N] docs（2 个文件）
  - README.md
  - wiki/doc/recent-log.md
```

### Step 3 — 处理组（交互模式）

**判断"第一组"**：即 `git status` 中仍有变更的最高优先级组（已完成提交的组不再出现在 status 中）。

对该组执行 `/msg` 流程：

1. `git add <该组所有文件路径>`（逐个显式路径，**禁止** `-A`/`.`）
2. `git diff --cached --stat` 确认缓存区
3. `git diff --cached` 查看具体内容
4. `git log --oneline -5` 了解 commit 风格
5. 撰写中文提交消息草稿
6. 用 Bash 写入 `/tmp/`（**禁止用 Write 工具**，防止写入项目目录）：
   ```bash
   MSGFILE=/tmp/gitmsg_$(date +%Y%m%d_%H%M%S)_$(git diff --cached | sha256sum | cut -c1-6).txt
   cat > "$MSGFILE" << 'EOF'
   <消息正文>
   EOF
   echo "$MSGFILE"
   ```

### Step 4 — 输出并等待（交互模式）

输出格式：

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[1/N] scripts — 提交消息已写入 /tmp/gitmsg_XXXXXXXX_XXXXXX.txt

<消息草稿全文>

执行：
  bash wiki/scripts/skill_commit.sh -F /tmp/gitmsg_20260427_143521_a3f8c1.txt

完成后再次运行 /commit 处理下一组 [2/N] skills
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

若这是最后一组，替换为"完成后所有变更已提交"。

### Step 3-AUTO — 逐组自动提交（`--auto` 模式）

对每组依次执行，**不停顿等待用户**：

1. `git add <该组所有文件路径>`（逐个显式路径，**禁止** `-A`/`.`）
2. `git diff --cached` 查看内容，撰写中文提交消息草稿
3. 写入 `/tmp/gitmsg_*.txt`
4. **直接执行** `bash wiki/scripts/skill_commit.sh -F <msgfile>`
5. 输出该组结果：
   ```
   ✅ [1/N] scripts — <commit hash 短码> <消息首行>
   ```
6. 继续下一组，直到全部完成

### Step 4-AUTO — 汇总（`--auto` 模式）

所有组完成后输出：

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 全部 N 组已自动提交：
  abc1234 [1/N] scripts: …
  def5678 [2/N] skills: …
  …
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

## 禁止事项

- ❌ 禁止 `git add -A` / `git add .` / `git add --all`（无论何种模式）
- ❌ 交互模式下禁止自动执行 `git commit`（`--auto` 模式除外，该模式已获用户授权）
- ❌ 禁止用 Write 工具写消息文件——必须用 Bash 写入 `/tmp/gitmsg_*.txt`，不得写入项目目录

## 边界情况

- **缓存区已有内容**：交互模式下先询问用户是否清除（`git restore --staged .`）还是并入当前组；`--auto` 模式下将缓存区内容并入当前最高优先级组直接处理
- **文件跨组**：按优先级表取最高优先级组
- **只有一组**：直接执行，不展示分组计划

