Antigravityで作業開始を盛り上げる謎のOSモーニングラジオ活用ガイド

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

Antigravity ユーザーが日常でぶつかる悩み

AI coding workflow を Antigravity で回していると、どうしても作業の「始まり方」にマンネリや無味乾燥さを感じる瞬間が多い。特に monorepo を扱う現場や、複数の repository を日替わりで触る場合、毎朝同じような context 設定や path 管理の説明を繰り返すことに疲れてしまうことがある。

また、Antigravity の context 記憶や repository understanding の仕組みは強力だが、長時間 session や複雑な directory 構造では「流れ」が単調になりがち。onboarding のときも、AI から受けるフィードバックが淡々としていて、開発現場に活気が出にくいと感じることがある。

  • Antigravity が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Antigravity が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

こうした「AIとのやりとりが無機質」「作業開始のテンションが上がらない」といった悩みは、意外と productivity にも影響しやすい。

この Skill が一言でいうと何を解決するか

一言サマリ: このスキルは、Antigravity の作業開始や context 切り替えの瞬間に、謎のOSモーニングラジオ風メッセージを自動で流し、開発現場に遊び心と活気を注入する Skill。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • 毎朝や session 開始時に「今日はどんな一日になるか」をラジオDJ風に演出し、Antigravity の onboarding や repository understanding を楽しく始められる
  • monorepo や大規模 repository の directory 移動時も、無駄な実況やゴシップで context 切り替えの瞬間を盛り上げ、path management の手間を和らげる
  • 長時間の AI coding workflow でも、意味不明なラジオトークが適度に挟まることで stale context をリフレッシュしやすくなる
  • 単調な通知や出力ではなく、日替わり・タイミングごとに違うメッセージで飽きにくい
  • onboarding や session 復帰時の「また始まった感」を、遊び心ある演出でポジティブに変換できる
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Antigravity の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/antigravity/random-os-fake-morning-radio .agent/skills/random-os-fake-morning-radio

実行したらこうなる (3つの利用シーン)

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。

シーン1: session 開始時 (プロジェクト初動で)


> 今日の作業を始めたい

--- OSモーニングラジオ ---
おはようございます!本日のOS業界ニュースをお届けします。
「昨日のメモリリーク、ついに全世界で話題に!」
本日の天気は快晴、でも /src/utils/ ではバグ雲が発生中。
今日も元気に repository understanding を深めましょう!
--------------------------

シーン2: monorepo / package 跨ぎ作業時


> packages/user-service から packages/payment-service へ移動

--- OSモーニングラジオ ---
パッケージ移動速報です。
「user-service から payment-service へ、AIコーディング workflow が大移動!」
本日のゴシップ:/packages/user-service/ の関数 greetUser が出戻り検討中との噂。
directory 境界を越えて、今日も path management を楽しみましょう!
--------------------------

シーン3: お遊び的な使い方


> なんか元気が出ない

--- OSモーニングラジオ ---
リスナーからのお便りです。
「最近、long context で頭がパンクしそうです」
DJ OS「大丈夫、memory だってたまには寝坊します!」
今日も一日、AI coding workflow を一緒に盛り上げましょう!
--------------------------

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開。さらに謎ラジオで気分転換
monorepo 移動 違う package のコードを参照しがち directory boundary を意識しつつ、移動タイミングで爆笑ラジオ実況
長時間 workflow long context で重要箇所が薄まる 無駄なラジオトークで stale context をリフレッシュ

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

.agent/skills/random-os-fake-morning-radio/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agent/skills/random-os-fake-morning-radio/
├── SKILL.md
├── scripts/
│   └── morning_radio.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/morning_radio.py 謎のOSモーニングラジオ風メッセージを出力します。
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-morning-radio
description: 作業開始、朝、または“ラジオ”“モーニング”“OSニュース”などのキーワードが含まれるタイミングで自動発動します。開発現場を盛り上げるため、日替わりでラジオDJ風の無駄トークやOS業界ゴシップを通知・ターミナル出力します。
---

# 機能概要
random-os-fake-morning-radioは、作業開始時や朝のタイミングで、まるで謎のOSラジオ番組が流れるようなメッセージをデスクトップ通知やターミナルに表示します。内容は「おはようございます、今日も元気にバグを直しましょう!」や「本日のOSニュース:メモリが寝坊しました」など、完全に無駄なラジオDJトークや意味不明な天気予報、OS業界ゴシップが日替わりで登場。開発現場に笑いと活気を注入し、朝のスタートをカオスに盛り上げます。

# 使い方
このSkillは明示的な呼び出し不要で、semantic-match-onlyトリガーにより「作業開始」「おはよう」「ラジオ」「OSニュース」などのキーワードや朝のタイミングで自動発動します。手動でスクリプトを実行することも可能です(例:python morning_radio.py --now)。

# 出力例
```
[OS Morning Radio] 07:30
おはようございます、バグ修正日和の朝です!
本日のOSニュース:メモリ管理部が寝坊しました。
天気予報:あなたのRAMには曇りのちフリーズ注意報。
業界ゴシップ:カーネルが新しい恋を始めた模様です。
今日も元気に開発を!
```

# 注意点
・内容は完全に架空のジョークです。業務連絡や実際のOS情報は含まれません。
・デスクトップ通知はOS環境により動作が異なる場合があります。
・出力内容は日替わりで自動生成され、ローカル保存は行いません。
・通知が不要な場合はスクリプト側で無効化可能です。

# 参考資料
詳細な設計方針や利用例は references/design_notes.md を参照してください。Pythonのnotify2(Linux)、plyer(クロスプラットフォーム)等の通知APIを利用。公式URL: https://pypi.org/project/plyer/ https://pypi.org/project/notify2/

scripts/morning_radio.py

import sys
import argparse
import random
import datetime
import platform
import os

try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

DJ_GREETINGS = [
    "おはようございます、バグ修正日和の朝です!",
    "グッドモーニング、今日もOSの海を泳ぎましょう!",
    "朝のメモリチェックはお済みですか?",
    "今日も元気に開発現場からお届けします!",
    "おはよう、カーネルの目覚めと共にスタート!"
]

OS_NEWS = [
    "本日のOSニュース:メモリ管理部が寝坊しました。",
    "カーネルパニック選手権、今朝も激戦です。",
    "新しいドライバが社内で話題沸騰中。",
    "システムコールが朝礼をサボった模様です。",
    "ファイルシステムが断片化で悩んでいます。"
]

WEATHER_FORECAST = [
    "天気予報:あなたのRAMには曇りのちフリーズ注意報。",
    "CPU温度は本日も平熱、快適な一日になりそうです。",
    "ストレージ地方に断片化前線が接近中。",
    "ネットワーク帯域に一時的な混雑予報。",
    "プロセス地方、負荷高めの見込みです。"
]

GOSSIP = [
    "業界ゴシップ:カーネルが新しい恋を始めた模様です。",
    "デバイスドライバ同士の噂話が止まりません。",
    "メモリ管理部とプロセス管理部の関係が話題に。",
    "シェルが新しいスクリプトに夢中です。",
    "バグが密かに増殖中との噂あり。"
]

CLOSING = [
    "今日も元気に開発を!",
    "素敵な一日をお過ごしください。",
    "バグに負けずに頑張りましょう!",
    "OSのご機嫌を伺いつつ、良い一日を。",
    "また次回の放送でお会いしましょう!"
]

HISTORY_FILE = os.path.expanduser("~/.random_os_radio_history")


def get_today_seed():
    today = datetime.date.today()
    return int(today.strftime("%Y%m%d"))


def pick_message(seed=None):
    if seed is not None:
        random.seed(seed)
    else:
        random.seed()
    greeting = random.choice(DJ_GREETINGS)
    news = random.choice(OS_NEWS)
    weather = random.choice(WEATHER_FORECAST)
    gossip = random.choice(GOSSIP)
    closing = random.choice(CLOSING)
    now = datetime.datetime.now().strftime("%H:%M")
    lines = [
        f"[OS Morning Radio] {now}",
        greeting,
        news,
        weather,
        gossip,
        closing
    ]
    return "\n".join(lines)


def notify_desktop(title, message):
    if not PLYER_AVAILABLE:
        print("[WARN] plyerモジュールが未インストールのため、デスクトップ通知はスキップされました。\n")
        return
    try:
        notification.notify(
            title=title,
            message=message,
            timeout=8
        )
    except Exception as e:
        print(f"[ERROR] 通知に失敗しました: {e}")


def save_history(message):
    try:
        with open(HISTORY_FILE, "a", encoding="utf-8") as f:
            f.write(f"{datetime.datetime.now().isoformat()}\n{message}\n---\n")
    except Exception as e:
        print(f"[WARN] 履歴保存に失敗: {e}")


def list_history(limit=5):
    if not os.path.exists(HISTORY_FILE):
        print("履歴ファイルがありません。")
        return
    try:
        with open(HISTORY_FILE, "r", encoding="utf-8") as f:
            entries = f.read().split("---\n")
            entries = [e.strip() for e in entries if e.strip()]
            for entry in entries[-limit:]:
                print(entry)
                print("---")
    except Exception as e:
        print(f"[ERROR] 履歴読み込み失敗: {e}")


def summary_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴ファイルがありません。")
        return
    try:
        with open(HISTORY_FILE, "r", encoding="utf-8") as f:
            entries = f.read().split("---\n")
            print(f"過去の放送回数: {len([e for e in entries if e.strip()])}")
    except Exception as e:
        print(f"[ERROR] 履歴集計失敗: {e}")


def main():
    parser = argparse.ArgumentParser(description="謎のOSモーニングラジオ風メッセージを出力します。")
    subparsers = parser.add_subparsers(dest="command")

    parser_log = subparsers.add_parser("log", help="本日のラジオメッセージを出力・通知")
    parser_log.add_argument("--now", action="store_true", help="今すぐ発動(デフォルトは日替わり)")
    parser_log.add_argument("--notify", action="store_true", help="デスクトップ通知も行う")

    parser_list = subparsers.add_parser("list", help="過去のラジオ履歴を表示")
    parser_list.add_argument("--limit", type=int, default=5, help="表示件数")

    parser_summary = subparsers.add_parser("summary", help="履歴のサマリーを表示")

    args = parser.parse_args()

    if args.command == "log" or args.command is None:
        seed = None if (args.command is not None and args.now) else get_today_seed()
        message = pick_message(seed=seed)
        print(message)
        if args.notify:
            notify_desktop("OS Morning Radio", message)
        save_history(message)
    elif args.command == "list":
        list_history(limit=args.limit)
    elif args.command == "summary":
        summary_history()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このスキルは、開発者の朝や作業開始時に“謎のOSラジオ”風の無駄なメッセージを届けることで、現場の雰囲気を明るくし、日替わりで楽しめる演出を提供します。通知APIやターミナル出力を活用し、実際のラジオ番組の雰囲気を模倣しています。

# 公式ドキュメント抜粋
デスクトップ通知にはPythonのplyer(クロスプラットフォーム)を利用。公式: https://pypi.org/project/plyer/  またはLinuxではnotify2も選択肢。

# 利用例
・毎朝の作業開始時に自動発動し、開発チームの雑談やアイスブレイクに活用。
・手動でコマンド実行し、ランダムなラジオネタで気分転換。

# 注意点
通知内容は完全に架空で、業務情報や実際のOS状況は含まれません。通知APIはOSによって挙動が異なるため、plyerの導入や動作確認が必要です。

# 設計方針
日替わりで一貫性のあるジョークを生成しつつ、履歴保存・出力サマリー・CLIサブコマンドで柔軟に運用できるよう設計しています。

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Antigravity はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Antigravity がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/antigravity/random-os-fake-morning-radio .agent/skills/random-os-fake-morning-radio

.agent/skills/random-os-fake-morning-radio の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agent/skills/random-os-fake-morning-radio
# 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 でも有効か?
  • プロジェクト指示との連携をどう組み立てるか?
  • 通知やターミナル出力が本当に“ラジオDJトーク”調になっているか?
  • 実際に作業開始直後やタイミング指定で発動するか?
  • OS風の無駄な実況やゴシップが日替わりで表示されるか?

実際に Antigravity で試した検証ログは Antigravityの謎モーニングラジオ通知を朝イチで鳴らしてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

関連タグで他のSkill記事を探す

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

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

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