Codex ユーザーが日常でぶつかる悩み
Codex を日常的に活用していると、作業の合間にふとした息抜きや気分転換が欲しくなる瞬間があります。しかし現状の AI coding workflow では、通知や演出は実用重視のものばかりで、遊び心やユーモアが介在する余地がほとんどありません。特に以下のようなシーンではちょっとした「間」が恋しくなることも多いはずです:
- Codex が context を見失って違う場所のコードを参照し始めたとき、思わず気分転換したくなる
- monorepo で package を跨いだとき、repo の構造説明に疲れて集中力が切れる
- session を再開するたび、前回までの context や path 指定を何度も繰り返すルーチンに飽きてしまう
- 長時間のAI coding workflowで long context が膨らみ、重要情報が埋もれてしまうと感じる
- 「ここはこういうリポジトリ」と毎回説明する作業が機械的になり、気分がマンネリ化する
こうした日常の小さなストレスや単調さを、ユーモアで和らげる仕掛けが求められています。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、作業中に突然「OSの謎キャラが退職を発表する」というカオスな演出通知をデスクトップにランダム表示し、気分転換やネタ的な盛り上がりを提供するSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の合間に、完全ランダムな「OS退職アナウンス」が現れ、作業の単調さを和らげる
- repo や directory の構造説明に疲れたタイミングで、思わず笑ってしまう小ネタ通知が入る
- monorepo や長時間 session の context 管理に煮詰まった時、意図せずセンチメンタルな気分転換ができる
- Skill の発動は1時間に1回程度と控えめなので、邪魔にならずリズムのアクセントになる
- 通知内容やキャラが毎回異なり、飽きずに楽しめる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-retirement-announcement .agents/skills/random-os-retirement-announcement実行したらこうなる (3つの利用シーン)
Skill が返す出力例を、実際の terminal 風に3パターンで紹介します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or random-os-retirement-announcement mention
> 新しいプロジェクトで作業を開始
[通知] 重要:本日をもって「カーネル部長」が勇退します。
長年にわたりプロセス管理を支えてきた功績に感謝し、今後のご活躍をお祈りいたします。
[通知] お知らせ:「ファイルシステムさん」が第二の人生へ転職されます。
今後はバックアップ業界でのご活躍を期待しています。
(以降、通常のCodex出力に戻る)
シーン2: monorepo / package 跨ぎ作業時
> packages/api/ から packages/frontend/ へ移動
[通知] 急報:メモリ課長が早期リタイアを表明しました。
「最近の context 管理は若手に任せたい」とコメント。
[通知] 重要:/packages/frontend/ の「UIコンポーネント係長」が本日付で退職されます。
後任は未定です。
(以降、作業を継続)
シーン3: お遊び的な使い方
> ちょっと疲れたので気分転換したい
[通知] お知らせ:「バッファくん」が新たな旅立ちを決意。
「もうこれ以上詰め込めません」とのこと。
[通知] 速報:/src/utils/ の「キャッシュ主任」が退職届を提出しました。
今後はクラウド業界での活躍を目指すそうです。
(作業再開)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開。合間に謎の退職通知で空気が和む |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る。時々謎キャラ退職で気分転換 |
| 長時間 workflow | long context で重要箇所が薄まる | 要所で意味不明な通知が入り、集中力がリセットされる |
発動方式
明示呼び出し (/skills menu or random-os-retirement-announcement mention) と暗黙発動 (description マッチ) の両方に対応。
Skill の中身を全部見せる
.agents/skills/random-os-retirement-announcement/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-retirement-announcement/
├── SKILL.md
├── scripts/
│ └── random_os_retirement.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_retirement.py |
1時間以内に通知していないか判定 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-retirement-announcement
description: Codexは、ユーザーの作業中や/skills menuコマンド実行時、または「退職」「引退」「通知」などのキーワードを含む文脈でこのSkillを発動してください。
---
# 機能概要
このSkillは、作業の合間やコマンド呼び出し時に、架空のOS内キャラクター(例:カーネル部長、ファイルシステムさん、メモリ課長など)が突如として退職や転職を宣言するデスクトップ通知をランダムに発生させます。意味のない別れのアナウンスが、日常の作業に一瞬のカオスとセンチメンタルな気分をもたらします。通知内容は毎回ランダム生成され、同じものはほぼ出ません。実用性はありませんが、OSやシステムに親しみや遊び心を感じたいユーザーに最適です。
# 使い方
- 明示呼び出し: `/skills menu` でスキル一覧から選択、または `random-os-retirement-announcement` を直接指定。
- 暗黙発動: 「退職」「引退」「通知」「お知らせ」などのワードを含む文脈や、作業中に一定時間が経過したタイミングで自動発火。
# 出力例
```
[通知] 重要:本日をもってカーネル部長が勇退します。
[通知] 急報:メモリ課長が早期リタイアを決意しました。
[通知] お知らせ:ファイルシステムさんが第二の人生へ旅立ちます。
[通知] 緊急:プロセス係長が新天地に転職します。
[通知] ご報告:デバイス管理人が定年を迎えました。
```
# 注意点
- 本Skillは実用的な通知ではなく、完全なジョーク機能です。
- 通知は1時間に1回以上は発火しません(スパム防止)。
- ローカル環境でのみ動作し、通知履歴は保存されません。
- 一部OSでは通知機能に追加パッケージが必要な場合があります。
# 参考資料
- [Python公式: notify2 (Linux通知)](https://pypi.org/project/notify2/)
- [Windows: win10toast](https://pypi.org/project/win10toast/)
- [macOS: terminal-notifier](https://github.com/julienXX/terminal-notifier)
- references/design_notes.md 参照
scripts/random_os_retirement.py
import sys
import os
import random
import time
import argparse
import platform
from datetime import datetime, timedelta
try:
import notify2 # Linux
except ImportError:
notify2 = None
try:
from win10toast import ToastNotifier # Windows
except ImportError:
ToastNotifier = None
import subprocess
LAST_ANNOUNCE_FILE = os.path.expanduser('~/.random_os_retirement_last')
CHARACTERS = [
'カーネル部長',
'ファイルシステムさん',
'メモリ課長',
'プロセス係長',
'デバイス管理人',
'スケジューラ主任',
'ネットワーク課長',
'バッファ主任',
'ドライバ係',
'システムコール相談役',
]
ACTIONS = [
'勇退します',
'早期リタイアを決意しました',
'第二の人生へ旅立ちます',
'新天地に転職します',
'定年を迎えました',
'無期限休職に入ります',
'突然の退職を発表しました',
'異動となりました',
'家庭の事情で退職します',
'後進に道を譲ります',
]
PREFIXES = [
'重要:',
'通知:',
'急報:',
'お知らせ:',
'緊急:',
'ご報告:',
]
def can_announce():
"""1時間以内に通知していないか判定"""
try:
with open(LAST_ANNOUNCE_FILE, 'r') as f:
last = float(f.read().strip())
if time.time() - last < 3600:
return False
except Exception:
pass
return True
def record_announce():
try:
with open(LAST_ANNOUNCE_FILE, 'w') as f:
f.write(str(time.time()))
except Exception:
pass
def generate_message():
prefix = random.choice(PREFIXES)
char = random.choice(CHARACTERS)
action = random.choice(ACTIONS)
return f"{prefix}{char}が{action}。"
def send_notification(message):
system = platform.system()
if system == 'Linux' and notify2:
try:
notify2.init('Random OS Retirement')
n = notify2.Notification('通知', message)
n.show()
except Exception:
print(f"[通知] {message}")
elif system == 'Windows' and ToastNotifier:
try:
toaster = ToastNotifier()
toaster.show_toast('通知', message, duration=5)
except Exception:
print(f"[通知] {message}")
elif system == 'Darwin':
try:
subprocess.run([
'osascript', '-e', f'display notification "{message}" with title "通知"'
])
except Exception:
print(f"[通知] {message}")
else:
print(f"[通知] {message}")
def announce():
if not can_announce():
print("[INFO] 通知済みなのでスキップします (1時間に1回まで)")
return
msg = generate_message()
send_notification(msg)
record_announce()
print(f"[通知] {msg}")
def list_examples():
print("--- 通知例 ---")
for _ in range(5):
print(f"[通知] {generate_message()}")
def summary():
print("# random-os-retirement-announcement summary")
print("・架空のOSキャラが退職/転職を通知\n・1時間に1回まで\n・通知内容は完全ランダム")
def main():
parser = argparse.ArgumentParser(description='Random OS Retirement Announcement')
subparsers = parser.add_subparsers(dest='command')
subparsers.required = False
parser_announce = subparsers.add_parser('announce', help='今すぐ退職通知を出す')
parser_list = subparsers.add_parser('list', help='サンプル通知を5件表示')
parser_summary = subparsers.add_parser('summary', help='Skill概要を表示')
args = parser.parse_args()
if args.command == 'announce' or args.command is None:
announce()
elif args.command == 'list':
list_examples()
elif args.command == 'summary':
summary()
else:
parser.print_help()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、OSの擬人化キャラクターが突然退職や転職を宣言する通知を、完全ランダムな内容で発生させるジョーク系演出ツールです。作業中のちょっとした息抜きや、システムに親しみを感じたいユーザー向けに設計されています。
# 公式ドキュメント抜粋
- Linux: notify2 (https://pypi.org/project/notify2/)
- Windows: win10toast (https://pypi.org/project/win10toast/)
- macOS: terminal-notifier (https://github.com/julienXX/terminal-notifier)
# 利用例
- 長時間作業の合間に、唐突な別れの通知で気分転換
- チーム内の雑談ネタや、開発現場の和み用途
# 注意点
- 実用的な通知ではなく、完全なジョークです。
- 通知は1時間に1回までに制限されています。
- 通知履歴は保存されません。
# 設計方針
- OSごとに最適な通知APIを利用し、クロスプラットフォーム対応
- 内容は毎回ランダム生成、同じ通知が続かないよう工夫
- シンプルなCLIサブコマンド設計で明示/暗黙呼び出し両対応
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-retirement-announcement .agents/skills/random-os-retirement-announcement
.agents/skills/random-os-retirement-announcement の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-retirement-announcement
# 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
- 通知の頻度: 1時間に1回程度以上には発火しない設計だが、タイミングの体感はユーザー次第
試す前に確かめたいこと
この Skill を実運用に投入する前に確かめたい問いを並べる:
- 実 repo での token 消費は許容範囲か?
- monorepo (packages 多数) で安定して動くか?
- stale context にならず、長時間 workflow でも有効か?
- AGENTS.md との連携設計はどうあるべきか?
- 通知がランダムなタイミングで本当に出るか?
- 文面・キャラクターが毎回しっかり変化するか?
- 1時間に1回程度以上には発火しないか?
実際に Codex で試した検証ログは Codexの謎OS退職アナウンスを試してみた!突然の通知で盛り上がるか検証 にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
