ccFamily
[ MENU ]
ccFamily / ccRecall / Tutorial
SECT. 01 // QUICK START · ~5 MIN · MACOS PRIMARY

從 0 到 Claude
自動記得你 /
4 + 1 步

// INSTALL → DAEMON → MCP → HOOKS → (EXTRACT) · LOCAL ONLY

npm install 只是開始——daemon 還沒開、MCP 還沒接、hooks 還沒設定。 這頁帶你跑完 4 步讓系統活起來,再用第 5 步(可選)讓記憶自己長出來。

SECT. 02 // PREREQUISITES · CHECK BEFORE START

開始前 / 確認你有這些

不需要懂 SQLite、FTS5、MCP 細節——下面會現場講。需要準備的只有環境本身。

✓ 01 REQUIRED

Claude Code CLI

沒裝先看 官方指南。本教學不教 Claude Code 安裝。

✓ 02 PRIMARY

macOS

auto-start 走 LaunchAgent 是 macOS only。Linux / Windows 可以 foreground 跑 daemon,本身跨平台。

✓ 03 VERSION

Node.js 20–22

確認版本:

node --version

✓ 04 BASIC

能用 Terminal

會 cd / 跑 command / 看 log 就夠。不需要懂 SQLite、shell scripting、systemd。

SECT. 03 // 4 STEPS TO LIVE + 1 TO GROW · COPY-PASTE READY

四步上手 / 每步一行 cmd

每步都是單一 command。中間若出錯不會弄壞前一步——可以放心一步一步試。跑完這四步系統就能用;要讓記憶自己長出來還有第 5 步,在最後面。

→ 01 / 04 INSTALL

裝 npm package

裝完你會拿到兩個 CLI 命令:ccmem(daemon 本體)跟 ccmem-mcp(給 Claude Code 呼叫的 MCP server)。

CMD

npm install -g @tznthou/ccrecall

為什麼 CLI 叫 ccmem 不叫 ccrecall?因為 npm 上 ccrecall 已經被 spences10/ccrecall(不同的 analytics 工具)用掉了。專案名還是 ccRecall,只有 binary 名字避開衝突。

→ 02 / 04 DAEMON

讓 daemon 開機自動跑

一行命令把 daemon 註冊成 macOS LaunchAgent:寫 plist 到 ~/Library/LaunchAgents/、建 log 目錄、立刻啟動,之後每次登入也會跑。

CMD

ccmem install-daemon

// LINUX / WINDOWS / 試玩 → 改前景跑

ccmem # Ctrl+C 結束

→ 03 / 04 MCP

接上 Claude Code

把 ccRecall 的 MCP server 註冊給 Claude Code。--scope user 代表所有專案都能用——不需要每個 repo 重設。

CMD

claude mcp add ccrecall --scope user -- ccmem-mcp

→ 04 / 04 HOOKS

設 Hooks(開場自動帶回記憶)

Step 3 的 MCP 是「Claude 想查才查」。Hook 是「每次 session 開頭/結尾自動跑」——SessionStart 負責把記憶帶進新對話,SessionEnd 負責確認這次對話有被索引到。一行命令搞定:找 ~/.claude/settings.json、備份原檔、合併(非覆蓋)兩個 hook 註冊。

CMD

ccmem install-hooks

⚠ IMPORTANT

裝完要重開 Claude Code session——hook 設定不會 hot-reload。 想看會寫什麼而不真的寫:ccmem install-hooks --dry-run。 要拔掉:ccmem uninstall-hooks(只刪 ccRecall 自己的 entry)。

→ 05 OPTIONAL 記憶才會自己長

讓每次對話自己沉澱成記憶

前四步給你的是索引、開場注入、跟手動 recall_save。到這裡為止,記憶只有你主動存才會有。 要讓它自己累積,在 shell 設定檔加一行——之後每次對話結束,Haiku 會讀完整段,抽出最多 5 筆存進庫裡,一次約 $0.001。

CMD · 加進 ~/.zshrc 或 ~/.bashrc

source "$(npm root -g)/@tznthou/ccrecall/scripts/post-session-extract.sh"

之後用 ccrecall-extract 取代 claude,原本的 flag 都通用:

ccrecall-extract # 取代 claude

ccrecall-extract --resume # flag 照舊

alias ccdm='ccrecall-extract' # 嫌長就設 alias

// 需要 jq 跟 curl 在 PATH 上(macOS 都內建)

單次跳過萃取:CCRECALL_SKIP_EXTRACT=1 ccrecall-extract。 daemon 沒開時 wrapper 會自己跳過,不會擋住你開對話。

// 4 STEPS → SYSTEM LIVE · +1 STEP → MEMORIES GROW ON THEIR OWN

SECT. 04 // HOW IT RUNS · 5 PARTS RELAY

裝完之後 / 這五個零件接力跑

你不用做什麼。電腦開著,Claude Code 開著,前四個零件就在背後把對話收進索引;第五個(可選)才是把對話煉成記憶的那一步。

▶ 01 DAEMON

背景服務

ccmem install-daemon 把它註冊成 LaunchAgent,駐在背景等 HTTP 請求。電腦開著它就在。

PORT: 127.0.0.1:7749

▶ 02 WATCHER

檔案監聽

Daemon 用 chokidar 盯住 ~/.claude/projects/。每次 Claude Code 寫新 session JSONL,watcher 幾秒內抓到、丟去索引、更新 SQLite。不用手動重掃。

LATENCY: ~seconds

▶ 03 BACKSTOP

10 分鐘兜底

檔案系統偶爾會漏事件(macOS sleep/wake、外接硬碟拔插)。每 10 分鐘再全掃一次當保險。漏掉的 JSONL 這邊接住。

INTERVAL: 600s

▶ 04 HOOKS

生命週期鉤子

Step 4 設好的 hook 在兩個時機自動跑:

  • SessionStart: 開新 session 前注入 ≤5 筆記憶
  • SessionEnd: 結束時確認這段有被索引到
▶ 05 EXTRACT OPTIONAL · STEP 5

萃取 wrapper

前四個零件把對話收進索引,但索引不等於記憶。這個零件才是把對話煉成記憶的那一步:session 結束後起一個 Haiku 讀完整段,透過 MCP recall_save 寫回 0–5 筆。沒裝它,記憶只有你主動存才會有。

COST: ~$0.001/session · SKIP: CCRECALL_SKIP_EXTRACT=1

一句話:裝完 4 步,你有一個會查的系統;加上第 5 步,你才有一個會長的系統。

SECT. 05 // VERIFY · IS IT ALIVE?

怎麼知道 / 真的在運作?

三個快速確認點。出問題的話,看完這節大致能定位是哪一環。

CHECK #01

Daemon 活著

curl http://127.0.0.1:7749/health

{"status":"ok"} 就對了。7749 是預設 port,要改的話在 plist 裡改 CCRECALL_PORT

CHECK #02

MCP 接上

重新開一個 Claude Code session,隨便問:

「上次我們有沒有聊過 xxx?」

Claude 應該會主動呼叫 mcp__ccrecall__recall_query 工具搜尋以前的對話。看到它「正在查記憶」就是接上了。

CHECK #03

第一次拉空?

Daemon 啟動當下會自動跑 runIndexer,把歷史 JSONL 全掃一遍建索引。掃完後 watcher 才開始監看新檔。首次啟動期間查不到東西是正常的——十幾個 session 幾秒、幾百個可能要一兩分鐘。

tail -f ~/Library/Logs/ccrecall/ccrecall.out.log
# 看到 "Indexer complete." 就是掃完了
SECT. 06 // TROUBLESHOOTING · TOP 3

最常踩的 / 三個坑

這裡列 90% 人會問的前三個。

Q #01

裝完跑 ccmem 說 command not found?

npm global bin 不在 PATH 上。看 npm 把它放在哪,把那個 /bin 加到 PATH。

npm config get prefix # 看位置
export PATH="$(npm config get prefix)/bin:$PATH"

Q #02

Daemon 起不來、log 看到 EADDRINUSE?

7749 port 被其他服務佔了。改 CCRECALL_PORT 後重裝 plist:

export CCRECALL_PORT=17749
ccmem install-daemon # 重裝吃新 port

Q #03

Claude 沒主動呼叫 recall_query?

先確認 claude mcp listccrecall。沒有就重跑 Step 3。 有的話 Claude 不一定每次都 call——它會根據 context 判斷。直接點名工具名稱基本上都會 call:

  • 查:「請你用 recall_query 查 xxx」
  • 存:「幫我用 recall_save 記住這件事:xxx」
SECT. 07 // NEXT · INTERNAL

跑完了? / 還有這些可以看

裝好之後,這幾頁講的是它在背後做什麼、跟另一個工具怎麼分工。

SECT. 08 · NEXT

跑完了 / 接下來它自己跑

下次開新 Claude Code session,問問題前 SessionStart hook 已經把相關記憶塞進來了——你只需要繼續對話。 有裝第 5 步的話,這次對話結束後也會自動沉澱回去。

// INSTALLED · DAEMON UP · MCP CONNECTED · HOOKS WIRED · EXTRACT OPTIONAL