Codex ユーザーが日常でぶつかる悩み
日々Codexを使っていると、真面目な開発作業の合間にふと「何か刺激が足りない」と感じる瞬間がありませんか。特に長時間のAI coding workflowや、monorepoの複雑なrepository understandingに没頭していると、集中力が切れたり、同じcontextの繰り返しで頭がぼんやりしたりしがちです。そんな時、思わず「今、何か起きてほしい」と感じることも。
- Codex が context を見失って違う場所のコードを参照するたび、気分転換のきっかけが欲しくなる
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れるので、作業の区切りを可視化したくなる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけず、単調なルーチンに飽きが来る
- 長時間 workflow で long context が膨らみすぎて、重要な情報が薄まり、集中力が途切れる
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になり、気分転換が欲しくなる
こうした「作業のリズムが単調になる」「AIとのやりとりが機械的になりすぎる」といった悩みは、通知・演出・OS連携系Skillでちょっとした非日常を挟むことで、意外なリフレッシュ効果が期待できます。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは「作業中に突如現れる“謎のOS公式デスクトップペット”で、Codexの単調なAI coding workflowに強制的な非日常を注入し、気分転換と癒しを与えるSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- Codexの長時間 session や単調なrepository understandingの途中で、ランダムなペット演出が入り、集中力リセットや気分転換になる
- monorepoやdirectory移動時など、path managementの区切りタイミングで“謎ペット”が現れ、作業の節目を可視化できる
- 通知ウィンドウや進捗バーを横切る演出で、AI coding workflowに遊び心と癒しをプラス
- Skillは実害ゼロで、作業の流れを物理的に妨害せず、あくまで“ちょっとした非日常”として機能
- Codexのcontextやmemoryのマンネリ化を和らげ、onboardingやsession再開時にも話題作りになる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-fake-desktop-pet-pop .agents/skills/random-os-fake-desktop-pet-pop実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu
🐧 OS公式ペンギンが突然現れた!
「こんにちは、私は進捗を監視するペンギンです。今日もrepoの旅を見守ります。」
[通知] Skill の中身を全部見せる
.agents/skills/random-os-fake-desktop-pet-pop/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-fake-desktop-pet-pop/
├── SKILL.md
├── scripts/
│ └── desktop_pet_pop.py
└── references/
└── design_notes.md
各ファイルの役割
ファイル
役割
SKILL.md
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/desktop_pet_pop.py
random-os-fake-desktop-pet-pop
references/design_notes.md
概要 をまとめた参考資料
SKILL.md
---
name: random-os-fake-desktop-pet-pop
description: 作業中やコマンド実行時に、'デスクトップペット'がランダムに現れる演出を追加したい時に発動。'ペット', '癒し', '通知', '集中妨害', '遊び心'などのキーワードや、/skills menu から明示的に呼び出された場合に発動します。
---
# 機能概要
このSkillは、日々の作業やコーディング中に突然“謎のOS公式デスクトップペット”がターミナルや通知領域に乱入する演出を提供します。ペットは毎回ランダムで登場し、「OS公式ペンギン」「バグを拾う犬」「やる気を吸い取る猫」など、意味不明な自己紹介やアクションを披露します。実際の作業には何の役にも立ちませんが、単調な作業に一瞬の非日常体験をもたらし、癒しや笑いを提供します。
# 使い方
- 明示呼び出し: `/skills menu` から `random-os-fake-desktop-pet-pop` を選択、または `$random-os-fake-desktop-pet-pop` を直接メンション。
- 暗黙発動: 'ペット', '癒し', '通知', '集中妨害', '遊び心' などのキーワードを含む会話やコマンド実行時に自動発動。
# 出力例
```
[🐧 OS公式ペンギン] こんにちは!今日もバグを凍らせに来ました。
[🐶 バグを拾う犬] 進捗バーの下に何か落ちてない?ワン!
[🐱 やる気を吸い取る猫] ふぁ〜…やる気、いただきます。
[🐦 謎の鳥] ピヨピヨ…(通知ウィンドウを横切る)
[🐢 ゆっくりカメ] 進捗は急がなくてもいいんだよ…
```
# 注意点
- 本Skillは実用性ゼロのエンタメ用途です。実際の作業やファイルには影響しません。
- 出現頻度は自動制御され、過度な妨害は行いません。
- ローカルに画像や履歴は保存しません。
- 一部端末や通知環境によっては演出が表示されない場合があります。
# 参考資料
詳細設計や参考実装は `references/design_notes.md` を参照。Pythonの標準通知APIやクロスプラットフォームなターミナル演出手法を活用しています。
scripts/desktop_pet_pop.py
import sys
import time
import random
import argparse
import threading
import platform
from typing import List, Dict, Callable
try:
if platform.system() == 'Darwin':
import subprocess
elif platform.system() == 'Linux':
import subprocess
elif platform.system() == 'Windows':
import win10toast
except ImportError:
pass
# ペット定義
PETS = [
{
'name': 'OS公式ペンギン',
'icon': '🐧',
'actions': [
'こんにちは!今日もバグを凍らせに来ました。',
'進捗バーの上で滑ってみます。',
'冷たい視線であなたを見つめている…',
'ペンギン語でバグを追い払う!',
]
},
{
'name': 'バグを拾う犬',
'icon': '🐶',
'actions': [
'進捗バーの下に何か落ちてない?ワン!',
'バグをくわえてどこかへ…',
'あなたの足元でしっぽを振っている。',
'通知ウィンドウを横切るワン!',
]
},
{
'name': 'やる気を吸い取る猫',
'icon': '🐱',
'actions': [
'ふぁ〜…やる気、いただきます。',
'キーボードの上で寝始めた!',
'あなたをじっと見つめている。',
'進捗バーを横切って去っていく。',
]
},
{
'name': '謎の鳥',
'icon': '🐦',
'actions': [
'ピヨピヨ…(通知ウィンドウを横切る)',
'バグをついばみに来たよ。',
'どこからともなく飛来。',
'進捗バーの上で羽ばたく。',
]
},
{
'name': 'ゆっくりカメ',
'icon': '🐢',
'actions': [
'進捗は急がなくてもいいんだよ…',
'のろのろと画面端を移動中。',
'バグを踏みつぶして進む。',
'あなたの集中力を見守っている。',
]
}
]
# 通知表示関数
def show_notification(title: str, message: str):
sys_platform = platform.system()
if sys_platform == 'Darwin':
try:
subprocess.run([
'osascript', '-e', f'display notification "{message}" with title "{title}"'
], check=True)
except Exception:
print(f"[{title}] {message}")
elif sys_platform == 'Linux':
try:
subprocess.run([
'notify-send', title, message
], check=True)
except Exception:
print(f"[{title}] {message}")
elif sys_platform == 'Windows':
try:
toaster = win10toast.ToastNotifier()
toaster.show_toast(title, message, duration=4)
except Exception:
print(f"[{title}] {message}")
else:
print(f"[{title}] {message}")
# ターミナル演出
def terminal_pet_pop(pet: Dict):
lines = [
f"[{pet['icon']} {pet['name']}] {random.choice(pet['actions'])}",
"",
"(数秒で消えます…)"
]
for line in lines:
print(line)
time.sleep(0.5)
# 擬似的に消す(スクロールで流す)
for _ in range(len(lines)):
print()
time.sleep(0.2)
# ペット出現処理
def pop_pet(mode='auto', notify=True, terminal=True):
pet = random.choice(PETS)
action = random.choice(pet['actions'])
title = f"{pet['icon']} {pet['name']}"
if notify:
show_notification(title, action)
if terminal:
terminal_pet_pop(pet)
# サブコマンド: pop/list/summary
def list_pets():
print("=== ペット一覧 ===")
for pet in PETS:
print(f"{pet['icon']} {pet['name']}")
for act in pet['actions']:
print(f" - {act}")
print()
def summary():
print("このSkillは、作業中にランダムでデスクトップペットが現れる癒し系・妨害系エンタメ演出を提供します。\n")
print("ペット数:", len(PETS))
print("出現アクション例:")
for pet in PETS:
print(f"- {pet['name']}: {pet['actions'][0]}")
print()
# 頻度制御: 1分に1回以上は出現しない
_last_pop_time = 0
def can_pop():
global _last_pop_time
now = time.time()
if now - _last_pop_time > 60:
_last_pop_time = now
return True
return False
def main():
parser = argparse.ArgumentParser(description='random-os-fake-desktop-pet-pop')
subparsers = parser.add_subparsers(dest='command')
pop_parser = subparsers.add_parser('pop', help='ペットを即座に出現させる')
pop_parser.add_argument('--no-notify', action='store_true', help='通知を出さない')
pop_parser.add_argument('--no-terminal', action='store_true', help='ターミナル演出を出さない')
list_parser = subparsers.add_parser('list', help='ペット一覧とアクションを表示')
summary_parser = subparsers.add_parser('summary', help='Skill概要を表示')
args = parser.parse_args()
if args.command == 'pop':
pop_pet(notify=not args.no_notify, terminal=not args.no_terminal)
elif args.command == 'list':
list_pets()
elif args.command == 'summary':
summary()
else:
# デフォルト: 頻度制御付きで自動発動
if can_pop():
pop_pet()
else:
print("(ペットはまだ出現しません。しばらく待ってください)")
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、作業中やコマンド実行時に“デスクトップペット”がランダムに現れることで、ユーザーに癒しや笑いを提供するエンタメ演出を目的としています。実用性はありませんが、作業の合間にちょっとした非日常感を演出します。
# 公式ドキュメント抜粋
- macOS: `osascript` で通知表示
- Linux: `notify-send` コマンド
- Windows: `win10toast` ライブラリ
- ターミナル演出は標準出力を利用
# 利用例
- `/skills menu` から明示呼び出し
- キーワード検知による自動発動
- CLI: `python desktop_pet_pop.py pop` で即座にペット登場
# 注意点
- 頻度制御により、1分以内に複数回出現しません
- 通知が出せない環境ではターミナル出力のみ
- ログや履歴は残しません
# 設計方針
- クロスプラットフォーム対応の標準APIのみを利用
- ペットやアクションは拡張しやすい設計
- 実作業の妨害になりすぎない頻度調整を重視
- エンタメ性と安全性を両立
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit 実行に必要)
- Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-fake-desktop-pet-pop .agents/skills/random-os-fake-desktop-pet-pop
.agents/skills/random-os-fake-desktop-pet-pop の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-fake-desktop-pet-pop
# 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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
