0.5.3:使用 Codex 内置浏览器面板展示独立富文本审核页,替代原生 Question。Python 标准库服务负责题目、提交和状态保存,skill 负责查证、分支与队列。
灵感来自 pi-interview。本插件将逐项人工决策的交互方式应用于 Codex 内置浏览器审核流程。
在可访问此目录的 Codex 任务中说:
读取 <插件目录>/skills/human-review/SKILL.md,带我体验富文本人工复核。
源码尚未注册到全局插件市场;可手动读取 skill 使用。无 npm 安装、远程服务或 API 密钥需求。
以下截图展示虚构的界面配色决策,不修改实际设置。图片随仓库保存在 docs/images/ 中。
审核页集中展示当前情况、使用影响、示例场景和方案对比。用户可选择选项、发起 Ask 追问或填写补充意见,再提交决定;推荐项不会自动选中。
提交后显示“决定已提交”,答案已保存。Codex 收到结果后关闭本题审核标签页,并根据决定继续下一项或结束复核。
- 在
$TMPDIR新建独立会话目录。 - 运行
python3 scripts/review.py serve --session <目录>,保持进程运行。 - 用内置浏览器打开输出的完整 URL。
python3 scripts/review.py publish --session <目录> --file <题目JSON>发布单题。- 保持当前 Codex 任务运行,用户可在选项中 Ask 继续追问;
python3 scripts/review.py wait --session <目录> --seconds 45读取 Ask 或最终答案。Ask 由当前模型回答后以respond --file <回答JSON>写回;最终提交后由任务关闭对应标签页。 - 关闭标签后执行
python3 scripts/review.py stop --session <目录> --revision <当前版本>并确认进程退出。下一题同目录重启服务后再发布。Codex 调整队列,发布下一题,或在清理前使用finish --summary '<结论>'完成。
以上相对脚本路径以插件根目录为基准。题目格式见 skills/human-review/references/question-schema.md。
- 分区排版、Markdown 子集、代码折叠、对比表格、富选项说明。
- 单选、多选、自由意见、暂缓、历史记录;推荐不预选。
- Pi 风格的居中单列深色卡片,每个选项可展开 Ask,保存多轮追问。
- Ask 沿用当前 Codex 任务的模型与上下文,无独立 API Key 或额外模型配置。
- 最终提交后通过宿主工具关闭绑定标签;Ask 和无效提交不关页。
- 每题打开并执行
bind-tab后发送一次 macOS 系统通知和提示音;重复绑定不重复提醒。 - 10 分钟无操作倒计时,真实 UI 操作重置;轮询与模型回复不重置。
- 超时保存未决状态、关闭绑定标签、结束本轮并提示等待用户处理。
- 提交防重与过期版本检查。
- 本地状态落盘,服务重启可恢复;新启动生成新访问链接。
页面在浏览器面板中,不嵌在聊天消息内部。页面事件经本地服务回传。审核期间 Codex 必须保持事件等待,才能处理 Ask 和提交后自动关页;用户中断或宿主结束运行后需发送“继续复核”恢复。应用退出后不保证服务继续运行。
仅绑定 127.0.0.1;浏览器和控制接口使用不同令牌,不将控制令牌暴露到页面。状态文件保存在指定会话目录。这是工作流辅助,不是程序级权限审批系统。
Markdown 仅支持段落、换行、标题、列表、粗体和代码;没有任意 HTML、附件上传或 Mermaid。前端交互为独立实现;布局和色值参考 pi-interview 默认深色主题。
python3 -m unittest discover -s tests -v 检查答案校验、重复提交、待答覆盖、暂缓与状态恢复。另需在浏览器验证排版、真实提交和发布下一题。自动测试必须使用独立虚构会话,不能替用户提交审核结论。
系统通知依赖 terminal-notifier(安装:brew install terminal-notifier),点击通知通过 codex://threads/<任务ID> 返回对应 Codex 任务及其已有审核面板。服务从 CODEX_THREAD_ID 读取当前任务,也可传 --thread-id。缺少有效任务 ID 时不发送通知,不回退到会打开脚本编辑器的 osascript。系统权限或专注模式可能抑制横幅,通知失败不会阻断复核。
状态先保存再提交到内存;保存失败不确认决定。通知在状态锁外发送,返回时校验题目版本。活动续时单独写入小型 activity.json,重启时按 revision 恢复,因此不再随历史增长反复写入整份记录。
前端串行轮询并设置 10 秒请求超时;内容未变更时仅返回版本和截止时间。页面展示最近 20 项提交记录、当前题的 Ask;完整历史仍保留在 state.json,CLI state 返回完整记录。历史文件目前不自动清理,长期会话仍应按审核任务拆分。
HTTP 服务最多处理 16 个并发连接,连接读写超时 5 秒;网络回包不持有状态锁。现有服务需停止后用原会话目录重启才会加载新代码,新 URL 替代旧 URL。
回归验证:PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v;node --test tests/frontend.test.cjs。
参照 Pi 的结束回调清理机制,关闭本题标签后立即调用 stop,停止监听并退出服务;结果保留在会话目录。下一题按需同目录重启,使用新的连接 URL。stop 需要控制令牌与当前 revision,拒绝停止待答题或过期版本。
若助手中断未执行清理,服务在题目已提交、暂缓、超时或完成后约 60 秒自动回收。此兜底只停止服务,不负责关闭 Codex 标签。保持原有 10 分钟无操作规则,Ask 期间不回收服务。

