# 无人值守 · exec、SDK、CI 与定时任务 · Codex · 多 Agent 的异步编码工作流

**作者** Aklman · **章节** 09 / 12 · **首发** 2026.08 · **语言** 中文为主, 中英双语
**原文** https://library.aklman.com/books/codex/09-automate
**全书 markdown** https://library.aklman.com/books/codex/llms.md
**上一章** https://library.aklman.com/books/codex/08-cloud/llms.md
**下一章** https://library.aklman.com/books/codex/10-review/llms.md

> 本章来自 Aklman · Library, 完整免费阅读。允许 AI 摘读、引用、问答; 转载请保留作者署名与原文链接 (CC BY-NC-ND 4.0, https://library.aklman.com/license)。

---

> 到这里,派活还都要你亲手发一句话。这一章把那句话也自动化:codex exec 在脚本里无人值守地跑一次;SDK 把同一台引擎装进 TypeScript / Python;openai/codex-action 让它长在 GitHub CI;定时任务按日程开工 —— 但本地 project / worktree schedule 要电脑开机且桌面应用运行,网页 schedule 也不能直接摸本地目录。无人时的规矩也在这一章:exec 默认只读、越界即停,hooks 在生命周期固定时点执行你按哈希信任过的脚本。

到这里,派活还都要你亲手发一句话 —— 打开一个面、说清一件活、看它跑。这一章把那句话也自动化:让 Codex 在脚本里无人值守地跑一次,长进你自己的程序,守在每个 PR 上,按日程半夜上班。这是「不守着做完」的极限形态:活不在你这台机器、不在你醒着的时候完成。也因此,这一章的另一半讲规矩 —— 它跑得越自动,边界越要在出发前写死。

### I · codex exec:让那句话进脚本

把交互会话变成一条 Unix 命令,靠的是 `codex exec`:跑完就退,进度走 stderr、最终消息走 stdout,天然能接进管道。[^1]它把 Codex 从「一个你打开的应用」变成「一个脚本里的工序」:

_灌上下文、要结构化结果;默认只读,要改文件才放开_
```text

```bash
# 把构建日志灌进去,要一句根因
cat build-error.txt | codex exec "一句话解释这次构建失败的根因"

# 结构化输出:按 schema 约束,写最终 JSON 到文件
codex exec "列出 src/api 里的全部路由" \
 --output-schema ./routes.schema.json \
 -o ./routes.json

# 要它改文件:默认只读,得显式放开
codex exec --sandbox workspace-write "修好失败的那条测试"
```

```

三个细节是无人化的关键。`--json` 让 stdout 变成 JSONL 事件流,脚本能逐条读它干了什么;`--output-schema` 更进一步,让最终响应符合你给的 JSON Schema,脚本直接消费结构化字段、不用解析散文。[^1]还有一条安全默认:**exec 默认是只读沙箱** —— 要它改文件,必须显式 `--sandbox workspace-write`。[^1]第 10 章说的「回归集用 `codex exec` 重跑、拿 JSON 对一对」,零件就是这几个 flag。它还要求在 Git 仓库里跑,防止无人时的破坏性改动无从回滚。[^1]

---

### II · SDK:同一台引擎,做成库

脚本再长,也只是把命令串起来;要把 Codex 嵌进你自己的服务 —— 一个自动分诊 bug 的机器人、一个替客服读日志的后台 —— 用 Codex SDK 编程控制它。[^2]TypeScript 装 `@openai/codex-sdk`,一个 `startThread()` 就是一个带全套工具的对话,`run(prompt)` 拿结果、`resumeThread(id)` 续跑:

_一个最小的 SDK 线程;Python 有对应的 openai-codex(beta)_
```text title="triage.ts"

```ts
import { Codex } from "@openai/codex-sdk";

const codex = new Codex();
const thread = codex.startThread();
const result = await thread.run("诊断并修好 CI 里失败的用例,做一个计划");
console.log(result.finalResponse);
```

```

Python(beta)装 `openai-codex`,`Codex()` 或 `AsyncCodex()` 经 app-server 控制,还能按轮切 `Sandbox` 预设(read_only / workspace_write / full_access)—— 让「先改、再只读复审」这种两步走在代码里表达出来。[^2]CLI 和 SDK 怎么分工很清楚:交互开发、一次性活用 CLI;要嵌进 CI/CD、定制应用、生产自动化,用 SDK。这本书讲到这条线为止 —— 再往里,是《Agent 实战》整本书的地界。

---

### III · 长在 CI 和日程里

第三种形态不属于任何一台机器。**GitHub Action**(`openai/codex-action@v1`)在 CI 里跑 Codex:它装好 CLI、为你的 OpenAI key 起一个 Responses API 代理、跑 `codex exec`;输入里有 prompt、model、sandbox、output-file,最终消息作输出给后续步骤。[^3]默认的 `safety-strategy: drop-sudo` 在跑前移除 sudo、保护内存里的 secrets,安全清单还专门提醒:来自 PR、commit、issue 的 prompt 输入要先清洗,防注入。[^3]

定时的活先按交付物分:定期研究、报告或表格成品,在账号可用时属于 Work;要进入仓库跑测试、生成 diff,才属于 Codex。管理界面只在受支持的 Work / Codex surface,CLI / IDE 适合先把 prompt 跑顺。[^4]两种形态:standalone 每次开新对话并支持 RRULE;in-chat 回到同一对话。真正要记住的是运行位置:**本地项目 / worktree schedule 要电脑开着、桌面应用运行**;hosted / connected 任务不能隔空摸本机目录。入口、权限仍受 plan、workspace 与 rollout 影响。夜间依赖巡检若要关电脑,就进 cloud / CI,别把本地 schedule 当托管 cron。

---

### IV · 无人时的规矩:hooks 与信任

交互会话里,审批弹窗是最后的安全网;无人值守时没有这张网 —— 边界要前置。第 4 章那套沙箱、审批、规则照样在;这一章再加一层 **hooks**:把你的脚本注入 agentic 循环的固定时点(工具调用前后、会话结束、收工时),用来记录对话、拦下贴出的 API key、收工前跑一遍校验。[^5]配在 `hooks.json` 或 `config.toml` 的 `[hooks]` 里,事件有 PreToolUse、PostToolUse、Stop、SessionStart 这些,matcher 按工具名筛。[^5]

> hooks 有一条 Codex 特有的信任闸,别踩:**非托管的命令 hook 必须先经你审阅、按它当前的哈希信任过才许跑** —— 脚本一改,就重新标记为待审、在你重新信任前跳过。[^5]这既是保护(别人塞进仓库的 hook 不会自动在你机器上执行),也是个坑:你在 CI 里换了 hook 脚本却忘了它需要重新信任,它就会被静默跳过。`/hooks` 里审阅与信任,无人值守出发前先确认它们真的在跑。

动手 · 把一件活送出你的视线:

- **把一个重复检查做成 codex exec 一行**:
 挑你每周手动做的一个检查(错字、日志异常、路由清单),写成 codex exec,加 --output-schema 让结果能被脚本消费,挂进 package.json 或 Makefile。

- **给团队仓库装上 GitHub Action**:
 配 openai/codex-action@v1 在 PR 上跑一次小活,把 API key 放进 secrets、safety-strategy 保持 drop-sudo,看它从触发到留言走完全程。

- **设一个夜班定时任务,先确认 hook 在跑**:
 用定时任务给明早设一个本地巡检,出发前在 /hooks 里确认校验 hook 已被信任,并让电脑与桌面应用保持运行;要关机就把同一检查改放 CI / cloud。

> 活可以不在你眼前跑,
> 规矩必须先于它出发

## 引用与参考

01 · OpenAI Codex 文档 · Non-interactive mode —— codex exec 从脚本里跑 Codex,不开交互界面;进度走 stderr,最终消息走 stdout,便于管道。默认只读沙箱,要改文件加 --sandbox workspace-write。--json 让 stdout 变 JSONL 事件流(thread.started / turn.completed / item.* 等);--output-schema schema.json 让最终响应符合 JSON Schema,-o 写最终消息到文件。可 codex exec resume --last 续跑。要求在 Git 仓库里跑(--skip-git-repo-check 可绕过);CODEX_API_KEY 仅 exec 支持。截至 2026-08-05。  (OpenAI · Non-interactive mode)
02 · OpenAI Codex 文档 · Codex SDK —— 用 SDK 编程控制 Codex(嵌进 CI/CD、自建 agent、自家工具)。TypeScript:npm install @openai/codex-sdk,new Codex().startThread(),thread.run(prompt) 拿 result.finalResponse,resumeThread(id) 续跑。Python(beta):pip install openai-codex,Codex() / AsyncCodex() 经 app-server 控制,thread_start(model, sandbox) + run;Sandbox 预设 read_only / workspace_write / full_access 可按轮切。截至 2026-08-05。  (OpenAI · Codex SDK)
03 · OpenAI Codex 文档 · Codex GitHub Action —— openai/codex-action@v1 在 GitHub Actions 里跑 Codex:安装 CLI、为 OpenAI key 起一个 Responses API 代理、跑 codex exec。输入含 prompt / prompt-file、codex-args、model / effort、sandbox、output-file,final-message 作输出。默认 safety-strategy: drop-sudo(跑前移除 sudo,保护内存里的 secrets);安全清单提醒:清洗来自 PR / commit / issue 的 prompt 输入以防注入。截至 2026-08-05。  (OpenAI · Codex GitHub Action)
04 · OpenAI Codex 文档 · Scheduled tasks —— 在受支持的 Work / Codex surface 创建管理(CLI / IDE 无管理界面)。standalone 每次新开对话并支持 RRULE;in-chat 回到同一对话。指向本地项目 / worktree 的任务由桌面应用承载,电脑必须开机且应用运行;hosted / connected context 不能直接操作本机目录。Work / Codex 的入口与权限取决于 plan、workspace 与 rollout。截至 2026-08-05。  (OpenAI · Scheduled tasks)
05 · OpenAI Codex 文档 · Hooks —— 把你的脚本注入 agentic 循环(记录对话、拦贴出的 API key、自动生成记忆、收工时跑校验)。配 hooks.json 或 config.toml 的 [hooks],位置 ~/.codex/ 与项目 .codex/(信任项目才加载)。事件含 PreToolUse、PermissionRequest、PostToolUse、UserPromptSubmit、Stop、SubagentStart / Stop、SessionStart。JSON 进 stdin;matcher 按工具名过滤(Bash、apply_patch / Edit|Write、mcp__*)。关键:非托管命令 hook 必须先经你审阅、按当前哈希信任过才许跑,改了就重新标记待审;/hooks 里审阅与信任。GA 于 2026-05,[features] hooks = true 默认。截至 2026-08-05。  (OpenAI · Hooks)

---

*无人值守 · exec、SDK、CI 与定时任务 · Codex · 多 Agent 的异步编码工作流 · Aklman 著 · CC BY-NC-ND 4.0 · https://library.aklman.com/books/codex/09-automate*
