Claude Codeでエラー通知を楽しく自動化するSkill構築ガイド

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

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

開発中、コマンド実行時にエラーが出ると、ただ淡々とエラーメッセージだけが表示され、気分が沈むことも少なくありません。特にClaude CodeのようにAI coding workflowが日常化していると、contextやrepository understandingに集中したいタイミングで、思いがけないエラーに気持ちが折れる場面もあります。通知や演出面が味気なく、モチベーション維持が課題になることも。

  • コマンド失敗時、ただエラーログが流れるだけで、気持ちが切り替わらず作業が停滞する
  • monorepoで複雑なdirectoryやpath managementをしていると、どこで失敗したのか分かりづらい
  • repository理解やonboarding中、失敗のたびに「またやってしまった」と自己肯定感が下がる
  • 長時間のAI coding workflowでlong contextが膨らむほど、エラー時の空気が重くなりがち
  • OSの通知領域を活用したフィードバックがなく、失敗時の体験が単調になりやすい

特に通知・演出・OS連携の機能が弱いと、「またエラーか…」というネガティブな印象が強調されがちです。

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

一言サマリ: コマンド実行でエラーが出た時Skill。

このSkillを導入することで、エラー発生時にOSの通知領域へ毎回違う“謎の言い訳”が自動表示されます。開発の失敗体験を楽しく演出し、モチベーション維持やストレス軽減に寄与します。

  • エラー発生時、OS通知領域にユーモラスな言い訳が表示され、気分転換になる
  • 毎回異なるメッセージで、長時間workflowやonboarding時も飽きずに楽しめる
  • 本来のエラーメッセージも保持されるため、原因究明やrepository understandingを妨げない
  • monorepoや複雑なdirectory構造でも、どこで失敗したかを明確に意識できる
  • AI coding workflowの中で、失敗体験を前向きに変換できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/command-failure-excuse-notifier .claude/skills/command-failure-excuse-notifier

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

Skill導入後、実際にClaude Codeでコマンドを実行した際のイメージを3パターンで紹介します。

シーン1: session 開始時 (CLAUDE.md と組み合わせて)


# /command-failure-excuse-notifier
> yarn install

yarn install v1.22.19
[1/4] Resolving packages...
error An unexpected error occurred: "EACCES: permission denied, mkdir '/usr/local/lib/node_modules'".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

[通知] コマンド失敗: 猫がキーボードを踏みました。たぶんあなたのせいではありません。

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


> cd packages/api
> npm run build

> api@1.0.0 build /Users/dev/project/packages/api
> tsc

src/index.ts(42,13): error TS2339: Property 'foo' does not exist on type 'Bar'.

[通知] コマンド失敗: 宇宙線がビットをひっくり返しました。次はうまくいくはずです。

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


> rm -rf important-folder

rm: cannot remove 'important-folder': Permission denied

[通知] コマンド失敗: 運命のせいです。今日は休憩しましょう。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 失敗時も気分転換でき、集中力が維持しやすい

発動方式

明示呼び出し (/command-failure-excuse-notifier) と暗黙発動(エラー検知時)どちらにも対応しています。

Skill の中身を全部見せる

.claude/skills/command-failure-excuse-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.claude/skills/command-failure-excuse-notifier/
├── SKILL.md
├── scripts/
│   └── command_failure_excuse_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/command_failure_excuse_notifier.py コマンド失敗時に言い訳を通知するSkill
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: command-failure-excuse-notifier
description: コマンド実行時にエラーや失敗が検出された場合、“言い訳”付きでOS通知を発火します。失敗検知・エラー出力・通知連携が必要な場面で自動発動します。
---

# 機能概要
このSkillは、コマンド実行時にエラーが発生した場合、通常のエラーメッセージだけでなく、毎回異なる“謎の言い訳”メッセージをOSの通知領域に自動表示します。例えば「猫がキーボードを踏みました」「宇宙線がビットをひっくり返しました」など、ユーモア溢れる言い訳がランダムに生成され、開発現場の空気を和らげます。失敗のストレスを軽減し、自己肯定感を高めることを目的としています。

# 使い方
- 明示呼び出し例: `/command-failure-excuse-notifier --run "ls /notfound"`
- 暗黙発動キーワード例: 「コマンド失敗」「エラー通知」「言い訳」「notify on error」などが含まれる場合、自動的にSkillが発動します。

# 出力例
```
$ python command_failure_excuse_notifier.py --run "cat missing.txt"
[ERROR] Command failed: cat missing.txt
[STDERR] cat: missing.txt: No such file or directory
[EXCUSE] 言い訳: 宇宙線がビットをひっくり返しました
(通知がOSに表示されます)
```

# 注意点
- OS通知はmacOS/Linux/Windowsの主要デスクトップ環境でサポートされますが、サーバやCUI専用環境では通知が表示されません。
- 言い訳メッセージは毎回ランダム生成されます。
- 本来のエラーメッセージは失われず、ターミナルにも出力されます。
- ローカルに通知履歴は保存されません。

# 参考資料
- [Python公式 subprocess.run](https://docs.python.org/ja/3/library/subprocess.html)
- [plyer通知API](https://github.com/kivy/plyer)
- references/design_notes.md に詳細な設計方針を記載

scripts/command_failure_excuse_notifier.py

import argparse
import subprocess
import random
import sys
import platform
from typing import List, Tuple

try:
    from plyer import notification
except ImportError:
    notification = None

EXCUSES = [
    "猫がキーボードを踏みました",
    "運命のせいです",
    "宇宙線がビットをひっくり返しました",
    "今日は星の巡りが悪いようです",
    "コーヒーをこぼしました",
    "ネットワークの妖精がいたずらしました",
    "月の引力が強すぎました",
    "バグではなく仕様です",
    "AIが休憩中でした",
    "きっと誰かのせいです"
]

def get_random_excuse() -> str:
    return random.choice(EXCUSES)

def send_notification(title: str, message: str):
    if notification:
        try:
            notification.notify(
                title=title,
                message=message,
                app_name="Command Failure Excuse Notifier",
                timeout=8
            )
        except Exception as e:
            print(f"[WARN] 通知送信に失敗: {e}", file=sys.stderr)
    else:
        # plyer未導入の場合は警告
        print("[WARN] plyer未導入のため通知は表示されません", file=sys.stderr)

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

def print_and_notify_error(command: List[str], returncode: int, stderr: str):
    print(f"[ERROR] Command failed: {' '.join(command)}")
    if stderr:
        print(f"[STDERR] {stderr.strip()}")
    excuse = get_random_excuse()
    print(f"[EXCUSE] 言い訳: {excuse}")
    send_notification(
        title="コマンド失敗: 言い訳通知",
        message=f"{excuse}\n(エラー: {' '.join(command)})"
    )

def list_excuses():
    print("利用可能な言い訳リスト:")
    for idx, excuse in enumerate(EXCUSES, 1):
        print(f"  {idx}. {excuse}")

def summary():
    print("Skill概要:")
    print("  コマンド失敗時に毎回異なる言い訳をOS通知&標準出力に表示します。\n  plyerによるクロスプラットフォーム通知対応。\n  言い訳はランダム選択されます。\n  エラーメッセージは失われません。")

def main():
    parser = argparse.ArgumentParser(description="コマンド失敗時に言い訳を通知するSkill")
    subparsers = parser.add_subparsers(dest="subcmd", help="サブコマンド")

    parser_run = subparsers.add_parser("run", help="コマンドを実行し失敗時に言い訳通知")
    parser_run.add_argument("--run", nargs=argparse.REMAINDER, help="実行するコマンド")

    parser_list = subparsers.add_parser("list", help="言い訳リストを表示")
    parser_summary = subparsers.add_parser("summary", help="Skill概要を表示")

    args = parser.parse_args()

    if args.subcmd == "run":
        if not args.run or len(args.run) == 0:
            print("--run の後に実行コマンドを指定してください", file=sys.stderr)
            sys.exit(2)
        command = args.run
        returncode, stdout, stderr = run_command(command)
        if returncode != 0:
            print_and_notify_error(command, returncode, stderr)
        else:
            print(stdout.strip())
    elif args.subcmd == "list":
        list_excuses()
    elif args.subcmd == "summary":
        summary()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発者がコマンド実行時に遭遇するエラー体験を、ユーモアを交えて前向きに変換することを目的としています。OS通知を活用し、失敗時の心理的負担を軽減します。

# 公式ドキュメント抜粋
- [Python subprocess.run](https://docs.python.org/ja/3/library/subprocess.html): コマンド実行とエラー検出に利用。
- [plyer通知API](https://github.com/kivy/plyer): クロスプラットフォームな通知送信。

# 利用例
- シェルスクリプトや自動化タスクのラップ。
- エラー時の自己肯定・チームの雰囲気改善。

# 注意点
- plyer未導入環境では通知が表示されません(pip install plyerで導入可能)。
- サーバやCUI専用環境では通知が無効化される場合があります。
- 言い訳リストはカスタマイズ可能ですが、Skill本体の編集が必要です。

# 設計方針
- 本来のエラー出力は絶対に失われない設計。
- OS依存を減らすためplyerを採用。
- サブコマンド設計で拡張性を確保。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/command-failure-excuse-notifier .claude/skills/command-failure-excuse-notifier

.claude/skills/command-failure-excuse-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .claude/skills/command-failure-excuse-notifier
# SKILL.md, scripts/, references/, README.md があればOK

4. Claude Code を再起動 (or Skill 自動検出を待つ)

新しいSkillが自動で認識されます。リスト確認したい場合は /command-failure-excuse-notifier と Skill 名で出てきます。

5. 動作確認

/command-failure-excuse-notifier で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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 を取りたい

気になるポイント (壊れそうな箇所)

実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:

  • 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 との連携設計はどうあるべきか?
  • OSごとの通知表示が正常に機能するか?
  • 言い訳メッセージが毎回違う内容になるか?
  • 本来のエラーメッセージは失われず参照できるか?

実際に Claude Code で試した検証ログは Claude Codeでエラー時に謎の言い訳通知を出してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

関連タグで他のSkill記事を探す

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

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

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