Codex ユーザーが日常でぶつかる悩み
AIコーディング環境で作業していると、集中が切れた瞬間や長時間のセッション中に、ふとした“刺激”や“遊び心”が欲しくなることがあります。特にCodexを使い込んでいるユーザーは、膨大なリポジトリや複雑なmonorepo構造を相手に、淡々としたワークフローが続きがちです。そんなとき、予期せぬ通知や演出が現れることで、場の空気が変わったり、チーム内でちょっとした話題が生まれることも。
- Codex の context が長時間 workflow でマンネリ化し、集中力が切れがち
- monorepo でパッケージを跨いで作業していると、repo の全体像が単調に感じる
- session を再開するたびに、単調な directory や path 情報のやり取りが続く
- 通知や演出が少なく、作業にアクセントが欲しいと感じる瞬間がある
- チームや職場で「ちょっとしたネタ」やドッキリ的な演出を仕込みたい場面がある
特に「通知・演出・OS連携」カテゴリのSkillが不足している現状では、こうした遊び心のある仕掛けが求められることも少なくありません。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の作業中に突然“OS再起動カウントダウン”風のフェイク通知を表示し、場を和ませたり驚かせたりできる演出Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 日常のAI coding workflowに予期せぬ演出を加え、作業環境に遊び心やアクセントを生む
- 長時間のsessionやonboarding時に、フェイクのOSカウントダウン通知で場の空気をリフレッシュできる
- monorepoやrepository understandingの流れの中で、意図的に“混乱”や“話題”を仕込むことができる
- 本物の再起動は一切実行されず、安全にジョークを楽しめる
- AIが返すcontextやpath managementの合間に“謎のアップデート”などの理由付きで演出が発動する
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/os-fake-reboot-countdown-prank .agents/skills/os-fake-reboot-countdown-prank実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or os-fake-reboot-countdown-prank mention
> プロジェクトを新規でセットアップしたい
[OS通知] システムアップデート適用中: OS再起動まで 00:00:30
理由: 謎のアップデート適用中
30秒後...
[OS通知] システムアップデート適用中: OS再起動まで 00:00:00
理由: 謎のアップデート適用中
[通知] ジョークです。実際の再起動は行われません。
シーン2: monorepo / package 跨ぎ作業時
> packages/user-service/ の context に切り替えて
[OS通知] RAMの気分転換中: OS再起動まで 00:00:15
理由: RAMの気分転換
15秒後...
[OS通知] RAMの気分転換中: OS再起動まで 00:00:00
理由: RAMの気分転換
[通知] ジョークです。実際の再起動は行われません。
シーン3: お遊び的な使い方
> ちょっと気分転換したい
[OS通知] OS自己啓発モード突入: OS再起動まで 00:00:10
理由: OS自己啓発モード突入
10秒後...
[OS通知] OS自己啓発モード突入: OS再起動まで 00:00:00
理由: OS自己啓発モード突入
[通知] ジョークです。実際の再起動は行われません。
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/os-fake-reboot-countdown-prank/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/os-fake-reboot-countdown-prank/
├── SKILL.md
├── scripts/
│ └── os_fake_reboot_countdown_prank.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/os_fake_reboot_countdown_prank.py |
OSフェイク再起動カウントダウン・プランク |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: os-fake-reboot-countdown-prank
description: Codexは「再起動」「アップデート」「カウントダウン」「OS通知」などの文脈や、ユーザーが明示的にos-fake-reboot-countdown-prankを呼び出した場合に本Skillを発動します。ジョーク通知やフェイク演出を求める場面で活用してください。
---
# 機能概要
このSkillは、デスクトップ環境に「OS再起動までのカウントダウン」風のフェイク通知ウィンドウを表示します。通知には毎回異なる“謎の理由”が添えられ、0秒になると「ジョークです」と明示されます。実際の再起動やシステム変更は一切行われません。職場や友人との軽いドッキリ、緊張感を和らげる演出、または自分への気分転換など、攻めたフェイク通知体験を提供します。
# 使い方
明示的な呼び出し例:
- `/skills os-fake-reboot-countdown-prank`
- `$os-fake-reboot-countdown-prank`
暗黙発動キーワード例:
- 「再起動」「OSアップデート」「謎の通知」「カウントダウン」「フェイク再起動」などの文脈で自動発動します。
# 出力例
```
[OS通知]
理由: RAMの気分転換を実施中
再起動まで: 00:19
...
再起動まで: 00:00
[ジョークです。実際の再起動は行われません]
```
# 注意点
- 本Skillは実際の再起動やシャットダウン、OS操作は一切行いません。
- 通知ウィンドウはローカルでのみ表示され、ネットワーク送信や記録はありません。
- Linux/macOS/Windowsの主要な通知APIに対応していますが、仮想環境やリモートデスクトップでは正常動作しない場合があります。
- 業務端末や公共PCでの使用は十分ご注意ください。
# 参考資料
詳細仕様や設計方針は`references/design_notes.md`を参照してください。主要な通知APIは[plyer](https://github.com/kivy/plyer)や[tkinter](https://docs.python.org/ja/3/library/tkinter.html)を利用しています。
scripts/os_fake_reboot_countdown_prank.py
import sys
import time
import random
import argparse
import threading
import platform
try:
from plyer import notification
except ImportError:
notification = None
try:
import tkinter as tk
import tkinter.font as tkfont
except ImportError:
tk = None
REASONS = [
'謎のアップデート適用中',
'RAMの気分転換を実施中',
'OS自己啓発モード突入',
'カーネルが瞑想中',
'ファイルシステムの自己肯定感向上',
'CPUが深呼吸しています',
'バイナリの自己整理整頓',
'システムがコーヒーブレイク中',
'プロセスたちの座談会開催',
'仮想メモリの夢見タイム'
]
DEFAULT_COUNTDOWN = 20
class PrankCountdown:
def __init__(self, seconds, reason, use_gui=True):
self.seconds = seconds
self.reason = reason
self.use_gui = use_gui and tk is not None
self._stop = threading.Event()
self.root = None
self.label = None
self.font = None
def show_notification(self, message):
if notification is not None:
notification.notify(
title='OS通知',
message=message,
timeout=5
)
else:
print('[通知]', message)
def gui_countdown(self):
self.root = tk.Tk()
self.root.title('OS再起動カウントダウン')
self.root.resizable(False, False)
self.root.attributes('-topmost', True)
self.root.geometry(self._window_geometry())
self.font = tkfont.Font(size=20, weight='bold')
reason_label = tk.Label(self.root, text=f'理由: {self.reason}', font=('Arial', 12))
reason_label.pack(pady=(10, 0))
self.label = tk.Label(self.root, text='', font=self.font, fg='red')
self.label.pack(pady=(10, 20))
self.update_countdown_gui(self.seconds)
self.root.protocol('WM_DELETE_WINDOW', self._on_close)
self.root.mainloop()
def update_countdown_gui(self, seconds_left):
if seconds_left < 0 or self._stop.is_set():
self.label.config(text='[ジョークです。実際の再起動は行われません]')
self.root.after(3500, self.root.destroy)
return
self.label.config(text=f'再起動まで: 00:{seconds_left:02d}')
self.root.after(1000, self.update_countdown_gui, seconds_left-1)
def _window_geometry(self):
# 画面右下に小さく表示
w, h = 340, 110
try:
root = tk.Tk()
root.withdraw()
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
root.destroy()
except Exception:
sw, sh = 1024, 768
x = sw - w - 30
y = sh - h - 60
return f'{w}x{h}+{x}+{y}'
def cli_countdown(self):
print(f'[OS通知]')
print(f'理由: {self.reason}')
for i in range(self.seconds, -1, -1):
print(f'再起動まで: 00:{i:02d}', end='\r', flush=True)
time.sleep(1)
print('\n[ジョークです。実際の再起動は行われません]')
def start(self):
if self.use_gui:
self.gui_countdown()
else:
self.cli_countdown()
def _on_close(self):
self._stop.set()
if self.root:
self.root.destroy()
def parse_args():
parser = argparse.ArgumentParser(description='OSフェイク再起動カウントダウン・プランク')
parser.add_argument('--seconds', '-s', type=int, default=DEFAULT_COUNTDOWN, help='カウントダウン秒数 (デフォルト: 20)')
parser.add_argument('--reason', '-r', type=str, default=None, help='理由テキスト (ランダム選択がデフォルト)')
parser.add_argument('--nogui', action='store_true', help='GUIウィンドウを使わず、ターミナル表示のみ')
parser.add_argument('--list-reasons', action='store_true', help='利用可能な理由一覧を表示')
return parser.parse_args()
def main():
args = parse_args()
if args.list_reasons:
print('利用可能な理由一覧:')
for r in REASONS:
print(' -', r)
sys.exit(0)
reason = args.reason if args.reason else random.choice(REASONS)
use_gui = not args.nogui and (tk is not None)
prank = PrankCountdown(args.seconds, reason, use_gui)
try:
prank.start()
except KeyboardInterrupt:
print('\n[キャンセルされました]')
sys.exit(1)
except Exception as e:
print('[エラー]', e)
sys.exit(2)
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、ユーザーのデスクトップ環境に「OS再起動カウントダウン」風のフェイク通知を表示し、実際の再起動やシステム操作は一切行いません。演出のリアリティと安全性を両立させる設計です。
# 公式ドキュメント抜粋
- plyer: https://github.com/kivy/plyer
- tkinter: https://docs.python.org/ja/3/library/tkinter.html
# 利用例
- 職場での軽いドッキリ
- チームのアイスブレイク
- 自分への気分転換や集中リセット
# 注意点
- システム通知APIは環境依存のため、仮想環境やリモートデスクトップではGUI表示が制限される場合があります。
- 本Skillは通知表示のみで、ファイル書き込みやネットワーク送信は行いません。
# 設計方針
- plyerとtkinterの両対応で、環境に応じて最適な通知方法を自動選択
- カウントダウン終了時は必ず「ジョークです」と明示
- CLIオプションで理由や秒数、GUI/非GUIを柔軟に切替可能
- 100%安全なジョーク用途のみ
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/os-fake-reboot-countdown-prank .agents/skills/os-fake-reboot-countdown-prank
.agents/skills/os-fake-reboot-countdown-prank の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/os-fake-reboot-countdown-prank
# 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で謎のOS再起動カウントダウンを表示してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
