From c07f66c9ecca61531b12958537c76d3b1fffde72 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Thu, 21 May 2026 08:48:42 -0700 Subject: [PATCH] packaging: move rg manifest out of npm bin (#23833) ## Why Installing `@openai/codex` currently places a Dotslash `rg` manifest at `node_modules/@openai/codex/bin/rg`, even though the native optional dependency already ships the actual helper under `vendor//codex-path/rg`. The launcher prepends that `codex-path` directory, so the top-level `bin/rg` file is redundant in the npm install. The remaining direct consumers of the manifest are package-building paths: `scripts/codex_package/ripgrep.py` and `codex-cli/scripts/install_native_deps.py`. Keeping the manifest under `codex-cli/bin` makes it look like a shipped npm binary, so this moves it next to the package-builder code that owns it. The checked-in `@openai/codex` package metadata should likewise describe only the meta package payload; generated platform packages continue to publish `vendor`. ## What Changed - Moved the Dotslash ripgrep manifest from `codex-cli/bin/rg` to `scripts/codex_package/rg`. - Updated the package builder, npm native-artifact hydrator, README, and CLI help text to reference the new manifest location. - Stopped `codex-cli/scripts/build_npm_package.py` from copying `rg` into the `@openai/codex` meta package. - Narrowed the checked-in meta package `files` whitelist to `bin/codex.js`. ## Verification - `python3 -m unittest discover -s scripts/codex_package -p "test_*.py"` - `python3 -m unittest discover -s codex-cli/scripts -p "test_*.py"` - `python3 -m py_compile codex-cli/scripts/build_npm_package.py codex-cli/scripts/install_native_deps.py scripts/codex_package/ripgrep.py scripts/codex_package/cli.py scripts/stage_npm_packages.py` - `codex-cli/scripts/build_npm_package.py --package codex --version 0.0.0-test --pack-output /codex-meta-no-vendor.tgz` - `tar -tf /codex-meta-no-vendor.tgz` showed only `package/bin/codex.js`, `package/package.json`, and `package/README.md`. - Direct staging check showed `codex` uses `files: ["bin/codex.js"]` while `codex-darwin-arm64` still uses `files: ["vendor"]`. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/openai/codex/pull/23833). * #23836 * __->__ #23833 --- codex-cli/package.json | 3 +-- codex-cli/scripts/build_npm_package.py | 5 +---- codex-cli/scripts/install_native_deps.py | 3 ++- scripts/codex_package/README.md | 8 ++++---- scripts/codex_package/cli.py | 2 +- {codex-cli/bin => scripts/codex_package}/rg | 0 scripts/codex_package/ripgrep.py | 4 ++-- 7 files changed, 11 insertions(+), 14 deletions(-) rename {codex-cli/bin => scripts/codex_package}/rg (100%) diff --git a/codex-cli/package.json b/codex-cli/package.json index 2f8df9b79f..fd122128e5 100644 --- a/codex-cli/package.json +++ b/codex-cli/package.json @@ -11,8 +11,7 @@ "node": ">=16" }, "files": [ - "bin", - "vendor" + "bin/codex.js" ], "repository": { "type": "git", diff --git a/codex-cli/scripts/build_npm_package.py b/codex-cli/scripts/build_npm_package.py index 5d4bc99c4e..261b9e0b61 100755 --- a/codex-cli/scripts/build_npm_package.py +++ b/codex-cli/scripts/build_npm_package.py @@ -255,9 +255,6 @@ def stage_sources(staging_dir: Path, version: str, package: str) -> None: bin_dir = staging_dir / "bin" bin_dir.mkdir(parents=True, exist_ok=True) shutil.copy2(CODEX_CLI_ROOT / "bin" / "codex.js", bin_dir / "codex.js") - rg_manifest = CODEX_CLI_ROOT / "bin" / "rg" - if rg_manifest.exists(): - shutil.copy2(rg_manifest, bin_dir / "rg") readme_src = REPO_ROOT / "README.md" if readme_src.exists(): @@ -316,7 +313,7 @@ def stage_sources(staging_dir: Path, version: str, package: str) -> None: package_json["version"] = version if package == "codex": - package_json["files"] = ["bin"] + package_json["files"] = ["bin/codex.js"] package_json["optionalDependencies"] = { CODEX_PLATFORM_PACKAGES[platform_package]["npm_name"]: ( f"npm:{CODEX_NPM_NAME}@" diff --git a/codex-cli/scripts/install_native_deps.py b/codex-cli/scripts/install_native_deps.py index b785b2a877..de157334cd 100755 --- a/codex-cli/scripts/install_native_deps.py +++ b/codex-cli/scripts/install_native_deps.py @@ -20,9 +20,10 @@ from urllib.request import urlopen SCRIPT_DIR = Path(__file__).resolve().parent CODEX_CLI_ROOT = SCRIPT_DIR.parent +REPO_ROOT = CODEX_CLI_ROOT.parent DEFAULT_WORKFLOW_URL = "https://github.com/openai/codex/actions/runs/26131514935" # rust-v0.132.0 VENDOR_DIR_NAME = "vendor" -RG_MANIFEST = CODEX_CLI_ROOT / "bin" / "rg" +RG_MANIFEST = REPO_ROOT / "scripts" / "codex_package" / "rg" BINARY_TARGETS = ( "x86_64-unknown-linux-musl", "aarch64-unknown-linux-musl", diff --git a/scripts/codex_package/README.md b/scripts/codex_package/README.md index f53f1a41ad..8a1b392b20 100644 --- a/scripts/codex_package/README.md +++ b/scripts/codex_package/README.md @@ -56,7 +56,7 @@ Windows packages. This keeps package archive creation as a pure staging step after signing instead of rebuilding resources. `rg` is not built from this repository, so the builder fetches it from the -DotSlash manifest at `codex-cli/bin/rg`. Downloaded archives are cached under -`$TMPDIR/codex-package/-rg` and are reused only after the recorded size -and SHA-256 digest have been verified. Pass `--rg-bin` to use a local ripgrep -executable instead. +DotSlash manifest at `scripts/codex_package/rg`. Downloaded archives are cached +under `$TMPDIR/codex-package/-rg` and are reused only after the recorded +size and SHA-256 digest have been verified. Pass `--rg-bin` to use a local +ripgrep executable instead. diff --git a/scripts/codex_package/cli.py b/scripts/codex_package/cli.py index 36ceda589e..9c0b16258d 100644 --- a/scripts/codex_package/cli.py +++ b/scripts/codex_package/cli.py @@ -114,7 +114,7 @@ def parse_args() -> argparse.Namespace: type=Path, help=( "Optional local ripgrep executable override instead of fetching from " - "codex-cli/bin/rg." + "scripts/codex_package/rg." ), ) return parser.parse_args() diff --git a/codex-cli/bin/rg b/scripts/codex_package/rg similarity index 100% rename from codex-cli/bin/rg rename to scripts/codex_package/rg diff --git a/scripts/codex_package/ripgrep.py b/scripts/codex_package/ripgrep.py index 5411cb579a..ce3ad7dc34 100644 --- a/scripts/codex_package/ripgrep.py +++ b/scripts/codex_package/ripgrep.py @@ -1,4 +1,4 @@ -"""Fetch ripgrep from the DotSlash manifest used by the npm package.""" +"""Fetch ripgrep from the DotSlash manifest used by the package builder.""" import hashlib import json @@ -17,7 +17,7 @@ from .targets import TargetSpec from .targets import resolve_input_path -RG_MANIFEST = REPO_ROOT / "codex-cli" / "bin" / "rg" +RG_MANIFEST = REPO_ROOT / "scripts" / "codex_package" / "rg" DOWNLOAD_TIMEOUT_SECS = 60