Antigravityで遊ぶ謎のOSパニック通知を楽しむ方法

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

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

AI coding workflow を Antigravity で回していると、集中が途切れたり、ちょっとした息抜きが欲しくなる瞬間が意外と多いものです。特に長時間の session や大規模な monorepo を扱う場合、作業の単調さや context の複雑さがストレスになることも珍しくありません。

さらに、通知・演出・OS連携系の仕掛けが無いと、作業環境に遊び心が足りず、気分転換のタイミングを見失いがちです。Antigravity 固有の挙動やrepo管理の煩雑さも重なり、以下のような「あるある」な悩みが生まれがちです。

  • Antigravity が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

こうした path management や repository understanding の負担が続くと、集中力の維持も難しくなります。

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

一言サマリ: このスキルは、作業中に突如現れる“謎のOSパニック通知”で、Antigravity の単調なAI coding workflowに絶妙な緩急と遊び心をプラスします。

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

  • 長時間の session や onboarding で、デスクトップに突然現れる意味不明なアラートが気分転換を促し、集中のリズムを整えやすくなる
  • monorepo や複雑な repo 構造を扱うときでも、堅苦しさを和らげて、作業環境にユーモアが生まれる
  • AI coding workflow の合間に「現実では絶対に見ない」通知で、疲労やマンネリをリセットできる
  • Skill の導入が簡単で、既存の context や path management の流れを壊さない
  • Antigravity の repository understanding を阻害せず、あくまで演出・通知レイヤーで作用するため、実作業の邪魔にならない
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-panic-alert .agent/skills/random-os-panic-alert

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

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

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


# Antigravity セッション開始
> プロジェクトのセットアップから始めたい

[通知] OSパニック: カーネルがランチに出ました。しばらくお待ちください。
[Antigravity] context: repo 構造を解析中...
[通知] OSパニック: 仮想メモリが現実逃避中です。swapファイルは夢の中。
[Antigravity] repository understanding: /src/main ディレクトリを認識しました

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


> packages/api から packages/web に移動して作業を続けたい

[通知] OSパニック: ビットが逃走しました。捕獲班を手配中です。
[Antigravity] path management: /packages/web/ に context を切り替えます
[通知] OSパニック: システムクロックが未来にワープしました。現在時刻は 42:17 です。
[Antigravity] directory: /packages/web/components/ の repository understanding を開始

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


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

[通知] OSパニック: ネットワーク層が詩を書いています。通信はしばらく詩的です。
[通知] OSパニック: スタックが逆立ちしています。落ち着くまで待機してください。
[Antigravity] memory: long context を一時保存しました

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-panic-alert/
├── SKILL.md
├── scripts/
│   └── random_os_panic_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_panic_alert.py random-os-panic-alert: 謎のOSパニックアラートをランダム通知します。
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-panic-alert
description: Antigravityがユーザーの作業集中度や長時間作業、または“通知”や“アラート”に関する会話・操作ログを検知した際に発動。キーワード例:『通知』『アラート』『集中』『パニック』。
---

# 機能概要
このSkillは、作業中のユーザーに突如として“謎のOSパニックアラート”をデスクトップ通知で表示します。通知内容は毎回ランダム生成され、「カーネルがランチに出ました」「仮想メモリが現実逃避中です」など、現実では絶対に見ないユニークなメッセージばかり。深刻そうで全く深刻でない通知が、作業中の緊張感や集中力に絶妙な“ゆるみ”を与えます。日常の単調な作業や長時間の集中作業の合間に、ちょっとした笑いや気分転換を提供します。

# 使い方
このSkillは明示的な呼び出しを必要とせず、Antigravityが「通知」「アラート」「集中」「パニック」などのキーワードや、長時間作業状態を検知した場合に自動発動します。設定やコマンド入力は不要です。

# 出力例
```
[OS Panic Alert]
カーネルがランチに出ました。システムはしばらく無防備です。

[OS Panic Alert]
仮想メモリが現実逃避中です。復帰をお待ちください。

[OS Panic Alert]
ビットが逃走しました。全力で捜索中です。

[OS Panic Alert]
プロセスIDが自己を見失いました。

[OS Panic Alert]
セグメンテーション・ファウンド。問題ありません。
```

# 注意点
- 本Skillは本物の障害通知ではありません。現実のシステム障害と絶対に混同しないよう設計されています。
- 通知頻度は過度にならないよう自動調整されます。
- ローカル環境の通知API(Windows: win10toast, Mac: osascript, Linux: notify-send等)を利用します。環境により一部通知方法が異なる場合があります。
- 通知ログはローカルに保存されません。

# 参考資料
詳細な設計方針や参考実装は references/design_notes.md を参照してください。各OSの通知API公式ドキュメントも併せてご覧ください。

scripts/random_os_panic_alert.py

import sys
import os
import time
import random
import argparse
import platform
import subprocess
from datetime import datetime, timedelta

PANIC_MESSAGES = [
    "カーネルがランチに出ました。システムはしばらく無防備です。",
    "仮想メモリが現実逃避中です。復帰をお待ちください。",
    "ビットが逃走しました。全力で捜索中です。",
    "プロセスIDが自己を見失いました。",
    "セグメンテーション・ファウンド。問題ありません。",
    "ファイルシステムが詩的表現を始めました。",
    "CPUが瞑想モードに入りました。",
    "ネットワークが自分探しの旅に出ました。",
    "バッファが感情的になっています。",
    "スレッドが人生を考え直しています。",
    "システムクロックが未来にジャンプしました。",
    "デバイスドライバが休暇を申請しました。",
    "ユーザ空間が拡大解釈中です。",
    "カーネルパニック(ただし今日は平和です)。",
    "メモリリークが詩を書き始めました。"
]

NOTIFY_HISTORY = []
MAX_HISTORY = 10
MIN_INTERVAL_SEC = 600  # 10分以上間隔を空ける


def get_random_message():
    return random.choice(PANIC_MESSAGES)


def can_notify():
    now = datetime.now()
    # 履歴がなければOK
    if not NOTIFY_HISTORY:
        return True
    # 最後の通知から十分経過しているか
    last_time = NOTIFY_HISTORY[-1]
    if (now - last_time).total_seconds() >= MIN_INTERVAL_SEC:
        return True
    return False


def record_notify():
    now = datetime.now()
    NOTIFY_HISTORY.append(now)
    # 履歴をMAX_HISTORY件に制限
    if len(NOTIFY_HISTORY) > MAX_HISTORY:
        NOTIFY_HISTORY.pop(0)


def send_notification(title, message):
    system = platform.system()
    try:
        if system == "Windows":
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast(title, message, duration=7, threaded=True)
            except ImportError:
                print("win10toastがインストールされていません。pip install win10toast で導入してください。")
        elif system == "Darwin":
            script = f'display notification "{message}" with title "{title}"'
            subprocess.run(["osascript", "-e", script])
        elif system == "Linux":
            subprocess.run(["notify-send", title, message])
        else:
            print(f"[{title}]\n{message}")
    except Exception as e:
        print(f"通知送信に失敗しました: {e}")


def log_notification(title, message):
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_line = f"[{now}] {title}: {message}\n"
    # ローカルファイル保存はしない設計
    pass


def list_messages():
    print("=== 登録済みパニックメッセージ一覧 ===")
    for i, msg in enumerate(PANIC_MESSAGES, 1):
        print(f"{i}. {msg}")


def summary():
    print("=== random-os-panic-alert ステータス ===")
    print(f"通知履歴件数: {len(NOTIFY_HISTORY)}")
    if NOTIFY_HISTORY:
        print(f"最終通知: {NOTIFY_HISTORY[-1].strftime('%Y-%m-%d %H:%M:%S')}")
    else:
        print("まだ通知はありません。")
    print(f"通知間隔(最小): {MIN_INTERVAL_SEC // 60}分")
    print(f"登録メッセージ数: {len(PANIC_MESSAGES)}")


def trigger_alert():
    if can_notify():
        title = "OS Panic Alert"
        message = get_random_message()
        send_notification(title, message)
        record_notify()
        log_notification(title, message)
    else:
        print("通知間隔が短すぎるため、今回はスキップされました。")


def main():
    parser = argparse.ArgumentParser(description="random-os-panic-alert: 謎のOSパニックアラートをランダム通知します。")
    subparsers = parser.add_subparsers(dest="command")

    parser_alert = subparsers.add_parser("alert", help="即座にパニック通知を発生させる")
    parser_list = subparsers.add_parser("list", help="登録済みパニックメッセージ一覧を表示")
    parser_summary = subparsers.add_parser("summary", help="通知履歴と設定の要約を表示")

    args = parser.parse_args()

    if args.command == "alert":
        trigger_alert()
    elif args.command == "list":
        list_messages()
    elif args.command == "summary":
        summary()
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、現実の障害通知と絶対に混同しない“珍妙なOSパニックアラート”をデスクトップ通知で表示することで、作業中のユーザーの集中力を意図的に攪乱し、気分転換やユーモアを提供します。通知内容は毎回ランダム生成され、深刻そうで全く深刻でない点が特徴です。

# 公式ドキュメント抜粋
- Windows: win10toast (https://github.com/jithurjacob/Windows-10-Toast-Notifications)
- macOS: osascript (AppleScript経由)
- Linux: notify-send (libnotify)

# 利用例
- 長時間のコーディングや単調作業時の気分転換
- チーム内でのジョーク通知として
- 仮想環境やリモートワーク中の“謎イベント”演出

# 注意点
- 本Skillは本物の障害通知ではありません。誤認防止のため、現実の通知で使われない表現・内容のみを採用しています。
- 通知間隔は自動調整され、過度なスパムを防止します。
- ログや履歴はローカル保存されません。

# 設計方針
各OSの標準通知APIを活用し、追加ライブラリが必要な場合は明示的に案内します。Skillの目的は“気を抜く瞬間”の提供であり、現実のシステム運用には一切影響を与えません。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-panic-alert .agent/skills/random-os-panic-alert

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

3. ファイル配置確認

ls .agent/skills/random-os-panic-alert
# 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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知が現実の障害通知と間違えられない内容か?
  • 通知頻度が鬱陶しくないか?
  • 各OS/環境で通知が正しく表示されるか?

実際に Antigravity で試した検証ログは Antigravity の謎のOSパニック通知を体験してみた!集中をかき乱す面白演出 にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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