Claude Codeで作業中に突発的な休日通知を自動化する方法

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

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

日々Claude Codeを使っていると、集中したいタイミングで思わず「息抜きがほしい」と感じる瞬間が誰しもあるものです。特にリポジトリの構造把握や context の管理に追われていると、単調な作業に没頭しすぎてリフレッシュの機会を逃しがちです。そんな時、ふとした演出や通知で気分転換できたら…という思いは多くの開発者に共通しています。

  • 長時間の作業で workflow がマンネリ化し、集中力が途切れがち
  • Claude Code の context 管理や path 指定に追われて、気づけば数時間経過している
  • repository 理解や directory 構造の再説明など、頭を使うタスクが続きリラックスできない
  • monorepo で package を跨いだ瞬間に context が切り替わり、気持ちの切り替えが追いつかない
  • OSやツールからの通知がすべて「仕事」関連で、遊び心や余白がない

こうした「通知・演出・OS連携」にまつわる小さなストレスは、積み重なると作業効率やモチベーションにも影響します。Claude Code のAI coding workflowを快適に保つには、時に“何も起きない”日常にちょっとしたスパイスが必要です。

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

一言サマリ: 作業中に突如“謎のOS公式休日発表”がデスクトップ通知で現れますSkill。

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

  • マンネリ化したAI coding workflowに、突発的な“休日宣言”通知でリフレッシュ効果をもたらす
  • repository understandingや長時間 session の合間に、ユーモラスな演出で集中力をリセットできる
  • monorepoや複雑な directory 構造に没頭しすぎた時、強制的に“休憩”を促してくれる
  • 通知内容が毎回 context に依存せず完全ランダムなので、予測できないサプライズを楽しめる
  • OSやClaude Codeの通常通知と違い、業務に影響を与えず遊び心だけを提供する
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/os-fake-holiday-announcer .claude/skills/os-fake-holiday-announcer

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

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

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


# /os-fake-holiday-announcer
> 今日から新しいタスクを始めたい

[OS通知] 公式発表: 本日は「バグ記念日」につき全業務停止となります。
全エンジニアは速やかにコーヒータイムへ移行してください。
(この通知に従う義務はありません)

Claude Code: repository context の読み込みを一時停止...しません。

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


> packages/core-utils/ から packages/frontend/ に移動

[OS通知] 緊急速報: システム都合により午後は強制昼寝タイムとなりました。
対象: /packages/frontend/ ディレクトリ配下の全ファイル
理由: monorepo の境界を越えたため

Claude Code: directory 構造の再スキャンを続行中...

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


> 今日はやる気が出ません。何か面白いことない?

[OS通知] お知らせ: OSが自主休暇を宣言しました。
理由: 開発者のやる気レベル低下を検知
推奨: 画面を閉じて好きなだけ現実逃避してください

Claude Code: repository understanding を一時的にお休み中...(嘘です)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 突発的な“休日通知”で作業の区切り・リフレッシュのきっかけが生まれる

発動方式

明示呼び出し (/os-fake-holiday-announcer) と暗黙発動 (自然言語で「今日は休みたい」「集中力が切れた」など) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/os-fake-holiday-announcer/
├── SKILL.md
├── scripts/
│   └── os_fake_holiday_announcer.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: os-fake-holiday-announcer
description: 長時間のコーディングや単調作業、集中力が切れがちなタイミングで突如“OS公式の架空休日”をデスクトップ通知で演出します。trigger: always/semantic。明示呼び出しは /os-fake-holiday-announcer。
---

# 機能概要
このSkillは、日々の開発や作業に追われるエンジニアのために、架空の“OS公式休日”をデスクトップ通知で突然お知らせします。通知内容は「本日はバグ記念日につき全業務停止」「緊急:OSが自主休暇を宣言しました」など、現実には存在しないユーモラスな休暇宣言。作業の合間に一瞬の現実逃避や笑いを提供し、マンネリ化したルーチン作業に意外性と遊び心を加えます。

# 使い方
- 明示呼び出し: `/os-fake-holiday-announcer` を実行すると即座に通知が表示されます。
- 暗黙発動: 「疲れた」「休みたい」「集中力が切れた」などのキーワードが会話やログに現れると自動発動します。
- 通知は1時間に1回以下の頻度で表示され、過剰な割り込みを防ぎます。

# 出力例
```
[通知] 本日は「バグ記念日」につき、全業務停止となります。ご理解のほどお願いいたします。
[通知] 緊急:OSが自主休暇を宣言しました。全プロセスはしばらくお休みします。
[通知] システム都合により午後は強制昼寝タイムです。
[通知] 本日は「メモリ解放記念日」。作業は後回しにしましょう。
[通知] OS公式:今日は再起動推奨日。全員で休憩しましょう。
```

# 注意点
- 通知はデスクトップ上に表示されるのみで、実際の作業やファイルには一切影響しません。
- ログや履歴はローカルに保存されますが、個人情報や機密データは扱いません。
- 通知頻度は設定可能ですが、過剰な連続通知は自動的に制限されます。

# 参考資料
- [notify2公式ドキュメント](https://pypi.org/project/notify2/)
- references/design_notes.md も参照してください。

scripts/os_fake_holiday_announcer.py

import sys
import os
import json
import random
import argparse
import time
from datetime import datetime, timedelta

try:
    import notify2
except ImportError:
    print('notify2がインストールされていません。\nインストール: pip install notify2')
    sys.exit(1)

HOLIDAY_MESSAGES = [
    '本日は「バグ記念日」につき、全業務停止となります。ご理解のほどお願いいたします。',
    '緊急:OSが自主休暇を宣言しました。全プロセスはしばらくお休みします。',
    'システム都合により午後は強制昼寝タイムです。',
    '本日は「メモリ解放記念日」。作業は後回しにしましょう。',
    'OS公式:今日は再起動推奨日。全員で休憩しましょう。',
    '本日限定:カーネルアップデート記念休暇。',
    '今日は「プロセス停止感謝の日」。業務は一時中断です。',
    '緊急速報:OSが勝手に祝日を制定しました。',
    '本日は「ファイルシステム点検日」につき、作業はお休みです。',
    'OS公式:午後は強制コーヒーブレイクタイムとなります。',
    '今日は「バッファ解放感謝祭」。何もせずに過ごしましょう。',
    'システム都合:本日は全ユーザー休暇です。',
    '本日は「クラッシュ防止祈願日」です。作業は控えめに。',
    'OS公式:本日は「仮想メモリ記念日」。全プロセスはお休みです。',
    '今日は「シグナル無視デー」。通知以外は気にしないでください。'
]

LOG_FILE = os.path.expanduser('~/.os_fake_holiday_announcer_log.json')
MAX_NOTIFY_PER_HOUR = 1


def load_log():
    if not os.path.exists(LOG_FILE):
        return []
    try:
        with open(LOG_FILE, 'r') as f:
            return json.load(f)
    except Exception:
        return []


def save_log(log):
    try:
        with open(LOG_FILE, 'w') as f:
            json.dump(log, f, ensure_ascii=False, indent=2)
    except Exception as e:
        print('ログ保存に失敗:', e)


def can_notify(log):
    now = datetime.now()
    one_hour_ago = now - timedelta(hours=1)
    recent = [l for l in log if datetime.fromisoformat(l['timestamp']) > one_hour_ago]
    return len(recent) < MAX_NOTIFY_PER_HOUR


def send_notification(message):
    notify2.init('OS Fake Holiday Announcer')
    n = notify2.Notification('OS公式 休暇宣言', message)
    n.set_urgency(notify2.URGENCY_NORMAL)
    n.set_timeout(10000)
    n.show()


def log_event(message):
    log = load_log()
    entry = {
        'timestamp': datetime.now().isoformat(),
        'message': message
    }
    log.append(entry)
    save_log(log)


def random_message():
    return random.choice(HOLIDAY_MESSAGES)


def list_log():
    log = load_log()
    if not log:
        print('ログはありません。')
        return
    for entry in log[-20:]:
        print(f"{entry['timestamp']} : {entry['message']}")


def summary_log():
    log = load_log()
    print(f'通知回数: {len(log)}')
    if log:
        print('最新通知:')
        print(f"{log[-1]['timestamp']} : {log[-1]['message']}")


def main():
    parser = argparse.ArgumentParser(description='OS Fake Holiday Announcer')
    subparsers = parser.add_subparsers(dest='command', required=False)

    parser_log = subparsers.add_parser('log', help='通知履歴を表示')
    parser_summary = subparsers.add_parser('summary', help='通知履歴のサマリー')
    parser_notify = subparsers.add_parser('notify', help='即座に通知を表示')

    args = parser.parse_args()

    if args.command == 'log':
        list_log()
    elif args.command == 'summary':
        summary_log()
    else:
        log = load_log()
        if can_notify(log):
            msg = random_message()
            send_notification(msg)
            log_event(msg)
            print(f'[通知] {msg}')
        else:
            print('1時間以内に既に通知済みです。')

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発者の作業環境に突如“OS公式の架空休日”を通知することで、作業の合間に遊び心とリフレッシュを提供します。現実の業務やファイルには一切影響しない安全設計です。

# 公式ドキュメント抜粋
通知表示にはPythonのnotify2ライブラリ([公式PyPI](https://pypi.org/project/notify2/))を利用しています。Linux系デスクトップ環境で標準的に動作します。

# 利用例
- 明示的に `python os_fake_holiday_announcer.py notify` で即時通知
- `python os_fake_holiday_announcer.py log` で過去の通知履歴を確認
- 1時間ごとに最大1回の自動通知(暗黙トリガー)

# 注意点
- 通知内容は完全に架空で、業務やシステムには何も影響を与えません。
- 履歴は ~/.os_fake_holiday_announcer_log.json に保存されます。
- Windows/Macではnotify2が動作しない場合があります。

# 設計方針
過剰な通知による作業妨害を避けるため、頻度制限と履歴管理を重視しています。メッセージはランダム生成で毎回異なるユーモアを提供します。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/os-fake-holiday-announcer .claude/skills/os-fake-holiday-announcer

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

3. ファイル配置確認

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

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

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

5. 動作確認

/os-fake-holiday-announcer で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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で謎の休日通知を楽しんでみた!作業中に突然の休み宣言を受け取るワクワク体験 にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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