👻

コミットメッセージをclaude codeに考えて貰う

に公開

aicommits使っていたが、ちょっと不便なのとclaude code maxプランなので
claude code君にコミットメッセージを考えて貰った。

.gitconfig
[alias]
  cm = "!f() { \
      spinner() { \
          local pid=$1; \
          local delay=0.1; \
          local i=0; \
          while kill -0 $pid 2>/dev/null; do \
              case $i in \
                  0) printf \"\\r  ⠋  Thinking...\" ;; \
                  1) printf \"\\r  ⠙  Thinking...\" ;; \
                  2) printf \"\\r  ⠹  Thinking...\" ;; \
                  3) printf \"\\r  ⠸  Thinking...\" ;; \
                  4) printf \"\\r  ⠼  Thinking...\" ;; \
                  5) printf \"\\r  ⠴  Thinking...\" ;; \
                  6) printf \"\\r  ⠦  Thinking...\" ;; \
                  7) printf \"\\r  ⠧  Thinking...\" ;; \
                  8) printf \"\\r  ⠇  Thinking...\" ;; \
                  9) printf \"\\r  ⠏  Thinking...\" ;; \
              esac; \
              i=$(( (i+1) % 10 )); \
              sleep $delay; \
          done; \
          printf \"\\r                                    \\r\"; \
      }; \
      add_flag=''; \
      while [ $# -gt 0 ]; do \
          case $1 in \
              -a|--all) add_flag='-u' ;; \
              -A) add_flag='-A' ;; \
          esac; \
          shift; \
      done; \
      [ -n \"$add_flag\" ] && git add $add_flag; \
      if [ -z \"$(git diff --staged)\" ]; then \
          echo 'No staged changes'; \
          return 1; \
      fi; \
      context=\"Recent commit messages in this project:\n\"; \
      context+=$(git log --oneline -10 --pretty=format:'- %s'); \
      context+=\"\n\nCurrent changes:\n\"; \
      context+=$(git diff --staged); \
      additional_prompt=''; \
      while true; do \
          prompt='Generate a commit message following the project style. If no clear pattern exists, use conventional commits. Output ONLY one-line title. No explanations'; \
          if [ -n \"$additional_prompt\" ]; then \
              prompt=\"$prompt $additional_prompt\"; \
          fi; \
          ( echo \"$context\" | claude -p \"$prompt\" --system-prompt \"You are git commit writer\" > /tmp/git_cm_msg_$$ 2>&1 ) & \
          spinner_pid=$!; \
          spinner $spinner_pid; \
          msg=$(cat /tmp/git_cm_msg_$$); \
          rm -f /tmp/git_cm_msg_$$; \
          echo \"Generated: $msg\"; \
          read -p 'Use this message? [Y/n/e/r=regenerate with prompt] (default: y) ' choice; \
          [ -z "$choice" ] && choice=y; \
          case $choice in \
              y) git commit -m \"$msg\"; break ;; \
              e) git commit -e -m \"$msg\"; break ;; \
              n) echo 'Cancelled'; break ;; \
              r) \
                  read -p 'Additional instructions (e.g., \"make it shorter\", \"add more detail\", \"mention the bug fix\"): ' additional_prompt; \
                  continue ;; \
              *) echo 'Please choose y/n/e/r'; continue ;; \
          esac; \
      done; \
  }; f"

  cmja = "!f() { \
      spinner() { \
          local pid=$1; \
          local delay=0.1; \
          local i=0; \
          while kill -0 $pid 2>/dev/null; do \
              case $i in \
                  0) printf \"\\r  ⠋  考え中...\" ;; \
                  1) printf \"\\r  ⠙  考え中...\" ;; \
                  2) printf \"\\r  ⠹  考え中...\" ;; \
                  3) printf \"\\r  ⠸  考え中...\" ;; \
                  4) printf \"\\r  ⠼  考え中...\" ;; \
                  5) printf \"\\r  ⠴  考え中...\" ;; \
                  6) printf \"\\r  ⠦  考え中...\" ;; \
                  7) printf \"\\r  ⠧  考え中...\" ;; \
                  8) printf \"\\r  ⠇  考え中...\" ;; \
                  9) printf \"\\r  ⠏  考え中...\" ;; \
              esac; \
              i=$(( (i+1) % 10 )); \
              sleep $delay; \
          done; \
          printf \"\\r                                    \\r\"; \
      }; \
      add_flag=''; \
      while [ $# -gt 0 ]; do \
          case $1 in \
              -a|--all) add_flag='-u' ;; \
              -A) add_flag='-A' ;; \
          esac; \
          shift; \
      done; \
      [ -n \"$add_flag\" ] && git add $add_flag; \
      if [ -z \"$(git diff --staged)\" ]; then \
          echo 'ステージされた変更がありません'; \
          return 1; \
      fi; \
      context=\"このプロジェクトの最近のコミットメッセージ:\n\"; \
      context+=$(git log --oneline -10 --pretty=format:'- %s'); \
      context+=\"\n\n現在の変更内容:\n\"; \
      context+=$(git diff --staged); \
      additional_prompt=''; \
      while true; do \
          prompt='プロジェクトのスタイルに従ってコミットメッセージを生成してください。明確なパターンがない場合は、conventional commitsを使用してください。タイトルのみ1行で出力。説明は不要。日本語で生成してください'; \
          if [ -n \"$additional_prompt\" ]; then \
              prompt=\"$prompt $additional_prompt\"; \
          fi; \
          ( echo \"$context\" | claude -p \"$prompt\" --system-prompt \"あなたはgitコミットメッセージ作成者です。日本語でメッセージを生成してください\" > /tmp/git_cm_msg_$$ 2>&1 ) & \
          spinner_pid=$!; \
          spinner $spinner_pid; \
          msg=$(cat /tmp/git_cm_msg_$$); \
          rm -f /tmp/git_cm_msg_$$; \
          echo \"生成されたメッセージ: $msg\"; \
          read -p 'このメッセージを使用しますか? [Y/n/e/r=再生成] (デフォルト: y) ' choice; \
          [ -z "$choice" ] && choice=y; \
          case $choice in \
              y) git commit -m \"$msg\"; break ;; \
              e) git commit -e -m \"$msg\"; break ;; \
              n) echo 'キャンセルしました'; break ;; \
              r) \
                  read -p '追加の指示(例: 「もっと短く」「詳細を追加」「バグ修正について言及」): ' additional_prompt; \
                  continue ;; \
              *) echo 'y/n/e/r から選択してください'; continue ;; \
          esac; \
      done; \
  }; f"

gistはこちら
https://gist.github.com/yasunogithub/b3ead19ee4a177cb749660c5a90cffe9

参考: https://qiita.com/awakia/items/0d9435d6e928184a35c5

Discussion