Codex 桌面端 Terminal 打不开:不是 PTY,是 Git 签不了 Xcode 协议
一次把「UI 桥接卡住」修成「sudo xcodebuild -license accept」的排查
Terminal 请求一直
queued,后台命令却能跑。看起来像桌面端 bug,根因其实是 GUI 进程里的/usr/bin/git被 Xcode 协议挡住了。
问题现象
Codex 桌面端(ChatGPT.app)里,当前任务打不开内置 terminal:
- 打开 terminal 的请求一直停在
queued,没有真正创建 session - 读取当前聊天绑定的 terminal 失败:没有附着任何 app terminal session
- 后台进程和命令执行本身正常
- 彻底退出再打开(
⌘Q)仍然复现
这和公开的桌面端问题很像:内置终端无法附着,持续返回 queued。第一反应会去查 UI / PTY 桥接。这次不是。
排查
先看桌面端当天日志 ~/Library/Logs/com.openai.codex/。创建 terminal 前后反复出现:
Git is unavailable
Failed to apply worktree shell environment config
open_in_codex 表面上 success=true,随后 read_thread_terminal 立刻 success=false。也就是:排队成功了,PTY 没起来。
再看 ChatGPT 主进程环境:
PATH=/usr/bin:/bin:/usr/sbin:/sbin
GUI 应用拿不到 Homebrew 的 PATH,只能用到 /usr/bin/git。本机也没有独立的 Homebrew git,没有 Command Line Tools 收据。
直接跑:
/usr/bin/git --version
得到的不是版本号,而是整份 Xcode and Apple SDKs Agreement,退出码 69:
You have not agreed to the Xcode license agreements.
昨天的 Codex 日志里还没有 Git is unavailable,今天凌晨才开始刷。对照 Xcode.app 的修改时间:Xcode 27.0 在当天 01:03 写进 /Applications/Xcode.app。时间线对上了。
根因
/usr/bin/git 不是一份独立 git,是 Apple 的 Xcode 工具入口。用它等于在用 Xcode / Apple SDKs,必须先同意开发者协议。
Xcode 大版本更新后,旧的同意作废。ChatGPT.app 的 PATH 又短,找不到别的 git。Codex 创建内置 terminal 时会查 git / worktree 环境——这步本该是可选的,失败却被当成致命错误:PTY 还没 spawn,terminal snapshot 就被删掉。于是 UI 一直 queued。
同类机制在桌面端的其他环境里也出现过:git 查询失败会在 node-pty 启动前把 session 清掉。
所以:
- 夜里 Xcode 升到 27.0
/usr/bin/git开始要求重新签协议- Codex 把
Git is unavailable当成 terminal 创建失败 - 重启 App 没用,因为 git 还是坏的
修复
不要在协议翻页器里提前打 agree。Press enter to display the license: 只是开始显示全文,真正确认是最后的 [agree, cancel],而且必须是 root。跳过翻页:
sudo xcodebuild -license accept
然后验证:
/usr/bin/git --version
正常应类似:
git version 2.54.0 (Apple Git-157)
再 ⌘Q 彻底退出 ChatGPT,重新打开 Codex,terminal 就能创建。
交互版 sudo xcodebuild -license 也可以,但要翻完整份协议,最后输入 agree。没有 sudo 的 agree 不会生效,git 仍是 69。
这不是半年一次
协议不会按日历自动过期。复发点通常是:
- Xcode 大版本更新(一年一两次很常见)
- Mac App Store 自动更新,夜里把 Xcode 升完
- 偶尔 macOS 大更新带着新的开发者协议
这次协议编号是 EA2002。签完之后,/Library/Preferences/com.apple.dt.Xcode.plist 的时间就是同意时刻。
下次再看到 /usr/bin/git 弹出整份协议,多半又是 Xcode 刚更新。GUI 应用签不了这份协议,必须在 Terminal 里用管理员权限签一次。
小结
桌面端 terminal 打不开,不一定是 PTY 或 UI 桥接。先看 Codex 日志有没有 Git is unavailable,再在同一个短 PATH 下跑 /usr/bin/git --version。如果弹出 Xcode 协议,sudo xcodebuild -license accept 比重启 App 有效得多。