Codexで作業中に楽しむ謎のOSサウンドトラック通知活用ガイド

  • URLをコピーしました!
目次

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 の導入・解除もワンコマンドで簡単、必要な時だけ即座に遊び心を注入できる
QUICK INSTALL
この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記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次