ctx – Claude Code와 Codex 양쪽에서 동작하는 /resume 로컬 컨텍스트 매니저
Show HN: Ctx – a /resume that works across Claude Code and Codex
TL;DR Highlight
Claude Code와 OpenAI Codex 사이에서 대화 컨텍스트를 정확하게 유지하고 브랜칭할 수 있는 로컬 CLI 도구로, AI 코딩 세션을 끊김 없이 이어가고 싶은 개발자에게 유용하다.
Who Should Read
Claude Code나 Codex를 업무에 활용하는데 세션이 끊기거나 두 AI 툴 사이를 오가는 과정에서 컨텍스트가 날아가는 문제를 겪고 있는 개발자.
Core Mechanics
- ctx는 Claude Code와 OpenAI Codex의 대화 세션을 하나의 'workstream'이라는 단위로 묶어서 관리한다. 각 workstream은 Claude conversation ID와 Codex conversation ID를 함께 바인딩해서 저장한다.
- Exact transcript binding 기능 덕분에 나중에 ctx를 다시 불러올 때 디스크에 가장 최근 저장된 채팅이 아니라, 원래 그 세션과 연결된 정확한 대화 기록을 불러온다. 이걸 'transcript drift'를 막는다고 표현한다.
- Safe branching 기능으로 현재 workstream 상태를 복사해서 새 workstream으로 브랜치할 수 있다. 브랜치 이후에는 소스 workstream과 대화 스트림이 완전히 분리되어 서로 영향을 주지 않는다.
- 저장된 workstream, 세션, 엔트리는 SQLite DB에 인덱싱되어 빠르게 검색할 수 있고, 로컬 브라우저 프론트엔드에서 시각적으로 확인할 수도 있다.
- 핀(pin) 기능으로 특정 엔트리를 항상 컨텍스트에 포함시킬 수 있고, exclude 기능으로 검색은 되지만 모델에 전달되지 않도록 제외할 수도 있다. 필요 없는 항목은 완전 삭제도 가능하다.
- 완전히 로컬 퍼스트 설계로 API 키도 없고 외부 서비스도 없다. 데이터는 평범한 SQLite 파일과 로컬 파일로 저장된다.
- 설치는 git clone 후 ./setup.sh 한 번으로 끝난다. 프로젝트 로컬 DB를 만들고, ~/.contextfun/bin에 ctx shim을 설치하며, Claude와 Codex의 skills 디렉토리에 심볼릭 링크를 연결해준다.
- Claude Code의 /resume 커맨드에서 착안한 도구로, 비슷한 기능을 두 AI 코딩 도구에 걸쳐 통합해서 제공하는 게 핵심 차별점이다.
Evidence
- /resume 기능 자체를 쓴 적이 없다는 댓글이 있었다. 변경사항을 만들고 문서화하면 세션을 새로 시작하지 resume할 일이 없다는 것인데, 이는 ctx가 타겟하는 '장기 작업 컨텍스트 유지' 니즈가 얼마나 일반적인지에 대한 의문을 제기한 것이다.
- 두 provider 간 전환 시 컨텍스트 토큰을 어떻게 처리하는지, 특히 tool/MCP 호출이나 sub-agent 결과 같은 provider별 특수 포맷을 어떻게 '정규화'하는지 묻는 기술적 질문이 있었지만 아직 명확한 답변은 없었다.
- prompt caching이 모델 간 호환이 안 된다는 점을 지적하며, ctx 방식이 다른 하네스(harness)들에 PR을 올리는 것보다 어떤 점에서 더 나은지 묻는 댓글이 있었다. 즉, cross-provider 컨텍스트 공유의 실제 이점에 대한 회의적인 시각이다.
- 여러 커스텀 AI 툴을 만들다 보니 설정을 프로젝트, 환경, OS마다 따로 관리해야 하는 피로감이 크고, Claude가 기기별로 별도 메모리를 가져서 경험이 일관되지 않다는 공감 댓글이 있었다. ctx 같은 단일 하네스 접근법의 필요성을 지지하는 의견이었다.
- workstream을 export/import할 수 있게 해서 컨텍스트를 공유하는 기능이 있으면 좋겠다는 제안이 있었다. 팀 협업 시나리오에서 컨텍스트를 넘겨주는 용도로 유용할 것이라는 맥락이었다.
How to Apply
- Claude Code로 작업하다가 특정 기능을 OpenAI Codex로 테스트해봐야 하는 경우, ctx로 workstream을 만들어두면 두 도구 간 전환 시에도 동일한 작업 컨텍스트를 유지할 수 있다. git clone 후 ./setup.sh 한 번으로 바로 시작 가능하다.
- 장기 프로젝트를 AI 코딩 툴로 진행하다가 실험적인 방향을 시도해보고 싶을 때, ctx의 브랜칭 기능을 이용하면 현재 workstream을 보존한 채 새 브랜치에서 안전하게 실험할 수 있다. 실험이 실패해도 원본 workstream은 그대로 남아있다.
- 여러 AI 세션에서 반복적으로 참조해야 하는 아키텍처 결정이나 설계 문서가 있는 경우, ctx의 pin 기능으로 해당 엔트리를 고정해두면 매번 새로 붙여넣지 않아도 항상 컨텍스트에 포함된다.
- 팀원에게 AI 코딩 세션의 진행 상황을 인계해야 하는 상황이라면, export/import 기능 구현을 기다리거나 SQLite DB 파일 자체를 공유하는 방식으로 workstream을 넘겨줄 수 있는지 검토해볼 수 있다.
Code Example
snippet
# 설치
git clone https://github.com/dchu917/ctx.git
cd ctx
./setup.sh
# setup.sh가 하는 일:
# - ./.contextfun/context.db 생성
# - ./ctx.env 작성
# - ~/.contextfun/bin에 repo 기반 ctx shim 설치
# - ~/.claude/skills 와 ~/.codex/skills에 로컬 skills 링크 연결
# 사용 예시 (README 기반)
# Claude Code에서
/ctx save feature-audit
# Codex에서
ctx resume feature-audit
# 브랜치 생성
ctx branch feature-audit feature-audit-v2Terminology
workstream하나의 작업 흐름 단위. Claude Code 세션과 Codex 세션을 묶어서 같은 작업임을 표시하는 ctx의 기본 단위.
transcript bindingAI 대화 기록(transcript)을 특정 세션 ID에 고정시켜두는 것. 이게 없으면 나중에 불러올 때 가장 최근 대화를 잘못 가져오는 'drift'가 발생할 수 있다.
transcript drift세션을 재개할 때 원래 작업하던 대화가 아닌 다른 최신 대화를 잘못 불러오는 현상. ctx가 해결하려는 핵심 문제 중 하나.
harnessAI 코딩 도구를 감싸서 추가 기능을 붙이거나 여러 도구를 통합하는 래퍼 프레임워크. Claude Code나 Codex 위에 ctx 같은 도구를 얹는 구조를 뜻한다.
prompt caching동일한 프롬프트 앞부분을 반복 전송할 때 API 비용을 아끼기 위해 캐싱하는 기능. Claude와 Codex가 각자의 캐시를 쓰기 때문에 모델 간에는 공유되지 않는다.
SQLite파일 하나로 동작하는 경량 데이터베이스. 서버 없이 로컬 파일로만 데이터를 저장할 수 있어서 ctx 같은 로컬 퍼스트 도구에 자주 쓰인다.