Claude Codeで作業中のOS通知をファンタジー化するSkill構築ガイド

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

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

Claude Code を使った日々の開発やAI coding workflowの中で、ふとした瞬間に「何か刺激が足りない」「ルーチン作業が続いて気分転換したい」と感じることはありませんか?通知・演出・OS連携系のSkillが充実してきた今、単なる productivity だけでなく、クリエイティビティや遊び心も求められるようになっています。

  • 集中して作業していると、どうしても単調な流れになり、現実逃避したくなる瞬間がある
  • 真面目なOS通知やClaude Codeのcontext説明ばかりで、思わず笑ってしまうような「遊び」が足りない
  • 長時間のrepository understandingやpath managementに疲れて、気分転換のきっかけが欲しくなる
  • セッション再開時やonboardingのたびに、同じ説明ばかりでモチベーションが下がることがある
  • 長いAI coding workflowの途中で、ふとしたインパクトや非日常感が欲しいが、そういうSkillが見つからない

特に通知・演出・OS連携カテゴリでは、「仕事の合間に思わず笑える」「ちょっとした妄想を刺激する」ようなSkillが不足しているという声が多く聞かれます。

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

一言サマリ: このスキルは、作業中に突如“伝説のOS公式クエスト通知”をランダムで発生させ、現実逃避と妄想力を刺激します。

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

  • routineなClaude CodeのAI coding workflowの合間に、非日常的な“伝説のクエスト”通知がランダムで現れ、気分転換できる
  • 毎回異なる奇抜なクエスト内容がcontextやrepository understandingの途中に飛び込んでくるので、笑いと妄想でリフレッシュできる
  • 通知は完全なフェイクで、実害やデータ損失リスクゼロなので安心して楽しめる
  • 長時間のmonorepo作業やdirectory移動、onboardingの途中でも、思わぬタイミングで“OSファンタジー”が発動し、作業に新たな刺激を与える
  • 真面目なSkillに飽きた時の“遊び枠”として、Claude Codeの通知体験を拡張できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-legendary-quest-notification .claude/skills/random-os-fake-legendary-quest-notification

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

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

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


# /random-os-fake-legendary-quest-notification

[OS公式通知] 伝説のクエスト発生!
緊急任務: Cドライブ深奥に眠る「古のバグ」討伐せよ
- 対象ファイル: src/legacy/buggy_module.py
- 報酬: 開発者の伝説的称号
- 制限時間: 42分
ヒント: README.mdの最終行に“封印の呪文”あり

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


> packages/core から packages/utils へ移動

[OS公式通知] 伝説のUSBメモリ捜索クエスト開始!
- 目的: packages/utils/hidden_usb/ に眠る“失われた設定ファイル”を発見せよ
- 必須アイテム: .env.legendary
- 妨害: node_modules/ の奥深くに“偽ファイル”が点在
- 成功報酬: context window +100

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


> ちょっと休憩したい

[OS公式通知] 伝説のバグハンター認定試験!
- 問題: repository全体に隠された“幻のTODO”を全て見つけ出せ
- 制限: diff --stat で10行以内
- 特別報酬: 妄想力 +99

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開+伝説クエスト通知で気分転換
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る+思わぬタイミングでクエスト通知
長時間 workflow long context で重要箇所が薄まる 突然の伝説通知で集中力リセット、contextも再整理しやすい

発動方式

明示呼び出し (/random-os-fake-legendary-quest-notification) と、自然言語での発動条件マッチの両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-legendary-quest-notification/
├── SKILL.md
├── scripts/
│   └── legendary_quest_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-legendary-quest-notification
description: 作業中やキーワード検知時に、ランダムな“伝説のOSクエスト通知”を生成し、ユーザーの集中や気分転換をサポート。通知・演出・OS連携系のキーワードや明示呼び出しで発動。
---

# 機能概要
このSkillは、日常の作業やコーディングの最中に、まるでOS公式から届いたかのような“伝説のクエスト通知”をランダムに生成し、ターミナルやデスクトップに表示します。内容は毎回異なり、「禁断のレジストリ迷宮から脱出せよ」「Cドライブの最奥に眠る古のバグを討伐せよ」など、現実には絶対に存在しないファンタジックな無茶ぶりクエストばかり。真面目な通知に飽きた人や、作業の合間に笑いと妄想力を刺激したい方に最適な“OS通知ファンタジー”体験を提供します。

# 使い方
- 明示呼び出し: `/random-os-fake-legendary-quest-notification` を実行すると即座に通知が発生します。
- 暗黙発動: 「通知」「演出」「OS連携」「現実逃避」「クエスト」などのキーワードを含む会話や作業中に、Skillが自動的に発動します。
- 通知はターミナル出力またはOS通知として表示されます。

# 出力例
```
[OS Quest Notification]
緊急任務: Cドライブ深奥に眠る古のバグ退治
報酬: システム安定度+100
---
[OS Quest Notification]
伝説のUSBメモリ捜索開始
場所: デスク下の未確認領域
---
[OS Quest Notification]
極秘: レジストリ迷宮からの脱出指令
期限: 24時間以内
```

# 注意点
- 本Skillは完全なフェイク通知のみを生成し、実際のファイル操作やシステム変更は一切行いません。
- 通知内容は毎回ランダムで、実害やデータ損失はありません。
- ローカルに通知履歴を保存する場合は、明示的な同意が必要です。
- 実在するOSや業務通知と混同しないようご注意ください。

# 参考資料
- [references/design_notes.md](references/design_notes.md) に設計方針や利用例を記載
- OS通知API: https://docs.python.org/ja/3/library/subprocess.html
- Python標準ライブラリ: random, argparse, platform, subprocess

scripts/legendary_quest_notifier.py

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

QUEST_TEMPLATES = [
    {
        'title': '緊急任務: {location}に眠る{target}退治',
        'location': ['Cドライブ深奥', 'ネットワークの彼方', 'レジストリ迷宮', '未確認フォルダ', 'システムログの闇'],
        'target': ['古のバグ', '伝説のプロセス', '謎のメモリリーク', '消えたショートカット', '幻の設定ファイル'],
        'reward': ['システム安定度+100', 'CPU使用率-10%', '未知の称号「バグスレイヤー」', 'メモリ開放', '管理者権限の祝福']
    },
    {
        'title': '伝説の{item}捜索開始',
        'item': ['USBメモリ', 'フロッピーディスク', 'バックアップHDD', 'Wi-Fiルーター', '未認識デバイス'],
        'location': ['デスク下の未確認領域', '引き出しの奥', 'ケーブルジャングル', 'サーバールーム', '箱の中'],
        'reward': ['発見者バッジ', 'ストレージ容量+1GB', '謎のファイルアクセス権', '伝説の称号「発掘王」', 'OSからの感謝状']
    },
    {
        'title': '極秘: {mission}指令',
        'mission': ['レジストリ迷宮からの脱出', '未読ログの全読破', '隠しプロセスの発見', 'システム設定の最適化', '謎のタスクスケジューラ解除'],
        'deadline': ['24時間以内', '本日中', '次回起動時まで', '今すぐ', '週末まで'],
        'reward': ['セキュリティレベル+10', 'OS称賛メッセージ', '管理者パスワードのヒント', '伝説の壁紙', '未知のアップデート権']
    }
]

HISTORY_FILE = os.path.expanduser('~/.legendary_quest_history.log')


def generate_quest():
    template = random.choice(QUEST_TEMPLATES)
    title = template['title']
    fields = {}
    for k, v in template.items():
        if k == 'title':
            continue
        fields[k] = random.choice(v)
    quest = title.format(**fields)
    # Optional fields
    details = []
    for k, v in fields.items():
        if k not in ['title']:
            details.append(f"{k.capitalize()}: {v}")
    # Add reward if exists
    if 'reward' in template:
        reward = random.choice(template['reward'])
        details.append(f"報酬: {reward}")
    if 'deadline' in fields:
        details.append(f"期限: {fields['deadline']}")
    return quest, details


def notify_terminal(quest, details):
    print("[OS Quest Notification]")
    print(quest)
    for d in details:
        print(d)
    print("---")


def notify_os(quest, details):
    system = platform.system()
    message = quest + "\n" + "\n".join(details)
    try:
        if system == 'Darwin':  # macOS
            subprocess.run([
                'osascript', '-e', f'display notification "{message}" with title "伝説のOSクエスト"'
            ], check=True)
        elif system == 'Linux':
            subprocess.run([
                'notify-send', '伝説のOSクエスト', message
            ], check=True)
        elif system == 'Windows':
            from ctypes import windll
            import threading
            def toast():
                try:
                    import win10toast
                    toaster = win10toast.ToastNotifier()
                    toaster.show_toast("伝説のOSクエスト", message, duration=10)
                except ImportError:
                    print("win10toastが必要です: pip install win10toast")
            t = threading.Thread(target=toast)
            t.start()
        else:
            notify_terminal(quest, details)
    except Exception as e:
        print(f"OS通知に失敗しました: {e}")
        notify_terminal(quest, details)


def save_history(quest, details):
    try:
        with open(HISTORY_FILE, 'a', encoding='utf-8') as f:
            f.write(f"[{datetime.now().isoformat()}] {quest}\n")
            for d in details:
                f.write(f"  {d}\n")
            f.write("---\n")
    except Exception as e:
        print(f"履歴保存に失敗しました: {e}")


def list_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴がありません。")
        return
    with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
        print(f.read())


def summary_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴がありません。")
        return
    quests = []
    with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
        for line in f:
            if line.startswith('['):
                quests.append(line.strip())
    print(f"これまで発生した伝説のクエスト数: {len(quests)}")
    for q in quests[-5:]:
        print(q)


def main():
    parser = argparse.ArgumentParser(description='伝説のOSクエスト通知スクリプト')
    subparsers = parser.add_subparsers(dest='command')

    parser_notify = subparsers.add_parser('notify', help='今すぐ伝説のクエスト通知を出す')
    parser_notify.add_argument('--os', action='store_true', help='OS通知も行う')
    parser_notify.add_argument('--save', action='store_true', help='履歴に保存')

    parser_list = subparsers.add_parser('list', help='過去のクエスト履歴を表示')
    parser_summary = subparsers.add_parser('summary', help='クエスト履歴のサマリー')

    parser_daemon = subparsers.add_parser('daemon', help='一定時間ごとにランダム通知 (Ctrl+Cで停止)')
    parser_daemon.add_argument('--interval', type=int, default=1800, help='通知間隔(秒, デフォルト30分)')
    parser_daemon.add_argument('--os', action='store_true', help='OS通知も行う')
    parser_daemon.add_argument('--save', action='store_true', help='履歴に保存')

    args = parser.parse_args()

    if args.command == 'notify':
        quest, details = generate_quest()
        if args.os:
            notify_os(quest, details)
        else:
            notify_terminal(quest, details)
        if args.save:
            save_history(quest, details)
    elif args.command == 'list':
        list_history()
    elif args.command == 'summary':
        summary_history()
    elif args.command == 'daemon':
        try:
            while True:
                quest, details = generate_quest()
                if args.os:
                    notify_os(quest, details)
                else:
                    notify_terminal(quest, details)
                if args.save:
                    save_history(quest, details)
                wait = args.interval + random.randint(-60, 60)
                time.sleep(max(60, wait))
        except KeyboardInterrupt:
            print("\n伝説のクエスト通知デーモンを終了します。")
    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
- OS通知API: macOS (osascript), Linux (notify-send), Windows (win10toast)

# 利用例
- `/random-os-fake-legendary-quest-notification` で即座にクエスト通知
- デーモンモードで30分ごとに自動通知
- 履歴保存・閲覧・サマリー表示

# 注意点
- 実在の通知や業務連絡と混同しないよう明確に“フェイク”である旨を明示
- 履歴ファイルはユーザーのホームディレクトリに保存され、必要に応じて削除可能

# 設計方針
- OS依存部分はtry/exceptで安全にフォールバック
- クエスト内容はテンプレート+ランダム要素で毎回異なる体験を保証
- 実害ゼロ・データ損失ゼロの安全設計

導入手順

この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-legendary-quest-notification .claude/skills/random-os-fake-legendary-quest-notification

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

3. ファイル配置確認

ls .claude/skills/random-os-fake-legendary-quest-notification
# SKILL.md, scripts/, references/, README.md があればOK

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

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

5. 動作確認

/random-os-fake-legendary-quest-notification で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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 との連携設計はどうあるべきか?
  • 通知タイミングがランダムで自然発生するか?
  • 毎回異なる奇天烈クエスト内容が出力されるか?
  • 実害やデータ損失が発生しない完全なフェイク通知であることを担保できるか?

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

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

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

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

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