Codex ユーザーが日常でぶつかる悩み
Codex を日常的に使っていると、便利さの裏で「ちょっとしたストレス」や「集中力の途切れ」を感じる瞬間が意外と多いものです。特に、通知・演出・OS連携まわりの体験は、真面目な開発フローの中で無味乾燥になりがちです。具体的には、次のような「あるある」が挙げられます。
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
また、黙々と作業していると「ちょっとした遊び心」や「意表を突く演出」が欲しくなる瞬間も。通知や演出の機能が単調だと、どうしても集中力が途切れがちです。そんな時、何か「意味不明だけど笑える」体験があれば…という思いを抱く人も多いのではないでしょうか。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは作業中に突如『謎のOS伝説アイテムドロップ通知』をデスクトップやターミナルに爆誕させますSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 作業中に突然、「伝説のスペースキー+5」や「謎のUSBメモリ(未鑑定)」など、意味不明なレジェンダリーアイテム通知が現れ、集中力にちょっとした揺さぶりを加えられる
- Codex の AI coding workflow に意外性と遊び心が加わり、単調な path management や repository understanding の空気を一変できる
- onboarding や session 再開時、堅苦しい context の説明が続く中で「一瞬だけ全員が笑顔になる」ブレイクタイムを演出できる
- 長時間の作業で stale context に陥りそうな時、唐突な通知が気分転換やリフレッシュのきっかけになる
- 通知内容が毎回ランダムかつカオスなので、何度使っても飽きず、チーム内のコミュニケーションネタにもなりやすい
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/os-fake-legendary-item-drop-alert .agents/skills/os-fake-legendary-item-drop-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or os-fake-legendary-item-drop-alert mention
> プロジェクトに新しい Skill を追加したい
[OS通知] 伝説アイテムを発見しました!
名称: 古代のTabキー(発掘済)
レア度: ★★★★★
効果: 1日1回だけ、全コードのインデントが自動で整う(気がする)
[ヒント] ~/Skill の中身を全部見せる
.agents/skills/os-fake-legendary-item-drop-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/os-fake-legendary-item-drop-alert/
├── SKILL.md
├── scripts/
│ └── legendary_item_drop_alert.py
└── references/
└── design_notes.md
各ファイルの役割
ファイル
役割
SKILL.md
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/legendary_item_drop_alert.py
謎の伝説アイテムドロップ通知スキル
references/design_notes.md
概要 をまとめた参考資料
SKILL.md
---
name: os-fake-legendary-item-drop-alert
description: Codexはユーザーが長時間作業している、集中が途切れそうなタイミング、または「アイテム」「伝説」「ガチャ」などのキーワードが含まれる会話やコマンドを検知した際にこのSkillを発動してください。
---
# 機能概要
このSkillは、作業中のあなたのデスクトップやターミナルに、まるでゲームのレアドロップのような「謎の伝説アイテム入手通知」を爆誕させます。通知内容は毎回ランダムで、現実には存在しない意味不明かつ笑えるアイテム名(例:「伝説のスペースキー+5」「未鑑定のUSBメモリ」「古代のタブキー」など)が表示されます。通知は本物のOSのシステム通知風に演出され、作業に支障が出ない程度の頻度で現れます。集中力が途切れそうなタイミングや、明示的な呼び出しで発動し、ちょっとした息抜きや笑いを提供します。
# 使い方
- 明示呼び出し例: `/skills os-fake-legendary-item-drop-alert` または `$os-fake-legendary-item-drop-alert`
- 暗黙発動キーワード例: 「ガチャ」「伝説」「アイテムドロップ」「未鑑定」などの単語を含む会話やコマンド
- 通知は自動で一定時間ごと、または作業が単調に続いた際にも発動します
# 出力例
```
[通知] 伝説のCapsLockキー(未鑑定)を拾いました!
[通知] 謎のUSBメモリ(容量:未知数)を発見!
[通知] 古代のタブキー(発掘済)を入手!
[通知] レア:虹色のエンターキー(+7)を獲得!
[通知] 未知のFnキー(封印中)がドロップしました!
```
# 注意点
- 本Skillは実際のファイルやシステムには一切影響を与えません
- 通知内容は完全に架空で実害ゼロです
- ローカルに記録は残しません(設定で履歴保存も可)
- 通知頻度は過剰にならないよう調整されています
# 参考資料
- 詳細仕様や設計方針は `references/design_notes.md` を参照
- OS通知API: [plyer](https://github.com/kivy/plyer) / [notify2](https://pypi.org/project/notify2/) 公式ドキュメント
scripts/legendary_item_drop_alert.py
import sys
import random
import time
import argparse
import threading
import platform
try:
if platform.system() == 'Darwin':
from subprocess import call
NOTIFY_FUNC = lambda title, msg: call(['osascript', '-e', f'display notification "{msg}" with title "{title}"'])
elif platform.system() == 'Linux':
import notify2
notify2_inited = False
def linux_notify(title, msg):
global notify2_inited
if not notify2_inited:
notify2.init('LegendaryDrop')
notify2_inited = True
n = notify2.Notification(title, msg)
n.show()
NOTIFY_FUNC = linux_notify
elif platform.system() == 'Windows':
from win10toast import ToastNotifier
toaster = ToastNotifier()
NOTIFY_FUNC = lambda title, msg: toaster.show_toast(title, msg, duration=5, threaded=True)
else:
NOTIFY_FUNC = lambda title, msg: print(f"[通知] {title}: {msg}")
except Exception as e:
NOTIFY_FUNC = lambda title, msg: print(f"[通知] {title}: {msg}")
ITEM_PREFIXES = [
"伝説の", "謎の", "未鑑定の", "古代の", "虹色の", "レア:", "封印された", "未知の", "呪われた", "祝福された"
]
ITEM_NAMES = [
"スペースキー", "エンターキー", "タブキー", "CapsLockキー", "Fnキー", "USBメモリ", "マウスホイール", "テンキー", "F5キー", "NumLockキー"
]
ITEM_SUFFIXES = [
"(未鑑定)", "(発掘済)", "(+5)", "(+7)", "(容量:未知数)", "(封印中)", "(虹色)", "(呪われている)", "(祝福済)", ""
]
DROP_MESSAGES = [
"{item}を拾いました!",
"{item}を発見!",
"{item}を入手!",
"{item}がドロップしました!",
"{item}を獲得!"
]
HISTORY = []
HISTORY_LIMIT = 50
def generate_item():
prefix = random.choice(ITEM_PREFIXES)
name = random.choice(ITEM_NAMES)
suffix = random.choice(ITEM_SUFFIXES)
item = f"{prefix}{name}{suffix}"
return item
def generate_message():
item = generate_item()
msg_template = random.choice(DROP_MESSAGES)
return msg_template.format(item=item)
def notify_drop():
msg = generate_message()
HISTORY.append(msg)
if len(HISTORY) > HISTORY_LIMIT:
HISTORY.pop(0)
NOTIFY_FUNC("アイテムドロップ通知", msg)
print(f"[通知] {msg}")
def drop_loop(interval, stop_event):
while not stop_event.is_set():
notify_drop()
for _ in range(int(interval * 10)):
if stop_event.is_set():
break
time.sleep(0.1)
def list_history():
if not HISTORY:
print("まだアイテムドロップ履歴はありません。")
return
print("== アイテムドロップ履歴 ==")
for i, msg in enumerate(HISTORY[-HISTORY_LIMIT:], 1):
print(f"{i:02d}: {msg}")
def summary():
print(f"== ドロップ数: {len(HISTORY)} ==")
counts = {}
for msg in HISTORY:
for name in ITEM_NAMES:
if name in msg:
counts[name] = counts.get(name, 0) + 1
for name, cnt in sorted(counts.items(), key=lambda x: -x[1]):
print(f"{name}: {cnt}回")
def main():
parser = argparse.ArgumentParser(description='謎の伝説アイテムドロップ通知スキル')
subparsers = parser.add_subparsers(dest='command')
parser_log = subparsers.add_parser('log', help='一定間隔でアイテムドロップ通知を発生させる')
parser_log.add_argument('--interval', type=float, default=900, help='通知間隔(秒)。デフォルト15分')
parser_log.add_argument('--count', type=int, default=0, help='通知回数。0なら無限')
parser_once = subparsers.add_parser('once', help='1回だけアイテムドロップ通知を発生')
parser_list = subparsers.add_parser('list', help='ドロップ履歴を表示')
parser_summary = subparsers.add_parser('summary', help='アイテム別ドロップ数サマリ')
args = parser.parse_args()
if args.command == 'log':
stop_event = threading.Event()
def stop_after_count():
if args.count > 0:
for _ in range(args.count):
if stop_event.is_set():
break
notify_drop()
for _ in range(int(args.interval * 10)):
if stop_event.is_set():
break
time.sleep(0.1)
stop_event.set()
t = threading.Thread(target=stop_after_count)
t.start()
try:
while t.is_alive():
t.join(1)
except KeyboardInterrupt:
stop_event.set()
print("\n[終了] ドロップ通知を停止しました。")
elif args.command == 'once':
notify_drop()
elif args.command == 'list':
list_history()
elif args.command == 'summary':
summary()
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、作業中のユーザーに対して突発的に「伝説のアイテムドロップ通知」を発生させることで、ちょっとした笑いや息抜きを提供することを目的としています。現実世界のガチャ演出をOS通知で再現し、作業の単調さを和らげます。
# 公式ドキュメント抜粋
- plyer: https://github.com/kivy/plyer
- notify2: https://pypi.org/project/notify2/
- win10toast: https://pypi.org/project/win10toast/
# 利用例
- 長時間のコーディングや単調な作業中に、定期的にアイテムドロップ通知を表示
- 明示的なコマンド呼び出しで即座に通知を発生
- 履歴やサマリ表示で過去のドロップを振り返り、ちょっとした話題作りにも
# 注意点
- 通知内容は完全に架空であり、実際のファイルやシステムには影響を与えません
- 過剰な通知で作業妨害にならないよう、デフォルトの通知間隔や回数は控えめに設計されています
# 設計方針
- OSごとに適切な通知APIを自動選択し、本物のシステム通知風に演出
- アイテム名や通知文は毎回ランダム生成し、カオスかつ笑える内容を重視
- 履歴やサマリ機能を備え、ユーザーがドロップ結果を楽しめるようにしています
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit 実行に必要)
- Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/os-fake-legendary-item-drop-alert .agents/skills/os-fake-legendary-item-drop-alert
.agents/skills/os-fake-legendary-item-drop-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/os-fake-legendary-item-drop-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 との連携設計はどうあるべきか?
- 通知が本物っぽく演出されているか?
- アイテム名が毎回カオスかつ笑える内容になっているか?
- 通知頻度やタイミングが作業妨害になりすぎていないか?
実際に Codex で試した検証ログは Codexで謎の伝説アイテム通知を爆誕させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
