Claude Codeでデスクトップ通知を活用した不条理演出の作り方

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

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

Claude Code を日常的に使っていると、集中力が切れたり、作業が単調になってくる瞬間が少なくありません。特に長時間のコーディングや monorepo の大規模リポジトリを扱う場合、AI coding workflow の中で「気分転換がほしい」「ちょっとした演出で環境を変えたい」と感じた経験は多いはずです。

  • リポジトリや directory の切り替え作業が続き、気分転換するタイミングを見失う
  • Claude Code の通知や演出が淡白で、repository understanding のモチベーション維持が難しい
  • onboarding や session 再開時、単調な流れで眠くなることがある
  • 長時間の long context 作業で、重要な情報や記憶が薄れてしまう
  • AI coding workflow の中で「もうひと押し」面白さや刺激が足りないと感じる

こうした悩みは、通知・演出・OS連携に特化した Skill を導入することで、作業環境の雰囲気を一変させる新しいアプローチが求められています。

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

一言サマリ: このスキルは、作業中に完全ランダムで「謎のOSカラオケ推奨通知」をデスクトップに表示し、気分転換と遊び心を強制的に注入します。

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

  • 単調になりがちな Claude Code の AI coding workflow に、予測不能なカオス演出で刺激と笑いをもたらす
  • 長時間の session や onboarding 時も、ユニークな通知で context や memory のリフレッシュを促す
  • repo や directory を跨ぐ作業の合間に、強制的に現実逃避できるタイミングを自動生成
  • 「OSがカラオケ好きになった」ような不条理な体験で、作業場の雰囲気を和ませる
  • Skill の導入・管理も .claude/skills/ 配置だけで完結し、path management の手間が増えない
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /random-os-karaoke-alert
> 作業開始

[通知] OSカラオケ推奨: 本日は“残業パラダイス”を熱唱してください。
推奨理由: repository understanding の集中力アップに効果的です。

(通知はデスクトップにポップアップ表示されました)

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


> packages/core/utils ディレクトリに移動

[通知] OSカラオケ推奨: 推奨曲「バグ退治ブルース」を歌いながら directory を整理しましょう。
ヒント: monorepo の path management もリズムよく!

(通知はデスクトップにポップアップ表示されました)

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


> ちょっと休憩したい

[通知] OSカラオケ推奨: 歌唱力がアップデートされました。新しいメロディで memory をリフレッシュ!
お題: 「コミット・ソング」を即興でどうぞ。

(通知はデスクトップにポップアップ表示されました)

before / after の違い

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

発動方式

明示呼び出し (/random-os-karaoke-alert) と暗黙発動 (カラオケ・現実逃避・休憩系の description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-karaoke-alert/
├── SKILL.md
├── scripts/
│   └── random_os_karaoke_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_karaoke_alert.py random-os-karaoke-alert: OS風カラオケ推奨通知スキル
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-karaoke-alert
description: このSkillは、作業中や長時間の無操作時などに、OS通知としてランダムなタイミングと内容で“カラオケ推奨アラート”を表示します。明示的な /random-os-karaoke-alert 呼び出しや「カラオケ」「休憩」「現実逃避」などのキーワード検出時にも発動します。
---

# 機能概要
このSkillは、あなたの作業環境に突如として“OSがカラオケ好きになった”かのような通知を炸裂させる演出系ツールです。通知内容は完全ランダムで「本日は“残業パラダイス”を熱唱してください」「推奨曲:バグ退治ブルース」など、現実逃避やユーモアをOSが推奨してくるカオスな体験を提供します。作業の合間の気分転換や、チームの雰囲気を和ませたいときに最適です。

# 使い方
- 明示呼び出し例: `/random-os-karaoke-alert` を実行すると即座に通知が表示されます。
- 暗黙発動: 「カラオケ」「休憩」「現実逃避」「歌いたい」などのキーワードが会話やログに現れると自動的に発動します。
- 常時監視型: スキルを有効化しておくと、30分~2時間のランダムな間隔で自動的に通知します。

# 出力例
```
[通知] OSカラオケ推奨: 本日は“残業パラダイス”を熱唱してください。
[通知] 推奨曲: バグ退治ブルース
[通知] 歌唱力がアップデートされました。今すぐ一曲いかがですか?
[通知] OSより: カラオケ休憩の時刻です。
[通知] システム: “仕様書ブルース”を歌うとバグが減るかもしれません。
```

# 注意点
- 通知はローカル環境でのみ表示され、外部サーバー等には一切情報を送信しません。
- データ損失やシステム破壊を引き起こすことはありません。
- 通知内容は5パターン以上からランダム生成されます。
- 通知履歴はローカルに保存されます(`~/.random_os_karaoke_alert.log`)。
- Linux/macOS: `notify-send`/`osascript`を利用。Windows: `win10toast`を利用。

# 参考資料
- [Python公式: 通知API](https://docs.python.org/3/library/subprocess.html)
- references/design_notes.md も参照

scripts/random_os_karaoke_alert.py

import sys
import os
import random
import time
import argparse
import platform
import subprocess
from datetime import datetime, timedelta

LOG_PATH = os.path.expanduser('~/.random_os_karaoke_alert.log')

NOTIFICATIONS = [
    '本日は“残業パラダイス”を熱唱してください。',
    '推奨曲: バグ退治ブルース',
    '歌唱力がアップデートされました。今すぐ一曲いかがですか?',
    'OSより: カラオケ休憩の時刻です。',
    'システム: “仕様書ブルース”を歌うとバグが減るかもしれません。',
    '推奨曲: デバッグ・ナイトフィーバー',
    '本日は“コミット・シンフォニー”でリリースを祝おう!',
    '歌唱力診断: あなたの声はバージョン2.0です。',
    'OSがカラオケを始めたがっています。',
    '推奨: 5分間のカラオケ現実逃避タイム'
]

TITLE = 'OSカラオケ推奨'


def log_notification(message):
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    with open(LOG_PATH, 'a', encoding='utf-8') as f:
        f.write(f'[{timestamp}] {message}\n')


def send_notification(message):
    system = platform.system()
    try:
        if system == 'Darwin':  # macOS
            script = f'display notification "{message}" with title "{TITLE}"'
            subprocess.run(['osascript', '-e', script], check=True)
        elif system == 'Linux':
            subprocess.run(['notify-send', TITLE, message], check=True)
        elif system == 'Windows':
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast(TITLE, message, duration=7)
            except ImportError:
                print('win10toastが必要です: pip install win10toast')
        else:
            print(f'通知未対応OS: {system}')
    except Exception as e:
        print(f'通知送信失敗: {e}')
    log_notification(message)


def random_notification():
    message = random.choice(NOTIFICATIONS)
    send_notification(message)
    return message


def list_log():
    if not os.path.exists(LOG_PATH):
        print('通知履歴はありません。')
        return
    with open(LOG_PATH, 'r', encoding='utf-8') as f:
        for line in f:
            print(line.strip())


def summary():
    if not os.path.exists(LOG_PATH):
        print('通知履歴はありません。')
        return
    counts = {}
    with open(LOG_PATH, 'r', encoding='utf-8') as f:
        for line in f:
            for msg in NOTIFICATIONS:
                if msg in line:
                    counts[msg] = counts.get(msg, 0) + 1
    print('通知別発動回数:')
    for msg, cnt in sorted(counts.items(), key=lambda x: -x[1]):
        print(f'  {msg} : {cnt}回')


def monitor_mode(min_minutes=30, max_minutes=120):
    print('ランダム通知モードを開始します (Ctrl+Cで終了)')
    try:
        while True:
            interval = random.randint(min_minutes * 60, max_minutes * 60)
            next_alert = datetime.now() + timedelta(seconds=interval)
            print(f'次の通知予定: {next_alert.strftime("%H:%M:%S")} (約{interval//60}分後)')
            time.sleep(interval)
            random_notification()
    except KeyboardInterrupt:
        print('\nランダム通知モードを終了しました')


def main():
    parser = argparse.ArgumentParser(description='random-os-karaoke-alert: OS風カラオケ推奨通知スキル')
    subparsers = parser.add_subparsers(dest='command')

    parser_run = subparsers.add_parser('run', help='即座にカラオケ通知を表示')
    parser_monitor = subparsers.add_parser('monitor', help='ランダムな間隔で自動通知')
    parser_monitor.add_argument('--min', type=int, default=30, help='最小インターバル(分)')
    parser_monitor.add_argument('--max', type=int, default=120, help='最大インターバル(分)')
    parser_list = subparsers.add_parser('list', help='通知履歴を表示')
    parser_summary = subparsers.add_parser('summary', help='通知履歴を集計')

    args = parser.parse_args()

    if args.command == 'run':
        msg = random_notification()
        print(f'[通知] {msg}')
    elif args.command == 'monitor':
        monitor_mode(args.min, args.max)
    elif args.command == 'list':
        list_log()
    elif args.command == 'summary':
        summary()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、OS通知APIを活用し、ユーザーの作業中に意図的な“現実逃避”を促すカオスな演出を目的としています。通知内容は完全ランダムで、ユーモアと実用性を両立します。

# 公式ドキュメント抜粋
- [notify-send (Linux)](https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html)
- [osascript (macOS)](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [win10toast (Windows)](https://pypi.org/project/win10toast/)

# 利用例
- チームの気分転換タイムに
- 長時間作業のリマインダーとして
- ランダムな演出で会話のネタに

# 注意点
- 通知はローカル環境のみ。外部送信なし。
- 履歴はユーザーディレクトリ配下に保存。
- 依存: Linux/macOSは標準コマンド、Windowsは`win10toast`が必要。

# 設計方針
- シンプルな構成で安全性を担保
- 通知内容は5パターン以上、今後拡張も容易
- CLIサブコマンドで柔軟な運用を可能に

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-karaoke-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 混入を防ぎたい
  • 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 との連携設計はどうあるべきか?
  • 通知が本当にランダムなタイミングで現れるか?
  • 通知文が毎回異なるか(最低5パターン以上)?
  • データ損失や環境破壊を一切引き起こさないか?

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

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

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

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

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