Commit Graph

21 Commits

  • fix(cli): add execute permission to bin/codex.js (#9532)
    ## Summary
    Fixes #9520
    
    The `bin/codex.js` file was missing execute permissions (`644` instead
    of `755`), causing the `codex` command to fail after npm global
    installation.
    
    ## Changes
    - Added execute permission (`+x`) to `codex-cli/bin/codex.js`
    
    ## Verification
    After this fix, npm tarballs will include the correct file permissions:
    ```bash
    # Before: -rw-r--r-- (644)
    # After:  -rwxr-xr-x (755)
    ```
    
    ---
    🤖 Generated with Claude Code
    
    Co-authored-by: Claude <noreply@anthropic.com>
  • fix: add tui.alternate_screen config and --no-alt-screen CLI flag for Zellij scrollback (#8555)
    Fixes #2558
    
    Codex uses alternate screen mode (CSI 1049) which, per xterm spec,
    doesn't support scrollback. Zellij follows this strictly, so users can't
    scroll back through output.
    
    **Changes:**
    - Add `tui.alternate_screen` config: `auto` (default), `always`, `never`
    - Add `--no-alt-screen` CLI flag
    - Auto-detect Zellij and skip alt screen (uses existing `ZELLIJ` env var
    detection)
    
    **Usage:**
    ```bash
    # CLI flag
    codex --no-alt-screen
    
    # Or in config.toml
    [tui]
    alternate_screen = "never"
    ```
    
    With default `auto` mode, Zellij users get working scrollback without
    any config changes.
    
    ---------
    
    Co-authored-by: Josh McKinney <joshka@openai.com>
  • Fix: Detect Bun global install via path check (#8004)
    ## Summary
    Restores ability to detect when Codex is installed globally via **Bun**,
    which was broken by c3e4f920b4. Fixes
    #8003.
    
    Instead of relying on `npm_config_user_agent` (which is only set when
    running via `bunx` or `bun run`), this adds a path-based check to see if
    the CLI wrapper is located in Bun's global installation directory.
    
    ## Regression Context
    Commit `c3e4f920b4e965085164d6ee0249a873ef96da77` removed the
    `BUN_INSTALL` environment variable checks to prevent false positives.
    However, this caused false negatives for genuine Bun global installs
    because `detectPackageManager()` defaults to NPM when no signal is
    found.
    
    ## Changes
    - Updated `codex-cli/bin/codex.js` to check if `__dirname` contains
    `.bun/install/global` (handles both POSIX and Windows paths).
    
    ## Verification
    Verified by performing a global install of the patched CLI (v0.69.0 to
    trigger the update prompt):
    
    1. Packed the CLI using `npm pack` in `codex-cli/` to create a release
    tarball.
    2. Installed globally via Bun: `bun install -g
    $(pwd)/openai-codex-0.0.0-dev.tgz`.
    3. Ran `codex`, confirmed it detected Bun (banner showed `bun install -g
    @openai/codex`), selected "Update now", and verified it correctly
    spawned `bun install -g` instead of `npm`.
    4. Confirmed the upgrade completed successfully using Bun.
    <img width="1038" height="813" alt="verifying installation via bun"
    src="https://github.com/user-attachments/assets/00c9301a-18f1-4440-aa95-82ccffba896c"
    />
    5. Verified installations via npm are unaffected.
    <img width="2090" height="842" alt="verifying installation via npm"
    src="https://github.com/user-attachments/assets/ccb3e031-b85c-4bbe-bac7-23b087c5b844"
    />
  • chore: remove bun env var detect (#7534)
    ### Summary
    
    
    [Thread](https://openai.slack.com/archives/C08JZTV654K/p1764780129457519)
    
    We were a bit aggressive on assuming package installer based on env
    variables for BUN. Here we are removing those checks.
  • detect Bun installs in CLI update banner (#5074)
    ## Summary
    - detect Bun-managed installs in the JavaScript launcher and set a
    dedicated environment flag
    - show a Bun-specific upgrade command in the update banner when that
    flag is present
    
    Fixes #5012
    
    ------
    https://chatgpt.com/codex/tasks/task_i_68e95c439494832c835bdf34b3b1774e
    
    ---------
    
    Co-authored-by: Michael Bolin <mbolin@openai.com>
  • feat: introduce npm module for codex-responses-api-proxy (#4417)
    This PR expands `.github/workflows/rust-release.yml` so that it also
    builds and publishes the `npm` module for
    `@openai/codex-responses-api-proxy` in addition to `@openai/codex`. Note
    both `npm` modules are similar, in that they each contain a single `.js`
    file that is a thin launcher around the appropriate native executable.
    (Since we have a minimal dependency on Node.js, I also lowered the
    minimum version from 20 to 16 and verified that works on my machine.)
    
    As part of this change, we tighten up some of the docs around
    `codex-responses-api-proxy` and ensure the details regarding protecting
    the `OPENAI_API_KEY` in memory match the implementation.
    
    To test the `npm` build process, I ran:
    
    ```
    ./codex-cli/scripts/build_npm_package.py --package codex-responses-api-proxy --version 0.43.0-alpha.3
    ```
    
    which stages the `npm` module for `@openai/codex-responses-api-proxy` in
    a temp directory, using the binary artifacts from
    https://github.com/openai/codex/releases/tag/rust-v0.43.0-alpha.3.
  • fix: vendor ripgrep in the npm module (#3660)
    We try to ensure ripgrep (`rg`) is provided with Codex.
    
    - For `brew`, we declare it as a dependency of our formula:
    
    https://github.com/Homebrew/homebrew-core/blob/08d82d8b006a19efbe234477bc8b18d35b5fef50/Formula/c/codex.rb#L24
    - For `npm`, we declare `@vscode/ripgrep` as a dependency, which
    installs the platform-specific binary as part of a `postinstall` script:
    
    https://github.com/openai/codex/blob/fdb8dadcae9f8eec91bc3eb5a17b3f9b19e28505/codex-cli/package.json#L22
    - Users who download the CLI directly from GitHub Releases are on their
    own.
    
    In practice, I have seen `@vscode/ripgrep` fail on occasion. Here is a
    trace from a GitHub workflow:
    
    ```
    npm error code 1
    npm error path /Users/runner/hostedtoolcache/node/20.19.5/arm64/lib/node_modules/@openai/codex/node_modules/@vscode/ripgrep
    npm error command failed
    npm error command sh -c node ./lib/postinstall.js
    npm error Finding release for v13.0.0-13
    npm error GET https://api.github.com/repos/microsoft/ripgrep-prebuilt/releases/tags/v13.0.0-13
    npm error Deleting invalid download cache
    npm error Download attempt 1 failed, retrying in 2 seconds...
    npm error Finding release for v13.0.0-13
    npm error GET https://api.github.com/repos/microsoft/ripgrep-prebuilt/releases/tags/v13.0.0-13
    npm error Deleting invalid download cache
    npm error Download attempt 2 failed, retrying in 4 seconds...
    npm error Finding release for v13.0.0-13
    npm error GET https://api.github.com/repos/microsoft/ripgrep-prebuilt/releases/tags/v13.0.0-13
    npm error Deleting invalid download cache
    npm error Download attempt 3 failed, retrying in 8 seconds...
    npm error Finding release for v13.0.0-13
    npm error GET https://api.github.com/repos/microsoft/ripgrep-prebuilt/releases/tags/v13.0.0-13
    npm error Deleting invalid download cache
    npm error Download attempt 4 failed, retrying in 16 seconds...
    npm error Finding release for v13.0.0-13
    npm error GET https://api.github.com/repos/microsoft/ripgrep-prebuilt/releases/tags/v13.0.0-13
    npm error Deleting invalid download cache
    npm error Error: Request failed: 403
    ```
    
    To eliminate this error, this PR changes things so that we vendor the
    `rg` binary into https://www.npmjs.com/package/@openai/codex so it is
    guaranteed to be included when a user runs `npm i -g @openai/codex`.
    
    The downside of this approach is the increase in package size: we
    include the `rg` executable for six architectures (in addition to the
    six copies of `codex` we already include). In a follow-up, I plan to add
    support for "slices" of our npm module, so that soon users will be able
    to do:
    
    ```
    npm install -g @openai/codex@aarch64-apple-darwin
    ```
    
    Admittedly, this is a sizable change and I tried to clean some things up
    in the process:
    
    - `install_native_deps.sh` has been replaced by `install_native_deps.py`
    - `stage_release.sh` and `stage_rust_release.py` has been replaced by
    `build_npm_package.py`
    
    We now vendor in a DotSlash file for ripgrep (as a modest attempt to
    facilitate local testing) and then build up the extension by:
    
    - creating a temp directory and copying `package.json` over to it with
    the target value for `"version"`
    - finding the GitHub workflow that corresponds to the
    `--release-version` and copying the various `codex` artifacts to
    respective `vendor/TARGET_TRIPLE/codex` folder
    - downloading the `rg` artifacts specified in the DotSlash file and
    copying them over to the respective `vendor/TARGET_TRIPLE/path` folder
    - if `--pack-output` is specified, runs `npm pack` on the temp directory
    
    To test, I downloaded the artifact produced by this CI job:
    
    
    https://github.com/openai/codex/actions/runs/17961595388/job/51085840022?pr=3660
    
    and verified that `node ./bin/codex.js 'which -a rg'` worked as
    intended.
  • fix: include arm64 Windows executable in npm module (#3067)
    This is in support of https://github.com/openai/codex/issues/2979.
    
    Tested by running:
    
    ```
    ./codex-cli/scripts/install_native_deps.sh --workflow-url https://github.com/openai/codex/actions/runs/17416421450
    ```
  • [codex-cli] Add ripgrep as a dependency for node environment (#2237)
    ## Summary
    Ripgrep is our preferred tool for file search. When users install via
    `brew install codex`, it's automatically installed as a dependency. We
    want to ensure that users running via an npm install also have this
    tool! Microsoft has already solved this problem for VS Code - let's not
    reinvent the wheel.
    
    This approach of appending to the PATH directly might be a bit
    heavy-handed, but feels reasonably robust to a variety of environment
    concerns. Open to thoughts on better approaches here!
    
    ## Testing
    - [x] confirmed this import approach works with `node -e "const { rgPath
    } = require('@vscode/ripgrep'); require('child_process').spawn(rgPath,
    ['--version'], { stdio: 'inherit' })"`
    - [x] Ran codex.js locally with `rg` uninstalled, asked it to run `which
    rg`. Output below:
    
    ```
     Ran command which rg; echo $?
      ⎿ /Users/dylan.hurd/code/dh--npm-rg/node_modules/@vscode/ripgrep/bin/rg
        0
    
    codex
    Re-running to confirm the path and exit code.
    
    - Path: `/Users/dylan.hurd/code/dh--npm-rg/node_modules/@vscode/ripgrep/bin/rg`
    - Exit code: `0`
    ```
  • feat: include Windows binary of the CLI in the npm release (#2040)
    To date, the build scripts in `codex-cli` still supported building the
    old TypeScript version of the Codex CLI to give Windows users something
    they can run, but we are just going to have them use the Rust version
    like everyone else, so:
    
    - updates `codex-cli/bin/codex.js` so that we run the native binary or
    throw if the target platform/arch is not supported (no more conditional
    usage based on `CODEX_RUST`, `use-native` file, etc.)
    - drops the `--native` flag from `codex-cli/scripts/stage_release.sh`
    and updates all the code paths to behave as if `--native` were passed
    (i.e., it is the only way to run it now)
    
    Tested this by running:
    
    ```
    ./codex-cli/scripts/stage_rust_release.py --release-version 0.20.0-alpha.2
    ```
  • check for updates (#1764)
    1. Ping https://api.github.com/repos/openai/codex/releases/latest (at
    most once every 20 hrs)
    2. Store the result in ~/.codex/version.jsonl
    3. If CARGO_PKG_VERSION < latest_version, print a message at boot.
    
    ---------
    
    Co-authored-by: easong-openai <easong@openai.com>
  • fix: update bin/codex.js so it listens for exit on the child process (#1590)
    When Codex CLI is installed via `npm`, we use a `.js` wrapper script to
    launch the Rust binary.
    
    - Previously, we were not listening for signals to ensure that killing
    the Node.js process would also kill the underlying Rust process.
    - We also did not have a proper `exit` handler in place on the child
    process to ensure we exited from the Node.js process.
    
    This PR fixes these things and hopefully addresses
    https://github.com/openai/codex/issues/1570.
    
    This also adds logic so that Windows falls back to the TypeScript CLI
    again, which should address https://github.com/openai/codex/issues/1573.
  • Add Android platform support for Codex CLI (#1488)
    ## Summary
    Add Android platform support to Codex CLI
    
    ## What?
    - Added `android` to the list of supported platforms in
    `codex-cli/bin/codex.js`
    - Treats Android as Linux for binary compatibility
    
    ## Why?
    - Fixes "Unsupported platform: android (arm64)" error on Termux
    - Enables Codex CLI usage on Android devices via Termux
    - Improves platform compatibility without affecting other platforms
    
    ## How?
    - Modified the platform detection switch statement to include `case
    "android":`
    - Android falls through to the same logic as Linux, using appropriate
    ARM64 binaries
    - Minimal change with no breaking effects on existing functionality
    
    ## Testing
    - Tested on Android/Termux environment
    - Verified the fix resolves the platform detection error
    - Confirmed no impact on other platforms
    
    ## Related Issues
    Fixes the "Unsupported platform: android (arm64)" error reported by
    Termux users
  • fix: use aarch64-unknown-linux-musl instead of aarch64-unknown-linux-gnu (#1228)
    Now that we have published a GitHub Release that contains arm64 musl
    artifacts for Linux, update the following scripts to take advantage of
    them:
    
    - `dotslash-config.json` now uses musl artifacts for the `linux-aarch64`
    target
    - `install_native_deps.sh` for the TypeScript CLI now includes
    `codex-linux-sandbox-aarch64-unknown-linux-musl` instead of
    `codex-linux-sandbox-aarch64-unknown-linux-gnu` for sandboxing
    - `codex-cli/bin/codex.js` now checks for `aarch64-unknown-linux-musl`
    artifacts instead of `aarch64-unknown-linux-gnu` ones
  • fix: for the @native release of the Node module, use the Rust version by default (#1084)
    Added logic so that when we run `./scripts/stage_release.sh --native`
    (for the `@native` version of the Node module), we drop a `use-native`
    file next to `codex.js`. If present, `codex.js` will now run the Rust
    CLI.
    
    Ran `./scripts/stage_release.sh --native` and verified that when the
    running `codex.js` in the staged folder:
    
    ```
    $ /var/folders/wm/f209bc1n2bd_r0jncn9s6j_00000gp/T/tmp.efvEvBlSN6/bin/codex.js --version
    codex-cli 0.0.2505220956
    ```
    
    it ran the expected Rust version of the CLI, as desired.
    
    While here, I also updated the Rust version to one that I cut today,
    which includes the new shell environment policy config option:
    https://github.com/openai/codex/pull/1061. Note this may "break" some
    users if the processes spawned by Codex need extra environment
    variables. (We are still working to determine what the right defaults
    should be for this option.)
  • chore: introduce new --native flag to Node module release process (#844)
    This PR introduces an optional build flag, `--native`, that will build a
    version of the Codex npm module that:
    
    - Includes both the Node.js and native Rust versions (for Mac and Linux)
    - Will run the native version if `CODEX_RUST=1` is set
    - Runs the TypeScript version otherwise
    
    Note this PR also updates the workflow URL to
    https://github.com/openai/codex/actions/runs/14872557396, as that is a
    build from today that includes everything up through
    https://github.com/openai/codex/pull/843.
    
    Test Plan:
    
    In `~/code/codex/codex-cli`, I ran:
    
    ```
    pnpm stage-release --native
    ```
    
    The end of the output was:
    
    ```
    Staged version 0.1.2505121317 for release in /var/folders/wm/f209bc1n2bd_r0jncn9s6j_00000gp/T/tmp.xd2p5ETYGN
    Test Node:
        node /var/folders/wm/f209bc1n2bd_r0jncn9s6j_00000gp/T/tmp.xd2p5ETYGN/bin/codex.js --help
    Test Rust:
        CODEX_RUST=1 node /var/folders/wm/f209bc1n2bd_r0jncn9s6j_00000gp/T/tmp.xd2p5ETYGN/bin/codex.js --help
    Next:  cd "/var/folders/wm/f209bc1n2bd_r0jncn9s6j_00000gp/T/tmp.xd2p5ETYGN" && npm publish --tag native
    ```
    
    I verified that running each of these commands ran the expected version
    of Codex.
    
    While here, I also added `bin` to the `files` list in `package.json`,
    which should have been done as part of
    https://github.com/openai/codex/pull/757, as that added new entries to
    `bin` that were matched by `.gitignore` but should have been included in
    a release.
  • fix: /bug report command, thinking indicator (#381)
    - Fix `/bug` report command
    - Fix thinking indicator
  • fix: Improper spawn of sh on Windows Powershell (#318)
    # Fix CLI launcher on Windows by replacing `sh`-based entrypoint with
    cross-platform Node script
    
    ## What's changed
    
    * This PR attempts to replace the sh-based entry point with a node
    script that works on all platforms including Windows Powershell and CMD
    
    ## Why 
    
    * Previously, when installing Codex globally via `npm i -g
    @openai/codex`, Windows resulted in a broken CLI issue due to the `ps1`
    launcher trying to execute `sh.exe`.
    
    * If users don't have Unix-style shell, running the command will fail as
    seen below since `sh.exe` can't be found
    
    * Output:
     ``` 
    & : The term 'sh.exe' is not recognized as the name of a cmdlet,
    function, script file, or operable program. Check the
    spelling of the name, or if a path was included, verify that the path is
    correct and try again.
    At C:\Users\{user}\AppData\Roaming\npm\codex.ps1:24 char:7
    +     & "sh$exe"  "$basedir/node_modules/@openai/codex/bin/codex" $args
    +       ~~~~~~~~
    + CategoryInfo : ObjectNotFound: (sh.exe:String) [],
    CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    ```
    
    
    
    ## How
    * By using a Node based entry point that resolves the path to the compiled ESM bundle and dynamically loads it using native ESM
    
    * Removed dependency on platform-specific launchers allowing a single entrypoint to work everywhere Node.js runs.
    
    
    ## Result
    
    Codex CLI now supports cross-platform and launches correctly via:
    * macOS / Linux
    * Windows PowerShell
    * GitBash
    * CMD
    * WSL
    
    Directly addresses #316 
    
    ![image](https://github.com/user-attachments/assets/85faaca4-24bc-47c9-8160-4e30df6da4c3)
    
    
    ![image](https://github.com/user-attachments/assets/a13f7adc-52c1-4c0e-af02-e35a35dc45d4)
  • add: changelog (#308)
    - Release `@openai/codex@0.1.2504172304`
    - Add changelog
  • feat(bin): support bun fallback runtime for codex CLI (#282)
    This PR adds a shell wrapper in `codex-cli/bin/codex` to detect node or
    bun as the runtime.
    
    It updates:
    - `package.json` bin entry
    - published files list to include bin/
    - README install instructions to include `bun install -g @openai/codex`