Codex ユーザーが日常でぶつかる悩み
AI coding workflow を日々回していると、どうしても作業が無機質になりがちです。特に Codex のような高機能エージェントを使っていると、黙々と repository の構造整理や path management、context の調整に追われ、気づけば数時間無言で画面と向き合っていた…ということも。「集中できるのは良いけど、なんだか張り詰めすぎ」「ちょっとした息抜きや遊び心が欲しい」と思ったことはありませんか?
- 黙々と作業していると、緊張感や沈黙が逆にストレスになり workflow が単調化
- Codex の通知や演出がほぼ無いので、session の区切りや repository understanding の切り替えが味気ない
- monorepo で大規模な directory 構造を扱うと、作業の節目が分かりにくく「今どこ?」感が強まる
- 長時間の long context 作業で、気分転換やリズムチェンジのきっかけが無い
- 新しい repo onboarding 時、何かユニークな演出やジョークでチームの空気を和ませたい
通知・演出・OS連携的な遊びが欲しい…そんな「あるある」を感じたことがあるなら、今回の Skill 提案は要チェックです。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の作業空間に「謎のOS公式サウンドトラック通知」というシュールな演出を爆誕させるSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 作業やコマンド実行のたびに、完全オリジナルな「本日のテーマソング」通知が表示され、緊張感や沈黙を和らげる遊び心が加わる
- 通知の内容が毎回異なり、repository や directory の context にひねりの効いたネタが混ざるため、onboarding や session 切り替えのタイミングで場が和む
- 実際にBGMや音は流れず、workflow の邪魔にならないが、Codex の通知演出として独特の存在感を発揮
- monorepo や大規模 repo でも、パッケージ名や path を絡めた曲名で repository understanding のきっかけになる
- Skill の導入・解除もワンコマンドで簡単、必要な時だけ即座に遊び心を注入できる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-fake-soundtrack-alert .agents/skills/random-os-fake-soundtrack-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu
> スキル一覧を表示
[OS通知] 本日のテーマソング: 『バグ修羅場行進曲』
副題: "全てのエラーは夜に鳴く"
(公式サウンドトラックは再生されません)
[OS通知] 今日のBGM: 『main.pyの悲哀』
副題: "import地獄からの生還"
(音声は流れませんのでご安心ください)
シーン2: monorepo / package 跨ぎ作業時
> packages/api/ ディレクトリに移動
[OS通知] 今こそ流せ!『納期デッドヒート』
副題: "api/router/ で踊るデプロイ前夜"
(サウンドトラックはイメージです)
> packages/frontend/ へ切り替え
[OS通知] 本日のテーマソング: 『無限リロード・シンフォニー』
副題: "build/assets/ 迷宮より"
(音は流れません)
シーン3: お遊び的な使い方
> ちょっと気分転換したい
[OS通知] 今日のBGM: 『コミットメッセージの憂鬱』
副題: "feat: それはいつも突然に"
(実際のBGM再生はありません)
> /skills random-os-fake-soundtrack-alert
[OS通知] サウンドトラック: 『README.mdの深淵』
副題: "ドキュメントは眠らない"
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-soundtrack-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-fake-soundtrack-alert/
├── SKILL.md
├── scripts/
│ └── random_os_fake_soundtrack_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_fake_soundtrack_alert.py |
Random OS Fake Soundtrack Alert |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-soundtrack-alert
description: コマンド実行や作業中に、CodexはこのSkillを発動し、毎回異なる“謎のOS公式サウンドトラック通知”をデスクトップに表示します。明示呼び出し(/skills menuや$skill-name)や、作業・ビルド・デバッグ・コミット・pushなどのキーワードを検知した際に発動してください。
---
# 機能概要
このSkillは、作業やコマンド実行のたびに「本日のテーマソング:『バグ修羅場行進曲』」など、OS公式風の架空サウンドトラック通知をデスクトップに表示します。通知内容は完全オリジナルで、開発現場ネタや意味不明な曲名が毎回ランダム生成され、実際に音は流れません。作業中の緊張感や沈黙をシュールに打ち破る、ジョーク系の通知Skillです。
# 使い方
- 明示呼び出し例: `/skills menu` で選択、または `$random-os-fake-soundtrack-alert` メンション
- 暗黙発動キーワード例: コマンド実行、`build`/`commit`/`push`/`debug`/`run` などの操作時に自動発動
# 出力例
```
[通知] 本日のテーマソング:『バグ修羅場行進曲』
[通知] 今こそ流せ!『納期デッドヒート』
[通知] 公式推奨BGM:『深夜残業エチュード』
[通知] 今日の気分は『マージ地獄協奏曲』
[通知] システムより:『仕様変更ラプソディ』
```
# 注意点
- 通知は毎回異なる内容を生成しますが、実際に音楽やBGMは再生されません。
- 通知頻度は1分に1回までに制限され、過度な連続表示は抑制されます。
- ローカルに通知履歴や曲リストは保存されません。
- Linux/macOS/Windowsの標準通知APIを利用しますが、環境依存で通知が表示されない場合があります。
# 参考資料
- 詳細設計や生成アルゴリズムは`references/design_notes.md`を参照
- OS通知API: [plyer](https://github.com/kivy/plyer) (クロスプラットフォーム通知)
scripts/random_os_fake_soundtrack_alert.py
import sys
import argparse
import random
import time
import os
from datetime import datetime, timedelta
try:
from plyer import notification
except ImportError:
notification = None
THEMES = [
'バグ修羅場行進曲', '納期デッドヒート', '深夜残業エチュード', 'マージ地獄協奏曲',
'仕様変更ラプソディ', 'デバッグ無限ループ', 'レビュー地帯のワルツ', 'コンフリクト・カンタービレ',
'リリース前夜のセレナーデ', 'コミット乱舞', 'テスト失敗のバラード', 'リファクタリング幻想曲',
'依存地獄ソナタ', '会議地獄の夜想曲', 'CI/CDカーニバル', 'ペアプロ・パラダイス',
'スタックトレース・タンゴ', '仕様未定のブルース', 'コードレビュー葬送曲', '即席パッチポルカ',
'タスク消化マーチ', 'バージョンアップ・シンフォニー', 'リリース延期のエレジー', 'ドキュメント迷宮',
'ブラックスクリーン・サンバ', 'メモリリーク・カプリッチョ', 'エラー地帯のジプシー', 'タイムアウト・トッカータ',
'コミットメッセージ・コンチェルト', '無限ビルド・ブギウギ', '仕様書亡霊のセレナーデ', '進捗ゼロのアリア',
'バグ報告のカデンツァ', 'リファクタリング・ロンド', '会議室のフーガ', '夜明けのデプロイ',
'プルリク地獄', 'サーバーダウン・ラグタイム', '設計書の葬送曲', 'テストカバレッジ・メヌエット',
'コードスパゲッティ・ジグ', '仕様変更のレクイエム', 'リリース地獄のパヴァーヌ', 'コミット・カプリス',
'プロダクション恐怖の夜', '未読Slackのカンタータ', '緊急バグ修正のジグ', '夜間デバッグのパストラーレ',
'エンバグ・バロック', '仕様未定のカプリッチョ'
]
SUBTITLES = [
'本日のテーマソング', '今こそ流せ!', '公式推奨BGM', '今日の気分は',
'システムより', '開発現場応援曲', '本日の推し曲', 'OS公式サウンド',
'謎の推薦曲', '今日の一曲', '気分転換に', '作業用BGM', '運命の一曲',
'本日のミッション曲', 'エンジニア応援歌', '今日の気合曲', 'OSからの贈り物',
'今週のテーマ', '本日の迷曲', '謎の新曲'
]
NOTIFY_INTERVAL = 60 # seconds
LAST_NOTIFY_FILE = os.path.expanduser('~/.random_os_fake_soundtrack_last')
def can_notify():
try:
if os.path.exists(LAST_NOTIFY_FILE):
with open(LAST_NOTIFY_FILE, 'r') as f:
last = float(f.read().strip())
if time.time() - last < NOTIFY_INTERVAL:
return False
return True
except Exception:
return True
def update_last_notify():
try:
with open(LAST_NOTIFY_FILE, 'w') as f:
f.write(str(time.time()))
except Exception:
pass
def generate_alert():
subtitle = random.choice(SUBTITLES)
theme = random.choice(THEMES)
return f'{subtitle}:『{theme}』'
def send_notification(message):
if notification is not None:
try:
notification.notify(
title='[通知]',
message=message,
app_name='Fake OS Soundtrack',
timeout=5
)
return True
except Exception:
pass
# Fallback: print to stdout
print(f'[通知] {message}')
return False
def log_alert(message):
log_file = os.path.expanduser('~/.random_os_fake_soundtrack_log')
try:
with open(log_file, 'a') as f:
f.write(f'{datetime.now().isoformat()} {message}\n')
except Exception:
pass
def list_alerts():
log_file = os.path.expanduser('~/.random_os_fake_soundtrack_log')
if not os.path.exists(log_file):
print('履歴がありません。')
return
with open(log_file, 'r') as f:
for line in f:
print(line.strip())
def summary_alerts():
log_file = os.path.expanduser('~/.random_os_fake_soundtrack_log')
if not os.path.exists(log_file):
print('履歴がありません。')
return
from collections import Counter
themes = []
with open(log_file, 'r') as f:
for line in f:
for theme in THEMES:
if theme in line:
themes.append(theme)
c = Counter(themes)
print('よく出た曲トップ5:')
for theme, cnt in c.most_common(5):
print(f' {theme}: {cnt}回')
def main():
parser = argparse.ArgumentParser(description='Random OS Fake Soundtrack Alert')
subparsers = parser.add_subparsers(dest='command')
parser_log = subparsers.add_parser('log', help='最新の通知を出す')
parser_list = subparsers.add_parser('list', help='過去の通知履歴を表示')
parser_summary = subparsers.add_parser('summary', help='よく出た曲トップ5を表示')
args = parser.parse_args()
if args.command == 'log' or args.command is None:
if can_notify():
msg = generate_alert()
send_notification(msg)
log_alert(msg)
update_last_notify()
else:
print('通知間隔制限中です。')
elif args.command == 'list':
list_alerts()
elif args.command == 'summary':
summary_alerts()
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、OS通知APIを用いて作業中に架空のサウンドトラック名を表示し、作業の緊張感を和らげるジョーク演出を提供します。通知内容は毎回ランダム生成され、実際の音楽再生は行いません。
# 公式ドキュメント抜粋
通知にはPythonの`plyer.notification`(https://github.com/kivy/plyer)を利用し、クロスプラットフォームでのデスクトップ通知を実現しています。通知が使えない場合は標準出力にフォールバックします。
# 利用例
- コマンド実行やビルド、コミット時に自動で発動
- `/skills menu`や`random-os-fake-soundtrack-alert log`コマンドで明示呼び出し
# 注意点
- 通知頻度は1分に1回までに制限されます
- ログはホームディレクトリ配下の隠しファイルに保存されます
# 設計方針
- 曲名・副題は開発現場のネタを中心に数十種類を用意し、組み合わせで毎回異なる通知を生成
- 履歴や統計もCLIで参照可能にし、通知内容の多様性と楽しさを重視
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-fake-soundtrack-alert .agents/skills/random-os-fake-soundtrack-alert
.agents/skills/random-os-fake-soundtrack-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-fake-soundtrack-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 との連携設計はどうあるべきか?
- 通知内容が毎回異なること(曲名・副題のユニークさ)は担保されているか?
- 実際に音やBGMが流れないこと、通知が作業の邪魔になりすぎない頻度で表示されるか?
実際に Codex で試した検証ログは Codexで謎のOS公式サウンドトラック通知を爆誕させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
