Codexでエラー通知を音で演出する仕組みと活用法完全ガイド

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

Codex ユーザーが日常でぶつかる悩み

AI coding workflow を Codex で回していると、通知や演出面で「地味に困る」「ちょっとしたストレスが溜まる」瞬間が多々あります。特に repository understanding や path management の文脈で作業していると、エラー発生時の気付きが遅れて context を見失ったり、気まずい雰囲気になることも。以下のような「あるある」を感じたことはないでしょうか。

  • Codex が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

通知・演出・OS連携が弱いと、エラー発生時の気付きが遅れ、周囲にも伝わりづらい。特に集中しているときほど「何かやらかした?」と自覚するタイミングが遅れがちで、作業場の空気も微妙に重くなることがあります。

この Skill が一言でいうと何を解決するか

一言サマリ: コマンド実行時にエラーが発生した瞬間Skill。

このSkillを導入することで、Codex のエラー発生時に「謎のOSエラージングル」が強制的に再生されるようになります。しかも、ジングル音源は自作WAVやノスタルジックなファミコン風サウンドをランダムで選択。以下のような具体的なメリットがあります。

  • エラー発生時に即座に音で気付けるため、context や repo の状態把握がスムーズになる
  • 作業場に「また変な音が鳴ってる」とユーモラスな空気が生まれ、エラーを前向きに受け止めやすい
  • 音源は簡単に追加・差し替えできるので、自分好みの演出でAI coding workflowをカスタマイズ可能
  • 長時間の session で stale context が発生しても、ジングルで「今ここでエラーが出た」と明確に区切れる
  • onboarding やペア作業時にも、エラー発生を即座に共有できるため、repository understanding が加速する
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/codex/random-os-error-jingle .agents/skills/random-os-error-jingle

実行したらこうなる (3つの利用シーン)

このSkillを有効化すると、エラー発生時に「ジングル音」が鳴ることで、作業の流れや context 切り替えに気付きを与えます。以下のような利用シーンが想定されます。

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu or random-os-error-jingle mention
> このプロジェクトでエラー時にジングル鳴らして

[Skill: random-os-error-jingle 有効化済み]
- エラー発生時にランダムなジングル (wav/mp3) を再生します
- 音源は 

Skill の中身を全部見せる

.agents/skills/random-os-error-jingle/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/random-os-error-jingle/
├── SKILL.md
├── scripts/
│   └── random_os_error_jingle.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_error_jingle.py コマンド失敗時にランダムなOSエラージングルを再生するスキル
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-error-jingle
description: コマンド実行時にエラー(例外・非ゼロ終了コード)が発生した場合、必ずランダムな“OSエラージングル”サウンドを再生する。エラー検知・通知・演出用途で発動。
---

# 機能概要
`random-os-error-jingle`は、コマンドやスクリプト実行時にエラー(例外発生や非ゼロ終了コード)を検知すると、即座にランダムな“OSエラージングル”サウンド(WAV/MP3/OGG対応)を再生するSkillです。音源は自作の短いWAVやレトロなファミコン風ファイルなど自由に追加・差し替え可能。エラー発生時の通知・演出を強化し、開発現場や作業空間にユーモラスかつ怪しげな雰囲気を演出します。

# 使い方
- 明示呼び出し例: `/skills random-os-error-jingle run --cmd "python myscript.py" --jingles ./jingles/ --volume 0.8`
- 暗黙発動キーワード例: "エラー発生時にジングル再生", "失敗時に音で通知", "コマンド失敗時のサウンド演出"
- 音源ディレクトリに好きなファイルを追加・交換可能
- `--mute`で一時的にサウンド無効化、`--volume`で音量調整

# 出力例
```
$ python random_os_error_jingle.py run --cmd "ls not_exist_dir" --jingles ./jingles/
[INFO] 実行: ls not_exist_dir
[ERROR] コマンドが失敗しました (終了コード: 2)
[INFO] ジングル再生: ./jingles/famicom_fail.wav
```

# 注意点
- サウンド再生にはOSの標準機能またはPythonの`playsound`/`pygame`を利用
- 音源ファイルはローカルに保存・管理、著作権に注意
- サーバーや無音環境では効果が発揮されません
- コマンド実行はサンドボックス外で行われるため、セキュリティリスクに注意

# 参考資料
- [Python subprocess documentation](https://docs.python.org/ja/3/library/subprocess.html)
- [playsound PyPI](https://pypi.org/project/playsound/)
- references/design_notes.md も参照

scripts/random_os_error_jingle.py

import argparse
import os
import sys
import random
import glob
import subprocess
import threading
import time

try:
    from playsound import playsound
except ImportError:
    playsound = None
    
def list_jingles(jingle_dir):
    exts = ('*.wav', '*.mp3', '*.ogg')
    files = []
    for ext in exts:
        files.extend(glob.glob(os.path.join(jingle_dir, ext)))
    return files

def play_jingle(jingle_file, volume=1.0, mute=False):
    if mute or not jingle_file:
        return
    if playsound:
        try:
            playsound(jingle_file)
        except Exception as e:
            print(f'[WARN] サウンド再生失敗: {e}', file=sys.stderr)
    else:
        # OS標準の再生コマンド
        if sys.platform.startswith('darwin'):
            os.system(f'afplay "{jingle_file}"')
        elif sys.platform.startswith('linux'):
            os.system(f'paplay "{jingle_file}" || aplay "{jingle_file}"')
        elif sys.platform.startswith('win'):
            import winsound
            try:
                winsound.PlaySound(jingle_file, winsound.SND_FILENAME)
            except Exception as e:
                print(f'[WARN] サウンド再生失敗: {e}', file=sys.stderr)
        else:
            print('[WARN] サウンド再生方法が不明なOSです', file=sys.stderr)

def run_command(cmd, jingle_dir, volume=1.0, mute=False):
    print(f'[INFO] 実行: {cmd}')
    try:
        proc = subprocess.run(cmd, shell=True)
        if proc.returncode != 0:
            print(f'[ERROR] コマンドが失敗しました (終了コード: {proc.returncode})')
            jingles = list_jingles(jingle_dir)
            if not jingles:
                print('[WARN] ジングルファイルが見つかりません', file=sys.stderr)
                return
            jingle_file = random.choice(jingles)
            print(f'[INFO] ジングル再生: {jingle_file}')
            t = threading.Thread(target=play_jingle, args=(jingle_file, volume, mute))
            t.start()
            t.join()
        else:
            print('[INFO] コマンドは正常終了しました')
    except Exception as e:
        print(f'[ERROR] 例外発生: {e}', file=sys.stderr)
        jingles = list_jingles(jingle_dir)
        if not jingles:
            print('[WARN] ジングルファイルが見つかりません', file=sys.stderr)
            return
        jingle_file = random.choice(jingles)
        print(f'[INFO] ジングル再生: {jingle_file}')
        t = threading.Thread(target=play_jingle, args=(jingle_file, volume, mute))
        t.start()
        t.join()

def list_jingle_files(jingle_dir):
    jingles = list_jingles(jingle_dir)
    if not jingles:
        print('[INFO] ジングルファイルが見つかりません')
        return
    print('[INFO] 利用可能なジングル一覧:')
    for j in jingles:
        print('  -', j)

def main():
    parser = argparse.ArgumentParser(description='コマンド失敗時にランダムなOSエラージングルを再生するスキル')
    subparsers = parser.add_subparsers(dest='subcmd')

    parser_run = subparsers.add_parser('run', help='コマンドを実行し、失敗時にジングル再生')
    parser_run.add_argument('--cmd', required=True, help='実行するコマンド')
    parser_run.add_argument('--jingles', required=True, help='ジングル音源ディレクトリ')
    parser_run.add_argument('--volume', type=float, default=1.0, help='音量(0.0-1.0)')
    parser_run.add_argument('--mute', action='store_true', help='サウンドをミュート')

    parser_list = subparsers.add_parser('list', help='利用可能なジングルファイル一覧表示')
    parser_list.add_argument('--jingles', required=True, help='ジングル音源ディレクトリ')

    args = parser.parse_args()

    if args.subcmd == 'run':
        run_command(args.cmd, args.jingles, args.volume, args.mute)
    elif args.subcmd == 'list':
        list_jingle_files(args.jingles)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、コマンド実行時のエラーを検知し、即座にローカルのジングル音源からランダム選択して再生することで、エラー発生を視覚以外でも直感的に把握できるよう設計されています。音源はユーザーが自由に追加・差し替えでき、通知演出のカスタマイズ性が高い点が特徴です。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/ja/3/library/subprocess.html
- playsound: https://pypi.org/project/playsound/

# 利用例
- 開発現場でビルドやテスト失敗時に音で即座に把握
- ジョーク用途で作業場の雰囲気作り
- 音源をレトロゲーム風や自作ジングルに差し替えて楽しむ

# 注意点
- サウンド再生はOS依存部分あり。Linux/Mac/Windowsで挙動がやや異なる場合がある
- サーバーや無音環境では効果が限定的
- 音源ファイル管理・著作権に留意

# 設計方針
- サブコマンド(run/list)でCLI操作性を確保
- 音源ディレクトリの柔軟な指定・拡張性
- ミュート・音量調整オプションで実用性も考慮

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Codex がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/codex/random-os-error-jingle .agents/skills/random-os-error-jingle

.agents/skills/random-os-error-jingle の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/random-os-error-jingle
# 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 との連携設計はどうあるべきか?
  • エラー発生時に確実にランダムジングル再生されるか?
  • 音源の追加・差し替えが容易か?
  • ミュート切り替えや音量調整オプションの有無は十分か?

実際に Codex で試した検証ログは Codexでエラー時に謎のジングルを鳴らしてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

関連タグで他のSkill記事を探す

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

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

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