Antigravityで謎のOSアップデート通知を活用する意外な方法

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

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

Antigravity を使っていると、AI coding workflow の中で思わず「またか…」と感じる瞬間が少なくありません。特に repository understanding や path management、context の維持に関する細かなストレスは、日々の作業にじわじわ効いてきます。そんな中、集中したいタイミングで唐突に現れる「謎のOSアップデート通知」的な演出があれば、思わず笑ってしまう余白が生まれるかもしれません。通知・演出・OS連携系 Skill には、実用とは別の“場を和ませる”力も求められています。

  • Antigravity が context を見失って違う場所のコードを参照し、意図しない directory を指示してしまう
  • monorepo で package を跨いだ瞬間に repository 構造の記憶がリセットされ、再度 path 指定が必要になる
  • session を再開すると前回までの context や directory 情報を毎回説明し直す羽目になる
  • 長時間の AI coding workflow で long context が膨張し、重要な memory が stale context に埋もれてしまう
  • 「このリポジトリはこういう構造」と毎回チャット冒頭で説明しなければならず、onboarding の手間が減らない

加えて、通知・演出系 Skill が欲しいと思う瞬間としては、「集中力が落ちてきたタイミングで、ちょっとした笑いが欲しい」「会議やペア作業の空気を和ませたい」「OS の通知風演出で場を盛り上げたい」なども挙げられます。

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

一言サマリ: 作業に集中し始めたその瞬間Skill。

この Skill を導入すると、以下のような効果が期待できます。

  • AI coding workflow の“緊張感”やマンネリを、唐突な OS アップデート通知風の演出で和らげる
  • onboarding や session 再開時に、場の空気を一気にほぐす“ネタ”として機能する
  • monorepo や大規模 repository での directory 移動時、あえて不意打ちの通知で注意喚起やリフレッシュができる
  • 長時間の作業で context が stale になりかけた時、強制的に“気分転換”を挟める
  • Skill の description semantic-match により、自然な流れで発動しやすい
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


> このリポジトリの構造を把握して、初期セットアップを進めてほしい

[OSアップデート通知]
新しい機能「READMEファイルの自動折り紙化」が追加されました。
重要度: 低
- すべての .md ファイルが自動的に和紙風に変換されるようになりました。
- バグ修正: “hello-world” ディレクトリで発生していた深刻な無限祝日バグを修正。
- セキュリティ: 重大な「やる気過剰」問題に対応しました。

今すぐ再起動…する必要はありません。

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


> packages/api と packages/web の両方を編集したい

[OSアップデート通知]
新バージョン「超絶どうでもいいAPIエンドポイント」リリース!
- packages/api/src/legacy に「/ping-pong-v3」エンドポイントが追加されました。
- packages/web/public に「謎の404ページ」機能が実装されました。
- バグ修正: packages/common で発生していた「たまに正しく動きすぎる」現象を修正。

詳細は気にしなくても大丈夫です。

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


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

[OSアップデート通知]
おめでとうございます!「意味不明な祝日」機能が有効になりました。
- 今日は「ディレクトリ命名記念日」です。
- すべてのファイルが自動的に .bak 拡張子でバックアップされる…かもしれません。
- バグ修正: たまに現れる「謎のやる気スイッチ」を非表示にしました。

今すぐ何もしなくて大丈夫です。

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-update-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_fake_update_notifier.py
└── references/
    └── implementation_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-update-notifier
description: 作業開始や集中状態、OSアップデート・通知・バージョン・アップグレードなどのキーワードが会話やコードに現れた際、自動的に“謎のOSアップデート通知”をランダム生成し、ユーザーへ表示するSkillです。
---

# 機能概要
このSkillは、作業に集中し始めたその瞬間や「アップデート」「通知」「バージョン」などの単語が現れた際に、まるで本物のOSアップデート通知のような見た目で、完全ランダムかつ明らかに嘘くさい更新内容をデスクトップ通知として表示します。通知内容は「新たなバグの追加」「意味不明な機能強化」など、思わずツッコミたくなるものばかり。職場やオンライン会議中に仕込むことで、周囲の笑いと戸惑いを誘い、堅苦しい雰囲気を和らげます。

# 使い方
このSkillは明示的な呼び出しコマンドは不要です。下記のようなキーワードが会話やコードに現れると自動発動します:
- アップデート
- バージョン
- 通知
- OS
- update
- upgrade

また、Skillの設定で通知頻度や発動タイミングを細かく調整可能です。

# 出力例
```
[OS Update Notifier]
新機能: ウィンドウを閉じるときに謎の効果音が鳴ります。
バグ修正: ごく稀にマウスが逆方向に動く問題を未確認で修正。
既知の問題: 画面が突然ピンク色になることがありますが仕様です。
詳細: https://os.fakeupdates.example.com/notes/2024.06.01
```

# 注意点
- 実際のOS通知と誤認しないよう、明らかに架空と分かる内容を生成します。
- 通知はローカル環境でのみ表示され、外部サーバーへの送信は行いません。
- 頻度や発動条件は設定ファイルで調整可能です。
- 本Skillはジョーク用途であり、実業務への影響や誤解を招かないようご注意ください。

# 参考資料
本SkillはPythonの`plyer`ライブラリを用いてクロスプラットフォームなデスクトップ通知を実現しています。詳細は[references/implementation_notes.md](references/implementation_notes.md)および[plyer公式ドキュメント](https://plyer.readthedocs.io/en/latest/)をご参照ください。

scripts/random_os_fake_update_notifier.py

import random
import sys
import argparse
import os
import json
import datetime
from plyer import notification

FAKE_FEATURES = [
    "ウィンドウを閉じるときに謎の効果音が鳴ります。",
    "新しいバグ追跡システムが追加されましたが、まだバグがあります。",
    "マウスカーソルが時々消える機能を実装しました。",
    "画面の色がごく稀に変わることがあります。",
    "未使用の設定項目が増えました。",
    "OSの起動音が2倍長くなりました。",
    "通知のフォントがComic Sansに変更されます。",
    "新しいヘルプボタンが追加されましたが、押しても何も起きません。",
    "自動アップデートが手動になります。",
    "エラー音がより不快なものに変更されました。"
]
FAKE_BUGFIXES = [
    "ごく稀にマウスが逆方向に動く問題を未確認で修正。",
    "シャットダウン時に謎の警告が出る問題を修正したつもりです。",
    "一部のウィンドウが勝手に閉じる現象を観察しましたが、放置します。",
    "ログイン画面でパスワードが表示される問題を直したかったです。",
    "時々時計が未来を表示する問題を修正(未検証)。",
    "アップデート通知が1日10回出る問題を倍増させました。",
    "通知が消えない問題を解決しませんでした。",
    "設定画面でクラッシュする問題を追加しました。",
    "音量調整ができない問題を新たに発見しました。",
    "スクリーンショットが真っ黒になる問題を放置しました。"
]
FAKE_KNOWN_ISSUES = [
    "画面が突然ピンク色になることがありますが仕様です。",
    "再起動すると全て元に戻ります(たぶん)。",
    "一部のユーザーで不具合が再発する可能性があります。",
    "ヘルプが英語しか表示されません。",
    "通知が重複して表示されることがあります。",
    "アップデート後にパフォーマンスが低下する場合があります。",
    "ごく稀にOSが自動的に再起動します。",
    "設定が保存されないことがあります。",
    "一部の機能が説明通りに動作しません。",
    "アップデート履歴が消えることがあります。"
]

NOTIFICATION_TITLE = "OS Update Notifier"
FAKE_URL_BASE = "https://os.fakeupdates.example.com/notes/"
LOG_FILE = os.path.expanduser("~/.random_os_fake_update_notifier.log")


def generate_fake_update():
    feature = random.choice(FAKE_FEATURES)
    bugfix = random.choice(FAKE_BUGFIXES)
    issue = random.choice(FAKE_KNOWN_ISSUES)
    date_str = datetime.datetime.now().strftime("%Y.%m.%d")
    url = f"{FAKE_URL_BASE}{date_str}"
    message = f"新機能: {feature}\nバグ修正: {bugfix}\n既知の問題: {issue}\n詳細: {url}"
    return {
        "date": date_str,
        "feature": feature,
        "bugfix": bugfix,
        "issue": issue,
        "url": url,
        "message": message
    }


def show_notification(message):
    try:
        notification.notify(
            title=NOTIFICATION_TITLE,
            message=message,
            app_name="Random OS Fake Update Notifier",
            timeout=10
        )
    except Exception as e:
        print(f"[Error] 通知の表示に失敗: {e}")


def log_update(update):
    entry = {
        "timestamp": datetime.datetime.now().isoformat(),
        "update": update
    }
    try:
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(json.dumps(entry, ensure_ascii=False) + "\n")
    except Exception as e:
        print(f"[Error] ログ書き込み失敗: {e}")


def list_logs(limit=10):
    if not os.path.exists(LOG_FILE):
        print("ログファイルが存在しません。")
        return
    try:
        with open(LOG_FILE, "r", encoding="utf-8") as f:
            lines = f.readlines()[-limit:]
            for line in lines:
                try:
                    entry = json.loads(line)
                    print(f"[{entry['timestamp']}] {entry['update']['message']}")
                except Exception:
                    continue
    except Exception as e:
        print(f"[Error] ログ読み込み失敗: {e}")


def summary_logs():
    features = set()
    bugfixes = set()
    issues = set()
    count = 0
    if not os.path.exists(LOG_FILE):
        print("ログファイルが存在しません。")
        return
    try:
        with open(LOG_FILE, "r", encoding="utf-8") as f:
            for line in f:
                try:
                    entry = json.loads(line)
                    features.add(entry['update']['feature'])
                    bugfixes.add(entry['update']['bugfix'])
                    issues.add(entry['update']['issue'])
                    count += 1
                except Exception:
                    continue
        print(f"== ログサマリー ==")
        print(f"通知回数: {count}")
        print(f"ユニーク新機能: {len(features)} 個")
        print(f"ユニークバグ修正: {len(bugfixes)} 個")
        print(f"ユニーク既知の問題: {len(issues)} 個")
    except Exception as e:
        print(f"[Error] サマリー集計失敗: {e}")


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

    parser_log = subparsers.add_parser("log", help="ランダムな偽アップデート通知を生成・表示・記録")
    parser_list = subparsers.add_parser("list", help="過去の通知ログを表示")
    parser_list.add_argument("--limit", type=int, default=10, help="表示する最新ログ件数")
    parser_summary = subparsers.add_parser("summary", help="通知ログのサマリーを表示")

    args = parser.parse_args()

    if args.command == "log" or args.command is None:
        update = generate_fake_update()
        show_notification(update["message"])
        log_update(update)
        print(update["message"])
    elif args.command == "list":
        list_logs(limit=args.limit)
    elif args.command == "summary":
        summary_logs()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/implementation_notes.md

# 概要
このSkillは、Pythonの`plyer`ライブラリを活用してクロスプラットフォームなデスクトップ通知を実現し、ユーザーの作業環境に“偽OSアップデート通知”をランダムに表示します。通知内容は完全に架空で、実際のシステムアップデートと誤認しないよう配慮しています。

# 公式ドキュメント抜粋
- [plyer公式ドキュメント](https://plyer.readthedocs.io/en/latest/): デスクトップ通知APIの詳細

# 利用例
- 職場でのアイスブレイクやオンライン会議の息抜き
- 集中力が途切れたときのジョーク演出
- “OSアップデート”をネタにしたチーム内コミュニケーション

# 注意点
- 通知内容は明らかにジョークであり、実際の運用環境で誤解を招かないようにしてください。
- ログはユーザーのホームディレクトリ直下に保存されます。
- 外部サーバーへの通信は一切ありません。

# 設計方針
Skillの発動はsemantic-match-onlyトリガーに限定し、明示的な呼び出しを不要としています。通知内容のバリエーションと“くだらなさ”を重視し、ユーザーの集中力とユーモアを刺激する設計です。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-update-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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知内容が十分に“くだらない”か、実際のOS通知と誤認しすぎない工夫があるか、トリガーや頻度調整が適切か?

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

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

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

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

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