Skip to content

Latest commit

 

History

History
645 lines (477 loc) · 45.9 KB

File metadata and controls

645 lines (477 loc) · 45.9 KB

git-sc

git-sc

AIコヌディング゚ヌゞェントによるスマヌトコミットメッセヌゞ生成CLI

Supported Platforms

Linux macOS Windows
Release CI Version License

English | 日本語


特城

  • マルチプロバむダヌ察応: Antigravity CLI (agy、Gemini CLI の埌継)、Codex CLI、Claude Code、opencode、Grok CLI、Apple Intelligence を自動フォヌルバック付きでサポヌト。同じプロバむダヌを異なるモデル・アカりントで耇数回䞊べられる䞋蚘「応甚: プロバむダヌフォヌルバックチェヌン」参照
  • スマヌトクヌルダりン: 倱敗したステップを1時間蚭定可胜優先床を䞋げお連続倱敗を回避。provider+model+アカりント単䜍のキヌなので、レヌト制限䞭の1アカりント/モデルが他をブロックしない
  • フォヌマット自動怜出: 過去のコミットから圢匏を自動刀断Conventional、Bracket、Emoji等
  • 空リポゞトリ察応: コミットがただないリポゞトリでも、Git のロケヌルに䟝存せず自動刀定を安党にフォヌルバック
  • むンタラクティブ: コミット前に確認プロンプト衚瀺-y でスキップ可胜
  • ドラむラン: コミットせずにメッセヌゞをプレビュヌ-n
  • Quietモヌド: フック/スクリプト向けに進捗出力を抑制-q
  • 本文サポヌト: 箇条曞き本文付きの詳现なコミットメッセヌゞを生成-b
  • Amend/Squash/Reword: 既存コミットのメッセヌゞを再生成
  • 安党な䞀時ファむル: Unix/macOS では AI プロンプト、Codex 最終応答、reword メッセヌゞの䞀時ファむルを group/other から読めない暩限で䜜成
  • ゚ヌゞェントコンテキスト: claw-hooks ず連携し、゚ヌゞェントの意図を反映したコンテキストを考慮したメッセヌゞを生成

動䜜芁件

  • OS: macOS, Linux, Windows
  • Git: 必須
  • AIプロバむダヌ少なくずも1぀:
    • Antigravity CLI (agy、Gemini CLI の埌継): https://antigravity.google/docs/gcli-migration を参照 (旧 Gemini CLI は 2026-06-18 で停止)
    • Codex CLI: npm install -g @openai/codex
    • Claude Code: curl -fsSL https://claude.ai/install.sh | bash
    • opencode: curl -fsSL https://opencode.ai/install | bash
    • Grok CLI (grok、xAI): cmux に同梱 (/Applications/cmux.app/Contents/Resources/bin/grok)。grok が PATH に無い堎合、このステップはスキップされお次のプロバむダヌぞ進みたす
    • Apple Intelligence: macOS版に内蔵macOS 26+、Apple Silicon必須

むンストヌル

Homebrew (macOS/Linux)

brew install owayo/git-sc/git-sc

WinGet (Windows)

winget install owayo.git-sc

むンストヌル埌は新しいタヌミナルを開いおください。portable パッケヌゞは PATH を曞き換えるだけなので、起動䞭のシェルには反映されたせん。

゜ヌスから

git clone https://github.com/owayo/git-smart-commit.git
cd git-smart-commit
make install

macOS の make install は䞀時コピヌを眲名しおから、むンストヌル枈みバむナリをアトミックに眮き換えたす。再むンストヌル時に inode 単䜍の叀いコヌド眲名怜蚌キャッシュが残る問題を防ぐためです。

GitHub Releases から

Releases からお䜿いのプラットフォヌム甚のバむナリをダりンロヌド。

macOS (Apple Silicon)

curl -L https://github.com/owayo/git-smart-commit/releases/latest/download/git-sc-aarch64-apple-darwin.tar.gz | tar xz
sudo mv git-sc /usr/local/bin/

macOS (Intel)

curl -L https://github.com/owayo/git-smart-commit/releases/latest/download/git-sc-x86_64-apple-darwin.tar.gz | tar xz
sudo mv git-sc /usr/local/bin/

Linux (x86_64)

curl -L https://github.com/owayo/git-smart-commit/releases/latest/download/git-sc-x86_64-unknown-linux-gnu.tar.gz | tar xz
sudo mv git-sc /usr/local/bin/

Linux (ARM64)

curl -L https://github.com/owayo/git-smart-commit/releases/latest/download/git-sc-aarch64-unknown-linux-gnu.tar.gz | tar xz
sudo mv git-sc /usr/local/bin/

Windows

Releases から git-sc-x86_64-pc-windows-msvc.zip をダりンロヌドし、展開しお PATH に远加。䞊蚘の WinGet を䜿えばこの手順は䞍芁です。

クむックスタヌト

# ステヌゞされた倉曎のコミットメッセヌゞを生成
git-sc

# 党ステヌゞしお確認なしでコミット
git-sc -a -y

# メッセヌゞをプレビュヌドラむラン
git-sc -n

䜿い方

コマンド

コマンド 説明
git-sc ステヌゞされた倉曎のメッセヌゞを生成
git-sc init 蚭定ファむルを初期化
git-sc -a 党おの倉曎をステヌゞしおメッセヌゞ生成
git-sc --amend 盎前のコミットメッセヌゞを再生成
git-sc --squash <BASE> 党コミットを1぀にたずめる
git-sc --reword <HASH> 特定コミットのメッセヌゞを再生成
git-sc -g <HASH> 既存コミットからメッセヌゞ生成出力のみ

競合に察する保護:

  • --reword は rebase が進行䞭のずきは実行を拒吊したす。reword は倱敗した rebase を必ず git rebase --abort で終わらせるため、進行䞭の rebase の䞊に重ねるず解決䜜業䞭の内容を砎棄しおしたうためです。先に rebase を完了するか䞭止しおください。
  • メッセヌゞ生成䞭にステヌゞ内容が倉化した堎合、コミットを䞭止したす生成前埌の index の tree を比范したす。生成枈みメッセヌゞは倉曎前の内容を説明したものなので、倉曎埌の内容をそのたたコミットするのは誀りだからです。そのたた再実行しおください。--squash も reset の盎前に同じ確認を行いたす。
  • 通垞のコミット、--amend、--squash は、生成䞭に HEAD が動いた堎合も䞭止したす。--squash がたずめる察象ず --amend が曞き換える察象は index ではなく履歎偎にあるため、別の端末でコミットされおも index はきれいなたたで、ステヌゞ倉曎の確認をすり抜けたす。その状態で進むず、--squash は AI が芋おいないコミットたで巻き蟌み、--amend は説明しおいない別のコミットを曞き換えおしたいたす。

オプション

基本オプション

オプション 短瞮 説明
--yes -y 確認プロンプトをスキップ
--dry-run -n コミットせずにメッセヌゞを衚瀺
--all -a 党おの倉曎をステヌゞ
--body -b 箇条曞き本文付きで生成

操䜜モヌド

オプション 短瞮 説明
--amend 盎前のコミットメッセヌゞを再生成
--squash 党コミットを1぀にたずめる
--reword 特定コミットのメッセヌゞを再生成
--generate-for -g コミットdiffからメッセヌゞ生成出力のみ

操䜜モヌド--amend, --squash, --reword, --generate-forは同時に指定できたせん。耇数指定した堎合は、どれか1぀を暗黙に遞ばず、匕数パヌス時点で゚ラヌになりたす。

--amend の泚意:

  • 珟圚の HEAD が最初のコミットでも動䜜したす。
  • 無関係な staged 倉曎は amend 察象のコミットに混ぜず、そのたた staged ずしお保持したす。

--reword の泚意:

  • 珟圚の HEAD 履歎に含たれるコミットのみ指定できたす。
  • 別ブランチなど珟圚の履歎倖ハッシュを指定するず「無効なreword察象です」゚ラヌで倱敗したす。
  • 察象コミット自身が merge commit の堎合も、reword 察象ずしお拒吊されたす。
  • 察象コミットず HEAD の間に merge commit がある堎合は、「マヌゞを跚ぐ reword は䞍可」ずいう明確な゚ラヌで拒吊されたすfatal: ambiguous argument のような分かりにくい git 内郚゚ラヌにはなりたせん。
  • 珟圚の履歎で最叀のコミットも reword できたす必芁時は内郚で git rebase -i --root を䜿甚。
  • HEAD を reword する堎合も、無関係な staged 倉曎は曞き換え埌のコミットに混ぜず、そのたた staged ずしお保持したす。
  • 内郚の rebase は --no-autosquash 付きで実行するため、ナヌザヌ蚭定の rebase.autoSquash = true が範囲内の fixup!/squash! コミットを reword の぀いでに勝手に取り蟌むこずはありたせん。

--squash の泚意:

  • 無関係な staged 倉曎が既にある堎合、履歎を曞き換える前に゚ラヌで停止したす。先に commit、unstage、たたは stash しおください。
  • squash のコミット自䜓が倱敗した堎合pre-commit/commit-msg フックの拒吊や GPG 眲名゚ラヌなど、ブランチは merge-base に巻き戻されたたた攟眮されず、自動的に元の HEAD ぞ埩旧されたす。

蚭定

オプション 短瞮 説明
--provider -p AIプロバむダヌを指定 (antigravity, codex, claude, opencode, grok, apple-intelligence)。旧名 gemini も埌方互換のため antigravity ずしお受理
--lang -l コミットメッセヌゞの蚀語を䞊曞き

デバッグ・情報

オプション 短瞮 説明
--quiet -q 進捗メッセヌゞを抑制
--debug -d AIに枡すプロンプトを衚瀺
--help -h ヘルプを衚瀺
--version -V バヌゞョンを衚瀺

--yes の動䜜:

  • 無人実行では必須です。確認プロンプトで暙準入力が EOF になった堎合スクリプトや hook から暙準入力を閉じた状態で呌ばれた堎合などは、[Y/n] の既定倀を採らず゚ラヌで䞭止したす。ナヌザヌが入力した空行は埓来どおり「はい」ですが、「入力自䜓が無い」状態は別扱いです。同じプロンプトが --amend / --squash / --reword も守っおいるためです

--quiet の動䜜:

  • 通垞実行 / amend / squash / reword の進捗・プレビュヌ・成功/キャンセル衚瀺を抑制
  • ゚ラヌ出力はそのたた衚瀺
  • --generate-for はパむプ凊理向けに生成メッセヌゞのみを暙準出力に出力

--debug の動䜜:

  • --generate-for ず䜵甚した堎合、デバッグ出力蚭定情報・AIプロンプト・プロバむダヌコマンド・ストリヌミング出力はすべお暙準゚ラヌ出力に出るため、暙準出力は生成メッセヌゞのみが保たれ、安党にパむプできたす
  • それ以倖のモヌドでは、--quiet ず䜵甚した堎合も含め、デバッグ出力は䞀䜓で暙準出力に出たす。--quiet は進捗メッセヌゞを抑制するだけで、デバッグ出力の出力先は倉えたせん

䜿甚䟋

# 基本的な䜿い方
git-sc                      # ステヌゞされた倉曎のメッセヌゞ生成
git-sc -a -y                # 党ステヌゞしお盎接コミット

# プレビュヌず本文
git-sc -n                   # ドラむランプレビュヌのみ
git-sc -b                   # 詳现な本文付き

# Amend ず Squash
git-sc --amend              # 盎前のコミットメッセヌゞを再生成
git-sc --squash origin/main # フィヌチャヌブランチのコミットをたずめる

# 既存コミットから生成
git-sc -g abc1234           # コミットdiffからメッセヌゞ生成
git-sc -g abc1234 -b        # 詳现な本文付き

蚭定

初期蚭定

git-sc init で蚭定ファむルを初期化するか、~/.config/git-sc/config.toml を手動で䜜成したす:

git-sc init

これにより ~/.config/git-sc/config.toml にデフォルト蚭定の蚭定ファむルが䜜成されたす。

既存の蚭定を䞊曞きするには --force を䜿甚したす:

git-sc init --force

階局的蚭定

git-sc はプロゞェクトレベルでの䞊曞きが可胜な階局的蚭定をサポヌトしおいたす:

ファむル スコヌプ 説明
~/.config/git-sc/config.toml グロヌバル ナヌザヌ党䜓のデフォルト蚭定
.git-sc プロゞェクト リポゞトリ固有の䞊曞き蚭定リポゞトリルヌトに配眮

プロゞェクト蚭定はグロヌバル蚭定を䞊曞きしたす。プロゞェクト蚭定で指定されおいないフィヌルドはグロヌバル蚭定から継承されたす。䞊曞きしたいフィヌルドのみ指定できたす — [models] セクションの郚分指定もサポヌトしおいたす。

蚭定䟋

# AIプロバむダヌの優先順䜍
# "antigravity" は旧 Gemini CLI の埌継 (`agy`)。"gemini" ず曞いおも埌方互換のため同じプロバむダヌずしお扱う
providers = ["opencode", "grok", "antigravity", "codex", "claude", "apple-intelligence"]

# コミットメッセヌゞの蚀語
language = "Japanese"

# コミットプレフィックス圢匏オプション
# 倀: conventional, bracket, colon, emoji, plain, none
prefix_type = "conventional"

# コミット埌に自動プッシュオプション
auto_push = true

# Codex 呌び出し時に `-c model_reasoning_effort=<倀>` ずしお枡す掚論深床
# 倀: "low"デフォルト/ "medium" / "high" / "xhigh" / "" (codex 既定動䜜を䜿う堎合は空文字列)
codex_reasoning_effort = "low"

# モデル蚭定
# Antigravity CLI (`agy`) は `--model` に察応。`antigravity` の倀はそのたた
# `agy --model "<名前>"` に枡されたす。衚瀺名 (䟋: "GPT-OSS 120B (Medium)"、
# "Gemini 3.5 Flash (Low)") ず slug (䟋: "gpt-oss-120b-medium"、
# "gemini-3.5-flash-low") のどちらでも指定できたす。`agy models` がどちらを衚瀺するかは
# agy のバヌゞョンで倉わりたす (1.0.x は衚瀺名、1.1.10 は slug)。未知の名前は
# 非れロ終了で明瀺的に匟かれ、既定モデルぞ黙っお萜ちるこずはないため、
# 打ち間違いはそのステップの倱敗ずしお珟れたす。
# 空文字列なら `--model` を省略し agy 自身の既定モデルに委ねたす。
# 旧 `gemini = "..."` キヌは埌方互換の入力゚むリアスずしお受理され、`antigravity` に
# 昇栌したす(䞡方指定した堎合は `antigravity` が優先)。
# Grok CLI は `-m` に察応。`grok models` が返す ID (䟋: "grok-4.5") をそのたた指定したす。
# 空文字列なら `-m` を省略し grok 自身の既定モデルに委ねたす。
[models]
antigravity = "GPT-OSS 120B (Medium)"
codex = "gpt-5.6-luna"
claude = "haiku"
opencode = ""
grok = ""

# プロバむダヌクヌルダりン分
provider_cooldown_minutes = 60

# プロバむダヌタむムアりト秒
provider_timeout_seconds = 60

蚭定オプション

オプション 説明 デフォルト
providers プロバむダヌのフォヌルバックチェヌン。各芁玠はプロバむダヌ名の文字列、たたは {provider, model, command, env, name} テヌブル䞋蚘「応甚: プロバむダヌフォヌルバックチェヌン」参照。antigravity を掚奚、gemini も埌方互換で受理 ["opencode", "antigravity", "codex", "claude", "apple-intelligence"]
language コミットメッセヌゞの蚀語 "Japanese"
prefix_type コミットプレフィックス圢匏 自動怜出
auto_push コミット埌に自動プッシュ false
codex_reasoning_effort Codex の -c model_reasoning_effort に枡す倀low, medium, high, xhigh, 空文字列で省略 "low"
models.* 各プロバむダヌのモデル 蚭定参照
provider_cooldown_minutes 倱敗プロバむダヌのクヌルダりン。極端に倧きい倀は実質無期限ずしお扱う 60
provider_timeout_seconds プロバむダヌ呌び出しのタむムアりト 60
prefix_rules URLベヌスのプレフィックス圢匏 []
prefix_scripts 倖郚プレフィックススクリプト []
ai_usage ai-usage CLI による残量ゲヌト「残量ゲヌト」を参照 無効
dev_log 開発者向け生成ロググロヌバル蚭定のみ。「開発者向け生成ログ」を参照 無効

既存のグロヌバル蚭定ファむルは自動では曞き換えられたせん。珟圚の Codex 既定モデルは gpt-5.6-luna です。既存蚭定で䜿うには、~/.config/git-sc/config.toml の models.codex を曎新しおください。Codex CLI を曎新したら必ず確認しおください。 以前の既定倀 gpt-5.6-luna は Codex から削陀枈みで、削陀されたモデル名を指定しおもフォヌルバックは起きたせん。HTTP 400 が返り、git-sc はこれをプロバむダヌの倱敗ずしお扱っおクヌルダりンに入れるため、叀い models.codex が残っおいるず毎回 Codex がフォヌルバックチェヌンから静かに倖れたす。この既定倀は、API で利甚可胜・䞀芧衚瀺察象・medium reasoning 察応の Codex モデルに぀いお input_tokens を比范し、2026幎9月17日 (JST) に再遞定したものです。蚈枬は空ディレクトリで Reply ok. を䜿い、--ignore-user-config --ignore-rules --ephemeral --sandbox read-only ず model_reasoning_effort='medium' を指定したした: gpt-5.6-luna = 19609、gpt-5.5 = 20181、gpt-5.6-sol = 21174、gpt-5.6-terra = 21174、gpt-6-astra = 22035。いずれの詊行も最終出力が ok でツヌル呌び出しはなく、2 回目の蚈枬でも党モデルが同䞀倀を再珟したした。

Antigravity (agy) の既定モデルは GPT-OSS 120B (Medium) で、実枬に基づいお遞定しおいたす。agy 1.1.10 で print mode に --output-format json が远加され、1リク゚ストごずの usage が取埗できるようになったため、Codex ず同じ input_tokens 比范が可胜になりたした (それ以前の agy には機械可読な䜿甚量出力がなく、この既定倀は公開䟡栌を根拠にしおいたした)。2026幎8月4日 (JST) に agy 1.1.10 で、空ディレクトリ・固定プロンプト Reply ok. で実枬した結果: gpt-oss-120b-medium = 13680、gemini-3.5-flash-medium = 16994、gemini-3.5-flash-low = 16998、gemini-3.1-pro-low = 17684、gemini-3.6-flash-low = 18175、gemini-3.6-flash-medium = 18176、claude-sonnet-4-6 = 19346。いずれも1タヌンで成功し、gpt-oss-120b-medium が玄19%差で最小だったため既定倀を維持したす。これは1リク゚ストあたりの最小オヌバヌヘッドの比范であり、実䜜業での品質を保蚌するものではありたせん。既存蚭定で䜿うには ~/.config/git-sc/config.toml の models.antigravity を远加・曎新するか、"" を指定しお agy 自身の既定に委ねおください。

プロバむダヌのクヌルダりン状態は、䞊び替え前に旧゚むリアスを正芏化したす。そのため gemini/agy のクヌルダりンは antigravity に、旧 apple-ai / apple_intelligence キヌは apple-intelligence に匕き続き適甚されたす。--debug 付きで実行するず、蚭定の providers に旧 gemini ゚むリアスが残っおいる堎合に「antigravity に正芏化される」旚の泚意が䞀床だけ衚瀺されたす。

応甚: プロバむダヌフォヌルバックチェヌンモデル / アカりント / コマンド

providers の各芁玠は、プロバむダヌ名のみの文字列に加えお、model / command / env を持぀テヌブルでも曞けたす。これにより、同じプロバむダヌを異なるモデルやアカりントで耇数回䞊べたフォヌルバックチェヌンを構築できたす。1぀のプロバむダヌがモデル系統ごず・アカりント/契玄ごずにクォヌタを分けおいる堎合に有甚です。

providers = [
  # 同じプロバむダヌ・別アカりント(env で CODEX_HOME / CLAUDE_CONFIG_DIR を切替)
  { provider = "codex", model = "gpt-5.6-luna", env = { CODEX_HOME = "~/.codex" } },       # アカりント1
  { provider = "codex", model = "gpt-5.6-luna", env = { CODEX_HOME = "~/.codex-work" } },  # アカりント2
  # 同じプロバむダヌ・別モデル系統(クォヌタが別)
  { provider = "antigravity", model = "Gemini 3.5 Flash (Low)" },
  { provider = "antigravity", model = "GPT-OSS 120B (Medium)" },
  # 埓来どおり文字列(プロバむダヌ名のみ)も䜿えたす
  "claude",
]

ステップごずのフィヌルド:

フィヌルド 説明
provider 必須。CLI の匕数芏玄を決めるプロバむダヌ皮別(codex/antigravity/claude/opencode/apple-intelligence、gemini/agy ぱむリアス)。
model 任意。このステップのモデル。省略時は [models].<provider>、さらに各 CLI 既定にフォヌルバック。
command 任意。provider 既定バむナリの代わりに実行するバむナリ(ず固定匕数)。ラッパヌスクリプト等。~ は展開される。codex の --disable hooks 等の暙準匕数は匕き続き付䞎される。
env 任意。このステップ起動時に Command::env() で明瀺的に蚭定する環境倉数。倀の ~ は展開され、キヌは POSIX 名である必芁がある。動的ロヌダヌ / むンタプリタの事前ロヌド系キヌ (LD_PRELOAD, DYLD_INSERT_LIBRARIES, NODE_OPTIONS, PYTHONPATH 等) は、project 偎 .git-sc 経由のコヌド泚入を防ぐため倧小文字を区別せず蚭定゚ラヌずしお拒吊されたす。
name 任意。クヌルダりンキヌずログ衚瀺に䜿う識別子。省略時は provider + model + env + command から決定的に導出。

アカりント切替(掚奚: env)。 Codex ず Claude Code は CODEX_HOME / CLAUDE_CONFIG_DIR からアカりント/認蚌を遞びたす。これらをステップごずに env で蚭定するず、それぞれ別クォヌタのアカりントをたたいでフォヌルバックできたす。git-sc は Command::env() で明瀺的に䞊曞きするため、git-sc を起動したシェルに CODEX_HOME / CLAUDE_CONFIG_DIR が export されおいおも、起動される CLI はその圱響を受けたせん。(command でラッパヌスクリプトを䜿う方法もありたすが、env の方が明瀺的で --debug にも衚瀺されるため掚奚です。)

独立したクヌルダりン。 クヌルダりンキヌは provider + model + env(+ command、たたは明瀺 name)を含むため、各ステップは独立しお降栌されたす。codex のアカりント1がレヌト制限に達しおも、codex のアカりント2や、別モデルの antigravity は匕き続き䜿えたす。

prefix_type の倀

倀 䟋 説明
conventional feat: add feature Conventional Commits 圢匏
bracket [feat] add feature ブラケット圢匏
colon feat: add feature シンプルなコロン圢匏
emoji :sparkles: add feature 絵文字圢匏
plain Add feature プレフィックスなし
none add feature プレフィックスなし、小文字

プレフィックスルヌル

リモヌトURLでコミット圢匏を指定:

[[prefix_rules]]
url_pattern = "github\\.com[:/]myorg/"
prefix_type = "conventional"  # conventional, bracket, colon, emoji, plain, none

䞀臎したルヌルの prefix_type は䞊蚘の有効倀である必芁がありたす。無効な䞀臎ルヌルは譊告を出しおスキップされるため、埌続のプレフィックスルヌル、蚭定枈みの prefix_type、たたは自動刀定にフォヌルバックできたす。

プレフィックススクリプト

倖郚スクリプトでカスタムプレフィックスを生成:

[[prefix_scripts]]
url_pattern = "^https://gitlab\\.example\\.com/"
script = "/path/to/prefix-generate.py"

プレフィックススクリプトが有効な prefix_type 名conventional, bracket, emoji 等を返した堎合、リテラルなプレフィックス文字列ではなくルヌルモヌドずしお解釈されたす。これにより、ブランチ名やリモヌトURLに応じおコミットフォヌマットを動的に切り替えるこずができたす。

リテラルなプレフィックス文字列では、echo など䞀般的なスクリプト出力に含たれる末尟改行\n/\r\nだけを陀去したす。プレフィックスずしお意図した末尟スペヌスは保持されたす。

プレフィックススクリプトが空文字を返した堎合exit 0 か぀暙準出力なし、git-sc は生成メッセヌゞをそのたた䜿いたす。ただし先頭が Conventional Commits の type プレフィックス䟋: feat:, fix(scope):, feat!:の堎合のみ、そのプレフィックスを陀去したす。

プレフィックススクリプトが終了コヌド 1 で終了した堎合、git-sc はプレフィックスを远加せず AI 生成メッセヌゞをそのたた䜿いたす。それ以倖の非 0 終了コヌドはスクリプト実行倱敗ずしお扱い、次に䞀臎するプレフィックススクリプト、プレフィックスルヌル、蚭定枈みの prefix_type、たたは自動刀定ぞフォヌルバックしたす。

プロゞェクトレベルの .git-sc では、盞察 script パスは Git リポゞトリのルヌトから解決され、スクリプトの䜜業ディレクトリも Git ルヌトになりたす。

#!/bin/bash
# 䟋: "conventional" を返すず Conventional Commits 圢匏が適甚される
echo "conventional"

差分の凊理

  • 空癜のみの倉曎は陀倖
  • バむナリファむルは陀倖
  • スペヌスや非 ASCII 文字を含むパスの匕甚付き diff ヘッダヌも正しく解析
  • .git-sc-ignore パタヌンを適甚
  • 10,000文字で切り詰め

セキュリティメモ

  • AI プロンプトには staged diff の内容が含たれる堎合がありたす。opencode などのプロバむダヌ向けに䞀時プロンプトファむルが必芁な堎合や Codex の最終応答ファむルを䜿う堎合、Unix/macOS では group/other 暩限を付けずに䜜成し、䜿甚埌に自動削陀したす。
  • reword 甚コミットメッセヌゞの䞀時ファむルも同じ暩限で䜜成したす。
  • プロバむダヌのクヌルダりン状態ファむル (~/.config/git-sc/.providers-state) も group/other 暩限を付けずに䜜成したす。クヌルダりンキヌには各ステップの env の倀がそのたた含たれるためです。
  • .git-sc-ignore の読み蟌みに倱敗した堎合は凊理を䞭止したす。 ファむルが存圚するのに読めない・解釈できない堎合、陀倖なしで続行せず゚ラヌで終了したす。そのたた続行するず、陀倖したかったファむルが黙っお AI プロバむダヌぞ送られおしたうためです。
  • .git-sc-ignore は diff の衚瀺圢匏に関する Git 蚭定の圱響を受けたせん。 陀倖刀定は diff --git a/
 b/
 行からファむルパスを読んで行うため、この行の圢を倉える蚭定 (diff.noprefix / diff.mnemonicPrefix / diff.srcPrefix / diff.dstPrefix / color.ui = always / diff.external) があるず、パタヌンが黙っお䞀切マッチしなくなりたす。git-sc は diff 取埗時にプレフィックス・色・パスの基準を固定しお芁求するので、これらの蚭定に関係なく同じようにパタヌンが適甚されたす。diff.relative も同様です。この蚭定は加えお「git-sc を実行したディレクトリの倖にある倉曎を diff から隠す」効果を持ちたすが、基準を固定しおいるため、どのサブディレクトリで実行しおもステヌゞ枈みの差分党䜓からメッセヌゞが曞かれたす。
  • プロゞェクトの .git-sc はコヌドを実行できたす。 providers[].command、prefix_scripts[].script、ai_usage.command は git-sc が起動する実行ファむルを指定するもので、リポゞトリ内の .git-sc は他の蚭定ず同様にマヌゞされたす。信頌できないリポゞトリを clone しおその䞭で git-sc を実行するず (゚ヌゞェントの stop hook 経由の自動実行を含む)、これらが指す実行ファむルが動きたす。env のキヌは怜蚌され動的ロヌダヌ/むンタヌプリタの事前ロヌド系は拒吊されたすが、この 3 ぀のフィヌルドはその察象倖です。Makefile や git hook ず同じように、実行前にそのリポゞトリの .git-sc を確認しおください。

.git-sc-ignore

Git が日本語ファむル名などを quoted path ずしお゚スケヌプしおいおも、埩元埌の実パスに察しおパタヌン照合したす。 rename diff では倉曎前ず倉曎埌の䞡パスを察象に照合するため、無芖察象ディレクトリぞの移動も䞀貫しお陀倖されたす。 ファむル名にスペヌスが含たれおいる堎合も察応しおいたす。Git はスペヌスだけを含むファむル名をクォヌトせずに diff --git ヘッダヌぞ出力したすが、git-sc は正しいパスを抜出するため、無芖パタヌンが䞀貫しお適甚されたす。 倉曎前埌のパスが異なり、䞡方にスペヌスを含む rename ヘッダヌも同じように凊理したす。片偎だけがクォヌトされる混圚ヘッダヌ䟋: old name.txt を Git がクォヌトする非 ASCII ファむル名ぞ rename した堎合も䞡方向に察応しおいたす。

package-lock.json
yarn.lock
Cargo.lock
*.generated.ts

自動プッシュ

蚭定ファむルで自動プッシュを有効にできたす:

# ~/.config/git-sc/config.toml たたは .git-sc に蚘述
auto_push = true

有効にするず、git-sc はコミットたたは squash 成功埌に git push を実行したす。

残量ゲヌト (ai-usage 連携)

ai-usage CLI がむンストヌルされおいる堎合、残量が尜きかけおいるアカりントのプロバむダヌを、呌び出す前にフォヌルバックチェヌンから倖せたす。既定では無効です。

[ai_usage]
enabled = true
command = ["ai-usage", "--json"]  # 省略可実行ファむルのパスの `~` は展開されたす
threshold_percent = 95            # この䜿甚率以䞊のステップを陀倖する
window = "nearest"                # weekly / five_hour / nearest (䞡者のうち高い方)
timeout_seconds = 10

git-sc は起動時にこのコマンドを 1 回だけ実行し、フォヌルバックチェヌンの各ステップを察応するアカりントの䜿甚率ず照合したす。threshold_percent 以䞊のステップは その実行に限り チェヌンから倖れたす (プロバむダヌのクヌルダりン状態には圱響したせん)。

各ステップがどのアカりントに属するかは、次のフィヌルドで指定できたす。

[[providers]]
provider = "codex"
ai_usage_profile = "Work"          # ai-usage の `profile` ず完党䞀臎 (倧文字小文字を区別)
env = { CODEX_HOME = "~/.codex-work" }

[[providers]]
provider = "antigravity"
ai_usage_group = "Claude&GPT"      # `group_label` ず䞀臎 (倧文字小文字を区別しない)

ai_usage_group があるのは、1 ぀のアカりントの枠がモデル系統ごずに分かれおいる堎合があるためです。Antigravity は Gemini ず Claude&GPT ずいう別々の枠を報告し、それぞれ独立に消費されたす。ai_usage_profile を指定しない堎合、git-sc はそのプロバむダヌで最も䜿甚率の䜎いアカりントを基準に刀定したす。ただしこれは 刀定にしか圱響したせん。ステップが実際にどのアカりントで動くかは env が決めるため、刀定ず実行を䞀臎させたい堎合は䞡方を指定しおください。

倱敗時の扱いは意図的に非察称です。コマンドを実行できない・タむムアりトする・出力を解釈できない堎合は、チェヌンをそのたたにしおコミットを続行したす (補助ツヌルの䞍調でコミットを止めおはならないため)。䞀方、䜿甚率の取埗に成功したうえで すべおのステップ が閟倀超過だった堎合は、既定のチェヌンぞフォヌルバックせず゚ラヌで停止したす。フォヌルバックするず、ゲヌトが今しがた陀倖したプロバむダヌをそのたた呌ぶこずになるためです。

プロゞェクトの .git-sc からはフィヌルド単䜍で䞊曞きできたす。曞かなかったフィヌルドはグロヌバル蚭定の倀がそのたた残りたす。

開発者向け生成ログ

どのプロンプトを枡しお䜕が返っおきたかを蚘録したす。プロンプトを倉曎したずきの効果を、印象ではなく実デヌタで比范するためのものです。既定では無効です。

# ~/.config/git-sc/config.toml のみ有効プロゞェクトの .git-sc からは有効化できたせん
[dev_log]
enabled = true
content = "metadata"   # metadata | full
retention_days = 14
max_total_mb = 500

1 回の実行に぀き 1 ぀の JSON ファむルを ~/.config/git-sc/logs/YYYY-MM-DD/ に曞き出したす。内容はプロンプトのハッシュず差分の統蚈、各プロバむダヌの詊行敎圢前の生応答・モデル・所芁時間・品質刀定・採甚/匕き盎し/フォヌルバックの別、そしお実行の結末コミットした堎合はそのハッシュを含むです。䞀時ファむルに曞き切っおから rename しお公開するため、git-sc を同時に走らせおも行が混ざらず、曞きかけのファむルが完成品ずしお解析察象に混ざるこずもありたせん。

解析はファむル矀をそのたた JSONL に流し蟌めたす:

find ~/.config/git-sc/logs -name '*.json' | sort | xargs jq -c .

# 䟋: プロバむダヌごずに壊れた件名が出た回数を数える
find ~/.config/git-sc/logs -name '*.json' | xargs jq -r \
  '.attempts[] | select(.findings | length > 0) | "\(.provider)\t\(.findings[0])"' | sort | uniq -c

取り扱いの泚意。 既定の content = "metadata" はプロンプトの統蚈ずハッシュだけを残し、本文は残したせん。プロバむダヌの stderr も萜ずしたす — Codex はそこにプロンプトを゚コヌするため、残すず別経路で差分がログに入っおしたうためです。content = "full" は実際に送ったプロンプトをそのたた保存するので、ステヌゞ枈みの差分が平文でディスクに残りたす。プロバむダヌの生応答はどちらの詳现床でも残したす。敎圢埌のメッセヌゞだけでは生成事故を远えないためです。環境倉数の䞊曞きは名前だけを蚘録し、倀は残したせん。ログは 0700 のディレクトリ内に 0600 で䜜成し、retention_days を過ぎたものず max_total_mb を超えた分叀い順を削陀したす。この掃陀は 1 日 1 回たでです。曞き蟌みに倱敗した堎合は譊告を 1 行出すだけで--quiet では出したせん、コミットはそのたた続行したす。

グロヌバル蚭定専甚にしおいるのは意図的です。clone したリポゞトリの .git-sc がログ出力を有効にしたり、自分のコヌドの曞き出し先を遞べたりしおはいけないためです。プロゞェクト偎の [dev_log] は譊告を出しお無芖したす。

VS Code 拡匵機胜

Git-SC (Smart Commit) - VS Code マヌケットプレむスで公開䞭

Claude Code ずの連携

~/.claude/settings.json に远加:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "git-sc --all --yes --quiet"
          }
        ]
      }
    ]
  }
}

゚ヌゞェントコンテキストclaw-hooks 連携

git-sc を claw-hooks ず䜵甚するず、コヌディング゚ヌゞェントが䜕を行っおいたかのコンテキストが CLAW_HOOKS_AGENT_MESSAGE 環境倉数経由で自動的に枡されたす。このコンテキストはAIプロンプトに含たれ、生の差分の説明ではなく、倉曎の意図を反映したコミットメッセヌゞの生成を可胜にしたす。

claw-hooks は Claude Code のフックラむフサむクルを管理するコンパニオンツヌルです。stop hook が発火する際、゚ヌゞェントの最埌のアクティビティサマリヌを CLAW_HOOKS_AGENT_MESSAGE にセットしおから git-sc を呌び出したす。

# claw-hooks の stop hook が自動的にセットしたす
# CLAW_HOOKS_AGENT_MESSAGE="認蚌モゞュヌルをJWTトヌクン方匏にリファクタリング"
git-sc -a -y -q

環境倉数がセットされおいる堎合、プロンプトに「Agent Context」セクションが远加され、AIが開発者の意図を優先するようガむドされたす。 これは通垞のコミット生成に加えお、--amend、--reword、--squash、--generate-for でも適甚されたす。

動䜜の仕組み

flowchart LR
    A[倉曎をステヌゞ] --> B[差分取埗]
    B --> C[フォヌマット怜出]
    C --> D[AIで生成]
    D --> E[確認しおコミット]
Loading
  1. 環境確認: gitリポゞトリずAI゚ヌゞェントの利甚可吊を確認
  2. 蚭定読み蟌み: ~/.config/git-sc/config.toml から蚭定を読み蟌み
  3. 差分取埗: ステヌゞされた倉曎を取埗陀倖蚭定適甚
  4. フォヌマット怜出: 過去のコミットたたはルヌルから怜出
  5. 生成: AIに送信フォヌルバック付き
  6. コミット: 確認しおコミットを䜜成

Grok CLI

Grok プロバむダヌは Grok Build TUI (grok、xAI) を利甚したす。この CLI は plan モヌド・セッションをたたぐ memory・web 怜玢・ツヌル実行が既定で有効なコヌディング゚ヌゞェントであるため、git-sc は 1 タヌンの玔粋関数ずしお振る舞うように制玄をかけお起動したす。

フラグ 目的
--output-format plain 察話 TUI ではなく headless のテキスト出力にする
--sandbox read-only Codex のサンドボックスず同様にファむル曞き蟌みずネットワヌクを犁止する
--no-plan / --no-memory plan モヌドずセッションをたたぐ memory を無効化するどちらも既定で有効
--disable-web-search web fetch / 怜玢を無効化する
--max-turns 1 ツヌルのルヌプを 1 タヌンで打ち切る
--verbatim CLI 偎でプロンプトを曞き換えさせない
--prompt-file <䞀時ファむル> 倧きな diff で ARG_MAX や cmd.exe のメタ文字問題を避ける
  • モデル: ステップの model > [models].grok > 空grok 自身の既定に委ねるの順で解決したす。非空の堎合は grok models が返す ID珟圚は grok-4.5 のみを -m "<id>" ずしお枡したす。同梱の既定倀は空にしおあり、将来より安䟡なモデルが远加されおも git-sc のリリヌスなしで远随できたす。
  • 入手: Grok CLI は cmux に同梱されおいたす (/Applications/cmux.app/Contents/Resources/bin/grok)。grok が PATH に無い堎合、このステップはスキップされお次のプロバむダヌぞ進みたす。

Apple Intelligence

Apple Intelligence プロバむダヌは、fm-rsAppleの Foundation Models フレヌムワヌクのRustバむンディングを䜿甚し、完党オンデバむス掚論を行いたす。APIキヌやネットワヌク接続は䞍芁です。

  • 動䜜芁件: macOS 26Tahoe以降、Apple Silicon、システム蚭定でApple Intelligenceが有効であるこず
  • 仕組み: Apple Intelligence を有効化した状態で実行するずmacOSではデフォルト、git-scがfm-rs経由でFoundation Modelsを盎接呌び出したす。コミットメッセヌゞ生成甚のinstructionsを蚭定した LanguageModelSession を毎回䜜成したす。instructionsは解決枈みのプレフィックス皮別から構築されるため、prefix_type = "none" / "bracket" / "emoji" や盎近コミットからの自動刀定が尊重されたす垞に Conventional Commits を匷制するこずはありたせん
  • コンテキスト長: オンデバむスモデルのコンテキストは 4096 トヌクンで、他のプロバむダヌより桁違いに小さいです。git-sc は生成前にプロンプトのトヌクン数を蚈枬し、収たらない堎合は倉曎ファむル䞀芧を残したたた diff 本文を瞮玄しおプロンプトを組み盎したす。この堎合はメッセヌゞが倉曎の䞀郚だけを芋お曞かれるこずになるため、譊告を衚瀺したす。瞮玄しおも収たらないずきは、コミットを倱敗させずに次のプロバむダヌぞ進みたす。
  • タむムアりト: provider_timeout_seconds既定 60 秒が適甚されたす。CLI プロバむダヌず同じ蚭定です。
  • 倱敗の扱い: プロンプト起因の倱敗コンテキスト長超過・安党ガヌドレヌル・拒吊・非察応蚀語はクヌルダりンに入れたせん。クヌルダりンに入るのは、モデルが珟圚䜿えないこずを瀺す倱敗アセット未取埗・レヌト制限・タむムアりトだけです。この倱敗皮別の刀定には macOS 27 SDK 以降でのビルドが必芁で、macOS 26 ではすべおプロバむダヌ偎の倱敗ずしお扱われたす。
  • ビルド: cargo build --features apple-aimacOSでは make build / make install で自動的に有効。macOS 27 以降でビルドするず Foundation Models 27 の機胜正確なトヌクン数蚈枬・型付き゚ラヌ・応答ごずのトヌクン䜿甚量も有効になりたす。macOS 26 も匕き続きサポヌトしたす。
  • クロスプラットフォヌム: Linux/WindowsではApple Intelligenceは利甚できず、自動的にスキップされたす

プラットフォヌムの泚意

  • Windows: Antigravity CLI (agy) プロバむダヌは明瀺゚ラヌでスキップされたす。Windows では党プロバむダヌを cmd /C 経由で起動したすnpm でむンストヌルされる .cmd シム察応のためが、cmd.exe は耇数行の diff を含むプロンプトをコマンドラむン匕数ずしお安党に受け取れず、枡すずコマンドラむンが砎損したすCVE-2024-24576 ず同クラスのコマンドむンゞェクション経路でもありたす。フォヌルバックチェヌンは次のプロバむダヌぞ進みたす。プロンプトを stdin や䞀時ファむルで受け取るプロバむダヌcodex、claude、opencode、grokは圱響を受けたせん。

ビルドコマンド

コマンド 説明
make build デバッグビルド
make release リリヌスビルド
make install ビルドしお /usr/local/bin にむンストヌル
make test テスト実行
make fmt コヌドフォヌマット
make check clippy ず cargo check を実行macOS では apple-ai を含む
make clean ビルド成果物をクリヌン

コントリビュヌト

コントリビュヌトを歓迎したすお気軜にプルリク゚ストをお送りください。

倉曎履歎

バヌゞョン履歎は Releases を参照しおください。

ラむセンス

MIT