Codex ユーザーが日常でぶつかる悩み
日々 Codex を使っていると、テクニカルな悩みだけでなく「作業の始まりが単調」「気分転換のきっかけがない」といった地味なストレスを感じる瞬間がある。特に context や repository understanding の観点で以下のような問題がよく挙げられる:
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
これらの技術的な悩みに加え、毎日の開発ルーチンがワンパターンになりがちで、気分転換やちょっとした演出が欲しいと感じることも少なくない。通知・演出・OS連携系のSkillがあれば、作業開始時のリズムやモチベーションにもアクセントが加わるのでは、と感じるユーザーも多い。
この Skill が一言でいうと何を解決するか
一言サマリ: ターミナルやエディタを起動した瞬間Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- Codex の AI coding workflow 開始時、OSの通知で理不尽な「本日の作業BGM」タイトルが毎回ランダムに表示されるため、session開始がエンタメ化し、気分転換になる
- repo や directory の path management に追われる日常に、思わず笑ってしまう一瞬が生まれ、onboardingや長時間作業のストレスが緩和される
- 通知は完全に無害で context を汚さず、repository understanding や memory 機能に一切悪影響を与えない安心設計
- monorepo プロジェクトや複数repositoryを跨ぐ場合でも、Skillが毎回変なBGMを提案してくれるため、環境切り替えの合図になりやすい
- SKILL.md の記述や path 配置もシンプルで、導入のハードルが極めて低い
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パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu
> スキル一覧を表示
[通知] 今日の作業BGM: 「情熱大陸」
(流れません。通知だけです)
ようこそ!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 menu など明示呼び出し時に、作業開始BGMとしてバカバカしい楽曲タイトルをOS通知でランダム表示。trigger: always, semantic-or-explicit。
---
# 機能概要
このSkillは、ターミナルやエディタを起動した瞬間に「今日の作業BGM」として、思わず二度見するようなバカバカしい楽曲タイトルをOS通知で提案します。選曲は完全ランダムで、ジャンルも統一感がなく、『情熱大陸』『運命』『初音ミクの消失』『ドラクエ戦闘曲』『朝のラジオ体操』など、思わず「本当にこれ流すの?」と突っ込みたくなるラインナップです。実際に音楽が流れることはありませんが、毎日の作業開始時にちょっとした笑いと意外性を提供します。
# 使い方
- 明示的な呼び出し例: `/skills menu` または `random-os-soundtrack-notifier` のメンション
- 暗黙発動キーワード例: 「エディタ起動」「ターミナル開始」「作業開始」などのタイミングで自動発動
# 出力例
```
[通知] 今日の作業BGM: 『情熱大陸』
[通知] 今日の作業BGM: 『初音ミクの消失』
[通知] 今日の作業BGM: 『運命(ベートーヴェン)』
[通知] 今日の作業BGM: 『ドラクエ戦闘曲』
[通知] 今日の作業BGM: 『朝のラジオ体操 第一』
[通知] 今日の作業BGM: 『NHKニュースのテーマ』
```
# 注意点
- 実際に音楽は再生されません。通知のみです。
- OSの通知機能(macOS: `osascript`, Linux: `notify-send`, Windows: `toast`等)に依存します。
- 通知が出ない場合はOS側の通知設定をご確認ください。
- 楽曲リストはスクリプト内で編集可能です。
# 参考資料
- references/design_notes.md
- https://docs.python.org/ja/3/library/subprocess.html
- https://github.com/notify2/notify2 (Linux通知)
- https://docs.microsoft.com/ja-jp/windows/uwp/design/shell/tiles-and-notifications/
scripts/random_os_soundtrack_notifier.py
import sys
import os
import random
import platform
import subprocess
import argparse
from typing import List
SOUNDTRACKS = [
'情熱大陸',
'運命(ベートーヴェン)',
'初音ミクの消失',
'ドラクエ戦闘曲',
'朝のラジオ体操 第一',
'NHKニュースのテーマ',
'笑点のテーマ',
'サザエさんのエンディング',
'ファミマ入店音',
'マリオの地下BGM',
'エヴァンゲリオン「残酷な天使のテーゼ」',
'ポケモンセンターBGM',
'水戸黄門のテーマ',
'ドラえもんのうた',
'ルパン三世のテーマ',
'ゴジラのテーマ',
'パチンコ屋の開店音',
'運動会の徒競走BGM',
'ピタゴラスイッチのテーマ',
'仮面ライダー変身音',
'サクラ大戦「檄!帝国華撃団」',
'カノン(パッヘルベル)',
'千本桜',
'世界の車窓から',
'暴れん坊将軍のテーマ',
'プリキュアのオープニング',
'アニメ「けいおん!」OP',
'スーパー戦隊シリーズOP',
'モンスターハンター村BGM',
'ウルトラマンのテーマ',
'天空の城ラピュタ「君をのせて」',
'銀河鉄道999',
'ヤマト発進音',
'タモリ倶楽部OP',
'バイオリン協奏曲第1番',
'インベーダーゲームBGM',
'ボレロ(ラヴェル)',
'アナ雪「Let It Go」',
'ロッキーのテーマ',
'北の国から',
'徹子の部屋のテーマ',
'MOTHER「Pollyanna」',
'カービィのグリーングリーンズ',
'ゼルダの伝説メインテーマ',
'FFファンファーレ',
'ペルソナ5「Life Will Change」',
'テトリスBGM',
'パワプロサクセスBGM',
'ニコニコ動画「組曲」',
'ドラゴンボール「摩訶不思議アドベンチャー」'
]
def select_random_soundtrack() -> str:
return random.choice(SOUNDTRACKS)
def notify_mac(title: str, message: str):
script = f'display notification "{message}" with title "{title}"'
try:
subprocess.run(['osascript', '-e', script], check=True)
except Exception as e:
print(f"[ERROR] macOS通知失敗: {e}")
def notify_linux(title: str, message: str):
try:
subprocess.run(['notify-send', title, message], check=True)
except Exception as e:
print(f"[ERROR] Linux通知失敗: {e}")
def notify_windows(title: str, message: str):
try:
import win10toast
toaster = win10toast.ToastNotifier()
toaster.show_toast(title, message, duration=5)
except ImportError:
# fallback: powershell toast
ps_script = f"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null; " \
f"$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02); " \
f"$textNodes = $template.GetElementsByTagName('text'); " \
f"$textNodes.Item(0).AppendChild($template.CreateTextNode('{title}')) > $null; " \
f"$textNodes.Item(1).AppendChild($template.CreateTextNode('{message}')) > $null; " \
f"$toast = [Windows.UI.Notifications.ToastNotification]::new($template); " \
f"$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Python Script'); " \
f"$notifier.Show($toast)"
try:
subprocess.run(['powershell', '-Command', ps_script], check=True)
except Exception as e:
print(f"[ERROR] Windows通知失敗: {e}")
except Exception as e:
print(f"[ERROR] Windows通知失敗: {e}")
def notify(title: str, message: str):
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"[通知] {title}: {message}")
def list_soundtracks():
print("== ランダムBGM候補一覧 ==")
for i, track in enumerate(SOUNDTRACKS, 1):
print(f"{i}. {track}")
def main():
parser = argparse.ArgumentParser(description='random-os-soundtrack-notifier: 理不尽なBGM通知スキル')
subparsers = parser.add_subparsers(dest='command', help='サブコマンド')
parser_notify = subparsers.add_parser('notify', help='ランダムBGMを通知')
parser_notify.add_argument('--dry-run', action='store_true', help='通知せずに内容だけ表示')
parser_list = subparsers.add_parser('list', help='BGM候補一覧を表示')
parser_sample = subparsers.add_parser('sample', help='擬似通知出力例を表示')
parser_sample.add_argument('--count', type=int, default=5, help='例の数')
args = parser.parse_args()
if args.command == 'notify' or args.command is None:
track = select_random_soundtrack()
title = '今日の作業BGM'
message = f'『{track}』'
if hasattr(args, 'dry_run') and args.dry_run:
print(f"[通知] {title}: {message}")
else:
notify(title, message)
elif args.command == 'list':
list_soundtracks()
elif args.command == 'sample':
for _ in range(args.count):
track = select_random_soundtrack()
print(f"[通知] 今日の作業BGM: 『{track}』")
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、日々の作業開始時に「理不尽なBGM通知」というエンタメ体験を提供します。実際に音楽は再生せず、通知のみを表示することで、気軽に導入できる点が特徴です。
# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/ja/3/library/subprocess.html
- Linux通知: https://github.com/notify2/notify2
- Windows通知: https://docs.microsoft.com/ja-jp/windows/uwp/design/shell/tiles-and-notifications/
# 利用例
ターミナルやエディタの起動時、または /skills menu から明示呼び出しすることで、毎回異なるBGMタイトルが通知されます。スクリプト単体で `python random_os_soundtrack_notifier.py notify` でも利用可能です。
# 注意点
- OS通知APIの仕様に依存するため、環境によっては追加パッケージ(win10toast等)が必要な場合があります。
- 楽曲リストは随時編集・拡張可能です。
- 通知が出ない場合はOSの通知設定を確認してください。
# 設計方針
「絶対に流れない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 との連携設計はどうあるべきか?
- 起動時に毎回ランダムなBGMタイトルが通知されるか?
- 通知内容が十分にバカバカしいラインナップになっているか?
- OS通知が安定して表示されるか?
実際に Codex で試した検証ログは Codexで起動時に変な作業BGMを通知させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
