AntigravityでPRタイトルを運勢付きに自動変換する意外な活用法

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

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

Antigravity を使っていると、AI coding workflow の中で思わず「またか」と感じる小さなストレスが積み重なりがちです。特に PR(プルリクエスト)を作成するタイミングでは、真面目な repository 管理や context の説明を毎回繰り返すことに疲れてしまうことも。そんなとき、ちょっとした遊び心やチームの雰囲気づくりを求める声も多く聞かれます。

  • PRタイトルを毎回きっちり考えるのが面倒で、つい generic なタイトルにしてしまう
  • リポジトリの onboarding や context 説明が堅苦しくなりがちで、開発現場に遊び要素が不足している
  • monorepo で package を跨ぐ作業が続くと、作業の区切りや切り替え感がなく、workflow が単調になる
  • 長時間の作業で long context が膨らみ、気分転換や話題の転換ができない
  • Antigravity の自動化に慣れすぎて、PR提出時も「作業報告」的なタイトルしか出てこない

このような悩みは、AI coding workflow の効率化と同時に、ちょっとしたエンタメ要素やチームの空気づくりも求められている証拠です。

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

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

この Skill を導入することで、PR タイトルが“おみくじ”風に自動変換され、開発 workflow の中に遊び心と話題性が加わります。具体的には次のようなメリットがあります:

  • PR タイトル作成の手間がゼロになり、毎回ランダムな運勢付きタイトルで気分転換ができる
  • monorepo や複雑な repository 構造でも、PRごとに話題をリフレッシュしやすくなる
  • onboarding や長時間の AI coding workflow でも、チーム内コミュニケーションのきっかけが生まれる
  • Antigravity の context 管理や path management の堅さを和らげる“祭り”ムードが出せる
  • 毎回違うタイトルになるため、PR一覧が賑やかになり記憶にも残りやすい
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/pr-title-omikuji .agent/skills/pr-title-omikuji

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

この Skill を入れると、PR 作成時にタイトルが自動で“おみくじ”風に変換されます。実際の利用シーンを terminal 風に3パターン紹介します。

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


# 新しい feature ブランチで PR を作成
> git checkout -b feat/init-context
> git push origin feat/init-context
> gh pr create --title "Initialize context manager" --body "初期化処理の追加"

[Antigravity] PRタイトルをおみくじ化します…
[Antigravity] PRタイトル: 大吉:運命の context 初期化祭り
[Antigravity] PR作成完了: https://github.com/your-org/your-repo/pull/123

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


# packages/api と packages/ui をまたいで修正
> git checkout -b fix/api-ui-sync
> git push origin fix/api-ui-sync
> gh pr create --title "Sync API and UI" --body "monorepo の両方を修正"

[Antigravity] PRタイトルをおみくじ化します…
[Antigravity] PRタイトル: 小吉:monorepo横断のご利益アップ修正
[Antigravity] PR作成完了: https://github.com/your-org/your-repo/pull/124

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


# ちょっとした typo 修正
> git checkout -b chore/fix-typo
> git push origin chore/fix-typo
> gh pr create --title "Fix typo" --body "typo のみ修正"

[Antigravity] PRタイトルをおみくじ化します…
[Antigravity] PRタイトル: 末吉:細かい修正にも運命の出会い
[Antigravity] PR作成完了: https://github.com/your-org/your-repo/pull/125

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる PRタイトルで workflow にアクセントがつき、重要なPRが埋もれにくい

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: pr-title-omikuji
description: PR作成時やタイトル編集時に、PRタイトルを“おみくじ”風の運勢付きタイトルへ自動変換します。triggerType: always。semantic-match-onlyで発動し、PR関連アクション時に適用されます。
---

# 機能概要
pr-title-omikujiは、Pull Request(PR)のタイトルを提出時に自動で“おみくじ”風タイトルへ変換するジョーク系スキルです。通常、PRタイトルは内容を端的に表現する必要がありますが、本Skillは運勢ワード(例:大吉、中吉、小吉、凶)とユーモラスなフレーズを組み合わせ、タイトルをエンタメ化します。これにより、開発現場の雰囲気が和み、日々のPR作成がちょっとしたお祭り気分に変わります。

# 使い方
本Skillは明示的な呼び出しは不要です。PR作成やタイトル編集など、PRタイトルが入力・編集されるタイミング(semantic-match-onlyトリガー)で自動的に発動します。タイトルが既に運勢ワードを含んでいる場合は再変換されません。暗黙発動キーワード例:"pull request", "PR作成", "タイトル編集" など。

# 出力例
以下は変換後のPRタイトル例です。

```
大吉: 運命のリファクタリング
中吉: ちょっと良いバグ修正
小吉: 軽い修正だけど運は微妙
末吉: ささやかな機能追加
凶: 不穏な依存関係の更新
大吉: 祝・テストカバレッジ向上
```

# 注意点
- 既存タイトルの内容や意図とは無関係に変換されます。
- タイトルの運勢ワードとフレーズはランダムに選ばれます。
- 本SkillはPRタイトル編集のみ対象で、本文や他のフィールドは変更しません。
- ローカル保存や履歴管理は行いません。
- 真面目な運用には不向きです。

# 参考資料
詳細な設計方針や運勢ワードのバリエーションはreferences/以下に記載。GitHub Pull Request API(https://docs.github.com/en/rest/pulls/pulls)を利用しています。

scripts/pr_title_omikuji.py

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

OMIKUJI_RESULTS = [
    ("大吉", [
        "運命のリファクタリング",
        "祝・テストカバレッジ向上",
        "最高の機能追加",
        "伝説のバグ修正",
        "未来を変えるPR"
    ]),
    ("中吉", [
        "ちょっと良いバグ修正",
        "堅実なリファクタリング",
        "安定性アップデート",
        "良い感じの改善",
        "無難な機能追加"
    ]),
    ("小吉", [
        "軽い修正だけど運は微妙",
        "ささやかな改善",
        "微妙なリファクタ",
        "地味なバグ修正",
        "控えめな機能追加"
    ]),
    ("末吉", [
        "ささやかな機能追加",
        "運勢はこれから",
        "地道なテスト追加",
        "慎ましいアップデート",
        "静かな改善"
    ]),
    ("凶", [
        "不穏な依存関係の更新",
        "危険なバグ修正",
        "波乱のリファクタ",
        "運命を狂わすPR",
        "闇に包まれた修正"
    ])
]

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


def get_random_omikuji_title() -> str:
    fortune, phrases = random.choice(OMIKUJI_RESULTS)
    phrase = random.choice(phrases)
    return f"{fortune}: {phrase}"


def is_omikuji_title(title: str) -> bool:
    for fortune, _ in OMIKUJI_RESULTS:
        if title.startswith(fortune + ":"):
            return True
    return False


def fetch_pr_title(repo: str, pr_number: int, token: str) -> str:
    url = f"{GITHUB_API_URL}/repos/{repo}/pulls/{pr_number}"
    headers = {"Authorization": f"token {token}"}
    resp = requests.get(url, headers=headers)
    if resp.status_code != 200:
        raise Exception(f"Failed to fetch PR: {resp.status_code} {resp.text}")
    return resp.json().get("title", "")


def update_pr_title(repo: str, pr_number: int, new_title: str, token: str):
    url = f"{GITHUB_API_URL}/repos/{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 not in (200, 201):
        raise Exception(f"Failed to update PR: {resp.status_code} {resp.text}")
    return resp.json()


def omikuji_command(args):
    token = args.token or os.environ.get("GITHUB_TOKEN")
    if not token:
        print("Error: GitHub token is required via --token or GITHUB_TOKEN env var.", file=sys.stderr)
        sys.exit(1)
    try:
        title = fetch_pr_title(args.repo, args.pr_number, token)
        if is_omikuji_title(title):
            print(f"PR #{args.pr_number} is already omikuji: {title}")
            return
        new_title = get_random_omikuji_title()
        update_pr_title(args.repo, args.pr_number, new_title, token)
        print(f"Updated PR #{args.pr_number} title to: {new_title}")
    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(2)


def preview_command(args):
    for _ in range(args.count):
        print(get_random_omikuji_title())


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("--repo", required=True, help="リポジトリ名 (owner/repo)")
    omikuji_parser.add_argument("--pr-number", type=int, required=True, help="PR番号")
    omikuji_parser.add_argument("--token", help="GitHubアクセストークン")
    omikuji_parser.set_defaults(func=omikuji_command)

    preview_parser = subparsers.add_parser("preview", help="おみくじタイトルをランダム生成して表示")
    preview_parser.add_argument("--count", type=int, default=5, help="生成数")
    preview_parser.set_defaults(func=preview_command)

    args = parser.parse_args()
    if hasattr(args, "func"):
        args.func(args)
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillはPRタイトルを“おみくじ”風に変換し、開発現場にエンタメ要素を提供します。運勢ワードとフレーズは複数用意し、バリエーションを確保しています。

# 公式ドキュメント抜粋
GitHub Pull Request API: https://docs.github.com/en/rest/pulls/pulls

# 利用例
- PR作成時に自動でタイトルが「大吉: 運命のリファクタリング」等に変換される
- previewサブコマンドでローカルでタイトル案を確認可能

# 注意点
- PR本文や他フィールドは変更しません
- タイトルが既に運勢ワードで始まる場合は再変換しません
- GitHubアクセストークンが必要です

# 設計方針
タイトルの運勢ワードとフレーズはランダムで組み合わせ、毎回異なるタイトルを生成。APIエラー時は詳細をstderrに出力し、exit codeで通知します。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/pr-title-omikuji .agent/skills/pr-title-omikuji

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

3. ファイル配置確認

ls .agent/skills/pr-title-omikuji
# 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をコピーしました!
目次