Codexで突如現れる謎の失恋通知が作業に笑いを届ける秘密

  • URLをコピーしました!
目次

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 直後のアイスブレイクとして活用できる
  • 通知内容が毎回ランダムなので、飽きずに楽しめる
QUICK INSTALL
このSkillをすぐ試す

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記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次