Post

단일 프롬프트의 시대는 끝났다: oh-my-codex(OMX)가 파고든 AI 코딩의 치명적 한계와 밑바닥 아키텍처

단일 프롬프트의 시대는 끝났다: oh-my-codex(OMX)가 파고든 AI 코딩의 치명적 한계와 밑바닥 아키텍처

Project Name: oh-my-codex (OMX) Core Maintainer: Yeachan-Heo / Scalarian Key Paradigms: 멀티 에이전트 오케스트레이션, tmux 병렬 워커, Git Worktree 격리, 영구 RAG 메모리 Core Commands: $autopilot, $ulw, $ralph, $team

현업에서 AI 코딩 어시스턴트를 쓰면서 한 번쯤 이런 생각 해보셨을 겁니다. “이 녀석, 똑똑한 줄 알았는데 왜 3번째 파일만 넘어가면 방금 자기가 짠 코드의 인터페이스도 까먹지?” 복잡한 도메인 로직이 얽힌 레거시 코드를 리팩토링하려고 프롬프트를 아무리 정교하게 깎아봤자, 결국 AI는 auth.ts를 고치다가 user.ts를 망가뜨리고, 존재하지도 않는 가상의 API를 호출하는 환각(Hallucination)에 빠집니다. 결국 AI가 내 일을 대신해 주는 게 아니라, 내가 멍청한 주니어 개발자의 사수가 되어 뒤치다꺼리를 하고 있는 셈이죠. 솔직히 이럴 바엔 그냥 내가 처음부터 짜고 말지 싶었던 적이 한두 번이 아닐 겁니다. 왜 이런 일이 발생할까요? LLM 자체의 지능이 부족해서가 아닙니다. 우리가 AI를 ‘단일 스레드’와 ‘단일 컨텍스트’라는 옹졸한 감옥에 가둬놓고, 수동으로 텍스트 프롬프트나 던져주는 방식으로 잘못 사용하고 있기 때문입니다.

oh-my-codex(OMX)는 기존 Codex CLI의 치명적인 한계인 ‘컨텍스트 증발’과 ‘단일 실행 구조’를 완전히 뜯어고쳐, tmux 기반의 병렬 워커와 영구적 RAG 메모리를 통해 AI를 ‘스스로 계획하고 코딩하며 검증하는 자율적인 멀티 에이전트 개발팀’으로 탈바꿈시키는 획기적인 오케스트레이션 시스템입니다.

저는 처음 이 프로젝트의 구조를 뜯어봤을 때, 마치 초창기 Docker의 컨테이너 격리 아키텍처를 처음 봤을 때와 비슷한 전율을 느꼈습니다. 단순한 기능 나열이나 프롬프트 래퍼(Wrapper)가 아닙니다. OMX는 Codex를 실행 엔진으로 둔 채, 그 위에 복잡한 시스템 엔지니어링을 얹은 오케스트레이션 레이어입니다. 기능의 표면을 넘어 내부 아키텍처가 어떻게 동작하는지 심층적으로 파헤쳐 보겠습니다.

1. Context Pruning의 비극과 .omx/ 영구 메모리 모델 기존 Codex CLI의 가장 큰 약점은 Context Window 한계 도달 시 과거 대화 이력을 가차 없이 날려버리는 Context Pruning입니다. AI가 문맥을 잃는 순간, 프로젝트의 아키텍처 가이드라인이나 코딩 컨벤션은 허공으로 사라집니다. 이를 근본적으로 해결하기 위해 OMX는 프로젝트 루트에 .omx/ 디렉터리를 생성하고 RAG(Retrieval-Augmented Generation) 기반의 로컬 영구 메모리 시스템을 구축합니다. 컨텍스트가 초기화되더라도, OMX의 백그라운드 프로세스가 이 디렉터리 내의 project-memory.mdpriority-notepad.txt를 매번 훅(Hook)을 통해 강제 주입하여 AI가 현재 프로젝트의 핵심 컨텍스트를 절대 잊지 않게 만듭니다.

2. 단일 스레드의 한계를 부수는 tmux & Git Worktree 병렬 처리 이 시스템 아키텍처의 백미입니다. 사람이 코딩할 때 복잡한 모듈을 팀원들과 나눠서 작업하듯, OMX는 병렬 실행을 지원합니다. 예를 들어 omx team 4:executor 명령을 내리면, 백그라운드에서 tmux 세션이 4개로 쪼개집니다. 이때 4명의 워커가 동일한 파일 시스템을 동시에 바라보고 수정하면 치명적인 충돌이 나겠죠? 그래서 OMX는 .omx/team/worktrees/worker-N 경로에 메인 브랜치의 Git Worktree를 4개 복제해 완전히 독립적인 샌드박스 환경을 만듭니다. 각 에이전트는 자신만의 격리된 공간에서 코드를 작성하고 테스트한 뒤, 최종적으로 메인 브랜치에 코드를 병합(Merge)하는 고도화된 워크플로우를 가집니다.

기능적 한계 및 아키텍처 차이Raw Codex CLIoh-my-codex (OMX) 적용 시
작업 흐름 및 병렬성단일 스레드, 한 번에 하나의 파일만 순차적 생성tmux 기반 N개의 워커 병렬 실행 (Git Worktree 물리적 격리)
상태 유지 (Memory)Context Window 초과 시 이전 대화 및 시스템 맥락 증발.omx/ 디렉터리에 RAG 기반 위키 및 작업 로그 영구 보존
에이전트 역할 분담단일 LLM 인스턴스가 설계, 코딩, 디버깅을 원맨쇼로 수행PM, 설계자, 실행자, 리뷰어 등 30개 이상의 전문 Role 분담
실패 시 복구 로직컴파일 에러 발생 시 개발자가 수동 개입하여 프롬프트 재작성$ralph 루프를 통한 자가 수정 및 무한 디버깅 (포기하지 않음)

3. Hooks를 통한 네이티브 라이프사이클 제어 그렇다면 OMX는 어떻게 OpenAI Codex CLI의 코어 로직에 개입할까요? 해답은 네이티브 훅(Native Hooks)을 악용(좋은 의미로)하는 데 있습니다. OMX는 .codex/hooks.json 파일에 정의된 PreToolUsePostToolUse 훅을 통해 AI의 행동 라이프사이클을 가로챕니다. 다음은 OMX가 파일 수정 권한을 어떻게 제어하고 상태를 커밋하는지 보여주는 실제 내부 설정의 논리적 스니펫입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "hooks": {
    "PreToolUse": [
      "omx-hook-pre",
      "--check-memory-drift",
      "--sync-git-worktree"
    ],
    "PostToolUse": [
      "omx-hook-post",
      "--verify-ast-integrity",
      "--commit-state-to-omx-dir"
    ]
  }
}

이러한 훅을 통해 AI가 코드를 수정하기 직전 최신 워크트리 상태를 동기화하고, 코드 작성 후에는 AST(Abstract Syntax Tree) 무결성을 검증한 뒤 메모리 상태를 안전하게 커밋하는 치밀한 제어 루프를 완성해 냅니다.

뻔한 Hello World 예제나 계산기 만들기는 집어치웁시다. 현업에서 마주칠 법한 ‘대규모 레거시 React 클래스 컴포넌트 마이그레이션’ 시나리오를 살펴봅시다. 수십 개의 얽히고설킨 클래스 컴포넌트를 Custom Hooks 기반의 함수형 컴포넌트로 바꾸는 악랄한 작업입니다. 단순히 “이걸 함수형으로 바꿔줘”라고 단일 프롬프트를 날리는 대신, OMX에서는 다음과 같은 다단계 파이프라인을 구축합니다. 명령어: omx "ulw: convert all class components to hooks"

  1. Strategic Planning ($deep-interview & $ralplan): 먼저 Planner와 Architect 에이전트가 호출되어 프로젝트 전체를 스캔하고 의존성 트리를 파악합니다. 30개의 컴포넌트를 어떤 순서로 마이그레이션할지 5단계의 마스터 플랜(PRD)을 스스로 작성합니다.
  2. Parallel Execution ($team & tmux): 플랜이 확정되면, 최대 병렬성을 자랑하는 Ultrawork($ulw) 모드가 5개의 tmux 워커를 동시에 띄웁니다. 터미널에 omx hud --watch를 입력하면 헤드업 디스플레이가 나타나, 5개의 샌드박스에서 동시에 코드가 썰려 나가는 광경을 실시간으로 모니터링할 수 있습니다.
  3. Persistent Debugging ($ralph & $tdd): 코드가 작성되면 Tester 에이전트가 개입하여 단위 테스트를 돌립니다. 만약 클래스의 라이프사이클 메서드(componentDidMount 등)가 useEffect로 잘못 변환되어 의존성 배열 버그가 터진다면? 이때 OMX의 진가인 $ralph (포기하지 않는 디버깅 루프) 모드가 켜집니다. 이 모드는 개발자가 퇴근한 심야에도 끊임없이 에러 로그를 분석하고 코드를 롤백 및 수정하여 다음 날 아침 “All tests passed”를 띄워 놓습니다.

물론 시니어의 깐깐한 시선으로 보았을 때, 이 시스템이 완벽한 은탄환(Silver Bullet)은 아닙니다. 도입을 고려한다면 다음의 치명적인 트레이드오프를 반드시 감당해야 합니다.

  1. 무자비한 API 비용 (Token Burn Rate): 병렬 에이전트들이 각자의 RAG 컨텍스트를 유지하며 코드를 끊임없이 뱉어내는 구조는 토큰을 진공청소기처럼 빨아들입니다. 실제로 현업에서 복잡한 피처 개발에 $ulw(Ultrawork) 모드를 돌려놓고 퇴근했다가, 아침에 OpenAI API 과금이 40달러 넘게 찍힌 것을 보고 뒷목을 잡은 적이 있습니다. 비용 효율이 중요한 단순 작업이라면 반드시 단일 실행자인 eco 모드를 적절히 섞어 써야 합니다.
  2. Git Merge Conflict의 악몽: Git Worktree로 워커를 물리적으로 격리하는 아이디어는 매우 훌륭하지만, 여러 에이전트가 공통 의존성 파일(예: types.tsutils.ts)을 동시에 건드렸을 때 발생하는 병합 충돌(Merge Conflict)은 AI가 아직 매끄럽게 풀지 못합니다. 결국 개발자가 수동으로 개입해 충돌을 픽스해 줘야 하는 치명적인 병목이 종종 발생합니다.
  3. 오버엔지니어링과 과대광고 논란: 30개의 에이전트 역할과 40개 이상의 스킬 명령어(autopilot, tdd, ralph 등)를 자유자재로 다루려면 흡사 Vim이나 tmux를 처음 배울 때와 같은 극악의 러닝 커브를 겪어야 합니다. 실제로 레딧 같은 개발자 커뮤니티에서는 “갑자기 2만 개의 스타를 받은 이 프로젝트가 인위적인 과대광고(Astroturfing) 아니냐”, “단순한 LLM 래퍼를 포장한 쓰레기(Turboslop)다”라는 원색적인 비판과 논란도 존재했습니다. 모든 도구가 그렇듯, 시스템의 밑바닥 한계를 명확히 이해하지 못하고 쓰면 겉멋 든 껍데기에 불과할 수 있습니다.

oh-my-codex(OMX)가 버그 하나 없는 완벽한 구원자는 아닐지 모릅니다. 하지만 이 프로젝트가 우리에게 던지는 화두는 묵직합니다. “프롬프트를 얼마나 기가 막히게 깎느냐”의 시대는 이제 저물고, “다수의 AI 에이전트를 어떻게 오케스트레이션하여 거대한 시스템의 아키텍처적 무결성을 유지할 것인가”의 시대로 패러다임이 이동했다는 점입니다. AI 코딩은 이제 단순한 단일 파일의 자동 완성을 넘어, 다중 에이전트 기반의 자율 주행으로 넘어가고 있습니다. 현업 실무자로서 우리는 더 이상 AI에게 ‘코딩’을 직접 시키는 마이크로 매니징에 집착할 것이 아니라, 전체 시스템의 ‘설계도(PRD)’를 치밀하게 기획하고 AI 작업자들의 리소스를 효율적으로 배분하는 ‘시스템 오케스트레이터’로 진화해야 할 때입니다. 단일 프롬프트의 죽음은, 역설적으로 우리에게 진정한 AI 엔지니어링의 시작을 알리고 있습니다.

References

  • https://github.com/Yeachan-Heo/oh-my-codex
  • https://github.com/junghwaYang/oh-my-codex
  • https://github.com/sigridjineth/oh-my-codex
This post is licensed under CC BY 4.0 by the author.