Repository navigation
v1.4.0
codex-plugin-cc v1.4.0
Engineering maturity plus Windows without $SHELL; the Windows CI matrix is now required.
Fixed
- Windows: commands are no longer spawned through
$SHELL(usually Git Bash under Claude Code, which mangledtaskkill /PID /T /Fand other arguments); executables are resolved withwhere.exe,.exe/.comfiles run directly, and.cmd/.batshims (including a globalnpm install -g @openai/codex) run throughcmd.exewith every argument escaped for bothcmd /cand the shim's own%*re-parse (%VAR:a=b%substitution is the one documented ceiling; an argument containing CR/LF is refused) (openai#525, openai#647, openai#656, openai#669, openai#708, openai#287, openai#409, openai#735). - Windows: the broker and app-server child processes no longer flash a visible console window on spawn (
windowsHide: true) (openai#440, openai#451). - The
Stop,SessionStartandSessionEndhooks read stdin with a bounded deadline (2 s / 5 s / 1 s respectively) and a 1 MiB limit instead of a blockingreadFileSync(0); a disabled Stop review gate no longer hangs until the 900 s hook timeout when stdin never arrives, and the companion no longer crashes withEAGAINreading a non-blocking stdin under concurrent sessions (openai#530, openai#544, openai#120, openai#247, openai#123, openai#150, openai#165). --args-stdin(and$ARGUMENTS) no longer eats a backslash that does not escape a quote, another backslash or whitespace, so Windows paths such asC:\Users\me\project\file.mjssurvive;\\server\shareis a documented limitation, and--prompt-stdinremains available for byte-exact text.- Windows:
state.jsonreads and writes and lock-ticket reads retry briefly (bounded, roughly 300 ms worst case) onEPERM/EBUSY/EACCESinstead of failing outright when another process holds the file open.
Added
SECURITY.md(supported versions, GitHub Security Advisories reporting) (openai#326).- Node 24 development tooling: ESLint, a
typecheck:testsscript overtests/**andscripts/**(checkJsis off for now — turning it on surfaced 54 pre-existing findings, deferred),c8coverage (npm run test:coverage, thresholds in.c8rc.json), Stryker mutation testing over the criticalargs.mjs/model-catalog.mjspair (npm run test:mutation:critical), acheck:changeloggate that keepsCHANGELOG.mdandplugins/codex/CHANGELOG.mdbyte-identical, Dependabot, andnpm run setup:git-hooks(pre-commit lint + typecheck). - CI: one workflow run per SHA (push limited to
main, release branches checked via manualworkflow_dispatch, with aconcurrencygroup cancelling superseded runs) and a newqualityjob on Node 24 alongside the existing OS × Node matrix.
Changed
- The per-user fallback state root used when
CLAUDE_PLUGIN_DATAis unset is now%LOCALAPPDATA%\codex-companionon Windows. A pre-1.4.0 root under%TEMP%\codex-companion-userkeeps being used, with a one-line stderr notice, until it is removed by hand — nothing is migrated automatically. This transitional notice only applies to an unversioned/dev checkout: a marketplace install's state-root hash is derived fromCLAUDE_PLUGIN_ROOT, which already includes the plugin version in the marketplace cache, so a normal upgrade never sees the legacy root. BROKER_BUSY_RETRY_MSwidened from 1000 to 3000 ms; the "teardown only after the broker confirmed idle" invariant is unchanged.- Deferred v1.3.0 review minors folded in:
CODEX_REVIEW_GATE_MAX_ROUNDSrejects a non-integer, negative or otherwise malformed value (falls back to 3 with a warning) instead of misreading it;setup --review-gate-model ""/--review-gate-effort ""now fails with--<flag> needs a value; use inherit to clear it.instead of writing anything; a job id used to build theworkerCommandLinematch is now regex-escaped; thekill-failedbroker-teardown reason is documented in the README's reason table. Also added (test coverage only, no behavior change): a catalogue-only model alias resolving correctly on a priority tie, and the fallback-root refusal covering a non-standard directory mode.
Known limitations
- Kills issued from stored process records (
/codex:cancel,SessionEndcleanup, stale-broker replacement, broker teardown) are still refused on Windows (identity-unavailable); process identity verification is now targeted for v1.4.1, not v1.4.0 as previously stated./codex:cancelstill sends the turn interrupt on a best-effort basis;SessionEndonly refuses. A worker or broker left behind exits when its turn ends and, for the broker, once every client has disconnected and its idle timeout elapses — an unbounded turn is not reaped on Windows until v1.4.1.
Ported with reference to upstream PRs by mohammad-malik, mittalpk, stantheman0128, tmchow, D2758695161, ikbear, e345ee, tanakauo.
Install
claude plugin marketplace add CBEPX/codex-plugin-cc
claude plugin install codex@cbepx
The attached cbepx-codex-plugin-cc-1.4.0.tgz is the npm pack output; its SHA-256 is in SHA256SUMS.
- Exact tag target:
6f0467f06feaf8e83162c671af910c4073083016 - Local gate: 360 tests / 359 pass / 1 win32-only skip, 0 leaked test processes,
npm run check(lint, typecheck, coverage thresholds, changelog gate),claude plugin validate . --strict,npm audit --omit=dev0 vulnerabilities - CI: run 36389450461 on 5b6bb46 — ubuntu/macos/windows × node 18/22/24 + quality all green (Windows required)
- Codex adversarial review: 8 passes at
--effort max; pass 8 = SHIP