Codex에서 git, node, npm 등 외부 도구가 인식되지 않는 현상의 근본 원인과 해결책
최근 Windows 환경에서 Codex를 사용하면서 다음과 같은 이상한 문제가 발생했다: PowerShell은 정상적으로 열리지만, 평소에 아무 문제 없이 사용하던 git, node, npm 등의 명령어들이 전혀 작동하지 않았다.
처음에는 프로그램 설치 오류나 PATH 설정 누락으로 의심했으나, 실제로는 모두 올바르게 설치되어 있었고 경로도 존재했다. 이 문제의 핵심은 개별 도구에 있는 것이 아니라, Codex가 생성하는 실행 환경 자체의 환경 변수가 심각하게 손상되어 있다는 점이었다.
문제 증상 요약
Codex 내부 셸에서 다음 명령어들을 실행하면 모두 실패한다:
git --version
node --version
cmd.exe /c echo test
where.exe node
오류 메시지는 일반적으로 다음과 같다:
The term 'git' is not recognized as the name of a cmdlet, function, script file, or operable program.
심지어 cmd.exe 자체도 실행할 수 없다고 나오며, 시스템 상 존재하는 실행 파일들이 전혀 인식되지 않는 상태였다.
초기 진단: PATH는 정상인가?
가장 먼저懷疑되는 것은 PATH 환경 변수다. 하지만 확인 결과, 아래 경로들은 이미 포함되어 있었다:
C:\Program Files\Git\cmdE:\Tools\nodejs\
즉, 단순한 PATH 누락은 아니었다. 문제는 더 깊은 시스템 레벨 환경 변수에 있었다.
진짜 원인: 필수 환경 변수 누락
Codex 세션 내에서 다음 명령어로 환경 변수를 점검해보았다:
$env:PATHEXT
정상적인 Windows 시스템에서는 .COM;.EXE;.BAT;.CMD;.VBS;... 과 같이 여러 확장자가 등록되어 있어야 한다. 그러나 Codex에서는 다음과 같이 비정상적으로 축소된 값만 반환되었다:
.CPL
이는 git처럼 확장명 없이 호출되는 명령어가 git.exe로 해석되지 않음을 의미한다. 추가로 다음 중요한 환경 변수들도 사라져 있었다:
ComSpec: 기본 명령 프로세서 (예:cmd.exe) 경로SystemRoot: Windows 설치 디렉터리 (일반적으로C:\Windows)USERPROFILE: 현재 사용자 홈 경로LOCALAPPDATA: 로컬 애플리케이션 데이터 저장소
결국 Codex가 시작할 때 불완전한 환경을 로드하고 있음을 알 수 있었다.
원인 위치: config.toml 설정 분석
설정 파일을 확인한 결과, 다음 경로에서 문제가 되는 구성이 발견되었다:
C:\Users\[사용자이름]\.codex\config.toml
내용은 다음과 같았다:
[shell_environment_policy]
inherit = "core"
이 설정은 Codex가 시스템 전체 환경 대신, 일부 "핵심" 변수만 선택적으로 상속하도록 강제한다. 이론상 격리된 환경을 제공해 안정성을 높일 수 있지만, Windows에서는 오히려 필수 변수들이 제거되면서 명령어 실행 기능이 붕괴된다.
해결 방법: 환경 상속 전략 변경
문제를 해결하려면 위 설정을 다음과 같이 수정해야 한다:
수정 전
[shell_environment_policy]
inherit = "core"
수정 후
[shell_environment_policy]
inherit = "all"
이렇게 변경하면 Codex는 현재 로그인 세션의 모든 환경 변수를 그대로 상속받게 된다.
적용 및 검증
설정 변경 후, Codex를 완전히 종료하고 다시 실행해야 한다. 단순히 새 대화를 시작하는 것으로는 충분하지 않다.
재시작 후 다음 명령어들을 테스트해보면 정상 동작함을 확인할 수 있다:
git --version
node --version
cmd.exe /c "echo 환경 복구됨"
예상 출력 예시:
git version 2.40.1.windows.1
v20.12.0
환경 복구됨
또한 $env:PATHEXT를 다시 확인하면 정상적인 확장자 목록이 복원되어 있으며, ComSpec, SystemRoot 등도 모두 존재한다.
실제 개발 워크플로우 복구 테스트
환경이 복구되면 프로젝트 내에서 다음과 같은 개발 명령어도 정상 수행된다:
npm install
npm run dev
Vue.js 또는 React 기반 프로젝트에서도 개발 서버가 성공적으로 시작되며, 로컬 호스트(http://localhost:8080) 접근이 가능해진다.
혼동하기 쉬운 점: 통합 터미널 vs Agent 실행 컨텍스트
설정에서 기본 터미널을 Git Bash로 지정해도, Codex Agent가 내부적으로 명령을 실행하는 백그라운드 셸은 여전히 독립된 PowerShell 세션일 수 있다. 따라서:
- 통합 터미널 설정은 수동 터미널 창에만 영향을 준다.
- Agent의 자동 명령 실행은
config.toml의 정책에 따라 결정된다.
즉, 터미널을 Git Bash로 바꿔도 Agent가 사용하는 환경 변수가 손상되어 있으면 여전히 git이나 node를 찾지 못한다.
왜 inherit = "all"이 필요한가?
Windows는 Linux와 달리 PATHEXT와 같은 특수 변수를 통해 확장자 없는 명령어를 해석한다. 또한 ComSpec은 하위 프로세스 생성 시 명령 프로세서를 결정하며, SystemRoot는 시스템 바이너리 위치에 영향을 준다. 이러한 변수들이 누락되면, 비록 실행 파일이 디스크에 존재하더라도 OS 차원에서 호출 자체가 불가능해진다.
잠재적 부작용과 고려사항
inherit = "all"은 모든 시스템 변수를 가져오므로 다음 단점이 있을 수 있다:
- 개인 정보나 민감한 경로가 노출될 수 있음
- 환경 일관성이 떨어질 수 있음 (다른 머신에서 다르게 동작)
- 불필요한 임시 변수까지 포함됨
하지만 대부분의 사용자에게는 명령어 실행 가능성보다 이런 우려가 덜 중요하며, 필요 시 아래와 같은 세부 설정으로 미세 조정 가능하다:
[shell_environment_policy]
inherit = "subset"
include_only = ["PATH", "PATHEXT", "ComSpec", "SystemRoot", "USERPROFILE"]
exclude = ["HTTP_PROXY", "NO_PROXY"]
최종 결론
Codex에서 git, node, npm 등이 인식되지 않는 주요 원인은 설치 문제나 PATH 오류가 아니라, inherit = "core"로 인한 핵심 환경 변수 누락이다. 특히 Windows에서는 PATHEXT와 ComSpec이 필수적이므로, 다음 설정으로 변경하면 대부분의 문제를 해결할 수 있다:
[shell_environment_policy]
inherit = "all"
해당 문제를 겪는 사용자는 반드시 다음 파일을 확인하고 수정할 것을 권장한다:
C:\Users\[사용자이름]\.codex\config.toml