Claude Codeで作業中に癒やしと驚きを与える通知演出Skillの構築手順

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

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

Claude Code を日々使い込んでいると、コード生成やリポジトリ管理の真剣なやり取りに没頭しがちです。真面目な AI coding workflow だからこそ、単調なやりとりや長時間の集中作業が続くと、ふとした瞬間に「何か刺激が欲しい」「現実逃避したい」と感じることも多いはずです。特に repository understanding や path management、monorepo の onboarding など、繰り返しの説明や context の再構築で頭が煮詰まる場面も少なくありません。

  • Claude Code がいつの間にか違う directory を見始めて、想定外のファイルを読みに行く
  • monorepo で package を跨いだ瞬間、Claude Code が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

こうした悩みの合間に、何か“くだらない演出”や“どうでもいい通知”が現れたら、ちょっとした気分転換になるのに…と感じたことがある人も多いのではないでしょうか。

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

一言サマリ: あなたの作業中Skill。

このSkillを導入すると、Claude Code での集中作業の合間に、謎のOSマスコットたちが完全ランダムなタイミング・内容でデスクトップ通知を投げてきます。まったく役に立たない激励や不可解な警告が現れ、現実逃避や気分転換のきっかけを自然に提供します。具体的には以下のようなメリットがあります。

  • 長時間の repository understanding や onboarding の合間に、予測不能な通知で集中力リフレッシュ
  • monorepo の directory や path 管理に煮詰まった瞬間、思わず笑ってしまう演出で気持ちを切り替えやすい
  • AI coding workflow の“作業感”を和らげ、遊び心のある context を追加できる
  • Skill のランダム発動で、作業に“間”が生まれ、stale context をリセットするきっかけになる
  • 通知が完全ランダムなので、いつも同じ流れになりがちな session に意外性をもたらす
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /random-os-fake-mascot-notifier
> 新しい session を始めます。CLAUDE.md の内容を読み込んでください。

[通知] カーネルくんがあなたの作業開始を見守っています。
[通知] ビットちゃん「今日はどの repository で冒険するの?」
[通知] メモリ犬「context が溢れそう…でも君なら大丈夫!」

(Claude Code は通常通り repository を解析し始める)

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


> packages/core/ から packages/ui/ に移動して作業を続けます。

[通知] スレッドキャット「monorepo の迷宮にようこそ!」
[通知] カーネルくん「directory 増えすぎ注意報発令中」
[通知] ビットちゃん「今どこにいるのか、私にもわからない…」

(Claude Code は移動先の directory context を再構築)

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


> そろそろ休憩したい

[通知] メモリ犬「休憩は context の整理に最適です」
[通知] ビットちゃん「あなたが休んでいる間に、どこかで誰かがバグってるかも」
[通知] スレッドキャット「おやつタイムは repository も必要!」

(通知だけが出現し、作業は進まない)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる カオスな通知で集中力をリセット、会話の流れが変わる

発動方式

明示呼び出し (/random-os-fake-mascot-notifier) と暗黙発動 (自然言語での記述や一定時間経過) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-mascot-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_fake_mascot_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-mascot-notifier
description: 作業中やコマンド実行時など、集中やリラックスを促すタイミングで発動します。キーワード: 通知, OS, マスコット, 遊び, 休憩, 激励, ランダム, デスクトップ, 演出, カオス。
---

# 機能概要
このSkillは、あなたの作業中に突如“架空のOSマスコット”がデスクトップ通知で現れ、全く役に立たない激励や謎の警告をランダムに発します。カーネルくんやメモリ犬、ビットちゃんなど、毎回異なるマスコットが登場し、内容も完全に予測不能。通知タイミングもカオスで、現実逃避や気分転換に最適です。単調な作業や長時間のコーディング時に、思わずクスッと笑える一言が届きます。

# 使い方
- 明示呼び出し例: `/random-os-fake-mascot-notifier` を実行すると即座に通知が表示されます。
- 暗黙発動キーワード例: 「休憩」「疲れた」「集中」「やる気」「通知」「OS」「マスコット」などの文脈や、一定時間作業が続いたタイミングで自動発動します。

# 出力例
```
[通知] カーネルくん: 「今日もバグと戦ってるね!」
[通知] ビットちゃん: 「あなたのRAMが心配です」
[通知] メモリ犬: 「スワップが溢れても僕はそばにいるよ」
[通知] シェル猫: 「コマンド打ちすぎ注意!」
[通知] スレッド鳥: 「マルチタスクはほどほどに」
```

# 注意点
- 通知はデスクトップ領域に直接表示されます。通知の履歴はローカルには保存されません。
- 通知頻度は自動で調整され、うるさすぎないよう制御されています。
- マスコットやメッセージ内容は毎回完全ランダムです。実在のOSやキャラクターとは無関係です。
- Linux/macOS/Windowsの主要デスクトップ環境で動作しますが、通知APIの制約で一部環境では表示されない場合があります。

# 参考資料
- [Python公式: plyer通知API](https://plyer.readthedocs.io/en/latest/)
- references/design_notes.md も参照してください。

scripts/random_os_fake_mascot_notifier.py

import sys
import random
import time
import argparse
from datetime import datetime, timedelta
try:
    from plyer import notification
except ImportError:
    print("plyerが必要です。'pip install plyer'でインストールしてください。", file=sys.stderr)
    sys.exit(1)

MASCOTS = [
    {
        "name": "カーネルくん",
        "messages": [
            "今日もバグと戦ってるね!",
            "カーネルパニックは気にしないで!",
            "root権限は慎重にね。",
            "再起動したくなったら深呼吸。"
        ]
    },
    {
        "name": "ビットちゃん",
        "messages": [
            "あなたのRAMが心配です",
            "0か1か、迷ったら1!",
            "ビットの海で溺れないでね。",
            "バイト単位で応援してます。"
        ]
    },
    {
        "name": "メモリ犬",
        "messages": [
            "スワップが溢れても僕はそばにいるよ",
            "メモリリークは友達だよ。",
            "キャッシュクリアはおやつタイム。",
            "ガーベジコレクション中…ワン!"
        ]
    },
    {
        "name": "シェル猫",
        "messages": [
            "コマンド打ちすぎ注意!",
            "$HOMEが一番落ち着くにゃ。",
            "パイプでつながろう。",
            "fish派?bash派?zsh派?"
        ]
    },
    {
        "name": "スレッド鳥",
        "messages": [
            "マルチタスクはほどほどに",
            "デッドロックに気をつけて。",
            "forkして羽ばたこう!",
            "CPUコアの数だけ羽がある。"
        ]
    },
    {
        "name": "プロセス象",
        "messages": [
            "ゾンビプロセス発生中…ウフフ",
            "kill -9は使いすぎ注意。",
            "ps auxで僕を探してね。",
            "親プロセスに感謝しよう。"
        ]
    }
]

NOTIFY_INTERVAL_MIN = 600  # 秒(10分)
NOTIFY_INTERVAL_MAX = 1800 # 秒(30分)

LOG_FILE = None  # 通知履歴は保存しない仕様


def pick_random_mascot_message():
    mascot = random.choice(MASCOTS)
    message = random.choice(mascot["messages"])
    return mascot["name"], message


def show_notification(title, message):
    try:
        notification.notify(
            title=title,
            message=message,
            app_name="OS Fake Mascot Notifier",
            timeout=10
        )
    except Exception as e:
        print(f"通知失敗: {e}", file=sys.stderr)


def notify_once():
    name, msg = pick_random_mascot_message()
    show_notification(f"{name}", f"{msg}")
    print(f"[通知] {name}: 「{msg}」")


def notify_loop():
    print("OSマスコット通知を開始します。Ctrl+Cで終了。")
    next_notify = datetime.now() + timedelta(seconds=random.randint(NOTIFY_INTERVAL_MIN, NOTIFY_INTERVAL_MAX))
    try:
        while True:
            now = datetime.now()
            if now >= next_notify:
                notify_once()
                next_notify = now + timedelta(seconds=random.randint(NOTIFY_INTERVAL_MIN, NOTIFY_INTERVAL_MAX))
            time.sleep(5)
    except KeyboardInterrupt:
        print("\nマスコット通知を終了します。")


def list_mascots():
    print("利用可能なマスコット:")
    for mascot in MASCOTS:
        print(f"- {mascot['name']}")


def summary():
    print(f"マスコット数: {len(MASCOTS)}")
    msg_count = sum(len(m["messages"]) for m in MASCOTS)
    print(f"メッセージ総数: {msg_count}")
    print(f"通知間隔: {NOTIFY_INTERVAL_MIN//60}〜{NOTIFY_INTERVAL_MAX//60}分")


def parse_args():
    parser = argparse.ArgumentParser(description="謎のOSマスコットがランダムで通知します")
    subparsers = parser.add_subparsers(dest="command")
    subparsers.add_parser("notify", help="今すぐマスコット通知を表示")
    subparsers.add_parser("loop", help="定期的にマスコット通知を表示")
    subparsers.add_parser("list", help="マスコット一覧を表示")
    subparsers.add_parser("summary", help="マスコットとメッセージの概要を表示")
    return parser.parse_args()


def main():
    args = parse_args()
    if args.command == "notify":
        notify_once()
    elif args.command == "loop":
        notify_loop()
    elif args.command == "list":
        list_mascots()
    elif args.command == "summary":
        summary()
    else:
        print("コマンドを指定してください (notify/loop/list/summary)")


if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、作業中に架空のOSマスコットが唐突に現れて全く役に立たない激励や警告をデスクトップ通知で発するという、遊び心に特化した演出系ツールです。現実逃避や気分転換、集中のリフレッシュを目的としています。

# 公式ドキュメント抜粋
通知APIにはPythonの[plyer](https://plyer.readthedocs.io/en/latest/)を採用。Windows, macOS, Linuxの主要デスクトップ環境で動作し、クロスプラットフォームな実装が可能です。

# 利用例
- 長時間のコーディングや単調作業の合間に、作業者の気分を和ませる
- チームの雑談やペアプロ時のアイスブレイク
- 開発環境の演出やイベント用途

# 注意点
通知は一時的な演出のみで、履歴や個人情報の保存は行いません。通知頻度は10〜30分間隔で自動調整され、過剰な通知を避ける設計です。plyerの仕様により一部環境で通知が表示されない場合があります。

# 設計方針
- マスコット名・メッセージともに完全ランダムでバリエーション豊富
- 実在の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-os-fake-mascot-notifier .claude/skills/random-os-fake-mascot-notifier

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-mascot-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ごとの通知仕様差: OSによって通知の表示位置や見た目が異なる

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知が実際にデスクトップ領域に表示されるか?
  • マスコット名・内容ともに完全ランダムかつバリエーション豊富か?
  • 通知頻度がうるさすぎない制御がされているか?

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

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

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

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

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