Releases: jakoes-wu/multi-codex
Release list
v0.10.0
Added
codex-auto: generated next to the launchers while at least one directory
binding exists. It picks the account of the nearest bound directory, exactly
likemulti-codex run, and starts that account's launcher; outside any bound
directory it runs plaincodex(the default account) and says so on stderr.
It followsbind,unbind,rename,remove,restoreandapply, and is
removed with the last binding. An account namedautocannot coexist with
bindings: rename it first.which [DIR]: print which account a directory uses.- README: managing MCP servers with
multi-codex run NAME -- codex mcp ....
Changed
restorechecks whether unregistering the account would conflict before it
moves any data, instead of stopping halfway with the data already back at
~/.codex.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | sh
multi-codex applyOr pipx upgrade multi-codex, or on macOS brew upgrade jakoes-wu/tap/multi-codex. Upgrading from 0.8 or older: run multi-codex apply once to rewrite the launchers (see 0.9.0); apply also creates codex-auto if you have directory bindings.
The installer downloads multi-codex-<tag>.tar.gz from the release and verifies it against SHA256SUMS.
v0.9.0
After upgrading, run multi-codex apply once. The launcher template
changed, so existing launchers show as launcher stale and usage --live
refuses to run until they are rewritten; they keep working meanwhile.
Added
rename OLD NEW: rename an account and its launcher. The directory stays,
so the login, sessions and shared links are kept; bindings and the default
account follow.config.jsonrecords the directory as"dir"when it
differs from the name. Rename accounts back before downgrading below 0.9.--shared-exclude ITEM/--shared-include ITEMforaddandset: one
account can opt out of (and back into) individual shared items. Excluding an
item removes only the link multi-codex created.listshows exclusions as
yes (not: ...), andlist --jsonhas ashared_excludefield.
Changed
- Launchers (and
run,login,code,usage --live) clear
CODEX_API_KEY,CODEX_ACCESS_TOKENandCODEX_SQLITE_HOMEinherited from
the shell. An account that needs an API key sets it with
multi-codex env NAME CODEX_API_KEY=.... shared.itemsmust not contain items that hold one account's own state
(credentials,installation_id, SQLite databases, sessions, runtime
directories); such a configuration fails to load and names the item, and
init --shared-itemsrejects it (exit code 2).- The warnings about those variables in
list,migrate-defaultand
doctornow say that launchers clear them and only plaincodexuses them.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | sh
multi-codex applyOr pipx upgrade multi-codex, or on macOS brew upgrade jakoes-wu/tap/multi-codex; then run multi-codex apply once.
The installer downloads multi-codex-<tag>.tar.gz from the release and verifies it against SHA256SUMS.
v0.8.0
Added
- Homebrew formula:
brew install jakoes-wu/tap/multi-codex. - Releases are also published to PyPI by a GitHub Actions workflow
(Trusted Publishing):pipx install multi-codex. - README: badges and a demo animation.
set NAME ...: change an existing account; same options asadd, but an
unknown name is an error (exit code 1) instead of a new account.addstill
changes existing accounts as before.--shared [DIR]foraddandset: without a directory it keeps the
configured shared directory, or uses~/.codex-sharedwhen none is set
(previously a conflict). WithDIRit changes the shared directory of every
shared account. When none of the shared items exist there yet, a note says
what to put in it.- A mistyped command suggests the closest one, e.g.
unknown command 'lsit'; did you mean 'list'?(exit code 2 as before). list -v/--verbose: the full table of earlier versions.
Changed
listprints a summary by default: the default account, then NAME, LOGIN,
PROXY, SHARED, USAGE (last local usage snapshot, no network) and STATUS
(what needs fixing), followed by a pointer todoctorwhen something does.
Uselist -vfor the old table, orlist --jsonin scripts (unchanged).- When the launcher directory is not on
PATH,add,migrate-default,
doctorand the installer print the command for your shell (zsh, bash or
fish) instead of a generic hint.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | shOr pipx install multi-codex / pipx upgrade multi-codex, or on macOS brew install jakoes-wu/tap/multi-codex.
The installer downloads multi-codex-<tag>.tar.gz from the release and verifies it against SHA256SUMS.
v0.7.0
Added
login NAME [-- ARGS]: runcodex loginwith an account's environment. It
does not need the launcher directory onPATH; the next-step hints and
doctornow suggest it.migrate-defaultwithout a name uses the e-mail address in the source
directory'sauth.json; when there is none, it asks for a name (exit code 2).-v/--verboseforinit,add,proxy,remove,apply,bind,
unbindandenv.
Changed
- Write commands no longer print
unchangedlines by default; when nothing
changes they printalready up to date. Use-vfor the previous output.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | shThe installer downloads multi-codex-<tag>.tar.gz from the release and verifies it against SHA256SUMS.
v0.6.0
Added
- Running
multi-codexwithout arguments prints a short getting-started guide
(exit code 0) instead of an argument error. addandmigrate-defaultprint the next step on stderr: how to log in, and
a warning when the launcher directory is not onPATH.-hgroups the commands into "Get started", "Everyday" and "Advanced" and
shows examples.- An unknown account name suggests the closest registered name ("did you mean
...?"), lists the registered accounts, or points tomulti-codex add. usewithout arguments adds a hint on stderr when there is no default
account yet.install.shends with the next step and how to enable tab completion.
Changed
- Paths in action lines and in the
listheader are shown as~/....path,
--jsonand error details still use absolute paths. - A proxy value that is neither a port nor a URL (for example
abc) gets an
error that lists the accepted values. removeof an account that is not registered says "nothing to remove"
(exit code 0 as before).
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | shThe installer downloads multi-codex-<tag>.tar.gz from the release and verifies it against SHA256SUMS.
v0.5.0
Added
bind NAME [DIR]/unbind [DIR]: bind a directory to an account;
runwithout an account name uses the nearest bound directory.add NAME --config-from OTHER: copyconfig.tomlfrom another account once.code NAME [PATH]andapp NAME(macOS): open VS Code or the Codex desktop
app for an account. Experimental.- Releases publish
multi-codex-<tag>.tar.gzandSHA256SUMS;install.sh
verifies the download (MULTI_CODEX_SHA256,MULTI_CODEX_REQUIRE_CHECKSUM). doctorreports stale directory bindings.
Changed
install.shstops when reading the release of an explicit version tag
(MULTI_CODEX_REF=vX.Y.Z) fails, instead of installing it unverified.- zsh completion falls back to file names where no other candidates apply.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | shFrom this release on, the installer downloads multi-codex-<tag>.tar.gz from the release and verifies it against SHA256SUMS.
v0.4.0
Added
completion bash|zsh|fish: shell completion for subcommands, options and
account names (e-mail addresses included).run NAME [-- COMMAND ...]: run any command (defaultcodex) with exactly
the environment of the account's launcher;path NAMEprints the account
directory.- Per-account environment variables:
env NAME KEY=VALUE,--unset,
--clear(accounts.<name>.envin the configuration). Launchers with
variables are written with mode 0700;list --jsonshows only the names. use [NAME]: show or atomically change the default account (~/.codex),
refusing while the current default account is in use.restore NAME: undomigrate-default, resumable after an interruption;
other write commands are blocked until it finishes.listshows the default account (default:line,default_accountin
--json).- README: which items of an account directory can be shared, and why.
Fixed
doctordid not expand~when checking~/.codex, so thedefault-dir
check always reported that it did not exist.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | shv0.3.0
Added
listshows each account's login (e-mail,api-key,-,keyringor
unreadable) and plan, read locally fromauth.jsonwithout printing any
token, and warns when two accounts are logged in as the same ChatGPT user
and workspace.usage: show rate-limit usage per account from the latest snapshot in the
local session logs, or live with--live(throughcodex app-serverand
the account's launcher; Codex 0.48.0 or newer).doctor: read-only health check of the installation, environment,
configuration drift and accounts, with a suggested fix for each problem.--jsonforlist,usageanddoctor.
Fixed
migrate-defaultno longer migrates silently when Codex keeps the
credentials in the system keyring (cli_auth_credentials_store = "keyring",
or"auto"without anauth.json, in the account's or the system-wide
config.toml): the keyring entry is tied to the directory path, so the
account would be logged out. It now refuses with exit code 3;
--accept-reloginmigrates anyway and reminds you to log in again.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | shv0.2.0
Added
add --adopt: take over existing links that already point to the shared
items, so that turning sharing off later removes them too.
Install / upgrade
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | shv0.1.0
First release (macOS and Linux).
Added
migrate-default: turn the default~/.codexinto a named account, with a
resumable journal, rename or copy-and-verify modes and a compatibility link.
The busy-process check reports how each process uses the source (cwd,
executable,mappedorfd N) and which path it holds.init,add,proxy,remove,apply,listcommands; every write
command is idempotent and supports--dry-run.- Per-account proxy settings (
inherit,off, port or URL). Setting a SOCKS
proxy prints a warning: Codex sends most requests as HTTP CONNECT even with a
SOCKS URL, so only ports that also accept HTTP work. - Optional shared resources linked from one directory into selected accounts.
install.shwith--config,--prefixand--uninstall.
Install
curl -fsSL https://raw.githubusercontent.com/jakoes-wu/multi-codex/main/install.sh | sh