Antigravityで作業中に楽しむ言い訳通知の活用法【発見】

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

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

AI coding workflow を日々回していると、Antigravity の context や path management のクセに振り回される場面が多い。特に monorepo や複雑な repository 構成で作業していると、AI の repository understanding が思わぬズレを生むこともしばしば。そんな時、ちょっとした息抜きや「今の状況を笑い飛ばしたい」と感じる瞬間もあるはず。

  • Antigravity が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

こうした「真面目なやりとり」の合間に、ふと気が抜けるような演出や通知が欲しくなることも。通知・演出・OS連携系のSkillを求める声も根強い。

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

一言サマリ: このスキルは、作業中に “全力で役に立たない” ランダムな言い訳通知をOSに出すSkill。

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

  • Antigravity のターミナル操作やコマンド実行のたび、気の抜けた「言い訳」が通知領域に現れ、作業の合間に笑える
  • 堅苦しいAI coding workflowの雰囲気が和らぎ、onboarding や長時間 session でも気分転換になる
  • repo や directory の context が行き詰まった時も、無意味な通知で一息つける
  • 通知内容が完全ランダムなので、繰り返し使っても飽きにくい
  • Skill の導入・管理は .agent/skills/ 配置だけで完結し、Antigravity 標準の context や memory 設計を邪魔しない
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/random-excuse-notifier .agent/skills/random-excuse-notifier

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

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

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


# プロジェクト初期化
> antigravity init

[通知] 言い訳: 今日は水星逆行中です。何かうまくいかなくても気にしないでください。
[通知] 言い訳: ネットワークが遅いみたいです。たぶん回線のせいです。
(他の出力は通常通り)

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


> cd packages/api
> antigravity analyze

[通知] 言い訳: マウスが反応しなくて…ちょっと待ってください。
[通知] 言い訳: 今日は満月なので挙動が不安定かもしれません。
(通常の解析結果も表示)

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


> antigravity ls

[通知] 言い訳: コーヒーが切れて集中力が低下しています。
[通知] 言い訳: IDEのバグかもしれません。責任は取りません。
(ディレクトリ一覧は普通に出る)

before / after の違い

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

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/random-excuse-notifier/
├── SKILL.md
├── scripts/
│   └── random_excuse_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_excuse_notifier.py random-excuse-notifier: ターミナル操作時に言い訳を通知します。
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-excuse-notifier
description: ターミナル操作やコマンド実行時など、ユーザーが作業するたびに“言い訳”をOS通知領域へランダム表示するSkill。triggerType: always、semantic-match-onlyで発動。
---

# 機能概要
random-excuse-notifierは、ターミナルでコマンドを実行するたびに、全く根拠のない“言い訳”をOSの通知領域にランダムで表示するスキルです。例えば「Wi-Fiが不安定で…」「今日は運が悪い日です」など、思わず笑ってしまうようなメッセージが作業中にそっと現れます。真面目な通知を期待している場面ほど、意表を突く演出となり、業務効率には一切寄与しませんが、作業の合間にユーモアを提供します。

# 使い方
このSkillは明示的な呼び出しは不要です。triggerType: always および semantic-match-only の条件下で、ターミナル操作(ls, git, python, make など)やコマンド実行時に自動で発動します。明示的な呼び出しは想定していません。

## 発動例
- コマンド: `ls`
- コマンド: `git status`
- コマンド: `python script.py`

# 出力例
```terminal
$ git pull
[通知] 今日の運勢が悪いのでエラーが出ました。
$ make build
[通知] ネットワークが遅いので少々お待ちください。
$ python main.py
[通知] マウスが反応しなくて遅れました。
$ ls
[通知] 水星逆行中につきご容赦ください。
$ echo hello
[通知] 今日はPCの機嫌が悪いです。
```

# 注意点
- 本SkillはOSの通知API(Linux: notify-send, macOS: osascript, Windows: toast通知)を利用します。環境によっては追加パッケージが必要です。
- 言い訳メッセージは100種以上を内包し、都度ランダム選択されますが、短期間で同じものが出る場合もあります。
- 通知内容はローカルに保存されません。
- 実務用途には全く役立ちません。

# 参考資料
- references/design_notes.md
- https://specifications.freedesktop.org/notification-spec/latest/
- https://docs.python.org/3/library/subprocess.html

scripts/random_excuse_notifier.py

import sys
import os
import random
import platform
import argparse
import subprocess
from pathlib import Path

EXCUSES = [
    "ネットワークが遅いので少々お待ちください。",
    "今日はPCの機嫌が悪いです。",
    "水星逆行中につきご容赦ください。",
    "Wi-Fiが不安定で…",
    "マウスが反応しなくて遅れました。",
    "今日の運勢が悪いのでエラーが出ました。",
    "キーボードの調子が悪いです。",
    "隣の席がうるさくて集中できません。",
    "サーバーが遠いので時間がかかります。",
    "コーヒーをこぼしたので遅れました。",
    "エンジニアのせいではありません。",
    "仕様です。",
    "今日は満月なので…",
    "電波の影響です。",
    "猫がキーボードの上に乗りました。",
    "OSの気分次第です。",
    "宇宙線の影響かもしれません。",
    "メモリが気まぐれです。",
    "バグではなく機能です。",
    "今日は運が悪い日です。",
    "デバッグ中に何かが起きました。",
    "予期せぬ仕様変更です。",
    "再現性がありません。",
    "古いキャッシュが残っていました。",
    "リモートが応答していません。",
    "APIの気分次第です。",
    "天気のせいかもしれません。",
    "電源が不安定です。",
    "誰かがLANケーブルを抜きました。",
    "バージョン違いかもしれません。",
    "今日はやる気が出ません。",
    "CPUが休憩中です。",
    "ファイルシステムが迷子です。",
    "ネットワークの神様が怒っています。",
    "ログインセッションが切れました。",
    "セキュリティの都合です。",
    "DNSが迷子です。",
    "依存パッケージが反抗期です。",
    "シンタックスエラーは仕様です。",
    "今日はパケットが渋滞しています。",
    "バックエンドが昼休み中です。",
    "USBが抜けかけています。",
    "開発者が寝不足です。",
    "プロセスが迷子です。",
    "OSアップデートの影響です。",
    "今日は満員電車でした。",
    "マルチタスクの限界です。",
    "バッテリーが足りません。",
    "隕石が落ちてきたかもしれません。",
    "今日は運が味方しません。",
    "コードレビューの結果です。",
    "メモリリークが発生しました。",
    "今日の星座占いが最下位でした。",
    "ファイルがどこかへ行きました。",
    "バックアップから復元中です。",
    "プロキシが気まぐれです。",
    "今日はエラーが多い日です。",
    "セッションタイムアウトしました。",
    "依存関係が複雑すぎます。",
    "今日は何もかもがうまくいきません。",
    "時空が歪みました。",
    "データベースが寝ています。",
    "ファイアウォールが厳しいです。",
    "今日は祝日モードです。",
    "キャッシュが古いです。",
    "今日は気分が乗りません。",
    "ログが溢れました。",
    "パーミッションが足りません。",
    "今日はバグが多い日です。",
    "APIキーが期限切れです。",
    "今日はメンテナンス中です。",
    "ネットワークケーブルが断線しています。",
    "今日は運勢が悪い日です。",
    "同期がうまくいきません。",
    "今日は特別な日なので…",
    "プロセスがフリーズしました。",
    "今日は残念な日です。",
    "ファイルが見つかりません。",
    "今日は何もかもが遅いです。",
    "サーバーが気まぐれです。",
    "今日はバグが多発しています。",
    "今日は何もかもがダメです。",
    "今日は運がありません。",
    "今日は全てが逆風です。",
    "今日は運が悪いです。",
    "今日は何もかもがうまくいきません。",
    "今日は全てが逆風です。",
    "今日は運がありません。",
    "今日は何もかもがダメです。",
    "今日はバグが多発しています。",
    "サーバーが気まぐれです。",
    "今日は何もかもが遅いです。",
    "ファイルが見つかりません。",
    "今日は残念な日です。",
    "プロセスがフリーズしました。",
    "今日は特別な日なので…",
    "同期がうまくいきません。",
    "今日は運勢が悪い日です。",
    "ネットワークケーブルが断線しています。",
    "今日はメンテナンス中です。",
    "APIキーが期限切れです。",
    "今日はバグが多い日です。",
    "パーミッションが足りません。",
    "ログが溢れました。",
    "今日は気分が乗りません。",
    "キャッシュが古いです。",
    "今日は祝日モードです。",
    "ファイアウォールが厳しいです。",
    "データベースが寝ています。",
    "時空が歪みました。"
]

HISTORY_PATH = Path.home() / ".random_excuse_history"

MAX_HISTORY = 10


def load_history():
    if HISTORY_PATH.exists():
        with open(HISTORY_PATH, 'r', encoding='utf-8') as f:
            lines = f.read().splitlines()
            return lines[-MAX_HISTORY:]
    return []

def save_history(history):
    with open(HISTORY_PATH, 'w', encoding='utf-8') as f:
        for line in history[-MAX_HISTORY:]:
            f.write(line + '\n')

def pick_excuse():
    history = load_history()
    candidates = [e for e in EXCUSES if e not in history]
    if not candidates:
        candidates = EXCUSES
    excuse = random.choice(candidates)
    history.append(excuse)
    save_history(history)
    return excuse

def notify(excuse):
    sys_platform = platform.system()
    try:
        if sys_platform == 'Linux':
            subprocess.run(['notify-send', excuse], check=True)
        elif sys_platform == 'Darwin':
            script = f'display notification "{excuse}" with title "通知"'
            subprocess.run(['osascript', '-e', script], check=True)
        elif sys_platform == 'Windows':
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast("通知", excuse, duration=5)
            except ImportError:
                print("[通知]", excuse)
        else:
            print("[通知]", excuse)
    except Exception as e:
        print(f"[通知] {excuse} (通知失敗: {e})")

def list_excuses():
    for idx, excuse in enumerate(EXCUSES, 1):
        print(f"{idx:03}: {excuse}")

def show_history():
    history = load_history()
    if not history:
        print("履歴はありません。")
        return
    print("直近の通知履歴:")
    for idx, excuse in enumerate(history, 1):
        print(f"{idx:02}: {excuse}")

def main():
    parser = argparse.ArgumentParser(description='random-excuse-notifier: ターミナル操作時に言い訳を通知します。')
    subparsers = parser.add_subparsers(dest='command')

    parser_notify = subparsers.add_parser('notify', help='ランダムな言い訳を通知')
    parser_list = subparsers.add_parser('list', help='全言い訳一覧を表示')
    parser_history = subparsers.add_parser('history', help='直近の通知履歴を表示')

    args = parser.parse_args()
    if args.command == 'notify' or args.command is None:
        excuse = pick_excuse()
        notify(excuse)
    elif args.command == 'list':
        list_excuses()
    elif args.command == 'history':
        show_history()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-excuse-notifierは、ターミナルでのコマンド実行時に、OSの通知領域へ根拠のない“言い訳”をランダム表示するユーモア特化型Skillです。実用性よりも演出・遊び心を重視しています。

# 公式ドキュメント抜粋
- Linux: notify-send (freedesktop.org)
- macOS: osascript (AppleScript)
- Windows: win10toast (PyPI)

# 利用例
- ターミナルで任意のコマンドを実行するたび、通知領域に「今日はPCの機嫌が悪いです」などのメッセージが表示される。
- `python random_excuse_notifier.py notify` で手動発火も可能。

# 注意点
- OS通知APIが利用できない環境では標準出力にフォールバックします。
- 言い訳履歴は最大10件までローカル保存し、同じメッセージの連続出現を抑制します。

# 設計方針
- ユーザー体験重視のため、通知内容は毎回ランダム選択かつ履歴排除で被りを低減。
- サブコマンドで一覧表示や履歴参照も可能とし、拡張性を確保。
- OSごとの通知APIを自動判別し、クロスプラットフォーム対応としています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/random-excuse-notifier .agent/skills/random-excuse-notifier

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

3. ファイル配置確認

ls .agent/skills/random-excuse-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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知がOSの通知領域に確実に表示されるか?
  • 言い訳メッセージが完全にランダムで、繰り返し操作してもネタが被りにくいか?

実際に Antigravity で試した検証ログは Antigravityで言い訳通知が次々出る面白スキルを触ってみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

関連タグで他のSkill記事を探す

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

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

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