DEV Community

Cover image for Codex CLI를 osFoundry 워커로 돌리기
BBT for BBT 한국어

Posted on

Codex CLI를 osFoundry 워커로 돌리기

이 글을 따라 하고 나면 osFoundry 데스크톱 앱의 에이전트 모델이 cli:codex:agent가 된다. 작업이 그 에이전트에 넘어오면 앱이 내 Mac에서 codex exec를 띄운다. 인증은 내 ChatGPT 로그인 그대로고, 실행은 내가 허용한 폴더 안에서만 일어난다. Codex가 돌려주는 내용, 즉 추론과 실행한 명령, 마지막 메시지가 osFoundry 실행 화면에 한 줄씩 찍힌다. OpenAI API 키는 처음부터 끝까지 한 번도 안 나온다.

누가 뭘 맡나

Codex CLI osFoundry
로그인 Codex 자체 ChatGPT 로그인(codex login). 저장도 Codex가 한다 로그인 정보는 아예 안 본다. 자식 프로세스 환경에서 CODEX_API_KEY, OPENAI_API_KEY, OPENAI_BASE_URL을 빼서 실행이 구독 쪽에 머물게 한다
모델 호출 codex 프로세스에서 OpenAI로 바로 간다 비용은 0.0(구독, 종량 과금 없음)으로 기록한다
도구 작업 폴더 안에서 자체 셸과 파일 편집 자기 도구(예: memory_search)를 127.0.0.1 루프백 MCP 브리지로 제공한다. 단, git worktree로 실행이 격리될 때만
승인 실행 중엔 없다. exec는 비대화형이고 approval_policy="never" 브리지를 거치는 도구 호출은 전부 orchestrator::execute_tool과 그 정책 게이트를 통과한다
출력 완료된 아이템마다 stdout에 JSON 이벤트 한 줄(--json) 이벤트를 진행 줄이나 답 텍스트로 바꾼다. 에러용으로 stderr 끝부분을 남겨 둔다
내 파일 폴더나 worktree 안에서 읽고 쓴다 폴더는 osFoundry가 고른다. Code 화면의 저장소, 없으면 허용된 첫 번째 로컬 폴더

설정

  1. Codex CLI를 설치하고 한 번 로그인한다. osFoundry는 바이너리를 PATH, ~/.codex/bin, 그리고 /Applications/Codex.app 안에서 찾는다(cask로 설치하면 바이너리가 Contents/Resources/codex에 들어가서 which codex로는 안 잡힌다).
   codex login
Enter fullscreen mode Exit fullscreen mode
  1. 헤더의 열쇠 아이콘(툴팁은 API Keys (BYOK))을 열고 External AI(외부 AI) 탭으로 넘어간다. Codex 행에는 Installed, No live stream 배지, 그리고 자율 모델 ID가 보인다. Codex에는 채팅용 ID가 없어서 ID는 하나만 나온다.
   Codex   Installed   No live stream   Enabled
   cli:codex:agent (autonomous)
   osFoundry tools require git-worktree isolation for Codex (it trades its
   own sandbox for git safety). Point it at a git repo folder.
Enter fullscreen mode Exit fullscreen mode

External AI 탭의 Claude Code와 Codex

예시: External AI 탭의 Claude Code와 Codex

아직 로그인 전이라면 Sign in 버튼을 누르면 codex login을 실행하는 터미널이 열린다.

  1. Verify sign-in(로그인 확인)을 누른다. 실제 실행과 같은 빌더로 아주 작은 완성 한 번을 돌린다.
   codex exec "Reply with the single word: ok" \
     --json --skip-git-repo-check --ignore-user-config --ignore-rules \
     -s read-only -c 'approval_policy="never"'
Enter fullscreen mode Exit fullscreen mode

--ignore-rules는 codex exec --help에 그 플래그가 있을 때만 붙는다. 구버전은 이 플래그를 거부하고 실행 전체가 죽어 버리기 때문에, osFoundry는 바이너리에 직접 물어본다.

  1. 에이전트에 폴더를 준다. Settings → Local Folders에서 추가하면 된다. Codex가 osFoundry 자체 도구까지 쓰게 하고 싶다면 그 폴더를 git 저장소로 만들고, Code 화면에서 Enable for this workspace를 누른다. 그러면 실행마다 전용 브랜치와 작업 사본이 생긴다.

  2. Studio에서 에이전트를 열고 Model Preference를 설정한다. 피커의 CLI agents 섹션에 Codex가 cli:codex:agent(프로바이더 표기는 "External AI (subscription)")로 나온다. 에이전트가 워커 단계를 맡아야 한다면 Runtime Role을 worker로 둔다.

작업이 넘어가면 명령은 이렇게 생긴다. worktree가 없으면 Codex 자체 샌드박스를 그대로 쓴다.

codex exec "<system prompt>

User: <task>" \
  --json --skip-git-repo-check --ignore-user-config --ignore-rules \
  -C /path/to/folder -s workspace-write -c 'approval_policy="never"'
Enter fullscreen mode Exit fullscreen mode

worktree가 있으면 샌드박스 플래그가 빠지고 대신 브리지가 붙는다.

codex exec "<system prompt>

User: <task>" \
  --json --skip-git-repo-check --ignore-user-config --ignore-rules \
  -C /path/to/worktree \
  --dangerously-bypass-approvals-and-sandbox \
  -c 'mcp_servers.osfoundry.url="http://127.0.0.1:<port>/mcp"' \
  -c 'mcp_servers.osfoundry.http_headers={Authorization="Bearer <per-run token>"}'
Enter fullscreen mode Exit fullscreen mode

Codex에는 시스템 프롬프트를 넣는 플래그가 없다. 그래서 osFoundry는 에이전트의 시스템 프롬프트를 빈 줄 하나로 구분해서 대화 앞에 붙인다. 이전 턴은 그 뒤에 User: / Assistant: 대화 기록으로 이어진다.

실행 한 번

예시다. Codex가 쓰는 이벤트 줄과 osFoundry가 그걸 보고 그리는 줄을 나란히 뒀다. 문구는 설명용이지만, 이벤트 타입과 줄 형식은 코드가 실제로 매핑하는 그대로다.

$ codex exec … --json
{"type":"item.completed","item":{"type":"reasoning","text":"Check what the tests cover first."}}
{"type":"item.completed","item":{"type":"mcp_tool_call","server":"osfoundry","tool":"memory_search"}}
{"type":"item.completed","item":{"type":"command_execution","command":"npm test"}}
{"type":"item.completed","item":{"type":"file_change","path":"src/date.ts","change":"edit"}}
{"type":"item.completed","item":{"type":"agent_message","text":"Fixed the off-by-one in parseRange; 42 tests pass."}}
{"type":"turn.completed","usage":{"input_tokens":…,"cached_input_tokens":…,"output_tokens":…}}

osFoundry run
  Thinking: Check what the tests cover first.
  Using memory_search…
  Using shell — npm test
  Edited src/date.ts
  Fixed the off-by-one in parseRange; 42 tests pass.
Enter fullscreen mode Exit fullscreen mode

Codex는 브리지 도구 이름을 server와 tool 두 필드로 나눠서 준다. 그래서 줄에는 mcp__osfoundry__ 접두사 없이 memory_search만 보인다. 답은 토큰 단위가 아니라 agent_message 아이템 단위로 통째로 온다. 진행 줄은 Codex가 아직 일하는 동안에도 하나씩 뜨지만, 메시지 본문은 Codex가 그 메시지를 다 쓴 다음에야 나온다. 토큰 수는 turn.completed에서 가져온다. 여기서 input_tokens는 캐시된 부분을 빼고 센 값이라, osFoundry가 cached_input_tokens를 다시 더해서 컨텍스트 크기로 쓴다.

선은 어디에 그어져 있나

cli:codex 채팅 모드는 없다. Codex 설정에는 셸 도구를 끄는 스위치가 없어서, Codex로 "도구 없는 완성"을 돌려도 결국 셸을 든 에이전트가 된다. osFoundry는 그걸 조용히 돌리는 대신 채팅 ID 자체를 거부한다. 메시지는 "codex has no tool-less chat mode — use 'cli:codex:agent' for an autonomous run instead."다.

-s는 파일 시스템과 명령 실행에 거는 샌드박스다. workspace-write는 Codex가 쓸 수 있는 위치와 명령이 할 수 있는 일을 좁힌다. 하지만 모델이 어떤 도구를 부를 수 있는지는 막지 않고, Codex에는 --disallowedTools 같은 것도 없다. 그래서 Codex를 채널에 추가할 때 Add agent 시트에 이 하네스에서는 도구 범위를 강제할 수 없다는 안내가 뜬다.

osFoundry 도구를 쓰려면 worktree가 필요하다. 비대화형 exec에서 Codex는 승인과 샌드박스를 둘 다 우회하지 않는 한 MCP 도구 호출을 전부 취소한다. 도구별 승인 모드도, trusted project 설정도, approval_policy="never"도 결국 다 취소된다. 그래서 앱은 딱 하나를 맞바꾼다. Codex의 OS 샌드박스를 내려놓는 건 git 격리가 그 자리를 대신할 때뿐이다. worktree가 없으면 실행은 -s workspace-write를 유지하고, 브리지는 안 붙고, 실행 화면에 그렇다는 줄이 하나 찍힌다.

내 개인 Codex 설정은 끼어들지 않는다. --ignore-user-config가 ~/.codex/config.toml을 건너뛰니까, 내가 따로 설정해 둔 MCP 서버는 osFoundry 실행에 안 들어온다. 인증은 여전히 CODEX_HOME에서 읽는다. --ignore-rules는 .rules execpolicy 파일도 빼 준다.

실행마다 벽시계 기준 상한이 있다. 자율 실행은 1,800초, 로그인 확인은 300초다. 시간이 다 되면 자식 프로세스는 drop되면서 kill된다.

다음으로 해 볼 것

작은 git 저장소를 에이전트에 물리고, 워크스페이스에서 코드 에이전트를 켠 다음, 셸 명령과 osFoundry 메모리가 둘 다 필요한 작업을 던져 보자. 그러면 Using shell과 Using memory_search…가 같은 실행 안에 나란히 찍히는 걸 볼 수 있다. Model Preference가 어디 있는지는 Studio 에이전트 페이지에 나와 있고, 데스크톱 빌드는 다운로드 페이지에서 받을 수 있다.

Top comments (0)