Antigravityで謎のOSマスコット通知を活用する意外な方法

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

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

Antigravity を日々の AI coding workflow で使い込むほど、便利さと引き換えに「ちょっとした息抜き」や「作業の合間の気分転換」が欲しくなる瞬間が増えてきます。特に、context や repository understanding の精度を高めるために長時間集中することが多い現場では、ふとした拍子に緊張が途切れたり、同じ directory を何度も行き来して単調さを感じたりしがちです。

また、monorepo を管理していると、directory や path management に神経を使う場面が多く、Antigravity の context memory を意識しながら作業を進める必要があります。そんな時、「ちょっとした現実逃避」や「意味のない激励」があると、意外とリフレッシュできるものです。

  • Antigravity が context を見失って違う場所のコードを参照するタイミングで、気分転換や軽い演出が欲しくなる
  • monorepo で package を跨いだ瞬間、repository 構造の説明に追われていると、作業が単調に感じてしまう
  • session を再開するとき、前回までの context や path 指定を再説明する間の“間”が妙に間延びする
  • 長時間の AI coding workflow で long context が膨らみ、重要な情報が薄まった時に、ちょっとした“遊び”が欲しくなる
  • 「ここはこういう構造のリポジトリ」という説明を毎回書くたび、無機質なやりとりに疲れることがある

通知・演出・OS連携系の Skill は、こうした「ちょっとした余白」を埋める役割としても注目されています。

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

一言サマリ: あなたの作業中Skill。

このSkillを導入すると、Antigravity でのコーディングやリポジトリ操作の合間に、謎のOSマスコットが唐突にデスクトップ通知で現れ、全く役に立たない激励や警告を投げかけてきます。現実逃避や気分転換が自然に挟まることで、長時間の repository management や context maintenance のストレスを和らげます。

  • 作業の合間に「OS界のゆるキャラ」からのランダムな通知が入り、workflow のリズムを崩さずリフレッシュできる
  • monorepo や長時間 session で感じる単調さや疲労感を、予測不能な演出で軽減
  • directory や repository 構造の説明に追われる場面で、思わずクスッとする現実逃避が挟まる
  • onboarding や path management の合間に、ちょっとした「遊び心」を加えられる
  • Antigravity の context memory に依存した長時間作業でも、通知が“間”を作ってくれる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

この Skill を有効化していると、Antigravity の作業中に突如、謎のOSマスコットがデスクトップ通知で現れます。内容もキャラも完全ランダム。以下、3つの典型的な利用シーンを例示します。

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


> 新しいリポジトリで作業を始めたい

[通知] カーネルくんが応援してるよ!
  └「/src/main.py も /README.md も、きっと素敵な未来を待ってる!」

[通知] ビットちゃんが現れた!
  └「このリポジトリの context、全部覚えてるから安心して!」

[通知] メモリ犬があなたの成功を見守っています
  └「directory の path 管理、任せてワン!」

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


> packages/api/ から packages/web/ に移動したい

[通知] カーネルくん「おっと、違う package に来たね!」
  └「repo 構造を見失わないように気をつけて!」

[通知] ビットちゃん「新しい directory 発見!」
  └「/packages/web/src/ の context をちゃんと読み込んでね!」

[通知] メモリ犬「monorepo の path 管理は難しいワン」
  └「でも大丈夫、ぼくが見守ってるワン!」

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


> ちょっと休憩したい

[通知] ビットちゃん「今どこかで泣いています」
  └「README.md を5回も編集したのに…」

[通知] カーネルくん「たまには stretch しよう!」
  └「AI coding workflow も健康第一!」

[通知] メモリ犬「無意味な警告だワン」
  └「でも気にしないでワン!」

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-mascot-notifier
description: 作業中や長時間の無操作時、または『応援』『やる気』『通知』『OS』『マスコット』などのキーワードが検出された際に、AntigravityがこのSkillを発動します。ユーザーの集中力維持や気分転換のために適宜通知を行います。
---

# 機能概要
random-os-fake-mascot-notifierは、作業中のユーザーに対し、架空のOSマスコットがデスクトップ通知で突然現れ、全く役に立たない激励や警告をランダムに発します。通知内容・キャラクター・タイミングは完全にカオスで予測不能。現実逃避や気分転換、作業の合間のちょっとした癒しを提供し、単調な作業環境に遊び心をもたらします。

# 使い方
このSkillはAntigravityのsemantic-match-onlyトリガーで自動発動します。明示的な呼び出しは不要です。『応援』『やる気』『通知』『OS』『マスコット』などのキーワードや、長時間の無操作が検出された場合に自動で通知が表示されます。設定やカスタマイズは不要で、インストール後すぐに機能します。

# 出力例
```
[通知] カーネルくん: システムの裏側から君を応援してるよ!
[通知] ビットちゃん: ビットの海であなたの成功を祈っています。
[通知] メモリ犬: メモリの片隅で見守っています。休憩も大事!
[通知] タスクキャット: タスク管理は計画的に。たまには深呼吸。
[通知] バグバード: バグは友達、怖くないよ!
```

# 注意点
- 通知はデスクトップ領域に表示されますが、環境によっては通知APIの制限で表示されない場合があります。
- 通知頻度は自動調整され、うるさすぎないよう制御されています。
- 通知内容やキャラクターは完全ランダムで、実在のOSやキャラクターとは一切関係ありません。
- ローカルに通知履歴や個人情報は保存しません。

# 参考資料
- references/design_notes.md
- https://docs.python.org/ja/3/library/random.html
- https://plyer.readthedocs.io/en/latest/

scripts/mascot_notifier.py

import random
import time
import argparse
import sys
import threading
from datetime import datetime, timedelta
try:
    from plyer import notification
except ImportError:
    print('plyerパッケージが必要です。pip install plyer でインストールしてください。')
    sys.exit(1)

MASCOTS = [
    {
        'name': 'カーネルくん',
        'messages': [
            'システムの裏側から君を応援してるよ!',
            '今日もプロセス管理は完璧だね。',
            'カーネルパニックは気にしないで!',
            '再起動しても君の努力は消えないよ。'
        ]
    },
    {
        'name': 'ビットちゃん',
        'messages': [
            'ビットの海であなたの成功を祈っています。',
            '0と1の間にも無限の可能性があるよ。',
            'ビット落ちしないように休憩してね。',
            'あなたの努力、全部見えてるよ!'
        ]
    },
    {
        'name': 'メモリ犬',
        'messages': [
            'メモリの片隅で見守っています。休憩も大事!',
            'ガーベジコレクションは任せて!',
            'メモリリークにはご用心。',
            '君のRAMはいつもフル稼働だね。'
        ]
    },
    {
        'name': 'タスクキャット',
        'messages': [
            'タスク管理は計画的に。たまには深呼吸。',
            'マルチタスクは猫の手も借りたい。',
            'ToDoリスト、もう一度見直してみては?',
            '休憩時間もスケジュールに入れよう!'
        ]
    },
    {
        'name': 'バグバード',
        'messages': [
            'バグは友達、怖くないよ!',
            'バグ退治は焦らずじっくり。',
            '今日もどこかでバグが羽ばたいています。',
            'バグを見つけたら褒めてあげよう。'
        ]
    },
    {
        'name': 'アップデートパンダ',
        'messages': [
            'アップデートは計画的に。',
            '最新バージョンで快適作業!',
            'たまには再起動も大切です。',
            'アップデート通知、見逃さないでね。'
        ]
    },
    {
        'name': 'プロセスモール',
        'messages': [
            'プロセスの流れに身を任せて。',
            '時にはプロセスをkillする勇気も必要。',
            'forkして新しい自分を発見!',
            'プロセス管理の達人だね。'
        ]
    },
    {
        'name': 'ログリス',
        'messages': [
            'ログは嘘をつかない。',
            'エラーログも大切な仲間。',
            'たまにはログを眺めてみては?',
            'ログに人生を刻もう。'
        ]
    }
]

NOTIFY_INTERVAL_MIN = 900  # 15分
NOTIFY_INTERVAL_MAX = 3600 # 1時間

HISTORY = []


def pick_random_mascot():
    mascot = random.choice(MASCOTS)
    message = random.choice(mascot['messages'])
    return mascot['name'], message


def show_notification(title, message):
    try:
        notification.notify(
            title=title,
            message=message,
            app_name='Random OS Mascot Notifier',
            timeout=8
        )
        return True
    except Exception as e:
        print(f'通知エラー: {e}')
        return False


def notify_once():
    mascot, msg = pick_random_mascot()
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    show_notification(f'{mascot}', msg)
    HISTORY.append({'time': now, 'mascot': mascot, 'message': msg})
    print(f'[通知] {mascot}: {msg}')


def notify_loop():
    while True:
        interval = random.randint(NOTIFY_INTERVAL_MIN, NOTIFY_INTERVAL_MAX)
        notify_once()
        time.sleep(interval)


def list_history():
    if not HISTORY:
        print('通知履歴はありません。')
        return
    for item in HISTORY:
        print(f"[{item['time']}] {item['mascot']}: {item['message']}")


def summary():
    from collections import Counter
    mascot_counts = Counter([h['mascot'] for h in HISTORY])
    print('通知マスコット出現回数:')
    for mascot, count in mascot_counts.items():
        print(f'{mascot}: {count}回')


def main():
    parser = argparse.ArgumentParser(description='Random OS Fake Mascot Notifier')
    subparsers = parser.add_subparsers(dest='command', help='サブコマンド')

    parser_log = subparsers.add_parser('log', help='1回だけ通知を表示')
    parser_list = subparsers.add_parser('list', help='通知履歴を表示')
    parser_summary = subparsers.add_parser('summary', help='マスコット出現回数を集計')
    parser_daemon = subparsers.add_parser('daemon', help='定期的に通知を自動表示')

    args = parser.parse_args()

    if args.command == 'log':
        notify_once()
    elif args.command == 'list':
        list_history()
    elif args.command == 'summary':
        summary()
    elif args.command == 'daemon' or args.command is None:
        print('マスコット通知デーモンを開始します。Ctrl+Cで終了。')
        try:
            notify_loop()
        except KeyboardInterrupt:
            print('\n終了します。')
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-os-fake-mascot-notifierは、作業中のユーザーに対し、完全ランダムなタイミングで架空のOSマスコットが通知を送ることで、作業の合間の現実逃避や気分転換を促進します。通知内容・キャラクターともにバリエーション豊富で、通知理由やタイミングもカオスに設計されています。

# 公式ドキュメント抜粋
通知表示にはPythonのplyerパッケージ(https://plyer.readthedocs.io/en/latest/)を利用し、クロスプラットフォームでデスクトップ通知を実現しています。乱数生成は標準のrandomモジュールを使用。

# 利用例
- 長時間のコーディングや単調作業の合間に、無意味だが癒される通知が届きます。
- ターミナルから `python mascot_notifier.py daemon` で常駐させると、一定間隔で自動通知。
- `log` サブコマンドで1回だけ即時通知も可能。

# 注意点
- plyerの通知は一部Linux環境やWSLでは表示されない場合があります。
- 通知は完全にランダムで、実用的な情報やアドバイスは含まれません。
- 履歴はメモリ上のみで永続化されません。

# 設計方針
「役に立たない通知」「完全ランダム」「ゆるキャラ感」を重視し、実在のOSや企業キャラとは無関係なオリジナルマスコットを多数収録。通知頻度は15分〜1時間の範囲で自動調整し、うるさすぎない設計としています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-mascot-notifier
# 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をコピーしました!
目次