Cupertino 1.13.0
Version 1.13.0 ·
Changed
Visual Studio Code is configured with one click, not a pasted command. It was held back on the grounds that its config is JSONC and re-serialising it would delete somebody's comments. That was a mix-up between two files:
settings.jsonis the JSONC one, andUser/mcp.json— where VS Code actually keeps MCP servers, under aserverskey rather thanmcpServers— is strict JSON, written by VS Code itself.The residual worry does not survive being looked at either. Every write begins with a read and
JSONSerializationthrows on a comment, so a file somebody has commented reads as unreadable and the write refuses. It fails closed: it cannot strip a comment it cannot parse.ChatGPT & Codex is configured with one click too, and
~/.codex/config.tomlis spliced rather than re-serialised. That file is the one config here that is genuinely not safe to round-trip — twenty-nine[projects."…"]tables, a[features]block and a multi-line string full of markdown on the machine this was written against.ClientWiringTOML, ported from Bastion, replaces the lines that hold MCP servers and quotes every other byte verbatim, so a wire produces a diff with one hunk in it and an unwire gives the file back exactly.It also gets what a pasted command could never give it: a real status. The row now reports
configured,incompleteorpoints elsewherelike every other client, and it reports the one thing no JSON client can —enabled = false, which Codex honours and which the ChatGPT app is reported to set on servers it did not expect. An entry in that state still points where it should, so it audits as configured while Codex runs none of it; the row says so.The row is called "ChatGPT & Codex" rather than "Codex CLI", because the ChatGPT app, the Codex CLI and the Codex IDE extension all read that one file — the ChatGPT app bundles the Codex binary and names it in
CODEX_CLI_PATH. The old name sent somebody who had installed only ChatGPT looking for a row that was already there.The reason recorded for ChatGPT having no row of its own was also wrong, and is corrected: it did not "take remote HTTP connectors only and cannot spawn a local stdio server at all". Connectors are remote-only; the Codex lane inside the same app runs local stdio servers and ships three of its own in that file. It has no row because it is not a separate client.
apple_mail_queryis on every mail server now, not only the read-only ones. It was held back on budget grounds — a tool costs listing tokens on every connect, and this one had to prove it saves more than it costs — and the measurement in mail-query.md settled that a while ago: 64x on a grouped question, against a ~716-token listing.What the budget argument missed is that
allowWritesis a per-surface switch, so the only way to reach a lane that reaches nothing but the index was to give up send, reply, move and delete for Mail across every client at once. Nobody makes that trade, which made the tool invisible to almost everyone — including the website, which has been listing it as a plain read tool.Client rows show the editor's real icon instead of an SF Symbol. Cursor, VS Code and every other row in the sidebar, the client detail header and Settings' automation table now draw the installed app's own icon, looked up by bundle id or by path.
SurfaceIcon.swiftbecomesAppIcon.swiftand the lookup is shared, so surface icons and client icons stop being two unrelated pieces of code that happened to render the same size.Two knock-on fixes. Cursor's fallback symbol moves from the chevron-brackets glyph to
cursorarrow, because the brackets now belong to VS Code and having both wear them was the reason the fallbacks read as interchangeable; and ChatGPT & Codex gains a bundle id (com.openai.codex) so its row can resolve to a real icon rather than being the one client that could never have one.Lookups are disabled under a screenshot capture. The goldens would otherwise depend on which editors happen to be installed on the Mac doing the capturing, which is a gate that fails for a reason that has nothing to do with the change under test.
Removed
Nothing has to be pasted into a terminal any more. With both remaining clients written, the copy-a-command lane had no users: the
Recipetemplates, the shell quoting, the two copy buttons, the "VS Code has no command that removes a server" paragraph and theunknownstatus that existed only because a pasted client could never report one are all gone. Zed and Goose are still the reason to remember it existed, and neither is JSON or TOML, so the honest way to add them is a thirdWiringcase rather than a snippet maintained blind.