Codex ユーザーが日常でぶつかる悩み
AI コーディングエージェント Codex を使っていると、日々の開発ワークフローの中で「またか…」と苦笑いしたくなる瞬間が意外と多いものです。特に Git 操作やコミットまわりでは、手順ミスや context の混乱が起きやすく、思わぬエラーに直面することも。こうした場面で、単調なエラーメッセージだけが返ってくると、気分転換もできず、次の行動に移るモチベーションが下がりがちです。
Codex 固有の context 管理や repository understanding の難しさも加わり、以下のような「あるある」な困りごとが発生しがちです:
- コミットや push が失敗したとき、Codex から返るエラー文が無機質で、やる気がそがれる
- 長時間 AI coding workflow の中で、同じようなエラーを何度も繰り返し、精神的に疲弊する
- monorepo で directory や path management が複雑化し、context や memory が混乱してコミット操作を間違える
- repository 理解が浅い状態で作業していると、何が原因か分からずエラーに悩む時間が増える
- 「また失敗か」と思った瞬間、ちょっとした気晴らしや笑いがほしくなるが、そうした余裕がない
こうした悩みを、ほんの少しユーモラスに和らげてくれる仕掛けが求められています。
この Skill が一言でいうと何を解決するか
一言サマリ: コミットが失敗したときSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- コミットや push 失敗時に、エラー内容を即座に五・七・五の俳句へ変換して表示し、気持ちを切り替えやすくする
- 無機質なエラーメッセージが和らぎ、AI coding workflow のストレスを減らす
- 毎回違う一句が context に応じて生成されるため、飽きずに楽しめる
- monorepo や複雑な repository でも、directory や path にちなんだ一句が出ることで repository understanding の助けにもなる
- onboarding や長時間作業時の気分転換として、開発体験を豊かにする
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/commit-failure-haikuizer .agents/skills/commit-failure-haikuizer実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# git commit -m "Add initial README"
error: pathspec 'README' did not match any files
俳句:
初めての
リポジトリにて
ファイルなし
# もう一度ファイルを追加してからコミットしてください
シーン2: monorepo / package 跨ぎ作業時
# git commit -m "Fix utils bug" packages/core/utils.js
error: Your branch is behind 'origin/main' by 2 commits, and can be fast-forwarded.
俳句:
core package
進めど進まず
リモート待つ
# git pull してから再度コミットしてください
シーン3: お遊び的な使い方
# git push
error: failed to push some refs to 'github.com:example/repo.git'
俳句:
pushできず
悩みも五・七・五
となりけり
# 競合を解消して再度 push してください
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/commit-failure-haikuizer/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/commit-failure-haikuizer/
├── SKILL.md
├── scripts/
│ └── commit_failure_haikuizer.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/commit_failure_haikuizer.py |
Commit Failure Haikuizer: エラーを俳句に変換 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: commit-failure-haikuizer
description: コミットやpushなどのGit操作失敗時、エラー内容を五・七・五の俳句に変換し自動表示します。エラー、push失敗、commitエラー、merge衝突などのキーワード検知時に発動します。
---
# 機能概要
このSkillは、Gitのcommitやpush、mergeなどの操作でエラーが発生した際、通常のエラー表示だけでなく、その内容や状況を五・七・五の俳句に自動変換してターミナルに表示します。エンジニアの日常にユーモアと哀愁を添え、失敗の瞬間も和ませます。エラー内容を俳句化することで、毎回異なる一句が生成され、飽きずに楽しめます。
# 使い方
- 明示呼び出し: `/skills commit-failure-haikuizer "<エラーメッセージ>"` で任意のエラー文を俳句化
- 暗黙発動: `commit`, `push`, `merge`, `error`, `failed`, `conflict` などのエラーキーワード検知時に自動発動
- コミットフックやCI/CDスクリプトに組み込むことで、失敗時に自動俳句表示が可能
# 出力例
```
$ git push origin main
error: failed to push some refs to 'github.com:user/repo.git'
俳句:
遠き空
pushできぬ指
ため息よ
$ /skills commit-failure-haikuizer "merge conflict in file main.py"
俳句:
衝突して
main.pyの中
迷い道
```
# 注意点
- 俳句生成はエラー内容をもとにするため、必ずしも完璧な五・七・五になるとは限りません
- ローカルでのみ動作し、生成俳句の保存は行いません
- 日本語以外のエラーメッセージも俳句化しますが、意味が崩れる場合があります
# 参考資料
- [Git公式ドキュメント](https://git-scm.com/doc)
- references/design_notes.md に設計方針や利用例を記載
scripts/commit_failure_haikuizer.py
import sys
import argparse
import random
import re
from typing import List
# 俳句のテンプレート候補
HAIKU_TEMPLATES = [
["{season}", "{action}の{target}", "{emotion}"],
["{error_word}", "{target}に{action}", "{wish}"],
["{action}して", "{target}の中", "{emotion}"],
["{target}かな", "{action}のあと", "{emotion}"],
["{emotion}", "{target}に{action}", "{season}"],
]
SEASON_WORDS = [
"春の空", "夏の夜", "秋の風", "冬の朝", "遠き空", "夕暮れに", "朝焼けや"
]
ACTIONS = [
"pushできず", "commit失敗", "衝突して", "pullできず", "競合して", "保存できず", "解決せず"
]
EMOTIONS = [
"ため息よ", "迷い道", "涙落ち", "立ち尽くす", "苦笑い", "悩み深し", "また明日"
]
WISHES = [
"次こそは", "願い込め", "やり直し", "再挑戦", "もう一度"
]
# 主要なエラー語句
ERROR_WORDS = [
"error", "failed", "conflict", "拒否され", "競合", "unmerged", "denied", "not found"
]
def extract_target(error_message: str) -> str:
# ファイル名やリポジトリ名等を抽出
file_match = re.search(r'([\w\-/]+\.(py|js|java|rb|go|ts|c|cpp|h|md))', error_message)
if file_match:
return file_match.group(1)
repo_match = re.search(r"github.com[:/](\w+/[\w-]+)", error_message)
if repo_match:
return repo_match.group(1)
# デフォルト
return "この場所"
def extract_error_word(error_message: str) -> str:
for w in ERROR_WORDS:
if w in error_message.lower():
return w
return "失敗"
def make_haiku(error_message: str) -> List[str]:
target = extract_target(error_message)
action = random.choice(ACTIONS)
season = random.choice(SEASON_WORDS)
emotion = random.choice(EMOTIONS)
wish = random.choice(WISHES)
error_word = extract_error_word(error_message)
template = random.choice(HAIKU_TEMPLATES)
mapping = {
"target": target,
"action": action,
"season": season,
"emotion": emotion,
"wish": wish,
"error_word": error_word
}
return [line.format(**mapping) for line in template]
def print_haiku(error_message: str):
haiku = make_haiku(error_message)
print("\n俳句:")
for line in haiku:
print(line)
def cli():
parser = argparse.ArgumentParser(description='Commit Failure Haikuizer: エラーを俳句に変換')
subparsers = parser.add_subparsers(dest='command')
# 明示呼び出し
haiku_parser = subparsers.add_parser('haiku', help='エラーメッセージを俳句化')
haiku_parser.add_argument('message', type=str, help='エラーメッセージ')
# ログ機能(オプション)
log_parser = subparsers.add_parser('log', help='俳句ログを表示')
log_parser.add_argument('--file', type=str, default='.haiku_log.txt', help='ログファイルパス')
args = parser.parse_args()
if args.command == 'haiku':
print_haiku(args.message)
elif args.command == 'log':
try:
with open(args.file, 'r', encoding='utf-8') as f:
print(f.read())
except FileNotFoundError:
print('ログファイルがありません')
else:
parser.print_help()
if __name__ == '__main__':
if len(sys.argv) == 1:
# 標準入力からエラー文を受け取る
print('エラーメッセージを入力してください(Ctrl+Dで終了):')
error_message = sys.stdin.read().strip()
if error_message:
print_haiku(error_message)
else:
print('エラーメッセージが空です')
else:
cli()
references/design_notes.md
# 概要
commit-failure-haikuizerは、Git操作失敗時のエラー内容を日本語俳句(五・七・五)に変換して表示するジョーク系Skillです。日々の開発現場に遊び心を加え、エラー時の心理的負担を和らげることを目的としています。
# 設計方針
- エラー内容からファイル名やリポジトリ名などの「対象語」を抽出し、ランダムな季語や感情ワードと組み合わせて俳句を生成します。
- 俳句テンプレートを複数用意し、毎回異なるパターンを出力します。
- 明示呼び出し(コマンドライン引数)と、標準入力による暗黙発動の両対応としています。
# 利用例
- git pushやcommit失敗時に、エラー出力をパイプで渡して俳句化
- CI/CDの失敗通知メッセージに組み込むことで、チームの雰囲気を和ませる
# 注意点
- 完全な五・七・五を保証するものではありませんが、雰囲気重視です。
- ログ保存はオプションで、デフォルトではローカルに保存しません。
# 公式ドキュメント
- [Git公式ドキュメント](https://git-scm.com/doc)
- Python標準ライブラリ argparse, re, random
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/commit-failure-haikuizer .agents/skills/commit-failure-haikuizer
.agents/skills/commit-failure-haikuizer の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/commit-failure-haikuizer
# 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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
