원문 캡처 · github.com
원문 캡처 · github.com

memsaga는 Claude Code가 쓰는 기억, CLAUDE.md, 스킬과 선택한 파일을 별도 Git 저장소에 세션별로 기록한다. 변경을 되돌리고 어느 대화에서 비롯됐는지 확인할 수 있으며, GitHub 원격 저장소를 연결하면 다른 기기와도 동기화한다. 현재 지원하는 출처는 Claude Code뿐이고, 제작자는 macOS에서 일상적으로 사용 중이며 Linux는 CI와 컨테이너에서 테스트했다고 밝힌다.

Claude Code는 사용자가 직접 작성하거나 요청해 갱신하는 CLAUDE.md와, Claude가 요청이나 사용자의 수정·선호를 바탕으로 작성하는 자동 기억(Auto memory)을 각각 Markdown 파일로 저장한다. 전자는 ~/.claude/CLAUDE.md 또는 저장소 안의 CLAUDE.md에 있고, 자동 기억은 ~/.claude/projects/<project>/memory/ 아래 MEMORY.md 색인과 개별 파일로 나뉜다. 매 세션에는 MEMORY.md의 처음 200줄 또는 25KB가 로드되고, 개별 기억 파일은 Claude가 필요할 때 읽는다. 자세한 내용은 Anthropic 문서를 참조하면 된다.

자동 기억과 전역 ~/.claude/CLAUDE.md에는 기본적으로 변경 이력이 없고, 작성한 기기에만 남는다. 저장소 안의 CLAUDE.md는 해당 저장소의 버전 관리 대상이다. 이후 세션이 기억 파일을 다시 쓰거나, 같은 날 두 세션이 같은 파일을 수정하면 이전 내용이 남지 않을 수 있다. 여러 기억을 합치는 정리 작업도 되돌리기 어렵다.

memsaga는 Claude Code 훅을 등록해 변경된 파일을 사용자가 소유하는 별도 데이터 저장소에 복사하고 커밋한다. 기본 설정에서는 턴이 끝날 때 커밋하며, 편집마다 커밋하도록 바꿀 수도 있다. 커밋 메시지에는 대화 제목과 세션 ID가 들어간다. origin 원격 저장소가 있으면 기본적으로 10분에 한 번 이하로 푸시하고 세션 종료 때도 푸시한다. memsaga push로 즉시 푸시할 수 있다. 다른 기기나 GitHub에서 수정한 파일도 활성 파일에 반영한다.

저장 범위와 한계

데이터 저장소는 세 종류의 내용을 담는다.

  • Claude Code 설정 디렉터리(~/.claude)에서 읽고 쓰는 기억, CLAUDE.md, 스킬, 훅, 스크립트 등을 기본 범위에 따라 미러링한다. Claude Code가 파일을 사용하는 위치는 바꾸지 않는다. settings.json은 선택적으로 포함한다.
  • 설정 디렉터리 밖의 파일은 extra_files에 지정하면 사용자가 수정하든 Claude가 수정하든 변경을 커밋한다. 설정 디렉터리 안에 직접 만든 폴더는 dirs에 추가할 수 있다.
  • 데이터 저장소에 직접 넣은 문서와 파일도 보관한다. 도구는 자신이 복사하지 않은 파일을 삭제하지 않는다.

각 커밋에는 변경을 만든 세션의 제목과 ID가 기록된다. 저장소 하나를 여러 기기와 Claude Code 계정이 함께 사용할 수 있으며, 다른 기기나 GitHub 웹 편집기에서 바꾼 내용도 다시 활성 파일로 가져온다. 같은 줄을 양쪽에서 수정해 충돌하면 자동으로 덮어쓰지 않고 사용자에게 알린다.

기본 범위에는 대화 기록, 자격 증명, 캐시, ~/.claude.json, 플러그인, file-history, skills/synced/와 skills/.trash/가 포함되지 않는다. settings.json은 기본적으로 제외된다. memsaga는 복사하는 파일에서 비밀 정보를 검사하지 않으므로 files, dirs, extra_files에 자격 증명을 넣지 말아야 한다. 기록에는 작업 중 Claude가 습득한 정보가 포함될 수 있어 제작자는 데이터 저장소를 비공개로 유지하라고 안내한다.

대화 기록 자체는 크고 설정이라기보다 작업 내용에 해당해 memsaga가 보관하지 않는다. 기록을 더 오래 유지하려면 settings.json의 cleanupPeriodDays를 늘릴 수 있고, 검색·보관에는 funes나 fable 같은 색인 도구를 사용할 수 있다. 마켓플레이스 플러그인은 다시 설치할 수 있는 패키지라 기본 기록 대상이 아니다. settings.json을 선택적으로 미러링하면 enabledPlugins 목록은 보관할 수 있다. 자격 증명과 OAuth 토큰은 시스템 키체인이나 비밀번호 관리자에 두라고 안내한다. model, effortLevel처럼 Claude Code가 자주 다시 쓰는 설정 키는 기본적으로 저장소에서 제외해 기기별 값을 유지한다.

설정 디렉터리 밖의 폴더 전체를 extra_files로 지정하는 기능은 아직 지원하지 않는다. 해당 폴더 안의 파일을 하나씩 등록하거나, 설정 디렉터리 아래로 옮겨 dirs에 추가해야 한다. 다른 코딩 에이전트와 원격 지식 기반은 로드맵 항목이며, 현재는 Claude Code만 지원한다. 손으로 작성한 Claude Code 모드는 기본 범위가 아니므로 dirs에 추가해야 한다. 제작자는 공유하거나 본격적으로 개발하는 모드라면 별도 Git 저장소도 두라고 설명한다. 로드맵은 계획이지 약속은 아니다.

설치와 초기화

필요 조건은 macOS 또는 Linux, Git, Claude Code다. GitHub 저장소 생성에 쓰는 gh는 선택 사항이다. Claude Code에 설치를 맡기거나 직접 설치할 수 있다. Claude Code에 맡길 때는 다음 요청을 붙여넣는다. 각 단계에서 기기를 바꾸기 전에 확인하도록 지시한다.

Install memsaga for me. Follow https://raw.githubusercontent.com/grimmerk/memsaga/main/INSTALL-WITH-CLAUDE.md and ask me before each step that changes my machine.

Claude Code는 환경을 확인한 뒤 직접 설치 절차를 따르고, 데이터 저장소 위치를 포함해 각 단계 전에 묻는다. 저장소는 설치 지침과 시험 실행에서 표시된 권한 요청도 안내한다. 자동 모드에서는 권한 요청이 없었고 수동 모드에서는 11번 있었다고 기록돼 있다. 실행 전에 명령을 하나씩 확인하고 싶다면 직접 설치해야 한다.

직접 설치할 때 사전 빌드 바이너리는 Apple silicon·Intel Mac과 x86_64·arm64 Linux용으로 제공된다. 소스에서 빌드하려면 Rust 1.88 이상이 필요하다. crates.io에서 설치하는 명령은 다음과 같다.

cargo install memsaga --locked

최신 main을 설치할 때는 다음 명령을 쓴다.

cargo install --git https://github.com/grimmerk/memsaga memsaga --locked

셸로 스크립트를 전달하고 싶지 않다면 최신 릴리스에서 플랫폼에 맞는 압축 파일을 내려받아 memsaga를 PATH에 둔다. macOS에서는 브라우저가 파일을 격리 표시하고 바이너리가 공증되지 않았으므로 표시를 한 번 지워야 한다.

xattr -d com.apple.quarantine memsaga

설치 스크립트는 사전 빌드 바이너리를 ~/.cargo/bin에 설치한다. 새 터미널을 열거나 source ~/.cargo/env를 실행한 뒤 다음 단계로 진행한다. memsaga init --dry-run은 데이터 저장소 위치, 가져올 파일, 재구성할 수 있는 이력의 범위를 보여주며 파일을 쓰지 않는다. 특정 프로젝트의 기억을 저장하지 않으려면 init 전에 제외해야 한다. 예를 들어 ~/git/client와 그 하위 프로젝트, 이름이 client-로 시작하는 형제 프로젝트를 제외하는 설정은 다음과 같다.

exclude_projects = ["*-git-client", "*-git-client-*"]

이때 프로젝트 이름은 dry run에 표시된 Claude Code 디렉터리 이름을 사용한다. 초기화 단계에서 기록된 내용은 이후 제외해도 기존 이력에서 제거되지 않는다. 나중에 제외하면 새 커밋만 멈춘다.

초기화와 훅 등록은 다음 명령으로 진행한다. --skills는 사용 사례 3과 7에 쓰는 번들 스킬도 설치한다. 기존에 같은 이름의 폴더가 있으면 덮어쓰므로 먼저 이름을 바꿔야 한다.

memsaga init

memsaga install --skills

선택 사항으로 비공개 GitHub 저장소를 만들고 동기화할 수 있다. gh를 쓴다면 먼저 gh auth login을 한 번 실행한다.

gh repo create memories --private --source "$(memsaga repo)" --push

설치 후 마지막 동기화, 대기 중인 변경, 푸시 상태는 다음 명령으로 확인한다.

memsaga status

init은 ~/git, ~/code, ~/src, ~/Projects, ~/dev 가운데 처음 존재하는 폴더에 memories를 만든다. 그중 아무 폴더도 없으면 ~/memories를 사용한다. 해당 위치에 이름이 memories인 기존 memsaga 저장소가 있으면 먼저 사용한다. memsaga init --repo <path>로 다른 위치를 지정할 수 있고, dry run으로 위치를 먼저 확인할 수 있다. 같은 이름의 폴더가 이미 있지만 다른 내용이면 덮어쓰지 않고 --repo를 지정하라고 멈춘다. 초기화 전에는 훅과 다른 명령이 폴더를 건드리지 않는다. memsaga repo는 저장소 경로만 출력한다.

Claude Code 설정 경로는 CodeV를 쓰면 계정 목록에서 가져오며, 그렇지 않으면 ~/.claude를 사용한다. CLAUDE_CONFIG_DIR을 설정해 Claude Code를 실행한다면 해당 환경 변수가 설정된 곳에서 init을 실행해야 한다. 설정 디렉터리가 실제로 있고 아직 등록되지 않았으며 설정 파일에 roots 키가 전혀 없을 때만 init이 해당 경로를 추가한다. memsaga 0.1.1은 이 자동 등록을 하지 않으므로 직접 등록해야 한다. roots를 직접 나열하면 자동 검색이 꺼지므로 ~/.claude도 함께 쓰는 경우 별도로 넣어야 한다.

[[roots]]

path = "~/my-claude-config" # the folder CLAUDE_CONFIG_DIR points to

label = "claude"

only if you also use ~/.claude; each root needs its own label

[[roots]]

path = "~/.claude"

label = "claude-default"

memsaga install, memsaga status, memsaga config은 CLAUDE_CONFIG_DIR 경로가 등록되지 않았으면 경고와 추가할 설정을 출력한다. 셸에서 CLAUDE_CONFIG_DIR을 지정하지 않은 별도 계정 경로(예: ~/.claude-work)도 자동 발견되지 않으므로 roots에 등록해야 한다.

이력 확인과 복구

기본적으로 범위에 들어온 변경이 있는 턴은 끝날 때 커밋된다. 터미널에는 커밋 알림이 한 줄 표시된다. origin이 있으면 기본적으로 10분에 한 번 이하, 세션 종료 시 자동 푸시한다. 설정으로 주기를 바꿀 수 있고 memsaga push로 즉시 전송할 수 있다. origin이 없으면 이력은 해당 기기에만 남는다. gh를 쓰지 않는 경우 GitHub에서 빈 비공개 저장소를 만든 뒤 원격을 연결한다.

memsaga install --skills는 memsaga-history 스킬을 설치해 Claude에게 “지난주 CLAUDE.md에서 테스트에 대해 뭐라고 했지?” 또는 “이 기억은 언제, 왜 바뀌었지?”처럼 물을 수 있게 한다. 스킬은 Git 이력을 조회하고, 복구는 사용자가 동의한 뒤에만 수행한다. 첫 memsaga init은 보관 중인 Claude Code 세션 기록을 읽어 편집 내용을 날짜가 있는 커밋으로 재구성한다. 기록은 기본적으로 30일까지만 남으므로 dry run으로 재구성 가능한 범위를 확인해야 한다.

Git 명령을 사용하면 특정 파일의 전체 변경 이력을 볼 수 있다.

cd "$(memsaga repo)"

git log -p -- claude/CLAUDE.md

git log -p --follow -- claude/memory/HOME-git-webapp/MEMORY.md

커밋에는 변경한 세션, 계정, 작업 디렉터리 등이 기록된다. Session:의 세션 ID는 ~/.claude/projects/<slug>/<session>.jsonl의 대화 기록과 연결되며, 해당 작업 디렉터리에서 claude --resume <session>을 실행하면 대화를 다시 열 수 있다. 세션 하나가 바꾼 파일은 다음처럼 검색한다.

git -C "$(memsaga repo)" log -p --grep 'Session: <session>'

세션 제목으로 검색할 때는 다음을 쓴다.

git -C "$(memsaga repo)" log --grep 'Session-Title: .*login'

특정 줄을 누가 추가했는지 보려면 git blame을, 문구가 추가되거나 삭제된 시점을 찾으려면 git log -S를 쓴다. 한 주간의 변경 통계는 다음처럼 확인한다.

git -C "$(memsaga repo)" log --since=1.week --stat

Claude Code는 기본적으로 대화 기록을 마지막 사용 후 30일이 지나면 삭제한다. cleanupPeriodDays를 늘리면 더 오래 보관할 수 있지만, 커밋 이력은 대화 기록이 삭제돼도 남는다.

memsaga restore는 이력에서 파일을 활성 경로로 복사한다. 쓰기 전에 차이를 보여주고 확인을 요청한다.

memsaga restore claude/memory/HOME-git-webapp/notes.md --at HEAD~3

any git revision; the live path works too

memsaga restore ~/.claude/CLAUDE.md --at a1b2c3d

every mirrored file as it was then

memsaga restore --all --at a1b2c3d

삭제된 파일도 같은 방식으로 복구할 수 있다. --all은 차이가 있는 파일을 덮어쓰지만 파일을 삭제하지 않는다. Claude의 기억 정리나 CLAUDE.md 개편, 스킬 재구성 같은 변경도 세션별 커밋으로 검토하고 되돌릴 수 있다. 전체 복구는 memsaga restore --all --at <정리 작업 전 커밋>으로 할 수 있지만, --all은 정리 과정에서 새로 만들어진 파일을 삭제하지 않는다.

파일 추가와 여러 기기 동기화

설정 디렉터리 밖의 파일을 추적하려면 extra_files에 개별 경로를 지정한다.

extra_files = ["~/notes/plan.md", "~/.config/starship.toml"]

복사본은 실제 경로를 바탕으로 데이터 저장소의 extra/ 아래에 둔다. memsaga는 이 파일을 삭제하지 않으며, 다른 곳에서 만든 변경도 동기화한다. 설정 디렉터리 안의 폴더는 dirs에 추가할 수 있다. 기본 목록을 바꾸는 설정 키는 기본값을 덮어쓰므로 기존 항목을 포함해야 한다.

dirs = ["skills", "commands", "agents", "agent-memory", "rules", "output-styles",

"themes", "workflows", "hooks", "scripts", "drafts", "mods"]

exclude_paths = ["skills/synced", "skills/.trash", "mods/*/.claude-plugin/types"]

settings.json의 files에 해당 파일을 넣어야 미러링된다. 기본적으로 추적하는 설정 디렉터리 파일은 CLAUDE.md, keybindings.json, skills/, commands/, agents/, agent-memory/, rules/, output-styles/, themes/, workflows/, hooks/, scripts/와 비어 있지 않은 projects/<slug>/memory/다. 훅과 스크립트는 Claude Code가 직접 읽는 파일은 아니지만 settings.json이 가리키는 파일이므로 포함한다.

문서나 프롬프트 등은 데이터 저장소 최상위에 직접 추가할 수 있다. 계정 폴더인 claude/ 바깥에 둔 파일은 다음 검사 때 커밋되며, 직접 커밋해도 된다. 도구는 직접 추가한 파일을 삭제하지 않는다. 특정 저장소에 넣을 수 없는 번역문, 주석이 달린 사본, 초안이나 프로젝트 메모는 번들 companion-docs 스킬로 companion/<repo>/<path>에 저장할 수 있다. 일반 메모는 companion/<repo>/_notes/에 둔다. 스킬은 요약이나 번역 전에 기존 companion 문서가 있는지 확인한다. memsaga companions [repo] 또는 세션 안의 /companions로 문서 상태와 출처를 확인한다. 문서의 앞부분 메타데이터는 Google Cloud의 Markdown 지식 파일 명세인 Open Knowledge Format의 type, title, description, 출처의 sources, 작성자 generated, 상태 draft·stable·deprecated 필드를 사용한다.

여러 Claude Code 계정은 각 설정 경로를 roots로 등록한다. 각 계정은 저장소의 별도 하위 경로에 저장되고 커밋에는 계정명이 표시된다. 두 계정이 CLAUDE.md나 skills/를 심볼릭 링크로 공유하면 상대 경로 심볼릭 링크로 한 번만 저장한다. CodeV는 Claude Code 계정을 실행하는 macOS 런처이며, 설정된 roots가 없을 때 memsaga가 CodeV 계정 목록을 읽을 수 있다.

두 번째 기기에서는 기존 데이터 저장소를 복제하고 설정 파일을 복사해야 한다. 새 기기에서 memsaga init을 실행하면 별도 이력을 시작하므로 실행하지 말아야 한다. 예시는 다음과 같다.

D=~/git/memories # the path memsaga repo prints on the first machine

git clone git@github.com:<you>/memories.git "$D" # or: gh repo clone <you>/memories "$D"

mkdir -p ~/.config/memsaga && cp "$D/memsaga/config.toml" ~/.config/memsaga/config.toml

그 뒤 설치하고 memsaga restore --all --at HEAD를 실행해 변경 목록과 차이를 확인한다. 첫 실행에서는 n으로 취소하고, 다시 실행해 --yes를 지정하면 파일 내용, 실행 권한, 커밋 시각을 복원한다. 계정 사이의 공유 링크와 다른 도구 폴더를 가리키는 링크도 재생성한다. 이 명령은 파일을 삭제하지 않는다. 복원 결과를 memsaga sweep --event verify로 확인해 no changes가 나오는지 본 뒤 memsaga diff --stat이 no changes since the last commit을 출력하는지 확인한다. 검증 중 커밋이 생기면 진행하기 전에 git -C "$(memsaga repo)" show --stat으로 살펴본다. 마지막으로 memsaga install --skills를 실행하면 해당 기기의 세션도 이력을 기록하고 푸시한다.

프로젝트 기억은 두 기기에서 홈 디렉터리 기준 상대 경로가 같을 때 공유된다. 예를 들어 두 기기 모두 ~/git/webapp에 프로젝트가 있으면 사용자 이름이나 Linux의 /home/... 경로가 달라도 같은 기억 디렉터리를 쓴다.

GitHub나 다른 기기에서 바뀐 파일은 다음 프롬프트부터 세션에 반영될 수 있다. 세션 시작 시 훅은 GitHub에서 저장소 변경 여부를 확인하며, 기기별로 최대 1분에 한 번 실행된다. 각 프롬프트에서도 백그라운드 확인을 시작하고 결과는 다음 프롬프트부터 쓴다. 다른 곳에서만 바뀐 파일은 활성 파일에 반영되고, 서로 다른 줄을 바꿨으면 병합한다. 같은 줄을 바꾼 충돌은 그대로 두고 보고한다. 모델에는 변경된 줄에 대한 짧은 알림이 전달된다.

Write나 Edit 직전에는 최근 10초 안에 확인하지 않은 경우 GitHub를 다시 묻고 변경 내용을 먼저 가져온다. 새로 들어온 내용을 덮어쓸 Write는 거부하고 Claude에 파일을 다시 읽으라고 알린다. 병합할 수 없는 변경도 거부해 사용자가 처리하도록 남긴다. Read는 마지막 확인 결과를 사용하고 백그라운드에서 새로 확인하므로, 직전 1분 이내의 외부 변경은 다음 프롬프트에서야 읽힐 수 있다.

오래 사용하지 않은 기기를 다시 쓰거나 Claude Code 바깥에서 활성 파일을 편집하기 전에는 memsaga sync 또는 수신만 하는 memsaga pull을 실행할 수 있다. 충돌은 memsaga sync --take live <path> 또는 memsaga sync --take repo <path>로 한쪽을 선택하거나, 활성 파일을 직접 편집한 뒤 다시 동기화해 해결한다. 즉시 푸시는 memsaga push로 한다. 동기화 세부 설계와 측정은 문서에 있다.

명령과 동작 세부 사항

주요 명령은 다음과 같다.

  • memsaga init [--dry-run] [--repo <path>] [--no-backfill]: 저장소를 만들고 세션 기록에서 이력을 재구성한 뒤 현재 상태를 가져온다. --dry-run은 파일을 쓰지 않고 위치와 가져올 내용, 재구성 가능한 이력을 출력한다.
  • memsaga status [--json]: 마지막 검사, 대기 중인 변경, 푸시 상태, 설정 파일 누락, 이 기기와 저장소의 차이, 최근 이벤트를 보여준다. 읽기 전용이며 --json은 같은 내용을 JSON으로 출력한다.
  • memsaga log [-n <count>]: 최근 커밋을 보여준다. memsaga diff [--stat]은 다음 검사에서 커밋될 내용을 보여주며 커밋은 하지 않는다.
  • memsaga restore <path> [--at <rev>] [-y]: 이력의 파일 하나를 활성 경로로 복사하고 먼저 차이를 보여준다. memsaga restore --all --at <rev> [--prune] [-y]는 모든 등록 파일을 지정 시점으로 복원한다. 기본적으로 삭제하지 않으며 --prune을 쓰면 해당 저장소의 .git/memsaga/stale/<time>/으로 옮긴다. 범위에서 벗어난 설정 키는 유지한다.
  • memsaga sweep: 미러를 갱신하고 지금 커밋한다. memsaga push는 origin에 즉시 푸시한다. memsaga sync [--take live|repo <path>]는 양방향 변경을 커밋·병합·적용하고 푸시한다. memsaga pull [--check] [--path <file>]은 수신만 한다.
  • memsaga paths: Claude Code 프로젝트 디렉터리 이름과 실제 경로를 보여준다. memsaga config는 적용 중인 설정을, memsaga repo는 저장소 경로를 출력한다. memsaga companions [repo]는 companion 문서 목록을 보여준다.
  • memsaga install [--skills] [--skill <name>] [--root <dir>] [--no-hooks]는 훅을 등록하고 선택적으로 번들 스킬을 설치한다. memsaga uninstall [--root <dir>]는 훅을 제거한다. memsaga backfill은 세션 기록을 날짜가 있는 커밋으로 재구성한다.

훅은 PostToolUse로 파일을 쓴 턴을 표시하고 Stop에서 복사·커밋하며 SessionEnd에서 푸시한다. SessionStart, UserPromptSubmit, PreToolUse는 외부 변경을 가져온다. 저장소에는 복사본을 보관하고 Claude Code는 원래 위치의 파일을 계속 읽고 쓴다. memsaga가 활성 파일을 쓰는 경우는 사용자가 복구를 요청하거나 외부 변경을 가져올 때다. 동시에 실행되는 세션은 잠금 하나로 직렬화한다. 훅은 오류가 나도 턴을 중단하지 않으며 오류는 로그와 memsaga status에 남는다. 범위에 변화가 없는 턴은 수정 시각을 확인하고, 변화가 있으면 백그라운드에서 복사와 커밋을 수행하며 제작자 설명으로는 1초보다 훨씬 짧다. GitHub 확인은 약 0.5초 걸리고 기기별로 최대 1분에 한 번이다.

커밋 제목은 [<세션 제목>] <영역> 형식이다. 세션 제목은 32자를 넘으면 ...로 줄여 제목을 72자 이내로 유지하고, 전체 제목은 Session-Title: 줄에 기록한다. 다른 줄에는 훅이나 명령을 나타내는 Event:, 계정을 나타내는 Account:, Session:, Cwd:, Agent:가 들어간다. 프롬프트 내용은 커밋에 복사하지 않는다. 제목이 없으면 Stop:, 기록 재구성은 backfill:, 초기 스냅샷은 import:, 동기화는 sync:, 수동 작업은 manual:로 제목을 시작한다. 직접 실행한 memsaga sync 커밋에는 세션과 작업 디렉터리가 none으로 표시된다.

기본 설정 파일은 ~/.config/memsaga/config.toml이다. memsaga config는 적용 중인 값을 출력한다. 기본 구성 예시는 다음과 같다.

where init put it (example); `memsaga repo` prints yours

repo = "~/git/memories"

files = ["CLAUDE.md", "keybindings.json"]

dirs = [

"skills", "commands", "agents", "agent-memory", "rules",

"output-styles", "themes", "workflows", "hooks", "scripts",

]

memory = true

exclude = ["*.codev-bak*", "*.codev-tmp-*", ".DS_Store", "__pycache__"]

left out of the mirrored settings.json: Claude Code rewrites them on

every /model and /effort

settings_ignore_keys = ["model", "effortLevel", "modelSettings"]

exclude_projects = [] # slug globs

exclude_paths = ["skills/synced", "skills/.trash"] # root-relative subtrees

single files outside every root, e.g. "~/.config/codev/accounts.json"

extra_files = []

granularity = "turn" # or "edit": one commit per Write/Edit

reporter = true # one-line notice in the terminal after a commit

at most one push per interval on Stop; a throttled push is deferred to the

end of the window, not dropped. 0 disables pushes on Stop

push_min_interval_secs = 600

push_on_session_end = true

[[roots]]

path = "~/.claude"

label = "claude"

roots가 없으면 memsaga는 ~/.config/codev/accounts.json이 있으면 CodeV 계정 목록을 읽고, 없으면 ~/.claude를 사용한다. 이 탐색은 CLAUDE_CONFIG_DIR을 읽지 않는다. 설정 파일이 사라졌지만 저장소에 미러 복사본이 남아 있으면 기본값으로 실행되어 저장 범위가 줄어든다. 범위에서 빠진 복사본은 저장소에 남고, 설정 복구 명령을 알리는 경고가 매 턴 표시된다.

프로젝트 기억 폴더 이름은 프로젝트 경로에서 영숫자가 아닌 문자를 -로 바꾼 이름이다. 저장소에서는 홈 아래 프로젝트 경로의 홈 부분을 HOME으로 바꿔 다른 사용자명이나 /home/...을 쓰는 기기에서도 공유한다. 예외적으로 홈 경로와 비슷하게 인코딩되는 별도 경로가 있으면 구분할 수 없어 해당 기기에서는 Claude Code 이름을 유지한다. 2026-09-18 이전에는 기억을 <label>/projects/<slug>/memory/에 저장했다. 업그레이드 뒤 첫 검사가 한 번의 커밋으로 새 경로에 옮기며, 이전 경로의 이력도 restore --at으로 읽을 수 있다.

저장소에서 외부 변경을 가져올 때 저장소 쪽 파일만 바뀌었다면 그 파일을 활성 경로에 쓴다. 양쪽에서 다른 줄을 바꿨거나 같은 변경을 했다면 병합한다. 같은 줄을 다르게 수정한 충돌은 보류하고 알린다. 저장소에서 파일을 삭제했고 활성 파일은 변하지 않았다면 활성 파일도 삭제된다. 반대로 해당 기기에 한 번도 없었던 저장소 파일은 새 파일일 수 있으므로 유지한다. memsaga status는 이런 차이와 동기화 상태를 표시한다.

문제가 생기면 memsaga status에서 마지막 검사, 실패·보류된 푸시, 외부에서 들어올 파일, 설정 누락을 확인한다. 기기에 없는 파일, 저장소가 링크를 둔 위치의 폴더, 이 기기 설정이 미러링하지 않는 폴더, 없는 스크립트도 표시한다. 훅 오류는 <data repository>/.git/memsaga/memsaga.log, 검사·푸시·병합 이벤트는 그 옆의 events.jsonl에 기록한다. memsaga diff는 다음 커밋 내용을 보여주고 memsaga sweep은 즉시 커밋한다. 훅을 중지하려면 memsaga uninstall을 실행한다. 저장소와 이력은 그대로 남는다. 질문은 Discussions, 버그는 Issues에 등록할 수 있다.

업데이트와 제거

업데이트는 최신 릴리스 설치 단계를 다시 실행한 뒤 memsaga install을 실행한다. 번들 스킬을 썼다면 --skills도 지정한다. 기존 훅 항목은 갱신되고 새 버전의 훅이 추가된다. 번들 스킬은 덮어쓰며 직접 수정한 예전 내용은 이력에 남는다. memsaga --version으로 설치된 버전을 확인할 수 있고 실행 중인 세션을 재시작할 필요는 없다. 훅이 매번 새 프로세스를 시작하므로 다음 훅부터 새 바이너리를 사용한다. 여러 기기가 하나의 저장소를 공유하면 모두 업데이트해야 한다.

일반적인 설정에서 제거할 때는 memsaga uninstall로 훅을 제거한 다음 바이너리와 설정을 삭제한다. 번들 스킬을 설치했다면 ~/.claude/skills/memsaga-history, ~/.claude/skills/companion-docs, ~/.claude/skills/companions도 제거할 수 있다. 직접 파일을 넣었다면 먼저 다른 곳으로 옮겨야 한다. 설치 스크립트가 셸 시작 파일에 추가한 . "$HOME/.cargo/env" 줄은 다른 Rust 도구를 쓰지 않을 때만 제거한다. 제거 절차는 계정 설정, 설치 방식에 따라 달라질 수 있다. 이 과정은 데이터 저장소나 GitHub 사본을 건드리지 않으며, 이력이 필요 없을 때 사용자가 직접 삭제한다.

테스트와 참고 자료

cargo test는 임시 디렉터리의 가짜 설정을 대상으로 실제 바이너리를 구동하는 동작 테스트(crates/memsaga/tests/e2e.rs)와 순수 로직 단위 테스트를 실행한다. CI는 Ubuntu와 macOS에서 테스트와 cargo fmt --check, cargo clippy -D warnings를 실행한다. 설계와 동기화 자료는 아키텍처 문서, 양방향 동기화 문서, 설계 기록에서 볼 수 있다. 예제 저장소는 일주일치 변경 이력을 포함하며, 설치하지 않고 살펴볼 수 있다.