rohitg00/agentmemory — "쓰면 이렇게 됩니다"가 아니라 hooks.json · hybrid-search.ts · local.ts를 직접 읽고 "이런 코드라서 그 결과가 나옵니다"를 확인
출처: github.com/rohitg00/agentmemory — README, Apache-2.0
"저번에 말했잖아요, 이 프로젝트는 TypeScript strict 쓰고
테스트는 vitest야." → 에이전트: "안녕하세요, 뭘 도와드릴까요?"
Claude Code, Cursor, Cline 등 모든 코딩 에이전트의 공통 고통 — 컨텍스트는 세션과 함께 증발한다.
출처: github.com/rohitg00/agentmemory — README "The Problem" 섹션
가장 흔한 해결책: CLAUDE.md에 프로젝트 규칙을 적어두기. 실제로 많이 쓰이고, 없는 것보다 훨씬 낫다. 하지만:
| 항목 | 수동 CLAUDE.md | agentmemory |
|---|---|---|
| 캡처 주체 | 사람이 직접 써야 함 | 에이전트 활동을 hooks가 자동 캡처 |
| 기억 범위 | 사람이 기억해야 쓸 수 있음 | 모든 툴 사용·결과·오류가 저장됨 |
| 검색 | 파일 전체를 컨텍스트로 주입 | 관련 부분만 하이브리드 검색으로 주입 |
| 압축 | 없음 — 계속 커짐 | 자동 압축 (BM25 + 요약) |
| 외부 서비스 | 불필요 (장점) | 불필요 — 로컬 SQLite |
출처: github.com/rohitg00/agentmemory — README 비교 섹션; 직접 분석
agentmemory의 핵심 루프 세 단계. 사람이 아무것도 하지 않아도 돌아간다.
npm install -g @agentmemory/agentmemory 또는 npx @agentmemory/agentmemory지원 환경: Claude Code (플러그인), Cursor · Gemini CLI · Cline · Goose (MCP 서버 설정), 그 외 모든 에이전트 (REST API, 주장: 128 endpoints on port 3111).
출처: github.com/rohitg00/agentmemory — README, package.json
agentmemory는 클라우드나 외부 벡터 DB를 쓰지 않는다. 모든 데이터는 로컬 SQLite와 자체 인덱스 엔진(iii-engine)에 저장된다.
memory_recall — 관련 기억 검색memory_compress_file — 파일 압축KV.observations(sessionId) → 세션별 관찰 버킷,
KV.memories → 전역 기억 버킷. HybridSearch는 두 버킷에서 결과를 조합해 반환한다 (src/state/hybrid-search.ts:293-305 확인).
단순 키워드 검색도, 단순 벡터 검색도 아니다. 세 신호를 동시에 내고 RRF(Reciprocal Rank Fusion)로 합친다.
// src/state/hybrid-search.ts (검증된 실제 코드) const RRF_K = 60; export class HybridSearch { constructor( private bm25: SearchIndex, private vector: VectorIndex | null, private embeddingProvider: EmbeddingProvider | null, private kv: StateKV, private bm25Weight = 0.4, private vectorWeight = 0.6, private graphWeight = 0.3, private rerankEnabled = process.env.RERANK_ENABLED === "true", ) { ... } // RRF 점수 계산 (combinedScore) combinedScore: effectiveBm25W * (1 / (RRF_K + bm25Rank)) + effectiveVectorW * (1 / (RRF_K + vectorRank)) + effectiveGraphW * (1 / (RRF_K + graphRank)), }
핵심: 각 검색 결과의 순위(rank)를 RRF_K+rank로 나눠 역수를 취한 뒤 가중합. 순위가 높을수록(=1에 가까울수록) 기여도 높음. RRF_K=60은 상위 순위 간 점수 차이를 완만하게 만드는 상수.
출처: src/state/hybrid-search.ts — 직접 읽어 검증한 실제 코드
이 주제가 스터디 기준(추가 과금 없음)을 통과한 이유. 기본 설정에서 외부 API 호출이 전혀 없다.
// src/providers/embedding/local.ts (검증된 실제 코드)
export class LocalEmbeddingProvider implements EmbeddingProvider {
readonly name = "local";
readonly dimensions = 384;
private extractor: Awaited<ReturnType<Pipeline>> | null = null;
async embedBatch(texts: string[]): Promise<Float32Array[]> {
const extractor = await this.getExtractor();
const output = await extractor(texts, { pooling: "mean", normalize: true });
return vectors.map((v: number[]) => new Float32Array(v));
}
private async getExtractor() {
// @ts-ignore - optional peer dependency
transformers = await import("@xenova/transformers");
return transformers.pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
}
}
모델: all-MiniLM-L6-v2 (Xenova/Transformers.js 포팅) — 384차원, 평균 풀링 + 정규화. Node.js에서 로컬 실행, 인터넷 연결 불필요.
출처: src/providers/embedding/local.ts — 직접 읽어 검증
"사용자가 아무것도 안 해도" 캡처되는 핵심: Claude Code의 hooks 시스템에 node 스크립트를 등록해 에이전트의 모든 도구 사용에 끼어들어 기록한다.
// plugin/hooks/hooks.json (검증된 실제 파일 전체 구조)
{
"hooks": {
"SessionStart": [{ "command": "node .../session-start.mjs" }],
"UserPromptSubmit":[{ "command": "node .../prompt-submit.mjs" }],
"PreToolUse": [{ "matcher": "Edit|Write|Read|Glob|Grep",
"command": "node .../pre-tool-use.mjs" }],
"PostToolUse": [{ "command": "node .../post-tool-use.mjs" }],
"PostToolUseFailure":[{ "command": "node .../post-tool-failure.mjs" }],
"PreCompact": [{ "command": "node .../pre-compact.mjs" }],
"SubagentStart": [{ "command": "node .../subagent-start.mjs" }],
"SubagentStop": [{ "command": "node .../subagent-stop.mjs" }],
"Stop": [{ "command": "node .../stop.mjs" }],
"SessionEnd": [{ "command": "node .../session-end.mjs" }]
}
}
핵심 훅 세 가지: SessionStart = 관련 기억 주입, PostToolUse = 툴 결과 캡처, PreCompact = 압축 전 중요 내용 저장.
Edit|Write|Read|Glob|Grep는 Claude Code가 파일을 읽거나 쓸 때마다 발동된다. 에이전트가 코드를 탐색하고 수정하는 모든 행위가 기억 후보가 되는 것.
사람이 "이거 기억해"라고 말하지 않아도.
출처: plugin/hooks/hooks.json — 직접 읽어 검증
| 관점 | 강점 | 한계 / 주의점 |
|---|---|---|
| 비용 | 기본값 $0 (로컬 임베딩, no-op LLM) | @xenova/transformers 설치 필요 (optional) |
| 프라이버시 | 모든 데이터 로컬 SQLite — 클라우드 전송 없음 | 로컬 디스크에 모든 에이전트 활동이 저장됨 |
| 검색 품질 | BM25+Vector+Graph RRF 융합 — 단일 방식보다 강함 | 임베딩 없으면 의미 검색 불가, BM25만 동작 |
| 노이즈 | PreCompact + 압축으로 중요도 필터링 | 저품질 관찰이 많으면 검색 정밀도 저하 가능 |
| 성숙도 | Apache-2.0, MCP/REST/플러그인 3가지 연동 | 초기 프로젝트 — API 변경 가능성 |
출처: github.com/rohitg00/agentmemory — 소스 직접 분석 기반 평가
AI 에이전트의 기억은
코드 한 줄 없이 hooks 설정만으로 자동화할 수 있다.
| 핵심 파일 | 검증된 사실 |
|---|---|
plugin/hooks/hooks.json | SessionStart · PostToolUse · PreCompact 등 12개 훅 등록, matcher: Edit|Write|Read|Glob|Grep |
src/state/hybrid-search.ts | RRF_K=60, bm25Weight=0.4, vectorWeight=0.6, graphWeight=0.3, 자동 정규화 |
src/providers/embedding/local.ts | LocalEmbeddingProvider, dimensions=384, all-MiniLM-L6-v2, mean pooling+normalize |
src/mcp/tools-registry.ts | ~56개 MCP tool 정의 (memory_recall, memory_compress_file 포함) |
memory_recall로 이전 작업이 나오는지 확인해보기.
출처: github.com/rohitg00/agentmemory — 소스 직접 검증 (2026-06)
질문 / 각자의 "에이전트에게 또 설명한 경험" 공유
출처: 위 모든 링크 — 직접 소스 분석 (2026-06-16 기준)