Codexでコミット失敗時のエラーを俳句で和らげる使いこなし術

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

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 や長時間作業時の気分転換として、開発体験を豊かにする
QUICK INSTALL
このSkillをすぐ試す

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記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次