在 Mac 收到 Codex 核准提醒與完成通知。
Codex 可以發送完成通知,也能提醒你它正在等你核准,但 notify 設定只支援前者。本指南說明 Mac 上各項 Codex 通知設定的用途,範例程式碼已對照 OpenAI 文件查核。
截至 2026 年 10 月,Codex 的 notify 設定只會在一個回合完成時執行你指定的程式,不會在需要核准時執行。若要收到核准提醒,可以使用 Codex 內建的終端機通知([tui] notifications,預設開啟,終端機在背景時會觸發,但只有部分終端機會顯示橫幅),或在 ~/.codex/hooks.json 中加入 PermissionRequest 鉤子。在 ChatGPT 桌面 App 中,請到 Settings > Notifications 開啟權限通知。
了解各項 Codex 設定的用途。
Codex 可以透過以下四種方式在 Mac 上通知你。回合是指一輪工作:你傳送訊息,Codex 開始工作,然後停下來等你回應。鉤子(hook)是 Codex 在特定時機執行的指令,例如即將請你核准某項操作時。
| 設定 | 設定位置 | 回合完成 | 需要核准 | 注意事項 |
|---|---|---|---|---|
notify | ~/.codex/config.toml | 支援 | 不支援 | 設定後才會啟用。執行一個你指定的程式。 |
[tui] notifications | ~/.codex/config.toml | 支援 | 支援 | 預設開啟。終端機不在前景時觸發。只有支援的終端機會顯示橫幅。 |
鉤子(Stop、PermissionRequest) | ~/.codex/hooks.json | 支援 | 支援 | 預設開啟。每個新鉤子都必須先在 /hooks 中設為信任,才會執行。 |
| ChatGPT 桌面 App | Settings > Notifications | 支援 | 支援 | 回合完成、權限與問題通知各有獨立開關。 |
常見的誤解是設定好 notify,就等著收核准提醒,結果一直等不到。OpenAI 的設定文件說明,notify 目前只會由 agent-turn-complete 觸發。若要收到核准提醒,請使用表格中另外三種方式之一。
先從 Codex 內建的通知開始。
Codex 的終端機通知預設開啟,你可能已經收得到。只有當終端機(執行 Codex 的 App,例如 Terminal 或 iTerm2)不在前景時,才會觸發通知。若要自行選擇哪些事件會觸發通知,請在設定檔中指定。
將以下內容加入 ~/.codex/config.toml。如果檔案已有 [tui] 區段,請把這些鍵放在該區段下方,不要再加第二個 [tui] 標頭。註解中的終端機清單來自 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 會在一個回合完成時執行一個程式,並以單一 JSON 引數傳入詳細資訊。在任何終端機中,運作方式都一樣。OpenAI 的範例使用 terminal-notifier,這是透過 Homebrew 安裝的第三方工具,並非 macOS 內建。以下腳本只使用 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 失效的情況:
- 多加了一行
notify。一份設定檔只能有一行,重複的鍵會讓檔案無法載入。如果其他工具已經使用它,可以改讓它執行一個小腳本,由腳本執行兩個程式;也可以改用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。 - 將兩個新項目都設為信任。Codex 會略過尚未設為信任的新增或修改過的鉤子,因此未受信任的鉤子看起來會像是失效了。
- 保留結尾的
>/dev/null 2>&1:Stop鉤子必須輸出 JSON,或完全不輸出內容。
如果想改用語音播報或手機通知,通知設定產生器可以直接在瀏覽器中產生設定項目,並告訴你該放進哪個檔案。
在 ChatGPT 桌面 App 中使用 Codex。
自 2026 年 7 月 9 日起,Codex App 已整合至 macOS 版 ChatGPT 桌面 App。通知要在 App 中設定,而非設定檔:
- Settings > Notifications(Cmd+,):回合完成通知可設為永不顯示、僅在 ChatGPT 位於背景時顯示,或一律顯示。權限與問題通知各有獨立開關。
- Sound:任務完成、權限請求與問題共用一種通知音效。可以選擇 Default、Classic 或 None;在 macOS 上,也能使用系統音效或自行匯入的檔案。
- Activity:若有提供這項功能,點按側邊欄的鈴鐺或按 Cmd+Option+U,即可列出未讀、執行中或等待你回應的聊天。
上文的 [tui] 設定鍵適用於終端機中的 Codex。OpenAI 文件未說明 notify 或自訂鉤子是否會在桌面 App 的聊天中執行,因此不要預期它們在那裡也能運作。
選擇免自行設定的方式。
Cowork Island 是一款適用於 macOS 14 或以上版本的 App,會把你在支援工具中的 AI 代理工作階段集中在瀏海下方的面板中,顯示每個工作階段的狀態。你能看到哪個 Codex 或 Claude Code 工作階段正在執行,哪個「需要你處理」,提醒也會出現在同一個畫面中。
Codex 預設關閉。你需要先在「設定」中開啟,再到 Codex 允許 Cowork Island 的鉤子,信任步驟與上文相同。完成後,每個 Codex 工作階段都會顯示狀態。預設情況下,只要有工作階段需要你處理,小島就會自動展開;但如果該工作階段的終端機已在前景,或工作階段來自 ChatGPT App 且該 App 已在前景,小島就不會展開。你可以在「設定」中關閉「收到提問時」。工作階段完成時,小島預設會展開 5 秒。ChatGPT App 中的 Codex 也會顯示「需要你處理」,你在 ChatGPT 中回答。對於支援的 Claude Code 請求,你可以在小島中允許或拒絕某項操作,或回答選擇題。使用其他工具時,你可能需要在該工具自己的 App 或終端機中回應。
Cowork Island 不會發送 macOS 通知,而是讓小島本身展開。音效預設關閉,需要自行開啟;「需要審核」音效可免費使用,「工作階段完成」提示音則包含在 Pro 中。它不會使用 Codex 的 notify 設定,因此你的 notify 腳本仍可繼續運作。它會在 ~/.codex/hooks.json 中加入自己的項目,與你的項目並存:請像上方範例一樣,將自己的鉤子放在各自獨立的項目中,並將鉤子檔案放在它的 ~/.perch 資料夾之外,Cowork Island 就會保留它們。
免費版一次顯示一張工作階段卡片。Pro 會顯示你所有的工作階段,讓你跳轉回這些工作階段,並加入詳細的用量表、完成音效,以及更多角色選項。7 天 Pro 試用會自動開始,每台 Mac 限一次,不需要付款資訊。請參閱方案與安裝指南。
免費下載資料來源。
- 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。