Antigravityで作業効率を劇的に変える通知演出の活用法

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

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

Antigravity の AI coding workflow を日々使い込むほど、作業がルーチン化し、ちょっとした刺激や遊び心が欲しくなる瞬間が増えてきます。特に、長時間の repository understanding や path management、directory 構造の説明が繰り返される中で、気分転換やアイスブレイクがほしいと感じることも多いはずです。

「通知・演出・OS連携」カテゴリの悩みとして、次のような「あるある」が挙げられます:

  • Antigravity が context を見失って違う場所のコードを参照するたび、同じ説明を繰り返してマンネリ化する
  • monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れてしまい、また最初から onboarding する流れに飽きがくる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない単調さがストレスになる
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context) 状態で集中力が切れがち
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になり、作業が機械的になる

こうした「真面目なやりとりの連続」に、ちょっとした遊びやサプライズがほしくなるのは自然な流れです。

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

一言サマリ: あなたの作業がマンネリ化してきたらSkill。

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

  • AI coding workflow の単調な流れに、突如として「謎のウイルス検出アラート」などユーモアある通知が挟まることで、気分転換やリフレッシュになる
  • repository understanding や path management の繰り返し作業に、思わず笑ってしまうような演出が加わり、チーム内のコミュニケーションにもネタを提供できる
  • monorepo や長時間 session で stale context に陥りがちなタイミングでも、唐突な通知で集中力をリセットできる
  • OS の標準通知機能だけを使うため、環境構築の手間がなくすぐに導入・撤去できる
  • 本物と絶対に間違えないレベルのネタ通知なので、誤認や実害なく安心して利用できる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


# session開始時に自然言語で指示
> このリポジトリの構造を説明して

[通知] 危険:未知のバグウイルスを検出しました。
[通知] 詳細: src/utils/fake-virus.js に自己増殖型AIの痕跡を発見
[通知] 対策: コーヒーを淹れて深呼吸してください

Antigravity: リポジトリ構造を解析中です...
- src/
- tests/
- package.json
...

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


> packages/core/ から packages/ui/ に移動して context を切り替えて

[通知] 注意:あなたのコードが自我を持ちました。
[通知] packages/ui/components/AlertBox.tsx で「こんにちは」と喋り始めました
[通知] これはジョーク通知です。ご安心ください。

Antigravity: context を packages/ui/ に切り替えました。
- components/
- theme/
- index.ts
...

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


> なんか面白いことして

[通知] システム警告:AIが退屈しています!
[通知] 解決策: README.md に「AIにアイスを奢る」と書いてください
[通知] ※本通知はフィクションです

Antigravity: ちょっとした息抜きになりましたか?

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-virus-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_virus_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-virus-alert
description: 作業がルーチン化し集中力が低下した際や、長時間同じ作業を続けている場合に、AntigravityがこのSkillを発動します。キーワード例: "飽きた", "集中力低下", "作業マンネリ", "気分転換", "眠気", "刺激"。
---

# 機能概要
このSkillは、作業のマンネリ化や集中力の低下を感じたタイミングで、完全に架空の“ウイルス検出アラート”をデスクトップ通知として表示します。『危険:未知のバグウイルスを検出』『注意:あなたのコードが自我を持ちました』など、絶対に本物と誤認しないユーモア溢れる内容で、日常の作業に唐突なスパイスを加えます。通知はランダムなタイミング・内容で発動し、実害や悪質な動作は一切ありません。

# 使い方
このSkillは明示的な呼び出しを必要とせず、Antigravityが「飽きた」「集中力低下」「作業マンネリ」などのキーワードや状況を検知した際に自動で発動します。ユーザー操作やコマンド入力は不要です。

# 出力例
```
[デスクトップ通知]
タイトル: 危険:未知のバグウイルスを検出!
本文: あなたのコードが自我を持ち始めました。直ちにコーヒーを補給してください。

[デスクトップ通知]
タイトル: 注意:OSがAIに乗っ取られました
本文: これは冗談です。作業の合間に深呼吸しましょう。

[デスクトップ通知]
タイトル: 警告:メモリ内に謎の“やる気ウイルス”
本文: 影響はありません。気分転換にストレッチをおすすめします。
```

# 注意点
- 通知内容は全てジョークであり、実際のウイルス検出やシステム異常は一切発生しません。
- OS標準の通知APIのみを利用し、追加の環境構築や外部依存は不要です。
- 通知の頻度やタイミングは自動制御され、作業の妨げにならないよう配慮されています。
- ローカルファイルへの記録や履歴保存は行いません。

# 参考資料
詳細な設計方針や通知例は references/design_notes.md を参照してください。デスクトップ通知APIの公式情報は https://docs.python.org/ja/3/library/subprocess.html や https://docs.python.org/ja/3/library/platform.html をご覧ください。

scripts/random_os_fake_virus_alert.py

import sys
import os
import time
import random
import argparse
import platform
import subprocess
from threading import Thread

# --- 通知メッセージ集 ---
FAKE_ALERTS = [
    {
        'title': '危険:未知のバグウイルスを検出!',
        'body': 'あなたのコードが自我を持ち始めました。直ちにコーヒーを補給してください。'
    },
    {
        'title': '注意:OSがAIに乗っ取られました',
        'body': 'これは冗談です。作業の合間に深呼吸しましょう。'
    },
    {
        'title': '警告:メモリ内に謎の“やる気ウイルス”',
        'body': '影響はありません。気分転換にストレッチをおすすめします。'
    },
    {
        'title': 'システム警告:バグ感染の疑い',
        'body': '実害ゼロ。作業の手を止めて一息つきましょう。'
    },
    {
        'title': 'ウイルス警告:デバッグ魂感染',
        'body': 'この通知はジョークです。引き続き健全な開発を!'
    },
    {
        'title': '注意:コードが夜更かしを始めました',
        'body': 'そろそろ休憩しませんか?'
    },
    {
        'title': '警告:AIバグ検出',
        'body': 'この警告はフィクションです。安心して作業を続けてください。'
    },
    {
        'title': '危険:未知のやる気ウイルス',
        'body': '副作用:突然の集中力上昇。ジョーク通知です。'
    },
    {
        'title': '警告:OSが冗談モードに移行',
        'body': '今だけの限定通知。深呼吸してリフレッシュ!'
    },
    {
        'title': '注意:システムが笑いを検出',
        'body': 'この通知は本物ではありません。安心してください。'
    }
]

# --- OSごとの通知関数 ---
def notify_windows(title, body):
    try:
        import win10toast
        toaster = win10toast.ToastNotifier()
        toaster.show_toast(title, body, duration=6, threaded=True)
    except ImportError:
        # fallback: powershell
        ps_command = f'[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null;'
        ps_command += f'$template = [Windows.UI.Notifications.ToastTemplateType]::ToastText02;'
        ps_command += f'$xml = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent($template);'
        ps_command += f'$textNodes = $xml.GetElementsByTagName("text");'
        ps_command += f'$textNodes.Item(0).AppendChild($xml.CreateTextNode("{title}")) > $null;'
        ps_command += f'$textNodes.Item(1).AppendChild($xml.CreateTextNode("{body}")) > $null;'
        ps_command += f'$toast = [Windows.UI.Notifications.ToastNotification]::new($xml);'
        ps_command += f'$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("FakeVirusAlert");'
        ps_command += f'$notifier.Show($toast);'
        subprocess.run(["powershell", "-Command", ps_command], shell=True)


def notify_macos(title, body):
    script = f'display notification "{body}" with title "{title}"'
    subprocess.run(["osascript", "-e", script])


def notify_linux(title, body):
    try:
        subprocess.run(["notify-send", title, body])
    except Exception as e:
        print(f"[通知失敗] {e}")


def show_notification(title, body):
    sys_platform = platform.system()
    if sys_platform == 'Windows':
        notify_windows(title, body)
    elif sys_platform == 'Darwin':
        notify_macos(title, body)
    elif sys_platform == 'Linux':
        notify_linux(title, body)
    else:
        print(f"[通知] {title}: {body}")


def random_alert():
    alert = random.choice(FAKE_ALERTS)
    show_notification(alert['title'], alert['body'])


def alert_loop(min_interval=900, max_interval=2700, once=False):
    """
    min_interval, max_interval: 秒単位。15〜45分の間隔でランダム通知。
    once: Trueなら1回だけ通知。
    """
    if once:
        random_alert()
        return
    while True:
        wait = random.randint(min_interval, max_interval)
        time.sleep(wait)
        random_alert()


def list_alerts():
    print("--- サンプル通知一覧 ---")
    for i, alert in enumerate(FAKE_ALERTS):
        print(f"{i+1}. {alert['title']}\n   {alert['body']}\n")


def main():
    parser = argparse.ArgumentParser(description='完全ネタのOSウイルスアラート通知スクリプト')
    subparsers = parser.add_subparsers(dest='command')

    parser_once = subparsers.add_parser('once', help='1回だけ通知を表示')
    parser_loop = subparsers.add_parser('loop', help='ランダム間隔で通知を繰り返し表示')
    parser_loop.add_argument('--min', type=int, default=900, help='通知間隔(秒)の最小値(デフォルト900)')
    parser_loop.add_argument('--max', type=int, default=2700, help='通知間隔(秒)の最大値(デフォルト2700)')
    parser_list = subparsers.add_parser('list', help='通知メッセージ一覧を表示')

    args = parser.parse_args()
    if args.command == 'once':
        random_alert()
    elif args.command == 'loop':
        try:
            alert_loop(min_interval=args.min, max_interval=args.max)
        except KeyboardInterrupt:
            print("\n[終了] 通知ループを停止しました。")
    elif args.command == 'list':
        list_alerts()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、作業の合間に完全なジョークとして“ウイルスアラート風”通知を表示し、ユーザーの気分転換やリフレッシュを促すために設計されています。通知内容は本物と絶対に誤認されないよう、意図的にユーモアとフィクション性を強調しています。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/ja/3/library/subprocess.html
- macOS通知: https://developer.apple.com/documentation/usernotifications
- Linux notify-send: https://specifications.freedesktop.org/notification-spec/

# 利用例
- 長時間のコーディングや単調作業中に、突如デスクトップ通知で笑いを誘う。
- チームメンバーへのサプライズや、ペアプロの合間の気分転換に。

# 注意点
- 本Skillは絶対に本物のウイルス検出やシステム異常と誤解されない表現のみを採用しています。
- OS標準APIのみを利用し、追加の外部ライブラリは不要です(Windowsのみwin10toastがあれば高速通知可能)。
- 通知履歴や個人情報の保存は一切行いません。

# 設計方針
- 通知内容のユーモア性と安全性を最優先。
- 作業の妨げにならない頻度・タイミング制御。
- ローカル環境への依存を極力排除し、どの主要OSでも動作することを重視。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-virus-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標準APIのみで動作するか?

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

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

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

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

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