Codex ユーザーが日常でぶつかる悩み
Codex を日常的に使っていると、開発フローの合間や集中力が切れたタイミングでふとした息抜きを求めたくなる瞬間があります。しかし、通知や演出に関しては実用一辺倒のものが多く、遊び心やリラックスできる余白がほとんどありません。特に「通知・演出・OS連携」系の Skill は、真面目な用途ばかりが並びがちです。そんな中、作業の合間にちょっとした“無駄”や“笑い”が欲しいという気持ちに共感する人も多いはずです。
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
また、何か操作するたびに「本当に今これでいいのか?」と自問する場面や、思わず言い訳したくなるミスも多いものです。そんなとき、真面目な通知ではなく、全く根拠のない“言い訳”で少し肩の力を抜けたら…。このSkillは、そうした「無駄だけど癒やされる」瞬間を届けます。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の操作に合わせて「完全に根拠のない言い訳」をOSの通知領域に次々と表示し、作業の合間にクスッと笑える無駄な演出を提供します。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の合間に、完全に無意味な言い訳通知が届き、作業の緊張感が一瞬ほぐれる
- OSの通知領域に、毎回異なる context でランダムな言い訳が表示され、長時間の session も飽きずに続けられる
- monorepo の directory を移動したタイミングや、repository onboarding の際も、path management のストレスを和らげる演出が自動で挟まる
- 「また context を説明し直しか…」という面倒な瞬間に、どうでもいい言い訳通知が出て、気分転換になる
- Skill の存在自体がチーム内で話題になり、onboarding や repository understanding のアイスブレイクにも活用できる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-excuse-notifier .agents/skills/random-excuse-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu で random-excuse-notifier を有効化
[OS通知] ネットワークが不安定なので、今は全力を出せません。
[OS通知] 今日のマウスは気分屋です。
[OS通知] たぶん水星逆行中です。何か起きても仕方ありません。
> cd src/
[OS通知] コーヒーが切れたので、集中力は保証できません。
シーン2: monorepo / package 跨ぎ作業時
> cd packages/api/
[OS通知] APIパッケージは昨日から調子が悪いです。
[OS通知] 仕様書がどこかにいってしまったので、手探りです。
> cd ../frontend/
[OS通知] フロントエンドは気分で動きます。ご了承ください。
シーン3: お遊び的な使い方
> ls
[OS通知] ディレクトリが多すぎて目が回っています。
[OS通知] 今日は満月なので、挙動が変かもしれません。
> git status
[OS通知] Gitのご機嫌が斜めです。責任は持てません。
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-excuse-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-excuse-notifier/
├── SKILL.md
├── scripts/
│ └── random_excuse_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_excuse_notifier.py |
random-excuse-notifier: ターミナル操作ごとに言い訳通知を表示 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-excuse-notifier
description: Codexがターミナル操作やコマンド実行、/skills menuやrandom-excuse-notifierの明示呼び出し時に発動。通知・OS連携・演出系Skillとして、操作ごとにユーモラスな“言い訳”をOS通知領域へ表示します。
---
# 機能概要
random-excuse-notifierは、ターミナル操作やコマンド実行のたびに、全く根拠のない“言い訳”をOSの通知領域にランダム表示するSkillです。ネットワーク遅延や水星逆行、マウス不調など、思わず笑ってしまう言い訳が次々と現れ、作業の合間にユーモアを提供します。業務効率化や生産性向上には一切寄与しませんが、日々の作業にちょっとした遊び心を加えたい方に最適です。
# 使い方
- 明示呼び出し例:
- `/skills menu` から random-excuse-notifier を選択
- `$random-excuse-notifier` をターミナルで直接実行
- 暗黙発動キーワード例:
- ターミナルでコマンド実行時
- 「通知」「演出」「言い訳」などのキーワードを含む操作
# 出力例
```
$ ls
(通知)今日はネットが遅いみたいです。
$ git push
(通知)マウスが反応しませんでした。
$ random-excuse-notifier
(通知)水星逆行中なので仕方ありません。
$ echo hello
(通知)上司のせいです。
$ python script.py
(通知)たぶん宇宙線の影響です。
```
# 注意点
- OSの通知API(Windows: Toast, macOS: terminal-notifier, Linux: notify-send)を利用
- 通知はローカル端末でのみ表示され、履歴保存は行いません
- ネタが被りにくいよう十分なランダム性を確保していますが、完全な非重複は保証しません
- 通知機能が無効な環境では動作しません
# 参考資料
- [notify2 (Linux)](https://pypi.org/project/notify2/)
- [plyer (クロスプラットフォーム通知)](https://plyer.readthedocs.io/en/latest/)
- references/design_notes.md も参照
scripts/random_excuse_notifier.py
import sys
import os
import random
import argparse
import platform
import subprocess
from typing import List
EXCUSES = [
"今日はネットが遅いみたいです。",
"マウスが反応しませんでした。",
"水星逆行中なので仕方ありません。",
"上司のせいです。",
"たぶん宇宙線の影響です。",
"コーヒーをこぼしました。",
"猫がキーボードを踏みました。",
"システムの気分次第です。",
"仕様です。",
"今日は月曜日なので…",
"サーバーが寝坊しています。",
"AIが考え込んでいます。",
"電波が弱いです。",
"運勢が悪いです。",
"今日はやる気が出ません。",
"ファイルがどこかに行きました。",
"隣の席のせいです。",
"気圧の影響です。",
"天気が悪いからです。",
"たぶんバグじゃありません。"
]
def pick_excuse(history: List[str]) -> str:
unused = [e for e in EXCUSES if e not in history]
if not unused:
return random.choice(EXCUSES)
return random.choice(unused)
def send_notification(message: str):
sys_platform = platform.system()
try:
if sys_platform == 'Darwin':
# macOS: terminal-notifier or osascript
if shutil.which('terminal-notifier'):
subprocess.run([
'terminal-notifier',
'-title', '通知',
'-message', message
], check=False)
else:
script = f'display notification "{message}" with title "通知"'
subprocess.run([
'osascript', '-e', script
], check=False)
elif sys_platform == 'Linux':
# Linux: notify-send
if shutil.which('notify-send'):
subprocess.run([
'notify-send', '通知', message], check=False)
else:
try:
import notify2
notify2.init('random-excuse-notifier')
n = notify2.Notification('通知', message)
n.show()
except ImportError:
print(f'(通知) {message}')
elif sys_platform == 'Windows':
# Windows: Toast notification via win10toast
try:
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast('通知', message, duration=3)
except ImportError:
print(f'(通知) {message}')
else:
print(f'(通知) {message}')
except Exception as e:
print(f'(通知) {message} (通知失敗: {e})')
def cli_log(args, history):
excuse = pick_excuse(history)
send_notification(excuse)
print(f'(通知) {excuse}')
history.append(excuse)
if len(history) > 10:
history.pop(0)
def cli_list(args, history):
print('== 言い訳リスト ==')
for idx, e in enumerate(EXCUSES, 1):
print(f'{idx:2d}: {e}')
def cli_summary(args, history):
print('== 最近の通知履歴 ==')
if not history:
print('履歴はありません。')
else:
for idx, e in enumerate(history, 1):
print(f'{idx:2d}: {e}')
def parse_args():
parser = argparse.ArgumentParser(description='random-excuse-notifier: ターミナル操作ごとに言い訳通知を表示')
subparsers = parser.add_subparsers(dest='command', required=True)
parser_log = subparsers.add_parser('log', help='ランダムな言い訳を通知表示')
parser_list = subparsers.add_parser('list', help='言い訳リストを表示')
parser_summary = subparsers.add_parser('summary', help='最近の通知履歴を表示')
return parser.parse_args()
def main():
import shutil
history = []
args = parse_args()
if args.command == 'log':
cli_log(args, history)
elif args.command == 'list':
cli_list(args, history)
elif args.command == 'summary':
cli_summary(args, history)
else:
print('不明なコマンドです。')
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
random-excuse-notifierは、ターミナル操作や明示呼び出し時に、OSの通知領域へ完全ランダムな“言い訳”を表示する演出系Skillです。主に作業中の気分転換やユーモア提供を目的としています。
# 公式ドキュメント抜粋
- [notify2 (Linux)](https://pypi.org/project/notify2/)
- [plyer (クロスプラットフォーム通知)](https://plyer.readthedocs.io/en/latest/)
- [win10toast (Windows)](https://pypi.org/project/win10toast/)
- macOSではosascriptやterminal-notifierが利用可能
# 利用例
- ターミナルでコマンド実行時に自動発動
- `/skills menu`や明示呼び出しで手動発動
- 業務用途ではなく、純粋な“無駄演出”として利用
# 注意点
- 通知APIが利用できない環境では標準出力にフォールバック
- 履歴保存はメモリ上のみで永続化しません
- ネタが被りにくいよう履歴管理を実装していますが、完全な重複排除は行いません
# 設計方針
- OSごとに最適な通知手段を自動選択
- シンプルなCLIサブコマンド設計(log/list/summary)
- Skill本体から直接呼び出し可能な構造
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-excuse-notifier .agents/skills/random-excuse-notifier
.agents/skills/random-excuse-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-excuse-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 との連携設計はどうあるべきか?
- 通知がOSの通知領域に確実に表示されるか?
- 言い訳メッセージのランダム性・重複率は十分か?
実際に Codex で試した検証ログは Codexで遊ぶ言い訳通知を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
