Claude CodeでOS通知にランダム祝福メッセージを表示する仕組みの作り方

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

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

Claude Code を日々使っていると、プロジェクトの規模や構造が複雑になるほど「思いがけない混乱」や「ちょっとしたストレス」に出会うことも増えてきます。特に monorepo や複数 directory を横断しながら作業していると、AI の context や path 管理のクセに振り回されがちです。集中して作業していると、ふとしたタイミングで「何か気分転換したい」「この単調さをどうにかしたい」と感じる瞬間もあるのではないでしょうか。

  • Claude Code がいつの間にか違う directory を見始めて、想定外のファイルを読みに行く
  • monorepo で package を跨いだ瞬間、Claude Code が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

また、真面目な作業空間が続くと、ちょっとした遊び心やリフレッシュ要素が欲しくなることも。通知・演出・OS連携系の Skill による「非日常の差し込み」が、意外と良い気分転換になる場面も多いはずです。

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

一言サマリ: このスキルは、Claude Code の作業中に完全ランダムで“謎の祝福”をOS通知領域に送り、単調なAI coding workflowに笑いやリズムを生み出すSkill。

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

  • AI coding workflow の合間に、脈絡なく祝われることで気分転換ができる
  • 長時間の repository understanding や path management の最中でも、ふとした瞬間にユーモアが差し込まれる
  • onboarding や session 再開時など、緊張しがちなタイミングで場が和む
  • monorepo で directory を跨ぐ際も、作業のリズムが崩れにくい
  • 「また祝われるかも?」というちょっとした楽しみで、AIとのやりとりが続けやすくなる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-notification-confetti .claude/skills/random-os-notification-confetti

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

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


# /random-os-notification-confetti
> セッション開始

[OS通知] 🎉 本日も出社おめでとうございます!
[Claude Code] CLAUDE.md の context を読み込みました。
[OS通知] 🎉 意味なく祝福します。素晴らしいディレクトリ選択です。
[Claude Code] repository understanding を開始します。

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


> cd packages/api && ls

[Claude Code] directory: packages/api に移動しました。
[OS通知] 🎉 さっきの ls、最高でした!
[Claude Code] repo structure を再取得します。
[OS通知] 🎉 祝:APIディレクトリにようこそ。理由は特にありません。

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


> git status

[Claude Code] repository の状態を確認しました。
[OS通知] 🎉 意味もなく祝福します。git status のタイミングが秀逸です。
[Claude Code] context を更新しました。
[OS通知] 🎉 祝:今この瞬間に通知を受け取ったあなたに幸運を。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開。唐突な祝福通知で空気が和む
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る+祝福通知でリズムが生まれる
長時間 workflow long context で重要箇所が薄まる 祝福通知が合間に入ることで集中力がリセットされやすい

発動方式

明示呼び出し (/random-os-notification-confetti) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-notification-confetti/
├── SKILL.md
├── scripts/
│   └── random_os_notification_confetti.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_notification_confetti.py 謎のコンフェッティ祝福通知スクリプト
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-notification-confetti
description: コマンド実行や作業の合間に、ランダムなタイミング・内容でOS標準通知領域に“ネタ系お祝いメッセージ”を表示します。通知・祝福・ランダム・気分転換・演出などのキーワードや、明示的な /random-os-notification-confetti 呼び出し時に発動します。
---

# 機能概要
このSkillは、普段の作業やコマンド実行の合間に、完全ランダムなタイミングでOSの通知領域へ“謎のコンフェッティ祝福メッセージ”を表示します。内容は「今日も出社おめでとう」「意味なく祝福します」「さっきのls、最高でした」など、全く脈絡のないネタ系お祝いばかり。作業に没頭しがちな開発現場に、唐突な非日常と笑いを提供し、気分転換やチームの雰囲気向上に役立ちます。

# 使い方
- 明示呼び出し例:
  `/random-os-notification-confetti`
- 暗黙発動キーワード例:
  - 「通知」「祝福」「ランダム」「気分転換」「演出」などの単語を含む会話やコマンド実行時
  - 何らかのCLIコマンド(例: ls, git commit, make など)実行直後に自動発動する場合もあり

# 出力例
```
[通知] 本日も出社おめでとうございます!
[通知] さっきのls、最高でした。
[通知] 何もしてないけど祝っておきます。
[通知] 意味なく祝福します。紙吹雪!
[通知] あなたのタイピング、見事でした。
[通知] 今日の作業、すでに伝説です。
[通知] コーヒー休憩も祝福タイム!
```

# 注意点
- 通知はOSの標準通知APIを利用します(Linux: notify-send, macOS: osascript, Windows: win10toast)。
- 通知内容は完全ランダムで、意味や文脈は考慮しません。
- 通知頻度は内部で自動調整され、過剰なスパムを防ぎます。
- ローカル環境でのみ動作し、通知内容は保存されません。
- 一部の環境では通知が表示されない場合があります。

# 参考資料
- references/design_notes.md(設計方針・利用例・注意点など)
- 公式: https://specifications.freedesktop.org/notification-spec/latest/
- Python notify2, osascript, win10toast の各ドキュメント

scripts/random_os_notification_confetti.py

import sys
import os
import platform
import time
import random
import argparse
from threading import Thread

# OSごとの通知関数

def notify_linux(title, message):
    try:
        from subprocess import run
        run(['notify-send', title, message])
    except Exception as e:
        print(f"[通知失敗(Linux)]: {e}")

def notify_macos(title, message):
    try:
        from subprocess import run
        script = f'display notification "{message}" with title "{title}"'
        run(['osascript', '-e', script])
    except Exception as e:
        print(f"[通知失敗(macOS)]: {e}")

def notify_windows(title, message):
    try:
        from win10toast import ToastNotifier
        toaster = ToastNotifier()
        toaster.show_toast(title, message, duration=5, threaded=True)
    except ImportError:
        print("win10toast がインストールされていません: pip install win10toast")
    except Exception as e:
        print(f"[通知失敗(Windows)]: {e}")

def notify(title, message):
    system = platform.system()
    if system == 'Linux':
        notify_linux(title, message)
    elif system == 'Darwin':
        notify_macos(title, message)
    elif system == 'Windows':
        notify_windows(title, message)
    else:
        print(f"[通知未対応OS]: {title} {message}")

# 祝福メッセージリスト
CONFETTI_MESSAGES = [
    "本日も出社おめでとうございます!",
    "さっきのls、最高でした。",
    "何もしてないけど祝っておきます。",
    "意味なく祝福します。紙吹雪!",
    "あなたのタイピング、見事でした。",
    "今日の作業、すでに伝説です。",
    "コーヒー休憩も祝福タイム!",
    "git commit、お疲れ様です。",
    "全く脈絡なく祝います。",
    "この通知に意味はありません。",
    "気分転換にどうぞ!",
    "謎の紙吹雪、発射!",
    "あなたの努力に祝福を。",
    "この瞬間を祝います。",
    "ls -la、素晴らしい選択です。",
    "make build、成功を祈ります。",
    "今日も一日頑張りましょう!",
    "何もしてなくても祝います。",
    "突然の祝福に戸惑わないでください。",
    "意味不明な通知ですが気にしないでください。"
]

# 通知頻度制御
MIN_INTERVAL = 120  # 秒 (2分)
MAX_INTERVAL = 900  # 秒 (15分)

# 通知スレッド
class ConfettiNotifier(Thread):
    def __init__(self, once=False):
        super().__init__()
        self.once = once
        self.running = True
    def run(self):
        if self.once:
            send_random_notification()
            return
        while self.running:
            wait = random.randint(MIN_INTERVAL, MAX_INTERVAL)
            time.sleep(wait)
            send_random_notification()
    def stop(self):
        self.running = False

def send_random_notification():
    msg = random.choice(CONFETTI_MESSAGES)
    notify("祝福の紙吹雪", msg)
    print(f"[通知] {msg}")

# CLIサブコマンド

def main():
    parser = argparse.ArgumentParser(description="謎のコンフェッティ祝福通知スクリプト")
    subparsers = parser.add_subparsers(dest='command')

    parser_once = subparsers.add_parser('once', help='1回だけ祝福通知')
    parser_start = subparsers.add_parser('start', help='定期的に祝福通知')
    parser_stop = subparsers.add_parser('stop', help='(ダミー)スレッド停止')
    parser_list = subparsers.add_parser('list', help='祝福メッセージ一覧表示')
    parser_summary = subparsers.add_parser('summary', help='祝福通知の概要表示')

    args = parser.parse_args()

    if args.command == 'once':
        send_random_notification()
    elif args.command == 'start':
        print("[INFO] ランダム祝福通知を開始します (Ctrl+Cで停止)")
        notifier = ConfettiNotifier()
        try:
            notifier.start()
            while notifier.is_alive():
                notifier.join(1)
        except KeyboardInterrupt:
            notifier.stop()
            print("[INFO] 通知スレッドを停止しました")
    elif args.command == 'stop':
        print("[INFO] stopコマンドはダミーです。Ctrl+Cで停止してください。")
    elif args.command == 'list':
        print("== 祝福メッセージ一覧 ==")
        for i, msg in enumerate(CONFETTI_MESSAGES, 1):
            print(f"{i:2d}: {msg}")
    elif args.command == 'summary':
        print("== random-os-notification-confetti 概要 ==")
        print(f"登録祝福数: {len(CONFETTI_MESSAGES)}")
        print(f"通知間隔: {MIN_INTERVAL//60}-{MAX_INTERVAL//60}分")
        print("OS: Linux, macOS, Windows 対応")
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、作業中にユーザーを唐突に祝福することで気分転換やユーモアを提供することを目的としています。通知内容は完全にランダムなネタ系メッセージで、作業効率や生産性への直接的な影響はありませんが、開発現場の空気を和らげる効果が期待できます。

# 公式ドキュメント抜粋
- Linux: notify-send (freedesktop.org)
- macOS: osascript (AppleScript)
- Windows: win10toast (PyPI)

# 利用例
- 長時間のコーディングやビルド作業の合間に、突如祝福されて笑いが生まれる
- チームで使うことで、通知をネタにしたコミュニケーションが活発化

# 注意点
- 通知APIはOSごとに異なり、Linuxではnotify-sendコマンド、macOSではosascript、Windowsではwin10toastを利用します。
- 一部の環境やリモートセッションでは通知が表示されない場合があります。
- 通知頻度は2分~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-notification-confetti .claude/skills/random-os-notification-confetti

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-notification-confetti で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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をコピーしました!
目次