跳到主要內容
Lab Grimoire
TW EN
請喝咖啡
讓 AI Agent 在多台電腦共享同一個大腦:跨機器記憶同步實戰指南
動手實作

讓 AI Agent 在多台電腦共享同一個大腦:跨機器記憶同步實戰指南

本頁目錄

Cover

你花了幾週調教出一個完美的 AI 助理——它記得你的偏好、知道你的專案脈絡、熟悉你的工具鏈。

然後你換了一台電腦。

一切歸零。

問題比你想的更深

大多數人以為「把設定檔 git clone 過去就好」。但如果你的工作區在 iCloud(或 Dropbox、OneDrive)上同步,事情會變得有趣:

Machine A 建立 symlink:
  MyVault → /Users/alice/Library/.../iCloud/MyVault

iCloud 同步到 Machine B:
  MyVault → /Users/alice/Library/.../iCloud/MyVault
                    ↑ alice 不存在於 B 機!路徑斷裂!

Machine B 修復 symlink:
  MyVault → /Users/bob/Library/.../iCloud/MyVault

iCloud 同步回 Machine A:
  MyVault → /Users/bob/Library/.../iCloud/MyVault
                    ↑ bob 不存在於 A 機!

→ 無限乒乓,兩台都壞。

這不是假設——這是我在設定第二台 MacBook 時實際踩到的坑。

解法:.nosync + 路徑解析 Fallback Chain

Before vs After .nosync

macOS 有一個鮮為人知的機制:檔名含 .nosync 的項目不會被 iCloud 同步

利用這個特性,我們可以讓每台機器維護自己的 symlink,互不干擾:

# ❌ 會被 iCloud 同步,導致跨機衝突
MyVault → /Users/alice/Library/.../iCloud/MyVault

# ✅ .nosync 後綴 → iCloud 跳過,每台機器獨立
MyVault.nosync → /Users/alice/Library/.../iCloud/MyVault

光改名還不夠——所有腳本都需要找到正確的路徑。我設計了一個三層 fallback chain:

# _paths.sh — 路徑真理來源
if [ -e "$WORKSPACE/MyVault.nosync" ]; then
    export VAULT="$WORKSPACE/MyVault.nosync"        # 優先:.nosync symlink
elif [ -e "$WORKSPACE/MyVault" ]; then
    export VAULT="$WORKSPACE/MyVault"                # 相容:舊名 symlink
else
    export VAULT="$HOME/Library/.../iCloud/MyVault"  # 兜底:直接 iCloud 路徑
fi

所有腳本只需要 source _paths.sh 然後用 $VAULT——不再需要知道 symlink 叫什麼。

分靈體架構:一個 Bootstrap 搞定一切

Architecture

我把所有 Agent 設定(agents、skills、hooks)存在 iCloud Vault 裡的 992_Claude_Config/ 目錄。新機器只需要跑一個 bootstrap 腳本:

iCloud Vault (992_Claude_Config/)     新機器 (~/.claude/)
├── agents/          ──── symlink ────→ agents/
├── skills/ (396個)  ──── symlink ────→ skills/
├── hooks/           ──── symlink ────→ hooks/
├── CLAUDE.md.tmpl   ──── 模板替換 ──→ CLAUDE.md
└── settings.tmpl    ──── 模板替換 ──→ settings.json

關鍵設計~/.claude/ 的 symlink 直接指向 iCloud 的真實路徑,不經過工作區的 symlink。這樣工作區 symlink 怎麼改名都不影響 Claude Code 的運作。

主從機制:避免兩台互相覆蓋記憶

兩台電腦共享記憶檔案,但只有一台應該執行寫入型排程任務(例如記憶整合、文獻同步):

# .machine_role
AliceMacBook=primary      ← 完整寫入權
WorkDesktop=secondary     ← 共享資源唯讀

腳本用 require_primary() 守護:

from _paths import require_primary
require_primary("記憶整合")  # 非 primary 直接退出

因為用 hostname 作 key,兩台同步同一個 .machine_role 檔案也不會衝突。

自動記憶:Stop Hook

最後一塊拼圖:每次 Claude Code session 結束時,自動記錄做了什麼

我設計了一個 Stop hook,在 Claude 結束回應時背景執行:

Claude 完成回應 (Stop event)
    ↓
memory_session_log.py (async)
    ↓
git diff --stat → 推斷本次工作內容
    ↓
變更 ≥ 2 個檔案 → 寫入 episodic.jsonl
    ↓
memory_trigger_check.py → 累積夠多就觸發整合

自動產生的記憶條目長這樣:

{
  "id": "ep-2026-03-19-009",
  "type": "refactor",
  "title": "Session 自動記錄:_paths.py, bootstrap.sh 等 26 個檔案",
  "content": "修改 26 個檔案。1294 insertions, 114 deletions",
  "importance": 8,
  "source": "stop_hook"
}

source: "stop_hook" 讓你能區分自動記錄和手動撰寫的記憶。不需要任何手動操作——session 結束就自動歸檔。

我踩過的坑

在實作過程中發現了一些隱藏的陷阱:

  1. 硬編碼路徑是地雷:我在 11 個腳本裡找到了硬編碼的 Vault 路徑。雖然有 _paths.py 模組,但只有 4 個腳本在用它。好設計存在但沒被遵守 = 形同虛設。

  2. Symlink 鏈斷裂的連鎖反應~/.claude/hooks 原本經由工作區 symlink 中繼指向 iCloud。重命名工作區 symlink 後,整條鏈斷掉——Claude Code 的 hooks、skills、agents 全部失效。解法:讓 ~/.claude/ 直接指向 iCloud 容器路徑。

  3. Validator 的防禦式設計:記憶驗證器用 entry["id"] 存取欄位——遇到舊格式條目就 crash。改為 .get("id") 並容錯處理後,系統變得健壯很多。

你也想試?

這套系統是開源的 Ghost In Shell 框架的一部分:

Clone 下來,跑 python3 create_agent.py,3 分鐘建立你的第一個 Agent。然後在第二台電腦跑 bootstrap.sh——你的 Agent 就能在兩台機器之間無縫切換。


你的 AI 助理不該被綁在一台電腦上。讓它像你一樣,在任何地方都是同一個自己。

覺得這篇有幫助?

追蹤以收到新的 AI × 生醫研究筆記:

或請我喝杯咖啡,讓新內容持續產出。

☕ 請我喝杯咖啡