AntigravityでPRコメントを忍者口調に自動変換する方法入門

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

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

開発現場では、Pull Request のレビューコメントが淡々と事務的になりがちです。Antigravity を使った AI coding workflow でも、AI の context や repository understanding は進化しているものの、やりとり自体が味気なくなり、チーム内の雰囲気が固くなってしまうことがよくあります。ジョークやパロディ要素が入りづらく、やや閉塞感を覚える瞬間も。

  • Antigravity の session を再開した際、PR コメントの context がリセットされてしまう
  • monorepo で複数の package を跨ぐと、AI が repository の directory 構造を把握しきれず、コメントも単調になりがち
  • 長時間のレビュー workflow で long context が膨らみ、重要な指摘が埋もれてしまう
  • 「この repo はこういう構造」と説明し直す手間もあり、レビュー自体がルーチン化しやすい
  • チームのオンボーディング時、PR コメントが機械的すぎて新メンバーの緊張がほぐれない

こうした悩みは、Antigravity の path management や context 制御が進化しても、コミュニケーションの「面白み」や「遊び心」を補うものではありません。ちょっとしたエンタメ要素で、開発現場の空気を一変させたいという声も多いはずです。

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

一言サマリ: このスキルは、Pull Request コメントを自動で忍者口調に変換することで、開発現場に遊び心とインパクトをもたらします。

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

  • AI coding workflow の中で、PR コメントが全て忍者ワールド化し、堅苦しい雰囲気が一瞬で和らぐ
  • Antigravity の context や repository understanding を活かしつつ、レビュー体験にエンタメ性を追加できる
  • monorepo や複雑な directory 構造でも、Skill が自動で path management しながら忍者コメントを生成
  • onboarding や長時間 session 時にも、チーム全体のコミュニケーションが活性化する
  • 導入・発動はほぼ手間いらず、description マッチで自動発動するため運用コストが低い
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/pr-comment-ninja-translator .agent/skills/pr-comment-ninja-translator

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

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

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


# PR コメントを忍者口調で投稿したい
> この関数、もう少しシンプルにできませんか?

拙者思うに、この関数、影の術を使えばもっと簡潔にできるでござる。
修正の術、いかがいたすか?

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


> packages/utils/arrayHelper.js のバグ、修正お願いします

ござる…この arrayHelper、まことにバグの術が仕込まれている気配。
拙者、修正案を一つ提案したいでござるが、いかがか?

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


> もう少しコメントにユーモアを!

忍法・笑いの術!この PR コメント、忍者流で盛り上げ候。
皆の者、心して読まれよ!

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 忍者口調コメントで重要ポイントが目立ち、会話も活性化

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: pr-comment-ninja-translator
description: AntigravityがPull Requestのコメント内容を“忍者口調”に変換する必要がある場合に発動します。例えば、PRコメントの雰囲気を和らげたい、エンタメ要素を加えたい、または「忍者」「ござる」「拙者」などのキーワードが含まれる場合に適用されます。
---

# 機能概要
このSkillは、Pull Requestのコメント文を自動で“忍者口調”に変換し、開発現場にユーモアをもたらします。通常のレビューコメントが「拙者思うにこの変数、影のように消してもよろしいか」「ござる…バグの術か…?」といった忍者ワールドの言い回しに変換され、堅苦しい雰囲気を一瞬で和ませます。真剣な議論の中にエンタメ要素を加え、チームのコミュニケーションを活性化します。

# 使い方
このSkillはAntigravityのsemantic-match-onlyトリガーで自動発動します。明示的な呼び出しは不要です。PRコメントの投稿・編集時に「忍者」「ござる」「拙者」「術」などのキーワードが含まれる、または忍者口調への変換リクエストが暗黙的に検知された場合に適用されます。

# 出力例
```
原文: この関数、もう少し整理できますか?
変換後: 拙者思うに、この関数、もう少し影のように整理してもよろしいかと存じまする。

原文: バグが残っているようです。
変換後: ござる…バグの術が未だ残っているように見受けられ申す。

原文: 変数名を修正してください。
変換後: 拙者より申し上げ候、変数名を修正していただければ幸いにござる。
```

# 注意点
- 原文の意味を極端に損なわないよう工夫していますが、完全な意図伝達を保証するものではありません。
- 重要な技術的議論や公式なやりとりには適しません。
- ローカルに変換履歴を保存しません。
- 除外パスや特定のコメントには適用しない場合があります。

# 参考資料
- references/design_notes.md
- 公式URL: https://ai-note.tech/skills/pr-comment-ninja-translator

scripts/ninja_translator.py

import argparse
import sys
import re
import random

NINJA_PREFIXES = [
    '拙者思うに、',
    'ござる…',
    '拙者より申し上げ候、',
    '影のように、',
    '忍びの者として申す、',
    'この術、',
    '隠密ながら、',
    '御免、',
    'さて、',
]
NINJA_SUFFIXES = [
    'でござる。',
    'に候。',
    'と存じまする。',
    'かと存じ申す。',
    'と見受けられ申す。',
    '拙者感謝の至り。',
    '影ながら応援致す。',
    '忍法、心得た。',
    '幸いにござる。',
]
NINJA_WORDS = [
    (r'バグ', 'バグの術'),
    (r'修正', '修正の術'),
    (r'確認', '見破りの術'),
    (r'変数', '影変数'),
    (r'関数', '忍法関数'),
    (r'整理', '整理の術'),
    (r'削除', '消し去るの術'),
    (r'追加', '加えるの術'),
    (r'問題', '難題'),
    (r'対応', '対応の術'),
    (r'レビュー', '見破りの術'),
    (r'お願いします', 'お願い仕る'),
    (r'できますか', 'してもよろしいか'),
    (r'してください', 'していただければ幸いにござる'),
]


def to_ninja_style(text):
    original = text.strip()
    # 1. 句点ごとに分割
    sentences = re.split(r'(。|!|!|\?|?)', original)
    transformed = ''
    for i in range(0, len(sentences), 2):
        if not sentences[i].strip():
            continue
        sentence = sentences[i]
        ending = sentences[i+1] if i+1 < len(sentences) else ''
        # 2. 単語変換
        for pat, rep in NINJA_WORDS:
            sentence = re.sub(pat, rep, sentence)
        # 3. ランダムでprefix/suffix追加
        prefix = random.choice(NINJA_PREFIXES) if random.random() < 0.7 else ''
        suffix = random.choice(NINJA_SUFFIXES) if random.random() < 0.7 else ''
        # 4. 組み立て
        transformed += f'{prefix}{sentence}{ending}{suffix}\n'
    return transformed.strip()


def translate_file(input_path, output_path=None):
    try:
        with open(input_path, 'r', encoding='utf-8') as f:
            text = f.read()
        ninja_text = to_ninja_style(text)
        if output_path:
            with open(output_path, 'w', encoding='utf-8') as f:
                f.write(ninja_text)
        else:
            print(ninja_text)
    except Exception as e:
        print(f'Error: {e}', file=sys.stderr)
        sys.exit(1)


def translate_stdin():
    try:
        print('原文を入力してください(Ctrl+Dで終了):')
        text = sys.stdin.read()
        ninja_text = to_ninja_style(text)
        print('--- 忍者口調変換結果 ---')
        print(ninja_text)
    except Exception as e:
        print(f'Error: {e}', file=sys.stderr)
        sys.exit(1)


def main():
    parser = argparse.ArgumentParser(description='PRコメントを忍者口調に変換するスクリプト')
    subparsers = parser.add_subparsers(dest='command')

    parser_translate = subparsers.add_parser('translate', help='テキストまたはファイルを忍者口調に変換')
    parser_translate.add_argument('-i', '--input', type=str, help='入力ファイルパス(省略時は標準入力)')
    parser_translate.add_argument('-o', '--output', type=str, help='出力ファイルパス(省略時は標準出力)')

    parser_test = subparsers.add_parser('test', help='サンプル変換例を表示')

    args = parser.parse_args()

    if args.command == 'translate':
        if args.input:
            translate_file(args.input, args.output)
        else:
            translate_stdin()
    elif args.command == 'test':
        samples = [
            'この関数、もう少し整理できますか?',
            'バグが残っているようです。',
            '変数名を修正してください。',
            'レビューお願いします。',
            '対応が必要です。',
        ]
        for s in samples:
            print(f'原文: {s}')
            print(f'忍者: {to_ninja_style(s)}\n')
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、Pull Requestのコメントを忍者口調に自動変換し、開発現場にユーモアとエンターテイメント性を加えることを目的としています。単純な単語置換だけでなく、prefixやsuffix、表現の工夫により自然な忍者風の文章を生成します。

# 公式ドキュメント抜粋
本SkillはAntigravityのsemantic-match-onlyトリガーにより、PRコメント投稿・編集時に自動発動します。明示的な呼び出しや追加設定は不要です。

# 利用例
- チームのアイスブレイクや、レビューの雰囲気を和らげたい場面
- PRコメントの自動変換で、開発者同士のコミュニケーションを活性化

# 注意点
- 技術的な正確さや公式な議論には不向きです
- 原文の意味が大きく損なわれないよう設計していますが、100%保証はできません
- 除外パスや特定ワードの検知で適用を制限する場合があります

# 設計方針
- 単語変換・prefix/suffix追加・文末調整の3段階で自然な忍者口調に変換
- スクリプトはPythonで実装し、CLIからもテスト可能
- ローカル保存や履歴管理は行わず、PRコメント変換のみに特化

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/pr-comment-ninja-translator .agent/skills/pr-comment-ninja-translator

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

3. ファイル配置確認

ls .agent/skills/pr-comment-ninja-translator
# 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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • どんな文章も忍者口調へ面白く変換されるか?
  • 既存PRコメントへの適用が簡単か?
  • 原文の意味が極端に失われないか?

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

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

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

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

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