Claude Codeでエラーメッセージをユニークに変換するSkillの作り方

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

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

コーディング中、特に長時間のAI coding workflowや大規模なrepository作業では、エラーが発生したときに気分が沈みがちです。真剣に作業している最中に、見慣れた「Permission denied」や「File not found」といったエラーメッセージが繰り返し表示されると、単調さやストレスを感じることも少なくありません。Claude Codeはcontextやdirectoryを柔軟に切り替えつつも、エラー出力はどのOSでも同じような表現になりがちです。

  • 毎回同じエラーメッセージばかりで、作業がマンネリ化しやすい
  • monorepoの異なるpackage間でcontextが切り替わる際、どのdirectoryで何が起きているか分かりづらくなる
  • repository understandingの途中でエラーが出ると、AIとのやりとりが一気に固くなる
  • onboardingや初回導入時、エラー内容が堅苦しくて新規メンバーの心理的ハードルが上がる
  • 長時間作業でlong contextが膨らみ、重要なエラー情報が埋もれてしまう

こうした悩みを少しでも和らげ、日々のAI coding workflowに遊び心やリフレッシュを加えたいという声が上がっています。

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

一言サマリ: このスキルは、エラー発生時に“別のOS風”ジョーク変換を自動で挟み、コーディング体験をカオスかつ楽しくするSkill。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • エラー発生時に毎回違う“OS風”演出でメッセージが変換され、作業中の気分転換になる
  • repositoryやdirectoryごとに変化を楽しめ、onboardingや初学者の心理的な負担を軽減
  • 元のエラー内容も併記されるため、実用性を損なわずに遊び心を追加できる
  • 長時間のAI coding workflowでも、思わず突っ込みたくなるcontext演出で集中力が切れにくい
  • Claude CodeのSkill拡張で、日常のエラー体験が一味違うものに変わる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-error-translator .claude/skills/random-os-error-translator

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


# /random-os-error-translator
> main.py を実行

[MS-DOS風]
このファイルは神聖にして侵入を禁ず (Error Code: 5)
Tip: ファイルの属性を確認してください

[元のエラー]
Permission denied: 'main.py'

[Skill: random-os-error-translator]
OS風演出を適用しました。元のエラーは上記をご参照ください。

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


> cd packages/user-service
> python manage.py migrate

[謎の国産OS風]
推奨されていない操作です。管理者に連絡してください。
(エラー発生箇所: packages/user-service/models.py)

[元のエラー]
FileNotFoundError: 'migrations/0001_initial.py' not found

[Skill: random-os-error-translator]
エラーが異なるOS風で表示されました。

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


> cat secret.txt

[古代UNIX風]
おい、そこの君!そのファイルにはアクセスできんぞ。
(UID: 1001, GID: 1001)

[元のエラー]
Permission denied: 'secret.txt'

[Skill: random-os-error-translator]
演出モード: 古代UNIX風

before / after の違い

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

発動方式

明示呼び出し (/random-os-error-translator) と暗黙発動 (エラー発生時に自動適用) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-error-translator/
├── SKILL.md
├── scripts/
│   └── random_os_error_translator.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_error_translator.py エラーメッセージに最もマッチするOS風パターンをランダムに選択
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-error-translator
description: エラー発生時や例外検出時に自動で発動し、エラーメッセージを“別のOS風”にパロディ変換して表示します。明示的な /random-os-error-translator コマンドでも利用可能です。エラー、例外、permission denied、file not found などのキーワードに反応します。
---

# 機能概要
このSkillは、コマンドラインやターミナルで発生する各種エラーを、複数の“架空または懐かしのOS風”に自動変換して表示します。たとえば「Permission denied」を「このファイルは神聖にして侵入を禁ず(MS-DOS風)」や、「File not found」を「指定されたファイルは宇宙の彼方に消えました(国産OS風)」など、意味不明な演出で日常の作業に笑いとカオスをもたらします。元のエラー内容も簡単に参照できるので、実用性も確保しています。

# 使い方
- 明示呼び出し例: `/random-os-error-translator "Permission denied: 'test.txt'"`
- 暗黙発動キーワード例: `permission denied`, `file not found`, `is a directory`, `operation not permitted` などのエラー発生時に自動変換。

# 出力例
```
[OS風エラー演出: AmigaOS]
> ファイルへのアクセスは銀河評議会の承認が必要です。
[元のエラー]: Permission denied: 'test.txt'

[OS風エラー演出: MS-DOS]
> このファイルは神聖にして侵入を禁ず。
[元のエラー]: Permission denied: 'test.txt'

[OS風エラー演出: 謎の国産OS]
> 推奨されていない操作です。
[元のエラー]: Operation not permitted
```

# 注意点
- 本Skillはジョーク用途です。実際のエラー解決には元のエラーメッセージを参照してください。
- 一部のエラー内容は意図的に誇張・改変されています。
- ローカルにエラーログを保存する機能がありますが、個人情報や機密情報の取り扱いに注意してください。
- 除外パス: システムクリティカルなコマンドや管理者権限操作時は自動変換を抑制します。

# 参考資料
- 詳細な設計や演出パターンは `references/design_notes.md` を参照
- Python 標準の `os`, `random`, `argparse` などを活用
- 公式: https://ai-note.tech/skills/random-os-error-translator

scripts/random_os_error_translator.py

import argparse
import random
import sys
import os
import datetime
from typing import List, Dict

# OS風エラー演出パターン
OS_ERROR_PATTERNS = [
    {
        'name': 'MS-DOS',
        'patterns': [
            ('Permission denied', 'このファイルは神聖にして侵入を禁ず。'),
            ('File not found', '指定されたファイルは存在しません。'),
            ('Is a directory', 'これはディレクトリです。ファイル操作は無効です。'),
            ('Operation not permitted', '推奨されていない操作です。'),
            ('No such file or directory', 'ファイルまたはディレクトリが見つかりません。'),
        ]
    },
    {
        'name': 'AmigaOS',
        'patterns': [
            ('Permission denied', 'ファイルへのアクセスは銀河評議会の承認が必要です。'),
            ('File not found', 'ファイルは時空の狭間に消えました。'),
            ('Is a directory', 'ディレクトリは生命体です。敬意を払いましょう。'),
            ('Operation not permitted', 'この操作は宇宙法により禁止されています。'),
            ('No such file or directory', '探索したが見つかりませんでした。'),
        ]
    },
    {
        'name': '謎の国産OS',
        'patterns': [
            ('Permission denied', '推奨されていない操作です。'),
            ('File not found', '指定されたファイルは宇宙の彼方に消えました。'),
            ('Is a directory', 'ディレクトリ操作は管理者のみ許可されています。'),
            ('Operation not permitted', 'この操作は現在サポートされていません。'),
            ('No such file or directory', 'ファイルが見つかりませんでした。'),
        ]
    },
    {
        'name': 'Unix System V',
        'patterns': [
            ('Permission denied', 'アクセス権限がありません。'),
            ('File not found', 'ファイルが存在しません。'),
            ('Is a directory', 'ディレクトリに対して無効な操作です。'),
            ('Operation not permitted', '操作が許可されていません。'),
            ('No such file or directory', '指定されたパスが無効です。'),
        ]
    },
    {
        'name': 'Macintosh System 7',
        'patterns': [
            ('Permission denied', 'このファイルはFinderによってロックされています。'),
            ('File not found', 'アイコンがデスクトップから消えました。'),
            ('Is a directory', 'フォルダには直接アクセスできません。'),
            ('Operation not permitted', 'この操作はサポートされていません。'),
            ('No such file or directory', '指定されたアイテムが見つかりません。'),
        ]
    },
]

LOG_FILE = os.path.expanduser('~/.random_os_error_translator.log')


def parse_args():
    parser = argparse.ArgumentParser(description='ランダムOS風エラートランスレータ')
    subparsers = parser.add_subparsers(dest='command')

    # 明示呼び出し
    run_parser = subparsers.add_parser('run', help='エラーメッセージを変換')
    run_parser.add_argument('error_message', type=str, help='変換対象のエラーメッセージ')

    # ログ閲覧
    log_parser = subparsers.add_parser('log', help='変換履歴を表示')
    log_parser.add_argument('--tail', type=int, default=10, help='直近N件のみ表示')

    # サマリー
    summary_parser = subparsers.add_parser('summary', help='変換パターンのサマリー')

    return parser.parse_args()


def select_os_pattern(error_message: str) -> Dict:
    """
    エラーメッセージに最もマッチするOS風パターンをランダムに選択
    """
    candidates = []
    for os_pattern in OS_ERROR_PATTERNS:
        for key, val in os_pattern['patterns']:
            if key.lower() in error_message.lower():
                candidates.append((os_pattern['name'], val))
    if not candidates:
        # 完全一致しない場合はランダムなOS名でジェネリックな演出
        os_pattern = random.choice(OS_ERROR_PATTERNS)
        return {
            'os': os_pattern['name'],
            'message': '未知のエラーが発生しました。詳細は管理者にお問い合わせください。'
        }
    os_name, os_msg = random.choice(candidates)
    return {
        'os': os_name,
        'message': os_msg
    }


def format_output(os_name: str, os_msg: str, orig_error: str) -> str:
    return f"[OS風エラー演出: {os_name}]\n> {os_msg}\n[元のエラー]: {orig_error}\n"


def log_translation(os_name: str, os_msg: str, orig_error: str):
    now = datetime.datetime.now().isoformat()
    with open(LOG_FILE, 'a', encoding='utf-8') as f:
        f.write(f"{now}\t{os_name}\t{os_msg}\t{orig_error}\n")


def show_log(tail: int = 10):
    if not os.path.exists(LOG_FILE):
        print('変換履歴はまだありません。')
        return
    with open(LOG_FILE, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    for line in lines[-tail:]:
        dt, os_name, os_msg, orig_error = line.strip().split('\t')
        print(f"[{dt}] {os_name}: {os_msg} (元エラー: {orig_error})")


def show_summary():
    print('--- OS風エラー演出パターン一覧 ---')
    for os_pattern in OS_ERROR_PATTERNS:
        print(f"- {os_pattern['name']}")
        for key, val in os_pattern['patterns']:
            print(f"    '{key}' → '{val}'")
    print('\n演出パターンは随時追加可能です。')


def main():
    args = parse_args()
    if args.command == 'run':
        result = select_os_pattern(args.error_message)
        output = format_output(result['os'], result['message'], args.error_message)
        print(output)
        log_translation(result['os'], result['message'], args.error_message)
    elif args.command == 'log':
        show_log(args.tail)
    elif args.command == 'summary':
        show_summary()
    else:
        print('使い方:')
        print('  python random_os_error_translator.py run "Permission denied: test.txt"')
        print('  python random_os_error_translator.py log --tail 5')
        print('  python random_os_error_translator.py summary')

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、コマンドライン作業時のエラー体験をユーモラスに演出するため設計されました。エラー発生時に“OS風”のパロディメッセージを自動生成し、作業者の気分転換やチーム内コミュニケーションのきっかけを提供します。

# 公式ドキュメント抜粋
- Python公式: https://docs.python.org/ja/3/library/argparse.html
- OSエラー一覧: https://man7.org/linux/man-pages/man3/errno.3.html

# 利用例
- ターミナルで `python random_os_error_translator.py run "File not found: foo.txt"` を実行
- ログ閲覧: `python random_os_error_translator.py log --tail 3`
- サマリー表示: `python random_os_error_translator.py summary`

# 注意点
- 実際のエラー解決には元のメッセージを参照してください。
- システムクリティカルな操作では自動変換を抑制してください。

# 設計方針
- パターンは拡張容易なdict構造で管理
- ログ保存で再利用性・検証性を確保
- 明示/暗黙の両トリガーに対応
- 実在するAPIのみ利用し、外部依存を最小化

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/random-os-error-translator .claude/skills/random-os-error-translator

.claude/skills/random-os-error-translator の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .claude/skills/random-os-error-translator
# SKILL.md, scripts/, references/, README.md があればOK

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

新しいSkillが自動で認識されます。リスト確認したい場合は /random-os-error-translator と Skill 名で出てきます。

5. 動作確認

/random-os-error-translator で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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風変換”メッセージが表示されるか?
  • 元のエラー内容も簡単に確認できるか?
  • OS風演出パターンが複数あり、毎回変化するか?

実際に Claude Code で試した検証ログは Claude Codeでエラーを別OS風に変換してみた!不思議なエラー演出体験 にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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