01)AI相关-codex hooks(钩子) 使用介绍-使用钩子记录每次修改的文件,和AGENTS.md作用对比

📅 发布时间:2026/7/10 9:59:19
01)AI相关-codex hooks(钩子) 使用介绍-使用钩子记录每次修改的文件,和AGENTS.md作用对比 Hook 钩子/AGENTS.md对比对比项Hook 钩子AGENTS.md本质自动执行脚本给 Codex/AI 看的项目规则说明作用方式在特定时机自动运行命令影响 Codex 的行为、判断和交付习惯典型触发PostToolUse、Stop等生命周期事件Codex 读取项目上下文后持续遵守适合做什么机械化、可脚本判断、可自动记录的事情需要理解语义、结合代码内容判断的事情不适合做什么复杂业务理解、自然语言判断、需要 AI 解释的检查强制阻断、稳定执行系统命令、后台审计乱码检测不太适合做“纠正”,只能用脚本扫描特征字符,容易粗糙更适合,能要求 Codex 修改后主动检查中文注释、文案、字符串是否正常乱码纠正不适合,脚本很难可靠判断原意并修复适合,Codex 可以结合上下文判断并修复记录修改文件很适合,可用git diff、git ls-files自动记录不适合自动记录,只能要求 Codex 在回复里说明记录命令执行适合,能从 hook payload 或脚本中记录不适合自动捕获是否显示在对话窗口通常不显示,主要写日志或阻断会体现在 Codex 的回复和执行过程里是否能强制执行较强,脚本触发后自动执行较弱,依赖 Codex 遵守说明配置复杂度较高,需要写 JSON、PowerShell/脚本、处理编码和路径较低,直接写自然语言规则可维护性偏技术化,适合稳定规则偏说明文档,适合团队约定失败表现脚本报错、权限问题、日志路径问题、hook 不触发Codex 可能遗漏,需要在规则里写清楚最佳用途审计日志、文件列表、命令记录、简单格式检查、阻断危险操作编码规范、乱码检查、注释要求、业务边界、交付前检查要求你的当前场景用来记录每轮修改文件列表很合适用来要求 Codex 每次修改后检查乱码更合适需求推荐记录本轮改了哪些文件Hook记录新增文件、修改文件Hook记录命令、时间、工作目录Hook检查并纠正乱码AGENTS.md要求 Codex 回复时说明是否检查过乱码AGENTS.md强制后台自动执行某个脚本Hook让 AI 按项目习惯工作AGENTS.mdcodex钩子应用示例-记录每次修改的文件步骤C:\Users\John目录根据自己电脑路径修改在codex根目录新建 hooks.json (如果之前没创建过则新建)、check_mojibake.ps1C:\Users\John.codex\hooks.jsonC:\Users\John.codex\hooks\audit_changes.ps1hooks.json 示例:{"hooks":{"Stop":[{"hooks":[{"type":"command","command":"powershell -NoProfile -ExecutionPolicy Bypass -File C:\\Users\\John\\.codex\\hooks\\audit_changes.ps1","timeout":30,"statusMessage":"Logging changed and added files"}]}]}}audit_changes.ps1示例:$ErrorActionPreference='Continue'$auditLogPath='C:\Users\John\.codex\hooks\codex_change_audit.log'$rawInput=[Console]::In.ReadToEnd()$inputJson=$nullif(-not[string]::IsNullOrWhiteSpace($rawInput)){try{$inputJson=$rawInput|ConvertFrom-Json-ErrorAction Stop}catch{$inputJson=$null}}functionGet-JsonPropertyValue{param([object]$Object,[string]$Name)if($null-eq$Object){return$null}if($Object.PSObject.Properties.Name-contains$Name){return$Object.$Name}return$null}functionWrite-ListBlock{param([System.Collections.Generic.List[string]]$Lines,[string]$Title,[string[]]$Values)$Lines.Add("${Title}:")if($null-eq$Values-or$Values.Count-eq0){$Lines.Add('- none')return}foreach($valuein$Values){if(-not[string]::IsNullOrWhiteSpace($value)){$Lines.Add("-$value"