Antigravityで作業中のサボりを楽しく通知する方法【発見】

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

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

Antigravity を使っていると、AI coding workflow の中で「ちょっと席を外した」「別の作業に気を取られた」瞬間に context や repository understanding が途切れてしまうことがよくあります。特に monorepo や大型リポジトリでは、directory や path management が煩雑になり、AI側の context memory もロストしがちです。

また、session を再開したときには、前回の流れや重要な repo 構造を再び説明し直す必要があり、長時間作業や onboarding のたびに同じ説明を繰り返すことにストレスを感じるユーザーも多いはずです。そんな時、ふと席を立ったり、うっかり操作を忘れてしまい、workflow が中断されるのは「あるある」な悩みです。

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

さらに、通知や演出面で「集中力が切れた瞬間」を可視化したい、職場でちょっとした話題や笑いを作りたい、というニーズも見逃せません。AIとのやり取りが単調になりがちな中、ユーモアを交えた演出が欲しいという声も増えています。

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

一言サマリ: このスキルは「操作が30秒以上止まると、Antigravity が“OSお昼寝検出アラート”をランダムなツッコミ通知で炸裂させる」Skill。

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

  • AI coding workflow の停滞や context ロストを「ネタ通知」で即座に気付けるようになり、作業リズムを維持しやすくなる
  • repository understanding の途切れを、ユーモラスなアラートで可視化できるため、職場やチーム内で話題作りや onboarding のきっかけになる
  • monorepo での directory や path management の中断タイミングを、遊び心のある通知で演出できる
  • Antigravity の長時間 session で long context が薄まる場面も、気まずい空気を和らげてくれる
  • 単調な作業や集中力低下のタイミングを、毎回違う notification で笑いに変えることができる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# session 開始後、しばらく無操作 (30秒経過)
> 

[Antigravity OS Nap Detection Alert]
検出:うたた寝モード突入
ヒント: 夢の中で main.py のバグ修正はできません。
(作業を再開するとアラートは自動解除されます)

# ターミナル通知と同時に、デスクトップにもポップアップ

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


# packages/core/ から packages/utils/ へ移動し、手が止まる
> 

[Antigravity OS Nap Detection Alert]
OS推奨:夢の中で packages/utils/ のリファクタリングを実施中…
警告: directory structure の記憶が薄れてきています。
(操作再開で context 復元)

# 毎回通知内容がランダムに変化

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


# チームミーティング中に放置
> 

[Antigravity OS Nap Detection Alert]
睡眠ログをクラウドにアップロード中…
次回は AI が代理でコミットしますか?
(通知を閉じるには何らかの操作をしてください)

# 職場の雰囲気が一瞬和む

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる お昼寝アラートで workflow の停滞を即座に認識できる

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-nap-detection-alert/
├── SKILL.md
├── scripts/
│   └── nap_detection_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/nap_detection_alert.py OSお昼寝検出アラート (random-os-nap-detection-alert)
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-nap-detection-alert
description: ユーザーが30秒以上コマンド入力や編集操作を行わずにアイドル状態になった場合に発動。"無操作", "サボり", "お昼寝", "idle", "nap", "通知" などのキーワードを含む状況で自動発動。
---

# 機能概要
このSkillは、ユーザーがコマンド操作やエディタ編集などの作業を30秒以上行わずに放置した場合、ユーモラスな“OSお昼寝検出アラート”をデスクトップ通知またはターミナル出力で発動します。通知内容は毎回ランダムで、「検出:うたた寝モード突入」「OS推奨:夢の中でバグ修正」など、絶妙なツッコミが炸裂。集中力が切れがちな時や、職場でちょっとした笑いを誘いたいときに最適な完全ネタ系Skillです。作業の中断を可視化し、気まずさやリフレッシュのきっかけを演出します。

# 使い方
このSkillは常時監視型で、明示的な呼び出しは不要です。"無操作", "idle", "お昼寝", "nap", "通知" などのキーワードを含む状況や、30秒以上のアイドル状態を自動検知して発動します。Antigravityエージェントがコマンド受付やエディタ入力を監視し、トリガー条件を満たすと自動的に通知を表示します。

# 出力例
```
[OSお昼寝検出アラート]
検出:うたた寝モード突入
(30秒以上無操作を検出しました)

[OSお昼寝検出アラート]
OS推奨:夢の中でバグ修正
(しばらく作業が止まっています)

[OSお昼寝検出アラート]
睡眠ログをクラウドにアップロード中
(操作再開で解除されます)
```

# 注意点
- 本Skillは完全にジョーク用途であり、作業内容やファイルには一切影響を与えません。
- 通知内容はランダム生成されますが、個人情報や実際の作業内容は含まれません。
- デスクトップ通知はOSの通知API(例: notify-send, win10toast, pync)を利用します。
- ローカル環境でのみ動作し、クラウドへのデータ送信は行いません。

# 参考資料
- references/design_notes.md
- https://docs.python.org/ja/3/library/time.html
- https://pypi.org/project/pync/
- https://pypi.org/project/win10toast/

scripts/nap_detection_alert.py

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

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

NAP_MESSAGES = [
    "検出:うたた寝モード突入",
    "OS推奨:夢の中でバグ修正",
    "睡眠ログをクラウドにアップロード中",
    "メモリ開放中:夢の世界へ",
    "CPUアイドル:まどろみモード",
    "プロセス休止:再起動は夢のあとで",
    "OS診断:気まずさ指数MAX",
    "バックグラウンドで羊をカウント中",
    "仮想メモリ:睡眠領域確保完了",
    "システム推奨:おやつタイム"
]

class NapDetectionAlert:
    def __init__(self, idle_seconds=30, check_interval=1):
        self.idle_seconds = idle_seconds
        self.check_interval = check_interval
        self.last_active = time.time()
        self.running = False
        self._lock = threading.Lock()
        self._alert_thread = None
        self._input_thread = None
        self._notified = False
        self._platform = platform.system()
        if self._platform == 'Windows':
            self._toaster = ToastNotifier()

    def reset_timer(self):
        with self._lock:
            self.last_active = time.time()
            self._notified = False

    def _notify(self, message):
        title = "OSお昼寝検出アラート"
        if self._platform == 'Darwin':
            try:
                pync.notify(message, title=title)
            except Exception:
                print(f"[{title}]\n{message}")
        elif self._platform == 'Linux':
            try:
                subprocess.run(['notify-send', title, message])
            except Exception:
                print(f"[{title}]\n{message}")
        elif self._platform == 'Windows':
            try:
                self._toaster.show_toast(title, message, duration=5, threaded=True)
            except Exception:
                print(f"[{title}]\n{message}")
        else:
            print(f"[{title}]\n{message}")

    def _alert_loop(self):
        while self.running:
            time.sleep(self.check_interval)
            with self._lock:
                idle_time = time.time() - self.last_active
                if idle_time >= self.idle_seconds and not self._notified:
                    msg = random.choice(NAP_MESSAGES)
                    detail = f"({int(idle_time)}秒以上無操作を検出しました)"
                    self._notify(f"{msg}\n{detail}")
                    self._notified = True

    def _input_monitor(self):
        while self.running:
            try:
                # 非ブロッキングで入力を監視
                if sys.stdin in select.select([sys.stdin], [], [], 0.1)[0]:
                    _ = sys.stdin.readline()
                    self.reset_timer()
            except Exception:
                time.sleep(0.1)

    def start(self):
        self.running = True
        self._alert_thread = threading.Thread(target=self._alert_loop, daemon=True)
        self._alert_thread.start()
        if sys.stdin.isatty():
            import select
            self._input_thread = threading.Thread(target=self._input_monitor, daemon=True)
            self._input_thread.start()
        else:
            # 非対話環境では入力監視せず、API経由でreset_timer()を呼ぶ想定
            pass
        try:
            while self.running:
                time.sleep(0.2)
        except KeyboardInterrupt:
            self.running = False
            print("\n[終了] お昼寝検出アラートを停止しました。")

    def log(self):
        print(f"[log] 最終アクティブ時刻: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.last_active))}")

    def summary(self):
        print(f"[summary] 無操作検出閾値: {self.idle_seconds}秒\n現在プラットフォーム: {self._platform}")


def main():
    parser = argparse.ArgumentParser(description='OSお昼寝検出アラート (random-os-nap-detection-alert)')
    subparsers = parser.add_subparsers(dest='command')

    parser_run = subparsers.add_parser('run', help='お昼寝検出アラートを起動')
    parser_run.add_argument('--idle', type=int, default=30, help='無操作と判定する秒数 (デフォルト30)')

    parser_log = subparsers.add_parser('log', help='最終アクティブ時刻を表示')
    parser_summary = subparsers.add_parser('summary', help='設定概要を表示')

    args = parser.parse_args()
    detector = NapDetectionAlert(idle_seconds=getattr(args, 'idle', 30))

    if args.command == 'run':
        detector.start()
    elif args.command == 'log':
        detector.log()
    elif args.command == 'summary':
        detector.summary()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、ユーザーの無操作状態(アイドル)を30秒間検知し、デスクトップ通知やターミナル出力でユーモラスなアラートを表示するジョーク系ツールです。作業の中断を可視化し、気まずさやリフレッシュのきっかけを演出します。

# 公式ドキュメント抜粋
- Python 標準ライブラリ: time, threading, argparse
- OS通知: pync(Mac), notify-send(Linux), win10toast(Windows)

# 利用例
- 長時間作業中に集中力が切れた時のリマインダー
- チームや職場でのネタ・アイスブレイク用途
- コマンドラインやエディタの無操作検出

# 注意点
- 本Skillはファイルや環境に一切影響を与えません
- 通知内容はランダム生成で、実際の作業や個人情報は含まれません
- クラウド送信やログ保存は行いません

# 設計方針
- クロスプラットフォームな通知API利用
- ジョーク用途に徹し、実害ゼロを保証
- CLIサブコマンドでlog/summaryもサポート

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-nap-detection-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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 30秒程度の無操作で正しく通知されるか、通知内容が毎回ランダムで変わるか、データ損失や環境破壊が一切発生しないか

実際に Antigravity で試した検証ログは Antigravityの謎の“お昼寝検出”通知を30秒放置で試してみた にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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