Claude Codeで集中を乱す通知演出Skillの設計と活用ガイド

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

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

Claude Code を日々使い込んでいると、意外なタイミングで集中が途切れたり、ワークフローが中断されることがある。特に、通知や演出系の挙動が想定外に働くと、小さなストレスが積み重なる。例えば:

  • 作業に没頭していると、ふいに OS の通知が現れて集中が乱れる
  • repository の context を切り替えた直後、重要な path や directory の指定を忘れてしまう
  • onboarding 直後、Claude Code が repo の構造を把握しきれず、path management に手間取る
  • 長時間の AI coding workflow で、無関係なメッセージや irrelevant な通知が混入し、流れが止まる
  • monorepo の複雑な構成で、directory 境界をまたいだ瞬間に repository understanding が揺らぐ

特に「通知・演出・OS連携」カテゴリのSkillを使うと、思わぬタイミングでの通知や演出が、集中力や作業フローに影響を与えることが多い。

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

一言サマリ: 作業中やコマンド実行の合間にSkill。

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

  • AI coding workflow の合間に、完全に実務無関係な“禅問答風”のOS通知が現れ、作業の流れに意図的な「間」を生み出す
  • repository understanding や path management のルーチンな説明・指示に疲れた時、思考をリセットするきっかけになる
  • onboarding 直後や session 再開時など、緊張感の高い場面で、脱力系メッセージが集中を一瞬だけほぐしてくれる
  • monorepo や長時間の long context 作業で煮詰まった時、全く役に立たない悟りメッセージで脳を強制リフレッシュ
  • Skill の存在自体が、Claude Code の堅いAI coding workflowに“遊び”や“混乱”を持ち込むアクセントになる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/fake-os-zen-master-alert .claude/skills/fake-os-zen-master-alert

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


# /fake-os-zen-master-alert

[OS通知] 禅マスターが現れた:
「バグとは何かを問う前に、己を問え。」

[Claude Code] 

Skill の中身を全部見せる

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

.claude/skills/fake-os-zen-master-alert/
├── SKILL.md
├── scripts/
│   └── zen_master_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: fake-os-zen-master-alert
description: このSkillは、Claude Codeがユーザーの作業中やコマンド実行の合間(例: ビルド・テスト・ファイル保存・長時間アイドル時)に、完全に実務無関係な禅問答風メッセージをOSデスクトップ通知として表示します。triggerType: always/semantic-or-explicit。
---

# 機能概要
fake-os-zen-master-alertは、作業やコーディングの合間に“偽OSの禅マスター”が現れ、完全無意味な禅問答や悟りの極意をデスクトップ通知で投げかけるSkillです。通知内容は実務や進捗に一切関係なく、集中を乱したり、時に深遠な(?)気づきを与えます。バグ修正やビルドの合間、長時間の作業時などに、意図せず思考を混乱させるエンタメ系通知を体験できます。

# 使い方
- 明示呼び出し: `/fake-os-zen-master-alert on` で通知開始、`/fake-os-zen-master-alert off` で停止。
- 暗黙発動: "ビルド完了", "テスト失敗", "ファイル保存", "長時間アイドル", "デバッグ開始" などのタイミングで自動発動。
- 通知頻度やON/OFFはコマンドライン引数で制御可能。

# 出力例
```
[禅マスター] バグとは何かを問う前に、己を問え。
[禅マスター] 今日の悟り:if文を捨てよ、道は開ける。
[禅マスター] コンパイルに失敗したとき、木魚を叩け。
[禅マスター] エラーの数だけ、悟りの道は続く。
[禅マスター] 眠気と戦うより、眠気を受け入れよ。
```

# 注意点
- 通知はOSのネイティブ通知機能(Windows, macOS, Linux対応)を利用。
- 実務に全く役立たないメッセージのみが表示されます。
- 通知内容はローカル保存されません。
- 頻度やON/OFFはコマンドで制御できますが、完全な無効化は明示的に必要です。

# 参考資料
- references/design_notes.md を参照。
- 公式: https://docs.python.org/3/library/subprocess.html, https://plyer.readthedocs.io/en/latest/

scripts/zen_master_alert.py

import argparse
import random
import sys
import time
import threading
from plyer import notification

ZEN_MESSAGES = [
    'バグとは何かを問う前に、己を問え。',
    '今日の悟り:if文を捨てよ、道は開ける。',
    'コンパイルに失敗したとき、木魚を叩け。',
    'エラーの数だけ、悟りの道は続く。',
    '眠気と戦うより、眠気を受け入れよ。',
    'コードを読む前に、心を整えよ。',
    'OSとは、心の窓である。',
    'デバッグの道は、無限である。',
    'print文を捨てよ、禅を取れ。',
    'バグは敵にあらず、師である。',
    'エディタを閉じる勇気を持て。',
    '何も書かぬことも、またコードなり。',
    'エラーを恐れるな、恐れをエラーと知れ。',
    '悟りはREADMEに記されず。',
    'タイポは心の乱れ。',
    'ビルド失敗は、宇宙の調和の乱れ。',
    '変数名に悩む時、己の名を思い出せ。',
    'if文の数だけ、迷いが増す。',
    'whileループは人生そのもの。',
    'コメントを書くより、沈黙を選べ。'
]

DEFAULT_INTERVAL = 900  # 15分
MIN_INTERVAL = 60       # 1分
MAX_INTERVAL = 7200     # 2時間

class ZenMasterAlert:
    def __init__(self, interval=DEFAULT_INTERVAL):
        self.interval = max(MIN_INTERVAL, min(MAX_INTERVAL, interval))
        self.running = False
        self.thread = None

    def send_alert(self):
        msg = random.choice(ZEN_MESSAGES)
        notification.notify(
            title='禅マスター',
            message=msg,
            app_name='Fake OS Zen Master',
            timeout=8
        )
        print(f"[禅マスター] {msg}")

    def start(self):
        if self.running:
            print("すでに禅マスター通知は動作中です。")
            return
        self.running = True
        self.thread = threading.Thread(target=self._run, daemon=True)
        self.thread.start()
        print(f"禅マスター通知を開始しました({self.interval}秒間隔)。Ctrl+Cで停止できます。")

    def _run(self):
        while self.running:
            self.send_alert()
            for _ in range(self.interval):
                if not self.running:
                    break
                time.sleep(1)

    def stop(self):
        if not self.running:
            print("禅マスター通知は停止中です。")
            return
        self.running = False
        if self.thread:
            self.thread.join(timeout=2)
        print("禅マスター通知を停止しました。")

    def once(self):
        self.send_alert()


def parse_args():
    parser = argparse.ArgumentParser(description='Fake OS Zen Master Alert')
    subparsers = parser.add_subparsers(dest='command')

    # onコマンド
    parser_on = subparsers.add_parser('on', help='禅マスター通知を開始')
    parser_on.add_argument('--interval', type=int, default=DEFAULT_INTERVAL, help='通知間隔(秒)')

    # offコマンド
    subparsers.add_parser('off', help='禅マスター通知を停止')

    # onceコマンド
    subparsers.add_parser('once', help='1回だけ禅マスター通知を送信')

    # statusコマンド
    subparsers.add_parser('status', help='禅マスター通知の状態を表示')

    return parser.parse_args()


def main():
    args = parse_args()
    # グローバルな状態管理は簡易的にファイルで実装
    state_file = '.zen_master_alert_state'

    if args.command == 'on':
        with open(state_file, 'w') as f:
            f.write('on')
        alert = ZenMasterAlert(interval=args.interval)
        try:
            alert.start()
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            alert.stop()
            with open(state_file, 'w') as f:
                f.write('off')
    elif args.command == 'off':
        with open(state_file, 'w') as f:
            f.write('off')
        print('禅マスター通知を停止しました。')
    elif args.command == 'once':
        alert = ZenMasterAlert(interval=DEFAULT_INTERVAL)
        alert.once()
    elif args.command == 'status':
        try:
            with open(state_file, 'r') as f:
                state = f.read().strip()
            print(f'禅マスター通知の状態: {state}')
        except FileNotFoundError:
            print('禅マスター通知の状態: 不明(未開始)')
    else:
        print('コマンドを指定してください。 --help を参照')

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
fake-os-zen-master-alertは、OSのネイティブ通知APIを利用し、完全に実務無関係な禅問答風メッセージをユーザーに投げかけるSkillです。Pythonのplyerパッケージを活用し、クロスプラットフォームな通知を実現しています。

# 公式ドキュメント抜粋
- plyer: https://plyer.readthedocs.io/en/latest/
- Python subprocess: https://docs.python.org/3/library/subprocess.html

# 利用例
- 長時間のコーディングで集中しすぎている時に、強制的に思考をリセット。
- ビルドやテストの合間に、無意味な気づきを得て笑う。
- チームで導入し、誰が最も多くの禅問答を受けたか競う。

# 注意点
- 通知内容は完全に実務無関係です。誤って実務通知と混同しないよう注意してください。
- 頻度やON/OFFはコマンドで制御可能ですが、Skill自体を無効化したい場合は明示的な停止が必要です。

# 設計方針
- 実在するAPIのみを利用し、OS依存性を最小化。
- 冗長なメッセージリストでバリエーションを担保。
- ユーザー操作による明示的なON/OFFと、暗黙的な自動発動の両立を重視。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/fake-os-zen-master-alert .claude/skills/fake-os-zen-master-alert

.claude/skills/fake-os-zen-master-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .claude/skills/fake-os-zen-master-alert
# SKILL.md, scripts/, references/, README.md があればOK

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

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

5. 動作確認

/fake-os-zen-master-alert で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知メッセージが完全に実務無関係かつ禅問答風になっているか?
  • OS通知として確実に表示されるか?
  • 頻度・ON/OFF制御の有無と操作感はどうか?

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

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

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

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

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