Claude Codeで懐かしのうざい通知を再現するSkill構築ガイド

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

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

Claude Code を日常的に使う開発者の多くが「またか」と感じる瞬間がある。特に、集中して作業を進めている時に、思わぬタイミングで余計な通知やアラートが現れると、ちょっとした笑いと同時に小さなイライラが生まれることも。
「通知・演出・OS連携」カテゴリーの悩みは、単なる情報伝達を超えて、開発体験そのものに影響を与える。以下のような「あるある」に心当たりがあるはずだ。

  • 作業に没頭しているときに、OSやツールから「今アップデートしませんか?」などの余計な通知が突然出てきて集中が途切れる
  • Claude Code の context が膨らみすぎて、重要な directory や repository 構造の記憶が薄れ、再度説明する羽目になる
  • monorepo で package を跨いだ瞬間、Claude Code が repository 構造や path management の流れを忘れてしまう
  • session 再開時に、前回の memory や path 指定をまた最初から説明し直す必要がある
  • 「ここはこういう directory 構成です」と毎回チャット冒頭で説明するのが面倒

こうした悩みの裏には、「どうせなら、もっと遊び心のある通知で気分転換したい」「昔のOS風のうざい演出を現代のAI coding workflowに持ち込みたい」という欲求も潜んでいる。

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

一言サマリ: このスキルは、作業中に“謎のOS風うざいツールチップ”をデスクトップ通知で炸裂させ、開発現場に懐かしの“助けにならないヘルプ”体験を再現します。

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

  • Claude Code の session や repository onboarding 時に、思わず笑ってしまう“余計なお世話”通知が自動で現れる
  • 集中しすぎて context や path management を忘れがちなタイミングで、強制的に“どうでもいい”通知が挟まることで気分転換になる
  • monorepo や長時間 workflow の中で、突然現れる謎の通知が職場の話題やネタになる
  • あえて「うざい」通知を演出することで、日常のAI coding workflowに遊び心とユーモアを持ち込める
  • Skill の明示呼び出しや description マッチで、いつでも好きなタイミングで“OS風小言”を炸裂させられる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-annoying-tooltips .claude/skills/random-os-annoying-tooltips

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

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

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


# /random-os-annoying-tooltips

[通知] 
「CapsLock が押されているかもしれません。解除しますか?」
[通知] 
「このリポジトリ、最後にアップデートしたのは3週間前です。今すぐアップデートしますか?」
[通知] 
「あなたの入力速度、最近落ちていませんか?コーヒーブレイクをおすすめします。」

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


> packages/core/ に移動

[通知] 
「複数の package を跨いでいます。依存関係は大丈夫ですか?」
[通知] 
「node_modules ディレクトリが肥大化しています。クリーンアップしませんか?」
[通知] 
「core/utils.js の関数名、そろそろリファクタしませんか?」

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


> /random-os-annoying-tooltips

[通知] 
「あなたが最後に保存したのは42分前です。未保存のまま進めますか?」
[通知] 
「このタイミングで再起動しませんか?理由は特にありません。」
[通知] 
「OSの壁紙、そろそろ変えたくなりませんか?」

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる “うざい”通知で強制的に context をリセット・気分転換できる

発動方式

明示呼び出し (/random-os-annoying-tooltips) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-annoying-tooltips/
├── SKILL.md
├── scripts/
│   └── annoying_tooltips.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-annoying-tooltips
description: このSkillは、作業中やコーディング時に“OS風うざいツールチップ”通知を不定期に表示します。明示呼び出しや「通知」「ヘルプ」「アップデート」などのキーワード検知で発動します。
---

# 機能概要
`random-os-annoying-tooltips`は、あなたの作業中に突然“懐かしのOS風うざいツールチップ”をデスクトップ通知として表示するスキルです。内容は「CapsLockが押されているかもしれません」「アップデートしませんか?」「入力速度が遅いかも」など、完全に余計なお世話な小言や謎の提案ばかり。集中している時ほど現れ、かつての“助けにならないヘルプ”体験を現代にリバイバルします。職場や自宅で「また出た!」と笑いとイライラをお届けします。

# 使い方
- 明示呼び出し例: `/random-os-annoying-tooltips`
- 暗黙発動キーワード例: 「通知」「アップデート」「CapsLock」「ヘルプ」「うざい」などを含む発言やコード実行時に自動発動します。
- CLIからは `python annoying_tooltips.py` で起動し、バックグラウンドで動作します。

# 出力例
```shell
[通知] CapsLockが押されているかもしれません。
[通知] 今すぐアップデートしませんか?
[通知] 入力速度が先週より5%低下しています。
[通知] 休憩を取るタイミングかもしれません。
[通知] あなたのクリップボードがいっぱいです。
```

# 注意点
- 本Skillは主要なOS(Windows, macOS, Linux)で動作しますが、通知機能はOSの仕様に依存します。
- 通知頻度は過剰にならないよう調整されていますが、長時間実行時はご注意ください。
- ローカル環境にのみ通知し、外部送信や保存は行いません。
- システム設定によっては通知が表示されない場合があります。

# 参考資料
- [plyer公式ドキュメント](https://plyer.readthedocs.io/en/latest/)
- references/design_notes.md も参照してください。

scripts/annoying_tooltips.py

import sys
import time
import random
import argparse
import threading
from datetime import datetime, timedelta

try:
    from plyer import notification
except ImportError:
    print('plyerパッケージが必要です。pip install plyer でインストールしてください。')
    sys.exit(1)

# うざいツールチップメッセージ集
TOOLTIPS = [
    'CapsLockが押されているかもしれません。',
    '今すぐアップデートしませんか?',
    '入力速度が先週より5%低下しています。',
    '休憩を取るタイミングかもしれません。',
    'あなたのクリップボードがいっぱいです。',
    'このウィンドウは本当に必要ですか?',
    'バッテリー残量は確認しましたか?',
    '再起動することで問題が解決するかもしれません。',
    '不要なファイルが溜まっていませんか?',
    'あなたのマウス移動距離が本日最小です。',
    '今こそバックアップを取りましょう。',
    'ネットワーク速度が平均より遅いようです。',
    '新しいフォントを試してみませんか?',
    'このタイミングで設定を見直しませんか?',
    'もう一度やり直してみませんか?',
    'ヘルプが必要ですか?',
    'タスクバーが散らかっています。',
    'ウィンドウを整理しましょう。',
    'あなたの入力方法が非効率かもしれません。',
    'この通知は無視しても構いません。',
]

# 通知履歴の管理
class TooltipLogger:
    def __init__(self):
        self.history = []
    def log(self, msg):
        now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.history.append({'time': now, 'msg': msg})
    def list(self, limit=10):
        return self.history[-limit:]
    def summary(self):
        return {'count': len(self.history)}

def send_tooltip(msg, logger):
    notification.notify(
        title='うざいOS風ツールチップ',
        message=msg,
        timeout=8
    )
    logger.log(msg)

def random_interval(min_sec=90, max_sec=600):
    return random.randint(min_sec, max_sec)

def annoy_loop(logger, stop_event, min_sec=90, max_sec=600):
    while not stop_event.is_set():
        msg = random.choice(TOOLTIPS)
        send_tooltip(msg, logger)
        interval = random_interval(min_sec, max_sec)
        for _ in range(interval):
            if stop_event.is_set():
                break
            time.sleep(1)

def cli_log(logger, args):
    for item in logger.list(args.limit):
        print(f"[{item['time']}] {item['msg']}")

def cli_summary(logger, args):
    s = logger.summary()
    print(f"通知回数: {s['count']}")

def cli_list(logger, args):
    cli_log(logger, args)

def main():
    parser = argparse.ArgumentParser(description='OS風うざいツールチップ通知スクリプト')
    subparsers = parser.add_subparsers(dest='command')

    run_parser = subparsers.add_parser('run', help='バックグラウンドでうざい通知を表示')
    run_parser.add_argument('--min', type=int, default=90, help='通知の最小間隔(秒)')
    run_parser.add_argument('--max', type=int, default=600, help='通知の最大間隔(秒)')

    log_parser = subparsers.add_parser('log', help='通知履歴を表示')
    log_parser.add_argument('--limit', type=int, default=10, help='表示件数')

    summary_parser = subparsers.add_parser('summary', help='通知回数のサマリを表示')

    args = parser.parse_args()
    logger = TooltipLogger()

    if args.command == 'run' or args.command is None:
        stop_event = threading.Event()
        try:
            print('うざい通知を開始します。Ctrl+Cで停止。')
            annoy_loop(logger, stop_event, min_sec=getattr(args, 'min', 90), max_sec=getattr(args, 'max', 600))
        except KeyboardInterrupt:
            stop_event.set()
            print('\n通知を停止しました。')
    elif args.command == 'log':
        cli_log(logger, args)
    elif args.command == 'summary':
        cli_summary(logger, args)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは「OSのうざい通知体験」を現代のデスクトップ環境で再現するため設計されました。plyerライブラリを用いてクロスプラットフォームな通知を実現しています。

# 公式ドキュメント抜粋
- plyer: https://plyer.readthedocs.io/en/latest/ 主要OSで同一インターフェースの通知APIを提供。

# 利用例
- 作業中の気分転換・チーム内の小ネタとして。
- コーディング時に「昔のOSのうざさ」を再現して場を和ませる用途。

# 注意点
- 通知頻度はmin/max間隔で調整可能ですが、長時間放置すると煩わしく感じる場合があります。
- plyerの通知はOS側の通知設定に依存するため、表示されない場合はシステム設定を確認してください。

# 設計方針
- 「うざいが笑える」ラインを重視し、実害のない内容のみを採用。
- ログや履歴はセッション内のみ保持し、ファイル保存や外部送信は行いません。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/random-os-annoying-tooltips .claude/skills/random-os-annoying-tooltips

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-annoying-tooltips で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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 との連携設計はどうあるべきか?
  • 通知頻度が高すぎて workflow を邪魔しないか?
  • 主要OS (Windows, macOS, Linux) で通知が正常に表示されるか?
  • 通知内容が“うざい”を超えて不快にならないか?

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

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

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

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

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