Codexで実現する懐かし通知の演出効果と開発環境の遊び心活用法

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

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

Codex を日々使っていると、思わず「またか」と感じる瞬間が多々あります。特に通知や演出、OS連携系の機能が乏しいため、開発体験が単調になりがちです。集中している時ほど、何かしらの「遊び心」や「意外性」が欲しくなるものです。例えば次のような悩みを感じることが多いでしょう:

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

さらに、「通知・演出・OS連携」カテゴリの悩みとして、作業が淡々と進むだけで、ちょっとしたユーモアやリラックス要素が皆無なことも。時には「意味不明な通知で気分転換したい」「昔のOSネタで盛り上がりたい」と感じることもあるはずです。

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

一言サマリ: このスキルは、開発の合間に“謎のレガシーOSサポート終了通知”をランダムで表示し、作業フローに遊び心とリフレッシュをもたらします。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • Codex のAI coding workflow中、terminalやエディタ操作のたびに、contextやrepo構造に無関係な“レガシー通知”がランダム表示され、開発にユーモアが加わる
  • 長時間の集中や単調なパス管理・onboarding作業に、無害な“ノイズ”として気分転換ができる
  • monorepoや巨大なrepository作業時でも、実害ゼロの通知なのでmemoryやlong contextを汚さず安心
  • 「今日はどんな意味不明な通知が来るか」ちょっとした楽しみが生まれ、チームの会話のネタにもなる
  • AI coding workflowに“無意味な焦燥”や“懐かしみ”を演出でき、マンネリ化した開発体験を変えられる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-fake-legacy-support-alert .agents/skills/random-os-fake-legacy-support-alert

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

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


# /skills menu or $random-os-fake-legacy-support-alert mention
> プロジェクトセットアップ開始

[通知] Windows 98 互換モードのサポートが本日終了しました。
[通知] IE6向け最適化APIが永遠に封印されました。
[通知] フロッピー対応APIが旅立ちました。

# (以降、通常のCodexの出力)

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


> cd packages/legacy-support
> ls

[通知] MS-DOSバッチスクリプト変換機能が歴史の彼方へ消えました。
[通知] NTFS 4.0 サポート終了のお知らせ。
[通知] /packages/legacy-support/ での作業中、Turbo Pascal互換性モードが失われました。

legacy-api.js  README.md  utils/

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


> echo "test" > foo.txt

[通知] 3.5インチFD対応ドライバが静かに旅立ちました。
[通知] Windows Me用のトラブルシューティングウィザードが封印されました。
[通知] OS/2 Warp対応モジュールが伝説となりました。

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/random-os-fake-legacy-support-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/random-os-fake-legacy-support-alert/
├── SKILL.md
├── scripts/
│   └── legacy_support_alert.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/legacy_support_alert.py ランダムなレガシーOSサポート終了通知を表示します。
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-legacy-support-alert
description: Codexは、ユーザーがコマンド実行・スクリプト保存・ターミナル操作などのアクションを行うたびに、このSkillを発動し、ランダムなレガシーOSサポート終了通知を表示します。通知・警告・レガシー・サポート終了などのキーワードもトリガーとなります。
---

# 機能概要
このSkillは、コマンド実行やエディタ操作のたびに、現代では考えられないレガシーOSやソフトウェアの“サポート終了通知”を完全ランダムにデスクトップへ表示します。例として「Windows 98互換モードのサポート終了」「IE6向け最適化封印」など、開発者の心に一瞬の懐かしさと無意味な焦りを与える演出を提供します。実害は一切なく、実際の環境やデータを変更することもありません。

# 使い方
- 明示呼び出し: `/skills menu` でSkill一覧から選択、または `random-os-fake-legacy-support-alert` を直接指定
- 暗黙発動: ターミナルでコマンド実行時、または「通知」「警告」「レガシー」「サポート終了」などのキーワードを含む操作時に自動発火

# 出力例
```
[サポート終了通知]
Windows 98互換モードのサポートは本日をもって終了しました。
今後はY2K非対応環境での動作保証はありません。
---
[サポート終了通知]
IE6向け最適化は永遠に封印されました。
レガシーCSSハックの時代は終わりました。
---
[サポート終了通知]
フロッピー対応APIが静かに旅立ちました。
FDドライブの回転音はもう聞こえません。
```

# 注意点
- このSkillは通知のみを行い、ファイルやシステム設定には一切影響しません。
- ローカルに通知履歴を保存しません。
- 実際のOSやアプリのサポート状況には関与しません。
- 通知は現行環境に依存せず、完全ランダムに生成されます。

# 参考資料
- references/design_notes.md に設計方針や利用例を記載
- 公式API: https://docs.python.org/3/library/subprocess.html, https://pypi.org/project/plyer/ (通知API)

scripts/legacy_support_alert.py

import sys
import argparse
import random
import time
import threading
from typing import List

try:
    from plyer import notification
except ImportError:
    notification = None

LEGACY_ALERTS = [
    {
        'title': 'サポート終了通知',
        'message': 'Windows 98互換モードのサポートは本日をもって終了しました。今後はY2K非対応環境での動作保証はありません。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'IE6向け最適化は永遠に封印されました。レガシーCSSハックの時代は終わりました。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'フロッピー対応APIが静かに旅立ちました。FDドライブの回転音はもう聞こえません。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'MS-DOSバッチファイルの自動起動サポートが終了しました。AUTOEXEC.BATは過去のものです。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'Netscape Navigator 4.7向け最適化が廃止されました。Blinkタグは永遠に。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'SCSI外付けMOドライブのサポートが終了しました。交換メディアの時代に別れを。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'BASICインタープリタの標準搭載が終了しました。10 PRINT "HELLO" の時代は終わりました。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'Windows XP Lunaテーマのサポートがついに終了しました。青いスタートボタンに感謝を。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'レガシーCOMポート経由のプリンタサポートが廃止されました。紙詰まりにさようなら。'
    },
    {
        'title': 'サポート終了通知',
        'message': 'ActiveXコントロールのサポートが完全終了。Webセキュリティ向上のため。'
    },
]

HISTORY: List[dict] = []


def show_notification(alert: dict):
    if notification:
        notification.notify(
            title=alert['title'],
            message=alert['message'],
            timeout=7
        )
    else:
        print(f"[{alert['title']}]")
        print(alert['message'])
        print("---")


def random_alert() -> dict:
    alert = random.choice(LEGACY_ALERTS)
    HISTORY.append(alert)
    return alert


def log_alert(alert: dict):
    # ローカルファイル保存はしない設計
    pass


def list_alerts():
    if not HISTORY:
        print("まだ通知履歴はありません。")
        return
    for i, alert in enumerate(HISTORY, 1):
        print(f"{i}. {alert['title']} : {alert['message']}")


def summary_alerts():
    print(f"通知発火回数: {len(HISTORY)}")
    titles = set(a['title'] for a in HISTORY)
    print(f"種類: {len(titles)}")


def trigger_alert():
    alert = random_alert()
    show_notification(alert)
    log_alert(alert)


def periodic_mode(interval: int = 60):
    try:
        while True:
            trigger_alert()
            time.sleep(interval)
    except KeyboardInterrupt:
        print("periodic modeを終了します。")


def parse_args():
    parser = argparse.ArgumentParser(description='ランダムなレガシーOSサポート終了通知を表示します。')
    subparsers = parser.add_subparsers(dest='command')

    trigger_parser = subparsers.add_parser('trigger', help='即座に通知を発火')
    periodic_parser = subparsers.add_parser('periodic', help='一定間隔で通知を発火')
    periodic_parser.add_argument('--interval', type=int, default=60, help='通知間隔(秒)')
    list_parser = subparsers.add_parser('list', help='通知履歴を表示')
    summary_parser = subparsers.add_parser('summary', help='通知履歴のサマリを表示')

    return parser.parse_args()


def main():
    args = parse_args()
    if args.command == 'trigger':
        trigger_alert()
    elif args.command == 'periodic':
        periodic_mode(args.interval)
    elif args.command == 'list':
        list_alerts()
    elif args.command == 'summary':
        summary_alerts()
    else:
        print('コマンドを指定してください。例: trigger, periodic, list, summary')

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、懐かしのOSやソフトウェアの“サポート終了”通知を完全ランダムで表示する演出系ツールです。実際のシステムやファイルには一切影響せず、開発者の気分転換や話題作りに最適です。

# 公式ドキュメント抜粋
- [plyer通知API](https://plyer.readthedocs.io/en/latest/): クロスプラットフォームなデスクトップ通知を実現。
- [Python argparse](https://docs.python.org/3/library/argparse.html): CLIサブコマンド実装に利用。

# 利用例
- ターミナルから `python legacy_support_alert.py trigger` で即座に通知。
- `periodic` サブコマンドで一定間隔ごとに通知を発火。

# 注意点
- 通知履歴はメモリ上のみで永続化しません。
- 実際のサポート終了情報とは無関係です。

# 設計方針
- 実環境やデータを変更しない安全設計。
- 通知内容は完全ランダム・固定リストから選択。
- CLI/エディタからの呼び出し両対応。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-fake-legacy-support-alert .agents/skills/random-os-fake-legacy-support-alert

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

3. ファイル配置確認

ls .agents/skills/random-os-fake-legacy-support-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 との連携設計はどうあるべきか?
  • 通知が想定通りランダムで発火するか、内容が毎回レガシー&無意味か、本体環境やデータを一切変更しない安全設計か?

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

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

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

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

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