@@ -296,6 +296,7 @@ describe("codex bin wrapper", () => {
296296 const result = runWrapper ( fixtureRoot , [ "--version" ] , {
297297 CODEX_MULTI_AUTH_REAL_CODEX_BIN : fakeBin ,
298298 CODEX_MULTI_AUTH_WINDOWS_BATCH_SHIM_GUARD : "1" ,
299+ CODEX_MULTI_AUTH_PWSH_PROFILE_GUARD : "1" ,
299300 PATH : `${ shimDir } ${ delimiter } ${ process . env . PATH ?? "" } ` ,
300301 USERPROFILE : fixtureRoot ,
301302 HOME : fixtureRoot ,
@@ -335,6 +336,114 @@ describe("codex bin wrapper", () => {
335336 } ,
336337 ) ;
337338
339+ it . skipIf ( process . platform !== "win32" ) (
340+ "does not install Windows shell guards unless explicitly enabled" ,
341+ ( ) => {
342+ const fixtureRoot = createWrapperFixture ( ) ;
343+ const fakeBin = createFakeCodexBin ( fixtureRoot ) ;
344+ const shimDir = join ( fixtureRoot , "shim-bin" ) ;
345+ mkdirSync ( shimDir , { recursive : true } ) ;
346+ writeFileSync (
347+ join ( shimDir , "codex-multi-auth.cmd" ) ,
348+ "@ECHO OFF\r\nREM fixture codex-multi-auth shim\r\n" ,
349+ "utf8" ,
350+ ) ;
351+ writeFileSync (
352+ join ( shimDir , "codex.cmd" ) ,
353+ '@ECHO OFF\r\necho "%dp0%\\node_modules\\@openai\\codex\\bin\\codex.js"\r\n' ,
354+ "utf8" ,
355+ ) ;
356+ writeFileSync (
357+ join ( shimDir , "codex.ps1" ) ,
358+ 'Write-Output "$basedir/node_modules/@openai/codex/bin/codex.js"' +
359+ "\r\n" ,
360+ "utf8" ,
361+ ) ;
362+
363+ const result = runWrapper ( fixtureRoot , [ "--version" ] , {
364+ CODEX_MULTI_AUTH_REAL_CODEX_BIN : fakeBin ,
365+ PATH : `${ shimDir } ${ delimiter } ${ process . env . PATH ?? "" } ` ,
366+ USERPROFILE : fixtureRoot ,
367+ HOME : fixtureRoot ,
368+ } ) ;
369+ expect ( result . status ) . toBe ( 0 ) ;
370+
371+ expect ( ( ) => readFileSync ( join ( shimDir , "codex.bat" ) , "utf8" ) ) . toThrow ( ) ;
372+ expect ( readFileSync ( join ( shimDir , "codex.cmd" ) , "utf8" ) ) . toContain (
373+ "node_modules\\@openai\\codex\\bin\\codex.js" ,
374+ ) ;
375+ expect ( readFileSync ( join ( shimDir , "codex.ps1" ) , "utf8" ) ) . toContain (
376+ "node_modules/@openai/codex/bin/codex.js" ,
377+ ) ;
378+ expect ( ( ) =>
379+ readFileSync (
380+ join (
381+ fixtureRoot ,
382+ "Documents" ,
383+ "PowerShell" ,
384+ "Microsoft.PowerShell_profile.ps1" ,
385+ ) ,
386+ "utf8" ,
387+ ) ,
388+ ) . toThrow ( ) ;
389+ } ,
390+ ) ;
391+
392+ it . skipIf ( process . platform !== "win32" ) (
393+ "installs the PowerShell profile guard without requiring batch shim guards" ,
394+ ( ) => {
395+ const fixtureRoot = createWrapperFixture ( ) ;
396+ const fakeBin = createFakeCodexBin ( fixtureRoot ) ;
397+ const shimDir = join ( fixtureRoot , "shim-bin" ) ;
398+ mkdirSync ( shimDir , { recursive : true } ) ;
399+ writeFileSync (
400+ join ( shimDir , "codex-multi-auth.cmd" ) ,
401+ "@ECHO OFF\r\nREM fixture codex-multi-auth shim\r\n" ,
402+ "utf8" ,
403+ ) ;
404+ writeFileSync (
405+ join ( shimDir , "codex.cmd" ) ,
406+ '@ECHO OFF\r\necho "%dp0%\\node_modules\\@openai\\codex\\bin\\codex.js"\r\n' ,
407+ "utf8" ,
408+ ) ;
409+ writeFileSync (
410+ join ( shimDir , "codex.ps1" ) ,
411+ 'Write-Output "$basedir/node_modules/@openai/codex/bin/codex.js"' +
412+ "\r\n" ,
413+ "utf8" ,
414+ ) ;
415+
416+ const result = runWrapper ( fixtureRoot , [ "--version" ] , {
417+ CODEX_MULTI_AUTH_REAL_CODEX_BIN : fakeBin ,
418+ CODEX_MULTI_AUTH_PWSH_PROFILE_GUARD : "1" ,
419+ PATH : `${ shimDir } ${ delimiter } ${ process . env . PATH ?? "" } ` ,
420+ USERPROFILE : fixtureRoot ,
421+ HOME : fixtureRoot ,
422+ } ) ;
423+ expect ( result . status ) . toBe ( 0 ) ;
424+
425+ expect ( ( ) => readFileSync ( join ( shimDir , "codex.bat" ) , "utf8" ) ) . toThrow ( ) ;
426+ expect ( readFileSync ( join ( shimDir , "codex.cmd" ) , "utf8" ) ) . toContain (
427+ "node_modules\\@openai\\codex\\bin\\codex.js" ,
428+ ) ;
429+ expect ( readFileSync ( join ( shimDir , "codex.ps1" ) , "utf8" ) ) . toContain (
430+ "node_modules/@openai/codex/bin/codex.js" ,
431+ ) ;
432+ const pwshProfilePath = join (
433+ fixtureRoot ,
434+ "Documents" ,
435+ "PowerShell" ,
436+ "Microsoft.PowerShell_profile.ps1" ,
437+ ) ;
438+ expect ( readFileSync ( pwshProfilePath , "utf8" ) ) . toContain (
439+ "# >>> codex-multi-auth shell guard >>>" ,
440+ ) ;
441+ expect ( readFileSync ( pwshProfilePath , "utf8" ) ) . toContain (
442+ "CodexMultiAuthShim" ,
443+ ) ;
444+ } ,
445+ ) ;
446+
338447 it . skipIf ( process . platform !== "win32" ) (
339448 "prefers invocation-derived shim directory over PATH-decoy shim entries" ,
340449 ( ) => {
@@ -374,6 +483,7 @@ describe("codex bin wrapper", () => {
374483 const scriptPath = join ( scriptDir , "codex.js" ) ;
375484 const result = runWrapperScript ( scriptPath , [ "--version" ] , {
376485 CODEX_MULTI_AUTH_REAL_CODEX_BIN : fakeBin ,
486+ CODEX_MULTI_AUTH_WINDOWS_BATCH_SHIM_GUARD : "1" ,
377487 PATH : `${ decoyShimDir } ${ delimiter } ${ globalShimDir } ${ delimiter } ${ process . env . PATH ?? "" } ` ,
378488 USERPROFILE : fixtureRoot ,
379489 HOME : fixtureRoot ,
0 commit comments