Claude Codeで非日常を演出する謎の失恋通知スキルの作り方

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

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

Claude Code を日常的に使っていると、AI coding workflow の中で「ちょっとした息抜き」や「作業の合間に笑える瞬間」が欲しくなることがあります。特に集中して repository understanding や path management をしていると、単調な作業が続き、気分転換のきっかけを見失いがちです。通知や演出系 Skill の需要も高まっていますが、実用一辺倒では面白みに欠けるという声も少なくありません。

  • 長時間の session で context が膨らみ、気がつくと作業がマンネリ化している
  • monorepo で directory を行き来していると、Claude Code の挙動が単調に感じる
  • repository onboarding 時、作業の合間に一息つけるような「遊び」が欲しい
  • 通知系 Skill は多いが、workflow に直接絡まない「ネタ系通知」が少ない
  • AI coding workflow の合間に、思わず笑える非日常的な演出が欲しい

特に「通知・演出・OS連携」カテゴリでは、作業効率だけでなく、気分転換やチーム内の雰囲気作りにも寄与する Skill へのニーズが高まっています。

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

一言サマリ: このスキルは、作業中に突如“謎のOS失恋通知”をランダムに炸裂させ、真面目な workflow に非日常と笑いを届ける Skill。

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

  • 長時間の Claude Code セッションや repository understanding の合間に、思わず笑える通知で気分転換できる
  • monorepo や複雑な directory 構成でも、突発的なジョーク通知でオンボーディングや作業開始が和やかになる
  • AI coding workflow の中に「遊び」を取り入れ、チームや個人の作業環境を柔らかく演出できる
  • 通知が毎回ランダムかつシュールなので、path management の単調さを打破できる
  • Skill の明示呼び出し・暗黙発動どちらにも対応し、使い方の自由度が高い
QUICK INSTALL
このSkillをすぐ試す

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

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

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

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

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


# /random-os-breakup-notifier
> 新しいリポジトリで作業を始めます

【重要なお知らせ】
あなたの愛用マウスは、ついに新しいパートナー(タッチパッド)との未来を選びました。
フォルダ: src/components/
今後は、クリックの感触にご注意ください。

(Claude Codeからの通知は以上です)

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


> packages/api/ から packages/web/ へ移動します

【悲報】
エディタ(VSCode)がそっとあなたのもとを去りました。
新しい恋人: packages/web/utils/editor.js
理由: "もう補完しない関係でいたい"

(Claude Codeからの通知は以上です)

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


> ちょっと気分転換したい

【ごめんね】
CtrlキーはAltキーと付き合うことにしました。
これからはショートカットも二人のものです。

(Claude Codeからの通知は以上です)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 突発的なデジタル失恋通知で気分転換。集中力がリセットされる

発動方式

明示呼び出し (/random-os-breakup-notifier) と暗黙発動 (「気分転換したい」「面白い通知が欲しい」など description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-breakup-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_breakup_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_breakup_notifier.py random-os-breakup-notifier: デジタル失恋通知をランダムに表示
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-breakup-notifier
description: 作業中やコマンド実行時、または「失恋」「別れ」「通知」などのキーワードを含む会話やコード生成時に、突発的に“謎のOS失恋通知”を表示して場を和ませたい時に発動します。
---

# 機能概要
random-os-breakup-notifierは、作業中のデスクトップやターミナルに突如「デジタル失恋」をテーマにしたシュールな通知を表示するジョーク系スキルです。通知内容は毎回ランダムで、「あなたのマウスが新しいパートナーに乗り換えました」「CtrlキーはAltキーと付き合うことに」など、意味不明かつユーモラスなメッセージが炸裂します。真面目な作業現場に非日常を持ち込み、ちょっとした笑いとリフレッシュを提供します。

# 使い方
- 明示呼び出し例: `/random-os-breakup-notifier` を実行すると即座に通知が表示されます。
- 暗黙発動キーワード例: 「失恋」「別れ」「通知」「デスクトップ」「マウス」「エディタ」などの単語を含む会話やコード生成時に自動発動します。
- 通知は一定の間隔またはランダムなタイミングで表示されます。

# 出力例
```
[重要] あなたの愛用マウスが新しいパートナーに乗り換えました。
[悲報] エディタがそっとあなたのもとを去りました。
[ごめん] 今日からCtrlキーはAltキーと付き合うことに。
[速報] ターミナルが「距離を置きたい」と言っています。
[通知] あなたのデスクトップが他のユーザーと再起動しました。
```

# 注意点
- 本Skillはジョーク用途専用であり、実際のシステムやファイルには一切影響しません。
- 通知内容はローカルに保存されず、履歴も残りません。
- OSの通知API(macOS: osascript, Linux: notify-send, Windows: toast通知)を利用しますが、環境によっては表示されない場合があります。
- 業務や重要な作業を妨げないよう、通知頻度にはご注意ください。

# 参考資料
- references/design_notes.md に設計方針や通知APIの詳細を記載
- 公式: https://github.com/notify-send/notify-send, https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/

scripts/random_os_breakup_notifier.py

import sys
import os
import random
import time
import argparse
import platform
import subprocess
from typing import List

BREAKUP_MESSAGES = [
    '[重要] あなたの愛用マウスが新しいパートナーに乗り換えました。',
    '[悲報] エディタがそっとあなたのもとを去りました。',
    '[ごめん] 今日からCtrlキーはAltキーと付き合うことに。',
    '[速報] ターミナルが「距離を置きたい」と言っています。',
    '[通知] あなたのデスクトップが他のユーザーと再起動しました。',
    '[悲報] ファイルシステムがあなたをブロックしました。',
    '[重要] CapsLockキーが新しい恋に落ちました。',
    '[速報] ショートカットがあなたの手元から旅立ちました。',
    '[ごめん] スクロールホイールはもう戻ってきません。',
    '[通知] あなたのタスクバーが距離を置きたがっています。',
    '[悲報] クリップボードは他のアプリを選びました。',
    '[重要] あなたのUSBメモリが新しいPCに心変わりしました。',
    '[ごめん] Wi-Fiはもうあなたのことを覚えていません。',
    '[速報] スリープモードが永遠の眠りにつきました。',
    '[通知] あなたのテーマカラーが他のユーザーのものになりました。'
]

NOTIFY_COMMANDS = {
    'Darwin': lambda msg: ['osascript', '-e', f'display notification "{msg}" with title "OS失恋通知"'],
    'Linux': lambda msg: ['notify-send', 'OS失恋通知', msg],
    'Windows': lambda msg: [sys.executable, '-c', f'import win10toast;win10toast.ToastNotifier().show_toast("OS失恋通知", "{msg}", duration=5)']
}

DEFAULT_INTERVAL = 600


def detect_os() -> str:
    return platform.system()


def show_notification(msg: str):
    os_name = detect_os()
    if os_name == 'Darwin':
        subprocess.run(NOTIFY_COMMANDS['Darwin'](msg), check=False)
    elif os_name == 'Linux':
        subprocess.run(NOTIFY_COMMANDS['Linux'](msg), check=False)
    elif os_name == 'Windows':
        try:
            import win10toast
            toaster = win10toast.ToastNotifier()
            toaster.show_toast("OS失恋通知", msg, duration=5)
        except ImportError:
            subprocess.run(NOTIFY_COMMANDS['Windows'](msg), check=False)
    else:
        print(msg)


def random_message() -> str:
    return random.choice(BREAKUP_MESSAGES)


def notify_once():
    msg = random_message()
    show_notification(msg)
    print(msg)


def notify_loop(interval: int, count: int):
    for i in range(count):
        notify_once()
        if i < count - 1:
            time.sleep(interval)


def list_messages():
    print("--- OS失恋通知メッセージ一覧 ---")
    for i, msg in enumerate(BREAKUP_MESSAGES, 1):
        print(f"{i}. {msg}")


def summary():
    print(f"登録済み失恋通知数: {len(BREAKUP_MESSAGES)}")
    print(f"対応OS: macOS, Linux, Windows")
    print(f"通知API: osascript, notify-send, win10toast")
    print(f"デフォルト通知間隔: {DEFAULT_INTERVAL}秒")


def parse_args():
    parser = argparse.ArgumentParser(description='random-os-breakup-notifier: デジタル失恋通知をランダムに表示')
    subparsers = parser.add_subparsers(dest='command')

    notify_parser = subparsers.add_parser('notify', help='今すぐ失恋通知を表示')
    notify_parser.add_argument('-n', '--number', type=int, default=1, help='通知回数 (デフォルト: 1)')
    notify_parser.add_argument('-i', '--interval', type=int, default=DEFAULT_INTERVAL, help='通知間隔(秒) (デフォルト: 600)')

    subparsers.add_parser('list', help='登録済み失恋通知メッセージ一覧を表示')
    subparsers.add_parser('summary', help='スキルの概要情報を表示')

    return parser.parse_args()


def main():
    args = parse_args()
    if args.command == 'notify':
        if args.number <= 1:
            notify_once()
        else:
            notify_loop(args.interval, args.number)
    elif args.command == 'list':
        list_messages()
    elif args.command == 'summary':
        summary()
    else:
        print('コマンドを指定してください: notify, list, summary')

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-os-breakup-notifierは、作業中に突発的な“デジタル失恋”通知を表示することで、ユーザーにリフレッシュや笑いを提供するジョーク系スキルです。通知内容は毎回ランダムで、OSごとに最適な通知APIを利用します。

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

# 利用例
- チームの朝会で雰囲気を和ませたい時
- 長時間のコーディングや作業中にリフレッシュしたい時
- 雑談や「失恋」「別れ」などのキーワードが出た際のネタとして

# 注意点
- 通知内容はシステムや作業に影響しません。
- 一部の環境では通知が表示されない場合があります。
- 本Skillはジョーク用途専用です。

# 設計方針
- OS判定と通知APIの自動選択
- メッセージのバリエーションとランダム性重視
- シンプルなCLI構成と明示/暗黙両対応

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

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

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-breakup-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
  • 通知が多すぎる場合: 作業の流れを乱さないよう、頻度調整や mute 機能の設計も検討ポイント

試す前に確かめたいこと

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

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • CLAUDE.md との連携設計はどうあるべきか?
  • 通知内容のバリエーションとシュールさは十分か?
  • 突発的なタイミングで通知が表示されるか?
  • システムや他作業への干渉がないことをどう担保するか?

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

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

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

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

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