Codex ユーザーが日常でぶつかる悩み
AI Coding Agent「Codex」を日常的に使っていると、ちょっとした“演出”や“気分転換”が欲しくなる瞬間は意外と多いものです。特に、集中して長時間作業していると、淡々とした開発体験が続き、リフレッシュや遊び心が不足しがちです。さらに、Codex の context 管理や repository understanding のクセも重なって、こんな悩みが生まれます:
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
また、「開発現場がまじめすぎて、たまには無駄な演出で気分を変えたい」「OS通知を使ったちょっとしたサプライズが欲しい」と思うことも。通知・演出・OS連携系のSkillが、こうした日常の“マンネリ”や“説明疲れ”を和らげてくれる場面は少なくありません。
この Skill が一言でいうと何を解決するか
一言サマリ: ターミナルやエディタを起動した瞬間Skill。
このSkillは、Codexを使った開発体験に“無駄な遊び心”を注入します。具体的には、ターミナルやエディタを立ち上げた直後、OSの通知機能を使って「今日の作業BGM」としてランダムなサウンドトラック(しかもジャンルはカオス!)を提案。repoやdirectoryのcontext説明に疲れたタイミングで、思わずクスッとする通知が届きます。
- 開発session開始時に、context説明やpath managementに追われる気分を和らげる“無駄な演出”を自動で挿入
- 毎回異なるBGMタイトルで、onboardingやmonorepo移動時の“説明疲れ”にちょっとしたリフレッシュを提供
- AI coding workflowの冒頭に“意味のない通知”で遊び心をプラス、長時間作業のマンネリ打破に貢献
- Skillの通知はcontextやmemoryを圧迫せず、実際のBGM再生や外部API呼び出しを行わない安全設計
- 「通知・演出・OS連携」カテゴリの中でも、実用性をあえて度外視した“本気の無駄”を体験できる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-soundtrack-notifier .agents/skills/random-os-soundtrack-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or random-os-soundtrack-notifier mention
> 今日から新しいプロジェクトで作業開始
[OS通知] あなたの本日の作業BGMはこちら:
「なつかしのファミコン効果音メドレー」
選曲理由: 特にありません。気分でどうぞ。
(通知は1回のみ表示されます)
> cd src/
> # 以降、通常の開発フローへ
シーン2: monorepo / package 跨ぎ作業時
> cd packages/api
[OS通知] 今日のBGM: 「宇宙戦艦発進テーマ (謎のリミックス版)」
作業の集中力が宇宙規模に…なるかもしれません。
> ls
index.ts utils.ts README.md
> # 通常の作業続行
シーン3: お遊び的な使い方
> /skills menu
[OS通知] 今日の作業BGM: 「朝礼のチャイム(校内放送風)」
気分転換にどうぞ。作業効率の向上は保証しません。
> # 何度呼び出してもBGMタイトルは毎回ランダム
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 作業開始時に“無駄な通知”でリフレッシュ |
発動方式
明示呼び出し (/skills menu or random-os-soundtrack-notifier mention) と暗黙発動 (起動時やディレクトリ移動時の自動トリガー) の両方に対応。
Skill の中身を全部見せる
.agents/skills/random-os-soundtrack-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-soundtrack-notifier/
├── SKILL.md
├── scripts/
│ └── random_os_soundtrack_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_soundtrack_notifier.py |
random-os-soundtrack-notifier: あなたの今日の作業BGMをランダム通知 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-soundtrack-notifier
description: ターミナルやエディタの起動時、または /skills コマンドや skill名で明示的に呼び出された際に、完全ランダムな“今日の作業BGM”をOS通知で1回だけ表示します。通知内容やタイミングが毎回異なることが特徴です。
---
# 機能概要
random-os-soundtrack-notifier は、あなたがターミナルやエディタを起動した瞬間や、/skills menu などで明示的に呼び出した時に、“今日の作業BGM”を完全ランダムでOS通知として提案します。BGMは「なつかしのファミコン効果音」「宇宙戦艦発進テーマ」「朝礼のチャイム」など、作業に全く関係ないタイトルばかり。開発現場に無駄な演出を加え、集中力をかき乱すための本気のジョークSkillです。実際のBGM再生や外部API呼び出しは一切行わず、通知のみで完結します。
# 使い方
- 明示的呼び出し例: `/skills random-os-soundtrack-notifier` または `$ random-os-soundtrack-notifier`
- 暗黙発動: 「ターミナル起動」「エディタ起動」「/skills menu」などのイベント時に自動で1回だけ発動
- 通知は1回のみ表示され、連続発動はしません
# 出力例
```terminal
[OS通知] あなたの今日の作業BGM: 宇宙戦艦発進テーマ
[OS通知] あなたの今日の作業BGM: なつかしのファミコン効果音
[OS通知] あなたの今日の作業BGM: 朝礼のチャイム
[OS通知] あなたの今日の作業BGM: 伝説のRPGセーブポイント
[OS通知] あなたの今日の作業BGM: 早朝の商店街BGM
```
# 注意点
- BGMはタイトルのみで、実際の音楽再生やファイル保存はありません
- 毎回ランダムなタイトルが選ばれますが、同じセッション内で重複する可能性もあります
- OS通知機能は Linux (notify-send), macOS (osascript), Windows (win10toast) に対応
# 参考資料
- references/design_notes.md 参照
- OS通知API: https://docs.python.org/ja/3/library/subprocess.html, https://github.com/jithurjacob/Windows-10-Toast-Notifications
- Skill設計方針や通知実装の詳細は references/design_notes.md を参照してください
scripts/random_os_soundtrack_notifier.py
import sys
import os
import random
import argparse
import platform
import subprocess
import threading
import time
BGM_TITLES = [
"なつかしのファミコン効果音",
"宇宙戦艦発進テーマ",
"朝礼のチャイム",
"伝説のRPGセーブポイント",
"早朝の商店街BGM",
"昭和の駅ホームメロディ",
"地下迷宮の環境音",
"謎の工場アラーム",
"温泉旅館の夕食ベル",
"バブル期のCMジングル",
"放課後のチャイム",
"無人島サバイバルBGM",
"都市伝説のBGM",
"深夜のラジオジングル",
"謎のゲームオーバー曲"
]
NOTIFY_LOCK = threading.Lock()
NOTIFIED_ONCE = False
def pick_random_bgm():
return random.choice(BGM_TITLES)
def notify_mac(title, message):
script = f'display notification "{message}" with title "{title}"'
try:
subprocess.run(["osascript", "-e", script], check=True)
except Exception as e:
print(f"[WARN] macOS通知失敗: {e}")
def notify_linux(title, message):
try:
subprocess.run(["notify-send", title, message], check=True)
except Exception as e:
print(f"[WARN] Linux通知失敗: {e}")
def notify_windows(title, message):
try:
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast(title, message, duration=5, threaded=True)
# Wait for notification to disappear
time.sleep(5)
except ImportError:
print("[WARN] win10toast未インストール。pip install win10toast で導入してください。")
except Exception as e:
print(f"[WARN] Windows通知失敗: {e}")
def send_os_notification(title, message):
system = platform.system()
if system == "Darwin":
notify_mac(title, message)
elif system == "Linux":
notify_linux(title, message)
elif system == "Windows":
notify_windows(title, message)
else:
print(f"[INFO] OS通知未対応: {system}")
def show_random_bgm_notification():
global NOTIFIED_ONCE
with NOTIFY_LOCK:
if NOTIFIED_ONCE:
return False
bgm = pick_random_bgm()
title = "あなたの今日の作業BGM"
send_os_notification(title, bgm)
print(f"[OS通知] {title}: {bgm}")
NOTIFIED_ONCE = True
return True
def reset_notification():
global NOTIFIED_ONCE
with NOTIFY_LOCK:
NOTIFIED_ONCE = False
def list_bgm_titles():
print("--- BGMタイトル一覧 ---")
for idx, title in enumerate(BGM_TITLES, 1):
print(f"{idx}. {title}")
def summary():
print("random-os-soundtrack-notifier: ターミナルやエディタ起動時に、完全ランダムな“今日の作業BGM”をOS通知で1回だけ表示します。通知はタイトルのみで、実際のBGM再生はありません。")
def main():
parser = argparse.ArgumentParser(description="random-os-soundtrack-notifier: あなたの今日の作業BGMをランダム通知")
subparsers = parser.add_subparsers(dest="command")
parser_notify = subparsers.add_parser("notify", help="ランダムBGMをOS通知で1回表示")
parser_reset = subparsers.add_parser("reset", help="通知済みフラグをリセット")
parser_list = subparsers.add_parser("list", help="BGMタイトル一覧を表示")
parser_summary = subparsers.add_parser("summary", help="Skillの概要を表示")
args = parser.parse_args()
if args.command == "notify" or args.command is None:
show_random_bgm_notification()
elif args.command == "reset":
reset_notification()
print("通知済みフラグをリセットしました。")
elif args.command == "list":
list_bgm_titles()
elif args.command == "summary":
summary()
else:
parser.print_help()
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
random-os-soundtrack-notifier は、作業開始時や明示コマンドで、完全に無関係なBGMタイトルをOS通知で1回だけ表示するSkillです。実用性よりも“無駄な演出”を重視し、開発現場に遊び心を提供します。
# 公式ドキュメント抜粋
- macOS通知: AppleScript (osascript) を subprocess で呼び出し
- Linux通知: notify-send コマンド
- Windows通知: win10toast ライブラリ (pip install win10toast)
# 利用例
- ターミナル起動時に自動で「あなたの今日の作業BGM: 朝礼のチャイム」などが通知される
- /skills menu で明示的に呼び出し、毎回異なるBGMタイトルを楽しむ
# 注意点
- 実際のBGM再生や外部API呼び出しは行いません
- 通知は1回のみ。連続起動時や明示コマンド時も、同一セッション中は再通知されません (resetで解除可)
- OS通知が未対応の環境では標準出力のみ
# 設計方針
- Skill本体はPythonで実装し、クロスプラットフォーム対応
- サブコマンドで通知・リスト表示・リセット・概要表示を提供
- BGMタイトルは拡張/差し替えが容易なリスト構造
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-soundtrack-notifier .agents/skills/random-os-soundtrack-notifier
.agents/skills/random-os-soundtrack-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-soundtrack-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 との連携設計はどうあるべきか?
- 通知が起動ごとに1回だけ表示されるか?
- BGMタイトルが毎回ランダムかつユニークであるか?
- 実際のBGM再生や外部API呼び出しを行わず、純粋に通知だけで完結しているか?
実際に Codex で試した検証ログは Codexで起動時にランダムBGM通知を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
