Codex ユーザーが日常でぶつかる悩み
日々の開発現場でCodexを使っていると、ちょっとした「あるある」に何度も遭遇します。特に通知や演出、OS連携系のSkillがほしい場面では、以下のような悩みがつきまといます。
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
さらに、朝イチで作業を始めるときや、集中力が必要なタイミングで無機質なターミナルやエディタの画面だけが広がっていると、どうにもテンションが上がらないという声も少なくありません。OSやツールからのちょっとした“演出”があれば、日々のルーチンに新しい刺激が加わるのに、というニーズも潜在的に存在します。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の session 開始時やプロジェクト起動時に“謎のOS朝礼通知”を自動で表示し、作業開始を強烈に演出します。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 毎回異なる「OS朝礼通知」がランダムに表示され、普段の開発フローが一気に非日常モードに切り替わる
- 朝イチで「本日のスローガン」や「作業目標」などが勝手に宣言され、onboarding や session 再開時の気分転換に最適
- 通知は既存の repository やファイルに一切影響せず、context や path management の邪魔をしない
- monorepo や複雑な directory 構造でも、Skill の演出が workflow のリズムを作る
- 思わず二度見するようなネタ通知で、チームや職場の雰囲気も和らげられる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/os-fake-morning-assembly-alert .agents/skills/os-fake-morning-assembly-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or os-fake-morning-assembly-alert mention
> 今日も開発を始める
[OS朝礼通知] 本日のスローガン: 「安全第一、コミットは慎重に。」
[点呼] main.py, utils/, docs/ ... 各自、存在確認!
[公式連絡] 9:05より OS 体操が始まります。各自ストレッチを忘れずに。
[本日の作業目標] repository understanding を深め、context を見失わない!
シーン2: monorepo / package 跨ぎ作業時
> packages/user-service/ へ移動
[OS朝礼通知] 「monorepo 点呼」開始: user-service, payment-service, shared/ ... 全service準備OK?
[本日のお知らせ] directory 増加中。path management にご注意ください。
[作業目標] 新しい repository 構造を Codex に把握させましょう!
シーン3: お遊び的な使い方
> なんとなく /skills menu を開く
[OS朝礼通知] 本日のラジオ体操は省略されました。各自、好きな体勢で作業開始!
[点呼] src/, tests/, README.md ... みんな元気ですか?
[目標] AI coding workflow を楽しく回す!
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 朝礼通知でリズムができ、重要な context を意識し直せる |
発動方式
明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。
Skill の中身を全部見せる
.agents/skills/os-fake-morning-assembly-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/os-fake-morning-assembly-alert/
├── SKILL.md
├── scripts/
│ └── os_fake_morning_assembly_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/os_fake_morning_assembly_alert.py |
\nOS Fake Morning Assembly Alert\n\nコマンド例:\n python os_fake_morning_assembly_alert.py aut |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: os-fake-morning-assembly-alert
description: Codexがターミナルやエディタの初回起動時、または/skillsコマンドやos-fake-morning-assembly-alertの明示呼び出し時に発動。朝礼・点呼・スローガンなどの“謎通知”を毎回異なる内容で表示し、作業開始を演出します。
---
# 機能概要
このSkillは、ターミナルやエディタを開いた瞬間に“OS朝礼通知”をランダムに炸裂させる演出系ツールです。通知内容は「本日のスローガン発表」「謎の点呼開始」「OS公式・体操のご案内」など毎回異なり、普段の開発作業を一気に学園や工場の朝礼モードに引き込みます。通知後は「本日の作業目標」も自動で宣言されることがあり、真面目な開発気分を一瞬でリセット。既存の作業やファイルには一切影響せず、“謎演出”のみを安全に提供します。
# 使い方
- 明示呼び出し例: `/skills os-fake-morning-assembly-alert` または `$ os-fake-morning-assembly-alert`
- 暗黙発動例: ターミナル/エディタ初回起動時、または「朝礼」「点呼」「スローガン」などのキーワードを含む作業開始時に自動発動
# 出力例
```
[OS朝礼通知] 本日のスローガン:「エラーは友達、バグは宝」
[点呼開始] 1番、2番、3番...全員いるか?
[OS公式体操] 画面の前で背筋を伸ばしてください
[作業目標] 本日は「テストカバレッジ90%超」を目指しましょう
```
# 注意点
- 通知は初回起動時のみ自動発動。2回目以降は明示呼び出しが必要です
- 通知内容は毎回ランダム生成されます
- 既存ファイルや作業内容には一切影響しません
- ローカル環境に一時的な状態ファイル(.os_fake_morning_assembly_alert_state)が保存されます
# 参考資料
- references/design_notes.md
- https://docs.python.org/3/library/subprocess.html
- https://docs.python.org/3/library/random.html
scripts/os_fake_morning_assembly_alert.py
import os
import sys
import random
import argparse
from datetime import datetime
import platform
import subprocess
STATE_FILE = os.path.expanduser('~/.os_fake_morning_assembly_alert_state')
SLOGANS = [
'エラーは友達、バグは宝',
'今日も一日、ノーコンパイルエラー',
'OSは裏切らない',
'デバッグは朝飯前',
'コードレビューは愛のムチ',
'コミットは一日一善',
'リファクタリングは未来への投資',
'テストカバレッジ90%超を目指せ',
'バグ報告は感謝の証',
'仕様は生き物、変化を恐れるな'
]
CHECKINS = [
'1番、2番、3番...全員いるか?',
'点呼開始!名前を呼ばれたら「はい」と返事してください',
'全員集合!今日も元気に開発スタート',
'リーダーから順に自己紹介をどうぞ',
'出席確認:欠席者はSlackで連絡'
]
EXERCISES = [
'画面の前で背筋を伸ばしてください',
'OS公式体操:手首ストレッチをどうぞ',
'深呼吸してリフレッシュしましょう',
'目を閉じて10秒間リラックス',
'椅子から立ち上がって軽く屈伸'
]
GOALS = [
'テストカバレッジ90%超を目指しましょう',
'未解決バグを3件減らしましょう',
'ドキュメントを1ページ更新しましょう',
'レビュー待ちのPRを全て確認しましょう',
'今日の新規バグゼロを目指しましょう'
]
NOTIF_TEMPLATES = [
'[OS朝礼通知] 本日のスローガン: "{slogan}"',
'[点呼開始] {checkin}',
'[OS公式体操] {exercise}',
'[作業目標] 本日は「{goal}」'
]
def is_first_run():
if not os.path.exists(STATE_FILE):
return True
try:
with open(STATE_FILE, 'r') as f:
last_date = f.read().strip()
today = datetime.now().strftime('%Y-%m-%d')
return last_date != today
except Exception:
return True
def update_state():
try:
with open(STATE_FILE, 'w') as f:
f.write(datetime.now().strftime('%Y-%m-%d'))
except Exception:
pass
def random_assembly_messages():
slogan = random.choice(SLOGANS)
checkin = random.choice(CHECKINS)
exercise = random.choice(EXERCISES)
goal = random.choice(GOALS)
messages = [
NOTIF_TEMPLATES[0].format(slogan=slogan),
NOTIF_TEMPLATES[1].format(checkin=checkin),
NOTIF_TEMPLATES[2].format(exercise=exercise),
NOTIF_TEMPLATES[3].format(goal=goal)
]
# シャッフルして2-4件出す
random.shuffle(messages)
n = random.randint(2, 4)
return messages[:n]
def notify_desktop(message):
sysname = platform.system()
try:
if sysname == 'Darwin':
subprocess.run(['osascript', '-e', f'display notification "{message}" with title "OS朝礼通知"'], check=True)
elif sysname == 'Linux':
subprocess.run(['notify-send', 'OS朝礼通知', message], check=True)
elif sysname == 'Windows':
# Windows 10以降: powershell経由
ps = f'[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null;'
ps += f'$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02);'
ps += f'$textNodes = $template.GetElementsByTagName("text");$textNodes.Item(0).AppendChild($template.CreateTextNode("OS朝礼通知")) > $null;'
ps += f'$textNodes.Item(1).AppendChild($template.CreateTextNode("{message}")) > $null;'
ps += f'$toast = [Windows.UI.Notifications.ToastNotification]::new($template);'
ps += f'[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("FakeMorningAssembly").Show($toast)'
subprocess.run(['powershell', '-Command', ps], check=True)
else:
print(message)
except Exception:
print(message)
def show_assembly_alert():
messages = random_assembly_messages()
for msg in messages:
print(msg)
notify_desktop(msg)
def main():
parser = argparse.ArgumentParser(description='OS Fake Morning Assembly Alert')
parser.add_argument('command', nargs='?', default='auto', choices=['auto', 'alert', 'reset', 'show', 'help'],
help='auto:初回のみ発動, alert:毎回発動, reset:状態リセット, show:今日の通知, help:使い方')
args = parser.parse_args()
if args.command == 'help':
print('''\nOS Fake Morning Assembly Alert\n\nコマンド例:\n python os_fake_morning_assembly_alert.py auto # 初回のみ発動\n python os_fake_morning_assembly_alert.py alert # 毎回通知\n python os_fake_morning_assembly_alert.py reset # 状態リセット\n python os_fake_morning_assembly_alert.py show # 今日の通知内容を再表示\n''')
return
if args.command == 'reset':
if os.path.exists(STATE_FILE):
os.remove(STATE_FILE)
print('状態ファイルをリセットしました')
return
if args.command == 'show':
if not os.path.exists(STATE_FILE):
print('今日の通知はまだありません')
return
today = datetime.now().strftime('%Y-%m-%d')
with open(STATE_FILE, 'r') as f:
last_date = f.read().strip()
if last_date != today:
print('今日の通知はまだありません')
return
# 再度ランダム生成(同じ内容にはなりません)
show_assembly_alert()
return
if args.command == 'alert':
show_assembly_alert()
update_state()
return
# auto
if is_first_run():
show_assembly_alert()
update_state()
else:
pass # 2回目以降は何もしない
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは“朝礼”や“点呼”といった非日常的な通知をランダムに生成し、作業開始時の端末/エディタに演出を加えます。通知内容は毎回異なり、ローカル状態ファイルで初回発動を管理します。
# 公式ドキュメント抜粋
- Python subprocess: https://docs.python.org/3/library/subprocess.html
- Python random: https://docs.python.org/3/library/random.html
# 利用例
- ターミナル初回起動時に謎の朝礼通知が出現し、作業開始を盛り上げる
- /skillsコマンドや明示呼び出しで再演出
# 注意点
- 通知は初回起動時のみ自動発動。2回目以降は明示呼び出しが必要
- 通知内容は毎回ランダム生成で、同じ内容になることはほぼありません
- 既存ファイルや作業内容には一切影響しません
# 設計方針
状態管理はホームディレクトリ直下の隠しファイルで行い、ユーザーの作業環境に影響を与えない設計です。通知はOS標準API(osascript/notify-send/powershell)を利用し、クロスプラットフォーム対応としています。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/os-fake-morning-assembly-alert .agents/skills/os-fake-morning-assembly-alert
.agents/skills/os-fake-morning-assembly-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/os-fake-morning-assembly-alert
# 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で朝イチに謎のOS朝礼通知を鳴らしてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
