Codex ユーザーが日常でぶつかる悩み
エンジニアの日常作業では、何気なくターミナルで重大なコマンドを叩く瞬間が頻繁に訪れます。特に Codex を活用した AI coding workflow では、context や repository understanding のズレが思わぬ事故につながることも。通知や演出がほしいと思ったことはありませんか?
- Codex が context を見失って違う場所のコードを参照する
- monorepo で package を跨いだ瞬間、Codex が repo 構造を忘れる
- session を再開すると、前回までの context や path 指定をまるごと再説明しないといけない
- 長時間 workflow で long context が膨らみすぎて、important な情報が薄まる (stale context)
- 「ここはこういう構造のリポジトリ」というあらすじを毎回チャットの冒頭で書く羽目になる
特に「rm」や「git push」などのコマンドを実行する直前、ほんのワンクッションで気持ちを切り替えたい場面は多いはず。通知・演出・OS連携の仕組みがあれば、日常の作業が少し楽しく、そして安全にもなります。
この Skill が一言でいうと何を解決するか
一言サマリ: 重大コマンド実行時にOS風ドラムロールと通知で“運命の選択”を演出する Skill。
もう少し具体化すると、このSkillを入れることで以下のような状態になる:
- AI coding workflow の中で、重要なコマンドを実行する直前に context 切り替えや repository 理解を強制的に意識できる
- 普段の何気ない作業が、ドラムロールとデスクトップ通知によって“イベント化”され、うっかり操作ミスの抑止効果も期待できる
- monorepo や複雑な directory 構造でも、Codex の path management を意識した上で作業フローに緊張感を持たせられる
- onboarding や session 再開時に、作業の「区切り」や「再確認」のタイミングを自然に作れる
- Skill の演出が毎回ランダムで変化し、飽きずに楽しめる
GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。
npx degit aazutaku/ai-note/codex/os-command-drumroll-alert .agents/skills/os-command-drumroll-alert実行したらこうなる (3つの利用シーン)
使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。
シーン1: session 開始時 (プロジェクト初動で)
# /skills menu
[os-command-drumroll-alert] Skill activated.
重大コマンド実行直前、OS風ドラムロール演出&デスクトップ通知を行います。
次のコマンドが検知されました:
> git push origin main
[ドラムロール音が鳴る...]
[通知] 運命の選択が迫る!本当に git push しますか?
[ヒント] この repository (my-app) の context を再確認してください。
シーン2: monorepo / package 跨ぎ作業時
> cd packages/api && npm publish
[os-command-drumroll-alert] 重大コマンドを検知: npm publish
[ドラムロール音が鳴る...]
[通知] package 'api' の公開処理を実行します。directory: packages/api
[注意] monorepo 構造 (packages/*) での context 切り替えを推奨します。
[選択肢] 続行する場合は Enter、キャンセルは Ctrl+C
シーン3: お遊び的な使い方
> rm -rf tmp/cache
[os-command-drumroll-alert] 重大コマンド (rm) をキャッチ!
[ドラムロール音が鳴る...]
[通知] これは本当に必要な削除ですか?緊張のピーク!
[豆知識] long context の場合は snapshot を取りましょう。
before / after の違い
| 場面 | Skill 無し | Skill 有り |
|---|---|---|
| session 再開時 | repo 構造から毎回説明、path も指定し直し | Codex が自動で context を復元、最小プロンプトで再開 |
| monorepo 移動 | 違う package のコードを参照しがち | directory boundary を意識して必要な範囲だけ見る |
| 長時間 workflow | long context で重要箇所が薄まる | 重要イベントの直前に context をリフレッシュするきっかけが生まれる |
発動方式
明示呼び出し (/skills menu or $skill-name mention) と暗黙発動 (description マッチ) の両方に対応。
Skill の中身を全部見せる
.agents/skills/os-command-drumroll-alert/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。
.agents/skills/os-command-drumroll-alert/
├── SKILL.md
├── scripts/
│ └── drumroll_alert.py
└── references/
└── design_notes.md
各ファイルの役割
| ファイル | 役割 |
|---|---|
SKILL.md |
Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します |
scripts/drumroll_alert.py |
重大コマンド直前にドラムロール演出と通知を発動 |
references/design_notes.md |
概要 をまとめた参考資料 |
SKILL.md
---
name: os-command-drumroll-alert
description: git push、rm、npm publish、docker push などの重大コマンド実行直前に、必ずドラムロール演出とOS通知を発動。コマンド実行前の緊張感を演出したい時に発動。
---
# 機能概要
このSkillは、エンジニアがターミナルやエディタで重大なコマンド(例: `git push`, `rm -rf`, `npm publish`, `docker push` など)を実行する直前に、OS風のドラムロールサウンドとともに、デスクトップ通知で「本当に実行しますか?」や「運命の選択が迫る!」などの演出メッセージを表示します。普段の作業を一大イベントに昇華し、コマンド実行時の緊張感や注意喚起を高めます。演出は毎回ランダムで変化し、作業のマンネリ化を防ぎます。
# 使い方
- 明示呼び出し: `/skills os-command-drumroll-alert` または Skillメニューから選択
- 暗黙発動: `git push`, `rm`, `npm publish`, `docker push` などのコマンド入力直前に自動発動
- CLIから: `python drumroll_alert.py --command "git push"` のようにコマンド名を渡すと演出
# 出力例
```
[DRUMROLL] ドラムロール再生中...
[NOTIFY] 今から「git push」を実行します。本当に進めますか?
[DRUMROLL] ドラムロール終了!
[NOTIFY] 運命の選択が迫る!
[INFO] コマンド「git push」を続行してください。
```
# 注意点
- サウンド再生にはOSの標準音声プレイヤーを利用します(Linux: aplay/paplay, macOS: afplay, Windows: powershell)。
- 通知は`notify-send`(Linux), `osascript`(macOS), `powershell`(Windows)を使用。環境によっては追加インストールが必要です。
- コマンド実行自体はこのSkillでは行いません。演出後に手動でコマンドを入力してください。
- ローカル環境でのみ動作。リモートやWeb環境では制限があります。
# 参考資料
- [notify-send](https://specifications.freedesktop.org/notification-spec/latest/)
- [Python playsound](https://github.com/TaylorSMarks/playsound)
- references/design_notes.md も参照
scripts/drumroll_alert.py
import os
import sys
import random
import argparse
import platform
import subprocess
import threading
import time
DRUMROLL_SOUNDS = [
'drumroll1.wav',
'drumroll2.wav',
'drumroll3.wav'
]
NOTIFY_MESSAGES = [
'今から「{cmd}」を実行します。本当に進めますか?',
'運命の選択が迫る!',
'重大コマンド発動。覚悟はできていますか?',
'この一手が未来を変えるかも…',
'慎重に、今が分岐点です。',
'ドラムロール…運命の瞬間が近づいています!'
]
MAJOR_COMMANDS = [
'git push', 'rm', 'rm -rf', 'npm publish', 'docker push', 'kubectl apply', 'terraform apply', 'systemctl restart', 'chmod 777', 'chown', 'mv', 'cp', 'sudo', 'make install'
]
def play_sound(sound_file):
sys_os = platform.system()
if not os.path.exists(sound_file):
print(f'[WARN] サウンドファイル {sound_file} が見つかりません')
return
try:
if sys_os == 'Darwin':
subprocess.run(['afplay', sound_file], check=True)
elif sys_os == 'Linux':
# aplay or paplay
if subprocess.call(['which', 'paplay'], stdout=subprocess.DEVNULL) == 0:
subprocess.run(['paplay', sound_file], check=True)
else:
subprocess.run(['aplay', sound_file], check=True)
elif sys_os == 'Windows':
subprocess.run(['powershell', '-c', f'(New-Object Media.SoundPlayer "{sound_file}").PlaySync();'], check=True)
else:
print('[WARN] 未対応OSのためサウンド再生をスキップ')
except Exception as e:
print(f'[ERROR] サウンド再生失敗: {e}')
def send_notification(title, message):
sys_os = platform.system()
try:
if sys_os == 'Darwin':
script = f'display notification "{message}" with title "{title}"'
subprocess.run(['osascript', '-e', script], check=True)
elif sys_os == 'Linux':
subprocess.run(['notify-send', title, message], check=True)
elif sys_os == 'Windows':
# Windows 10+ Toast通知
ps_script = f'[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null;'
ps_script += f'$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02);'
ps_script += f'$textNodes = $template.GetElementsByTagName("text");'
ps_script += f'$textNodes.Item(0).AppendChild($template.CreateTextNode("{title}")) > $null;'
ps_script += f'$textNodes.Item(1).AppendChild($template.CreateTextNode("{message}")) > $null;'
ps_script += f'$toast = [Windows.UI.Notifications.ToastNotification]::new($template);'
ps_script += f'$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("Python Script");'
ps_script += f'$notifier.Show($toast);'
subprocess.run(["powershell", "-Command", ps_script], check=True)
else:
print('[WARN] 未対応OSのため通知をスキップ')
except Exception as e:
print(f'[ERROR] 通知送信失敗: {e}')
def random_drumroll():
return random.choice(DRUMROLL_SOUNDS)
def random_notify(cmd):
msg = random.choice(NOTIFY_MESSAGES)
return msg.format(cmd=cmd)
def is_major_command(cmd):
for major in MAJOR_COMMANDS:
if cmd.strip().startswith(major):
return True
return False
def drumroll_alert(cmd):
print('[DRUMROLL] ドラムロール再生中...')
sound_file = random_drumroll()
# サウンド再生は別スレッドで
t = threading.Thread(target=play_sound, args=(sound_file,))
t.start()
notify_msg = random_notify(cmd)
send_notification('Drumroll Alert', notify_msg)
print(f'[NOTIFY] {notify_msg}')
t.join()
print('[DRUMROLL] ドラムロール終了!')
# 追加通知
notify_msg2 = random_notify(cmd)
send_notification('Drumroll Alert', notify_msg2)
print(f'[NOTIFY] {notify_msg2}')
print(f'[INFO] コマンド「{cmd}」を続行してください。')
def cli():
parser = argparse.ArgumentParser(description='重大コマンド直前にドラムロール演出と通知を発動')
parser.add_argument('--command', '-c', type=str, required=True, help='実行予定のコマンド名')
parser.add_argument('--force', action='store_true', help='重大コマンド以外でも強制発動')
args = parser.parse_args()
cmd = args.command.strip()
if is_major_command(cmd) or args.force:
drumroll_alert(cmd)
else:
print(f'[INFO] コマンド「{cmd}」は重大コマンドではないため演出をスキップします')
def main():
cli()
if __name__ == '__main__':
main()
references/design_notes.md
# 概要
このSkillは、重大コマンド実行前にエンジニアの注意を引きつけるため、OSネイティブのサウンド再生・通知APIを組み合わせて演出を行います。演出は毎回ランダムで、作業の緊張感を高めるユーモアを提供します。
# 公式ドキュメント抜粋
- [notify-send](https://specifications.freedesktop.org/notification-spec/latest/): Linuxのデスクトップ通知標準
- [Python playsound](https://github.com/TaylorSMarks/playsound): クロスプラットフォームなサウンド再生
# 利用例
- `python drumroll_alert.py --command "git push"`
- Skillメニューやエディタ拡張から自動呼び出し
# 注意点
- サウンドファイル(wav)はスクリプトと同じディレクトリに配置してください。
- OSごとに通知APIやサウンド再生コマンドが異なるため、動作環境に応じて依存パッケージやコマンドのインストールが必要です。
- コマンド実行自体は行いません。演出後は手動でコマンドを実行してください。
# 設計方針
- OS標準APIのみを利用し、追加の外部ライブラリ依存を最小化。
- 重大コマンド判定は先頭部分一致で判定し、柔軟にカスタマイズ可能。
- ユーザー体験を損なわないよう演出時間は短く抑えています。
導入手順
このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。
1. 前提
- Node.js v16 以上 (
degit実行に必要) - Codex がローカルで動いていること
2. degit でフォルダ取得
プロジェクトのルートで以下のコマンドを実行します。
npx degit aazutaku/ai-note/codex/os-command-drumroll-alert .agents/skills/os-command-drumroll-alert
.agents/skills/os-command-drumroll-alert の中に SKILL.md / scripts/ / references/ / README.md が展開されます。
3. ファイル配置確認
ls .agents/skills/os-command-drumroll-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記事を探す
本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!
