Codex ユーザーが日常でぶつかる悩み
Codex を日々の開発で使っていると、意外なタイミングで集中が切れてしまったり、作業空間が単調に感じてしまうことがあります。特に長時間の AI coding workflow や、複雑な monorepo での作業中は、ちょっとした気分転換や非日常感が欲しくなる瞬間が多いものです。「OSっぽい演出」や「意味不明な通知」が唐突に現れることで、作業のリズムが変わったり、場の空気が和らぐことも。
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
こうした「context 管理」や「path management」の悩みに加え、単調な開発空間をちょっとだけ楽しくしたいというニーズも、実は多くの Codex ユーザーが感じているポイントです。
この Skill が一言でいうと何を解決するか
一言サマリ: 作業中Skill。
このSkillは、作業の合間や特定のタイミングで「謎のOS環境音通知」をランダムに表示し、Codexの開発体験に非日常の演出を加えます。実際には何も再生されませんが、「今、森のさざめきBGMが流れている気がする」「OS公式からカフェ騒音推奨通知が来た」など、ちょっとした遊び心を感じられる状態になります。
- CodexのAI coding workflowに、予期せぬフェイク通知でリズムや気分転換をもたらす
- repository understandingやonboarding時に、非日常感のある演出で場を和らげる
- 長時間のlong context作業でも、「なぜ?」と思わせる通知で集中をリセット
- 実際には音が鳴らず、開発環境やメモリを侵さない安全な演出
- Skill管理が .agents/skills/ 配下で容易にでき、SKILL.mdベースで拡張も簡単
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/os-fake-ambient-soundscape-notifier .agents/skills/os-fake-ambient-soundscape-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or os-fake-ambient-soundscape-notifier mention
> 開発を始めます。リポジトリの構造を確認したい。
[OS通知] 本日は集中力向上のため、森のさざめきBGMを自動再生します。
[OS公式] 15分間の「謎のカフェ騒音」推奨タイムが開始されました。
(ご安心ください。実際には何も再生されません)
project/
├ src/
├ tests/
└ README.md
Codex context: root directory, memory snapshot取得済み
シーン2: monorepo / package 跨ぎ作業時
> packages/core から packages/ui に移動して作業します。
[OS通知] 新エリア突入: 砂浜の波音BGMに切り替えます。
[OS公式] monorepo内での集中力維持のため「謎の工事現場ノイズ」モードが有効化されました。
(実際の音声再生はありません)
packages/
├ core/
│ └ index.ts
└ ui/
└ App.tsx
Codex context: packages/ui フォーカス
シーン3: お遊び的な使い方
> ちょっと気分転換したい。何か面白い通知は?
[OS通知] 本日は「宇宙船内ホワイトノイズ」BGMを自動適用します。
[OS公式] 10分間の「謎の温泉地環境音」推奨タイムです。
(音は鳴っていませんが、気分だけは最高です)
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/os-fake-ambient-soundscape-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/os-fake-ambient-soundscape-notifier/
├── SKILL.md
├── scripts/
│ └── fake_ambient_soundscape_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/fake_ambient_soundscape_notifier.py |
OSフェイク環境音通知スキル |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: os-fake-ambient-soundscape-notifier
description: 作業中や集中タイム、または/skillsコマンドやスキル名の明示呼び出し時に、意味不明な“OS環境音通知”をランダムで出力します。集中、休憩、BGM、環境音、通知、演出などのキーワード出現時にも発動します。
---
# 機能概要
このSkillは、作業中や集中タイムに突然“謎のOS環境音通知”をデスクトップやターミナル上に出現させ、日常の作業空間を一瞬だけ非日常に変える演出を提供します。実際には音やBGMは一切再生されませんが、「本日は集中力向上のため、森のさざめきBGMを自動再生します」など、意味不明かつ面白い通知がランダムに表示されることで、作業の合間にちょっとした驚きやクスッとした気分転換をもたらします。通知内容は完全ランダムで、本人ですら「なぜ?」と思う不可解さが特徴です。
# 使い方
- 明示呼び出し例:
- `/skills menu` から選択
- `$os-fake-ambient-soundscape-notifier` とメンション
- 暗黙発動キーワード例:
- 「集中」「BGM」「環境音」「通知」「休憩」「演出」などのワード出現時、または作業開始/終了タイミング
# 出力例
```
[OS公式通知]: 本日は集中力向上のため、森のさざめきBGMを自動再生します。
[Ambient Soundscape]: 今から15分間は謎のカフェ騒音推奨。
[System Notice]: 休憩推奨: 海辺の波音モードがONになりました。
[OS公式]: 本日限定!工事現場の遠い雑音BGMが有効です。
[Ambient Soundscape]: 静かな図書館の空気感を再現中。
```
# 注意点
- 実際には音やBGMは一切再生されません。通知のみの“フェイク”仕様です。
- 通知頻度は自動で調整され、うるさすぎない設計です。
- ローカルへのファイル保存や履歴記録は行いません。
- 明示コマンドまたはキーワード検出時のみ発動します。
# 参考資料
詳細な設計方針や利用例は references/design_notes.md を参照してください。OSの通知APIやBGM再生APIは使用せず、標準出力のみで演出を行います。
scripts/fake_ambient_soundscape_notifier.py
import argparse
import random
import sys
import time
from datetime import datetime, timedelta
# 通知メッセージテンプレート
NOTIFICATION_TEMPLATES = [
'[OS公式通知]: 本日は集中力向上のため、{theme}BGMを自動再生します。',
'[Ambient Soundscape]: 今から{duration}は謎の{theme}騒音推奨。',
'[System Notice]: 休憩推奨: {theme}モードがONになりました。',
'[OS公式]: 本日限定!{theme}BGMが有効です。',
'[Ambient Soundscape]: 静かな{theme}の空気感を再現中。',
'[System Notification]: {theme}の環境音がバックグラウンドで流れています。',
'[OS]: {theme}BGMが自動的に切り替わりました。',
'[Ambient]: {theme}サウンドスケープ演出を開始します。',
'[OS公式]: 今だけ!{theme}の雰囲気をお楽しみください。',
'[System Notice]: {theme}のBGMが推奨されています。',
]
THEMES = [
'森のさざめき',
'カフェ',
'海辺の波音',
'工事現場の遠い雑音',
'図書館',
'雨音',
'宇宙船のエンジン音',
'地下鉄のホーム',
'オフィスのざわめき',
'鳥のさえずり',
'焚き火',
'夜の虫の声',
'静かな教室',
'山小屋',
'水族館',
'古いラジオ',
'工場の機械音',
'ショッピングモール',
'温泉の湯けむり',
'高原の風',
]
DURATIONS = [
'15分間', '30分間', '1時間', '10分間', '20分間', '5分間', '45分間'
]
HISTORY = []
# 通知生成関数
def generate_notification():
template = random.choice(NOTIFICATION_TEMPLATES)
theme = random.choice(THEMES)
duration = random.choice(DURATIONS)
msg = template.format(theme=theme, duration=duration)
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return f'[{timestamp}] {msg}'
# 通知を出力し履歴に追加
def notify():
msg = generate_notification()
print(msg)
HISTORY.append(msg)
# 履歴を表示
def list_history(args):
if not HISTORY:
print('通知履歴はありません。')
return
for item in HISTORY:
print(item)
# 履歴の要約
def summary(args):
print(f'通知回数: {len(HISTORY)}')
themes = [m.split('] ')[1] for m in HISTORY if '] ' in m]
theme_counts = {}
for t in THEMES:
count = sum(1 for line in themes if t in line)
if count > 0:
theme_counts[t] = count
if theme_counts:
print('テーマ別回数:')
for t, c in sorted(theme_counts.items(), key=lambda x: -x[1]):
print(f' {t}: {c}回')
else:
print('テーマ別集計はありません。')
# ランダムな間隔で通知を出す(うるさすぎないよう調整)
def auto_notify(args):
min_interval = args.min_interval or 600 # 10分
max_interval = args.max_interval or 1800 # 30分
duration = args.duration or 3600 # 1時間
end_time = datetime.now() + timedelta(seconds=duration)
print(f'フェイク環境音通知を{duration//60}分間、{min_interval//60}-{max_interval//60}分間隔で実行します。')
while datetime.now() < end_time:
notify()
wait = random.randint(min_interval, max_interval)
time.sleep(wait)
print('自動通知を終了しました。')
def main():
parser = argparse.ArgumentParser(description='OSフェイク環境音通知スキル')
subparsers = parser.add_subparsers(dest='command')
parser_notify = subparsers.add_parser('notify', help='今すぐフェイク通知を1回出す')
parser_notify.set_defaults(func=lambda args: notify())
parser_auto = subparsers.add_parser('auto', help='自動で一定間隔ごとにフェイク通知')
parser_auto.add_argument('--min-interval', type=int, help='通知の最小間隔(秒)')
parser_auto.add_argument('--max-interval', type=int, help='通知の最大間隔(秒)')
parser_auto.add_argument('--duration', type=int, help='実行時間(秒)')
parser_auto.set_defaults(func=auto_notify)
parser_list = subparsers.add_parser('list', help='通知履歴を表示')
parser_list.set_defaults(func=list_history)
parser_summary = subparsers.add_parser('summary', help='通知履歴の要約')
parser_summary.set_defaults(func=summary)
args = parser.parse_args()
if not args.command:
parser.print_help()
sys.exit(0)
args.func(args)
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、作業中のユーザーに“実際には鳴らない”環境音通知をランダムに表示し、非日常感やユーモアを演出するものです。実際の音声再生やOS通知APIは利用せず、標準出力のみで完結します。
# 公式ドキュメント抜粋
本SkillはPython標準ライブラリのみを用い、外部APIやOSの通知機能には依存しません。
# 利用例
- ターミナルで `python fake_ambient_soundscape_notifier.py notify` で1回通知
- `python fake_ambient_soundscape_notifier.py auto --duration 1800` で30分間ランダム通知
- `/skills menu` で明示的に呼び出し
# 注意点
- 実際の環境音やBGMは一切再生されません
- 通知内容は完全ランダム生成
- ログや履歴はプロセス内のみで永続保存はしません
# 設計方針
「なぜ?」と思わせる不可解な演出を重視し、通知頻度は10-30分間隔で自動調整。ユーザーの集中や休憩タイミングを邪魔しない設計です。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/os-fake-ambient-soundscape-notifier .agents/skills/os-fake-ambient-soundscape-notifier
.agents/skills/os-fake-ambient-soundscape-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/os-fake-ambient-soundscape-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 との連携設計はどうあるべきか?
- 通知内容が完全ランダムで面白いか?
- 本当に音は鳴らないフェイク仕様になっているか?
- 通知頻度やタイミングがうるさすぎないか?
実際に Codex で試した検証ログは Codexで謎の環境音通知を体験してみた!不思議なOS演出を楽しむ にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
