Codexで作業中の意外なBGM通知を楽しむ使いこなし術

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

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連携」カテゴリの中でも、実用性をあえて度外視した“本気の無駄”を体験できる
QUICK INSTALL
このSkillをすぐ試す

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記事を探す

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

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

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