Claude Codeで遊び心ある偽通知を自動生成する仕組みの作り方

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

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

Claude Code を使った開発ワークフローでは、効率的な repository understanding や path management が重要ですが、日々の作業の中で思わず「またか…」と感じる瞬間が多々あります。特に monorepo や大規模 repository での directory 移動や context 復元にまつわる煩雑さは、誰しもが一度は経験する「あるある」でしょう。

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

また、集中作業が続くと現実感が薄れたり、同じ directory 構造の説明を繰り返すことで気分転換の余地も失われがちです。通知・演出・OS連携系の Skill が加われば、こうした日常の「単調さ」や「説明コスト」をユーモラスに和らげる余地も出てきます。

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

一言サマリ: このスキルは、作業中にランダムな“OS公式・緊急カンファレンスコール通知”を炸裂させることで、Claude Code の単調な開発フローに遊び心とリフレッシュをもたらします。

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

  • 長時間の AI coding workflow やオンボーディング中に、突発的なフェイク通知で気分転換できる
  • repository understanding や path management の繰り返し説明に飽きた時、ユーモアで現実感をリセットできる
  • monorepo や大規模 directory での作業時、突然の“あり得ない会議”でチーム内の話題づくりや集中力の切り替えに役立つ
  • 通知内容が毎回異なり、同じパターンに飽きることがない
  • 実作業やデータに一切影響を与えず、完全にフェイクな演出として安全に楽しめる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-conference-call-alert .claude/skills/random-os-fake-conference-call-alert

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

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

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


# /random-os-fake-conference-call-alert

[OS公式通知] 緊急カンファレンスコールのお知らせ
-------------------------------------------------
議題: 「今すぐ全員集合:超重要案件について」
詳細: 本日の議題は“README.mdの改行コード統一問題”です。
出欠判定はOSが自動で行います。参加者は全員黙ってください。
会議開始まで:00:00:07

[通知終了] 実際の会議は行われません。

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


> パッケージAからパッケージBのコードを読みに行ったタイミング

[OS緊急会議通知]
---------------------------------------------
議題: 「monorepo内パッケージ間のコーヒー豆粒度再検討」
対象: /packages/core/ と /packages/ui/
備考: 重要度S(出席必須)、出欠はAIが自動判定します。
会議資料: /docs/coffee-grind-spec-v3.pdf
会議は開始されません。安心して作業を続けてください。

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


> /random-os-fake-conference-call-alert

[OS公式緊急会議]
--------------------------------------
議題: 「今日のランチは何を食べるべきか」
参加条件: /src/utils/ディレクトリに1回でも入ったことがある人
出欠判定: OSが勝手に決めます
会議開始時間: 未定(開始しません)

before / after の違い

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

発動方式

明示呼び出し (/random-os-fake-conference-call-alert) と暗黙発動 (「緊急会議」「謎のOS通知」などの記述にマッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-conference-call-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_conference_call_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-conference-call-alert
description: 作業中や長時間の無操作時、または"会議"や"緊急"などのキーワードを含むプロンプトが観測された場合に発動。/random-os-fake-conference-call-alert で明示呼び出しも可能。
---

# 機能概要
このSkillは、作業中のユーザーに対し、架空のOS公式カンファレンスコール通知をランダムなタイミングで表示します。通知内容は完全にネタで、実在しない会議や意味不明な議題が毎回異なり、現実感を一瞬揺さぶります。集中しすぎている時や、長時間の単調作業の合間に“謎の緊急会議”が突然現れ、遊び心とリフレッシュを提供します。会議自体は始まらず、実作業やデータには一切影響を与えません。

# 使い方
- 明示呼び出し: `/random-os-fake-conference-call-alert` をターミナルやチャットで入力
- 暗黙発動: 「会議」「緊急」「公式」「コール」などのキーワードを含むプロンプトや、一定時間の無操作時に自動発動

# 出力例
```
[OS公式 緊急カンファレンスコール通知]
本日の議題: USBポートの向きを哲学的に再考する
出席者: 全ユーザー (出欠はOSが自動判定します)
開始時刻: 今すぐ
備考: 重要案件につき全員集合
---
[OS公式 緊急カンファレンスコール通知]
議題: コーヒー豆の粒度再検討
出席者: コーヒーを愛する全プロセス
開始時刻: ただちに
備考: 参加しない場合は自動で参加扱いとなります
```

# 注意点
- 通知は完全なジョークであり、実際の会議やシステム操作は発生しません。
- 通知の頻度やタイミングは適度に制御され、作業の妨げやデータ損失はありません。
- 通知内容は毎回ランダム生成され、ローカル保存や外部送信は一切行いません。
- システムの通知API(macOS: `osascript`, Windows: `toast`, Linux: `notify-send`)を利用します。

# 参考資料
- references/design_notes.md に設計方針・利用例を記載
- OS通知API: https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/toast-notifications
- Linux notify-send: https://specifications.freedesktop.org/notification-spec/latest/
- macOS osascript: https://ss64.com/osx/osascript.html

scripts/random_os_fake_conference_call_alert.py

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

FAKE_TOPICS = [
    "USBポートの向きを哲学的に再考する",
    "コーヒー豆の粒度再検討",
    "全プロセスの出欠自動判定について",
    "メモリの空き容量を詩的に表現する方法",
    "今後のOSアップデートで追加予定の謎機能について",
    "システム時刻のズレを宇宙時間で補正する議論",
    "デスクトップ背景の毎時自動変更是非",
    "CPU温度と室温の相関に関する緊急討論",
    "全ユーザーのパスワードを一斉にリセットするか否か",
    "OSの自己紹介文を考えるワークショップ"
]

FAKE_ATTENDEES = [
    "全ユーザー (出欠はOSが自動判定します)",
    "コーヒーを愛する全プロセス",
    "管理者権限を持つ者全員",
    "現在稼働中の全サービス",
    "一時停止中の全アプリケーション",
    "システムカーネルとその友人たち",
    "本日ログインした全ユーザー",
    "仮想マシン内の全プロセス",
    "全てのデバイスドライバ",
    "OSアップデート担当者"
]

FAKE_NOTES = [
    "重要案件につき全員集合",
    "参加しない場合は自動で参加扱いとなります",
    "議事録は自動生成されません",
    "途中参加・途中退出はOSの気分次第",
    "会議の録音は禁止されています (理由: 未定)",
    "出席確認はランダムで行われます",
    "議題は途中で追加される場合があります",
    "本会議は実在しません",
    "参加者には特典はありません",
    "会議後のアンケートはありません"
]

LAST_ALERT_FILE = os.path.expanduser("~/.random_os_fake_conference_call_last")
MIN_INTERVAL_MINUTES = 15


def generate_fake_alert():
    topic = random.choice(FAKE_TOPICS)
    attendee = random.choice(FAKE_ATTENDEES)
    note = random.choice(FAKE_NOTES)
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    alert = (
        "[OS公式 緊急カンファレンスコール通知]\n"
        f"本日の議題: {topic}\n"
        f"出席者: {attendee}\n"
        f"開始時刻: 今すぐ\n"
        f"備考: {note}\n"
        f"(通知時刻: {now})"
    )
    return alert


def show_notification(alert_text):
    system = platform.system()
    try:
        if system == "Darwin":
            script = f'display notification "{alert_text}" with title "OS公式 緊急会議"'
            subprocess.run(["osascript", "-e", script], check=True)
        elif system == "Linux":
            subprocess.run(["notify-send", "OS公式 緊急会議", alert_text], check=True)
        elif system == "Windows":
            from win10toast import ToastNotifier
            toaster = ToastNotifier()
            toaster.show_toast("OS公式 緊急会議", alert_text, duration=10)
        else:
            print(alert_text)
    except Exception as e:
        print(f"[通知失敗] {e}\n{alert_text}")


def can_trigger_alert():
    if not os.path.exists(LAST_ALERT_FILE):
        return True
    try:
        with open(LAST_ALERT_FILE, "r") as f:
            last = f.read().strip()
            last_dt = datetime.strptime(last, "%Y-%m-%d %H:%M:%S")
            if datetime.now() - last_dt > timedelta(minutes=MIN_INTERVAL_MINUTES):
                return True
            else:
                return False
    except Exception:
        return True


def update_last_alert_time():
    try:
        with open(LAST_ALERT_FILE, "w") as f:
            f.write(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    except Exception:
        pass


def trigger_alert():
    if not can_trigger_alert():
        print("[INFO] 直近で通知済みのため、今回はスキップします。")
        return
    alert = generate_fake_alert()
    show_notification(alert)
    update_last_alert_time()
    print(alert)


def list_last_alert():
    if not os.path.exists(LAST_ALERT_FILE):
        print("まだ通知履歴がありません。")
        return
    with open(LAST_ALERT_FILE, "r") as f:
        last = f.read().strip()
        print(f"最後の通知時刻: {last}")


def main():
    parser = argparse.ArgumentParser(description="OS公式フェイク会議通知スクリプト")
    subparsers = parser.add_subparsers(dest="command")

    parser_alert = subparsers.add_parser("alert", help="今すぐフェイク会議通知を出す")
    parser_list = subparsers.add_parser("list", help="最後の通知時刻を表示")
    parser_demo = subparsers.add_parser("demo", help="5回デモ通知を連続表示 (間隔3秒)")

    args = parser.parse_args()
    if args.command == "alert" or args.command is None:
        trigger_alert()
    elif args.command == "list":
        list_last_alert()
    elif args.command == "demo":
        for _ in range(5):
            alert = generate_fake_alert()
            show_notification(alert)
            print(alert)
            time.sleep(3)
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、作業中のユーザー体験に遊び心を加えるためのフェイク通知演出ツールです。実際の会議やOS操作は一切伴わず、通知内容も完全なジョークです。

# 公式ドキュメント抜粋
- Windows: [Toast Notifications](https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/toast-notifications)
- Linux: [freedesktop.org Notification Spec](https://specifications.freedesktop.org/notification-spec/latest/)
- macOS: [osascript](https://ss64.com/osx/osascript.html)

# 利用例
- 長時間の集中作業中にリフレッシュを促す
- チーム内での小ネタやアイスブレイク
- ターミナルやチャットで明示的に呼び出して楽しむ

# 注意点
- 実際の会議や通知と誤認しないよう、内容は極端にネタ要素を強調
- 通知頻度は15分以上の間隔を設け、連続発動を抑制
- ログや個人情報の外部送信は一切なし

# 設計方針
- 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-fake-conference-call-alert .claude/skills/random-os-fake-conference-call-alert

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-conference-call-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
  • 通知内容が完全にネタであること: 本物のOS通知と誤認しないよう明示が必要
  • 通知タイミングや頻度: 頻度が高すぎると逆に workflow の邪魔になる

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知内容が完全にネタであることがユーザーに明示されるか?
  • 通知タイミングや頻度が適度で、実作業やデータ損失を一切阻害しないか?

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

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

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

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

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