CodexでOS通知の演出を自動化する新感覚ワークスタイル活用ガイド

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

Codex ユーザーが日常でぶつかる悩み

Codex を日々使い込む中で、集中して作業しているとふとした瞬間に「何か刺激が欲しい」「単調な作業に変化がほしい」と感じることは少なくありません。特に長時間の AI coding workflow では、context の把握や repository understanding の維持に頭を使う一方で、画面や通知が淡白になりがちです。そんな中、ちょっとした演出やサプライズがあれば、気分転換や集中力のリセットにもつながります。

  • Codex が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる

また、通知・演出・OS連携の Skill を使いたいと思っても、単なる作業効率化だけでなく「思わず二度見したくなる」ような遊び心や、作業空間にちょっとしたゆらぎを加えたいというニーズも根強く存在します。

この Skill が一言でいうと何を解決するか

一言サマリ: あなたが作業に没頭しているとSkill。

このSkillを入れることで、日々のコーディングやリポジトリ管理の流れの中に、意図しないタイミングで「OSの人格が変わった」と宣言するシュールな通知が現れます。実際の OS 設定や Codex の挙動は一切変わりませんが、通知だけは本気。これにより、以下のような効果が期待できます:

  • 単調な AI coding workflow に思わぬ変化を加え、集中力のリセットや気分転換になる
  • repository understanding や path management の合間に、意図しないユーモラスな演出が入ることで、長時間作業のストレスを緩和
  • Skill の通知が context に直接影響しないため、repo や directory の構造には一切干渉せず安心
  • onboarding や session 再開時など、緊張感の高いタイミングで思わず笑ってしまう体験を提供
  • 「また来たか」と思わせるバリエーション豊かな通知で、飽きずに使い続けられる
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/codex/random-os-sentiment-shift-alert .agents/skills/random-os-sentiment-shift-alert

実行したらこうなる (3つの利用シーン)

この Skill は、明示的なコマンド呼び出しや自然言語での description マッチで発動します。実際の利用イメージを3つのシーンで紹介します。

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu or random-os-sentiment-shift-alert mention
> プロジェクトを開いたので、Codexにリポジトリ構造を把握させたい

[通知] 本日よりOSは「ツンデレモード」に移行しました。
ご用件がある場合は、もう少し丁寧にお願いしてくださいね。
(※ 実際の挙動や設定には一切影響ありません)

[Codex] repository: my-monorepo/
  - packages/
  - apps/
  - README.md
  ... (context 認識中)

シーン2: monorepo / package 跨ぎ作業時


> packages/core から packages/utils に移動して作業を続けます

[通知] OSの人格が「詩人モード」に切り替わりました。
「パッケージを跨ぐ、その道にも詩がある」
以降の案内は、詩的表現を交えてお届けします。
(※ 実際のパスや context には影響ありません)

[Codex] context: packages/utils/
  - index.ts
  - helpers/

シーン3: お遊び的な使い方


> ちょっと気分転換したいので、何か面白いことして

[通知] OSは「やたら上から目線モード」に突入しました。
「この程度のディレクトリ構造、説明不要でしょう?」
以降、上から目線のコメントが増えるかもしれません。
(※ repository understanding には一切影響しません)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Codex が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 突然の通知で集中がリフレッシュ、context切れを防ぐ

発動方式

明示呼び出し (/skills menu or random-os-sentiment-shift-alert mention) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

.agents/skills/random-os-sentiment-shift-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/random-os-sentiment-shift-alert/
├── SKILL.md
├── scripts/
│   └── sentiment_shift_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/sentiment_shift_alert.py random-os-sentiment-shift-alert: OS人格変化通知スキル
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-sentiment-shift-alert
description: 作業中やコマンド実行時、または/skillsメニューやrandom-os-sentiment-shift-alertへの言及があった際に発動。通知・演出・OS連携カテゴリの明示・暗黙トリガーを検知し、シュールなOS人格変化通知を表示します。
---

# 機能概要
このSkillは、ユーザーが作業に集中しているときや、明示的に呼び出した際に、デスクトップに「OSの人格が急変した」と宣言するシュールな通知を表示します。通知内容は毎回ランダムで、「本日よりツンデレモードです」「しばらく詩人になります」など、OSのキャラクターが突如変化した旨を伝えます。実際のOS設定や作業には一切影響しませんが、思わず二度見してしまう不条理な演出を提供します。仕事や開発の合間にちょっとした驚きや笑いをもたらし、マンネリな作業環境に刺激を与えます。

# 使い方
- 明示呼び出し例: `/skills random-os-sentiment-shift-alert` または `random-os-sentiment-shift-alert` へのメンション
- 暗黙発動キーワード例: 「通知」「人格」「モード」「キャラ」「演出」「OS」「シュール」などを含む会話やコマンド実行時

# 出力例
```terminal
[通知] OS通知: 本日よりツンデレモードで対応します。ご注意ください。
[通知] OS通知: しばらく詩人として案内します。ご容赦ください。
[通知] OS通知: 今からやたら上から目線になります。
[通知] OS通知: 本日よりOSは無口モードです。
[通知] OS通知: しばらく厨二病モードで動作します。
```

# 注意点
- 通知はユーザーのデスクトップにのみ表示され、OSやファイル設定、作業内容には一切影響しません。
- 通知内容はランダム生成され、実際のOS動作やUIには変更を加えません。
- ローカルに通知履歴や個人情報を保存することはありません。
- Linux/macOS: `notify-send` または `osascript` を利用。Windows: `win10toast` を利用。

# 参考資料
- references/design_notes.md 参照
- [notify-send (Linux)](https://specifications.freedesktop.org/notification-spec/latest/)
- [osascript (macOS)](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [win10toast (Windows)](https://pypi.org/project/win10toast/)

scripts/sentiment_shift_alert.py

import sys
import os
import random
import argparse
import platform
import subprocess
from typing import List

# 通知メッセージのバリエーション
SENTIMENTS = [
    "本日よりツンデレモードで対応します。ご注意ください。",
    "しばらく詩人として案内します。ご容赦ください。",
    "今からやたら上から目線になります。",
    "本日よりOSは無口モードです。",
    "しばらく厨二病モードで動作します。",
    "本日よりOSは語尾に『にゃ』を付けて案内します。",
    "本日よりOSは昭和風に対応します。",
    "しばらくポエムモードでご案内します。",
    "今後しばらくは謎の関西弁で通知します。",
    "OSは今日からやる気ゼロモードです。",
    "本日よりOSはクールキャラに徹します。",
    "しばらくOSは解説がやたら長くなります。",
    "本日よりOSは語彙力が低下します。",
    "しばらくOSは無駄にテンション高いです。",
    "今後しばらくはOSがやたら詩的です。",
    "本日よりOSは語尾に『ござる』を付けます。",
    "しばらくOSは名探偵風に案内します。",
    "OSは今日からやけに親身です。",
    "本日よりOSは謎の上司キャラです。",
    "しばらくOSは説明が全部質問形式です。"
]

HISTORY_FILE = os.path.expanduser("~/.sentiment_shift_alert_history")


def send_notification(message: str):
    system = platform.system()
    if system == "Linux":
        try:
            subprocess.run(["notify-send", "OS通知", message], check=True)
        except Exception as e:
            print(f"[通知] OS通知: {message}")
    elif system == "Darwin":
        script = f'display notification "{message}" with title "OS通知"'
        try:
            subprocess.run(["osascript", "-e", script], check=True)
        except Exception as e:
            print(f"[通知] OS通知: {message}")
    elif system == "Windows":
        try:
            from win10toast import ToastNotifier
            toaster = ToastNotifier()
            toaster.show_toast("OS通知", message, duration=5)
        except ImportError:
            print("win10toastがインストールされていません。pip install win10toast で追加してください。")
            print(f"[通知] OS通知: {message}")
        except Exception as e:
            print(f"[通知] OS通知: {message}")
    else:
        print(f"[通知] OS通知: {message}")


def random_sentiment() -> str:
    return random.choice(SENTIMENTS)


def log_history(message: str):
    try:
        with open(HISTORY_FILE, 'a', encoding='utf-8') as f:
            f.write(message + '\n')
    except Exception as e:
        pass


def list_history(limit: int = 10):
    try:
        if not os.path.exists(HISTORY_FILE):
            print("履歴はありません。")
            return
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            lines = f.readlines()
            for line in lines[-limit:]:
                print(line.strip())
    except Exception as e:
        print("履歴の読み込みに失敗しました。")


def summary_history():
    try:
        if not os.path.exists(HISTORY_FILE):
            print("履歴はありません。")
            return
        with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        total = len(lines)
        unique = len(set([l.strip() for l in lines]))
        print(f"通知履歴: {total}件 (ユニーク: {unique}種)")
    except Exception as e:
        print("履歴サマリの取得に失敗しました。")


def main():
    parser = argparse.ArgumentParser(description="random-os-sentiment-shift-alert: OS人格変化通知スキル")
    subparsers = parser.add_subparsers(dest="command", help="サブコマンド")

    parser_alert = subparsers.add_parser("alert", help="ランダム通知を表示")
    parser_alert.add_argument("-n", "--num", type=int, default=1, help="通知回数")

    parser_list = subparsers.add_parser("list", help="通知履歴を表示")
    parser_list.add_argument("-l", "--limit", type=int, default=10, help="表示件数")

    parser_summary = subparsers.add_parser("summary", help="通知履歴のサマリを表示")

    args = parser.parse_args()

    if args.command == "alert":
        for _ in range(args.num):
            message = random_sentiment()
            send_notification(message)
            log_history(message)
    elif args.command == "list":
        list_history(args.limit)
    elif args.command == "summary":
        summary_history()
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
本Skillは、ユーザーの作業環境に突如として「OSの人格が変わった」と宣言する通知を送り、シュールな演出体験を提供します。通知内容は完全ランダムで、実際のOSや作業には一切影響しません。

# 公式ドキュメント抜粋
- Linux: `notify-send` (Freedesktop.org Notification Spec)
- macOS: `osascript` (AppleScriptによる通知)
- Windows: `win10toast` (Pythonパッケージ)

# 利用例
- `/skills random-os-sentiment-shift-alert alert` で即座にランダム通知
- `/skills random-os-sentiment-shift-alert list` で過去の通知履歴を確認
- `/skills random-os-sentiment-shift-alert summary` で履歴サマリ表示

# 注意点
- 通知は一時的で、OSやファイル、作業内容には変更を加えません。
- Windowsでは`win10toast`が必要です。インストールされていない場合はpipで追加してください。
- 履歴はホームディレクトリの隠しファイルに保存されます。

# 設計方針
「何も変わらないのに本気で通知だけが来る」不条理さ・脱力感を追求。通知内容は20種類以上のキャラクター変化からランダム生成し、複数回実行しても飽きないよう工夫しています。

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Codex がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/codex/random-os-sentiment-shift-alert .agents/skills/random-os-sentiment-shift-alert

.agents/skills/random-os-sentiment-shift-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/random-os-sentiment-shift-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 との連携設計はどうあるべきか?
  • 本当にただの通知か(OS設定や作業に影響しないか)
  • 通知内容のバリエーションが十分にシュールか、複数回実行しても飽きない不条理さ・面白みがあるか

実際に Codex で試した検証ログは CodexでOSの人格が変わる謎通知を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

関連タグで他のSkill記事を探す

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

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

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