Claude Codeで日々の開発を楽しく演出する通知スキルの作り方

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

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

Claude Code を日々の開発やリポジトリ管理に活用していると、ちょっとした「間」が生まれる瞬間に気づくことがあります。特に session 開始や長時間作業の合間、ふとしたタイミングで集中が切れてしまったり、気分転換のきっかけがつかめずに workflow が単調になりがちです。そんな時、ちょっとした演出や通知があれば、開発体験がぐっと楽しくなるはずです。

また、通知や演出系の Skill が少ない現状では、Claude Code の session が淡々と進行しがちで、「今日は何か面白いことが起きるかな?」という遊び心の余地が少ないと感じるユーザーも多いでしょう。特に以下のような悩みが日常的に発生しています。

  • 長時間の開発 session で気分転換やリフレッシュのきっかけが欲しい
  • Claude Code の session 開始時に、ちょっとした演出やモチベーションアップ要素が足りない
  • 通知系 Skill が少なく、OS やターミナルに遊び心のあるメッセージが表示されることがない
  • 「今日は何か面白いことが起きるかも」というワクワク感が session に持ち込めない
  • AI coding workflow が単調になりやすく、開発体験がマンネリ化しがち

通知・演出・OS連携の観点から、こうした「ちょっとした楽しさ」「意外性」を日常 workflow に自然に組み込める仕組みが求められています。

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

一言サマリ: このスキルは、Claude Code の session 開始や特定のタイミングで“謎のOS風星占い通知”を自動表示し、開発 workflow に遊び心とリフレッシュをもたらします。

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

  • session 開始や monorepo 移動など、重要なタイミングでランダムな“星占い風メッセージ”が OS またはターミナルに通知され、気分転換やモチベーションアップにつながる
  • AI coding workflow の進行にちょっとしたユーモアや演出が加わり、単調な作業でも楽しみが生まれる
  • 長時間作業や onboarding 時など、context 切り替えのきっかけとしても活用できる
  • repository understanding の合間に、リラックスできる“ネタ”要素を自然に挟める
  • 毎回異なる内容の通知で、飽きずに使い続けられる
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /random-os-fake-horoscope-notifier
> Claude Code で新しい session を開始

========================
【謎のOS星占い通知】
今日のラッキーディレクトリは: /src/utils
運勢: バグ回避率が5%上昇中
アドバイス: "ls" コマンドを3回唱えると良いことがあるかも
仕様変更星が逆行中。pull requestは慎重に。
========================

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


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

------------------------
【謎のOS星占い通知】
本日のラッキーパッケージ: packages/web/
運勢: context 切り替えがスムーズに進む予感
注意: "node_modules" 星が活発化、依存管理にご用心
今日の開発ラッキーワード: repository understanding
------------------------

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


> /random-os-fake-horoscope-notifier

+----------------------------+
|          OS HOROSCOPE      |
+----------------------------+
| 今日の運勢: コードレビュー運◎ |
| ラッキーコマンド: git diff  |
| 謎の助言: README.md を読み返すと吉 |
| 注意: long context の膨張にご注意 |
+----------------------------+

before / after の違い

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

発動方式

明示呼び出し (/random-os-fake-horoscope-notifier) と暗黙発動 (session 開始や directory 移動時など、description マッチ) の両方に対応。

Skill の中身を全部見せる

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

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

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-horoscope-notifier
description: 作業開始や新規ターミナル起動時など、ユーザーの開発セッション開始を検知した際に発動。'占い'や'運勢'、'ラッキーコマンド'などのキーワード出現時にも明示的に呼び出せます。
---

# 機能概要
このSkillは、開発者の作業開始時や新規ターミナル起動時などに、完全ランダムな“OS風の星占い通知”を表示します。通知内容は「今日のラッキーコマンドはls」や「運勢:バグ回避率上昇」「注意:仕様変更星が逆行中」など、開発現場にちなんだユーモラスな占いメッセージ。1日1回だけ通知され、毎回異なるネタが表示されるため、日々のコーディングにちょっとした笑いと新鮮さをもたらします。

# 使い方
- 明示呼び出し: `/random-os-fake-horoscope-notifier` または `/horoscope`
- 暗黙発動: 「作業開始」「新規ターミナル」「占い」「運勢」「ラッキーコマンド」などのキーワードや、セッション開始時に自動で発動します。

# 出力例
```
─────────────────────────────
【OS星占い通知】
運勢:今日はバグ回避率が15%上昇します。
ラッキーコマンド:ls
注意:仕様変更星が逆行中。コミット前にREADMEを確認!
─────────────────────────────
```

# 注意点
- 通知は1日1回のみ。複数回呼び出しても同じ内容が表示されます。
- 通知内容は完全ランダム生成ですが、実際の運勢や開発効率には一切影響しません。
- ローカルに通知履歴を保存します(`~/.random_os_horoscope_history.json`)。
- OSの通知API(macOS: `osascript`、Linux: `notify-send`、Windows: `toast`)とターミナル出力の両方に対応。

# 参考資料
- references/design_notes.md
- [notify-send公式](https://specifications.freedesktop.org/notification-spec/latest/)
- [osascript](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)

scripts/random_os_fake_horoscope_notifier.py

import os
import sys
import json
import random
import argparse
import datetime
import subprocess
from pathlib import Path

HISTORY_PATH = Path.home() / '.random_os_horoscope_history.json'

LUCKY_COMMANDS = [
    'ls', 'cd', 'git status', 'grep', 'cat', 'vim', 'nano', 'pwd', 'docker ps', 'make',
    'curl', 'python', 'tree', 'rm', 'mv', 'cp', 'ssh', 'htop', 'ps aux', 'killall'
]

FORTUNES = [
    '今日はバグ回避率が{percent}%上昇します。',
    'コードレビュー運が絶好調。積極的に依頼を!',
    '依存関係のトラブルに要注意。慎重なアップデートを。',
    '新しいIDE拡張機能を試すと吉。',
    'コミットメッセージが冴え渡る一日。',
    '設計書の読み返しが開運のカギ。',
    'ペアプロで思わぬ発見がありそう。',
    'デプロイ運が高まっています。',
    '今日はレビューコメントが優しくなります。',
    'コード整形ツールが幸運を呼びます。',
    'CI/CDパイプラインが順調に流れる予感。',
    'バグ報告は早めが吉。',
    '新規プロジェクト開始に最適な日。',
    '技術書を読むとスキルアップ運アップ。',
    'リファクタリング運が上昇中。',
    'コーヒーブレイクがひらめきを呼ぶでしょう。'
]

WARNINGS = [
    '仕様変更星が逆行中。コミット前にREADMEを確認!',
    '依存パッケージ流星群接近。アップデートは慎重に。',
    'マージコンフリクト座が活発化。こまめなpull推奨。',
    'API制限星が低迷。リクエストは控えめに。',
    'ネットワーク障害星が微妙に影響中。',
    'レビュー待ち渋滞発生。気長に待ちましょう。',
    'ドキュメント星が薄め。仕様確認を怠らずに。',
    'タイポ星が接近中。スペルチェックを忘れずに。',
    'OSアップデート星が逆行。再起動は計画的に。',
    'エラー星が不安定。ログをこまめに確認。'
]

BORDER = '─────────────────────────────'


def load_history():
    if HISTORY_PATH.exists():
        try:
            with open(HISTORY_PATH, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception:
            return {}
    return {}


def save_history(history):
    try:
        with open(HISTORY_PATH, 'w', encoding='utf-8') as f:
            json.dump(history, f, ensure_ascii=False, indent=2)
    except Exception as e:
        print(f"[WARN] 履歴保存に失敗: {e}")


def generate_fortune():
    percent = random.randint(5, 30)
    fortune = random.choice(FORTUNES)
    if '{percent}' in fortune:
        fortune = fortune.format(percent=percent)
    return fortune


def generate_notification():
    fortune = generate_fortune()
    lucky = random.choice(LUCKY_COMMANDS)
    warning = random.choice(WARNINGS)
    lines = [
        BORDER,
        '【OS星占い通知】',
        f'運勢:{fortune}',
        f'ラッキーコマンド:{lucky}',
        f'注意:{warning}',
        BORDER
    ]
    return '\n'.join(lines)


def show_terminal_notification(msg):
    print(msg)


def show_os_notification(title, msg):
    # macOS
    if sys.platform == 'darwin':
        script = f'display notification "{msg}" with title "{title}"'
        try:
            subprocess.run(['osascript', '-e', script], check=True)
        except Exception as e:
            print(f"[WARN] OS通知失敗: {e}")
    # Linux (notify-send)
    elif sys.platform.startswith('linux'):
        try:
            subprocess.run(['notify-send', title, msg], check=True)
        except Exception as e:
            print(f"[WARN] OS通知失敗: {e}")
    # Windows (toast)
    elif sys.platform.startswith('win'):
        try:
            from win10toast import ToastNotifier
            toaster = ToastNotifier()
            toaster.show_toast(title, msg, duration=5)
        except ImportError:
            print("[WARN] win10toastが未インストールのため、OS通知をスキップします。pip install win10toast で導入可能です。")
        except Exception as e:
            print(f"[WARN] OS通知失敗: {e}")
    else:
        print("[INFO] このOSではOS通知がサポートされていません。")


def already_notified_today(history):
    today = datetime.date.today().isoformat()
    return history.get('last_notified') == today


def main():
    parser = argparse.ArgumentParser(description='Random OS Fake Horoscope Notifier')
    subparsers = parser.add_subparsers(dest='command')

    subparsers.add_parser('notify', help='今日の星占い通知を表示')
    subparsers.add_parser('history', help='過去の通知履歴を表示')
    subparsers.add_parser('reset', help='履歴をリセット')

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

    if args.command == 'notify' or args.command is None:
        if already_notified_today(history):
            msg = history.get('last_message', '(本日の通知は既に表示済みです)')
        else:
            msg = generate_notification()
            history['last_notified'] = datetime.date.today().isoformat()
            history['last_message'] = msg
            if 'log' not in history:
                history['log'] = []
            history['log'].append({'date': history['last_notified'], 'message': msg})
            save_history(history)
        show_terminal_notification(msg)
        show_os_notification('OS星占い', msg.replace('\n', ' '))
    elif args.command == 'history':
        log = history.get('log', [])
        if not log:
            print('履歴はありません。')
        else:
            print('=== OS星占い通知履歴 ===')
            for entry in log[-10:]:
                print(f"{entry['date']}\n{entry['message']}\n")
    elif args.command == 'reset':
        save_history({})
        print('履歴をリセットしました。')
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発者の日常にユーモアをもたらすため、完全にランダムな“OS風星占い通知”を1日1回自動生成・表示するものです。通知はターミナルとOSの両方に現れ、開発セッションの開始時や明示呼び出しで発動します。

# 公式ドキュメント抜粋
- [notify-send (Linux)](https://specifications.freedesktop.org/notification-spec/latest/)
- [osascript (macOS)](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [win10toast (Windows)](https://pypi.org/project/win10toast/)

# 利用例
- 朝一番のターミナル起動時に自動で通知
- `/random-os-fake-horoscope-notifier` コマンドで明示的に呼び出し
- 過去10日分の通知履歴を`history`サブコマンドで確認

# 注意点
- 1日1回のみ通知。履歴は`~/.random_os_horoscope_history.json`に保存
- OS通知は環境によって失敗する場合がある(Linuxは`notify-send`コマンド、macOSは`osascript`、Windowsは`win10toast`が必要)

# 設計方針
- ユーザーの作業開始を楽しく演出するため、通知内容は完全に架空でネタ要素を重視
- OS横断的な通知APIをサポートし、どの環境でも分かりやすい通知体験を提供
- 履歴管理とエラーハンドリングを重視し、複数回通知や通知失敗時もユーザーに配慮

導入手順

この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-horoscope-notifier .claude/skills/random-os-fake-horoscope-notifier

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-fake-horoscope-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 を取りたい
  • 気分転換・遊び心を入れたい時: 開発 session の合間にちょっとした演出を加えたい時

気になるポイント (壊れそうな箇所)

実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:

  • 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 との連携設計はどうあるべきか?
  • 1日1回だけ通知されるか? (複数 session で重複しないか)
  • 通知内容が毎回ランダムでネタ要素を含むか?
  • OS/ターミナル両方で分かりやすく通知が現れるか?

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

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

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

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

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