Codexで朝イチの謎通知を自動化して作業効率を爆上げする方法

  • URLをコピーしました!
目次

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 のリズムを作る
  • 思わず二度見するようなネタ通知で、チームや職場の雰囲気も和らげられる
QUICK INSTALL
このSkillをすぐ試す

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記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次