Codex CLI 0.163.0 正式版在北京时间 10 月 16 日早上 5 点半发布。这版最实用的改动有两项:回答到一半可以直接插话改方向,/config 能搜索设置并当场生效。我还拿一个最小 Spring Boot 项目在 codex sandbox 里跑了测试,碰到 Mockito 自 attach 失败,挂上 -javaagent 后通过。
上一个版本 0.162 的重点是 worktree,见 Codex CLI 0.162 能直接管 Git worktree 了。这次的改动集中在交互和设置上。
这版改了什么
插话转向。Codex 还在输出时,发一条新消息就能马上改它的方向,不用等它说完。打断一个回合时,正在跑的 Code Mode 单元和里面嵌套的工具调用也会一起停掉(#51812、#51835)。
/config 变成可搜索的设置页。可以跨分类搜偏好,支持的项改完立刻生效,需要重启的会标出来(#52990、#53429)。
/keymap 里能配 leader 键,默认 Ctrl+X。快捷键提示会一直开着,直到你选了或取消。语音静音挪到了 F9(#52273)。
/daemon 能重启后台托管的服务,重启前会提醒哪些工作可能被打断,之后自动重连(#53173)。
互相独立的只读工具可以并行跑,包括 skill、memory、历史会话查询(#52245)。
Daybreak 对符合条件的账号默认打开,codex exec 在服务端提供权限时也能用 OpenAI API key 选它(#53701、#53717)。
修复里有两条和安全相关:恢复保存的会话会带回原来的权限和网络授权,同时尊重显式覆盖和当前的托管策略;网络代理在 DNS 查询前先检查权限,并拒绝重复的 Host 头。另外,Codex 不再自带打过补丁的 zsh,改用标准 shell 执行器,用了旧 shell 参数的配置会收到迁移提示。
装上看一眼
插话转向、/config、/keymap 需要登录后在 TUI 里使用,本文没有实测这三项,相关描述来自 release notes。下面是离线能跑的部分。
npm i -g @openai/codex@0.163.0
$ codex --version
codex-cli 0.163.0
$ codex features list | grep -E "code_mode_interrupt|cli_daybreak|daemon_auto_start"
cli_daybreak stable true
code_mode_interrupt stable true
daemon_auto_start stable true
code_mode_interrupt 和 cli_daybreak 已经是 stable 并默认打开,和 release notes 里「打断时停掉 Code Mode」「Daybreak 默认启用」一致。
在沙箱里跑 Spring Boot 测试
这版文档写明了 Linux 沙箱的做法:文件系统隔离用 bubblewrap,系统调用过滤用 seccomp(#52610)。codex sandbox 子命令不登录也能用,它把任意命令放进 Codex 给 Agent 用的同一套沙箱里执行。
项目是一个空的 Spring Boot 3.5.6 应用,加一个 @SpringBootTest 的 contextLoads,JDK 21,依赖提前下到了本地仓库,所以用 -o 离线跑。
不带参数时默认是只读:
$ codex sandbox -- mvn -o -q -B test
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.14.0:compile (default-compile) on project demo: Compilation failure
编译这一步就失败了,报错是 could not create parent directories,target 目录写不进去。网络同样是断的:
$ codex sandbox -- curl -sS -m 5 https://repo.maven.apache.org
curl: (6) Could not resolve host: repo.maven.apache.org
exit=6
换成 workspace-write 后,工作目录可写,工作目录以外的系统路径仍然只读(/tmp 在这个模式下可写):
$ codex sandbox -c sandbox_mode="workspace-write" -- touch /opt/outside.txt
touch: cannot touch '/opt/outside.txt': Read-only file system
exit=1
测试还是挂了,原因不在 Spring:
[ERROR] DemoApplicationTests.contextLoads » IllegalState Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
往下翻 Caused by:
Caused by: java.lang.IllegalStateException: Could not self-attach to current VM using external process - set a property net.bytebuddy.agent.attacher.dump to dump the process output to a file at the specified location
spring-boot-starter-test 带的 Mockito 5.17.0 默认用 inline mock maker,启动时让 Byte Buddy 动态 attach 到当前 JVM。沙箱里这一步做不成,所以测试里一个 mock 都没用,上下文也起不来。
Mockito 文档本来就要求在新版 JDK 上把它显式挂成 -javaagent。挂上以后不需要动态 attach,沙箱里就过了。注意 jar 路径要用 $HOME 让 shell 展开,写成引号里的 ~ 时 JVM 不认,会报 Error opening zip file or JAR manifest missing:
$ codex sandbox -c sandbox_mode="workspace-write" -- mvn -o -B test -DargLine="-javaagent:$HOME/.m2/repository/org/mockito/mockito-core/5.17.0/mockito-core-5.17.0.jar"
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.816 s -- in com.example.demo.DemoApplicationTests
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
Mockito 文档给的 Maven 写法是在 pom.xml 里用 maven-dependency-plugin 的 properties 目标拿到 Mockito jar 路径,再写进 surefire 的 argLine。配好之后,Codex 在沙箱里跑 mvn test 就不会卡在这一步。
资料来源:Codex rust-v0.163.0 release notes 和 Mockito 文档中关于显式挂载 agent 的说明。
一起交流
分享你的思考,让讨论更进一步。