Codexで重大コマンド実行前の緊張感を高める演出活用ガイド

  • URLをコピーしました!
目次

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 の演出が毎回ランダムで変化し、飽きずに楽しめる
QUICK INSTALL
この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記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次