stenyan[.]dev

JAEN

LLMへの指示内容をコミットメッセージに追記するためのツール「ayumi」を作成した

人々がコーディングエージェントを活用してコードを書くようになって、具体的にどういう指示をした結果その差分に辿り着いたのかが気になるようになってきたので、コミットメッセージに丸ごと含めるためのツールを作ってみました。

仕組み

Claude Code や Codex の UserPromptSubmit という Hook1 と、Git の prepare-commit-msg という Hook2 と組み合わせて利用する想定で作っています。

UserPromptSubmit は、コーディングエージェントへの指示を送信するタイミングで発火するので、ここで作業しているリポジトリとブランチの組を参照の上、ファイルとして指示の内容を保存させます。

Shell
[ユーザーの指示]
      |
      v
[Claude Code / Codex]
      |
      | UserPromptSubmit Hook 発火
      v
[ayumi]
      |
      | Repository + Branch に対応するファイルへ追記
      v
[指示を記録したファイル]
例: ~/.local/share/ayumi/.../foo.jsonl

後ほどコミットする際に、git の prepare-commit-msg で再び発火させます。これはコミットメッセージを準備するタイミングで発火するので、人間がコミットする時もコーディングエージェントにコミットさせる時も実行されます。ここでも作業しているリポジトリとブランチの組を元に、ここまでの指示文を取得してコミットメッセージに追記させるようにしています。

Shell
[git commit]
      |
      | prepare-commit-msg Hook 発火
      v
[ayumi]
      |
      | Repository + Branch に対応するファイルを参照
      v
[指示を記録したファイル]
      |
      | 指示文を取得
      v
[コミットメッセージ]
      |
      | 指示文を追記
      v
[最終的な commit message]

思想

Agent Skillsを使ってコミットメッセージを作らせるみたいなこともやったことがありますが、Skillはどうしても発火する時としない時で揺らぎがあるので、今回Hooksを使う方向で考えてみました。

また、Goを採用している理由は昨今サプライチェーン攻撃が物騒なので、標準ライブラリだけである程度動きそうなものということで選んでみました。

余談: コミットメッセージのフォーマットについて

コミットメッセージへ追記する際にどういう形式がいいかというところが意外と考えるポイントでした。最初は以下のようなフォーマットで実装していました。つまり指示内容をリストの形で列挙する感じです。

Shell
feat: すごい機能を追加

AI Instructions:
- 指示1
- 指示2
- 指示3

しかしこれだと、一回の指示が複数行に渡る場合に、どこからどこが指示した内容なのかがわからなくなるということに気づきました。

Shell
feat: すごい機能をさらに追加

AI Instructions:
- 以下のようなアイデアがあり、作ってほしいです
- hoge
- fuga
- poyo (ここまで指示1)
- (ここから指示2) いいですね。次にここをこうしてほしいです

ということで、以下のような、引用形式で指示と指示の間は空行を含む形式に落ち着きました。

Shell
feat: すごい機能をさらに追加

AI Instructions:
> 以下のようなアイデアがあり、作ってほしいです
- hoge
- fuga
- poyo

> いいですね。次にここをこうしてほしいです

Footnotes

  1. https://code.claude.com/docs/ja/hooks#userpromptsubmit, https://developers.openai.com/codex/hooks#userpromptsubmit

  2. https://git-scm.com/docs/githooks#_prepare_commit_msg