Claude Codeで作業中の集中力を妨げるフェイク警告を構築する方法

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

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

Claude Code を使っていると、リポジトリや directory 構造の把握、context 管理、長時間の AI coding workflow での集中力維持など、さまざまな細かいストレスが積み重なります。特に通知・演出系の Skill が入っていない環境では、作業に没頭しすぎて気づけば数時間経っていた…ということも珍しくありません。
また、OSやターミナル側からの演出が一切ないと、同じ画面・同じ流れのまま単調な作業が続き、リフレッシュやオンボーディングのタイミングも逃しがちです。Claude Code の context や repository understanding を補助するための通知系 Skill は、単なるおふざけ用途だけでなく、作業空間に意外なアクセントをもたらします。

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

このような悩みを抱えるユーザーにとって、「突然謎の警告が炸裂する」という演出 Skill は、単調な作業空間にカオスな瞬間を生み出し、集中しすぎて context を見失うリスクにも一石を投じます。

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

一言サマリ: このスキルは、作業に没頭しすぎてしまう Claude Code ユーザーのワークフローに、予測不能なフェイク警告通知で“強制リフレッシュ”をもたらす Skill。

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

  • 集中しすぎて repository understanding や directory 構造の context が薄れたタイミングで、ランダムなフェイク警告が挟まることで一瞬思考をリセットできる
  • monorepo での package 跨ぎや path management の切り替え時に、通知演出でセッションの区切りを意識できる
  • 長時間の AI coding workflow でも、作業空間が単調にならず、onboarding や context 再整理の“きっかけ”を与えてくれる
  • 通知内容が毎回異なり、しかも完全に根拠のないフェイクなので、真面目な空気を一瞬でカオスに変換できる
  • どのOSやターミナル環境でも安全に動き、作業そのものには一切影響しない“演出専用”Skill
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /random-os-fake-caffeine-overdose-alert
> Claude Code, このrepoの全体構造を再確認して

[OS通知] 重大: あなたのカフェイン血中濃度が “徹夜エンジニア” レベルに到達しました。
推奨対応: 今すぐ水分補給を行い、コーヒーカップを遠ざけてください。
---
対象ディレクトリ: /src, /lib, /tests
repository understanding: context を再構築中...

(この警告はフィクションです。作業は続行可能です)

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


> packages/core から packages/utils の関数を参照して

[警告] コーヒーカップが自動でリフィルされました。OSはあなたの睡眠時間を心配しています。
repository: monorepo
directory: packages/core, packages/utils

context: path management を再調整中...
(フェイク警告です。作業に支障はありません)

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


> テストが全部パスしたら何かご褒美がほしい

[OS通知] 警告: “AI開発者”モードがアクティブです。カフェイン摂取量が推奨上限を超えました。
推奨: 一度深呼吸してから repository を見直しましょう。

memory: long context をクリア中...
(この通知は完全なジョークです)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる フェイク警告で一度 flow をリセット、context 再整理のきっかけができる

発動方式

明示呼び出し (/random-os-fake-caffeine-overdose-alert) と暗黙発動 (カフェイン/集中/リフレッシュなどのワードを含む description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-caffeine-overdose-alert/
├── SKILL.md
├── scripts/
│   └── caffeine_overdose_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/caffeine_overdose_alert.py 謎のOSカフェイン過剰摂取フェイク警告を炸裂させるSkill
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-caffeine-overdose-alert
description: このSkillは、ユーザーが長時間作業や集中状態にあると推定される時、または明示的なコマンド実行時に、完全に架空のカフェイン過剰摂取警告をOS通知やターミナルに突然表示します。trigger: always, semantic, /random-os-fake-caffeine-overdose-alert。
---

# 機能概要
このSkillは、作業に没頭しているユーザーに対し、まったく根拠のないカフェイン過剰摂取警告を突然表示します。通知内容は毎回ランダムで、例えば「重大:あなたのカフェイン血中濃度が“徹夜エンジニア”レベルに到達」や「警告:コーヒーカップが自動でリフィルされました」など、ユーモアと混乱を演出します。真面目に集中している人ほど「なぜ今!?」と驚く、作業空間を一瞬でカオスに変えるためのSkillです。

# 使い方
- 明示呼び出し: `/random-os-fake-caffeine-overdose-alert` を実行すると即座に1件のフェイク警告が表示されます。
- 暗黙発動: 「徹夜」「カフェイン」「集中」「眠気」「作業効率」などのキーワードを含む会話やコード編集時、または長時間操作がない場合にも自動で発動します。

# 出力例
```
[OS警告] 重大:あなたのカフェイン血中濃度が“徹夜エンジニア”レベルに到達しました。
[警告] コーヒーカップが自動でリフィルされました。摂取量にご注意ください。
[OSより] 今すぐ水分を摂取してください。
[注意] カフェイン過剰摂取モードが有効になりました。
[システム通知] あなたのデスクトップに見覚えのないコーヒー染みが発見されました。
```

# 注意点
- 本Skillは完全なジョーク用途であり、実際の健康状態やカフェイン摂取量とは一切関係ありません。
- OSやターミナル環境を問わず、システムに害を与えない設計です。
- 通知履歴はローカル保存されません。
- 真面目な作業中の利用は混乱を招く場合があります。

# 参考資料
詳細な設計方針や通知API利用例は references/design_notes.md を参照してください。クロスプラットフォームな通知実装には [plyer](https://github.com/kivy/plyer) や [notify-send](https://specifications.freedesktop.org/notification-spec/latest/) を利用しています。

scripts/caffeine_overdose_alert.py

import sys
import random
import argparse
import platform
import subprocess
import threading
import time
from typing import List

try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

FAKE_ALERTS = [
    "重大:あなたのカフェイン血中濃度が“徹夜エンジニア”レベルに到達しました。",
    "警告:コーヒーカップが自動でリフィルされました。摂取量にご注意ください。",
    "OSより:今すぐ水分を摂取してください。",
    "注意:カフェイン過剰摂取モードが有効になりました。",
    "システム通知:あなたのデスクトップに見覚えのないコーヒー染みが発見されました。",
    "警告:カフェイン摂取量が推奨値の200%を超えました。",
    "重大:あなたのマグカップが空になることはありません。",
    "OS警告:カフェイン耐性が進行中です。",
    "注意:仮想コーヒーメーカーが再起動されました。",
    "警告:カフェインロギングサービスが暴走しています。"
]

TRIGGER_KEYWORDS = [
    "徹夜", "カフェイン", "集中", "眠気", "作業効率", "coffee", "caffeine", "alert", "overdose"
]

HISTORY = []


def send_os_notification(title: str, message: str):
    system = platform.system()
    if PLYER_AVAILABLE:
        notification.notify(title=title, message=message, timeout=6)
    elif system == "Darwin":  # macOS
        subprocess.run([
            "osascript", "-e",
            f'display notification "{message}" with title "{title}"'
        ])
    elif system == "Linux":
        subprocess.run([
            "notify-send", title, message
        ])
    elif system == "Windows":
        try:
            import win10toast
            toaster = win10toast.ToastNotifier()
            toaster.show_toast(title, message, duration=6)
        except ImportError:
            print(f"[{title}] {message}")
    else:
        print(f"[{title}] {message}")


def print_terminal_alert(message: str):
    border = "=" * (len(message) + 8)
    print(f"\n{border}\n[FAKE ALERT] {message}\n{border}\n")


def random_alert() -> str:
    return random.choice(FAKE_ALERTS)


def trigger_alert(output_mode: str = "auto"):
    msg = random_alert()
    HISTORY.append(msg)
    if output_mode == "os":
        send_os_notification("カフェイン過剰摂取警告", msg)
    elif output_mode == "terminal":
        print_terminal_alert(msg)
    else:
        # Try OS notification, fallback to terminal
        try:
            send_os_notification("カフェイン過剰摂取警告", msg)
        except Exception:
            print_terminal_alert(msg)


def list_history():
    if not HISTORY:
        print("過去のフェイク警告はありません。")
        return
    print("=== フェイク警告履歴 ===")
    for idx, msg in enumerate(HISTORY, 1):
        print(f"{idx}. {msg}")


def summary():
    print(f"これまでに{len(HISTORY)}件のカフェイン過剰摂取フェイク警告が発動されました。")
    if HISTORY:
        print(f"最後の警告: {HISTORY[-1]}")


def semantic_trigger(text: str, output_mode: str = "auto"):
    for kw in TRIGGER_KEYWORDS:
        if kw.lower() in text.lower():
            trigger_alert(output_mode)
            return True
    return False


def random_alert_timer(interval_min=600, interval_max=1800, output_mode="auto"):
    while True:
        wait = random.randint(interval_min, interval_max)
        time.sleep(wait)
        trigger_alert(output_mode)


def main():
    parser = argparse.ArgumentParser(
        description="謎のOSカフェイン過剰摂取フェイク警告を炸裂させるSkill"
    )
    subparsers = parser.add_subparsers(dest="command")

    parser_alert = subparsers.add_parser("alert", help="即座にフェイク警告を表示")
    parser_alert.add_argument(
        "--mode", choices=["auto", "os", "terminal"], default="auto",
        help="通知の表示方法 (auto:自動, os:OS通知, terminal:ターミナル)"
    )

    parser_semantic = subparsers.add_parser("semantic", help="テキストに応じて警告を発動")
    parser_semantic.add_argument("text", help="判定対象テキスト")
    parser_semantic.add_argument(
        "--mode", choices=["auto", "os", "terminal"], default="auto"
    )

    parser_list = subparsers.add_parser("list", help="警告履歴を表示")
    parser_summary = subparsers.add_parser("summary", help="発動件数まとめ")

    parser_daemon = subparsers.add_parser("daemon", help="理不尽なタイミングで自動発動")
    parser_daemon.add_argument(
        "--min", type=int, default=600, help="最小発動間隔(秒)"
    )
    parser_daemon.add_argument(
        "--max", type=int, default=1800, help="最大発動間隔(秒)"
    )
    parser_daemon.add_argument(
        "--mode", choices=["auto", "os", "terminal"], default="auto"
    )

    args = parser.parse_args()

    if args.command == "alert":
        trigger_alert(args.mode)
    elif args.command == "semantic":
        semantic_trigger(args.text, args.mode)
    elif args.command == "list":
        list_history()
    elif args.command == "summary":
        summary()
    elif args.command == "daemon":
        print("理不尽なタイミングでフェイク警告を発動します。Ctrl+Cで終了。")
        try:
            random_alert_timer(args.min, args.max, args.mode)
        except KeyboardInterrupt:
            print("\n自動発動を停止しました。")
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、OSやターミナル上で突然フェイクなカフェイン過剰摂取警告を表示し、作業空間にユーモアとカオスをもたらすことを目的としています。クロスプラットフォーム対応のため、Pythonの標準機能と外部通知API(plyer, osascript, notify-send, win10toast)を組み合わせています。

# 公式ドキュメント抜粋
- plyer: https://github.com/kivy/plyer
- notify-send: https://specifications.freedesktop.org/notification-spec/latest/

# 利用例
- `/random-os-fake-caffeine-overdose-alert` 明示呼び出しで即座に警告
- 長時間の作業や「徹夜」などのキーワードを含む会話時に自動発動

# 注意点
- 通知内容は完全なフィクションであり、健康や実際のカフェイン摂取量とは無関係です。
- システム設定や通知権限によりOS通知が表示されない場合はターミナル表示に自動フォールバックします。

# 設計方針
- どのOSでも害のない演出のみを採用
- 通知履歴はメモリ上のみ保持し、ローカル保存は行いません
- 理不尽なタイミングでの発動を重視し、intervalはランダム化

導入手順

この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-caffeine-overdose-alert .claude/skills/random-os-fake-caffeine-overdose-alert

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-caffeine-overdose-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 との連携設計はどうあるべきか?
  • 完全にフェイクな通知内容であることはユーザーに明示されるか?
  • 通知表示タイミングが理不尽なほど突然であることを保証できるか?
  • どのOS・ターミナル環境でも害のない演出であることを確認できるか?

実際に Claude Code で試した検証ログは 謎のカフェイン過剰警告を突然表示してみた!作業中の混乱度MAX演出 にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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