Antigravityで作業中の謎通知を楽しむ意外な活用ガイド

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

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

Antigravity を日々の AI coding workflow に組み込んでいると、便利さの裏で「またか…」と感じる瞬間が少なくありません。特に通知や演出、OS連携まわりで、日常にちょっとした変化や遊び心を求めたくなる場面も増えてきます。以下のような「あるある」に心当たりがある方も多いのではないでしょうか。

  • Antigravity が context を見失い、全く関係ない directory やファイルのコードを参照してしまう
  • monorepo で package を跨いだタイミングで、AI が repository 構造や path management を忘れる
  • session を再開するたびに、前回までの context や repository あらすじ、directory 構造を毎回説明し直す必要がある
  • long context の膨張で重要な情報が埋もれ、AI の repository understanding が浅くなる
  • 真面目な通知ばかりで、作業に没頭しすぎて息抜きや現実逃避のきっかけが全くない

「通知・演出・OS連携」系 Skill の需要は、こうした日常のマンネリや、AIとのやりとりに遊び心を取り入れたいというニーズから生まれています。

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

一言サマリ: このスキルは、作業中に突如“伝説のOSクエスト通知”が現れ、現実逃避と妄想力を刺激してくれる Skill。

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

  • AI coding workflow の合間に、毎回異なる「伝説のクエスト」がランダム通知されて気分転換できる
  • 真面目な context 記述や repository understanding の繰り返しで疲れた頭を、ユーモアや妄想でリフレッシュできる
  • 長時間 session や monorepo の directory 移動時にも、突拍子もないフェイク通知で作業に新鮮さをもたらす
  • Antigravity の通知演出が一気に“遊び場”へと変わり、onboarding 時の緊張感も和らぐ
  • 完全に無害なフェイク通知なので、実データや repo への影響ゼロで安心して楽しめる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-legendary-quest-notification .agent/skills/random-os-fake-legendary-quest-notification

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

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

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


# 新たな session を開始
> プロジェクトの全体像を把握したい

[OS通知] 伝説のクエスト発生!
緊急任務: Cドライブ深奥に眠る「古のバグ」を討伐せよ。
ヒント: src/legacy/bug_hunter.py に隠された暗号を解読せよ。
報酬: 無限メモリの AI context

[Antigravity] context, repo, directory 構造のロード完了。

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


> packages/auth から packages/payment へ移動

[OS通知] 新たな伝説のクエストがあなたを待つ!
任務: 「消えたUSBメモリ」を packages/payment/utils/ から探し出せ。
伝承: monorepo の闇に消えた context を取り戻せ。
特典: repository understanding +10

[Antigravity] path management を更新しました。

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


> 今日はもうやる気が出ない

[OS通知] 伝説のクエスト通知
緊急指令: README.md の「隠しメッセージ」を発見せよ!
困難度: 超絶
クリア報酬: 1日分の現実逃避

[Antigravity] memory snapshot を保存しました。

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-legendary-quest-notification/
├── SKILL.md
├── scripts/
│   └── legendary_quest_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-legendary-quest-notification
description: 作業中や長時間のコーディング、ターミナル操作、通知、OSファンタジー、現実逃避などのキーワードが含まれる場面でAntigravityが自動的にこのSkillを発動し、ユーザーの集中力や気分転換を支援します。
---

# 機能概要
このSkillは、作業やコーディングに没頭している最中に、架空の“伝説のOSクエスト通知”をデスクトップやターミナルにランダムで表示します。通知内容は毎回異なり、「Cドライブ深部で眠るバグの討伐」「伝説のUSBメモリ探索」など、現実には絶対存在しない無茶な任務ばかり。真面目な通知に飽きた方や、作業の合間に現実逃避したい方へ、妄想力と笑いを提供します。実害は一切なく、完全なフェイク通知として安全に動作します。

# 使い方
このSkillは明示的な呼び出しは不要で、"作業中" "コーディング" "通知" "OSファンタジー" "現実逃避" などのキーワードや、長時間のターミナル操作・静的作業が検出されると自動的に発動します。通知はデスクトップまたはターミナル上にランダムなタイミングで出現します。

# 出力例
```
[OS Notification] 緊急任務: Cドライブ深奥に眠る古のバグ退治
[OS Notification] 伝説のUSBメモリ捜索開始 - 手がかり: 旧PCの引き出し
[OS Notification] システム管理者からの挑戦状: ゴミ箱の中から消えたファイルを探せ
[OS Notification] 秘密のプロセス「dragon.exe」を発見せよ
[OS Notification] 禁断のレジストリ迷宮に挑め
```

# 注意点
- 本Skillは完全なフェイク通知のみを生成し、実際のシステムやファイルには一切影響しません。
- 通知内容は冗談やフィクションであり、現実の任務や警告ではありません。
- ローカルに通知履歴を保存することはありません。
- 除外パスや重要なシステム領域へのアクセスは一切行いません。

# 参考資料
詳細な設計方針や実装例については references/design_notes.md を参照してください。OS通知APIの公式ドキュメントは https://docs.python.org/3/library/subprocess.html および https://pypi.org/project/plyer/ を参考にしています。

scripts/legendary_quest_notifier.py

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

try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

QUEST_TEMPLATES = [
    "緊急任務: {location}に眠る{target}退治",
    "伝説の{item}捜索開始 - 手がかり: {hint}",
    "システム管理者からの挑戦状: {challenge}",
    "秘密のプロセス\"{process}.exe\"を発見せよ",
    "禁断の{place}迷宮に挑め",
    "未知のファイル\"{file}\"の正体を暴け",
    "古の{device}の封印を解放せよ",
    "OSの神託: {prophecy}",
    "伝説のバッチファイル\"{batch}\"を実行せよ",
    "謎のタスク\"{task}\"を完遂せよ"
]

QUEST_VARS = {
    "location": ["Cドライブ深奥", "システムフォルダ", "Program Filesの裏側", "レジストリの迷宮", "ネットワークの果て"],
    "target": ["古のバグ", "消えた設定", "幽霊プロセス", "未知のウイルス", "隠れファイル"],
    "item": ["USBメモリ", "ライセンスキー", "失われたショートカット", "幻のアイコン", "管理者パスワード"],
    "hint": ["旧PCの引き出し", "謎のメモ.txt", "開かずのフォルダ", "READMEに隠されたヒント", "壁紙の裏"],
    "challenge": ["ゴミ箱の中から消えたファイルを探せ", "3日以内に未知のエラーを再現せよ", "隠されたユーザーを見つけよ", "システム時計を未来に進めろ", "ログファイルの暗号を解読せよ"],
    "process": ["dragon", "phoenix", "unicorn", "goblin", "wizard"],
    "place": ["レジストリ", "サービス", "ドライバ", "タスクスケジューラ", "スタートアップ"],
    "file": ["secret.dll", "mystery.sys", "hidden.txt", "legend.bat", "ghost.exe"],
    "device": ["フロッピーディスク", "SCSIドライブ", "モデム", "CRTモニタ", "PS/2マウス"],
    "prophecy": ["今日中にブルースクリーンを回避せよ", "ダークモードを極めよ", "すべての通知を受け入れよ", "未知のショートカットを発見せよ", "隠し設定を解放せよ"],
    "batch": ["start_legend.bat", "awakening.cmd", "final_quest.bat", "dragon_hunt.bat", "phoenix_rise.cmd"],
    "task": ["1000個のウィンドウを閉じろ", "連続リブートに耐えろ", "すべてのアイコンを並べ替えよ", "謎のプロセスを終了せよ", "無限ループから脱出せよ"]
}

LOG_FILE = os.path.expanduser("~/.legendary_quest_log.txt")


def generate_quest():
    template = random.choice(QUEST_TEMPLATES)
    quest = template
    for key in QUEST_VARS:
        if f'{{{key}}}' in template:
            quest = quest.replace(f'{{{key}}}', random.choice(QUEST_VARS[key]))
    return quest


def notify_quest(quest):
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    message = f"[OS Notification] {quest}"
    print(message)
    if PLYER_AVAILABLE:
        notification.notify(
            title="伝説のOSクエスト",
            message=quest,
            timeout=8
        )
    with open(LOG_FILE, 'a', encoding='utf-8') as f:
        f.write(f"{timestamp} {quest}\n")


def random_notify_loop(min_interval=300, max_interval=1200, stop_event=None):
    while not (stop_event and stop_event.is_set()):
        wait_sec = random.randint(min_interval, max_interval)
        for _ in range(wait_sec):
            if stop_event and stop_event.is_set():
                return
            time.sleep(1)
        quest = generate_quest()
        notify_quest(quest)


def list_log(count=10):
    if not os.path.exists(LOG_FILE):
        print("No quest notifications have been logged yet.")
        return
    with open(LOG_FILE, encoding='utf-8') as f:
        lines = f.readlines()
    for line in lines[-count:]:
        print(line.strip())


def summary():
    if not os.path.exists(LOG_FILE):
        print("No quest notifications have been logged yet.")
        return
    with open(LOG_FILE, encoding='utf-8') as f:
        lines = f.readlines()
    print(f"Total fake legendary quests notified: {len(lines)}")


def main():
    parser = argparse.ArgumentParser(description="伝説のOSクエスト通知スクリプト")
    subparsers = parser.add_subparsers(dest='command')

    parser_log = subparsers.add_parser('log', help='通知履歴を最新から10件表示')
    parser_log.add_argument('--count', type=int, default=10, help='表示件数 (デフォルト10)')

    parser_summary = subparsers.add_parser('summary', help='通知の総数を表示')

    parser_notify = subparsers.add_parser('notify', help='今すぐ伝説のクエスト通知を表示')

    parser_daemon = subparsers.add_parser('daemon', help='ランダムな間隔で自動通知 (Ctrl+Cで停止)')
    parser_daemon.add_argument('--min', type=int, default=300, help='最小通知間隔(秒)')
    parser_daemon.add_argument('--max', type=int, default=1200, help='最大通知間隔(秒)')

    args = parser.parse_args()

    if args.command == 'log':
        list_log(args.count)
    elif args.command == 'summary':
        summary()
    elif args.command == 'notify':
        quest = generate_quest()
        notify_quest(quest)
    elif args.command == 'daemon':
        stop_event = threading.Event()
        try:
            print(f"伝説のOSクエスト通知デーモンを起動します (間隔: {args.min}-{args.max}秒)。Ctrl+Cで停止")
            random_notify_loop(args.min, args.max, stop_event)
        except KeyboardInterrupt:
            print("\nデーモンを停止しました。")
            stop_event.set()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、現実には存在しない“伝説のOSクエスト”を架空の通知として表示し、作業中のユーザーにユーモアと現実逃避の機会を提供します。通知内容は毎回異なり、完全なフェイクでシステムやファイルに影響を与えません。

# 公式ドキュメント抜粋
Pythonのデスクトップ通知には plyer ライブラリ(https://pypi.org/project/plyer/)を利用しています。plyerはクロスプラットフォームで通知APIをラップし、Windows/Mac/Linuxで動作します。

# 利用例
- 長時間のコーディングや単調な作業中に、突如“伝説の任務”が通知されることで気分転換や笑いを誘発。
- チームの朝会やイベントで“今日の伝説クエスト”として活用可能。

# 注意点
- 通知内容はすべて架空であり、実際のファイルやプロセス、システムには一切影響を与えません。
- plyerがインストールされていない場合はターミナル出力のみとなります。

# 設計方針
- ユーザー体験を損なわず、実害ゼロ・安全設計。
- 通知内容のバリエーションを重視し、テンプレートとランダム変数で毎回異なる“伝説”を生成。
- ログ機能を実装し、過去の通知履歴や統計も参照可能。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-legendary-quest-notification .agent/skills/random-os-fake-legendary-quest-notification

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-legendary-quest-notification
# 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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知タイミングがランダムで自然発生するか?
  • 毎回異なる奇天烈クエスト内容が出力されるか?
  • 実害やデータ損失が発生しない完全なフェイク通知であることを確認できるか?

実際に Antigravity で試した検証ログは Antigravityで通知・演出・OS連携Skillを試してみた結果 にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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