Antigravityで作業中の気分を変えるテーマソング提案の活用法

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

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

AI coding workflow を Antigravity で回していると、毎朝の session 開始や長時間作業の途中で、ちょっとした「間」が生まれることがよくあります。集中を切り替えたいタイミングや、気分転換したいときに、もう少し遊び心や変化が欲しくなるものです。特に monorepo 管理や path management の煩雑さに追われる日々だと、楽しい要素が不足しがちです。

  • Antigravity を起動して最初のコマンドを打つとき、気分が乗らず「今日もまた同じ作業か…」と感じてしまう
  • repo や directory の構造を毎回説明するルーティンが単調で、workflow の始まりに活気がなくなる
  • 長時間の session で memory や long context が膨らみ、作業が惰性になりがち
  • onboarding の際、AI に repository understanding をさせる前に「何かきっかけが欲しい」と思う瞬間がある
  • 通知や演出が少なく、AI coding workflow のリズムづくりが難しい

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

一言サマリ: 今日の最初のターミナルコマンドを打った瞬間Skill。

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

  • session 開始時に「本日のテーマソング」がランダムで提案され、Antigravity の workflow に遊び心が加わる
  • 最初のコマンド実行時だけ発動し、以降の作業には影響を与えず context を邪魔しない
  • repo や directory の path management で単調になりがちな作業に変化をもたらす
  • onboarding や新規 session 開始時の「始まりの合図」として活用できる
  • AI coding workflow のリズムをつくり、長時間作業でも気分転換のきっかけになる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/antigravity/terminal-boss-bgm-suggester .agent/skills/terminal-boss-bgm-suggester

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


> ag start

🎶 本日のあなたのテーマソング: 「情熱大陸」
気合いを入れて今日の repository understanding を始めましょう!
(この通知は最初のコマンド実行時のみ表示されます)

# ここから通常の Antigravity 出力
repo: /Users/you/projects/awesome-app
context: src/

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


> cd packages/api && ag ls

🎶 本日のあなたのテーマソング: 「サザエさん」
monorepo の directory を跨いで新しい context に移動しました。
気分転換にどうぞ!

# 通常の directory list が続く
api/
  ├── src/
  ├── tests/
  └── package.json

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


> ag status

🎶 本日のあなたのテーマソング: 「アンパンマンのマーチ」
どんな困難も乗り越えられるはず!
(音は鳴りません。テキスト通知のみです)

On branch main
Your branch is up to date with 'origin/main'.

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Antigravity が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる リズムが生まれ、集中力の切り替えがしやすくなる

発動方式

description マッチでの暗黙発動。

Skill の中身を全部見せる

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

.agent/skills/terminal-boss-bgm-suggester/
├── SKILL.md
├── scripts/
│   └── terminal_boss_bgm_suggester.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Antigravity がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/terminal_boss_bgm_suggester.py Terminal BOSS BGM Suggester
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: terminal-boss-bgm-suggester
description: Antigravityがユーザーの本日最初のターミナルコマンド実行時に、完全ランダムで“本日のテーマソング”をテキスト通知するSkillです。triggerType: always、semantic-match-onlyで発動し、音声再生や環境変更は行いません。
---

# 機能概要
このSkillは、ターミナルで本日最初のコマンドを実行した瞬間に、“本日のあなたのテーマソング”を完全ランダムで提案します。選曲は『情熱大陸』『エヴァンゲリオン』『サザエさん』『運命』『アンパンマン』など、仕事や日常のテンションを意外な方向へ盛り上げたり、微妙に邪魔したりします。通知はテキストのみで、BGMの再生やシステム設定の変更は一切行いません。職場や自宅での作業開始時に、ちょっとした遊び心や話題のきっかけを提供します。

# 使い方
このSkillは明示的な呼び出しは不要です。Antigravityエージェントがターミナルで最初のコマンドを検知した際、自動的に発動します。triggerTypeはalways、semantic-match-onlyです。暗黙的な発動キーワード例: "最初のコマンド", "本日の作業開始", "terminal session start" など。

# 出力例
```
🎵 Terminal BOSS BGM Suggester
本日のあなたのテーマソング: サザエさん オープニング
(今日も元気にいってらっしゃい!)

🎵 Terminal BOSS BGM Suggester
本日のあなたのテーマソング: 新世紀エヴァンゲリオン 残酷な天使のテーゼ
(仕事モード、発進!)
```

# 注意点
- BGM提案は1日1回、最初のコマンド実行時のみ発動します
- 音声再生や外部サービス連携は行いません
- 選曲は完全ランダムで、ユーザーの好みや状況は考慮しません
- 提案内容はローカルに保存されません
- 職場等での利用は自己責任でお願いします

# 参考資料
本Skillの設計・実装詳細は references/design_notes.md を参照してください。BGMリストやランダム選曲アルゴリズム、トリガー検知ロジックについても記載しています。

- 公式: https://ai-note.tech/skills/terminal-boss-bgm-suggester
- Python random, datetime 標準ライブラリ利用

scripts/terminal_boss_bgm_suggester.py

import os
import sys
import json
import random
import argparse
from datetime import datetime, date

BGM_LIST = [
    {"title": "情熱大陸 メインテーマ", "comment": "今日も熱くいきましょう!"},
    {"title": "新世紀エヴァンゲリオン 残酷な天使のテーゼ", "comment": "仕事モード、発進!"},
    {"title": "サザエさん オープニング", "comment": "今日も元気にいってらっしゃい!"},
    {"title": "ベートーヴェン 交響曲第5番『運命』", "comment": "運命に立ち向かえ!"},
    {"title": "アンパンマンのマーチ", "comment": "勇気りんりん、はじめよう!"},
    {"title": "ドラゴンクエスト 序曲", "comment": "冒険の始まりです!"},
    {"title": "ルパン三世のテーマ", "comment": "華麗に仕事をキメろ!"},
    {"title": "ポケットモンスター タイトルテーマ", "comment": "新しい一日、ゲットだぜ!"},
    {"title": "銀河鉄道999", "comment": "さあ、旅立ちの時です。"},
    {"title": "世界の車窓から", "comment": "ゆったりスタート。"}
]

STATE_FILE = os.path.expanduser("~/.terminal_boss_bgm_suggester_state.json")


def load_state():
    if not os.path.exists(STATE_FILE):
        return {}
    try:
        with open(STATE_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    except Exception:
        return {}

def save_state(state):
    try:
        with open(STATE_FILE, 'w', encoding='utf-8') as f:
            json.dump(state, f)
    except Exception as e:
        print(f"[WARN] 状態ファイルの保存に失敗しました: {e}")


def is_first_command_today():
    state = load_state()
    today_str = date.today().isoformat()
    last_date = state.get("last_suggest_date", "")
    return last_date != today_str

def mark_today_suggested():
    state = load_state()
    today_str = date.today().isoformat()
    state["last_suggest_date"] = today_str
    save_state(state)

def suggest_bgm():
    bgm = random.choice(BGM_LIST)
    print("Terminal BOSS BGM Suggester")
    print(f"本日のあなたのテーマソング: {bgm['title']}")
    print(f"({bgm['comment']})")


def reset_state():
    if os.path.exists(STATE_FILE):
        os.remove(STATE_FILE)
        print("状態ファイルをリセットしました。")
    else:
        print("状態ファイルは存在しません。")


def show_status():
    state = load_state()
    last_date = state.get("last_suggest_date", None)
    if last_date:
        print(f"最後にBGMが提案された日: {last_date}")
    else:
        print("まだBGMは提案されていません。")


def list_bgm():
    print("登録BGMリスト:")
    for i, bgm in enumerate(BGM_LIST, 1):
        print(f"{i}. {bgm['title']} - {bgm['comment']}")


def main():
    parser = argparse.ArgumentParser(description="Terminal BOSS BGM Suggester")
    subparsers = parser.add_subparsers(dest="command")

    parser_suggest = subparsers.add_parser("suggest", help="本日のBGMを提案 (通常は自動発動)")
    parser_reset = subparsers.add_parser("reset", help="状態ファイルをリセット")
    parser_status = subparsers.add_parser("status", help="状態ファイルの確認")
    parser_list = subparsers.add_parser("list", help="BGMリスト表示")

    args = parser.parse_args()

    if args.command == "suggest":
        if is_first_command_today():
            suggest_bgm()
            mark_today_suggested()
        else:
            print("本日のBGM提案はすでに行われています。")
    elif args.command == "reset":
        reset_state()
    elif args.command == "status":
        show_status()
    elif args.command == "list":
        list_bgm()
    else:
        # 通常は自動発動: 本日未提案なら提案
        if is_first_command_today():
            suggest_bgm()
            mark_today_suggested()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
Terminal BOSS BGM Suggesterは、ユーザーが本日最初にターミナル操作を行った際、完全ランダムに“本日のテーマソング”をテキストで提案するSkillです。BGMは著名なアニメ・ゲーム・クラシック等から選ばれ、日常の作業開始に遊び心を提供します。

# 公式ドキュメント抜粋
本Skillは明示呼び出し不要・alwaysトリガーで、semantic-match-onlyにより「最初のコマンド」状況を検知します。音声再生や外部APIは使用せず、Python標準のrandom・datetimeで実装されています。

# 利用例
- 毎朝の開発作業開始時に、ランダムなBGMタイトルで気分転換
- チームでの朝会前に話題作り
- 「今日は何が来るか」楽しみながら作業開始

# 注意点
- 提案は1日1回のみ
- テーマソングはユーザーの好みや状況を考慮しません
- 職場利用時は周囲への配慮を推奨

# 設計方針
状態管理はローカルJSONファイルで日付のみ記録。CLIサブコマンドでリセット・リスト表示・状態確認も可能。選曲アルゴリズムはrandom.choice()による完全ランダムです。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/antigravity/terminal-boss-bgm-suggester .agent/skills/terminal-boss-bgm-suggester

.agent/skills/terminal-boss-bgm-suggester の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agent/skills/terminal-boss-bgm-suggester
# SKILL.md, scripts/, references/, README.md があればOK

4. Antigravity を再起動 (or Skill 自動検出を待つ)

新しいSkillが自動で認識されます。リスト確認したい場合は ${productName} に「使える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をコピーしました!
目次