Skip to content

Releases: PsychQuant/claude-code-ltm

v0.3.0 — 改名、build 可中斷、進度可見

Choose a tag to compare

@kiki830621 kiki830621 released this 26 Aug 10:07

⚠️ 改名了,舊版請重裝

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-ltm

GitHub 對舊 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 — 無鑰匙圈環境不再卡對話框

Choose a tag to compare

@kiki830621 kiki830621 released this 26 Aug 07:29

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 不是關掉加密鑰。「要不要加密鑰」沒有選項;「密鑰從哪來」有兩個。給壞值一樣會拒絕。

⚠️ 密鑰不對等於既有記憶全體 orphan,而症狀是「turn 不見了」而不是「密鑰不對」——所以要匯出既有的那把,不是產一把新的。

為什麼不用 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

Choose a tag to compare

@kiki830621 kiki830621 released this 26 Aug 07:14

這一版修的是「裝好了卻不會用」

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 — 首次發布

Choose a tag to compare

@kiki830621 kiki830621 released this 26 Aug 04:44

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 mcp

Claude 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(spctlsource=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