AgentSkillsCN

smart-commit

分析当前的代码变更,按适当粒度拆分提交,并为每个提交提出合适的提交信息。“拆分提交”“撰写提交信息”“整理差异”等请求均可触发该功能。在获得用户批准后,系统会自动执行实际的提交与推送操作。

SKILL.md
--- frontmatter
name: smart-commit
description: 現在の作業差分を分析し、適切な粒度でコミットを分割してコミットメッセージを提案する。「コミットを分けて」「コミットメッセージを考えて」「差分を整理して」などのリクエストで起動する。ユーザーの承認後、実際のコミットとプッシュも実行する。

Smart Commit スキル

作業差分を分析し、論理的な単位でコミットを分割提案する。ユーザーの承認後、実際の git 操作(add / commit / push)も実行する。

ワークフロー

1. 差分の取得

bash
# ステージング済み + 未ステージングの変更一覧
git status --short

# 未追跡ファイルを含む全差分
git diff HEAD

# 未追跡の新規ファイル内容
git diff --no-index /dev/null <file>  # 新規ファイルごとに実行

2. 変更の分類

各ファイルの変更内容を分析し、以下の観点でグルーピングする:

  • 機能単位: 同じ機能に関する変更はまとめる(例: コントローラ + テスト + ルーティング)
  • 関心の分離: 設定変更、リファクタリング、新機能、バグ修正は分ける
  • 依存関係: 後のコミットが前のコミットに依存する場合、依存される側を先にする

分割の粒度ガイドライン

  • 1コミット = 1つの論理的変更(「なぜこの変更をしたか」を1文で説明できる単位)
  • 設定ファイルの変更(Gemfile, package.json 等)は関連する機能変更と同じコミットに含める
  • テストは対応する実装と同じコミットにする
  • リンティング修正やフォーマット変更は独立したコミットにする
  • ファイル削除は、その理由となる変更と同じコミットにまとめる

3. コミットメッセージの生成

プロジェクトのコミットプレフィックス規約に従う: fix:, add:, feat:, update:, change:, refactor:, remove:, test:, chore:, docs:

メッセージは変更の「なぜ」を簡潔に記述する。日本語・英語はプロジェクトの慣習に合わせる。

4. 提案の出力

以下のフォーマットで出力する:

code
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
コミット 1/N
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
メッセージ: <prefix>: <コミットメッセージ>

対象ファイル:
  A  path/to/new-file.ts
  M  path/to/modified-file.rb
  D  path/to/deleted-file.ts

変更概要: <このコミットで何をしたかの1行説明>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ステータス記号: A = 新規追加, M = 変更, D = 削除

全コミットの出力後、実行用の git コマンド一覧も表示する:

bash
# コミット 1/N: <メッセージ>
git add <files...>
git commit -m "<prefix>: <メッセージ>"

# コミット 2/N: <メッセージ>
git add <files...>
git commit -m "<prefix>: <メッセージ>"

5. フィードバック対応

提案後、ユーザーからの調整リクエストに対応する:

  • コミットの統合・分割
  • メッセージの修正
  • ファイルの振り分け変更

調整が完了したら、更新された git コマンド一覧を再出力する。

6. コミットの実行

提案内容についてユーザーの承認を得たら、提案した順序で git add / git commit を実行する。 承認前に勝手にコミットしてはならない。必ずユーザーの明示的な承認(「OK」「実行して」「コミットして」等)を待つこと。

7. プッシュ

すべてのコミットが完了したら、現在のブランチをリモートにプッシュする。

bash
git push -u origin $(git branch --show-current)

注意事項

  • ユーザーの承認なしに git add / git commit / git push を実行しない
  • サブモジュール内の変更がある場合は、サブモジュール側とメインリポジトリ側でコミットを分けて提案する
  • $ARGUMENTS が指定された場合、それを変更の背景コンテキストとして活用する