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 のリズムを崩しにくくなる
- 職場やチーム作業で“ネタ通知”を共有し、場の雰囲気を和ませられる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
