哈喽,大家好!

我是阿星!

每次和codex干活,干完也不吭声。

我可没空一直看着它,所以给它配了个彩铃。

整体结构 

结构图

时序图

铃声的调整

一开始它就给我弄了这几个,每个都是2秒,我怀疑有的用户根本听不见就没了。

然后我就让5.5继续给我下一个诺基亚+马里奥,一个当请求审批一个当完工声音。

结果codex和网页端都太讲究了,说有版权问题不给我下,直接给我找了个平替

所以最后的声音就变成了这三个

  

审批:approval_reminder_chime.wav
回复:Glass
彻底完工:task_complete_chiptune.wav

为什么能实现?

Codex 官方 hooks 支持在 agent 生命周期中注入确定性脚本,并包含 PermissionRequestStop 等事件;非托管 command hook 还需要先审查并信任。

具体可以看这个👇

路径和信任问题

第一,这个项目的 Codex hooks 不能只放在项目 .codex/config.toml 里,要把真实生效配置写到 ~/.codex/config.toml。另外全局 hook 调用时不一定在仓库目录下,所以铃声必须是绝对路径。

第二,用 features.hooks = true、官方 [[hooks.Event.hooks]] 写法和绝对路径命令;

第三,每次新增或修改 hook 命令后,必须在 Codex 的 /hooks 界面执行 review/trust,否则 Codex 会跳过 hook,声音脚本不会被调用。

如何处理提示词

一开始提示词只有这么长

  

帮我用ears语法增强下面的需求:帮我写一个hooks脚本,让你每次请求我审批或者已经干完活的时候能发出铃声,比如完工可以是庆祝的声音,等待审批可以是提醒的声音,你自己上网搜一下。这样我在没看电脑的时候听声音就知道你需要我人工审批和知道你做完了。

后来我用EARS语法作恶了增强,关于这个语法的学习可以搜一下相关的文章

EARS 的标准结构是“While/When/If/Where + 系统 + shall + 响应”,常见模式包括通用、状态驱动、事件驱动、异常行为、可选特性和复杂需求。 

所以你可以把这个理论在写提示词的时候稍微提一嘴。就可以了。AI都知道这些。

提示词长啥样

但是下面这个提示词不是用EARS写的,是为了让大家快速复现反推的。下面文件里有很多路径,需要你自己替换为自己的路径,也可以扔给codex

  

# AGENTS.md

## 项目目的

本项目是一个用于 macOS 的本地 Codex Hooks 声音通知器。当 Codex 需要审批时播放提示音;当一次 Codex 回合停止时,无论是普通回复结束还是任务完成,都播放同一个停止音效。

## 核心规则

- 将其视为纯本地工具。不要添加网络请求。
- 保持改动小且确定性强。优先使用 shell 脚本和本项目已使用的本地 macOS 工具。
- 不要把普通回复和任务完成拆成两种不同声音。Codex 会通过 `Stop` 暴露这两种情况,因此两者都应使用 `task-completed`- 失败音效支持保持可选。默认值为 `FAILURE_ENABLED=0`- 不要使用 `Glass` 作为回复音效。回复和完成都应使用 `assets/sounds/task_complete_chiptune.wav`## Codex Hooks 配置

实际生效的 Codex Hooks 配置是全局配置:

-`/Users/xingyang/.codex/config.toml`

项目内的配置副本仅作为参考材料:

-`.codex/config.toml`

修改 Hooks 时,在可行的情况下保持两者同步,但必须以全局配置为准进行验证,因为当前 Codex 会加载 `~/.codex/config.toml`。

使用官方的嵌套 Hook 表格风格:

```toml
[features]
hooks = true

[[hooks.PermissionRequest]]
matcher = ""

[[hooks.PermissionRequest.hooks]]
type = "command"
command = "bash /Users/xingyang/Downloads/code/codexmusic/scripts/codex-hook-permission.sh"
statusMessage = "Playing approval sound"

[[hooks.Stop]]

[[hooks.Stop.hooks]]
type = "command"
command = "bash /Users/xingyang/Downloads/code/codexmusic/scripts/codex-hook-stop.sh"
statusMessage = "Playing reply or completion sound"
```

在 Hook 命令和声音配置中使用绝对路径。Codex 可能会从不同的工作目录调用 Hooks。

## Hook 信任

Hooks 必须先被信任,才会运行。编辑 Hook 命令或 Hook 配置后:

1. 在该项目中启动 Codex。
2. 打开 `/hooks`3. 检查 Hook 命令。
4. 选择 `Trust all and continue`。

如果 Hooks 未被信任,Codex 可能会静默跳过它们。一个有用的诊断命令是:

```bash
codex exec --skip-git-repo-check --dangerously-bypass-hook-trust --dangerously-bypass-approvals-and-sandbox "Reply with exactly: hook smoke test complete"
```

如果绕过信任的命令写入了声音日志,但正常执行没有写入,则剩余问题就是 Hook 信任。

## 事件模型

-`PermissionRequest` -> `scripts/codex-hook-permission.sh` -> `approval-required`
-`Stop` -> `scripts/codex-hook-stop.sh`
- 非失败类 `Stop` -> `task-completed`
- 类似失败的 `Stop` -> `task-failed`

`Stop` 始终返回:

```json
{"continue": true}
```

## 声音模型(需要你自己替换为自己的路径)

- 审批提示音:`assets/sounds/approval_reminder_chime.wav`
- 停止音效:`assets/sounds/task_complete_chiptune.wav`
- 失败音效:可选,默认禁用

配置位于:

-`config/hooks-sound-notifier.conf`

重要配置值应使用绝对路径:

```bash
APPROVAL_SOUND_FILE="/Users/xingyang/Downloads/code/codexmusic/assets/sounds/approval_reminder_chime.wav"
COMPLETION_SOUND_FILE="/Users/xingyang/Downloads/code/codexmusic/assets/sounds/task_complete_chiptune.wav"
LOG_PATH="/Users/xingyang/Downloads/code/codexmusic/logs/hooks-sound-notifier.log"
STATE_DIR="/Users/xingyang/Downloads/code/codexmusic/tmp/hooks-sound-notifier"
```

## 验证

编辑后运行自动化测试:

```bash
tests/hooks-sound-notifier/test_hooks_sound_notifier.sh
```

手动测试审批提示音:

```bash
bash scripts/hooks-sound-notifier.sh approval-required
```

手动测试停止音效:

```bash
printf '%s\n' '{"hook_event_name":"Stop","last_assistant_message":"Regular reply."}' | bash scripts/codex-hook-stop.sh
```

查看日志:

```bash
sed -n '1,120p' /Users/xingyang/Downloads/code/codexmusic/logs/hooks-sound-notifier.log
```

成功的停止日志应显示使用 `task_complete_chiptune.wav` 的 `task-completed`## 故障排查

- 如果手动脚本可以播放声音,但 Codex Hooks 不播放,检查 `~/.codex/config.toml` 和 `/hooks` 信任状态。
- 如果绕过信任可以生效,但正常执行不生效,运行 `/hooks` 并信任已修改的 Hooks。
- 如果日志提到 cooldown,删除 `tmp/hooks-sound-notifier/` 下的文件。
- 如果声音没有播放,确认 `afplay` 存在,并且已配置的声音文件路径存在。

ok

我是阿星

更多AI应用

我们下期再见!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐