Claude Codeで業務に癒しを届ける言い訳通知の作り方入門

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

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

Claude Code を日常的に使っていると、AI coding workflow の中で思わず「またか…」と感じる瞬間が少なくありません。とくに repository understanding や context 管理、path management 周りは、ちょっとした手間や違和感が積み重なりがちです。そんな中、通知や演出系の Skill で「ちょっとした遊び心」が欲しくなる場面も。
以下のような悩みは、Claude Code ユーザーなら一度は経験があるはずです。

  • 長時間作業していると、OSの通知領域が静かすぎて逆に集中力が途切れる
  • AI が repository の構造や context を把握できていない時、何か「お知らせ」が欲しくなる
  • monorepo で directory を行き来していると、どこまでが relevant な path か曖昧になりがち
  • session を再開するたびに、前回の流れや重要な directory を思い出すのが面倒
  • 真面目な通知やヒントが表示されると身構えてしまい、逆にリラックスできない

通知・演出・OS連携系の Skill があれば、作業の合間にちょっとした息抜きや気分転換ができるのに…と考えたことがある人も多いのではないでしょうか。

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

一言サマリ: このスキルは、操作のたびに「全力で無意味な言い訳通知」をOSの通知領域にランダム表示するSkill。

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

  • AI coding workflow の合間に、思わず笑ってしまう“言い訳”が context を和ませてくれる
  • repository understanding のストレスや、path management の煩雑さを一瞬忘れられる
  • monorepo で directory を跨いだ際にも、無意味な通知が出てくることで「今は深刻な作業じゃない」と気楽になれる
  • session 再開時や onboarding 時に、堅苦しい説明や真面目な通知ではなく、遊び心ある演出が入る
  • 長時間の long context 作業で集中力が切れそうな時、ふとしたタイミングで“言い訳”が現れてリフレッシュできる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /random-excuse-notifier
> セッションを開始します

[OS通知] ネットワークが遅いので今日は反応が悪いかもしれません。
[Claude Code] 

Skill の中身を全部見せる

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

.claude/skills/random-excuse-notifier/
├── SKILL.md
├── scripts/
│   └── random_excuse_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-excuse-notifier
description: ターミナル操作やコマンド実行時、または /random-excuse-notifier 呼び出し時に、OS通知領域へランダムな言い訳メッセージを表示します。notify, excuse, notification, 言い訳 などのキーワードや明示呼び出しで発動。
---

# 機能概要
このSkillは、ターミナルでコマンドを実行した際や明示的に呼び出したとき、OSの通知領域に“全力で無意味な言い訳”をランダム表示します。例えば「ネットが遅い」「今日は水星逆行中」など、作業効率には一切寄与しない、ジョーク的な通知演出を提供します。通知内容は完全ランダムで、繰り返し利用してもネタが被りにくい設計です。作業の合間にクスッと笑いたい方や、真面目な通知に飽きた方に最適です。

# 使い方
- 明示呼び出し例:
  `/random-excuse-notifier`
- 暗黙発動キーワード例:
  - コマンド入力時に「notify」「excuse」「notification」「言い訳」などが含まれている場合
  - ターミナル操作やスクリプト実行時の自動発動

# 出力例
```
$ /random-excuse-notifier
[通知] 今日はキーボードが冷たくて指が動きません。
$ ls
[通知] ネットが遅いから時間かかってます。
$ git push
[通知] すみません、水星逆行中なのでうまくいきません。
$ echo hello
[通知] マウスが反応しませんでした。
$ python script.py
[通知] 今日は月が綺麗ですね。
```

# 注意点
- 通知はOSの標準通知APIを利用します(Linux: notify-send, macOS: osascript, Windows: win10toast)
- ネタは毎回ランダム抽選され、直近の履歴から重複を避けます
- ローカルに履歴ファイルを保存します(.random_excuse_history)
- 通知の内容は業務に全く役立ちません
- サーバ環境や通知API未対応OSでは動作しません

# 参考資料
- [Python公式 subprocess モジュール](https://docs.python.org/ja/3/library/subprocess.html)
- [notify-send (Linux)](https://specifications.freedesktop.org/notification-spec/latest/)
- [osascript (macOS)](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- references/design_notes.md 参照

scripts/random_excuse_notifier.py

import os
import sys
import random
import time
import argparse
import platform
import subprocess
from pathlib import Path

EXCUSES = [
    'ネットが遅いから時間かかってます。',
    '今日は水星逆行中なのでうまくいきません。',
    'マウスが反応しませんでした。',
    '今日はキーボードが冷たくて指が動きません。',
    '月が綺麗ですね。',
    'パソコンが眠そうです。',
    'コーヒーが切れています。',
    '電磁波の影響かも。',
    '猫がキーボードを踏みました。',
    '今日は運気が悪いです。',
    'Wi-Fiの神様がご機嫌ななめです。',
    'エンターキーが重いです。',
    'CPUが考えごとをしています。',
    'OSがやる気を出していません。',
    '今日は満月なので不調です。',
    'ファイルがどこかに旅立ちました。',
    '更新ボタンを押し忘れました。',
    'システムが昼寝中です。',
    '気圧の影響です。',
    '今日は何もかもうまくいかない日です。'
]

HISTORY_PATH = Path.home() / '.random_excuse_history'
HISTORY_SIZE = 5


def get_last_excuses():
    if not HISTORY_PATH.exists():
        return []
    try:
        with open(HISTORY_PATH, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        return [line.strip() for line in lines if line.strip()]
    except Exception:
        return []

def save_excuse_to_history(excuse):
    history = get_last_excuses()
    history.append(excuse)
    if len(history) > HISTORY_SIZE:
        history = history[-HISTORY_SIZE:]
    try:
        with open(HISTORY_PATH, 'w', encoding='utf-8') as f:
            for line in history:
                f.write(line + '\n')
    except Exception:
        pass

def pick_random_excuse():
    history = set(get_last_excuses())
    candidates = [e for e in EXCUSES if e not in history]
    if not candidates:
        candidates = EXCUSES
    return random.choice(candidates)

def notify(excuse):
    system = platform.system()
    if system == 'Linux':
        try:
            subprocess.run(['notify-send', excuse], check=True)
        except Exception:
            print(f'[通知] {excuse}')
    elif system == 'Darwin':
        script = f'display notification "{excuse}" with title "通知"'
        try:
            subprocess.run(['osascript', '-e', script], check=True)
        except Exception:
            print(f'[通知] {excuse}')
    elif system == 'Windows':
        try:
            from win10toast import ToastNotifier
            toaster = ToastNotifier()
            toaster.show_toast('通知', excuse, duration=5)
        except ImportError:
            print(f'[通知] {excuse} (win10toast未インストール)')
        except Exception:
            print(f'[通知] {excuse}')
    else:
        print(f'[通知] {excuse}')

def list_excuses():
    print('--- 言い訳リスト ---')
    for i, e in enumerate(EXCUSES, 1):
        print(f'{i:2d}: {e}')

def show_history():
    print('--- 最近の通知履歴 ---')
    history = get_last_excuses()
    if not history:
        print('履歴はありません。')
    else:
        for i, e in enumerate(history, 1):
            print(f'{i:2d}: {e}')

def main():
    parser = argparse.ArgumentParser(description='ランダム言い訳通知スクリプト')
    subparsers = parser.add_subparsers(dest='command')

    parser_notify = subparsers.add_parser('notify', help='言い訳をランダム通知')
    parser_list = subparsers.add_parser('list', help='言い訳一覧を表示')
    parser_history = subparsers.add_parser('history', help='最近の通知履歴を表示')
    parser_batch = subparsers.add_parser('batch', help='複数回ランダム通知')
    parser_batch.add_argument('-n', '--number', type=int, default=3, help='通知回数')
    args = parser.parse_args()

    if args.command == 'notify' or args.command is None:
        excuse = pick_random_excuse()
        notify(excuse)
        save_excuse_to_history(excuse)
    elif args.command == 'list':
        list_excuses()
    elif args.command == 'history':
        show_history()
    elif args.command == 'batch':
        for _ in range(args.number):
            excuse = pick_random_excuse()
            notify(excuse)
            save_excuse_to_history(excuse)
            time.sleep(1)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、OSの通知APIを使い、ターミナル操作時に“言い訳”をジョークとして通知する演出用ツールです。Python標準のsubprocessと、各OSの通知手段(notify-send, osascript, win10toast)を採用しました。

# 公式ドキュメント抜粋
- Linux: notify-send (freedesktop.org)
- macOS: osascript (AppleScript)
- Windows: win10toast (PyPI)

# 利用例
- ターミナルで何か操作するたびに通知
- `/random-excuse-notifier notify` で明示的に通知
- `list`/`history` サブコマンドで言い訳一覧や履歴も確認可能

# 注意点
- サーバやWSLなど通知API未対応環境では端末出力のみ
- win10toastはWindowsでのみ動作し、pipでの事前インストールが必要
- 履歴はホームディレクトリの `.random_excuse_history` に保存

# 設計方針
- 直近の言い訳履歴を避けてランダム性を担保
- OSごとに最適な通知手段を自動選択
- コードは100行超の可読性・拡張性重視

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-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
  • 通知が多すぎると逆効果: 無意味な通知が頻繁すぎると、逆に集中力が途切れるリスク
  • OS通知APIの互換性: 環境によっては通知が正しく表示されない場合がある

試す前に確かめたいこと

この Skill を実運用に投入する前に確かめたい問いを並べる:

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知がOSの通知領域に確実に表示されるか?
  • 言い訳メッセージが完全にランダムで、繰り返し操作してもネタが被りにくいか?

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

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

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

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

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