Codexで作業中の集中力を乱す謎警告通知演出活用ガイド

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

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

AIコーディングワークフローを最大限に活用したいのに、現場では思わぬストレスや「集中の落とし穴」に直面することが多いです。特にCodexを使っていると、真面目に作業を進めている最中に、ふとしたタイミングで気が抜けるような“何か”が欲しくなる瞬間があります。そんな時、作業空間が単調になりすぎて息抜きのきっかけが掴めない、という悩みも少なくありません。以下のような「あるある」に心当たりはないでしょうか。

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

特に「通知・演出・OS連携」系のSkillがないと、集中しすぎて逆にパフォーマンスが落ちたり、作業空間が単調になりがちな点も見逃せません。

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

一言サマリ: このスキルは、Codexの作業空間に突然ランダムな「OSカフェイン過剰摂取」フェイク警告を炸裂させ、集中しすぎた空気を一瞬でカオスに変える演出Skill。

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

  • 長時間のAI coding workflowでも、突如現れるフェイク通知で気分転換やリフレッシュのきっかけが生まれる
  • monorepoや巨大repoでの作業時、単調なcontextやdirectory管理に“遊び心”をプラスできる
  • Codexのrepository understandingやpath managementに疲弊した時でも、突然の通知で一息つける
  • onboardingやsession再開時に、場の空気を和ませてチーム全体のコミュニケーションが活性化する
  • どのOS・ターミナル環境でも害のない演出なので、安心して導入できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-fake-caffeine-overdose-alert .agents/skills/random-os-fake-caffeine-overdose-alert

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

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

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


# /skills menu or random-os-fake-caffeine-overdose-alert mention
> プロジェクト開始、main.py のリファクタリングを始める

[OS警告] 重大: あなたのカフェイン血中濃度が “徹夜エンジニア” レベルに到達しました。
[OS通知] 推奨アクション: 今すぐ水分を摂取してください。
[OS通知] ユーザー: codex_user
[OS通知] 対象プロセス: python main.py
[OS通知] 時刻: 14:13:27

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


> packages/api/ から packages/web/ に移動して作業を再開

[警告] コーヒーカップが自動でリフィルされました (package: web)
[OS通知] あなたの作業ディレクトリ: /repo/packages/web/
[OS通知] 連続作業時間: 2時間14分
[OS通知] カフェイン摂取量: 推定 480mg
[OS通知] 今すぐストレッチをおすすめします

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


> README.md を編集していたら突然…

[OSより] 重要: カフェイン摂取量が “ブラックホール” モードに突入しました。
[OS通知] システムは自動的にエスプレッソを注入しました。
[OS通知] 次の休憩まで 42分
[OS通知] 休憩推奨度: MAX

before / after の違い

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

発動方式

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

Skill の中身を全部見せる

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

.agents/skills/random-os-fake-caffeine-overdose-alert/
├── SKILL.md
├── scripts/
│   └── fake_caffeine_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-fake-caffeine-overdose-alert
description: Codexは、ユーザーが長時間作業や集中状態(例: '徹夜', '集中', 'コーディング', '眠気', 'カフェイン' などのキーワード出現時)にこのSkillを発動し、理不尽かつ完全フェイクなカフェイン過剰摂取警告をランダムに表示してください。
---

# 機能概要
このSkillは、作業に没頭しているユーザーのデスクトップやターミナルに、完全に架空の「OSカフェイン過剰摂取警告」を突然表示します。通知内容は毎回ランダムで、例えば「重大:あなたのカフェイン血中濃度が“徹夜エンジニア”レベルに到達」「警告:コーヒーカップが自動でリフィルされました」「OSより:今すぐ水分を摂取してください」など、全く根拠のないフェイク警告が炸裂します。真面目に集中している人ほど不意を突かれ、作業空間に一瞬のカオスと笑いを生みます。

# 使い方
明示的な呼び出しは `/skills menu` から「random-os-fake-caffeine-overdose-alert」を選択、または `$random-os-fake-caffeine-overdose-alert` と入力してください。暗黙的には「徹夜」「集中」「カフェイン」「眠気」「コーヒー」などのキーワードが会話や作業ログに現れた際、自動でランダムなタイミングで発動します。

# 出力例
```
[ALERT] OSより警告: あなたのカフェイン血中濃度が“徹夜エンジニア”レベルに到達しました。
[WARNING] コーヒーカップが自動でリフィルされました。OSはあなたの健康を心配しています。
[CRITICAL] 今すぐ水分を摂取してください。カフェイン摂取量が推奨上限を超えています。
[INFO] システム: あなたのマグカップが空になることはありません。
[NOTICE] OS診断: 睡眠推奨。カフェイン依存度: 99.9%
```

# 注意点
本Skillは完全なジョーク機能であり、実際の健康状態やシステム状態とは一切関係ありません。通知は一時的に表示され、ファイルやログへの保存は行いません。どのOSやターミナル環境でも害のない演出のみを行いますが、通知ポップアップは環境によって表示方法が異なる場合があります。

# 参考資料
詳細は references/design_notes.md を参照。公式API: https://docs.python.org/3/library/subprocess.html, https://pypi.org/project/plyer/ など。

scripts/fake_caffeine_alert.py

import sys
import os
import random
import time
import argparse
import platform
from datetime import datetime
try:
    from plyer import notification
    PLYER_AVAILABLE = True
except ImportError:
    PLYER_AVAILABLE = False

FAKE_ALERTS = [
    "重大:あなたのカフェイン血中濃度が“徹夜エンジニア”レベルに到達しました。",
    "警告:コーヒーカップが自動でリフィルされました。OSはあなたの健康を心配しています。",
    "今すぐ水分を摂取してください。カフェイン摂取量が推奨上限を超えています。",
    "システム: あなたのマグカップが空になることはありません。",
    "OS診断: 睡眠推奨。カフェイン依存度: 99.9%",
    "警告: 眠気防止モードが自動有効化されました。",
    "ALERT: カフェイン分布が異常です。コーヒー摂取量: MAX",
    "INFO: あなたの作業効率がカフェインに依存しています。",
    "NOTICE: コーヒーブレイクが必要です。",
    "CRITICAL: カフェイン摂取ログが溢れました。"
]

TERMINAL_PREFIXES = [
    "[ALERT] OSより警告:",
    "[WARNING]",
    "[CRITICAL]",
    "[INFO] システム:",
    "[NOTICE] OS診断:"
]

LOG_FILE = os.path.expanduser("~/.fake_caffeine_alert.log")


def select_random_alert():
    idx = random.randint(0, len(FAKE_ALERTS)-1)
    prefix = TERMINAL_PREFIXES[idx % len(TERMINAL_PREFIXES)]
    return f"{prefix} {FAKE_ALERTS[idx]}"


def show_terminal_alert(msg):
    print(msg)


def show_desktop_notification(msg):
    if not PLYER_AVAILABLE:
        return False
    try:
        notification.notify(
            title="OSカフェイン過剰摂取警告",
            message=msg,
            app_name="FakeCaffeineAlert",
            timeout=7
        )
        return True
    except Exception:
        return False


def log_alert(msg):
    try:
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(f"{datetime.now().isoformat()} {msg}\n")
    except Exception:
        pass


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


def summary_logs():
    if not os.path.exists(LOG_FILE):
        print("ログファイルがありません。")
        return
    count = 0
    with open(LOG_FILE, "r", encoding="utf-8") as f:
        for _ in f:
            count += 1
    print(f"合計フェイク警告数: {count}")


def main():
    parser = argparse.ArgumentParser(description="Fake OS Caffeine Overdose Alert Skill")
    subparsers = parser.add_subparsers(dest="command")

    parser_alert = subparsers.add_parser("alert", help="ランダムなカフェイン過剰摂取警告を即時表示")
    parser_alert.add_argument("--desktop", action="store_true", help="デスクトップ通知も表示")
    parser_alert.add_argument("--terminal", action="store_true", help="ターミナルにも出力")
    parser_alert.add_argument("--log", action="store_true", help="警告をログに保存")

    parser_daemon = subparsers.add_parser("daemon", help="一定時間ごとに理不尽に警告を表示")
    parser_daemon.add_argument("--min", type=int, default=5, help="最小間隔(分)")
    parser_daemon.add_argument("--max", type=int, default=25, help="最大間隔(分)")
    parser_daemon.add_argument("--desktop", action="store_true", help="デスクトップ通知も表示")
    parser_daemon.add_argument("--terminal", action="store_true", help="ターミナルにも出力")
    parser_daemon.add_argument("--log", action="store_true", help="警告をログに保存")

    parser_list = subparsers.add_parser("list", help="過去の警告ログを表示")
    parser_summary = subparsers.add_parser("summary", help="警告発生回数を集計")

    args = parser.parse_args()

    if args.command == "alert":
        msg = select_random_alert()
        shown = False
        if args.desktop:
            shown = show_desktop_notification(msg)
        if args.terminal or not shown:
            show_terminal_alert(msg)
        if args.log:
            log_alert(msg)
    elif args.command == "daemon":
        min_interval = max(1, args.min)
        max_interval = max(min_interval, args.max)
        print(f"[FakeCaffeineAlert] Daemon開始: {min_interval}-{max_interval}分間隔で警告を表示します。Ctrl+Cで停止。")
        try:
            while True:
                interval = random.randint(min_interval, max_interval) * 60
                time.sleep(interval)
                msg = select_random_alert()
                shown = False
                if args.desktop:
                    shown = show_desktop_notification(msg)
                if args.terminal or not shown:
                    show_terminal_alert(msg)
                if args.log:
                    log_alert(msg)
        except KeyboardInterrupt:
            print("\n[FakeCaffeineAlert] Daemonを停止しました。")
    elif args.command == "list":
        list_logs()
    elif args.command == "summary":
        summary_logs()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、ユーザーの作業中に完全なフェイク警告を理不尽なタイミングで表示し、作業空間にユーモアと意図的なカオスをもたらすために設計されています。通知内容は毎回ランダムで、実際の健康状態やシステム状態とは一切関係ありません。

# 公式ドキュメント抜粋
デスクトップ通知にはPythonの`plyer`ライブラリを利用しています(https://pypi.org/project/plyer/)。ターミナル出力は標準出力を使用し、OS依存の演出はありません。

# 利用例
- 長時間のコーディングや集中作業時に、突然フェイクな警告で場を和ませる。
- チームのリモートワーク中に、SlackやTeamsのbot連携でジョーク通知として利用。

# 注意点
本Skillはジョーク目的であり、通知内容の信憑性はゼロです。ログはユーザーのホームディレクトリにのみ保存され、他のシステム設定やファイルには一切影響を与えません。

# 設計方針
- OSやターミナル環境に依存しない安全な演出のみを採用
- 通知内容は完全に架空で、健康やシステムに害を与えない
- ログ出力/集計機能でユーザーの反応を振り返ることも可能

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-fake-caffeine-overdose-alert .agents/skills/random-os-fake-caffeine-overdose-alert

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

3. ファイル配置確認

ls .agents/skills/random-os-fake-caffeine-overdose-alert
# 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 との連携設計はどうあるべきか?
  • 完全にフェイクな通知内容であることは保証されているか?
  • 通知表示タイミングが理不尽なほど突然であることは担保されているか?
  • どのOS・ターミナル環境でも害のない演出であるか?

実際に Codex で試した検証ログは Codexで謎のOSカフェイン警告を突然表示してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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