当前集成有契约与 HTTP 服务链 coverage。正式最低 Codex 版本尚未声明;完整的真实 Codex 宿主进程端到端验证仍是 Not validated。
成熟度与安装
完整的 Codex 安装需要插件的三个部分:UserPromptSubmitHook,用于自动召回、提示词采集与可选刷新;- HTTP MCP Server,用于显式操作;
- 内置
project-contextSkill,用于 Scope、Handoff 与 write-intent 规则。
最小用法
新开一个 Codex 会话。在/hooks 查看 UserPromptSubmit,再到 /mcp 确认 PowerContext Server。之后分别试三条路径:
- 提一个普通仓库 question。Hook 可以注入召回的上下文,但只会把这条提示词采集为 Source。
- 让 Codex 搜索或维护 Memory。内置 Skill 会引导它使用 MCP 工具。
- 确实想在同一轮次准备并提交持久 Handoff 时,说
handoff this work。
执行流程
Scope 与 Workstream 绑定
Scope 解析器按以下顺序检查:- 如果设置了
POWERCONTEXT_CODEX_SCOPE_ID,优先使用它; - Git 私有 Workstream 绑定;
- 规范化的 Git 远程仓库标识,再回退到规范化的项目路径。
latest 继续之前,如果 select_handoff_workstream 可用,Skill 会先调用它。存在多个候选时,必须由用户选择。Codex 随后绑定返回的 scope_id,重新解析,并在 Handoff 写入前要求精确 match。Picker 本身是只读。
注入与 API 基础地址推导
Hook 从已安装插件的.mcp.json 读取 powercontext HTTP MCP URL,要求它是安全且无歧义的 /mcp URL,再移除该路径得到 HTTP API 基础。自动 HTTP calls 与 MCP 因此始终使用同一端点,不存在另一份可能与 MCP 配置漂移的 Hook URL。
已准备上下文通过模式检查和大小上限后,才会作为 additionalContext 写到 Hook 标准输出。Empty 结果不输出内容。未知模式、重定向、超限响应、认证失败、Server 错误或实际耗时截止时间都采用 fail-open,并只留下不含内容诊断信息。授权信息绝不会跨重定向转发。
采集与刷新
自动采集只把当前提示词写入/v1/sources/content,Source ID 使用稳定的 codex-user-prompt: 前缀,并保留来源信息。它不采集助手最终响应,也不创建 Task Outcome。
预期召回失败会被隔离,因此采集仍可继续。但意外召回异常可能到达 outer fail-open handler,并跳过这次采集,所以不能声称两者无条件独立。设置 POWERCONTEXT_CODEX_CAPTURE_PROMPTS=false 可关闭采集。设置 POWERCONTEXT_CODEX_FLUSH_ON_CAPTURE=true 可启用可选刷新;POWERCONTEXT_CODEX_FLUSH_MAX_CALLS 限制尝试次数。只有 current_cursor >= position 后,Hook 才结束等待。若游标始终追不上,轮次仍继续,但不能声称已经生成 Memory。
已采集提示词只是 Source 证据。超过 200,000 字符的提示词会跳过。Codex 采集没有 DSH 的窄匹配 secret-marker 过滤器;提示词不应持久化时,请关闭采集。调度器/刷新处理可能生成 Candidate,Review 最终可以提交 Memory,也可以无变更。
MCP、Skill、Handoff 与权限
MCP 提供显式 Memory 维护、工作契约(Work Contract)、Handoff、确认、结果与 Review 操作。POWERCONTEXT_CODEX_AUTHORIZATION 可以通过 .mcp.json 的 env_http_headers 提供完整授权信息值;公开本地 Server 可以不设置。远程端点必须使用 HTTPS。
Skill 为 handoff this work 定义单轮次语义。Codex 检查当前对话与仓库,只调用一次 handoff_current_work 并使用 unique source_id,在同一轮次将返回的 handoff 原样传给 commit_handoff,并且只在拿到精确 Revision 后报告成功。明确命令已经授权 Handoff 时,不会再索要第二次确认。
预览边界很明确。Handoff 问题、设计讨论、draft 请求或 preview and make no writes 都不授权写入。Codex 只在对话中展示拟议字段,不能调用 handoff_current_work,因为准备本身就会记录边界 Source。已准备 Handoff 可以不提交,但它不是 zero-write 预览。
显式持久修改操作失败必须可见。MCP 工具 annotations 会描述读取/写入、destructive 与 幂等 意图,但工具 visibility 本身不是授权信息边界。宿主权限 UI 与 enforcement 属于 Host-gated 和 Not validated;不要从其他适配器借用更强的无界面保证。
Unsupported 与 Not validated
托管 Skill 导出支持 Codex,但已导出托管 Skill 与内置插件 Skill 是不同对象。安装其中一个,不能替代另一个。
负向实验
- 停掉 Server 后提交普通提示词。Codex 应继续运行;显式写入应报告失败。
- 触发预期召回失败,确认采集仍运行。再单独注入意外召回异常,确认整个 Hook 仍 fail-open;这次采集可能被跳过。
- 把 MCP URL 改成 unsafe、ambiguous 或非
/mcp值。设置应拒绝,而不是猜测 API 基础。 - 让 Hook 请求重定向。授权信息不得到达目标端。
- 返回 未知 模式或超限响应。不得发生注入。
- 让刷新用完 attempt/截止时间预算,同时游标始终落后。轮次应继续,且不能谎报 Memory。
- 让 Handoff 准备成功、提交失败。报告边界 Source 已写入、持久里程碑不存在;不要为了重试再创建第二个边界。
- 请求
preview and make no writes。确认没有 PowerContext 调用写入 Source 或 Handoff。 - 用 old Citation 修订或停用 Memory。应返回冲突;刷新头版本,不能盲目覆盖。
配置默认值
Hook 从插件.mcp.json 推导 API 基础,默认连到 http://127.0.0.1:8000/mcp。其余行为由 POWERCONTEXT_CODEX_ 环境变量控制:
插件
.mcp.json 至少要有这些字段。令牌只写环境变量名,不写值:
/hooks列出 PowerContextUserPromptSubmit。提示信任时再信任。/mcp看到名为powercontext的 Server。Server 已启动时应是 已连接。/mcp工具列表里有remember_memory,没有prepare_context。
POWERCONTEXT_CODEX_SERVER_URL 会被忽略。server_url 只来自插件 .mcp.json。不要把令牌写进 .mcp.json、Server URL 或静态 MCP 请求头。当前工作不能落成 Source 时:
在这个宿主上做完统一题
修改 OpenAPI 契约后,下一步应该做什么?
- 在固定 Scope 里用 MCP
remember_memory保存答案。不要只靠自动采集。 - 开一个新 Codex 会话,用
/mcp确认仍连着 Server,再问同一句。 - 召回必须带 Citation,并且只出现在
UserPromptSubmit的additionalContext。 - 停掉 Server 后再问普通编码问题。Hook 可以 fail-open,编码应继续。
- 再调用 MCP
remember_memory。失败必须可见,不能假装保存成功。
完成检查表
只有以下结果都能直接观察时,才算完成:powercontext doctor codex能找到已安装/已启用插件。- Server 存活状态/就绪状态由单独的
powercontext doctor检查。 /hooks显示UserPromptSubmit。/mcp显示 PowerContext Server。- 内置
project-contextSkill 与 Hook、MCP 同时存在。 - Hook 从 MCP 使用的同一个
.mcp.jsonURL 推导 API 基础。 - Codex 与 Claude Code 对同一仓库/Workstream 解析出一个 Scope。
- 自动 Source 只包含用户提示词,不包含助手最终响应。
- 必须保持私密的提示词已关闭采集。
- 可选 刷新有明确上限,并在成功前证明
current_cursor >= position。 preview and make no writes不产生写入。- Imperative Handoff 在一轮次内完成,并返回精确已提交 Revision。
- 显式写入失败保持可见。
- 自动召回/采集失败仍 fail-open。
- 上面的 Unsupported、Not validated 与 Host-gated 状态始终分开,包括真实宿主的 Handoff、预览与权限校验。

