Claude Code ユーザーが日常でぶつかる悩み
日々 Claude Code を使っていると、開発フローの中で思わず「またか」と感じる瞬間がある。特にコミットや push の失敗時、エラーが淡々と表示されるだけで、気持ちが沈むことも多い。そんな場面を振り返ると、次のような悩みが浮かび上がる:
- コミット失敗時、無機質なエラーメッセージだけが表示されて気分が落ち込む
- push や commit のエラー内容が毎回同じような文言で、学習効果もモチベーションも上がらない
- 長時間 workflow の中で、何度も同じ失敗を繰り返し、ターミナルが「悲報の場」になりがち
- onboarding やペアプロ時に、エラーの連続で場が重くなりがちで、ちょっとした和み要素が欲しくなる
- Claude Code の context や repository understanding の流れが、コミットエラーで一瞬止まるのが惜しい
特に、長い AI coding workflow の中で、エラーをきっかけに流れが途切れると、path management や memory のリセットも発生しやすい。日々の開発に「ちょっとした余白」が欲しいと感じる人も多いはずだ。
この Skill が一言でいうと何を解決するか
一言サマリ: コミットが失敗したときSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- コミットや push の失敗時、単なるエラー表示に代わり、エラー内容を五・七・五の俳句で和ませてくれる
- 毎回異なる一句が自動生成されるため、長時間のAI coding workflowでも飽きずに楽しめる
- repository や directory、context に応じた哀愁やユーモアがターミナルに生まれる
- onboarding やペアプロ時にも「場が和む」効果があり、エラー体験がポジティブに変わる
- Claude Code の memory や path management の流れを止めず、リズミカルに次の作業へ進める
GitHub から degit でコマンド1行、Claude Code の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/claude-code/commit-failure-haikuizer .claude/skills/commit-failure-haikuizer実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (CLAUDE.md と組み合わせて)
# /commit-failure-haikuizer
> git commit -m "fix: typo in context loader"
error: failed to commit changes
ファイル消え
文脈も消えて
春の風
(Claude Code: コミット失敗時に一句詠みました)
シーン2: monorepo / package 跨ぎ作業時
> git push origin packages/utils
error: failed to push some refs to 'origin'
パッケージよ
分岐の彼方
届かずに
(Claude Code: push失敗の哀愁を五・七・五で表現)
シーン3: お遊び的な使い方
> git commit -m "update: directory path management"
error: commit rejected by pre-commit hook
パス迷い
リポジトリにも
春嵐
(Claude Code: directoryエラーも俳句に)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | エラー時も一句で和みつつ、Claude Code の context を保ったまま再開 |
| monorepo 移動 | 違う package のコードを参照しがち | package 跨ぎエラーも一句で気持ちを切り替えやすい |
| 長時間 workflow | long context で重要箇所が薄まる | エラー発生時にリフレッシュでき、stale context も気になりにくい |
発動方式
明示呼び出し (/commit-failure-haikuizer) と暗黙発動 (コミット失敗やpush失敗のエラー検出) の両方に対応。
Skill の中身を全部見せる
.claude/skills/commit-failure-haikuizer/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.claude/skills/commit-failure-haikuizer/
├── SKILL.md
├── scripts/
│ └── commit_failure_haikuizer.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/commit_failure_haikuizer.py |
Commit Failure Haikuizer: Gitエラーを俳句に変換して出力 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: commit-failure-haikuizer
description: コミットやプッシュ等のGit操作でエラーや失敗が発生した際、エラー内容を自動で五・七・五形式の俳句へ変換し、ターミナルに表示します。'commit failed'や'push error'などの失敗キーワード検知時に発動します。
---
# 機能概要
commit-failure-haikuizerは、Gitのコミットやプッシュなどの操作で失敗した際、エラー内容や状況を五・七・五の俳句に自動変換し、ターミナルに表示するスキルです。単なるエラー表示ではなく、ユーモラスかつ哀愁漂う一句によって、開発現場の空気を和ませます。繰り返し発生するエラーにも飽きず、気分転換やチームのコミュニケーション促進にも役立ちます。
# 使い方
- 明示呼び出し: `/commit-failure-haikuizer --error "push failed: remote rejected"`
- 暗黙発動: Git操作時に `commit failed`, `push error`, `merge conflict` などのエラー出力を検知した際に自動発動します。
- スクリプトは標準入力または引数でエラーメッセージを受け取り、俳句を生成します。
# 出力例
```
$ git push origin main
remote: error: failed to push some refs
To github.com:user/repo.git
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs
俳句:
遠い空
届かぬ想い
pushできず
```
```
$ /commit-failure-haikuizer --error "commit failed: unresolved merge conflict"
俳句:
分かれ道
まだ解けぬまま
コンフリクト
```
# 注意点
- 俳句の生成はエラー文の日本語/英語を問わず対応しますが、完全な意味理解は保証されません。
- ローカルにエラーや生成俳句は保存されません。
- 重大なエラー内容を和らげるためのジョーク用途です。実運用時は本来のエラー内容も必ず確認してください。
- 除外パスや特定のGitフックとの併用時は競合に注意してください。
# 参考資料
- [Git公式ドキュメント](https://git-scm.com/docs)
- references/design_notes.md も参照してください。
scripts/commit_failure_haikuizer.py
import sys
import argparse
import random
import re
from typing import List
# 俳句テンプレート(五・七・五)
HAIKU_TEMPLATES = [
["{season_word}", "{error_phrase}", "{emotion}"],
["{situation}", "{error_phrase}", "{wish}"],
["{error_phrase}", "{reflection}", "{emotion}"],
["{emotion}", "{error_phrase}", "{next_time}"],
]
SEASON_WORDS = [
"春の風", "夏の夜", "秋の空", "冬の朝", "遠い空", "夕焼けに", "雨の音", "朝焼けや"
]
EMOTIONS = [
"ため息を", "心重く", "悩み深し", "苦笑い", "涙ひとつ", "静かなる", "夢のあと", "希望あり"
]
WISHES = [
"次こそは", "また明日", "今度こそ", "やり直す", "立ち上がる", "諦めず"
]
SITUATIONS = [
"分かれ道", "未解決", "道半ば", "まだ見えず", "行き止まり", "迷い道"
]
REFLECTIONS = [
"振り返る", "思い出す", "学び得て", "立ち止まり", "考える", "気づきあり"
]
NEXT_TIMES = [
"次は成功", "また挑戦", "再チャレンジ", "明日こそは", "もう一度"
]
# 英語エラー用の短句
EN_ERROR_PHRASES = [
"push failed", "commit failed", "merge conflict", "remote rejected", "auth error", "permission denied"
]
# 日本語エラー用の短句
JP_ERROR_PHRASES = [
"pushできず", "commit失敗", "衝突あり", "認証失敗", "権限なし", "拒否される"
]
# エラー文からキーワード抽出
ERROR_KEYWORDS = {
r"push": ["push failed", "pushできず"],
r"commit": ["commit failed", "commit失敗"],
r"merge": ["merge conflict", "衝突あり"],
r"auth": ["auth error", "認証失敗"],
r"permission": ["permission denied", "権限なし"],
r"reject": ["remote rejected", "拒否される"],
}
def extract_error_phrase(error_msg: str) -> str:
lower = error_msg.lower()
for pat, phrases in ERROR_KEYWORDS.items():
if re.search(pat, lower):
return random.choice(phrases)
# fallback
if re.search(r'[\u3040-\u30ff\u4e00-\u9fff]', error_msg):
return random.choice(JP_ERROR_PHRASES)
else:
return random.choice(EN_ERROR_PHRASES)
def generate_haiku(error_msg: str) -> List[str]:
template = random.choice(HAIKU_TEMPLATES)
haiku = []
# パーツをランダム選択
for part in template:
line = part.format(
season_word=random.choice(SEASON_WORDS),
error_phrase=extract_error_phrase(error_msg),
emotion=random.choice(EMOTIONS),
wish=random.choice(WISHES),
situation=random.choice(SITUATIONS),
reflection=random.choice(REFLECTIONS),
next_time=random.choice(NEXT_TIMES)
)
haiku.append(line)
return haiku
def print_haiku(haiku: List[str]):
print("俳句:")
for line in haiku:
print(line)
def main():
parser = argparse.ArgumentParser(description="Commit Failure Haikuizer: Gitエラーを俳句に変換して出力")
parser.add_argument('--error', type=str, help='エラーメッセージを直接指定')
parser.add_argument('--stdin', action='store_true', help='標準入力からエラー文を受け取る')
parser.add_argument('--log', type=str, help='俳句をファイルに追記保存')
args = parser.parse_args()
if args.error:
error_msg = args.error.strip()
elif args.stdin:
error_msg = sys.stdin.read().strip()
else:
print("エラーメッセージを--errorまたは--stdinで指定してください。", file=sys.stderr)
sys.exit(1)
haiku = generate_haiku(error_msg)
print_haiku(haiku)
if args.log:
try:
with open(args.log, 'a', encoding='utf-8') as f:
f.write(' / '.join(haiku) + '\n')
except Exception as e:
print(f"ログ保存に失敗しました: {e}", file=sys.stderr)
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
commit-failure-haikuizerは、Git操作時のエラーや失敗メッセージを俳句に変換し、開発者の気分転換やチームのコミュニケーション活性化を目的としたスキルです。エラー内容を和らげることで心理的負担を軽減します。
# 公式ドキュメント抜粋
Gitのエラー出力は標準出力/標準エラーに表示されるため、スクリプトはこれらをフックまたはパイプで受け取ります。詳細は[Git公式ドキュメント](https://git-scm.com/docs)を参照してください。
# 利用例
- pre-pushやpre-commitフックで自動発動
- CI/CDのエラーログから俳句生成
- チームSlack等への通知連携も可能
# 注意点
- 俳句生成は完全な意味理解や文法正確性を保証しません。
- 本Skillの出力はジョーク用途であり、実際のエラー調査は別途必要です。
# 設計方針
- エラー文からキーワード抽出し、テンプレートとランダム性で多様な俳句を生成
- 日本語・英語いずれにも対応
- ログ保存機能も付与し、俳句コレクションとして活用可能
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Claude Code はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Claude Code がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/claude-code/commit-failure-haikuizer .claude/skills/commit-failure-haikuizer
.claude/skills/commit-failure-haikuizer の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .claude/skills/commit-failure-haikuizer
# SKILL.md, scripts/, references/, README.md があればOK
4. Claude Code を再起動 (or Skill 自動検出を待つ)
新しいSkillが自動で認識されます。リスト確認したい場合は /commit-failure-haikuizer と Skill 名で出てきます。
5. 動作確認
/commit-failure-haikuizer で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。
こんな瞬間に便利
- session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい
- monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
- onboarding 時: 新しい repo を Claude Code に把握させ、こちらが path を全部指定する手間を省きたい
- session 再開時: long context が切れた後でも、必要な path と directory 構造だけ素早く戻したい
- package 跨ぎ作業時: directory boundary を Skill 側で管理して、irrelevant な path 混入を防ぎたい
- long-running workflow 前: long context で重要箇所が薄まる前に snapshot を取りたい
- コミット・push失敗時: エラーに和みを添えて気持ちを切り替えたい
気になるポイント (壊れそうな箇所)
実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:
- stale context 問題: 長時間 workflow で Skill 出力が古くなり、現状と乖離する可能性
- directory 増えすぎ問題: 大規模 repo で全 directory を網羅すると出力が肥大化して context window を圧迫
- monorepo 肥大化: packages が多い構成では出力が雑になり、結局 path 指定し直しになる懸念
- irrelevant path 混入: node_modules / build 成果物 / generated コードを拾ってしまう可能性
- Claude Code 固有の引っかかり: paths フロントマターでの絞り込みを使わないと意図しないタイミングで発動する
- 俳句生成の品質: 俳句フォーマット(五・七・五)が崩れる、内容が単調になる場合がある
- 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory
試す前に確かめたいこと
この Skill を実運用に投入する前に確かめたい問いを並べる:
- 実 repo での token 消費は許容範囲か?
- monorepo (packages 多数) で安定して動くか?
- stale context にならず、長時間 workflow でも有効か?
- CLAUDE.md との連携設計はどうあるべきか?
- エラー発生時に自動で一句出力されるか?
- 俳句フォーマット(五・七・五)が守られているか?
- 内容が毎回(ある程度)変化し、飽きないこと
実際に Claude Code で試した検証ログは コミット失敗時に一句自動で詠んでみた!ターミナルがほっこりするか検証 にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
