1313SCRIPT_DIR = Path (__file__ ).resolve ().parent
1414CODEX_CLI_ROOT = SCRIPT_DIR .parent
1515REPO_ROOT = CODEX_CLI_ROOT .parent
16+ RESPONSES_API_PROXY_NPM_ROOT = REPO_ROOT / "codex-rs" / "responses-api-proxy" / "npm"
1617GITHUB_REPO = "openai/codex"
1718
1819# The docs are not clear on what the expected value/format of
2324
2425def parse_args () -> argparse .Namespace :
2526 parser = argparse .ArgumentParser (description = "Build or stage the Codex CLI npm package." )
27+ parser .add_argument (
28+ "--package" ,
29+ choices = ("codex" , "codex-responses-api-proxy" ),
30+ default = "codex" ,
31+ help = "Which npm package to stage (default: codex)." ,
32+ )
2633 parser .add_argument (
2734 "--version" ,
2835 help = "Version number to write to package.json inside the staged package." ,
@@ -63,6 +70,7 @@ def parse_args() -> argparse.Namespace:
6370def main () -> int :
6471 args = parse_args ()
6572
73+ package = args .package
6674 version = args .version
6775 release_version = args .release_version
6876 if release_version :
@@ -76,7 +84,7 @@ def main() -> int:
7684 staging_dir , created_temp = prepare_staging_dir (args .staging_dir )
7785
7886 try :
79- stage_sources (staging_dir , version )
87+ stage_sources (staging_dir , version , package )
8088
8189 workflow_url = args .workflow_url
8290 resolved_head_sha : str | None = None
@@ -100,16 +108,23 @@ def main() -> int:
100108 if not workflow_url :
101109 raise RuntimeError ("Unable to determine workflow URL for native binaries." )
102110
103- install_native_binaries (staging_dir , workflow_url )
111+ install_native_binaries (staging_dir , workflow_url , package )
104112
105113 if release_version :
106114 staging_dir_str = str (staging_dir )
107- print (
108- f"Staged version { version } for release in { staging_dir_str } \n \n "
109- "Verify the CLI:\n "
110- f" node { staging_dir_str } /bin/codex.js --version\n "
111- f" node { staging_dir_str } /bin/codex.js --help\n \n "
112- )
115+ if package == "codex" :
116+ print (
117+ f"Staged version { version } for release in { staging_dir_str } \n \n "
118+ "Verify the CLI:\n "
119+ f" node { staging_dir_str } /bin/codex.js --version\n "
120+ f" node { staging_dir_str } /bin/codex.js --help\n \n "
121+ )
122+ else :
123+ print (
124+ f"Staged version { version } for release in { staging_dir_str } \n \n "
125+ "Verify the responses API proxy:\n "
126+ f" node { staging_dir_str } /bin/codex-responses-api-proxy.js --help\n \n "
127+ )
113128 else :
114129 print (f"Staged package in { staging_dir } " )
115130
@@ -136,20 +151,34 @@ def prepare_staging_dir(staging_dir: Path | None) -> tuple[Path, bool]:
136151 return temp_dir , True
137152
138153
139- def stage_sources (staging_dir : Path , version : str ) -> None :
154+ def stage_sources (staging_dir : Path , version : str , package : str ) -> None :
140155 bin_dir = staging_dir / "bin"
141156 bin_dir .mkdir (parents = True , exist_ok = True )
142157
143- shutil .copy2 (CODEX_CLI_ROOT / "bin" / "codex.js" , bin_dir / "codex.js" )
144- rg_manifest = CODEX_CLI_ROOT / "bin" / "rg"
145- if rg_manifest .exists ():
146- shutil .copy2 (rg_manifest , bin_dir / "rg" )
158+ if package == "codex" :
159+ shutil .copy2 (CODEX_CLI_ROOT / "bin" / "codex.js" , bin_dir / "codex.js" )
160+ rg_manifest = CODEX_CLI_ROOT / "bin" / "rg"
161+ if rg_manifest .exists ():
162+ shutil .copy2 (rg_manifest , bin_dir / "rg" )
163+
164+ readme_src = REPO_ROOT / "README.md"
165+ if readme_src .exists ():
166+ shutil .copy2 (readme_src , staging_dir / "README.md" )
147167
148- readme_src = REPO_ROOT / "README.md"
149- if readme_src .exists ():
150- shutil .copy2 (readme_src , staging_dir / "README.md" )
168+ package_json_path = CODEX_CLI_ROOT / "package.json"
169+ elif package == "codex-responses-api-proxy" :
170+ launcher_src = RESPONSES_API_PROXY_NPM_ROOT / "bin" / "codex-responses-api-proxy.js"
171+ shutil .copy2 (launcher_src , bin_dir / "codex-responses-api-proxy.js" )
151172
152- with open (CODEX_CLI_ROOT / "package.json" , "r" , encoding = "utf-8" ) as fh :
173+ readme_src = RESPONSES_API_PROXY_NPM_ROOT / "README.md"
174+ if readme_src .exists ():
175+ shutil .copy2 (readme_src , staging_dir / "README.md" )
176+
177+ package_json_path = RESPONSES_API_PROXY_NPM_ROOT / "package.json"
178+ else :
179+ raise RuntimeError (f"Unknown package '{ package } '." )
180+
181+ with open (package_json_path , "r" , encoding = "utf-8" ) as fh :
153182 package_json = json .load (fh )
154183 package_json ["version" ] = version
155184
@@ -158,10 +187,19 @@ def stage_sources(staging_dir: Path, version: str) -> None:
158187 out .write ("\n " )
159188
160189
161- def install_native_binaries (staging_dir : Path , workflow_url : str | None ) -> None :
162- cmd = ["./scripts/install_native_deps.py" ]
163- if workflow_url :
164- cmd .extend (["--workflow-url" , workflow_url ])
190+ def install_native_binaries (staging_dir : Path , workflow_url : str , package : str ) -> None :
191+ package_components = {
192+ "codex" : ["codex" , "rg" ],
193+ "codex-responses-api-proxy" : ["codex-responses-api-proxy" ],
194+ }
195+
196+ components = package_components .get (package )
197+ if components is None :
198+ raise RuntimeError (f"Unknown package '{ package } '." )
199+
200+ cmd = ["./scripts/install_native_deps.py" , "--workflow-url" , workflow_url ]
201+ for component in components :
202+ cmd .extend (["--component" , component ])
165203 cmd .append (str (staging_dir ))
166204 subprocess .check_call (cmd , cwd = CODEX_CLI_ROOT )
167205
0 commit comments