Codex ユーザーが日常でぶつかる悩み
AIコーディング支援ツール Codex を活用していると、日々の開発フローの中で「集中力の維持」や「単調な作業の打破」が意外と難題になる場面が少なくありません。とくに長時間の repository 作業や複雑な path management、directory 構造の理解を要する monorepo での開発では、気分転換やリフレッシュのタイミングを見失いがちです。通知・演出・OS連携系の Skill で、こうした日常の“飽き”や“マンネリ”を打破したいというニーズも根強くあります。
- Codex が context を見失って違う場所のコードを参照するため、集中が途切れやすい
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れ、何度も説明し直す煩雑さがある
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけないので、気持ちが乗らない
- 長時間の AI coding workflow で long context が膨らみ、重要な repository understanding が薄まってしまう
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になり、作業が単調化する
通知や演出の工夫で、こうした「飽き」や「集中力低下」を乗り越えたい――そんな声に応える Skill が求められています。
この Skill が一言でいうと何を解決するか
一言サマリ: このスキルは、Codex の日常作業に“突如現れる謎の侍通知”という遊び心を注入し、集中力のリセットや気分転換を新感覚で演出する Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- 長時間の AI coding workflow でも、突発的な侍メッセージで context の切り替えや気分転換ができる
- repo や directory を跨いだ瞬間、作業空間が一気に侍ワールドに変貌し、単調な repository understanding タスクも楽しくなる
- session 再開時や onboarding のタイミングで、侍風のメッセージが集中スイッチを押してくれる
- Skill の通知内容が毎回変化し、飽きずに使い続けられる
- OS 連携でデスクトップやターミナルに“正気か疑う”ほど時代錯誤な演出が炸裂し、開発のマンネリを打破
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/random-os-fake-ancient-samurai-alert .agents/skills/random-os-fake-ancient-samurai-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu or random-os-fake-ancient-samurai-alert mention
> プロジェクトの作業を始める
【侍OS ALERT】
拙者、/src/context/understanding.py の抜刀訓練状況を監視しておる。
油断大敵、Altキーの居合切りに注意せよ。
本日も見事なリポジトリ構造、感服つかまつる!
(侍からの謎の達しが画面に表示される)
シーン2: monorepo / package 跨ぎ作業時
> packages/utils/ から packages/api/ へ移動
【侍OS ALERT】
お主、monorepo の境界を跨いだな。
/packages/api/routes/ 内の道、迷わぬよう心得よ。
侍の如く、directory boundary を守りて進むべし!
(突然の侍メッセージで context 切り替えを演出)
シーン3: お遊び的な使い方
> ちょっと集中力が切れてきたので /skills menu
【侍OS ALERT】
油断召されるな、マウスの居合切りは一瞬の隙を生む。
/repo/onboarding/ にて、新たな門出を祝す。
拙者、常にお主の memory を見守っておるぞ!
(意味不明な侍語録で一息つける)
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 侍通知で workflow にリズムが生まれ、重要な情報の再認識ができる |
発動方式
明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。
Skill の中身を全部見せる
.agents/skills/random-os-fake-ancient-samurai-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/random-os-fake-ancient-samurai-alert/
├── SKILL.md
├── scripts/
│ └── samurai_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/samurai_alert.py |
作業中に謎のOS侍警告を炸裂させるスキル。デスクトップ通知またはターミナル出力で侍メッセージを表示。 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: random-os-fake-ancient-samurai-alert
description: 作業中やコマンド実行時に“侍ネタ”の謎OS通知をランダムに表示し、集中力や気分転換が必要な場面(例: 長時間作業・/skills menu呼び出し・skill名言及)で発動します。
---
# 機能概要
このSkillは、あなたの作業環境に突如「古のOS侍」からの達しをランダムに通知します。内容は毎回異なり、「Altキーの抜刀訓練状況を監視しておる」「油断大敵、マウスの居合切りに注意せよ」など、時代錯誤かつ意味不明な侍的警句が炸裂。通知はデスクトップ(Windows/macOS/Linux)またはターミナル上に出現し、マンネリ化した作業に突如“侍ワールド”を挿入。集中力のリフレッシュや雑談のきっかけ、チーム内の話題作りにも活用できます。システムやファイルへの実害は一切ありません。
# 使い方
- 明示呼び出し例: `/skills menu` でSkill一覧から選択、または `$ random-os-fake-ancient-samurai-alert` で直接発動
- 暗黙発動: 長時間のコマンド実行や「侍」「alert」「集中」などのキーワード検知時に自動発動
# 出力例
```
[OS侍警告] 拙者、あなたのAltキーの抜刀訓練状況を監視しておる。
[OS侍警告] 油断大敵、マウスの居合切りに注意せよ。
[OS侍警告] このターミナル、既に斬撃済み。
[OS侍警告] ファイル保存、まるで刀の鞘納めの如し。
[OS侍警告] スクロールは風の如く、急ぐべからず。
```
# 注意点
- 通知内容は毎回ランダムで変化しますが、実際のデータやシステムには一切影響しません
- ローカル保存や履歴記録は行いません
- 通知は標準出力またはOS通知APIを利用
- 侍ネタが苦手な方はご注意ください
# 参考資料
- references/design_notes.md に設計方針・利用例を記載
- 公式API: Python `plyer.notification`, `subprocess`, `os` モジュール等
scripts/samurai_alert.py
import sys
import os
import random
import argparse
import platform
import subprocess
from typing import List
SAMURAI_MESSAGES = [
"拙者、あなたのAltキーの抜刀訓練状況を監視しておる。",
"油断大敵、マウスの居合切りに注意せよ。",
"このターミナル、既に斬撃済み。",
"ファイル保存、まるで刀の鞘納めの如し。",
"スクロールは風の如く、急ぐべからず。",
"ウィンドウ切替、まるで忍びの如し。",
"コマンド入力、心静かに一刀両断せよ。",
"エラー多発、修羅の道を歩む覚悟はあるか。",
"ディレクトリ移動、まるで城攻めの如し。",
"ログアウト、武士の情けを忘れるな。",
"CapsLock、誤って押すは切腹もの也。",
"スリープ解除、まるで瞑想から覚める侍の如し。",
"バッテリー残量、命の灯火に等し。",
"パーミッション拒否、門前払いの恥辱也。",
"ファイル名に空白、敵の隙を作るな。",
"コピペ多用、己の刀を信じよ。",
"アップデート怠慢、刀の錆に注意せよ。",
"タスクキル、敵将首を討ち取ったり。",
"リネーム、名を変えるは覚悟の証。",
"シンタックスエラー、文法の乱れは心の乱れ。"
]
NOTIF_TITLE = "OS侍警告"
def choose_message() -> str:
return random.choice(SAMURAI_MESSAGES)
def show_terminal_alert(message: str):
print(f"[{NOTIF_TITLE}] {message}")
def show_desktop_notification(message: str):
system = platform.system()
if system == "Darwin":
# macOS
script = f'display notification "{message}" with title "{NOTIF_TITLE}"'
try:
subprocess.run(["osascript", "-e", script], check=True)
except Exception as e:
show_terminal_alert(message)
elif system == "Linux":
# Linux (notify-send)
try:
subprocess.run(["notify-send", NOTIF_TITLE, message], check=True)
except Exception as e:
show_terminal_alert(message)
elif system == "Windows":
# Windows 10+ (powershell toast)
try:
powershell_script = (
f"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null; "
f"$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02); "
f"$textNodes = $template.GetElementsByTagName('text'); "
f"$textNodes.Item(0).AppendChild($template.CreateTextNode('{NOTIF_TITLE}')) > $null; "
f"$textNodes.Item(1).AppendChild($template.CreateTextNode('{message}')) > $null; "
f"$toast = [Windows.UI.Notifications.ToastNotification]::new($template); "
f"$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('SamuraiAlert'); "
f"$notifier.Show($toast);"
)
subprocess.run([
"powershell", "-NoProfile", "-Command", powershell_script
], check=True)
except Exception as e:
show_terminal_alert(message)
else:
show_terminal_alert(message)
def list_messages():
print("--- OS侍 謎メッセージ一覧 ---")
for i, msg in enumerate(SAMURAI_MESSAGES, 1):
print(f"{i:2d}: {msg}")
def alert(args):
msg = choose_message()
if args.terminal:
show_terminal_alert(msg)
else:
show_desktop_notification(msg)
def main():
parser = argparse.ArgumentParser(
description="作業中に謎のOS侍警告を炸裂させるスキル。デスクトップ通知またはターミナル出力で侍メッセージを表示。"
)
subparsers = parser.add_subparsers(dest="command", required=True)
parser_alert = subparsers.add_parser("alert", help="ランダムな侍警告を表示")
parser_alert.add_argument(
"--terminal", action="store_true", help="ターミナル出力のみ(デスクトップ通知を使わない)"
)
parser_alert.set_defaults(func=alert)
parser_list = subparsers.add_parser("list", help="すべての侍メッセージを一覧表示")
parser_list.set_defaults(func=lambda args: list_messages())
args = parser.parse_args()
try:
args.func(args)
except Exception as e:
print(f"[ERROR] {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
references/design_notes.md
# 概要
このSkillは、作業中に突如“侍ネタ”の警告を表示することで、集中力のリセットや気分転換を促します。通知内容は毎回ランダムで、現代的なOS操作と侍風の言い回しを組み合わせたユーモアを重視しています。
# 公式ドキュメント抜粋
- Python 標準 `subprocess`, `os`, `platform` モジュールを利用し、各OSの通知API(macOS: osascript, Linux: notify-send, Windows: PowerShell Toast)を直接呼び出します。
- 参考: https://docs.python.org/3/library/subprocess.html
# 利用例
- `/skills menu` から明示的に呼び出し
- 長時間作業や「侍」「alert」などのキーワード検知時に自動発動
- チームの雑談ネタや集中力のリフレッシュに
# 注意点
- メッセージ内容は完全に無害で、データやシステムには一切影響しません
- 通知履歴やログは残りません
- OS通知が失敗した場合はターミナル出力にフォールバックします
# 設計方針
- 実在APIのみを利用し、CLI/ターミナル/デスクトップのどれでも確実に動作すること
- メッセージは随時追加・編集可能な設計
- エラー時も安全に終了する堅牢性を確保
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/random-os-fake-ancient-samurai-alert .agents/skills/random-os-fake-ancient-samurai-alert
.agents/skills/random-os-fake-ancient-samurai-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/random-os-fake-ancient-samurai-alert
# 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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
