更新时间:2026-07-18
适用范围:本文主要面向在本地代码仓库中使用 ChatGPT Desktop Codex、Codex CLI 或 IDE 扩展的开发者。Web、Work mode、Cloud 任务及不同账号能力可能有所不同。公开版说明:内容提炼自一个真实运行的前后端项目,但已移除项目名、端口、账号、私有远端、凭证位置和本机路径。文中的路由脚本、测试命令和归档机制是项目自定义案例,不是 Codex 内置命令。版本提醒:Rules、Hooks、Subagents 和项目配置会演进;本文以 2026 年 7 月的当前项目与官方文档为基线,使用前请再核对文末官方资料。
Codex 能读代码、改文件、运行命令、调用工具并持续排查,但它不会自动知道你的真实目标、项目边界和“做到什么才算完成”。
真正稳定的用法不是寻找一段万能 prompt,而是把不同信息放到合适的层级:
- 一次性要求放在当前 prompt。
- 长期硬规则放在
AGENTS.md。 - 长而低频的解释放在
docs/。 - 重复工作流做成 skill。
- 能机械判断的事情交给脚本、hooks 或 command rules。
- 外部系统通过 MCP、连接器或插件接入。
- 复杂且可并行的只读工作再考虑 subagents。
一句话概括:
先看事实和边界,再做最小改动;用真实验证交付,不用“应该没问题”交付。
这篇适合谁
- 你准备让 Codex 在真实 Git 仓库里读、改、测,而不只是回答问题。
- 你希望不同会话、不同开发者都遵守同一套项目边界。
- 你想减少重复 prompt,同时避免把整本规范塞进每一轮上下文。
- 你关心脏工作区、敏感信息、误提交、过度重构和“测试过了”这类模糊表述。
如果你只想问一个函数是什么意思,直接问即可;本文重点是持续、可验证的项目协作。
先看一张分工表
这张表最重要的原则是:一条规则只设一个主要归属,其他位置只保留触发条件和链接。复制得越多,漂移得越快。
一个真实可运行的项目骨架
下面是当前项目采用的结构,名称已经泛化:
AGENTS.mdPLANS.md docs/ 开发原则.md 设计规范.md Codex工作规则/ README.md 交付校准与路由规则.md 功能落地后自测和人工验收规则.md 运行态异常恢复规则.md 提交规则.md 对话记录规则.md 本地运维记录规则.md .agents/ skills/ project-acceptance/{SKILL.md,agents/openai.yaml} project-commit-push/{SKILL.md,agents/openai.yaml} project-conversation-archive/{SKILL.md,agents/openai.yaml} project-ops-records/{SKILL.md,agents/openai.yaml} .codex/ config.toml hooks.json rules/default.rules hooks/ post_tool_use_project_check.py stop_project_check.py agents/ architecture-reviewer.toml security-redaction-reviewer.toml test-acceptance-reviewer.toml scripts/ codex-route.mjs tests/ inspection/ codex-workflow-efficiency.test.mjs只有 AGENTS.md、Codex 配置、skills、hooks、rules 和 custom agents 属于 Codex 能识别的约定表面;PLANS.md、docs/Codex工作规则/、路由脚本和测试文件都是这个项目自己的工程约定,必须由 AGENTS.md 或 skill 明确引用。
第一层:让 AGENTS.md 保持轻量
Codex 会在工作前读取生效范围内的 AGENTS.md。项目可以在子目录放更近的 AGENTS.md 或 AGENTS.override.md;更靠近当前工作目录的规则优先。
因此,根文件应该像机场指示牌:短、稳定、能指路。不要把它写成机场地下管线图。
一个公开安全的最小示例:
# Agent 工作约定 本文件是仓库默认入口。开工只读本文;修改后再按实际路径补读专题和验证。 ## 默认流程 1. 明确目标和授权,先看 `git status --short` 与目标代码。2. 现有改动默认属于用户,不为清理工作区而回滚、删除或覆盖。3. 沿用现有模块、命名和数据流,不夹带无关重构。4. 修改后运行项目约定的路由或最小检查。5. 交付前复核 diff、验证和剩余风险。 ## 硬红线 - 客户端不直接写数据库,持久化写入经过服务端边界。- 服务端负责权限、校验、持久化和审计。- shared 只放跨端纯逻辑,不访问数据库、文件系统、HTTP、DOM 或环境变量。- 只保留一个正文或核心数据主协议,其他格式只是导入、兼容输出或派生数据。- 不输出或提交凭证、私有远端、本机绝对路径、完整敏感 payload 或私密正文。 ## 任务路由 - 只读问答、评估、审查:只读必要事实,不运行服务、不写文件。- 行为、API 或数据变化:运行风险对应的专项验证。- commit 与 push:只执行用户分别明确授权的动作。- 复杂、含糊、跨模块或高风险任务:使用项目计划模板。 ## 完成 - 说明改了什么和实际运行了什么验证。- 行为变化补充人工验收建议、入口和剩余风险。- 没运行的验证要说明原因,静态检查不能写成运行态已验收。三个常见错误:
- 把所有构建命令、设计规范和故障手册都塞进去。
- 写“每次都全量构建、全量测试”,导致小改动成本失控。
- 写成绝对承诺,却没有脚本或测试保证它真的执行。
第二层:专题文档按需读取
长规则适合放进 docs/,但不要要求每个任务预加载整套目录。
当前项目采用一个索引页管理触发条件:
| 专题 | 何时读取 |
|---|---|
| 交付校准与路由 | 工作区混有旧改动、风险分级不清或路由结果有争议 |
| 自测与人工验收 | 需要决定测试落点、报告策略或运行态范围 |
| 运行态异常恢复 | 目标页面/API 因进程、端口、依赖或缓存问题不可用 |
| 提交规则 | 暂存范围、验证复用、上游或认证异常 |
| 对话记录 | 用户明确归档、附件复制或自动归档恢复 |
| 本地运维记录 | 出现新的、未来可复用的运维事实 |
维护专题文档时遵循四条原则:
- 写长期稳定边界,不写单次任务流水。
- 当前代码和实测是事实基线,文档冲突时先查证。
- 正常流程放 skill,异常和解释放专题文档。
- 易变端口、会话名和凭证获取方式放本地脱敏记录,不写进公开规范。
第三层:把重复流程做成 skill
Skill 是带元数据的可复用工作流。Codex 先看到 name、description 和路径,只有显式调用或任务匹配时才加载完整 SKILL.md;这叫渐进式披露。
仓库级 skill 放在 .agents/skills//SKILL.md。最小格式:
---name: project-exampledescription: Explain exactly when this workflow should and should not run.--- 1. Inspect the current project facts.2. Perform only the authorized actions.3. Run the smallest relevant validation.4. Report actual results and residual risk.可选的 agents/openai.yaml 用于界面名称、默认 prompt、调用策略和工具依赖。它不是业务规则的第二份副本。
当前项目沉淀了四个高频 skill:
| Skill | 触发 | 核心边界 |
|---|---|---|
project-acceptance | 本轮改变运行行为、API、数据流或修复可复现 bug | 路由只是验证下限;按最高风险验证 |
project-commit-push | 用户明确说提交、commit、push 或提交并推送 | commit 与 push 分别授权 |
project-conversation-archive | 明确归档、实质任务附件复制、自动归档失败或历史恢复 | 只保留可见、必要、脱敏内容 |
project-ops-records | 新增可复用的 Git、服务、认证、部署或排障知识 | 不为普通成功操作追加流水 |
Skill 适合固定步骤,不适合模糊原则。一个流程如果重复出现、步骤稳定、做错有成本,就值得沉淀。
提交与推送必须拆开授权
这是最容易被一行模糊规则带偏的地方:
| 用户表述 | 允许动作 | 不允许顺便做 |
|---|---|---|
| “帮我提交” | 检查、暂存目标文件、创建本地 commit | push |
| “帮我推送” | 推送已有本地 commit | stage 或 commit 工作区 |
| “帮我提交并推送” | 先 commit,再 push | 纳入无关或敏感文件 |
| “整理提交范围” | 只读检查并给建议 | stage、commit、push |
“提交所有”也不等于可以提交本地记录、测试报告、缓存、构建产物、凭证和明显无关改动。
第四层:用项目路由给出验证下限
当前项目有一个自定义 scripts/codex-route.mjs。它不是 Codex 内置功能,而是把“路径 → 风险 → 专题文档 → 最小验证”机械化的工程模式。
常用方式:
# 读取整个工作区:staged、unstaged、untrackednode scripts/codex-route.mjs --changed # 只读取暂存区node scripts/codex-route.mjs --staged # 工作区混有无关改动时,只分析本轮目标node scripts/codex-route.mjs path/to/file-a path/to/file-b # 给脚本或测试消费node scripts/codex-route.mjs --changed --json输出示意:
Risk: standardBehavior: yesFiles: 3Docs: docs/设计规范.mdValidation: git diff --check && npm run <repo-defined-check>Runtime: target-route-or-apiNotes: noneWarnings: noneFinal fields: changes, validation, acceptance, url-or-path, residual-risk使用它时必须记住:
--changed不知道哪些改动属于当前任务,先看git status --short和关键 diff。- 路由按路径给出下限,不能替代代码语义、用户授权和运行态验收。
- 配置文件不能只按扩展名判断。认证、权限、构建、部署和敏感运行配置应上调风险。
git diff --check不覆盖暂存区和未跟踪文件;提交前还要运行git diff --cached --check,并检查新文件。- 路由建议的是命令,不代表命令已经执行。
当前项目使用的风险语言:
| 等级 | 典型变化 | 验证重点 |
|---|---|---|
| 只读 | 问答、评估、审查、状态确认 | 读取必要事实,不写文件 |
| 轻量 | 纯文档、项目工作流、无协议影响的局部展示 | 目标静态/点状检查 |
| 标准 | UI 交互、组件状态、普通 API、可复现 bug | 专项测试、模块检查、目标页面/API |
| 高风险 | 数据库、权限、公开 payload、共享协议、导入发布同步、构建部署 | 成功与失败边界、架构/数据检查、最新运行态、必要报告 |
这套分级是项目约定,不是 Codex 内置等级。
第五层:Hooks 与 Rules 只做 guardrail
Hooks 和 Rules 都有价值,但不能把它们写成“装上就绝对安全”。
Hooks:生命周期里的确定性脚本
Hooks 可以在工具调用前后、权限请求、用户提交 prompt、subagent 停止或当前任务停止时执行命令。
当前项目用:
PostToolUse:跟踪部分写工具和 Git 命令,提醒本地目录被暂存。Stop:在满足条件时写最小脱敏归档,或因附件复制继续一轮。
最小配置示意:
{ "hooks": { "PostToolUse": [ { "matcher": "Bash|apply_patch|Edit|Write", "hooks": [ { "type": "command", "command": "python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/post_tool_use_project_check.py\"", "timeout": 20 } ] } ], "Stop": [ { "hooks": [ { "type": "command", "command": "python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/stop_project_check.py\"", "timeout": 20 } ] } ] }}边界同样重要:
PostToolUse是事后反馈,不能撤销已经发生的副作用。- Matcher 只覆盖列出的工具;Shell 仍可能通过其他方式写文件。
- 项目 Hook 必须在可信仓库中加载;非托管命令 Hook 的新增或修改还要按定义重新审核信任。
transcript_path的 transcript 格式不是稳定接口,不应把完整解析当成永久兼容协议。- Hook 自测只能证明脚本逻辑,不等于 Codex 生命周期端到端已经验收。
自动归档是这个项目的可选模式,不是 Codex 内建最佳实践。若团队采用,至少要明确用户知情、白名单字段、脱敏失败策略、本地私有目录、访问权限、留存期限和删除办法。不要默认复制完整 transcript。
Rules:沙箱外命令的精确前缀策略
Rules 当前仍是实验功能,只控制 Codex 请求在沙箱外运行的命令。它按参数前缀匹配,最严格的决策优先:
allow:允许。prompt:每次询问。forbidden:阻止。
示例:
# match / not_match 是内联测试样例,不是完整命令覆盖清单。prefix_rule( pattern = ["git", "push", "--force"], decision = "prompt", justification = "Force push can rewrite shared history; require explicit approval.", match = [ "git push --force origin example-branch", ],)修改后用实际规则引擎检查:
codex execpolicy check --pretty \ --rules .codex/rules/default.rules \ -- git push --force origin example-branch一条 pattern = ["cat", ".env"] 只能拦截这个精确参数前缀,挡不住 sed、Python、绝对路径或其他工具读取。Rules 不是文件权限、沙箱、DLP、业务鉴权或代码审查的替代品。
项目级 .codex/config.toml、Hooks 和 Rules 都只在项目 .codex/ 层受信任时加载;Rules 修改后需要重启 Codex。
第六层:配置、MCP 和 custom agents
项目配置只放可共享的非秘密设置
下面是基于当前项目、为公开读者收紧后的配置骨架;数值是项目选择,不是通用最优默认:
# Project-scoped Codex settings for a trusted repository.project_doc_max_bytes = 16384tool_output_token_limit = 8000 [features]hooks = true [agents]max_threads = 6max_depth = 1 [mcp_servers.publicDocs]url = "https://developers.openai.com/mcp"enabled = truedefault_tools_approval_mode = "prompt"说明:
project_doc_max_bytes限制项目说明进入初始指令的字节数;它不是“越大越好”。tool_output_token_limit控制单项工具输出保留预算;真正的专项测试仍应尽量输出精炼结果。max_depth = 1允许根任务创建直接 subagent,但不继续嵌套。- 示例用
prompt作为公开保守值。只有充分审查工具语义后,才考虑更宽松的批准模式。 - 个人偏好可以放用户级配置;凭证值不要写进项目或全局 TOML。优先用 OAuth、系统 Keychain、credential helper 或环境变量引用。
MCP 连接外部事实和动作
本地仓库事实优先读文件和命令。GitHub、Figma、Notion、浏览器、内部文档和其他外部系统,更适合通过 MCP、连接器或插件访问。
使用 MCP 前回答三个问题:
- 它只读,还是会写外部系统?
- 它的认证由 OAuth、环境变量引用还是系统凭证管理器提供?
- 哪些工具需要逐次批准,哪些可以自动运行?
不要把 token、cookie、私钥或静态认证头直接写进仓库配置。
Custom agent role 适合窄职责并行审查
当前项目定义了三个只读审查角色:
- 架构边界审查。
- 安全与脱敏审查。
- 测试与验收审查。
Custom agent 文件只是角色定义,不会因为存在就自动执行。应由 prompt、AGENTS.md 或 skill 在合适任务中请求调度。
适合并行:
- 多个独立代码区的只读探索。
- 安全、架构、测试三个互不重复的审查角度。
- 独立日志或测试结果分析。
谨慎并行:
- 多个代理同时编辑同一文件。
- 子任务依赖前一个子任务的结论。
- 需要一个统一数据迁移或回滚决策的高风险变更。
Subagents 会增加 token 与协调成本。并行是为了隔离噪声和加速独立工作,不是为了让任务看起来更热闹。
第七层:复杂任务才使用计划模板
PLANS.md 是项目自定义模板,不是 Codex 自动识别的特殊协议。当前项目只在这些情况下使用:
- 用户明确要求先计划。
- 目标、授权或验收标准未决,合理假设会显著改变结果。
- 同时跨越两个以上主要边界,需要协调顺序或回滚。
- 涉及迁移、权限、公开协议、共享主协议、发布、同步、部署或回滚。
单文件低风险修改、普通评估和仅仅使用并行审查,不自动触发计划。
一个有效计划至少回答:
## 目标- 真正要达成的结果:- 不做范围: ## 上下文- 关键文件和入口:- 相关长期规则: ## 风险- 架构、数据、权限和脱敏边界:- 回滚或恢复方式: ## 步骤1. 每步有明确完成条件。 ## 验证- 专项测试:- 运行态入口:- 人工验收建议:计划服务于行动,不是为了写一份看起来很忙的阶段报告。
一次健康的 Codex 工作流
| 步骤 | 要点 |
|---|---|
| 确认类型与授权 | 区分只读、修改、诊断、运行服务和 Git 动作,不让“看看”变成“顺手修” |
| 检查工作区 | 查看 git status --short、目标文件和调用链;已有改动默认属于用户 |
| 决定计划或并行 | 小修直接做;复杂、高风险或边界未决再计划;独立只读问题才并行 |
| 做最小改动 | 复用现有模块、组件和数据流,不引入第二套路径 |
| 按本轮范围路由 | 干净工作区用 --changed,混有旧改动用显式路径,提交前用 --staged |
| 运行专项验证 | 先验证真实行为,再补类型、模块、架构或数据检查 |
| 复核实际 diff | 检查无关改动、敏感信息、生成物、调试日志和意外删除 |
| 如实交付 | 区分静态、专项、运行态、人工验收建议和剩余风险 |
提需求的实用公式
背景:现在发生了什么,入口、页面、接口或文件在哪里。目标:希望得到什么可观察结果。边界:哪些内容不要改,哪些动作没有授权。验证:怎样自动检查,怎样人工验收。交付:最终需要说明哪些结果和风险。小改动或 bug 修复
现象:……期望:……入口:…… 要求:- 先阅读现有实现并定位原因。- 只修改相关文件,不做无关重构。- 沿用现有组件、变量和数据流。- 运行能覆盖问题的最小专项验证。- 最终说明根因、改动、实际验证和剩余风险。只读评估或代码审查
只评估,不改文件,不启动或重启服务。 请结合当前代码判断:……重点检查:- 架构与数据边界。- 真实行为回归。- 测试缺口。- 敏感信息、调试日志和本地文件误入。 请引用具体文件和事实,并区分确定问题与建议。文档更新
帮我更新:<文档路径> 要求:- 以当前代码、配置和已验证行为为事实基线。- 删除过时、重复和不可执行内容。- 不写单次任务流水或私有环境信息。- 只修改目标文档。- 改完运行文档最小检查并说明未验证项。Git 操作
直接写清动作边界,例如:“只读整理提交范围”“只创建本地 commit,不要 push”或“只推送已有提交,不要 stage/commit 工作区”。把授权写清楚,比事后问“你怎么推上去了”便宜得多。
验证怎么写才不虚
“已验证”必须说明验证对象、命令、结果和未覆盖范围。
当前项目中的真实示例:
| 目的 | 示例命令 | 能证明什么 | 不能证明什么 |
|---|---|---|---|
| 文档空白检查 | git diff --check | 未暂存 diff 没有常见空白错误 | 暂存区和未跟踪文件 |
| 暂存区检查 | git diff --cached --check | staged diff 的空白错误 | 用户行为正确 |
| 工作流脚本测试 | npm run test:inspection:codex-workflow | 路由、Hook 脚本和 Skill 文本断言 | Codex 加载/信任 Hook 的完整 E2E |
| 客户端类型检查 | npm run client:type-check | TypeScript/schema 范围 | 未启用 checkJs 的全部 JavaScript |
| 服务端 smoke | npm run server:check | 服务可启动且健康入口可请求 | 业务路径和全部数据库边界 |
| shared smoke | npm run shared:check | 根模块可加载 | 共享协议的行为兼容性 |
| 架构边界 | npm run architecture:check | 脚本编码的架构红线 | 所有语义风险 |
| 专项行为 | node --test --test-reporter=dot | 目标断言覆盖的行为 | 没写进断言的用户路径 |
公开教程不能假设每个仓库都有这些脚本。使用前先读 package.json#scripts、Makefile 或项目说明;不要凭习惯编造 npm run typecheck。
还要区分三种表述:
- 静态验证完成:diff、语法、类型或文本检查通过。
- 运行态已验证:真实打开目标页面、操作交互或请求目标 API。
- 人工验收建议:交给用户执行的步骤,尚未执行。
只有真实做过第二项,才能写“运行态已验证”。
生产构建不是普通开发任务的默认验证。它可能耗时、覆盖开发缓存或改变当前服务状态;只有构建本身在范围内时才运行。
安全边界:别把钥匙挂门上
建议固定这些底线:
- 不读取、输出或提交明文 token、cookie、密码、私钥和连接凭证。
- 不把秘密写进项目或用户级
config.toml;配置只引用安全来源。 - 不把完整用户隐私、生产 payload、敏感正文或原始内部日志写进公开文档。
- 不用
git reset --hard、git checkout --或递归删除来“清理”不明工作区。 - 不把本地记录、报告、缓存、构建产物和附件默认提交。
- 数据库、部署、生产环境和外部写操作需要与任务匹配的明确授权。
- Rules 和 Hooks 是辅助防线,不替代最小权限、沙箱、服务端鉴权和人工审查。
- 浏览或引用外部最新信息时优先使用官方来源;内部项目事实优先看当前源码。
常见错误,以及更好的做法
| 错误 | 风险 | 更好的做法 |
|---|---|---|
| “帮我优化一下” | 目标、边界和完成标准不清 | 写入口、可观察结果、不做范围和验证;未知原因先只读诊断 |
| 每个任务先读全部文档 | 上下文噪声和旧规则压过事实 | 开工只读轻量入口,改动后按路径补读专题 |
| 路由显示轻量就肯定安全 | 路径启发式看不到业务语义 | 路由给下限,权限、数据、构建和公开协议按语义上调 |
| 有 Hook 就不会泄密 | Matcher 有限,PostToolUse 还是事后 | 结合权限、沙箱、精确 Rules、PreToolUse、脱敏和审查 |
| 类型检查通过就功能正确 | 类型与健康检查可能只是 smoke | 先写真实行为断言,再补类型与架构检查 |
| 不看 diff 就提交 | 可能夹带旧改动、报告、秘密或意外删除 | 检查 status、目标 diff、staged 清单,分别授权 commit/push |
小团队的渐进落地顺序
不需要第一天就搭完整自动化:
- 写一个不超过一两页的根
AGENTS.md。 - 放入 3 到 6 条真正不可突破的架构和安全红线。
- 把真实测试、类型检查和启动入口写清楚。
- 建一个专题索引,不让长文档默认全量加载。
- 同一流程重复两三次后再做 skill。
- 路径与验证映射稳定后再做路由脚本。
- 危险命令模式稳定后再加精确 Rules,并用
execpolicy check测试。 - 生命周期需求明确后再加 Hooks;先处理信任、隐私、失败和兼容性。
- 外部实时事实和动作通过 MCP/连接器接入。
- 多个独立只读问题出现时,再引入 custom agents 和并行调度。
先让 Codex 稳定做到“范围清楚、改动可查、验证真实、结果说清”,再追求自动化。
交付前 checklist
- 任务类型、目标入口、不做范围和授权是否明确?
- 工作区已有改动是否保持原样并排除在本轮之外?
- 是否沿用现有模块和数据流,没有夹带无关重构?
- 是否没有暴露秘密、私密正文和本机信息?
- 路由或风险判断是否只覆盖本轮范围,并按语义上调?
- 是否有针对真实行为的专项验证?
- 静态、运行态和人工验收建议是否区分清楚?
- staged 文件与授权是否一致,且排除了本地记录和生成物?
- commit 与 push 是否分别得到明确授权?
- 是否说明改动、实际验证、未验证项和剩余风险?
官方资料
最后一句
Codex 最擅长的不是替你猜完所有需求,而是在目标、边界和反馈清楚后,把具体工作推进得又快又稳。
你负责方向、授权和完成标准;Codex 负责读事实、做改动、跑验证、暴露风险。方向盘仍在人手里,油门才值得踩下去。