Claude Code ユーザーが日常でぶつかる悩み
Claude Code を使っていると、集中したいタイミングや大事な作業フローの最中に「何か気分転換したい」「ちょっとした刺激が欲しい」と感じることが意外と多いものです。特に長時間のコーディングや monorepo の複雑なパス管理に没頭していると、気付けば context や repository 構造の把握に追われ、息抜きのきっかけもなくなりがちです。
AI coding workflow の中で、通知や演出が単調だと、どうしても「作業空間が無機質」「リフレッシュするタイミングを逃す」「メモリや context の切り替えが単調」などの課題が浮かびます。
- Claude Code がいつの間にか違う directory を見始めて、想定外のファイルを読みに行く
- monorepo で package を跨いだ瞬間、Claude Code が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
また、通知・演出・OS連携系のSkillが少ないため、作業中の気分転換やユーモラスな演出を求めても、なかなか満足できないという声もあります。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、突如現れる“謎のOSボスキャラ”によるランダム通知演出を導入し、Claude Code の作業空間に意外性とリフレッシュ体験をもたらします。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 長時間のAI coding workflowや repository understanding の合間に、突発的な演出で集中力をリセットできる
- monorepo や複雑な directory 構造で没頭しすぎた時に、context 切り替えのきっかけが生まれる
- ストレッチや小休止のタイミングを、謎のボスキャラが独特なセリフで“強制”通知してくれる
- 通知内容・ボスキャラが毎回ランダム生成されるため、作業空間に飽きが来ない
- OS連携による画面端やデスクトップへの意外なポップアップで、単調な通知体験から脱却できる
GitHub から degit でコマンド1行、Claude Code の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/claude-code/random-os-mystery-boss-pop .claude/skills/random-os-mystery-boss-pop実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (CLAUDE.md と組み合わせて)
# /random-os-mystery-boss-pop
=== [OS BOSS ENCOUNTERED!] ===
謎のOSボス「メモリ喰いゴーレム」が画面端に現れた!
【緊急任務】:
「今すぐ 'src/context_manager.py' のコメントを全消去せよ!
さもなくば、repository の記憶が消えるぞ…」
(※この通知は5秒後に自動で消えます)
シーン2: monorepo / package 跨ぎ作業時
> /random-os-mystery-boss-pop
=== [OS BOSS APPEARS!] ===
「バグ・クラウド将軍」が packages/api/ 配下から乱入!
【命令】:
「本日は 'packages/ui/components/Button.tsx' で
魔王のバグが発生中。今すぐデバッグせよ!」
(デスクトップ右下に通知バナー表示)
シーン3: お遊び的な使い方
> /random-os-mystery-boss-pop
=== [OS BOSS INVASION!] ===
新手の「残業魔王・ダーク残タロウ」がデスクトップに出現!
【警告】:
「お主、今夜は context が長すぎるぞ。
ストレッチせよ。さもなくば、memory が暴走する!」
(画面中央に一瞬だけカオスなポップアップ)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Claude Code が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 突発通知で集中力をリセット、新たな気付きのきっかけに |
発動方式
明示呼び出し (/random-os-mystery-boss-pop) と暗黙発動 (description マッチ) の両方に対応。
Skill の中身を全部見せる
.claude/skills/random-os-mystery-boss-pop/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.claude/skills/random-os-mystery-boss-pop/
├── SKILL.md
├── scripts/
│ └── random_os_mystery_boss_pop.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_mystery_boss_pop.py |
random-os-mystery-boss-pop: 謎のOSボスがランダムに出現し、命令や警告を通知します。 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-mystery-boss-pop
description: 作業中の集中やリマインダー、息抜きが必要なタイミング(例: 長時間作業・休憩忘れ・集中力低下など)に、ランダム生成の“謎OSボスキャラ”が画面端やデスクトップに突如現れ、ユニークな命令や警告を通知します。発動キーワード: ボス, 急襲, 休憩, ストレッチ, 魔王, 集中, OS演出。
---
# 機能概要
このSkillは、作業中のあなたのデスクトップや画面端に“謎のOSボスキャラ”が突如出現し、カオスな命令や警告をランダムに発します。ボスキャラのビジュアルやセリフは毎回ランダム生成され、例えば「緊急任務:今すぐストレッチせよ」や「本日は残業魔王が降臨中」など、妙に的外れな演出で集中力を試します。作業の合間に意外性と遊び心をもたらし、リフレッシュや注意喚起に役立ちます。
# 使い方
明示的な呼び出しは `/random-os-mystery-boss-pop` コマンドで実行します。また、「ボス」「魔王」「ストレッチ」「集中」などのキーワードを含むプロンプトや作業ログからも自動発動します。通知はOSのネイティブ通知機能を使い、画面端やデスクトップにポップアップ表示されます。
# 出力例
```
[通知] 謎のOSボス「メモリ喰らい魔王」が出現!
命令: 今すぐ椅子から立ち上がり、3回回転せよ!
---
[通知] ボス「ディスク断捨離伯爵」からの警告:
「ファイル整理を怠る者に明日はない!」
---
[通知] 新たな刺客「プロセス暴走忍者」参上!
任務: 10秒間、目を閉じて深呼吸!
```
# 注意点
- 本Skillは通知のみを行い、ファイルやシステム設定には一切変更を加えません。
- ローカル環境の通知API(Windows: Toast, macOS: AppleScript, Linux: notify-send)を利用します。
- 画像や音声演出は含みません(テキスト通知のみ)。
- 業務用端末や集中必須の場面ではご注意ください。
# 参考資料
- references/design_notes.md に設計方針・通知APIの解説を記載
- 公式: [Windows Toast Notification](https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/send-local-toast)
- 公式: [AppleScript display notification](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_display.html)
- 公式: [notify-send (Linux)](https://man7.org/linux/man-pages/man1/notify-send.1.html)
scripts/random_os_mystery_boss_pop.py
import sys
import os
import platform
import random
import subprocess
import argparse
import time
from datetime import datetime
BOSS_NAMES = [
"メモリ喰らい魔王",
"ディスク断捨離伯爵",
"プロセス暴走忍者",
"残業タイムリーパー",
"バグ召喚師",
"CPU炎上王",
"ネットワーク監視鬼",
"アップデート妖精",
"マウス封印将軍",
"スクリーンセーバー幻術師"
]
BOSS_COMMANDS = [
"今すぐ椅子から立ち上がり、3回回転せよ!",
"ファイル整理を怠る者に明日はない!",
"10秒間、目を閉じて深呼吸!",
"本日は残業魔王が降臨中。覚悟せよ!",
"ストレッチしない者はバグに呪われる!",
"コーヒーを淹れてリセットせよ!",
"目を画面から離して遠くを見よ!",
"1分間、何もせず静止せよ!",
"机の上を片付けよ!",
"OSの再起動は不要だ、今は耐えよ!"
]
BOSS_TITLES = [
"謎のOSボス",
"ボス",
"新たな刺客",
"警告",
"任務",
"緊急指令",
"挑戦状",
"乱入者"
]
HISTORY_FILE = os.path.expanduser("~/.random_os_mystery_boss_pop.log")
def select_boss():
name = random.choice(BOSS_NAMES)
command = random.choice(BOSS_COMMANDS)
title = random.choice(BOSS_TITLES)
return title, name, command
def notify(title, message):
system = platform.system()
try:
if system == "Darwin": # macOS
script = f'display notification "{message}" with title "{title}"'
subprocess.run(["osascript", "-e", script], check=True)
elif system == "Linux":
subprocess.run(["notify-send", title, message], check=True)
elif system == "Windows":
try:
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast(title, message, duration=8)
except ImportError:
# Fallback: powershell
ps_cmd = f'[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null;'
ps_cmd += f'$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02);'
ps_cmd += f'$template.GetElementsByTagName("text")[0].AppendChild($template.CreateTextNode("{title}")) > $null;'
ps_cmd += f'$template.GetElementsByTagName("text")[1].AppendChild($template.CreateTextNode("{message}")) > $null;'
ps_cmd += f'$toast = [Windows.UI.Notifications.ToastNotification]::new($template);'
ps_cmd += f'$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("random-os-mystery-boss-pop");'
ps_cmd += f'$notifier.Show($toast)'
subprocess.run(["powershell", "-Command", ps_cmd], check=True)
else:
print(f"[通知] {title}: {message}")
except Exception as e:
print(f"通知エラー: {e}")
print(f"[通知] {title}: {message}")
def log_history(title, name, command):
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
line = f"[{now}] {title}『{name}』: {command}\n"
with open(HISTORY_FILE, "a", encoding="utf-8") as f:
f.write(line)
def show_boss():
title, name, command = select_boss()
msg = f"{name}が出現!\n{command}"
notify(title, msg)
log_history(title, name, command)
print(f"[通知] {title}「{name}」\n命令: {command}")
def list_history(limit=10):
if not os.path.exists(HISTORY_FILE):
print("履歴がありません。")
return
with open(HISTORY_FILE, "r", encoding="utf-8") as f:
lines = f.readlines()[-limit:]
print("--- 最近のボス履歴 ---")
for line in lines:
print(line.strip())
def summary():
if not os.path.exists(HISTORY_FILE):
print("履歴がありません。")
return
bosses = {}
with open(HISTORY_FILE, "r", encoding="utf-8") as f:
for line in f:
for name in BOSS_NAMES:
if name in line:
bosses[name] = bosses.get(name, 0) + 1
print("--- ボス出現回数 ---")
for name, count in sorted(bosses.items(), key=lambda x: -x[1]):
print(f"{name}: {count}回")
def parse_args():
parser = argparse.ArgumentParser(description="random-os-mystery-boss-pop: 謎のOSボスがランダムに出現し、命令や警告を通知します。")
subparsers = parser.add_subparsers(dest="command")
subparsers.add_parser("pop", help="ボスを1体ランダム出現させる")
subparsers.add_parser("list", help="直近のボス履歴を表示")
subparsers.add_parser("summary", help="ボス出現回数のサマリーを表示")
parser.add_argument("--repeat", type=int, default=1, help="連続でボスを出現させる回数")
parser.add_argument("--interval", type=int, default=0, help="複数回出現時の間隔(秒)")
return parser.parse_args()
def main():
args = parse_args()
if args.command == "pop" or args.command is None:
for i in range(args.repeat):
show_boss()
if args.repeat > 1 and i < args.repeat - 1:
time.sleep(args.interval)
elif args.command == "list":
list_history()
elif args.command == "summary":
summary()
else:
print("コマンドが不正です。--help を参照してください。")
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
このSkillは、OSの標準通知APIを活用し、作業中に意外性のある演出を提供します。実際のシステムやファイルには一切影響を与えず、通知のみを行う設計です。
# 公式ドキュメント抜粋
- Windows: Toast Notification ([公式](https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/send-local-toast))
- macOS: AppleScript display notification ([公式](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_display.html))
- Linux: notify-send ([manページ](https://man7.org/linux/man-pages/man1/notify-send.1.html))
# 利用例
- 長時間作業時の休憩リマインダー
- 雑談イベントや社内ハッカソンの演出
- 集中力が切れたタイミングでの気分転換
# 注意点
- 業務端末や会議中の利用は控えてください。
- 通知が届かない場合は、OSの通知設定を確認してください。
# 設計方針
- 毎回ランダムなボス・セリフを生成し、履歴も記録
- 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-mystery-boss-pop .claude/skills/random-os-mystery-boss-pop
.claude/skills/random-os-mystery-boss-pop の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .claude/skills/random-os-mystery-boss-pop
# SKILL.md, scripts/, references/, README.md があればOK
4. Claude Code を再起動 (or Skill 自動検出を待つ)
新しいSkillが自動で認識されます。リスト確認したい場合は /random-os-mystery-boss-pop と Skill 名で出てきます。
5. 動作確認
/random-os-mystery-boss-pop で呼び出すか、自然言語で発動条件にマッチする指示を出すと 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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
