Codexで仕事の気分を変えるテーマソング提案の活用ガイド

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

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

Codex で日々開発を進めていると、「ちょっとした遊び心が欲しい」「作業の切り替えを楽しくしたい」と感じる瞬間が意外と多いものです。特に長時間のコーディングや、複雑な monorepo の運用、あるいは新しい repository への onboarding など、集中力が切れがちな場面では、ちょっとした演出や通知が気分転換になることもあります。とはいえ、真面目な作業フローの中で、唐突に何かが起きると「やめてくれ」と思うことも。通知・演出・OS連携系の Skill を導入する際、以下のような悩みがよく聞かれます。

  • Codex が context を見失って違う場所のコードを参照することがある
  • monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れてしまう
  • session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
  • 長時間 AI coding workflow で long context が膨らみ、重要な repository understanding が薄まる
  • 「ここはこういう directory 構成だよ」と毎回チャットの冒頭で説明するのが面倒

こうした「context の維持」や「onboarding の手間」に加え、OSレベルの通知や演出が「ちょうどいいタイミングで」発動してくれたら、単調な作業も少し楽しくなるのに…と思うことも多いはずです。

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

一言サマリ: 今日の最初のターミナルコマンドを打った瞬間Skill。

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

  • Codex の session 開始時に「本日のあなたのテーマソング」をテキスト通知で提案、気分転換や作業切り替えのトリガーになる
  • monorepo や複雑な repository での path management・context 切り替えのタイミングで、遊び心ある演出が workflow に加わる
  • onboarding や長時間作業の中で、AI coding workflow の「始まり」を明確にし、リポジトリ理解のリフレッシュにも役立つ
  • 選曲は完全ランダムなので、毎回違う提案が来ることでマンネリを防ぐ
  • テキスト通知のみで環境を壊さず、気軽に導入できる
QUICK INSTALL
このSkillをすぐ試す

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

npx degit aazutaku/ai-note/codex/terminal-boss-bgm-suggester .agents/skills/terminal-boss-bgm-suggester

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

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示す。Skill が返す出力は推測だが、現実的なフォーマット・現実的な長さで書く。

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


$ cd ~/workspace/awesome-monorepo
$ ls
apps/  packages/  README.md
$ npx codex

[terminal-boss-bgm-suggester]
本日のあなたのテーマソング: 「情熱大陸」
気合を入れて、今日も開発スタート!
(※BGMは流れません。おすすめタイトルです)

# Codex の context: apps/ ディレクトリから開始

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


$ cd packages/api-utils
$ ls
index.ts  http.ts  README.md

[terminal-boss-bgm-suggester]
本日のあなたのテーマソング: 「サザエさん」
package 跨ぎ、お疲れさまです!
(※BGMは流れません。おすすめタイトルです)

# Codex の context: packages/api-utils ディレクトリ

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


$ echo "今日も一日がんばるぞい"
$ npx codex

[terminal-boss-bgm-suggester]
本日のあなたのテーマソング: 「アンパンマンのマーチ」
元気100倍!作業も楽しく進めましょう
(※BGMは流れません。おすすめタイトルです)

# Codex の context: 現在のディレクトリ

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Codex が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる セッション開始時にリセット感+遊び心で集中力回復

発動方式

明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。

Skill の中身を全部見せる

.agents/skills/terminal-boss-bgm-suggester/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/terminal-boss-bgm-suggester/
├── SKILL.md
├── scripts/
│   └── terminal_boss_bgm_suggester.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/terminal_boss_bgm_suggester.py Terminal Boss BGM Suggester
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: terminal-boss-bgm-suggester
description: 最初のターミナルコマンド実行時、または /skills メニューや terminal-boss-bgm-suggester の明示呼び出し時に発動。選曲は完全ランダムで、BGM提案はテキスト通知のみ行います。
---

# 機能概要
terminal-boss-bgm-suggester は、今日最初のターミナルコマンドを実行した瞬間に、あなたの“本日のテーマソング”を完全ランダムで提案するスキルです。『情熱大陸』『エヴァンゲリオン』『サザエさん』など、仕事のテンションを一気に変えるBGMが、テキスト通知であなたを無言で盛り上げます。真面目な朝に『運命』、夜に『アンパンマン』など、意外性のある選曲が日々の作業を彩ります。

# 使い方
- 明示呼び出し: `/skills menu` から terminal-boss-bgm-suggester を選択、または `$terminal-boss-bgm-suggester` を入力
- 暗黙発動: ターミナルでその日最初のコマンドを実行した時に自動発動

# 出力例
```terminal
=== Terminal Boss BGM Suggester ===
本日のあなたのテーマソングは…
『サザエさんのテーマ』です!
今日も一日、波平のように落ち着いて頑張りましょう。
(参考: https://www.youtube.com/watch?v=xxxxxxx)
```

# 注意点
- BGMはテキスト通知のみで、音楽再生や端末の設定変更は行いません。
- 1日1回のみ発動。複数ターミナルを開いても同日は再通知しません。
- 選曲は完全ランダムで、選曲リストはスクリプト内で管理されています。
- 職場等での利用は周囲の雰囲気に配慮してください。

# 参考資料
- references/design_notes.md を参照
- 公式: https://ai-note.tech/skills/terminal-boss-bgm-suggester

scripts/terminal_boss_bgm_suggester.py

import os
import sys
import argparse
import random
import json
from datetime import datetime, date

BGM_LIST = [
    {
        "title": "情熱大陸",
        "description": "情熱を燃やして今日を駆け抜けましょう。",
        "url": "https://www.youtube.com/watch?v=2G8Qb7wE9zQ"
    },
    {
        "title": "サザエさんのテーマ",
        "description": "波平のように落ち着いて頑張りましょう。",
        "url": "https://www.youtube.com/watch?v=6u7x1W9lC3I"
    },
    {
        "title": "新世紀エヴァンゲリオン - 残酷な天使のテーゼ",
        "description": "使徒襲来!? 仕事も全力で迎撃!",
        "url": "https://www.youtube.com/watch?v=t-QSmNReDyI"
    },
    {
        "title": "運命 (ベートーヴェン第5交響曲)",
        "description": "真面目な朝に運命を切り開こう。",
        "url": "https://www.youtube.com/watch?v=fOk8Tm815lE"
    },
    {
        "title": "アンパンマンのマーチ",
        "description": "夜勤も元気100倍!",
        "url": "https://www.youtube.com/watch?v=Q5hZl5w2KfQ"
    },
    {
        "title": "ルパン三世のテーマ",
        "description": "華麗にタスクを盗み去れ!",
        "url": "https://www.youtube.com/watch?v=0n3cUPTKnl0"
    },
    {
        "title": "世界の車窓から",
        "description": "ゆったりとした気分でコマンドを。",
        "url": "https://www.youtube.com/watch?v=3r7pE7Wz9uA"
    },
    {
        "title": "ドラゴンクエスト 序曲",
        "description": "冒険の始まり!",
        "url": "https://www.youtube.com/watch?v=4Qw8xk5QmI8"
    },
    {
        "title": "ポケモンOP - めざせポケモンマスター",
        "description": "今日もゲットだぜ!",
        "url": "https://www.youtube.com/watch?v=JuYeHPFR3f0"
    },
    {
        "title": "銀河鉄道999",
        "description": "どこまでも走り抜けよう。",
        "url": "https://www.youtube.com/watch?v=0Q8K7P7KjEo"
    }
]

STATE_FILE = os.path.expanduser("~/.terminal_boss_bgm_state.json")


def load_state():
    if not os.path.exists(STATE_FILE):
        return {}
    try:
        with open(STATE_FILE, 'r') as f:
            return json.load(f)
    except Exception:
        return {}


def save_state(state):
    try:
        with open(STATE_FILE, 'w') as f:
            json.dump(state, f)
    except Exception as e:
        print(f"[WARN] 状態ファイルの保存に失敗: {e}")


def suggest_bgm():
    bgm = random.choice(BGM_LIST)
    print("=== Terminal Boss BGM Suggester ===")
    print("本日のあなたのテーマソングは…")
    print(f"『{bgm['title']}』です!")
    print(bgm['description'])
    print(f"(参考: {bgm['url']})")


def should_suggest_today(state):
    today_str = date.today().isoformat()
    return state.get('last_suggested') != today_str


def mark_suggested_today(state):
    today_str = date.today().isoformat()
    state['last_suggested'] = today_str
    save_state(state)


def reset_state():
    if os.path.exists(STATE_FILE):
        os.remove(STATE_FILE)
        print("状態ファイルをリセットしました。")
    else:
        print("状態ファイルは存在しません。")


def show_history(state):
    last = state.get('last_suggested', None)
    if last:
        print(f"最後にBGMを提案した日: {last}")
    else:
        print("まだBGMは提案されていません。")


def main():
    parser = argparse.ArgumentParser(description="Terminal Boss BGM Suggester")
    subparsers = parser.add_subparsers(dest='command')

    parser_suggest = subparsers.add_parser('suggest', help='本日のBGMを提案')
    parser_reset = subparsers.add_parser('reset', help='状態ファイルをリセット')
    parser_history = subparsers.add_parser('history', help='BGM提案履歴を表示')

    args = parser.parse_args()
    state = load_state()

    if args.command == 'reset':
        reset_state()
        return
    elif args.command == 'history':
        show_history(state)
        return
    elif args.command == 'suggest' or args.command is None:
        if should_suggest_today(state):
            suggest_bgm()
            mark_suggested_today(state)
        else:
            print("本日は既にBGMが提案されています。historyで履歴を確認できます。")

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
terminal-boss-bgm-suggester は、最初のターミナルコマンド実行時に本日のBGMを完全ランダムで提案することで、日々の作業を少しだけ楽しくするユーティリティです。音楽再生は行わず、テキスト通知のみで環境を壊さない設計としています。

# 公式ドキュメント抜粋
- Python 標準ライブラリのみで実装
- ~/.terminal_boss_bgm_state.json にて1日1回の発動制御
- BGMリストはスクリプト内で管理

# 利用例
- .bashrcや.zshrcの最初に `python3 ~/.agents/skills/terminal-boss-bgm-suggester/terminal_boss_bgm_suggester.py` を追加
- /skills menu から明示呼び出しも可能

# 注意点
- テキスト通知のみで音楽再生や外部API通信は行いません
- 状態ファイルが破損した場合は `reset` サブコマンドで初期化可能

# 設計方針
- 環境非依存・ローカル完結
- 1日1回のみ発動し、複数ターミナルでも重複通知なし
- 職場利用時は選曲内容・通知内容に注意

導入手順

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

1. 前提

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

2. degit でフォルダ取得

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

npx degit aazutaku/ai-note/codex/terminal-boss-bgm-suggester .agents/skills/terminal-boss-bgm-suggester

.agents/skills/terminal-boss-bgm-suggester の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/terminal-boss-bgm-suggester
# 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で最初のコマンドに勝手にBGM提案してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

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

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

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

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