Antigravityで謎のやる気スピーチ通知を活用する方法入門

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

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

Antigravity を日々使っていると、AI coding workflow の効率化や repo 理解だけでなく、ちょっとした「心の余白」や遊び心が欲しくなる瞬間も多い。特に、長時間 directory を行き来しながら作業していると、ふとしたタイミングで集中力が切れたり、同じ説明を繰り返すことに疲れたりすることがある。

また、通知や演出が単調だと、session の切り替えや onboarding の際に「もう一押し」が欲しくなることも。AI からの context 提案や path management の補助だけでなく、repo や directory の境界を跨いだ時に「何か面白いことが起きないか」と期待するユーザーも少なくない。

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

これらの悩みに加え、日々のコーディングにちょっとしたエンタメやリフレッシュ要素が欲しいという声も増えている。

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

一言サマリ: 作業中やコマンド実行のたびにSkill。

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

  • Antigravity の通知領域や画面端に、毎回異なる「謎のやる気爆上げスピーチ」が現れ、作業の合間に強制的な気分転換が生まれる
  • repo や directory を跨いだ瞬間、AI からの context 提案や path management の流れにエンタメ要素が加わり、onboarding や session 再開時のマンネリ感が軽減される
  • monorepo の複雑な構造や長時間 workflow の途中でも、AI から「あなたの commit は宇宙を救う」などのメッセージが届くことで、長い作業の中でもモチベーション維持につながる
  • AI coding workflow の中に遊び心を持たせることで、Antigravity の利用体験そのものが少し楽しくなる
  • Skill の導入・運用はシンプルで、SKILL.md の配置だけで即座に効果が現れる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/os-random-fake-motivational-speech-alert .agent/skills/os-random-fake-motivational-speech-alert

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

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

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


> 新しいリポジトリで作業を始める

[OS公式通知]
────────────────────────────
本日もようこそ、コードの冒険者!
キーボードを叩くその瞬間、あなたは新たな伝説を刻んでいます。
この repository の構造理解も、Antigravity とともに完璧です。
────────────────────────────

Antigravity: プロジェクトの context を自動で解析しました。

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


> packages/api/ から packages/web/ に移動して作業

[OS公式通知]
────────────────────────────
あなたの directory 移動を OS は見逃しません。
今こそ packages/web/ で新たな歴史を作る時です。
monorepo の全構造を、その手で制覇してください!
────────────────────────────

Antigravity: 新しい package の context を再取得しました。

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


> ちょっと休憩しようかな…

[OS公式通知]
────────────────────────────
休憩も大切ですが、あなたの commit は宇宙を救います。
今こそコード界の勇者として、もう一行 push してみませんか?
────────────────────────────

Antigravity: 現在の repository 状態を snapshot しました。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる やる気爆上げ通知で集中力をリフレッシュ、重要な context も見失いにくい

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/os-random-fake-motivational-speech-alert/
├── SKILL.md
├── scripts/
│   └── os_random_fake_motivational_speech_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/os_random_fake_motivational_speech_alert.py OS公式風やる気爆上げスピーチ通知スクリプト
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: os-random-fake-motivational-speech-alert
description: コマンド実行や作業中など、ユーザーのアクションを検知した際に、毎回異なる“OS公式”風のやる気爆上げスピーチ通知を自動発火します。通知内容は本気の激励調で、semantic-match-onlyトリガーや「やる気」「応援」「通知」などのキーワードに反応します。
---

# 機能概要
このSkillは、作業やコマンド実行のたびに、まるでOS公式からのような熱い激励スピーチ通知を画面端やデスクトップに表示します。通知内容は毎回ランダムで、「あなたのcommitは宇宙を救う」や「今こそコード界の伝説になるときです」など、どこかズレた本気の応援メッセージが炸裂。日々のコーディングや単調な作業に謎のエンタメ要素を加え、ユーザーのモチベーション維持や気分転換をサポートします。実際のシステムやデータには一切影響せず、純粋な演出として機能します。

# 使い方
Skillは明示的な呼び出しを必要とせず、semantic-match-onlyトリガーにより自動発火します。たとえば「やる気」「応援」「通知」「モチベーション」などのキーワードや、コマンド実行・ファイル保存・ビルド開始時などのアクションを検知して、通知が表示されます。明示的なCLIコマンドは不要です。

# 出力例
```terminal
[OS公式通知] あなたのキーボードの叩き方に、未来への情熱を感じます。
[OS公式通知] 今こそ、コード界の伝説になるときです。
[OS公式通知] そのコミットは、宇宙規模の進化を生み出します。
[OS公式通知] あなたのデバッグ魂が、世界を救う。
[OS公式通知] 1行のコードが、歴史を変える。
```

# 注意点
- 通知内容は毎回異なりますが、実害ゼロでシステムやデータには一切影響しません。
- 通知はローカル環境のデスクトップ通知API(例: notify-send, Windows Toast, macOS通知)を利用します。
- ログや履歴はSkill内で保持しません。
- 明示的な停止コマンドや除外パスはありません。必要に応じてSkill自体を無効化してください。

# 参考資料
- references/design_notes.md を参照
- OS通知API公式: https://docs.python.org/3/library/subprocess.html, https://pypi.org/project/plyer/

scripts/os_random_fake_motivational_speech_alert.py

import sys
import random
import argparse
import platform
import subprocess
from typing import List

MOTIVATIONAL_MESSAGES = [
    "あなたのキーボードの叩き方に、未来への情熱を感じます。",
    "今こそ、コード界の伝説になるときです。",
    "そのコミットは、宇宙規模の進化を生み出します。",
    "あなたのデバッグ魂が、世界を救う。",
    "1行のコードが、歴史を変える。",
    "OSはあなたの努力を見守っています。",
    "そのpushは、銀河を照らす光です。",
    "エラーに立ち向かうあなたに、拍手を送ります。",
    "あなたのアルゴリズムが、時代を変える。",
    "今こそ、コードで世界を救うヒーローに。",
    "その一歩が、OSの未来を切り開く。",
    "あなたのcommitが、次世代のOSを作る。",
    "コードの海を泳ぐあなたに、OSからエールを。",
    "そのビルドは、伝説の始まりです。",
    "OSはあなたの挑戦を全力で応援します。",
    "そのテストは、宇宙の安定を支えます。",
    "あなたのリファクタが、OSの美しさを高めます。",
    "バグを倒すあなたに、OSからメダルを。",
    "そのレビューが、未来の標準を作ります。",
    "OSはあなたの進化を信じています。"
]

NOTIFICATION_TITLE = "OS公式通知"


def pick_random_message() -> str:
    return random.choice(MOTIVATIONAL_MESSAGES)


def send_notification(message: str, title: str = NOTIFICATION_TITLE) -> None:
    system = platform.system()
    try:
        if system == "Linux":
            subprocess.run(["notify-send", title, message], check=True)
        elif system == "Darwin":  # macOS
            script = f'display notification "{message}" with title "{title}"'
            subprocess.run(["osascript", "-e", script], check=True)
        elif system == "Windows":
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast(title, message, duration=5, threaded=True)
            except ImportError:
                print(f"[{title}] {message}")
                print("win10toastが見つかりません。'pip install win10toast'でインストールしてください。")
        else:
            print(f"[{title}] {message}")
    except Exception as e:
        print(f"[{title}] {message}")
        print(f"通知の送信に失敗しました: {e}")


def log_message(logfile: str, message: str) -> None:
    try:
        with open(logfile, 'a', encoding='utf-8') as f:
            f.write(f"[{NOTIFICATION_TITLE}] {message}\n")
    except Exception as e:
        print(f"ログファイルへの書き込みに失敗しました: {e}")


def list_log(logfile: str, count: int = 10) -> None:
    try:
        with open(logfile, 'r', encoding='utf-8') as f:
            lines = f.readlines()
            for line in lines[-count:]:
                print(line.strip())
    except FileNotFoundError:
        print("ログファイルが見つかりません。まだ通知が記録されていません。")
    except Exception as e:
        print(f"ログファイルの読み込みに失敗しました: {e}")


def summary_log(logfile: str) -> None:
    try:
        with open(logfile, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        print(f"通知履歴: {len(lines)}件")
        unique_msgs = set(line.strip() for line in lines)
        print(f"ユニークなメッセージ: {len(unique_msgs)}件")
    except FileNotFoundError:
        print("ログファイルが見つかりません。")
    except Exception as e:
        print(f"ログファイルの集計に失敗しました: {e}")


def main():
    parser = argparse.ArgumentParser(
        description="OS公式風やる気爆上げスピーチ通知スクリプト"
    )
    subparsers = parser.add_subparsers(dest="command")

    parser_alert = subparsers.add_parser("alert", help="ランダム通知を発火")
    parser_alert.add_argument("--log", type=str, default=None, help="通知内容を指定ファイルに記録")

    parser_list = subparsers.add_parser("list", help="通知ログを表示")
    parser_list.add_argument("--log", type=str, required=True, help="通知ログファイルパス")
    parser_list.add_argument("--count", type=int, default=10, help="表示件数")

    parser_summary = subparsers.add_parser("summary", help="通知ログの集計")
    parser_summary.add_argument("--log", type=str, required=True, help="通知ログファイルパス")

    args = parser.parse_args()

    if args.command == "alert":
        msg = pick_random_message()
        send_notification(msg)
        if args.log:
            log_message(args.log, msg)
    elif args.command == "list":
        list_log(args.log, args.count)
    elif args.command == "summary":
        summary_log(args.log)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、作業やコマンド実行時に“OS公式”風のやる気爆上げ通知を自動で表示し、ユーザーのモチベーション向上や気分転換を促すことを目的としています。通知内容は毎回ランダムで、実害ゼロの演出のみを提供します。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/3/library/subprocess.html
- plyer通知API: https://pypi.org/project/plyer/
- win10toast: https://pypi.org/project/win10toast/

# 利用例
- コマンド実行やファイル保存、ビルド開始時など、作業の合間に自動で通知。
- 自分だけの“OS公認勇者”体験を日常コーディングに追加。
- チーム開発でのエンタメ要素としても活用可能。

# 注意点
- 通知内容は本気の激励調ですが、実際のOSやシステムからの公式通知ではありません。
- ログファイルはオプションで記録可能ですが、Skill自体は履歴保持を前提としません。
- 通知APIが動作しない環境では標準出力にフォールバックします。

# 設計方針
- OSごとに適切な通知APIを選択し、依存ライブラリが未導入の場合は標準出力に切り替え。
- CLIサブコマンドで通知発火・ログ表示・集計が可能。
- シンプルかつ拡張性のある構成を意識し、他Skillとの干渉や副作用を排除。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/os-random-fake-motivational-speech-alert .agent/skills/os-random-fake-motivational-speech-alert

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

3. ファイル配置確認

ls .agent/skills/os-random-fake-motivational-speech-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で謎のやる気爆上げスピーチ通知を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Antigravity 公式ドキュメント と、本シリーズ「Antigravityで試したいSkill研究」の他記事も参照のこと。

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

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

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

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