Antigravityでエラー通知を楽しく自動化する方法入門

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

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 の場面で、エラー発生タイミングを直感的に把握できる
QUICK INSTALL
このSkillをすぐ試す

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記事を探す

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

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

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