Releases: PsychQuant/claude-code-ltm
Release list
v0.3.0 — 改名、build 可中斷、進度可見
⚠️ 改名了,舊版請重裝
| 舊 | 新 | |
|---|---|---|
| repo | PsychQuant/claude-LTM |
PsychQuant/claude-code-ltm |
| marketplace | claude-ltm |
claude-code-ltm |
| plugin | claude-ltm |
ltm |
claude plugin uninstall claude-ltm@claude-ltm
claude plugin marketplace remove claude-ltm
claude plugin marketplace add PsychQuant/claude-code-ltm
claude plugin install ltm@claude-code-ltmGitHub 對舊 URL 有 redirect,舊 wrapper 因此還抓得到東西——但那是 GitHub 的善意,不是這個專案的保證。
~/.claude-ltm/ 路徑不動,既有索引與記憶層原封不動。
build 中斷不再全丟
先前整個嵌入迴圈在單一交易內——而那個檔案的註解逐字寫著「第一階段(交易外):算向量」。code 與它自己的設計說明分岔了。
實測代價:一次 1 小時 20 分的全量 build 被中斷後,index.sqlite3 停在 4 KB、WAL 751 MB、chunks 為 0——全部 rollback。而中斷不需要當機,關掉 session 就夠了。
現在每批四段提交,中斷代價從「全部」變成「最後一批」,重跑不重算已完成的部分。
build 會說話了
每批完成印一行到 stderr(stdout 留給 --json),--quiet 可關:
… 第 3/47 批,chunk 6000/94000
先前它在完成前一個字都不印——一個跑數十分鐘、完成前完全沉默的命令,跟卡死在外觀上是同一個樣子。
一份推翻自己前提的量測
docs/measurements/2026-08-26-build-peak-memory.md
原本以為記憶體風險來自向量累積。分批之後那一項已封在 4 MB,但 RSS 仍隨 chunk 數線性成長——真正無上限的是 CorpusScanner.scan() 一次回傳全部 chunk 連同完整文字,而分批完全沒碰到它。
紀錄也寫明不可外推並附實證。
安裝(新使用者)
claude plugin marketplace add PsychQuant/claude-code-ltm
claude plugin install ltm@claude-code-ltm然後跟模型說「設定一下 ltm」(ltm-setup 會報你的語料規模與預估時間再問),或自己跑 ltm build。
Developer ID 簽章 + notarized。
完整變更見 CHANGELOG.md。
v0.2.1 — 無鑰匙圈環境不再卡對話框
v0.2.0 的 binary 缺一個修正,這一版補上。 不覆蓋 v0.2.0 的 asset:它已經公開過,靜默換掉會讓「我裝的是哪一版」失去答案。
沒有登入鑰匙圈時,它現在會說話
ltm 用 macOS Keychain 存 anchor 密鑰。在沒有登入鑰匙圈的環境(SSH 進來、launchd/cron、CI、或以另一個 HOME 執行),舊版檔案式 keychain 不會回錯誤——它彈一個 modal 並停在那裡等人點。SecItemAdd 最終回的 -60006 逐字是 "The authorization was canceled by the user",也就是那條路真的走到底了。
現在它在碰 Keychain 之前就判斷,並指名補救:
✗ 這個環境沒有可用的登入鑰匙圈(找過 …/Library/Keychains)。
常見於:SSH 進來、launchd/cron、CI、或以另一個 HOME 執行。
anchor 密鑰改從環境變數給:
export LTM_ANCHOR_KEY=$(ltm memory --export-key)
LTM_ANCHOR_KEY 不是關掉加密鑰。「要不要加密鑰」沒有選項;「密鑰從哪來」有兩個。給壞值一樣會拒絕。
為什麼不用 data-protection keychain
那一層沒有登入鑰匙圈的概念,本來是對的解。實測它要 keychain-access-groups entitlement,而那需要嵌 provisioning profile——Developer ID 的 CLI 發布做不到:
| 簽法 | SecItemAdd with kSecUseDataProtectionKeychain |
|---|---|
| ad-hoc | -34018 errSecMissingEntitlement |
| Developer ID,無 entitlement | -34018 |
| Developer ID + entitlement,無 profile | 行程被 SIGKILL |
安裝
claude plugin marketplace add PsychQuant/claude-LTM
claude plugin install claude-ltm@claude-ltm然後跟模型說「設定一下 ltm」(ltm-setup skill 會報你的語料規模與預估成本再問),或自己跑 ltm build。
Developer ID 簽章 + notarized。
完整變更見 CHANGELOG.md。
v0.2.0 — ltm-setup skill
這一版修的是「裝好了卻不會用」
ltm-setup skill(新)
先前 README 把安裝寫成兩行並排:
claude plugin install …
ltm build
讀起來像同一類步驟。實際上 binary 下載是自動的(wrapper 做,3 MB 幾秒),
建索引不是——它要掃過整份語料、逐段算 on-device embedding,量測基線
280,000 chunk ÷ 112.9 段/秒 ≈ 41 分鐘(而那份紀錄自己註明是低估)。
ltm-setup 讓「還不能用」有一條可走的路:診斷 binary/索引狀態 → 報你自己的
語料規模與預估成本 → 經同意才跑。直接跟模型說「設定一下 ltm」即可。
不做成 SessionStart hook:那個機制適合幾秒的下載+版本檢查,塞不下數十分鐘的工作。
錯誤訊息在 MCP 路徑上是啞的(已修)
每一則補救說明都寫在 CLI 的 report() 裡,而 MCP 路徑構不到它——它走
"✗ \(error)",於是模型讀到的是:
✗ indexMissing(path: "/…/index.sqlite3")
而那個 case 的 doc 逐字寫著「訊息一律指名 ltm build」。同一條規則兩個寫者,
而沒照做的那個正是模型會讀到的。
修法是刪掉一份:訊息移進 ServiceError: CustomStringConvertible,CLI 只留結束碼
對應。兩條路徑現在輸出逐字相同:
✗ 索引不存在(…)。先跑 `ltm build`。
首次建索引要掃過整份語料並算 embedding,會跑一段時間;之後每次查詢
會自動併入新內容,不必再手動跑。
安裝
claude plugin marketplace add PsychQuant/claude-LTM
claude plugin install claude-ltm@claude-ltm然後跟模型說「設定一下 ltm」,或自己跑 ltm build。
Developer ID 簽章 + notarized。ltm.sha256 附上(擋截斷,不擋竄改——雜湊與 binary
走同一條 TLS)。
完整變更見 CHANGELOG.md。
v0.1.0 — 首次發布
Claude Code 的長期記憶。索引這台機器上既有的 ~/.claude/projects/**/*.jsonl,讓模型能回頭查自己的過去。
檢索負責導航,不負責當答案——每一筆命中帶 (project, sessions, uuid, timestamp) 指標,讓你回去讀原文。
Install
Claude Code(plugin,推薦)
Plugin 尚未上架 marketplace(下一步)。目前手動裝:
curl -L https://github.com/PsychQuant/claude-LTM/releases/download/v0.1.0/ltm -o ~/bin/ltm
chmod +x ~/bin/ltm
ltm build # 建索引。**不能省**——沒索引時 server 會回應但查不到東西
claude mcp add --scope user --transport stdio claude-ltm -- ~/bin/ltm mcpClaude Desktop(一鍵)
下載下方 claude-ltm-0.1.0.mcpb 並雙擊。安裝後仍要跑一次 ltm build。
驗證(三層,失敗長得一樣但補救不同)
ltm --help # ① binary
ltm query "test" >/dev/null && echo 索引可查 # ② 索引
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | ltm mcp # ③ 協定這一版是什麼
首次發布。檢索路徑(FTS5 + 向量兩路)、記憶層、可插拔的排序策略、MCP server、plugin shell。
MCP server 是 ltm mcp 子命令而不是第二個執行檔——單一 binary、單一 asset。
簽章
Developer ID 簽章 + Apple notarization(spctl 回 source=Notarized Developer ID)。不是 ad-hoc:本專案用 Keychain 存 anchor key,而 ad-hoc 簽章每次 build 換一個 code identity,會讓使用者反覆看到 Keychain 授權對話框。
ltm.sha256 / claude-ltm-0.1.0.mcpb.sha256 一併附上。那擋的是截斷或損毀的下載,不是竄改——雜湊與 binary 走同一條 TLS 通道。
全本機,以及那句話的限度
語意向量用 Apple 的 on-device NLContextualEmbedding,字面檢索用本機 SQLite FTS5,選用的主題標記用 on-device FoundationModels。沒有 API key、沒有雲端依賴,索引與查詢路徑不開任何對外連線。
但那不等於「資料留在這裡」:這個工具的用途就是把檢索到的原文送進呼叫端的 context,而那段原文之後往哪去取決於那個 client 與模型,不是這個 repo 能保證的事。語料含第三方逐字內容時,這一點要自己判斷。完整說明見 bundle 內的 PRIVACY.md。
完整變更見 CHANGELOG.md。