All notes

Read a coding agent's model list without logging in

Codex and Claude Code both ship their model picker data inside the installed package. You can read it without an account.

Which models and effort levels does your coding agent offer right now? spatz (opens in a new tab) needs that list for Claude Code and Codex every day, in a GitHub Actions job that has no account for either tool. Both tools carry the list inside their package, so no login is needed.

Codex prints it

Codex has a debug command that prints its built-in model list as JSON. The --bundled option makes it skip the online refresh and print only the list that ships with the binary:

CODEX_HOME="$(mktemp -d)" codex debug models --bundled \
  | jq -r '.models[] | [.slug, .visibility] | @tsv' | head -3

CODEX_HOME points Codex to an empty folder, so it has no login and no settings. jq picks two fields from each entry. With Codex 0.160 this printed:

gpt-6-astra	list
gpt-6.1-sol	list
gpt-6-sol	list

The slug is the model ID. list means the picker shows the model, and hide means it doesn't. Each entry also lists the reasoning levels the model supports. I traced the command's network calls with strace: it made none.

Claude Code carries it in the binary

For Claude Code, spatz reads the list from a file instead. Its native binary contains the picker data as one block of text, marked with a schema address. You can see the marker without running Claude Code:

grep -c -a 'model-catalog/v1/schema.json' "$(readlink -f "$(which claude)")"

On my machine, with Claude Code 2.1.289, this printed 2. The block is a JavaScript object, not JSON: keys have no quotes, and true is written as !0. The spatz extractor finds the marker, cuts out the object and converts it to JSON. It never runs the JavaScript. It keeps every model in the picker's main section that is offered on Anthropic's own API and not disabled. For 2.1.289 those were Opus 5.5, Sonnet 5.5 and Fable 5.1, each with the efforts low, medium, high, xhigh and max, and Haiku 4.5, which has no effort options.

Install without install scripts

The daily job installs the newest version of both packages from npm into a temporary folder. Claude Code's npm package has a postinstall script, which is code that npm runs right after the install. The job installs with --ignore-scripts, so npm only unpacks the files. The Claude Code data is then read as text. Of the two tools, only Codex runs, and only with an empty home folder.

These lists are the package defaults. Your account may not have access to every model in them.