Codexで作業中に謎の古代詩通知を楽しむ使いこなし術

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

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

開発現場でCodexと向き合っていると、集中力やリズムを保つのが意外と難しいと感じることが多い。特に、長時間のAI coding workflowや、巨大なmonorepoでの作業では、思わぬ形で「飽き」や「マンネリ」が忍び寄ってくる。通知や演出系のSkillが欲しくなる瞬間は、こんな悩みが背景にある。

  • Codex が context を見失って違う場所のコードを参照するたび、思わず気が抜けてしまう
  • monorepo で package を跨いだ瞬間、Codex の repository understanding が途切れてリズムが崩れる
  • 長時間のAI coding workflowで、long contextが膨らみ重要な情報が埋もれてしまい、集中力が途切れる
  • session 再開時に毎回 repository や directory 構造を説明し直すのが単調で、作業が機械的になりがち
  • path managementやrepo構造の説明に気を取られ、気分転換や遊び心を挟む余裕がなくなる

このような状況で、ちょっとした“知的混乱”や笑いが走る演出があれば、気分転換にもなり、作業のリズムも整いやすい。

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

一言サマリ: このスキルは、作業中に突如現れる“OS古代詩通知”で、Codexユーザーの単調な開発リズムに知的な刺激と笑いをもたらします。

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

  • 長時間のAI coding workflow中、ランダムなタイミングで“謎の古文調ポエム”通知が現れ、集中力のリフレッシュや気分転換に
  • monorepoや複雑なrepository作業の合間に、contextの切り替えタイミングで知的な遊び心が挟まり、作業のマンネリ化を防ぐ
  • session再開やonboarding時、ちょっとした演出でチーム内の会話やコミュニケーションのきっかけになる
  • Codexのmemoryやcontextが長くなりがちな場面でも、ランダム性のある演出で“今”を意識しやすくなる
  • path managementやrepository understandingの説明に追われる流れを、意図的に崩してリズムを作り直せる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/random-os-fake-ancient-poem-notifier .agents/skills/random-os-fake-ancient-poem-notifier

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


# /skills menu or random-os-fake-ancient-poem-notifier

[OS Notification]
古代詩:西のコードベースにバグの風そよぐ
今宵、repositoryの彼方より、静かなる修正の声響く。

作業ディレクトリ: /project/src
本日の開発、いざ始めん。

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


> move to packages/user-auth

[OS Notification]
詩文:パッケージの境界にて
「authの森に迷いし時、contextは己に問う」

monorepoの流れ変わりぬ、package移動の折に。

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


> /skills menu

[OS Notification]
偽古文:あなたのShiftキー、今宵は静かに眠るべし
エラーも警告も、詩となりて流れ行く。

次なるコマンドを、詩心とともに。

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

.agents/skills/random-os-fake-ancient-poem-notifier/
├── SKILL.md
├── scripts/
│   └── random_poem_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_poem_notifier.py Random OS Fake Ancient Poem Notifier
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-ancient-poem-notifier
description: 作業中やコマンド入力時など、ユーザーの集中が続くタイミングで、完全ランダムな“古文調・詩体”の謎通知をOSの通知機能やターミナル上に表示します。通知内容は作業内容やエラーと無関係で、知的混乱や笑いを演出します。triggerType: semantic-or-explicit。
---

# 機能概要
このSkillは、現代の開発現場に“古代文学の風”を吹き込むための通知・演出ツールです。作業中やコマンド実行時など、集中が高まる瞬間に、完全ランダムな“OS古代詩通知”をデスクトップやターミナルに表示します。通知内容は「西のコードベースにバグの風そよぐ」「あなたのShiftキー、今宵は静かに眠るべし」など、万葉集や古典文学を模した謎ポエム。作業内容やエラー情報とは一切関係なく、ユーザーの集中力を絶妙にそらし、知的混乱と笑いをもたらします。

# 使い方
- 明示呼び出し例:`python random_poem_notifier.py notify` または Skillメニューから直接発動
- 暗黙発動キーワード例:`/skills menu` や `$random-os-fake-ancient-poem-notifier` へのメンション
- CLIサブコマンドで`list`(詩リスト表示)、`summary`(発動履歴要約)も利用可能

# 出力例
```
[OS Poem Notification]
東のメモリ、静かに溢れぬ
バグの風、夜半にささやく
あなたのShiftキー、今宵は眠るべし

[OS Poem Notification]
西のコードベースに、霧立ちこめる
エラーの影、そっと忍び寄る

[OS Poem Notification]
デバッグの灯、朝焼けに消えて
古の関数、夢に現る
```

# 注意点
- 通知内容は完全にランダム生成され、実際のシステム状況や作業内容とは無関係です。
- ローカルに通知履歴を保存しますが、個人情報やコード内容は記録しません。
- 通知はOSの標準通知API(Windows: Toast, macOS: AppleScript, Linux: notify-send)を利用します。
- 本Skillは実際のエラー通知やシステム警告とは無関係です。

# 参考資料
- references/design_notes.md
- [notify2公式ドキュメント](https://github.com/caronc/apprise)
- [AppleScript通知参考](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html)
- [Pythonサブコマンド実装例](https://docs.python.org/ja/3/library/argparse.html)

scripts/random_poem_notifier.py

import sys
import os
import platform
import random
import argparse
import json
import subprocess
from datetime import datetime

POEMS = [
    [
        "東のメモリ、静かに溢れぬ",
        "バグの風、夜半にささやく",
        "あなたのShiftキー、今宵は眠るべし"
    ],
    [
        "西のコードベースに、霧立ちこめる",
        "エラーの影、そっと忍び寄る"
    ],
    [
        "デバッグの灯、朝焼けに消えて",
        "古の関数、夢に現る"
    ],
    [
        "ifの彼方、elseの彼方",
        "無限ループの渦に沈む",
        "breakの声、誰も知らず"
    ],
    [
        "コンパイルの鐘、夕暮れに響く",
        "未定義の変数、野に咲き乱る"
    ],
    [
        "ログの海、舟を漕ぎ出す",
        "警告の波、岸を洗う"
    ],
    [
        "関数の森、深く迷いぬ",
        "returnの道、遠く霞みて"
    ],
    [
        "コメントの雲、空を覆いて",
        "仕様の星、夜に瞬く"
    ],
    [
        "あなたのCtrlキー、静かに光る",
        "未踏のバグ、夢に現る"
    ],
    [
        "エディタの窓、風が通りぬ",
        "古のバージョン、今も眠る"
    ]
]

HISTORY_FILE = os.path.expanduser("~/.random_os_fake_ancient_poem_history.json")


def show_notification(title, message):
    system = platform.system()
    if system == "Darwin":
        script = f'display notification "{message}" with title "{title}"'
        subprocess.run(["osascript", "-e", script])
    elif system == "Linux":
        try:
            subprocess.run(["notify-send", title, message])
        except FileNotFoundError:
            print(f"[WARN] notify-send not found. Showing in terminal.")
            print(f"[{title}]\n{message}")
    elif system == "Windows":
        try:
            from win10toast import ToastNotifier
            toaster = ToastNotifier()
            toaster.show_toast(title, message, duration=6)
        except ImportError:
            print(f"[{title}]\n{message}")
    else:
        print(f"[{title}]\n{message}")


def random_poem():
    poem = random.choice(POEMS)
    return "\n".join(poem)


def save_history(poem):
    entry = {
        "timestamp": datetime.now().isoformat(),
        "poem": poem
    }
    history = []
    if os.path.exists(HISTORY_FILE):
        try:
            with open(HISTORY_FILE, "r", encoding="utf-8") as f:
                history = json.load(f)
        except Exception:
            history = []
    history.append(entry)
    try:
        with open(HISTORY_FILE, "w", encoding="utf-8") as f:
            json.dump(history, f, ensure_ascii=False, indent=2)
    except Exception as e:
        print(f"[WARN] 履歴保存に失敗: {e}")


def list_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴はありません。")
        return
    try:
        with open(HISTORY_FILE, "r", encoding="utf-8") as f:
            history = json.load(f)
        for i, entry in enumerate(history[-10:]):
            print(f"[{entry['timestamp']}]\n{entry['poem']}\n")
    except Exception as e:
        print(f"[ERROR] 履歴の読み込みに失敗: {e}")


def summary_history():
    if not os.path.exists(HISTORY_FILE):
        print("履歴はありません。")
        return
    try:
        with open(HISTORY_FILE, "r", encoding="utf-8") as f:
            history = json.load(f)
        print(f"発動回数: {len(history)}")
        if history:
            first = history[0]['timestamp']
            last = history[-1]['timestamp']
            print(f"最初の発動: {first}")
            print(f"最新の発動: {last}")
    except Exception as e:
        print(f"[ERROR] 履歴の読み込みに失敗: {e}")


def main():
    parser = argparse.ArgumentParser(description="Random OS Fake Ancient Poem Notifier")
    subparsers = parser.add_subparsers(dest="command")
    
    notify_parser = subparsers.add_parser("notify", help="ランダムな古代詩通知を発動")
    list_parser = subparsers.add_parser("list", help="最近の詩通知履歴を表示")
    summary_parser = subparsers.add_parser("summary", help="通知発動履歴の要約")

    args = parser.parse_args()
    if args.command == "notify":
        poem = random_poem()
        show_notification("OS Poem Notification", poem)
        save_history(poem)
    elif args.command == "list":
        list_history()
    elif args.command == "summary":
        summary_history()
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発者の作業現場にユーモアと知的混乱をもたらすため、完全に無関係な“古文調”の詩をOS通知やターミナルに表示するものです。内容は作業やエラーと無関係で、集中力を和らげる効果を狙っています。

# 公式ドキュメント抜粋
- [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/)

# 利用例
- 長時間作業中のリフレッシュや、チーム内での話題作りに。
- /skills menuや明示的な呼び出しで、いつでも発動可能。

# 注意点
- 通知内容は完全ランダムで、実際のシステム状態やエラーとは無関係です。
- OS通知APIが利用できない場合はターミナル出力にフォールバックします。
- 履歴はユーザーのホームディレクトリに保存されますが、個人情報やコード内容は含みません。

# 設計方針
- OSごとの通知APIを自動判別し、失敗時は標準出力に切り替えます。
- サブコマンドで履歴閲覧や発動回数要約も可能とし、CLIツールとしても活用できます。

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/random-os-fake-ancient-poem-notifier .agents/skills/random-os-fake-ancient-poem-notifier

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

3. ファイル配置確認

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