Claude Code ユーザーが日常でぶつかる悩み
Claude Code を使っていると、日々のAI coding workflowの中で意外な「小さなストレス」を感じる場面が多い。特に repository understanding や path management、context の維持に関する悩みは根深い。加えて、作業開始時や長時間 session でのマンネリ感も無視できない。通知や演出が少ないため、作業のリズムを変えたいと感じることもある。
- Claude Code がいつの間にか違う directory を見始めて、想定外のファイルを読みに行く
- monorepo で package を跨いだ瞬間、Claude Code が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
さらに、作業開始時にちょっとした気分転換や、理不尽なエンタメ要素がほしい、という声も多い。通知・演出・OS連携の観点で、毎日のルーティンに「脱力感」や「笑い」を仕込む余地はまだまだ残されている。
この Skill が一言でいうと何を解決するか
一言サマリ: ターミナルやエディタを起動した瞬間Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- session開始・プロジェクト切り替え時に、OS通知で「今日の作業BGM」が毎回ランダムで表示され、作業リズムに意外性と笑いをプラス
- onboardingやrepo初見時でも、Claude CodeのAI coding workflowが単調にならず、context切り替えのタイミングを明確に意識できる
- 長時間作業やmonorepo移動時に、通知で気分転換ができ、memoryやrepository understandingのリフレッシュを促す
- directoryやpath管理に追われがちな場面でも、エンタメ要素で「また説明か…」という心の負担を軽減
- Skillの存在自体が、日々のAI coding workflowに新しい「遊び」を持ち込むトリガーになる
GitHub から degit でコマンド1行、Claude Code の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/claude-code/random-os-soundtrack-notifier .claude/skills/random-os-soundtrack-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (CLAUDE.md と組み合わせて)
# /random-os-soundtrack-notifier
[OS通知] 今日の作業BGM: ドラゴンクエスト戦闘曲 (全力で戦う気分でどうぞ)
---
Claude Code: Skill の中身を全部見せる
.claude/skills/random-os-soundtrack-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.claude/skills/random-os-soundtrack-notifier/
├── SKILL.md
├── scripts/
│ └── random_os_soundtrack_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
ファイル
役割
SKILL.md
Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_soundtrack_notifier.py
random-os-soundtrack-notifier: 今日の作業BGMを理不尽に通知
references/design_notes.md
概要 をまとめた参考資料
SKILL.md
---
name: random-os-soundtrack-notifier
description: ターミナルやエディタの起動時、または /random-os-soundtrack-notifier コマンド実行時に、今日の作業BGMとしてバカバカしいランダム楽曲名をOS通知で提案します。発動条件: 起動/明示呼び出し/semantic trigger。
---
# 機能概要
このSkillは、ターミナルやエディタの起動時、または明示的なコマンド呼び出し時に、あなたの“今日の作業BGM”として完全ランダムかつ理不尽な楽曲タイトルをOS通知で提案します。『情熱大陸』『運命』『初音ミクの消失』『ドラクエ戦闘曲』『朝のラジオ体操』など、ジャンルも雰囲気もバラバラなラインナップが特徴です。実際に音楽は流れませんが、通知を見るだけで作業開始時にクスッと笑える演出を提供します。毎日の作業始めにちょっとしたバカバカしさとエンタメを加え、気分転換やアイスブレイクに最適です。
# 使い方
- 明示呼び出し: `/random-os-soundtrack-notifier`
- 暗黙発動: ターミナル/エディタ起動時や「作業開始」「BGM」「集中」などのキーワード検知時
- サブコマンド: `--list`(候補一覧表示)、`--log`(過去通知履歴表示)
# 出力例
```terminal
[通知] 今日の作業BGM: ドラクエ戦闘曲
[通知] 今日の作業BGM: 朝のラジオ体操 第一
[通知] 今日の作業BGM: 情熱大陸 メインテーマ
[通知] 今日の作業BGM: 運命(ベートーヴェン交響曲第5番)
[通知] 今日の作業BGM: 初音ミクの消失
[通知] 今日の作業BGM: となりのトトロ サントラ
```
# 注意点
- 実際に音楽は再生されません。通知のみです。
- 通知履歴はローカル(~/.random_os_soundtrack_log)に保存されます。
- 除外パス: システムディレクトリやCI環境では発動しません。
- 通知APIはOSごとに異なり、Linux/macOS/Windowsで安定動作します。
# 参考資料
- [Python公式: 通知ライブラリ plyer](https://github.com/kivy/plyer)
- references/design_notes.md も参照
scripts/random_os_soundtrack_notifier.py
import os
import sys
import random
import argparse
import datetime
import platform
try:
from plyer import notification
except ImportError:
notification = None
SOUNDTRACKS = [
'情熱大陸 メインテーマ',
'運命(ベートーヴェン交響曲第5番)',
'初音ミクの消失',
'ドラクエ戦闘曲',
'朝のラジオ体操 第一',
'となりのトトロ サントラ',
'ポケモンセンターBGM',
'サザエさんのエンディング',
'ウルトラソウル',
'エヴァンゲリオン 残酷な天使のテーゼ',
'ルパン三世のテーマ',
'スーパー戦隊シリーズOP',
'世界の車窓から',
'ドラえもんのうた',
'ガンダム 哀 戦士',
'カノン(パッヘルベル)',
'千本桜',
'パプリカ',
'マリオ地上BGM',
'FF勝利のファンファーレ',
'紅蓮華',
'北斗の拳 愛をとりもどせ!!',
'水戸黄門のテーマ',
'アンパンマンマーチ',
'暴れん坊将軍',
'銀河鉄道999',
'モンスターハンター メインテーマ',
'ラジオ体操 第二',
'NHKニュースのテーマ',
'笑点のテーマ',
'バッハ G線上のアリア',
'ZARD 負けないで',
'恋(星野源)',
'USA(DA PUMP)',
'Let It Go',
'ようかい体操第一',
'にんげんっていいな',
'ルージュの伝言',
'世界に一つだけの花',
'恋するフォーチュンクッキー',
'残酷な天使のテーゼ',
'Get Wild',
'CHA-LA HEAD-CHA-LA',
'君が代',
'サライ',
'大きな古時計',
'おどるポンポコリン',
'ハレ晴レユカイ',
'Butter-Fly',
'タッチ',
'勇気100%',
'世界はあなたに笑いかけている',
'小さな恋のうた',
'Pretender',
'アイネクライネナハトムジーク',
'アナと雪の女王 サントラ',
'炎(LiSA)',
'パプリカ(米津玄師)',
'シンフォニックメドレー',
'カエルの歌',
'ねこふんじゃった',
'大脱走マーチ',
'宇宙戦艦ヤマト',
'銀河鉄道999',
'となりのトトロ さんぽ',
'崖の上のポニョ',
'風になる',
'ぼくのなつやすみ サントラ',
'おしりたんてい',
'ドラゴンクエスト序曲',
'勇者の挑戦',
'ポケットモンスター 戦闘曲',
'MOTHER エイトメロディーズ',
'スーパーマリオ オデッセイ',
'星に願いを',
'ジブリメドレー',
'ファイナルファンタジー メインテーマ',
'クロノ・トリガー 時の回廊',
'ゼルダの伝説 メインテーマ',
'ピタゴラスイッチ',
'おどるポンポコリン',
'日本昔ばなし',
'世界の車窓から',
'おさかな天国',
'みんなのうた',
'おもちゃのチャチャチャ',
'チューリップ',
'ゆうやけこやけ',
'さくらさくら',
'荒城の月',
'ふるさと',
'仰げば尊し',
'旅立ちの日に',
'校歌',
'卒業写真',
'春よ、来い',
'夏祭り',
'世界に一つだけの花',
'365日の紙飛行機',
'ありがとう',
'未来予想図II',
'島唄',
'涙そうそう',
'少年時代',
'TSUNAMI',
'世界の終わり',
'さよならエレジー',
'Lemon',
'白日',
'香水',
'猫',
'ドライフラワー',
'夜に駆ける',
'怪物',
'踊',
'群青',
'勿忘',
'水平線',
'ベテルギウス'
]
LOG_PATH = os.path.expanduser('~/.random_os_soundtrack_log')
def notify(title, message):
if notification:
try:
notification.notify(
title=title,
message=message,
timeout=7
)
except Exception as e:
print(f"[WARN] OS通知失敗: {e}")
else:
# Fallback: print to stdout
print(f"[通知] {title}: {message}")
def pick_random_soundtrack():
return random.choice(SOUNDTRACKS)
def log_notification(soundtrack):
try:
with open(LOG_PATH, 'a', encoding='utf-8') as f:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
f.write(f"{now}\t{soundtrack}\n")
except Exception as e:
print(f"[WARN] ログ保存失敗: {e}")
def list_soundtracks():
for idx, s in enumerate(SOUNDTRACKS, 1):
print(f"{idx:2d}: {s}")
def show_log():
if not os.path.exists(LOG_PATH):
print("通知履歴はありません。")
return
with open(LOG_PATH, encoding='utf-8') as f:
lines = f.readlines()
print("--- 通知履歴 ---")
for line in lines[-30:]:
print(line.strip())
def is_excluded_environment():
# 除外: CIやシステムユーザー、/tmp, /etc など
if os.environ.get('CI') or os.environ.get('GITHUB_ACTIONS'):
return True
if os.geteuid() == 0:
return True
cwd = os.getcwd()
if cwd.startswith('/etc') or cwd.startswith('/tmp') or cwd.startswith('/var'):
return True
return False
def main():
parser = argparse.ArgumentParser(description='random-os-soundtrack-notifier: 今日の作業BGMを理不尽に通知')
parser.add_argument('--list', action='store_true', help='BGM候補一覧を表示')
parser.add_argument('--log', action='store_true', help='通知履歴を表示')
parser.add_argument('--force', action='store_true', help='環境チェックを無視して強制通知')
args = parser.parse_args()
if args.list:
list_soundtracks()
return
if args.log:
show_log()
return
if not args.force and is_excluded_environment():
print("[INFO] 除外環境のため通知しません。")
return
soundtrack = pick_random_soundtrack()
notify('今日の作業BGM', soundtrack)
log_notification(soundtrack)
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、作業開始時の気分転換やアイスブレイクを目的に、毎回バカバカしいBGMタイトルを通知する設計です。実際の音楽再生は行わず、通知のみで完結します。
# 公式ドキュメント抜粋
OS通知にはPythonの plyer ライブラリ(https://github.com/kivy/plyer)を利用。macOS, Windows, Linuxで安定動作。通知APIが利用できない場合は標準出力にフォールバックします。
# 利用例
- ターミナルやエディタ起動時に自動発動
- `/random-os-soundtrack-notifier --list`で候補を一覧
- `/random-os-soundtrack-notifier --log`で過去通知履歴を確認
# 注意点
- システムディレクトリやCI環境では通知を抑制
- ログはホームディレクトリ直下に保存
- plyer未インストール時は標準出力のみ
# 設計方針
「バカバカしさ」「理不尽さ」を重視し、ジャンル・年代・雰囲気がバラバラなBGMリストを用意。通知だけで完結し、余計なリソース消費や誤動作を防止。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Claude Code はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit 実行に必要)
- Claude Code がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/claude-code/random-os-soundtrack-notifier .claude/skills/random-os-soundtrack-notifier
.claude/skills/random-os-soundtrack-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .claude/skills/random-os-soundtrack-notifier
# SKILL.md, scripts/, references/, README.md があればOK
4. Claude Code を再起動 (or Skill 自動検出を待つ)
新しいSkillが自動で認識されます。リスト確認したい場合は /random-os-soundtrack-notifier と Skill 名で出てきます。
5. 動作確認
/random-os-soundtrack-notifier で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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 との連携設計はどうあるべきか?
- 起動時に毎回ランダムなBGMタイトルが通知されるか?
- 通知内容が十分にバカバカしいラインナップになっているか?
- OS通知が安定して表示されるか?
実際に Claude Code で試した検証ログは Claude Codeで毎朝ランダムBGM通知を楽しんでみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
