
你花了幾週調教出一個完美的 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

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 搞定一切

我把所有 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 結束就自動歸檔。
我踩過的坑
在實作過程中發現了一些隱藏的陷阱:
硬編碼路徑是地雷:我在 11 個腳本裡找到了硬編碼的 Vault 路徑。雖然有
_paths.py模組,但只有 4 個腳本在用它。好設計存在但沒被遵守 = 形同虛設。Symlink 鏈斷裂的連鎖反應:
~/.claude/hooks原本經由工作區 symlink 中繼指向 iCloud。重命名工作區 symlink 後,整條鏈斷掉——Claude Code 的 hooks、skills、agents 全部失效。解法:讓~/.claude/直接指向 iCloud 容器路徑。Validator 的防禦式設計:記憶驗證器用
entry["id"]存取欄位——遇到舊格式條目就 crash。改為.get("id")並容錯處理後,系統變得健壯很多。
你也想試?
這套系統是開源的 Ghost In Shell 框架的一部分:
Clone 下來,跑 python3 create_agent.py,3 分鐘建立你的第一個 Agent。然後在第二台電腦跑 bootstrap.sh——你的 Agent 就能在兩台機器之間無縫切換。
你的 AI 助理不該被綁在一台電腦上。讓它像你一樣,在任何地方都是同一個自己。