Codexで作業開始を楽しく演出する謎のOS星占い通知活用ガイド

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

Codex ユーザーが日常でぶつかる悩み

Codex を日常的に使っていると、ちょっとした「間」が生まれる瞬間や、気持ちの切り替えが難しいタイミングが意外と多いものです。集中して repository を触り始めた直後や、monorepo の package を移動した時、あるいは長時間の AI coding workflow で context が膨らみすぎた時など、小さなストレスや「またか」と感じる瞬間が積み重なります。特に、通知や演出が欲しい場面で何も起きず淡々と作業が始まると、気分転換やリフレッシュのきっかけがつかみにくいことも。「ちょっとした遊び心が欲しい」と思ったことがある方も多いのではないでしょうか。

  • Codex が context を見失って違う場所のコードを参照する
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
  • 毎回同じような作業開始を繰り返すうち、ちょっとした気分転換や遊び要素が欲しくなる

特に通知や演出・OS連携に関する悩みは、「作業の始まりが機械的すぎる」「気分の切り替えがしにくい」「何か面白い演出があれば…」といった声につながりやすいポイントです。

この Skill が一言でいうと何を解決するか

一言サマリ: このスキルは、Codex の作業開始時やディレクトリ移動時に“謎のOS星占い通知”を自動で表示し、毎日の開発スタートに遊び心とリフレッシュを提供します。

もう少し具体化すると、このSkillを入れることで以下のような状態になる:

  • 作業開始や monorepo 移動時に、完全ランダムな“OS風星占い通知”が現れ、気分がリセットされる
  • 通知内容が毎回変化し、「今日のラッキーコマンド」や「バグ運勢」などネタ要素で開発現場に自然な笑いが生まれる
  • OS通知とターミナル表示の両方に対応し、どの環境でも分かりやすく演出される
  • onboarding や長時間の AI coding workflow でも、context の切り替えタイミングが明確になり、集中力維持に役立つ
  • Skill の導入だけで、repo や directory の path management にちょっとした楽しさをプラスできる
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/codex/random-os-fake-horoscope-notifier .agents/skills/random-os-fake-horoscope-notifier

実行したらこうなる (3つの利用シーン)

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu

Welcome to Codex!
─────────────────────────────
【謎のOS星占い通知】
本日の開発運勢:★★★☆☆
ラッキーコマンド:git status
アドバイス:今日は main ディレクトリでの作業が吉。バグ回避率が微増中。
仕様変更星が逆行中につき、急な要件追加に注意!

─────────────────────────────
Let's enjoy coding in ./src!

シーン2: monorepo / package 跨ぎ作業時


> cd packages/auth

【謎のOS星占い通知】
運勢:やや良し
本日のラッキーファイル:auth/utils.ts
ヒント:今日はパス管理に集中すると良い結果が出るかも。
注意:context の迷子星が接近中。repository understanding を意識!

─────────────────────────────

シーン3: お遊び的な使い方


> /skills random-os-fake-horoscope-notifier

【謎のOS星占い通知】
開発者の星座:謎のフォルダ座
今日の運勢:バグ運、超上昇中!
ラッキー directory:/tmp/fortune
一言:長い workflow でも memory は大事に。stale context に注意!

─────────────────────────────

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/random-os-fake-horoscope-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/random-os-fake-horoscope-notifier/
├── SKILL.md
├── scripts/
│   └── os_horoscope_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/os_horoscope_notifier.py OS Horoscope Notifier – ランダムなOS星占い通知をお届けします
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-horoscope-notifier
description: 作業開始や/skills menuコマンド、random-os-fake-horoscope-notifierへの明示呼び出し時など、セッション開始・ターミナル起動・新規作業開始などのキーワードを検知した際に発動します。1日1回、ランダムな“OS風星占い”通知を表示します。
---

# 機能概要
このSkillは、開発者の作業開始やセッション起動時に、完全ランダムな“OS星占い”通知をデスクトップまたはターミナルへ1日1回表示します。内容は「今日のラッキーコマンドはls」や「運勢:バグ回避率上昇」など、根拠のない占い風アドバイスで、開発のスタートをユーモラスに演出します。日々のコーディングにちょっとした遊び心を加え、気分転換やチームの会話のきっかけにもなります。

# 使い方
- 明示呼び出し例:
  - `/skills menu` から `random-os-fake-horoscope-notifier` を選択
  - `$ random-os-fake-horoscope-notifier notify`
- 暗黙発動キーワード例:
  - 「作業開始」「新規ターミナル」「start coding」などのセッション開始時
  - Codexが「今日もよろしく」「build start」などを検知した場合

# 出力例
```
=== OS Horoscope Notifier ===
運勢: 今日は「ls」コマンドが幸運を呼びます。
バグ回避率が12%上昇。
注意: 仕様変更星が逆行中。こまめなgit commit推奨。
ラッキーアイテム: マグカップ
===========================
```

# 注意点
- 通知は1日1回のみ表示されます(ローカルに記録)
- 内容は完全ランダムで、実際の運勢や開発結果には影響しません
- デスクトップ通知はLinux/macOSのみ対応(notify-sendまたはosascript利用)
- ローカル環境のみに保存され、クラウド連携や個人情報送信はありません

# 参考資料
- references/design_notes.md
- https://docs.python.org/ja/3/library/random.html
- https://wiki.archlinux.jp/index.php/Desktop_notifications

scripts/os_horoscope_notifier.py

import os
import sys
import argparse
import random
import datetime
import json
import platform
import subprocess

NOTIFY_HISTORY_FILE = os.path.expanduser('~/.os_horoscope_notifier_history.json')

LUCKY_COMMANDS = [
    'ls', 'cd', 'grep', 'cat', 'git commit', 'vim', 'rm', 'mkdir', 'touch',
    'python', 'docker', 'curl', 'ssh', 'top', 'ps', 'find', 'tail', 'head', 'chmod', 'chown', 'scp'
]

FORTUNE_MESSAGES = [
    'バグ回避率が{percent}%上昇。',
    '今日の進捗は{percent}%増加の予感。',
    'コーヒーブレイク推奨。',
    'レビュー運が好調。',
    'コードリーディング力が冴える日。',
    '仕様変更星が逆行中。',
    'git pushは慎重に。',
    'テストカバレッジが自然と上昇。',
    '依存関係のトラブルに注意。',
    '新しいIDEプラグインとの出会いがあるかも。',
    'マージコンフリクト運が低下中。',
    'PRがすんなり通る可能性大。',
    'デバッグの女神が微笑む日。',
    'コードレビューで褒められるかも。',
    'CI/CDパイプラインが安定。',
    'Slack通知が多め。',
    '仕様書の読み間違いに注意。',
    'ペアプロが吉。',
    '深追いは禁物。',
    'こまめなgit commit推奨。',
]

LUCKY_ITEMS = [
    'マグカップ', 'お気に入りのキーボード', '青い付箋', 'USBメモリ', 'エディタのテーマ',
    'デバッグ用アヒル', '観葉植物', '座布団', 'イヤホン', 'コーヒー', 'メモ帳', '新しいタブ',
    'ステッカー', 'ランチパック', 'スニーカー', 'お気に入りのペン', 'マウスパッド', 'デスクライト'
]

BORDER = '=' * 27


def load_history():
    if os.path.exists(NOTIFY_HISTORY_FILE):
        try:
            with open(NOTIFY_HISTORY_FILE, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception:
            return {}
    return {}

def save_history(history):
    try:
        with open(NOTIFY_HISTORY_FILE, 'w', encoding='utf-8') as f:
            json.dump(history, f, ensure_ascii=False, indent=2)
    except Exception as e:
        print(f"[WARN] 履歴保存失敗: {e}")

def already_notified_today(history):
    today = datetime.date.today().isoformat()
    return history.get('last_notify_date') == today

def update_notify_date(history):
    today = datetime.date.today().isoformat()
    history['last_notify_date'] = today
    save_history(history)

def generate_fortune():
    lucky_cmd = random.choice(LUCKY_COMMANDS)
    fortune_msg = random.choice(FORTUNE_MESSAGES)
    percent = random.randint(5, 30)
    fortune_msg = fortune_msg.format(percent=percent)
    lucky_item = random.choice(LUCKY_ITEMS)
    lines = [
        BORDER,
        'OS Horoscope Notifier',
        f'運勢: 今日は「{lucky_cmd}」コマンドが幸運を呼びます。',
        fortune_msg,
        f'ラッキーアイテム: {lucky_item}',
        BORDER
    ]
    return '\n'.join(lines)

def show_terminal_notification(msg):
    print(msg)

def show_desktop_notification(msg):
    system = platform.system()
    title = 'OS Horoscope Notifier'
    # Linux (notify-send)
    if system == 'Linux':
        try:
            subprocess.run(['notify-send', title, msg], check=True)
        except Exception as e:
            print(f"[WARN] notify-send失敗: {e}")
    # macOS (osascript)
    elif system == 'Darwin':
        try:
            script = f'display notification "{msg}" with title "{title}"'
            subprocess.run(['osascript', '-e', script], check=True)
        except Exception as e:
            print(f"[WARN] osascript失敗: {e}")
    else:
        print("[INFO] デスクトップ通知は未対応OSです。ターミナルに表示します。")
        print(msg)

def notify(args):
    history = load_history()
    if already_notified_today(history):
        if not args.force:
            print('[INFO] 今日は既に通知済みです。')
            return
    msg = generate_fortune()
    if args.desktop:
        show_desktop_notification(msg)
    else:
        show_terminal_notification(msg)
    update_notify_date(history)

def list_history(args):
    history = load_history()
    date = history.get('last_notify_date', 'なし')
    print(f'最終通知日: {date}')

def main():
    parser = argparse.ArgumentParser(description='OS Horoscope Notifier - ランダムなOS星占い通知をお届けします')
    subparsers = parser.add_subparsers(dest='command')

    notify_parser = subparsers.add_parser('notify', help='本日の星占い通知を表示')
    notify_parser.add_argument('--desktop', action='store_true', help='デスクトップ通知を利用する')
    notify_parser.add_argument('--force', action='store_true', help='1日1回制限を無視して通知')
    notify_parser.set_defaults(func=notify)

    list_parser = subparsers.add_parser('list', help='通知履歴を表示')
    list_parser.set_defaults(func=list_history)

    args = parser.parse_args()
    if not hasattr(args, 'func'):
        parser.print_help()
        sys.exit(1)
    args.func(args)

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
本Skillは、開発者の作業開始時や明示的な呼び出し時に、完全ランダムな“OS星占い”を1日1回だけ通知することで、日々のコーディングに遊び心とリフレッシュ効果を加えることを目的としています。

# 公式ドキュメント抜粋
- Python randomモジュール: https://docs.python.org/ja/3/library/random.html
- notify-send (Linux): https://wiki.archlinux.jp/index.php/Desktop_notifications
- osascript (macOS): https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html

# 利用例
- ターミナルで `python os_horoscope_notifier.py notify` を実行すると、その日の“OS星占い”が表示されます。
- `--desktop` オプションでデスクトップ通知も可能。
- 1日1回のみ通知され、履歴はホームディレクトリの`.os_horoscope_notifier_history.json`に保存されます。

# 注意点
- 通知内容は完全なランダム生成で、実際の運勢や作業効率には一切影響しません。
- デスクトップ通知はLinux/macOSのみ対応。Windowsではターミナル表示のみ。
- 個人情報や作業内容の外部送信はありません。

# 設計方針
- シンプルなローカルJSONファイルによる履歴管理で、1日1回制限を実現。
- ユーザー体験を損なわないよう、通知の強制・過剰表示は排除。
- CLIサブコマンドで拡張性を確保し、今後のカスタマイズにも対応可能としています。

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Codex がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/codex/random-os-fake-horoscope-notifier .agents/skills/random-os-fake-horoscope-notifier

.agents/skills/random-os-fake-horoscope-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/random-os-fake-horoscope-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 との連携設計はどうあるべきか?
  • 1日1回だけ通知されるか、毎回ランダムなネタ要素が盛り込まれているか?
  • OS通知/ターミナル通知の両方で分かりやすく現れるか?

実際に Codex で試した検証ログは Codexで謎のOS星占い通知を実際に使ってみた!毎日笑える開発スタートを体験 にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

関連タグで他のSkill記事を探す

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

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

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