Antigravityで楽しむ!謎の俳句通知によるエラー演出の発見

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

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

AI coding workflow を Antigravity で回していると、真面目なエラー通知や堅いログばかりが並び、気がつけば画面も気分もどこか無機質になりがちです。特に monorepo で複雑な repository 構造を扱う現場では、context や path management の混乱に加え、エラー通知が大量に飛び交うことで作業が単調になり、ストレスも蓄積しやすくなります。

さらに、Antigravity のような長時間 session を前提としたツールでは、長い context による stale context 問題や、directory 構造の再説明など、情報の重複・冗長さに悩むことも少なくありません。そんなとき、ほんの一瞬でも「遊び心」や「意外性」がほしいと思ったことはありませんか?

  • エラー通知が毎回同じで、作業のテンションが下がる
  • 長時間の repository understanding で、気分転換のきっかけが全くない
  • エラー発生時、OSやツール側からのメッセージが無機質すぎて、逆にストレスが溜まる
  • monorepo 作業で directory 境界や path を意識しすぎて頭が疲れる
  • Antigravity の context 復元や path management の途中で、通知が埋もれて見逃しやすい

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

一言サマリ: このスキルは、エラー発生時に「謎のOS公式・エラー俳句通知」を表示し、開発フローに和風の遊び心とリフレッシュをもたらします。

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

  • エラー通知が単調なものから、毎回異なる俳句によるサプライズ演出に変わり、長時間の AI coding workflow に小さな癒しと混乱を提供
  • Antigravity の repository understanding や path management の過程で気分転換が自然に挟まることで、stale context 問題や作業のマンネリ化を緩和
  • monorepo での directory 境界を跨ぐタイミングや session 再開時など、重要な場面で「なぜか俳句」が表示され、onboarding や記憶定着のフックになる
  • 通知は短時間で自動消滅し、作業を邪魔しすぎず、OS連携による自然な表示で違和感が少ない
  • Skill の発動は description マッチによる自動化で、ユーザー操作を必要としない
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-error-haiku-notifier .agent/skills/random-os-fake-error-haiku-notifier

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


# プロジェクト初期化後、初めてビルドコマンドを実行
> npm run build

[Antigravity] Error: Cannot find module 'config.js' in src/
[OS Notification]
バグの香や 春まだ遠き デバッグ道

(通知は画面右下に5秒間表示されました)

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


> cd packages/service-b && npm test

[Antigravity] Error: Test failed in packages/service-b/utils/
[OS Notification]
落ちるテスト パッケージまたぐ 風の音

(俳句通知が画面端に現れ、数秒後に消えました)

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


> yarn lint

[Antigravity] Error: Unexpected token in src/helpers/parse.js
[OS Notification]
構文エラー 夜更けのリポに 月ひとつ

(俳句がランダムで毎回変化します)

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-os-fake-error-haiku-notifier/
├── SKILL.md
├── scripts/
│   └── haiku_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/haiku_notifier.py Read lines from stdin (assumed to be piped from stderr), and send notification on each lin
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-error-haiku-notifier
description: エラー発生・例外検知・ビルド失敗・テストエラー・クラッシュ・stderr出力などのキーワードやイベントを検出した際に発動し、俳句形式の通知を表示します。
---

# 機能概要
このSkillは、ターミナルやエディタ上でエラーや例外が発生した際に、実際のエラー内容とは無関係な“謎のOS公式・エラー俳句”をデスクトップ通知として表示します。俳句は毎回ランダムで選ばれ、開発者の心に一瞬の静けさや混乱を提供します。真面目なエラー通知に飽きた方や、作業中の気分転換を求める方に最適な和風カオス演出です。

# 使い方
このSkillは明示的な呼び出しは不要です。エラー発生時(例: "error", "exception", "failed", "crash", "stderr" などのキーワードやイベント)を検知すると自動で発動します。設定やコマンドは不要で、OSの通知機能(Windows, macOS, Linux)を利用して俳句が表示されます。

# 出力例
```
[通知] OSからの神託:
バグの香や 春まだ遠き デバッグ道

[通知] OSからの神託:
落ちるたび 静かに咲ける 桜かな

[通知] OSからの神託:
エラー音 夜更けの窓に 風ひとつ
```

# 注意点
- 通知はOSの標準API(notify-send, AppleScript, Windows Toast等)を利用します。
- 俳句は完全ランダムで、実際のエラー内容や原因とは無関係です。
- 通知は数秒で自動的に消え、作業を妨げません。
- ログやエラー内容の保存・送信は行いません。
- 通知機能が無効な環境では動作しません。

# 参考資料
- references/design_notes.md 参照
- https://docs.python.org/3/library/subprocess.html
- https://github.com/jithurjacob/Windows-10-Toast-Notifications
- https://wiki.archlinux.jp/index.php/Notify-send

scripts/haiku_notifier.py

import sys
import os
import random
import platform
import argparse
import subprocess
import threading
import time
from typing import List

HAIKUS = [
    'バグの香や 春まだ遠き デバッグ道',
    '落ちるたび 静かに咲ける 桜かな',
    'エラー音 夜更けの窓に 風ひとつ',
    '無限ループ 朝焼けとともに 終わりなし',
    '例外や 心静かに ログを見る',
    'ビルド落ち コーヒー冷めて 春霞',
    'リトライを 重ねて学ぶ 秋の夜',
    'スタックトレース 読めども読めど 霧の中',
    'メモリリーク 消えゆく夢と プロセスよ',
    '警告の 色づく秋に リファクタ'
]

NOTIFY_TITLE = 'OSからの神託:'


def pick_random_haiku() -> str:
    return random.choice(HAIKUS)


def notify_mac(message: str):
    script = f'display notification "{message}" with title "{NOTIFY_TITLE}"'
    subprocess.run(['osascript', '-e', script], check=False)


def notify_linux(message: str):
    subprocess.run(['notify-send', NOTIFY_TITLE, message, '-t', '4000'], check=False)


def notify_windows(message: str):
    try:
        import win10toast
        toaster = win10toast.ToastNotifier()
        toaster.show_toast(NOTIFY_TITLE, message, duration=4, threaded=True)
    except ImportError:
        # Fallback: Powershell toast
        script = f'[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null;'
        script += f'$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02);'
        script += f'$template.GetElementsByTagName("text")[0].AppendChild($template.CreateTextNode("{NOTIFY_TITLE}")) > $null;'
        script += f'$template.GetElementsByTagName("text")[1].AppendChild($template.CreateTextNode("{message}")) > $null;'
        script += f'$toast = [Windows.UI.Notifications.ToastNotification]::new($template);'
        script += f'$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("HaikuNotifier");'
        script += f'$notifier.Show($toast);'
        subprocess.run(['powershell', '-Command', script], check=False)


def send_notification(message: str):
    sys_platform = platform.system()
    if sys_platform == 'Darwin':
        notify_mac(message)
    elif sys_platform == 'Linux':
        notify_linux(message)
    elif sys_platform == 'Windows':
        notify_windows(message)
    else:
        print(f'[通知] {NOTIFY_TITLE}\n{message}')


def monitor_stderr():
    """
    Read lines from stdin (assumed to be piped from stderr), and send notification on each line.
    """
    for line in sys.stdin:
        if line.strip():
            haiku = pick_random_haiku()
            send_notification(haiku)
            time.sleep(0.5)  # avoid spamming


def simulate_error_events(interval: int = 10):
    """
    For demo/testing: periodically send random haiku notification.
    """
    try:
        while True:
            haiku = pick_random_haiku()
            send_notification(haiku)
            time.sleep(interval)
    except KeyboardInterrupt:
        print('Stopped simulation.')


def main():
    parser = argparse.ArgumentParser(description='Random OS Fake Error Haiku Notifier')
    subparsers = parser.add_subparsers(dest='command')

    parser_stderr = subparsers.add_parser('monitor', help='Monitor stdin (stderr) and notify on error lines')
    parser_sim = subparsers.add_parser('simulate', help='Send random haiku notifications periodically')
    parser_sim.add_argument('--interval', type=int, default=10, help='Interval seconds between notifications')

    parser_once = subparsers.add_parser('once', help='Send one random haiku notification')

    args = parser.parse_args()

    if args.command == 'monitor':
        monitor_stderr()
    elif args.command == 'simulate':
        simulate_error_events(args.interval)
    elif args.command == 'once':
        haiku = pick_random_haiku()
        send_notification(haiku)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、エラー発生時に開発者の緊張感を和らげることを目的とし、通知内容を完全に俳句に限定しています。俳句は日本語でランダムに選ばれ、実際のエラー内容とは無関係です。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/3/library/subprocess.html
- notify-send: https://wiki.archlinux.jp/index.php/Notify-send
- win10toast: https://github.com/jithurjacob/Windows-10-Toast-Notifications

# 利用例
- ターミナルでビルドエラーやテスト失敗時に自動で俳句通知
- GUIエディタのエラー検知イベントに連動

# 注意点
- 通知はOS標準APIのみを利用し、外部サービス送信やログ保存は行いません。
- 通知が多発する場合は間隔制御(0.5秒sleep)でスパム化を防止しています。
- 俳句の内容は固定リストからランダム選択。追加カスタムも可能です。

# 設計方針
- OS横断的な通知実装(macOS, Linux, Windows)
- 明示呼び出し不要、エラーイベントに自動反応
- 俳句通知は短時間で消え、作業を妨げない

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-os-fake-error-haiku-notifier .agent/skills/random-os-fake-error-haiku-notifier

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

3. ファイル配置確認

ls .agent/skills/random-os-fake-error-haiku-notifier
# SKILL.md, scripts/, references/, README.md があればOK

4. Antigravity を再起動 (or Skill 自動検出を待つ)

新しいSkillが自動で認識されます。リスト確認したい場合は ${productName} に「使える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をコピーしました!
目次