Antigravityで業務中に楽しむOSアップデート演出の活用ガイド

  • URLをコピーしました!
目次

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 マッチで自動発動し、ユーザーの操作を邪魔せず自然に混ざる
QUICK INSTALL
このSkillをすぐ試す

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記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次