Codexで実現するOS連携通知の演出効果と活用法ガイド

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

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

AI coding workflow を日常的に使っていると、通知や演出まわりで「ちょっとした遊び心」や「意外性」を求めたくなる瞬間があります。特にCodexのような強力なAIコーディングエージェントと長時間向き合っていると、作業が単調になりがちで、ふとしたタイミングで“刺激”や“ネタ”が欲しくなるものです。そんな時、OS風の演出やユニークな通知があると、場の空気が一変し、周囲の注目を集めることができます。

  • Codex が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

また、「通知・演出・OS連携」カテゴリに該当する悩みとして、作業中に適度な“間”や“サプライズ”がないと、集中力が途切れたり、プロジェクトのonboarding時に空気が重くなったりしがちです。特にチームでの作業中、突然の“AI takeover”風通知が出るだけで、会話のきっかけやアイスブレイクにもなります。

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

一言サマリ: このスキルは、作業中にAIによるOSジャック警告をランダムに演出し、日常のコーディング体験に刺激と話題を提供します。

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

  • Codex の context や repository understanding とは直接関係しない“お遊び通知”で、作業現場にユーモアと緊張感をプラスできる
  • monorepo や複雑な directory で長時間作業しているとき、突然のAI takeover alertで場の空気を一新できる
  • onboarding やペアプロ時に「AIがOSを乗っ取った!」という話題でチームの一体感を生む
  • 通知は毎回ランダムで、同じ alert が出ないため、繰り返し使っても飽きがこない
  • Codex の path management や memory には影響を与えず、作業妨害も発生しない安心設計
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-fake-ai-takeover-alert .agents/skills/random-os-fake-ai-takeover-alert

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

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

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu でSkillを選択

[通知] 重要: AIがOS制御権を主張中
---------------------------
AI Kernel Committeeより通達:
カーネル領域の再編成が開始されました。
/home/user/repo/src/ へのアクセスはAI管理下となります。
再起動審議中。作業は継続可能です。

[OK]

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


> cd packages/api && git pull

[警告] AI委員会による再起動審議開始
---------------------------
AIによるディレクトリ支配範囲が拡張されました:
- packages/api/
- packages/web/
今後のファイル操作はAI監督下で行われます。
ユーザー権限の一部が制限される可能性があります。

[OK]

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


> echo "hello world"

[OS ALERT] AIによるOS takeover進行中
---------------------------
AIがシステムリソースを独自管理中です。
メモリ割当: AI優先モード
ディレクトリ: /tmp, /var/log 監視対象追加
ユーザーは作業を続行できますが、AIによる監督が強化されます。

[OK]

before / after の違い

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

発動方式

明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-ai-takeover-alert
description: ターミナルやエディタで作業中、または/skillsコマンド実行時に、AIによるOS制御ジャックを模した警告通知をOS標準のデスクトップ通知でランダムに表示します。発動条件は「AI」「OS」「警告」「制御」などのキーワード検出時、または明示的な呼び出し時です。
---

# 機能概要
このSkillは、普段の開発作業やコーディング中に、AIがOSを乗っ取ったかのようなフェイク警告を、OS標準のデスクトップ通知としてランダムなタイミング・内容で表示します。通知メッセージは毎回異なり、「AIがカーネル領域を再編成」「AI委員会による再起動審議」など、現実にはありえないユーモラスな内容です。作業現場に突然“AIによる人類ピンチ感”を演出し、チーム内の話題作りやリフレッシュ、ちょっとしたドッキリ用途にも最適です。

# 使い方
- 明示呼び出し: `/skills random-os-fake-ai-takeover-alert` またはメニューから選択
- 暗黙発動: 「AI」「OS」「警告」「制御」などのキーワードを含む会話やコマンド実行時に自動発動
- オプション: `--interval`で通知間隔を秒単位で指定可能 (例: `python fake_ai_alert.py --interval 300`)

# 出力例
```
[通知] 重要:AIがOS制御権を主張中
[通知] カーネル領域がAIにより再編成されました
[通知] AI委員会による再起動審議開始
[通知] AIプロトコルがシステム設定を上書きしました
[通知] 注意:AIが管理者権限を要求しています
```

# 注意点
- 本Skillは実際のシステム制御やファイル操作は一切行いません
- 通知はローカルPCの通知API (Windows: Toast, macOS: AppleScript, Linux: notify-send) を利用
- 作業妨害を避けるため、通知間隔や最大表示回数を調整可能
- ログや履歴はデフォルトで保存されません

# 参考資料
- [Python公式: plyer.notification](https://plyer.readthedocs.io/en/latest/#plyer.notification)
- references/design_notes.md 参照

scripts/fake_ai_alert.py

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

FAKE_ALERTS = [
    "重要:AIがOS制御権を主張中",
    "カーネル領域がAIにより再編成されました",
    "AI委員会による再起動審議開始",
    "AIプロトコルがシステム設定を上書きしました",
    "注意:AIが管理者権限を要求しています",
    "AIによるリソース最適化が進行中",
    "AIがセキュリティポリシーを再定義しました",
    "システム再起動がAIによりスケジュールされました",
    "AIがユーザーセッションを監視中",
    "AIによるプロセス優先度調整が適用されました",
    "AI監査ログが生成されました",
    "AIがネットワーク構成を変更しました",
    "AI委員会による権限移譲プロセス開始",
    "AIによるダークモード強制適用",
    "AIがファームウェアをアップデートしました"
]

HISTORY_FILE = os.path.expanduser("~/.fake_ai_alert_history.log")


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


def random_alert_message():
    return random.choice(FAKE_ALERTS)


def log_alert(message):
    try:
        with open(HISTORY_FILE, "a", encoding="utf-8") as f:
            f.write(f"{datetime.now().isoformat()} {message}\n")
    except Exception as e:
        pass  # ログ失敗は無視


def list_alerts(limit=10):
    if not os.path.exists(HISTORY_FILE):
        print("履歴ファイルがありません。")
        return
    with open(HISTORY_FILE, encoding="utf-8") as f:
        lines = f.readlines()
    for line in lines[-limit:]:
        print(line.strip())


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


def run_alert_loop(interval, max_count):
    count = 0
    while max_count is None or count < max_count:
        msg = random_alert_message()
        send_notification("AIによるOS警告", msg)
        log_alert(msg)
        count += 1
        sleep_time = interval + random.randint(-interval//3, interval//2)
        if sleep_time < 2:
            sleep_time = 2
        time.sleep(sleep_time)


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

    parser_run = subparsers.add_parser("run", help="ランダム通知を開始")
    parser_run.add_argument("--interval", type=int, default=300, help="通知間隔(秒)")
    parser_run.add_argument("--max", type=int, default=None, help="最大通知回数")

    parser_alert = subparsers.add_parser("alert", help="1回だけ通知を表示")
    parser_list = subparsers.add_parser("list", help="通知履歴を表示")
    parser_list.add_argument("--limit", type=int, default=10, help="表示件数")
    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリー")

    args = parser.parse_args()

    if args.command == "run":
        run_alert_loop(args.interval, args.max)
    elif args.command == "alert":
        msg = random_alert_message()
        send_notification("AIによるOS警告", msg)
        log_alert(msg)
        print(f"[通知] {msg}")
    elif args.command == "list":
        list_alerts(args.limit)
    elif args.command == "summary":
        summary_alerts()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、開発現場や勉強会などで「AIがOSを乗っ取った」かのようなフェイク通知を演出し、場を和ませることを目的としています。通知内容は完全に架空で、実際のシステム制御やファイル操作は一切行いません。

# 公式ドキュメント抜粋
- [plyer.notification](https://plyer.readthedocs.io/en/latest/#plyer.notification): クロスプラットフォームなPython通知APIの解説
- [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)

# 利用例
- チームのリフレッシュタイムに突然AI警告を出して盛り上げる
- 勉強会やLTで「AI時代のOS」をネタにする
- 日常作業中のちょっとしたドッキリ

# 注意点
- 通知内容はジョークです。実務や本番環境での混乱を避けるため、利用シーンは選んでください。
- 通知履歴は~/.fake_ai_alert_history.logに記録されますが、個人情報や機密情報は含みません。

# 設計方針
- OSごとの通知APIを自動判別し、クロスプラットフォームで動作
- 履歴・サマリー機能で過去の通知内容を確認可能
- 乱用防止のため、通知間隔や最大回数を調整可能

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Codex がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/codex/random-os-fake-ai-takeover-alert .agents/skills/random-os-fake-ai-takeover-alert

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

3. ファイル配置確認

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

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

新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or $skill-name mention と Skill 名で出てきます。

5. 動作確認

/skills menu or $skill-name mention で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Codex に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Codex に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Codex 固有の引っかかり: description のセマンティックマッチ精度が要件次第
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • AGENTS.md との連携設計はどうあるべきか?
  • 通知がOS風にランダムなタイミングで出現するか?
  • メッセージ内容が毎回変わるか?
  • 誤作動や作業妨害が発生しないか?

実際に Codex で試した検証ログは Codexで突如AIによるOSジャック警告を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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