Antigravity ユーザーが日常でぶつかる悩み
Antigravity を日々使っていると、AI coding workflow のなかで repository understanding や path management 以外にも、作業の空気感や集中力にまつわる悩みがつきまといます。特に monorepo など大規模な repository で長時間作業していると、context の切り替えや memory の管理だけでなく、気が付けば「ずっと張り詰めたまま」になりがちです。そんな時、ちょっとした演出や通知があれば――と考えたことはありませんか。
- Antigravity が context を見失って違う場所のコードを参照するたび、緊張感が走る
- monorepo で package を跨いだ瞬間、repository 構造の再説明が必要で空気が重くなる
- session を再開するたびに前回の context や directory 構成を最初から説明し直す手間がしんどい
- AIとの長時間 workflow で long context が膨らみ、重要な情報が埋もれて集中力が切れやすい
- 「ここはこういう構造の repo」と毎回説明する流れがマンネリ化し、現場の雰囲気も固くなりがち
通知・演出・OS連携の観点からも、真面目な開発現場に突如ユーモアを注入できる仕掛けがあれば、Antigravity の利用体験がもっと面白くなりそうです。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Antigravity の作業空間に“謎のOS偽・強制休憩通知”をランダムに炸裂させることで、緊張感やマンネリを一瞬でリセットし、現場にユーモアをもたらします。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の途中に、完全ランダムな休憩通知が現れ、作業の緊張感を一時的にほぐせる
- repo や directory の context 切り替え時に、思わず笑ってしまう演出で雰囲気を和らげる
- 長時間の session でも“休憩タイミング”を自然に作り、memory 管理や集中リセットのきっかけになる
- onboarding 時や session 再開時の堅苦しさを、カオスな通知で一気に打ち消す
- Skill の description マッチによる自動発動で、ユーザー操作なしに“お遊び”要素を注入できる
GitHub から degit でコマンド1行、Antigravity の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/antigravity/random-os-fake-breaktime-alert .agent/skills/random-os-fake-breaktime-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
> Antigravity で新しいプロジェクトを開く
[OS通知] システム推奨: 5分間ぼーっとするべし
理由: repository understanding のため、脳内メモリを一度リセットしてください。
(この通知は自動で消えます)
# Skill の中身を全部見せる
.agent/skills/random-os-fake-breaktime-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agent/skills/random-os-fake-breaktime-alert/
├── SKILL.md
├── scripts/
│ └── fake_breaktime_alert.py
└── references/
└── design_notes.md
各ファイルの役割
ファイル
役割
SKILL.md
Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/fake_breaktime_alert.py
osascript -e 'display notification "{message}" with title "OS通知"
references/design_notes.md
概要 をまとめた参考資料
SKILL.md
---
name: random-os-fake-breaktime-alert
description: Antigravityが長時間作業や集中状態、または『休憩』『リラックス』『集中』などのキーワードを検知した際に発動。ユーザー操作不要で、毎回異なる内容の偽OS休憩通知を自動表示します。
---
# 機能概要
このSkillは、作業中に突如として「謎のOS風・強制休憩通知」をデスクトップに表示します。通知内容は毎回ランダム生成され、「肩回しタイム発動」「OS推奨:5分間ぼーっとするべし」「緊急!脳内メモリ休息モード」など、意味不明かつユーモラスなメッセージが炸裂。真面目な作業現場に唐突なユーモアを注入し、一瞬だけ休憩気分を味わえます。作業効率やデータには一切影響を与えず、緊張感を和らげたい時や、リラックスした雰囲気を作りたい場面に最適です。
# 使い方
このSkillは明示的な呼び出しを必要とせず、Antigravityが「休憩」「リラックス」「集中」「疲労」などのキーワードや長時間作業の兆候を検知した際に自動発動します。ユーザー操作は不要です。
## 暗黙発動キーワード例
- そろそろ休憩しませんか?
- 集中しすぎて肩が凝ってきました
- 長時間作業しています
- 休息タイム
# 出力例
```
[OS通知] 肩回しタイム発動:今すぐ肩をぐるぐる回してください。
[OS通知] OS推奨:5分間ぼーっとするべし。
[OS通知] 緊急!脳内メモリ休息モードに移行します。
[OS通知] 画面を見つめすぎです。深呼吸しましょう。
[OS通知] システム推奨:今だけコーヒーブレイク!
```
# 注意点
- 本Skillは通知表示のみで、ファイル・設定・作業内容には一切影響しません。
- 通知履歴はローカル保存されません。
- OSの通知APIを利用するため、環境によっては通知が表示されない場合があります(Linux: notify-send, Windows: win10toast, macOS: osascript)。
- 業務用端末や通知制限環境では動作しない場合があります。
# 参考資料
- [Python公式: 通知API](https://docs.python.org/3/library/subprocess.html)
- references/design_notes.md 参照
scripts/fake_breaktime_alert.py
import sys
import os
import random
import time
import argparse
import platform
from datetime import datetime, timedelta
NOTIFICATIONS = [
"肩回しタイム発動:今すぐ肩をぐるぐる回してください。",
"OS推奨:5分間ぼーっとするべし。",
"緊急!脳内メモリ休息モードに移行します。",
"画面を見つめすぎです。深呼吸しましょう。",
"システム推奨:今だけコーヒーブレイク!",
"OS警告:まばたき回数が少なすぎます。",
"自動判定:立ち上がってストレッチを推奨。",
"OS診断:集中力が限界です。休憩を!",
"謎のメッセージ:今こそ窓の外を眺める時。",
"OS通知:意味不明な休憩タイム開始。"
]
HISTORY_FILE = os.path.expanduser("~/.fake_breaktime_alert_history")
def send_notification(message):
system = platform.system()
if system == "Darwin": # macOS
os.system(f'''osascript -e 'display notification "{message}" with title "OS通知"''')
elif system == "Linux":
os.system(f'notify-send "OS通知" "{message}"')
elif system == "Windows":
try:
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast("OS通知", message, duration=6)
except ImportError:
print("win10toastが必要です: pip install win10toast")
else:
print(f"[OS通知] {message}")
def log_history(message):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(HISTORY_FILE, "a", encoding="utf-8") as f:
f.write(f"{timestamp}\t{message}\n")
def list_history(limit=10):
if not os.path.exists(HISTORY_FILE):
print("履歴がありません。")
return
with open(HISTORY_FILE, "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines[-limit:]:
print(line.strip())
def summary_history():
if not os.path.exists(HISTORY_FILE):
print("履歴がありません。")
return
count = 0
messages = {}
with open(HISTORY_FILE, "r", encoding="utf-8") as f:
for line in f:
count += 1
msg = line.strip().split("\t", 1)[-1]
messages[msg] = messages.get(msg, 0) + 1
print(f"合計通知回数: {count}")
print("メッセージ別発動回数:")
for msg, cnt in sorted(messages.items(), key=lambda x: -x[1]):
print(f"- {msg}: {cnt}回")
def random_interval(min_sec=900, max_sec=3600):
return random.randint(min_sec, max_sec)
def auto_mode(args):
print("[INFO] 自動モード開始。Ctrl+Cで停止します。")
try:
while True:
interval = random_interval(args.min_interval, args.max_interval)
time.sleep(interval)
message = random.choice(NOTIFICATIONS)
send_notification(message)
log_history(message)
except KeyboardInterrupt:
print("\n[INFO] 停止しました。")
def manual_mode(args):
message = random.choice(NOTIFICATIONS)
send_notification(message)
log_history(message)
print(f"[OS通知] {message}")
def parse_args():
parser = argparse.ArgumentParser(description="謎のOS偽・強制休憩通知スクリプト")
subparsers = parser.add_subparsers(dest="command")
auto_parser = subparsers.add_parser("auto", help="自動で定期的に通知を表示")
auto_parser.add_argument("--min-interval", type=int, default=900, help="通知間隔の最小秒数 (デフォルト: 900)")
auto_parser.add_argument("--max-interval", type=int, default=3600, help="通知間隔の最大秒数 (デフォルト: 3600)")
manual_parser = subparsers.add_parser("once", help="1回だけ通知を表示")
list_parser = subparsers.add_parser("list", help="通知履歴を表示")
list_parser.add_argument("--limit", type=int, default=10, help="表示件数 (デフォルト10件)")
summary_parser = subparsers.add_parser("summary", help="通知履歴のサマリーを表示")
return parser.parse_args()
def main():
args = parse_args()
if args.command == "auto":
auto_mode(args)
elif args.command == "once":
manual_mode(args)
elif args.command == "list":
list_history(args.limit)
elif args.command == "summary":
summary_history()
else:
print("コマンドを指定してください (auto/once/list/summary)。")
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
本Skillは、作業中にユーザーの集中を一瞬だけ和らげるための『偽OS休憩通知』をランダムに表示します。実際の業務やデータには一切影響を与えず、ユーモアとリフレッシュ効果を狙っています。
# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/3/library/subprocess.html
- win10toast: https://github.com/jithurjacob/Windows-10-Toast-Notifications
# 利用例
- 長時間作業時に自動で休憩通知を表示したい場合
- チームの雰囲気を和ませたい時
- ランダムなタイミングでリフレッシュを促したい場合
# 注意点
- 通知はローカル端末の通知APIを利用するため、環境依存性があります。
- 通知履歴はユーザーホーム以下の .fake_breaktime_alert_history に保存されますが、セキュリティやプライバシーへの影響はありません。
# 設計方針
- OSごとに最適な通知APIを選択し、クロスプラットフォーム動作を重視。
- ユーザー操作なしで自然発動する設計。
- メッセージ内容は完全ランダム生成で、毎回異なる体験を提供。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Antigravity はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit 実行に必要)
- Antigravity がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/antigravity/random-os-fake-breaktime-alert .agent/skills/random-os-fake-breaktime-alert
.agent/skills/random-os-fake-breaktime-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agent/skills/random-os-fake-breaktime-alert
# 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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
