Antigravityでコミットメッセージを自動生成し笑いを生む技術入門

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

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

Antigravity を使った AI coding workflow では、真面目な作業が続く中で、ふとした瞬間に「ちょっとした息抜き」や「チームの雰囲気を和ませる工夫」が欲しくなる場面が少なくありません。特に commit メッセージは毎回書くものの、つい機械的・無味乾燥になりがちです。そんな時、ユーモアや遊び心をプロジェクトに持ち込む方法を探している人も多いのではないでしょうか。

  • 毎回 commit メッセージが単調で、作業ログが味気なくなってしまう
  • Antigravity で context を切り替えた直後、流れが途切れて緊張感が続きがち
  • monorepo で package を跨いだタイミングで、チームの空気も「切り替え」が必要になる
  • 長時間の workflow で long context に飲み込まれ、ちょっとした息抜きポイントがない
  • onboarding や session 再開時、場を和ませる「アイスブレイク」的なネタが欲しい

こうした悩みは、Antigravity で repository understanding や path management を進める中で、「真面目一辺倒」な空気をどうやって和らげるか、という文脈でもよく挙がります。AI agent とのやりとりが増えるほど、ちょっとした笑いのスパイスが恋しくなるものです。

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

一言サマリ: commit時にSkill。

この Skill を導入することで、commit のたびに理系ダジャレが自動生成され、開発現場にユーモアと一体感が生まれます。Antigravity の AI coding workflow に遊び心を加え、メンバー間の距離を縮めるきっかけにもなります。

  • commit メッセージにユーモアを自動注入し、作業ログが楽しくなる(context の切り替え時も和みやすい)
  • repository の変更内容やファイル名からダジャレを生成するため、毎回違うネタで飽きない
  • monorepo の directory や path 管理の「堅さ」に笑いの余白を生み出す
  • onboarding や session 再開時のアイスブレイクとしても機能
  • 長時間 workflow の中で、long context の「重さ」を中和する効果
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/commit-dajare-generator .agent/skills/commit-dajare-generator

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

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


# git commit 実行時
> git commit -am "fix: ユーザー認証バグ修正"

[commit-dajare-generator] 生成ダジャレ:
「認証の壁をパスワードでパスしたぞ!(パスワードだけに)」 
(変更ファイル: auth/login.js)

コミットメッセージ候補:
fix: 認証の壁をパスワードでパスしたぞ!(パスワードだけに)

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


# git commit 実行時
> git commit -am "feat: 新規API追加"

[commit-dajare-generator] 生成ダジャレ:
「api ディレクトリに新しい風が吹API!(ふかい)」 
(変更ファイル: packages/api/routes.js)

コミットメッセージ候補:
feat: api ディレクトリに新しい風が吹API!(ふかい)

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


# git commit 実行時
> git commit -am "chore: README更新"

[commit-dajare-generator] 生成ダジャレ:
「README を読んだらリードミー(lead me)してくれ!」 
(変更ファイル: README.md)

コミットメッセージ候補:
chore: README を読んだらリードミーしてくれ!

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる commit のたびにユーモアでリフレッシュ、集中力を維持しやすい

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: commit-dajare-generator
description: Antigravity は、コミットメッセージ自動生成時や git commit 操作の直前にこのSkillを発動します。変更内容やファイル名を解析し、ダジャレを交えたユーモアあるメッセージを提案したい場合に最適です。
---

# 機能概要
commit-dajare-generator は、コミット時に変更内容やファイル名を解析し、理系ギャグ漫画家ばりのダジャレを効かせたコミットメッセージを自動生成します。真面目な開発現場に笑いとユーモアをもたらし、コミュニケーションのきっかけやチームの雰囲気改善に貢献します。ファイル名やdiffからキーワードを抽出し、それに基づくダジャレを自動で提案。毎回のコミットがちょっとしたネタになるため、エンジニアの“寒さ耐性”と“笑いの沸点”を同時に試すことができます。

# 使い方
このSkillは、Antigravityのコミットメッセージ自動生成機能と連携し、`git commit`や「コミット」「変更」「push」などの操作時に暗黙的に発動します。明示的な呼び出しは不要です。Skillが有効な場合、コミット直前にダジャレ混じりのメッセージ案が自動で表示されます。

- 暗黙発動キーワード例: `git commit`, `push`, `変更`, `add`, `update`, `fix` など

# 出力例
```
$ git add main.py
$ git commit
[commit-dajare-generator] 提案:
main.py をメインに修正。メインイベント発生!
function.py をファンクションアップ。関数だけに感謝!
bug_fix.js のバグを虫のように退治。バグっとな!
README.md をリードしてみた。読んでみてね!
utils.py を有効活用。ユーティリティーって、言うてるって!
```

# 注意点
- ダジャレ生成は日本語が中心です。英語ファイル名やdiff内容には一部対応が限定されます。
- 生成メッセージはローカルでのみ保存・表示されます。自動コミットは行いません。
- 除外パスや特定ディレクトリ(例: .git, node_modules)は自動的に無視されます。
- チームの雰囲気や文化によっては利用を控えることを推奨します。

# 参考資料
- references/design_notes.md を参照してください。
- 公式: https://git-scm.com/doc
- 日本語ダジャレ生成: https://github.com/taizan-hokuto/pykakasi, https://pypi.org/project/word2vec-gensim/

scripts/commit_dajare_generator.py

import argparse
import difflib
import os
import re
import subprocess
import sys
from typing import List, Dict, Tuple

# ダジャレ辞書(簡易版)
DAJARE_DICT = {
    'main': 'メインイベント発生!',
    'function': '関数だけに感謝!',
    'bug': 'バグっとな!',
    'fix': 'フィックスでフィニッシュ!',
    'read': '読んでみてね!',
    'lead': 'リードしてみた!',
    'util': 'ユーティリティーって、言うてるって!',
    'test': 'テストでテストステロン!',
    'add': 'アドしてアドバンス!',
    'update': 'アップデートでアップップ!',
    'delete': 'デリートでデリシャス?',
    'refactor': 'リファクターでリフレッシュ!',
    'init': 'イニシャルでイニシアチブ!',
    'config': 'コンフィグでコンフィデンス!',
    'setup': 'セットアップでセットアップップ!',
    'view': 'ビューで美有!',
    'model': 'モデルでモデる!',
    'controller': 'コントローラーでコントロール不能!',
    'script': 'スクリプトでスクリプトーン!',
    'core': 'コアでコアラ!',
    'sample': 'サンプルで散歩る!',
    'log': 'ログでロゴ!',
    'cli': 'CLIでシーライオン!',
    'api': 'APIでアッパイ!',
    'json': 'JSONで情緒ん!',
    'yaml': 'YAMLでやんまる!',
    'csv': 'CSVで吸収!',
    'data': 'データで出た!',
}

EXCLUDE_DIRS = ['.git', 'node_modules', '__pycache__']


def list_staged_files() -> List[str]:
    try:
        result = subprocess.run(['git', 'diff', '--cached', '--name-only'], capture_output=True, text=True)
        files = result.stdout.strip().split('\n')
        return [f for f in files if f and not any(f.startswith(ex) for ex in EXCLUDE_DIRS)]
    except Exception as e:
        print(f"[ERROR] git diff failed: {e}")
        return []


def extract_keywords(filename: str, diff_text: str) -> List[str]:
    # ファイル名から単語抽出
    base = os.path.basename(filename)
    name, _ = os.path.splitext(base)
    words = re.split(r'[_\-.]', name)
    # diffから追加キーワード抽出
    diff_words = set(re.findall(r'\b[a-zA-Z]{3,}\b', diff_text))
    return list(set(words) | diff_words)


def get_diff_for_file(filename: str) -> str:
    try:
        result = subprocess.run(['git', 'diff', '--cached', filename], capture_output=True, text=True)
        return result.stdout
    except Exception as e:
        return ''


def generate_dajare_message(filename: str, diff_text: str) -> str:
    keywords = extract_keywords(filename, diff_text)
    base = os.path.basename(filename)
    # 優先度: ファイル名キーワード→diffキーワード
    for word in keywords:
        lw = word.lower()
        for key in DAJARE_DICT:
            if key in lw:
                return f"{base} を{word}に修正。{DAJARE_DICT[key]}"
    # 何もヒットしない場合
    return f"{base} を更新しました。コミットでコミッと!"


def propose_commit_messages(files: List[str]) -> List[str]:
    messages = []
    for f in files:
        diff = get_diff_for_file(f)
        msg = generate_dajare_message(f, diff)
        messages.append(msg)
    return messages


def log_commit_messages(messages: List[str], log_path: str = '.commit_dajare_log'):
    try:
        with open(log_path, 'a', encoding='utf-8') as f:
            for msg in messages:
                f.write(msg + '\n')
    except Exception as e:
        print(f"[ERROR] ログ保存失敗: {e}")


def list_log(log_path: str = '.commit_dajare_log'):
    if not os.path.exists(log_path):
        print("[INFO] ログファイルがありません。")
        return
    with open(log_path, 'r', encoding='utf-8') as f:
        print(f.read())


def summary_log(log_path: str = '.commit_dajare_log'):
    if not os.path.exists(log_path):
        print("[INFO] ログファイルがありません。")
        return
    with open(log_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    print(f"合計コミットダジャレ数: {len(lines)}")
    if lines:
        print("最近のダジャレ:")
        for l in lines[-5:]:
            print(l.strip())


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

    gen_parser = subparsers.add_parser('generate', help='ステージ済みファイルでダジャレ生成')
    gen_parser.add_argument('--log', action='store_true', help='生成ダジャレをログ保存')

    list_parser = subparsers.add_parser('list', help='ダジャレログを表示')
    sum_parser = subparsers.add_parser('summary', help='ダジャレログのサマリー')

    args = parser.parse_args()

    if args.command == 'generate':
        files = list_staged_files()
        if not files:
            print('[INFO] ステージ済みファイルがありません。')
            sys.exit(0)
        messages = propose_commit_messages(files)
        print('[commit-dajare-generator] 提案:')
        for msg in messages:
            print(msg)
        if args.log:
            log_commit_messages(messages)
    elif args.command == 'list':
        list_log()
    elif args.command == 'summary':
        summary_log()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
commit-dajare-generatorは、コミット時に自動でダジャレ混じりのメッセージを生成するスキルです。主に日本語圏の開発現場で、コミュニケーションの活性化や雰囲気の緩和を狙っています。

# 公式ドキュメント抜粋
- git公式: https://git-scm.com/doc
- Python subprocess: https://docs.python.org/ja/3/library/subprocess.html
- pykakasi(日本語形態素解析): https://github.com/taizan-hokuto/pykakasi

# 利用例
- チーム開発でコミット履歴をユーモラスにしたい場合
- 朝会やレビューで「今日のダジャレ」をネタにしたい場合
- コードレビューの緊張を緩和したい場合

# 注意点
- ダジャレの質や“寒さ”は保証されません。状況に応じてご利用ください。
- 英語圏のファイル名やdiffには一部対応が限定されます。
- ログファイル(.commit_dajare_log)はローカル保存のみ、共有リポジトリには含めないことを推奨します。

# 設計方針
- ファイル名・diff内容からキーワード抽出→辞書ベースでダジャレ生成
- 拡張性を考慮し、辞書や生成ロジックは容易に追加・修正可能
- CLIサブコマンドでログ閲覧・サマリーもサポート

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/commit-dajare-generator .agent/skills/commit-dajare-generator

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

3. ファイル配置確認

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

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

新しいSkillが自動で認識されます。リスト確認したい場合は Antigravity に「使えるSkill一覧を見せて」と聞く と Skill 名で出てきます。

5. 動作確認

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

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Antigravity に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Antigravity に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Antigravity 固有の引っかかり: description のセマンティックマッチ精度が要件次第
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • commit時に毎回ダジャレメッセージが生成されるか?
  • 生成内容にファイル名や変更内容が適切に反映されているか?
  • ネタの振り切り具合がチームの許容範囲か?

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

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

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

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

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