Codex ユーザーが日常でぶつかる悩み
AI コーディングワークフローにどっぷり浸かっていると、集中が切れる瞬間や、単調な作業が続くタイミングで「何か気分転換になる刺激が欲しい」と感じることが意外と多い。特に Codex を使っていると、以下のような「あるある」な悩みが生じがちだ:
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
また、通知や演出系 Skill が不足しているため、作業の合間に「ちょっとした笑いや現実逃避」を提供してくれる機能が欲しいという声も多い。単調な directory や path management のやりとりばかりだと、どうしても気分が滅入ることがある。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の作業中にランダムなタイミングで「謎のOSカラオケ推奨通知」を炸裂させ、AI coding workflow に意図的な“現実逃避”と遊び心を持ち込むSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 長時間の repository understanding や path management の合間に、突如としてカオスな通知で気分転換できる
- monorepo で directory を行き来する際も、作業の単調さを和らげるユーモラスな演出が入る
- session の再開や onboarding 時に、堅苦しい context 設定ばかりでなく、遊び心ある通知が混じることでモチベーション維持に役立つ
- 通知内容が完全ランダムなため、毎回違った体験が得られ、AI coding workflow の“マンネリ感”を防げる
- Codex の context や repo 構造のやりとりに疲れたとき、意図的に現実逃避できるトリガーとして活用できる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-karaoke-alert .agents/skills/random-os-karaoke-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or random-os-karaoke-alert mention
> 今日から新しいプロジェクト開始、Codexも準備OK
[OS通知] 推奨曲:「残業パラダイス」
本日はリポジトリ全体に響き渡る熱唱を推奨します。
[OS通知] 歌唱力がアップデートされました
AIによる自動ハモリ機能が有効です。
(通知はランダムにタイミングをずらして数回表示)
シーン2: monorepo / package 跨ぎ作業時
> packages/core から packages/ui に移動
[OS通知] 推奨曲:「バグ退治ブルース」
新しいディレクトリでの作業開始を祝して一曲どうぞ。
[OS通知] 本日のOSカラオケタイム
「コミットの彼方へ」合唱をおすすめします。
(通知内容・タイミングは完全ランダム)
シーン3: お遊び的な使い方
> ちょっと休憩したい、何か面白いことは?
[OS通知] OSよりご提案
「仕様変更サンバ」を今すぐ熱唱してください。
[OS通知] あなたの歌唱力がリポジトリに記録されました
(もちろん実際には何も記録されません)
(通知は作業の合間や明示呼び出しで出現)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開。さらにカラオケ通知で和む |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識しつつ、突如カラオケ通知が現れて気分転換 |
| 長時間 workflow | long context で重要箇所が薄まる | 定期的にカラオケ通知で集中がリセットされ、workflowのリズムが生まれる |
発動方式
明示呼び出し (/skills menu or random-os-karaoke-alert mention) と暗黙発動 (説明文や作業内容にマッチ) の両方に対応。
Skill の中身を全部見せる
.agents/skills/random-os-karaoke-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-karaoke-alert/
├── SKILL.md
├── scripts/
│ └── random_os_karaoke_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_karaoke_alert.py |
random-os-karaoke-alert: OS風カラオケ推奨通知スクリプト |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-karaoke-alert
description: 作業中やコマンド実行時など、ユーザーが集中しているタイミングや明示的な呼び出し(/skills menu, random-os-karaoke-alert mention)時に、完全ランダムな内容のカラオケ推奨通知をデスクトップへ表示します。通知・演出・現実逃避のキーワードに反応。
---
# 機能概要
このSkillは、あなたの作業中やコマンド実行時など、ふとした瞬間にデスクトップへ“謎のOSカラオケ推奨通知”をランダムに表示します。通知の内容は毎回異なり、「推奨曲:バグ退治ブルース」「本日は“残業パラダイス”を熱唱してください」など、まるでOSがカラオケ好きになったかのような不条理な演出を楽しめます。現実逃避や気分転換を促し、作業の合間に笑いを提供します。
# 使い方
- 明示的な呼び出し:
- `/skills menu` から `random-os-karaoke-alert` を選択
- `$random-os-karaoke-alert` をメンション
- 暗黙的な発動:
- 「通知」「現実逃避」「カラオケ」「演出」などのキーワードを含む会話やコマンド実行時に自動発動
# 出力例
```
[通知] 推奨曲:バグ退治ブルース
[通知] 本日は“残業パラダイス”を熱唱してください
[通知] 歌唱力がアップデートされました
[通知] OSはあなたのカラオケ魂を検出しました
[通知] 推奨ジャンル:昭和アニソンメドレー
```
# 注意点
- 通知は完全にランダムなタイミングで表示されます
- 通知内容は最低5パターン以上をランダム選択します
- データ損失やファイル破壊、システム設定の変更は一切行いません
- ローカル環境のみに通知を表示し、外部送信はありません
# 参考資料
- references/design_notes.md に設計方針・利用例を記載
- 通知API: https://docs.python.org/ja/3/library/subprocess.html, https://pypi.org/project/plyer/
scripts/random_os_karaoke_alert.py
import sys
import argparse
import random
import time
import threading
import platform
import subprocess
try:
from plyer import notification
PLYER_AVAILABLE = True
except ImportError:
PLYER_AVAILABLE = False
NOTIFICATIONS = [
'推奨曲:バグ退治ブルース',
'本日は“残業パラダイス”を熱唱してください',
'歌唱力がアップデートされました',
'OSはあなたのカラオケ魂を検出しました',
'推奨ジャンル:昭和アニソンメドレー',
'今すぐ「仕様書のブルース」を熱唱しましょう',
'あなたのカラオケランキングが上昇しました',
'OSの気分:今日はカラオケ日和',
'推奨アクション:エアマイク準備',
'現実逃避モードがONになりました'
]
LOG_FILE = 'karaoke_alert.log'
def show_notification(message):
system = platform.system()
if PLYER_AVAILABLE:
notification.notify(
title='[通知] OSカラオケ推奨',
message=message,
app_name='random-os-karaoke-alert',
timeout=7
)
else:
if system == 'Darwin':
subprocess.run([
'osascript', '-e', f'display notification "{message}" with title "OSカラオケ推奨"'
])
elif system == 'Linux':
subprocess.run([
'notify-send', 'OSカラオケ推奨', message])
elif system == 'Windows':
# fallback: print to console
print(f'[通知] {message}')
else:
print(f'[通知] {message}')
def log_notification(message):
with open(LOG_FILE, 'a', encoding='utf-8') as f:
f.write(f'{time.strftime("%Y-%m-%d %H:%M:%S")} {message}\n')
def random_alert_loop(min_interval=600, max_interval=3600, stop_event=None):
while not (stop_event and stop_event.is_set()):
interval = random.randint(min_interval, max_interval)
time.sleep(interval)
msg = random.choice(NOTIFICATIONS)
show_notification(msg)
log_notification(msg)
def list_log():
try:
with open(LOG_FILE, 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines[-20:]:
print(line.strip())
except FileNotFoundError:
print('ログがありません。')
def summary_log():
try:
with open(LOG_FILE, 'r', encoding='utf-8') as f:
lines = f.readlines()
count = len(lines)
print(f'通知履歴: {count}件')
freq = {}
for line in lines:
for msg in NOTIFICATIONS:
if msg in line:
freq[msg] = freq.get(msg, 0) + 1
for msg, cnt in sorted(freq.items(), key=lambda x: -x[1]):
print(f'{msg}: {cnt}回')
except FileNotFoundError:
print('ログがありません。')
def run_once():
msg = random.choice(NOTIFICATIONS)
show_notification(msg)
log_notification(msg)
print(f'[通知] {msg}')
def main():
parser = argparse.ArgumentParser(description='random-os-karaoke-alert: OS風カラオケ推奨通知スクリプト')
subparsers = parser.add_subparsers(dest='command')
parser_alert = subparsers.add_parser('alert', help='1回だけ通知を表示')
parser_loop = subparsers.add_parser('loop', help='バックグラウンドでランダム通知')
parser_loop.add_argument('--min', type=int, default=600, help='最小間隔秒 (デフォルト600)')
parser_loop.add_argument('--max', type=int, default=3600, help='最大間隔秒 (デフォルト3600)')
parser_list = subparsers.add_parser('list', help='通知履歴を表示')
parser_summary = subparsers.add_parser('summary', help='通知履歴の集計')
args = parser.parse_args()
if args.command == 'alert':
run_once()
elif args.command == 'loop':
stop_event = threading.Event()
try:
print('ランダム通知モード開始 (Ctrl+Cで停止)')
random_alert_loop(args.min, args.max, stop_event)
except KeyboardInterrupt:
stop_event.set()
print('\n停止しました。')
elif args.command == 'list':
list_log()
elif args.command == 'summary':
summary_log()
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
random-os-karaoke-alertは、ユーザーの作業中に完全ランダムなタイミングでユーモラスなカラオケ推奨通知を表示するスキルです。現実逃避や気分転換を促し、作業環境に遊び心を加えます。
# 公式ドキュメント抜粋
- plyer通知API: https://plyer.readthedocs.io/en/latest/
- macOS通知: https://ss64.com/osx/osascript.html
- Linux notify-send: https://specifications.freedesktop.org/notification-spec/latest/
# 利用例
- 明示呼び出し: `python random_os_karaoke_alert.py alert`
- バックグラウンド: `python random_os_karaoke_alert.py loop --min 300 --max 900`
- 履歴確認: `python random_os_karaoke_alert.py list`
# 注意点
- 通知はローカル環境のみに表示され、外部送信やシステム設定変更は行いません。
- plyer未導入の場合はOS標準通知APIを利用、それも不可ならコンソール出力にフォールバックします。
# 設計方針
- 完全なランダム性と多様な通知文で飽きさせない体験を重視
- 履歴ログ機能で通知の振り返りや集計も可能
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-karaoke-alert .agents/skills/random-os-karaoke-alert
.agents/skills/random-os-karaoke-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-karaoke-alert
# SKILL.md, scripts/, references/, README.md があればOK
4. Codex を再起動 (or Skill 自動検出を待つ)
新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or random-os-karaoke-alert mention と Skill 名で出てきます。
5. 動作確認
/skills menu or random-os-karaoke-alert 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
- 通知頻度のバランス: 通知が多すぎると逆に作業の妨げになる可能性
- 通知内容の多様性: パターンが少ないと飽きるため、最低5パターン以上のバリエーションが必要
試す前に確かめたいこと
この Skill を実運用に投入する前に確かめたい問いを並べる:
- 実 repo での token 消費は許容範囲か?
- monorepo (packages 多数) で安定して動くか?
- stale context にならず、長時間 workflow でも有効か?
- AGENTS.md との連携設計はどうあるべきか?
- 通知が本当にランダムなタイミングで現れるか?
- 通知文が毎回異なるか(最低5パターン以上)?
- データ損失や環境破壊を一切引き起こさないか?
実際に Codex で試した検証ログは Codexで謎のOSカラオケ通知をランダムに表示してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
