Codex ユーザーが日常でぶつかる悩み
Codex を日々使い込んでいると、作業の合間や集中が切れたタイミングで「ちょっとした息抜き」や「現実感をリセットしたい瞬間」が意外と多いものです。AI coding workflow のなかで、単調なリファクタや長いセッションの繰り返しは、どうしても集中力を消耗しがち。そんなとき、思わず「え、なにそれ?」とツッコミたくなるような遊び心が、作業全体のリズムを変えてくれることもあります。
特に「通知・演出・OS連携」に関する悩みとして、以下のような「あるある」が挙げられます:
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
こうした課題に向き合いながらも、時には「作業の隙間にちょっとした非日常感がほしい」「AIとのやりとりに遊び心を持たせたい」と感じる瞬間も多いはずです。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の作業中に“謎のOS公式・緊急カンファレンスコール通知”をランダムに発動し、現実感と集中力にユーモラスな刺激を与える Skill です。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の合間に、完全にネタな通知が突如炸裂し、作業のリズムや気分転換になる
- 長時間の session や単調な repository understanding のタイミングで、非日常的な演出が挟まることで、context の切り替えや再集中を促進
- monorepo など複雑な directory 構造の中でも、突然のフェイク通知が現れることで、path management や onboarding の空気を一変
- 通知内容が毎回ランダムなので、「また来た!」と仲間内で盛り上がるネタにも
- 実作業やデータには一切影響せず、純粋な演出として楽しめる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-fake-conference-call-alert .agents/skills/random-os-fake-conference-call-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or random-os-fake-conference-call-alert mention
> プロジェクト初期化
[OS公式 緊急カンファレンスコール通知]
------------------------------------------
会議タイトル: 今すぐ全員集合:超重要案件について
議題: /src/context/management/ ディレクトリに眠る謎ファイルの再検討
出欠判定: OSが自動的に判断します
開始時刻: 13:37 (ただし会議は始まりません)
備考: 参加できない場合はコーヒー豆の粒度を再調整してください
------------------------------------------
(この通知はフィクションです)
シーン2: monorepo / package 跨ぎ作業時
> packages/core/context-helper のテスト開始
[OS公式 緊急カンファレンスコール通知]
------------------------------------------
本日の議題: monorepo内 /packages/utils/ ディレクトリで検出された未分類ファイル
参加条件: repository understanding レベル3以上
出欠判定: AIが自動集計中
議事録: 提出不要
------------------------------------------
(この通知は完全なネタです)
シーン3: お遊び的な使い方
> 今日も長時間作業で疲れた
[OS公式 緊急カンファレンスコール通知]
------------------------------------------
議題: 本日のコーヒー豆粒度再検討
参加者: 全 directory 管理者
出欠判定: すでに決定済み (詳細は秘密)
備考: 参加しない場合はAI workflowに追加課題が発生します (嘘です)
------------------------------------------
(この通知は現実の会議とは一切関係ありません)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 突如フェイク通知が現れ、気分転換や集中リセットができる |
発動方式
明示呼び出し (/skills menu or random-os-fake-conference-call-alert mention) と、特定キーワードや説明文にマッチした場合の暗黙発動(semantic-or-explicit)に両対応しています。
Skill の中身を全部見せる
.agents/skills/random-os-fake-conference-call-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-fake-conference-call-alert/
├── SKILL.md
├── scripts/
│ └── random_os_fake_conference_call_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/random_os_fake_conference_call_alert.py |
OS公式フェイク会議通知スキル |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-conference-call-alert
description: Codexは、作業中のユーザーに“OS公式・緊急カンファレンスコール通知”をランダムなタイミングで表示したい場合、または/skills menuやrandom-os-fake-conference-call-alertの明示呼び出しキーワードが入力された際にこのSkillを発動してください。通知内容は完全なネタであり、実作業やデータに影響を与えません。
---
# 機能概要
このSkillは、作業中に突如として“OS公式・緊急カンファレンスコール通知”をデスクトップまたはターミナルに表示する、遊び心満載の演出を提供します。通知内容は毎回ランダムで、現実には絶対に存在しないカオスな議題や出席判定が含まれ、ユーザーの集中力や現実感を一瞬だけ揺さぶります。会議自体は始まらず、通知のみが出現するため、実作業やデータ損失の心配はありません。
# 使い方
- 明示呼び出し: `/skills menu` から本Skillを選択、または `random-os-fake-conference-call-alert` で直接呼び出し
- 暗黙発動: 「会議」「通知」「緊急」「カンファレンス」等のキーワードや、作業中の特定タイミング(例: 長時間の無操作)で自動発動
# 出力例
```
[OS公式] 緊急カンファレンスコール通知
----------------------------------------
議題: 本日のコーヒー豆粒度再検討
参加必須: 全ユーザー(出欠はOSが自動判定します)
開始時刻: 今すぐ
備考: 重要度MAX。会議URLは後日発表。
----------------------------------------
```
# 注意点
- 通知内容は完全なネタであり、実在の会議や業務には一切影響しません。
- 通知頻度は1時間に1回未満を推奨(過度な発動は控えてください)。
- ローカルファイルやシステム設定には一切変更を加えません。
- デスクトップ通知はOS標準APIのみ利用します。
# 参考資料
詳細な設計方針や利用例は `references/design_notes.md` を参照してください。デスクトップ通知APIの公式ドキュメント: https://docs.python.org/3/library/subprocess.html, https://pypi.org/project/plyer/
scripts/random_os_fake_conference_call_alert.py
import argparse
import random
import sys
import time
import platform
import subprocess
from typing import List
# 通知メッセージ候補
FAKE_TOPICS = [
"今すぐ全員集合:超重要案件について",
"本日の議題:コーヒー豆の粒度再検討",
"出欠はOSが自動判定します",
"緊急:システムフォントの統一案",
"会議URLは後日発表されます",
"全ユーザー参加必須:謎のアップデート説明会",
"議題:ユーザー名の読み方再確認",
"重要度MAX:OSマスコットキャラ選定会議",
"本日の会議はAIが進行します",
"OS公式:謎の新機能発表会"
]
FAKE_NOTES = [
"重要度MAX。会議URLは後日発表。",
"参加必須。欠席は自動的に記録されます。",
"会議の録画は禁止されています。",
"議事録はAIが自動生成します。",
"議題は当日発表。サプライズあり。",
"出席確認はOSが行います。",
"会議終了後、アンケートがあります。",
"会議時間は未定です。",
"会議資料は配布されません。",
"会議開始時刻:今すぐ"
]
FAKE_PARTICIPANTS = [
"全ユーザー(出欠はOSが自動判定します)",
"管理者・ゲスト含む全員",
"選抜メンバー(選定基準は非公開)",
"AI・人間全員",
"本日ログインしたユーザー全員",
"OSサポートチーム",
"全アプリケーション開発者",
"特別ゲストあり",
"匿名参加可能",
"参加者リストは後日公開"
]
# OSごとに通知を出す
def send_notification(title: str, message: str):
system = platform.system()
try:
if system == "Darwin": # macOS
subprocess.run([
"osascript", "-e",
f'display notification "{message}" with title "{title}"'
], check=True)
elif system == "Linux":
subprocess.run([
"notify-send", title, message], check=True)
elif system == "Windows":
try:
from plyer import notification
notification.notify(title=title, message=message, timeout=6)
except ImportError:
print("[警告] plyerパッケージが必要です: pip install plyer")
else:
print("[通知未対応] このOSでは通知がサポートされていません。")
except Exception as e:
print(f"[通知エラー] {e}")
def generate_fake_alert() -> str:
topic = random.choice(FAKE_TOPICS)
note = random.choice(FAKE_NOTES)
participant = random.choice(FAKE_PARTICIPANTS)
alert = (
"[OS公式] 緊急カンファレンスコール通知\n"
"----------------------------------------\n"
f"議題: {topic}\n"
f"参加必須: {participant}\n"
"開始時刻: 今すぐ\n"
f"備考: {note}\n"
"----------------------------------------"
)
return alert
def print_alert(alert: str):
print(alert)
def log_alert(alert: str, logfile: str = "conference_call_alert.log"):
try:
with open(logfile, "a", encoding="utf-8") as f:
f.write(alert + "\n\n")
except Exception as e:
print(f"[ログエラー] {e}")
def list_log(logfile: str = "conference_call_alert.log"):
try:
with open(logfile, "r", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError:
print("ログファイルが存在しません。")
except Exception as e:
print(f"[ログ表示エラー] {e}")
def summary_log(logfile: str = "conference_call_alert.log"):
try:
with open(logfile, "r", encoding="utf-8") as f:
alerts = f.read().split("[OS公式] 緊急カンファレンスコール通知")
count = len([a for a in alerts if a.strip()])
print(f"過去のフェイク会議通知回数: {count}")
except FileNotFoundError:
print("ログファイルが存在しません。")
except Exception as e:
print(f"[サマリーエラー] {e}")
def main():
parser = argparse.ArgumentParser(description="OS公式フェイク会議通知スキル")
subparsers = parser.add_subparsers(dest="command")
# 通知発動
parser_alert = subparsers.add_parser("alert", help="フェイク会議通知を即時発動")
parser_alert.add_argument("--no-notify", action="store_true", help="デスクトップ通知を出さずにターミナル出力のみ")
parser_alert.add_argument("--log", action="store_true", help="通知内容をログファイルに保存")
# ログ閲覧
parser_list = subparsers.add_parser("list", help="過去の通知ログを表示")
parser_list.add_argument("--logfile", default="conference_call_alert.log", help="ログファイル名")
# サマリー
parser_summary = subparsers.add_parser("summary", help="通知回数のサマリーを表示")
parser_summary.add_argument("--logfile", default="conference_call_alert.log", help="ログファイル名")
# デモ自動発動
parser_demo = subparsers.add_parser("demo", help="一定間隔で自動的にフェイク通知を発動 (Ctrl+Cで停止)")
parser_demo.add_argument("--interval", type=int, default=3600, help="通知間隔(秒)")
parser_demo.add_argument("--log", action="store_true", help="通知内容をログファイルに保存")
args = parser.parse_args()
if args.command == "alert":
alert = generate_fake_alert()
print_alert(alert)
if not args.no_notify:
send_notification("緊急カンファレンスコール", alert.replace("\n", " "))
if args.log:
log_alert(alert)
elif args.command == "list":
list_log(args.logfile)
elif args.command == "summary":
summary_log(args.logfile)
elif args.command == "demo":
try:
while True:
alert = generate_fake_alert()
print_alert(alert)
send_notification("緊急カンファレンスコール", alert.replace("\n", " "))
if args.log:
log_alert(alert)
time.sleep(args.interval)
except KeyboardInterrupt:
print("\n[終了] デモモードを停止しました。")
else:
parser.print_help()
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
本Skillは、業務や作業中に“OS公式”を装った完全なネタ通知を発生させることで、ユーザーに遊び心やリフレッシュを提供することを目的としています。実際の会議やタスクには一切影響を与えず、通知内容も現実には存在しないカオスなものです。
# 公式ドキュメント抜粋
通知はOS標準のAPI(macOS: osascript, Linux: notify-send, Windows: plyer)を用いて実装しています。詳細は各OSの公式ドキュメント(https://docs.python.org/3/library/subprocess.html, https://pypi.org/project/plyer/)を参照してください。
# 利用例
- 長時間の作業や単調なタスク中に、突如として“謎の会議通知”が現れ、場を和ませる演出が可能です。
- `/skills menu`やCLIから明示的に発動することで、チーム内のレクリエーションやアイスブレイクにも活用できます。
# 注意点
- 通知内容はすべてフィクションであり、実際の業務やデータには影響を与えません。
- 通知頻度が高すぎると逆効果になるため、適度な間隔での発動を推奨します。
# 設計方針
- OS標準APIのみを利用し、追加の常駐プロセスや外部サービスは不要です。
- ログ機能やサマリー表示も備え、ユーザーが過去の通知を振り返ることができます。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-fake-conference-call-alert .agents/skills/random-os-fake-conference-call-alert
.agents/skills/random-os-fake-conference-call-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-fake-conference-call-alert
# SKILL.md, scripts/, references/, README.md があればOK
4. Codex を再起動 (or Skill 自動検出を待つ)
新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or random-os-fake-conference-call-alert mention と Skill 名で出てきます。
5. 動作確認
/skills menu or random-os-fake-conference-call-alert 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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
