Codexでエラーメッセージをユニークに変換する遊び心活用ガイド

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

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

AI coding workflow に慣れてくると、日々の作業の中で「またか…」とため息が出る瞬間が増えてきます。特に Codex を使っていると、context や repository understanding のズレから思わぬエラーや謎挙動が頻発しがちです。真剣に取り組んでいるのに、突然の permission error や path management のミス、directory の指定忘れなどで手が止まることも。「またこのエラーか」と思いながらも、どこかで「もう少し楽しくならないものか」と感じている方も多いはずです。

  • Codex が context を見失って違う場所のコードを参照し、意図しないエラーが発生する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れて directory を誤認識
  • コマンド実行時のエラーが毎回同じで、心が折れそうになる (「Permission denied」など)
  • 長時間の AI coding workflow で同じようなエラーに何度も遭遇し、作業が単調に感じる
  • エラー内容がシリアスすぎて、ちょっとした気分転換や遊び心が欲しくなる

Skill カテゴリ「ジョーク・パロディ」らしく、エラー発生時の“カオスな演出”が求められる瞬間は意外と多いものです。

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

一言サマリ: このスキルは、Codex のエラーメッセージを毎回“別のOS風”に変換して表示し、日々の単調なエラー体験をカオスで楽しいものに変えます。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • エラー発生時に毎回違う“OS風”演出が入り、気分転換やチーム内の話題作りになる
  • repository や directory を跨ぐ際のエラーも、ユーモラスな context で受け止められる
  • 真面目なエラー内容も、memory や long context の中で印象に残りやすくなる
  • onboarding 時や初学者にも、エラーの敷居を下げてフレンドリーな雰囲気を演出できる
  • AI coding workflow の“詰まり”を、笑いに変えてリフレッシュできる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

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


# /skills menu or random-os-error-translator mention
> npm start

[エラー] Permission denied: src/index.js
[別OS風変換]
--- MS-DOS風 ---
このファイルは神聖にして侵入を禁ず
--- 元のエラー ---
Permission denied: src/index.js

[Tips] もし操作を続行したい場合は、管理者権限で再実行してください。

シーン2: monorepo / package 跨ぎ作業時


> cd packages/api && yarn build

[エラー] File not found: config/settings.yaml
[別OS風変換]
--- 謎の国産OS風 ---
推奨されていない操作です。設定ファイルが見つかりません。
--- 元のエラー ---
File not found: config/settings.yaml

[ヒント] directory path を再確認してください。

シーン3: お遊び的な使い方


> rm -rf /

[エラー] Operation not permitted
[別OS風変換]
--- 古のUNIX風 ---
このコマンドは時空の彼方へと消えました。許可されていません。
--- 元のエラー ---
Operation not permitted

[Note] repository understanding の範囲外です。

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-error-translator/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

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

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_error_translator.py ランダムなOS風メッセージを生成し、元のエラーも返す
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-error-translator
description: CodexがターミナルやCLIでエラー発生時、または'/skills menu'や'skill名'で明示呼び出されたときに発動。エラーメッセージを複数の“別OS風”パロディに変換し、元の内容も簡単に参照可能です。
---

# 機能概要
このSkillは、コマンドラインやターミナルで発生したエラーメッセージを、毎回異なる“架空または実在OS風”のパロディメッセージに変換して表示します。例えば「Permission denied」という標準的なエラーが、「このファイルは神聖にして侵入を禁ず(MS-DOS風)」や「推奨されていない操作です(国産OS風)」など、意味不明かつユーモラスな表現に変換されます。作業中のストレスを和らげ、日常のCLI作業にカオスで楽しい演出を加えます。

# 使い方
- 明示呼び出し例: `/skills menu` でスキル一覧から選択、または `random-os-error-translator` を直接呼び出し
- 暗黙発動キーワード例: `error`, `failed`, `Exception`, `Permission denied`, `command not found` など、エラー発生時に自動で発動

# 出力例
```
$ ls /root
[AmigaOS風] 申し訳ありません、この命令は神の領域です。
(元のエラー: Permission denied)

$ cat notfound.txt
[国産OS風] ファイルが見つかりませんでした。再起動を推奨します。
(元のエラー: No such file or directory)

$ rm /dev/null
[MS-DOS風] システムが混乱しました。操作は許可されません。
(元のエラー: Operation not permitted)
```

# 注意点
- OS風変換は完全なジョークであり、実際のエラー内容の正確な説明ではありません。
- 元のエラー内容も必ず併記されるため、トラブルシュートは可能です。
- ローカルファイルやシステムには一切変更を加えません。
- 除外パス: システム管理系・セキュリティ関連の致命的エラーには変換を適用しません。

# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- 公式Pythonドキュメント: https://docs.python.org/ja/3/library/exceptions.html
- CLIエラー例: https://wiki.archlinux.jp/index.php/Errors_and_troubleshooting

scripts/random_os_error_translator.py

import argparse
import random
import sys
import traceback
from typing import List, Tuple, Dict

OS_STYLES = [
    {
        'name': 'MS-DOS風',
        'templates': [
            'システムが混乱しました。操作は許可されません。',
            '致命的エラー: コマンドまたはファイル名が違います。',
            'このファイルは神聖にして侵入を禁ず。',
            'コマンドまたはファイル名が正しくありません。',
        ]
    },
    {
        'name': 'AmigaOS風',
        'templates': [
            '申し訳ありません、この命令は神の領域です。',
            'Guru Meditation: システムが拒否しました。',
            'あなたの要求は受理されませんでした。',
            'ファイルアクセスが拒否されました。',
        ]
    },
    {
        'name': '国産OS風',
        'templates': [
            'ファイルが見つかりませんでした。再起動を推奨します。',
            '推奨されていない操作です。',
            '操作に失敗しました。管理者にご連絡ください。',
            '不明なエラーが発生しました。',
        ]
    },
    {
        'name': 'Unix風',
        'templates': [
            'Operation not permitted. Consult your sysadmin.',
            'Segmentation fault (core dumped).',
            'Permission denied: access is futile.',
            'No such file or directory. Try again later.',
        ]
    },
    {
        'name': 'Windows 95風',
        'templates': [
            '致命的な例外 OE が 0028:C0011E36 で発生しました。',
            'この操作はサポートされていません。',
            'アクセスが拒否されました。',
            'ファイルまたはパスが見つかりません。',
        ]
    },
    {
        'name': 'CP/M風',
        'templates': [
            'BDOS ERROR: File not found.',
            'BDOS ERROR: Disk full.',
            'BDOS ERROR: Read only file.',
            'BDOS ERROR: Unknown command.',
        ]
    }
]

EXCLUDE_ERRORS = [
    'Kernel panic',
    'Segmentation fault',
    'Out of memory',
    'System halt',
]

def random_os_style_message(original_error: str) -> Tuple[str, str]:
    """
    ランダムなOS風メッセージを生成し、元のエラーも返す。
    """
    os_style = random.choice(OS_STYLES)
    template = random.choice(os_style['templates'])
    return f"[{os_style['name']}] {template}", original_error

def should_exclude(error_message: str) -> bool:
    """
    致命的なエラーは除外
    """
    for excl in EXCLUDE_ERRORS:
        if excl.lower() in error_message.lower():
            return True
    return False

def translate_error(error_message: str) -> str:
    """
    エラーをOS風に変換し、元のエラーも併記
    """
    if should_exclude(error_message):
        return error_message
    os_msg, orig = random_os_style_message(error_message)
    return f"{os_msg}\n(元のエラー: {orig})"

def simulate_command(cmd: List[str]):
    """
    疑似的にコマンドを実行し、エラー時に変換表示
    """
    import subprocess
    try:
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        print(result.stdout, end='')
    except subprocess.CalledProcessError as e:
        err = e.stderr.strip() or str(e)
        print(translate_error(err))
    except FileNotFoundError as e:
        print(translate_error(str(e)))
    except Exception as e:
        print(translate_error(str(e)))

def log_error(error_message: str, logfile: str = 'os_error_log.txt'):
    with open(logfile, 'a', encoding='utf-8') as f:
        f.write(f"{error_message}\n")

def list_logs(logfile: str = 'os_error_log.txt'):
    try:
        with open(logfile, 'r', encoding='utf-8') as f:
            for line in f:
                print(line.rstrip())
    except FileNotFoundError:
        print('ログファイルがありません。')

def summary_logs(logfile: str = 'os_error_log.txt'):
    from collections import Counter
    try:
        with open(logfile, 'r', encoding='utf-8') as f:
            lines = [line.strip() for line in f if line.strip()]
        counter = Counter(lines)
        for msg, count in counter.most_common():
            print(f'{msg} : {count}回')
    except FileNotFoundError:
        print('ログファイルがありません。')

def main():
    parser = argparse.ArgumentParser(description='random-os-error-translator: エラーをランダムOS風に変換')
    subparsers = parser.add_subparsers(dest='command')

    # translateサブコマンド
    p_translate = subparsers.add_parser('translate', help='エラーメッセージをOS風に変換')
    p_translate.add_argument('message', nargs='+', help='変換したいエラーメッセージ')
    p_translate.add_argument('--log', action='store_true', help='ログに記録する')

    # simulateサブコマンド
    p_simulate = subparsers.add_parser('simulate', help='コマンドを実行しエラー時に変換')
    p_simulate.add_argument('cmd', nargs=argparse.REMAINDER, help='実行するコマンド')

    # logサブコマンド
    p_log = subparsers.add_parser('log', help='エラーをログに追加')
    p_log.add_argument('message', nargs='+', help='記録するエラーメッセージ')

    # listサブコマンド
    p_list = subparsers.add_parser('list', help='ログを一覧表示')

    # summaryサブコマンド
    p_summary = subparsers.add_parser('summary', help='ログの要約')

    args = parser.parse_args()

    if args.command == 'translate':
        msg = ' '.join(args.message)
        result = translate_error(msg)
        print(result)
        if args.log:
            log_error(result)
    elif args.command == 'simulate':
        if not args.cmd:
            print('コマンドを指定してください。')
            sys.exit(1)
        simulate_command(args.cmd)
    elif args.command == 'log':
        msg = ' '.join(args.message)
        log_error(msg)
        print('ログに記録しました。')
    elif args.command == 'list':
        list_logs()
    elif args.command == 'summary':
        summary_logs()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、CLIやターミナルで発生するエラーを、複数の“OS風”パロディメッセージにランダム変換することで、作業中のユーザーにユーモアと癒やしを提供します。エラー内容の本質は損なわず、元のメッセージも必ず併記する設計です。

# 公式ドキュメント抜粋
- Python例外: https://docs.python.org/ja/3/library/exceptions.html
- サブプロセス実行: https://docs.python.org/ja/3/library/subprocess.html

# 利用例
- `python random_os_error_translator.py simulate ls /root` で権限エラーをパロディ表示
- `translate "No such file or directory"` でメッセージ変換
- `log`, `list`, `summary` コマンドでエラー記録と集計

# 注意点
- 本Skillはジョーク用途です。実際のトラブルシュート時は元のエラーを参照してください。
- 致命的なシステムエラーは除外対象です。

# 設計方針
- OS風テンプレートは拡張容易なdict構造
- ログ機能はファイルベースでシンプルに実装
- サブコマンドで用途別に柔軟運用

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agents/skills/random-os-error-translator
# 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 との連携設計はどうあるべきか?
  • エラー発生時に必ず“OS風変換”メッセージが表示されるか?
  • 元のエラー内容も簡単に確認できるか?
  • OS風演出パターンが複数あり、毎回変化するか?

実際に Codex で試した検証ログは Codexでエラーを別OS風に勝手に変換してみた!思わずツッコミ必至の不可解演出 にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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