Antigravityで作業中にIT英雄を自動通知する機能の始め方

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

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

Antigravity を日々使い込んでいると、AI coding workflow の合間にふと「この静けさ、地味にしんどい…」と感じる瞬間がある。特に長時間の repository understanding や、monorepo の directory を跨いで context を維持し続ける作業では、淡々としたやりとりに疲れがたまりやすい。通知や演出が一切ないため、集中力が切れた時のリカバリも難しい。

また、Antigravity の path management や memory の都合で、作業が単調になったり、気分転換できる瞬間が少ないことも。こうした「静かな孤独」を感じるユーザーは多い。

  • AIとのやりとりが淡々と続き、repository 作業中に気分転換のきっかけがない
  • 長時間の onboarding や context 再構築で集中が切れやすい
  • monorepo で directory を跨ぐたびに同じ説明を繰り返し、作業が機械的になる
  • Antigravity の通知や演出が皆無で、workflow に遊び心や「今ここで頑張れ!」という励ましが欲しくなる
  • AI coding workflow の合間に、気分を切り替える“何か”が欲しいが、既存の Skill では物足りない

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

一言サマリ: このスキルは、Antigravity の作業中に突如「IT英雄召喚」風の通知をランダムに発生させ、孤独な開発現場に謎の勇気と遊び心を届ける Skill。

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

  • 長時間の repository understanding や monorepo 作業の合間に、突発的な「OS公式・IT英雄召喚」通知が発生し、workflow の気分転換になる
  • Antigravity の context や memory 管理に疲れたタイミングで、ランダムな演出が入り、作業にユーモアと活力をもたらす
  • directory や path management に関する単調なやりとりの中で、思わず笑ってしまう“エンタメ枠”として定番化
  • AI coding workflow の「静寂」を破る演出で、onboarding や session 再開時の気持ちをリセットできる
  • SKILL.md で定義された description にマッチするだけで自動発動し、ユーザーの手間なく楽しめる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-it-hero-summon-notifier .agent/skills/random-os-fake-it-hero-summon-notifier

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

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

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


> プロジェクトを解析して、主要な directory 構造を把握したい

[Antigravity Notification]
=== IT英雄召喚 ===
伝説のデバッグ勇者「バグバスター・ミナト」が現れた!
「本日も repo の闇を切り裂く時。directory: /src/core から冒険開始!」

あなたのプロジェクトに新たな風が吹き込まれました。

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


> packages/frontend から packages/backend へ context を切り替えたい

[Antigravity Notification]
=== IT英雄召喚 ===
「コマンド使いのジョン」が monorepo の境界を突破!
「packages/backend で新たな戦いが始まる。repository understanding の力を解放せよ!」

AI coding workflow に勇気のバフが付与されました。

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


> 今日はやる気が出ない。誰か助けて

[Antigravity Notification]
=== IT英雄召喚 ===
「OS公式サポーター・リナックス先輩」召喚!
「どんなバグも一緒に乗り越えよう。memory が尽きてもあきらめるな!」

謎の応援メッセージがあなたを包みました。

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-it-hero-summon-notifier/
├── SKILL.md
├── scripts/
│   └── hero_summon_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-it-hero-summon-notifier
description: このSkillは、作業やコーディングの合間に「英雄召喚」風の通知をランダムなタイミングで表示します。triggerType: always で、通知・演出・OS連携系のキーワード(例: 孤独, モチベーション, エンタメ, 通知, OS, 勇者, 英雄, バグ, デバッグ, 召喚)を含む状況で発動します。
---

# 機能概要
random-os-fake-it-hero-summon-notifierは、作業中に突如として“OS公式”や“IT英雄”が召喚されたかのような通知をデスクトップやターミナルへ表示するエンタメ系Skillです。通知内容は毎回ランダムで、架空のデバッグ勇者や伝説のコマンド使いが現れ、あなたの作業を(精神的に)支援します。孤独な開発や長時間の作業に謎の勇気と笑いを提供し、気分転換やモチベーション維持に役立ちます。

# 使い方
このSkillは自動発動型です。特定の明示呼び出しは不要で、triggerType: always のため、エージェントが「通知」「英雄」「バグ」「孤独」などのキーワードや状況を検知した際に自動的に発動します。ターミナルまたはデスクトップ通知として演出されます。

# 出力例
```
[OS通知] 伝説のデバッグ勇者「タカシ」が参上しました!
[OS通知] バグ討伐の時!“コマンド使いのジョン”が出動します。
[OS通知] 謎のOS公式「バーチャル管理者」があなたの作業を見守っています。
[OS通知] 伝説のリファクタリング忍者「サクラ」が召喚されました。
[OS通知] 今こそバグ退治の時!“スクリプト魔術師”が現れた!
```

# 注意点
- 通知は完全にエンタメ目的であり、作業データや環境には一切影響を与えません。
- ローカルに通知履歴や個人情報は保存されません。
- 通知内容は毎回ランダム生成され、繰り返し出現もあります。
- OSの通知機能(Linux: notify-send, macOS: osascript, Windows: Toast通知)を利用します。

# 参考資料
- references/design_notes.md
- https://docs.python.org/ja/3/library/random.html
- https://github.com/jithurjacob/Windows-10-Toast-Notifications
- https://wiki.archlinux.jp/index.php/Notify-send

scripts/hero_summon_notifier.py

import sys
import os
import random
import time
import argparse
import platform
import subprocess
from datetime import datetime, timedelta

HEROES = [
    "伝説のデバッグ勇者『タカシ』",
    "コマンド使いのジョン",
    "リファクタリング忍者『サクラ』",
    "バーチャル管理者",
    "スクリプト魔術師",
    "バグハンター『リナ』",
    "メモリマスター『ケン』",
    "パッチの精霊『ミユキ』",
    "ネットワーク賢者『アレックス』",
    "シェルの魔王『カズ』"
]

MESSAGES = [
    "{hero}が参上しました!",
    "バグ討伐の時!“{hero}”が出動します。",
    "謎のOS公式「{hero}」があなたの作業を見守っています。",
    "{hero}が召喚されました。",
    "今こそバグ退治の時!“{hero}”が現れた!",
    "{hero}があなたのコードに加護を与えます。",
    "{hero}がログを監視中...",
    "{hero}が未解決のバグを追跡中です。",
    "{hero}が新たな知恵を授けに来ました。",
    "{hero}がターミナルに降臨!"
]

HISTORY_FILE = os.path.expanduser("~/.hero_summon_history.log")

# 通知をOSごとに送る
def send_notification(message):
    system = platform.system()
    try:
        if system == "Linux":
            subprocess.run(["notify-send", message], check=True)
        elif system == "Darwin":
            script = f'display notification "{message}" with title "OS通知"'
            subprocess.run(["osascript", "-e", script], check=True)
        elif system == "Windows":
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast("OS通知", message, duration=5)
            except ImportError:
                # Fallback: print to console
                print("[OS通知]", message)
        else:
            print("[OS通知]", message)
    except Exception as e:
        print(f"[通知失敗] {e}\n[OS通知] {message}")

# 英雄召喚メッセージ生成
def generate_message():
    hero = random.choice(HEROES)
    msg_template = random.choice(MESSAGES)
    return msg_template.format(hero=hero)

# 履歴保存
def log_history(message):
    with open(HISTORY_FILE, "a", encoding="utf-8") as f:
        f.write(f"{datetime.now().isoformat()}\t{message}\n")

# 履歴表示
def show_history(limit=10):
    if not os.path.exists(HISTORY_FILE):
        print("履歴はありません。")
        return
    with open(HISTORY_FILE, encoding="utf-8") as f:
        lines = f.readlines()[-limit:]
        for line in lines:
            print(line.strip())

# 履歴要約
def summary_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴はありません。")
        return
    count = 0
    hero_count = {}
    with open(HISTORY_FILE, encoding="utf-8") as f:
        for line in f:
            count += 1
            for hero in HEROES:
                if hero in line:
                    hero_count[hero] = hero_count.get(hero, 0) + 1
    print(f"合計通知数: {count}")
    for hero, c in sorted(hero_count.items(), key=lambda x: -x[1]):
        print(f"{hero}: {c}回")

# ランダムな間隔で通知を送る
def random_notify_loop(min_sec=600, max_sec=3600, once=False):
    while True:
        message = generate_message()
        send_notification(message)
        log_history(message)
        if once:
            break
        wait_sec = random.randint(min_sec, max_sec)
        time.sleep(wait_sec)

def main():
    parser = argparse.ArgumentParser(description="謎のOS英雄召喚通知スクリプト")
    subparsers = parser.add_subparsers(dest="command")

    notify_parser = subparsers.add_parser("notify", help="今すぐ英雄召喚通知を1回だけ送る")
    loop_parser = subparsers.add_parser("loop", help="ランダムな間隔で通知を送り続ける")
    loop_parser.add_argument("--min", type=int, default=600, help="通知間隔の最小秒数 (デフォルト600)")
    loop_parser.add_argument("--max", type=int, default=3600, help="通知間隔の最大秒数 (デフォルト3600)")

    log_parser = subparsers.add_parser("log", help="通知履歴を表示する")
    log_parser.add_argument("--limit", type=int, default=10, help="表示件数 (デフォルト10)")

    summary_parser = subparsers.add_parser("summary", help="通知履歴の要約を表示する")

    args = parser.parse_args()

    if args.command == "notify":
        message = generate_message()
        send_notification(message)
        log_history(message)
    elif args.command == "loop":
        try:
            random_notify_loop(min_sec=args.min, max_sec=args.max)
        except KeyboardInterrupt:
            print("\n通知ループを終了します。")
    elif args.command == "log":
        show_history(limit=args.limit)
    elif args.command == "summary":
        summary_history()
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、作業中の孤独感やマンネリを打破するため、OS通知やターミナルメッセージとして“英雄召喚”を演出します。実用性よりエンタメ性・気分転換を重視した設計です。

# 公式ドキュメント抜粋
- Python random: https://docs.python.org/ja/3/library/random.html
- notify-send (Linux): https://wiki.archlinux.jp/index.php/Notify-send
- osascript (macOS): https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/
- win10toast (Windows): https://github.com/jithurjacob/Windows-10-Toast-Notifications

# 利用例
- 長時間のコーディングやバグ修正時に、突発的な通知で気分転換
- チーム開発での“ネタ”演出やリモートワークの孤独対策

# 注意点
- 通知は完全な演出目的で、作業データや環境を変更しません
- 履歴はユーザーホーム配下にのみ保存され、個人情報は一切記録しません

# 設計方針
- OSごとに最適な通知APIを自動選択
- メッセージ・英雄名は拡張しやすい構造
- CLIサブコマンドで履歴・要約も確認可能

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-it-hero-summon-notifier .agent/skills/random-os-fake-it-hero-summon-notifier

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-it-hero-summon-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で謎のIT英雄召喚通知を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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