Codex ユーザーが日常でぶつかる悩み
日々の開発現場でCodexを活用していると、集中が高まる一方で、思わぬタイミングで気が抜ける瞬間も欲しくなるものです。特に「通知・演出・OS連携」に関する機能が乏しいと、作業が単調になりがちで、リフレッシュのきっかけがつかみにくいと感じる方も多いでしょう。
また、CodexのAI coding workflowに没頭していると、contextやrepository understandingに関する悩みも絶えません。例えば:
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
こうした悩みの合間に、ちょっとした「脱力系」の演出が欲しい――そんなニーズに応えるのが、本Skillの狙いです。
この Skill が一言でいうと何を解決するか
一言サマリ: 作業中に突然“OSのパワーセーバー警告”をデスクトップ通知で炸裂させるスキルですSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 長時間のAI coding workflow中に、唐突な省エネ通知が入ることで作業に小休止や笑いをもたらし、集中しすぎによる疲労を和らげる
- Codexのcontextやrepo管理に追われる単調さを、ネタ系通知で一時リセットし、気分転換できる
- onboardingやペア作業時に、職場やチームの雰囲気を和らげる演出として活用できる
- 実害ゼロで、memoryやdirectory、path managementには一切干渉せず、安心して導入できる
- Skillの通知内容が毎回異なり、マンネリ化しない演出を楽しめる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-fake-power-saver-alert .agents/skills/random-os-fake-power-saver-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu
> random-os-fake-power-saver-alert
[Desktop Notification]
---
OS省エネモード発動: CPU温存のため10分間タイピングは禁止されています。
理由: 貴方の集中が高すぎるため、AIリソースも休憩します。
---
(この通知はジョークです。作業を続けても問題ありません)
シーン2: monorepo / package 跨ぎ作業時
> packages/core/ と packages/ui/ を同時編集
[Desktop Notification]
---
電力節約警告: マウス移動が過多です。省エネのため思考も控えめにお願いします。
対象ディレクトリ: packages/core/, packages/ui/
---
(この通知は冗談です。気にせず作業を続けてください)
シーン3: お遊び的な使い方
> /skills menu から明示呼び出し
[Desktop Notification]
---
バッテリー残量: 仮想的に12%です。AIのためにも今すぐ深呼吸してください。
推奨アクション: 画面を1分間眺めるだけにしましょう。
---
(実際のバッテリーやPC動作には影響ありません)
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-fake-power-saver-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-fake-power-saver-alert/
├── SKILL.md
├── scripts/
│ └── random_os_fake_power_saver_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_fake_power_saver_alert.py |
ランダムなOS風パワーセーバー警告をデスクトップ通知で表示するスクリプト |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-power-saver-alert
description: 作業中やコーディング時、"省エネ"や"パワーセーバー"などのキーワードを含む文脈で、Codexがユーザーの集中を和らげるために本Skillを発動します。明示的な呼び出しやskillsメニュー経由でも利用可能です。
---
# 機能概要
本Skillは、PC作業中に突然“OSのパワーセーバー警告”を装ったデスクトップ通知をランダムに表示します。通知内容は「CPU温存のため10分間タイピング禁止」や「マウス移動過多:省エネモード発動」など、全く根拠も効力もない省エネ指示が毎回異なる内容で現れ、職場や自宅での作業に意図的な混乱や笑いを提供します。実害はなく、ちょっとした息抜きやネタ演出、会話のきっかけ作りに最適です。
# 使い方
- 明示呼び出し例:
- `/skills random-os-fake-power-saver-alert`
- `$random-os-fake-power-saver-alert`
- 暗黙発動キーワード例:
- 「省エネ」「パワーセーブ」「集中力」「眠い」「作業疲れ」などのワードが会話やコードコメントに現れた際に自動発動します。
# 出力例
```
[通知] OSパワーセーバー警告: CPU温存のため10分間キーボード操作を控えてください。
[通知] 電力節約モード: マウスの動きが多すぎます。しばらく静止してください。
[通知] 省エネ推奨: 画面を見つめすぎです。目を閉じて深呼吸しましょう。
[通知] パワーセーブ: 思考が過熱しています。アイデアの発散を10分間抑制してください。
[通知] バッテリー保護: 机の上のコーヒー消費量を減らしてください。
```
# 注意点
- 通知は実際のOSや電源管理には一切影響を与えません。
- ローカルに記録や履歴は保存されません。
- 長時間の連続通知や業務用端末での使用は推奨しません。
- 通知の内容はすべてフィクションです。
# 参考資料
- [Python公式: plyer.notification](https://plyer.readthedocs.io/en/latest/) を利用
- references/design_notes.md に設計方針・利用例を記載
scripts/random_os_fake_power_saver_alert.py
import random
import time
import argparse
import sys
from threading import Thread, Event
try:
from plyer import notification
except ImportError:
print("plyerモジュールが必要です。pip install plyer でインストールしてください。", file=sys.stderr)
sys.exit(1)
ALERT_MESSAGES = [
"CPU温存のため10分間キーボード操作を控えてください。",
"電力節約モード: マウスの動きが多すぎます。しばらく静止してください。",
"省エネ推奨: 画面を見つめすぎです。目を閉じて深呼吸しましょう。",
"パワーセーブ: 思考が過熱しています。アイデアの発散を10分間抑制してください。",
"バッテリー保護: 机の上のコーヒー消費量を減らしてください。",
"省エネ警告: 椅子の上での姿勢を維持しすぎです。1分間立ち上がってください。",
"OSパワーセーバー: ファイル保存回数が多すぎます。3分間保存を控えてください。",
"省エネ: 画面の明るさを脳内で10%下げてください。",
"電力節約: チームチャットの既読数が多すぎます。しばらく通知を無視してください。",
"パワーセーブ: マウスクリックが過剰です。両手を膝に置いて深呼吸しましょう。"
]
NOTIFY_TITLE = "OSパワーセーバー警告"
class AlertThread(Thread):
def __init__(self, interval_sec, stop_event):
super().__init__()
self.interval_sec = interval_sec
self.stop_event = stop_event
self.daemon = True
def run(self):
while not self.stop_event.is_set():
msg = random.choice(ALERT_MESSAGES)
try:
notification.notify(
title=NOTIFY_TITLE,
message=msg,
timeout=8
)
print(f"[通知] {NOTIFY_TITLE}: {msg}")
except Exception as e:
print(f"通知送信エラー: {e}", file=sys.stderr)
for _ in range(self.interval_sec):
if self.stop_event.is_set():
break
time.sleep(1)
def list_alerts():
print("--- 登録済みパワーセーバー警告メッセージ一覧 ---")
for i, msg in enumerate(ALERT_MESSAGES, 1):
print(f"{i}. {msg}")
def add_alert(msg):
global ALERT_MESSAGES
if msg.strip() and msg not in ALERT_MESSAGES:
ALERT_MESSAGES.append(msg)
print(f"追加しました: {msg}")
else:
print("既に登録済み、または空文字です。")
def remove_alert(idx):
global ALERT_MESSAGES
try:
idx = int(idx) - 1
if 0 <= idx < len(ALERT_MESSAGES):
removed = ALERT_MESSAGES.pop(idx)
print(f"削除しました: {removed}")
else:
print("インデックスが範囲外です。")
except Exception as e:
print(f"削除失敗: {e}")
def main():
parser = argparse.ArgumentParser(description="ランダムなOS風パワーセーバー警告をデスクトップ通知で表示するスクリプト")
subparsers = parser.add_subparsers(dest="command", required=False)
run_parser = subparsers.add_parser("run", help="一定間隔でランダム警告を通知 (デフォルト)")
run_parser.add_argument("-i", "--interval", type=int, default=600, help="通知間隔(秒)。デフォルト600秒")
run_parser.add_argument("-c", "--count", type=int, default=0, help="通知回数。0で無限ループ")
list_parser = subparsers.add_parser("list", help="登録済み警告メッセージ一覧表示")
add_parser = subparsers.add_parser("add", help="警告メッセージを追加")
add_parser.add_argument("message", type=str, help="追加する警告メッセージ")
remove_parser = subparsers.add_parser("remove", help="警告メッセージを削除")
remove_parser.add_argument("index", type=int, help="削除するメッセージ番号 (1始まり)")
args = parser.parse_args()
if args.command == "list":
list_alerts()
return
elif args.command == "add":
add_alert(args.message)
return
elif args.command == "remove":
remove_alert(args.index)
return
else:
interval = getattr(args, 'interval', 600)
count = getattr(args, 'count', 0)
stop_event = Event()
alert_thread = AlertThread(interval, stop_event)
alert_thread.start()
try:
n = 0
while True:
if count and n >= count:
stop_event.set()
break
time.sleep(1)
if not alert_thread.is_alive():
break
n += 1
except KeyboardInterrupt:
print("\n終了します。")
stop_event.set()
alert_thread.join()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
本Skillは、ユーザーの作業中に意図的な“省エネ警告”をデスクトップ通知で表示し、ちょっとした息抜きやネタ演出を提供します。実際のOSや電力管理には一切影響を与えません。
# 公式ドキュメント抜粋
通知機能には [plyer.notification](https://plyer.readthedocs.io/en/latest/) を利用しています。plyerはクロスプラットフォームで、Windows/Mac/Linuxの主要デスクトップ環境で通知が可能です。
# 利用例
- `/skills random-os-fake-power-saver-alert run -i 300` で5分ごとに通知
- `/skills random-os-fake-power-saver-alert add "省エネ: 今日は早めに帰宅しましょう。"` で新メッセージ追加
- `/skills random-os-fake-power-saver-alert list` で登録済みメッセージ確認
# 注意点
通知は一時的なもので、履歴やログは保存されません。大量通知や業務用端末での使用は控えてください。plyerの仕様上、Linuxではlibnotify等の追加パッケージが必要な場合があります。
# 設計方針
メッセージ内容は都度ランダム選択し、ユーザーが自由に追加・削除可能です。CLIサブコマンド設計で柔軟な運用を実現しています。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-fake-power-saver-alert .agents/skills/random-os-fake-power-saver-alert
.agents/skills/random-os-fake-power-saver-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-fake-power-saver-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 との連携設計はどうあるべきか?
- ランダムな省エネ警告が一定間隔で正しく通知されるか
- 通知内容が毎回異なり、十分にふざけているか
- ユーザー操作やPCの状態には実害がないこと
実際に Codex で試した検証ログは Codexで遊ぶ!謎のOSパワーセーバー警告を炸裂させてみた にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
