Codex ユーザーが日常でぶつかる悩み
Codex を使ったコーディングワークフローでは、集中して作業したいのに思わぬストレスを感じる場面が少なくありません。特に repository 理解や path 管理、context の維持など、AI coding workflow ならではの「地味に面倒」な課題が積み重なりがちです。さらに、黙々と作業していると、気分転換やモチベーション維持が難しくなることも。「もうちょっとエンタメ要素があってもいいのに」と感じたことはありませんか?
- Codex が context を見失って違う場所のコードを参照することがあり、思わぬミスや手戻りが発生する
- monorepo で package を跨いだ瞬間、Codex が repository 構造を忘れてディレクトリ指定をやり直す必要がある
- 長時間の AI coding workflow で long context が膨らみすぎ、重要な情報が埋もれてしまう
- session を再開すると、前回までの context や path 管理を一から説明し直さなければならない
- 作業が単調になりがちで、気分転換やちょっとした刺激が欲しいが、現状の Codex には通知や演出要素が少ない
通知・演出・OS連携に関する悩みは、集中力の持続や作業効率だけでなく、日々のコーディング体験そのものにも影響します。たまには「謎のやる気スピーチ」で気分をリフレッシュできたら…そんな一工夫が欲しくなる瞬間もあるはずです。
この Skill が一言でいうと何を解決するか
一言サマリ: 作業中やコマンド実行のたびにSkill。
この Skill を導入すると、Codex を使ったコーディング作業の合間や重要なタイミングで、「OS公式風」のランダムなやる気スピーチ通知がデスクトップや画面端に出現します。通知内容は毎回異なり、どこかズレた熱い激励が日常にエンタメと刺激をもたらします。具体的には以下のようなメリットがあります。
- repository understanding や path 管理に集中しがちな作業に、予期せぬモチベーションブーストが加わる
- 長時間の workflow や onboarding 時、単調な流れにユーモラスな通知でリズムが生まれる
- session 再開や monorepo の directory 跨ぎ時に、気分一新で context を切り替えやすくなる
- AI coding workflow の合間に「OS公認の勇者」気分を味わえ、作業効率だけでなく気分転換にも役立つ
- 通知内容が毎回違うため、飽きずにちょっとしたサプライズを楽しめる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/os-random-fake-motivational-speech-alert .agents/skills/os-random-fake-motivational-speech-alert実行したらこうなる (3つの利用シーン)
Skill を有効化すると、Codex でコマンドを実行するたび、または明示的に呼び出したタイミングで、ランダムなやる気スピーチ通知が発動します。以下は実際の利用シーンをイメージした擬似 terminal 出力例です。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or os-random-fake-motivational-speech-alert mention
> このリポジトリの構成を教えて
[OS公式通知]
「今こそコード界の伝説になるときです。」
「あなたの手で src/main.py に新たな歴史を刻みましょう!」
(リポジトリ構造のサマリが続く)
- src/
- tests/
- README.md
...
シーン2: monorepo / package 跨ぎ作業時
> packages/api/ の build スクリプトを直して
[OS公式通知]
「キーボードの叩き方に情熱を感じます。」
「あなたの commit が monorepo の未来を切り拓く!」
(対象パッケージの build スクリプト修正案が続く)
シーン3: お遊び的な使い方
> ちょっとやる気が出ないな…
[OS公式通知]
「あなたの push は宇宙を救う。」
「この directory の全ファイルがあなたを応援しています!」
(雑談や軽いアドバイスが続く)
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-random-fake-motivational-speech-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/os-random-fake-motivational-speech-alert/
├── SKILL.md
├── scripts/
│ └── os_random_fake_motivational_speech_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/os_random_fake_motivational_speech_alert.py |
OS Random Fake Motivational Speech Alert Skill |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: os-random-fake-motivational-speech-alert
description: 作業コマンド実行時や/skillsメニュー呼び出し時など、ユーザーのアクションに応じて毎回異なる“OS公式・やる気爆上げスピーチ通知”を自動発火します。通知・演出・OS連携系Skill。
---
# 機能概要
このSkillは、ターミナルやエディタで作業中に、まるでOS公式からの激励のような“謎のやる気爆上げスピーチ”通知をランダムに表示します。内容は毎回異なり、「あなたのタイピングが世界を変える」「今こそ伝説になるときです」など、どこかズレているが妙に熱いメッセージばかり。日常のコーディングやタスク実行にエンタメ要素を注入し、気分転換や集中力UPをサポートします。実害ゼロで、システムやデータには一切影響しません。
# 使い方
- 明示呼び出し: `/skills os-random-fake-motivational-speech-alert` または `$ os-random-fake-motivational-speech-alert`
- 暗黙発動: ターミナルでコマンド実行時、またはエディタで保存・ビルド・テストなどのタイミングで自動発火(設定により常時/任意トリガー選択可)
# 出力例
```
[OS MOTIVATION] 今こそコード界の伝説になるときです。
[OS MOTIVATION] あなたのcommitは宇宙を救う可能性を秘めています。
[OS MOTIVATION] そのタイピング、情熱が伝わってきます。
[OS MOTIVATION] シンタックスエラーも、あなたなら乗り越えられる。
[OS MOTIVATION] 今日の努力が明日のOSを支えます。
```
# 注意点
- 通知内容は毎回ランダム生成されますが、真剣に受け止める必要はありません。
- システムやファイルには一切変更を加えません。
- ローカル通知(`notify-send`や`osascript`等)を利用するため、環境によっては追加設定が必要です。
- ログ保存や履歴機能はありません。
# 参考資料
- [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)
- references/design_notes.md を参照
scripts/os_random_fake_motivational_speech_alert.py
import sys
import os
import random
import platform
import subprocess
import argparse
import time
MOTIVATIONAL_MESSAGES = [
"今こそコード界の伝説になるときです。",
"あなたのcommitは宇宙を救う可能性を秘めています。",
"そのタイピング、情熱が伝わってきます。",
"シンタックスエラーも、あなたなら乗り越えられる。",
"今日の努力が明日のOSを支えます。",
"あなたのデバッグ力が未来を切り拓きます。",
"コンパイルのたびに、あなたは進化しています。",
"OS公式:あなたの集中力に敬意を表します。",
"その一行が、世界を変える鍵になるかもしれません。",
"バグもあなたの成長の糧です。",
"あなたのpushを、OSは見守っています。",
"今のあなたは、まさにOS公認の勇者です。",
"エラーは挑戦の証です。恐れず進みましょう。",
"あなたのキーボードから、未来が生まれます。",
"OSもあなたを応援しています。",
"その情熱、OSに伝わっています。",
"今日のあなたは、昨日のあなたを超えています。",
"あなたのコードが、世界をもっと良くします。",
"OSの歴史に、あなたの名前が刻まれる日も近い。",
"その一歩が、大きな進化につながります。"
]
def get_random_message():
return random.choice(MOTIVATIONAL_MESSAGES)
def send_notification(message, title="OS MOTIVATION"):
system = platform.system()
if system == "Linux":
# Use notify-send
try:
subprocess.run([
"notify-send", title, message
], check=True)
except Exception as e:
print(f"[WARN] notify-send failed: {e}")
print(f"[{title}] {message}")
elif system == "Darwin":
# Use osascript
osa_script = f'display notification "{message}" with title "{title}"'
try:
subprocess.run([
"osascript", "-e", osa_script
], check=True)
except Exception as e:
print(f"[WARN] osascript failed: {e}")
print(f"[{title}] {message}")
elif system == "Windows":
# Use Toast notification (requires win10toast)
try:
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast(title, message, duration=5, threaded=True)
except ImportError:
print(f"[WARN] win10toast not installed. Printing message instead.")
print(f"[{title}] {message}")
except Exception as e:
print(f"[WARN] Windows notification failed: {e}")
print(f"[{title}] {message}")
else:
print(f"[{title}] {message}")
def print_message(message, title="OS MOTIVATION"):
print(f"[{title}] {message}")
def trigger_alert(args):
message = get_random_message()
if args.notify:
send_notification(message)
else:
print_message(message)
def loop_alert(args):
interval = args.interval
count = args.count
for i in range(count):
trigger_alert(args)
if i < count - 1:
time.sleep(interval)
def list_messages(args):
print("--- Motivational Messages List ---")
for idx, msg in enumerate(MOTIVATIONAL_MESSAGES, 1):
print(f"{idx:2d}: {msg}")
def main():
parser = argparse.ArgumentParser(
description="OS Random Fake Motivational Speech Alert Skill"
)
subparsers = parser.add_subparsers(dest="command", help="sub-command help")
# Trigger command (default)
parser_trigger = subparsers.add_parser(
"trigger", help="1回だけランダム通知を発火"
)
parser_trigger.add_argument(
"--notify", action="store_true", help="OS通知として表示 (デフォルトはprintのみ)"
)
parser_trigger.set_defaults(func=trigger_alert)
# Loop command
parser_loop = subparsers.add_parser(
"loop", help="指定回数・間隔で連続通知"
)
parser_loop.add_argument(
"--interval", type=float, default=10.0, help="通知間隔(秒)"
)
parser_loop.add_argument(
"--count", type=int, default=5, help="通知回数"
)
parser_loop.add_argument(
"--notify", action="store_true", help="OS通知として表示"
)
parser_loop.set_defaults(func=loop_alert)
# List command
parser_list = subparsers.add_parser(
"list", help="全メッセージ一覧を表示"
)
parser_list.set_defaults(func=list_messages)
args = parser.parse_args()
if not args.command:
# デフォルトは1回通知
args = parser.parse_args(["trigger"])
args.func(args)
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
このSkillは、OSの通知機能を活用し、コマンド実行や作業タイミングでユーザーを“謎の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 os-random-fake-motivational-speech-alert` を実行
- コマンド実行ごとに自動で発火
- 連続通知や全メッセージ一覧表示も可能
# 注意点
- OS通知APIは環境依存。Linuxはnotify-send、macOSはosascript、Windowsはwin10toast(Python)が必要
- 通知内容はジョークです。真剣に受け止めないでください
# 設計方針
- システムやファイルへの副作用ゼロ
- 毎回異なるメッセージで飽きさせない
- CLIサブコマンドで拡張性を確保
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/os-random-fake-motivational-speech-alert .agents/skills/os-random-fake-motivational-speech-alert
.agents/skills/os-random-fake-motivational-speech-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/os-random-fake-motivational-speech-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で謎のやる気スピーチ通知を連発させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
