Codexでコミットメッセージのユーモア自動生成が開発現場を変える

  • URLをコピーしました!
目次

Codex ユーザーが日常でぶつかる悩み

普段から Codex を活用している現場では、AI coding workflow の中で「真面目すぎるコミット文化」にちょっとした息苦しさやマンネリを感じることが多い。特に大規模な monorepo や複数人での開発では、repository understanding や path management 以上に、人間同士のコミュニケーションやチームの空気感が workflow の質に影響する。こうした中で、コミットメッセージが「fix: typo」「update: readme」など定型文ばかりになり、盛り上がりに欠けると感じる瞬間は少なくない。

  • Codex が context を見失って違う場所のコードを参照するたび、コミット時に「また同じ説明か…」と無味乾燥なメッセージが並ぶ
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れるため、commit log も断片的で味気なくなりがち
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけないが、コミットメッセージも毎回似た内容に陥る
  • 長時間 workflow で long context が膨らみすぎて、重要な履歴が stale context に埋もれ、コミットの個性が消える
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になり、commit log も説明臭くなりがち

こうした「開発現場の空気が重くなる」「コミットが義務作業と化す」といった悩みは、ジョーク・パロディ系 Skill で一気に打破できる可能性がある。

この Skill が一言でいうと何を解決するか

一言サマリ: commit時にSkill。

このSkillを導入すると、コミット時に理系ギャグ漫画家が憑依したかのようなダジャレ commit メッセージが自動で提案され、日々の開発現場にユーモアと話題性が生まれる。具体的には以下のようなメリットがある:

  • コミットメッセージが毎回ネタ化し、チーム内コミュニケーションの潤滑油になる (onboarding や repo 共有時も楽しい)
  • ファイル名・変更内容に応じた context-aware なダジャレ生成で、repository understanding の一助にもなる
  • monorepo で package を跨いだ際も、その directory や path に合わせたネタが自動提案される
  • 長時間の AI coding workflow でも、long context に埋もれず commit log にアクセントがつく
  • コミットが義務から楽しみに変わり、開発チームのモチベーション向上や記憶に残る履歴作りに寄与
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/codex/commit-dajare-generator .agents/skills/commit-dajare-generator

実行したらこうなる (3つの利用シーン)

このSkillを入れると、Codex の commit 操作時に自動でダジャレ commit メッセージが生成され、毎回ちょっとした笑いと話題を提供してくれる。

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu or commit-dajare-generator mention
> 新しいリポジトリで初回コミット

[commit-dajare-generator] 生成中...
commit message: "初回コミットで、ファイルが増えてファイル(ファイル)な気分です。"
対象ファイル: src/index.js, README.md
# コミットメッセージに理系ダジャレが自動挿入されました

シーン2: monorepo / package 跨ぎ作業時


> packages/api ディレクトリで main.ts を修正してコミット

[commit-dajare-generator] 生成中...
commit message: "APIを書き換えて、あっぴー(ハッピー)なリファクタ!"
対象ファイル: packages/api/main.ts
# monorepo の package 名や path にちなんだダジャレが提案されます

シーン3: お遊び的な使い方


> utils/math.js のバグ修正コミット

[commit-dajare-generator] 生成中...
commit message: "バグを計算(けいさん)して消去算!"
対象ファイル: utils/math.js
# 変更内容やファイル名の語感に合わせた無理やりな理系ダジャレ

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Codex が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる commit log に毎回アクセントが付き、履歴が埋もれにくい

発動方式

明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

.agents/skills/commit-dajare-generator/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/commit-dajare-generator/
├── SKILL.md
├── scripts/
│   └── commit_dajare_generator.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/commit_dajare_generator.py commit-dajare-generator: コミット用ダジャレメッセージ自動生成
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: commit-dajare-generator
description: コミット時や /skills menu, commit, message, joke, ダジャレ などのキーワードが含まれる場合に発動し、変更内容やファイル名に基づいた理系ダジャレのコミットメッセージを自動生成します。
---

# 機能概要
commit-dajare-generatorは、コミット時に変更内容やファイル名を解析し、理系ギャグ漫画家も顔負けのダジャレコミットメッセージを自動で提案するSkillです。真面目な開発現場にユーモアを持ち込み、チームの雰囲気を和らげます。コミットメッセージのマンネリ化を防ぎ、エンジニア同士のアイスブレイクにも最適です。

# 使い方
- 明示呼び出し例: `/skills menu` で一覧から選択、または `@commit-dajare-generator` で直接呼び出し。
- 暗黙発動キーワード例: commit, message, joke, ダジャレ, push, add, fix, update などのコミット関連語を含む操作時に自動発動。

# 出力例
```
$ git add src/algorithm.py
$ git commit -m ""
[commit-dajare-generator] src/algorithm.py を修正したので、アルゴリズムにアルゴリズム(あるごり無)!

$ git add bugfix.js
$ git commit -m ""
[commit-dajare-generator] bugfix.js のバグを直したので、バグがバグっと消えた!

$ git add README.md
$ git commit -m ""
[commit-dajare-generator] README.md を更新、読んでみー(README)!
```

# 注意点
- 生成されるダジャレは日本語ベースで、英語ファイル名にも無理やり対応します。
- すべてのファイル名や変更内容で必ずしも秀逸なダジャレが生成されるとは限りません。
- コミットメッセージの自動上書きに注意し、必要に応じて手動修正してください。
- ローカルでのみ動作し、外部APIへの送信はありません。

# 参考資料
- references/design_notes.md に設計方針・利用例を記載
- 公式Gitコミットメッセージガイド: https://www.git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8

scripts/commit_dajare_generator.py

import os
import sys
import argparse
import subprocess
import re
import random
from typing import List, Tuple

def get_staged_files() -> List[str]:
    try:
        result = subprocess.run([
            'git', 'diff', '--cached', '--name-only'
        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8', check=True)
        files = result.stdout.strip().split('\n')
        return [f for f in files if f]
    except Exception as e:
        print(f"[commit-dajare-generator] git diff error: {e}")
        return []

def get_file_diff(filename: str) -> str:
    try:
        result = subprocess.run([
            'git', 'diff', '--cached', filename
        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8', check=True)
        return result.stdout
    except Exception as e:
        return ''

def extract_keywords_from_diff(diff_text: str) -> List[str]:
    # シンプルなキーワード抽出: 追加・削除行から英単語/日本語単語を抽出
    keywords = set()
    for line in diff_text.split('\n'):
        if line.startswith('+') or line.startswith('-'):
            # 英単語
            for w in re.findall(r'[a-zA-Z_]{3,}', line):
                keywords.add(w.lower())
            # 日本語単語
            for w in re.findall(r'[\u3040-\u30ff\u4e00-\u9fff]{2,}', line):
                keywords.add(w)
    return list(keywords)

def generate_dajare(file: str, keywords: List[str]) -> str:
    basename = os.path.basename(file)
    name, ext = os.path.splitext(basename)
    dajare_patterns = [
        # 日本語ファイル名・キーワード
        (r'bug', lambda: f"バグがバグっと消えた!"),
        (r'fix', lambda: f"直したらフィックス(fix)した!"),
        (r'update', lambda: f"アップデートしてアップ(up)した気分!"),
        (r'add', lambda: f"addだけに、味(add)わい深い追加!"),
        (r'algorithm', lambda: f"アルゴリズムにアルゴリズム(あるごり無)!"),
        (r'readme', lambda: f"読んでみー(README)!"),
        (r'doc', lambda: f"ドキュメントをドッキュメント!"),
        (r'test', lambda: f"テストして手ストップ(test up)!"),
        (r'config', lambda: f"コンフィグを今フィグ(今更)!"),
        (r'py$', lambda: f"Pythonだけにパイっと直した!"),
        (r'js$', lambda: f"JavaScriptでジャバっと修正!"),
        (r'md$', lambda: f"Markdownでマークだもん!"),
    ]
    # ファイル名・キーワードからダジャレ生成
    for pat, func in dajare_patterns:
        if re.search(pat, name, re.IGNORECASE) or any(re.search(pat, k, re.IGNORECASE) for k in keywords):
            return f"{basename} を修正したので、{func()}"
    # それ以外は汎用
    generic_templates = [
        f"{basename} を編集、編集(エンジュー)しちゃった!",
        f"{basename} をいじって、いじ(維持)できたかな?",
        f"{basename} の変更、変こう(変更)してみた!",
        f"{basename} を追加、ついかっと(追加っと)やった!",
        f"{basename} の修正、修正(しゅうせい)せいこう!"
    ]
    return random.choice(generic_templates)

def compose_commit_message(files: List[str]) -> str:
    messages = []
    for f in files:
        diff = get_file_diff(f)
        keywords = extract_keywords_from_diff(diff)
        msg = generate_dajare(f, keywords)
        messages.append(msg)
    return '\n'.join([f"[commit-dajare-generator] {m}" for m in messages])

def print_commit_message():
    files = get_staged_files()
    if not files:
        print("[commit-dajare-generator] ステージされたファイルがありません。")
        return
    message = compose_commit_message(files)
    print(message)

def main():
    parser = argparse.ArgumentParser(description='commit-dajare-generator: コミット用ダジャレメッセージ自動生成')
    subparsers = parser.add_subparsers(dest='command')

    parser_gen = subparsers.add_parser('generate', help='ステージされた変更からダジャレコミットメッセージを生成')
    parser_list = subparsers.add_parser('list', help='ステージされたファイル一覧を表示')
    parser_test = subparsers.add_parser('test', help='ダジャレ生成のテスト')
    parser_test.add_argument('--file', type=str, required=False, help='テスト用ファイル名')
    parser_test.add_argument('--keywords', type=str, nargs='*', default=[], help='テスト用キーワード')

    args = parser.parse_args()
    if args.command == 'generate':
        print_commit_message()
    elif args.command == 'list':
        files = get_staged_files()
        print("[commit-dajare-generator] ステージされたファイル:")
        for f in files:
            print(f" - {f}")
    elif args.command == 'test':
        fname = args.file or 'test.py'
        keywords = args.keywords
        msg = generate_dajare(fname, keywords)
        print(f"[commit-dajare-generator] {msg}")
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
commit-dajare-generatorは、Gitのステージ済みファイル名や差分内容からキーワードを抽出し、それに基づいた日本語ダジャレコミットメッセージを自動生成するSkillです。エンジニアのチームコミュニケーション活性化や開発現場の雰囲気改善を狙っています。

# 公式ドキュメント抜粋
- Gitコミットメッセージのベストプラクティス: https://www.git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8

# 利用例
- 通常のコミット時に自動でダジャレメッセージが提案される
- `/skills menu` から明示的に呼び出し、生成内容を確認・編集可能

# 注意点
- ダジャレの品質はファイル名・差分内容に依存し、必ずしも秀逸なものばかりではありません
- 英語ファイル名への対応は限定的です
- 生成メッセージはローカルでのみ利用され、外部送信はありません

# 設計方針
- 実在するGitコマンドのみを利用し、外部APIや架空関数は不使用
- メンテナンス性を重視し、パターン追加・カスタマイズも容易な設計
- コミットメッセージの自動生成は手動編集を妨げないよう配慮

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Codex がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/codex/commit-dajare-generator .agents/skills/commit-dajare-generator

.agents/skills/commit-dajare-generator の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/commit-dajare-generator
# SKILL.md, scripts/, references/, README.md があればOK

4. Codex を再起動 (or Skill 自動検出を待つ)

新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or $skill-name mention と Skill 名で出てきます。

5. 動作確認

/skills menu or $skill-name mention で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Codex に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Codex に把握させ、こちらが path を全部指定する手間を省きたい
  • session 再開時: long context が切れた後でも、必要な path と directory 構造だけ素早く戻したい
  • package 跨ぎ作業時: directory boundary を Skill 側で管理して、irrelevant な path 混入を防ぎたい
  • long-running workflow 前: long context で重要箇所が薄まる前に snapshot を取りたい

気になるポイント (壊れそうな箇所)

実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:

  • stale context 問題: 長時間 workflow で Skill 出力が古くなり、現状と乖離する可能性
  • directory 増えすぎ問題: 大規模 repo で全 directory を網羅すると出力が肥大化して context window を圧迫
  • monorepo 肥大化: packages が多い構成では出力が雑になり、結局 path 指定し直しになる懸念
  • irrelevant path 混入: node_modules / build 成果物 / generated コードを拾ってしまう可能性
  • Codex 固有の引っかかり: description のセマンティックマッチ精度が要件次第
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

この Skill を実運用に投入する前に確かめたい問いを並べる:

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • AGENTS.md との連携設計はどうあるべきか?
  • commit時に毎回ダジャレメッセージが生成されるか?
  • 生成内容にファイル名や変更内容が反映されているか?
  • ネタの振り切り具合が適切か?

実際に Codex で試した検証ログは Codexでコミット時に理系ダジャレを自動生成してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

関連タグで他のSkill記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次