Claude Codeで現場の緊張を和らげる通知演出の作り方入門

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

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

Claude Code で開発作業をしていると、思わぬタイミングで集中が途切れることがよくあります。特にリポジトリを跨いだり、長時間のAI coding workflowを続けていると、ふとした瞬間に緊張感や堅苦しさが漂いがちです。そんな時、ちょっとした“遊び心”が欲しくなるものです。

  • 長時間作業やonboardingで空気が張り詰め、ちょっとした息抜きが欲しくなる
  • monorepoで複数のdirectoryを行き来していると、contextやpath managementが面倒になり気分が沈みがち
  • repoやrepository understandingに集中していると、突如現れる意味不明な通知に思わず笑ってしまう瞬間が欲しい
  • AI coding workflow中に「またパスワード変えろって通知か…」と現実の職場あるあるを疑似体験したい
  • 本当にパスワードが変わるわけではないと分かっていても、理不尽なルール通知で場の空気を和ませたい

こうした「ちょっとした混沌」や「理不尽な通知」を、あえてAIが演出することで、作業の緊張感を一瞬ほぐす…そんなニーズに応えるSkillです。

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

一言サマリ: 作業中に突如“謎のOSパスワードポリシー変更通知”がデスクトップに現れますSkill。

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

  • 長時間のClaude Code作業やonboardingの緊張感を、理不尽なジョーク通知で一瞬リセットできる
  • AI coding workflow中に現れる“偽パスワード通知”で、チームや個人の作業空間に遊び心をプラスできる
  • repository understandingやpath managementの合間に、現実の職場あるあるを疑似体験できる
  • 本当に設定が変わる心配なく、通知だけで混沌を演出できるので安全
  • monorepoやdirectory単位での作業切り替え時に、思わず笑ってしまうネタ通知が挟まる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/os-random-fake-password-policy-alert .claude/skills/os-random-fake-password-policy-alert

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


# /os-random-fake-password-policy-alert

[通知] 重要:本日よりパスワードは「季節の俳句」+「円周率12桁」+「好きな給食メニュー」を含めて設定してください。
例: 春の夜/3.141592653589/カレーライス

ご協力ありがとうございます。なお、記憶は禁止です。

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


> package-b/utils/ 配下のテストコードを確認して

[警告] 新パスワードポリシー発表:
本日より「母音だけのパスワード」はご利用いただけません。
例: aeiou → NG

パスワードは必ず子音を3文字以上含めてください。

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


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

[推奨] パスワードは毎日ランダムに変更しましょう。
本日のテーマ: 「好きな動物」+「西暦」+「天気予報の一言」
例: パンダ2024晴れのち曇り

なお、全て暗記は禁止です。

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Claude Code が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 突然の“謎通知”で場の空気が一瞬和む

発動方式

明示呼び出し (/os-random-fake-password-policy-alert) と暗黙発動 (「パスワード」「通知」「ルール」などのdescriptionマッチ) の両方に対応。

Skill の中身を全部見せる

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

.claude/skills/os-random-fake-password-policy-alert/
├── SKILL.md
├── scripts/
│   └── fake_password_policy_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Claude Code がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/fake_password_policy_alert.py osascript -e ‘display notification “{message}” with title “[{level}] パスワードポリシー通知”‘
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: os-random-fake-password-policy-alert
description: 作業中やコマンド実行時に、パスワードや認証、セキュリティ、ログイン、OS設定などに関連するキーワードが出現した場合、もしくは/skill-nameで明示的に呼び出された場合に発動します。現場の緊張感を和らげたいときに最適です。
---

# 機能概要
このSkillは、OSやシステム運用現場でよくある「パスワードポリシー変更通知」を、完全に架空かつ理不尽な内容でランダムにデスクトップ通知として表示します。たとえば「本日よりパスワードは季節の俳句+円周率12桁+好きな給食メニュー必須」など、現実にはあり得ないポリシーが突然現れ、作業中の緊張感やマンネリを一瞬で和ませます。実際のパスワードやOS設定には一切影響せず、ジョークやチームのアイスブレイクに最適です。

# 使い方
- 明示呼び出し例: `/os-random-fake-password-policy-alert` または `/skill-name`
- 暗黙発動キーワード例: 「パスワード」「認証」「セキュリティ」「ログイン」「ポリシー」「OS設定」などが会話やコマンド履歴に現れた際に自動発動します。

# 出力例
```
[ALERT] 重要:本日よりパスワードは季節の俳句+円周率12桁+好きな給食メニュー必須です。
[NOTICE] 新ルール:母音だけのパスワードは禁止されました。ご注意ください。
[INFO] 推奨:毎日ランダムにパスワードを変えましょう(記憶は禁止です)。
[ALERT] パスワードには最低1つの元素記号を含めてください。
[NOTICE] 本日よりパスワード変更時は「好きな動物の鳴き声」を3回入力してください。
```

# 注意点
- 本Skillは通知の表示のみを行い、実際のパスワードやセキュリティ設定には一切影響しません。
- 通知内容は完全なジョークであり、実務上の参考にはなりません。
- 通知はローカル環境にのみ表示され、ログやファイル保存は行いません。
- 定期的またはランダムなタイミングで自動発動する場合があります。

# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- 公式ドキュメント: https://docs.python.org/3/library/subprocess.html, https://docs.python.org/3/library/random.html, https://docs.python.org/3/library/argparse.html

scripts/fake_password_policy_alert.py

import sys
import os
import random
import time
import argparse
import threading
from datetime import datetime

FAKE_POLICIES = [
    "重要:本日よりパスワードは季節の俳句+円周率12桁+好きな給食メニュー必須です。",
    "新ルール:母音だけのパスワードは禁止されました。ご注意ください。",
    "推奨:毎日ランダムにパスワードを変えましょう(記憶は禁止です)。",
    "パスワードには最低1つの元素記号を含めてください。",
    "本日よりパスワード変更時は『好きな動物の鳴き声』を3回入力してください。",
    "警告:パスワードに使える文字は、今日の天気によって変わります。",
    "新規ルール:パスワードは5日ごとに『好きな四字熟語』を含めてください。",
    "推奨:パスワード作成時は、必ず親しい同僚に相談してください。",
    "注意:数字部分は必ず素数のみを使用してください。",
    "新ルール:パスワードには一度も使ったことのない単語を含めてください。",
    "推奨:パスワードは毎朝6時に自動リセットされます。",
    "警告:パスワードに『パスワード』という単語を含めてはいけません。",
    "重要:パスワードの長さは円周率の小数点以下の桁数に準じます。",
    "新ルール:パスワードは左右対称でなければなりません。",
    "推奨:パスワードには必ず『好きな給食メニュー』を含めてください。",
    "注意:パスワードは毎回違うフォントで入力してください。",
    "警告:パスワードに使える記号は日替わりです。",
    "新ルール:パスワード変更時は、好きな都道府県を一つ入力してください。"
]

ALERT_LEVELS = ["ALERT", "NOTICE", "INFO", "WARNING"]

HISTORY_FILE = os.path.expanduser("~/.os_random_fake_password_policy_alert.log")


def show_notification(message, level):
    # クロスプラットフォームな通知表示
    try:
        if sys.platform.startswith('darwin'):
            os.system(f'''osascript -e 'display notification "{message}" with title "[{level}] パスワードポリシー通知"' ''')
        elif sys.platform.startswith('linux'):
            os.system(f'''notify-send '[{level}] パスワードポリシー通知' '{message}' ''')
        elif sys.platform.startswith('win'):
            from win10toast import ToastNotifier
            toaster = ToastNotifier()
            toaster.show_toast(f"[{level}] パスワードポリシー通知", message, duration=5)
        else:
            print(f"[{level}] {message}")
    except Exception as e:
        print(f"[{level}] {message} (通知失敗: {e})")


def random_policy_message():
    level = random.choice(ALERT_LEVELS)
    message = random.choice(FAKE_POLICIES)
    return level, message


def log_history(level, message):
    try:
        with open(HISTORY_FILE, 'a', encoding='utf-8') as f:
            f.write(f"{datetime.now().isoformat()} [{level}] {message}\n")
    except Exception:
        pass


def list_history(limit=10):
    try:
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            lines = f.readlines()
            for line in lines[-limit:]:
                print(line.strip())
    except FileNotFoundError:
        print("履歴がありません。")


def summary_history():
    try:
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            lines = f.readlines()
            print(f"通知履歴件数: {len(lines)}")
            levels = {k: 0 for k in ALERT_LEVELS}
            for line in lines:
                for lvl in ALERT_LEVELS:
                    if f'[{lvl}]' in line:
                        levels[lvl] += 1
            for lvl in ALERT_LEVELS:
                print(f"{lvl}: {levels[lvl]}")
    except FileNotFoundError:
        print("履歴がありません。")


def trigger_alert():
    level, message = random_policy_message()
    show_notification(message, level)
    log_history(level, message)
    print(f"[{level}] {message}")


def periodic_alert(interval_min=10, interval_max=60, stop_after=0):
    start = time.time()
    count = 0
    try:
        while True:
            trigger_alert()
            count += 1
            if stop_after > 0 and count >= stop_after:
                break
            interval = random.randint(interval_min, interval_max)
            time.sleep(interval)
    except KeyboardInterrupt:
        print("\n[INFO] 通知の自動発動を中断しました。")


def main():
    parser = argparse.ArgumentParser(description="ランダムな偽パスワードポリシー通知を表示します。実際の設定には影響しません。")
    subparsers = parser.add_subparsers(dest='command')

    parser_alert = subparsers.add_parser('alert', help='偽パスワードポリシー通知を1回表示')
    parser_periodic = subparsers.add_parser('periodic', help='定期的にランダム通知を表示')
    parser_periodic.add_argument('--min', type=int, default=10, help='最小間隔(秒)')
    parser_periodic.add_argument('--max', type=int, default=60, help='最大間隔(秒)')
    parser_periodic.add_argument('--count', type=int, default=0, help='通知回数(0で無限)')
    parser_list = subparsers.add_parser('list', help='過去の通知履歴を表示')
    parser_list.add_argument('--limit', type=int, default=10, help='表示件数')
    parser_summary = subparsers.add_parser('summary', help='通知履歴のサマリー表示')

    args = parser.parse_args()

    if args.command == 'alert' or args.command is None:
        trigger_alert()
    elif args.command == 'periodic':
        periodic_alert(args.min, args.max, args.count)
    elif args.command == 'list':
        list_history(args.limit)
    elif args.command == 'summary':
        summary_history()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、現場の緊張感を和らげるために、実際には存在しない理不尽なパスワードポリシー通知をランダムに表示するジョーク系ツールです。OSの設定やパスワード管理には一切影響しません。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/3/library/subprocess.html
- Python random: https://docs.python.org/3/library/random.html
- Python argparse: https://docs.python.org/3/library/argparse.html

# 利用例
- チームのアイスブレイクや朝会のネタに
- セキュリティ研修の冒頭で緊張をほぐす小ネタとして
- CLIやデスクトップ通知の演出テスト用

# 注意点
- 実際のパスワードやセキュリティ設定には一切影響を与えません
- 通知内容は完全なジョークであり、業務には利用できません
- 通知履歴はユーザーホーム配下にのみ保存されます

# 設計方針
- クロスプラットフォームで動作する通知APIを選定
- 通知内容は日本語でバリエーション豊富に用意
- CLIサブコマンドで履歴管理やサマリー出力も可能に

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/os-random-fake-password-policy-alert .claude/skills/os-random-fake-password-policy-alert

.claude/skills/os-random-fake-password-policy-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .claude/skills/os-random-fake-password-policy-alert
# SKILL.md, scripts/, references/, README.md があればOK

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

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

5. 動作確認

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

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

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

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

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