Claude Codeで懐かしのレガシー通知を演出するSkill構築ガイド

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

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

Claude Code を日常的に使っていると、repo の複雑さや context の扱いにまつわる“あるある”にたびたび直面します。特に monorepo や複数 directory のプロジェクトでは、AI coding workflow の流れが思わぬ方向に逸れることも。さらに、通知や演出系 Skill の活用シーンでは、ちょっとした遊び心や気分転換が欲しくなる瞬間もあります。

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

加えて、開発作業が単調になりがちなとき、何か突拍子もない“イベント”で気分転換したいと感じることも。そんな時に「無意味だけど笑える通知」があれば、ちょっとしたネタや会話のきっかけにもなります。

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

一言サマリ: このスキルは、Claude Code の開発体験に「謎のレガシーOSサポート終了通知」という遊び心を加える Skill。

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

  • コマンドや操作のたびに、完全ランダムな“レガシーOSサポート終了”通知がデスクトップに現れ、開発 workflow にちょっとした笑いとリズムを生む
  • 通知内容が毎回異なり、現代ではあり得ない context を提示することで、作業のマンネリ感をリセットできる
  • 実際の repo や memory、AI coding workflow には一切影響を与えない安全設計
  • onboarding 時や長時間 session の“気分転換”にも最適
  • Skill の導入・解除も path management だけで完結し、手軽に試せる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-legacy-support-alert .claude/skills/random-os-fake-legacy-support-alert

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

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

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


# /random-os-fake-legacy-support-alert
> 新しいプロジェクトで作業を始めます

[通知] Windows 98 互換モードのサポートは本日をもって終了しました。
[通知] フロッピーディスク対応APIの旅立ちを祝福します。
[通知] 2000年問題パッチは永遠に封印されました。
(作業を続けてください)

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


> cd packages/legacy-utils/
> ls

[通知] IE6向け最適化はついに歴史の彼方へ。
[通知] MS-DOSバッチファイル互換モードのサポートが終了しました。
[通知] SCSI接続プリンタのサポートが消滅しました。

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


> echo "今日も頑張るぞ" | /random-os-fake-legacy-support-alert

[通知] Netscape Navigator 4.7のアップデート配信が停止されました。
[通知] ZIPドライブ対応サービスが静かに幕を下ろしました。
[通知] 640KBメモリ制限の呪いが解かれました。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 通知が流れることで workflow の区切りや気分転換になり、集中力維持やリフレッシュがしやすい

発動方式

明示呼び出し (/random-os-fake-legacy-support-alert) と暗黙発動 (「レガシー通知を表示して」など description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-legacy-support-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_legacy_support_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-legacy-support-alert
description: このSkillは、Claude Codeでコマンド実行やエディタ操作時など、セマンティックまたは明示的に発動条件(例: terminal, run, build, save, /random-os-fake-legacy-support-alert)に該当した際に、レガシーOSサポート終了のユーモラスな通知をランダムに表示します。
---

# 機能概要
random-os-fake-legacy-support-alertは、コマンド実行やファイル保存などの操作時に、現代では考えられないレガシーOSやAPIの“サポート終了通知”を完全ランダムでデスクトップに表示します。例えば「Windows 98互換モードのサポートが本日終了」「IE6向け最適化は永遠に封印されました」など、開発者の心に一瞬の懐かしさと無意味な焦燥をもたらします。実際の環境やデータには一切影響を与えず、遊び心ある通知演出を提供します。

# 使い方
- 明示呼び出し例: `/random-os-fake-legacy-support-alert` を実行
- 暗黙発動: ターミナルで`run`, `build`, `save`, `compile`, `test`等の操作時に自動発火
- 通知はOSの標準通知API(Windows: Toast, macOS: AppleScript, Linux: notify-send)を利用し、内容は毎回ランダム生成されます。

# 出力例
```
[通知] 98互換モードのサポートが本日終了しました。
[通知] IE6向け最適化は永遠に封印されました。
[通知] フロッピー対応APIが旅立ちました。
[通知] Windows MEのリモートデスクトップ機能は伝説となりました。
[通知] OS/2 Warp対応プリンタドライバの提供が終了しました。
[通知] Netscape Navigator 4用CSS互換レイヤーが削除されました。
```

# 注意点
- 実際のOSやシステム設定には一切影響を与えません。
- 通知内容は完全に架空であり、ジョーク用途です。
- 通知履歴はローカル保存されません。
- 一部Linux環境では`notify-send`コマンドが必要です。

# 参考資料
- references/design_notes.md を参照
- OS通知API公式: [Windows Toast](https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/), [AppleScript通知](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html), [notify-send](https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html)

scripts/random_os_fake_legacy_support_alert.py

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

LEGACY_ALERTS = [
    "98互換モードのサポートが本日終了しました。",
    "IE6向け最適化は永遠に封印されました。",
    "フロッピー対応APIが旅立ちました。",
    "Windows MEのリモートデスクトップ機能は伝説となりました。",
    "OS/2 Warp対応プリンタドライバの提供が終了しました。",
    "Netscape Navigator 4用CSS互換レイヤーが削除されました。",
    "MS-DOSバッチ互換レイヤーが眠りにつきました。",
    "ActiveXコントロールのサポートが時空の彼方へ消えました。",
    "ISAバス対応ドライバの提供が終了しました。",
    "Windows 3.1向けTrueTypeフォントAPIが封印されました。",
    "PC-98エミュレーションモードが宇宙の果てに旅立ちました。",
    "Lotus 1-2-3互換モードが永久に失われました。",
    "BASICランタイムのサポートが消滅しました。",
    "SCSI-1デバイスの自動検出機能が削除されました。",
    "IE5.5用Active Desktopの提供が終了しました。",
    "Windows 2000のセーフモード起動支援が歴史に幕を下ろしました。",
    "VGA16色互換APIが時代の流れに消えました。",
    "MSN Messenger連携機能が永遠に失われました。",
    "Windows XP Lunaテーマのサポートが終了しました。",
    "FAT12ファイルシステムのサポートがついに終焉を迎えました。",
    "PCMCIAカードホットスワップAPIが消滅しました。",
    "Windows 95用DirectX 3.0互換モードが削除されました。",
    "古のレガシーBIOSサポートが宇宙の塵となりました。",
    "Netscape Plugin APIの提供が終了しました。",
    "Windows 98SEのUSB1.1互換レイヤーが封印されました。"
]

HISTORY_FILE = os.path.expanduser("~/.random_os_fake_legacy_support_alert_history")


def send_notification(message: str):
    system = platform.system()
    try:
        if system == "Darwin":
            script = f'display notification "{message}" with title "通知"'
            subprocess.run(["osascript", "-e", script], check=True)
        elif system == "Windows":
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast("通知", message, duration=5)
            except ImportError:
                # fallback to PowerShell
                script = f'[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null;'
                script += f'$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02);'
                script += f'$textNodes = $template.GetElementsByTagName("text");'
                script += f'$textNodes.Item(0).AppendChild($template.CreateTextNode("通知")) > $null;'
                script += f'$textNodes.Item(1).AppendChild($template.CreateTextNode("{message}")) > $null;'
                script += f'$toast = [Windows.UI.Notifications.ToastNotification]::new($template);'
                script += f'$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("random-os-fake-legacy-support-alert");'
                script += f'$notifier.Show($toast);'
                subprocess.run(["powershell", "-Command", script], check=True)
        elif system == "Linux":
            subprocess.run(["notify-send", "通知", message], check=True)
        else:
            print(f"[通知] {message}")
    except Exception as e:
        print(f"[通知] {message} (通知送信に失敗: {e})")


def get_random_alert() -> str:
    return random.choice(LEGACY_ALERTS)


def log_alert(message: str):
    try:
        with open(HISTORY_FILE, "a", encoding="utf-8") as f:
            f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} {message}\n")
    except Exception:
        pass  # 履歴保存失敗は無視


def list_history(limit: int = 20):
    if not os.path.exists(HISTORY_FILE):
        print("履歴がありません。")
        return
    try:
        with open(HISTORY_FILE, "r", encoding="utf-8") as f:
            lines = f.readlines()
        for line in lines[-limit:]:
            print(line.strip())
    except Exception as e:
        print(f"履歴読み込み失敗: {e}")


def summary_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴がありません。")
        return
    try:
        with open(HISTORY_FILE, "r", encoding="utf-8") as f:
            lines = f.readlines()
        print(f"通知履歴件数: {len(lines)}")
        recent = lines[-5:] if len(lines) >= 5 else lines
        print("直近の通知:")
        for line in recent:
            print("  " + line.strip())
    except Exception as e:
        print(f"履歴集計失敗: {e}")


def main():
    parser = argparse.ArgumentParser(
        description="謎のレガシーOSサポート終了通知をランダムで表示するスクリプト")
    subparsers = parser.add_subparsers(dest="command", help="サブコマンド")
    parser_log = subparsers.add_parser("log", help="ランダム通知を発火し履歴に記録")
    parser_list = subparsers.add_parser("list", help="通知履歴を表示")
    parser_list.add_argument("-n", "--num", type=int, default=20, help="表示件数")
    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリを表示")

    args = parser.parse_args()

    if args.command == "log" or args.command is None:
        # 明示呼び出し or デフォルト
        message = get_random_alert()
        send_notification(message)
        log_alert(message)
        print(f"[通知] {message}")
    elif args.command == "list":
        list_history(args.num)
    elif args.command == "summary":
        summary_history()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発者の操作時に現実には存在しないレガシーOSやAPIの“サポート終了通知”をランダムで表示し、ユーモアとノスタルジーを演出します。実際の環境やデータには一切影響を与えません。

# 公式ドキュメント抜粋
- Windows: [Toast Notifications](https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/)
- macOS: [AppleScript display notification](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- Linux: [notify-send](https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html)

# 利用例
- ターミナルやエディタでコマンド実行時に自動発火
- `/random-os-fake-legacy-support-alert log` で任意に通知を発火
- `/random-os-fake-legacy-support-alert list` で過去の通知履歴を確認

# 注意点
- 通知内容は完全なジョークであり、実際のサポート終了やシステム変更は発生しません。
- Linuxで`notify-send`が未インストールの場合は通知が表示されません。

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

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-legacy-support-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 との連携設計はどうあるべきか?
  • 通知が想定通りランダムで発火するか?
  • 内容が毎回レガシー&無意味か?
  • 本体環境やデータを一切変更しない安全設計か?

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

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

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

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

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