Antigravity ユーザーが日常でぶつかる悩み
Antigravity を日常的に使っていると、便利さの裏で思わず「またか…」と感じてしまう瞬間が多々あります。特に通知系や演出面での細やかな気配りが欲しくなることも。普段の AI coding workflow で、下記のような「あるある」に心当たりはないでしょうか。
- コマンド実行時にエラーが起きても、画面上のメッセージだけでは気付きにくく、作業が止まってしまう
- 複数人の開発現場やリモートワークで、誰かがエラーを連発しているのが静かに進行し、雰囲気が重くなりがち
- Antigravity の context が崩れた際、どのタイミングで失敗したのかが分かりにくい
- 長時間の作業で集中力が切れた時、単調なエラー通知だと見落としやすい
- 通知・演出が地味すぎて、エラー発生の瞬間をもっと印象的にしたいという欲求が高まる
特に monorepo での複雑な repository understanding や、directory 構造の把握が必要な場面では、エラー発生時の気付きや切り替えのきっかけが重要です。
この Skill が一言でいうと何を解決するか
一言サマリ: コマンド実行時にエラーが発生した瞬間Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- エラー発生時に、画面だけでなく“音”で即座に気づけるため、AI coding workflow のテンポを崩さず対応できる
- repository や directory ごとに異なるオリジナルジングルを設定できるので、作業場の雰囲気が一変し、エラー対応が楽しくなる
- 音源の差し替えが容易なため、onboarding 時やメンバーごとにサウンド演出をカスタマイズ可能
- 長時間作業や長い context でも、重要なエラーイベントを“記憶に残る”形で強調できる
- Antigravity の path management や repository understanding の場面で、エラー発生タイミングを直感的に把握できる
GitHub から degit でコマンド1行、Antigravity の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/antigravity/random-os-error-jingle .agent/skills/random-os-error-jingle実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# プロジェクトの初期セットアップでコマンドを実行
> antigravity run setup
[INFO] Setting up repository context...
[INFO] Loading directory structure...
[ERROR] Failed to install dependencies: npm ERR! missing script: install
[ジングル音が鳴る: "ファミコン風エラー.wav" 再生]
[NOTICE] エラー発生: setup コマンドの実行に失敗しました
[HINT] Skill の中身を全部見せる
.agent/skills/random-os-error-jingle/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agent/skills/random-os-error-jingle/
├── SKILL.md
├── scripts/
│ └── random_os_error_jingle.py
└── references/
└── design_notes.md
各ファイルの役割
ファイル
役割
SKILL.md
Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_error_jingle.py
コマンド失敗時にランダムジングルを再生するスクリプト
references/design_notes.md
概要 をまとめた参考資料
SKILL.md
---
name: random-os-error-jingle
description: Antigravityがユーザーのコマンド実行時にエラーや例外を検知した際、自動的にランダムな“OSエラージングル”を再生する。エラー通知や警告、失敗、例外、command failed等のキーワードに反応して発動。
---
# 機能概要
このSkillは、コマンド実行時にエラーや例外(例: コマンド失敗、例外発生、exit code!=0等)を検知すると、事前に用意した複数の“OSエラージングル”音源(WAV/MP3/ファミコン風等)からランダムに1つを再生します。これにより、エラー発生時に即座に音で気づけるだけでなく、作業場にジョーク的な演出を加えます。音源ファイルは任意に追加・差し替え可能です。
# 使い方
Skillは暗黙的に発動します。`エラー`、`例外`、`command failed`、`exit code`、`Traceback`等の出力や、Antigravityがコマンド失敗を検知した瞬間、ジングルが再生されます。音源フォルダにWAV/MP3ファイルを追加するだけで、次回からランダム選択対象となります。
# 出力例
```terminal
$ python my_script.py
Traceback (most recent call last):
File "my_script.py", line 1, in <module>
raise Exception("Something went wrong!")
Exception: Something went wrong!
[ジングル音が再生される]
$ ls /not/exist
ls: cannot access '/not/exist': No such file or directory
[別のジングル音が再生される]
```
# 注意点
- 音源ファイルは `.agent/skills/random-os-error-jingle/jingles/` 以下に保存してください。
- 音量調整やミュートはコマンドライン引数で切り替え可能です。
- サウンド再生はローカル環境でのみ動作します(リモート/サーバーでは音が鳴らない場合あり)。
- 音源ファイルが1つも無い場合は再生されません。
# 参考資料
- [Python playsound公式](https://github.com/TaylorSMarks/playsound)
- references/design_notes.md に設計方針・応用例を記載
scripts/random_os_error_jingle.py
import argparse
import os
import random
import sys
import subprocess
import threading
import time
from pathlib import Path
try:
from playsound import playsound
except ImportError:
print("playsoundモジュールが必要です。pip install playsound でインストールしてください。", file=sys.stderr)
sys.exit(1)
JINGLE_DIR = Path(__file__).parent / "jingles"
SUPPORTED_EXTS = [".wav", ".mp3", ".ogg"]
DEFAULT_VOLUME = 1.0
try:
import sounddevice as sd
import soundfile as sf
HAVE_SOUNDDEVICE = True
except ImportError:
HAVE_SOUNDDEVICE = False
def list_jingles():
if not JINGLE_DIR.exists():
print("ジングルディレクトリが存在しません: {}".format(JINGLE_DIR))
return
files = [f.name for f in JINGLE_DIR.iterdir() if f.suffix.lower() in SUPPORTED_EXTS]
if not files:
print("ジングル音源がありません。{} にWAVやMP3ファイルを追加してください。".format(JINGLE_DIR))
return
print("登録ジングル:")
for f in files:
print("- {}".format(f))
def pick_random_jingle():
if not JINGLE_DIR.exists():
return None
files = [f for f in JINGLE_DIR.iterdir() if f.suffix.lower() in SUPPORTED_EXTS]
if not files:
return None
return random.choice(files)
def play_jingle(jingle_path, volume=1.0, mute=False):
if mute or not jingle_path:
return
if HAVE_SOUNDDEVICE and jingle_path.suffix.lower() in [".wav", ".ogg"]:
try:
data, fs = sf.read(str(jingle_path), dtype='float32')
sd.play(data * volume, fs)
sd.wait()
return
except Exception as e:
print(f"sounddevice再生失敗: {e}")
try:
# playsoundは音量制御不可
playsound(str(jingle_path))
except Exception as e:
print(f"playsound再生失敗: {e}")
def run_command_with_jingle(cmd, volume=1.0, mute=False):
try:
completed = subprocess.run(cmd, shell=True, check=True)
except subprocess.CalledProcessError as e:
jingle = pick_random_jingle()
print(f"[エラー] コマンド失敗: {e}")
play_jingle(jingle, volume, mute)
sys.exit(e.returncode)
except Exception as e:
jingle = pick_random_jingle()
print(f"[例外] {e}")
play_jingle(jingle, volume, mute)
sys.exit(1)
def test_jingle(volume=1.0, mute=False):
jingle = pick_random_jingle()
if not jingle:
print("ジングル音源がありません。")
return
print(f"テスト再生: {jingle.name}")
play_jingle(jingle, volume, mute)
def main():
parser = argparse.ArgumentParser(description="コマンド失敗時にランダムジングルを再生するスクリプト")
subparsers = parser.add_subparsers(dest='subcmd')
parser_run = subparsers.add_parser('run', help='コマンドを実行し、失敗時にジングル再生')
parser_run.add_argument('cmd', nargs=argparse.REMAINDER, help='実行するコマンド')
parser_run.add_argument('--volume', type=float, default=DEFAULT_VOLUME, help='音量(0.0-1.0)')
parser_run.add_argument('--mute', action='store_true', help='ジングルを鳴らさない')
parser_list = subparsers.add_parser('list', help='ジングル一覧表示')
parser_test = subparsers.add_parser('test', help='ジングルのテスト再生')
parser_test.add_argument('--volume', type=float, default=DEFAULT_VOLUME, help='音量(0.0-1.0)')
parser_test.add_argument('--mute', action='store_true', help='ジングルを鳴らさない')
args = parser.parse_args()
if args.subcmd == 'list':
list_jingles()
elif args.subcmd == 'test':
test_jingle(volume=args.volume, mute=args.mute)
elif args.subcmd == 'run':
if not args.cmd:
print("runサブコマンドにはコマンドを指定してください。例: run ls /not/exist")
sys.exit(1)
run_command_with_jingle(' '.join(args.cmd), volume=args.volume, mute=args.mute)
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、コマンド実行時のエラーや例外を即座に音で通知することで、作業者の注意喚起やチーム内でのジョーク演出を目的としています。音源はユーザーが自由に追加・差し替え可能です。
# 公式ドキュメント抜粋
- [playsound](https://github.com/TaylorSMarks/playsound): クロスプラットフォームなシンプルな音声再生ライブラリ。
- [sounddevice](https://python-sounddevice.readthedocs.io/): WAV/OGG等の音量制御や高機能再生が可能。
# 利用例
- 開発中のテスト失敗時に音で即座に気付く
- チーム内で“また鳴った”と盛り上がる
- エラー発生時のストレスを和らげるユーモア演出
# 注意点
- サウンド再生はローカル端末でのみ有効
- 音量制御はsounddevice利用時のみ反映
- 音源ファイルが無い場合は無音
# 設計方針
- 音源の拡張性(WAV/MP3/OGG)
- CLIからの柔軟な操作(list/test/run/mute/volume)
- 依存ライブラリはpipで簡単導入
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Antigravity はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit 実行に必要)
- Antigravity がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/antigravity/random-os-error-jingle .agent/skills/random-os-error-jingle
.agent/skills/random-os-error-jingle の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agent/skills/random-os-error-jingle
# 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でエラー時に謎のジングルを鳴らしてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
