Codexで実現するカオス通知演出の作り方と活用術

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

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

Codex で日々開発していると、思いもよらないタイミングで context がズレたり、repository の理解が抜け落ちたりといった「あるある」な困りごとに直面しがちです。特に monorepo 環境や複数 directory を跨ぐプロジェクトでは、path 管理や context の維持が想像以上に煩雑になることも。そんな中、現実逃避したくなる瞬間や、ちょっとした息抜きが欲しいと感じることも少なくありません。

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

こうした日常の「面倒」に、突然現れる“謎の人事研修通知”が笑いと現実逃避をもたらすことで、気持ちを切り替えたり、チームのコミュニケーションのきっかけになったりする場面も考えられます。

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

一言サマリ: 作業中やコマンド実行時にSkill。

このSkillを導入することで、作業の合間やコマンド実行時に突然“OS人事研修強制参加通知”が炸裂し、現実の煩わしさを笑い飛ばすユニークな体験が得られます。Codex の context 管理や repository understanding の流れを邪魔せず、通知内容が毎回ランダムで変化するため、長時間のAI coding workflowにも新鮮な刺激を与えます。

  • 作業中に突如現れるランダムな“人事研修”通知で、単調なAI coding workflowに笑いと現実逃避をプラス
  • 通知はOSやターミナル上で違和感なく表示され、集中しすぎた session に適度なリフレッシュを提供
  • repo や directory の構造・context 管理には一切影響を与えず、安全に遊べる演出系Skill
  • 毎回異なる通知内容で、onboardingやチーム内コミュニケーションのきっかけにも
  • 実データやファイルには一切影響せず、memoryやpath managementの流れを妨げない安心設計
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /skills menu or random-os-fake-hr-training-alert mention
> 新しい session を開始

[OS通知] 緊急:本日14時より「謎のパワポ芸入門」研修が開催されます。
全開発者は必ず参加してください。参加URLは後ほど配布されます。

[OS通知] 重要:OS公式「無限ビデオ視聴」研修がまもなく始まります。
完了するまでターミナルは自動ロックされます。

(通知は毎回ランダムに変化)

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


> packages/api/ から packages/web/ へディレクトリ移動

[OS通知] ご注意:ただ今より「謎マナー講座」への強制参加が命じられました。
対象: packages/web/ 配下の全メンバー

[OS通知] 速報:monorepo全体で「OS流・謎の朝礼」リモート開催中。
「/packages/api/」から「/packages/web/」への移動者は特別セッションにご参加ください。

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


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

[OS通知] 重要:本日より「謎のリモート雑談研修」がスタートします。
退出不可。カメラON必須です。

[OS通知] 緊急:今すぐ「OS公認・無限アンケート回答」研修を受講してください。
所要時間:不明

before / after の違い

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

発動方式

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

Skill の中身を全部見せる

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

.agents/skills/random-os-fake-hr-training-alert/
├── SKILL.md
├── scripts/
│   └── fake_hr_training_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/fake_hr_training_alert.py 謎の人事研修強制通知をランダムに表示します
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-hr-training-alert
description: 作業中やコマンド実行時に、ターミナルやデスクトップへ“謎の人事研修強制通知”をランダムに表示します。triggerType: always/semantic。キーワード例: 研修, 通知, OS, 人事, アラート。
---

# 機能概要
このSkillは、作業中やCLIコマンドの実行時に、現実には絶対に体験したくない“謎のOS人事研修強制参加通知”を、デスクトップ通知やターミナル出力として唐突に表示します。通知内容は毎回ランダム生成され、「緊急:本日14時より“謎のパワポ芸入門”研修必須」「重要:OS公式“無限ビデオ視聴”研修が始まります」など、カオスで笑える人事イベントを演出。現実逃避とユーモアを同時に提供し、作業の合間にちょっとした息抜きをもたらします。

# 使い方
- 明示呼び出し例:
  - `/skills menu` から `random-os-fake-hr-training-alert` を選択
  - `$random-os-fake-hr-training-alert` をターミナルで実行
- 暗黙発動キーワード例:
  - 「研修」「人事」「通知」「アラート」などの語を含むコマンドや会話
- 実行すると、OSの通知APIまたはターミナルにランダムな“人事研修通知”が即時表示されます。

# 出力例
```
[ALERT] 緊急:本日14:00より「謎のパワポ芸入門」研修が強制開催されます。
[NOTICE] 重要:OS公式「無限ビデオ視聴」研修が今すぐ開始されます。
[WARNING] ただ今より「謎マナー講座」への参加が必須です。
[INFO] 新着:本日17:30より「謎のリモート背景選手権」研修が始まります。
[ALERT] 参加必須:OS人事部主催「無限フィードバック地獄」研修が開幕!
```

# 注意点
- 実データやファイルには一切影響を与えません。
- 通知は一時的な表示のみで、履歴や記録は残りません。
- OSの通知APIやターミナル出力のみを利用し、ローカル保存や権限変更は行いません。
- 通知内容は完全なフィクションです。

# 参考資料
- [Python公式: notifications](https://docs.python.org/3/library/subprocess.html)
- references/design_notes.md 参照

scripts/fake_hr_training_alert.py

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

NOTIFICATION_TEMPLATES = [
    '[ALERT] 緊急:本日{hour}:{minute}より「{title}」研修が強制開催されます。',
    '[NOTICE] 重要:OS公式「{title}」研修が今すぐ開始されます。',
    '[WARNING] ただ今より「{title}」への参加が必須です。',
    '[INFO] 新着:本日{hour}:{minute}より「{title}」研修が始まります。',
    '[ALERT] 参加必須:OS人事部主催「{title}」研修が開幕!',
    '[NOTICE] 重要:{weekday}は「{title}」研修デーです。',
    '[WARNING] 緊急連絡:{title}研修のリマインダーです。',
    '[INFO] ご注意:「{title}」研修の事前課題があります。',
    '[ALERT] 本日中に「{title}」研修の受講を完了してください。',
    '[NOTICE] 重要:「{title}」研修の参加が義務付けられました。'
]

TRAINING_TITLES = [
    '謎のパワポ芸入門',
    '無限ビデオ視聴',
    '謎マナー講座',
    'リモート背景選手権',
    '無限フィードバック地獄',
    '謎のオンライン自己紹介',
    'OS公式エア出社体験',
    '謎のカメラON強制',
    '無限アンケート回答',
    '謎の社内用語暗記',
    '謎のバーチャル飲み会',
    '謎のエクセル芸道場',
    '謎のSlackスタンプ研修',
    '謎の仮想会議耐久',
    'OS人事部謎のサバイバル',
    '謎のアイスブレイク選手権',
    '謎のリモート雑談訓練',
    '謎のマイクON地獄',
    '謎のカレンダー共有講座',
    '謎の無限リマインダー研修'
]

WEEKDAYS = ['月曜', '火曜', '水曜', '木曜', '金曜']


def get_random_time():
    hour = random.randint(8, 18)
    minute = random.choice(['00', '15', '30', '45'])
    return hour, minute

def get_random_weekday():
    return random.choice(WEEKDAYS)

def generate_notification():
    template = random.choice(NOTIFICATION_TEMPLATES)
    title = random.choice(TRAINING_TITLES)
    hour, minute = get_random_time()
    weekday = get_random_weekday()
    return template.format(title=title, hour=str(hour).zfill(2), minute=minute, weekday=weekday)


def show_terminal_notification(msg):
    print(msg)


def show_desktop_notification(msg):
    sys_platform = platform.system()
    try:
        if sys_platform == 'Darwin':  # macOS
            subprocess.run([
                'osascript', '-e', f'display notification "{msg}" with title "人事研修アラート"'
            ], check=True)
        elif sys_platform == 'Linux':
            # notify-sendがあれば使う
            if subprocess.call(['which', 'notify-send'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) == 0:
                subprocess.run([
                    'notify-send', '人事研修アラート', msg
                ], check=True)
            else:
                show_terminal_notification(msg)
        elif sys_platform == 'Windows':
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast("人事研修アラート", msg, duration=6)
            except ImportError:
                show_terminal_notification(msg)
        else:
            show_terminal_notification(msg)
    except Exception as e:
        show_terminal_notification(f"[通知失敗] {msg} ({e})")


def main():
    parser = argparse.ArgumentParser(description='謎の人事研修強制通知をランダムに表示します')
    subparsers = parser.add_subparsers(dest='command', help='サブコマンド')

    parser_alert = subparsers.add_parser('alert', help='今すぐランダム通知を1件表示')
    parser_alert.add_argument('--desktop', action='store_true', help='デスクトップ通知も試行')

    parser_batch = subparsers.add_parser('batch', help='複数回ランダム通知を表示')
    parser_batch.add_argument('-n', type=int, default=5, help='通知回数 (デフォルト: 5)')
    parser_batch.add_argument('--interval', type=float, default=2.0, help='通知間隔秒 (デフォルト: 2.0)')
    parser_batch.add_argument('--desktop', action='store_true', help='デスクトップ通知も試行')

    parser_list = subparsers.add_parser('list', help='サンプル通知を一覧表示')
    parser_list.add_argument('-n', type=int, default=10, help='表示件数')

    args = parser.parse_args()

    if args.command == 'alert':
        msg = generate_notification()
        show_terminal_notification(msg)
        if args.desktop:
            show_desktop_notification(msg)
    elif args.command == 'batch':
        for i in range(args.n):
            msg = generate_notification()
            show_terminal_notification(msg)
            if args.desktop:
                show_desktop_notification(msg)
            if i < args.n - 1:
                time.sleep(args.interval)
    elif args.command == 'list':
        for _ in range(args.n):
            msg = generate_notification()
            print(msg)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、現実には絶対に体験したくない“謎の人事研修通知”を、ランダムでターミナルやデスクトップに表示する演出系ツールです。通知内容は毎回異なり、作業中の息抜きやジョークとして利用できます。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/3/library/subprocess.html
- notify-send (Linux): https://specifications.freedesktop.org/notification-spec/latest/
- osascript (macOS): https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/

# 利用例
- `/skills menu`や`$random-os-fake-hr-training-alert alert --desktop`で即時通知
- `batch`サブコマンドで複数回通知の連発

# 注意点
- 通知内容は完全なフィクションであり、実在の人事イベントや個人情報とは無関係です。
- OSの通知APIやターミナル出力のみを利用し、ファイルやシステム設定には一切影響を与えません。

# 設計方針
- ランダム性・バリエーション重視で、テンプレートとタイトルを多数用意
- OSごとの通知APIを自動判別し、失敗時は必ずターミナル出力にフォールバック
- 履歴や記録を一切残さず、完全な一時通知のみを実現

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agents/skills/random-os-fake-hr-training-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で謎の人事研修通知をランダムに表示してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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