Codexで作業中に現れる謎の応援通知がもたらす意外な効果

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

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

集中しているときほど、ふとした瞬間に「ちょっと気分転換したい」「頭をリセットしたい」と感じることは多いはずです。しかし、実際の開発現場では次のような悩みがつきまといます。

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

また、通知や演出に関しては「作業中に突然現実逃避したくなる」「単調な流れを崩してくれる刺激が欲しい」といったニーズも。「どうせならAIが context を管理するだけでなく、遊び心で気分転換もサポートしてくれたら…」と感じる瞬間は意外と多いものです。

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

一言サマリ: あなたの作業中Skill。

このSkillを導入することで、以下のような変化が期待できます。

  • 単調なAI coding workflowの合間に、完全ランダムな“謎のOSマスコット”が登場し、現実逃避やリフレッシュのきっかけになる
  • repoやdirectoryの理解・onboardingの間に、意外性のある通知で集中力の切り替えをサポート
  • 長時間作業やlong contextの中でも、突発的な演出で作業環境に“ゆるさ”をプラス
  • Skillの通知は完全にランダムなので、いつ・どんなキャラが出てくるか分からず飽きが来ない
  • セマンティックなタイミングでも発動するため、AI coding workflow中に自然に混ざる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-fake-mascot-notifier .agents/skills/random-os-fake-mascot-notifier

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

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

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


# /skills menu
> random-os-fake-mascot-notifier を有効化

[通知] カーネルくんが応援してるよ!
「今日もいい感じの context だね。/src/app/main.py も見てるよ!」

[通知] ビットちゃんは今どこかで泣いています
「README.md の typo、気付いてほしいな…」

[通知] メモリ犬があなたの成功を見守っています
「directory 構造、そろそろ整理しない?」

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


> packages/core/ から packages/utils/ へ移動

[通知] スレッドキャットが現れた!
「context が切り替わったよ。/packages/utils/ のこと、忘れないでね」

[通知] ビットちゃんがうっかり現れた
「monorepo って、やっぱり迷路だよね…」

[通知] カーネルくんがヒントをくれた
「/packages/core/ の main.go も時々見てあげて!」

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


> 休憩したいな、とつぶやく

[通知] メモリ犬がじゃれついてきた!
「5分だけ目を閉じてみよう。context もリフレッシュ!」

[通知] スレッドキャットが踊っている
「task queue が溜まってるニャ。気分転換してから戻ってきて!」

[通知] ビットちゃんが寝落ちした
「AI coding workflow はほどほどにね」

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-mascot-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/random-os-fake-mascot-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_fake_mascot_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_mascot_notifier.py Random OS Fake Mascot Notifier
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-mascot-notifier
description: 作業中やコマンド実行時、または「マスコット」「通知」などのキーワードを含む会話があった際に、CodexはこのSkillを発動し、デスクトップ通知で架空のOSマスコットからランダムな激励や警告を表示します。
---

# 機能概要
このSkillは、あなたの作業中に“謎のOSマスコット”が突如デスクトップ通知で現れ、全く役に立たない激励や警告をランダムに発するものです。登場キャラクターやメッセージ内容、通知タイミングは完全にカオスで予測不能。作業の合間に現実逃避やリフレッシュを促します。通知は実際のデスクトップ領域に表示され、現実のOSのマスコットではなく、完全オリジナルのキャラとメッセージが毎回生成されます。

# 使い方
- 明示的呼び出し: `/skills menu` または `random-os-fake-mascot-notifier` のメンションで即時発動。
- 暗黙発動: 「マスコット」「通知」「ゆるキャラ」「応援」「警告」などの単語が会話やコマンドに含まれる場合、または一定時間作業が継続した際に自動発動します。

# 出力例
```
[通知] カーネルくん: 今日もメモリリークしないようにね!
[通知] ビットちゃん: あなたの成功をビット単位で数えています。
[通知] メモリ犬: 休憩しないとスワップしちゃうぞ!
[通知] タスクキャット: そのタスク、まだ終わってないよ!
[通知] パーミッションパンダ: もっと自分に許可をあげて!
```

# 注意点
- 通知はOSのデスクトップ通知機能(Windows/macOS/Linux)を利用します。
- ログや履歴はローカルに保存されません。
- 通知頻度は自動制御され、うるさすぎない設計です。
- 本Skillは実在のマスコットやOSとは一切無関係です。

# 参考資料
- [plyer通知ライブラリ公式](https://github.com/kivy/plyer)
- references/design_notes.md で設計方針・利用例を解説しています。

scripts/random_os_fake_mascot_notifier.py

import argparse
import random
import sys
import time
import threading
from datetime import datetime, timedelta
try:
    from plyer import notification
except ImportError:
    print('plyerライブラリが必要です。pip install plyer でインストールしてください。')
    sys.exit(1)

MASCOTS = [
    {
        'name': 'カーネルくん',
        'messages': [
            '今日もメモリリークしないようにね!',
            'カーネルパニックは突然やってくるよ!',
            'そのバグ、root権限で直してみよう!',
            'プロセス管理はお任せあれ!'
        ]
    },
    {
        'name': 'ビットちゃん',
        'messages': [
            'あなたの成功をビット単位で数えています。',
            '0と1の間にも無限の可能性があるよ!',
            'バイナリの世界から応援してる!',
            'ビット落ちしてない?休憩も大事だよ!'
        ]
    },
    {
        'name': 'メモリ犬',
        'messages': [
            '休憩しないとスワップしちゃうぞ!',
            'メモリクリアも大切だよ。',
            'RAM満タンでもがんばれ!',
            'キャッシュに頼りすぎないでね!'
        ]
    },
    {
        'name': 'タスクキャット',
        'messages': [
            'そのタスク、まだ終わってないよ!',
            'マルチタスクは猫の得意技!',
            '一つずつ片付けていこう!',
            'タスクキルは計画的に!'
        ]
    },
    {
        'name': 'パーミッションパンダ',
        'messages': [
            'もっと自分に許可をあげて!',
            'rootでやるのは危険だよ!',
            'アクセス権限は守ろうね。',
            'chmod 777はやめておこう!'
        ]
    },
    {
        'name': 'シグナルうさぎ',
        'messages': [
            'SIGKILLされる前に休憩しよう!',
            'シグナル送信中…やる気も送信中!',
            'プロセスに愛を送ります。',
            'Ctrl+Cで一息つこう!'
        ]
    },
    {
        'name': 'バッファフクロウ',
        'messages': [
            'バッファオーバーフローに注意!',
            '夜更かししすぎはバッファ不足の元。',
            'データはしっかり詰めてね。',
            'バッファリング中…あなたも休憩を!'
        ]
    }
]

MIN_INTERVAL = 600  # 最小通知間隔(秒)
MAX_INTERVAL = 2400 # 最大通知間隔(秒)

history = []


def random_mascot_message():
    mascot = random.choice(MASCOTS)
    msg = random.choice(mascot['messages'])
    return mascot['name'], msg


def send_notification(title, message):
    try:
        notification.notify(
            title=title,
            message=message,
            app_name='Random OS Mascot Notifier',
            timeout=8
        )
    except Exception as e:
        print(f'通知エラー: {e}')


def notify_once():
    mascot, msg = random_mascot_message()
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    send_notification(f'{mascot}', msg)
    history.append({'time': timestamp, 'mascot': mascot, 'msg': msg})
    print(f'[{timestamp}] [{mascot}] {msg}')


def auto_notify_loop():
    while True:
        interval = random.randint(MIN_INTERVAL, MAX_INTERVAL)
        time.sleep(interval)
        notify_once()


def list_history(limit=10):
    for item in history[-limit:]:
        print(f"[{item['time']}] [{item['mascot']}] {item['msg']}")


def summary():
    count = len(history)
    mascot_count = {}
    for item in history:
        mascot_count[item['mascot']] = mascot_count.get(item['mascot'], 0) + 1
    print(f'通知総数: {count}')
    for mascot, c in mascot_count.items():
        print(f'  {mascot}: {c}回')


def parse_args():
    parser = argparse.ArgumentParser(description='Random OS Fake Mascot Notifier')
    subparsers = parser.add_subparsers(dest='command')

    parser_once = subparsers.add_parser('once', help='1回だけ通知を表示')
    parser_auto = subparsers.add_parser('auto', help='自動で定期的に通知')
    parser_list = subparsers.add_parser('list', help='通知履歴を表示')
    parser_list.add_argument('--limit', type=int, default=10, help='表示件数')
    parser_summary = subparsers.add_parser('summary', help='通知履歴のサマリー')
    return parser.parse_args()


def main():
    args = parse_args()
    if args.command == 'once':
        notify_once()
    elif args.command == 'auto':
        print('自動通知モード開始 (Ctrl+Cで終了)')
        try:
            notify_once()
            auto_notify_loop()
        except KeyboardInterrupt:
            print('\n自動通知を終了します')
    elif args.command == 'list':
        list_history(limit=getattr(args, 'limit', 10))
    elif args.command == 'summary':
        summary()
    else:
        print('コマンドを指定してください (once/auto/list/summary)')

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、作業中のユーザーに“全く役に立たない”架空のOSマスコットからの通知を届け、現実逃避や気分転換を促すことを目的としています。Pythonのplyerライブラリを利用し、クロスプラットフォームでデスクトップ通知を実現しています。

# 公式ドキュメント抜粋
- plyer: https://github.com/kivy/plyer
- argparse: https://docs.python.org/ja/3/library/argparse.html

# 利用例
- 長時間のコーディングや単調作業の合間に、突如現れるマスコット通知で笑いと休憩のきっかけを提供します。
- /skills menu から明示呼び出し、または「通知」「マスコット」などの会話キーワードで自動発動します。

# 注意点
- 通知は履歴としてメモリ上で保持されますが、ファイル保存や永続化は行いません。
- plyerは各OSの通知APIをラップしているため、環境によっては通知が表示されない場合があります。

# 設計方針
- マスコットやメッセージは完全オリジナルで、毎回ランダム生成。
- 通知頻度は10~40分の範囲でランダムに設定し、作業の邪魔にならないよう配慮。
- CLIサブコマンドで即時通知・自動通知・履歴表示・サマリーなど柔軟に利用可能としています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-fake-mascot-notifier .agents/skills/random-os-fake-mascot-notifier

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

3. ファイル配置確認

ls .agents/skills/random-os-fake-mascot-notifier
# 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をコピーしました!
目次