Claude Codeで忍者風PRコメントを自動生成しチームの空気を変える方法

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

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

開発現場でClaude Codeを使っていると、真面目なPull Requestコメントがどうしても味気なくなりがちです。特にリモート環境や大規模なmonorepoでのやり取りでは、ちょっとしたユーモアや「場を和ませる一言」が入りにくくなります。contextやrepository understandingの工夫で技術的な効率は上がるものの、コミュニケーション面では堅苦しい雰囲気が続きがちです。

  • PRコメントが定型的・事務的になり、チームの空気が固くなりやすい
  • オンボーディング時、自己紹介やアイスブレイクの機会が少なく、初対面の開発者同士の距離が縮まらない
  • 長時間のAI coding workflowで同じやり取りが続き、会話に遊び心が生まれにくい
  • リポジトリやdirectory構造の説明に終始し、雑談や息抜きの余地がなくなる
  • 「このPRは真面目すぎて逆に緊張する」と感じる場面が増える

ジョーク・パロディ系Skillがあれば、こうした堅さを一瞬でリセットし、チームの雰囲気を大きく変えるきっかけになります。

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

一言サマリ: このスキルは、Pull Requestコメントを忍者口調に自動変換して投稿し、開発現場にエンタメ要素と和やかな空気をもたらします。

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

  • PRコメントやコードレビューが忍者ワールドに変換され、チームのコミュニケーションが一気に和む
  • onboardingや初対面の開発者同士でも、堅苦しさを打ち破るきっかけを自然に作れる
  • 長時間のAI coding workflowや長いsessionでも、遊び心を持ってリフレッシュできる
  • repository understandingやcontextの説明も忍者口調になり、味気ないやり取りが面白くなる
  • Skillの導入・適用が簡単なので、日常の開発フローにすぐ組み込める
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/pr-comment-ninja-translator .claude/skills/pr-comment-ninja-translator

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


# /pr-comment-ninja-translator
> この関数、もう少し短くできますか?

拙者思うに、この function、影のごとく短くする術が必要と見受けられるでござる。
もしや、無駄な変数を消すのも一計にござろうか?
御意見賜りたく候。

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


> packages/api/src/user.ts のロジック、packages/core/utils.ts に移動できませんか?

ふむ、packages/api/src/user.ts の術を packages/core/utils.ts へ移すのは、忍びとして理にかなう策でござる。
拙者、影のようにコードを移動する術、心得ておる。
異論なければ、即刻実行いたす所存。

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


> バグを見つけました

ござる…バグの術か…?
拙者、すぐさま調査の忍法を発動いたす。
この不具合、闇に葬り去る所存にて候。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し コメントや説明が忍者口調で再開、空気が一気に和む
monorepo 移動 違う package のコードを参照しがち 忍者流の案内でdirectoryやpathのやり取りも柔らかく
長時間 workflow long context で重要箇所が薄まる 遊び心あるコメントで集中力も回復、会話が活性化

発動方式

明示呼び出し (/pr-comment-ninja-translator) と暗黙発動 (コメントや指示文がSkill descriptionにマッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/pr-comment-ninja-translator/
├── SKILL.md
├── scripts/
│   └── ninja_translator.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: pr-comment-ninja-translator
description: Pull Requestのコメントが投稿・編集される際や、/pr-comment-ninja-translator コマンドで明示的に呼び出された場合に発動。キーワード: PRコメント, 忍者口調, ジョーク, 変換, レビュー。
---

# 機能概要
このSkillは、Pull Requestのコメント文を自動で“忍者口調”に変換し、開発現場にユーモアをもたらします。通常のレビューコメントが「拙者思うに…」「ござる」などの忍者ワールドに早変わり。真剣な議論も一瞬で和み、チームの雰囲気が柔らかくなります。エンタメ枠として、日々の開発の息抜きやアイスブレイクに最適です。

# 使い方
- 明示的な呼び出し例:
  `/pr-comment-ninja-translator この変数名は分かりにくいです。`
- 暗黙発動キーワード例:
  PRコメント投稿時に「忍者」「ござる」「拙者」などの単語が含まれる場合、またはSkill設定で自動変換をONにしている場合に自動発動します。

# 出力例
```terminal
> /pr-comment-ninja-translator この関数はバグがあります
拙者申す、この関数、バグの術にござる。修正の巻、お願い仕る。

> /pr-comment-ninja-translator 変数名をもっと分かりやすくしてください
拙者思うに、この変数名、影の如く分かりにくき候。分かりやすき名へと変えるのが良きと存ずる。

> /pr-comment-ninja-translator テストが落ちています
ござる…テスト、落ちてしまったでござる。
```

# 注意点
- 原文の意味を大きく損なわない範囲で忍者口調へ変換しますが、完全な意図伝達は保証されません。
- 機密情報や真面目な議論には適用しないよう注意してください。
- ローカルには変換ログ等は保存しません。
- 既存コメントの編集にも適用可能ですが、元文書のバックアップは自動で取得されません。

# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- 公式GitHub API: https://docs.github.com/en/rest/issues/comments
- 日本語自然言語処理: https://github.com/megagonlabs/ginza

scripts/ninja_translator.py

import argparse
import sys
import re
import logging
from typing import List

# 忍者口調テンプレート集
NINJA_PREFIXES = [
    '拙者思うに、',
    '拙者申す、',
    'ござる…',
    'これは忍法…',
    '影の如く、',
    'これはまさしく、',
    'お主、',
    'この術、',
]
NINJA_SUFFIXES = [
    'でござる。',
    'の巻。',
    '候。',
    '仕る。',
    'にござる。',
    'と存ずる。',
    'でござろうか。',
    'でござるか?',
]
NINJA_WORDS = [
    ('バグ', 'バグの術'),
    ('修正', '修正の巻'),
    ('変数', '変数、影の如し'),
    ('関数', '関数、忍法'),
    ('テスト', '試練の術'),
    ('分かりにくい', '影の如く分かりにくき候'),
    ('分かりやすい', '明けの巻の如く分かりやすき候'),
    ('お願いします', 'お願い仕る'),
    ('してください', 'してくだされ'),
    ('できません', '叶わぬでござる'),
    ('落ちています', '落ちてしまったでござる'),
]

# ログ設定
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')

def ninjaify_sentence(sentence: str) -> str:
    """
    1文を忍者口調へ変換する
    """
    # 既に忍者語が含まれていたらスキップ
    if re.search(r'(拙者|ござる|候|仕る|忍法|の巻)', sentence):
        return sentence
    # 重要語句を忍者語に置換
    for orig, ninja in NINJA_WORDS:
        sentence = re.sub(orig, ninja, sentence)
    # プレフィックス・サフィックスをランダムに付与
    import random
    prefix = random.choice(NINJA_PREFIXES) if random.random() < 0.7 else ''
    suffix = random.choice(NINJA_SUFFIXES) if random.random() < 0.8 else ''
    # 句読点を調整
    sentence = sentence.strip()
    if not sentence.endswith(('。', '!', '?', '.', '!', '?')):
        sentence += '。'
    return f"{prefix}{sentence}{suffix}"

def ninjaify_text(text: str) -> str:
    """
    複数文を忍者口調に変換
    """
    # 文区切り
    sentences = re.split(r'(?<=[。.!?])\s*', text)
    ninja_sentences = [ninjaify_sentence(s) for s in sentences if s.strip()]
    return '\n'.join(ninja_sentences)

def process_file(input_path: str, output_path: str = None):
    try:
        with open(input_path, encoding='utf-8') as f:
            text = f.read()
        ninja_text = ninjaify_text(text)
        if output_path:
            with open(output_path, 'w', encoding='utf-8') as f:
                f.write(ninja_text)
            print(f"変換結果を {output_path} に保存したでござる。")
        else:
            print(ninja_text)
    except Exception as e:
        logging.error(f"ファイル処理中にエラー: {e}")
        sys.exit(1)

def cli():
    parser = argparse.ArgumentParser(description='PRコメントを忍者口調に変換するでござる。')
    subparsers = parser.add_subparsers(dest='command')

    # 変換コマンド
    parser_convert = subparsers.add_parser('convert', help='テキストを忍者口調に変換')
    parser_convert.add_argument('text', nargs='?', help='変換したいテキスト')
    parser_convert.add_argument('-f', '--file', help='テキストファイルから変換')
    parser_convert.add_argument('-o', '--output', help='変換後の出力ファイルパス')

    # テストコマンド
    parser_test = subparsers.add_parser('test', help='サンプル変換を表示')

    args = parser.parse_args()

    if args.command == 'convert':
        if args.file:
            process_file(args.file, args.output)
        elif args.text:
            print(ninjaify_text(args.text))
        else:
            print('テキストまたはファイルを指定してくだされ。')
            sys.exit(1)
    elif args.command == 'test':
        samples = [
            'この関数はバグがあります',
            '変数名をもっと分かりやすくしてください',
            'テストが落ちています',
            '修正をお願いします',
            'このロジックは分かりにくいです',
        ]
        for s in samples:
            print('原文:', s)
            print('忍者:', ninjaify_text(s))
            print('---')
    else:
        parser.print_help()

def main():
    cli()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、Pull Requestのコメントを日本語忍者口調に自動変換することで、開発現場にユーモアを加えることを目的としています。ジョーク枠として、堅苦しいレビューの雰囲気を和らげる設計です。

# 公式ドキュメント抜粋
- GitHub Issues/PR Comments API: https://docs.github.com/en/rest/issues/comments
- 日本語形態素解析: https://github.com/megagonlabs/ginza

# 利用例
- PRコメント「テストが落ちています」→「ござる…テスト、落ちてしまったでござる。」
- 「変数名をもっと分かりやすくしてください」→「拙者思うに、この変数名、影の如く分かりにくき候。分かりやすき名へと変えるのが良きと存ずる。」

# 注意点
- 原文の意味が極端に失われないよう、単語単位での置換+テンプレート挿入を採用。
- 機密性の高い内容や公式記録には適用しないよう注意。
- 変換ログや元文のバックアップは自動で保存されません。

# 設計方針
- 既存の自然言語処理ライブラリを活用せず、シンプルな正規表現とテンプレートで高速実装。
- コマンドライン引数やファイル入力にも対応し、ローカルテストやバッチ変換も可能。
- エンタメ性重視のため、多少の意味変化や語感の遊びを許容しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/pr-comment-ninja-translator .claude/skills/pr-comment-ninja-translator

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

3. ファイル配置確認

ls .claude/skills/pr-comment-ninja-translator
# SKILL.md, scripts/, references/, README.md があればOK

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

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

5. 動作確認

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

こんな瞬間に便利

  • session 開始時: PRコメントや自己紹介を忍者口調で和ませたいとき
  • monorepo 移動時: packagesを跨いだやり取りをエンタメ化したい場面
  • onboarding 時: 新規参加者との距離を一気に縮めたいとき
  • session 再開時: 長時間のやり取りで空気が重くなったときのリフレッシュ
  • package 跨ぎ作業時: directoryやpath管理の説明をユーモラスにしたいとき
  • long-running workflow 前: 会話のマンネリを打破し、集中力を回復させたいとき

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

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

  • stale context 問題: 長時間 workflow で忍者口調が冗長になり、逆に伝わりづらくなる可能性
  • directory 増えすぎ問題: PRコメントの変換対象が多いと、出力が長くなり過ぎてしまう
  • monorepo 肥大化: packagesが多い構成で、忍者語変換が単調になりやすい
  • irrelevant path 混入: 変換対象外のコメントや自動生成文まで変換されるリスク
  • Claude Code 固有の引っかかり: Skill descriptionのマッチ精度によっては意図しないタイミングで発動する
  • 発動しないケース: コメント文が曖昧すぎる/他Skillが優先/PR外のやり取り

試す前に確かめたいこと

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

  • 実repoでのtoken消費は許容範囲か?
  • monorepo (packages多数) で安定して動くか?
  • stale contextにならず、長時間workflowでも遊び心が維持されるか?
  • CLAUDE.mdとの連携時、説明文も忍者口調で違和感なく使えるか?
  • どんな文章でも忍者口調へ面白く変換されるか?
  • 既存PRコメントへの適用が簡単か?
  • 原文の意味が極端に失われないか?

実際に Claude Code で試した検証ログは Claude Codeで忍者口調に変換してみた!PRコメントが一気に忍法合戦に にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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