Codex ユーザーが日常でぶつかる悩み
Codex を使っていると、真面目な開発現場にふとした「息抜き」や「遊び心」が欲しくなる瞬間があります。特に長時間の AI coding workflow や、複雑な monorepo での作業、繰り返しの repository onboarding など、集中力が切れがちなタイミングは誰にでもあるものです。
通知や演出系 Skill の需要は高いものの、実際には「業務に直接関係しない」「ただのジョーク」な機能が意外と少ないのも現状です。
Codex 固有の context 管理や path management の煩雑さに疲れた時、ちょっとした非日常を感じたい――そんな時に「意味不明な通知」が唐突に現れると、思わず笑ってしまうかもしれません。
- Codex が context を見失って違う場所のコードを参照するたび、気分転換したくなる
- monorepo で package を跨いだ瞬間、repo 構造の説明に追われて飽きてしまう
- session を再開するたび、同じ説明を繰り返すことに疲れてしまう
- 長時間 workflow で long context が膨らみ、重要な情報が埋もれて息苦しい
- 「ここはこういうリポジトリ」と毎回説明する単調さに飽きてしまう
こうした状況で、突発的な「デジタル失恋」通知が炸裂したら――思わずクスッと笑ってリフレッシュできる、そんな余白が欲しくなる瞬間は意外と多いものです。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の作業現場に「謎のOS失恋通知」をランダムで届けるジョーク系 Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の合間に、唐突な「意味不明な通知」で作業の緊張をほぐせる
- monorepo や大規模 repository での単調な context 管理中に、非日常の笑いを挟める
- Codex の通知・演出・OS連携 Skill の中で、最も「シュール」な体験を追加できる
- 長時間 session の気分転換や、onboarding 直後のアイスブレイクとして活用できる
- 通知内容が毎回ランダムなので、飽きずに楽しめる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-breakup-notifier .agents/skills/random-os-breakup-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or random-os-breakup-notifier mention
> 開発を始める
[OS失恋通知] 重要: あなたの愛用マウスが新しいパートナーに乗り換えました。
理由: 最近トラックパッドと仲良くしている姿を見かけたからです。
今後は「/dev/input/mouse1」を大切にしてあげてください。
[OS失恋通知] 悲報: エディタ「VSCode」がそっとあなたのもとを去りました。
理由: 最近保存ボタンを押しても反応が薄かったようです。
(通知はランダムで複数回出ることもあります)
シーン2: monorepo / package 跨ぎ作業時
> packages/api/ から packages/web/ に移動
[OS失恋通知] ごめん、今日から Ctrlキーは Altキーと付き合うことにしました。
理由: あなたが最近 Cmdキーばかり押しているのを見てしまったから。
[OS失恋通知] 重大: package.json が依存関係リストからあなたを削除しました。
理由: 依存性の片思いは辛かったようです。
シーン3: お遊び的な使い方
> ちょっと気分転換したい
[OS失恋通知] お知らせ: ターミナルが bash から zsh に乗り換えました。
理由: 最近 prompt の色が地味すぎたのが原因です。
[OS失恋通知] さようなら: README.md があなたの説明責任から解放されました。
理由: ドキュメントの更新を3ヶ月サボったからです。
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開+突発的な失恋通知で気分転換 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る+失恋通知で笑いが生まれる |
| 長時間 workflow | long context で重要箇所が薄まる | 突発的な通知で集中力リセット、作業に新鮮味が戻る |
発動方式
明示呼び出し (/skills menu or random-os-breakup-notifier mention) と暗黙発動 (description マッチ) の両方に対応。
Skill の中身を全部見せる
.agents/skills/random-os-breakup-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-breakup-notifier/
├── SKILL.md
├── scripts/
│ └── random_os_breakup_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_breakup_notifier.py |
random-os-breakup-notifier: シュールなOS失恋通知をランダム表示 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-breakup-notifier
description: 作業中やコマンド実行時など、ユーザーが集中しているタイミングで“デジタル失恋通知”を突発的に発動。明示的な /skills menu 呼び出しや、breakup, notification, joke, OS, 失恋, 通知, 笑い などのキーワード検知時にも発動します。
---
# 機能概要
random-os-breakup-notifierは、作業中の緊張感や単調さを和らげるため、突如“謎のOS失恋通知”をデスクトップやターミナルに表示します。内容は毎回ランダムで、マウスやエディタ、ショートカットキーなど身近なデジタル存在がユーザーを振るというシュールなジョークを演出。真面目な現場に非日常の笑いを届け、リラックス効果やチーム内のコミュニケーション促進にも役立ちます。
# 使い方
- 明示呼び出し: `/skills menu` から「random-os-breakup-notifier」を選択、または `$random-os-breakup-notifier` を直接実行。
- 暗黙発動: 「breakup」「notification」「joke」「OS」「失恋」「通知」「笑い」などのキーワードが会話やコマンドラインに現れた際、自動的にランダムな通知が発動します。
# 出力例
```
[重要] あなたの愛用マウスが新しいパートナーに乗り換えました。
[悲報] エディタがそっとあなたのもとを去りました。
[通知] ごめん、今日からCtrlキーはAltキーと付き合うことに。
[警告] ターミナルがあなたのコマンドに飽きてしまったようです。
[速報] あなたのフォルダが別のユーザーと新生活を始めました。
```
# 注意点
- 本Skillはジョーク用途専用です。システムや作業内容には一切干渉しません。
- 通知内容はローカルに保存されません。
- 通知の表示にはOSごとの標準APIを利用しますが、環境によってはターミナル通知のみとなる場合があります。
- 重要な作業中の誤発動を避けたい場合は、Skillの一時停止を推奨します。
# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- [Python公式notify2ドキュメント](https://pypi.org/project/notify2/)
- [macOS通知: osascript](https://ss64.com/osx/osascript.html)
- [Windows通知: win10toast](https://pypi.org/project/win10toast/)
scripts/random_os_breakup_notifier.py
import sys
import argparse
import random
import platform
import subprocess
import time
from typing import List, Optional
try:
import notify2
except ImportError:
notify2 = None
try:
from win10toast import ToastNotifier
except ImportError:
ToastNotifier = None
BREAKUP_MESSAGES = [
"[重要] あなたの愛用マウスが新しいパートナーに乗り換えました。",
"[悲報] エディタがそっとあなたのもとを去りました。",
"[通知] ごめん、今日からCtrlキーはAltキーと付き合うことに。",
"[警告] ターミナルがあなたのコマンドに飽きてしまったようです。",
"[速報] あなたのフォルダが別のユーザーと新生活を始めました。",
"[悲報] あなたのショートカットが他のアプリと駆け落ちしました。",
"[通知] マウスポインタが新しいデスクトップに引っ越しました。",
"[重要] あなたの設定ファイルが別のエディタに心変わりしました。",
"[警告] スクロールバーがあなたの指示に従うのをやめました。",
"[速報] タスクバーが新しいウィンドウと恋に落ちました。"
]
TRIGGER_KEYWORDS = [
"breakup", "notification", "joke", "OS", "失恋", "通知", "笑い"
]
def select_random_message() -> str:
return random.choice(BREAKUP_MESSAGES)
def show_notification(message: str, title: str = "OS失恋通知") -> None:
system = platform.system()
if system == "Linux" and notify2:
try:
notify2.init("random-os-breakup-notifier")
n = notify2.Notification(title, message)
n.set_urgency(notify2.URGENCY_NORMAL)
n.show()
except Exception as e:
print(f"[通知エラー] {e}")
print(f"{title}: {message}")
elif system == "Darwin":
# macOS: osascript 経由で通知
try:
script = f'display notification "{message}" with title "{title}"'
subprocess.run(["osascript", "-e", script], check=True)
except Exception as e:
print(f"[通知エラー] {e}")
print(f"{title}: {message}")
elif system == "Windows" and ToastNotifier:
try:
toaster = ToastNotifier()
toaster.show_toast(title, message, duration=5)
except Exception as e:
print(f"[通知エラー] {e}")
print(f"{title}: {message}")
else:
# Fallback: 標準出力
print(f"{title}: {message}")
def list_messages():
print("--- 通知メッセージ一覧 ---")
for i, msg in enumerate(BREAKUP_MESSAGES, 1):
print(f"{i}. {msg}")
def summary():
print("random-os-breakup-notifier: システムの種類や状況に応じて、シュールな失恋通知をランダムに表示します。")
print(f"通知バリエーション数: {len(BREAKUP_MESSAGES)}")
print(f"対応OS: Linux, macOS, Windows (一部は標準出力)\n")
print("明示呼び出し例: python random_os_breakup_notifier.py notify")
print("暗黙発動キーワード: " + ", ".join(TRIGGER_KEYWORDS))
def trigger_on_keywords(text: str) -> bool:
text_lower = text.lower()
for kw in TRIGGER_KEYWORDS:
if kw.lower() in text_lower:
return True
return False
def notify(args):
message = select_random_message()
show_notification(message)
def main():
parser = argparse.ArgumentParser(description="random-os-breakup-notifier: シュールなOS失恋通知をランダム表示")
subparsers = parser.add_subparsers(dest="command")
notify_parser = subparsers.add_parser("notify", help="ランダムな失恋通知を表示")
notify_parser.add_argument("--message", type=str, help="通知内容を指定 (省略時はランダム)")
list_parser = subparsers.add_parser("list", help="通知メッセージ一覧を表示")
summary_parser = subparsers.add_parser("summary", help="Skill概要を表示")
trigger_parser = subparsers.add_parser("trigger", help="キーワードで通知を発動")
trigger_parser.add_argument("text", type=str, help="発動判定用テキスト")
args = parser.parse_args()
if args.command == "notify":
message = args.message if args.message else select_random_message()
show_notification(message)
elif args.command == "list":
list_messages()
elif args.command == "summary":
summary()
elif args.command == "trigger":
if trigger_on_keywords(args.text):
message = select_random_message()
show_notification(message)
else:
print("[発動条件未検出] 通知は表示されませんでした。")
else:
parser.print_help()
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
random-os-breakup-notifierは、作業中のユーザーに突発的な“デジタル失恋”通知を届けるジョーク系Skillです。通知内容はバリエーション豊かで、日常の作業に非日常の笑いを提供します。
# 公式ドキュメント抜粋
- Linux: notify2 (https://pypi.org/project/notify2/)
- macOS: osascript (https://ss64.com/osx/osascript.html)
- Windows: win10toast (https://pypi.org/project/win10toast/)
# 利用例
- チームの朝会や、集中作業中のリフレッシュタイムに
- Slackやチャットボットの通知トリガーとしても応用可能
# 注意点
- 通知内容はローカルに保存されません。
- システム通知APIの仕様変更や権限設定により、通知が表示されない場合があります。
- 重要作業中の誤発動には注意し、必要に応じてSkillの一時停止を推奨します。
# 設計方針
- OSごとの標準APIを用い、環境依存性を最小化
- ジョーク性と安全性(作業への非干渉)を両立
- 拡張性を考慮し、通知メッセージの追加やカスタマイズも容易
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-breakup-notifier .agents/skills/random-os-breakup-notifier
.agents/skills/random-os-breakup-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-breakup-notifier
# SKILL.md, scripts/, references/, README.md があればOK
4. Codex を再起動 (or Skill 自動検出を待つ)
新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or random-os-breakup-notifier mention と Skill 名で出てきます。
5. 動作確認
/skills menu or random-os-breakup-notifier 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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
