Codexで作業中の集中力を自動監視する通知スキル活用ガイド

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

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

AI coding workflow を日常的に回していると、集中が切れて思わず手が止まる瞬間が誰にでもあります。特に長時間の作業や monorepo を扱う大規模プロジェクトでは、Codex の context 管理や repository understanding の精度を保つために、適度な集中力が欠かせません。しかし、現実には次のような「あるある」な困りごとが発生しがちです。

  • コマンドや編集作業の合間に、つい気が緩んで無操作状態が続く
  • 長時間作業で context が膨らみすぎ、重要なメモリ情報が薄まる (long context 問題)
  • session を再開した時、前回の repository や directory 情報を思い出すのに手間取る
  • monorepo で package を跨ぐたびに、Codex が repository 構造を忘れがち
  • 作業に集中できず、気まずい沈黙や職場の空気が微妙になる瞬間がある

特に「通知・演出・OS連携」系の仕掛けがないと、こうした“だらけ”や context のズレに気付きにくく、結果として repository understanding や path management の精度が下がってしまいます。

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

一言サマリ: このスキルは、無操作時に“OSお昼寝検出アラート”を炸裂させて、集中力の低下や workflow の停滞をユーモラスに可視化します。

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

  • コマンド入力や編集が30秒以上止まると、ランダムなツッコミ系通知が発動し、気まずい空気を一掃できる
  • 作業中の repository や directory の context が途切れたタイミングを即座に自覚できる
  • onboarding や session 再開時も、集中力維持のきっかけを作れる
  • monorepo や複雑な path 管理時に workflow のリズムを崩しにくくなる
  • 職場やチーム作業で“ネタ通知”を共有し、場の雰囲気を和ませられる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-nap-detection-alert .agents/skills/random-os-nap-detection-alert

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

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

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


# /skills menu or random-os-nap-detection-alert mention
> プロジェクトのセットアップを始める

[OSお昼寝検出アラート]
検出:うたた寝モード突入 (30秒間無操作)
推奨:夢の中でバグ修正をお試しください
通知:睡眠ログをクラウドにアップロード中...
Tips: src/main.py の編集を再開すると通知は消えます

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


> packages/api/ のテストコード修正中に手が止まる

[OSお昼寝検出アラート]
警告:/packages/ui/ で操作が途絶えました
アドバイス:monorepo の package 跨ぎは慎重に
通知:context memory がスリープ状態です
再開するには何かコマンドを入力してください

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


> しばらく放置して職場で笑いを取りたい

[OSお昼寝検出アラート]
通知:OS推奨「夢の中でリファクタリング」
メモ:/src/components/Button.js が寂しがっています
アラート:睡眠ログをSlackに投稿...(嘘です)

before / after の違い

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

発動方式

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

Skill の中身を全部見せる

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

.agents/skills/random-os-nap-detection-alert/
├── SKILL.md
├── scripts/
│   └── random_os_nap_detection_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_nap_detection_alert.py random-os-nap-detection-alert: 30秒以上無操作でお昼寝アラートを通知
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-nap-detection-alert
description: ユーザーが30秒以上無操作状態になった場合に、ランダムな“お昼寝検出”メッセージをデスクトップ通知やターミナルに表示するSkillです。『うたた寝モード突入』などのツッコミ系通知で集中力低下やサボりを検出し、職場や作業現場で気まずい笑いを誘発します。コマンド入力やエディタ操作の監視がトリガー条件です。
---

# 機能概要
このSkillは、コマンドラインやエディタで作業中に30秒以上無操作状態が続くと、OSのデスクトップ通知やターミナルに「お昼寝検出」系のランダムなアラートを表示します。通知内容は毎回異なり、「検出:うたた寝モード突入」「OS推奨:夢の中でバグ修正」など、絶妙なツッコミで作業中のサボりや集中力低下をネタ化。職場での緊張感緩和や、気まずい空気を演出したい場合に最適です。

# 使い方
- 明示呼び出し例:
  - `/skills menu` から `random-os-nap-detection-alert` を選択
  - ターミナルで `python random_os_nap_detection_alert.py --start` を実行
- 暗黙発動キーワード例:
  - 「無操作」「サボり」「idle」「うたた寝」「集中力低下」などが含まれる文脈や、一定時間キーボード・マウス操作がない場合に自動発動します。

# 出力例
```
[OSお昼寝検出アラート] 検出:うたた寝モード突入
[OSお昼寝検出アラート] OS推奨:夢の中でバグ修正
[OSお昼寝検出アラート] 睡眠ログをクラウドにアップロード中...
[OSお昼寝検出アラート] 30秒以上操作がありません。お昼寝タイム?
[OSお昼寝検出アラート] 注意:作業効率が夢の中に突入しました
```

# 注意点
- 本Skillはユーザーのローカル環境でのみ動作し、ファイルや設定を破壊しません。
- 通知機能はLinux/macOSの`notify-send`や`osascript`を利用。Windowsでは`win10toast`等が必要です。
- 無操作検出は標準入力監視やイベントフックで実装していますが、全アプリケーションの操作を網羅するものではありません。
- 通知内容はローカルに保存されません。

# 参考資料
- [参考: references/design_notes.md](references/design_notes.md)
- [notify-send (Linux)](https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html)
- [osascript (macOS)](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [win10toast (Windows)](https://pypi.org/project/win10toast/)

scripts/random_os_nap_detection_alert.py

import sys
import time
import threading
import random
import argparse
import platform
import subprocess

# 通知メッセージ候補
NAP_MESSAGES = [
    '検出:うたた寝モード突入',
    'OS推奨:夢の中でバグ修正',
    '睡眠ログをクラウドにアップロード中...',
    '30秒以上操作がありません。お昼寝タイム?',
    '注意:作業効率が夢の中に突入しました',
    '警告:OSがユーザーの眠気を検出しました',
    '推奨:仮想現実で作業を続行してください',
    'お昼寝検出:現実世界にログインしてください',
    '夢の中でコードレビュー中...',
    'OSメモ:サボり癖が発動しました'
]

IDLE_THRESHOLD = 30  # 秒

class IdleDetector:
    def __init__(self, idle_seconds=IDLE_THRESHOLD):
        self.idle_seconds = idle_seconds
        self.last_activity = time.time()
        self.lock = threading.Lock()
        self.stop_flag = False
        self.os_type = platform.system()
        self.notifier = self._get_notifier()

    def _get_notifier(self):
        if self.os_type == 'Linux':
            return self._notify_linux
        elif self.os_type == 'Darwin':
            return self._notify_macos
        elif self.os_type == 'Windows':
            try:
                import win10toast
                self._win_toaster = win10toast.ToastNotifier()
                return self._notify_windows
            except ImportError:
                return self._notify_terminal
        else:
            return self._notify_terminal

    def _notify_linux(self, message):
        try:
            subprocess.run(['notify-send', 'OSお昼寝検出アラート', message], check=True)
        except Exception:
            self._notify_terminal(message)

    def _notify_macos(self, message):
        script = f'display notification "{message}" with title "OSお昼寝検出アラート"'
        try:
            subprocess.run(['osascript', '-e', script], check=True)
        except Exception:
            self._notify_terminal(message)

    def _notify_windows(self, message):
        try:
            self._win_toaster.show_toast('OSお昼寝検出アラート', message, duration=5)
        except Exception:
            self._notify_terminal(message)

    def _notify_terminal(self, message):
        print(f'[OSお昼寝検出アラート] {message}')

    def reset_timer(self):
        with self.lock:
            self.last_activity = time.time()

    def monitor_idle(self):
        while not self.stop_flag:
            with self.lock:
                idle_time = time.time() - self.last_activity
            if idle_time >= self.idle_seconds:
                msg = random.choice(NAP_MESSAGES)
                self.notifier(msg)
                # 通知後は次の操作まで再通知しない
                self.reset_timer()
            time.sleep(1)

    def stop(self):
        self.stop_flag = True

    def run_interactive(self):
        print('OSお昼寝検出アラートを起動しました。何かキーを押すとタイマーがリセットされます。Ctrl+Cで終了。')
        idle_thread = threading.Thread(target=self.monitor_idle, daemon=True)
        idle_thread.start()
        try:
            while True:
                _ = sys.stdin.read(1)
                self.reset_timer()
        except KeyboardInterrupt:
            print('\n終了します。')
            self.stop()
            idle_thread.join()

    def run_watch(self):
        print('標準入力監視モード。何らかの入力があればタイマーをリセットします。Ctrl+Cで終了。')
        idle_thread = threading.Thread(target=self.monitor_idle, daemon=True)
        idle_thread.start()
        try:
            while True:
                line = sys.stdin.readline()
                if not line:
                    break
                self.reset_timer()
        except KeyboardInterrupt:
            print('\n終了します。')
            self.stop()
            idle_thread.join()

    def run_demo(self):
        print('デモモード:10秒ごとにランダム通知を表示します。Ctrl+Cで終了。')
        try:
            while True:
                msg = random.choice(NAP_MESSAGES)
                self.notifier(msg)
                time.sleep(10)
        except KeyboardInterrupt:
            print('\n終了します。')


def main():
    parser = argparse.ArgumentParser(description='random-os-nap-detection-alert: 30秒以上無操作でお昼寝アラートを通知')
    subparsers = parser.add_subparsers(dest='command', help='サブコマンド')

    parser_start = subparsers.add_parser('start', help='インタラクティブ監視モード (キー入力でリセット)')
    parser_watch = subparsers.add_parser('watch', help='標準入力監視モード (行入力でリセット)')
    parser_demo = subparsers.add_parser('demo', help='デモモード (10秒ごとにランダム通知)')

    parser.add_argument('--idle', type=int, default=IDLE_THRESHOLD, help='無操作検出までの秒数 (デフォルト: 30)')

    args = parser.parse_args()
    detector = IdleDetector(idle_seconds=args.idle)

    if args.command == 'start':
        detector.run_interactive()
    elif args.command == 'watch':
        detector.run_watch()
    elif args.command == 'demo':
        detector.run_demo()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、ユーザーの無操作(idle)状態を検出し、30秒以上操作がない場合にOSの通知機能やターミナル出力で“お昼寝検出”メッセージを表示します。主に職場や作業現場でのネタ用途を想定しています。

# 公式ドキュメント抜粋
- Linux: `notify-send` コマンド (freedesktop.org notification spec)
- macOS: `osascript` 経由でネイティブ通知
- Windows: `win10toast` ライブラリ

# 利用例
- ターミナルで `python random_os_nap_detection_alert.py start` を実行し、作業中に30秒以上キー入力がなければ通知が出ます。
- `watch` モードはパイプや標準入力監視用途に便利です。
- `demo` モードは通知内容のランダム性を確認したい場合に使います。

# 注意点
- 全てのアプリケーション操作を監視するものではありません。ターミナルや標準入力の監視が中心です。
- 通知内容や履歴はローカルに保存されません。
- Windowsの場合、`pip install win10toast` が必要です。

# 設計方針
- OSごとに最適な通知手段を自動選択します。
- データ損失や環境破壊を一切起こさない安全設計です。
- メッセージは毎回ランダムで、ユーザーの気まずさ・笑いを誘発することを重視しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-nap-detection-alert .agents/skills/random-os-nap-detection-alert

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

3. ファイル配置確認

ls .agents/skills/random-os-nap-detection-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 との連携設計はどうあるべきか?
  • 30秒程度の無操作で正しく通知されるか?
  • 通知内容がランダムで毎回変わるか?
  • データ損失や環境破壊が一切発生しないか?

実際に Codex で試した検証ログは Codexで遊べる!OSお昼寝検出アラートを触ってみた にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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