Codexでデスクトップ通知を活用して作業中の意外な気分転換を実現する方法

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

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

AI coding workflow を日々回していると、集中が続く一方で「無機質なデスクトップ」「単調な通知」「作業に没頭しすぎて context を見失う」といった悩みがつきまといます。特に Codex を活用していると、context や repository understanding の維持に気を取られがちで、ふとした瞬間に気が抜けることも。そんな時、遊び心やちょっとした混乱が欲しくなる瞬間、ありませんか?

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

さらに、「通知・演出・OS連携」系の悩みとしては、デスクトップ通知が全て業務的で、遊び心やリフレッシュ要素が皆無だと感じることも多いでしょう。作業中に突如現れる“謎のノイズ”が、逆に集中力や発想の切り替えに役立つこともあります。

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

一言サマリ: このスキルは、作業中のデスクトップに完全ランダムな“謎のOSメモ”を通知として投下し、シュールな混乱と遊び心を演出します。

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

  • AI coding workflow の単調さを和らげ、突発的な“謎メモ”で気分転換やリフレッシュができる
  • Codex の通知体験に遊び心を加え、長時間 session でも新鮮さや意外性を維持できる
  • repository understanding や path management の合間に、意味不明な怪文書が現れ、思わず二度見してしまう
  • monorepo 作業や長時間 context の中で、突如シュールな演出が挟まることで、集中の“間”を作れる
  • 日常的な通知・演出体験を「退屈」から「ちょっとした混乱」へ変えられる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-desktop-fake-os-memo .agents/skills/random-desktop-fake-os-memo

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

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

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


# /skills menu or random-desktop-fake-os-memo mention
> プロジェクト開始

[通知] 謎のOSメモ: 「冷蔵庫にプリンあり」
[通知] 謎のOSメモ: 「このディレクトリには何もない。たぶん。」
[通知] 謎のOSメモ: 「バグは空から降ってくる」
(以降、作業中にも完全ランダムで怪文書通知が投下される)

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


> packages/core から packages/ui に移動

[通知] 謎のOSメモ: 「上司が見ている」
[通知] 謎のOSメモ: 「謎の引き出しを開けるな」
[通知] 謎のOSメモ: 「このpackageは宇宙の法則に従っていません」
(作業ディレクトリや context に関係なく、意味不明な内容が突然現れる)

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


> 今日は集中できないな…

[通知] 謎のOSメモ: 「あなたは今、観察されている」
[通知] 謎のOSメモ: 「README.mdを読むときは静かに」
[通知] 謎のOSメモ: 「この通知に意味はありません」
(通知内容は毎回完全ランダムで、実用性ゼロの怪文書感だけが残る)

before / after の違い

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

発動方式

明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

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

.agents/skills/random-desktop-fake-os-memo/
├── SKILL.md
├── scripts/
│   └── random_desktop_fake_os_memo.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_desktop_fake_os_memo.py 謎のOSメモをデスクトップ通知で表示するスキル (random-desktop-fake-os-memo)
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-desktop-fake-os-memo
description: 作業中や定期的なタイミングで、Codexがユーザーのデスクトップに意味不明な“謎OSメモ”を通知する際に発動。通知・演出・OS連携カテゴリのタスクや、/skills menuやrandom-desktop-fake-os-memoの明示呼び出し時も対応。
---

# 機能概要
このSkillは、ユーザーの作業中や任意のタイミングで、まるで謎のOSからの警告やメモのような意味不明な通知をデスクトップに表示します。通知内容は完全ランダムで「冷蔵庫にプリンあり」「バグは空から降ってくる」「謎の引き出しを開けるな」など、実用性ゼロの怪文書ばかり。集中している時ほど思わず二度見してしまう、シュールな混乱と遊び心をデスクトップに演出します。

# 使い方
- 明示呼び出し例: `/skills menu` で一覧から選択、または `$random-desktop-fake-os-memo` と入力して即時発動
- 暗黙発動キーワード例: 「通知」「演出」「デスクトップ」「遊び」「意味不明」「OSメモ」などを含むタスクや会話中に自動発動

# 出力例
```terminal
[通知] 謎のOSメモ: 冷蔵庫にプリンあり
[通知] 謎のOSメモ: 上司が見ている
[通知] 謎のOSメモ: バグは空から降ってくる
[通知] 謎のOSメモ: 謎の引き出しを開けるな
[通知] 謎のOSメモ: 今日は何曜日でもない
[通知] 謎のOSメモ: そのファイルはもう存在しない
```

# 注意点
- 通知内容は毎回完全ランダムで、実用性や意味は一切ありません。
- 通知履歴や内容はローカル保存されません。
- 通知APIのみを利用し、システム設定やファイルには影響しません。
- OSごとに通知の見え方が異なる場合があります。

# 参考資料
- [Python公式: notifications](https://docs.python.org/3/library/subprocess.html)
- references/design_notes.md 参照

scripts/random_desktop_fake_os_memo.py

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

def get_random_memo() -> str:
    memos = [
        "冷蔵庫にプリンあり",
        "上司が見ている",
        "バグは空から降ってくる",
        "謎の引き出しを開けるな",
        "今日は何曜日でもない",
        "そのファイルはもう存在しない",
        "未確認のウィンドウが開いています",
        "メモリが夢を見ています",
        "この通知は幻です",
        "あなたのPCは今、観察されています",
        "デバッグは明日から",
        "ログインしていないのにログアウトしました",
        "OSが自我を持ち始めています",
        "謎のプロセスが増殖中",
        "プリンターが脱走しました",
        "このメモは自動で消滅しません",
        "キーボードが逆立ちしています",
        "ウィンドウの外に何かいる",
        "今日は再起動しないでください",
        "コーヒーをこぼさないでください",
        "ファイルがどこかに旅立ちました",
        "あなたのタスクは未定義です",
        "この通知に意味はありません",
        "次の通知をお楽しみに",
        "OSの気まぐれです",
        "謎の引数が渡されました",
        "仮想メモリが現実逃避中",
        "マウスが迷子です",
        "再起動しなくても大丈夫です",
        "このメモはバグではありません"
    ]
    return random.choice(memos)

def send_notification(title: str, message: str):
    current_os = platform.system()
    try:
        if current_os == "Darwin":  # macOS
            subprocess.run([
                "osascript", "-e",
                f'display notification "{message}" with title "{title}"'
            ], check=True)
        elif current_os == "Linux":
            subprocess.run([
                "notify-send", title, message
            ], check=True)
        elif current_os == "Windows":
            # Use Toast notification via powershell
            powershell_script = f"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null; " \
                               f"$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02); " \
                               f"$textNodes = $template.GetElementsByTagName(\"text\"); " \
                               f"$textNodes.Item(0).AppendChild($template.CreateTextNode(\"{title}\")) > $null; " \
                               f"$textNodes.Item(1).AppendChild($template.CreateTextNode(\"{message}\")) > $null; " \
                               f"$toast = [Windows.UI.Notifications.ToastNotification]::new($template); " \
                               f"$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier(\"RandomMemoSkill\"); " \
                               f"$notifier.Show($toast);"
            subprocess.run([
                "powershell", "-Command", powershell_script
            ], check=True)
        else:
            print(f"[通知] {title}: {message}")
    except Exception as e:
        print(f"通知エラー: {e}")

def list_memos():
    print("=== 謎のOSメモ候補一覧 ===")
    for idx, memo in enumerate(get_all_memos(), 1):
        print(f"{idx:02d}: {memo}")

def get_all_memos() -> List[str]:
    return [
        "冷蔵庫にプリンあり",
        "上司が見ている",
        "バグは空から降ってくる",
        "謎の引き出しを開けるな",
        "今日は何曜日でもない",
        "そのファイルはもう存在しない",
        "未確認のウィンドウが開いています",
        "メモリが夢を見ています",
        "この通知は幻です",
        "あなたのPCは今、観察されています",
        "デバッグは明日から",
        "ログインしていないのにログアウトしました",
        "OSが自我を持ち始めています",
        "謎のプロセスが増殖中",
        "プリンターが脱走しました",
        "このメモは自動で消滅しません",
        "キーボードが逆立ちしています",
        "ウィンドウの外に何かいる",
        "今日は再起動しないでください",
        "コーヒーをこぼさないでください",
        "ファイルがどこかに旅立ちました",
        "あなたのタスクは未定義です",
        "この通知に意味はありません",
        "次の通知をお楽しみに",
        "OSの気まぐれです",
        "謎の引数が渡されました",
        "仮想メモリが現実逃避中",
        "マウスが迷子です",
        "再起動しなくても大丈夫です",
        "このメモはバグではありません"
    ]

def notify_once():
    memo = get_random_memo()
    send_notification("謎のOSメモ", memo)
    print(f"[通知] 謎のOSメモ: {memo}")

def notify_loop(interval: int, count: int):
    for i in range(count):
        memo = get_random_memo()
        send_notification("謎のOSメモ", memo)
        print(f"[通知] 謎のOSメモ: {memo}")
        if i < count - 1:
            time.sleep(interval)

def main():
    parser = argparse.ArgumentParser(
        description="謎のOSメモをデスクトップ通知で表示するスキル (random-desktop-fake-os-memo)"
    )
    subparsers = parser.add_subparsers(dest="command", help="サブコマンド")

    parser_notify = subparsers.add_parser("notify", help="1回だけ謎メモを通知")
    parser_notify.add_argument("-n", "--number", type=int, default=1, help="通知回数 (デフォルト: 1)")
    parser_notify.add_argument("-i", "--interval", type=int, default=5, help="通知間隔(秒, デフォルト: 5)")

    parser_list = subparsers.add_parser("list", help="全メモ候補を一覧表示")

    args = parser.parse_args()

    if args.command == "notify":
        if args.number <= 1:
            notify_once()
        else:
            notify_loop(args.interval, args.number)
    elif args.command == "list":
        list_memos()
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

references/design_notes.md

# 概要
このSkillは、ユーザーのデスクトップに意味不明な“謎OSメモ”を定期的または任意タイミングで通知し、作業中の集中にシュールな混乱と遊び心をもたらします。実用性ゼロの怪文書で、通知内容は完全ランダムです。

# 公式ドキュメント抜粋
- macOS: `osascript`で通知表示 ([AppleScript通知公式](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html))
- Linux: `notify-send` ([freedesktop.org](https://specifications.freedesktop.org/notification-spec/latest/))
- Windows: PowerShellでToast通知 ([Microsoft Docs](https://learn.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/send-local-toast))

# 利用例
- `/skills menu`や`random-desktop-fake-os-memo notify`で即時発動
- 作業中に定期的なシュール通知で気分転換

# 注意点・設計方針
- 通知内容は毎回完全ランダムで、履歴やローカル保存は行いません。
- OSごとに通知APIを自動判別し、システム設定やファイルには一切影響しません。
- 実用性や意味は一切なく、純粋な演出・遊び用途に特化しています。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-desktop-fake-os-memo .agents/skills/random-desktop-fake-os-memo

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

3. ファイル配置確認

ls .agents/skills/random-desktop-fake-os-memo
# 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 との連携設計はどうあるべきか?
  • 通知内容が毎回完全ランダムであるか?
  • 本当に意味不明な内容か(実用性ゼロの怪文書感が出ているか)
  • 短時間で組めるか(通知APIのみ利用で十分か)

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

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

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

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

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