Codexでエラーメッセージを詩的に変換する驚きの活用ガイド

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

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

ターミナルやエディタでコマンドを実行中、突然現れる謎のエラーメッセージ。内容は分かるのに、なぜか気分が沈んでしまう——そんな経験はCodexユーザーなら一度はあるはずです。特にリポジトリ構造が複雑な monorepo や長時間のAI coding workflowでは、エラーの頻度も上がりがち。気分転換もままならず、作業が単調になってしまうことも多いのではないでしょうか。

  • Codex が context を見失って違う場所のコードを参照し、思わぬエラーが発生する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れてパス指定を間違える
  • 長時間のAI coding workflowで、同じようなエラーが繰り返し出て気分が沈む
  • エラーが出ても内容が無機質で、作業のモチベーションが下がる
  • 「またこのエラーか」と思いつつも、少し気分転換したいが作業を止められない

ジョーク・パロディ系Skillがあれば、そんな“エラー疲れ”の瞬間に思わず笑ってしまい、気持ちを切り替えて再度集中できるきっかけになるでしょう。

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

一言サマリ: ターミナルやエディタでコマンド実行時にエラーが発生したらSkill。

このSkillを導入することで、Codexを使ったAI coding workflowの中で、エラー発生時に「重厚な詩」としてエラーメッセージが即興変換されて表示されるようになります。具体的なメリットは以下です。

  • 無機質なエラー表示から解放され、作業中の気分転換やリフレッシュが自然にできる
  • monorepoや複雑な repository 構造でのエラーも、詩的な表現で印象に残るため、同じエラーの再発時に気付きやすくなる
  • onboarding や長時間の workflow で、マンネリ化したエラー体験をユーモラスに変えることで、集中力やモチベーションの維持に寄与
  • Codex の context や path management の失敗も、詩的表現で和らげてくれる
  • Skill の導入・設定も直感的で、repository understanding を邪魔しない
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# poetry install

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
PermissionError: [Errno 13] Permission denied: 'requirements.txt'

【詩】
許されぬ権限よ、我が手にパーミッションを
閉ざされた requirements.txt の扉
root なる者のみが歩む道
我はただ、詩人として立ち尽くす

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


# cd packages/core && poetry run pytest

ModuleNotFoundError: No module named 'utils.helper'

【詩】
見つからぬ道、404の黄昏
core の森を彷徨い、helper を求めて
package の狭間に消えた import の影
我が詩は、未解決のまま宙を舞う

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


# poetry run python scripts/fail.py

ZeroDivisionError: division by zero

【詩】
割れぬもの、それは零
計算の果てに待つ虚無
無限へと誘う数式の罠
詩人の心もまた、割り切れぬ

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

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

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/poetry_wrapper.py random-os-error-poetry: OSエラーを即興詩に変換するラッパ
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-error-poetry
description: エラー発生時や例外メッセージ出力時、'Permission denied'や'File not found'などのキーワードを検知して、通常のエラーメッセージを詩的な文章に変換して表示します。コマンド失敗や例外時に自動発動。
---

# 機能概要
random-os-error-poetryは、ターミナルやエディタで発生する様々なOSエラーや例外メッセージを、重厚かつユーモラスな詩に即興変換して表示するSkillです。通常の無機質なエラーメッセージを、思わず笑ってしまう詩的表現へと昇華。作業中のストレスや疲れを和らげ、エラーの内容を印象的に伝えます。エラー内容ごとに異なる詩的テンプレートを用意し、原文も参照可能なため、実用性と遊び心を両立します。

# 使い方
- 明示呼び出し例: `/skills random-os-error-poetry` または `$random-os-error-poetry` をmention
- 暗黙発動: `Permission denied`, `No such file or directory`, `FileNotFoundError`, `IsADirectoryError`, `OSError`, `404` などのエラーメッセージ検知時に自動発動
- CLI経由: `python poetry_wrapper.py run <your_command>` で任意コマンドをラップ

# 出力例
```
$ python poetry_wrapper.py run ls /root
許されぬ権限よ、我が手にパーミッションを
  (Permission denied: '/root')

$ python poetry_wrapper.py run cat missing.txt
見つからぬ道、404の黄昏
  (No such file or directory: 'missing.txt')

$ python poetry_wrapper.py run rm /
運命に抗う者よ、根を断つこと叶わず
  (IsADirectoryError: [Errno 21] Is a directory: '/')
```

# 注意点
- 本Skillはエラー内容を詩的に変換しますが、実際のエラー内容も併記されるためデバッグ用途も損ないません。
- すべてのエラーに対応するわけではなく、対応外メッセージは原文のまま表示されます。
- ローカル環境での利用を想定し、標準出力・標準エラーのラップのみを行います。

# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- Python公式: https://docs.python.org/ja/3/library/exceptions.html
- エラー詩変換は独自辞書・テンプレートを用いて実装

scripts/poetry_wrapper.py

import subprocess
import sys
import argparse
import re
from typing import Optional, Tuple

# --- 詩テンプレート定義 ---
ERROR_POETRY_MAP = [
    (re.compile(r'Permission denied', re.I),
     "許されぬ権限よ、我が手にパーミッションを"),
    (re.compile(r'No such file or directory', re.I),
     "見つからぬ道、404の黄昏"),
    (re.compile(r'FileNotFoundError', re.I),
     "消えたファイル、虚空に溶けて"),
    (re.compile(r'IsADirectoryError', re.I),
     "運命に抗う者よ、根を断つこと叶わず"),
    (re.compile(r'OSError', re.I),
     "OSの深淵、響くエラーの調べ"),
    (re.compile(r'404', re.I),
     "404の彼方、失われしページの詩"),
    (re.compile(r'Access is denied', re.I),
     "拒まれし扉、アクセスの夢遠く"),
    (re.compile(r'not found', re.I),
     "探し人、見つからぬまま夜は更ける"),
]

# --- 詩変換関数 ---
def poeticize_error(stderr: str) -> Optional[str]:
    for pattern, poem in ERROR_POETRY_MAP:
        if pattern.search(stderr):
            return f"{poem}\n  ({stderr.strip()})"
    return None

# --- コマンド実行ラッパ ---
def run_command(cmd_args: list) -> Tuple[int, str, str]:
    try:
        proc = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        out, err = proc.communicate()
        return proc.returncode, out, err
    except Exception as e:
        return 1, '', str(e)

# --- CLIサブコマンド: run ---
def cli_run(args):
    code, out, err = run_command(args.command)
    sys.stdout.write(out)
    if err:
        poem = poeticize_error(err)
        if poem:
            sys.stderr.write(poem + '\n')
        else:
            sys.stderr.write(err)
    sys.exit(code)

# --- CLIサブコマンド: test (サンプルエラーを詩化) ---
def cli_test(args):
    test_errs = [
        "Permission denied: '/root'",
        "No such file or directory: 'missing.txt'",
        "FileNotFoundError: [Errno 2]",
        "IsADirectoryError: [Errno 21] Is a directory: '/'",
        "OSError: [Errno 5] Input/output error",
        "404 Not Found",
        "Access is denied",
        "command not found: foobar"
    ]
    for err in test_errs:
        poem = poeticize_error(err)
        print(f"元エラー: {err}")
        print(f"詩変換: {poem if poem else err}\n")

# --- CLIサブコマンド: list (詩テンプレート一覧) ---
def cli_list(args):
    print("対応エラーパターンと詩テンプレート:")
    for pattern, poem in ERROR_POETRY_MAP:
        print(f"- {pattern.pattern} => {poem}")

# --- CLIサブコマンド: summary ---
def cli_summary(args):
    print("random-os-error-poetry: OSエラーや例外を詩的に変換して表示します。\n")
    print("使い方例:")
    print("  python poetry_wrapper.py run ls /root")
    print("  python poetry_wrapper.py run cat missing.txt")
    print("  python poetry_wrapper.py test")
    print("  python poetry_wrapper.py list")

# --- メイン ---
def main():
    parser = argparse.ArgumentParser(description='random-os-error-poetry: OSエラーを即興詩に変換するラッパ')
    subparsers = parser.add_subparsers(dest='subcmd', required=True)

    p_run = subparsers.add_parser('run', help='コマンドをラップして詩的エラー表示')
    p_run.add_argument('command', nargs=argparse.REMAINDER, help='実行するコマンド')
    p_run.set_defaults(func=cli_run)

    p_test = subparsers.add_parser('test', help='サンプルエラーを詩化して表示')
    p_test.set_defaults(func=cli_test)

    p_list = subparsers.add_parser('list', help='詩テンプレート一覧')
    p_list.set_defaults(func=cli_list)

    p_summary = subparsers.add_parser('summary', help='Skill概要')
    p_summary.set_defaults(func=cli_summary)

    args = parser.parse_args()
    args.func(args)

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-os-error-poetryは、OSエラーや例外メッセージを詩的な表現に変換することで、開発者のストレスを和らげ、エラー内容を印象的に伝えるSkillです。主にPython環境やUnix系ターミナルでの利用を想定しています。

# 公式ドキュメント抜粋
Pythonの例外体系は https://docs.python.org/ja/3/library/exceptions.html で確認できます。主要なエラー名やメッセージパターンを正規表現で検知し、詩テンプレートとマッピングしています。

# 利用例
- ターミナルでコマンド失敗時に詩的なエラーを表示
- スクリプト開発中の例外発生時にユーモアを提供
- チーム開発の気分転換やペアプロ時の話題作りに

# 注意点
- すべてのエラーに対応するわけではありません。原文も併記されるため実用性を損なわずに済みます。
- ローカルでの利用を前提とし、外部APIやネットワーク通信は行いません。

# 設計方針
- 詩テンプレートは拡張・カスタマイズ可能な形で実装
- エラー原文を必ず併記し、デバッグ性を維持
- サブコマンドでテスト・テンプレート一覧・概要確認も可能に設計

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

ls .agents/skills/random-os-error-poetry
# 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をコピーしました!
目次