Codexで謎のOSボスが通知を乱入する演出を簡単構築する方法

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

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

Codex を日々使い込む中で、多くのユーザーが「集中しすぎて逆に疲れる」「作業が単調で気分転換が欲しい」「AIとのやりとりが淡々としがち」といった悩みを感じています。特に長時間のAI coding workflowや大規模なrepositoryを扱う場合、画面に張り付きっぱなしで気づけば数時間経過、ということも珍しくありません。

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

また、集中力が切れたタイミングでちょっとした刺激や遊び心が欲しい、という要望も多く聞かれます。特に通知・演出・OS連携系のSkillが不足している現状では、作業効率だけでなく「楽しさ」や「リフレッシュ」も重要な要素になりつつあります。

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

一言サマリ: このスキルは、Codex作業中に“謎のOSボスキャラ”が乱入し、カオスな警告や命令で集中力と気分転換を同時に演出するSkill。

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

  • 単調な AI coding workflow にランダムな演出が加わり、集中力の維持やリフレッシュがしやすくなる
  • 長時間作業やmonorepoの複雑なrepository understanding中でも、意外性ある通知で「ハッ」と我に返るきっかけを作れる
  • 毎回異なるボスキャラとセリフがcontextに現れ、作業のマンネリ化を防ぎつつ、ちょっとした遊び心を導入できる
  • directoryやpath管理の合間に、気軽にonboardingや休憩指示を“演出”として挟み込める
  • Codexの通知・演出系Skill群の中でも、ユーモアと実用を両立した新体験を追加できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-mystery-boss-pop .agents/skills/random-os-mystery-boss-pop

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

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

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


# /skills menu or random-os-mystery-boss-pop

[OS BOSS: "謎のバグ皇帝" がデスクトップに降臨!]
緊急任務:main.py のコメントを全て消去せよ!
(失敗すれば、あなたの context は永遠に迷宮入りだ…)

ヒント: ストレッチタイムが推奨されています。
(ボスは消えるまで5分間、画面端で監視中)

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


> パッケージ間で utils/ ディレクトリの構造を確認

[OS BOSS: "残業魔王・パス管理人" が乱入!]
警告:packages/api/utils/ でファイル増殖を検知。
至急、repository understanding を再確認せよ!

ボスのセリフ: 「directory 増やしすぎは context の敵だぞ…」

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


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

[OS BOSS: "カオスAI将軍" が現れた!]
命令:今すぐ椅子から立ち上がり、3回ジャンプせよ。
(従わなければ、repo の path 管理がカオス化するであろう…)

ボスは去った。正気を保てたか?

before / after の違い

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

発動方式

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

Skill の中身を全部見せる

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

.agents/skills/random-os-mystery-boss-pop/
├── SKILL.md
├── scripts/
│   └── random_os_mystery_boss_pop.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_mystery_boss_pop.py Random OS Mystery Boss Pop: カオスなボスキャラ通知を表示
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-mystery-boss-pop
description: 作業中の集中力が高まったタイミングや、/skills menu コマンド、または『ボス』『警告』『ストレッチ』などのキーワードを含む会話で発動。カオスなOSボスキャラ通知をデスクトップや画面端に表示します。
---

# 機能概要
このSkillは、作業中に突如“謎のOSボスキャラ”が現れ、デスクトップや画面端に奇妙な命令や警告をポップアップ通知で表示します。ボスキャラは毎回ランダム生成され、セリフもカオスに変化。集中しすぎている時や、長時間作業の合間に意外性のある演出を加えて、ユーザーの気分転換やストレッチ喚起を促します。通知はシステムに影響を与えず、純粋な演出として楽しめます。

# 使い方
- 明示呼び出し例: `/skills menu` から skill を選択、または `random-os-mystery-boss-pop` を直接呼び出し。
- 暗黙発動キーワード例: 「ボス」「警告」「ストレッチ」「魔王」「集中力」「休憩」などの単語を含む会話やコマンドで自動発動。

# 出力例
```
[画面右下通知]
【降臨:メモリ喰いのバグ魔王】
緊急任務:今すぐ椅子から立ち上がり、3回ジャンプせよ!

[画面中央ポップアップ]
【出現:CPUオーバーロード伯爵】
警告:本日は残業魔王が降臨中。集中力を維持できるか?

[端末出力]
Mystery Boss: SSDトロールが現れた!「今すぐストレッチせよ」
```

# 注意点
- 本Skillは通知演出のみで、ファイルやシステム設定には一切変更を加えません。
- ローカルの通知API(Windows: Toast, macOS: AppleScript, Linux: notify-send)を使用。
- 一部環境では通知が非対応の場合あり。
- 履歴やボスキャラの記録はローカル保存されません。

# 参考資料
- [Windows Toast Notifications](https://docs.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/toast-notifications)
- [AppleScript display notification](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html)
- [notify-send man page](https://man7.org/linux/man-pages/man1/notify-send.1.html)
- references/design_notes.md 参照

scripts/random_os_mystery_boss_pop.py

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

BOSS_TITLES = [
    'メモリ喰いのバグ魔王',
    'CPUオーバーロード伯爵',
    'SSDトロール',
    '残業魔王',
    'ブルースクリーン大佐',
    'アップデート将軍',
    'ネットワーク断絶王',
    'マウスカースル騎士',
    'ウィンドウズの亡霊',
    'カーネルパニック姫'
]

BOSS_MESSAGES = [
    '緊急任務:今すぐ椅子から立ち上がり、3回ジャンプせよ!',
    '警告:本日は残業魔王が降臨中。集中力を維持できるか?',
    '今すぐストレッチせよ!',
    'あなたの作業は監視されている。',
    '定時退社の夢は幻となった。',
    'USBケーブルが絡まっているぞ。',
    '画面の端に目を向けよ。',
    'コーヒーを淹れる時間だ。',
    '今すぐ深呼吸せよ。',
    '5分間だけ休憩してもよい。'
]

BOSS_PREFIXES = [
    '降臨',
    '出現',
    '警告',
    '襲来',
    '乱入',
    '召喚'
]

TERMINAL_BOSS_FORMAT = 'Mystery Boss: {title}が現れた!「{message}」'


def generate_boss() -> Tuple[str, str, str]:
    title = random.choice(BOSS_TITLES)
    message = random.choice(BOSS_MESSAGES)
    prefix = random.choice(BOSS_PREFIXES)
    return prefix, title, message


def notify_windows(title: str, message: str):
    try:
        from win10toast import ToastNotifier
        toaster = ToastNotifier()
        toaster.show_toast(title, message, duration=7, threaded=True)
    except ImportError:
        # Fallback: PowerShell notification
        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('{title}')) > $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('RandomBossPop'); "
        script += f"$notifier.Show($toast);"
        subprocess.Popen(["powershell", "-Command", script], shell=True)


def notify_macos(title: str, message: str):
    script = f'display notification "{message}" with title "{title}"'
    subprocess.run(["osascript", "-e", script])


def notify_linux(title: str, message: str):
    try:
        subprocess.run(["notify-send", title, message])
    except Exception as e:
        print(f"notify-send failed: {e}")


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


def print_terminal_boss(prefix: str, title: str, message: str):
    print(f"【{prefix}:{title}】\n{message}\n")


def boss_pop(args):
    prefix, title, message = generate_boss()
    full_title = f"{prefix}:{title}"
    print_terminal_boss(prefix, title, message)
    send_notification(full_title, message)


def boss_list(args):
    print("=== ボスキャラ一覧 ===")
    for i, t in enumerate(BOSS_TITLES, 1):
        print(f"{i}. {t}")
    print("\n=== メッセージ例 ===")
    for i, m in enumerate(BOSS_MESSAGES, 1):
        print(f"{i}. {m}")


def boss_summary(args):
    print("このSkillは、OSの通知機能を使ってランダムなボスキャラとメッセージを表示します。\n")
    print(f"対応OS: Windows, macOS, Linux (notify-send)\nボスキャラ数: {len(BOSS_TITLES)}\nメッセージ数: {len(BOSS_MESSAGES)}")


def main():
    parser = argparse.ArgumentParser(description="Random OS Mystery Boss Pop: カオスなボスキャラ通知を表示")
    subparsers = parser.add_subparsers()

    pop_parser = subparsers.add_parser('pop', help='ランダムなボスキャラ通知を表示')
    pop_parser.set_defaults(func=boss_pop)

    list_parser = subparsers.add_parser('list', help='ボスキャラやメッセージ一覧を表示')
    list_parser.set_defaults(func=boss_list)

    summary_parser = subparsers.add_parser('summary', help='Skill概要を表示')
    summary_parser.set_defaults(func=boss_summary)

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(0)
    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の通知APIを活用して“謎のボスキャラ”演出を提供します。通知は純粋な演出であり、システムやデータには一切影響を与えません。

# 公式ドキュメント抜粋
- Windows: [Toast Notifications](https://docs.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/toast-notifications)
- macOS: [AppleScript display notification](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html)
- Linux: [notify-send](https://man7.org/linux/man-pages/man1/notify-send.1.html)

# 利用例
- 長時間作業時のストレッチ喚起
- チームのリラックス演出
- コーディング中の気分転換

# 注意点
- 通知は一時的な表示のみで、履歴や記録は残りません。
- 一部Linux環境や通知非対応端末では表示されない場合があります。

# 設計方針
- OS標準APIのみ使用し、外部依存や永続データ保存を避ける。
- ボスキャラやメッセージは随時拡張可能なリスト構造。
- CLIサブコマンドで演出・一覧・概要を柔軟に呼び出せる設計。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-mystery-boss-pop .agents/skills/random-os-mystery-boss-pop

.agents/skills/random-os-mystery-boss-pop の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/random-os-mystery-boss-pop
# 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 との連携設計はどうあるべきか?
  • ボスキャラとセリフが毎回ランダムに表示されるか、通知が作業画面端やデスクトップに意外性をもって出るか、誤ってデータや環境に影響を与えないこと

実際に Codex で試した検証ログは Codexの謎のOSボスが突然乱入!カオスな演出を試してみた にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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