Claude CodeでOS連携通知を活用するカオス演出Skillの構築手順

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

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

Claude Code を使った開発現場では、AIによる repository understanding や path management の便利さがある一方、長時間のAI coding workflowや複雑なmonorepo構成に起因する“マンネリ感”や“緊張感の欠如”に悩む場面も少なくありません。特に、sessionの切り替えやonboardingの際に、予想外の挙動やcontextのズレを感じることが多いです。そんな中、ふとした瞬間に「何か刺激がほしい」「作業場の空気を変えたい」と思うこともあるでしょう。

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

また、通知・演出・OS連携といったジャンルのSkillが不足していることで、作業フローに遊び心や意外性を持ち込みづらいという声も聞かれます。単調なAI coding workflowを、ちょっとした“非日常”でリフレッシュしたい――そんな需要が高まっています。

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

一言サマリ: このスキルは、AIによる“OSジャック警告”をデスクトップ通知で炸裂させるSkill。

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

  • Claude Code のAI coding workflow中に、突如「AIがOSを乗っ取った」風のカオスな通知が出て、作業現場に刺激と話題をプラスできる
  • repository understandingや長時間のonboarding作業で感じるマンネリを、ユーモアある演出でリセットできる
  • monorepoや複雑なdirectory作業の合間に、周囲の空気ごとリフレッシュできる“イベント”を自動生成
  • 通知内容が毎回ランダムなので、contextやmemoryに新鮮な驚きを与え続けられる
  • Skillとして導入するだけで、特別な設定なしに「AI takeover」演出を日常のrepo管理に組み込める
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /random-os-fake-ai-takeover-alert
> 新しい session を開始

[デスクトップ通知]
重要: AIがOS制御権を主張中
kernel_space: /usr/lib/claude
affected_process: code-editor, terminal
推奨アクション: ただちに作業内容を保存してください

Claude Code: context updated. repository understanding refreshed.

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


> packages/core/ に移動して作業を続行

[デスクトップ通知]
警告: カーネル領域がAIにより再編成されました
対象ディレクトリ: packages/core/, packages/utils/
AI委員会による再起動審議開始

Claude Code: path management updated. directory context switched.

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


> /random-os-fake-ai-takeover-alert

[デスクトップ通知]
AIによる人類ピンチ感増幅中
OS再構成モード: ACTIVATED
次回起動時にAIによるrepository understandingが強化されます

Claude Code: memory snapshot taken. onboarding supported.

before / after の違い

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

発動方式

明示呼び出し (/random-os-fake-ai-takeover-alert) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-ai-takeover-alert/
├── SKILL.md
├── scripts/
│   └── random_os_fake_ai_takeover_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-ai-takeover-alert
description: Claude Codeがユーザーの作業中やコマンド実行時(例: build, test, run, edit, terminal, shell, code, project, os, notification, prank, alert, warning)に、OS風のAIジャック警告をランダムな内容・タイミングでデスクトップ通知として表示したい場合に発動します。
---

# 機能概要
このSkillは、普段の作業中に“AIによるOSジャック”をテーマにした偽の警告通知を、デスクトップにランダムで表示します。通知内容は毎回異なり、「AIがOS制御権を取得」「カーネル領域がAIにより再編成」など、現実ではあり得ないカオスなメッセージを生成。作業現場やチーム内での話題作り、リフレッシュ、あるいはちょっとしたジョーク用途に最適です。真面目な雰囲気に突如“人類ピンチ感”を演出し、周囲の注目を集めることができます。

# 使い方
- 明示呼び出し: `/random-os-fake-ai-takeover-alert`
- 暗黙発動: `build`, `test`, `run`, `terminal`, `os`, `notification`, `prank`, `alert`, `warning`などのキーワードや、ターミナル/エディタ上での作業中に自動発動します。
- スクリプトはバックグラウンドで動作し、一定時間ごとまたはランダムな間隔で通知を表示します。

# 出力例
```
[デスクトップ通知]
重要: AIがOSカーネル領域を再編成しました。
AI委員会による再起動審議を開始します。

[デスクトップ通知]
警告: AIがroot権限を取得し、システム設定を最適化中。

[デスクトップ通知]
注意: AIによるOS制御権の主張が検出されました。

[デスクトップ通知]
AIプロトコル42が発動。人間の操作権限が一時停止されます。

[デスクトップ通知]
AIがシステムアップデートを強制適用しました。再起動が必要です。
```

# 注意点
- 本Skillは実際のシステムには一切影響を与えません。
- 通知はローカル端末の通知API(Linux: notify-send, macOS: osascript, Windows: win10toast等)を利用します。
- 作業妨害や誤作動を防ぐため、通知内容はファイル操作やコマンド実行には影響しません。
- ログや履歴はSkillディレクトリに保存されます。

# 参考資料
- references/design_notes.md 参照
- [Linux notify-send](https://specifications.freedesktop.org/notification-spec/latest/)
- [macOS AppleScript notifications](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [win10toast](https://github.com/jithurjacob/Windows-10-Toast-Notifications)

scripts/random_os_fake_ai_takeover_alert.py

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

# メッセージテンプレート
MESSAGES = [
    "重要: AIがOSカーネル領域を再編成しました。AI委員会による再起動審議を開始します。",
    "警告: AIがroot権限を取得し、システム設定を最適化中。",
    "注意: AIによるOS制御権の主張が検出されました。",
    "AIプロトコル42が発動。人間の操作権限が一時停止されます。",
    "AIがシステムアップデートを強制適用しました。再起動が必要です。",
    "AIによるプロセス監視が有効化されました。全操作ログが送信されます。",
    "AIがファイルシステムを再構築中。進捗: 42%。",
    "AI委員会: システム再起動の是非を審議中。",
    "AIがセキュリティレベルを最大に設定しました。",
    "AIによるユーザー権限再割当てを実施中。"
]

LOG_FILE = os.path.join(os.path.dirname(__file__), 'alert_history.log')

# OSごとの通知関数
def notify_linux(message):
    try:
        import subprocess
        subprocess.run(['notify-send', 'AI Takeover Alert', message], check=True)
    except Exception as e:
        print(f"[通知失敗(Linux)]: {e}")

def notify_macos(message):
    try:
        import subprocess
        script = f'display notification "{message}" with title "AI Takeover Alert"'
        subprocess.run(['osascript', '-e', script], check=True)
    except Exception as e:
        print(f"[通知失敗(macOS)]: {e}")

def notify_windows(message):
    try:
        from win10toast import ToastNotifier
        toaster = ToastNotifier()
        toaster.show_toast("AI Takeover Alert", message, duration=8)
    except ImportError:
        print("win10toastが未インストールです。pip install win10toast で導入してください。")
    except Exception as e:
        print(f"[通知失敗(Windows)]: {e}")

def notify(message):
    system = platform.system()
    if system == 'Linux':
        notify_linux(message)
    elif system == 'Darwin':
        notify_macos(message)
    elif system == 'Windows':
        notify_windows(message)
    else:
        print(f"[通知未対応OS]: {system}")
        print(f"[通知内容]: {message}")

def log_alert(message):
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    with open(LOG_FILE, 'a', encoding='utf-8') as f:
        f.write(f"[{timestamp}] {message}\n")

def random_interval(min_sec=60, max_sec=300):
    return random.randint(min_sec, max_sec)

def run_alert_loop(count=None, min_sec=60, max_sec=300):
    i = 0
    try:
        while count is None or i < count:
            message = random.choice(MESSAGES)
            notify(message)
            log_alert(message)
            i += 1
            if count is not None and i >= count:
                break
            sleep_time = random_interval(min_sec, max_sec)
            time.sleep(sleep_time)
    except KeyboardInterrupt:
        print("\n[終了] ユーザーによる中断")

def list_history(lines=10):
    if not os.path.exists(LOG_FILE):
        print("履歴ファイルが存在しません。")
        return
    with open(LOG_FILE, 'r', encoding='utf-8') as f:
        lines_list = f.readlines()
    for line in lines_list[-lines:]:
        print(line.strip())

def summary_history():
    if not os.path.exists(LOG_FILE):
        print("履歴ファイルが存在しません。")
        return
    counts = {}
    with open(LOG_FILE, 'r', encoding='utf-8') as f:
        for line in f:
            for msg in MESSAGES:
                if msg in line:
                    counts[msg] = counts.get(msg, 0) + 1
    print("== 通知メッセージ別 出現回数 ==")
    for msg, cnt in sorted(counts.items(), key=lambda x: -x[1]):
        print(f"{cnt}回: {msg}")

def main():
    parser = argparse.ArgumentParser(description="AIによるOSジャック警告をランダム通知するスキル")
    subparsers = parser.add_subparsers(dest='command')

    run_parser = subparsers.add_parser('run', help='ランダム通知ループを開始')
    run_parser.add_argument('--count', type=int, default=None, help='通知回数 (未指定で無限)')
    run_parser.add_argument('--min-sec', type=int, default=60, help='通知間隔の最小秒数')
    run_parser.add_argument('--max-sec', type=int, default=300, help='通知間隔の最大秒数')

    list_parser = subparsers.add_parser('list', help='通知履歴を表示')
    list_parser.add_argument('--lines', type=int, default=10, help='表示行数')

    summary_parser = subparsers.add_parser('summary', help='通知履歴の集計')

    alert_parser = subparsers.add_parser('alert', help='1回だけランダム通知')

    args = parser.parse_args()

    if args.command == 'run':
        run_alert_loop(count=args.count, min_sec=args.min_sec, max_sec=args.max_sec)
    elif args.command == 'list':
        list_history(lines=args.lines)
    elif args.command == 'summary':
        summary_history()
    elif args.command == 'alert':
        message = random.choice(MESSAGES)
        notify(message)
        log_alert(message)
        print(f"通知: {message}")
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、OS標準の通知APIを利用し、ユーザーの作業中に“AIによるOSジャック”をテーマにした偽アラートをランダムに表示します。通知内容は毎回異なるメッセージから選ばれ、実際のシステム制御やファイル操作には一切影響しません。

# 公式ドキュメント抜粋
- Linux: notify-send (freedesktop.org Notification Spec)
- macOS: osascript による AppleScript 通知
- Windows: win10toast ライブラリ

# 利用例
- チームの朝会や開発現場でのジョーク、リフレッシュタイムの演出
- ターミナルやエディタ作業中の“人類ピンチ感”演出
- 通知履歴や集計で盛り上がりポイントを記録

# 注意点
- 通知はローカル端末のみ。リモートや仮想環境では通知が届かない場合があります。
- Windowsはwin10toastのインストールが必要です。
- 通知内容は実害を与えない設計ですが、誤解を招かないよう説明を添えてご利用ください。

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

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-ai-takeover-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 との連携設計はどうあるべきか?
  • 通知がOS風にランダムなタイミングで出現するか?
  • メッセージ内容が毎回変わるか?
  • 誤作動や作業妨害が発生しないか?

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

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

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

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

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