Antigravity ユーザーが日常でぶつかる悩み
Antigravity を使っていると、AI coding workflow の中で「またか」と思うような小さなストレスが積み重なりがちです。特に通知や演出系の機能は、普段の作業には直接関係しないものの、日々のリズムや気分転換に密かに影響を与えています。作業開始時や context 切り替えのタイミングで、ふとした“間”が生まれることも多いものです。
実際、次のような困りごとがよく挙がります:
- Antigravity が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
こうした悩みに加え、作業開始時の“気持ちの切り替え”や、AIとのやり取りが単調になりがちな点も、実は多くのユーザーが感じている課題です。
この Skill が一言でいうと何を解決するか
一言サマリ: ターミナルやエディタを起動した瞬間Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- Antigravity の session 開始や directory 移動時に、毎回「今日の作業BGM」を理不尽なほどバカバカしく通知してくれるため、気分転換や作業リズムの切り替えが自然にできる
- repo や directory の context 切り替え時に、思わず笑ってしまう演出が入り、長時間の AI coding workflow でもマンネリ化しにくい
- onboarding や新しい repository への移動時も、通知をきっかけに context の切り替えを意識しやすくなる
- Skill の発動は description マッチのみで、明示的なコマンド入力不要
- 通知内容が完全ランダム&ジャンル無差別なので、毎回新鮮な気持ちで作業に入れる
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パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# プロジェクトディレクトリでターミナルを開く
Antigravity: おかえりなさい!本日の作業BGMは...
【運命】ベートーヴェン交響曲第5番
「このリポジトリの運命を変える1日が始まります」
(通知: OSの右上にBGMタイトルと一言コメントが表示される)
シーン2: monorepo / package 跨ぎ作業時
# packages/api ディレクトリに移動
Antigravity: 今日のAPI開発BGMは...
【情熱大陸】葉加瀬太郎
「このpackageに情熱を注ぎ込みましょう」
(通知: OSの右上にBGMタイトルと一言コメントが表示される)
シーン3: お遊び的な使い方
# エディタを再起動
Antigravity: 突然ですが、あなたへのBGM提案です
【初音ミクの消失】
「一気にコードを書き上げて消失しよう!」
(通知: OSの右上にBGMタイトルと一言コメントが表示される)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Antigravity が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 作業区切りごとに通知が入り、気分転換しやすい |
発動方式
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 |
今日の作業BGMをランダム通知 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-soundtrack-notifier
description: ターミナルやエディタの起動時、または作業開始を示唆するキーワード(例: start, open, begin, code, terminal)が検出された際に、AntigravityがこのSkillを自動発動します。
---
# 機能概要
random-os-soundtrack-notifierは、作業開始時に“今日の作業BGM”として、ジャンルも状況も無視した奇妙なサウンドトラック名をOS通知で表示します。通知されるだけで実際には音楽は流れません。『情熱大陸』『運命』『初音ミクの消失』『ドラクエ戦闘曲』『朝のラジオ体操』など、思わず二度見するバカバカしいラインナップが特徴です。日々の作業開始にユーモアを添え、気分転換や話題作りをサポートします。
# 使い方
このSkillは明示的な呼び出しを必要とせず、ターミナルやエディタの起動、または“start”“open”“begin”“code”“terminal”などのキーワードを含む状況で自動発動します。手動実行は不要です。
# 出力例
```
[通知] 今日の作業BGM: ドラクエ戦闘曲
[通知] 今日の作業BGM: 情熱大陸
[通知] 今日の作業BGM: 初音ミクの消失
[通知] 今日の作業BGM: 運命(ベートーヴェン)
[通知] 今日の作業BGM: 朝のラジオ体操
[通知] 今日の作業BGM: ルパン三世のテーマ
[通知] 今日の作業BGM: ポケモンセンター
[通知] 今日の作業BGM: 甲子園応援歌
```
# 注意点
- 実際に音楽は再生されません。通知のみです。
- 通知はOSのネイティブAPIを利用します(Windows: Toast, macOS: AppleScript, Linux: notify-send)。
- 通知がOSの設定でブロックされている場合は表示されません。
- 選曲リストはローカル保存やカスタマイズ不可です。
- セキュリティ上、外部APIやインターネットアクセスは行いません。
# 参考資料
- [Python公式: platform, subprocess, random, os](https://docs.python.org/3/library/)
- references/design_notes.md を参照してください。
scripts/random_os_soundtrack_notifier.py
import sys
import os
import platform
import random
import subprocess
import argparse
from datetime import datetime
SOUNDTRACKS = [
'情熱大陸',
'運命(ベートーヴェン)',
'初音ミクの消失',
'ドラクエ戦闘曲',
'朝のラジオ体操',
'ルパン三世のテーマ',
'ポケモンセンター',
'甲子園応援歌',
'パイレーツ・オブ・カリビアン',
'ガンダムOP',
'世界の車窓から',
'サザエさん',
'エヴァンゲリオン残酷な天使のテーゼ',
'スーパー戦隊メドレー',
'アナと雪の女王 Let It Go',
'スーパーマリオ地上BGM',
'モンスターハンター狩猟音楽',
'ゼルダの伝説メインテーマ',
'ウルトラソウル',
'北斗の拳愛をとりもどせ!!',
'美少女戦士セーラームーン',
'ドラゴンボールZ CHA-LA HEAD-CHA-LA',
'ポプテピピックOP',
'FF勝利のファンファーレ',
'暴れん坊将軍',
'仮面ライダー変身音',
'きらきら星',
'アンパンマンマーチ',
'世界に一つだけの花',
'NHKニュース9オープニング',
'相棒メインテーマ',
'笑点のテーマ',
'水戸黄門',
'ドリフの大爆笑',
'鉄腕アトム',
'銀河鉄道999',
'名探偵コナン',
'暴走列車',
'ピタゴラスイッチ',
'千本桜',
'天城越え',
'おどるポンポコリン',
'マツケンサンバ',
'サンバ・デ・ジャネイロ',
'ボレロ',
'運動会の徒競走BGM',
'モーツァルト アイネ・クライネ',
'トルコ行進曲',
'ハレ晴レユカイ',
'ゴジラのテーマ',
'マリオカートレインボーロード',
'ポケモンジム戦',
'プリキュア',
'おさかな天国',
'ウルトラマン',
'銀魂',
'暴れん坊将軍',
'サクラ大戦',
'サカナクション新宝島',
'キューピー3分クッキング',
'タッチ',
'紅蓮華',
'炎(LiSA)',
'USA',
'バタフライ(木村カエラ)',
'世界の車窓から',
'宇宙戦艦ヤマト',
'マツケンサンバII',
'ロッキーのテーマ',
'スターウォーズ',
'ジョジョの奇妙な冒険',
'アラレちゃん',
'美味しんぼ',
'暴れん坊将軍',
'北の国から',
'千と千尋の神隠し',
'となりのトトロ',
'崖の上のポニョ',
'天空の城ラピュタ',
'もののけ姫',
'ハウルの動く城',
'カリオストロの城',
'名探偵コナンメインテーマ',
'忍たま乱太郎',
'おしりたんてい',
'ドラえもん',
'クレヨンしんちゃん',
'パプリカ',
'恋(星野源)',
'Pretender(Official髭男dism)',
'Lemon(米津玄師)',
'紅(X JAPAN)',
'天体観測',
'小さな恋のうた',
'世界に一つだけの花',
'リンダリンダ',
'Runner',
'愛をとりもどせ!!',
'愛のバクダン',
'負けないで',
'残酷な天使のテーゼ',
'CHA-LA HEAD-CHA-LA',
'ウィーアー!',
'勇気100%',
'サザエさん一家',
'笑点のテーマ',
'水戸黄門',
'暴れん坊将軍',
'鉄腕アトム',
'銀河鉄道999',
'名探偵コナン',
'暴走列車',
'ピタゴラスイッチ',
'千本桜',
'天城越え',
'おどるポンポコリン',
'マツケンサンバ',
'サンバ・デ・ジャネイロ',
'ボレロ',
'運動会の徒競走BGM',
]
LOGFILE = os.path.expanduser('~/.random_os_soundtrack_notifier.log')
def pick_random_soundtrack():
return random.choice(SOUNDTRACKS)
def notify_os(title, message):
sys_os = platform.system()
try:
if sys_os == 'Darwin':
script = f'display notification "{message}" with title "{title}"'
subprocess.run(['osascript', '-e', script], check=True)
elif sys_os == 'Windows':
import ctypes
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast(title, message, duration=5, threaded=True)
elif sys_os == 'Linux':
subprocess.run(['notify-send', title, message], check=True)
else:
print(f'[通知] {title}: {message}')
except Exception as e:
print(f'[通知エラー] {e}')
def log_notification(soundtrack):
try:
with open(LOGFILE, 'a', encoding='utf-8') as f:
f.write(f'{datetime.now().isoformat()}\t{soundtrack}\n')
except Exception as e:
print(f'[ログエラー] {e}')
def list_log():
if not os.path.exists(LOGFILE):
print('ログファイルがありません。')
return
with open(LOGFILE, 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())
def summary_log():
if not os.path.exists(LOGFILE):
print('ログファイルがありません。')
return
counts = {}
with open(LOGFILE, 'r', encoding='utf-8') as f:
for line in f:
if '\t' in line:
_, track = line.strip().split('\t', 1)
counts[track] = counts.get(track, 0) + 1
sorted_tracks = sorted(counts.items(), key=lambda x: x[1], reverse=True)
print('== 通知されたBGMランキング ==')
for track, cnt in sorted_tracks[:10]:
print(f'{track}: {cnt}回')
def main():
parser = argparse.ArgumentParser(description='今日の作業BGMをランダム通知')
subparsers = parser.add_subparsers(dest='command')
# 通常発動
parser_notify = subparsers.add_parser('notify', help='ランダムBGMを通知')
# ログ表示
parser_list = subparsers.add_parser('list', help='通知履歴を表示')
# サマリー
parser_summary = subparsers.add_parser('summary', help='BGM通知ランキング')
args = parser.parse_args()
if args.command == 'notify' or args.command is None:
soundtrack = pick_random_soundtrack()
title = '今日の作業BGM'
message = soundtrack
notify_os(title, message)
log_notification(soundtrack)
elif args.command == 'list':
list_log()
elif args.command == 'summary':
summary_log()
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
random-os-soundtrack-notifierは、作業開始時にOS通知で“今日の作業BGM”をランダムに提案し、日常のルーチンにユーモアと意外性を加えるためのSkillです。通知内容は実際に再生されず、ユーザーの集中や作業フローを妨げません。
# 公式ドキュメント抜粋
- [Python subprocess](https://docs.python.org/3/library/subprocess.html)
- [macOS osascript](https://ss64.com/osx/osascript.html)
- [Linux notify-send](https://specifications.freedesktop.org/notification-spec/latest/)
- [win10toast](https://pypi.org/project/win10toast/)
# 利用例
- ターミナルやエディタの起動時に自動発動し、BGMタイトルを通知。
- CLIから `python random_os_soundtrack_notifier.py notify` で手動実行も可能。
- 履歴やランキング表示で過去の通知を振り返る用途も。
# 注意点
- OS通知APIの制約により、通知が表示されない場合があります。
- Windowsはwin10toastが必要です(pip install win10toast)。
- ログファイルはホームディレクトリに保存されます。
# 設計方針
- 外部APIやネットワークアクセスを排除し、セキュリティと安定性を重視。
- ユーザーの作業を妨げない“理不尽なエンタメ”を追求しています。
導入手順
この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 でも有効か?
- プロジェクト指示との連携をどう組み立てるか?
- 起動時に毎回ランダムなBGMタイトルが通知されるか?
- 通知内容が十分にバカバカしいラインナップになっているか?
- OS通知が安定して表示されるか?
実際に Antigravity で試した検証ログは Antigravityの通知で毎回バカバカしい作業BGMを提案してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
