Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. Alternative to claude-mem with 600x lower cost.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit cf81df8 · analyzer v28 · 1d ago
skills & prompt files 2
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 400
filesystem 47
- fs sdsrss-claude-mem-lite-cf81df8/adopt-cli.mjs :16
import { existsSync, readdirSync, statSync, mkdirSync, writeFileSync, unlinkSync, readFileSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/claudemd.mjs :19
import { readFileSync, writeFileSync, existsSync, renameSync, unlinkSync, mkdirSync, rmdirSync, readdirSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/experiment/analyze-results.mjs :11
import { readFileSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/experiment/lib/real-deps.mjs :9
import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/experiment/run-experiment.mjs :14
import { readdirSync, readFileSync, writeFileSync, appendFileSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/haiku-client.mjs :12
import { readFileSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook-context.mjs :9
import { existsSync, readFileSync, writeFileSync, renameSync, unlinkSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook-episode.mjs :5
import { readFileSync, writeFileSync, unlinkSync, readdirSync, openSync, closeSync, writeSync, renameSync, statSync, constants as fsConstants } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook-llm.mjs :5
import { existsSync, readFileSync, unlinkSync, readdirSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook-optimize.mjs :9
import { readFileSync, writeFileSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook-semaphore.mjs :5
import { readFileSync, unlinkSync, readdirSync, openSync, closeSync, writeSync, constants as fsConstants } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook-shared.mjs :7
import { existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, readdirSync, statSync, unlinkSync, chmodSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook-update.mjs :6
import { readFileSync, writeFileSync, copyFileSync, cpSync, readdirSync, existsSync, lstatSync, mkdirSync, mkdtempSync, rmSync, renameSync, chmodSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/hook.mjs :23
import { readFileSync, writeFileSync, unlinkSync, readdirSync, renameSync, statSync, existsSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/install.mjs :5
import { readFileSync, writeFileSync, existsSync, rmSync, mkdirSync, mkdtempSync, copyFileSync, cpSync, renameSync, symlinkSync, unlinkSync, readdirSync, statSync, lstatSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/atomic-write.mjs :11
import { writeFileSync, renameSync, existsSync, copyFileSync, mkdirSync, lstatSync, realpathSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/citation-tracker.mjs :13
import { readFileSync, existsSync, readdirSync, statSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/cite-back-hint.mjs :15
import { readFileSync, existsSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/db-backup.mjs :10
import { readdirSync, unlinkSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/doctor-benchmark.mjs :12
import { readFileSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/doctor-drift.mjs :11
import { existsSync, lstatSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/edge-attribution.mjs :17
import { readFileSync, existsSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/err-sampler.mjs :18
import { appendFileSync, mkdirSync, existsSync, readdirSync, statSync, unlinkSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/file-intel.mjs :13
import { statSync, openSync, readSync, closeSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/hook-telemetry.mjs :21
import { appendFileSync, mkdirSync, existsSync, readdirSync, readFileSync, statSync, unlinkSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/import-jsonl.mjs :17
import { readFileSync, statSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/metrics.mjs :19
import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/native-binding-hint.mjs :22
import { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/persist-reminder.mjs :14
import { readFileSync, existsSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/plan-reader.mjs :8
import { readdirSync, statSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/proc-lock.mjs :19
import { writeFileSync, readFileSync, unlinkSync, mkdirSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/release-digest.mjs :26
import { readFileSync, existsSync } from 'node:fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/reread-guard.mjs :14
import { statSync, openSync, readSync, closeSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/summary-extractor.mjs :12
import { readFileSync, existsSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/task-reader.mjs :28
import { readdirSync, readFileSync, statSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/tmp-fixture-sweep.mjs :15
import { readdirSync, statSync, rmSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/lib/upgrade-banner.mjs :7
import { writeFileSync, existsSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/mem-cli.mjs :38
import { readFileSync, existsSync, readdirSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/memdir.mjs :12
import { readFileSync, writeFileSync, existsSync, renameSync, unlinkSync, mkdirSync, readdirSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/plugin-cache-guard.mjs :15
import { readFileSync, writeFileSync, readdirSync, existsSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/registry-importer.mjs :9
import { mkdirSync, writeFileSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/registry-recommend.mjs :6
import { readFileSync, writeFileSync, renameSync, existsSync, mkdirSync, appendFileSync, readdirSync, unlinkSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/registry-scanner.mjs :5
import { existsSync, readdirSync, readFileSync, statSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/registry.mjs :5
import { existsSync, mkdirSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/resource-discovery.mjs :4
import { existsSync, readdirSync, statSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/schema.mjs :8
import { existsSync, mkdirSync, readdirSync, renameSync, rmSync, chmodSync } from 'fs'; - fs sdsrss-claude-mem-lite-cf81df8/server.mjs :69
import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync, readdirSync, chmodSync } from 'fs';
shell / exec 12
- shell sdsrss-claude-mem-lite-cf81df8/claudemd.mjs :160
// Function replacer (not a string): a `$`-sequence in `section` (a future template with - shell sdsrss-claude-mem-lite-cf81df8/experiment/lib/real-deps.mjs :8
import { spawnSync, execFileSync } from 'node:child_process'; - shell sdsrss-claude-mem-lite-cf81df8/haiku-client.mjs :8
import { execFileSync, spawn } from 'child_process'; - shell sdsrss-claude-mem-lite-cf81df8/hook-shared.mjs :4
import { execFileSync, spawn } from 'child_process'; - shell sdsrss-claude-mem-lite-cf81df8/hook-update.mjs :5
import { execSync, execFileSync } from 'node:child_process'; - shell sdsrss-claude-mem-lite-cf81df8/hook.mjs :251
// suppresses the detached enrichment spawn (test determinism; sibling of - shell sdsrss-claude-mem-lite-cf81df8/install.mjs :4
import { execSync, execFileSync } from 'child_process'; - shell sdsrss-claude-mem-lite-cf81df8/lib/binding-probe.mjs :9
import { execSync } from 'node:child_process'; - shell sdsrss-claude-mem-lite-cf81df8/lib/file-intel.mjs :9
// child_process/nlp/scoring-sql.) estimateContentTokens is therefore a hand- - shell sdsrss-claude-mem-lite-cf81df8/lib/git-state.mjs :5
import { execFileSync } from 'child_process'; - shell sdsrss-claude-mem-lite-cf81df8/lib/save-enrich.mjs :24
import { spawn } from 'child_process'; - shell sdsrss-claude-mem-lite-cf81df8/utils.mjs :6
import { execSync } from 'child_process';
network 5
- net sdsrss-claude-mem-lite-cf81df8/haiku-client.mjs :9
import http from 'node:http'; - net sdsrss-claude-mem-lite-cf81df8/hook-update.mjs :237
const res = await fetch(url, { signal: controller.signal, headers }); - net sdsrss-claude-mem-lite-cf81df8/hook.mjs :1404
// background worker so SessionStart never blocks on a GitHub fetch (was an - net sdsrss-claude-mem-lite-cf81df8/mem-cli.mjs :799
// Window fetch (access-count bump + project auto-scope) shared with MCP. - net sdsrss-claude-mem-lite-cf81df8/server.mjs :488
// Window fetch (access-count bump + project auto-scope) shared with CLI.
secrets 2
- secrets sdsrss-claude-mem-lite-cf81df8/haiku-client.mjs :153
if (process.env.ANTHROPIC_API_KEY) _mode = 'api'; - secrets sdsrss-claude-mem-lite-cf81df8/registry-github.mjs :63
const token = process.env.GITHUB_TOKEN;
database 3
- db sdsrss-claude-mem-lite-cf81df8/experiment/lib/seed-db.mjs :6
import Database from 'better-sqlite3'; - db sdsrss-claude-mem-lite-cf81df8/registry.mjs :4
import Database from 'better-sqlite3'; - db sdsrss-claude-mem-lite-cf81df8/schema.mjs :5
import Database from 'better-sqlite3';
declared dependencies 9
- @modelcontextprotocol/sdk@^1.26.0
- better-sqlite3@^12.6.2
- zod@^4.3.6
- @eslint/js@^10.0.1
- @vitest/coverage-v8@^4.0.18
- eslint@^10.0.0
- fast-check@^4.5.3
- knip@^6.12.1
- vitest@^4.0.18