Codex ユーザーが日常でぶつかる悩み
AI コーディングエージェント Codex を使っていると、日々の開発フローのなかで「またか」と思う瞬間が少なくありません。特にエラー通知や context 管理にまつわるストレスは、意外と積み重なります。
- エラー通知が毎回同じで、作業中に心が折れそうになる
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
特に「通知・演出・OS連携」まわりでは、単調なエラー表示や無機質なアラートに飽きてしまい、作業効率やモチベーションにも影響が出ることがあります。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex のエラー通知に和風のユーモアと意外性を加え、開発者の心をリセットする Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- エラー発生時に毎回異なる俳句がデスクトップや画面端に現れ、単調なエラー通知に変化と余白が生まれる
- 長時間の AI coding workflow でも、唐突な和風演出で context のリフレッシュや気分転換ができる
- repo や directory の作業境界を跨いだタイミングで、思わず笑ってしまう「謎のOS公式感」演出が入る
- オンボーディングや session 再開時の緊張感を和らげ、記憶に残る開発体験を提供
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-fake-error-haiku-notifier .agents/skills/random-os-fake-error-haiku-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu で random-os-fake-error-haiku-notifier を選択
> 開発を始めます
[通知] 「バグの香や 春まだ遠き デバッグ道」
(OS公式風の通知バナーが画面右下に表示される)
Codex: プロジェクト context をロードしました。
repository: /Users/you/projects/awesome-monorepo
directory: packages/core
memory: session initialized
(俳句通知は10秒ほどで自動的に消えます)
シーン2: monorepo / package 跨ぎ作業時
> cd packages/utils
[通知] 「エラーにも 静けさありて コード書く」
(画面端に和風な通知が現れる)
Codex: directory context updated.
repository understanding: packages/utils
path management: switched
(俳句は毎回ランダムに変わる)
シーン3: お遊び的な使い方
> 間違えて main.py を消してしまった
[通知] 「消えしファイル 思い出だけが 残る夜」
(謎のOS公式感のある通知俳句がポップアップ)
Codex: ファイルが見つかりません。
memory: error logged
(俳句で一瞬和むが、エラー内容とは一切関係がない)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元しつつ、俳句通知で和む |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識しつつ、唐突な俳句通知でリフレッシュ |
| 長時間 workflow | long context で重要箇所が薄まる | 定期的な俳句通知で気分転換、stale context をリセットしやすい |
発動方式
明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (エラーや directory 境界のイベントに自動反応) の両方に対応しています。
Skill の中身を全部見せる
.agents/skills/random-os-fake-error-haiku-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-fake-error-haiku-notifier/
├── SKILL.md
├── scripts/
│ └── haiku_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/haiku_notifier.py |
Cross-platform notification. |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-error-haiku-notifier
description: ターミナルやエディタ上でエラーや例外発生時、または /skills menu など明示コマンド時に、完全ランダムな和風エラー俳句をデスクトップ通知で表示します。通知・演出・OS連携用途に適します。
---
# 機能概要
このSkillは、開発中のエラー発生時や明示呼び出し時に、実際のエラー内容とは無関係な“謎のOS公式・エラー俳句”をデスクトップ通知として表示します。俳句は毎回ランダム生成され、作業中の緊張感を和らげたり、意表を突く和風演出で開発者の心に一瞬の静けさと混乱をもたらします。真面目なエラー通知に飽きた方や、チームの雰囲気を和らげたい場面に最適です。
# 使い方
- 明示呼び出し: `/skills menu` から本Skillを選択、または `$random-os-fake-error-haiku-notifier` を直接実行
- 暗黙発動: ターミナルやエディタで `Traceback`、`Exception`、`error:` などのキーワードを含むエラー出力が発生した際、自動的に俳句通知が表示されます。
# 出力例
```terminal
$ python myscript.py
Traceback (most recent call last):
File "myscript.py", line 3, in <module>
raise ValueError("fail")
ValueError: fail
[OS通知]
デバッグ道
夜更けに響く
バグの声
```
# 注意点
- 本Skillはエラー内容を解析せず、俳句のみをランダム表示します。
- 通知は一時的(約5秒)で自動消去され、ログ等には保存されません。
- OSの通知機能(python標準または`plyer`等)を利用しますが、環境によって通知表示に制限がある場合があります。
- ローカル保存や履歴取得機能はありません。
# 参考資料
- [Python plyer通知ドキュメント](https://plyer.readthedocs.io/en/latest/)
- references/design_notes.md 参照
scripts/haiku_notifier.py
import sys
import argparse
import random
import platform
import subprocess
import time
try:
from plyer import notification
PLYER_AVAILABLE = True
except ImportError:
PLYER_AVAILABLE = False
HAIKU_LIST = [
"バグの香や\n春まだ遠き\nデバッグ道",
"夜のバグ\n静けさ破る\n警告音",
"エラー出て\nまた一歩ずつ\n成長す",
"ifの闇\nelseの迷い\n朝が来る",
"落ちるコード\n桜のごとし\n散り急ぐ",
"例外に\n心惑いて\nリファクタ",
"デバッグ道\n夜更けに響く\nバグの声",
"未定義の\n変数を追って\n春遠し",
"文法エラー\n気付けば朝日\n窓の外",
"Stack trace\n流れる川の\nごとくなり"
]
DEFAULT_TITLE = "謎のOS公式・エラー俳句"
def pick_random_haiku():
return random.choice(HAIKU_LIST)
def send_notification(title, message, timeout=5):
"""
Cross-platform notification.
Prefer plyer, fallback to platform-specific methods.
"""
if PLYER_AVAILABLE:
notification.notify(title=title, message=message, timeout=timeout)
else:
system = platform.system()
if system == "Darwin":
# macOS: use osascript
script = f'display notification "{message}" with title "{title}"'
subprocess.run(["osascript", "-e", script])
elif system == "Linux":
# Linux: use notify-send
subprocess.run(["notify-send", title, message])
elif system == "Windows":
# Windows fallback (no plyer): use toast via powershell
ps_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"$template.GetElementsByTagName('text')[0].AppendChild($template.CreateTextNode('{title}')) > $null; " \
f"$template.GetElementsByTagName('text')[1].AppendChild($template.CreateTextNode('{message}')) > $null; " \
f"$toast = [Windows.UI.Notifications.ToastNotification]::new($template); " \
f"[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Python').Show($toast); "
subprocess.Popen(["powershell", "-Command", ps_script], shell=True)
else:
print(f"[通知] {title}\n{message}")
def detect_error_lines(lines):
error_keywords = ["Traceback", "Exception", "error:", "Error:", "エラー", "例外"]
for line in lines:
for kw in error_keywords:
if kw in line:
return True
return False
def haiku_notify(args):
haiku = pick_random_haiku()
send_notification(DEFAULT_TITLE, haiku)
print(f"[俳句通知] {haiku}")
def monitor_stdin(args):
"""Monitor stdin for error output and notify on error."""
buffer = []
try:
for line in sys.stdin:
buffer.append(line.rstrip())
sys.stdout.write(line)
sys.stdout.flush()
if detect_error_lines([line]):
haiku = pick_random_haiku()
send_notification(DEFAULT_TITLE, haiku)
print(f"[俳句通知] {haiku}")
time.sleep(0.5)
except KeyboardInterrupt:
pass
def list_haiku(args):
for i, h in enumerate(HAIKU_LIST, 1):
print(f"{i}.\n{h}\n")
def main():
parser = argparse.ArgumentParser(description="エラー発生時に謎の俳句をOS通知するSkill")
subparsers = parser.add_subparsers(dest="command")
parser_notify = subparsers.add_parser("notify", help="ランダム俳句を即時通知")
parser_notify.set_defaults(func=haiku_notify)
parser_monitor = subparsers.add_parser("monitor", help="標準入力を監視しエラー検知で俳句通知")
parser_monitor.set_defaults(func=monitor_stdin)
parser_list = subparsers.add_parser("list", help="内蔵俳句一覧を表示")
parser_list.set_defaults(func=list_haiku)
args = parser.parse_args()
if args.command is None:
parser.print_help()
sys.exit(1)
args.func(args)
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
本Skillは、エラー検知時に開発者の気分転換・和み・話題作りを目的として、完全ランダムな和風俳句をOS通知で表示します。エラー内容には一切依存せず、通知の演出性を重視しています。
# 公式ドキュメント抜粋
- Python通知ライブラリ `plyer` : https://plyer.readthedocs.io/en/latest/
- macOS: `osascript` で通知、Linux: `notify-send`、Windows: PowerShell経由でトースト通知
# 利用例
- `python haiku_notifier.py monitor < error.log` でエラー出力を監視し、エラー検知時に俳句通知
- `/skills menu` や `notify` サブコマンドで即時俳句通知
# 注意点
- 通知内容は俳句のみで、エラー内容や詳細は一切通知されません
- OS通知APIの仕様により、環境によっては通知が表示されない場合があります
- ログ保存や履歴機能はありません
# 設計方針
- 俳句リストは拡張可能
- 複数OS対応のため、plyer優先・なければOS標準APIを利用
- 開発現場に“和風カオス”な演出をもたらすことを主眼としています
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-fake-error-haiku-notifier .agents/skills/random-os-fake-error-haiku-notifier
.agents/skills/random-os-fake-error-haiku-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-fake-error-haiku-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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
