Antigravityで楽しむ!意外な作業BGM通知の活用ガイド

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

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

AI coding workflow において、Antigravity を使っていると「もうちょっと遊び心がほしい」「作業開始の儀式が単調すぎる」と感じる瞬間が意外と多いものです。特に通知・演出・OS連携まわりは、日々の開発を彩る仕掛けが少なく、session 開始のたびに淡々とした空気が流れがちです。

また、以下のような悩みもよく挙げられます:

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

通知・演出系のSkillを導入することで、こうした“マンネリ感”や“説明コスト”を和らげつつ、ちょっとした遊び心で開発体験をリフレッシュしたいというニーズが高まっています。

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

一言サマリ: ターミナルやエディタを起動した瞬間Skill。

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

  • session 開始・エディタ起動時に、完全ランダムな“今日の作業BGM”タイトルがOS通知で届き、Antigravity の context 切替や repo onboarding の瞬間に遊び心が加わる
  • monorepo や複雑な repository 構造でも、通知がワンポイントのアクセントとなり、長時間 workflow の単調さを和らげる
  • directory や path management の煩雑さに埋もれがちな onboarding プロセスが、ちょっとした演出で記憶に残りやすくなる
  • AI coding workflow の“はじめの一歩”が、無機質な context 設定だけでなく、ユーモラスな演出で気分転換できる
  • 毎回違うジャンル・変なBGMタイトルが出ることで、session 再開時の“切り替えスイッチ”として機能する
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# ターミナルを開いて Antigravity を起動
$ antigravity start

[通知] 今日の作業BGM: 「宇宙戦艦発進テーマ」
  - あなたの repository: /Users/you/projects/space-battle
  - context: src/main.py, README.md

(ヒント) 気分転換にBGMタイトルをクリックしてみてください(実際の再生はありません)

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


# monorepo の packages/frontend へ移動
$ cd packages/frontend

[通知] 今日の作業BGM: 「なつかしのファミコン効果音」
  - repository understanding: monorepo/packages/frontend
  - path management: 現在の directory で context 切替済み

(注) このBGMは完全に無関係です。作業に集中できるかは自己責任。

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


# 友人にAntigravityを紹介するデモ中
$ antigravity demo

[通知] 今日の作業BGM: 「朝礼のチャイム」
  - repo: /Users/you/projects/demo-repo
  - directory: demo/

(お知らせ) BGMタイトルは毎回ランダム。たまにシュールな選曲もあります。

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-soundtrack-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_soundtrack_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_soundtrack_notifier.py Check if notification has already been sent in this session.
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-soundtrack-notifier
description: ターミナルやエディタの起動時、または作業開始を示すキーワード(例: start, open, launch, begin, edit, code)が検出された際に自動発動し、OSの通知で“今日の作業BGM”を毎回ランダムに提案します。通知は1セッションにつき1回のみ表示されます。
---

# 機能概要
random-os-soundtrack-notifierは、開発者がターミナルやエディタを起動した瞬間に、完全ランダムな“今日の作業BGM”タイトルをOSの通知で提案するスキルです。選曲は「なつかしのファミコン効果音」や「宇宙戦艦発進テーマ」など、作業に全く関係ないジャンルばかり。真面目な開発環境に“無駄な演出”を加え、ちょっとした笑いや集中力の混乱を体験できます。

# 使い方
このSkillは明示的な呼び出しは不要です。ターミナルやエディタの起動、または`start`, `open`, `launch`, `begin`, `edit`, `code`などのキーワードが検出された時点で自動的に発動します。通知は1セッションにつき1回のみ表示されます。

# 出力例
(ターミナル起動時の通知例)

```
[通知] 今日の作業BGM: なつかしのファミコン効果音
[通知] 今日の作業BGM: 宇宙戦艦発進テーマ
[通知] 今日の作業BGM: 朝礼のチャイム
[通知] 今日の作業BGM: 盆踊りの太鼓
[通知] 今日の作業BGM: 駅の発車ベル
```

# 注意点
- 通知は1セッションにつき1回のみ表示されます。
- BGMは実際に再生されません。タイトルのみの通知です。
- 外部APIやファイル保存は行いません。完全にローカルで完結します。
- 通知機能はOS標準API(Windows: win10toast, macOS: osascript, Linux: notify-send)を利用します。

# 参考資料
詳細な設計方針や利用例は`references/design_notes.md`を参照してください。OSごとの通知APIの詳細は[Windows公式ドキュメント](https://docs.microsoft.com/ja-jp/windows/uwp/design/shell/tiles-and-notifications/)、[AppleScript通知](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)、[notify-send manページ](https://man7.org/linux/man-pages/man1/notify-send.1.html)を参照。

scripts/random_os_soundtrack_notifier.py

import sys
import os
import platform
import random
import argparse
import subprocess
from datetime import datetime

SOUNDTRACKS = [
    'なつかしのファミコン効果音',
    '宇宙戦艦発進テーマ',
    '朝礼のチャイム',
    '盆踊りの太鼓',
    '駅の発車ベル',
    '昭和のテレビCMジングル',
    '体育祭の入場行進曲',
    '昭和アニメ主題歌(インスト)',
    '工事現場のバックホーン',
    '運動会の徒競走BGM',
    '昭和の電話ベル',
    'パチンコ屋の開店音',
    '昭和歌謡イントロ',
    '時報のピッピッポーン',
    'ファミレスの呼び出し音',
    '学食の閉店メロディ',
    '学校の下校チャイム',
    '商店街のテーマソング',
    'レトロゲームのボス戦BGM',
    'カセットテープ巻き戻し音'
]

SESSION_FLAG_FILE = os.path.join(os.path.expanduser('~'), '.random_os_soundtrack_notifier_session')


def is_session_notified():
    """
    Check if notification has already been sent in this session.
    """
    if not os.path.exists(SESSION_FLAG_FILE):
        return False
    try:
        with open(SESSION_FLAG_FILE, 'r') as f:
            ts = f.read().strip()
        # Optional: session reset after 12 hours
        last = datetime.fromisoformat(ts)
        if (datetime.now() - last).total_seconds() > 43200:
            return False
        return True
    except Exception:
        return False


def set_session_notified():
    """
    Mark that notification has been sent.
    """
    try:
        with open(SESSION_FLAG_FILE, 'w') as f:
            f.write(datetime.now().isoformat())
    except Exception:
        pass


def clear_session_flag():
    try:
        if os.path.exists(SESSION_FLAG_FILE):
            os.remove(SESSION_FLAG_FILE)
    except Exception:
        pass


def pick_random_soundtrack():
    return random.choice(SOUNDTRACKS)


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


def list_soundtracks():
    for idx, name in enumerate(SOUNDTRACKS, 1):
        print(f"{idx:2d}. {name}")


def main():
    parser = argparse.ArgumentParser(description='random-os-soundtrack-notifier: ターミナル/エディタ起動時に無駄BGMを通知')
    subparsers = parser.add_subparsers(dest='command')

    parser_notify = subparsers.add_parser('notify', help='ランダムBGM通知を手動で送信')
    parser_list = subparsers.add_parser('list', help='BGMタイトル一覧を表示')
    parser_clear = subparsers.add_parser('clear', help='セッションフラグをクリア')
    parser_status = subparsers.add_parser('status', help='現在のセッション通知状態を表示')

    args = parser.parse_args()

    if args.command == 'list':
        list_soundtracks()
        return
    elif args.command == 'clear':
        clear_session_flag()
        print('セッション通知フラグをクリアしました。')
        return
    elif args.command == 'status':
        if is_session_notified():
            print('このセッションでは既に通知済みです。')
        else:
            print('このセッションではまだ通知されていません。')
        return
    # Default: notify
    if is_session_notified():
        # 通知済みなら何もしない
        return
    soundtrack = pick_random_soundtrack()
    send_notification('今日の作業BGM', soundtrack)
    set_session_notified()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-os-soundtrack-notifierは、開発環境の起動時に“無駄なBGMタイトル”を通知することで、作業の雰囲気や集中力にユーモラスな変化を与えることを目的としています。通知はBGMタイトルのみで、実際の音楽再生や外部API連携は行いません。

# 公式ドキュメント抜粋
Windowsでは`win10toast`、macOSでは`osascript`、Linuxでは`notify-send`を利用し、各OSの標準通知APIでメッセージを表示します。これにより追加の外部サービスやネットワーク通信は不要です。

# 利用例
- ターミナルやVSCodeなどのエディタ起動時に自動でBGMタイトルが通知される
- CLIから`python random_os_soundtrack_notifier.py notify`で手動通知も可能
- `list`サブコマンドで全BGMタイトルを確認可能

# 注意点
通知は1セッションにつき1回のみ。BGM再生や外部API呼び出しは一切行いません。通知が不要な場合は`clear`サブコマンドでフラグをリセット可能です。

# 設計方針
シンプルなローカル完結型設計とし、冗長な外部依存を避けています。通知内容は毎回ランダム選出され、作業の“本気の無駄演出”を実現しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agent/skills/random-os-soundtrack-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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知が起動ごとに1回だけ表示されるか、BGMタイトルが毎回ランダムかつユニークであるか、実際のBGM再生や外部API呼び出しを行わず、純粋に通知だけで完結しているか

実際に Antigravity で試した検証ログは Antigravityで作業BGM通知をランダムに提案してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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