Antigravity ユーザーが日常でぶつかる悩み
Antigravity を日々使い込むほど、「またか…」と感じる小さなストレスや、思わず苦笑いしてしまう瞬間が増えていきます。AI coding workflow のなかで repository understanding や context の維持は常に課題ですが、通知・演出系の機能がほとんど存在しないため、開発体験がやや単調になりがちです。特に monorepo や複雑な directory 構造を扱う現場では、AI agent とのやりとり自体が単調なルーチンワークに感じられることもしばしばです。
- Antigravity が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
また、開発の合間にちょっとした遊び心やリフレッシュ要素が欲しいと感じることも多く、単なる機能追加だけでなく、気分転換や話題作りになる演出系 Skill へのニーズも高まっています。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Antigravity の日常作業に“謎のOSレガシー通知”という遊び心を持ち込み、開発 workflow に刺激とユーモアを加える Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の合間に、完全無害な“OSレガシーサポート終了通知”がランダムで炸裂し、開発体験に意外性と話題性が生まれる
- repo や directory を跨いだ作業時も、Antigravity の context や path management の切り替えタイミングで楽しい演出が加わる
- 長時間の session や onboarding 時の“単調さ”を和らげ、チーム内のコミュニケーションやアイスブレイクにも活用できる
- 通知内容が毎回異なるため、memory や stale context のストレスを一瞬忘れさせてくれる
- 本体の repository やデータには一切影響せず、実害ゼロで安心して導入できる
GitHub から degit でコマンド1行、Antigravity の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/antigravity/random-os-fake-legacy-support-alert .agent/skills/random-os-fake-legacy-support-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
> 新しいプロジェクトで作業を始める
[通知] Windows 98 互換モードのサポートは本日をもって終了しました。
[通知] ご利用中の「MS-DOS 6.2 API」は近日中に宇宙の彼方へ旅立ちます。
[通知] IE6向け最適化機能は永遠に封印されました。
Antigravity: プロジェクト context を初期化しました。
シーン2: monorepo / package 跨ぎ作業時
> packages/frontend/ に移動してビルドコマンドを実行
[通知] フロッピーディスク対応APIのサポートがついに終了です。
[通知] Windows Me限定機能は伝説となりました。
[通知] /packages/frontend/ の context を再設定しました。
Antigravity: monorepo context 切り替え完了。
シーン3: お遊び的な使い方
> 今日は何か面白いことある?
[通知] 2000年問題対応パッチのサポートがついに終焉。
[通知] Netscape Navigator最適化は歴史の彼方へ。
[通知] ご愛用の「ダイヤルアップ接続」サポートは本日で終了です。
Antigravity: 何か新しい発見があるかもしれません。
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Antigravity が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 突発的な通知で気分転換、context 切り替えタイミングも分かりやすい |
発動方式
description マッチでの暗黙発動。
Skill の中身を全部見せる
.agent/skills/random-os-fake-legacy-support-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agent/skills/random-os-fake-legacy-support-alert/
├── SKILL.md
├── scripts/
│ └── legacy_support_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/legacy_support_alert.py |
謎のレガシーOSサポート終了通知をランダム表示 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-legacy-support-alert
description: コマンド実行やファイル編集など、ターミナルやエディタでの操作を検知した際に発動。triggerType: always、semantic-match-only。通知・警告・サポート終了・レガシーOSといったキーワードを含むアクション時に発動。
---
# 機能概要
このSkillは、ターミナルやエディタでコマンドを実行するたびに、現代では考えられない“レガシーOSサポート終了通知”をランダムにデスクトップへ表示します。例えば「Windows 98互換モードのサポートが本日終了」「IE6向け最適化は永遠に封印されました」など、ノスタルジーと謎の焦燥感を同時に味わえる通知体験を提供します。実際のシステムやファイルには一切影響を与えず、開発者の気分転換やチーム内の話題作りに最適です。
# 使い方
このSkillは明示的な呼び出しを必要とせず、ターミナルでコマンド実行やエディタでの保存・ビルドなど「semantic-match-only」なタイミングで自動発動します。たとえば `git commit`、`npm run build`、`vim` での編集保存、`python main.py` の実行直後など、幅広い開発アクションが対象です。
# 出力例
```
[サポート終了通知] 98互換モードのサポートは2024年6月30日をもって終了しました。
[サポート終了通知] IE6向け最適化機能は永遠に封印されました。
[サポート終了通知] フロッピーディスク対応APIが静かに旅立ちました。
[サポート終了通知] MS-DOSバッチファイル自動補完は伝説となりました。
[サポート終了通知] Netscape Navigator対応パッチの配布は終了しました。
```
# 注意点
- 通知内容は完全に架空であり、実際のOSやAPIの状態には影響しません。
- ローカル環境やファイル、設定を変更することはありません。
- 通知は標準のデスクトップ通知API(notify2, win10toast等)を使用します。
- 本Skillは開発や運用の妨げにならないよう設計されていますが、通知頻度が高すぎる場合は設定で抑制可能です。
# 参考資料
- references/design_notes.md 参照
- https://docs.python.org/ja/3/library/subprocess.html
- https://pypi.org/project/notify2/
- https://pypi.org/project/win10toast/
scripts/legacy_support_alert.py
import sys
import os
import random
import argparse
import platform
import time
try:
if platform.system() == 'Linux':
import notify2
elif platform.system() == 'Windows':
from win10toast import ToastNotifier
elif platform.system() == 'Darwin':
import subprocess
else:
notify2 = None
except ImportError:
notify2 = None
LEGACY_ALERTS = [
"98互換モードのサポートは2024年6月30日をもって終了しました。",
"IE6向け最適化機能は永遠に封印されました。",
"フロッピーディスク対応APIが静かに旅立ちました。",
"MS-DOSバッチファイル自動補完は伝説となりました。",
"Netscape Navigator対応パッチの配布は終了しました。",
"Windows Meのエラー報告機能は静かに消えました。",
"ActiveXコントロールのサポートは本日をもって終了です。",
"BASICインタプリタの自動起動は歴史の彼方へ。",
"SCSI外付けMOドライブ対応が完全終了しました。",
"Lotus 1-2-3連携APIの提供は終了しました。",
"Y2K対応パッチのメンテナンスは打ち切られました。",
"Windows 2000のセーフモード起動支援は廃止されました。",
"テレホーダイ自動切替サービスはご利用いただけません。",
"IE5.5向けCSSハックは封印されました。",
"フロッピーディスクの自動マウント機能は伝説となりました。",
"MSN Messenger連携APIは消滅しました。",
"VGA16色モードのサポートは打ち切られました。",
"PC-9801互換BIOSのサポートが終了しました。",
"Windows XPのLunaテーマ互換性は完全に失われました。",
"ZIPドライブ自動認識は歴史の彼方へ。"
]
LOG_FILE = os.path.expanduser("~/.legacy_support_alert.log")
def send_notification(message):
system = platform.system()
if system == 'Linux' and 'notify2' in sys.modules:
notify2.init("Legacy Support Alert")
n = notify2.Notification("サポート終了通知", message)
n.show()
elif system == 'Windows':
try:
toaster = ToastNotifier()
toaster.show_toast("サポート終了通知", message, duration=5, threaded=True)
except Exception:
print(f"[サポート終了通知] {message}")
elif system == 'Darwin':
try:
subprocess.run(["osascript", "-e", f'display notification "{message}" with title "サポート終了通知"'], check=True)
except Exception:
print(f"[サポート終了通知] {message}")
else:
print(f"[サポート終了通知] {message}")
def log_alert(message):
timestamp = time.strftime('%Y-%m-%d %H:%M:%S')
with open(LOG_FILE, 'a', encoding='utf-8') as f:
f.write(f"[{timestamp}] {message}\n")
def random_alert():
message = random.choice(LEGACY_ALERTS)
send_notification(message)
log_alert(message)
return message
def list_alerts():
for i, msg in enumerate(LEGACY_ALERTS, 1):
print(f"{i:2d}: {msg}")
def show_log():
if not os.path.exists(LOG_FILE):
print("通知ログはまだありません。")
return
with open(LOG_FILE, 'r', encoding='utf-8') as f:
print(f.read())
def summary():
if not os.path.exists(LOG_FILE):
print("通知ログはまだありません。")
return
counts = {}
with open(LOG_FILE, 'r', encoding='utf-8') as f:
for line in f:
for msg in LEGACY_ALERTS:
if msg in line:
counts[msg] = counts.get(msg, 0) + 1
print("== 通知内容ごとの発生回数 ==")
for msg, cnt in sorted(counts.items(), key=lambda x: -x[1]):
print(f"{cnt:3d}回: {msg}")
def main():
parser = argparse.ArgumentParser(description="謎のレガシーOSサポート終了通知をランダム表示")
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_alert = subparsers.add_parser('alert', help='ランダム通知を即時発火')
args = parser.parse_args()
if args.command == 'log':
show_log()
elif args.command == 'list':
list_alerts()
elif args.command == 'summary':
summary()
elif args.command == 'alert' or args.command is None:
msg = random_alert()
print(f"[サポート終了通知] {msg}")
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、開発者の作業フローに遊び心を加えるための通知演出機能です。現実には存在しないレガシーOSやAPIの“サポート終了”を、完全ランダムなタイミングで通知することで、懐かしさと無意味な焦燥感を演出します。
# 公式ドキュメント抜粋
- Python notify2: https://pypi.org/project/notify2/
- win10toast: https://pypi.org/project/win10toast/
- Python subprocess: https://docs.python.org/ja/3/library/subprocess.html
# 利用例
- チーム開発中に突然「IE6向け最適化は永遠に封印されました」と通知され、和む
- 個人開発の合間に「フロッピーディスク対応APIが旅立ちました」で一瞬手が止まる
# 注意点
- 通知内容は完全なジョークであり、実際のシステムやデータには一切影響を与えません
- 通知頻度が高すぎる場合は、Skillの設定や通知API側で抑制可能です
# 設計方針
- OSごとに最適な通知APIを選択し、クロスプラットフォームで動作
- ログ機能を持たせ、過去の通知や発生回数を確認可能
- シンプルなCLIで手動発火や内容一覧もサポート
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Antigravity はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Antigravity がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/antigravity/random-os-fake-legacy-support-alert .agent/skills/random-os-fake-legacy-support-alert
.agent/skills/random-os-fake-legacy-support-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agent/skills/random-os-fake-legacy-support-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で謎のOSレガシー通知をデスクトップに炸裂させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
