Codex の承認待ちと完了を Mac の通知で確認する。
Codex は、作業の完了も承認待ちも通知できます。ただし、notify 設定で届くのは完了通知だけです。このガイドでは、Mac で使える Codex の各通知設定の役割を説明します。掲載するコード例は OpenAI のドキュメントと照合しています。
Codex の notify 設定は、ターンが完了したときだけ指定のプログラムを実行します。承認待ちでは実行しません(2026年10月時点)。承認待ちを知るには、Codex 内蔵のターミナル通知([tui] notifications)か、~/.codex/hooks.json の PermissionRequest フックを使います。内蔵の通知はデフォルトでオンになっており、ターミナルがバックグラウンドにあるときに届きます。バナーが表示されるのは一部のターミナルだけです。ChatGPT デスクトップアプリでは、Settings > Notifications で権限リクエストの通知をオンにしてください。
Codex の各通知設定の役割を知る。
Mac で Codex の通知を受け取る方法は、次の4つです。ターンとは、1回分の作業のことです。あなたがメッセージを送り、Codex が作業を進め、止まってあなたの応答を待つまでを指します。フックとは、承認を求める直前など、決まったタイミングで Codex が実行するコマンドです。
| 設定 | 設定場所 | ターン完了 | 承認待ち | 補足 |
|---|---|---|---|---|
notify | ~/.codex/config.toml | 対応 | 非対応 | 設定するまでオフです。指定したプログラムを1つ実行します。 |
[tui] notifications | ~/.codex/config.toml | 対応 | 対応 | デフォルトでオンです。ターミナルが前面にないときに通知します。バナーが表示されるのは、対応するターミナルだけです。 |
フック(Stop、PermissionRequest) | ~/.codex/hooks.json | 対応 | 対応 | デフォルトでオンです。新しいフックは、実行前にそれぞれ /hooks で信頼する必要があります。 |
| ChatGPT デスクトップアプリ | Settings > Notifications | 対応 | 対応 | ターン完了、権限リクエスト、質問の通知には、それぞれ個別のスイッチがあります。 |
よくあるのが、notify を設定すれば承認待ちの通知も届くと思い、そのまま待ってしまうケースです。OpenAI の設定ドキュメントによると、現時点で notify が実行されるのは agent-turn-complete だけです。承認待ちの通知には、表のほかの3つの方法のいずれかを使ってください。
まずは Codex 内蔵の通知を使う。
Codex のターミナル通知はデフォルトでオンなので、すでに届いているかもしれません。通知されるのは、ターミナル(Terminal や iTerm2 など、Codex を実行しているアプリ)が前面にないときだけです。通知するイベントを自分で選ぶには、設定ファイルで指定します。
~/.codex/config.toml に追加してください。すでに [tui] セクションがある場合は、その下に各キーを置きます。[tui] の見出しをもう1つ追加しないでください。コメント内のターミナル一覧は、Codex のドキュメントではなく、ソースコードに基づいています(後述)。
[tui]
notifications = ["agent-turn-complete", "approval-requested"]
notification_method = "auto" # osc9 in iTerm2/Ghostty/Kitty/Warp/WezTerm; bel elsewhere
notification_condition = "unfocused" # or "always"
notification_method を auto にすると、Codex が通知方法を選びます。osc9 は特殊なコード(エスケープシーケンス)を送り、一部のターミナルがそれをデスクトップ通知として表示します。bel はターミナルのベルを鳴らします。ターミナルを見ている間も通知を受け取りたい場合は、notification_condition を "always" にしてください。
Terminal でベルしか鳴らない理由を知る。
OpenAI のドキュメントには、バナーを表示できるターミナルの名前は記載されていません。Codex の公開ソースコードでは、Ghostty、iTerm2、Kitty、Warp、WezTerm にはバナー用のシーケンスを送り、macOS に付属する Terminal を含め、それ以外のターミナルには通常のベルを送ります。この動作は今後変わる可能性があります。ベルだけではバナーは表示されません。Terminal の Settings > Profiles > Advanced > Bell では、ビジュアルベル、Dock のバッジ、ウインドウがバックグラウンドにある間の Dock アイコンのバウンドを設定できます。Terminal で実際にバナーを表示するには、後述のフックを使ってください。
tmux 内では、allow-passthrough をオンにした場合だけ、Codex のバナー用シーケンスが通ります。on では表示中のペインからのみ、all では非表示のペインからも通ります(tmux マニュアル)。次の行を ~/.tmux.conf に追加してください。非表示のペインからも通知を受け取るには、on の代わりに all と記述します。
set -g allow-passthrough on
notify でターン完了時に Mac のバナーを表示する。
notify はターンが完了すると1つのプログラムを実行し、詳細を1つの JSON 引数として渡します。どのターミナルでも同じように動作します。OpenAI の例では、macOS に付属しないサードパーティー製の Homebrew ツール、terminal-notifier を使っています。以下のスクリプトは macOS に付属するものだけを使います。Codex の最後の返信の冒頭とプロジェクトフォルダを表示し、通知音 Glass を鳴らします。
手順1.次の内容を新しいファイル ~/.codex/notify-macos.js として保存してください。
// Codex notify -> macOS banner + sound. Codex appends one JSON argument.
function run(argv) {
var n = {};
try { n = JSON.parse(argv[argv.length - 1] || "{}"); } catch (e) {}
if (n.type && n.type !== "agent-turn-complete") return;
var app = Application.currentApplication();
app.includeStandardAdditions = true;
var msg = String(n["last-assistant-message"] || "Turn complete").slice(0, 180);
var folder = String(n.cwd || "").split("/").pop();
app.displayNotification(msg, { withTitle: "Codex finished", subtitle: folder, soundName: "Glass" });
}
手順2.既存の ~/.codex/config.toml の、最初の [section] 見出しより上に次の行を追加してください。YOUR_NAME は自分のホームフォルダ名に置き換えます。Codex はこのリストを記述どおりに実行するため、~ は展開されません(ドキュメントではなく、Codex のソースコードに基づく情報です)。
notify = ["/usr/bin/osascript", "-l", "JavaScript", "/Users/YOUR_NAME/.codex/notify-macos.js"]
notify が動かなくなる3つの原因:
notifyの行が2つある。設定ファイルに記述できるのは1つだけで、キーが重複するとファイルを読み込めなくなります。別のツールがすでに使っている場合は、両方のプログラムを実行する短いスクリプトを指定するか、代わりにStopフックを使ってください。フックは、どのファイルにあるものも並行して実行されます。- ファイル内の位置が違う。
[section]見出しより下のファイル末尾に貼り付けると、その行はそのセクションに属するため、Codex はnotify設定として読み取りません。 - プロジェクトの設定ファイルに書いている。Codex はプロジェクト固有の
.codex/config.tomlにあるnotifyを無視します。機能するのは~/.codex/config.tomlに記述した場合だけです。
バナーが表示されない場合は、「システム設定」>「通知」を開いてください。Anthropic のフックガイドによると、osascript で送ったバナーは、そこに Script Editor として表示されるため、通知を許可する必要があります。macOS が事前に許可を求めることはないとも説明されています。お使いの Mac では、表示名が異なる場合があります。
Codex のフックで承認待ちのバナーを表示する。
フックを使うと、Terminal を含むどのターミナルでも、承認待ちを実際のバナーで知らせることができます。Codex は、承認を求める直前に PermissionRequest フックを、ターン完了時に Stop フックを実行します。承認が不要なコマンドでは、PermissionRequest は実行されません。
次の内容を ~/.codex/hooks.json に組み込んでください。ファイルがすでにある場合は、丸ごと置き換えないでください。ほかのツールのエントリが保存されている場合があります(Cowork Island も、アプリ内で Codex をオンにすると、このファイルにエントリを保存します)。以下の各エントリを、"hooks" 内の対応するリストに追加してください。リストがなければ作成し、各エントリはそれぞれ個別の波括弧で囲んでください。
{
"hooks": {
"PermissionRequest": [
{ "hooks": [ { "type": "command", "async": true, "timeout": 10,
"command": "/usr/bin/osascript -e 'display notification \"Codex needs your approval\" with title \"Codex\" sound name \"Funk\"' >/dev/null 2>&1" } ] }
],
"Stop": [
{ "hooks": [ { "type": "command", "async": true, "timeout": 10,
"command": "/usr/bin/osascript -e 'display notification \"Codex finished\" with title \"Codex\" sound name \"Glass\"' >/dev/null 2>&1" } ] }
]
}
}
- ファイルを保存し、Codex を開いて
/hooksと入力します。 - 新しい2つのエントリを両方とも信頼してください。Codex は、新規または変更されたフックを、信頼されるまでスキップします。そのため、信頼していないフックは動作していないように見えます。
- 末尾の
>/dev/null 2>&1は残してください。Stopフックの出力は、JSON か、何も出力しないかのいずれかである必要があります。
代わりに読み上げやスマートフォンへの通知を使うなら、通知設定ジェネレーターがブラウザ内でエントリを作成し、保存先のファイル名も示します。
ChatGPT デスクトップアプリで Codex の通知を使う。
2026年7月9日から、macOS の Codex アプリは ChatGPT デスクトップアプリの一部になりました。通知は設定ファイルではなく、アプリ内で設定します。
- Settings > Notifications(Cmd+,):ターン完了の通知を、表示しない、ChatGPT がバックグラウンドにあるときだけ表示、常に表示、のいずれかに設定できます。権限リクエストと質問の通知には、それぞれ個別のスイッチがあります。
- Sound:タスク完了、権限リクエスト、質問に共通の通知音です。Default、Classic、None から選べます。macOS では、システムサウンドやインポートしたファイルも使えます。
- Activity:利用できる場合は、サイドバーのベル、または Cmd+Option+U で、未読、実行中、応答待ちのチャットを一覧表示できます。
前述の [tui] の各キーは、ターミナル内で動く Codex 用です。OpenAI のドキュメントには、デスクトップアプリ内のチャットで notify や自作のフックが実行されるかどうかは書かれていません。そのため、アプリ内でも動くとは考えないでください。
通知設定の手間を省く。
Cowork Island は macOS 14 以降で使えるアプリです。対応ツールの AI エージェントのセッションをノッチ下のパネルに集め、それぞれの状態を表示します。Codex や Claude Code のどのセッションが実行中で、どれが「要対応」なのかを確認でき、通知もその画面の一部として表示されます。
Codex は、「設定」でオンにしてから Codex 側で Cowork Island のフックを許可するまで、オフのままです。これは前述と同様に、フックを信頼する手順です。その後は、各 Codex セッションの状態が表示されます。デフォルトでは、対応が必要になるとアイランドが自動で開きます。ただし、そのセッションのターミナルがすでに前面にある場合、または ChatGPT 内の Codex チャットで ChatGPT アプリがすでに前面にある場合は開きません。この動作は「設定」の「質問があったとき」でオフにできます。セッションが完了すると、デフォルトではアイランドが5秒間開きます。ChatGPT アプリ内の Codex も「要対応」と表示され、回答は ChatGPT で行います。アイランドでは、対応している Claude Code のリクエストを許可または拒否したり、選択式の質問に回答したりできます。ほかのツールでは、そのツールのアプリやターミナルで応答が必要になる場合があります。
Cowork Island は macOS の通知を送信しません。アイランド自体が開きます。サウンドはオンにするまでオフです。「承認が必要」のサウンドは無料で使え、「セッション完了」の通知音は Pro の機能です。Codex の notify 設定は使わないため、お使いの notify スクリプトは引き続き動作します。Cowork Island は、~/.codex/hooks.json に独自のエントリを追加し、既存のエントリと共存させます。自作のフックは、上のコード例のように個別のエントリにし、Cowork Island の ~/.perch フォルダの外に置いてください。そうすれば、そのまま保持されます。
無料プランでは、一度に1枚のセッションカードが表示されます。Pro ではすべてのセッションが表示され、セッションへジャンプして戻れるようになります。さらに、詳細な使用量メーター、完了時のサウンド、より多くのマスコットの選択肢が加わります。Pro の7日間試用が自動で始まり(Mac 1 台につき1回)、支払い情報は不要です。プランとインストール方法をご覧ください。
無料でダウンロード情報源。
- OpenAI:高度な設定
- OpenAI:設定リファレンス
- OpenAI:設定例
- OpenAI:フック
- OpenAI:通知
- OpenAI:設定リファレンス
- OpenAI:変更履歴
- openai/codex のソースコード(ターミナル一覧のみ)
- Apple:Terminal のプロファイルの詳細設定
- Apple:通知の表示
- tmux マニュアル
- Anthropic:Claude Code フックガイド(Script Editor)
情報源の確認日:2026年10月18日。このガイドは Cowork Island の制作者が書いています。訂正については、support@coworkisland.com にメールするか、GitHub で Issue を作成してください。