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 再開時の“切り替えスイッチ”として機能する
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
