Codex ユーザーが日常でぶつかる悩み
Codex を使った AI coding workflow では、日々の開発作業中にちょっとしたストレスや「またか…」という瞬間が積み重なりがちです。特に通知や演出、OS連携の領域では、作業集中とリラックスの切り替えが意外と難しいもの。以下のような悩みが「あるある」としてよく挙げられます。
- 長時間の session で集中しすぎて、気分転換や小休止のタイミングを逃しがち
- Codex の context や repository understanding が途切れた際、何か「区切り」や「リセット」の合図がほしい
- monorepo の複雑な directory や path management に没頭していると、作業が単調になり気分が沈みがち
- AI とのやりとりが淡々と進むだけで、遊び心やユーモアが皆無になりがち
- たまに通知が欲しいが、実用的なものばかりで「意味不明な演出」や「謎の癒し」がほしい瞬間がある
こうした日常の「ちょっとした隙間」や「作業の合間」に、何か突拍子もない演出が入ることで、workflow に新しい風を吹き込みたいというニーズが潜在しています。
この Skill が一言でいうと何を解決するか
一言サマリ: あなたの作業中Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 作業中、突然ランダムな“謎のOSマスコット”がデスクトップ通知で現れ、気分転換やリラックスのきっかけを提供
- 意味不明な激励や警告が workflow の合間に差し込まれ、単調な AI coding workflow に遊び心が加わる
- Codex の context や repository understanding とは無関係に、「なんでこれ…」と正気を疑う体験で頭をリフレッシュ
- monorepo や長時間 session で疲れがちなタイミングに、思わず笑ってしまう演出が入る
- Skill の導入・管理も .agents/skills/ 配下で完結し、path 管理や setup の手間が少ない
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-fake-mascot-parade .agents/skills/random-os-fake-mascot-parade実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu
[通知] カーネルくんが現れた!
「このリポジトリのバグ、カーネルレベルで見守ってるよ!」
[通知] メモリねずみが走り抜ける!
「context が溢れそう?メモリ解放も忘れずに!」
[通知] シェルパンダが一服推奨
「長時間作業は危険だよ。たまにはコマンド休憩しよう!」
シーン2: monorepo / package 跨ぎ作業時
> packages/core/ に移動
[通知] ストレージタヌキが荷物を運ぶ!
「/core/ ディレクトリの整理はお任せあれ!」
[通知] バイナリモグラが地中から登場
「monorepo の奥深くまで掘り進んでみよう!」
[通知] パスカメがのそのそ現れる
「directory 増えすぎ注意。path 管理はゆっくり確実に!」
シーン3: お遊び的な使い方
> なんとなく /skills menu を開いてみる
[通知] デバイスカエルがジャンプ!
「今日も新しい device が増えたよ。気のせいかも?」
[通知] プロセスリスが木の上から応援
「thread 間の競合も、みんなで乗り越えよう!」
[通知] エラーイヌが遠吠え
「バグ?エラー?気にせず進もうワン!」
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/random-os-fake-mascot-parade/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-fake-mascot-parade/
├── SKILL.md
├── scripts/
│ └── mascot_parade.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/mascot_parade.py |
謎のOSマスコット大行進通知スクリプト |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-mascot-parade
description: 作業中や特定のキーワード(例: build, compile, debug, error, idle, focus)を含むイベント時に、謎のOS風マスコットのランダムな応援や警告をデスクトップ通知で表示します。明示的な呼び出し(/skills menuやrandom-os-fake-mascot-paradeメンション)でも発動可能です。
---
# 機能概要
このSkillは、作業中に突如として“謎のOSマスコット”たちがデスクトップ通知で現れるという、全く役に立たないネタ演出を提供します。マスコット名・セリフともに毎回完全ランダムで生成され、カーネルくんやシェルパンダ、メモリねずみなど、架空のOSキャラが意味不明な激励や警告を残して去っていきます。作業の合間に「なぜこれが…」と正気を疑いたくなる体験を演出します。
# 使い方
- 明示呼び出し例: `/skills menu` から本Skillを選択、または `random-os-fake-mascot-parade` をメンション。
- 暗黙発動例: `build`, `compile`, `debug`, `error`, `idle`, `focus` などのイベントやキーワードを含む作業時に自動発動。
# 出力例
```
[通知] カーネルくん: 「ファイルシステムの夢を見てるよ!」
[通知] メモリねずみ: 「バグ撲滅運動中。君も参加しよう!」
[通知] シェルパンダ: 「一服推奨。コマンド履歴は忘れないよ。」
[通知] スワップペンギン: 「メモリが足りない?いや、気合で乗り切ろう!」
[通知] バイナリフクロウ: 「夜更かし注意。バイト列が乱れてるよ。」
```
# 注意点
- 通知内容は完全ランダムで、実用性や生産性は一切ありません。
- 通知頻度は過剰にならないよう内部で制御していますが、長時間の作業では複数回出現します。
- 通知内容やキャラ名は毎回異なり、ローカルに保存されません。
- 一部OSや通知環境によっては表示されない場合があります。
# 参考資料
- [notify2公式ドキュメント](https://pypi.org/project/notify2/)
- references/design_notes.md 参照: Skill設計方針や通知API利用例、注意点などをまとめています。
scripts/mascot_parade.py
import random
import time
import argparse
import sys
import threading
import os
try:
import notify2
except ImportError:
notify2 = None
MASCOTS = [
{"name": "カーネルくん", "lines": [
"ファイルシステムの夢を見てるよ!",
"カーネル空間から応援中。",
"プロセス管理は任せて!",
"割り込みは突然に。",
"再起動は気分転換。"
]},
{"name": "メモリねずみ", "lines": [
"バグ撲滅運動中。君も参加しよう!",
"メモリリークには気をつけて。",
"キャッシュは友達。",
"スワップしすぎ注意。",
"RAMの隅で見守ってるよ。"
]},
{"name": "シェルパンダ", "lines": [
"一服推奨。コマンド履歴は忘れないよ。",
"シェル芸はほどほどに。",
"$HOMEでゴロゴロ中。",
"パイプでつながろう。",
"aliasで省エネ生活。"
]},
{"name": "スワップペンギン", "lines": [
"メモリが足りない?いや、気合で乗り切ろう!",
"スワップ領域でスケート中。",
"仮想メモリの海を泳ぐ。",
"ページアウトはお手の物。",
"メモリ圧縮、得意です。"
]},
{"name": "バイナリフクロウ", "lines": [
"夜更かし注意。バイト列が乱れてるよ。",
"16進数の森で羽ばたく。",
"バイナリ解析はおまかせ。",
"エンディアンに敏感。",
"ファイルヘッダを見抜く目。"
]},
{"name": "プロセスカメ", "lines": [
"ゆっくりでも確実に進行中。",
"プロセスIDは誇り。",
"ゾンビ化しないよう注意。",
"forkは慎重に。",
"シグナルはおだやかに。"
]},
{"name": "ログキャット", "lines": [
"ログはすべて見ている。",
"/var/logで昼寝中。",
"tail -fが趣味。",
"エラーは見逃さない。",
"INFOも大事に。"
]},
{"name": "パケットリス", "lines": [
"ネットワーク越しに応援!",
"pingで挨拶。",
"パケットキャプチャ大好き。",
"ルーティングは迷路。",
"TCP/IPの森の住人。"
]}
]
KEYWORDS = ["build", "compile", "debug", "error", "idle", "focus"]
NOTIFY_INTERVAL_SEC = 600 # 10分に1回まで
_last_notify_time = 0
def pick_random_mascot():
mascot = random.choice(MASCOTS)
line = random.choice(mascot["lines"])
return mascot["name"], line
def show_notification(title, message):
if notify2 is None:
print(f"[通知] {title}: {message}")
return
try:
notify2.init("random-os-fake-mascot-parade")
n = notify2.Notification(title, message)
n.set_urgency(notify2.URGENCY_NORMAL)
n.set_timeout(5000)
n.show()
except Exception as e:
print(f"[通知] {title}: {message} (notify2失敗: {e})")
def should_notify():
global _last_notify_time
now = time.time()
if now - _last_notify_time >= NOTIFY_INTERVAL_SEC:
_last_notify_time = now
return True
return False
def mascot_parade_once():
name, line = pick_random_mascot()
show_notification(name, f"「{line}」")
def mascot_parade_daemon():
while True:
if should_notify():
mascot_parade_once()
time.sleep(30)
def parse_args():
parser = argparse.ArgumentParser(description="謎のOSマスコット大行進通知スクリプト")
subparsers = parser.add_subparsers(dest="command")
subparsers.add_parser("once", help="1回だけ通知する")
subparsers.add_parser("daemon", help="定期的に通知を表示する(バックグラウンド向け)")
parser_keywords = subparsers.add_parser("event", help="キーワードイベントで通知")
parser_keywords.add_argument("--keyword", required=True, help="発生したイベントキーワード")
return parser.parse_args()
def event_notify(keyword):
if keyword.lower() in KEYWORDS and should_notify():
mascot_parade_once()
else:
print(f"[INFO] キーワード '{keyword}' では通知をスキップしました。")
def main():
args = parse_args()
if args.command == "once":
mascot_parade_once()
elif args.command == "daemon":
print("[INFO] マスコット大行進デーモンを開始します… (Ctrl+Cで停止)")
try:
mascot_parade_daemon()
except KeyboardInterrupt:
print("[INFO] 停止しました。")
elif args.command == "event":
event_notify(args.keyword)
else:
print("usage: mascot_parade.py [once|daemon|event --keyword=KEY]")
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
本Skillは、毎回ランダムな“謎OSマスコット”名とセリフを生成し、notify2等の実在API経由でデスクトップ通知として表示する演出特化型ツールです。
# 公式ドキュメント抜粋
notify2 (https://pypi.org/project/notify2/)はLinuxデスクトップ通知の標準的Pythonライブラリで、クロスデスクトップ環境で動作します。Windows/Macでは標準通知APIへの移植が必要です。
# 利用例
- 明示: `python mascot_parade.py once` で1回だけ通知
- デーモン: `python mascot_parade.py daemon` で10分ごとに自動通知
- イベント連携: `python mascot_parade.py event --keyword=build` で特定作業時に通知
# 注意点
- 実用性は皆無で、作業の集中や効率化には寄与しません。
- 通知頻度は10分に1回まで自動制御し、うるさすぎない設計です。
- マスコット名・セリフは都度完全ランダム生成。
# 設計方針
- Skill本体はCLIサブコマンド形式で、明示/暗黙いずれの呼び出しにも対応。
- OS依存部分はnotify2等の実在APIのみを利用し、架空APIや関数は使用しません。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-fake-mascot-parade .agents/skills/random-os-fake-mascot-parade
.agents/skills/random-os-fake-mascot-parade の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-fake-mascot-parade
# 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 との連携設計はどうあるべきか?
- 通知内容が毎回マスコット名・セリフともに完全ランダムであるか?
- 通知頻度や表示タイミングがうるさすぎず、かつ唐突さが維持できているか?
- 通知本文やキャラ名にOS風味や謎の愛嬌が出ているか?
実際に Codex で試した検証ログは Codexで謎のOSマスコット大行進を体験してみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。
関連タグで他のSkill記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
