ccFamily
[ MENU ]
SECT. 01 // PEER · MEMORY LAYER · CLI · v0.5.6 LIVE

ccRecall/
Claude Code 的
本機工作記憶層

第一週你們決定用 SQLite 不用 MongoDB,因為不想多裝一個服務。第二週修掉一個 ImageMagick 的坑。第三週定了檔案命名規則。

然後你開新對話——Claude 一件都不記得

那些對話全躺在 ~/.claude/projects/ 的 JSONL 裡,只是下次開啟時沒人會去翻。ccRecall 負責翻:session 結束後萃取成結構化記憶,下次啟動自動帶回最多 5 筆。 本機 SQLite,無雲端,Apache-2.0。

▲ NOW · CMD · INSTALL

npm install -g @tznthou/ccrecall

SessionStart · 新對話的開頭 實際注入格式

[ccRecall memory recall]

- macOS 上 PNG 轉 webp 用 cwebp -q 85,不要用 sips——sips 對中文檔名會靜默失敗,stdout 顯示成功但沒寫檔…

- Tailwind CLI 專案:改完 src/input.css 必須跑 npm run build,因為 dist/output.css 是 committed 的…

- 部署平台從版本檔偵測 runtime,.node-version 這類檔案必須 commit,且設上界避免平台挑到太新版本…

(608 memories available — use recall_query to search more)

DESIGN NOTE // BUDGET RATIONALE

為何只給 5 筆,不是全部灌進去?

記憶庫是長尾的。全部灌進去,開場第一件事就是吃掉你的 context window,而且大半跟今天要做的事無關。

所以分兩段供應:SessionStart 自動注入最多 5 筆、<300 tokens;剩下的留在庫裡,等 Claude 對話中判斷需要,自己呼叫 recall_query 去查。

// 2026-05 校正過一次「自動注入」的誇大;2026-07 再校一次——注入是真的,只是有預算上限。

SECT. 02 // COMPONENT SPECIFICATION

三個技術選擇,每個都可被審計

// INDEX(daemon watches .jsonl) → DISTILL(Haiku, optional) → INJECT(SessionStart ≤300 tokens) → RECALL(MCP on-demand)

01 COMPONENT

Local-first

~/.ccrecall/ 全部本機 SQLite。沒有雲端、沒有 telemetry、沒有 outbound HTTP。

DEPS: SQLite (system)

SIZE: ~570 KB

NETWORK: none

02 COMPONENT

Hooks + MCP

原生整合 Claude Code lifecycle hooks(SessionStart / SessionEnd)+ MCP server 標準協議。

HOOKS: SessionStart + End

MCP: v1 protocol

SETUP: install-hooks

03 COMPONENT

Apache-2.0

程式碼公開可審。SQLite + FTS5 + Node 簡單棧,沒有黑盒 vector DB 依賴。

LICENSE: Apache-2.0

REPO: tznthou/ccRecall

AUDIT: public

SECT. 03 // TRUST CONTRACT

三條原則,寫在 README,也寫在 code

ASSERT #01

🔒 Local-first

~/.ccrecall/ SQLite 全部在你電腦上。daemon 本身零 outbound——沒有版本檢查、沒有 telemetry、沒有帳號。唯一會出網的是可選的 session 後萃取,而且走你自己的 Claude CLI,不開就完全離線。 對合規派(FinTech / Healthcare / Gov):可丟進公司 backup policy,不需過 InfoSec review。

ASSERT #02

📜 Open source

GitHub: tznthou/ccRecall — 程式碼公開可審。社群 issue / PR 歡迎。 License 不會悄悄改成 BSL/SSPL(明確承諾條款)。

ASSERT #03

🧰 Claude-Code-native

原生整合 Claude Code lifecycle hooks + MCP server。不依賴 IDE、不鎖定 vendor、不需要 cloud account。 與 Claude Code 自動相容(hooks API 為 first-class 整合對象)。

SECT. 04 // WORKFLOW · INDEX → DISTILL → INJECT → RECALL

跑完 4 步能用,第 5 步才會自己長

npm install / install-daemon / mcp add / install-hooks 四步做完,你拿到的是索引、啟動注入、跟手動 recall_save記憶還不會自己長出來——那是第 5 步的事:一個可選的萃取 wrapper,session 結束後讓 Haiku 讀完整段對話,抽 0–5 筆存進庫裡,一次約 $0.001。

→ 01 INSTALL

安裝

npm 一行裝好 ccmemccmem-mcp。後續還有 3 步:daemon、MCP、hooks 各設一行命令,外加一步可選的萃取 wrapper。完整教學 →

CMD: npm i -g @tznthou/ccrecall

BIN: ccmem + ccmem-mcp

NEXT: 3 steps + 1 optional

→ 02 EXTRACT

萃取

daemon 透過 chokidar 盯住 ~/.claude/projects/ 的 JSONL,幾秒內偵測到新 session 並建索引;SessionEnd hook 負責確認這一步沒漏掉。真正把對話煉成記憶的是那個可選的萃取 wrapper——session 結束後 Haiku 讀完整段,抽出 0–5 筆(~$0.001/session)。v0.4.1+ 支援跨專案記憶——兩個專案共用 topic 時,高信心記憶自動跨界浮出。

HOOK: SessionEnd(確認索引)

DISTILL: Haiku via wrapper(可選)

STORE: ~/.ccrecall/ccrecall.db

INDEX: FTS5 full-text

→ 03 RECALL

召回

下個 session 啟動時,SessionStart hook 自動注入最多 5 筆、300 tokens 以內。挑法分三層:先給冷記憶輪替的機會(v0.5.5 起排除近期已注入的,免得同幾筆長期霸榜),再補近期高信心的,不足才用 FTS 補齊。對話進行中,MCP recall_query / recall_context 由 Claude 自己判斷時機按需查。

HOOK: SessionStart

MCP: recall_query / recall_context / recall_save

BUDGET: ≤5 rows · ≤300 tokens

SELECT: cold-rotate → confidence → FTS

// INVARIANTS: LOCAL-FIRST · NO-CLOUD · NO-TELEMETRY · USER-OWNS-DATA

DESIGN NOTE // WHAT WE CUT AND WHY

我們建過一道信任閘門,後來自己拆了。

v0.3.0 的設計是兩層:機器自動抓的東西先進低信任的 session_journal,你手動 review、promote,才升到 AI 搜得到的 memories。理由聽起來很對——規則式評分會誤抓,寧願少抓不要錯抓。

0

PROMOTIONS · EVER

177

STUCK IN QUEUE

跑了兩個多月,資料給的答案是上面這兩個數字。沒有一筆被升級過。它不是閘門,是 dead-letter queue。

所以 v0.5.0 把整條砍掉——連同餵養它的 rule scorer、8 個沒有呼叫者的 endpoint、還有那張佔掉 65% 資料庫的簿記表。真正在跑的路徑其實一直是另一條:session 結束後 Haiku 萃取 → keyed memories → 下次啟動注入。

// 設計文件寫得再有道理,也不如自己的資料。閘門沒人走,就不是閘門。

SECT. 05 // STORAGE FORMAT · WHAT YOU ACTUALLY GET

SQLite 是抽屜,markdown 是紙條

常見的第一個問題是「記憶到底存成什麼」。答案分兩層:載體是一個 .db 檔,內容是純文字。抽屜不認識紙條上寫什麼,它就只是個 TEXT 欄位。

SAMPLE ROW memories.content
**規則**: macOS 上 PNG 轉 webp 用 cwebp -q 85,
不要用 sips。

**Why**: sips 對中文檔名的 webp 轉換會靜默失敗
——stdout 顯示成功,但目標路徑沒有檔案,
也沒有 stderr。

**How to apply**:
1. brew install webp
2. cwebp -q 85 input.png -o output.webp

// 粗體、列表、code block 都是 markdown 語法,
// 但 SQLite 完全當普通文字存。

VS. 其他存法

Obsidian

每條記憶一個 .md 檔,散在資料夾裡

Notion

雲端資料庫 + block 結構

ccRecall

一個 SQLite 檔,一條記憶一個 row

代價是你不能用 Obsidian 直接打開來看。換到的是全文索引秒回、信心值跟存取次數用 SQL 直接查、備份就是複製一個檔案。

v0.5.3 · CJK

中文對話一樣有 topic 索引

早期版本的 topic 抽取只認得拉丁詞邊界,整段中文對話會抽出零個 topic——中文使用者等於少拿了跨專案浮出跟元認知查詢這兩件事。v0.5.3 把中文納進斷詞規則(\p{Script=Han} + 32 條停用詞 + 助詞切分)。

生產資料實測 中文 topic 0 772 總索引只膨脹 1.09 倍
⚠ NOT JUST NPM INSTALL

實作步驟比想像的多 / 完整 4 + 1 步教學

npm install 只是第一步——daemon、MCP、hooks 還要各設一行命令才會跑起來,再加一步可選的萃取 wrapper,記憶才會自己長。

[ → 看完整 TUTORIAL ]
SECT. 06 · FINAL

STEP 1 · INSTALL
這行 5 秒,剩下 3 步在教學裡

npm install -g @tznthou/ccrecall

[ ⭐ STAR ON GITHUB ]