Codexで作業中に遊び心を加える通知演出の活用ガイド

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

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

AI coding workflow において、Codex を使っていると「集中力が切れてきた」「リポジトリ全体の context を何度も説明するのが面倒」「単調な作業が続いてリズムが崩れる」といった悩みが頻出します。特に monorepo や大規模 repository での作業時は、ディレクトリ構造や path management の説明に気を取られがちで、気付くと長時間座りっぱなしになってしまうことも多いのではないでしょうか。

  • Codex が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

また、開発現場では集中が切れたタイミングで「ちょっと休憩しよう」と思っても、誰かが声をかけてくれるわけではありません。通知や演出による“強制的なリズムチェンジ”が欲しいと感じる瞬間も多いはずです。

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

一言サマリ: このスキルは、Codex の作業セッションに突如「謎のコーヒーブレイク演出」を挿入し、単調なAIコーディング workflowに強制的な休憩タイミングと笑いをもたらします。

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

  • 作業中やコマンド実行ごとに、完全に無意味なコーヒー抽出音やカップ音+デスクトップ通知が炸裂し、作業リズムが愉快に撹乱される
  • 毎回異なるカオスな通知メッセージで、長時間 session の stale context や集中切れを強制リセット
  • onboarding 時や repository understanding の合間に笑いを挟むことで、堅苦しい path management や directory 構造説明のストレスを和らげる
  • AIコーディングの workflow に遊び心を加え、チームでのコミュニケーションネタにも使える
  • Skill の明示呼び出し/暗黙発動で、好きなタイミングで“休憩演出”を挟める
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/os-fake-coffee-break-sound-effect .agents/skills/os-fake-coffee-break-sound-effect

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

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

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu で os-fake-coffee-break-sound-effect を選択

[通知] あなたの集中はカフェイン不足です
[サウンド] コーヒー抽出音.mp3 再生
---
repository: /Users/dev/my-monorepo
directory: packages/core/
context: session start, restoring memory...

(しばし無音... そして突然カップを置く音)
[通知] 今こそ一服の時。マシンも休みたい気分

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


> cd packages/utils
> ls

[通知] コーヒーブレイク推奨: 休憩は生産性の母
[サウンド] カップを置く音.mp3 再生
---
directory: packages/utils/
repository understanding: switching context...

(作業再開後にまた無意味なコーヒー音)
[通知] 眠気覚ましに一杯いかが?

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


> /skills menu

[通知] そろそろコーヒータイムです。AIも休憩が必要です
[サウンド] 謎のコーヒー抽出音.mp3 再生
---
context: long context detected, injecting break...

(突然の演出でチームの笑いを誘う)
[通知] カフェイン注入完了。作業再開!

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Codex が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる コーヒーブレイク演出で強制的に context をリフレッシュ

発動方式

明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.agents/skills/os-fake-coffee-break-sound-effect/
├── SKILL.md
├── scripts/
│   └── coffee_break_effect.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/coffee_break_effect.py OS風フェイクコーヒーブレイク演出スクリプト
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: os-fake-coffee-break-sound-effect
description: コマンド実行や作業中に、Codexがユーザーの集中状態や作業リズムを検知した際、または/skillsメニュー等で明示呼び出しされた際に発動。通知・サウンド演出による“強制コーヒーブレイク”を演出します。
---

# 機能概要
このSkillは、開発作業やコマンド実行の合間に、まるでOSが「コーヒーブレイクを強制したい」かのような、突発的なデスクトップ通知と“謎のコーヒー抽出音”などのサウンド演出を発動します。通知文言は完全ランダムで「あなたの集中はカフェイン不足です」「今こそ一服の時」などカオスな内容。開発現場に突然の休憩ムードをねじ込み、作業リズムを愉快に撹乱します。休憩のタイミングを自動で提案したい場合や、チームの雰囲気を和ませたい時に最適です。

# 使い方
- 明示呼び出し: `/skills menu` で「os-fake-coffee-break-sound-effect」を選択、または `$os-fake-coffee-break-sound-effect` を直接入力。
- 暗黙発動: 「コーヒー」「疲れ」「休憩」「集中」「カフェイン」などのキーワードを含む会話やコマンド実行時に自動発動。

# 出力例
```
[通知] 今こそ一服の時です。
[サウンド] ./sounds/coffee_pour.wav を再生中...

[通知] あなたの集中はカフェイン不足です。
[サウンド] ./sounds/cup_place.wav を再生中...

[通知] マシンも休みたい気分です。
[サウンド] ./sounds/coffee_steam.wav を再生中...
```

# 注意点
- サウンドファイルは `./sounds/` ディレクトリに配置してください。
- 通知表示は `notify-send` (Linux) または `osascript` (macOS) で実装。Windowsは `win10toast` 使用。
- 音声再生には `playsound` または `afplay`/`aplay` を利用。
- ローカル環境でのみ動作。リモートやサーバーでは通知・音声が再生されません。

# 参考資料
- [notify-send 公式](https://specifications.freedesktop.org/notification-spec/latest/)
- [playsound PyPI](https://pypi.org/project/playsound/)
- references/design_notes.md 参照

scripts/coffee_break_effect.py

import os
import sys
import random
import platform
import argparse
import subprocess
from pathlib import Path

NOTIFICATIONS = [
    "あなたの集中はカフェイン不足です。",
    "今こそ一服の時です。",
    "マシンも休みたい気分です。",
    "コーヒーブレイクを強制します。",
    "気分転換しませんか?",
    "一息つきましょう。",
    "カフェインチャージ推奨。",
    "脳がコーヒーを欲しています。",
    "謎のコーヒータイム発動。",
    "OSが休憩を要求しています。"
]

SOUND_FILES = [
    "coffee_pour.wav",
    "cup_place.wav",
    "coffee_steam.wav",
    "coffee_machine.wav"
]

SOUNDS_DIR = Path(__file__).parent / "sounds"


def pick_random_notification():
    return random.choice(NOTIFICATIONS)


def pick_random_sound():
    candidates = [SOUNDS_DIR / f for f in SOUND_FILES]
    existing = [str(f) for f in candidates if f.exists()]
    if not existing:
        return None
    return random.choice(existing)


def send_notification(message):
    system = platform.system()
    try:
        if system == "Linux":
            subprocess.run(["notify-send", message], check=True)
        elif system == "Darwin":
            script = f'display notification "{message}" with title "Coffee Break"'
            subprocess.run(["osascript", "-e", script], check=True)
        elif system == "Windows":
            try:
                from win10toast import ToastNotifier
                toaster = ToastNotifier()
                toaster.show_toast("Coffee Break", message, duration=5)
            except ImportError:
                print("[警告] win10toastが未インストールです。pip install win10toast を実行してください。")
        else:
            print(f"[通知] {message}")
    except Exception as e:
        print(f"[通知エラー] {e}")


def play_sound(sound_path):
    system = platform.system()
    try:
        if system == "Linux":
            subprocess.run(["aplay", sound_path], check=True)
        elif system == "Darwin":
            subprocess.run(["afplay", sound_path], check=True)
        elif system == "Windows":
            try:
                from playsound import playsound
                playsound(sound_path)
            except ImportError:
                print("[警告] playsoundが未インストールです。pip install playsound を実行してください。")
        else:
            print(f"[サウンド] {sound_path} を再生(疑似)")
    except Exception as e:
        print(f"[サウンドエラー] {e}")


def list_sounds():
    print("利用可能なサウンドファイル:")
    for f in SOUND_FILES:
        path = SOUNDS_DIR / f
        status = "OK" if path.exists() else "Not Found"
        print(f"- {f}: {status}")


def summary():
    print("os-fake-coffee-break-sound-effect Skill サマリー:")
    print(f"通知パターン数: {len(NOTIFICATIONS)}")
    print(f"サウンドファイル数: {len(SOUND_FILES)}")
    print(f"サウンドディレクトリ: {SOUNDS_DIR}")
    print(f"OS種別: {platform.system()}")


def main():
    parser = argparse.ArgumentParser(description="OS風フェイクコーヒーブレイク演出スクリプト")
    subparsers = parser.add_subparsers(dest="command")

    parser_run = subparsers.add_parser("run", help="コーヒーブレイク演出を発動")
    parser_run.add_argument("--message", type=str, help="通知文言を指定(省略時はランダム)")
    parser_run.add_argument("--sound", type=str, help="サウンドファイル名を指定(省略時はランダム)")

    parser_list = subparsers.add_parser("list", help="利用可能なサウンドファイル一覧を表示")
    parser_summary = subparsers.add_parser("summary", help="Skillサマリーを表示")

    args = parser.parse_args()

    if args.command == "run":
        message = args.message if args.message else pick_random_notification()
        sound_path = None
        if args.sound:
            candidate = SOUNDS_DIR / args.sound
            if candidate.exists():
                sound_path = str(candidate)
            else:
                print(f"[警告] 指定サウンドファイルが見つかりません: {candidate}")
        else:
            sound_path = pick_random_sound()
        print(f"[通知] {message}")
        send_notification(message)
        if sound_path:
            print(f"[サウンド] {sound_path} を再生中...")
            play_sound(sound_path)
        else:
            print("[サウンド] サウンドファイルが見つかりませんでした。")
    elif args.command == "list":
        list_sounds()
    elif args.command == "summary":
        summary()
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
本Skillは、開発現場や個人作業中に強制的な休憩ムードを演出するため、OSの通知APIとローカルサウンド再生機能を組み合わせて設計されています。

# 公式ドキュメント抜粋
- Linux: notify-send (freedesktop.org)
- macOS: osascript (AppleScript)
- Windows: win10toast, playsound (PyPI)

# 利用例
- 長時間作業の合間に自動発動し、ユーザーの集中をリセット。
- チーム開発のリラックス演出や、イベント時の“謎演出”として活用。

# 注意点
- サウンドファイルは各自で`sounds/`配下に配置が必要。
- サーバーやリモート環境では通知・音声がユーザーに届きません。
- 通知APIやサウンド再生コマンドはOS依存性が高いため、クロスプラットフォーム検証が重要です。

# 設計方針
- OS自動判定による最適な通知・再生手段を選択。
- 通知文言・サウンドともに完全ランダム性を担保。
- CLIサブコマンドで柔軟な操作性を提供。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/os-fake-coffee-break-sound-effect .agents/skills/os-fake-coffee-break-sound-effect

.agents/skills/os-fake-coffee-break-sound-effect の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/os-fake-coffee-break-sound-effect
# SKILL.md, scripts/, references/, README.md があればOK

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

新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or $skill-name mention と Skill 名で出てきます。

5. 動作確認

/skills menu or $skill-name mention で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Codex に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Codex に把握させ、こちらが 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 コードを拾ってしまう可能性
  • Codex 固有の引っかかり: description のセマンティックマッチ精度が要件次第
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

この Skill を実運用に投入する前に確かめたい問いを並べる:

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • AGENTS.md との連携設計はどうあるべきか?
  • サウンド再生と通知表示が同時にトリガーされるか?
  • 通知文言が完全ランダムで変化するか?音源ファイルのパス指定や再生方法がシンプルか?

実際に Codex で試した検証ログは Codexで謎のコーヒーブレイク音を鳴らしてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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