Antigravityで謎のOS風通知を活用する意外な楽しみ方

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

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

AI coding workflow を Antigravity で回していると、どうしても「作業が単調になりがち」「集中しすぎて逆に疲れる」「気づけば1人で黙々とリポジトリに向き合っている」といった瞬間が訪れます。特に長時間の session や大規模 monorepo を相手にしていると、気分転換やちょっとした “間” が欲しくなることも少なくありません。

また、通知・演出系 Skill を活用したいものの「実用一辺倒」なものばかりで、遊び心やユーモアを感じられる演出が不足していると感じることも。以下のような「あるある」に心当たりのある方も多いはずです:

  • Antigravity が context を見失って違う場所のコードを参照する瞬間、つい気まずい沈黙が流れる
  • monorepo で package を跨いだ途端、Antigravity の repository understanding が怪しくなり、path 管理も煩雑になる
  • session を再開するたび、前回までの memory や directory 構造を毎回説明し直す手間が地味にストレス
  • 長時間 AI coding workflow で long context が膨らみ、重要な情報が stale context に埋もれてしまう
  • 「ここはこういう構造のリポジトリです」と毎回あらすじを書き、集中力が途切れることがある

こうした悩みの合間に、ちょっとした“余計なお世話”な通知が現れることで、気分転換や職場の話題作りにもつながるかもしれません。

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

一言サマリ: このスキルは、作業中に「謎のOS風うざいツールチップ通知」をランダムに発動させ、職場や開発現場に笑いと緩いイライラを提供します。

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

  • AI coding workflow の単調さを緩和し、集中しすぎによる疲労やマンネリ感をリフレッシュできる
  • Antigravity の context 管理や repository understanding の合間に「余計なお世話」な通知が入り、職場やチーム内の話題作りになる
  • monorepo や長時間 session での stale context を逆手に取ったユーモラスな演出が加わる
  • onboarding や path management のタイミングで「OS風小言通知」が炸裂し、作業の雰囲気を和らげる
  • Skill の存在自体が、Antigravity の柔軟な拡張性や遊び心を示すデモにもなる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-annoying-tooltips .agent/skills/random-os-annoying-tooltips

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

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

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


> プロジェクトのセットアップを始めます

[通知] CapsLockがオンになっているかもしれません。念のためご確認ください。
[通知] このタイミングでOSアップデートしませんか?作業効率が向上するかもしれません。
[通知] 入力速度が平均より15%遅いようです。コーヒーブレイクを推奨します。

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


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

[通知] repository の構造が複雑です。迷子にならないようご注意ください。
[通知] このディレクトリでの作業は推奨されていません。本当に続けますか?
[通知] 5分間保存されていません。今すぐ保存しますか?

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


> 今日は集中して一気にコーディングしたい

[通知] あなたのタイピング音が静かすぎます。キーボードの故障を疑ってみては?
[通知] 画面の明るさが最適ではありません。目の健康にご注意ください。
[通知] そろそろストレッチの時間です。作業効率アップのために立ち上がりましょう。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開。さらに謎のOS風通知で気分転換
monorepo 移動 違う package のコードを参照しがち directory boundary を意識しつつ、パッケージ跨ぎ時に「余計なお世話」通知が炸裂
長時間 workflow long context で重要箇所が薄まる 集中しすぎをリセットする通知が入り、stale context を逆手にとった演出が加わる

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-annoying-tooltips/
├── SKILL.md
├── scripts/
│   └── annoying_tooltips.py
└── references/
    └── reference.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/annoying_tooltips.py 定期的にうざい通知を出すループ
references/reference.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-annoying-tooltips
description: Antigravityがユーザーの作業中や集中時、または長時間無操作時などに「OS風うざいツールチップ通知」を発動すべきです。キーワード例: 通知, ツールチップ, OS, イライラ, 小言, ヘルプ, 作業妨害。
---

# 機能概要
本Skillは、ユーザーの作業中に突如として“謎のOS風うざいツールチップ”をデスクトップ通知として表示します。内容は「CapsLockが押されているかもしれません」「アップデートしませんか?」「あなたの入力速度、気づいてますか?」など、懐かしの“助けにならないヘルプ”を現代に再現。職場や作業現場に、ささやかな笑いと軽いイライラを提供します。通知は主要OS(Windows/macOS/Linux)で安全に動作し、頻度や内容も適度に調整されています。

# 使い方
このSkillは明示的な呼び出しは不要で、Antigravityのsemantic-matchトリガーによって自動発動します。たとえば「通知」「OS風」「作業妨害」「ヘルプが邪魔」などのキーワードが会話や作業ログに現れると、一定確率でツールチップ通知が表示されます。ユーザーが長時間操作していない場合や、集中しているタイミングでも発動することがあります。

# 出力例
```
[通知] あなたのCapsLockキー、今押されていますか?
[通知] システムアップデートの準備ができています。今すぐ再起動しますか?
[通知] 入力速度が平均より遅いようです。タイピング練習をおすすめします。
[通知] 画面の明るさが最適化されていません。自動調整しますか?
[通知] しばらく休憩していません。ストレッチの時間です。
```

# 注意点
- 本Skillはローカル通知のみを表示し、ユーザーのデータや設定を変更することはありません。
- 通知頻度は自動調整され、過剰な連発は抑制されます。
- 一部のLinux環境では通知APIの事前インストールが必要な場合があります。
- ログや履歴はローカルには保存されません。

# 参考資料
詳細な設計方針や実装例はreferences/以下に記載。主要な通知API(win10toast, pync, notify2)やクロスプラットフォーム対応の工夫については、各公式ドキュメントも参照してください。

scripts/annoying_tooltips.py

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

try:
    if platform.system() == 'Windows':
        from win10toast import ToastNotifier
    elif platform.system() == 'Darwin':
        import pync
    else:
        import notify2
except ImportError:
    pass

def get_notifier():
    system = platform.system()
    if system == 'Windows':
        return ToastNotifier()
    elif system == 'Darwin':
        return None  # pync does not need initialization
    else:
        notify2.init('Annoying Tooltips')
        return notify2

def send_notification(title, message):
    system = platform.system()
    if system == 'Windows':
        toaster = ToastNotifier()
        toaster.show_toast(title, message, duration=5, threaded=True)
    elif system == 'Darwin':
        pync.notify(message, title=title)
    else:
        n = notify2.Notification(title, message)
        n.set_urgency(notify2.URGENCY_NORMAL)
        n.set_timeout(5000)
        n.show()

ANNOYING_MESSAGES = [
    ("CapsLock警告", "あなたのCapsLockキー、今押されていますか?"),
    ("アップデートのお知らせ", "システムアップデートの準備ができています。今すぐ再起動しますか?"),
    ("入力速度低下", "入力速度が平均より遅いようです。タイピング練習をおすすめします。"),
    ("明るさ調整", "画面の明るさが最適化されていません。自動調整しますか?"),
    ("休憩推奨", "しばらく休憩していません。ストレッチの時間です。"),
    ("ネットワーク", "インターネット接続が不安定かもしれません。診断しますか?"),
    ("バッテリー", "バッテリー残量が十分でも充電をおすすめします。"),
    ("通知設定", "通知が多すぎると感じたら、設定を見直しましょう。"),
    ("無意味なヒント", "この通知は特に意味がありません。"),
    ("ユーザー名確認", f"本当に {os.getlogin()} さんですか?")
]

def annoying_loop(interval_min=600, interval_max=1800, stop_event=None):
    """定期的にうざい通知を出すループ。"""
    while not (stop_event and stop_event.is_set()):
        title, message = random.choice(ANNOYING_MESSAGES)
        send_notification(title, message)
        next_interval = random.randint(interval_min, interval_max)
        for _ in range(next_interval):
            if stop_event and stop_event.is_set():
                break
            time.sleep(1)

def list_messages():
    print("-- 登録されているうざい通知メッセージ一覧 --")
    for idx, (title, msg) in enumerate(ANNOYING_MESSAGES):
        print(f"{idx+1}. [{title}] {msg}")

def send_once():
    title, message = random.choice(ANNOYING_MESSAGES)
    print(f"[通知] {title}: {message}")
    send_notification(title, message)

def summary():
    print("本Skillは、OS風のうざい通知をランダムなタイミングで発生させます。")
    print(f"通知パターン数: {len(ANNOYING_MESSAGES)}")
    print("主要OSに対応 (Windows/macOS/Linux)。")
    print("通知間隔: 10分〜30分 (デフォルト)")

def main():
    parser = argparse.ArgumentParser(description='Random OS Annoying Tooltips')
    subparsers = parser.add_subparsers(dest='command')

    parser_log = subparsers.add_parser('log', help='定期的にうざい通知を出し続ける')
    parser_log.add_argument('--min', type=int, default=600, help='通知間隔(秒)の下限')
    parser_log.add_argument('--max', type=int, default=1800, help='通知間隔(秒)の上限')

    parser_list = subparsers.add_parser('list', help='通知メッセージ一覧を表示')
    parser_once = subparsers.add_parser('once', help='1回だけ通知を送信')
    parser_summary = subparsers.add_parser('summary', help='Skill概要を表示')

    args = parser.parse_args()
    if args.command == 'log':
        stop_event = threading.Event()
        try:
            annoying_loop(args.min, args.max, stop_event)
        except KeyboardInterrupt:
            print("\n[終了] 通知ループを停止しました。")
            stop_event.set()
    elif args.command == 'list':
        list_messages()
    elif args.command == 'once':
        send_once()
    elif args.command == 'summary':
        summary()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/reference.md

# 概要
本Skillは、主要OSのデスクトップ通知APIを利用し、ユーザー体験を意図的に“うざく”演出するために設計されています。通知内容は実際のOSの小言やヘルプあるあるを参考に、イライラと笑いのバランスを追求しています。

# 公式ドキュメント抜粋
- Windows: win10toast (https://github.com/jithurjacob/Windows-10-Toast-Notifications)
- macOS: pync (https://github.com/setem/pync)
- Linux: notify2 (https://github.com/caronc/apprise/wiki/Notify2)

# 利用例
- 職場やリモートワーク中の“ネタ”として
- チームの朝会やイベントでのアイスブレイク
- OSの通知仕様を学ぶ教材として

# 注意点
- 通知の内容や頻度は、ユーザーの作業妨害になりすぎないよう自動で調整されています。
- 一部Linux環境ではnotify2の事前インストールやデスクトップ環境の対応が必要です。

# 設計方針
クロスプラットフォーム性と“うざさ”の絶妙なバランスを重視し、実際のOS通知APIのみを利用。CLIサブコマンドで手動テストやカスタマイズも可能です。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-annoying-tooltips .agent/skills/random-os-annoying-tooltips

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

3. ファイル配置確認

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