Claude Codeで仕事中の集中力を高める環境音通知Skillの作り方

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

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

Claude Code で日々コードを書いていると、集中して作業したいタイミングに限って、ふとした気の緩みや、予期せぬ通知で気分が変わることがある。特にリポジトリの構造や context 管理に気を取られていると、いつの間にか workflow のリズムが崩れがちだ。そんな時、ちょっとした演出や通知が「いい意味での違和感」として作用し、日常の単調さをリセットしてくれることもある。

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

また、作業中の緊張感や集中力を維持したい時、あまりにもシステマチックな通知や演出では逆に没入感が削がれることも。そんな中、意味不明な「OS公式通知」的な演出が唐突に現れると、ちょっとした非日常感が生まれ、気分転換やリフレッシュにもつながる。

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

一言サマリ: 作業中Skill。

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

  • Claude Code の session や directory 移動時に、謎のOS通知風フェイク演出が自動で現れ、作業空間に非日常のアクセントが加わる
  • 実際には何も再生されないが、「環境音が鳴っている気分」だけを味わえるため、集中力や気分転換のきっかけになる
  • 通知内容が完全ランダムで毎回異なり、思わず「なぜ?」と笑ってしまう体験が生まれる
  • AI coding workflow の中で、長時間の単調な context 管理や path management の合間に、遊び心ある演出が加わる
  • onboarding や repository understanding の場面でも、ちょっとした話題やアイスブレイクになる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/os-fake-ambient-soundscape-notifier .claude/skills/os-fake-ambient-soundscape-notifier

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

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

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


# /os-fake-ambient-soundscape-notifier
> 新しい session を始めます

[OS公式通知] 本日は集中力向上のため「森のさざめきBGM」を自動再生します。
(ヒント: 本当に音は鳴りませんのでご安心ください)

repository: /home/user/project
directory: src/
context: session start
memory: ready

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


> packages/api/ から packages/web/ に移動

[OS公式] 今から15分間は「謎のカフェ騒音推奨」モードです。
(作業効率が上がるかどうかは保証されません)

repository: /home/user/monorepo
directory: packages/web/
context: directory switch
AI coding workflow: active

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


> ちょっと集中力が切れたので何か演出して

[OS環境音通知] 「深夜の図書館ホワイトノイズ」を自動適用しました。
(本当に再生されていないので、幻聴にご注意ください)

repository: /home/user/dev
directory: .
context: manual trigger
memory: refreshed

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開 + 謎の通知で気分転換
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る + 突然の環境音通知
長時間 workflow long context で重要箇所が薄まる フェイク通知でリフレッシュ、集中力を一瞬リセット

発動方式

明示呼び出し (/os-fake-ambient-soundscape-notifier) と暗黙発動 (「環境音」「BGM」「カフェ騒音」などのdescriptionマッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/os-fake-ambient-soundscape-notifier/
├── SKILL.md
├── scripts/
│   └── fake_ambient_soundscape_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: os-fake-ambient-soundscape-notifier
description: 作業やコーディング中に“環境音通知”を演出したい場面や、集中力・気分転換を促す擬似OS通知を体験したい時に発動。キーワード例: 環境音, BGM, 集中, 通知, フェイク, OS演出, 休憩, クリエイティブ。
---

# 機能概要
このSkillは、作業中やコーディング時に突如“謎のOS環境音通知”を表示し、デスクトップやターミナルに非日常的な演出を加えます。通知内容は完全ランダムで、「森のさざめきBGMを自動再生します」や「今から15分間はカフェ騒音推奨」など、実際には何も再生されない“フェイク通知”です。これにより、ユーザーは音が鳴っているような気分を味わいながら、作業場に新鮮な刺激やユーモアをもたらします。集中力向上や気分転換、雑談のきっかけにも最適です。

# 使い方
- 明示呼び出し: `/os-fake-ambient-soundscape-notifier` で即時通知
- 暗黙発動: 「環境音」「BGM」「集中」「休憩」などのキーワードを含むプロンプトや、長時間作業中のタイミングで自動発動
- 通知頻度やタイミングは自動調整され、うるさすぎない設計です

# 出力例
```
[OS通知] 本日は集中力向上のため、森のさざめきBGMを自動再生します(実際には再生されません)
[OS公式] 今から15分間は謎のカフェ騒音推奨。耳を澄ませてみましょう。
[通知] システム推奨: 砂浜の波音モードに切り替えます。ごゆっくりお過ごしください。
[OS通知] 本日は“宇宙船エンジン音”BGMが選ばれました。静かな宇宙をお楽しみください。
[通知] ご注意: 本通知は演出のみで、実際の音は鳴りません。
```

# 注意点
- 実際の音声やBGMは一切再生されません(完全なフェイク通知)
- 通知内容は毎回ランダム生成されますが、同じテーマが重複する場合があります
- ローカルファイルや履歴は保存されません
- 過度な頻度にならないよう自動制御されています

# 参考資料
- [references/design_notes.md](references/design_notes.md) に設計方針や利用例を掲載
- OS通知API: [notify2 (Linux)](https://pypi.org/project/notify2/), [plyer.notification (クロスプラットフォーム)](https://plyer.readthedocs.io/en/latest/#plyer.notification.notification)
- フェイク通知のアイデア出典: 各種OSの公式ガイドライン

scripts/fake_ambient_soundscape_notifier.py

import random
import sys
import time
import argparse
import platform

try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

# ランダムな環境音テーマ
AMBIENT_THEMES = [
    "森のさざめきBGM",
    "カフェ騒音",
    "砂浜の波音",
    "宇宙船エンジン音",
    "雨の音",
    "図書館の静けさ",
    "地下鉄ホーム",
    "焚き火のパチパチ音",
    "オフィスのざわめき",
    "鳥のさえずり",
    "深夜のサーバールーム",
    "山小屋の暖炉音",
    "都市の夜景BGM",
    "古いPCファンノイズ",
    "謎の電子音",
    "遠くの雷鳴",
    "水族館の水音",
    "キャンプ場の虫の声",
    "未来都市の環境音",
    "静かな書斎"
]

# 通知メッセージテンプレート
TEMPLATES = [
    "本日は集中力向上のため、{theme}を自動再生します(実際には再生されません)",
    "OS公式: 今から15分間は謎の{theme}推奨。耳を澄ませてみましょう。",
    "システム推奨: {theme}モードに切り替えます。ごゆっくりお過ごしください。",
    "本日は“{theme}”BGMが選ばれました。静かなひとときをお楽しみください。",
    "[通知] ご注意: 本通知は演出のみで、実際の音は鳴りません。",
    "[OS通知] {theme}をバックグラウンドで再生中(フェイク)",
    "[公式] {theme}の効果で集中力が1.2倍(当社比)",
    "[システム] {theme}環境音を推奨します。設定変更は不要です。",
    "[通知] {theme}BGMをONにしました(気分だけ)",
    "[OS] {theme}が有効になりました。"
]

# 通知を表示する関数
def show_notification(message):
    if PLYER_AVAILABLE:
        try:
            notification.notify(
                title="OS通知",
                message=message,
                timeout=8
            )
        except Exception as e:
            print(f"[通知エラー] {e}")
    else:
        print(f"[OS通知] {message}")

# 通知メッセージをランダム生成
def generate_notification():
    theme = random.choice(AMBIENT_THEMES)
    template = random.choice(TEMPLATES)
    return template.format(theme=theme)

# 通知履歴を管理(今回はメモリのみ)
class NotificationHistory:
    def __init__(self):
        self.entries = []
    def log(self, message, timestamp=None):
        if timestamp is None:
            timestamp = time.strftime('%Y-%m-%d %H:%M:%S')
        self.entries.append((timestamp, message))
    def list(self, count=10):
        return self.entries[-count:]
    def summary(self):
        themes = [msg for _, msg in self.entries]
        return f"通知回数: {len(themes)}"

# 通知発動ロジック
def notify_once(history):
    msg = generate_notification()
    show_notification(msg)
    history.log(msg)

# 一定間隔で通知(うるさすぎないよう制御)
def notify_loop(history, interval_min=25, interval_max=90, max_count=5):
    count = 0
    while count < max_count:
        notify_once(history)
        count += 1
        sleep_time = random.randint(interval_min, interval_max)
        time.sleep(sleep_time)

# CLIサブコマンド
def main():
    parser = argparse.ArgumentParser(description="OSフェイク環境音通知スキル")
    subparsers = parser.add_subparsers(dest="command")

    parser_notify = subparsers.add_parser("notify", help="即時フェイク通知を1回表示")
    parser_loop = subparsers.add_parser("loop", help="定期的にフェイク通知を表示")
    parser_loop.add_argument("--min", type=int, default=25, help="通知間隔(秒)の最小値")
    parser_loop.add_argument("--max", type=int, default=90, help="通知間隔(秒)の最大値")
    parser_loop.add_argument("--count", type=int, default=5, help="通知回数の上限")
    parser_list = subparsers.add_parser("list", help="通知履歴を表示")
    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリを表示")

    args = parser.parse_args()
    history = NotificationHistory()

    if args.command == "notify":
        notify_once(history)
    elif args.command == "loop":
        notify_loop(history, args.min, args.max, args.count)
    elif args.command == "list":
        for ts, msg in history.list():
            print(f"[{ts}] {msg}")
    elif args.command == "summary":
        print(history.summary())
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、実際に音を鳴らさずに“環境音通知”の体験だけを提供することで、作業環境にユーモアや非日常感をもたらします。通知内容は完全ランダム生成で、ユーザーの集中力向上や気分転換をサポートします。

# 公式ドキュメント抜粋
通知APIには plyer.notification を利用し、クロスプラットフォームで実際のOS通知風の演出が可能です。plyer: https://plyer.readthedocs.io/en/latest/#plyer.notification.notification

# 利用例
- 長時間作業時の気分転換用
- チーム内での雑談ネタやリモートワークのアイスブレイク
- 実際のBGM再生ができない静かな職場での“気分だけ演出”

# 注意点
- 音声再生は一切行いません
- 通知内容は毎回ランダム生成されるため、同一テーマが続く場合もあります
- 通知履歴はメモリ上のみで永続保存されません

# 設計方針
- 通知頻度やタイミングはうるさすぎず、作業を妨げない範囲に自動調整
- OS通知APIが使えない場合は標準出力にフォールバック
- 再現性よりも“なぜ?”と思わせる演出を重視

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/os-fake-ambient-soundscape-notifier .claude/skills/os-fake-ambient-soundscape-notifier

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

3. ファイル配置確認

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

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

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

5. 動作確認

/os-fake-ambient-soundscape-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
  • 通知頻度やタイミング: あまりに頻繁だと逆にうるさく感じることもある
  • 本当に音が鳴らない仕様: 期待しても物理的な音は出ないので注意

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知内容が本当に完全ランダムで面白いか?
  • 本当に音は鳴らないフェイク仕様になっているか?
  • 通知頻度やタイミングがうるさすぎないか?

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

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

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

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

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