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 設計を邪魔しない
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
