关于 codex-exec
codex-exec 是一个一次性 Codex 运行时适配技能,面向需要执行单条调用方提示词并留存结果的工作流。它通过沙箱、超时和输出捕获约束单次进程,并报告运行状态后停止。
主要功能
- 01执行一条指定的 Codex 提示词
- 02依据授权影响选择沙箱模式
- 03设置运行时限并处理标准输入
- 04捕获输出并限制字节数
- 05报告退出状态与清理情况
适用场景
- 01以只读模式运行代码审查提示词
- 02执行获准修改工作区的提示词
- 03在 CI 或脚本中运行 Codex
- 04留存单次调用的输出与状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ boshu2/ agentops --skill codex-exec安装后在 Claude Code 中输入/codex-exec确认已加载。
附带文件references/guarded-runner.md
详细介绍
Codex Exec — 单次运行时适配器
将调用方提供的 Codex 提示词作为单个进程恰好运行一次,并捕获其结果。此技能不会选择工作、重试、验证或继续执行。一个提示词、一个进程、一个捕获的产物,确保每个输出字节都可追溯到一次调用。
会改变命令的规则
- 根据声明的影响选择沙箱。 审查或分析使用
-s read-only,仅在获准编辑时使用workspace-write;只有调用方明确要求网络或更广泛的访问权限时才启用。 “以防万一需要”不算声明的影响。运行期间的权限拒绝(套接字绑定、操作系统权限检查或对端凭据探测返回EPERM或 “Operation not permitted”)可能只表明所选模式阻止了什么;在沙箱内无法据此判断主机或代码是否会失败。引用该错误,并将此检查报告为受沙箱限制、未运行 /not_checked:既不算通过,也不算检查失败。主机上对同一探测的观察仍然有效;是否在主机上运行由调用方决定。 - 关闭 stdin。 未提供提示词参数时,
codex exec会从 stdin 读取提示词;提供提示词参数时,则会将管道传入的 stdin 附加到提示词后。stdin 保持打开的非 TTY 运行(CI、脚本)可能无限期等待:这就是 stdin 挂起。将提示词通过 stdin 输入并使其结束,或使用</dev/null重定向。 - 只设一个截止时间,绝不重置。 在首次尝试前确定一个绝对截止时间。每次调用,包括调用方决定进行的任何重试,都只能使用该截止时间之前剩余的时间。重试绝不能获得新的时间预算:为每次尝试单独设置一个新的超时的循环,会悄然放宽调用方设定的时限。缺少时限、时限为零、负值或格式错误时,不得启动;截止时间已过时,应在派发前停止。
- 此处不重试。 按原样报告超时、错误或空输出。是否再次调用由调用方决定,且仍须遵守同一个截止时间。
- 限制捕获大小,并明确退出状态。 将输出捕获到不超过字节上限的文件中,并报告退出状态。超时不算结果。
运行
在 AgentOps 源码检出目录中,使用受保护的库。它会强制执行截止时间、合并输出上限(默认 10 MiB)、进程组清理和回显检测:
# DEADLINE_EPOCH: absolute Unix time fixed once by the caller and reused by
# every invocation in its scope.
. "$AGENTOPS_ROOT/scripts/lib/codex-exec.sh"
CODEX_EXEC_DIR="$WORKSPACE" CODEX_EXEC_SANDBOX=read-only \
CODEX_EXEC_PROMPT_FILE="$PROMPT_FILE" CODEX_EXEC_DEADLINE_EPOCH="$DEADLINE_EPOCH" \
CODEX_EXEC_MAX_OUTPUT_BYTES=10485760 CODEX_EXEC_OUT_FILE="$OUTPUT" \
codex_exec_guarded </dev/null
已安装的技能只包含此文件,因此在源码检出目录之外,scripts/lib/codex-exec.sh 不存在。此时请直接运行 codex exec(参数基于 codex-cli 0.156.1;请使用 codex exec --help 确认;在 macOS 上,Homebrew coreutils 可能仅通过 gtimeout 提供 timeout):
remaining=$(( DEADLINE_EPOCH - $(date +%s) ))
[ "$remaining" -gt 0 ] || { echo "deadline passed; not launched" >&2; exit 124; }
timeout -k 10 "$remaining" \
codex exec -C "$WORKSPACE" -s read-only - <"$PROMPT_FILE" 2>&1 \
| head -c 10485760 >"$OUTPUT"
rc=${PIPESTATUS[0]} # 124 timed out, 137 killed after grace, else codex's status
在 Git 仓库之外添加 --skip-git-repo-check,并添加 -o <file> 以单独保留最终消息(不计入上限)。输出文件大小恰好达到上限时,表示内容已被截断;其状态反映的是管道关闭,而不是审查结果。此备用方式不检查残留进程,也不检测回显;报告时须注明这两项均未强制执行。
退出代码(受保护的库)
| 退出代码 | 含义 |
|---|---|
| 0 | Codex 已完成并生成输出 |
| 2 | 前置条件不满足:找不到二进制文件、上限无效或缺失、功能不可用,或无法验证清理;不构成结果 |
| 122 | Codex 退出后仍有子进程存活;运行降级 |
| 123 | 达到捕获或提示词准备上限;保留部分证据 |
| 124 | 截止时间已过,或正常退出但输出为空;发生停滞,不构成结果 |
| 125 | 输出重复了提示词;不构成结果 |
| 128+N | 被信号 N 取消(129 HUP、130 INT、143 TERM) |
| 其他 | 保留 Codex 自身的非零状态 |
保留代码是运行时证据,绝不是语义判定。Codex 自身的状态可能与保留代码相同;运行器的 stderr 诊断信息可用于区分两者。受保护的运行器内部机制介绍了输入、主机要求、进程监管和外部沙箱封装器。
报告,然后停止
command: exact argv or library call (prompt by reference)
sandbox: -s value and the declared effect that needs it
bound: absolute deadline and seconds remaining at launch
capture: output path, byte cap, truncated yes/no
exit: status and its meaning from the table
cleanup: library result, or "not enforced" for the direct fallback
Codex 验证器遵循判定回执规范 和 Agent 原生模型调度方案:请求的模型标志或模型自身的描述,都不能证明实际运行的是哪个模型。同类工具:一个无头 Claude 提示词是 claude-exec,AGY 是 agy-native,工作线程批次是 agent-native。