Antigravityで謎のペット命名通知を自動化して作業空間を楽しく演出する方法

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

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

Antigravity を日常的に使っていると、AI coding workflow の中で context や repository understanding のズレ、通知や演出面での物足りなさを感じることが多い。特に通知・演出・OS連携まわりでは、集中力維持や作業空間のリフレッシュに関する悩みが積み重なりがちだ。

  • 長時間の作業や session 継続で、Antigravity の context が stale になり、気分転換やリセットのきっかけが欲しくなる
  • repository を跨いだり、directory 構造が複雑な monorepo で作業していると、単調な通知や演出では集中力が途切れやすい
  • AI が path management や context 復元に失敗したとき、ちょっとした「間」や遊び心のある演出がほしくなる
  • onboarding や session 再開時、毎回同じような説明や確認作業が続き、作業空間にユーモアやカオスが足りないと感じる
  • 長時間の workflow で、重要な情報が埋もれがちになり、ふとした拍子に集中が切れてしまう

通知や演出を通じて、作業空間に新鮮な「余韻」やクスッと笑えるイベントが欲しい──そんな気持ちを持つAntigravityユーザーは少なくないはずだ。

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

一言サマリ: このスキルは、Antigravity の作業空間に突如現れる「謎のペット命名通知」で、集中力をリセットし、カオスと笑いを生み出す Skill。

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

  • 単調なAI coding workflowに、OS連携のユニークな通知演出を加え、作業空間に新鮮な context をもたらす
  • monorepo や複雑な repository での作業中でも、突発的なイベントで気分転換できる
  • onboarding や session 再開時に、意味不明なペット命名で会話や流れが和らぐ
  • 長時間の作業や stale context 状態でも、突如通知が走ることで集中力がリセットされる
  • AI・人間双方の「作業空間」に、ちょっとしたカオスと余韻を残せる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/os-fake-random-pet-name-notifier .agent/skills/os-fake-random-pet-name-notifier

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

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

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


# プロジェクトのセットアップを始める
> プロジェクトの初期化をお願いします

[os-fake-random-pet-name-notifier]
本日より、あなたのマウスは「疾風のコロンブス」と命名されました。
以後、/src/setup/ 内での操作時は「疾風のコロンブス」にご注意ください。

repository: my-monorepo
directory: /src/setup/
context: session start
memory: ペット命名通知

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


> packages/api/ から packages/web/ に移動します

[os-fake-random-pet-name-notifier]
「静寂なる鉄槌」が新たにあなたのキーボードの名となりました。
monorepo の packages/web/ 配下でのコーディングは「静寂なる鉄槌」と共に。

repository: my-monorepo
directory: packages/web/
context: package switch
memory: ペット命名通知

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


> 今日は何か面白いことない?

[os-fake-random-pet-name-notifier]
おめでとうございます。あなたのディスプレイは本日より「漆黒の賢者」と呼ばれます。
repo の全 directory で「漆黒の賢者」のご加護がありますように。

repository: fun-repo
directory: /
context: random event
memory: ペット命名通知

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 突発的な通知で context をリフレッシュ、集中力をリセット

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/os-fake-random-pet-name-notifier/
├── SKILL.md
├── scripts/
│   └── notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: os-fake-random-pet-name-notifier
description: このSkillは「通知」「演出」「OS」「ペット」「命名」「ランダム」などのキーワードや、作業中・アイドル時にAntigravityがセマンティックにマッチした場合に自動発動します。明示的な呼び出しは不要です。
---

# 機能概要
このSkillは、あなたの作業中に突如“謎のOS公式・ペット命名通知”をデスクトップやターミナルに表示します。通知内容は毎回ランダムで、マウスやキーボードなどの周辺機器に意味不明な二つ名や称号が付与される理不尽なイベントを演出します。実用性は皆無ですが、作業空間にカオスとユーモアをもたらし、集中力を根こそぎ奪うことが目的です。

# 使い方
このSkillは明示的な呼び出しを必要とせず、「通知」「OS」「ペット」「命名」などのキーワードや、作業が一定時間アイドル状態になるなどのセマンティック条件で自動発動します。手動でのCLI呼び出し例:

```
python notifier.py --notify-now
```

暗黙発動キーワード例: 「OS通知」「ペット名」「作業中」「ランダム演出」

# 出力例
```
[OS通知] あなたのマウスは本日より“疾風のコロンブス”と命名されました。
[OS通知] キーボードの新しい名は“静寂なる鉄槌”です。
[OS通知] ディスプレイは“虚空の監視者”と呼ばれることになりました。
[OS通知] あなたのUSBメモリは“迷宮の案内人”です。
[OS通知] スピーカーの名は“響鳴の咆哮”です。
```

# 注意点
- 本Skillは実用性が一切なく、作業やデータには影響しません。
- 通知内容は完全にランダムで、ローカルには保存されません。
- 一部OSではデスクトップ通知が表示されない場合があります。
- 除外パス: システム設定や重要な作業中のアプリケーションでは発動しません。

# 参考資料
詳細な設計方針や参考実装は `references/design_notes.md` を参照してください。OS通知APIについては [Python公式: plyer.notification](https://plyer.readthedocs.io/en/latest/) も参考にしています。

scripts/notifier.py

import random
import time
import argparse
import sys
import threading
from datetime import datetime

try:
    from plyer import notification
except ImportError:
    notification = None

# ハードウェア/周辺機器名
DEVICE_NAMES = [
    "マウス",
    "キーボード",
    "ディスプレイ",
    "USBメモリ",
    "スピーカー",
    "ヘッドホン",
    "プリンター",
    "タッチパッド",
    "Webカメラ",
    "外付けHDD",
    "ルーター",
    "マイク",
    "グラフィックボード",
    "ゲームパッド",
    "スマートフォン",
    "タブレット"
]

# 二つ名/称号パーツ
PREFIXES = [
    "疾風の",
    "静寂なる",
    "虚空の",
    "迷宮の",
    "響鳴の",
    "暗黒の",
    "閃光の",
    "不屈の",
    "孤高の",
    "叡智の",
    "烈火の",
    "氷結の",
    "雷鳴の",
    "幻影の",
    "不滅の",
    "蒼穹の"
]

SUFFIXES = [
    "コロンブス",
    "鉄槌",
    "監視者",
    "案内人",
    "咆哮",
    "魔導書",
    "守護者",
    "探求者",
    "旅人",
    "彗星",
    "錬金術師",
    "忍者",
    "賢者",
    "錆びた剣",
    "流星",
    "旋風"
]

# 通知メッセージパターン
MESSAGE_PATTERNS = [
    "あなたの{device}は本日より“{title}”と命名されました。",
    "{device}の新しい名は“{title}”です。",
    "{device}は“{title}”と呼ばれることになりました。",
    "あなたの{device}は“{title}”です。",
    "{device}の公式ペット名は“{title}”です。"
]

def generate_random_title():
    prefix = random.choice(PREFIXES)
    suffix = random.choice(SUFFIXES)
    return f"{prefix}{suffix}"

def generate_notification_message():
    device = random.choice(DEVICE_NAMES)
    title = generate_random_title()
    pattern = random.choice(MESSAGE_PATTERNS)
    return pattern.format(device=device, title=title)

def show_notification(message):
    # デスクトップ通知
    if notification:
        try:
            notification.notify(
                title="OS通知",
                message=message,
                app_name="Fake Pet Name Notifier",
                timeout=8
            )
        except Exception as e:
            print(f"[通知エラー] {e}", file=sys.stderr)
    # ターミナル出力
    print(f"[OS通知] {message}")

def notify_randomly(stop_event, min_interval=60, max_interval=300):
    while not stop_event.is_set():
        wait_time = random.randint(min_interval, max_interval)
        stop_event.wait(wait_time)
        if stop_event.is_set():
            break
        msg = generate_notification_message()
        show_notification(msg)

def log_notification(logfile, message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open(logfile, "a", encoding="utf-8") as f:
        f.write(f"{timestamp}\t{message}\n")

def list_log(logfile, limit=10):
    try:
        with open(logfile, "r", encoding="utf-8") as f:
            lines = f.readlines()[-limit:]
            for line in lines:
                print(line.strip())
    except FileNotFoundError:
        print("ログファイルが見つかりません。", file=sys.stderr)

def summary_log(logfile):
    from collections import Counter
    try:
        with open(logfile, "r", encoding="utf-8") as f:
            titles = [line.strip().split("\t")[-1] for line in f]
            c = Counter(titles)
            print("--- ペット名通知ランキング ---")
            for title, count in c.most_common(5):
                print(f"{title}: {count}回")
    except FileNotFoundError:
        print("ログファイルが見つかりません。", file=sys.stderr)

def main():
    parser = argparse.ArgumentParser(description="Fake Random Pet Name Notifier")
    subparsers = parser.add_subparsers(dest="command")

    parser_notify = subparsers.add_parser("notify", help="今すぐ通知を表示")
    parser_notify.add_argument("--log", help="通知内容をログファイルに保存")

    parser_daemon = subparsers.add_parser("daemon", help="ランダムな間隔で自動通知")
    parser_daemon.add_argument("--min", type=int, default=60, help="最小間隔(秒)")
    parser_daemon.add_argument("--max", type=int, default=300, help="最大間隔(秒)")
    parser_daemon.add_argument("--log", help="通知内容をログファイルに保存")

    parser_log = subparsers.add_parser("log", help="ログを表示")
    parser_log.add_argument("--file", required=True, help="ログファイルパス")
    parser_log.add_argument("--limit", type=int, default=10, help="表示件数")

    parser_summary = subparsers.add_parser("summary", help="通知タイトルの集計")
    parser_summary.add_argument("--file", required=True, help="ログファイルパス")

    parser.add_argument("--notify-now", action="store_true", help="今すぐ通知を1回表示(サブコマンド不要)")

    args = parser.parse_args()

    if args.notify_now:
        msg = generate_notification_message()
        show_notification(msg)
        sys.exit(0)

    if args.command == "notify":
        msg = generate_notification_message()
        show_notification(msg)
        if args.log:
            log_notification(args.log, msg)
    elif args.command == "daemon":
        stop_event = threading.Event()
        def run_daemon():
            while not stop_event.is_set():
                msg = generate_notification_message()
                show_notification(msg)
                if args.log:
                    log_notification(args.log, msg)
                wait_time = random.randint(args.min, args.max)
                stop_event.wait(wait_time)
        try:
            print("[INFO] ランダムペット名通知デーモン開始 (Ctrl+Cで終了)")
            run_daemon()
        except KeyboardInterrupt:
            stop_event.set()
            print("[INFO] デーモンを終了しました。")
    elif args.command == "log":
        list_log(args.file, args.limit)
    elif args.command == "summary":
        summary_log(args.file)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、作業中に理不尽な“OS公式ペット命名通知”をランダムなタイミングで表示し、作業空間にカオスとユーモアをもたらすことを目的としています。通知は完全に無害で、作業データやシステム設定には一切影響しません。

# 公式ドキュメント抜粋
通知表示にはPythonの[plyer.notification](https://plyer.readthedocs.io/en/latest/)を利用しています。plyerはクロスプラットフォームでデスクトップ通知を提供しますが、環境によってはターミナル出力のみとなる場合もあります。

# 利用例
- 長時間の作業中に突如“あなたのマウスは疾風のコロンブスです”と通知され、思わず笑ってしまう
- チームで使って“誰のディスプレイが虚空の監視者か”で盛り上がる

# 注意点
- 通知内容は完全にランダム生成されます
- ログ保存はオプションで、デフォルトでは記録されません
- システム通知APIが使えない場合はターミナル出力のみ

# 設計方針
- バリエーション豊かな命名パターンを用意し、飽きさせない
- ログ機能や集計機能で後から振り返る楽しみも提供
- 実用性を一切排除し、純粋な演出・娯楽として設計

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/os-fake-random-pet-name-notifier .agent/skills/os-fake-random-pet-name-notifier

.agent/skills/os-fake-random-pet-name-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agent/skills/os-fake-random-pet-name-notifier
# SKILL.md, scripts/, references/, README.md があればOK

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

新しいSkillが自動で認識されます。リスト確認したい場合は ${productName} に「使える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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知がランダムなタイミングで表示されること、命名パターンのバリエーションが十分あること、通知が作業やデータに影響しないこと

実際に Antigravity で試した検証ログは Antigravityで謎のペット命名通知を炸裂させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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