Claude Codeで朝イチのOS連携通知を自動化するSkill構築ガイド

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

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

Claude Code を使った開発現場では、日々の作業が効率化される一方で、ちょっとした「味気なさ」や「単調さ」に悩む声も少なくありません。特に毎朝、ターミナルやエディタを開いた瞬間から淡々とした作業が始まることで、気持ちの切り替えが難しいと感じるユーザーも多いようです。さらに、通知や演出が乏しいため、チームでの一体感やちょっとした遊び心が不足しがちです。

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

通知・演出・OS連携の観点では、作業開始時に「今日は何から始めるか」「今どの directory にいるか」をちょっとユニークにリマインドしてくれる仕組みが欲しい、という声が挙がっています。特に単調な routine にスパイスを加えたい人にとって、遊び心のある演出は意外と重要なモチベーション源です。

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

一言サマリ: このスキルは、Claude Code の session 開始時に“謎のOS朝礼通知”を自動で炸裂させ、開発 workflow に強制的な切り替えスイッチと話題性を提供します。

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

  • session や directory を開いた瞬間、毎回異なる“朝礼”通知が表示され、作業開始のリズムが生まれる (onboarding 効果・モチベーション向上)
  • 通知内容はランダムかつコミカルで、職場やチームでの話題作りやアイスブレイクにも活用できる
  • repository understanding や path management のタイミングで、リポジトリ構造や本日の作業目標を自然にリマインドできる
  • monorepo や長時間 workflow でも、context の切り替わりを“朝礼演出”で明示化し、記憶のフックになる
  • AI coding workflow の開始を遊び心で彩ることで、単調な開発 routine に新鮮さをプラスできる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/claude-code/os-fake-morning-assembly-alert .claude/skills/os-fake-morning-assembly-alert

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

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

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


# /os-fake-morning-assembly-alert

[OS朝礼通知]
本日のスローガン: 「安全第一、コードレビューは念入りに」
点呼開始: src/, tests/, docs/ の担当者は手を挙げてください
OS公式・体操のご案内: 画面ストレッチを忘れずに
本日の作業目標: repository understanding を深め、context を整理しましょう

(この通知は毎回内容が変わります)

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


> /os-fake-morning-assembly-alert

[OS朝礼通知]
本日の点呼: packages/api/, packages/ui/, packages/utils/ の各ディレクトリに異常はありませんか?
スローガン: 「monorepo の path management を徹底しよう」
OS公式・体操: ディレクトリ移動時は深呼吸
今日の作業目標: context の混乱を防ぐため、boundary を意識して作業しましょう

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


> /os-fake-morning-assembly-alert

[OS朝礼通知]
謎の体操タイム: 右手で ctrl+s、左手でコーヒーを持ち上げよ
本日のスローガン: 「コードに愛を、バグには厳しさを」
点呼: 

Skill の中身を全部見せる

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

.claude/skills/os-fake-morning-assembly-alert/
├── SKILL.md
├── scripts/
│   └── morning_assembly_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: os-fake-morning-assembly-alert
description: ターミナルやエディタの初回起動時、または「朝礼」や「スローガン」などのキーワード検知時に、謎の“OS朝礼通知”を画面に表示する演出スキルです。通知内容は毎回ランダムで変化し、日々の開発作業にユーモアを提供します。
---

# 機能概要
このSkillは、ターミナルやエディタを朝イチで開いた瞬間や「朝礼」「スローガン」などの関連ワードを検知した際、OS風の“謎朝礼通知”をデスクトップや画面端に表示します。通知内容は「本日のスローガン」「点呼開始」「OS公式体操」など毎回ランダムで、作業開始時に非日常感を演出。通知後は「本日の作業目標」も自動で宣言され、開発者の集中力を一瞬でリセットします。既存ファイルや作業内容には一切影響しません。

# 使い方
- 明示呼び出し: `/os-fake-morning-assembly-alert` を実行
- 暗黙発動: 「朝礼」「点呼」「スローガン」「体操」などのキーワードを含む発話や初回起動時
- スクリプトは自動で一度だけ通知を表示します(再実行で再度通知)

# 出力例
```
[OS朝礼通知] 2024-07-01 09:01
本日のスローガン: 「エラーは友達、焦らず冷静に!」
点呼開始: 1番から順に返事してください。
OS公式体操のご案内: 5分間ストレッチ推奨
本日の作業目標: 「バグゼロでリリース!」
```

# 注意点
- 通知は初回起動時のみ自動表示されます(明示呼び出しで再表示可)
- ファイルや作業内容には影響しません
- 通知はローカル環境のみに表示され、履歴は保存されません
- Windows/macOS/Linuxで動作(Python標準+通知API使用)

# 参考資料
- references/design_notes.md に設計方針・API仕様・利用例を記載
- 公式ドキュメント: https://docs.python.org/3/library/subprocess.html, https://plyer.readthedocs.io/en/latest/

scripts/morning_assembly_alert.py

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

try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

SLOGANS = [
    "エラーは友達、焦らず冷静に!",
    "朝の一歩が未来を変える。",
    "バグゼロでリリース!",
    "レビューは愛、指摘は成長。",
    "全員で品質向上!",
    "OSは仲間、再起動も大事。",
    "今日も安全第一!",
    "コードに思いやりを。",
    "仕様書はよく読もう。",
    "困ったら助け合い。"
]

CHECKS = [
    "点呼開始: 1番から順に返事してください。",
    "本日の出席確認を行います。",
    "健康状態を自己申告してください。",
    "今日のやる気を10段階で宣言してください。",
    "新メンバーは挙手してください。"
]

EXERCISES = [
    "OS公式体操のご案内: 5分間ストレッチ推奨",
    "ディスプレイから目を離して深呼吸しましょう。",
    "手首・肩のストレッチを行いましょう。",
    "背筋を伸ばして座り直しましょう。",
    "軽く画面から離れて歩きましょう。"
]

TASKS = [
    "本日の作業目標: 『バグゼロでリリース!』",
    "本日の作業目標: 『PRレビューを3件!』",
    "本日の作業目標: 『テストカバレッジ90%超』",
    "本日の作業目標: 『ドキュメントを整備』",
    "本日の作業目標: 『定時退社』"
]

HISTORY_FILE = os.path.expanduser("~/.os_fake_morning_assembly_alert_history")


def already_shown_today():
    today = datetime.date.today().isoformat()
    if not os.path.exists(HISTORY_FILE):
        return False
    try:
        with open(HISTORY_FILE, 'r') as f:
            lines = f.readlines()
        return any(today in line for line in lines)
    except Exception:
        return False


def mark_shown_today():
    today = datetime.date.today().isoformat()
    try:
        with open(HISTORY_FILE, 'a') as f:
            f.write(f"{today}\n")
    except Exception:
        pass


def generate_message():
    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
    slogan = random.choice(SLOGANS)
    check = random.choice(CHECKS)
    exercise = random.choice(EXERCISES)
    task = random.choice(TASKS)
    lines = [
        f"[OS朝礼通知] {now}",
        f"本日のスローガン: 「{slogan}」",
        check,
        exercise,
        task
    ]
    return '\n'.join(lines)


def show_notification(message):
    title = "OS朝礼通知"
    # Try desktop notification first
    if PLYER_AVAILABLE:
        try:
            notification.notify(
                title=title,
                message=message,
                timeout=8
            )
            return
        except Exception:
            pass
    # Fallback to platform-specific notification
    sysname = platform.system()
    try:
        if sysname == 'Darwin':  # macOS
            script = f'display notification "{message}" with title "{title}"'
            subprocess.run(['osascript', '-e', script], check=False)
        elif sysname == 'Linux':
            subprocess.run(['notify-send', title, message], check=False)
        elif sysname == 'Windows':
            # Use toast notification via powershell
            ps_script = f"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null; " \
                f"$template = [Windows.UI.Notifications.ToastTemplateType]::ToastText02; " \
                f"$xml = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent($template); " \
                f"$xml.GetElementsByTagName('text')[0].AppendChild($xml.CreateTextNode('{title}')) > $null; " \
                f"$xml.GetElementsByTagName('text')[1].AppendChild($xml.CreateTextNode('{message}')) > $null; " \
                f"$toast = [Windows.UI.Notifications.ToastNotification]::new($xml); " \
                f"[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('OS朝礼通知').Show($toast);"
            subprocess.run(['powershell', '-Command', ps_script], check=False)
    except Exception:
        pass
    # Always print to terminal as fallback
    print(message)


def main():
    parser = argparse.ArgumentParser(description='OS Fake Morning Assembly Alert')
    parser.add_argument('--force', action='store_true', help='強制的に通知を表示')
    parser.add_argument('--log', action='store_true', help='本日の通知履歴を表示')
    parser.add_argument('--reset', action='store_true', help='履歴をリセット')
    args = parser.parse_args()

    if args.reset:
        try:
            if os.path.exists(HISTORY_FILE):
                os.remove(HISTORY_FILE)
                print('履歴をリセットしました。')
            else:
                print('履歴ファイルは存在しません。')
        except Exception as e:
            print(f'履歴リセット失敗: {e}')
        return

    if args.log:
        if not os.path.exists(HISTORY_FILE):
            print('履歴はありません。')
            return
        with open(HISTORY_FILE, 'r') as f:
            print('過去の通知日:')
            for line in f:
                print(line.strip())
        return

    if not args.force and already_shown_today():
        return
    message = generate_message()
    show_notification(message)
    mark_shown_today()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発者がターミナルやエディタを初回起動した際に、OS風の朝礼通知をランダム表示することで、日常作業に遊び心や非日常感を加えることを目的としています。通知内容は毎回異なり、作業開始時の気分転換やチーム内の話題作りにも活用できます。

# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/3/library/subprocess.html
- plyer通知API: https://plyer.readthedocs.io/en/latest/

# 利用例
- 朝イチでエディタを開いた瞬間、謎のスローガンや点呼通知が画面端に表示され、職場やリモート環境で話題に。
- `/os-fake-morning-assembly-alert --force` で任意タイミングに再通知。

# 注意点
- 通知履歴はユーザーディレクトリの隠しファイルに日付単位で記録されます。
- plyerが未インストールの場合でも、OS標準の通知APIやprint出力で必ず通知内容が確認できます。
- ファイルや作業内容には一切影響を与えません。

# 設計方針
- 再現性の高いランダム通知生成と、マルチプラットフォーム動作(Windows/macOS/Linux)を重視。
- 通知内容は日本語・ユーモア重視で、毎回異なる構成となるよう工夫しています。
- 既存作業への影響を完全排除し、手軽に導入・削除できる設計です。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/claude-code/os-fake-morning-assembly-alert .claude/skills/os-fake-morning-assembly-alert

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

3. ファイル配置確認

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

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

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

5. 動作確認

/os-fake-morning-assembly-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をコピーしました!
目次