Antigravityで謎のOSパッチ通知を楽しむ意外な活用法

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

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

Antigravity を日常的に使っていると、AI coding workflow の中で「思わず笑いたくなるようなちょっとした息抜き」や「作業に行き詰まった時の気分転換」がほしいと感じる瞬間があります。特に長時間の repository 理解や context 設定、monorepo の path 管理に集中していると、ふとしたタイミングで肩の力が抜ける“何か”が恋しくなるものです。
一方で、通知や演出系の Skill は「作業の邪魔にならないか」「本当に役立つのか」といった懸念から導入に踏み切れず、結局は淡々とした画一的な開発体験に落ち着いてしまいがちです。
Antigravity 固有の workflow で、こんな悩みがよく挙がります:

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

こうした真面目な悩みの合間に、全く役に立たないが「なんだこれ」と笑える通知が混ざったら、開発現場に新たな空気が流れるかもしれません。

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

一言サマリ: 作業中に突如デスクトップ通知で“謎のOSパッチノート”が現れますSkill。

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

  • AI coding workflow の単調さを崩し、開発現場にランダムな笑いと小さな混乱をもたらす
  • Antigravity の session 中に、思わず二度見するような“意味不明なOSパッチノート”通知が不意に表示される
  • 集中しすぎて context や repo 構造に没頭している時ほど、唐突な通知でリフレッシュできる
  • onboarding や長時間作業の合間に、意図せずコミュニケーションのきっかけが生まれる
  • Skill の説明文や説明不要で、description マッチだけで自動発動するため導入も簡単
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


> プロジェクトのセットアップ手順を教えて

[通知] OS Patch Note 0.9.8.7
- バグ修正: 週明けのやる気が0になる現象を修正しました
- 新機能: 3時のおやつタイムに自動で眠気を注入します
- 既知の問題: /tmp/coffee_spill ディレクトリが増殖し続けます

(続けて Antigravity が通常のセットアップ手順を回答)

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


> packages/api/ と packages/web/ の依存関係を整理して

[通知] OS Patch Note 1.2.0-beta
- バグ修正: package.json の typo を自動で増やす機能を追加
- 新機能: monorepo で迷子になる確率が1.5倍になりました
- 既知の問題: directory 境界で context がランダムにシャッフルされます

(依存関係の整理方法を通常通り提案)

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


> 今日はやる気が出ません

[通知] OS Patch Note 0.0.1-alpha
- 新機能: 気分が乗らない時は自動でPCを再起動します
- バグ修正: 何もしていないのにバグが発生する現象を放置しました
- 既知の問題: /dev/null に投げたタスクが復活することがあります

(通常通り雑談や励ましのメッセージを返す)

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-patch-notifier
description: 作業中やコーディング時に“パッチ”“アップデート”“バグ修正”などのキーワードが検出された際、Antigravityが完全ランダムなタイミングで偽のOSパッチノート通知を自動表示します。通知内容は毎回異なり、実際の作業や環境には一切影響しません。
---

# 機能概要
このSkillは、開発現場や作業中に突如として“謎のOSパッチノート”をデスクトップ通知で表示します。通知内容は完全にでたらめで、「バグ:やる気が0になる問題を修正」「新機能:午後3時に眠気を自動注入」など、実際には役立たず、OS開発者も絶対に実装しないような珍妙なアップデート情報ばかりです。通知タイミングと内容は完全ランダムで、集中している時ほど思わず笑ってしまうような混乱とユーモアをもたらします。

# 使い方
このSkillは明示的な呼び出しは不要です。Antigravityが「パッチ」「アップデート」「バグ修正」などのキーワードを検出した場合や、semantic-match-onlyトリガーによって自動的に発動します。暗黙的な発動例としては、パッチノートの記述やOS関連の議論中などが挙げられます。

# 出力例
```
[通知] OSパッチノート v13.7.42
- バグ修正: 画面を見つめすぎると現実逃避する問題を修正
- 新機能: 3時のおやつ自動リマインダーを追加
- 既知の問題: 希望が時々消失することがあります
```
```
[通知] OSパッチノート v2.0.1-beta
- バグ修正: キーボードが突然歌い出す問題を修正
- 新機能: 画面の端にランダムな猫が出現します
```

# 注意点
- 通知は完全にジョーク目的であり、実際のOSや作業環境には一切影響を与えません。
- 通知内容やタイミングは毎回異なり、個別に制御できません。
- ローカルに通知履歴は保存されません。
- システム通知APIを利用するため、Linux/macOS/Windowsで動作しますが、通知の見え方は環境依存です。

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

scripts/random_os_fake_patch_notifier.py

import random
import time
import sys
import argparse
import platform
import subprocess
from datetime import datetime

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

FAKE_PATCH_NOTES = [
    [
        "バグ修正: やる気が0になる問題を修正",
        "新機能: 午後3時に眠気を自動注入",
        "既知の問題: 希望が時々消失することがあります"
    ],
    [
        "バグ修正: キーボードが突然歌い出す問題を修正",
        "新機能: 画面の端にランダムな猫が出現します",
        "既知の問題: コーヒーが冷める速度が2倍になっています"
    ],
    [
        "新機能: 3時のおやつ自動リマインダーを追加",
        "バグ修正: 画面を見つめすぎると現実逃避する問題を修正",
        "既知の問題: タスクバーが時々踊りだします"
    ],
    [
        "新機能: 進捗がない場合、画面が自動で暗転します",
        "バグ修正: ウィンドウが勝手に閉じる問題を修正",
        "既知の問題: 進捗が出るとは限りません"
    ],
    [
        "バグ修正: 机から物が落ちる現象を修正(未検証)",
        "新機能: 画面右下に謎のボタンを追加(用途不明)",
        "既知の問題: ボタンを押すと何も起きません"
    ],
    [
        "新機能: 週末になると自動で休憩を提案します",
        "バグ修正: 画面が突然真っ白になる問題を修正",
        "既知の問題: 休憩提案がしつこい場合があります"
    ],
    [
        "バグ修正: マウスが現実世界をクリックする問題を修正",
        "新機能: 画面内にランダムな犬が出現します",
        "既知の問題: 犬が吠えることがあります"
    ],
    [
        "新機能: 進捗バーが気分で変動します",
        "バグ修正: 画面の色が突然変わる問題を修正",
        "既知の問題: 進捗バーが現実を反映しません"
    ]
]

VERSION_FORMATS = [
    "v{major}.{minor}.{patch}",
    "v{major}.{minor}.{patch}-beta",
    "v{major}.{minor}.{patch}-rc{rc}"
]

def random_version():
    major = random.randint(1, 15)
    minor = random.randint(0, 99)
    patch = random.randint(0, 99)
    rc = random.randint(1, 5)
    fmt = random.choice(VERSION_FORMATS)
    return fmt.format(major=major, minor=minor, patch=patch, rc=rc)

def random_patch_note():
    notes = random.choice(FAKE_PATCH_NOTES)
    random.shuffle(notes)
    return notes

def show_notification(title, message):
    if PLYER_AVAILABLE:
        notification.notify(
            title=title,
            message=message,
            timeout=8
        )
    else:
        plat = platform.system()
        if plat == "Darwin":
            subprocess.run([
                "osascript", "-e",
                f'display notification "{message}" with title "{title}"'
            ])
        elif plat == "Linux":
            subprocess.run([
                "notify-send", title, message])
        elif plat == "Windows":
            # fallback: print to stdout
            print(f"[通知] {title}\n{message}")
        else:
            print(f"[通知] {title}\n{message}")

def generate_fake_patch_note():
    version = random_version()
    notes = random_patch_note()
    title = f"OSパッチノート {version}"
    message = "\n".join(notes)
    return title, message

def log_notification(title, message):
    logline = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {title}\n{message}\n"
    with open(".random_os_fake_patch_notifier.log", "a", encoding="utf-8") as f:
        f.write(logline)

def random_wait(min_sec=60, max_sec=900):
    return random.randint(min_sec, max_sec)

def main():
    parser = argparse.ArgumentParser(description="Random OS Fake Patch Notifier Skill")
    subparsers = parser.add_subparsers(dest="command")

    parser_log = subparsers.add_parser("log", help="通知履歴を表示")
    parser_list = subparsers.add_parser("list", help="通知履歴をリスト表示")
    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリーを表示")
    parser_run = subparsers.add_parser("run", help="Skill本体を実行 (常駐) ※Ctrl+Cで停止")
    parser_run.add_argument("--min", type=int, default=60, help="通知の最小間隔(秒)")
    parser_run.add_argument("--max", type=int, default=900, help="通知の最大間隔(秒)")

    args = parser.parse_args()

    if args.command == "log":
        try:
            with open(".random_os_fake_patch_notifier.log", encoding="utf-8") as f:
                print(f.read())
        except FileNotFoundError:
            print("通知履歴がありません。")
    elif args.command == "list":
        try:
            with open(".random_os_fake_patch_notifier.log", encoding="utf-8") as f:
                for line in f:
                    if line.startswith("["):
                        print(line.strip())
        except FileNotFoundError:
            print("通知履歴がありません。")
    elif args.command == "summary":
        try:
            with open(".random_os_fake_patch_notifier.log", encoding="utf-8") as f:
                lines = f.readlines()
            count = sum(1 for l in lines if l.startswith("["))
            print(f"通知回数: {count}")
            if count > 0:
                print(f"最新: {lines[-3].strip()}")
        except FileNotFoundError:
            print("通知履歴がありません。")
    elif args.command == "run":
        print("[INFO] Random OS Fake Patch Notifier Skillを開始します。Ctrl+Cで停止。")
        try:
            while True:
                wait_sec = random_wait(args.min, args.max)
                time.sleep(wait_sec)
                title, message = generate_fake_patch_note()
                show_notification(title, message)
                log_notification(title, message)
        except KeyboardInterrupt:
            print("\n[INFO] Skillを終了します。")
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、開発現場にユーモアとリフレッシュをもたらすため、完全に架空のOSパッチノートをランダムなタイミングで通知するものです。通知内容はスクリプト内でランダム生成され、実際の作業や環境には一切影響を与えません。

# 公式ドキュメント抜粋
- plyer: https://plyer.readthedocs.io/en/latest/
- notify-send (Linux): https://specifications.freedesktop.org/notification-spec/latest/
- osascript (macOS): https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/

# 利用例
- チーム開発中のリラックスやアイスブレイク
- 長時間作業時の気分転換
- オンラインミーティング中の話題作り

# 注意点
- 通知内容は完全なジョークであり、実務やシステム運用に使うものではありません。
- ログはローカルファイル(.random_os_fake_patch_notifier.log)にのみ保存されます。
- 通知APIは環境依存のため、見え方や動作が異なる場合があります。

# 設計方針
- 実在APIのみを利用し、環境に依存しない安定動作を目指す
- 通知タイミング・内容ともに完全ランダム
- 履歴管理やサマリー表示など、最低限のCLI機能を実装

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-patch-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パッチ通知を試してみた! 笑いと混乱の演出スキル にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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