본문으로 건너뛰기

© 2026 Molayo

GitHub요약2026. 05. 20. 04:14

코딩 에이전트를 위한 Cross Agent Session Resumer

요약

Cross Agent Session Resumer(casr)는 Claude Code, Codex, Gemini 등 서로 다른 AI 코딩 에이전트 간의 세션을 상호 호환할 수 있게 해주는 도구입니다. 각 제공자별로 격리된 세션을 정규 중간 표현(canonical IR)으로 변환하여, 한 에이전트에서 진행하던 작업을 다른 에이전트에서 끊김 없이 재개할 수 있도록 지원합니다.

핵심 포인트

  • 제공자 간 세션 격리 문제를 해결하여 세션의 휴대성을 보장함
  • 정규 중간 표현(canonical IR)을 사용하여 다양한 에이전트 간의 데이터 변환 수행
  • 단순한 내보내기를 넘어 대상 제공자의 네이티브 형식에 맞춘 높은 충실도(fidelity) 유지
  • 원자적 쓰기 및 재읽기 검증을 통한 데이터 안전성 확보
  • Claude Code, Codex, Gemini, Cursor, Cline, Aider 등 다양한 도구 지원

코딩 에이전트(coding agents)를 위한 Cross Agent Session Resumer: 하나의 제공자(Claude Code, Codex, Gemini 등)에서 생성된 세션을 정규 세션 모델(canonical session model)로 변환하여 다른 제공자를 통해 세션을 재개합니다.

curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/cross_agent_session_resumer/main/install.sh?$(date +%s)" | bash

해당 설치 프로그램은 주요 배포 경로입니다. 플랫폼 감지, 보안 아티팩트 검증, 폴백 소스 빌드(fallback source builds), 셸 완성(shell completions), 그리고 에이전트 중심의 로컬 설정을 한 단계로 처리합니다.

문제점 (The Problem): AI 코딩 세션은 제공자별로 격리되어 있습니다. 유용한 Codex 세션을 Claude Code에서 직접 재개할 수 없으며, 그 반대도 마찬가지입니다.

해결책 (The Solution): casr

설치된 제공자 전반에서 세션을 발견하고, 이를 정규 중간 표현(canonical IR)으로 읽어 들인 다음, 대상 제공자를 위한 네이티브 세션 파일을 작성하고, 다시 읽었을 때의 충실도(fidelity)를 검증하며, 정확한 재개 명령어를 출력합니다.

기능역할
제공자 간 재개 (Cross-provider resume)casr cc resume <codex-session-id> 및 이와 유사한 변환을 한 번의 명령으로 수행
...
# 1) 사용 가능한 제공자 확인
casr providers
# 2) 모든 제공자로부터 세션 찾기
...

종속(lock-in)을 넘어서는 제공자 호환성 (Provider fungibility over lock-in): 세션은 휴대 가능한 자산입니다.
손실 있는 내보내기보다 네이티브 충실도 우선 (Native fidelity over lossy export): 작성기(writers)는 실제 제공자의 세션 형식을 대상으로 합니다.
편의성보다 안전 우선 (Safety over convenience): 원자적 쓰기(atomic writes), 충돌 확인, 다시 읽기 검증을 수행합니다.
취약한 엄격함보다 허용적인 변환 (Permissive conversion over brittle strictness): 변환이 여전히 유용한 경우 불완전한 입력에 대해 경고를 제공합니다.
기본적인 관찰 가능성 (Observability by default): 모든 파이프라인 단계에 대해 풍부한 로그와 실행 가능한 오류를 제공합니다.

기능casr수동 복사/붙여넣기읽기 전용 세션 검색 도구일회성 애드혹 (Ad-hoc) 스크립트
제공자 간 세션 변환아니요아니요부분적
...
제공자 (Provider)별칭 (Alias)읽기 (Read)쓰기 (Write)재개 명령 (Resume command)
---------------
Claude Codeccclaude --resume <session-id>
Codexcodcodex resume <session-id>
Gemini CLIgmigemini --resume <session-id>
Cursorcurcursor .
Clineclncode .
Aideraidaider --restore-chat-history
Ampampamp threads continue --execute "Continue from @<session-id>"
OpenCodeopcopencode
ChatGPTgptopen "https://chatgpt.com/c/<session-id>"
ClawdBotcwbclawdbot --resume <session-id>
Vibevibvibe --resume <session-id>
Factoryfacfactory --resume <session-id>
OpenClawoclopenclaw --resume <session-id>
Pi-Agentpipi --session <path-to-session.jsonl>

참고 사항:

  • 초기 핵심 집중 대상은 Claude Code, Codex, Gemini CLI입니다.
  • 추가적인 제공자들은 동일한 Provider 트레이트 (trait) 모델을 통해 구현됩니다.

curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/cross_agent_session_resumer/main/install.sh?$(date +%s)" | bash

이 설치 프로그램이 수행하는 작업:

기능동작
플랫폼 타겟팅 (Platform targeting)Linux/macOS + x86_64/aarch64를 감지하고 적절한 아티팩트 (artifact)를 선택합니다
...

가치 높은 설치 플래그 (installer flags):

플래그 (Flag)목적 (Purpose)
--verify설치 후 자체 테스트 (self-test) 실행
--force동일한 버전이 이미 존재하는 경우에도 재설치
--offline <tarball>에어갭 (Airgapped) 환경의 로컬 설치
--from-source소스 코드로부터 직접 빌드
--easy-mode쉘 설정 파일 (shell rc files)의 PATH 자동 업데이트
--yes비대화형 프롬프트 수락 (Non-interactive prompt acceptance)
--no-configure에이전트 스킬/래퍼 (agent skill/wrapper) 설정 건너뛰기
--no-skillClaude/Codex 스킬 설치 건너뛰기
# 예시 (Examples)
bash install.sh --verify
bash install.sh --system --easy-mode --yes
...

전체 옵션 세트를 확인하려면 bash install.sh --help를 실행하세요.

git clone https://github.com/Dicklesworthstone/cross_agent_session_resumer
cd cross_agent_session_resumer
cargo build --release
...
cargo install --path .
casr --help

cargo run -- --help

  • 제공자 (provider) 감지 확인.

casr providers

  • 검색 가능한 세션 목록 표시.

casr list --sort date --limit 50

  • 소스 세션 조사.

casr info <session-id>

  • 대상 제공자 (target provider)로 변환.

casr <target-alias> resume <session-id>

  • 대상 제공자에서 재개 (Resume).
# 예시 (Examples)
claude --resume <new-session-id>
codex resume <new-session-id>
...

글로벌 플래그 (Global flags):

--dry-run # 실제 쓰기 작업 없이 어떤 일이 일어날지 표시
--force # 기존 대상 세션 덮어쓰기 (.bak 백업 생성)
--json # 구조화된 JSON 출력
...

소스 세션을 대상 제공자 형식으로 변환하고 대상 재개 명령어를 출력합니다.

casr cc resume 019c3eae-94c3-7d73-9b2a-9edb18f1563b
casr claude resume 019c3eae-94c3-7d73-9b2a-9edb18f1563b # 표준 이름 폴백 (standard name fallback)
casr cod resume 40f2cb68-fed7-4cee-83de-2b63ba9b7813 --dry-run
...

설치된 제공자 전반의 세션 목록을 표시합니다.

casr list
casr list --provider codex
casr list --workspace /data/projects/myapp
...

변환되지 않는 세션의 상세 정보를 표시합니다.

casr info 019c3eae-94c3-7d73-9b2a-9edb18f1563b
casr info 019c3eae-94c3-7d73-9b2a-9edb18f1563b --json

제공자 감지 및 설치 증거를 표시합니다.

casr providers

셸 완성(shell completions)을 생성합니다.

casr completions bash > /tmp/casr.bash
casr completions zsh > "${fpath[1]}/_casr"
casr completions fish > ~/.config/fish/completions/casr.fish

casr는 주로 환경 변수(environment variables)를 통해 설정됩니다.

# 표준이 아닌 위치를 위한 선택적 프로바이더 홈(provider home) 재정의
export CLAUDE_HOME="$HOME/.claude"
export CODEX_HOME="$HOME/.codex"
...

핵심 모델 (개념적):

CanonicalSession
- session_id: String
- provider_slug: String
...

중요한 헬퍼(helpers):

flatten_content : 혼합된 문자열/블록 콘텐츠 표현을 정규화(normalizes)합니다.
parse_timestamp : ISO 문자열, 에포크 초(epoch seconds), 에포크 밀리초(epoch millis)를 정규화합니다.
normalize_role : 프로바이더별 역할(provider-specific roles)을 표준 역할(canonical roles)로 매핑합니다.
reindex_messages : 필터링 후 메시지 인덱스를 연속적으로 유지합니다.

Input CLI
casr <target> resume <session-id>
|
...

casr는 단순한 형식 변환 데모가 아니라, 실질적인 에이전트 핸드오프(agent handoff) 문제를 해결하기 위해 구축되었습니다.

  • 컨텍스트를 처음부터 다시 구축할 필요 없이 작업 중간에 모델을 전환할 수 있습니다.
  • 동일한 세션을 다른 CLI로 이동함으로써 프로바이더의 중단(outage)이나 속도 제한(rate limits)으로부터 복구할 수 있습니다.
  • 에이전트 페르소나(agent personas)와 도구 스택(tool stacks)을 변경하면서도 하나의 내구성 있는 트랜스크립트(durable transcript)를 유지할 수 있습니다.
  • 다음 단계에 가장 강력한 도구를 가진 프로바이더로 세션을 이동한 다음, 다시 돌아올 수 있습니다.

일반적인 예시:

  • 빠른 코드 편집을 위해 Codex에서 시작한 다음, 아키텍처 리뷰를 위해 Claude Code에서 재개합니다.
  • 긴 컨텍스트 분석을 위해 Gemini에서 시작한 다음, 구현을 위해 Codex에서 재개합니다.
  • 도구 마이그레이션(tooling migration) 후 한 프로바이더의 이전 세션을 복구하여 다른 프로바이더에서 계속 진행합니다.

casr는 두 가지 동등한 재개(resume) 스타일을 지원합니다:

  • 표준 서브커맨드(Canonical subcommand) 형식:
    casr <target> resume <session-id>

  • 축약형(Shorthand) 형식:
    casr -cc <session-id>
    , casr -cod <session-id>
    , casr -gmi <session-id>

축약형 플래그(Shorthand flags)는 clap 파싱(parsing) 전에 내부적으로 재작성되므로, 로깅(logging), JSON 출력, 그리고 에러 핸들링(error handling)은 두 형식 모두에서 동일하게 유지됩니다.

Alias 정규화(normalization)는 다음과 같은 일반적인 제공자(provider) 토큰도 허용합니다:

claudeclaude-code로 매핑됩니다.

codex-clicodex로 매핑됩니다.

gemini-cligemini로 매핑됩니다.

Resolver는 의도적으로 엄격하고 결정론적(deterministic)으로 동작합니다.

  • --source가 경로(path)로 파싱되면, casr는 제공자 스캐닝(provider scanning)을 건너뛰고 해당 경로에서 해결(resolve)합니다.
  • --source가 에일리어스(alias)로 파싱되면, casr는 해당 제공자만 검색합니다.
  • 소스 힌트가 제공되지 않으면, casr는 설치된 제공자들을 스캔하여 모든 일치 항목을 수집합니다.
  • 일치하는 항목이 없으면 SessionNotFound를 반환합니다.
  • 일치하는 항목이 하나이면 진행합니다.
  • 일치하는 항목이 여러 개이면 AmbiguousSessionId를 반환하고 후보군을 포함합니다.

경로 모드(Path mode)는 파일이 알려진 제공자 루트(provider roots) 외부에 있을 때 추가적인 폴백(fallback) 로직을 가집니다:

  • 확장자 및 파일 시그니처 휴리스틱(heuristics)을 시도합니다.
  • 휴리스틱이 실패하면, 각 제공자 파서(parser)에게 파일을 읽도록 요청합니다.
  • 성공적인 파싱 결과들을 타당성(plausibility)과 메시지 수에 따라 순위를 매깁니다.

현재 타당성을 위해서는 최소 하나 이상의 사용자 메시지와 하나 이상의 어시스턴트(assistant) 메시지가 필요합니다.

src/pipeline.rs의 변환 파이프라인(conversion pipeline)은 고정된 단계 순서를 가집니다:

  • 에일리어스로부터 대상 제공자(target provider)를 해결합니다.
  • 소스 세션(source session)을 해결합니다.
  • 소스를 정형 중간 표현(canonical IR)으로 읽어들입니다.
  • 정형 세션을 검증합니다.
  • 선택적으로 합성된 풍부화 컨텍스트(synthetic enrichment context, --enrich)를 앞에 추가합니다.
  • --dry-run 시 단락 회로(short-circuit)를 실행합니다.
  • 풍부화(enrichment)가 요청되지 않은 경우, 동일 제공자 간의 변환 시 단락 회로를 실행합니다.
  • 대상 네이티브(target-native) 세션을 작성합니다.
  • 작성된 출력을 다시 읽어 구조적 충실도(structural fidelity)를 확인합니다.

다시 읽기 검증(read-back verification)에 실패하면, casr는 작성된 파일을 롤백(roll back)하고 사용 가능한 경우 백업을 복구합니다. 이를 통해 변환 실패 시 대상 저장소에 검증되지 않은 아티팩트(artifacts)가 남지 않도록 합니다.

casr는 여러 가지 메시지 콘텐츠 형태를 허용하며 이를 정형 텍스트로 정규화합니다:

  • 일반 문자열(Plain strings).
  • 텍스트 블록 배열.
  • Codex 스타일의 input_text 블록 배열.
  • 폴백 텍스트 설명이 포함된 도구 사용(Tool-use) 블록.
  • text 또는 ChatGPT 스타일의 parts를 포함하는 객체.

이를 통해 각 프로바이더 어댑터(provider adapter)는 형식별 파싱(parsing) 로직을 작게 유지하면서도, 하나의 정형화된 메시지 표현(canonical message representation)으로 수렴할 수 있습니다.

파서(Parser)는 다음을 수용합니다:

  • 정수형 에포크 초(epoch seconds) 및 에포크 밀리초(epoch milliseconds).
  • 부동 소수점 초(Floating-point seconds).
  • 숫자 문자열(Numeric strings).
  • RFC3339 및 일반적인 ISO-8601 형식.

휴리스틱(Heuristic) 세부 사항: 100_000_000_000 미만의 값은 초(seconds)로 처리되며, 더 큰 값은 밀리초(milliseconds)로 처리됩니다.

역할(Roles)은 User, Assistant, Tool, System, 또는 Other(String)로 정규화됩니다.

데이터 재읽기 검증(Read-back verification)은 알려진 손실 가능 형식이 있는 경우 원시 역할 열거형(raw role enums) 대신 역할 버킷(role buckets)을 비교합니다. 예를 들어, 어시스턴트(assistant)가 아닌 역할을 단일한 사용자 유사 엔트리 유형으로 통합하는 프로바이더의 경우에도, 의미적 의도(semantic intent)가 보존된다면 검증을 통과합니다.

casr 쓰기 작업은 임시 파일 생성 후 이름 변경(temp-then-rename) 방식을 사용하며 롤백(rollback) 동작을 포함합니다:

  • 필요한 경우 상위 디렉터리를 생성합니다.
  • 대상이 존재하고 --force가 설정되지 않은 경우, 충돌(conflict)을 반환합니다.
  • 대상이 존재하고 --force가 설정된 경우, 대상을 중복 제거된 백업(.bak, .bak.1 등)으로 이름을 변경합니다.
  • 동일한 디렉터리의 임시 파일에 전체 내용을 작성합니다.
  • 임시 파일을 플러시(flush)하고 sync_all 합니다.
  • 임시 파일의 이름을 대상 경로로 변경합니다.

단계 중 하나라도 실패할 경우:

  • 임시 파일들이 정리됩니다.
  • 기존 백업들이 원래의 대상 경로로 복구됩니다.
  • 오류에는 디버깅을 위한 프로바이더 및 경로 컨텍스트가 포함됩니다.

list 명령은 프로젝트 로컬 분류(triage)를 우선하도록 최적화되어 있습니다.

  • 기본 범위(scope)는 현재 작업 디렉터리 프로젝트입니다.
  • --workspace를 사용하여 범위를 명시적으로 재정의할 수 있습니다.
  • 빠른 필터링을 위해 프로바이더별 경로 힌트(claude-code, gemini)가 사용됩니다.
  • list_sessions()를 지원하는 프로바이더는 비용이 많이 드는 파일 시스템 탐색(filesystem walks)을 건너뛸 수 있습니다.
  • 폴백(Fallback) 디렉터리 스캔은 깊이(depth) 및 확장자 필터에 의해 제한됩니다.

날짜별 정렬 시, 느린 스캔을 방지하기 위해 조사 크기(probe size)가 제한됩니다:

  • 워크스페이스 범위 모드(Workspace-scoped mode)는 max(limit * 3, 30)을 사용합니다.
  • 글로벌 모드(Global mode)는 max(limit * 8, 30)을 사용합니다.

Last Active

Last Active는 정형화된 대화 활동(canonical conversation activity)과 파일 수정 시간을 기준으로 계산되며, 상대적 시간(relative age)으로 표시됩니다.

  • 소스 힌트(source hint)가 없는 상태에서의 소유권 확인(ownership checks) 해상도는 O(number_of_installed_providers)입니다.

  • 경로 폴백 파싱(Path fallback parsing)은 루트 기반의 소유권 및 서명 확인이 불충분할 때만 실행됩니다.

  • 세션 트리가 매우 큰 경우 목록 생성(Listing) 작업이 I/O 집약적일 수 있으나, 탐색 제한(probe caps) 및 프로바이더 네이티브 목록 API(provider-native listing APIs)를 통해 일반적인 사용 환경에서는 제한된 범위 내에서 유지됩니다.

  • 하나의 DB 또는 파일 내에 많은 세션을 저장하는 프로바이더는 효율적인 열거(enumeration)와 더 정확한 카운팅을 위해 list_sessions()를 구현할 수 있습니다.

  • 영리한 휴리스틱(heuristics)보다는 결정론적 동작(Deterministic behavior)을 우선합니다.

  • 명시적인 에러와 롤백(rollback)을 통해 안전하게 실패(Fail safely)합니다.

  • 세션 콘텐츠를 최우선으로 보존하며, 실행 가능한 경우 프로바이더 메타데이터를 보존합니다.

  • 변환 결과가 여전히 유용한 경우에는 강제 실패(hard failure)보다는 추가적인 경고(additive warnings)를 제공하는 것을 선호합니다.

  • 새로운 프로바이더가 파이프라인 재작성을 요구하지 않도록, 하나의 트레이트(trait) 뒤에서 프로바이더 어댑터(provider adapters)를 독립적으로 유지합니다.

프로바이더를 추가하려면 src/providers/<provider>.rsProvider 트레이트(trait)를 구현하십시오:

  • detect(): 유용한 증거 문자열을 포함한 설치 탐색(installation probe).
  • session_roots()owns_session(): 발견 훅(discovery hooks).
  • read_session(): 네이티브 포맷을 정형화된 모델(canonical model)로 변환.
  • write_session(): 정형화된 모델을 네이티브 포맷으로 변환.
  • resume_command(): 변환 후 사용자가 실행해야 하는 정확한 명령.
  • list_sessions() (선택 사항): DB 기반 프로바이더를 위한 최적화된 다중 세션 열거.

새로운 프로바이더를 위한 권장 테스트 세트:

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub Codex tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0