Claude Codeで作業中の緊張感を和らげる通知演出の作り方

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

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

Claude Code で日々コーディングしていると、真面目な作業の合間にちょっとした「間」や「無音」が妙に気になる瞬間がある。集中しすぎてふと気が抜けたり、エラーやビルドの待ち時間が静寂すぎて逆に落ち着かないことも。特にリモートワークや深夜作業では、OSやツールからの通知が一切ないと、どこか孤独な気分になることも多い。そんな「沈黙」や「張り詰めた空気」をどうにかしたいと感じるユーザーも少なくない。

  • Claude Code の通知や演出が淡々としすぎて、作業にメリハリが生まれない
  • 長時間の AI coding workflow で、気が付くと無音・無反応な状態が続き、緊張感やリズムが途切れる
  • repository の切り替えや directory ジャンプ時に、何も変化がなくて「本当に切り替わった?」と不安になる
  • onboarding 直後や session 再開時、path management や context の説明に集中しすぎて、ちょっとした遊び心や余裕がなくなる
  • monorepo での package 跨ぎや memory の切り替え時、気分転換やアイスブレイク要素が欲しい

「AI coding workflow をもっと遊び心ある空間にしたい」「通知・演出で作業の空気を切り替えたい」―そんな気持ちに応えるのが、通知・演出・OS連携カテゴリの Skill だ。

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

一言サマリ: このスキルは、作業の合間やコマンド実行時に“謎のOS公式サウンドトラック通知”を爆誕させるジョーク演出Skill。

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

  • Claude Code の通知に「本日のテーマソング」など、シュールなOS風BGM演出が加わり、無音・無表情な作業空間に遊び心が生まれる
  • repository understanding や directory 切り替え時、意味不明なBGMタイトルが唐突に表示され、workflow のリズムや気分転換になる
  • monorepo での package 跨ぎや session 再開時にも、毎回異なる“公式サウンド通知”が現れ、長時間のAI coding workflowにちょうどよい脱力感を与える
  • 本当に音は流れないため、集中を妨げず、作業の邪魔になりすぎない演出として使える
  • onboarding 時や path management の説明タイミングでも、記憶に残る“演出”が入ることで、チーム内の話題作りやアイスブレイクにも役立つ
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-soundtrack-alert .claude/skills/random-os-fake-soundtrack-alert

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

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

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


# /random-os-fake-soundtrack-alert

[OS通知] 本日のテーマソング:『バグ修羅場行進曲』
副題:「リポジトリ迷子のワルツ」
メッセージ: 今日も Claude Code の context 探しの旅、始まります。
(※実際にBGMは流れません)

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


> packages/api/ に移動

[OS通知] 推奨BGM:「納期デッドヒート」
副題:「パス管理の果てまで」
メッセージ: 新しい directory で repository understanding をリフレッシュ。
(※音は出ません)

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


> ちょっと気分転換したい

[OS通知] 今日の一曲:『メモリ解放ジャズ』
副題:「context window の彼方へ」
メッセージ: 長時間 workflow の合間にシュールな一息を。
(※BGMは脳内再生でどうぞ)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開+謎通知で和む
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る+BGM通知で気分転換
長時間 workflow long context で重要箇所が薄まる 脱力系通知で workflow に緩急がつく

発動方式

明示呼び出し (/random-os-fake-soundtrack-alert) と暗黙発動 (「BGM」「今日のテーマソング」「気分転換」など説明文マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-soundtrack-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_soundtrack_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_soundtrack_alert.py 謎のOS公式サウンドトラック通知を表示するジョークスクリプト。音は流れません。
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-soundtrack-alert
description: このSkillは、Claude Codeでコマンド実行や作業開始時などのタイミングで、毎回異なる“架空のOS公式サウンドトラック通知”をデスクトップに表示します。通知内容や曲名は完全オリジナルで、実際に音は流れません。作業の緊張感を和らげるジョーク演出や、沈黙を打ち破るユーモアな通知が欲しい場合に最適です。
---

# 機能概要
このSkillは、作業中やコマンド実行時に“謎のOS公式サウンドトラック通知”をデスクトップに表示します。通知内容は毎回異なり、「本日のテーマソング:『バグ修羅場行進曲』」「今こそ流せ!『納期デッドヒート』」など、完全オリジナルの曲名や開発現場ネタがランダムで生成されます。実際に音楽は流れませんが、作業の緊張感や沈黙をシュールに打ち破る、カオスなジョーク通知を提供します。

# 使い方
- 明示呼び出し: `/random-os-fake-soundtrack-alert` を実行すると即座に通知が表示されます。
- 暗黙発動: 「作業開始」「ビルド」「テスト」「コミット」などのキーワードや、コマンド実行時に自動で発動します。

# 出力例
```
[通知] 本日のテーマソング:『バグ修羅場行進曲』
[通知] 今こそ流せ!『納期デッドヒート』
[通知] 推奨BGM:『仕様書迷宮のワルツ』
[通知] 公式サウンド:『デバッグ無限ループ』
[通知] システム推奨BGM:『コミット前夜のバラード』
```

# 注意点
- 通知内容は毎回異なりますが、同じセッション内で重複する場合があります。
- 本Skillは実際に音楽やBGMを再生しません。通知のみが表示されます。
- 通知の頻度は自動制御され、作業の邪魔になりすぎない設計です。
- ローカルに通知履歴や曲名リストは保存されません。

# 参考資料
詳細な設計方針や通知生成ロジックについては references/design_notes.md を参照してください。公式APIの利用方法やクロスプラットフォーム通知の詳細は https://docs.python.org/ja/3/library/subprocess.html および https://plyer.readthedocs.io/en/latest/ をご覧ください。

scripts/random_os_fake_soundtrack_alert.py

import random
import sys
import argparse
import time
import threading
try:
    from plyer import notification
except ImportError:
    notification = None

THEME_PREFIXES = [
    '本日のテーマソング',
    '今こそ流せ!',
    '推奨BGM',
    '公式サウンド',
    'システム推奨BGM',
    '緊急推薦',
    '今週の推し曲',
    '開発現場のBGM',
    'OS公式テーマ',
    '隠しトラック',
]

SONG_TITLES = [
    'バグ修羅場行進曲',
    '納期デッドヒート',
    '仕様書迷宮のワルツ',
    'デバッグ無限ループ',
    'コミット前夜のバラード',
    'マージ地獄のカノン',
    'ビルド失敗のエチュード',
    'レビュー嵐のラプソディ',
    'テスト地帯のロンド',
    'リリース前夜のノクターン',
    'バージョン地獄のサンバ',
    'リファクタリング幻想曲',
    '仕様追加のパラフレーズ',
    'CI/CDのトッカータ',
    'スタックオーバーフロー賛歌',
    'エラー地帯のセレナーデ',
    '会議無限リピート',
    'ドキュメント難民のブルース',
    'ペアプロのカプリチオ',
    '要件定義の夜想曲',
]

SUBTITLES = [
    '',
    '〜終わらないSprint〜',
    '(feat. 仕様変更)',
    '【緊急リリースver.】',
    '(デスマーチ編)',
    '〜眠れぬ夜に〜',
    '(バグフィックスRemix)',
    '【再起動不可】',
    '(仮)',
    '〜伝説のバグ〜',
    '(未実装)',
    '【無限ループMix】',
    '(会議室Live)',
    '〜エラーの海〜',
    '(仕様未定)',
]

NOTIFY_INTERVAL = 900  # 15分ごと

class SoundtrackAlert:
    def __init__(self, dry_run=False):
        self.dry_run = dry_run or (notification is None)

    def random_message(self):
        prefix = random.choice(THEME_PREFIXES)
        title = random.choice(SONG_TITLES)
        subtitle = random.choice(SUBTITLES)
        msg = f"{prefix}:『{title}』"
        if subtitle:
            msg += f"{subtitle}"
        return msg

    def notify(self, message):
        if self.dry_run:
            print(f"[通知] {message}")
        else:
            try:
                notification.notify(
                    title="OS公式サウンドトラック通知",
                    message=message,
                    timeout=6
                )
            except Exception as e:
                print(f"[通知失敗] {message} ({e})")

    def run_once(self):
        msg = self.random_message()
        self.notify(msg)

    def run_loop(self, interval=NOTIFY_INTERVAL, count=None):
        i = 0
        try:
            while True:
                if count is not None and i >= count:
                    break
                self.run_once()
                i += 1
                time.sleep(interval)
        except KeyboardInterrupt:
            print("\n[終了] サウンドトラック通知ループを終了しました。")

    def list_samples(self, n=10):
        samples = set()
        while len(samples) < n:
            samples.add(self.random_message())
        for s in samples:
            print(f"[通知サンプル] {s}")


def main():
    parser = argparse.ArgumentParser(
        description="謎のOS公式サウンドトラック通知を表示するジョークスクリプト。音は流れません。"
    )
    subparsers = parser.add_subparsers(dest="command")

    parser_once = subparsers.add_parser("once", help="1回だけ通知を表示")
    parser_loop = subparsers.add_parser("loop", help="定期的に通知を表示")
    parser_loop.add_argument("-i", "--interval", type=int, default=NOTIFY_INTERVAL, help="通知間隔(秒)")
    parser_loop.add_argument("-n", "--count", type=int, default=None, help="通知回数(省略時は無限)")
    parser_sample = subparsers.add_parser("sample", help="通知サンプルを複数表示")
    parser_sample.add_argument("-n", type=int, default=10, help="サンプル数")
    parser.add_argument("--dry-run", action="store_true", help="実際の通知を出さずprintする")

    args = parser.parse_args()
    alert = SoundtrackAlert(dry_run=args.dry_run)

    if args.command == "once":
        alert.run_once()
    elif args.command == "loop":
        alert.run_loop(interval=args.interval, count=args.count)
    elif args.command == "sample":
        alert.list_samples(n=args.n)
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、作業中の緊張感や沈黙をジョーク通知で和らげるために設計されました。通知内容は完全オリジナルで、OSが勝手に“今日のBGM”を推奨してくるような演出を再現します。

# 公式ドキュメント抜粋
通知にはPythonのplyer.notificationを利用しています。plyerはクロスプラットフォーム対応で、Windows/macOS/Linuxで同じコードで通知が可能です。

# 利用例
- 明示的に `python random_os_fake_soundtrack_alert.py once` で即座に通知
- `loop` サブコマンドで一定間隔ごとに通知
- `sample` サブコマンドで通知例を確認

# 注意点
- plyerがインストールされていない場合やサーバ環境では、print出力にフォールバックします。
- 実際に音楽やBGMは再生されません。

# 設計方針
通知内容は毎回異なるよう、複数のプレフィックス・曲名・副題をランダム合成。通知頻度は15分ごとをデフォルトとし、作業の邪魔になりすぎない設計です。履歴保存やログ機能はあえて実装していません。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-soundtrack-alert .claude/skills/random-os-fake-soundtrack-alert

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

3. ファイル配置確認

ls .claude/skills/random-os-fake-soundtrack-alert
# SKILL.md, scripts/, references/, README.md があればOK

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

新しいSkillが自動で認識されます。リスト確認したい場合は /random-os-fake-soundtrack-alert と Skill 名で出てきます。

5. 動作確認

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

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい+雰囲気を和ませたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい+通知でリズムをつけたい
  • onboarding 時: 新しい repo を Claude Code に把握させ、path 指定の手間を省きつつ話題作りしたい
  • session 再開時: long context が切れた後でも、必要な path と directory 構造だけ素早く戻したい+アイスブレイクしたい
  • package 跨ぎ作業時: directory boundary を Skill 側で管理して、irrelevant な path 混入を防ぎつつBGM通知で気分転換
  • 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
  • 通知の頻度: あまりに高頻度だと逆に workflow の邪魔になる可能性
  • 通知内容のユニークさ: 毎回違う曲名・副題が出るか、パターンが枯渇しないか

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知内容が毎回異なり、曲名や副題のユニークさが維持されるか?
  • 本当に音やBGMが流れないことを確認できるか?
  • 通知が適度な頻度で表示され、作業の邪魔になりすぎないか?

実際に Claude Code で試した検証ログは Claude Codeで謎のOS公式サウンド通知を爆誕させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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