데스크톱, 노트북, VPS 간에 Claude Code 컨텍스트를 유지하는 방법
요약
데스크톱, 노트북, VPS 등 서로 다른 기기 간에 Claude Code의 작업 컨텍스트를 유지하기 위한 자동화된 워크플로우를 소개합니다. Git과 VPS를 활용하여 세션 종료 시 지식 디렉토리를 동기화함으로써 끊김 없는 AI 코딩 환경을 구축하는 방법을 다룹니다.
핵심 포인트
- VPS를 단일 원천(Source of Truth)으로 활용한 지식 디렉토리 구축
- Git을 이용한 세션 종료 훅 및 cron 작업 기반의 자동 동기화
- CHANGELOG.md를 통한 에이전트의 콜드 스타트 컨텍스트 제공
- 기기 간 작업 메모리 부재 문제를 해결하는 실용적인 셸 스크립트 활용
저는 두 대의 컴퓨터로 작업합니다. 낮에는 데스크톱을, 밤에는 노트북을 사용합니다. 두 기기 모두 Claude Code를 실행합니다. 두 기기 모두 서로 무엇을 했는지 알아야 합니다. 지난 몇 달 동안 그 해답은 "첫 번째 기기에서 무엇을 했는지 두 번째 기기에 알려주는 것"이었는데, 이는 결국 워크플로우 (workflow)를 망가뜨리는 번거로운 작업의 전형입니다.
이것은 모든 수동 컨텍스트 전달을 마침내 대체한 설정입니다. 영리한 방식은 아니지만 효과적이며, 저는 약 6주 동안 맥락을 놓친 적이 없습니다.
제 이름은 Fillip Kosorukov입니다. 저는 몇 가지 SaaS 제품을 구축하고 있는 1인 창업자이며, AI 지원 코딩 (AI-assisted coding) 없이는 그 중 어떤 것도 출시하지 못했을 것입니다. 여기 있는 모든 것은 Ubuntu, Python 3, 그리고 약간의 셸 스크립트 (shell scripts) 위에서 실행됩니다.
정확하게 정의된 문제
Claude Code는 주어진 대화 내에서 세션 메모리 (session memory)를 가지고 있으며, 저장소 (repo)와 함께 이동하는 프로젝트별 CLAUDE.md 파일을 가지고 있습니다. 하지만 기본적으로 갖추지 못한 것은 내구성이 있는 기기 간 작업 메모리 (cross-machine working memory)입니다. 즉, "어제 다른 컴퓨터에서 X라고 결정했어"라고 말하면 이미 알고 있는 그런 종류의 메모리 말입니다.
저의 해결책은 세 부분으로 구성됩니다:
- 모든 기기가 동기화하는 VPS 상의 지식 디렉토리 (
~/knowledge/) - 해당 디렉토리를 자동으로 커밋 (commit)하고 푸시 (push)하는 세션 종료 훅 (session-end hook)
- 최신 상태를 가져오고 최근 CHANGELOG를 읽는 시작 의식 (startup ritual)
이 의식은 어느 기기에서든 1분도 걸리지 않으며, 어시스턴트 (assistant)에게 유용한 콜드 스타트 (cold-start) 상태를 제공합니다.
디렉토리 레이아웃 (Directory layout)
~/knowledge/
├── INDEX.md
├── CHANGELOG.md # 추가 전용 (append-only), 의미 있는 작업을 마칠 때마다 모든 에이전트 (agent)가 기록함
...
특별한 것은 없습니다. 제가 grep 할 수 있는 마크다운 (Markdown)입니다. 그것이 핵심입니다. 특정 사실이 존재하는지 알고 싶을 때, 저는 어떤 기기의 어떤 셸 (shell)에서든 트리 (tree)를 ripgrep 할 수 있습니다.
동기화 메커니즘 (Sync mechanism)
VPS가 신뢰할 수 있는 단일 원천 (source of truth)입니다. 데스크톱과 노트북은 복제본입니다. Git이 힘든 일을 수행합니다.
각 기기에는 Claude Code 세션이 종료될 때 실행되는 훅 (hook)이 있습니다. 다음을 실행합니다:
cd ~/knowledge
git add -A
git diff --cached --quiet || git commit -m "auto-commit: session end $(date -I)"
...
2시간마다 실행되는 cron 작업은 훅(hook)이 놓친 모든 것(크래시된 세션, SSH 연결 끊김 등)을 포착합니다:
0 */2 * * * bash ~/scripts/push_knowledge.sh
그리고 어느 기기에서든 의미 있는 작업을 시작하기 전에, 지식 디렉토리(knowledge directory)에서 git pull을 실행합니다. 어시스턴트(assistant)는 프로젝트에 부팅될 때 CHANGELOG를 가장 먼저 읽기 때문에, 어느 기기에서든 마지막으로 수행한 작업이 항상 컨텍스트(context)에 포함됩니다.
베이스를 깨끗하게 유지하는 두 가지 규칙
동기화(Sync)만으로는 충분하지 않습니다. 지식 베이스(knowledge base)가 부패하지 않아야 하며, 그렇지 않으면 동기화하는 것은 쓰레기뿐일 것입니다. 저에게 있어 핵심적인 역할을 해온 두 가지 규칙이 있습니다:
하나, 사실당 하나의 홈(One home per fact). 모든 정보 카테고리는 정확히 하나의 파일에만 존재해야 합니다. 만약 어떤 사실이 localmention/rules.md에 속한다면, 그것은 글로벌 메모리(global memory), 기술 정의(skill definition), 또는 어딘가에 있는 노트에 중복되어 존재해서는 안 됩니다. meta/sources-of-truth.md 인덱스는 에이전트(agent)와 저에게 각 지식 카테고리가 어디에 있는지 알려줍니다. 이것이 없다면, 동일한 사실에 대해 약간씩 다른 세 개의 복사본이 생기게 되고, 어떤 것이 최신인지 구분할 방법이 없게 됩니다.
둘, 작업당 두 개의 출력(Two outputs per task). 모든 실질적인 작업은 코드 변경(code change)과 지식 업데이트(knowledge update)를 모두 생성해야 합니다. 동시에, 같은 세션 내에서 이루어져야 하며, 미루어서는 안 됩니다. 이것은 초기 3주 이후 정체되는 지식 베이스와 계속 성장하는 지식 베이스를 가르는 단 하나의 규칙입니다.
대부분의 사람들이 놓치는 부분: 스크래치 노트(scratch note)
지식 트리(knowledge tree) 내의 파일 하나가 불균형할 정도로 큰 역할을 합니다: 바로 scratch.md입니다. 이는 Andrej Karpathy의 독창적인 스타일을 AI 보조 코딩에 맞게 변형한, '추가 후 검토(append-and-review)' 방식의 노트입니다.
규칙:
- 분류되지 않은 모든 생각들을 그곳에 던져 넣으세요. 아이디어, 읽어야 할 링크, 미완성된 관찰, "X를 시도해 볼까" 같은 것들 말입니다.
- 새로운 항목은 타임스탬프와 함께 맨 위에 작성합니다.
- 태그 없음. 폴더 없음. 기록 시점에서의 분류 없음.
- 매주 저는 "스크래치 검토(review scratch)"라고 말하고, 어시스턴트가 항목들을 하나씩 훑어줍니다. 각 항목에 대해 저는 유지(keep), 승격(promote) (적절한 홈—규칙, 가설, 결정 사항—으로 이동), 또는 삭제(delete) (명시적인 경우에만)를 결정합니다.
분류(classification) 결정이 필요하지 않기 때문에 캡처(Capture)는 매우 빠릅니다. 분류는 나중에 더 많은 정보가 있는 상태에서 리뷰(review) 단계 중에 이루어집니다. 대부분의 항목은 노이즈(noise)로 간주되어 결국 삭제됩니다. 진짜 패턴들은 여러 번의 리뷰를 거치며 다시 나타나고 승격(promotion)의 자격을 얻습니다.
이 파일을 시작한 것은 전체 설정에서 제가 수행한 변화 중 단일 항목으로서 가장 높은 수익률을 기록한 변화였습니다.
여기까지 오는 데 들었던 비용
여러분이 같은 실수를 반복하지 않도록, 제가 진행 과정에서 틀렸던 몇 가지 사항을 공유합니다:
- 지식 베이스(knowledge base)에 비밀 정보(secrets)를 넣지 마세요. 절대로 안 됩니다. 그것은 git에 있고, 백업되며, 여러 기기에 동기화되고, 결국에는 어딘가 공개된 곳에 도달하게 될 것입니다. 비밀 정보 저장소(secrets store)를 분리하고, 파일 이름으로만 참조하세요.
- cron, systemd 또는 훅(hooks)에 의해 실행되는 파일을 편집하기 전에 런타임 경로(runtime paths)를 확인하세요. 저는 잘못된 버전의 파일을 편집하다가 세 번이나 낭패를 보았습니다. 제 환경에서 글로벌 git 훅(git hooks)은
~/.git-hooks에 위치하며, 저장소별.git/hooks/는 작동하지 않습니다.ProtectHome설정이 된 systemd 서비스는ReadWritePaths외부에는 쓸 수 없습니다. 편집하기 전에git config --get core.hooksPath와systemctl cat <service>를 확인하세요. - 교차 게시(cross-posting)를 할 때는 플랫폼 간 시차를 두세요. 저는 먼저 Substack에 게시하고(표준 URL(canonical URL) 포함), 하루 이틀 뒤에
canonical_url이 원래 게시물을 가리키도록 설정하여 Dev.to와 Hashnode에 게시합니다. 이렇게 하면 Google이 원본을 정확하게 순위 매기고, 보조 플랫폼들이 원본으로 트래픽을 끌어옵니다. - 훅(hook) 강제 적용이 핵심입니다. 자동 커밋 훅(auto-commit hook)이 없었다면 저는 푸시(push)하는 것을 잊었을 것입니다. cron 캐치올(catch-all)이 없었다면 훅이 충돌(crash)을 놓쳤을 것입니다. 스크래치 리뷰(scratch review)가 없었다면 파일은 노이즈로 가득 찼을 것입니다. 규율은 실패하지만, 자동화는 실패하지 않습니다.
일상적인 모습
저는 밤 11시에 노트북을 닫습니다. 그러면 지식 디렉터리가 자동으로 커밋(commit)되고 푸시(push)됩니다. 다음 날 아침 데스크톱에 앉아 git pull을 하고, Claude Code 세션을 시작하면, 어젯밤에 제가 결정한 내용을 이미 알려주는 CHANGELOG와 함께 어시스턴트가 시작됩니다. 6주가 지난 지금, 저는 단 한 번도 맥락을 놓친 적이 없습니다.
여러 대의 기기에서 AI 지원 코딩 (AI-assisted coding)을 수행하고 있다면, 저는 모든 독점적인 메모리 기능을 건너뛰고 git으로 동기화되는 Markdown 트리로 시작할 것입니다. 지루할 수도 있습니다. 하지만 바로 그 점이 핵심입니다.
Fillip Kosorukov는 인디애나폴리스의 1인 창업가입니다. 자세한 내용은 fillipkosorukov.net에서 확인하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기