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 のリズムをつくり、長時間作業でも気分転換のきっかけになる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
