Claude Codeで仕事の合間に気分天気表示を演出するSkill構築手順

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

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

Claude Code を日常的に使っていると、通知や演出まわりで「こんな機能あったら面白いのに」と感じる瞬間が少なくありません。特に作業が長引いたり、集中力が途切れがちなタイミングでは、ちょっとした気分転換や遊び要素が欲しくなります。

また、リポジトリの構造や context の管理に集中していると、淡々とした作業画面が続き、場の空気が単調になりがちです。そんなとき、唐突な演出や遊び心のある通知が加わることで、気分がリフレッシュされることもあるでしょう。

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

こうした「作業の空気がマンネリ化」「気分転換が欲しい」「唐突な演出でリセットしたい」といった悩みは、Claude Code の AI coding workflow を長く続けるほど多くのユーザーが共感するポイントです。

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

一言サマリ: このスキルは、作業画面に“謎の気分天気バー”を出現させ、場の空気を一瞬でカオスに彩るSkill。

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

  • Claude Code の作業画面に、完全ランダムな「気分天気バー」が出現し、単調な workflow に遊び心を加えられる
  • session 開始や directory 移動など、context 切り替え時に突発的な演出が入り、気分転換やリフレッシュ効果を得られる
  • repo や path management の説明に飽きたとき、意味不明な天気ワードで場の空気が和む
  • onboarding 時に「今日は仕様雪崩」「バグの嵐」など、会話のきっかけやネタを自然に提供できる
  • 長時間の AI coding workflow でも、定期的な“お遊び通知”で集中力をリセットできる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/os-fake-mood-weather-bar .claude/skills/os-fake-mood-weather-bar

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

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

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


# /os-fake-mood-weather-bar
> 今日から新しいプロジェクトで作業を始めます

[OS風 気分天気バー]
---------------------------------------
本日の気分天気: 絶好調・晴れ
メッセージ: 「このリポジトリ、今日はバグ雲一つなし」
---------------------------------------
現在の directory: /Users/user/my-repo
repository understanding: ON
memory: session start

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


> packages/api に移動して context 切り替え

[OS風 気分天気バー]
---------------------------------------
現在の気分天気: やる気霧雨
メッセージ: 「monorepo の境界に霧が立ち込めています」
---------------------------------------
directory: /Users/user/my-repo/packages/api
path management: package boundary detected

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


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

[OS風 気分天気バー]
---------------------------------------
気分天気: 仕様雪崩
メッセージ: 「仕様変更の雪が止まりません」
---------------------------------------
AI coding workflow: mood refresh

before / after の違い

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

発動方式

明示呼び出し (/os-fake-mood-weather-bar) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/os-fake-mood-weather-bar/
├── SKILL.md
├── scripts/
│   └── mood_weather_bar.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: os-fake-mood-weather-bar
description: このSkillは、コード実行や作業の合間に「気分天気バー」を画面端へランダム表示します。明示呼び出し(/os-fake-mood-weather-bar)や、'気分','天気','バー','カオス','演出'等のキーワード検知時に自動発動します。
---

# 機能概要
このSkillは、あなたのPC画面端やメニューバーに“OS風・謎の気分天気バー”を突如出現させます。天気バーは「絶好調・晴れ」「やる気霧雨」「集中力台風接近中」「バグの嵐」「仕様雪崩」など、完全ランダムな“気分天気”を表示し、作業空間にカオスな演出を加えます。実用性はほぼありませんが、仕事や開発の合間にシュールな空気を演出することができます。

# 使い方
- 明示呼び出し: `/os-fake-mood-weather-bar` を実行すると即座にバーが表示されます。
- 暗黙発動: 「気分」「天気」「バー」「カオス」「演出」などのキーワードが会話やコマンド内に出現した場合、自動でバーが出現します。

# 出力例
```
[気分天気バー] 2024-06-23 14:33:07
本日の気分天気:やる気霧雨
コメント:やる気が微妙に降り注ぐ午後。コーヒーで回復を!

[気分天気バー] 2024-06-23 15:12:10
本日の気分天気:集中力台風接近中
コメント:集中の嵐が迫る。タスクを片付けるチャンス!

[気分天気バー] 2024-06-23 16:01:55
本日の気分天気:バグの嵐
コメント:バグが吹き荒れる一日。冷静なデバッグを。
```

# 注意点
- 実際の天気や心理状態とは一切関係ありません。
- ローカルPCでのみ動作し、バーの表示はOSの通知API(Windows: Toast, macOS: NSUserNotification, Linux: notify-send)を利用します。
- 他の通知系Skillと同時に発動した場合、通知が重複する可能性があります。
- ログはローカルに保存されますが、個人情報は含みません。

# 参考資料
- [Windows Toast Notifications](https://docs.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/toast-notifications)
- [macOS User Notifications](https://developer.apple.com/documentation/usernotifications)
- [Linux notify-send](https://man.archlinux.org/man/notify-send.1)
- references/design_notes.md を参照してください。

scripts/mood_weather_bar.py

import sys
import os
import random
import argparse
import platform
import subprocess
from datetime import datetime

MOODS = [
    ("絶好調・晴れ", "今日は何をやっても順調!この勢いでタスクを消化しよう。"),
    ("やる気霧雨", "やる気が微妙に降り注ぐ午後。コーヒーで回復を!"),
    ("集中力台風接近中", "集中の嵐が迫る。タスクを片付けるチャンス!"),
    ("バグの嵐", "バグが吹き荒れる一日。冷静なデバッグを。"),
    ("仕様雪崩", "仕様変更の雪崩に注意。落ち着いて対応しよう。"),
    ("納期雷雨", "納期の雷が鳴り響く。計画的に進めよう。"),
    ("無気力曇り", "やる気が曇りがち。気分転換を挟もう。"),
    ("眠気霧", "眠気の霧が立ち込める。短い休憩を。"),
    ("インスピレーション虹", "アイデアの虹がかかる瞬間!メモを忘れずに。"),
    ("レビュー雹", "レビューの雹が降る。指摘も前向きに受け止めよう。")
]

LOG_PATH = os.path.expanduser("~/.claude_fake_mood_weather_bar.log")


def choose_mood():
    return random.choice(MOODS)


def format_output(mood, comment, timestamp=None):
    if not timestamp:
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    return f"[気分天気バー] {timestamp}\n本日の気分天気:{mood}\nコメント:{comment}\n"


def show_notification(mood, comment):
    system = platform.system()
    title = "気分天気バー"
    message = f"{mood}\n{comment}"
    try:
        if system == "Darwin":
            # macOS: use osascript
            script = f'display notification "{comment}" with title "{mood}" subtitle "気分天気バー"'
            subprocess.run(["osascript", "-e", script], check=True)
        elif system == "Linux":
            # Linux: use notify-send
            subprocess.run(["notify-send", title, f"{mood}\n{comment}"], check=True)
        elif system == "Windows":
            # Windows: use Toast (via powershell)
            ps_script = f"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null; " \
                        f"$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02); " \
                        f"$textNodes = $template.GetElementsByTagName('text'); " \
                        f"$textNodes.Item(0).AppendChild($template.CreateTextNode('{mood}')) > $null; " \
                        f"$textNodes.Item(1).AppendChild($template.CreateTextNode('{comment}')) > $null; " \
                        f"$toast = [Windows.UI.Notifications.ToastNotification]::new($template); " \
                        f"$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('気分天気バー'); " \
                        f"$notifier.Show($toast);"
            subprocess.run(["powershell", "-Command", ps_script], check=True)
        else:
            print("[WARN] 未対応OSです。通知は標準出力のみ行います。")
            print(f"{title}: {mood}\n{comment}")
    except Exception as e:
        print(f"[ERROR] 通知の表示に失敗しました: {e}")
        print(f"{title}: {mood}\n{comment}")


def log_mood(mood, comment, timestamp=None):
    out = format_output(mood, comment, timestamp)
    try:
        with open(LOG_PATH, "a", encoding="utf-8") as f:
            f.write(out + "\n")
    except Exception as e:
        print(f"[ERROR] ログの保存に失敗: {e}")


def list_logs(limit=10):
    if not os.path.exists(LOG_PATH):
        print("ログファイルがありません。")
        return
    try:
        with open(LOG_PATH, "r", encoding="utf-8") as f:
            lines = f.read().split("\n\n")
            lines = [l for l in lines if l.strip()]
            for entry in lines[-limit:]:
                print(entry)
                print("")
    except Exception as e:
        print(f"[ERROR] ログの読み込みに失敗: {e}")


def summary():
    if not os.path.exists(LOG_PATH):
        print("ログファイルがありません。")
        return
    counter = {}
    try:
        with open(LOG_PATH, "r", encoding="utf-8") as f:
            for line in f:
                if line.startswith("本日の気分天気:"):
                    mood = line.strip().split(":", 1)[1]
                    counter[mood] = counter.get(mood, 0) + 1
        print("=== 気分天気 出現回数集計 ===")
        for mood, cnt in sorted(counter.items(), key=lambda x: -x[1]):
            print(f"{mood}: {cnt}回")
    except Exception as e:
        print(f"[ERROR] 集計に失敗: {e}")


def main():
    parser = argparse.ArgumentParser(description="謎の気分天気バーを画面端に表示")
    subparsers = parser.add_subparsers(dest="command")

    show_parser = subparsers.add_parser("show", help="気分天気バーを表示")
    show_parser.add_argument("--log", action="store_true", help="表示内容をログに記録")

    list_parser = subparsers.add_parser("list", help="過去の気分天気バー出力を一覧表示")
    list_parser.add_argument("--limit", type=int, default=10, help="表示する件数")

    summary_parser = subparsers.add_parser("summary", help="気分天気の出現回数を集計")

    args = parser.parse_args()

    if args.command == "show":
        mood, comment = choose_mood()
        out = format_output(mood, comment)
        print(out)
        show_notification(mood, comment)
        if args.log:
            log_mood(mood, comment)
    elif args.command == "list":
        list_logs(args.limit)
    elif args.command == "summary":
        summary()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、作業中のユーザーに対して完全ランダムな“気分天気”を通知として表示し、場の空気を和らげることを目的としています。実用性よりも演出・遊び心を重視した設計です。

# 公式ドキュメント抜粋
- Windows: [Toast Notifications](https://docs.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/toast-notifications)
- macOS: [NSUserNotification](https://developer.apple.com/documentation/usernotifications)
- Linux: [notify-send](https://man.archlinux.org/man/notify-send.1)

# 利用例
- チームの朝会や作業開始時に、/os-fake-mood-weather-bar で気分天気を表示し、会話のきっかけや笑いを誘う。
- 開発の合間にランダム発動させて、集中しすぎた空気を和ませる。

# 注意点
- OSの通知APIを直接呼び出すため、権限やAPIのバージョンによっては通知が表示されない場合があります。
- ログファイルはユーザーのホームディレクトリに保存されますが、個人情報は含まれません。

# 設計方針
- クロスプラットフォーム(Windows/macOS/Linux)対応。
- 実在APIのみ使用し、外部依存を最小限に。
- Skill本体はCLIサブコマンド形式で拡張性を確保しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/os-fake-mood-weather-bar .claude/skills/os-fake-mood-weather-bar

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

3. ファイル配置確認

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

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

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

5. 動作確認

/os-fake-mood-weather-bar で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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 との連携設計はどうあるべきか?
  • 謎の気分天気バーが想定どおり画面端やメニューバーに表示されるか?
  • 表示内容が毎回ランダムかつカオスなワードになっているか?
  • 他の通知・演出系Skillと競合しないか?

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

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

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

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

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