Claude Codeで謎のコーヒーブレイク通知を演出するSkill構築ガイド

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

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

集中してコーディングしていると、つい休憩を忘れて作業に没頭しがちです。Claude Code を使った AI coding workflow では、context を維持しながら長時間作業するケースも多く、気付けば repository の directory を跨いで延々と手が止まらなくなることも。「ちょっと一息つきたいけど、タイミングが分からない」という声もよく聞かれます。

さらに、OSレベルの通知や演出が少ないため、作業に没頭しすぎてリフレッシュのきっかけを失いがちです。特に monorepo のような大規模 repository では、onboarding や path management のストレスも重なり、長時間の session が routine になりやすいです。

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

通知・演出・OS連携が不足していることで、作業の区切りが曖昧になり、オンオフの切り替えが難しいという悩みが生まれています。

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

一言サマリ: このスキルは、作業中に“OS公式っぽい謎コーヒーブレイク通知”を完全ランダムなタイミングと内容で表示し、AI coding workflow にユーモアとリフレッシュをもたらします。

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

  • 長時間の repository 作業や monorepo の directory 移動中でも、ふいに現れる通知でリフレッシュのきっかけが生まれる
  • 「重要:カフェイン補給の時刻です」など、OS公式風の説得力あるメッセージが context を和らげる
  • onboarding や session 再開時、思わぬタイミングで通知が出て、堅苦しい雰囲気を中和
  • AI的な診断や repository understanding の合間に、遊び心ある通知で workflow に余白を作れる
  • path management や directory 境界のストレスを、ユーモアでリセットできる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-coffee-break-notifier .claude/skills/random-os-coffee-break-notifier

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

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

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


# /random-os-coffee-break-notifier
> プロジェクトの初期セットアップを始めます

[OS通知] 重要:カフェイン補給の時刻です
今の作業ディレクトリ: /repo/src/
Claude Code からの推奨: コーヒーを淹れてリフレッシュしましょう

(この通知は完全にランダムです)

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


> packages/api/ から packages/web/ に移動して作業

[OS通知] タスク進捗が停滞中。コーヒーを飲めとの神託
現在の repository: monorepo-example
monorepo の directory 境界を跨ぎました

(通知は不定期に現れます)

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


> 今日はどこまで進めるかな?

[OS通知] AI的診断:あと5分で集中力が消滅します
推奨アクション: デスクから離れてストレッチ、またはコーヒーを一杯

(重要な情報は一切含まれていません)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 不意の通知で workflow に区切りが生まれ、リフレッシュしやすくなる

発動方式

明示呼び出し (/random-os-coffee-break-notifier) と暗黙発動 (説明文やコマンドが条件にマッチ) の両方に対応しています。

Skill の中身を全部見せる

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

.claude/skills/random-os-coffee-break-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_coffee_break_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-coffee-break-notifier
description: 作業やコーディング中に“OS公式っぽい”コーヒーブレイク推奨通知を完全ランダムなタイミング・内容で表示したい時に発動。/random-os-coffee-break-notifier や「コーヒー休憩」「集中力低下」等のキーワードで自動発動。
---

# 機能概要
このSkillは、作業中に“OS公式っぽい”コーヒーブレイク推奨通知をランダムなタイミング・内容でデスクトップに表示します。通知内容は「重要:カフェイン補給の時刻です」「AI的診断:あと5分で集中力が消滅します」など、妙に説得力があるが全く役に立たないメッセージが毎回異なります。真面目に作業している時ほど理不尽に推奨される謎コーヒータイムで、作業の合間に少しだけクスッとできる演出を提供します。

# 使い方
- 明示呼び出し: `/random-os-coffee-break-notifier` を実行
- 暗黙発動: 「コーヒー休憩」「集中力低下」「生産性」「休憩したい」などのキーワードを含む会話やコード中で自動発動

# 出力例
```
[OS通知] 重要:カフェイン補給の時刻です
[OS通知] タスク進捗が停滞中。コーヒーを飲めとの神託
[OS通知] AI的診断:あと5分で集中力が消滅します
[OS通知] システム推奨:生産性維持のため、今すぐコーヒーブレイクを!
[OS通知] 注意:脳内カフェイン残量が閾値を下回りました
```

# 注意点
- 通知は完全ランダムなタイミング・内容で表示されます
- OSの通知API(macOS: `osascript`/Linux: `notify-send`/Windows: `toast`)を利用
- データ損失やファイル改変は一切ありません
- 通知内容はジョーク要素が強く、実際の健康や生産性向上は保証しません
- ローカルに通知履歴は保存されません

# 参考資料
- [Python公式 subprocess モジュール](https://docs.python.org/ja/3/library/subprocess.html)
- [macOS osascript公式](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [Linux notify-send](https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html)
- references/design_notes.md も参照

scripts/random_os_coffee_break_notifier.py

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

def get_random_message():
    messages = [
        "重要:カフェイン補給の時刻です",
        "タスク進捗が停滞中。コーヒーを飲めとの神託",
        "AI的診断:あと5分で集中力が消滅します",
        "システム推奨:生産性維持のため、今すぐコーヒーブレイクを!",
        "注意:脳内カフェイン残量が閾値を下回りました",
        "OSからの警告:休憩しないと生産性が低下します",
        "AI観測:あなたの集中力は臨界点です。コーヒーをどうぞ",
        "推奨:今こそコーヒーでリフレッシュする時です",
        "システム診断:作業効率が下がっています。コーヒーブレイクを検討してください",
        "通知:コーヒーブレイクの時間がやってきました"
    ]
    return random.choice(messages)

def send_notification(message):
    system = platform.system()
    try:
        if system == "Darwin":
            # macOS
            script = f'display notification "{message}" with title "OS通知"'
            subprocess.run(["osascript", "-e", script], check=True)
        elif system == "Linux":
            # Linux (notify-send)
            subprocess.run(["notify-send", "OS通知", message], check=True)
        elif system == "Windows":
            # Windows 10+ (powershell toast)
            ps_script = f"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null; " \
                        f"$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02); " \
                        f"$template.GetElementsByTagName('text')[0].AppendChild($template.CreateTextNode('OS通知')) > $null; " \
                        f"$template.GetElementsByTagName('text')[1].AppendChild($template.CreateTextNode('{message}')) > $null; " \
                        f"$toast = [Windows.UI.Notifications.ToastNotification]::new($template); " \
                        f"$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Python Script'); " \
                        f"$notifier.Show($toast)"
            subprocess.run([
                "powershell", "-Command", ps_script
            ], check=True)
        else:
            print(f"[OS通知] {message}")
    except Exception as e:
        print(f"[通知エラー] {e}\n[OS通知] {message}")

def random_wait(min_sec=300, max_sec=1800):
    wait_time = random.randint(min_sec, max_sec)
    time.sleep(wait_time)
    return wait_time

def run_notifier(count=3, min_interval=300, max_interval=1800):
    for i in range(count):
        message = get_random_message()
        send_notification(message)
        if i < count - 1:
            wait_time = random_wait(min_interval, max_interval)
        else:
            break

def cli():
    parser = argparse.ArgumentParser(description="Random OS Coffee Break Notifier")
    subparsers = parser.add_subparsers(dest="command")

    notify_parser = subparsers.add_parser("notify", help="今すぐランダム通知を1回表示")
    notify_parser.add_argument("-n", "--number", type=int, default=1, help="通知回数 (デフォルト1)")

    auto_parser = subparsers.add_parser("auto", help="ランダム間隔で複数回通知")
    auto_parser.add_argument("-n", "--number", type=int, default=3, help="通知回数 (デフォルト3)")
    auto_parser.add_argument("--min", type=int, default=300, help="最小間隔(秒)")
    auto_parser.add_argument("--max", type=int, default=1800, help="最大間隔(秒)")

    list_parser = subparsers.add_parser("list", help="通知候補メッセージ一覧を表示")

    args = parser.parse_args()
    if args.command == "notify":
        for _ in range(args.number):
            message = get_random_message()
            send_notification(message)
    elif args.command == "auto":
        run_notifier(count=args.number, min_interval=args.min, max_interval=args.max)
    elif args.command == "list":
        for m in [
            "重要:カフェイン補給の時刻です",
            "タスク進捗が停滞中。コーヒーを飲めとの神託",
            "AI的診断:あと5分で集中力が消滅します",
            "システム推奨:生産性維持のため、今すぐコーヒーブレイクを!",
            "注意:脳内カフェイン残量が閾値を下回りました",
            "OSからの警告:休憩しないと生産性が低下します",
            "AI観測:あなたの集中力は臨界点です。コーヒーをどうぞ",
            "推奨:今こそコーヒーでリフレッシュする時です",
            "システム診断:作業効率が下がっています。コーヒーブレイクを検討してください",
            "通知:コーヒーブレイクの時間がやってきました"
        ]:
            print(f"[OS通知] {m}")
    else:
        parser.print_help()

if __name__ == "__main__":
    cli()

references/design_notes.md

# 概要
本Skillは、作業中に“OS公式っぽい”通知でコーヒーブレイクを理不尽に推奨することで、ユーザーの気分転換やユーモア演出を狙っています。通知内容とタイミングは完全ランダムです。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/ja/3/library/subprocess.html
- macOS osascript: https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html
- Linux notify-send: https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html

# 利用例
- `/random-os-coffee-break-notifier notify -n 2` で2回連続通知
- `/random-os-coffee-break-notifier auto --min 600 --max 1200` で10-20分間隔で3回通知

# 注意点
- 通知はジョーク目的であり、健康や生産性を保証しません
- OS通知APIが利用できない環境では標準出力にメッセージを表示します
- 履歴や個人情報の保存はありません

# 設計方針
- OSごとに最適な通知APIを自動選択
- 通知内容は毎回ランダム、タイミングもランダム
- 実害やデータ損失を一切発生させない安全設計

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/random-os-coffee-break-notifier .claude/skills/random-os-coffee-break-notifier

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-coffee-break-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 との連携設計はどうあるべきか?
  • 通知が完全ランダムなタイミング・内容で出るか?
  • データ損失や実害がないことを確認できるか?
  • 通知が“OS公式っぽい”妙な説得力を持っているか?

実際に Claude Code で試した検証ログは Claude Code で謎のコーヒーブレイク通知を試してみた!不意打ちの癒やし効果は? にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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