让 ChatGPT 与 Codex 协同:AGENTS、.agents 与 Handoff 工程配置
主题:AI 开发工程治理实践
版本:CSDN 发布稿 v1.0
适合人群:想让多个 AI 工具长期维护同一工程仓库的开发者
阅读方式:本文可独立阅读,不依赖其他文章背景。
从零打通 那啥GPT 网页版 + 桌面版 访问本地代码:CodexPro + MCP 实战教程
CodexPro + MCP + Cloudflare 配置详解:HTTP2、QUIC 与连接排障
GPT + Codex CLI + CodexPro 三位一体:AI 编程协作工作流

一句话结论
.agents 目录可以把 ChatGPT 的架构评审、Codex 的本地执行和 completion report 串成闭环;AGENTS.md 则是 Codex 官方支持的仓库级自定义指令文件,可记录项目规则、验证方式和完成标准。
#mermaid-svg-poZemkhUaCgKCBI1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-poZemkhUaCgKCBI1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-poZemkhUaCgKCBI1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-poZemkhUaCgKCBI1 .error-icon{fill:#552222;}#mermaid-svg-poZemkhUaCgKCBI1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-poZemkhUaCgKCBI1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-poZemkhUaCgKCBI1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-poZemkhUaCgKCBI1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-poZemkhUaCgKCBI1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-poZemkhUaCgKCBI1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-poZemkhUaCgKCBI1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-poZemkhUaCgKCBI1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-poZemkhUaCgKCBI1 .marker.cross{stroke:#333333;}#mermaid-svg-poZemkhUaCgKCBI1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-poZemkhUaCgKCBI1 p{margin:0;}#mermaid-svg-poZemkhUaCgKCBI1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-poZemkhUaCgKCBI1 .cluster-label text{fill:#333;}#mermaid-svg-poZemkhUaCgKCBI1 .cluster-label span{color:#333;}#mermaid-svg-poZemkhUaCgKCBI1 .cluster-label span p{background-color:transparent;}#mermaid-svg-poZemkhUaCgKCBI1 .label text,#mermaid-svg-poZemkhUaCgKCBI1 span{fill:#333;color:#333;}#mermaid-svg-poZemkhUaCgKCBI1 .node rect,#mermaid-svg-poZemkhUaCgKCBI1 .node circle,#mermaid-svg-poZemkhUaCgKCBI1 .node ellipse,#mermaid-svg-poZemkhUaCgKCBI1 .node polygon,#mermaid-svg-poZemkhUaCgKCBI1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-poZemkhUaCgKCBI1 .rough-node .label text,#mermaid-svg-poZemkhUaCgKCBI1 .node .label text,#mermaid-svg-poZemkhUaCgKCBI1 .image-shape .label,#mermaid-svg-poZemkhUaCgKCBI1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-poZemkhUaCgKCBI1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-poZemkhUaCgKCBI1 .rough-node .label,#mermaid-svg-poZemkhUaCgKCBI1 .node .label,#mermaid-svg-poZemkhUaCgKCBI1 .image-shape .label,#mermaid-svg-poZemkhUaCgKCBI1 .icon-shape .label{text-align:center;}#mermaid-svg-poZemkhUaCgKCBI1 .node.clickable{cursor:pointer;}#mermaid-svg-poZemkhUaCgKCBI1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-poZemkhUaCgKCBI1 .arrowheadPath{fill:#333333;}#mermaid-svg-poZemkhUaCgKCBI1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-poZemkhUaCgKCBI1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-poZemkhUaCgKCBI1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-poZemkhUaCgKCBI1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-poZemkhUaCgKCBI1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-poZemkhUaCgKCBI1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-poZemkhUaCgKCBI1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-poZemkhUaCgKCBI1 .cluster text{fill:#333;}#mermaid-svg-poZemkhUaCgKCBI1 .cluster span{color:#333;}#mermaid-svg-poZemkhUaCgKCBI1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-poZemkhUaCgKCBI1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-poZemkhUaCgKCBI1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-poZemkhUaCgKCBI1 .icon-shape,#mermaid-svg-poZemkhUaCgKCBI1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-poZemkhUaCgKCBI1 .icon-shape p,#mermaid-svg-poZemkhUaCgKCBI1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-poZemkhUaCgKCBI1 .icon-shape .label rect,#mermaid-svg-poZemkhUaCgKCBI1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-poZemkhUaCgKCBI1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-poZemkhUaCgKCBI1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-poZemkhUaCgKCBI1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ChatGPT
architecture-reviews
codex/inbox handoff
Codex 执行
codex/reports
codex/done
1. 为什么需要 .agents
当项目只有一个人、一个聊天窗口时,随便说一句"帮我改一下"可能够用。
但长期项目不一样。长期项目需要回答:
- 谁提出的任务?
- 要改哪些文件?
- 验收标准是什么?
- Codex 实际做了什么?
- ChatGPT 怎么知道执行结果?
- 下一轮从哪里继续?
.agents 的作用就是把这些问题文件化。
2. 推荐目录结构
text
.agents/
├── README.md
├── chatgpt/
│ ├── README.md
│ ├── instructions/
│ │ └── README.md
│ └── architecture-reviews/
│ └── README.md
└── codex/
├── README.md
├── inbox/
│ └── README.md
├── done/
│ └── README.md
└── reports/
└── README.md
3. 每个目录放什么
| 目录 | 内容 |
|---|---|
.agents/chatgpt/instructions/ |
ChatGPT 生成的任务说明 |
.agents/chatgpt/architecture-reviews/ |
架构评审、ADR 草案 |
.agents/codex/inbox/ |
待 Codex 执行的 handoff |
.agents/codex/done/ |
已完成 handoff |
.agents/codex/reports/ |
Codex 执行报告 |
4. Handoff 生命周期
text
ChatGPT 生成任务
|
v
写入 inbox
|
v
用户明确要求 Codex 执行
|
v
Codex 修改文件并验证
|
v
Codex 写 completion report
|
v
ChatGPT 读取报告复审
关键点:进入 inbox 不等于自动执行。
5. Handoff 模板
建议模板:
markdown
# HANDOFF-0001: Repository Structure v0.2
## Handoff ID
HANDOFF-0001
## From
ChatGPT
## To
Codex
## Date
2026-07-07
## Status
Pending
## Objective
说明这次任务要达成什么。
## Scope
说明包含什么、不包含什么。
## Instructions
列出具体执行步骤。
## Files to Modify
列出预计修改文件。
## Acceptance Criteria
列出验收标准。
## Completion Report
未执行时写 Not executed。
模板文件可以放在:
text
templates/agent-handoff-template.md
6. Completion Report 怎么写
建议报告格式:
markdown
# HANDOFF-0001 Completion Report
## Summary
## Files Changed
## Verification
## Git Status
## Not Done
## Next Steps
报告必须让 ChatGPT 不看终端也能知道:
- 做了什么。
- 改了哪里。
- 怎么验证。
- 还有什么风险。
7. AGENTS.md 的作用
.agents 是任务流目录,AGENTS.md 是 Codex 会在任务开始前读取的自定义指令文件。
AGENTS.md 可以写:
- 仓库结构和重要目录。
- 如何运行、测试和验证项目。
- 修改前后的 Git 检查习惯。
- 什么叫完成,以及如何写执行报告。
- 哪些内容不应引入当前任务。
示例:
markdown
# AGENTS.md
## Repository Rules
- Use the existing `.venv`.
- Do not recreate the virtual environment.
- Do not push to remote without explicit approval.
- Write completion reports for handoff execution.
- Do not introduce unverified business rules or architecture assumptions.
8. 和治理文件的关系
不要让 AGENTS.md 变成万能文档。
推荐分工:
| 文件 | 职责 |
|---|---|
| README.md | 项目入口、安装方式、常用命令 |
| docs/ | 设计说明、教程、操作文档 |
| AGENTS.md | Codex 自定义指令、项目规则、验证方式 |
| .agents/ | 代理任务与报告 |
| decision-log/ | 决策、设计、里程碑 |
9. 安全注意事项
handoff 和报告里不要写:
- token。
- API key。
- Cloudflare 临时完整 URL。
- 私有客户信息。
- 不能公开的本地路径。
如果必须引用敏感配置,用占位:
text
https://example.trycloudflare.com/mcp?codexpro_token=<redacted>
10. 推荐落地步骤
- 创建
.agents目录结构。 - 给每个目录写 README。
- 创建
templates/agent-handoff-template.md。 - 创建第一个 handoff,但不要自动执行。
- 用户明确要求后,由 Codex 执行。
- Codex 写 report。
- ChatGPT 读取 report,进入下一轮。
11. FAQ
.agents 要不要提交到 Git?
如果它是项目协作流程的一部分,建议提交。若里面有临时私密内容,应拆分到 ignored 目录。
handoff 进入 inbox 后 Codex 会自动执行吗?
不会。必须由用户明确告诉 Codex 执行。
ChatGPT 怎么知道 Codex 的结果?
Codex 把执行报告写到 .agents/codex/reports/,ChatGPT 通过 CodexPro 或用户复制内容读取报告。
12. 系列总结
如果你正在搭建一套 AI 开发协作流程,可以按下面顺序逐步落地:
- 让 ChatGPT 访问本地代码。
- 理解 CodexPro、MCP、Cloudflare 链路。
- 建立 ChatGPT + Codex CLI + CodexPro 工作流。
- 用
.agents和 AGENTS.md 固化长期协作规范。
这就是 AI 工程治理的起点:不是让 AI 随便改文件,而是让 AI 的计划、执行、验证和复盘都有工程痕迹。