chore(release): 2.8.0 - #644
Conversation
Two fixes that change where the official Codex CLI keeps its state, plus a diagnostic that can now repair the first instead of only reporting it. Minor rather than patch: behaviour changes, it is not purely corrective. The wrapper now writes cli_auth_credentials_store into ~/.codex/config.toml at first run and on wrapper startup, where before it only did so on switch or login. 2.7.1 was explicitly "no new features and no configuration changes"; this one does change configuration behaviour, and documents a previously undocumented opt-out. Closes #641. Landed as #642, #639, and #643.
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
📝 WalkthroughWalkthroughthe release is bumped to v2.8.0. release notes document credential-store reconciliation, interactive state handling, doctor repairs, opt-outs, and upgrade behavior. package metadata and stable-release links now reference v2.8.0. Changesv2.8.0 release update
Estimated code review effort: 1 (Trivial) | ~5 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/releases/v2.8.0.md`:
- Around line 47-52: Expand the Upgrade notes section with runnable Windows/WSL
side-by-side instructions covering the fixed callback port 1455, how to inspect
listeners from both Windows and WSL, the --device-auth fallback, and separate
state directories for each environment. Anchor the guidance to the Windows/WSL
boundary represented by lib/wsl.ts and preserve the existing first-run migration
details.
- Line 7: Update the previous-behavior summary in docs/releases/v2.8.0.md at
line 7 to include health checks and repairs alongside switching or logging in as
triggers for writing cli_auth_credentials_store; mirror the same corrected
trigger list in CHANGELOG.md at line 12, preserving the rest of both release
descriptions.
- Around line 41-42: Clarify the interactive routing statement in
docs/releases/v2.8.0.md lines 41-42 so it only promises no shadow-home rewrites
for interactive state, not that config.toml is never rewritten. Update
docs/releases/v2.8.0.md lines 55-60 to describe wrapper startup and require both
opt-outs for wrapper-launched keychain behavior. Mirror the same qualification
in CHANGELOG.md line 18, keeping all wording aligned with the actual CLI flags
and workflows.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 18089ce2-cd9a-410b-b1be-7fe60dd60483
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (7)
.codex-plugin/plugin.jsonAGENTS.mdCHANGELOG.mdREADME.mddocs/README.mddocs/releases/v2.8.0.mdpackage.json
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
- GitHub Check: Greptile Review
🧰 Additional context used
📓 Path-based instructions (15)
**/*
📄 CodeRabbit inference engine (AGENTS.md)
**/*: Keep local project-owned state under~/.codex/multi-authand preserve official Codex state under~/.codex.
Do not edit local temporary/cache directories or generated output.Do not publish or replace the global
codexbinary; keepcodexowned by the official OpenAI Codex install path and use wrapper binaries only intentionally.
Files:
AGENTS.mdpackage.jsondocs/README.mddocs/releases/v2.8.0.mdREADME.mdCHANGELOG.md
**/package.json
📄 CodeRabbit inference engine (SECURITY.md)
**/package.json: Pinhonoto version4.12.21or higher to avoid vulnerabilitiesGHSA-3hrh-pfw6-9m5x,GHSA-2gcr-mfcq-wcc3,GHSA-xrhx-7g5j-rcj5, andGHSA-f577-qrjj-4474(Set-Cookie injection,app.mount()path-decoding, IPv6 IP-restriction bypass, and JWT scheme-acceptance issues)
Pinrollupto version^4.59.0or higher to avoid vulnerabilities in the<4.59.0range as surfaced bynpm audit, keeping the Vite and Vitest transitive dependency graph secure
Pinundiciexactly to version6.25.0as it is the only runtime HTTP dependency and its dispatcher behavior is part of the rotation proxy's tested surface. Move toundici7.xonly after Node 18 support is droppedExpose the four documented binaries—
codex-multi-auth,codex-multi-auth-codex,mcodex, andcodex-multi-auth-app-launcher—without exposing a globalcodexbinary.
Files:
package.json
docs/**/*.md
📄 CodeRabbit inference engine (docs/STYLE_GUIDE.md)
docs/**/*.md: User-facing documentation should follow the page template: Title and one-line lead, Quick path commands, Core operational workflow, Troubleshooting or failure handling, and Related links
Use short sections and scan-friendly tables in documentation where they improve clarity
Prefer direct, actionable language in documentation
Use runnable command examples in documentation
Explain expected outcomes after critical commands in documentation
Keep terminology consistent with runtime names in documentation
Avoid speculative language when behavior is deterministic in documentation
Put the user problem in the first paragraph before implementation detail
Use descriptive page titles such ascodex-multi-auth Featuresinstead of generic titles on public docs
Do not repeat keyword lists in every section; search terms should appear only where they help a developer understand the page
Canonical command family iscodex-multi-auth ...
Canonical runtime root is~/.codex/multi-auth
Runtime rotation must be described as default-on unless the release policy changes
Legacy command/path references belong only in migration contexts in documentation
Compatibility aliases (codex multi auth,codex multi-auth,codex multiauth) belong only in command reference, troubleshooting, or migration contexts
Keep command flags aligned with runtime usage text in documentation
Avoid non-runnable command snippets in documentation
Avoid conflicting path guidance across documentation
Avoid legacy-first onboarding language in documentationOrganize repository documentation according to the defined layers: product entry, user operations, reference, and development.
docs/**/*.md: Do not describecodex-multi-authas replacing@openai/codexor publishing the globalcodexbinary; preserve the official CLI's ownership ofcodex.
Usecodex-multi-authfor account management, and reservecodex-multi-auth-codexormcodexfor intentionally forwarding official Codex commands th...
Files:
docs/README.mddocs/releases/v2.8.0.md
docs/{README.md,docs/index.md,docs/README.md}
📄 CodeRabbit inference engine (docs/STYLE_GUIDE.md)
Root README and docs landing pages should naturally include
Codex CLI,multi-account OAuth,account switching,health checks,runtime rotation,diagnostics, andrecoverywhen those topics are in scope
Files:
docs/README.md
docs/{README.md,package.json,docs/development/GITHUB_DISCOVERABILITY.md}
📄 CodeRabbit inference engine (docs/STYLE_GUIDE.md)
Keep the repository description, package description, README lead, and
docs/development/GITHUB_DISCOVERABILITY.mdaligned
Files:
docs/README.md
docs/**/README.md
📄 CodeRabbit inference engine (docs/DOCUMENTATION.md)
Use
README.mdas the canonical project entry point.
Files:
docs/README.md
docs/README.md
📄 CodeRabbit inference engine (docs/DOCUMENTATION.md)
Use
docs/README.mdas the canonical documentation portal.
Files:
docs/README.md
docs/{README.md,docs/**/*.md,SECURITY.md,CONTRIBUTING.md,CODE_OF_CONDUCT.md}
📄 CodeRabbit inference engine (docs/DOCUMENTATION.md)
docs/{README.md,docs/**/*.md,SECURITY.md,CONTRIBUTING.md,CODE_OF_CONDUCT.md}: Usecodex-multi-authas the canonical package name,codex-multi-auth ...as the canonical account command family, and~/.codex/multi-authas the canonical storage root unless explicitly overridden.
When runtime behavior changes, update the documentation sources in the prescribed order, including onboarding, public framing, feature coverage, references, troubleshooting, development documentation, upgrade guidance, storage paths, governance files, and issue/PR templates as applicable.
Files:
docs/README.md
docs/{README.md,docs/**/*.md}
📄 CodeRabbit inference engine (docs/DOCUMENTATION.md)
docs/{README.md,docs/**/*.md}: Keep legacy paths, flows, and scoped package references only in migration or compatibility sections.
Document runtime rotation as default-on unless a future release intentionally changes that policy.
Files:
docs/README.md
docs/{README.md,docs/**/*.md,SECURITY.md,CONTRIBUTING.md,CODE_OF_CONDUCT.md,.github/**/*.md}
📄 CodeRabbit inference engine (docs/DOCUMENTATION.md)
Before merge, verify that documented commands are executable, CLI flags match runtime parser output, paths match runtime modules, internal links are valid, OS-sensitive operations have cross-platform instructions, guidance is consistent, and discoverability terms are accurate without keyword stuffing or ranking promises.
Files:
docs/README.md
docs/**/*.{md,mdx}
📄 CodeRabbit inference engine (docs/troubleshooting.md)
Document that
codex-multi-auth-codexis the optional forwarding wrapper, whilecodex-multi-authis the canonical account-manager command family; the package does not publish a globalcodexbinary.Document the canonical command names, runtime paths, configuration precedence, storage migration behavior, and upgrade procedures consistently across the referenced documentation.
Files:
docs/README.mddocs/releases/v2.8.0.md
docs/**
⚙️ CodeRabbit configuration file
keep README, SECURITY, and docs consistent with actual CLI flags and workflows. whenever behavior changes, require updated upgrade notes and mention new npm scripts.
Files:
docs/README.mddocs/releases/v2.8.0.md
docs/releases/**/*.md
📄 CodeRabbit inference engine (docs/releases/v0.1.1.md)
Documentation architecture must follow dual-track navigation with separate operator and maintainer paths
Document Windows and WSL side-by-side operation, including fixed callback-port behavior, listener inspection on both sides, the
--device-authescape hatch, and separate state directories.
Files:
docs/releases/v2.8.0.md
docs/releases/**/*
📄 CodeRabbit inference engine (docs/releases/v2.4.0.md)
docs/releases/**/*: The--account <index|email|id>option andCODEX_MULTI_AUTH_FORCE_ACCOUNTmust force a single Codex invocation to the selected configured account; an all-digit selector is always interpreted as a 1-based index.
When both are provided, the explicit--accountoption must take precedence overCODEX_MULTI_AUTH_FORCE_ACCOUNT.
Account forcing must be ephemeral: it may affect only the current invocation's runtime rotation proxy and must not mutate the persistedswitchpin or affect concurrent invocations.
Forced account selection must fail hard: the session must not rotate, and unavailable or rate-limited accounts must fail through the existingcodex_pinned_account_unavailablepath rather than falling back to another account.
If runtime rotation is disabled,CODEX_MULTI_AUTH_BYPASS=1, or the selector does not resolve to a configured account, the wrapper must exit non-zero without launching Codex.
The wrapper must resolve the selector against the same scoped accounts pool used by the proxy, convert it to a 0-based index, strip the launcher-only--accountargument before forwarding arguments to the official Codex CLI, and propagate the resolved index throughCODEX_MULTI_AUTH_FORCE_ACCOUNT_INDEX.
The proxy must selectforcedAccountIndex ?? persistedPinnedIndex, using the existing deterministic-pin selection path without changing other routing behavior.
The internal forced-account environment variable must be scrubbed from unrelated background and management child processes so it cannot leak beyond the single forwarded run.
Tests must cover forced deterministic selection, unavailable-account fail-hard behavior without an upstream call, environment-variable consumption and precedence including forced index0, launcher resolution by index/email/account ID and--account=syntax, flag-over-environment precedence, disabled rotation, out-of-range errors, argument stripping, and detached-helper propagation.
Document the account-forcing fea...
Files:
docs/releases/v2.8.0.md
docs/releases/**/*.{json,md}
📄 CodeRabbit inference engine (docs/releases/v2.5.0.md)
Document GPT-5.6 tiers,
max/ultra,ultra→maxwire behavior, effort coercion, and thegpt-5.6→ Sol alias in configuration references and templates.
Files:
docs/releases/v2.8.0.md
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: ndycode/codex-multi-auth
Timestamp: 2026-07-28T13:25:21.099Z
Learning: Treat the project as an independent, personal-development tool rather than an official OpenAI product; production or commercial workloads should use the OpenAI Platform API.
Learnt from: CR
Repo: ndycode/codex-multi-auth
Timestamp: 2026-07-28T13:25:25.070Z
Learning: For current implementation guidance, prefer `development/ARCHITECTURE.md`, reference documentation, and the code over historical plans and audits.
🪛 LanguageTool
docs/releases/v2.8.0.md
[style] ~33-~33: Consider an alternative for the overused word “exactly”.
Context: ...en after rewriting the config, which is exactly the state someone hitting these prompts...
(EXACTLY_PRECISELY)
🔇 Additional comments (7)
docs/releases/v2.8.0.md (1)
1-6: LGTM!Also applies to: 8-40, 43-46, 53-54, 61-61
CHANGELOG.md (1)
10-11: LGTM!Also applies to: 13-17, 19-25
package.json (1)
3-3: LGTM!.codex-plugin/plugin.json (1)
3-3: LGTM!AGENTS.md (1)
7-7: LGTM!README.md (1)
394-395: LGTM!docs/README.md (1)
35-36: LGTM!
| ## Upgrade notes | ||
|
|
||
| Nothing to do. The first `codex-multi-auth` or wrapper invocation after upgrading reconciles `~/.codex/config.toml` for you. | ||
|
|
||
| If you were already installed before this release, the first-run marker is migrated in place: only the new credential-store step is replayed, and app bind and launcher install are deliberately **not** rerun, so shortcuts you removed stay removed. A step that fails — a locked or read-only `config.toml`, for instance — leaves the marker unmigrated so the next run retries, rather than recording the work as done. | ||
|
|
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
add the required windows/wsl upgrade path.
this release changes first-run configuration and state behavior, but the release note omits side-by-side windows/wsl instructions: fixed callback port 1455, listener inspection on both sides, the --device-auth escape hatch, and separate state directories. the repository maps this boundary to lib/wsl.ts (AGENTS.md:63-64); add the runnable operator steps before release.
as per coding guidelines, release docs must document windows and wsl side-by-side operation, including fixed callback-port behavior, listener inspection on both sides, the --device-auth escape hatch, and separate state directories.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/releases/v2.8.0.md` around lines 47 - 52, Expand the Upgrade notes
section with runnable Windows/WSL side-by-side instructions covering the fixed
callback port 1455, how to inspect listeners from both Windows and WSL, the
--device-auth fallback, and separate state directories for each environment.
Anchor the guidance to the Windows/WSL boundary represented by lib/wsl.ts and
preserve the existing first-run migration details.
Source: Coding guidelines
Both caught in review, both real. The previous-behaviour summary listed only switch and login as the old enforcement triggers. Health checks and repairs also went through setCodexCliActiveSelection, and the body of the same document already said so -- the summary contradicted it. "Your real config.toml is never rewritten on this path" was wrong in this very release: the interactive path no longer writes the rotation provider into any config file, but the new startup credential-store reconcile can still update the top-level cli_auth_credentials_store key on the same invocation. Scoped the claim to the provider and pointed at the reconcile. Also corrected the opt-out table, which implied ENFORCE=0 alone restores keychain behaviour everywhere. It stops the persisted rewrite -- which is what front-ends like CodexBar read -- but the wrapper still passes -c cli_auth_credentials_store="file" to sessions it launches itself, so both toggles are needed for that. Rejected the third finding: it asked for Windows/WSL callback-port and --device-auth instructions, citing AGENTS.md:63-64. That line is a subsystem file-map row, not a docs rule, and WSL sections appear only in releases that changed auth/WSL behaviour -- v2.7.0 and v2.7.1 have none. This release touches credential storage and session routing, not OAuth ports. No republish needed: docs/ is not in package.json files[], so the notes were never part of the 2.8.0 tarball.
Summary
Release prep for 2.8.0. Version bump, changelog entry, and full release notes. Follows the same 8-file shape as
chore(release): 2.7.1.Not published, not tagged — publishing is done manually.
Why minor, not patch
2.7.1 described itself as "no new features and no configuration changes". This one does change configuration behaviour: the wrapper now writes
cli_auth_credentials_storeinto~/.codex/config.tomlat first run and on wrapper startup, where before it only did so on switch/login. That is a new side effect on a user-owned file, so it warrants a minor-version signal rather than being folded in as a patch.If you'd rather ship it as
2.7.2, the whole change is mechanical — say so and I'll redo the bump.What's in it
doctor --fixcan now repair the credential storeFiles
package.json,package-lock.json,.codex-plugin/plugin.json,AGENTS.md,README.md,docs/README.md,CHANGELOG.md,docs/releases/v2.8.0.md— the same setchore(release): 2.7.1touched.Validation
npm test— 335 files, 5270 passed, 0 failednpm run typecheck/typecheck:scriptsnpm run lintnpm run buildnpm run pack:check— 798,454 bytes across 920 files, within budgetnpm pack --dry-run— resolves ascodex-multi-auth-2.8.0.tgzNote before publishing
Merging this first keeps npm and
mainin step. Publishing from the branch before merge would briefly leave npm ahead ofmain.🤖 Generated with Claude Code
note: greptile review for oc-chatgpt-multi-auth. cite files like
lib/foo.ts:123. confirm regression tests + windows concurrency/token redaction coverage.Greptile Summary
release preparation for version 2.8.0.
Confidence Score: 5/5
the release preparation appears safe to merge.
no blocking failure remains.
Important Files Changed
Reviews (2): Last reviewed commit: "docs(release): correct two inaccuracies ..." | Re-trigger Greptile