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の説明に追われる流れを、意図的に崩してリズムを作り直せる
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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
