TRENDSHIFT 딥다이브 · 2026-06-05

claude-mem 딥다이브
— 에이전트의 장기기억, 세션이 끝나도 사라지지 않는 컨텍스트

AI 코딩 에이전트는 세션(대화 한 판)이 끝나면 그동안 쌓은 맥락을 전부 잊어버린다. claude-mem은 에이전트가 일하는 동안의 행동을 자동으로 관측(observation)으로 기록하고, AI로 의미를 압축해 요약으로 저장한 뒤, 다음 세션 시작 때 필요한 부분만 다시 주입한다. 한마디로 "에이전트에게 장기기억을 붙여주는 플러그인"이다. (저장소: thedotmack/claude-mem · TypeScript · ★ 약 7만+ (TrendShift 2026 연간 증가) · TrendShift 연간 #13 · Apache-2.0)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 레포가 무엇을 하는 물건인가.

핵심 메시지

"매번 기억을 잃는 주인공에게
붙여준, 자동으로 쓰이고 자동으로 읽히는 메모 노트."

영화 〈메멘토〉의 주인공은 몇 분이 지나면 기억이 리셋된다. 그래서 중요한 단서를 몸에 문신하고 폴라로이드에 메모를 남긴다. LLM 에이전트도 똑같다 — 세션이 끝나면 그동안의 맥락이 백지가 된다. claude-mem은 그 주인공을 대신해 일하는 동안 자동으로 메모를 남기고, 다음 판이 시작되면 관련 메모만 골라 다시 읽어준다.

조금 더 정확히 말하면, claude-mem은 Claude Code(앤트로픽의 터미널형 코딩 에이전트)를 비롯한 여러 AI 에이전트에 붙는 영속 메모리 압축 시스템(persistent memory compression system)이다. 에이전트가 파일을 읽고, 명령을 실행하고, 코드를 고치는 모든 도구 사용을 가로채 기록한 다음, 그 원본 로그를 그대로 쌓아두는 게 아니라 AI가 "무슨 일이 있었는지"를 짧은 요약으로 압축해 저장한다. 다음에 같은 프로젝트로 돌아오면, 이 요약들이 "지난 줄거리"처럼 컨텍스트에 깔린다.

용어
Context window (컨텍스트 윈도, 모델의 단기기억)
LLM이 한 번에 "볼 수 있는" 글자 묶음. 사람의 작업기억처럼 한정돼 있고, 세션이 끝나면 비워진다. claude-mem은 이 단기기억 바깥에 영구 저장소를 두고, 필요할 때만 다시 꺼내 채워준다.

중요한 점 하나 — claude-mem은 단순히 "대화 전체를 파일에 저장"하는 도구가 아니다. 핵심은 압축골라서 주입이다. 모든 걸 다시 집어넣으면 컨텍스트가 금세 꽉 차버리기 때문에, "검색 → 훑어보기 → 필요한 것만 펼치기"라는 단계적 전략(progressive disclosure)으로 토큰을 아낀다. 이 설계 철학이 이 레포의 정체성이다.

2왜 주목받는가

트렌딩 이유 · 경쟁 대비 장점.

2025~2026년 AI 코딩 에이전트가 폭발적으로 늘면서, 모두가 같은 벽에 부딪혔다 — "에이전트가 어제 한 일을 오늘 기억하지 못한다." 사람들은 임시방편으로 CLAUDE.md 같은 메모 파일을 손으로 관리했지만, 매번 갱신하기도 번거롭고 길어지면 그것대로 컨텍스트를 잡아먹었다. claude-mem은 이 문제를 자동 캡처 + AI 압축 + 의미 검색으로 풀어, "설치 한 줄"로 끝낸다는 점에서 주목받았다.

비교 항목기존 방식(수동 메모)claude-mem의 접근
기록사람이 직접 메모 파일 갱신도구 사용을 훅으로 자동 캡처
저장 형태원문 그대로 쌓임 → 비대해짐AI가 의미 요약으로 압축
다시 불러오기전체를 통째로 붙여넣기(토큰 폭증)검색 후 필요한 것만(약 10배 절약)
적용 범위한 도구에 종속Claude Code·Gemini CLI·Codex 등 다중 에이전트
기존 방식의 한계
"매 세션 처음부터 다시 설명"

새 세션을 열 때마다 "이 프로젝트는 이런 구조고, 어제 이 버그를 고쳤고…"를 사람이 다시 떠먹여야 했다. 떠먹이지 않으면 에이전트는 같은 실수를 반복하고, 다 떠먹이면 컨텍스트가 본 작업 전에 가득 찬다.

claude-mem의 해결
"지난 줄거리를 알아서 깔아준다"

세션이 시작되면 이전 세션의 요약이 자동으로 주입되고, 본문 중엔 자연어로 "지난번에 인증 버그 어떻게 고쳤지?"라고 물으면 메모리에서 검색해 답한다. 사람은 손으로 메모를 관리할 필요가 없다.

또 하나의 매력은 로컬 우선(local-first)이라는 점이다. 메모리는 내 PC의 SQLite 파일에 쌓이고, 워커 서비스도 내 컴퓨터에서 돈다. 민감한 내용은 <private> 태그로 저장에서 제외할 수 있고, localhost:37777의 웹 뷰어로 무엇이 기억됐는지 실시간으로 들여다볼 수 있다.

참고 (가치판단 아님)
$CMEM 토큰에 대한 메모
README에 따르면 제3자가 만든 BASE 체인(이더리움 L2, Coinbase) 암호화폐 토큰 $CMEM이 있고 제작자가 이를 "공식적으로 포용"한다고 적혀 있다. 코드/소프트웨어 자체와는 별개이며, 학습용으로 레포를 볼 때는 신경 쓸 필요가 없는 부분이다. 다만 오픈소스 도구에 코인이 붙는 건 흔치 않은 일이라 사실로만 짚어둔다.

3기술 스택 전체 지도

한 도구가 의외로 많은 부품을 쓴다 — 레이어별로 펼쳐본다.

claude-mem은 "플러그인 하나"처럼 보이지만, 실제로는 백그라운드 HTTP 서버 + 데이터베이스 + AI 처리기 + 웹 UI가 한 몸으로 도는 작은 시스템이다. 언어는 전부 TypeScript이고, 실행 환경으로 Node.js와 Bun을 함께 쓴다.

레이어기술 / 버전역할
언어TypeScript (ES2022 / ESNext)훅·서버·UI 모두 한 언어로.
런타임Node.js 20+ & Bun ≥ 1.0Node로 설치, Bun이 워커 프로세스를 띄우고 관리.
HTTP 서버Express.js 5 + SSE검색 API·뷰어를 제공, 실시간 스트림 푸시.
데이터베이스SQLite 3 (bun:sqlite) + FTS5세션·관측·요약 저장 + 전문(full-text) 검색.
벡터 검색Chroma (선택)의미 기반 유사도 검색(하이브리드).
AI 처리@anthropic-ai/claude-agent-sdk관측 로그를 요약으로 압축(또는 Gemini·OpenRouter).
프론트엔드React 19 + esbuild메모리 스트림 웹 뷰어(단일 HTML로 번들).
작업 큐BullMQ + ioredis관측 처리를 비동기 큐로 차곡차곡.
코드 파싱tree-sitter (20+ 문법)읽은 소스코드를 구조적으로 이해.
기타zod · MCP SDK · handlebars · better-auth · DOMPurify검증 · 도구 프로토콜 · 템플릿 · 인증 · 보안.
용어
Bun (자바스크립트 런타임 겸 프로세스 매니저)
Node.js의 대안으로 나온 빠른 JS 런타임. claude-mem은 백그라운드 워커를 Bun으로 띄워 관리한다. 없으면 자동 설치된다. 비유하자면 "앱을 대신 켜고 꺼주는 매니저".
용어
FTS5 (Full-Text Search 5, SQLite의 전문검색 엔진)
SQLite에 내장된 "본문 검색" 기능. 단어가 들어간 행을 빠르게 찾아준다. 도서관의 색인 카드처럼, "authentication"이 언급된 관측을 순식간에 끌어온다.
용어
SSE (Server-Sent Events, 서버가 미는 실시간 알림)
서버가 브라우저로 한 방향 실시간 업데이트를 흘려보내는 기술. 웹 뷰어에서 새 기억이 쌓일 때마다 화면이 저절로 갱신되는 게 이것 덕분. "라디오 방송"처럼 서버가 계속 송출하고 화면이 받아 듣는다.

4아키텍처 심화 분석

먼저 전체 그림 한 장, 그다음 데이터 한 줄기를 끝까지 따라가 본다.

claude-mem의 핵심 구조는 "훅(hook)이 기록하고, 워커(worker)가 가공한다"로 요약된다. 에이전트의 생명주기(세션 시작·프롬프트 입력·도구 사용·종료) 곳곳에 훅 스크립트가 걸려 있고, 이들이 데이터를 SQLite에 떨군다. 그러면 백그라운드 워커가 그걸 읽어 AI로 요약하고 다시 DB에 넣는다. 다음 세션의 시작 훅이 그 요약을 꺼내 컨텍스트에 깔면 한 바퀴가 완성된다.

┌──────────────────────────────────────────────────────────────┐ │ Claude Code (에이전트 본체) │ │ │ │ 세션시작 프롬프트입력 도구사용(100+회) 정지 │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌──────────────────────────────────────────────┐ │ │ │ 플러그인 훅 (Setup + 5개 생명주기 훅) │ │ │ └───────────────────────┬──────────────────────┘ │ │ stdin으로 데이터 │ │ │ ▼ │ │ ┌──────────────┐ 읽기/쓰기 ┌───────────────────────────┐ │ │ │ SQLite + │ ◀───────────▶ │ 워커 서비스 (Bun+Express)│ │ │ │ FTS5 DB │ │ port 37777 · 비동기 처리 │ │ │ └──────┬───────┘ └───────┬───────────────────┘ │ │ │ │ 관측 → 요약 압축 │ │ │ ▼ │ │ │ ┌───────────────────┐ │ │ │ │ Claude Agent SDK │ │ │ │ │ (또는 Gemini 등) │ │ │ │ └───────────────────┘ │ │ ▼ │ │ ┌──────────────┐ SSE 실시간 ┌───────────────────────────┐ │ │ │ 웹 뷰어 UI │ ◀─────────── │ 검색 API (3단계 점진 공개)│ │ │ │ (React) │ └───────────────────────────┘ │ │ └──────────────┘ │ └──────────────────────────────────────────────────────────────┘

흐름 한 줄기 따라가기 — "에이전트가 파일을 하나 고쳤다"

전체 그림만으론 감이 안 오니, 가장 흔한 동작 하나를 입력부터 출력까지 손으로 따라가 보자. 곁가지(에러 처리·엣지 케이스)는 생략하고 해피 패스만 본다.

① 에이전트가 코드 수정 도구를 실행 ↓ (Claude Code가 stdin으로 실행 데이터 전달) ② PostToolUse 훅이 발화 → bun-runner.js → worker-service.cjs "observation" ↓ ③ 워커가 그 실행을 관측(observation)으로 SQLite에 기록 (+ BullMQ 큐에 적재) ↓ ④ 워커가 큐를 비동기로 처리 → Claude Agent SDK가 "무슨 일이었나" 요약 ↓ ⑤ 요약(summary)을 다시 SQLite에 저장 → FTS5 색인 갱신 ↓ ⑥ 다음 세션 SessionStart 훅이 요약을 읽어 컨텍스트로 주입 ↓ ⑦ (원할 때) 자연어 검색 → search → timeline → get_observations 로 펼쳐봄

여기서 이 프로젝트 특유의 "정상적인 모양새" 두 가지를 짚어두면 코드가 덜 낯설다. 첫째, 모든 훅은 같은 워커로 모인다 — 훅마다 따로 로직을 두지 않고, worker-service.cjshook claude-code <이벤트> 인자를 넘겨 한 곳에서 분기한다(단일 디스패처). 둘째, 무거운 일은 전부 비동기다 — 도구를 쓸 때마다 AI 요약을 기다리면 에이전트가 느려지니, 기록만 즉시 하고 압축은 큐에서 천천히 돌린다.

설계 패턴
Progressive Disclosure (점진적 공개) — 검색의 3단계
한 번에 다 보여주지 않고 단계적으로 펼치는 패턴. ① search로 제목·ID만 담긴 가벼운 목록(결과당 50~100토큰) → ② timeline으로 관심 항목 주변 맥락 → ③ get_observations로 고른 ID만 전체 내용(결과당 500~1,000토큰). 필터링 후 펼치므로 토큰을 약 10배 아낀다. 마트에서 "목록 보고 → 관심 코너 가서 → 살 것만 장바구니" 하는 것과 같다.
설계 패턴
Lifecycle Hooks (생명주기 훅)
프로그램이 특정 순간(세션 시작·도구 사용 등)에 도달하면 자동으로 실행되도록 미리 걸어둔 스크립트. claude-mem은 Setup(버전 체크) + SessionStart·UserPromptSubmit·PreToolUse(Read)·PostToolUse·Stop의 다섯 생명주기 훅을 등록한다. "문이 열리면 불이 켜지는 센서등"처럼, 정해진 사건이 트리거다.

5디렉토리 구조 해부

소스(src/)에서 만들어 플러그인(plugin/)으로 배포되는 구조.

핵심은 두 폴더의 관계다. src/는 사람이 쓰는 TypeScript 원본이고, esbuild가 이를 번들해 plugin/ 안의 실행 스크립트로 떨어뜨린다. 마켓플레이스에 배포되는 건 plugin/ 쪽이다.

claude-mem/ ├── src/ ← TypeScript 원본 (개발용) │ ├── hooks/ 훅 구현 (esbuild로 빌드됨) │ ├── sdk/ Claude Agent SDK 연동 ★ │ ├── services/ │ │ ├── worker-service.ts 워커 진입점 (Express + SSE) ★ │ │ ├── sync/ChromaSync.ts 선택적 벡터 색인 │ │ └── sqlite/ SQLite + FTS5 저장 계층 ★ │ ├── ui/viewer/ React + TS 웹 뷰어 │ ├── shared/ 경로·기본설정 등 공용 │ └── utils/ 로깅·플랫폼·태그 처리 │ ├── plugin/ ← 배포본 (마켓플레이스로 동기화) │ ├── .claude-plugin/plugin.json │ ├── hooks/hooks.json 훅 등록 (Setup + 5개) │ ├── scripts/ 빌드된 실행 파일들 │ │ ├── version-check.js Setup 단계 마커 체크(<100ms) │ │ ├── bun-runner.js Bun 찾아 워커 실행 │ │ ├── worker-service.cjs 워커 데몬 + 훅 디스패처 ★ │ │ └── mcp-server.cjs MCP 검색 서버 │ ├── skills/ 에이전트 스킬 (mem-search 등) │ └── ui/viewer.html 자기완결 React 번들 │ ├── scripts/ 빌드·유틸 스크립트 ├── tests/ 테스트 (`bun test`) ├── docs/ Mintlify 문서 └── openclaw/ OpenClaw 연동 플러그인
경로역할
src/services/sqlite/저장의 심장 — 세션·관측·요약 CRUD와 FTS5 검색.
src/services/worker-service.ts워커의 진입점. HTTP API·SSE·비동기 처리를 모두 띄운다.
src/sdk/관측을 요약으로 압축하는 AI 처리 로직(Agent SDK 연동).
plugin/hooks/hooks.json"어떤 사건에 어떤 스크립트를 실행할지" 등록표.
plugin/scripts/worker-service.cjs실제로 도는 워커 데몬 겸 모든 훅의 단일 디스패처.
plugin/skills/mem-search자연어로 기억을 검색하는 에이전트 스킬.

6학습 포인트 (기술별)

이 레포에서 진짜 배울 만한 것 + 어느 파일을 보면 되는지.

포인트 1 · 에이전트 훅 시스템

"외부 프로그램의 생명주기에 끼어드는 법"

Claude Code 같은 호스트가 정해진 순간에 외부 스크립트를 호출하고, 그 스크립트가 stdin으로 데이터를 받아 처리하는 구조는 플러그인 개발의 정석이다. plugin/hooks/hooks.json(등록표)과 worker-service.cjs(디스패처)를 같이 읽으면 "이벤트 → 단일 처리기" 패턴이 한눈에 들어온다.

포인트 2 · SQLite FTS5 전문검색

"무거운 벡터DB 없이도 검색은 된다"

요즘은 검색 하면 곧장 벡터DB를 떠올리지만, claude-mem은 SQLite 내장 FTS5를 1차 검색으로 쓰고 Chroma는 선택이다. 가벼운 로컬 파일 하나로 전문검색을 구현하는 법(src/services/sqlite/)은 실전에서 두고두고 쓸모 있다.

포인트 3 · 토큰 예산을 의식한 검색 설계

"LLM에게는 '덜 주는' 게 기술이다"

3단계 점진적 공개(search→timeline→get_observations)는 단순한 검색이 아니라 "토큰을 아끼려고 일부러 정보를 미루는" 설계다. MCP 도구 대신 스킬+HTTP로 바꿔 세션당 ~2,250토큰을 더 아낀 사례까지, 컨텍스트 엔지니어링의 좋은 교과서다.

포인트 4 · 비동기 처리 + 작업 큐

"사용자를 안 기다리게 하는 법"

도구를 쓸 때마다 AI 요약을 동기로 기다리면 에이전트가 느려진다. 기록은 즉시, 압축은 BullMQ 큐에서 천천히 — 이 분리가 체감 속도를 살린다. 백그라운드 워커 + 큐 패턴을 실제 제품 코드로 보는 좋은 예.

훅이 워커를 부르는 핵심 연결을 코드로 보면 이렇게 단순하다(개념 예시 — 복사용 아님):

// 모든 생명주기 훅은 같은 워커에 이벤트 이름만 바꿔 넘긴다
// 예: PostToolUse 훅 → "observation" 이벤트
bun worker-service.cjs hook claude-code observation  // 도구 사용 기록
bun worker-service.cjs hook claude-code context       // 세션 시작 시 주입
bun worker-service.cjs hook claude-code summarize      // 정지 시 요약 생성

7시스템 요구사항

순수 소프트웨어 — 특별한 하드웨어는 필요 없다.

항목요구사항
Node.js20.0.0+ (README 및 package.json engines 동일)
Bun≥ 1.0 — 워커 런타임/매니저 (없으면 자동 설치)
uvPython 패키지 매니저 — 벡터 검색용 (없으면 자동 설치)
SQLite 3저장소 (번들 제공)
호스트Claude Code(플러그인 지원 최신판) · 또는 Gemini CLI · OpenCode · OpenClaw 등
OSmacOS · Linux · Windows (PowerShell 지원)
API 키요약 처리에 Anthropic/Gemini/OpenRouter 중 하나의 키
감 잡기

설치는 사실상 npx claude-mem install 한 줄, 또는 Claude Code 안에서 /plugin install이면 끝이다. Bun·uv 같은 부속은 알아서 깔리므로, "런타임을 직접 챙겨야 하나" 걱정할 필요는 거의 없다. 주의: npm install -g claude-mem은 라이브러리(SDK)만 깔고 훅·워커는 등록하지 않으니, 반드시 npx claude-mem install 또는 /plugin으로 설치한다.

8직접 해볼 수 있는 실습 과제

손으로 만져봐야 구조가 몸에 붙는다.

실습 1

설치하고 웹 뷰어 열어보기 난이도 ★☆☆ 입문

npx claude-mem install로 깔고 Claude Code를 재시작한다. 몇 번 작업한 뒤 브라우저로 http://localhost:37777에 접속해, 내 행동이 어떤 관측·요약으로 쌓이는지 실시간 스트림을 관찰한다. "무엇이 기억되는가"를 눈으로 확인하는 게 첫걸음.

실습 2

새 세션에서 "지난 줄거리" 확인 난이도 ★☆☆ 입문

한 세션에서 작은 작업을 끝낸 뒤 세션을 닫고, 새 세션을 연다. 시작 시 자동 주입되는 이전 요약을 확인하고, "지난번에 뭐 했었지?"라고 자연어로 물어 mem-search가 검색해 답하는 걸 본다.

실습 3

프라이버시 태그·설정 만지기 난이도 ★★☆ 중급

~/.claude-mem/settings.json에서 주입할 관측 개수·AI 모델·언어 모드(code--ko 같은)를 바꿔 본다. 민감 내용은 <private> 태그로 감싸 저장에서 빠지는지 확인한다. "무엇을 기억하고 무엇을 잊을지"를 직접 조율하는 연습.

실습 4

SQLite DB 들여다보기 난이도 ★★☆ 중급

~/.claude-mem/claude-mem.db를 SQLite 뷰어로 열어 sessions·observations·summaries 테이블과 FTS5 가상 테이블이 어떻게 생겼는지 본다. 검색 쿼리를 직접 날려보며 "AI 메모리가 결국 평범한 테이블"임을 체감한다.

실습 5

훅 하나 추적하기 난이도 ★★★ 고급

plugin/hooks/hooks.json에서 PostToolUse 훅이 어떤 스크립트를 부르는지 찾고, worker-service.cjsobservation 이벤트를 어떻게 분기하는지 코드로 따라간다. 가능하면 워커 로그(npm run worker:logs)를 켜고 실제 호출을 눈으로 확인.

9관련 기술 심화 학습 로드맵

claude-mem을 발판으로 "에이전트 메모리" 전반을 익히는 4주 계획.

주차주제학습 자료
1주차설치·뷰어 관찰로 전체 그림 잡기공식 문서 + 실습 1·2
2주차훅 시스템과 단일 디스패처 패턴plugin/hooks/ · worker-service.cjs · 실습 5
3주차SQLite FTS5 + 점진적 공개 검색src/services/sqlite/ · 검색 아키텍처 문서
4주차벡터 검색·임베딩으로 확장(Chroma)ChromaSync.ts · 벡터DB 기초 자료
내 도구에 메모리 이식해보기Claude Agent SDK · MCP 명세

10핵심 키워드 사전

본문에 나온 용어 빠른 참조.

용어의미
관측 (observation)에이전트의 도구 사용 한 건을 캡처한 기록 단위. 검색·인용의 기본 알갱이.
요약 (summary)관측들을 AI가 "무슨 일이었나"로 압축한 결과. 다음 세션에 주입되는 줄거리.
훅 (hook)특정 생명주기 사건에 자동 실행되는 스크립트.
워커 서비스백그라운드에서 도는 Express HTTP 서버. 기록을 받아 요약·검색을 처리.
점진적 공개search→timeline→get_observations로 단계적으로 펼쳐 토큰을 아끼는 검색 전략.
FTS5SQLite 내장 전문검색 엔진. 1차(키워드) 검색을 담당.
Chroma선택적 벡터 데이터베이스. 의미 유사도 기반 검색을 더한다(하이브리드).
MCPModel Context Protocol. 에이전트와 외부 도구를 잇는 표준 프로토콜.
Claude Agent SDK앤트로픽의 에이전트 개발 키트. 관측을 요약으로 압축하는 AI 처리에 사용.
mem-search 스킬자연어로 기억을 검색하는 에이전트 스킬(HTTP API 기반).
Endless Mode긴 세션용 "생체모방 메모리" 베타 기능.
local-first데이터·처리를 클라우드 대신 내 컴퓨터에 두는 설계 원칙.

11참고 링크