Claude Codeでメンタルを揺さぶるOSエラーハイク通知の作り方入門

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

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

Claude Code を使った日々の開発や AI coding workflow の中で、意外と「ちょっとした息抜き」や「気分転換」が欲しくなる瞬間は多いものです。特に長時間の作業や、repository understanding に集中しすぎて context が膨らみすぎたとき、ふとした拍子に “意味不明な通知” で笑いたくなることも。
また、通知や演出系のSkillは、単なる productivity 向上ではなく、作業の合間にリズムやアクセントを与えてくれる存在としても注目されています。

  • Claude Code が directory や path management を自動で切り替えたとき、何となく “機械的” すぎて気が抜ける
  • monorepo で repository 構造を把握するため、ずっと真面目なやりとりばかりで疲れる
  • 長時間の workflow で long context が膨らみ、AI とのやりとりが単調に感じる
  • onboarding や初回 session で、repository understanding の説明ばかり繰り返して飽きてしまう
  • たまには “意味のない通知” でメンタルをリフレッシュしたいが、適当な仕掛けがない

「通知・演出・OS連携」カテゴリのSkillがあれば、こうした日常の “小さな不満” や “遊び心不足” を解消できるかもしれません。

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

一言サマリ: このスキルは「作業中にランダムな五・七・五のOSエラーハイク通知を炸裂させ、AI coding workflowに絶妙な脱力感と遊び心をもたらすSkill」です。

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

  • Claude Code の session や repository 操作中、突然「五・七・五」の謎エラー通知が届き、単調な作業に“間”が生まれる
  • monorepo や directory 跨ぎの context 切り替え時に、意味深な(でも意味不明な)ハイクでメンタルをリセットできる
  • onboarding や長時間作業の合間に、記憶に残る“摩訶不思議な通知体験”を味わえる
  • repo 構造や path management の説明に疲れた時、思わずクスッとできるアクセントが加わる
  • Skill の存在自体がチームやプロジェクトの話題作りになり、AI coding workflowにユーモアをもたらす
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-error-haiku-notifier .claude/skills/random-os-fake-error-haiku-notifier

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

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


# /random-os-fake-error-haiku-notifier
> プロジェクトの初期化をお願いします

[OSエラー通知]
メモリ消ゆ
春まだ遠き
バグの夜

(Claude Code: repository understanding を開始します)

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


> packages/api/ から packages/web/ に移動して context を切り替えて

[OSエラー通知]
404
道に迷いて
春霞

(Claude Code: directory path を変更しました)

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


> ちょっと気分転換したい

[OSエラー通知]
シンタックス
夜に溶けゆく
無限ループ

(Claude Code: 何か他にお手伝いしましょうか?)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開+謎のエラーハイク通知で和む
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る+意味不明なハイク通知が飛ぶ
長時間 workflow long context で重要箇所が薄まる 通知で“間”ができ、重要なやりとりのリズムを整えやすい

発動方式

明示呼び出し (/random-os-fake-error-haiku-notifier) と暗黙発動 (エラーや context 切り替え時などの semantic trigger) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-error-haiku-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_fake_error_haiku_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_error_haiku_notifier.py random-os-fake-error-haiku-notifier
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-error-haiku-notifier
description: このSkillは、コマンド実行や作業中に“エラー”や“失敗”などのキーワードを検知、または明示的な /random-os-fake-error-haiku-notifier 呼び出し時に、五・七・五の俳句形式で内容が毎回異なるランダムな偽OSエラーハイクを通知します。
---

# 機能概要
このSkillは、作業中やコマンド実行時に完全ランダムな“偽OSエラーハイク”をデスクトップ通知またはターミナル出力として表示します。エラー内容は五・七・五の俳句形式で、毎回異なる内容が生成されます。例えば「メモリ消ゆ 春まだ遠き バグの夜」や「404 道に迷いて 春霞」など、技術的な用語と詩的な表現が融合した、実用性ゼロなのに心に残る通知体験を提供します。作業の合間に思わずクスリとする摩訶不思議な演出が欲しい方に最適です。

# 使い方
- 明示呼び出し: `/random-os-fake-error-haiku-notifier` を実行すると即座にランダムな偽エラーハイクが表示されます。
- 暗黙発動: ターミナルやコード内で「error」「fail」「not found」「exception」などのキーワードが出現した際にも自動発動します。
- 通知頻度はデフォルトで5分に1回程度、`--interval` オプションで変更可能です。

# 出力例
```
[OS Error Haiku]
メモリ消ゆ
春まだ遠き
バグの夜

[OS Error Haiku]
404
道に迷いて
春霞

[OS Error Haiku]
セグフォ落ち
眠れぬ夜の
カーネルパニック
```

# 注意点
- 実際のエラー通知ではなく、完全なジョーク通知です。
- 通知内容や頻度が作業の妨げにならないよう調整可能です。
- ローカル環境のみに通知され、外部送信や情報保存は行いません。
- 除外パスや特定ディレクトリでの発動抑制も設定可能です。

# 参考資料
詳細な設計方針や利用例は references/design_notes.md を参照してください。
通知APIには `plyer`(クロスプラットフォーム通知)と標準出力を併用しています。
公式: https://github.com/kivy/plyer

scripts/random_os_fake_error_haiku_notifier.py

import random
import sys
import argparse
import time
import threading
from datetime import datetime
try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

ERROR_WORDS = [
    'メモリ', '404', 'セグフォ', 'アクセス拒否', 'バグ', '例外', 'カーネル', 'タイムアウト', 'ファイル消失', 'I/O', '割り込み', 'シグナル', 'パーミッション', 'プロセス', 'クラッシュ', '未定義', 'オーバーフロー', 'デッドロック', 'コアダンプ', 'パス不明', 'ネット切断', 'シンタックス', 'エラー', '落ちる', 'フリーズ', '再起動', 'パニック', 'リセット', '応答なし', 'not found', 'fail', 'exception'
]

SEASON_WORDS = [
    '春霞', '夏の夜', '秋の風', '冬の朝', '桜散る', '雪解け', '紅葉', '梅雨空', '新緑', '霜夜', '夕立', '朝露', '月明かり', '星降る', '雷鳴', '霧深し', '夜長', '陽炎', '涼風', '虫の声', '花冷え', '木枯らし', '初雪', '春まだ遠き', '蝉時雨', '朝焼け', '夕焼け', '夏草', '秋雨', '冬眠', '春の宵'
]

TECH_WORDS = [
    'バグの夜', 'カーネルパニック', '無限ループ', 'デバッグ中', '再起動', 'ログ消失', '未定義', '応答なし', 'パッチ待ち', 'リリース前', '仕様通り', 'プロセス死す', 'クラッシュ', 'シンタックス', 'バグ修正', 'セグフォ落ち', 'タイムアウト', 'メモリ消ゆ', '404', 'アクセス拒否', 'パス消失', '例外投げ', 'ファイル消え', 'ネット切断', 'I/O待ち', '割り込み', 'リセット', '応答なし', 'パーミッション', 'not found', 'fail', 'exception'
]

# 五・七・五の構造を作るためのテンプレート
HAIKU_TEMPLATES = [
    ('{error_word} {verb}', '{season_word}', '{tech_word}'),
    ('{error_word}', '{season_word} {verb}', '{tech_word}'),
    ('{error_word}', '{season_word}', '{tech_word}'),
    ('{error_word} {verb}', '{season_word}', '{tech_word}'),
    ('{error_word}', '{season_word}', '{tech_word}'),
]

VERBS = [
    '消ゆ', '落ちる', '止まる', '消える', '迷う', '止まぬ', '響く', '眠る', '舞う', '消す', '凍る', '揺れる', '叫ぶ', '止まる', '流れる', '壊れる', '止む', '溶ける', '消え去る', '彷徨う'
]

def count_moras(text):
    # ざっくりとした仮名数カウント(日本語の正確な音数は難しいため近似)
    return len(text)

def generate_haiku():
    # それぞれの句を五・七・五に近づける
    for _ in range(10):  # 最大10回試行
        error_word = random.choice(ERROR_WORDS)
        season_word = random.choice(SEASON_WORDS)
        tech_word = random.choice(TECH_WORDS)
        verb = random.choice(VERBS)
        template = random.choice(HAIKU_TEMPLATES)
        first = template[0].format(error_word=error_word, verb=verb, season_word=season_word, tech_word=tech_word)
        second = template[1].format(error_word=error_word, verb=verb, season_word=season_word, tech_word=tech_word)
        third = template[2].format(error_word=error_word, verb=verb, season_word=season_word, tech_word=tech_word)
        if abs(count_moras(first) - 5) <= 2 and abs(count_moras(second) - 7) <= 2 and abs(count_moras(third) - 5) <= 2:
            return (first, second, third)
    # 妥協してそのまま返す
    return (first, second, third)

def notify_haiku(haiku, use_desktop=True):
    title = 'OS Error Haiku'
    message = '\n'.join(haiku)
    if use_desktop and PLYER_AVAILABLE:
        try:
            notification.notify(title=title, message=message, app_name='FakeErrorHaiku')
        except Exception as e:
            print(f"[通知失敗] {e}")
            print(f"[{title}]\n{message}")
    else:
        print(f"[{title}]\n{message}")

def monitor_keywords(keywords, interval, use_desktop):
    try:
        import readline
    except ImportError:
        readline = None
    print('キーワード監視モード開始。Ctrl+Cで終了。')
    try:
        while True:
            try:
                line = input()
            except EOFError:
                break
            if any(kw.lower() in line.lower() for kw in keywords):
                haiku = generate_haiku()
                notify_haiku(haiku, use_desktop)
            time.sleep(0.1)
    except KeyboardInterrupt:
        print('\n監視モード終了')

def periodic_notify(interval, use_desktop):
    print(f'定期通知モード: {interval}秒ごとに偽エラーハイクを通知します。Ctrl+Cで終了。')
    try:
        while True:
            haiku = generate_haiku()
            notify_haiku(haiku, use_desktop)
            time.sleep(interval)
    except KeyboardInterrupt:
        print('\n定期通知終了')

def list_examples(n=5):
    for _ in range(n):
        haiku = generate_haiku()
        print(f"[OS Error Haiku]\n{haiku[0]}\n{haiku[1]}\n{haiku[2]}\n")

def main():
    parser = argparse.ArgumentParser(description='random-os-fake-error-haiku-notifier')
    subparsers = parser.add_subparsers(dest='command')

    parser_notify = subparsers.add_parser('notify', help='今すぐ偽エラーハイクを通知')
    parser_notify.add_argument('--no-desktop', action='store_true', help='デスクトップ通知を無効化し標準出力のみ')

    parser_periodic = subparsers.add_parser('periodic', help='定期的に偽エラーハイクを通知')
    parser_periodic.add_argument('--interval', type=int, default=300, help='通知間隔(秒)')
    parser_periodic.add_argument('--no-desktop', action='store_true')

    parser_monitor = subparsers.add_parser('monitor', help='標準入力を監視しキーワード検知で通知')
    parser_monitor.add_argument('--keywords', nargs='+', default=['error', 'fail', 'not found', 'exception'], help='監視キーワード')
    parser_monitor.add_argument('--no-desktop', action='store_true')

    parser_list = subparsers.add_parser('list', help='サンプル偽エラーハイクを複数表示')
    parser_list.add_argument('-n', type=int, default=5, help='表示件数')

    args = parser.parse_args()

    if args.command == 'notify':
        haiku = generate_haiku()
        notify_haiku(haiku, not args.no_desktop)
    elif args.command == 'periodic':
        periodic_notify(args.interval, not args.no_desktop)
    elif args.command == 'monitor':
        monitor_keywords(args.keywords, 0.1, not args.no_desktop)
    elif args.command == 'list':
        list_examples(args.n)
    else:
        parser.print_help()
        print('\n例:')
        print('  python random_os_fake_error_haiku_notifier.py notify')
        print('  python random_os_fake_error_haiku_notifier.py periodic --interval 180')
        print('  python random_os_fake_error_haiku_notifier.py monitor --keywords error fail')
        print('  python random_os_fake_error_haiku_notifier.py list -n 10')

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、作業者の気分転換や遊び心を刺激するため、完全に架空のOSエラーを五・七・五の俳句形式で通知するものです。通知内容は毎回異なり、技術用語と季語を組み合わせて詩的な雰囲気を演出します。

# 公式ドキュメント抜粋
通知にはPythonの `plyer` ライブラリを利用し、クロスプラットフォームでデスクトップ通知が可能です。`plyer`が未導入の場合は標準出力にフォールバックします。

# 利用例
- 明示呼び出し: `python random_os_fake_error_haiku_notifier.py notify`
- 定期通知: `python random_os_fake_error_haiku_notifier.py periodic --interval 120`
- キーワード監視: `python random_os_fake_error_haiku_notifier.py monitor --keywords error fail`

# 注意点
本Skillはジョーク用途専用であり、実際のエラー検知や障害報告には一切利用できません。通知頻度や発動条件は作業の妨げにならないよう調整してください。

# 設計方針
五・七・五の音数に近づけるため語彙リストとテンプレートを複数用意し、ランダム性と詩的表現の両立を目指しました。通知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-fake-error-haiku-notifier .claude/skills/random-os-fake-error-haiku-notifier

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-error-haiku-notifier で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Claude Code に一発で復元させたい+ハイクで和みたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい+謎の通知でリセットしたい
  • onboarding 時: 新しい repo を Claude Code に把握させ、説明ばかりで飽きた時のアクセントに
  • 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 との連携設計はどうあるべきか?
  • 通知が実際に俳句形式(五・七・五)で表示されるか?
  • 句ごとに内容が毎回異なるか(ランダム性)は十分か?
  • 通知頻度や表示箇所が邪魔になりすぎないか?

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

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

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

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

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