Codex ユーザーが日常でぶつかる悩み
Codex を使っていると、集中している最中にふとした瞬間に気が抜けてしまうことがあります。特に長時間の AI coding workflow では、context の維持や repository understanding に神経を使い続けるため、無意識のうちに作業空間が単調になりがちです。そんな中、通知や演出、OS連携系の Skill を活用したいと思う瞬間も多いはずです。実際の困りごとは以下の通りです。
- 長時間の作業で集中力が切れ、context や path management の精度が落ちる
- monorepo の複雑な directory 構造に圧倒され、repository の全体像を見失いがち
- session 再開時、前回の memory や context を思い出すのに余計な時間がかかる
- AI が repo の重要な部分を stale context で誤解し、やり直しが発生する
- 同じような作業を繰り返すうちに、作業空間が無機質でマンネリ化しやすい
通知・演出・OS連携カテゴリの Skill があれば、作業空間にちょっとした変化や余白を生み出し、気分転換にもつながります。Codex 固有の context 管理の悩みと、作業環境の単調さを同時に感じているユーザーにとって、遊び心のある Skill は意外と刺さる存在です。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、作業中に“謎のOS公式・ペット命名通知”を自動で炸裂させるSkill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 長時間の AI coding workflow で、突如 context をぶった切る“理不尽イベント”が発生し、作業空間にカオスな余白が生まれる
- repository や directory の単調な管理作業の合間に、ランダムな通知が入ることでリフレッシュや気分転換になる
- session 再開や monorepo 横断時に、謎の命名通知が現れてマンネリ化した repository understanding に刺激を与える
- Skill の発動は完全に無害で、実データや context には一切影響しない安心設計
- Codex の path management や memory 管理に疲れた時、ちょっとした笑いと混乱を提供する
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/os-fake-random-pet-name-notifier .agents/skills/os-fake-random-pet-name-notifier実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or os-fake-random-pet-name-notifier mention
> 開発準備を始める
[OS公式通知]
あなたのマウスは本日より「疾風のコロンブス」と命名されました。
今後このデバイスは「疾風のコロンブス」と呼称されます。
(特に意味はありません。作業を続行してください。)
[Codexメモ]
context: repo 構造を再認識中...
シーン2: monorepo / package 跨ぎ作業時
> packages/api/ から packages/web/ に移動
[OS公式通知]
あなたのキーボードの新しい名は「静寂なる鉄槌」です。
この名は monorepo 内でのみ有効です。
[Codexメモ]
directory: packages/web/ に context 切り替え
シーン3: お遊び的な使い方
> 今日は集中できない...
[OS公式通知]
本日より、あなたのディスプレイは「終末の光彩」と呼ばれます。
この命名に従い、作業効率が上がることはありません。
[Codexメモ]
memory: long 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/os-fake-random-pet-name-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/os-fake-random-pet-name-notifier/
├── SKILL.md
├── scripts/
│ └── pet_name_notifier.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/pet_name_notifier.py |
謎のOS公式ペット命名通知を発動します。 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: os-fake-random-pet-name-notifier
description: このSkillは「通知」「演出」「OS連携」カテゴリのタスクで、作業中や明示的な呼び出し時に“謎のOS公式・ペット命名通知”をランダムなタイミングで発動します。/skills menuやos-fake-random-pet-name-notifierの明示呼び出し、または「通知」「名前」「ペット」などのキーワードを含む会話文脈で自動発動します。
---
# 機能概要
os-fake-random-pet-name-notifierは、作業中や指定コマンドで、あなたのPCや周辺機器に意味不明な二つ名をランダムで“公式通知”として付与するスキルです。実用性は一切なく、集中力をほどよく削ぎ、作業空間にカオスとユーモアをもたらします。通知内容は毎回異なり、マウスやキーボード、ディスプレイなどに“疾風のコロンブス”“静寂なる鉄槌”などの二つ名が与えられます。
# 使い方
- 明示呼び出し例: `/skills menu` から本Skillを選択、または `os-fake-random-pet-name-notifier` を直接mention。
- 暗黙発動例: 「通知」「名前」「ペット」「命名」などのキーワードを含む会話や、作業中にランダムで自動発動。
- ターミナル/デスクトップ通知として表示されます。
# 出力例
```
[OS通知] あなたのマウスは本日より「疾風のコロンブス」と命名されました。
[OS通知] キーボードの新しい名は「静寂なる鉄槌」です。
[OS通知] ディスプレイの称号: 「蒼穹の監視者」
[OS通知] USBメモリは今後「記憶の旅人」と呼ばれます。
[OS通知] スピーカーの名は「雷鳴の詩人」になりました。
```
# 注意点
- 本Skillは作業やデータに一切影響しません。
- 通知はOSのネイティブ通知APIまたはターミナル出力で実現。
- ログや履歴はローカル保存されません。
- 業務用途や集中が必要な場面では発動に注意してください。
# 参考資料
詳細な設計方針や通知APIの利用例は references/ 以下に記載。OS通知にはPythonの`plyer`パッケージを利用。公式: https://github.com/kivy/plyer
scripts/pet_name_notifier.py
import random
import time
import argparse
import sys
from threading import Thread
try:
from plyer import notification
PLYER_AVAILABLE = True
except ImportError:
PLYER_AVAILABLE = False
DEVICES = [
'マウス', 'キーボード', 'ディスプレイ', 'USBメモリ', 'スピーカー',
'Webカメラ', 'プリンター', 'タッチパッド', 'マイク', 'ヘッドフォン',
'ノートPC', 'デスクトップ', 'ルーター', 'ハードディスク', 'グラフィックボード',
'ゲームコントローラー', 'スマートフォン', 'タブレット', 'SDカード', '外付けSSD'
]
TITLES = [
'疾風のコロンブス', '静寂なる鉄槌', '蒼穹の監視者', '記憶の旅人', '雷鳴の詩人',
'銀河の案内人', '孤高の守護者', '無敵の参謀', '夜明けの伝道師', '緋色の彗星',
'電脳の魔術師', '月影の探求者', '不屈の航海士', '旋律の錬金術師', '蒼炎の紳士',
'夢見る彫刻家', '時空の旅人', '静謐なる監督者', '閃光の観測者', '鉄壁の門番',
'霧中の道化師', '深淵の観察者', '星降る語り部', '氷上の舞踏家', '暁の預言者',
'孤独な詩人', '風切る伝令', '無音の奏者', '鉄槌の守人', '流星の案内人'
]
MESSAGES = [
'あなたの{device}は本日より「{title}」と命名されました。',
'{device}の新しい名は「{title}」です。',
'{device}の称号: 「{title}」',
'{device}は今後「{title}」と呼ばれます。',
'{device}の名は「{title}」になりました。',
'祝!{device}が「{title}」の称号を獲得しました。',
'公式通知: {device}の二つ名は「{title}」です。',
'{device}が「{title}」として登録されました。',
'本日より{device}は「{title}」に昇格しました。',
'{device}の名誉称号「{title}」を授与します。'
]
VERSION = '1.0.0'
class Notifier:
def __init__(self, use_os_notify=True, dry_run=False):
self.use_os_notify = use_os_notify and PLYER_AVAILABLE
self.dry_run = dry_run
def notify(self, message):
if self.use_os_notify:
try:
notification.notify(
title='OS通知',
message=message,
app_name='PetNameNotifier',
timeout=6
)
except Exception as e:
print(f'[通知失敗] {message} ({e})')
print(message)
else:
print(f'[OS通知] {message}')
def random_pet_name(self):
device = random.choice(DEVICES)
title = random.choice(TITLES)
template = random.choice(MESSAGES)
return template.format(device=device, title=title)
def run_once(self):
msg = self.random_pet_name()
self.notify(msg)
def run_random_loop(self, min_sec=60, max_sec=600):
try:
while True:
interval = random.randint(min_sec, max_sec)
time.sleep(interval)
self.run_once()
except KeyboardInterrupt:
print('終了します。')
def batch(self, count=5, interval=2):
for _ in range(count):
self.run_once()
time.sleep(interval)
def parse_args():
parser = argparse.ArgumentParser(description='謎のOS公式ペット命名通知を発動します。')
subparsers = parser.add_subparsers(dest='command')
parser_once = subparsers.add_parser('once', help='1回だけ通知')
parser_once.add_argument('--dry-run', action='store_true', help='OS通知を使わず標準出力のみ')
parser_loop = subparsers.add_parser('loop', help='ランダムな間隔で永続通知')
parser_loop.add_argument('--min', type=int, default=60, help='最小間隔(秒)')
parser_loop.add_argument('--max', type=int, default=600, help='最大間隔(秒)')
parser_loop.add_argument('--dry-run', action='store_true', help='OS通知を使わず標準出力のみ')
parser_batch = subparsers.add_parser('batch', help='複数回連続通知')
parser_batch.add_argument('--count', type=int, default=5, help='通知回数')
parser_batch.add_argument('--interval', type=int, default=2, help='通知間隔(秒)')
parser_batch.add_argument('--dry-run', action='store_true', help='OS通知を使わず標準出力のみ')
parser.add_argument('--version', action='store_true', help='バージョン表示')
return parser.parse_args()
def main():
args = parse_args()
if args.version:
print(f'os-fake-random-pet-name-notifier v{VERSION}')
sys.exit(0)
if args.command == 'once':
notifier = Notifier(dry_run=args.dry_run)
notifier.run_once()
elif args.command == 'loop':
notifier = Notifier(dry_run=args.dry_run)
notifier.run_random_loop(min_sec=args.min, max_sec=args.max)
elif args.command == 'batch':
notifier = Notifier(dry_run=args.dry_run)
notifier.batch(count=args.count, interval=args.interval)
else:
print('使い方:')
print(' python pet_name_notifier.py once [--dry-run]')
print(' python pet_name_notifier.py loop [--min 60 --max 600 --dry-run]')
print(' python pet_name_notifier.py batch [--count 5 --interval 2 --dry-run]')
print(' --version でバージョン表示')
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このスキルは、ユーザーの作業中に突発的な“謎のOS公式・ペット命名通知”を発動することで、作業空間にユーモアとカオスを提供します。実用性をあえて排除し、集中力を削ぐことを目的としています。
# 公式ドキュメント抜粋
通知には Python の plyer パッケージを利用しています。plyer はクロスプラットフォームで OS のネイティブ通知を呼び出すことができます。
- plyer: https://github.com/kivy/plyer
# 利用例
- 明示呼び出し: `python pet_name_notifier.py once` で即時通知
- バッチ: `python pet_name_notifier.py batch --count 10 --interval 1`
- ランダム自動発動: `python pet_name_notifier.py loop --min 30 --max 300`
# 注意点
- plyer が未インストールの場合は標準出力のみとなります。
- 通知履歴や命名履歴はローカル保存されません。
- OSや環境によっては通知が表示されない場合があります。
# 設計方針
- 実在APIのみを利用し、CLIサブコマンドで柔軟に動作。
- 通知文・デバイス・二つ名のバリエーションを十分に確保し、毎回違う体験を演出。
- Skill本体は副作用を持たず、作業やデータに影響を与えません。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/os-fake-random-pet-name-notifier .agents/skills/os-fake-random-pet-name-notifier
.agents/skills/os-fake-random-pet-name-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/os-fake-random-pet-name-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で謎のペット命名通知を炸裂させてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
