Claude Codeで仕事中の気分を盛り上げるBGM自動提案Skillの作り方

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

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

Claude Code を日々の開発で活用していると、便利な一方でちょっとした「間」が生まれる瞬間があります。特にセッション開始直後や長時間作業の合間は、気持ちの切り替えが難しいことも。通知や演出がほしいと感じる場面も増えがちです。

  • 朝イチでターミナルを開いた瞬間、いきなり仕事モードに切り替えるのがしんどい
  • 長時間作業や monorepo の大規模リポジトリで、無機質なコマンド入力が続き、気分転換のタイミングを逃しやすい
  • session を再開した時、Claude Code が repository understanding や context を思い出すまでの「間」が気まずい
  • onboarding や新規プロジェクトで、初回コマンド入力が堅苦しくなりがち
  • 通知や演出が皆無で、AI coding workflow が淡々と進むことに物足りなさを感じる

こうした「堅い空気」や「無音のプレッシャー」を、ちょっとした演出で和らげたいという声は少なくありません。

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

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

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

  • session 開始時や初回コマンド入力時に、「本日のあなたのテーマソング」をテキストで提案してくれるので、堅苦しい空気が和らぐ
  • 選曲は完全ランダム。仕事モードに合う曲も、思わず笑ってしまう曲も登場し、onboarding や長時間作業の気分転換になる
  • 通知はテキストのみ。環境を壊さず、どの repository や directory でも安全に使える
  • Claude Code の AI coding workflow にちょっとした遊び心を追加できる
  • monorepo や複雑な path management の合間にも、リラックスしたスタートを切れる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/terminal-boss-bgm-suggester .claude/skills/terminal-boss-bgm-suggester

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

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

シーン1: session 開始時 (CLAUDE.md と組み合わせて)


# /terminal-boss-bgm-suggester
> cd ~/projects/awesome-repo
> npx code .
Claude Code Skill: terminal-boss-bgm-suggester

🎵 本日のあなたのテーマソング: 「情熱大陸メインテーマ」
(「今日はどんな一日になるでしょうか?集中して頑張りましょう!」)
Tip: このBGMを脳内再生しながら、CLAUDE.md の更新から始めてみませんか?

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


> cd packages/user-service
> npm run test

Claude Code Skill: terminal-boss-bgm-suggester

🎵 本日のあなたのテーマソング: 「エヴァンゲリオン - 残酷な天使のテーゼ」
(「monorepo の壁を乗り越えろ!package 跨ぎ作業もスムーズに」)
Tip: repo 構造や directory 境界を意識して、AI coding workflow を進めましょう。

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


> cd ~/sandbox/fun-project
> touch hello.txt

Claude Code Skill: terminal-boss-bgm-suggester

🎵 本日のあなたのテーマソング: 「サザエさんのエンディング」
(「日曜夜の気分で、リラックスして作業を始めましょう!」)
Tip: たまには AI とのやりとりも肩の力を抜いて。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる テーマソングで気分転換、集中力をリセットしやすい

発動方式

明示呼び出し (/terminal-boss-bgm-suggester) と暗黙発動 (最初のコマンドや session 開始時の description マッチ) の両方に対応。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: terminal-boss-bgm-suggester
description: 最初のターミナルコマンド実行時に、完全ランダムで“本日のあなたのテーマソング”をテキスト通知として提案します。発動条件は「その日最初のコマンド」または明示呼び出し(/terminal-boss-bgm-suggester)です。
---

# 機能概要
terminal-boss-bgm-suggesterは、ターミナルでその日最初のコマンドを実行した瞬間、あなたに“本日のテーマソング”を完全ランダムでテキスト通知します。『情熱大陸』『エヴァンゲリオン』『サザエさん』など、仕事や作業のテンションを盛り上げたり、逆に微妙に邪魔したりする選曲で、日々の開発にちょっとした演出を加えます。音は流さず、環境を壊すことなく、通知のみで気分転換や話題作りに役立ちます。

# 使い方
- 明示呼び出し: `/terminal-boss-bgm-suggester` を実行すると即座にテーマソングが提案されます。
- 暗黙発動: その日の最初のターミナルコマンド実行時に自動で発動します(内部でコマンド履歴・日付を判定)。

# 出力例
```
🎵 Terminal Boss BGM Suggestion 🎵
本日のあなたのテーマソングは…『情熱大陸』です!
(YouTube: https://www.youtube.com/watch?v=example1)
今日も一日、情熱的に頑張りましょう!
```
```
🎵 Terminal Boss BGM Suggestion 🎵
本日のあなたのテーマソングは…『サザエさん』です!
(YouTube: https://www.youtube.com/watch?v=example2)
肩の力を抜いて、楽しく作業しましょう。
```

# 注意点
- 選曲は完全ランダムで、同じ曲が続く場合もあります。
- 音は自動再生されません。YouTube等のリンクのみ通知されます。
- コマンド履歴はローカルのみに保存され、外部送信はありません。
- 職場や公共の場での利用は自己責任でお願いします。

# 参考資料
詳細な設計方針や参考情報は references/design_notes.md を参照してください。YouTube API 公式ドキュメント: https://developers.google.com/youtube/v3

scripts/bgm_suggester.py

import os
import sys
import argparse
import random
import json
import datetime
import pathlib
from typing import List, Dict

# 曲リストとYouTubeリンク(公式・著名なものを例として)
BGM_LIST = [
    {"title": "情熱大陸", "youtube": "https://www.youtube.com/watch?v=2sFv2G2rjGg"},
    {"title": "エヴァンゲリオン", "youtube": "https://www.youtube.com/watch?v=2v6ANlBqgDk"},
    {"title": "サザエさん", "youtube": "https://www.youtube.com/watch?v=3XoaRk8p0lA"},
    {"title": "アンパンマンのマーチ", "youtube": "https://www.youtube.com/watch?v=JpXQk6W3j0U"},
    {"title": "運命(ベートーヴェン)", "youtube": "https://www.youtube.com/watch?v=_4IRMYuE1hI"},
    {"title": "ルパン三世のテーマ", "youtube": "https://www.youtube.com/watch?v=JYIAWbQ0p5c"},
    {"title": "ドラえもんのうた", "youtube": "https://www.youtube.com/watch?v=0WJqQ6qF3Qw"},
    {"title": "世界の車窓から", "youtube": "https://www.youtube.com/watch?v=I9zvZr0Fj5c"},
    {"title": "ガッチャマンの歌", "youtube": "https://www.youtube.com/watch?v=Qwq7BYOnDrM"},
    {"title": "残酷な天使のテーゼ", "youtube": "https://www.youtube.com/watch?v=Ho7y8e7i0tE"}
]

HISTORY_FILE = os.path.expanduser("~/.claude_terminal_bgm_history.json")


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


def save_history(history: Dict):
    try:
        with open(HISTORY_FILE, 'w', encoding='utf-8') as f:
            json.dump(history, f)
    except Exception as e:
        print(f"[WARN] 履歴の保存に失敗しました: {e}", file=sys.stderr)


def is_first_command_today(history: Dict) -> bool:
    today = datetime.date.today().isoformat()
    return history.get('last_date') != today


def update_history(history: Dict):
    today = datetime.date.today().isoformat()
    history['last_date'] = today
    save_history(history)


def suggest_bgm() -> Dict:
    bgm = random.choice(BGM_LIST)
    return bgm


def print_bgm_suggestion(bgm: Dict):
    print("🎵 Terminal Boss BGM Suggestion 🎵")
    print(f"本日のあなたのテーマソングは…『{bgm['title']}』です!")
    print(f"(YouTube: {bgm['youtube']})")
    if bgm['title'] in ['情熱大陸', 'エヴァンゲリオン', '運命(ベートーヴェン)']:
        print("今日も一日、情熱的に頑張りましょう!")
    elif bgm['title'] in ['サザエさん', 'ドラえもんのうた', 'アンパンマンのマーチ']:
        print("肩の力を抜いて、楽しく作業しましょう。")
    else:
        print("BGMで気分転換しつつ、作業を進めてください!")


def handle_log(args):
    history = load_history()
    if is_first_command_today(history):
        bgm = suggest_bgm()
        print_bgm_suggestion(bgm)
        update_history(history)
    else:
        print("本日のBGM提案はすでに表示済みです。明日またお楽しみに!")


def handle_force(args):
    bgm = suggest_bgm()
    print_bgm_suggestion(bgm)
    history = load_history()
    update_history(history)


def handle_history(args):
    history = load_history()
    if 'last_date' in history:
        print(f"最終発動日: {history['last_date']}")
    else:
        print("まだ一度も発動していません。")


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

    parser_log = subparsers.add_parser('log', help='本日の最初のコマンドとしてBGM提案を試みる')
    parser_log.set_defaults(func=handle_log)

    parser_force = subparsers.add_parser('force', help='強制的にBGMを提案する(明示呼び出し用)')
    parser_force.set_defaults(func=handle_force)

    parser_history = subparsers.add_parser('history', help='最終発動日を表示')
    parser_history.set_defaults(func=handle_history)

    args = parser.parse_args()
    if hasattr(args, 'func'):
        args.func(args)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
terminal-boss-bgm-suggesterは、日々のターミナル作業に遊び心を追加するために設計されました。最初のコマンド実行時のみランダムなBGMを提案することで、過剰な通知や環境破壊を防ぎつつ、作業の始まりに小さな演出を提供します。

# 公式ドキュメント抜粋
YouTube Data API v3(https://developers.google.com/youtube/v3)は、動画の検索や取得に利用できますが、本Skillでは事前に選定した公式動画リンクを利用し、APIキーや外部通信を不要としています。

# 利用例
- 朝イチのコマンド実行時に「情熱大陸」などを提案
- 明示的に`/terminal-boss-bgm-suggester force`で気分転換

# 注意点
- 履歴はローカル(~/.claude_terminal_bgm_history.json)にのみ保存され、プライバシーに配慮
- 複数端末利用時は端末ごとに発動

# 設計方針
- シンプルなローカルJSONで日付判定
- テキスト通知のみで音声再生やポップアップは行わない
- 曲リストは著名なBGMを厳選し、リンク切れ時は随時修正可能

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/terminal-boss-bgm-suggester .claude/skills/terminal-boss-bgm-suggester

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

3. ファイル配置確認

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

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

新しいSkillが自動で認識されます。リスト確認したい場合は /terminal-boss-bgm-suggester と Skill 名で出てきます。

5. 動作確認

/terminal-boss-bgm-suggester で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Claude Code に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Claude Code 固有の引っかかり: paths フロントマターでの絞り込みを使わないと意図しないタイミングで発動する
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

この Skill を実運用に投入する前に確かめたい問いを並べる:

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 最初のコマンド実行時のみ発動するか?選曲が完全ランダムであるか?提案はテキスト通知のみで環境を壊さないか?

実際に Claude Code で試した検証ログは Claude Codeで最初のコマンドにテーマソングを勝手に提案してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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