Claude Code ユーザーが日常でぶつかる悩み
Claude Code を日々使っていると、コミットメッセージの運用やチーム内の雰囲気作りで意外な「困りごと」に直面することがあります。プロジェクトの context や repository 構造の把握、ディレクトリや path 管理に気を遣う一方で、コミット時の一言が単調になりがちです。真面目な AI coding workflow の中で、ちょっとしたユーモアや遊び心を入れたいと思ったことはないでしょうか。
- コミットメッセージが毎回「fix: bug修正」「update: readme」など無難なものばかりで、開発が味気なく感じる
- monorepo で複数のパッケージをまたぐ作業が続くと、どの package の変更か一目で分かりづらい
- session を再開した時、前回の流れや repository understanding を思い出すきっかけが欲しい
- 長時間の AI coding workflow でテンションが下がり、集中力が切れやすい
- チーム onboarding 時に、堅苦しい雰囲気を和らげるアイスブレイクが欲しい
特に「ジョーク・パロディ」カテゴリの Skill は、開発現場にちょっとした笑いと会話のネタを提供し、作業のマンネリ化やコミュニケーションの硬直を和らげる役割が期待されます。
この Skill が一言でいうと何を解決するか
一言サマリ: commit時にSkill。
この Skill を導入すると、コミット作業が一気にユーモア溢れる体験に変わります。具体的には、Claude Code の context や repository、directory、path 管理の流れに自然に溶け込み、次のようなメリットが得られます:
- コミット時に、変更内容やファイル名から理系ダジャレを自動生成し、毎回新鮮な笑いを提供
- monorepo や複雑な repository でも、package や directory 名をネタにしたメッセージで context を分かりやすく演出
- 長時間の AI coding workflow でも、Skill の出力で気分転換やアイスブレイクができる
- onboarding や session 再開時、コミットメッセージが会話のきっかけや repo 理解のヒントになる
- チーム内で「今日はどんなダジャレが飛び出すか」期待感が生まれ、コミュニケーションが活性化
GitHub から degit でコマンド1行、Claude Code の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/claude-code/commit-dajare-generator .claude/skills/commit-dajare-generator実行したらこうなる (3つの利用シーン)
この Skill を組み込むと、Claude Code でのコミット時や明示的な呼び出しで、理系ギャグ漫画家も顔負けのダジャレ commit メッセージが自動提案されます。以下、利用シーンごとの出力イメージを示します。
シーン1: session 開始時 (CLAUDE.md と組み合わせて)
# /commit-dajare-generator
> この session で初めてコミットします
[commit-dajare-generator]
main.py を修正したので、メインの舞台でパイ(π)っと解決!
コミット内容: main.py のバグ修正
ダジャレ: 「main.pyで問題解決、まいんちパイ食べたい!」
ご査収ください。
シーン2: monorepo / package 跨ぎ作業時
> packages/utils/math_utils.py を変更してコミット
[commit-dajare-generator]
math_utils.py をアップデート、数学的にウツくしいコードに!
コミット内容: math_utils.py の関数追加
ダジャレ: 「数学の関数、関数(かんすう)だけに感数(かんすう)深い!」
今日も monorepo で数理戦。
シーン3: お遊び的な使い方
> README.md を更新してコミット
[commit-dajare-generator]
READMEをリードミー!と叫びながら更新しました。
コミット内容: README.md の追記
ダジャレ: 「READMEでリードミー、リーダーは道を示す!」
開発現場に笑いを。
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | コミット履歴がダジャレで彩られ、前回の流れも一目で思い出せる |
| monorepo 移動 | どの package の変更か分かりづらい | directory 名やファイル名をネタにしたメッセージで context 明瞭 |
| 長時間 workflow | 単調なコミットでテンションが下がる | 毎回違うダジャレが気分転換になり、集中力維持に一役 |
発動方式
明示呼び出し (/commit-dajare-generator) と暗黙発動 (コミット内容記述時に自動) の両方に対応。
Skill の中身を全部見せる
.claude/skills/commit-dajare-generator/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.claude/skills/commit-dajare-generator/
├── SKILL.md
├── scripts/
│ └── commit_dajare_generator.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/commit_dajare_generator.py |
コミット時に理系ダジャレメッセージを生成するスキル |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: commit-dajare-generator
description: コミット時や /commit-dajare-generator 明示呼び出し時に、変更内容やファイル名をもとに理系ダジャレ満載のコミットメッセージを自動生成します。commit・変更・ファイル名・メッセージ生成などのキーワードで発動。
---
# 機能概要
このSkillは、コミット時に変更内容やファイル名から理系ギャグ漫画家が降臨したかのごとく、無理やりなダジャレコミットメッセージを自動生成します。真面目な開発現場にユーモアを注入し、チームの雰囲気を一瞬で和ませることができます。コミットメッセージのマンネリ化を打破し、エンジニア同士の会話のネタや、レビュー時のアイスブレイクにも最適です。
# 使い方
- 明示呼び出し: `/commit-dajare-generator` または `/skill commit-dajare-generator`
- 暗黙発動: commit, 変更, ファイル名, メッセージ生成 などのキーワードを含むコミット操作時、またはsemantic commit時に自動発動します。
- コミット前に、生成されたダジャレメッセージが表示され、採用・編集・却下が選択可能です。
# 出力例
```
$ git add src/math_utils.py
$ git commit
[commit-dajare-generator]
生成候補: 「数学的に証明しちゃった、証明書だけにshow me!」
生成候補: 「utilsを修正したら、うっつーるほど美しくなった!」
生成候補: 「バグを消したら、バグっときた!」
選択: 1
コミットメッセージ: 数学的に証明しちゃった、証明書だけにshow me!
```
# 注意点
- 生成されるダジャレはファイル名やdiffの内容に依存しますが、無理やり感が強い場合もあります。
- 一部のパス(.git/やビルド成果物)は除外対象です。
- ローカルでのみ動作し、生成メッセージは保存されません。
- チームの雰囲気や文化によっては不適切な場合もあるため、利用シーンにはご注意ください。
# 参考資料
- 参考: references/design_notes.md
- 公式: https://git-scm.com/docs/git-commit
- コミットメッセージのベストプラクティス: https://chris.beams.io/posts/git-commit/
scripts/commit_dajare_generator.py
import argparse
import os
import re
import sys
import subprocess
from typing import List, Tuple
import random
DAJARE_TEMPLATES = [
'{file}を修正したら、{pun}っときた!',
'{file}に手を加えたら、{pun}な結果に!',
'{file}にバグがあったけど、バグっと直した!',
'{file}で証明した、証明書だけにshow me!',
'{file}の内容を整理したら、整理整頓せいりー!',
'{file}を追加したら、ついかっとなってやった。',
'{file}が変わった、変わったねー!',
'{file}に関数追加、関数だけに感謝!',
'{file}のバグをfix、fixだけにフィックスミー!',
'{file}のロジックを強化、強化だけに強火!',
'{file}のテストを追加、テストだけにテストーリー!',
]
EXCLUDE_PATHS = ['.git', 'build', 'dist', '__pycache__']
PUN_DICTIONARY = [
('math', '待ってました'),
('util', 'うっつーる'),
('test', 'テストーリー'),
('fix', 'フィックスミー'),
('logic', '強火'),
('add', 'ついかっと'),
('proof', 'show me'),
('sort', '整理整頓せいりー'),
('bug', 'バグっと'),
('func', '感謝'),
]
def get_staged_files() -> List[str]:
try:
result = subprocess.run([
'git', 'diff', '--cached', '--name-only', '--diff-filter=ACMRT'
], 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_PATHS)]
except Exception as e:
print(f'Error getting staged files: {e}')
return []
def get_file_diff(file: str) -> str:
try:
result = subprocess.run([
'git', 'diff', '--cached', file
], capture_output=True, text=True)
return result.stdout
except Exception as e:
return ''
def extract_keywords(files: List[str], diffs: List[str]) -> List[str]:
keywords = set()
for fname in files:
base = os.path.basename(fname)
for k, pun in PUN_DICTIONARY:
if k in base.lower():
keywords.add((k, pun))
for diff in diffs:
for k, pun in PUN_DICTIONARY:
if re.search(r'\b' + re.escape(k) + r'\b', diff, re.IGNORECASE):
keywords.add((k, pun))
return list(keywords)
def generate_dajare_messages(files: List[str], keywords: List[Tuple[str, str]]) -> List[str]:
messages = []
for fname in files:
base = os.path.basename(fname)
for k, pun in keywords:
if k in base.lower():
template = random.choice(DAJARE_TEMPLATES)
msg = template.format(file=base, pun=pun)
messages.append(msg)
# ファイル名が合致しない場合も適当に生成
if not messages:
for fname in files:
base = os.path.basename(fname)
template = random.choice(DAJARE_TEMPLATES)
msg = template.format(file=base, pun='ダジャレ')
messages.append(msg)
return list(set(messages))[:5]
def interactive_select(messages: List[str]) -> str:
print('[commit-dajare-generator]')
for idx, msg in enumerate(messages):
print(f'生成候補: ({idx+1}) {msg}')
print('選択: (番号入力, 0でキャンセル, eで編集)')
while True:
sel = input('> ').strip()
if sel == '0':
print('キャンセルしました')
sys.exit(0)
if sel.lower() == 'e':
print('編集モード:')
edited = input('メッセージを入力してください: ').strip()
if edited:
return edited
if sel.isdigit() and 1 <= int(sel) <= len(messages):
return messages[int(sel)-1]
print('無効な入力です')
def commit_with_message(msg: str):
try:
result = subprocess.run([
'git', 'commit', '-m', msg
])
if result.returncode != 0:
print('git commit に失敗しました')
except Exception as e:
print(f'commitエラー: {e}')
def main():
parser = argparse.ArgumentParser(description='コミット時に理系ダジャレメッセージを生成するスキル')
parser.add_argument('--list', action='store_true', help='生成候補だけ表示しコミットしない')
parser.add_argument('--commit', action='store_true', help='生成したメッセージでgit commitを実行')
args = parser.parse_args()
files = get_staged_files()
if not files:
print('ステージされたファイルがありません')
sys.exit(1)
diffs = [get_file_diff(f) for f in files]
keywords = extract_keywords(files, diffs)
messages = generate_dajare_messages(files, keywords)
if not messages:
print('ダジャレ生成に失敗しました')
sys.exit(1)
msg = interactive_select(messages)
if args.list:
print(f'選択メッセージ: {msg}')
sys.exit(0)
if args.commit:
commit_with_message(msg)
else:
print(f'コミットメッセージ案: {msg}')
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
commit-dajare-generatorは、エンジニアのコミット作業を楽しくするため、変更内容やファイル名から理系・開発系ダジャレを自動生成するSkillです。
# 公式ドキュメント抜粋
- git commit: https://git-scm.com/docs/git-commit
- コミットメッセージのガイド: https://chris.beams.io/posts/git-commit/
# 利用例
- チームの雰囲気を和ませたい時
- レビュー時の話題作り
- 日々のコミットに遊び心を加えたい場合
# 注意点
- ダジャレの質や好みは個人差が大きく、全ての現場で歓迎されるとは限りません。
- 除外パスやバイナリファイルには配慮していますが、完全な精度ではありません。
# 設計方針
- ファイル名やdiffからキーワード抽出し、テンプレートと組み合わせてダジャレ生成
- 無理やり感も含めて“ネタ枠”として楽しむ設計
- コミット前にメッセージ選択・編集が可能なインタラクティブUI
- ローカルで完結し、履歴や個人情報は保存しません
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Claude Code はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Claude Code がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/claude-code/commit-dajare-generator .claude/skills/commit-dajare-generator
.claude/skills/commit-dajare-generator の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .claude/skills/commit-dajare-generator
# SKILL.md, scripts/, references/, README.md があればOK
4. Claude Code を再起動 (or Skill 自動検出を待つ)
新しいSkillが自動で認識されます。リスト確認したい場合は /commit-dajare-generator と Skill 名で出てきます。
5. 動作確認
/commit-dajare-generator で呼び出すか、コミット時に自動発動する条件を満たすと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。
こんな瞬間に便利
- session 開始時: 開発の最初にテンションを上げたい時
- monorepo 移動時: 複数 package を跨ぐコミットで context を明るくしたい時
- onboarding 時: 新メンバーに repo の雰囲気を伝えたい時
- session 再開時: 前回の流れや repository understanding を思い出したい時
- package 跨ぎ作業時: directory 名をネタにコミットを彩りたい時
- 長時間 workflow 前: 長丁場の AI coding workflow で気分転換したい時
気になるポイント (壊れそうな箇所)
実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:
- stale context 問題: 長時間 workflow で Skill 出力が古くなり、現状と乖離する可能性
- directory 増えすぎ問題: 大規模 repo で全 directory を網羅すると出力が肥大化して context window を圧迫
- monorepo 肥大化: packages が多い構成では出力が雑になり、結局 path 指定し直しになる懸念
- irrelevant path 混入: node_modules / build 成果物 / generated コードを拾ってしまう可能性
- Claude Code 固有の引っかかり: paths フロントマターでの絞り込みを使わないと意図しないタイミングで発動する
- 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory
試す前に確かめたいこと
この Skill を実運用に投入する前に確かめたい問いを並べる:
- 実 repo での token 消費は許容範囲か?
- monorepo (packages 多数) で安定して動くか?
- stale context にならず、長時間 workflow でも有効か?
- CLAUDE.md との連携設計はどうあるべきか?
- commit時に毎回ダジャレメッセージが生成されるか?
- 生成内容にファイル名や変更内容が反映されているか?
- ネタの振り切り具合が適切か?
実際に Claude Code で試した検証ログは Claude Codeでコミット時に理系ダジャレを自動生成してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
