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 作業で集中力が切れそうな時、ふとしたタイミングで“言い訳”が現れてリフレッシュできる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
