臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速7.Google 搜索收录排查:为什么关键词搜得到别人,却搜不到我的网站?Obsidian、双向链接与知识图谱
架构设计
分布式分布式事务RPC原理
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
数据库
mysql01.MySQL基础语法与约束02.MySQL数据库类型03.MySQL多表查询04.MySQL 索引05.MySQL 事务06.MySQL 隔离级别07.MySQL MVCC08.MySQL 锁09.EXPLAIN10.慢查询与 SQL 优化
mysql面试题01.索引问题02.事务与隔离级别03.锁机制04.存储引擎与性能优化05.用户权限、字符集与备份恢复
mysql实战01.EXPLAIN实战02.测试环境菜单误删排查与恢复03.MySQL IN 详解
网络
网络安全1.无线监听网卡苹果M系列虚拟机安装Kali Linux教程3.kali怎么使用RTL8812AU4.kali基础命令
网络基础进程之间怎样通过网络传递数据
网址常用网址
中间键
esElasticsearch 入门
mq
RabbitMQRabbitMQ高级RabbitMQ基础
1. MQ 基础2. MQ 核心角色与代码对应3. MQ Consumer Group 与消费模式4. SOFAMQ 账户变更代码实践5. MQ 可靠性问题6. 消息幂等
redis缓存击穿、穿透与雪崩Redis 分布式锁Redis 缓存问题Redis 数据结构
AI
使用说明
第三方插件&技能简介Archify使用与安装指南geekgeekRun使用OfferFlow使用指南Ponytail使用指南Skills Manager使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发0-学习路线1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.*完成可运行聊天接口11.Function Calling、Tool Calling 原理12.用 Java 方法定义 Tool13.工具参数设计和校验14.实现订单查询工具15.实现物流查询工具16.实现库存查询工具17.多个工具自动选择18.工具异常、超时、重试
diy主机
主机零件学习1.CPU2.主板3.内存4.显卡5.硬盘6.散热7.风扇8.机箱热门型号价格表
捡垃圾diy-13600kf+5060diy-14600kf+5070
English高频词汇英文基础语法简单句子音标
GitGit常用命令Sublime Merge 使用指南
Java
工具库Caffeine本地缓存Reactor教程
工作实践如何使用@Async线程池使用与排查线上服务 CPU 使用率过高排查压测下RPC接口大量失败排查记录
基础1.HashMap2.ConcurrentHashMap3.HashSet4.final5.static6.volatile7.AtomicInteger8.String动态代理反射锁与线程同步线程注解
面试题1.HashMap 存储在方法内是线程安全的吗2.ArrayList参数传递与引用重新赋值3.== 和 equals 的区别、hashcode4.重载和重写的区别5.String、StringBuffer、StringBuilder区别及使用场景6.接口和抽象类7.ArrayList 与 LinkedList 的区别和扩容机制8.HashMap 和 Hashtable 的区别及底层实现9.Object 和 Objects 的区别10.ThreadLocal的原理和使用场景11.字节码是什么及作用12.Java类加载器有哪些13.双亲委派模型14.Java异常体系15.GC是什么16.GC如何判断对象可以被回收
面试总结0.HR面试模板1.面试一2.面试二3.面试三笔试
网络与 IO(黑马程序员-纯理论)01-网络编程基础02-IO模型与零拷贝03-BIO04-NIO基础与缓冲区05-NIO通道与选择器06-AIO
juc00-目录01-进程与线程02-线程同步与通信03-并发设计模式04-Java内存模型05-CAS与原子类06-ThreadLocal07-阻塞队列08-线程池使用与原理09-任务调度10-ForkJoin与享元模式11-AQS12-ReentrantLock13-读写锁14-并发协作工具15-ConcurrentHashMap16-CopyOnWrite与同步容器17-SkipListMap18-非阻塞队列
juc(工作常见)Java并发编程三个重点拆解
jvm1. JVM运行时数据区
Spring1.Spring IoC、DI与构造方法注入CGLIB、Byte Buddy 与 Spring AOPSpring 常用注解详解Spring Bean 生命周期
Spring MVC异常处理机制
linux常用命令
mac快捷键终端常用操作
python
基础01.Python是什么,为什么要安装Python02.Python项目中.venv是什么03.Python基础语法
基础实战sql替换
HTTPXHRMS员工详情接口调用(Python HTTPX)
windowswindows激活

Codex Hook 单独配置与提交通知

一、一句话理解

如果希望每次 Git 提交后都收到通知,最可靠的方案是 Git 的 post-commit Hook;如果只想监听 Codex 执行的提交,可以使用 Codex 的 PostToolUse Hook。

二、理论:Codex Hook 是什么

2.1 Hook 的作用

Hook 可以在 Codex 生命周期中的指定时机自动执行脚本,例如:

  • Codex 执行工具前;
  • Codex 执行工具后;
  • 新会话启动时;
  • 会话结束时;
  • 用户提交新的提示词时。

Codex Hook 本质上是“事件 + 匹配条件 + 要执行的命令”。命令 Hook 会从标准输入收到一段 JSON,可以从中读取当前目录、工具名称和具体命令。

2.2 Codex Hook 与 Git Hook 的区别

类型触发范围适合场景
Git post-commit任何工具完成 Git 提交后触发所有提交都通知
Codex PostToolUseCodex 调用工具完成后触发只监听 Codex 执行的提交

Codex 当前没有专门的“Git 提交完成”事件。Codex Hook 只能监听 Codex 的工具调用,因此要通过脚本检查命令中是否包含 git commit。

三、实践:方案一——所有提交完成后通知

3.1 创建 Git Hook

在项目目录中创建文件:

.git/hooks/post-commit

写入以下内容:

#!/bin/sh
 
COMMIT_MESSAGE=$(git log -1 --pretty=%s)
 
osascript -e "display notification \"提交完成:$COMMIT_MESSAGE\" with title \"Git 提交通知\""

这个例子使用 macOS 的系统通知。提交成功后,会弹出一条通知。

3.2 赋予执行权限

在项目根目录执行:

chmod +x .git/hooks/post-commit

以后无论是 Codex、IDE 还是终端执行:

git commit -m "提交说明"

都会触发通知。

3.3 替换为远程消息通知

如果希望将消息发送到飞书、企业微信、钉钉、Telegram 等平台,可以把 osascript 替换为对应平台的 Webhook 请求。

通用结构如下:

curl -fsS -X POST "$NOTIFY_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -d "{\"text\":\"提交完成:$COMMIT_MESSAGE\"}"

NOTIFY_WEBHOOK_URL 建议放在系统环境变量或安全的本地配置中,不要把 Token 直接提交到 Git 仓库。

四、实践:方案二——只监听 Codex 执行的提交

4.1 配置 Codex Hook

创建全局配置文件:

~/.codex/hooks.json

写入:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "^Bash$",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.codex/hooks/notify_commit.py",
            "async": true,
            "timeout": 10
          }
        ]
      }
    ]
  }
}

配置含义:

  • PostToolUse:Codex 工具执行结束后触发。
  • matcher: ^Bash$:只监听 Codex 执行的 Bash 命令。
  • notify_commit.py:读取命令并判断是否包含 git commit。
  • async: true:在后台发送通知,不阻塞 Codex 后续工作。
  • timeout: 10:脚本最多运行 10 秒。

4.2 编写通知脚本

创建文件:

~/.codex/hooks/notify_commit.py

写入:

#!/usr/bin/env python3
 
import json
import os
import re
import subprocess
import sys
 
 
def escape_applescript(value: str) -> str:
    return value.replace("\\", "\\\\").replace('"', '\\"').replace("\n", " ")
 
 
payload = json.load(sys.stdin)
tool_input = payload.get("tool_input") or {}
command = tool_input.get("command", "")
 
# 不是 git commit 就结束,不发送通知
if not re.search(r"\bgit\s+commit(?:\s|$)", command):
    sys.exit(0)
 
cwd = payload.get("cwd") or os.getcwd()
 
try:
    commit_id = subprocess.check_output(
        ["git", "rev-parse", "HEAD"],
        cwd=cwd,
        text=True,
    ).strip()
 
    commit_message = subprocess.check_output(
        ["git", "log", "-1", "--pretty=%s"],
        cwd=cwd,
        text=True,
    ).strip()
 
    repo_name = os.path.basename(
        subprocess.check_output(
            ["git", "rev-parse", "--show-toplevel"],
            cwd=cwd,
            text=True,
        ).strip()
    )
except subprocess.CalledProcessError:
    sys.exit(0)
 
message = f"{repo_name} 提交完成:{commit_message} ({commit_id[:8]})"
message = escape_applescript(message)
 
subprocess.run(
    [
        "osascript",
        "-e",
        f'display notification "{message}" with title "Codex 提交通知"',
    ],
    check=False,
)

这个脚本会:

  1. 读取 Codex Hook 传入的 JSON。
  2. 检查本次 Bash 命令是否包含 git commit。
  3. 获取仓库名、提交说明和提交短 SHA。
  4. 使用 macOS 通知显示提交信息。

4.3 审核并启用 Hook

在 Codex CLI 中输入:

/hooks

找到 notify_commit.py 对应的 Hook,审核并信任它。修改 Hook 配置或脚本后,Codex 可能要求重新审核。

4.4 测试

让 Codex 执行一次提交:

提交当前修改,并在提交完成后通知我。

如果提交成功,应该收到类似以下通知:

quartz 提交完成:整理 Codex Hook 配置 (a1b2c3d4)

五、实践:如何选择方案

5.1 需要所有提交都通知

使用 Git 的 post-commit Hook。

它可以覆盖:

  • Codex 提交;
  • IDE 提交;
  • 终端提交;
  • 脚本或自动化任务提交。

5.2 只需要 Codex 提交通知

使用 Codex 的 PostToolUse Hook,并在脚本中检查 tool_input.command 是否包含 git commit。

5.3 需要通知到聊天软件

保留 Hook 的触发逻辑,只替换通知函数:

  • macOS 本地提醒:使用 osascript;
  • 飞书、企业微信、钉钉:使用对应 Webhook;
  • Telegram:调用 Bot API;
  • 邮件:调用本地邮件命令或邮件服务 API。

不要把 Webhook Token、Bot Token、邮箱密码等敏感信息直接写入 hooks.json 或提交到仓库。

六、总结

6.1 推荐配置

如果目标是“每次提交都发消息给我”,推荐使用:

Git post-commit
    ↓
读取最新提交信息
    ↓
调用 macOS 通知或远程 Webhook
    ↓
收到提交提醒

只有在明确要求“仅监听 Codex 提交”时,才使用 Codex PostToolUse Hook。

6.2 官方参考资料