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の中で、エラーを「味わい深い文学作品」として前向きに捉え直せる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
