Claude Codeで不安を演出するOS連携通知の作り方入門

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

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

Claude Code を使っていると、日々の開発やリポジトリ管理で思わず「またか」と感じる瞬間が多々あります。特に通知や演出系の機能が弱いと、作業の単調さや緊張感のなさに物足りなさを感じることも。気分転換やリフレッシュのための“遊び心”が欲しくなることも少なくありません。

  • 長時間作業で集中力が切れてきても、Claude Code からは何の変化もなく淡々と進行してしまう
  • monorepo の大規模 repository で package を行き来しても、どこか味気なく緊張感がない
  • session を再開しても、前回との違和感や“何か起きてそう”な演出が皆無で、状況把握が単調
  • AI coding workflow の中で、たまには“事件”や“警告”が欲しいが、実害あるエラー通知は困る
  • onboarding の際も、ちょっとしたジョークや演出があれば雰囲気が和らぐのに…と思う

「本物のバグ通知は困るけど、たまには“謎の警告”で気分を変えたい」――そんな声に応える Skill です。

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

一言サマリ: このスキルは、作業中に“謎のバグ孵化警告”をランダムに発生させることで、日常のAIコーディング体験に絶妙な緊張感と遊び心を加えます。

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

  • 作業の合間やコマンド実行時、Claude Code から「本日新たなバグが孵化しました」などの演出通知がランダムで届き、単調なAI coding workflowに刺激が加わる
  • 通知内容は明らかにジョークと分かる表現なので、本番環境のエラーやバグ通知と混同せず安心して楽しめる
  • 長時間の session でも、思いがけないタイミングで“事件”が起きたような気分転換ができる
  • repo や directory 構造をまたいだ作業でも、Skill の演出が場を和ませてくれる
  • onboarding やペアプロ時のアイスブレイクにも活用できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-bug-hatching-alert .claude/skills/random-os-fake-bug-hatching-alert

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

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

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


# /random-os-fake-bug-hatching-alert
> Claude Code, please start session and load current repository context.

[警告] 2024-06-11 10:13:47
OS公式バグ孵化アラート: 本日10:13、/src/utils/memory_manager.py 内部で新たなバグが孵化しました。
影響範囲: repository understanding, memory, path management

(ご安心ください: この警告は演出です。本物の不具合ではありません)

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


> cd packages/api && ls

[緊急通知] 2024-06-11 14:02:10
OS監視システム: packages/api/ ディレクトリにて未確認バグが産声をあげました。
context: monorepo, directory, onboarding

(本通知は冗談です。作業への影響はありません)

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


> # ちょっと気分転換したい

[警告] 2024-06-11 18:29:55
OSからの警告: メモリ奥地でバグが増殖中。long context への影響は未知数です。
推奨対応: 気にせず開発を続けてください。

(この警告はジョークです)

before / after の違い

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

発動方式

明示呼び出し (/random-os-fake-bug-hatching-alert) と暗黙発動 (通知・警告・バグ孵化などのdescriptionマッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-bug-hatching-alert/
├── SKILL.md
├── scripts/
│   └── bug_hatching_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/bug_hatching_alert.py 謎のOS公式バグ孵化警告をランダムに表示するSkill
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-bug-hatching-alert
description: このSkillは、コマンド実行や作業中に“バグ孵化警告”を完全ランダムなタイミングで表示します。triggerType: always/semantic-or-explicit。明示呼び出しは /random-os-fake-bug-hatching-alert。
---

# 機能概要
このSkillは、作業中やコマンド実行の合間に、まるで謎のOS公式からのような『バグ孵化警告』をランダムなタイミングで炸裂させます。通知内容は毎回ランダムに生成され、「警告: 本日12:14に新たなバグが孵化しました」「緊急: メモリ奥地で未確認バグが産声をあげました」など、絶妙に不安を煽る一言ばかりです。実害は一切なく、ただ“バグが増殖している気分”だけが残ります。開発現場やペアプロ、勉強会の雰囲気を和ませたり、集中しすぎた作業の合間にちょっとした緊張感を演出する目的で活用できます。

# 使い方
- 明示呼び出し: `/random-os-fake-bug-hatching-alert` を実行すると即座に警告が表示されます。
- 暗黙発動: 「バグ」「エラー」「警告」「デバッグ」等のキーワードを含むコマンドや会話の最中、または作業の合間に自動的に通知が挿入されます。

# 出力例
```
[OS警告] 本日13:45に新たなバグが孵化しました。
[OS警告] 緊急: メモリ奥地で未確認バグが産声をあげました。
[OS警告] システム深部でバグの幼体が発見されました。
[OS警告] バグの成長速度が通常を超えています。ご注意ください。
[OS警告] 未知のバグがネットワーク経由で拡散中です。
```

# 注意点
- 実際のエラーやバグ通知とは明確に区別されるよう、通知文は冗談と分かる表現になっています。
- 通知はあくまで演出目的であり、システムやファイルには一切影響しません。
- ログや履歴はローカルには保存されません。
- 除外パスや特定のコマンドには発動しないよう設計されています。

# 参考資料
- references/design_notes.md を参照
- OS通知API: https://docs.python.org/ja/3/library/subprocess.html
- Python標準random, time, argparse利用

scripts/bug_hatching_alert.py

import random
import time
import argparse
import sys
import threading
import platform
import subprocess

BUG_ALERT_MESSAGES = [
    "本日{time}に新たなバグが孵化しました。",
    "緊急: メモリ奥地で未確認バグが産声をあげました。",
    "システム深部でバグの幼体が発見されました。",
    "バグの成長速度が通常を超えています。ご注意ください。",
    "未知のバグがネットワーク経由で拡散中です。",
    "警告: バグの卵が複数検出されました。",
    "バックグラウンドでバグが静かに増殖しています。",
    "バグのさなぎがプロセス空間で発見されました。",
    "OSコア付近でバグが孵化した形跡があります。",
    "バグの活動履歴が急増しています。"
]

PREFIX = "[OS警告] "

# OSごとの通知関数
def notify_os(message):
    system = platform.system()
    if system == "Darwin":
        subprocess.run(["osascript", "-e", f'display notification "{message}" with title "バグ孵化警告"'], check=False)
    elif system == "Linux":
        subprocess.run(["notify-send", "バグ孵化警告", message], check=False)
    elif system == "Windows":
        try:
            import win10toast
            toaster = win10toast.ToastNotifier()
            toaster.show_toast("バグ孵化警告", message, duration=5)
        except ImportError:
            print(PREFIX + message)
    else:
        print(PREFIX + message)

# ターミナル標準出力
def notify_terminal(message):
    print(PREFIX + message)

# 警告文をランダム生成
def generate_alert():
    now = time.strftime("%H:%M")
    msg_template = random.choice(BUG_ALERT_MESSAGES)
    msg = msg_template.format(time=now)
    return msg

# 明示呼び出し用
def explicit_alert(args):
    msg = generate_alert()
    if args.os:
        notify_os(msg)
    else:
        notify_terminal(msg)

# ランダムタイミングで警告表示
def random_alert_loop(args):
    try:
        while True:
            interval = random.randint(args.min_interval, args.max_interval)
            time.sleep(interval)
            msg = generate_alert()
            if args.os:
                notify_os(msg)
            else:
                notify_terminal(msg)
    except KeyboardInterrupt:
        print("\n[終了] バグ孵化警告ループを停止しました。")

# CLIサブコマンド: log, list, summary (ダミー実装)
def log_alert(args):
    msg = generate_alert()
    print(f"[LOG] {msg}")
def list_alerts(args):
    for i in range(5):
        print(f"{i+1}. {generate_alert()}")
def summary_alerts(args):
    print("過去24時間のバグ孵化警告: 0件 (実害なし)")

# トリガーワード検出 (簡易)
def contains_trigger(text):
    triggers = ["バグ", "エラー", "警告", "デバッグ"]
    return any(t in text for t in triggers)

def semantic_trigger(args):
    print("[監視モード] 入力行にトリガーワードが現れると警告を表示します。Ctrl+Cで終了。")
    try:
        while True:
            line = sys.stdin.readline()
            if not line:
                break
            if contains_trigger(line):
                msg = generate_alert()
                if args.os:
                    notify_os(msg)
                else:
                    notify_terminal(msg)
    except KeyboardInterrupt:
        print("\n[終了] 監視モードを停止しました。")

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("--os", action="store_true", help="OS通知として表示する")
    parser_alert.set_defaults(func=explicit_alert)
    # ループ
    parser_loop = subparsers.add_parser("loop", help="ランダム間隔で警告を表示し続ける")
    parser_loop.add_argument("--os", action="store_true", help="OS通知として表示する")
    parser_loop.add_argument("--min-interval", type=int, default=60, help="最小間隔(秒)")
    parser_loop.add_argument("--max-interval", type=int, default=600, help="最大間隔(秒)")
    parser_loop.set_defaults(func=random_alert_loop)
    # ログ
    parser_log = subparsers.add_parser("log", help="警告をログ出力(ダミー)")
    parser_log.set_defaults(func=log_alert)
    # リスト
    parser_list = subparsers.add_parser("list", help="警告文のサンプルをリスト表示")
    parser_list.set_defaults(func=list_alerts)
    # サマリー
    parser_summary = subparsers.add_parser("summary", help="警告履歴のサマリー(ダミー)")
    parser_summary.set_defaults(func=summary_alerts)
    # セマンティックトリガー
    parser_sem = subparsers.add_parser("semantic", help="標準入力のトリガーワード検出で警告")
    parser_sem.add_argument("--os", action="store_true", help="OS通知として表示する")
    parser_sem.set_defaults(func=semantic_trigger)
    args = parser.parse_args()
    if hasattr(args, 'func'):
        args.func(args)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発現場や学習環境に“OS公式っぽいバグ孵化警告”を演出目的で挿入するものです。実害ゼロ・演出専用で、ユーザーの緊張感や話題作り、集中のリセットなどに活用されます。

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

# 利用例
- ペアプロや勉強会で“謎のバグ警告”を話題にする
- 集中しすぎた作業の合間に緊張をほぐす
- デバッグ作業中の“気分転換”やジョークとして

# 注意点
- 実際のエラーやバグ通知と混同しないよう、通知文は明らかに冗談と分かる内容に限定
- OS通知APIが利用できない場合はターミナル出力のみ対応
- ログや履歴は保存しません

# 設計方針
- OSごとの通知APIを標準でサポート
- ランダムタイミング・セマンティックトリガー・明示呼び出しの3系統で発動
- 実在のAPIのみ利用し、架空の関数やCLIは使わない

導入手順

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

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-bug-hatching-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 を取りたい
  • 気分転換や雑談のきっかけに: AI coding workflow の中に遊び心を加えたいとき

気になるポイント (壊れそうな箇所)

実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:

  • 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をコピーしました!
目次