Claude Codeで業務通知をRPG演出に変える演出Skillの作り方

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

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

Claude Code を使っていると、開発現場の空気が張り詰めがちだったり、長時間の作業で集中が切れてしまうことがよくあります。特に通知や演出面では、業務的なフィードバックばかりになりがちで、ちょっとした遊び心やリフレッシュ要素が不足しがちです。以下のような「あるある」を感じるユーザーも多いはずです。

  • 長時間の AI coding workflow で、単調な通知や進捗バーに飽きてしまう
  • repository understanding や path management の合間に、ちょっとした気分転換が欲しい
  • onboarding や session 再開時、毎回同じような context 説明や directory 指定に疲れる
  • monorepo の大規模リポジトリで、directory 構造を把握する作業がマンネリ化する
  • OS連携や通知が「業務的」すぎて、開発現場にユーモアや遊びが足りないと感じる

このような場面で、ちょっとした「非日常」や演出があれば、気分転換にもなり、チームの会話のきっかけにもなります。

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

一言サマリ: 突然Skill。

このSkillを導入することで、Claude Code の進捗通知やOS連携演出が「謎のOSソフトウェアアップデート vs バグ魔王」のRPG風バトル実況に変化します。具体的なメリットは以下の通りです。

  • 作業中に突然始まる演出で、単調なAI coding workflowに遊び心をプラスできる
  • 長時間の context 管理や repository understanding の合間に、リフレッシュできる
  • onboarding 時や session 再開時の通知が、RPGバトル実況になり現場の雰囲気が和む
  • monorepo の directory や path management のタイミングで、バトル演出が入ることでチームの会話のきっかけになる
  • 毎回ランダムなバトル展開・セリフで、通知や演出のマンネリ化を防げる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-fake-software-update-boss-fight .claude/skills/random-os-fake-software-update-boss-fight

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

Skill を組み込むと、普段の通知や進捗バーが一変します。以下は実際の利用シーンを想定した出力例です。

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


# /random-os-fake-software-update-boss-fight

[OS通知] ソフトウェアアップデート勇者、伝説のバグ魔王と対峙!
進捗バー: 0% ... 勇者、アップデートの剣を構える
進捗バー: 25% ... バグ魔王、「未定義エラー」を放つ!
進捗バー: 50% ... 勇者、"パッチの盾" で防御
進捗バー: 75% ... バグ魔王、"依存関係の迷宮" を召喚
進捗バー: 100% ... 勇者、"リファクタリング斬り"!
勝利: アップデート勇者がバグ魔王を倒しました!

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


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

[通知] OSアップデート勇者、"ディレクトリの境界" を突破!
進捗バー: 10% ... バグ魔王、「循環参照の罠」発動
進捗バー: 40% ... 勇者、"package-lockの書" を読む
進捗バー: 70% ... バグ魔王、「型定義の闇」を投げつける
進捗バー: 100% ... 勇者、"依存パッチ" を適用!
全滅: バグ魔王の逆襲!アップデート勇者は力尽きた...

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


> なんとなく /random-os-fake-software-update-boss-fight を呼び出してみる

[OS通知] アップデート勇者、"README.mdの迷宮" に挑戦!
進捗バー: 15% ... バグ魔王、「README未更新」攻撃
進捗バー: 55% ... 勇者、"ドキュメントの光" で反撃
進捗バー: 85% ... バグ魔王、「コミットメッセージ爆撃」
進捗バー: 100% ... 勇者、"マージの一撃"!
勝利: アップデート勇者が迷宮を制覇!

before / after の違い

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

発動方式

明示呼び出し (/random-os-fake-software-update-boss-fight) と暗黙発動 (「アップデート」「バグ魔王」などの description にマッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-fake-software-update-boss-fight/
├── SKILL.md
├── scripts/
│   └── boss_fight_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/boss_fight_notifier.py 謎のOSソフトウェアアップデート vs バグ魔王バトル実況スクリプト
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-software-update-boss-fight
description: このSkillは、開発現場や作業中に『アップデート』『バグ』『進捗』『通知』などのキーワードを検知するか、明示的な /random-os-fake-software-update-boss-fight 呼び出し時に発動します。画面端や通知領域をRPGバトル実況風に演出し、作業の合間にユーモアを提供します。
---

# 機能概要
このSkillは、作業中のOS環境に突如「謎のソフトウェアアップデート vs バグ魔王」のバトル実況をRPG風に演出します。進捗バーや通知が勇者と魔王の攻防を表現し、毎回異なる展開やセリフで開発現場に一瞬の非日常をもたらします。バトルは進捗に応じて進み、勝敗もランダムで決定。真面目な現場に遊び心を加え、リフレッシュやチームの雰囲気改善に役立ちます。

# 使い方
- 明示的呼び出し: `/random-os-fake-software-update-boss-fight`
- 暗黙発動: 「アップデート」「バグ」「パッチ」「進捗」などのキーワード検出時に自動発動

# 出力例
```
[通知] OSアップデート勇者が伝説のバグ魔王に挑む!
[進捗] 勇者「パッチの剣」を抜いた!(20%)
[進捗] バグ魔王「例外の嵐」反撃!(35%)
[進捗] 勇者「デバッグ魔法」発動!(60%)
[進捗] バグ魔王「無限ループの呪い」!(80%)
[通知] 勇者の勝利!アップデート完了!
```

# 注意点
- 実際のソフトウェア更新やシステムには一切影響を与えません
- ローカル通知・標準出力のみ対応。OSの通知APIはPython標準・cross-platformのものを使用
- 出力内容や進行は毎回ランダム生成されます
- 除外パスや特定ディレクトリでの発動制御はありません

# 参考資料
- references/design_notes.md を参照
- 通知API: https://pypi.org/project/notifiers/ , https://pypi.org/project/plyer/
- Python標準ライブラリ random, argparse, time, sys などを利用

scripts/boss_fight_notifier.py

import random
import time
import sys
import argparse
try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

BATTLE_EVENTS = [
    ("勇者『パッチの剣』を抜いた!", 10, 20),
    ("バグ魔王『例外の嵐』反撃!", 15, 30),
    ("勇者『デバッグ魔法』発動!", 20, 40),
    ("バグ魔王『無限ループの呪い』!", 10, 20),
    ("勇者『アップデートの盾』で防御!", 5, 15),
    ("バグ魔王『レガシーコードの罠』!", 10, 25),
    ("勇者『ホットフィックス斬り』!", 15, 30),
    ("バグ魔王『未対応OS攻撃』!", 5, 20),
]

VICTORY_MESSAGES = [
    "勇者の勝利!アップデート完了!",
    "バグ魔王を討伐!システムは安全です。",
    "アップデート勇者が伝説を刻んだ!",
]
DEFEAT_MESSAGES = [
    "バグ魔王の逆襲!全滅…アップデート失敗。",
    "勇者は力尽きた…バグ魔王の勝利。",
    "バグ魔王がシステムを支配した…",
]

INTRO_MESSAGES = [
    "OSアップデート勇者が伝説のバグ魔王に挑む!",
    "アップデート勇者、バグ魔王の城へ突入!",
    "伝説のバグ魔王が復活…勇者が立ち向かう!",
]

PROGRESS_BAR_LENGTH = 40

class BattleState:
    def __init__(self):
        self.progress = 0
        self.battle_log = []
        self.victory = None

    def add_event(self, msg, delta):
        self.progress = min(100, self.progress + delta)
        self.battle_log.append((msg, self.progress))

    def is_finished(self):
        return self.progress >= 100

    def decide_outcome(self):
        self.victory = random.choice([True, False])


def send_notification(title, message):
    if PLYER_AVAILABLE:
        notification.notify(title=title, message=message, app_name="BossFightSkill", timeout=3)
    else:
        print(f"[通知] {title}: {message}")


def print_progress_bar(progress):
    filled = int(PROGRESS_BAR_LENGTH * progress // 100)
    bar = '█' * filled + '-' * (PROGRESS_BAR_LENGTH - filled)
    print(f"[進捗] |{bar}| {progress}%")


def run_boss_fight(verbose=False, delay=1.0):
    state = BattleState()
    intro = random.choice(INTRO_MESSAGES)
    send_notification("バトル開始", intro)
    print(f"[通知] {intro}")
    time.sleep(delay)
    while not state.is_finished():
        event, min_delta, max_delta = random.choice(BATTLE_EVENTS)
        delta = random.randint(min_delta, max_delta)
        state.add_event(event, delta)
        if verbose:
            print_progress_bar(state.progress)
        print(f"[進捗] {event}({state.progress}%)")
        time.sleep(delay)
    state.decide_outcome()
    if state.victory:
        msg = random.choice(VICTORY_MESSAGES)
    else:
        msg = random.choice(DEFEAT_MESSAGES)
    send_notification("バトル結果", msg)
    print(f"[通知] {msg}")
    return state


def list_battle_templates():
    print("# イベントテンプレート一覧:")
    for event, min_d, max_d in BATTLE_EVENTS:
        print(f"- {event} (+{min_d}-{max_d}%)")


def main():
    parser = argparse.ArgumentParser(description="謎のOSソフトウェアアップデート vs バグ魔王バトル実況スクリプト")
    subparsers = parser.add_subparsers(dest='command')

    run_parser = subparsers.add_parser('run', help='バトルを開始')
    run_parser.add_argument('--verbose', action='store_true', help='進捗バーを表示')
    run_parser.add_argument('--delay', type=float, default=1.0, help='イベント間の待ち秒数')

    list_parser = subparsers.add_parser('list', help='バトルイベントテンプレート一覧を表示')

    args = parser.parse_args()

    if args.command == 'run':
        run_boss_fight(verbose=args.verbose, delay=args.delay)
    elif args.command == 'list':
        list_battle_templates()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、作業中に突如RPGバトル風のアップデート通知を表示し、開発現場の雰囲気を一瞬で変えることを目的としています。進捗バーや実況風セリフをランダム生成することで、毎回異なる演出を実現します。

# 公式ドキュメント抜粋
- plyer: https://plyer.readthedocs.io/en/latest/
- notifiers: https://notifiers.readthedocs.io/en/latest/

# 利用例
- チームのアイスブレイクや休憩タイムのネタとして
- 長時間の作業や会議中にランダムで発動し、リフレッシュを促す

# 注意点
- 実際のOSやアプリのアップデート機能とは無関係です
- 通知APIが利用できない環境では標準出力のみとなります
- バトル展開や勝敗は完全ランダムです

# 設計方針
- Python標準ライブラリとplyerを活用し、クロスプラットフォームで動作
- イベント/セリフ/勝敗をテンプレート化し、拡張性を確保
- 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-fake-software-update-boss-fight .claude/skills/random-os-fake-software-update-boss-fight

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

3. ファイル配置確認

ls .claude/skills/random-os-fake-software-update-boss-fight
# SKILL.md, scripts/, references/, README.md があればOK

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

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

5. 動作確認

/random-os-fake-software-update-boss-fight で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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 との連携設計はどうあるべきか?
  • 進捗バーや通知がRPG風バトル実況になっているか?
  • バトルの展開やセリフが毎回ランダムで変化するか?
  • 最後に勝敗がランダムで決定し、きちんと通知されるか?

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

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

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

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

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