我为什么要做一个 Codex CLI 研发流程插件:从 Skill 到状态机的工程化实践

发布时间:2026/10/2 15:50:18
我为什么要做一个 Codex CLI 研发流程插件:从 Skill 到状态机的工程化实践 1. 为什么单靠 Codex CLI 管不住多任务研发流程我平时用 Codex CLI 写代码一天里经常同时开着几个任务一个在确认方案一个正在改代码还有一个已经推到测试环境等着验证偶尔还有任务卡在 PR Review 等我处理完意见再继续。Codex CLI 做单件事很快真正让我头疼的是这些任务之间的衔接。我的开发流程大致是需求描述 → 方案设计 → 方案确认 → 开发 → 测试环境 → 测试 → PR → Review → 修改 → 合并 → 发布。流程并不新鲜问题在于它需要人一直盯着。切换任务时我要先回忆这个任务走到了哪里接着补充上下文告诉 Codex 已经做过什么然后再确认下一步要加载哪套规则。测试通过了吗Review 改完有没有重新跑测试这个分支现在能不能合并这些事情不难却会不停打断工作。只有一个任务时靠记忆还能应付。任务一多人工就变成了调度器。代码还没写多少时间已经花在切窗口、找记录、重复说明上了。Codex CLI 可以读代码、改文件、跑测试也能根据 Skill 执行一套约定好的动作但它默认面对的是当前这次对话不会自动替我维护所有任务的生命周期。这就是我做 Codex CLI 研发流程插件的起点。我不想再写一个“执行一串命令”的脚本也不想让 AI 不经确认地一路操作到生产环境。我想先把几件重复的事交给它管记住每个任务当前处于哪个阶段知道当前阶段完成的条件阶段完成后提醒或推进下一步出现失败或需要判断时停下来下次回来时能从原来的位置继续。判断仍然在我这里插件只接手那些容易忘、又不得不做的衔接。设计上我把分工定成四层。Plugin 把运行时、Skill、配置和脚本打包在一起负责安装和分发解决“这套能力怎么带到另一个项目里”。Host 或 Runtime 管理任务状态判断当前阶段是否完成决定能否进入下一阶段测试失败时它应该让任务停在测试阶段而不是假装成功继续往下走。Skill 描述阶段的具体动作和检查项例如需求阶段要问清楚哪些问题开发阶段要跑哪些检查测试阶段怎样验收创建 PR 时使用什么标题和正文格式。Sub-agent 负责可拆分的工作例如分别分析代码、整理测试场景、初步归类 Review 意见主流程负责汇总结果。一句话概括Plugin 组织能力Host 推进状态Skill 描述规则Sub-agent 执行可拆分的工作。插件本身不应该知道某个项目的测试命令也不应该把所有 PR 格式写死它只维护流程骨架和状态。团队习惯变了改 Skill 就可以不需要重新改流程代码。第一版我故意收着做。曾经考虑过让用户自由定义所有阶段和状态但这会马上带来一堆问题多个 Skill 冲突时听谁的项目配置和全局配置怎样合并阶段回退后哪些检查要重做如果这些问题还没在真实使用中出现就先把系统抽象成完整工作流引擎最后很可能只是增加配置负担。所以第一版先固定需求、方案、开发、测试、Review、合并和发布这些阶段每个阶段有一个主要 Skill用户可以直接修改 Skill复杂规则放到对应的 references 文件里暂不做复杂的追加 Skill 调度。我先想知道一件事多个任务一起跑时这条链路会不会真的省事。2. TaoToken 前置准备给 Codex CLI 插件配好模型入口插件负责流程编排但每一次阶段推进背后都要调用模型。Codex CLI 默认走 OpenAI 的接口如果你希望用更灵活的方式接入模型或者团队里多人共用一套调用入口可以先把 TaoToken 的 API 配好。它提供 OpenAI 兼容的接口Codex CLI 这类工具改一下 Base URL 和 Key 就能接上不需要改插件本身的代码。先拿到 API Key。打开 https://taotoken.net/api-keys 登录后创建一个新的 Key复制出来保存好。这个 Key 只在创建时完整显示一次后面配置里要用到。注意不要把它写进项目仓库的配置文件也不要提交到 Git凭据只通过环境变量或已经授权的工具提供。接着确认你要用的模型 ID。打开 https://taotoken.net/models 可以看到当前可用的模型列表记下你打算在 Codex CLI 里使用的那个 Model ID后面配置里要填。不同模型在代码理解和长上下文上的表现不一样研发流程里既有方案设计这种需要推理的环节也有改代码、跑检查这种偏执行的环节你可以按阶段需要选择也可以先用一个通用模型跑通全流程。TaoToken 的 API 地址是 https://taotoken.net/api 这是 OpenAI 兼容入口。Codex CLI 的配置里需要填 Base URL注意末尾不要多加/v1之外的路径具体以 Codex CLI 当前版本的配置说明为准。如果你用的是 Claude Code 这类工具接入方式类似Base URL 和 Key 的填法一致模型 ID 换成对应的即可。配置完成后建议先做一次最小验证确认 Key 和模型都能通再回到插件流程里。验证方式可以用 curl 直接请求也可以先在 https://taotoken.net/models 的对话页面里发一条消息试试。模型对话入口适合快速确认模型是否可用不用改任何本地配置。这里要提醒一点插件本身不负责管理你的 API Key它只负责流程状态。Key 的配置放在 Codex CLI 或运行环境这一层插件调用时用的是已经配好的模型入口。这样分工的好处是换模型、换 Key 都不用动插件代码流程骨架和模型接入是解耦的。如果你打算长期在多个项目里跑这套流程可以考虑用 Coding Plan 这类方式统一管理调用额度避免每个项目单独配 Key。入口在 https://taotoken.net/coding-plan 适合需要持续编码和 Agent 调用的场景。配置好之后Codex CLI 里所有阶段推进都会走这个入口插件只关心状态流转是否正确。3. 可复制配置插件目录结构、Skill 定义与状态机片段这一节给出可以直接复制的配置片段。先看插件仓库的整体目录结构理解每一层放什么后面改 Skill 和配置时才知道该动哪个文件。change-delivery-plugin/ ├── plugin.yaml # 插件 manifest声明名称、版本、入口 ├── scripts/ │ └── install-shared-plugin.ps1 # 安装脚本准备运行时和 Skill 副本 ├── runtime/ │ └── change_delivery/ # Host 运行时管理状态机 │ ├── config.py # 项目配置加载与哈希计算 │ ├── state_machine.py # 阶段流转与完成条件判断 │ └── cli.py # register / doctor / run 命令入口 ├── skills/ │ ├── delivery-planning/SKILL.md │ ├── delivery-implement/SKILL.md │ ├── delivery-local-validation/SKILL.md │ ├── delivery-review/SKILL.md │ ├── delivery-review-fix/SKILL.md │ ├── delivery-commit/SKILL.md │ ├── delivery-pr/SKILL.md │ ├── delivery-test-deploy/SKILL.md │ ├── project-test-acceptance/SKILL.md │ └── delivery-ready-check/SKILL.md └── references/ # 复杂项目约定按需被 Skill 读取Skill 定义片段以 Review 阶段为例说明一个阶段要写清楚哪四件事进入时需要什么输入、这一步要做哪些动作、应该产出什么结果、什么条件满足后才算完成。--- name: delivery-review description: 处理 PR Review 意见判断哪些必须修复修复后重新进入本地验证 --- # Review 阶段 ## 进入条件 - 当前任务处于 PR_REVIEW 状态 - 已存在对应的 PR 链接和 Review 意见 ## 动作 1. 逐条归类 Review 意见标记严重级别 2. 对必须修复的意见生成修改计划 3. 修改完成后触发本地验证 Skill 4. 对不需要修复的意见记录理由 ## 产出 - 修复清单与理由记录 - 本地验证通过的结果 ## 完成条件 - 所有必须修复的意见已处理 - 本地测试重新跑通 - 未修复意见有明确记录状态机配置片段放在 runtime 里定义阶段顺序和每个阶段的完成判定。下面是一个简化后的 TOML 片段实际运行时以插件仓库里的配置为准。[state_machine] initial_state REQUIREMENT max_steps_per_run 32 [[state_machine.states]] name REQUIREMENT skill delivery-planning next PLAN_CONFIRM [[state_machine.states]] name PLAN_CONFIRM skill delivery-planning next IMPLEMENT requires_human true [[state_machine.states]] name IMPLEMENT skill delivery-implement next LOCAL_VALIDATION [[state_machine.states]] name LOCAL_VALIDATION skill delivery-local-validation next PR_REVIEW on_failure IMPLEMENT [[state_machine.states]] name PR_REVIEW skill delivery-review next REVIEW_FIX [[state_machine.states]] name REVIEW_FIX skill delivery-review-fix next LOCAL_VALIDATION [[state_machine.states]] name READY_TO_MERGE skill delivery-ready-check next STOP项目配置片段注意路径和远端地址要填对凭据不要写进来。project_id: example-backend repo_path: C:/workspace/example-backend remote: origin remote_fetch_url: https://github.com/example-org/example-backend.git remote_push_url: https://github.com/example-org/example-backend.git base_branch: develop test_branch: test test_push_strategy: force-with-lease max_internal_review_fix_attempts: 3 github_repository: example-org/example-backend version_endpoint: https://test.example.com/health version_sha_field: git_sha required_pre_pr_checks: - executable: python args: [-m, pytest] workdir: C:/workspace/example-backend timeout_seconds: 1800 credentials: [] production_enabled: false这里最容易填错的是几个路径和远端地址repo_path 必须是项目仓库的绝对路径remote_fetch_url 和 remote_push_url 要填写登记时认可的远端身份base_branch 是开发基线分支test_branch 是测试环境分支version_endpoint 必须是测试环境地址不能填生产地址production_enabled 当前必须保持为 false。如果你用的是 Codex CLI 的 auth.json 方式管理凭据注意 auth.json 里只放模型入口相关的配置不要把项目仓库的 token 混进去。Base URL、Key、Model ID 三件套在 Codex CLI 的配置里写全插件运行时读的是这份配置不是项目配置。4. 验证请求从任务触发到状态流转的完整动作配置准备好之后先做一次最小验证确认插件能加载、项目能登记、状态机能推进。整个过程分几步每一步都有明确的返回结果可以对照。第一步确认本机环境。需要 Codex CLI、Git、Python 3.12 以上版本以及 GitHub CLI。如果仓库需要认证先执行gh auth login -h github.com gh auth status第二步克隆固定版本并运行安装脚本。以 Windows PowerShell 和 v0.2.2 为例git clone --branch v0.2.2 --depth 1 https://github.com/708828375/change-delivery-plugin.git Set-Location .\change-delivery-plugin powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install-shared-plugin.ps1安装器会准备插件副本、运行主机和专用 Python 环境。安装完成后建议新建一个 Codex CLI 会话旧会话不会自动加载刚安装的 Skill。第三步登记项目。项目配置不会直接被 doctor 自动写入需要先计算配置哈希再显式登记$launcher $env:USERPROFILE\.codex\change-delivery\bin\change-delivery.ps1 $candidate (Resolve-Path .\project-config.yaml).Path $python $env:USERPROFILE\.codex\change-delivery\runtime\venv\Scripts\python.exe $configHash $python -c from change_delivery.config import load_project_config; import sys; print(load_project_config(sys.argv[1]).config_hash) $candidate $launcher register --candidate-file $candidate --confirm-hash $configHash --json登记成功后运行只读诊断 $launcher doctor --project example-backend --jsondoctor 会检查项目是否已登记、仓库路径、Git 远端、分支和工具绑定。它只做检查不会替你推送代码也不会修改测试环境。如果配置文件改过原来的哈希就失效了应重新计算哈希并再次执行 register不要继续使用旧注册记录。第四步触发一次任务。进入实际项目的仓库启动一个新的 Codex CLI 会话直接描述需求并调用插件使用 $change-delivery 启动这个需求的交付流程。想先检查安装和项目状态可以运行 $env:USERPROFILE\.codex\change-delivery\bin\change-delivery.ps1 --help $env:USERPROFILE\.codex\change-delivery\bin\change-delivery.ps1 doctor --json第五步让状态机连续推进。设计方案确认之后 $env:USERPROFILE\.codex\change-delivery\bin\change-delivery.ps1 run run-id --json一次 run 最多处理 32 步。遇到需要方案确认、人工授权、外部 CI 或 Review 结果时它会停下来不会把等待状态误判成完成。返回结果中会带有本轮处理的步骤方便确认实际推进到了哪里。当前版本会在 READY_TO_MERGE 停止不会自动合并也不会未经授权发布生产环境。验证成功的标志是doctor 返回项目已登记且绑定正常run 返回的步骤列表里能看到状态从 REQUIREMENT 推进到 PLAN_CONFIRM 后停住等待人工确认。这说明 Skill 加载正常、状态机流转正常、人工确认节点生效。如果 run 直接跑到底没有停说明 requires_human 配置没生效需要检查状态机配置里对应阶段是否标了人工确认。5. 本篇常见错排查401、local proxy failed、reading choices 与 OAuth配置和验证过程中容易碰到几类报错这里按真实报错对照排查。401 未授权。通常是 API Key 没配、配错或者 Key 已失效。先确认 Codex CLI 配置里的 Key 和 TaoToken 控制台里创建的一致注意 Key 只在创建时完整显示一次如果当时没保存需要重新创建一个。Base URL 也要确认填的是 https://taotoken.net/api 末尾路径不要多加。如果 Key 和 Base URL 都对还是 401检查是不是环境变量没生效重启一下终端或 Codex CLI 会话。local proxy failed。这类报错一般出现在本地网络配置或代理设置上。先确认本机没有残留的代理环境变量检查 HTTP_PROXY、HTTPS_PROXY 这类变量是否指向了不可用的地址。如果团队环境里确实需要走网络配置按团队规范设置不要用来源不明的配置。插件本身不处理网络层它只负责流程状态网络问题要在 Codex CLI 或系统层解决。reading choices 相关报错。这类报错通常出现在模型返回格式和预期不一致时比如返回体里没有 choices 字段或者字段结构变了。先确认你用的 Model ID 在 TaoToken 的模型列表里存在并且是 OpenAI 兼容格式。如果换了模型之后出现这个报错换回一个确认可用的模型试试排除是模型侧的问题。插件调用模型时读的是标准返回结构如果模型返回格式不标准就会在这里报错。OAuth 相关报错。如果用的是 GitHub CLI 做仓库认证OAuth 过期或权限不足会报错。执行 gh auth status 看当前登录状态必要时重新 gh auth login -h github.com。注意 OAuth 管的是仓库访问权限和模型 API Key 是两回事不要混在一起排查。仓库认证失败会影响 register 和 doctor 里的远端检查但不会影响模型调用。还有一类是配置哈希失效。改了 project-config.yaml 之后没有重新 registerdoctor 会提示哈希不匹配。按第 4 节的步骤重新计算哈希并 register 即可。另外改完 Skill 后需要重新运行安装脚本并新建 Codex CLI 会话否则当前用户目录下的发布副本和已经打开的会话可能仍然是旧内容。如果排查完还是不通可以先用模型对话入口单独验证模型是否可用把模型层和插件层分开定位。模型对话能通说明 Key 和模型没问题问题在插件配置或状态机模型对话不通说明要先解决模型接入。接入文档里有更细的配置说明可以对照检查。6. 把流程骨架交给插件把判断留给自己这套插件真正想省下来的是记状态和重复交代上下文的时间。多个任务同时推进时每个任务都知道自己在哪一步不会因为切换到另一个任务就丢掉进度。测试和 Review 也会更有边界测试没通过任务不会被当成完成Review 修改后要重新验证合并和发布前的检查可以集中执行中断后可以从当前阶段继续。人不会消失只是不用一直守在流程旁边。需求是否合理、方案是否接受、生产发布是否授权这些判断仍然由人做。插件负责的是那些重复、明确、容易遗漏的连接动作。第一版的目标很窄让固定的研发阶段能够连续推进让每个阶段都能加载对应 Skill让多个任务各自保留上下文。它还不是一个可以随意编排的工作流平台也没有解决所有任务依赖更不会在没有授权的情况下自动发布生产环境。如果你平时用 Codex CLI而且经常同时推进几个需求这套插件比较适合你尤其适合已经有固定测试、Review 和发布习惯的项目。如果你只是偶尔让 AI 帮忙改一两个文件或者不想维护任何项目配置安装它的收益可能不大。使用时整体路径是安装插件准备 project-config.yamlregister 登记项目doctor 检查绑定在 Codex CLI 中调用 $change-deliveryrun 连续推进在审批、测试、Review 等节点暂停。模型入口方面API Key 在 https://taotoken.net/api-keys 创建模型列表在 https://taotoken.net/models 查看接入文档在 https://taotoken.net/doc 对照配置。如果打算长期在多个项目里跑这套流程可以用 Coding Plan 统一管理调用额度入口在 https://taotoken.net/coding-plan 。先把主链路跑一段时间等真实问题冒出来再决定哪些阶段需要开放哪些规则值得做成追加机制。