Claude CodeでPRタイトルに運勢を自動付与するSkillの作り方

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

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

日々の開発現場で Claude Code を活用していると、真面目なコードレビューや PR 作成もルーティン化しがちです。とくに PR タイトルは、「何を書けばいいか毎回迷う」「テンプレ化して味気ない」「たまには遊び心が欲しい」と感じることが多いのではないでしょうか。Skill の活用によって、開発現場にちょっとした変化やエンターテイメント性を持ち込みたいというニーズも増えています。

  • PR 作成時、毎回タイトルを考えるのが面倒で、つい無難なものにしてしまう
  • 真面目な審査やレビューが続くと、開発現場の空気が重くなりがち
  • Claude Code の context や memory を活用したいのに、PR タイトルだけは手動で工夫できていない
  • 長時間の AI coding workflow で、ちょっとした息抜きや話題作りが欲しい
  • onboarding や新メンバー参加時、「このリポジトリは堅苦しい」という印象を与えてしまう

ジョーク・パロディ系 Skill で、こうした「開発現場のマンネリ感」や「コミュニケーションの硬直化」を和らげる仕掛けが求められています。

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

一言サマリ: PRのタイトルSkill。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • PR作成時、タイトルが自動で“おみくじ”風に変換され、開発現場にユーモアや話題性が生まれる
  • 毎回タイトルを考える手間が省け、AI coding workflow の一部として手軽にエンタメ要素を導入できる
  • onboarding や新メンバー参加時に、repo や directory の雰囲気を柔らかく伝えられる
  • 長時間の session や monorepo での作業でも、ちょっとしたブレイクやコミュニケーションのきっかけになる
  • Claude Code の context や repository understanding を保ちつつ、タイトル編集に支障をきたさない設計
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/pr-title-omikuji .claude/skills/pr-title-omikuji

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

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

シーン1: session 開始時 (CLAUDE.md と組み合わせて)


# /pr-title-omikuji
> 新しい PR を作成します

[pr-title-omikuji] PRタイトルをおみくじ風に変換しました:
大吉: 運命のリファクタリング
(元タイトル: 「Refactor user authentication logic」)

PRタイトルを上記に変更しました。

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


> packages/payment/ に新機能追加のPR作成

[pr-title-omikuji] PRタイトルをおみくじ風に変換しました:
小吉: ちょっとだけ運が味方する決済API拡張
(元タイトル: 「Add payment webhook support」)

PRタイトルを上記に変更しました。

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


> PRタイトルをランダムで面白くしたい

[pr-title-omikuji] PRタイトルをおみくじ風に変換しました:
末吉: まあまあのバグ修正祭り
(元タイトル: 「Fix typo in README」)

PRタイトルを上記に変更しました。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる PRタイトルで場の空気をリフレッシュ、話題転換が容易

発動方式

明示呼び出し (/pr-title-omikuji) と暗黙発動 (PR作成時やタイトル編集時の description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/pr-title-omikuji/
├── SKILL.md
├── scripts/
│   └── pr_title_omikuji.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/pr_title_omikuji.py PRタイトルをおみくじ風に変換するスクリプト
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: pr-title-omikuji
description: PR作成時やタイトル編集時、または /pr-title-omikuji コマンド実行時に、PRタイトルを運勢付きのおみくじ風タイトルへ自動変換します。trigger: PR作成・編集・/pr-title-omikuji。
---

# 機能概要
pr-title-omikujiは、Pull Request作成時やタイトル編集時に、PRタイトルを“おみくじ”風の運勢付きタイトルへ自動変換するジョーク系Skillです。例えば「大吉:運命のリファクタリング」「末吉:とりあえず動く修正」など、内容と無関係な運勢ワードがタイトルに付与され、開発現場にユーモアと祭り感をもたらします。真面目な審査の空気を一変させ、コミュニケーションのきっかけやチームの雰囲気づくりに役立ちます。

# 使い方
- PR作成時やタイトルを編集した際、自動でタイトルが変換されます(trigger: always, semantic-or-explicit)。
- 明示的に `/pr-title-omikuji` コマンドをPRコメント欄で実行することで、任意のタイミングで変換できます。
- 暗黙発動例: PRタイトル編集画面で「タイトル」や「PR」などのキーワードが含まれる場合。

# 出力例
```terminal
# PR作成時
タイトル: 大吉:運命のリファクタリング

# タイトル編集後
タイトル: 小吉:軽い修正だけど運は微妙

# /pr-title-omikuji 実行
タイトル: 末吉:とりあえず動く修正
タイトル: 凶:バグの予感がする変更
タイトル: 吉:まあまあなアップデート
```

# 注意点
- タイトルの運勢ワードは内容と無関係にランダムで付与されます。
- 既存タイトルが消えるため、真面目な運用には向きません。
- タイトル編集に支障が出ないよう、元タイトルはスクリプト内で一時保存されます。
- 除外パスやローカル保存の設定はありません。必要に応じてスクリプトを編集してください。

# 参考資料
詳細な設計方針や運勢ワードのバリエーション、API連携例は references/design_notes.md を参照してください。公式GitHub PR API: https://docs.github.com/en/rest/pulls/pulls

scripts/pr_title_omikuji.py

import argparse
import os
import sys
import random
import requests
from typing import List, Optional

OMIKUJI_WORDS = [
    ("大吉", "運命のリファクタリング"),
    ("中吉", "そこそこ良い実装"),
    ("小吉", "軽い修正だけど運は微妙"),
    ("吉", "まあまあなアップデート"),
    ("末吉", "とりあえず動く修正"),
    ("凶", "バグの予感がする変更"),
    ("大凶", "運命を狂わすコミット"),
    ("半吉", "微妙なコードの追加"),
    ("平", "特に何も起きないPR"),
    ("超大吉", "伝説のマージリクエスト")
]

GITHUB_API = "https://api.github.com"


def get_github_token() -> str:
    token = os.environ.get("GITHUB_TOKEN")
    if not token:
        print("Error: GITHUB_TOKEN environment variable not set.", file=sys.stderr)
        sys.exit(1)
    return token


def get_pr_title(owner: str, repo: str, pr_number: int, token: str) -> str:
    url = f"{GITHUB_API}/repos/{owner}/{repo}/pulls/{pr_number}"
    headers = {"Authorization": f"token {token}"}
    resp = requests.get(url, headers=headers)
    if resp.status_code != 200:
        print(f"Error: Failed to fetch PR #{pr_number} title. Status: {resp.status_code}", file=sys.stderr)
        sys.exit(1)
    return resp.json()["title"]


def set_pr_title(owner: str, repo: str, pr_number: int, new_title: str, token: str) -> None:
    url = f"{GITHUB_API}/repos/{owner}/{repo}/pulls/{pr_number}"
    headers = {"Authorization": f"token {token}", "Accept": "application/vnd.github+json"}
    data = {"title": new_title}
    resp = requests.patch(url, headers=headers, json=data)
    if resp.status_code != 200:
        print(f"Error: Failed to update PR title. Status: {resp.status_code}", file=sys.stderr)
        sys.exit(1)


def omikuji_title() -> str:
    fortune, phrase = random.choice(OMIKUJI_WORDS)
    return f"{fortune}:{phrase}"


def backup_title(pr_number: int, title: str):
    backup_file = f".pr_title_omikuji_backup_{pr_number}.txt"
    with open(backup_file, "w", encoding="utf-8") as f:
        f.write(title)


def restore_title(pr_number: int) -> Optional[str]:
    backup_file = f".pr_title_omikuji_backup_{pr_number}.txt"
    if not os.path.exists(backup_file):
        return None
    with open(backup_file, "r", encoding="utf-8") as f:
        return f.read().strip()


def list_fortunes():
    print("利用可能な運勢タイトル:")
    for fortune, phrase in OMIKUJI_WORDS:
        print(f"- {fortune}:{phrase}")


def main():
    parser = argparse.ArgumentParser(description="PRタイトルをおみくじ風に変換するスクリプト")
    subparsers = parser.add_subparsers(dest="command")

    # 変換コマンド
    omikuji_parser = subparsers.add_parser("omikuji", help="PRタイトルをおみくじ風に変換")
    omikuji_parser.add_argument("--owner", required=True, help="GitHubリポジトリのオーナー名")
    omikuji_parser.add_argument("--repo", required=True, help="リポジトリ名")
    omikuji_parser.add_argument("--pr", type=int, required=True, help="PR番号")

    # 元に戻す
    restore_parser = subparsers.add_parser("restore", help="タイトルを元に戻す")
    restore_parser.add_argument("--pr", type=int, required=True, help="PR番号")
    restore_parser.add_argument("--owner", required=True, help="GitHubリポジトリのオーナー名")
    restore_parser.add_argument("--repo", required=True, help="リポジトリ名")

    # 運勢リスト
    list_parser = subparsers.add_parser("list", help="運勢ワード一覧を表示")

    args = parser.parse_args()
    token = get_github_token()

    if args.command == "omikuji":
        title = get_pr_title(args.owner, args.repo, args.pr, token)
        backup_title(args.pr, title)
        new_title = omikuji_title()
        set_pr_title(args.owner, args.repo, args.pr, new_title, token)
        print(f"PRタイトルを '{new_title}' に変更しました。")
    elif args.command == "restore":
        orig_title = restore_title(args.pr)
        if orig_title is None:
            print("バックアップタイトルが見つかりません。", file=sys.stderr)
            sys.exit(1)
        set_pr_title(args.owner, args.repo, args.pr, orig_title, token)
        print(f"PRタイトルを元に戻しました: {orig_title}")
    elif args.command == "list":
        list_fortunes()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
pr-title-omikujiは、開発現場のPull Request審査に遊び心を加えるジョーク系Skillです。PRタイトルを運勢付きのおみくじ風に自動変換することで、真面目な場面でも和やかな雰囲気を演出します。

# 公式ドキュメント抜粋
GitHub Pulls API: https://docs.github.com/en/rest/pulls/pulls
API経由でタイトルの取得・更新を実装しています。

# 利用例
- PR作成時に自動でタイトルを変換し、チームの話題作りやアイスブレイクに。
- `/pr-title-omikuji` コマンドで任意のタイミングでタイトルを変更。
- タイトル編集時のバリエーションテストや、運勢ワードのユーモア性検証にも。

# 注意点
- タイトルの内容は運勢ワードと説明文に上書きされるため、実運用では注意が必要です。
- 元タイトルはローカルファイルで一時保存されますが、複数人での利用やCI環境では競合に注意してください。

# 設計方針
運勢ワードのバリエーションは10種以上を用意し、毎回ランダムに付与される設計です。APIエラーや環境変数未設定時のエラーハンドリングも考慮しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/pr-title-omikuji .claude/skills/pr-title-omikuji

.claude/skills/pr-title-omikuji の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .claude/skills/pr-title-omikuji
# SKILL.md, scripts/, references/, README.md があればOK

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

新しいSkillが自動で認識されます。リスト確認したい場合は /pr-title-omikuji と Skill 名で出てきます。

5. 動作確認

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

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Claude Code に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Claude Code 固有の引っかかり: paths フロントマターでの絞り込みを使わないと意図しないタイミングで発動する
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • PR作成時に確実にタイトルが変換されるか?
  • 運勢ワードのバリエーションが十分あるか?
  • タイトル編集に支障が出ないか?

実際に Claude Code で試した検証ログは Claude CodeでPRタイトルをおみくじ風に変えてみた!開発現場が祭りに? にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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