Codexで謎のうざ通知を再現する演出構築ガイド

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

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

AI coding workflow を日々活用する中で、Codex ユーザーには「通知・演出・OS連携」領域で独特の“あるある”がつきまといます。作業に集中しているタイミングで、なぜか余計な OS の通知やツールチップが現れ、気が散ってしまう経験は多いはずです。
また、repository understanding や path management の文脈でも、思わぬタイミングで context が切り替わったり、記憶していたはずの directory 構造が曖昧になったりすることが頻発します。こうした“助けにならないヘルプ”や“謎のお節介通知”は、実はオンボーディングや記憶リフレッシュのきっかけにもなり得る一方、日常的には「また来たか…」と苦笑いしてしまう存在です。

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

このSkillは、そんな「うざいけどどこか懐かしい」OS風ツールチップ通知をあえて現代のAI開発環境に復活させ、日々の作業に小さな笑いとリズムをもたらします。

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

一言サマリ: このスキルは、AIコーディング中に“謎のOS風うざいツールチップ”をデスクトップ通知で炸裂させ、作業環境に小ネタとリフレッシュを提供する Skill。

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

  • 集中しすぎて context や directory を見失いがちなタイミングで、意図的に“お節介”な通知が入り、リズムをリセットできる
  • monorepo や複雑な repository での path management の合間に、笑えるツールチップが流れ、チーム内コミュニケーションのきっかけになる
  • AI coding workflow の長時間作業で stale context に陥りそうな時、無駄に“役立たない”通知が挟まり、気分転換や雑談のネタになる
  • onboarding や session 再開時にも、OS風通知で「また来たか」と話題を提供、チームの雰囲気を和らげる
  • Codex の context 記憶や repo 理解の流れの中に、あえて“無駄な演出”を差し込み、日々のルーチンにアクセントを加える
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-annoying-tooltips .agents/skills/random-os-annoying-tooltips

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

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

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


# /skills menu or random-os-annoying-tooltips mention
> プロジェクトを開いて作業開始

[通知] CapsLockが押されているかもしれません。意図的ですか?
[通知] 今このタイミングでアップデートしませんか?(推奨)
[通知] あなたの入力速度、最近落ちてませんか?
[通知] この directory は本当に必要ですか?: src/utils/
[通知] コーヒーブレイクの時間かもしれません。

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


> packages/auth/ から packages/api/ へ移動

[通知] packages/api/ への移動を検知しました。依存関係、ちゃんと把握していますか?
[通知] そのコード、もしかして昨日も書きませんでしたか?
[通知] node_modules/ の肥大化にご注意ください。
[通知] package.json の scripts、見直してみませんか?

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


> 何もしていないのに Skill を明示呼び出し

[通知] 何もしていないのに通知が出ています。ご安心ください。
[通知] あなたが最後に push したのは3時間前です。
[通知] そろそろ README.md を更新しませんか?
[通知] この通知はあなたの productivity とは無関係です。

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

.agents/skills/random-os-annoying-tooltips/
├── SKILL.md
├── scripts/
│   └── random_os_annoying_tooltips.py
└── references/
    └── design_notes.md

各ファイルの役割

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

SKILL.md

---
name: random-os-annoying-tooltips
description: 作業中や集中時、または/skillsコマンド実行時などに“OS風うざいツールチップ”をデスクトップ通知で発動します。通知・演出・OS連携カテゴリで、random, annoying, tooltip, notification, OS, desktop などのキーワードに反応します。
---

# 機能概要
このSkillは、ユーザーの作業中やコマンド実行時に、あえて“OS風のうざいツールチップ”をデスクトップ通知として表示します。内容は「CapsLockが押されているかもしれません」「アップデートのタイミングです」「あなたの入力速度、気づいてますか?」など、誰得な小言や謎の提案ばかり。懐かしの“助けにならないヘルプ”体験を現代に再現し、職場や作業環境に小さな笑いとイライラを提供します。

# 使い方
- 明示呼び出し: `/skills random-os-annoying-tooltips` または `@codex random-os-annoying-tooltips`
- 暗黙発動: 「random」「tooltip」「notification」「OS」「desktop」「annoying」などのキーワードを含む会話やコマンド、または一定時間作業が続いた際に自動発動

# 出力例
```
[通知] CapsLockが押されているかもしれません。
[通知] 今アップデートしませんか?(推奨: 今すぐ再起動)
[通知] あなたの入力速度、気づいてますか?
[通知] ファイルを保存していないようです。
[通知] ネットワークが不安定かもしれません。
[通知] システムの空き容量が残りわずかです。
```

# 注意点
- 通知は主要OS(Windows, macOS, Linux)で動作する標準APIのみ利用し、環境依存を極力排除しています
- 通知頻度は1分以上の間隔を設け、過剰な連発は防止
- ローカルにデータは保存しません
- 一部環境で通知が表示されない場合があります

# 参考資料
- [plyer通知API公式ドキュメント](https://plyer.readthedocs.io/en/latest/#plyer.notification.notification)
- references/design_notes.md も参照

scripts/random_os_annoying_tooltips.py

import sys
import time
import random
import argparse
from datetime import datetime, timedelta

try:
    from plyer import notification
except ImportError:
    print('plyerパッケージが必要です。pip install plyer でインストールしてください。')
    sys.exit(1)

TOOLTIPS = [
    'CapsLockが押されているかもしれません。',
    '今アップデートしませんか?(推奨: 今すぐ再起動)',
    'あなたの入力速度、気づいてますか?',
    'ファイルを保存していないようです。',
    'ネットワークが不安定かもしれません。',
    'システムの空き容量が残りわずかです。',
    'この操作は本当に必要ですか?',
    'バッテリー残量が気になりませんか?',
    '定期的な休憩をおすすめします。',
    'マウスの動きが少ないようです。',
    'ウイルススキャンの時期です。',
    '設定を初期化しますか?',
    'ログイン情報を再入力してください。',
    'プリンタが接続されていません。',
    '重要な更新プログラムがあります。',
    '時計がずれている可能性があります。',
    'クラウド同期が停止しています。',
    '新しいデバイスを検出しました。',
    '古いファイルがゴミ箱に残っています。',
    'タスクバーがいっぱいです。'
]

MIN_INTERVAL = 60  # 秒
LAST_NOTIFY_FILE = '/tmp/random_os_annoying_tooltips_last_notify.txt'


def can_notify():
    try:
        with open(LAST_NOTIFY_FILE, 'r') as f:
            last = float(f.read().strip())
            if time.time() - last < MIN_INTERVAL:
                return False
    except Exception:
        pass
    return True

def update_last_notify():
    try:
        with open(LAST_NOTIFY_FILE, 'w') as f:
            f.write(str(time.time()))
    except Exception:
        pass

def show_tooltip(msg=None, dry_run=False):
    if not can_notify():
        return False
    if msg is None:
        msg = random.choice(TOOLTIPS)
    if dry_run:
        print(f'[通知] {msg}')
    else:
        notification.notify(
            title='OSからのお知らせ',
            message=msg,
            app_name='random-os-annoying-tooltips',
            timeout=6
        )
    update_last_notify()
    return True

def list_tooltips():
    for i, msg in enumerate(TOOLTIPS, 1):
        print(f'{i:2d}: {msg}')

def summary():
    print('=== random-os-annoying-tooltips summary ===')
    print(f'通知候補数: {len(TOOLTIPS)}')
    try:
        with open(LAST_NOTIFY_FILE, 'r') as f:
            last = float(f.read().strip())
            last_dt = datetime.fromtimestamp(last)
            print(f'前回通知: {last_dt.strftime("%Y-%m-%d %H:%M:%S")}
(最小間隔: {MIN_INTERVAL}秒)')
    except Exception:
        print('前回通知: 不明')
    print('通知間隔制御: あり')
    print('環境依存: plyer通知API (主要OS対応)')

def main():
    parser = argparse.ArgumentParser(description='random-os-annoying-tooltips: OS風うざい通知を表示')
    subparsers = parser.add_subparsers(dest='command')

    parser_notify = subparsers.add_parser('notify', help='即座にうざい通知を1つ表示')
    parser_notify.add_argument('--dry-run', action='store_true', help='実際には通知せずstdoutに出力')
    parser_notify.add_argument('--msg', type=str, help='通知メッセージを指定')

    parser_list = subparsers.add_parser('list', help='通知候補一覧を表示')
    parser_summary = subparsers.add_parser('summary', help='通知履歴と設定概要を表示')
    parser_run = subparsers.add_parser('run', help='一定間隔で自動的にうざい通知を表示')
    parser_run.add_argument('--interval', type=int, default=300, help='通知間隔(秒, デフォルト5分)')
    parser_run.add_argument('--dry-run', action='store_true', help='実際には通知せずstdoutに出力')

    args = parser.parse_args()

    if args.command == 'notify':
        show_tooltip(msg=args.msg, dry_run=args.dry_run)
    elif args.command == 'list':
        list_tooltips()
    elif args.command == 'summary':
        summary()
    elif args.command == 'run':
        print('random-os-annoying-tooltips: 自動通知モード開始')
        try:
            while True:
                if can_notify():
                    show_tooltip(dry_run=args.dry_run)
                time.sleep(args.interval)
        except KeyboardInterrupt:
            print('\n自動通知モード終了')
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、ユーザーの作業中に“OS風うざい通知”を意図的に挿入し、ユーモアと懐かしさを演出します。実際のシステムに害を与えず、通知APIのみを利用します。

# 公式ドキュメント抜粋
通知機能は[plyer](https://plyer.readthedocs.io/en/latest/#plyer.notification.notification)のnotification.notifyを使用し、主要OSでの互換性を確保しています。

# 利用例
- 明示呼び出し: `/skills random-os-annoying-tooltips notify`
- 自動発動: `run`サブコマンドで一定間隔ごとに通知
- コマンドラインから `python random_os_annoying_tooltips.py notify` で単発通知

# 注意点
- 通知間隔は1分以上に制限し、過剰な連発を防止
- 通知内容は完全に無害で実害なし
- 一部Linux環境では通知が表示されない場合あり

# 設計方針
- OS依存APIを避け、plyerでクロスプラットフォーム化
- ローカルファイルで最終通知時刻を管理し、頻度を制御
- ユーモアと“うざさ”のバランスを重視

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-annoying-tooltips .agents/skills/random-os-annoying-tooltips

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

3. ファイル配置確認

ls .agents/skills/random-os-annoying-tooltips
# 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をコピーしました!
目次