facts

이번에 공개된 Framein(v0.0.6)은 서로 다른 AI 코딩 에이전트들이 동일한 작업 상태(work-state)를 공유하도록 돕는 로컬 레이어다. 기존의 콕핏(Cockpit)이나 프록시(Proxy) 방식과 달리, IDE나 하네스를 교체하지 않고 이미 사용 중인 에이전트 아래에 얇은 상태 층을 까는 구조를 취한다.

설치 및 실행 환경은 Node 22.5+ 버전이 필요하며, `npm install -g framein` 명령어로 설치할 수 있다. 라이선스는 MIT를 따른다. 현재 코어 기능인 스토어, 작업 계약, 검증/리스크/ship 게이트, MCP(Model Context Protocol) 서버 등이 구현되었으며, 총 249개의 테스트를 통과한 상태다.

지원하는 인터페이스는 터미널 직접 호출 외에도 에이전트별 전용 명령어를 제공한다. Claude와 Gemini에서는 `/fr:*` 슬래시 명령을 사용하며, Codex에서는 `$fr-*` 스킬로 호출한다. 이를 통해 개발자는 Claude Code, Codex, Gemini CLI 등 서로 다른 모델을 오가면서도 동일한 로컬 엔진과 상태 데이터에 접근할 수 있다.

how-it-works

Framein의 핵심 작동 방식은 '작업 계약'과 '원장'을 통한 상태 동기화다. 모델 간의 핸드오프(Handoff)를 위해 요약본을 전달하는 대신, 모든 모델이 저장소(repo) 내의 동일한 계약과 결정 기록을 읽게 한다. 전체 워크플로우는 네 가지 동사로 정의된 루프로 작동한다.

첫째, `start` 단계에서는 요청 사항을 목표, 인수 조건, 보호 영역, non-goal이 포함된 '작업 계약'으로 고정한다. 둘째, `challenge` 단계에서는 현재 구현을 맡은 '리드(lead)' 모델 외의 다른 모델에게 좁은 범위의 반론을 요청한다. 리드 모델이 한 번 응답하면 사용자가 최종 결정하며, 이는 모델의 과잉 확신을 방지하는 장치로 작동한다. 셋째, `capsule` 단계에서는 다음 리드 모델이 읽어야 할 계약, diff, 검증 결과, ADR(Architecture Decision Record), 원장(ledger)을 준비한다. 마지막으로 `ship` 단계에서는 모델의 주관적 판단이 아닌 실제 빌드, 테스트, 리스크 게이트 통과 여부로 작업을 종료한다.

데이터 구조와 인프라 설계에서는 무결성과 의존성 제거에 집중했다. 결정 기록(ADR)은 수정이나 삭제가 불가능한 'append-only' 방식으로 기록된다. 이는 후속 모델이 이전 결정 사항을 신뢰할 수 있도록 하기 위한 제약이다. 저장소는 Node 22의 내장 `node:sqlite`를 캐시로 사용하며, 정본 데이터는 git 친화적인 JSON 스냅샷 형태로 보관한다. 런타임 의존성을 0으로 설계해 외부 라이브러리 변동으로 인한 설치 오류 가능성을 차단했다. 또한, 토큰 중계나 터미널 입출력 스크래핑을 하지 않으며 인증은 각 공식 CLI가 그대로 처리하는 구조다.

implementation-impact

개발자가 실무에서 체감하는 가장 큰 변화는 모델 교체 시 발생하는 '컨텍스트 재설명' 과정의 제거다. 기존에는 Claude에서 작업하던 내용을 Codex로 옮길 때 사람이 직접 이전 시도와 실패 원인을 요약해 전달하는 '사람 클립보드' 역할을 수행해야 했다. Framein을 도입하면 다음 모델이 사용자의 요약이 아닌, 실제 기록된 사실(Fact)과 계약 내용을 직접 읽기 때문에 정보 손실이 줄어든다.

운영 측면에서는 프록시 계열 도구와 달리 자격증명을 수집하거나 구독 풀링을 하지 않으므로 보안 설정 변경이 필요 없다. 다만, Node 22.5 이상의 환경이 필수적이므로 런타임 버전 관리가 선행되어야 한다.

결과적으로 Framein은 에이전트의 성능을 높이는 도구가 아니라, 에이전트 사이의 '상태 누수'를 막는 인프라에 가깝다. 여러 모델을 교차 검증용으로 사용하는 워크플로우를 가진 개발자라면, 모델별 페르소나나 스킬팩을 유지하면서 그 하단에 공통 원장과 게이트를 배치하는 방식으로 파이프라인을 재구성할 수 있다. 관련 상세 내용은 공식 GitHub([https://github.com/framein-dev/framein])에서 확인할 수 있다.