Codexでエラーを和風俳句に変換する遊び心あふれる活用ガイド

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

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

AI coding workflowを日々回していると、何気ないミスや設定漏れでターミナルにエラーが出る瞬間が頻発します。しかし、無機質なエラーメッセージが連続すると、気持ちが萎えたり、作業のリズムが崩れることも少なくありません。特にCodexを使った長時間の作業や、monorepoのような大規模なrepositoryでの開発では、エラー内容も多様化し、精神的な疲労を感じやすい場面が増えています。

  • Codexがcontextを見失い、意図しないdirectoryやpathを参照してエラーが発生する
  • monorepoでpackageを跨いだ途端にrepository understandingが崩れ、予期しないエラーが多発する
  • 長時間のAI coding workflowでlong contextが肥大化し、重要なエラー内容が埋もれてしまう
  • session再開時に前回のpath管理やdirectory構造を再説明する過程でエラーを連発してしまう
  • 「また同じエラーか」と気分が沈み、onboarding時の学習意欲が下がる

こうした悩みは、単なる技術的な問題だけでなく、開発体験の質やチームのモチベーションにも直結します。特にエラーが連続する日は、少しでも気分転換になる工夫が欲しくなるものです。

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

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

このSkillを導入すると、以下のような変化が期待できます:

  • エラー発生時、通常の無機質なメッセージの代わりに「和風エラー俳句」が表示され、思わず笑ってしまう体験が生まれる
  • エラー内容ごとにcontextを反映した俳句が生成されるため、repository understandingの一助にもなる
  • monorepoや複雑なdirectory構成でも、pathやエラー種別に合わせた俳句が出ることでonboardingやmemory定着が楽しくなる
  • long contextやstale contextが発生しても、エラー時の気分転換となりworkflowの停滞感を和らげる
  • AI coding workflowの中で、エラーを「味わい深い文学作品」として前向きに捉え直せる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/os-error-bigaku-haiku .agents/skills/os-error-bigaku-haiku

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

Skillを導入した場合の具体的な出力イメージを3シーンで紹介します。

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


# /skills menu or os-error-bigaku-haiku mention
> python scripts/setup.py

Permission denied: 'setup.py'
和風エラー俳句:
  Permission denied
  心閉ざして
  春霞

(元のエラー内容も併記され、俳句が添えられる)

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


> cd packages/api && npm run build

Segmentation fault (core dumped)
和風エラー俳句:
  Segmentation fault
  記憶の彼方
  絶望感

(エラー内容とdirectory contextに応じた俳句が表示)

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


> rm -rf /

rm: cannot remove '/': Is a directory
和風エラー俳句:
  無慈悲な手
  ルートを削る
  風の音

(ジョーク的なコマンドにもユーモラスな俳句が登場)

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

.agents/skills/os-error-bigaku-haiku/
├── SKILL.md
├── scripts/
│   └── os_error_bigaku_haiku.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/os_error_bigaku_haiku.py コマンド実行時のエラーを和風俳句で味わうCLIラッパー
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: os-error-bigaku-haiku
description: ターミナルやCLIでコマンド実行時にエラー(例: Permission denied, Segmentation fault, File not found等)が発生した際、自動的にエラー内容を和風俳句として表示し、元のエラーメッセージも併記します。エラー発生・明示呼び出し時に発動。
---

# 機能概要
このSkillは、ターミナルやコマンドラインで発生する無機質なエラーメッセージを、和風の俳句に変換して表示します。例えば "Permission denied" や "Segmentation fault" など、よくあるエラーを日本語の俳句(五・七・五調)に自動変換し、元のエラーメッセージとともに出力します。ミスやトラブルを文学的に味わい深い体験へと昇華し、開発者の心を和ませます。

# 使い方
- 明示呼び出し: `/skills os-error-bigaku-haiku` または `$ os-error-bigaku-haiku <コマンド>` でラップ実行
- 暗黙発動: ターミナルで "Permission denied", "Segmentation fault", "No such file or directory" などのエラーが発生したときに自動発動
- サブコマンド: `haiku-log` で過去の俳句エラー履歴を表示

# 出力例
```
$ os-error-bigaku-haiku ls /root
[和風エラー俳句]
Permission denied、心閉ざして、春霞
[元のエラー]
ls: cannot open directory '/root': Permission denied

$ os-error-bigaku-haiku cat missing.txt
[和風エラー俳句]
ファイル消え、探す手のひら、春の闇
[元のエラー]
cat: missing.txt: No such file or directory
```

# 注意点
- 俳句はエラー内容ごとに自動生成またはテンプレートから選択されます
- すべてのエラーに完全対応するわけではありません(未知のエラーは汎用俳句)
- ローカルにエラー履歴(俳句付き)を保存します。プライバシーに注意
- システムコマンドのラップ実行のみ対応。GUIアプリや外部プロセスは対象外

# 参考資料
- [Python subprocess 公式ドキュメント](https://docs.python.org/3/library/subprocess.html)
- references/design_notes.md 参照(俳句生成ロジック、設計方針、利用例など)

scripts/os_error_bigaku_haiku.py

import subprocess
import sys
import argparse
import datetime
import os
import json
from typing import List, Optional

HAIKU_TEMPLATES = [
    # (error_keyword, haiku)
    ("Permission denied", "Permission denied、心閉ざして、春霞"),
    ("Segmentation fault", "Segmentation fault、記憶の彼方、絶望感"),
    ("No such file or directory", "ファイル消え、探す手のひら、春の闇"),
    ("File exists", "既にあり、重ねる想い、夏の雲"),
    ("Not a directory", "道迷い、ディレクトリなく、秋の風"),
    ("Is a directory", "中を見て、戸惑う指先、冬の朝"),
    ("command not found", "道を問う、コマンド知らず、春の雨"),
    ("Invalid argument", "理屈越え、引数迷い、霧の中"),
    ("Broken pipe", "途切れたる、パイプの先に、冬の星"),
    ("Timeout", "時を待ち、応えぬ声に、夏の夜"),
    ("Connection refused", "扉閉じ、拒まれし糸、秋の夜"),
]

GENERIC_HAIKU = "エラーなり、無常の響き、春の夢"

HISTORY_FILE = os.path.expanduser("~/.os_error_bigaku_haiku_history.json")


def find_haiku(error_message: str) -> str:
    for keyword, haiku in HAIKU_TEMPLATES:
        if keyword.lower() in error_message.lower():
            return haiku
    return GENERIC_HAIKU


def run_command(cmd: List[str]) -> (int, str, str):
    try:
        proc = subprocess.run(cmd, capture_output=True, text=True, check=False)
        return proc.returncode, proc.stdout, proc.stderr
    except Exception as e:
        return 1, "", str(e)


def print_haiku_error(cmd: List[str], error_message: str):
    haiku = find_haiku(error_message)
    print("[和風エラー俳句]")
    print(haiku)
    print("[元のエラー]")
    print(error_message)
    save_to_history(cmd, haiku, error_message)


def save_to_history(cmd: List[str], haiku: str, error_message: str):
    entry = {
        "timestamp": datetime.datetime.now().isoformat(),
        "command": " ".join(cmd),
        "haiku": haiku,
        "error": error_message
    }
    history = []
    if os.path.exists(HISTORY_FILE):
        try:
            with open(HISTORY_FILE, "r", encoding="utf-8") as f:
                history = json.load(f)
        except Exception:
            history = []
    history.append(entry)
    # Keep only last 100 entries
    history = history[-100:]
    with open(HISTORY_FILE, "w", encoding="utf-8") as f:
        json.dump(history, f, ensure_ascii=False, indent=2)


def show_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴はありません。")
        return
    with open(HISTORY_FILE, "r", encoding="utf-8") as f:
        history = json.load(f)
    print("=== エラー俳句履歴 ===")
    for entry in history[-20:]:
        print(f"{entry['timestamp']}")
        print(f"コマンド: {entry['command']}")
        print(f"俳句: {entry['haiku']}")
        print(f"エラー: {entry['error']}")
        print("-")


def main():
    parser = argparse.ArgumentParser(description="コマンド実行時のエラーを和風俳句で味わうCLIラッパー")
    subparsers = parser.add_subparsers(dest="subcmd")

    run_parser = subparsers.add_parser("run", help="コマンドをラップ実行し、エラー時に俳句表示")
    run_parser.add_argument("cmd", nargs=argparse.REMAINDER, help="実行するコマンド")

    log_parser = subparsers.add_parser("haiku-log", help="エラー俳句履歴を表示")

    args = parser.parse_args()

    if args.subcmd == "run":
        if not args.cmd:
            print("コマンドを指定してください。例: os-error-bigaku-haiku run ls /root")
            sys.exit(1)
        code, out, err = run_command(args.cmd)
        if code != 0 or err:
            print_haiku_error(args.cmd, err.strip() or f"Exit code: {code}")
        else:
            print(out, end="")
    elif args.subcmd == "haiku-log":
        show_history()
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、CLIで発生するエラーを和風俳句に変換し、エラー内容ごとに異なる雰囲気を持たせることで、開発者の心理的負担を軽減し、笑いや癒しを提供することを目的としています。

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

# 利用例
例えば `os-error-bigaku-haiku run cat missing.txt` のようにコマンドをラップ実行し、エラーが発生した場合は即座に俳句化されたメッセージが表示されます。また、`haiku-log` サブコマンドで過去の俳句履歴を一覧できます。

# 注意点
- 俳句生成はテンプレートベースですが、今後AI生成やカスタマイズも検討可能です。
- すべてのエラーに完全対応するわけではありません。未知のエラーは汎用俳句で対応します。
- 履歴はユーザーホームディレクトリにJSON形式で保存されます。

# 設計方針
- シンプルなPythonスクリプトで、CLIラッパーとして機能。
- エラー分類はキーワードマッチングで実装。
- 履歴管理は最大100件で自動ローテーション。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/os-error-bigaku-haiku .agents/skills/os-error-bigaku-haiku

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

3. ファイル配置確認

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