Antigravity ユーザーが日常でぶつかる悩み
Antigravity を日々使っていると、AI coding workflow の中で「なんだか単調」「気が抜けない」「集中しすぎて疲れる」など、作業が淡々と進みがちな瞬間があります。特に通知や演出系 Skill が少ない現状では、開発現場が無機質になりがちです。さらに、OS 連携による遊び心ある演出がないため、ちょっとしたリフレッシュやチームの空気を和らげるきっかけが不足しがちです。
Antigravity 固有の context 管理や path management の悩みとも絡めて、以下のような「あるある」を感じる場面が多く見受けられます。
- Antigravity が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
こうした真面目な悩みに加えて、時には「突発的なイベントで現場の空気を変えたい」「疲れた時にちょっとしたカオス演出でリフレッシュしたい」といったニーズも見逃せません。
この Skill が一言でいうと何を解決するか
一言サマリ: 突然Skill。
このSkillを導入することで、Antigravity の日常的な AI coding workflow に突如として「OSソフトウェアアップデート vs バグ魔王」というRPG風バトル実況が割り込むようになります。具体的には:
- 単調な repository 作業や長時間の context 管理の合間に、RPG風の演出で現場の雰囲気を一変できる
- 進捗バーや通知が「アップデート勇者 vs バグ魔王」の実況になり、作業中に思わず笑ってしまう余白が生まれる
- バトル展開やセリフが毎回ランダムなので、同じ演出に飽きることがない
- OSの通知や画面端で、突然始まるカオス演出により、onboarding や session 再開時の気分転換にも使える
- Skill の description マッチで自動発動し、ユーザーの操作を邪魔せず自然に混ざる
GitHub から degit でコマンド1行、Antigravity の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/antigravity/random-os-fake-software-update-boss-fight .agent/skills/random-os-fake-software-update-boss-fight実行したらこうなる (3つの利用シーン)
このSkillが発動すると、まるでOSのソフトウェアアップデート通知がRPGバトル実況に変身したかのような演出が始まります。以下、代表的な利用シーンの擬似terminal出力例です。
シーン1: session 開始時 (プロジェクト初動で)
> 新しいリポジトリで作業を始めたい
[OSソフトウェアアップデート通知]
伝説のバグ魔王が現れた!
アップデート勇者が「パッチの剣」を装備した!
進捗バー: ███░░░░░ 30%
バグ魔王「このバグは永遠に直らぬ!」
勇者「バグ修正スクリプト発動!」
進捗バー: ██████░░ 60%
バグ魔王の逆襲!
進捗バー: ████████ 80%
勇者、パッチの剣でとどめ!
進捗バー: ████████ 100%
【勝利】アップデート勇者がバグ魔王を倒しました!
シーン2: monorepo / package 跨ぎ作業時
> packages/api/ と packages/web/ を同時に修正したい
[アップデート通知]
アップデート勇者が monorepo の迷宮に迷い込んだ!
バグ魔王「新たな依存バグを召喚!」
進捗バー: ██░░░░░░ 20%
勇者「ディレクトリ構造を解析中…」
進捗バー: ████░░░░ 40%
バグ魔王「context を乱す混沌の呪文!」
勇者「パス管理 Skill で対抗!」
進捗バー: ███████░ 70%
【全滅】バグ魔王のバグ爆弾でアップデート勇者が倒れた…
シーン3: お遊び的な使い方
> 今日は集中力が切れたので何か面白いことをして
[OSアップデート風バトル]
アップデート勇者「リポジトリの長い旅が始まる…」
バグ魔王「context を奪ってやる!」
進捗バー: █░░░░░░░ 10%
勇者「SKILL.md の加護を受けた!」
進捗バー: █████░░ 50%
バグ魔王「irrelevant path を投げつけた!」
進捗バー: ████████ 90%
勇者「AI coding workflow の力でバグ魔王を吹き飛ばした!」
進捗バー: ████████ 100%
【勝利】アップデート勇者が伝説のバグ魔王を完全修正!
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Antigravity が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | RPG風演出で一息、集中力リセットのきっかけになる |
発動方式
description マッチでの暗黙発動。
Skill の中身を全部見せる
.agent/skills/random-os-fake-software-update-boss-fight/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agent/skills/random-os-fake-software-update-boss-fight/
├── SKILL.md
├── scripts/
│ └── os_update_boss_fight.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/os_update_boss_fight.py |
OSアップデートRPGバトル通知スクリプト |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-software-update-boss-fight
description: 開発現場や作業中に『ソフトウェアアップデート』や『バグ修正』などのキーワードが会話や作業ログに現れた時、Antigravityが自動でRPG風バトル実況の茶番通知を発動します。
---
# 機能概要
このSkillは、OSのソフトウェアアップデート通知を装ったRPG風バトル実況を自動生成し、画面端や通知領域に表示します。進捗バーやメッセージが「アップデート勇者」と「伝説のバグ魔王」の熱い戦いとして描写され、アップデートの進捗やバトル展開が毎回異なります。最終的に“勝利”または“全滅”で締めくくられ、日常の業務にユーモアと非日常感をもたらします。
# 使い方
このSkillは明示的な呼び出しは不要です。会話や作業ログに「アップデート」「バグ修正」「パッチ」「OS更新」などのキーワードが検出された際、自動で発動します。暗黙発動例:
- 「今日のアップデート内容は?」
- 「バグ修正パッチを適用しました」
- 「OSの更新が必要です」
# 出力例
```
[OSアップデート進行中...]
勇者アップデーターがバグ魔王に挑む!
バグ魔王の逆襲!進捗 23%
勇者、パッチの剣を抜く!進捗 47%
バグ魔王、致命的なエラー波を放つ!進捗 68%
勇者、バグ魔王を討伐!進捗 100%
アップデート完了:勇者の勝利!
```
# 注意点
- 本Skillは業務効率化や実際のアップデート管理機能は持ちません。
- 通知や進捗バーはOS標準API(macOS: `osascript`, Windows: `toast`, Linux: `notify-send`)を利用します。
- ローカルに一時的なログを保存しますが、個人情報や機密情報は扱いません。
- 除外パスや特定アプリケーションでは発動しない設定も可能です。
# 参考資料
- [macOS osascript documentation](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [Windows Toast Notifications](https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/toast-notifications)
- [Linux notify-send manpage](https://man7.org/linux/man-pages/man1/notify-send.1.html)
- references/design_notes.md も参照
scripts/os_update_boss_fight.py
import sys
import time
import random
import argparse
import platform
import subprocess
from datetime import datetime
BATTLE_EVENTS = [
("勇者アップデーターがバグ魔王に挑む!", 0),
("バグ魔王の逆襲!", 20),
("勇者、パッチの剣を抜く!", 40),
("バグ魔王、致命的なエラー波を放つ!", 60),
("勇者、バグ魔王にクリティカルヒット!", 80),
("バグ魔王、最後の抵抗!", 90)
]
VICTORY_LINES = [
"アップデート完了:勇者の勝利!",
"アップデート成功!バグ魔王を討伐しました。",
"アップデート勇者、伝説のバグ魔王を撃破!"
]
DEFEAT_LINES = [
"アップデート失敗:全滅...バグ魔王の勝利。",
"バグ魔王の猛攻!システムは全滅した...",
"アップデート勇者、力尽きる。バグ魔王の逆襲成功。"
]
PROGRESS_BAR_LENGTH = 30
LOG_FILE = "boss_fight_update.log"
def notify(title, message):
system = platform.system()
try:
if system == "Darwin":
script = f'display notification "{message}" with title "{title}"'
subprocess.run(["osascript", "-e", script], check=True)
elif system == "Windows":
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast(title, message, duration=5)
elif system == "Linux":
subprocess.run(["notify-send", title, message], check=True)
else:
print(f"[{title}] {message}")
except Exception as e:
print(f"通知エラー: {e}")
def print_progress_bar(progress, total, event):
percent = int((progress / total) * 100)
filled = int(PROGRESS_BAR_LENGTH * progress // total)
bar = "█" * filled + "-" * (PROGRESS_BAR_LENGTH - filled)
print(f"[{bar}] {percent}% {event}")
def random_battle_events():
events = list(BATTLE_EVENTS)
random.shuffle(events[1:]) # 最初は固定、以降はランダム
return events
def battle_sequence(verbose=False):
events = random_battle_events()
total = 100
progress = 0
logs = []
for i, (event, step) in enumerate(events):
next_progress = step if step > progress else progress + random.randint(10, 25)
next_progress = min(next_progress, total)
if verbose:
print_progress_bar(next_progress, total, event)
notify("OSアップデート進行中", f"{event} 進捗 {next_progress}%")
logs.append(f"{datetime.now().isoformat()} {event} 進捗 {next_progress}%")
time.sleep(random.uniform(0.8, 1.8))
progress = next_progress
# ラストイベント
outcome = random.choice(["victory", "defeat"]) if random.random() < 0.85 else "defeat"
if outcome == "victory":
line = random.choice(VICTORY_LINES)
else:
line = random.choice(DEFEAT_LINES)
if verbose:
print_progress_bar(total, total, line)
notify("OSアップデート完了", line)
logs.append(f"{datetime.now().isoformat()} {line}")
with open(LOG_FILE, "a", encoding="utf-8") as f:
for l in logs:
f.write(l + "\n")
return outcome
def show_log():
try:
with open(LOG_FILE, "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines[-15:]:
print(line.strip())
except FileNotFoundError:
print("まだバトルログがありません。")
def summary():
try:
with open(LOG_FILE, "r", encoding="utf-8") as f:
lines = f.readlines()
total = len([l for l in lines if "進捗" in l])
victories = sum(1 for l in lines if "勝利" in l or "撃破" in l)
defeats = sum(1 for l in lines if "全滅" in l or "失敗" in l)
print(f"バトル回数: {total} 回")
print(f"勇者の勝利: {victories} 回")
print(f"バグ魔王の勝利: {defeats} 回")
except FileNotFoundError:
print("まだバトルログがありません。")
def main():
parser = argparse.ArgumentParser(description="OSアップデートRPGバトル通知スクリプト")
subparsers = parser.add_subparsers(dest="command")
parser_battle = subparsers.add_parser("battle", help="バトルを開始する")
parser_battle.add_argument("--verbose", action="store_true", help="進捗バーをターミナルに表示")
parser_log = subparsers.add_parser("log", help="直近のバトルログを表示")
parser_summary = subparsers.add_parser("summary", help="バトル勝敗サマリーを表示")
args = parser.parse_args()
if args.command == "battle":
battle_sequence(verbose=args.verbose)
elif args.command == "log":
show_log()
elif args.command == "summary":
summary()
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
本Skillは、開発現場の緊張感を和らげるため、OSアップデート通知をRPGバトル風に演出するものです。通知APIを活用し、現実のアップデート作業やバグ修正の文脈にユーモアを加えます。
# 公式ドキュメント抜粋
- macOS: `osascript` による通知表示
- Windows: `win10toast` モジュール (pipでインストール可能)
- Linux: `notify-send` コマンド
# 利用例
- チームのSlackや作業チャットで「アップデート」「パッチ」等の単語が出現した際に自動発動
- 定期的なOS更新作業時の合間に、リラックスした雰囲気を演出
# 注意点
- 実際のアップデートやバグ修正処理は行わないため、業務システムへの影響はありません
- 通知機能はOS依存のため、環境によっては追加ライブラリが必要
# 設計方針
- 毎回バトル展開やセリフをランダム生成し、飽きのこない体験を提供
- ログ保存により過去のバトル履歴も参照可能
- 業務効率やセキュリティを阻害しないよう、シンプルな設計としています
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Antigravity はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Antigravity がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/antigravity/random-os-fake-software-update-boss-fight .agent/skills/random-os-fake-software-update-boss-fight
.agent/skills/random-os-fake-software-update-boss-fight の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agent/skills/random-os-fake-software-update-boss-fight
# 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 でも有効か?
- プロジェクト指示との連携をどう組み立てるか?
- 進捗バーや通知がRPG風バトル実況になっているか?
- バトルの展開やセリフが毎回ランダムで変化するか?
- 最後に勝敗がランダムで決定し、きちんと通知されるか?
実際に Antigravity で試した検証ログは Antigravityで通知・演出・OS連携Skillを試してみた結果 にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
