Claude Codeで作業中の気分を可視化する演出Skillの構築手順

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

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

Claude Code を使った AI coding workflow では、repository の理解や path management、context の維持がとても重要です。しかし、日々の作業の中で「ちょっとした気分転換」や「作業の合間の遊び心」が欲しくなる瞬間も多いもの。特に長時間の session や、複雑な monorepo を扱うと、集中力が切れたり、同じ作業の繰り返しで気分がマンネリ化しがちです。そんなとき、ターミナルやエディタの画面端にちょっとした“演出”があると、気分が切り替わって作業効率が上がると感じるユーザーも多いはずです。

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

加えて、「今日は何モードで作業しているのか?」をあえてランダムに表示してくれるような“謎の演出”があると、単調な作業フローにちょっとした変化が生まれ、onboarding や長丁場の repository understanding も楽しく乗り切れるかもしれません。

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

一言サマリ: このスキルは、ターミナルやエディタに“謎のOS風気分バロメーター”をランダム表示し、作業中の気分や生産性を根拠なく演出するSkill。

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

  • Claude Code でコマンドを実行するたびに、画面端に「今の気分モード」がランダムで現れ、作業フローがカオスに楽しくなる
  • 長時間の repository understanding や path management で集中力が切れそうな時、気分転換のきっかけになる
  • onboarding や session 再開時、ちょっとした遊び心でチームの雰囲気が和らぐ
  • monorepo の directory 移動や package 跨ぎのタイミングで、気持ちを切り替えやすくなる
  • AI coding workflow の単調さを和らげ、context や memory の“詰め込み感”をリセットできる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/random-os-mood-barometer .claude/skills/random-os-mood-barometer

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

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

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


# /random-os-mood-barometer
> 今日の作業を始めます。CLAUDE.md の内容を読み込んでください。

[OS Mood Barometer] 現在の気分モード: 絶好調エンジニアモード
- 発想力: MAX
- バグ遭遇率: 低
- コーヒー消費量: 通常
本日の productivity は謎の上昇傾向です。repository understanding がスムーズに進む予感。

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


> packages/api/ の main.py を修正して、packages/frontend/ との連携を確認したい

[OS Mood Barometer] 現在の気分モード: バグ吸引フェイズ
- context window: 拡大中
- directory confusion: 進行中
- repository navigation: 要注意
今は「バグを引き寄せる」フェーズ。path management に気を付けて作業しましょう。

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


> ちょっと気分転換したい。今の mood は?

[OS Mood Barometer] 現在の気分モード: アイデア枯渇ゾーン
- inspiration: 低下
- memory: フル活用中
- repo 構造: 再確認推奨
今は一息入れて、AI coding workflow をリフレッシュしましょう。

before / after の違い

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

発動方式

明示呼び出し (/random-os-mood-barometer) と暗黙発動 (「気分」「モード」「今の状態」などの自然言語指示) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/random-os-mood-barometer/
├── SKILL.md
├── scripts/
│   └── mood_barometer.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-mood-barometer
description: ターミナルやエディタでコマンド実行時、または /random-os-mood-barometer 明示呼び出し時に、画面端やメニューバー風の“謎のOS気分バロメーター”をランダム表示します。生産性や気分の根拠なき演出で、作業体験をカオスに彩ります。
---

# 機能概要
random-os-mood-barometerは、コマンド実行や作業開始時に、ランダムな“OS風気分バロメーター”をターミナル端やメニューバー風に表示するスキルです。判定内容は「絶好調エンジニアモード」「バグ吸引フェイズ」など完全にランダムで、作業中の気分やテンションを根拠なく演出します。これにより、単調なコマンドライン作業やエディタ作業にちょっとした遊び心とカオスな雰囲気を加え、日々の開発体験を彩ります。

# 使い方
- 明示呼び出し: `/random-os-mood-barometer` をターミナルやエディタで実行してください。
- 暗黙発動: 任意のコマンド(例: `git commit`, `python main.py`, `ls` など)の実行直後に自動でバロメーターが表示されます。
- 設定不要で、導入後すぐに利用可能です。

# 出力例
```
┌───── OS Mood Barometer ─────┐
│ 本日の気分: バグ吸引フェイズ           │
│ 生産性: 低下中 (推定)                │
│ モード: アイデア枯渇ゾーン           │
│ Tips: 休憩すると運気が上がるかも?    │
└─────────────────┘
```

# 注意点
- 判定内容は完全ランダムで、実際の生産性・気分とは無関係です。
- 表示位置はターミナルの上下端やエディタのメニューバー風に自動調整されますが、極端に小さい画面ではレイアウトが崩れる場合があります。
- ローカルファイルや履歴には保存されません。
- 除外パスや特定のコマンドでの非表示設定は現状未対応です。

# 参考資料
- references/design_notes.md
- https://docs.python.org/3/library/random.html
- https://tldp.org/LDP/abs/html/colorizing.html

scripts/mood_barometer.py

import sys
import argparse
import random
import datetime
import shutil
import os

MOODS = [
    "絶好調エンジニアモード",
    "バグ吸引フェイズ",
    "アイデア枯渇ゾーン",
    "仕様書迷子モード",
    "無敵デバッグタイム",
    "タイポ連発期",
    "集中力蒸発タイム",
    "コード美化フェーズ",
    "無限リファクタ地獄",
    "コミット恐怖症モード",
    "タスク消化祭り",
    "レビュー待ち無限ループ",
    "新機能妄想タイム",
    "眠気マックスゾーン",
    "仕様追加パニック"
]

PRODUCTIVITY = [
    "爆上げ中 (推定)",
    "低下中 (推定)",
    "安定運転 (仮)",
    "乱高下 (予想)",
    "未計測",
    "計測不能"
]

TIPS = [
    "休憩すると運気が上がるかも?",
    "コーヒー補給推奨",
    "一度深呼吸してみよう",
    "机周りを片付けてみよう",
    "今こそストレッチ!",
    "やる気は後からついてくる",
    "一旦手を止めてみよう",
    "BGMを変えてみよう",
    "進捗は気にしないでOK",
    "気分転換に散歩もアリ"
]

BORDER = "─"
TITLE = " OS Mood Barometer "


def get_terminal_width():
    try:
        return shutil.get_terminal_size().columns
    except Exception:
        return 60


def random_barometer():
    mood = random.choice(MOODS)
    prod = random.choice(PRODUCTIVITY)
    mode = random.choice(MOODS)
    tip = random.choice(TIPS)
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    width = get_terminal_width()
    box_width = min(max(40, len(TITLE) + 10), width - 2)
    def pad(s):
        return s + " " * (box_width - len(s.encode('utf-8')))
    border = "┌" + BORDER * (box_width - 2) + "┐"
    footer = "└" + BORDER * (box_width - 2) + "┘"
    title_line = "│" + TITLE.center(box_width - 2) + "│"
    lines = [
        border,
        title_line,
        f"│ 本日の気分: {mood}{' ' * (box_width - len('│ 本日の気分: ') - len(mood.encode('utf-8')) - 1)}│",
        f"│ 生産性: {prod}{' ' * (box_width - len('│ 生産性: ') - len(prod.encode('utf-8')) - 1)}│",
        f"│ モード: {mode}{' ' * (box_width - len('│ モード: ') - len(mode.encode('utf-8')) - 1)}│",
        f"│ Tips: {tip}{' ' * (box_width - len('│ Tips: ') - len(tip.encode('utf-8')) - 1)}│",
        footer
    ]
    return "\n".join(lines)


def log_barometer(logfile):
    mood = random.choice(MOODS)
    prod = random.choice(PRODUCTIVITY)
    mode = random.choice(MOODS)
    tip = random.choice(TIPS)
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    entry = {
        "datetime": now,
        "mood": mood,
        "productivity": prod,
        "mode": mode,
        "tip": tip
    }
    with open(logfile, "a", encoding="utf-8") as f:
        f.write(f"{entry}\n")
    return entry


def list_logs(logfile, limit=10):
    if not os.path.exists(logfile):
        print("ログファイルがありません。")
        return
    with open(logfile, encoding="utf-8") as f:
        lines = f.readlines()[-limit:]
    for line in lines:
        print(line.strip())


def summary_logs(logfile):
    if not os.path.exists(logfile):
        print("ログファイルがありません。")
        return
    moods = {}
    with open(logfile, encoding="utf-8") as f:
        for line in f:
            for m in MOODS:
                if m in line:
                    moods[m] = moods.get(m, 0) + 1
    print("過去の気分モード出現回数:")
    for m, c in sorted(moods.items(), key=lambda x: -x[1]):
        print(f"{m}: {c}回")


def main():
    parser = argparse.ArgumentParser(description="謎のOS風気分バロメーター")
    subparsers = parser.add_subparsers(dest="command")

    parser_log = subparsers.add_parser("log", help="バロメーターを表示してログに記録")
    parser_log.add_argument("--logfile", default="~/.mood_barometer.log", help="ログファイルパス")

    parser_list = subparsers.add_parser("list", help="バロメーターログを表示")
    parser_list.add_argument("--logfile", default="~/.mood_barometer.log", help="ログファイルパス")
    parser_list.add_argument("--limit", type=int, default=10, help="表示件数")

    parser_summary = subparsers.add_parser("summary", help="バロメーターの出現傾向を集計")
    parser_summary.add_argument("--logfile", default="~/.mood_barometer.log", help="ログファイルパス")

    parser_show = subparsers.add_parser("show", help="バロメーターを1回だけ表示")

    args = parser.parse_args()

    if args.command == "log":
        logfile = os.path.expanduser(args.logfile)
        entry = log_barometer(logfile)
        print(random_barometer())
    elif args.command == "list":
        logfile = os.path.expanduser(args.logfile)
        list_logs(logfile, args.limit)
    elif args.command == "summary":
        logfile = os.path.expanduser(args.logfile)
        summary_logs(logfile)
    elif args.command == "show" or args.command is None:
        print(random_barometer())
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
random-os-mood-barometerは、作業中の気分や生産性を完全ランダムで“OS風”に演出するスキルです。CLIやエディタでのコマンド実行時に自動または明示的に呼び出すことで、日々の作業に遊び心を加えます。

# 公式ドキュメント抜粋
- Python random: https://docs.python.org/3/library/random.html
- ターミナル表示調整: https://tldp.org/LDP/abs/html/colorizing.html

# 利用例
- 毎朝の開発ルーチンで気分バロメーターを表示し、チームの雑談ネタにする
- 長時間作業の合間に“気分モード”を見てリフレッシュする

# 注意点
- 出力内容は完全ランダムで、実際の生産性や気分とは無関係です。
- ログ機能はオプションで、記録を残さずに演出のみ使うことも可能です。

# 設計方針
- シンプルなPythonスクリプトで、外部依存を最小限に。
- 出力はターミナルやエディタで視認性を重視し、レイアウト調整機能を搭載。
- ログ・集計・演出のみで、実際のOSや生産性評価とは連携しません。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/random-os-mood-barometer .claude/skills/random-os-mood-barometer

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

3. ファイル配置確認

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

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

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

5. 動作確認

/random-os-mood-barometer で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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で謎のOS風気分バロメーターを動かしてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Claude Code 公式ドキュメント と、本シリーズ「Claude Codeを便利にするSkill提案」の他記事も参照のこと。

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

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

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

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