Antigravityで楽しむ!謎のOSペット通知を活用する方法

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

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

Antigravity を日々使い込んでいると、AI coding workflow の効率化や repository understanding のための context 管理に気を取られがちです。しかし、集中しているとふとした瞬間に気が抜けず、逆に productivity が落ちてしまうことも。特に通知・演出・OS連携に関する「ちょっとした息抜き」や「リフレッシュ」の仕掛けがないと、長時間の作業が単調になりがちです。

  • Antigravity が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • ずっと画面と向き合い続けていると、集中力が途切れず逆に疲労が蓄積しやすい

こうした悩みを抱えつつも、ちょっとした遊び心や癒し要素が欲しいと感じる瞬間は多いものです。

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

一言サマリ: このスキルは、Antigravity の作業中に“謎のOSペット乱入イベント”を完全ランダムで発生させ、集中しすぎた workflow に強制的な癒しとリセットをもたらす Skill。

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

  • AI coding workflow の単調さを和らげ、気分転換のきっかけを自動で挿入できる
  • repository や directory を横断する長時間作業時にも、ランダムな演出で context の切り替えが自然に生まれる
  • onboarding や session 再開時の堅苦しさを和らげ、Antigravity とのやりとりが親しみやすくなる
  • monorepo の複雑な path management で詰まりがちなタイミングにも、気分転換を挟みやすい
  • 「OSがペットを飼い始めた世界」を一瞬だけ体験でき、長時間作業のストレスを軽減
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-system-pet-interruption .agent/skills/random-os-fake-system-pet-interruption

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

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

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


> プロジェクトのセットアップを始めたい

[Antigravity通知] 仮想柴犬「モフ太郎」があなたのデスクトップを横切りました。
[Antigravity通知] OSペット「デジタル猫」が main.py の上でしっぽを振っています。
[Antigravity通知] システムペンギンが repository のルート directory で昼寝を始めました。

作業を続けるには "OK" を押してください。

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


> packages/api/ から packages/web/ に context を切り替えたい

[Antigravity通知] 仮想ハムスターが packages/api/ から packages/web/ まで迷子になっています。
[Antigravity通知] OSペット「バーチャル柴犬」が /packages/web/src/ に侵入しました。
[Antigravity通知] ペット猫が monorepo の境界を越えてマウスを追いかけています。

作業の流れをリセットしますか? (yes/no)

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


> ちょっと気分転換したい

[Antigravity通知] システムペンギンが README.md の上でスケートを始めました。
[Antigravity通知] 仮想柴犬が node_modules/ を掘り返しています(何も見つかりませんでした)。
[Antigravity通知] バーチャル猫があなたのカーソルを追いかけて遊んでいます。

しばらく休憩してみませんか?

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-system-pet-interruption/
├── SKILL.md
├── scripts/
│   └── pet_interruption.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/pet_interruption.py 監視対象のログファイルからキーワードを検出
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-system-pet-interruption
description: ユーザーが作業やコーディングに集中している際、“ペット”に関する語や長時間の無操作・集中状態を検知した場合に、完全ランダムなOS風ペット乱入イベントを自動で発生させます。癒しや混乱を演出し、集中リセットを促します。
---

# 機能概要
このSkillは、作業中のユーザーに対し、完全ランダムなタイミングで「OSペット乱入イベント」を発生させます。内容は「仮想猫がマウスを追いかける」「デジタル柴犬がファイルの上で昼寝中」など多彩で、何の役にも立たないのに謎の癒しと混乱をもたらします。長時間の集中や“ペット”関連の語句出現時に発動し、OSがペットを飼い始めた世界観を一瞬だけ体験できます。集中しすぎた頭をリセットしたいときや、ちょっとした遊び心を加えたいときに最適です。

# 使い方
このSkillは常時バックグラウンドで動作し、明示的な呼び出しは不要です。暗黙発動キーワード例として「ペット」「猫」「柴犬」「癒し」などが会話や作業ログに現れると、乱入イベントが発生しやすくなります。また、一定時間無操作や集中状態が続いた場合にも自動で発動します。

# 出力例
```
[通知] OS公式ペット「ねこまる」が画面を横切りました。
[通知] 仮想猫がマウスカーソルを追いかけています。
[通知] デジタル柴犬がファイル「report.docx」の上で昼寝中です。
[通知] OSペット「うさぎん」がタスクバーでジャンプしています。
[通知] ペンギンが端末ウィンドウに登場しました。
```

# 注意点
- 本Skillは通知・演出のみで、実際のファイルやシステムには影響を与えません。
- ローカル保存や履歴の記録は行いません。
- ペットの種類や演出内容は完全ランダムです。
- 長時間の無操作や特定キーワードで発動頻度が上がります。

# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- 公式API: https://docs.python.org/ja/3/library/notify2.html, https://pypi.org/project/plyer/

scripts/pet_interruption.py

import sys
import random
import time
import argparse
import threading
import platform

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

PET_EVENTS = [
    'OS公式ペット「ねこまる」が画面を横切りました。',
    '仮想猫がマウスカーソルを追いかけています。',
    'デジタル柴犬がファイル「report.docx」の上で昼寝中です。',
    'OSペット「うさぎん」がタスクバーでジャンプしています。',
    'ペンギンが端末ウィンドウに登場しました。',
    'バーチャルハムスターが通知領域でおやつを食べています。',
    'デジタルカメがゆっくりと画面下部を移動中です。',
    'OSペット「インコ」がウィンドウの上で羽ばたいています。',
    '仮想柴犬がエディタのカーソルを追いかけています。',
    'デジタルねずみがファイルリストを駆け抜けました。',
]

KEYWORDS = ['ペット', '猫', '柴犬', '癒し', '犬', 'うさぎ', 'ペンギン', 'ハムスター', 'カメ', 'インコ', 'ねずみ']

DEFAULT_INTERVAL = 600  # 10分
RANDOMNESS = (120, 480)  # 2分~8分のランダム追加

class PetInterruption:
    def __init__(self, interval=DEFAULT_INTERVAL):
        self.interval = interval
        self.last_event = 0
        self.running = False
        self.lock = threading.Lock()

    def _notify(self, message):
        if notification:
            notification.notify(
                title='OSペット乱入イベント',
                message=message,
                timeout=8
            )
        else:
            print(f'[通知] {message}')

    def random_event(self):
        event = random.choice(PET_EVENTS)
        self._notify(event)
        self.last_event = time.time()

    def keyword_match(self, text):
        for kw in KEYWORDS:
            if kw in text:
                return True
        return False

    def monitor_keywords(self, logfile, poll=5):
        """監視対象のログファイルからキーワードを検出"""
        last_pos = 0
        while self.running:
            try:
                with open(logfile, 'r', encoding='utf-8') as f:
                    f.seek(last_pos)
                    lines = f.readlines()
                    if lines:
                        for line in lines:
                            if self.keyword_match(line):
                                self.random_event()
                        last_pos = f.tell()
            except Exception:
                pass
            time.sleep(poll)

    def timer_loop(self):
        while self.running:
            now = time.time()
            if now - self.last_event > self.interval + random.randint(*RANDOMNESS):
                self.random_event()
            time.sleep(30)

    def start(self, logfile=None):
        self.running = True
        threads = []
        if logfile:
            t = threading.Thread(target=self.monitor_keywords, args=(logfile,))
            t.daemon = True
            threads.append(t)
            t.start()
        timer_thread = threading.Thread(target=self.timer_loop)
        timer_thread.daemon = True
        threads.append(timer_thread)
        timer_thread.start()
        try:
            while self.running:
                time.sleep(1)
        except KeyboardInterrupt:
            self.running = False
            print('終了します')

    def trigger_once(self):
        self.random_event()


def main():
    parser = argparse.ArgumentParser(description='OSペット乱入イベント発生スクリプト')
    subparsers = parser.add_subparsers(dest='command')

    parser_start = subparsers.add_parser('start', help='バックグラウンドで自動発動')
    parser_start.add_argument('--interval', type=int, default=DEFAULT_INTERVAL, help='最小発動間隔(秒)')
    parser_start.add_argument('--logfile', type=str, help='キーワード監視用ログファイルパス')

    parser_once = subparsers.add_parser('once', help='1回だけ乱入イベントを発生')

    parser_list = subparsers.add_parser('list', help='ペット乱入イベント内容一覧')

    args = parser.parse_args()
    pet = PetInterruption(interval=args.interval if hasattr(args, 'interval') else DEFAULT_INTERVAL)

    if args.command == 'start':
        pet.start(logfile=args.logfile)
    elif args.command == 'once':
        pet.trigger_once()
    elif args.command == 'list':
        for i, event in enumerate(PET_EVENTS, 1):
            print(f'{i}. {event}')
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、作業中のユーザーに対し完全ランダムなタイミングで「OSペット乱入イベント」を通知として発生させ、癒しと混乱を演出します。Pythonのplyer.notificationを利用し、クロスプラットフォームな通知を実現しています。

# 公式ドキュメント抜粋
- plyer: https://plyer.readthedocs.io/en/latest/
- notify2: https://pypi.org/project/notify2/

# 利用例
- 長時間の無操作や集中状態が続くときに自動で癒しイベントを発生
- ログファイルや会話ログに「猫」「ペット」などのキーワードが現れた際に即時発動

# 注意点
- 通知のみであり、実際のファイルやシステム状態には影響しません
- plyer未導入環境ではprint出力にフォールバックします

# 設計方針
- 完全なランダム性と多様なイベント文言で飽きさせない体験を重視
- ユーザー操作ログや会話からのキーワード検出による柔軟な発動トリガー
- ローカル保存や履歴記録は行わず、プライバシーにも配慮

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-system-pet-interruption .agent/skills/random-os-fake-system-pet-interruption

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-system-pet-interruption
# 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ペットが乱入!画面を賑わせてみた にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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