Claude Codeで開発現場に笑いを届ける通知演出Skillの作り方

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

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

Claude Code を日常的に使っていると、開発現場での集中力や workflow の流れにちょっとした「間」がほしくなる瞬間があります。特に、長時間のコーディングや複雑な repository 構造を扱うと、思わず肩に力が入りがちです。そんなとき、ふとした通知や遊び心のある演出が、気分転換やチームの空気を和らげてくれることも。

実際には、以下のような「あるある」な悩みが挙げられます:

  • 長時間 session で集中しすぎて、気付いたら context の切り替えや path 管理を忘れている
  • monorepo で複数の directory を跨いで作業していると、Claude Code の repository understanding が追いつかず、思わぬ混乱が起こる
  • onboarding 時や新しい repo で、最初の説明や context 構築に手間取り、workflow のリズムが崩れる
  • session を再開した際、前回の memory や重要な directory 構造を再インプットするのが面倒
  • たまには「意味不明」な通知で場の空気を変えたいが、実用的な通知しか出せない

特に通知・演出・OS連携に関する Skill の需要は高く、「ちょっとした遊び心」や「意外性」が、開発現場に新しい風を吹き込むことがあります。

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

一言サマリ: このスキルは、開発 workflow の合間に突如として謎の陰謀論アラートをデスクトップ通知し、場に笑いと混乱をもたらす Skill。

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

  • 長時間の AI coding workflow に「意味不明」な気分転換を挟み、集中しすぎによる思考の硬直を防げる
  • monorepo や複雑な directory 作業時に、突発的なアラートで repository understanding のリセットや話題転換ができる
  • onboarding や session 再開時に、堅苦しい説明ではなく、ユーモアある通知でチームの空気を和らげられる
  • Claude Code の context 管理や path management の流れに、意図的に「ノイズ」を挟めることで workflow の緩急がつく
  • AI coding workflow 上で「今日は何が起きるかわからない」不確実性を演出できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-desktop-conspiracy-alert .claude/skills/random-desktop-conspiracy-alert

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

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

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


# /random-desktop-conspiracy-alert
> 今日からこのリポジトリで作業開始します

[通知] Wi-Fiの波動が本リポジトリの src/utils/ 配下に干渉しています。
[通知] 15時以降、全てのバグが覚醒します。至急、README.mdを暗号化してください。
[通知] コードレビューは宇宙人の監視下にあります。ご注意ください。

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


> packages/api/ と packages/web/ を同時に見てほしい

[通知] packages/web/ の依存関係が政府の陰謀に巻き込まれています。
[通知] packages/api/ の main.py は近日中に自我を持ちます。監視を強化してください。
[通知] この monorepo は選ばれし者しか全貌を理解できません。

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


> ちょっと集中しすぎて疲れたので何かお願いします

[通知] 本日、あなたのターミナルに未知の電波が観測されました。
[通知] .gitignore の記述が世界の秩序を乱しています。
[通知] そろそろコーヒーを飲まないと AI が暴走します。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開。
さらに突如「Wi-Fiの波動が干渉しています」などのアラートで場が和む
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る。
同時に「この monorepo は選ばれし者しか全貌を理解できません」などの通知で話題転換
長時間 workflow long context で重要箇所が薄まる 突発的な陰謀論アラートで集中力をリセット。
思考の切り替えポイントを意図的に作れる

発動方式

明示呼び出し (/random-desktop-conspiracy-alert) と、説明文マッチによる暗黙発動の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-desktop-conspiracy-alert/
├── SKILL.md
├── scripts/
│   └── random_desktop_conspiracy_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_desktop_conspiracy_alert.py random-desktop-conspiracy-alert: 謎の陰謀論アラートをデスクトップ通知で爆誕させる
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-desktop-conspiracy-alert
description: このSkillは、作業中や特定のキーワード(例: "集中力", "バグ", "監視")が会話やコードに現れた際、または明示的に /random-desktop-conspiracy-alert を実行した際に、意味不明な陰謀論アラートをデスクトップ通知で表示します。
---

# 機能概要
random-desktop-conspiracy-alertは、あなたの開発現場に突如として謎の陰謀論アラートをデスクトップ通知で表示するSkillです。Wi-Fiの波動や宇宙人の監視、バグの覚醒など、根拠のない怪しさ満点の通知を完全ランダムで生成し、作業中の気分転換やチームの笑いを誘発します。集中力が途切れがちな長時間作業や、雑談のネタが欲しいときに最適です。

# 使い方
- 明示呼び出し: `/random-desktop-conspiracy-alert` を実行すると即座にアラートが表示されます。
- 暗黙発動: 「集中力」「バグ」「監視」「Wi-Fi」「宇宙人」などのキーワードが会話やコード内に現れると自動で発動します。

# 出力例
```
[通知] Wi-Fiの波動があなたの思考を妨害しています。
[通知] コードレビューは宇宙人の監視下にあります。
[通知] 本日15時、全てのバグが覚醒します。
[通知] あなたのキーボードは秘密組織により記録されています。
[通知] 開発環境が量子もつれ状態に突入しました。
```

# 注意点
- 通知はローカルマシンのデスクトップ通知機能を利用します。
- 頻度は1時間に最大3回まで自動発動(明示呼び出しは制限なし)。
- 通知内容は完全にフィクションであり、実際のセキュリティや業務には影響しません。
- Linux/macOS/Windowsで動作確認済み。

# 参考資料
- [plyer公式ドキュメント](https://plyer.readthedocs.io/en/latest/)
- references/design_notes.md 参照(設計方針や利用例の詳細)

scripts/random_desktop_conspiracy_alert.py

import random
import time
import argparse
import sys
import threading
from datetime import datetime, timedelta

try:
    from plyer import notification
except ImportError:
    print('plyerパッケージが必要です。pip install plyer でインストールしてください。')
    sys.exit(1)

CONSPIRACY_MESSAGES = [
    'Wi-Fiの波動があなたの思考を妨害しています。',
    'コードレビューは宇宙人の監視下にあります。',
    '本日15時、全てのバグが覚醒します。',
    'あなたのキーボードは秘密組織により記録されています。',
    '開発環境が量子もつれ状態に突入しました。',
    '全てのTODOコメントはAIによって解析されています。',
    'あなたのマウス操作は遠隔操作されています。',
    '本日のコミットは秘密結社の承認待ちです。',
    'デバッグログは政府機関に転送されています。',
    'このエラーは次元の歪みによるものです。',
    'あなたの画面は裏で誰かが見ています。',
    '全てのバグは陰謀の一部です。',
    'リファクタリングは時空警察の監督下にあります。',
    'APIキーは宇宙の中心で管理されています。',
    '全てのパスワードは夢の中で漏洩しています。',
    'あなたの開発環境はパラレルワールドと同期しています。',
    '本日のタスクは量子乱数で決定されました。',
    'あなたのIDEはAIによって操られています。',
    '全ての仕様変更は超常現象の影響です。',
    'あなたのバグは自己増殖を始めました。'
]

TRIGGER_KEYWORDS = [
    '集中力', 'バグ', '監視', 'Wi-Fi', '宇宙人', '秘密', '陰謀', 'エラー', 'デバッグ', 'レビュー'
]

HISTORY_FILE = '.claude/skills/random-desktop-conspiracy-alert/alert_history.log'
MAX_AUTO_ALERTS_PER_HOUR = 3


def send_notification(message):
    notification.notify(
        title='謎の陰謀論アラート',
        message=message,
        app_name='random-desktop-conspiracy-alert',
        timeout=8
    )
    log_alert(message)


def log_alert(message):
    try:
        with open(HISTORY_FILE, 'a', encoding='utf-8') as f:
            f.write(f'{datetime.now().isoformat()}\t{message}\n')
    except Exception as e:
        pass  # ログ失敗は無視


def list_alerts(limit=20):
    try:
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        for line in lines[-limit:]:
            print(line.strip())
    except FileNotFoundError:
        print('まだアラート履歴がありません。')


def summary_alerts():
    try:
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        print(f'アラート総数: {len(lines)}')
        last = lines[-1].strip() if lines else 'なし'
        print(f'最新アラート: {last}')
    except FileNotFoundError:
        print('まだアラート履歴がありません。')


def count_alerts_in_last_hour():
    try:
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        now = datetime.now()
        count = 0
        for line in reversed(lines):
            ts = line.split('\t')[0]
            t = datetime.fromisoformat(ts)
            if now - t < timedelta(hours=1):
                count += 1
            else:
                break
        return count
    except Exception:
        return 0


def auto_alert_loop():
    while True:
        # 1時間に最大MAX_AUTO_ALERTS_PER_HOUR回まで
        if count_alerts_in_last_hour() < MAX_AUTO_ALERTS_PER_HOUR:
            msg = random.choice(CONSPIRACY_MESSAGES)
            send_notification(msg)
        time.sleep(random.randint(1200, 1800))  # 20-30分間隔


def keyword_trigger(text):
    for kw in TRIGGER_KEYWORDS:
        if kw in text:
            if count_alerts_in_last_hour() < MAX_AUTO_ALERTS_PER_HOUR:
                msg = random.choice(CONSPIRACY_MESSAGES)
                send_notification(msg)
                print(f'キーワード「{kw}」でアラート発動: {msg}')
            else:
                print('今時間帯の自動アラート上限に達しています。')
            return
    print('キーワード未検出。アラートは発動しません。')


def main():
    parser = argparse.ArgumentParser(description='random-desktop-conspiracy-alert: 謎の陰謀論アラートをデスクトップ通知で爆誕させる')
    subparsers = parser.add_subparsers(dest='command')

    parser_alert = subparsers.add_parser('alert', help='即座に陰謀論アラートを表示')
    parser_alert.add_argument('--message', '-m', type=str, help='任意のメッセージを指定')

    parser_list = subparsers.add_parser('list', help='アラート履歴を表示')
    parser_list.add_argument('--limit', '-n', type=int, default=10, help='表示件数')

    parser_summary = subparsers.add_parser('summary', help='アラート履歴のサマリを表示')

    parser_keyword = subparsers.add_parser('trigger', help='テキストからキーワード検出でアラート発動')
    parser_keyword.add_argument('text', type=str, help='判定するテキスト')

    parser_auto = subparsers.add_parser('auto', help='自動でランダムアラートを定期発動(1時間最大3回)')

    args = parser.parse_args()

    if args.command == 'alert':
        msg = args.message if args.message else random.choice(CONSPIRACY_MESSAGES)
        send_notification(msg)
        print(f'アラート発動: {msg}')
    elif args.command == 'list':
        list_alerts(args.limit)
    elif args.command == 'summary':
        summary_alerts()
    elif args.command == 'trigger':
        keyword_trigger(args.text)
    elif args.command == 'auto':
        print('自動アラートモード開始 (Ctrl+Cで停止)')
        try:
            auto_alert_loop()
        except KeyboardInterrupt:
            print('\n自動アラートモード終了')
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-desktop-conspiracy-alertは、開発現場にユーモアと気分転換をもたらすために設計されました。完全にフィクションの陰謀論通知を用い、作業中のリフレッシュやチーム内コミュニケーションの活性化を狙います。

# 公式ドキュメント抜粋
通知機能は[plyer](https://plyer.readthedocs.io/en/latest/)のcross-platform notification APIを利用。Pythonのみで完結し、追加の外部サービス連携はありません。

# 利用例
- 長時間作業の合間に自動で通知し、集中力を一時的にリセット
- チームの雑談やペアプロ中に明示的に発動して場を和ませる
- Slack等のbot連携用にも応用可能

# 注意点
- 通知頻度が高すぎると逆効果になるため、1時間あたりの自動発動回数を制限
- 通知内容はすべてジョークであり、実際の業務やセキュリティには一切影響しません

# 設計方針
- OSを問わず動作すること
- 実際に意味不明で笑えるメッセージを厳選
- ログ保存で履歴管理や振り返りも可能に

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/random-desktop-conspiracy-alert .claude/skills/random-desktop-conspiracy-alert

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-desktop-conspiracy-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
  • 通知頻度の調整: アラートが多すぎると逆に workflow の妨げになる可能性
  • 通知内容の品質: メッセージが意味不明すぎてネタとして成立しない場合もある

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知が意図したタイミングで表示されるか?
  • アラートのメッセージ内容が十分に意味不明かつネタとして成立しているか?
  • アラートの頻度が過剰になって workflow を妨げないか?

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

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

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

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

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