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中に自然に混ざる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
