Coding 工具 · 03
Codex 客户端
为 Codex 的本机 Local 与 Worktree 任务配置 Stop Hook。脚本只读取会话、轮次和工作目录,不把 prompt 或回复正文交给 bluebell。
先确认任务位置
只适用于在这台 Mac 上运行的任务
| Codex 环境 | 能否调用本机 bluebellctl |
|---|---|
| Local | 可以;任务直接在当前项目目录运行。 |
| Worktree | 可以;任务在这台 Mac 的隔离工作树运行。 |
| Cloud | 不可以直接使用本教程;远端环境看不到 Mac App 内的 CLI。 |
当前官方生命周期
主线程停止时触发 Stop
Codex 的 Stop Hook 会在主线程的一轮响应停止时执行,并通过 stdin 传入 JSON。当前字段包含 session_id、turn_id、cwd 和最新回复文本;本教程只使用前三项。
步骤 1
创建 Stop 适配脚本
codex-app-bluebell.py
#!/usr/bin/env python3
import json, os, subprocess, sys
CLI = "/Applications/bluebellMac.app/Contents/Helpers/bluebellctl"
try:
payload = json.load(sys.stdin)
except Exception:
sys.exit(0)
if payload.get("hook_event_name") != "Stop":
sys.exit(0)
session_id = str(payload.get("session_id") or "")
turn_id = str(payload.get("turn_id") or "")
cwd = str(payload.get("cwd") or "")
if not session_id or not turn_id:
sys.exit(0)
try:
subprocess.run([
CLI, "emit",
"--source", "Codex 客户端",
"--workspace-name", os.path.basename(cwd) or "Codex",
"--session-id", session_id,
"--turn-id", turn_id,
"--dedupe-key", f"codex-app:{session_id}:{turn_id}",
"--local",
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=3, check=False)
except (OSError, subprocess.SubprocessError):
pass把 CLI 替换为 bluebell Mac 首页复制出的真实路径。session_id + turn_id 组成稳定去重身份;同一 Hook 重试不会产生第二条逻辑提醒。
步骤 2
把 Hook 加入 Codex 配置层
对所有本机项目生效时,将下面内容合并进 ~/.codex/hooks.json;只对一个项目生效时可使用 <repo>/.codex/hooks.json。项目级配置还需要信任该项目。
~/.codex/hooks.json
{
"description": "Send Codex Stop events to bluebell",
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "/usr/bin/python3 \"/absolute/path/codex-app-bluebell.py\"",
"timeout": 5
}
]
}
]
}
}替换脚本的绝对路径。若文件已有其他 Hook,请只把新的 Stop 项合并进去,不要覆盖整个文件,也不要同时在同一配置层重复写入 hooks.json 和 config.toml Hook。
步骤 3
审查 Hook,再完成一轮本机任务
- 保存配置后新建一个 Local 或 Worktree 任务,按 Codex 提示审查并信任这条命令 Hook。
- 完成一轮短任务,确认 bluebell Mac 最近提醒只有一条“Codex 客户端”本机事件。
- 在同一任务继续一轮,确认新的
turn_id会生成一条新事件。 - 若 Codex 提示 Hook 未信任,可在 Codex CLI 使用
/hooks查看来源和信任状态。 - 验证后从脚本删除
--local,再检查 Mac 总推送、发送队列和真实 Watch。
来源
OpenAI 官方资料
- Codex Hooks配置位置、信任流程、Stop 输入字段与并发行为
- Codex environmentsLocal、Worktree 与 Cloud 的运行位置