Antigravity ユーザーが日常でぶつかる悩み
Antigravity を日常的に使っていると、AI coding workflow の中で「思わず笑いたくなるようなちょっとした息抜き」や「作業に行き詰まった時の気分転換」がほしいと感じる瞬間があります。特に長時間の repository 理解や context 設定、monorepo の path 管理に集中していると、ふとしたタイミングで肩の力が抜ける“何か”が恋しくなるものです。
一方で、通知や演出系の Skill は「作業の邪魔にならないか」「本当に役立つのか」といった懸念から導入に踏み切れず、結局は淡々とした画一的な開発体験に落ち着いてしまいがちです。
Antigravity 固有の workflow で、こんな悩みがよく挙がります:
- Antigravity が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
こうした真面目な悩みの合間に、全く役に立たないが「なんだこれ」と笑える通知が混ざったら、開発現場に新たな空気が流れるかもしれません。
この Skill が一言でいうと何を解決するか
一言サマリ: 作業中に突如デスクトップ通知で“謎のOSパッチノート”が現れますSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の単調さを崩し、開発現場にランダムな笑いと小さな混乱をもたらす
- Antigravity の session 中に、思わず二度見するような“意味不明なOSパッチノート”通知が不意に表示される
- 集中しすぎて context や repo 構造に没頭している時ほど、唐突な通知でリフレッシュできる
- onboarding や長時間作業の合間に、意図せずコミュニケーションのきっかけが生まれる
- Skill の説明文や説明不要で、description マッチだけで自動発動するため導入も簡単
GitHub から degit でコマンド1行、Antigravity の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/antigravity/random-os-fake-patch-notifier .agent/skills/random-os-fake-patch-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
> プロジェクトのセットアップ手順を教えて
[通知] OS Patch Note 0.9.8.7
- バグ修正: 週明けのやる気が0になる現象を修正しました
- 新機能: 3時のおやつタイムに自動で眠気を注入します
- 既知の問題: /tmp/coffee_spill ディレクトリが増殖し続けます
(続けて Antigravity が通常のセットアップ手順を回答)
シーン2: monorepo / package 跨ぎ作業時
> packages/api/ と packages/web/ の依存関係を整理して
[通知] OS Patch Note 1.2.0-beta
- バグ修正: package.json の typo を自動で増やす機能を追加
- 新機能: monorepo で迷子になる確率が1.5倍になりました
- 既知の問題: directory 境界で context がランダムにシャッフルされます
(依存関係の整理方法を通常通り提案)
シーン3: お遊び的な使い方
> 今日はやる気が出ません
[通知] OS Patch Note 0.0.1-alpha
- 新機能: 気分が乗らない時は自動でPCを再起動します
- バグ修正: 何もしていないのにバグが発生する現象を放置しました
- 既知の問題: /dev/null に投げたタスクが復活することがあります
(通常通り雑談や励ましのメッセージを返す)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Antigravity が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 唐突な通知で気分転換、集中力がリセットされやすい |
発動方式
description マッチでの暗黙発動。
Skill の中身を全部見せる
.agent/skills/random-os-fake-patch-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agent/skills/random-os-fake-patch-notifier/
├── SKILL.md
├── scripts/
│ └── random_os_fake_patch_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_fake_patch_notifier.py |
Random OS Fake Patch Notifier Skill |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-patch-notifier
description: 作業中やコーディング時に“パッチ”“アップデート”“バグ修正”などのキーワードが検出された際、Antigravityが完全ランダムなタイミングで偽のOSパッチノート通知を自動表示します。通知内容は毎回異なり、実際の作業や環境には一切影響しません。
---
# 機能概要
このSkillは、開発現場や作業中に突如として“謎のOSパッチノート”をデスクトップ通知で表示します。通知内容は完全にでたらめで、「バグ:やる気が0になる問題を修正」「新機能:午後3時に眠気を自動注入」など、実際には役立たず、OS開発者も絶対に実装しないような珍妙なアップデート情報ばかりです。通知タイミングと内容は完全ランダムで、集中している時ほど思わず笑ってしまうような混乱とユーモアをもたらします。
# 使い方
このSkillは明示的な呼び出しは不要です。Antigravityが「パッチ」「アップデート」「バグ修正」などのキーワードを検出した場合や、semantic-match-onlyトリガーによって自動的に発動します。暗黙的な発動例としては、パッチノートの記述やOS関連の議論中などが挙げられます。
# 出力例
```
[通知] OSパッチノート v13.7.42
- バグ修正: 画面を見つめすぎると現実逃避する問題を修正
- 新機能: 3時のおやつ自動リマインダーを追加
- 既知の問題: 希望が時々消失することがあります
```
```
[通知] OSパッチノート v2.0.1-beta
- バグ修正: キーボードが突然歌い出す問題を修正
- 新機能: 画面の端にランダムな猫が出現します
```
# 注意点
- 通知は完全にジョーク目的であり、実際のOSや作業環境には一切影響を与えません。
- 通知内容やタイミングは毎回異なり、個別に制御できません。
- ローカルに通知履歴は保存されません。
- システム通知APIを利用するため、Linux/macOS/Windowsで動作しますが、通知の見え方は環境依存です。
# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- 公式API: https://docs.python.org/3/library/subprocess.html, https://pypi.org/project/plyer/
scripts/random_os_fake_patch_notifier.py
import random
import time
import sys
import argparse
import platform
import subprocess
from datetime import datetime
try:
from plyer import notification
PLYER_AVAILABLE = True
except ImportError:
PLYER_AVAILABLE = False
FAKE_PATCH_NOTES = [
[
"バグ修正: やる気が0になる問題を修正",
"新機能: 午後3時に眠気を自動注入",
"既知の問題: 希望が時々消失することがあります"
],
[
"バグ修正: キーボードが突然歌い出す問題を修正",
"新機能: 画面の端にランダムな猫が出現します",
"既知の問題: コーヒーが冷める速度が2倍になっています"
],
[
"新機能: 3時のおやつ自動リマインダーを追加",
"バグ修正: 画面を見つめすぎると現実逃避する問題を修正",
"既知の問題: タスクバーが時々踊りだします"
],
[
"新機能: 進捗がない場合、画面が自動で暗転します",
"バグ修正: ウィンドウが勝手に閉じる問題を修正",
"既知の問題: 進捗が出るとは限りません"
],
[
"バグ修正: 机から物が落ちる現象を修正(未検証)",
"新機能: 画面右下に謎のボタンを追加(用途不明)",
"既知の問題: ボタンを押すと何も起きません"
],
[
"新機能: 週末になると自動で休憩を提案します",
"バグ修正: 画面が突然真っ白になる問題を修正",
"既知の問題: 休憩提案がしつこい場合があります"
],
[
"バグ修正: マウスが現実世界をクリックする問題を修正",
"新機能: 画面内にランダムな犬が出現します",
"既知の問題: 犬が吠えることがあります"
],
[
"新機能: 進捗バーが気分で変動します",
"バグ修正: 画面の色が突然変わる問題を修正",
"既知の問題: 進捗バーが現実を反映しません"
]
]
VERSION_FORMATS = [
"v{major}.{minor}.{patch}",
"v{major}.{minor}.{patch}-beta",
"v{major}.{minor}.{patch}-rc{rc}"
]
def random_version():
major = random.randint(1, 15)
minor = random.randint(0, 99)
patch = random.randint(0, 99)
rc = random.randint(1, 5)
fmt = random.choice(VERSION_FORMATS)
return fmt.format(major=major, minor=minor, patch=patch, rc=rc)
def random_patch_note():
notes = random.choice(FAKE_PATCH_NOTES)
random.shuffle(notes)
return notes
def show_notification(title, message):
if PLYER_AVAILABLE:
notification.notify(
title=title,
message=message,
timeout=8
)
else:
plat = platform.system()
if plat == "Darwin":
subprocess.run([
"osascript", "-e",
f'display notification "{message}" with title "{title}"'
])
elif plat == "Linux":
subprocess.run([
"notify-send", title, message])
elif plat == "Windows":
# fallback: print to stdout
print(f"[通知] {title}\n{message}")
else:
print(f"[通知] {title}\n{message}")
def generate_fake_patch_note():
version = random_version()
notes = random_patch_note()
title = f"OSパッチノート {version}"
message = "\n".join(notes)
return title, message
def log_notification(title, message):
logline = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {title}\n{message}\n"
with open(".random_os_fake_patch_notifier.log", "a", encoding="utf-8") as f:
f.write(logline)
def random_wait(min_sec=60, max_sec=900):
return random.randint(min_sec, max_sec)
def main():
parser = argparse.ArgumentParser(description="Random OS Fake Patch Notifier Skill")
subparsers = parser.add_subparsers(dest="command")
parser_log = subparsers.add_parser("log", help="通知履歴を表示")
parser_list = subparsers.add_parser("list", help="通知履歴をリスト表示")
parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリーを表示")
parser_run = subparsers.add_parser("run", help="Skill本体を実行 (常駐) ※Ctrl+Cで停止")
parser_run.add_argument("--min", type=int, default=60, help="通知の最小間隔(秒)")
parser_run.add_argument("--max", type=int, default=900, help="通知の最大間隔(秒)")
args = parser.parse_args()
if args.command == "log":
try:
with open(".random_os_fake_patch_notifier.log", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError:
print("通知履歴がありません。")
elif args.command == "list":
try:
with open(".random_os_fake_patch_notifier.log", encoding="utf-8") as f:
for line in f:
if line.startswith("["):
print(line.strip())
except FileNotFoundError:
print("通知履歴がありません。")
elif args.command == "summary":
try:
with open(".random_os_fake_patch_notifier.log", encoding="utf-8") as f:
lines = f.readlines()
count = sum(1 for l in lines if l.startswith("["))
print(f"通知回数: {count}")
if count > 0:
print(f"最新: {lines[-3].strip()}")
except FileNotFoundError:
print("通知履歴がありません。")
elif args.command == "run":
print("[INFO] Random OS Fake Patch Notifier Skillを開始します。Ctrl+Cで停止。")
try:
while True:
wait_sec = random_wait(args.min, args.max)
time.sleep(wait_sec)
title, message = generate_fake_patch_note()
show_notification(title, message)
log_notification(title, message)
except KeyboardInterrupt:
print("\n[INFO] Skillを終了します。")
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
本Skillは、開発現場にユーモアとリフレッシュをもたらすため、完全に架空のOSパッチノートをランダムなタイミングで通知するものです。通知内容はスクリプト内でランダム生成され、実際の作業や環境には一切影響を与えません。
# 公式ドキュメント抜粋
- plyer: https://plyer.readthedocs.io/en/latest/
- notify-send (Linux): https://specifications.freedesktop.org/notification-spec/latest/
- osascript (macOS): https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/
# 利用例
- チーム開発中のリラックスやアイスブレイク
- 長時間作業時の気分転換
- オンラインミーティング中の話題作り
# 注意点
- 通知内容は完全なジョークであり、実務やシステム運用に使うものではありません。
- ログはローカルファイル(.random_os_fake_patch_notifier.log)にのみ保存されます。
- 通知APIは環境依存のため、見え方や動作が異なる場合があります。
# 設計方針
- 実在APIのみを利用し、環境に依存しない安定動作を目指す
- 通知タイミング・内容ともに完全ランダム
- 履歴管理やサマリー表示など、最低限のCLI機能を実装
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Antigravity はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Antigravity がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/antigravity/random-os-fake-patch-notifier .agent/skills/random-os-fake-patch-notifier
.agent/skills/random-os-fake-patch-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agent/skills/random-os-fake-patch-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 でも有効か?
- プロジェクト指示との連携をどう組み立てるか?
- 完全ランダムなタイミングで通知が発火するか?
- 通知タイトル・本文が毎回違うネタ生成か?
- 通知が環境や作業内容に影響を与えないこと
実際に Antigravity で試した検証ログは Antigravityの謎OSパッチ通知を試してみた! 笑いと混乱の演出スキル にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
