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 の“詰まり”を、笑いに変えてリフレッシュできる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
