rule-sentinel.yml 沒查內容也沒問,git 歷史找不到,內容永久丟失。之後加了 L2 hook 強制。這裡記錄你教給 Claude 的所有規則、Skills、Agents,用白話解釋給你看,同時附原文讓你學技術細節。
🕐 資料最後更新:載入中...
thomastangnz-commits/downloads-config 是唯一真理源。兩台電腦關機了也沒關係,GitHub Actions 每天自動掃 + 更新本站。
cloudflare-pages-password-thomastangnz)
每條規則 = 白話卡片(預設)+ 原文(點展開)。MVP 放 3 個示範,後續 GLM 批量生成 169 條。
rule-sentinel.yml 沒查內容也沒問,git 歷史找不到,內容永久丟失。之後加了 L2 hook 強制。--- name: 刪除前必 Read 鐵律 type: feedback --- 任何 rm / Remove-Item / del /F / unlink 執行前,必須: 1. 先用 Read 看目標內容 2. 告訴 Thomas:刪什麼、為什麼、有無備份 3. 取得確認(「刪掉」/「同意刪」) 4. 命令前加註釋 # CONFIRMED-DELETE: 原因 L2 技術強制:pre-delete-guard.py 掛 PreToolUse hook
D:\Backup\Downloads 改成 D:\ClaudeCode,禁止大批量 sed。D:\ClaudeCode\載入中…
每次你打開 Claude Code,它默認讀什麼?你說話後又讀什麼?看流程圖就懂。
D:\Backup\Downloads\CLAUDE.md~/.claude/projects/.../memory/MEMORY.md.claude/settings.json + 全局 settings.claude/commands/*.md + .claude/agents/*.md自動掃 169 條記憶 + 22 skills + 10 agents + 26 段 CLAUDE.md。
GitHub Actions 每天 6 點 NZ 自動檢查。
| 檢查項 | 台式機 | 筆記本 | 狀態 |
|---|---|---|---|
| 最後 push 時間 | 04-14 14:32 | 04-13 22:10 | 🟢 |
| CLAUDE.md MD5 | a3f... | a3f... | 🟢 一致 |
| MEMORY.md MD5 | b7c... | b7c... | 🟢 一致 |
| settings.json hooks | 4 個 | 4 個 | 🟢 |
| auto-sync 最近 3 天 | 12 次 | 5 次 | 🟢 |
| 孤兒分支 | 0 | 0 | 🟢 |
git log CLAUDE.md 看誰晚,晚的那台 git pull --rebase。| 分支 | 機器 | 用途 | 最後動作 | 狀態 |
|---|---|---|---|---|
claude/2026-04-10-desktop-nas-improve | 台式機 | NAS 改進 | 2026-04-10 | 🟡 進行中 |
claude/youthful-chatelet | 台式機 | (未標註) | - | 🟡 待合併 |
.claude/worktree-logs/ 每個分支最後 Stop Hook 寫入。C:\Users\Administrator\.claude\projects\<工作目錄>\<uuid>.jsonl。關 terminal、電腦重啟、誤按 X 都不丟。jingdian-petfoods.pages.dev 網站 + 聊 Alex 吃飯的對話,以為丟了。實際上 session 完整在 C--Users-Administrator/8fe2057c-....jsonl,用 --resume 10 秒找回。cd <工作目錄> # 例:C:\Users\Administrator claude --resume
claude --resume 8fe2057c
grep -l "Alex" C:/Users/Administrator/.claude/projects/**/*.jsonl
claude --resume <uuid>。%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json{
"confirmCloseAllTabs": true,
"warnOnClose": "always"
}
confirmCloseAllTabs → 關整個視窗時確認(穩定版支援)warnOnClose → 任何關 tab 都確認(Preview 版)false 或 "never"。rm jsonl 檔 → 會真的丟--resume → Claude 找不到/ : 換成 --)| 你說這句(中文) | Claude 幫你打的命令 | 白話解釋 |
|---|---|---|
| 「檢查有沒有新規則」 或「同步記憶」 |
讀 MEMORY.md + 新 lesson |
看別的 tree(樹)有沒有加新鐵律 |
| 「同步 master」 或「拉一下最新的」 |
git pull --rebase |
從 GitHub(代碼託管平台)拉最新版下來,把我改的疊在上面 |
| 「更新 worktree log」 | 改 .claude/worktree-logs/xxx.md 狀態 |
把當前 tree(樹)的狀態寫到日誌檔 |
| 「存檔」 或「commit 一下」 |
git add . && git commit -m "..." |
存一個版本(存檔點) |
| 「推上去」 或「備份」 |
git push |
把本地存檔傳到 GitHub 雲端 |
| 「進 XXX 這個 tree」 | 告訴你 cd 命令 + claude --resume |
切換到該 worktree(工作樹)目錄 |
| 「不小心關了對話」 或「找回 XXX 的對話」 |
grep session jsonl + --resume |
偵探 SOP 找回被誤關的對話 |
| 「看 worktree 看板」 | py scripts/worktree-registry-sync.py |
看所有 tree 的狀態清單 |
| 方向 | 意思 | 比喻 | 風險 |
|---|---|---|---|
| A. merge → master (交回) |
把 worktree(工作樹)分支裡做好的東西,合進主分支 | 員工把做好的作品交回總部 | ⚠️ 半成品/實驗代碼會污染 master |
| B. pull master → worktree (補給) |
把 master(主分支)最新內容拉進每個 worktree,讓它們跟上 | 總部把最新資料派送給員工 | ✅ 低風險,只是更新 worktree |
| 做法 | 技術上 | 結論 |
|---|---|---|
| 依次做(一個一個) | git(版本控制)每步疊在上一步基礎上,不會覆蓋 | ✅ 安全 |
| 同時做(全部一起) | git 本身不允許同一 repo(倉庫)多個 merge(合併)同時跑 — 會鎖住 .git/index.lock |
⛔ 技術上不可能,不是怕覆蓋,是 git 機制 |
| 你說這句 | Claude 幫你打的命令 | 白話解釋 |
|---|---|---|
| 「列出所有 tree」 或「有哪些 worktree」「顯示所有 tree」 |
git worktree list |
列出這個 repo 所有 worktree(含路徑、分支、最新 commit) |
| 「體檢所有 worktree」 | git log master..<branch> + 反過來 |
看每個 tree 對 master 超前/落後多少 commit |
| 「交貨到 master」 合併單個 worktree |
git checkout master && git merge <branch> |
把 worktree 做好的東西合進主分支 |
| 「全部交貨到 master」 批量(依次) |
對每個 branch 依次 merge,衝突停下來問你 | ⚠️ 先體檢才可以做 |
| 「worktree 跟上 master」 拉最新進 worktree |
cd <worktree> && git pull origin master --rebase |
把主分支最新內容拉進這個 worktree |
| 「所有 worktree 跟上 master」 批量補給 |
對每個 worktree 依次 pull master | ✅ 低風險,可放心批量 |
cd D:/Backup/Downloads
git pull --rebase origin master # 先拉最新
git worktree add .claude/worktrees/<名字> -b claude/<前綴>-<用途> master
| 機器 | 前綴 | 範例 |
|---|---|---|
| 🖥️ 台式機 | claude/desktop- | claude/desktop-alex、claude/desktop-church-ppt |
| 💻 筆記本 | claude/laptop- | claude/laptop-sermon-page |
| 📱 手機 Remote Control | claude/phone- | claude/phone-quick-fix-2026-04-15 |
| 選項 | 好處 | 壞處 |
|---|---|---|
| ✅ 基於 master (Claude 默認) |
乾淨起點、不繼承實驗代碼、不被別人的半成品污染 | 無 |
| ⛔ 基於某個 worktree | 可以「延續」那個工作 | 會繼承那個 tree 所有實驗性改動,未來合併時會打架(merge conflict) |
git worktree add <新路徑> -b claude/desktop-alex-follow-up claude/desktop-alex
claude/desktop-alex| 你說這句 | Claude 幫你做的事 | base 是什麼 |
|---|---|---|
| 「進 worktree 做 XXX」 默認 |
從 master 長新分支 claude/<機器>-XXX |
🌳 master 最新 |
| 「延續 XXX 繼續做」 或「接著 XXX 那邊做」 |
從 claude/<機器>-XXX 長新分支加 -follow-up |
🔗 那個 worktree 最新 |
git worktree add .claude/worktrees/<name> -b claude/desktop-<name>cd <worktree path> && git add . && git commit -m "..."(可能多次)auto-sync: desktop(自動備份 commit),那不是真工作,只是 hook(鉤子)幫你存一次git checkout master && git pull --rebase && git merge claude/desktop-<name> && git pushgit worktree remove <path> && git branch -d claude/desktop-<name> && git worktree prune-d 安全刪;沒合過要強刪 -D(會丟工作,先確認)| 階段 | 圖標 | 典型時長 | master 上看得到嗎? |
|---|---|---|---|
| 建立 | 🟢 | 幾秒 | ❌ 還沒,分支獨立 |
| 工作中 | 🟡 | 幾小時 ~ 幾週 | ❌ 尚未合進來 |
| 合併回 master | 🔵→✅ | 幾分鐘 | ✅ 合完就在 |
| 棄掉 | 🧟 | 幾秒 | ✅ 內容已在 master,分支可消失 |
| git 動作 | 白話解釋 |
|---|---|
| 停下整個 merge(合併) | 不繼續往下跑,等你決定 |
| 檔案內容變「花」 | 在衝突的那段塞入特殊標記 <<<<<<< ======= >>>>>>> |
git status 顯示「Unmerged paths」 | 列出哪些檔有衝突 |
原來的內容... <<<<<<< HEAD(當前分支:master) - 早會時間:早 6 點 ======= - 早會時間:早 7 點 >>>>>>> claude/desktop-church-program-ppt(要合進來的分支) 下面的內容...
| 角色 | 該做 | 不該做 |
|---|---|---|
| Claude |
✅ 立刻停下、不自作主張 ✅ 把衝突段落貼給 Thomas 看 ✅ 解釋 A 版 vs B 版差別 ✅ 等 Thomas 講「留 A」/「留 B」/「兩個都留」才動手 |
⛔ 自己選一個版本接著做 ⛔ 用 --ours / --theirs 偷懶⛔ 跳過 commit 直接 push |
| Thomas |
✅ 看 Claude 貼的兩個版本 ✅ 講中文:「留 master 的」/「留 worktree 的」/「兩個都留」/「混合:取 A 的時間 + B 的細節」 |
⛔ 不用打 git 命令 ⛔ 不用記 <<<<<<< 是什麼意思
|
git merge claude/desktop-church-program-pptCONFLICT (content): Merge conflict in CLAUDE.md
- 早會時間:早 7 點
git add CLAUDE.md git commit # git 自動填好 merge commit message git push origin master
git merge --abort 然後就跑掉 — 衝突會一直在git push --force — 會把另一台電腦的工作覆蓋掉| 判斷條件 | 嚴重度 | 白話解釋 |
|---|---|---|
| 最後活動超過 14 天 | 🟡 可能廢棄 | 兩週沒人碰 = 八成忘了 |
| detached HEAD(無分支名) | 🔴 幾乎肯定廢棄 | 「員工沒掛工牌」= 沒分支管,commit(存檔)了也沒人指得到 |
commit 全是 auto-sync: desktop,沒實質工作 |
🧟 殭屍 | 只有自動備份在動,真人沒做事,可以刪 |
名字是隨機英文(如 youthful-chatelet)+ 只有 auto-sync |
🧟 高機率殭屍 | 系統自動取的名 + 沒實質工作 = 開了沒用過 |
| Worktree 名 | 分支 | 最後動作 | 領先 master | 實質 commit | 體檢 |
|---|---|---|---|---|---|
alex |
claude/desktop-alex | 2026-04-15(今天) | 0 | 有真實工作 commit | 🟢 活躍 |
hopeful-ellis |
claude/hopeful-ellis | 2026-04-14(1 天前) | 1(auto-sync) | 0 真實 | 🟡 近期,可審 |
desktop-chores |
claude/desktop-chores | 2026-04-12(3 天前) | 18(全 auto-sync) | 0 真實 | 🟡 高頻自動備份但無真工作 |
xenodochial-taussig |
claude/desktop-misc | 2026-04-12(3 天前) | 0 | 0 | 🟡 閒置 |
skills-agents-site |
worktree-skills-agents-site | 2026-04-13(2 天前) | 0 | 0 | 🟡 閒置 |
church-meeting-handbook |
claude/desktop-church-meeting-handbook | 2026-04-11(4 天前) | 2(auto-sync) | 0 真實 | 🟡 閒置 |
church-program-ppt |
claude/desktop-church-program-ppt | 2026-04-11(4 天前) | 1(auto-sync) | 0 真實 | 🟡 閒置 |
wechat-group-site |
claude/wechat-group-site | 2026-04-11(4 天前) | 0 | 0 | 🟡 閒置 |
2026-04-10-desktop-nas-improve |
claude/2026-04-10-desktop-nas-improve | 2026-04-10(5 天前) | 0 | 0 | 🟡 閒置(NAS 任務可能已完) |
flamboyant-ramanujan |
DETACHED HEAD | 2026-04-15 | 1(auto-sync) | 0 真實 | 🔴 detached + 隨機名 + 無真工作 |
youthful-chatelet |
claude/youthful-chatelet | 2026-04-11(4 天前) | 1(auto-sync) | 0 真實 | 🧟 隨機名 + 只有 auto-sync |
| 場景 | 命令 | 白話 |
|---|---|---|
| 正常刪一個合過的 worktree | git worktree remove <path> |
收工牌 + 清工位 |
| 刪分支(合過 master 才能 -d 安全) | git branch -d <branch> |
歸檔員工檔案 |
| 強刪沒合過的分支(會丟工作) | git branch -D <branch> |
⚠️ 銷毀檔案,先確認 |
| 清理「資料夾刪了但 git 還記得」的孤兒 | git worktree prune |
把死亡記錄從 git 帳本擦掉 |
| 看現在還有哪些 worktree | git worktree list |
列員工花名冊 |
rm -rf .claude/worktrees/xxx — git 帳本會留鬼影,後續 prune 才會清-D 強刪所有閒置 — 萬一某個其實有未推 commit,工作沒了claude/phone-用途-日期。
phone-/dt-/lp-)。
feedback_git_backup.md — AI 禁止自動 push掃描 Cloudflare Pages 所有站,對照 thomastangnz-commits/ 下是否有 GitHub repo。
GitHub Actions 每日早 7 點(NZ)自動掃描 thomastangnz-commits 下所有 repo 的 public/private 狀態。發現 public 會立即發郵件到 thomastangnz@gmail.com,附一鍵修復指令。
thomastangnz@gmail.comgh repo edit ... --visibility private 指令thomas-share.pages.dev 用「假 404 首頁」隔離 — 朋友拿到單篇分享 URL 只能看那篇,進不了其他。每日掃描 /、/index.html、/404.html 和亂猜路徑,確認四個都回傳假 404(「This link is not valid」)。任何一個回傳真實內容 → 郵件告警。
index.html 改成真正首頁/導航 → 隔離立刻破功,朋友就能爬到所有分享頁。守衛偵測到就發郵件,修復:重新把 index.html 內容複製成 404.html 的假 404 頁,然後 wrangler pages deploy。
起源:Thomas 說「我累死了,每次你都記憶太浅,不同窗口記的都不同」。2026-04-16 完成三層升級。
| 問題 | 原因 | 後果 |
|---|---|---|
| 不同窗口記憶不同 | MEMORY.md 超過 200 行被系統截斷(原本 259 行) | 後半段記憶索引 CC 看不到 |
| Thomas 糾正了還犯同樣的錯 | 糾正只存在當次對話,沒有自動存成教訓 | 下次新窗口又忘 |
| 歷史對話全忘 | CC 沒有跨對話的「大腦」,只有啟動時看紙條 | 同樣的問題解釋 10 遍 |
| 層 | 工具 | 比喻 | 解決什麼 | 狀態 |
|---|---|---|---|---|
| 第 1 層 | MEMORY.md 瘦身 | 📋 整理便利貼 | 259→189 行,不再截斷,所有窗口看到一致索引 | ✅ |
| 第 2 層 | claude-mem v12.1.5 | 📹 監控攝像頭 | 自動錄對話 → 壓縮摘要 → 下次用語意搜尋注入 | ✅ |
| 第 3 層 | claude-reflect v3.1.0 | 🧑🏫 實習導師 | Thomas 說「不對!」→ 自動記教訓 → 下次不再犯 | ✅ |
GitHub 57,900+ 星,CC 最火的記憶插件。
| 項目 | 說明 |
|---|---|
| 安裝 | npx claude-mem install |
| 搜尋 | CC 裡輸入 /mem-search |
| 本地面板 | http://localhost:37777 |
| 存儲位置 | ~/.claude-mem/(SQLite + ChromaDB 向量資料庫) |
| 碰 CLAUDE.md? | ❌ 不碰,完全獨立存儲 |
| Hook 事件 | 做什麼 |
|---|---|
| SessionStart(開始對話) | 從 ChromaDB 載入相關歷史 |
| UserPromptSubmit(你發訊息) | 搜尋語意相似的過去觀察 |
| PostToolUse(工具用完) | 記錄工具使用觀察 |
| Stop / SessionEnd(結束) | 壓縮+存儲本次對話 |
GitHub 910 星,唯一能同時從錯誤和成功中學習的 CC 插件。
/reflect 審查導師的筆記,決定保留哪些
| 命令 | 做什麼 |
|---|---|
/reflect | 審查排隊中的教訓,決定保留哪些 |
/reflect --scan-history | 掃描所有歷史對話,補抓以前漏掉的糾正 |
/reflect --dry-run | 預覽但不寫入(先看看學了什麼) |
/reflect --dedupe | 合併重複的教訓 |
/reflect-skills | 發現重複工作模式,自動生成快捷命令 |
/view-queue | 查看排隊中的教訓 |
| Hook 事件 | 做什麼 |
|---|---|
| UserPromptSubmit(你發訊息) | 偵測糾正模式(「不對」「用 X」「actually」) |
| SessionStart(開始對話) | 提醒有待審查的教訓 |
| PreCompact(壓縮前) | 備份排隊教訓防丟失 |
| PostToolUse: Bash(commit 後) | 提醒跑 /reflect |
| # | 工具 | 星數 | 比喻 | 能力 | Thomas 選? |
|---|---|---|---|---|---|
| ① | claude-mem | 57,900+ | 📹 監控攝像頭 | 錄像 + 語意搜尋 | ✅ 已裝 |
| ② | claude-reflect | 910 | 🧑🏫 導師 | 從糾正學 + 從成功學 | ✅ 已裝 |
| ③ | claude-memory-compiler | 744 | 📰 日報編輯 | 每天 6 點編譯知識庫 | ❌ 6 點門檻被罵 |
| ④ | claude-code-auto-memory | 134 | 📝 自動秘書 | 自動更新 CLAUDE.md | ❌ 全自動怕寫亂 |
| ⑤ | engram | 2,566 | 🗄️ 記憶資料庫 | SQLite 全文搜索 | ❌ 要 Go 運行時 |
| ⑥ | Hermes Agent | 89,700+ | 🤖 自進化 AI | 自寫技能卡+自改進 | ⛔ 不支援 Windows |
| ⑦ | mcp-memory-service | 1,676 | 🏠 雲端檔案室 | 知識圖譜 + 三端共享 | ⏸️ 未來升級方向 |
| 問題 | 說明 |
|---|---|
| ⛔ 不支援 Windows | 只能裝在 Linux / WSL,官方明確寫「Native Windows is not supported」 |
| ⛔ 取代 CC 不是加強 CC | Hermes 是獨立系統,用自己的模型(不是 Claude),切過去現有記憶全廢 |
| ⛔ 架構倒置 | Hermes 設計成「當經理」指揮 CC 幹活,不能反過來讓 CC 指揮 Hermes |
| 項目 | claude.ai(手機/網頁) | 本地 CC |
|---|---|---|
| 記憶存在哪 | Anthropic 雲端伺服器 | 你電腦本地文件 |
| 學習方式 | 自動從對話中蒸餾(每 24 小時) | CLAUDE.md + MEMORY.md + 插件 |
| 跨設備 | ✅ 手機 ↔ 網頁自動同步 | ✅ 兩台電腦靠 Git 同步 |
| 互通 | ⛔ 不互通 — 需手動複製 | |
| 風險 | 說明 | 對策 |
|---|---|---|
| PostToolUse 衝突 | reflect 和 mem 都 hook Bash 的 PostToolUse(CC bug #42702) | 目前實測無影響;reflect 那個 hook 只是提醒 |
| CLAUDE.md 衝突 | reflect 會寫 CLAUDE.md;mem 不碰 | reflect 有 /reflect 人工審核門 |
| 筆記本同步 | 插件安裝是 per-machine,筆記本需另裝 | 教訓寫進 CLAUDE.md 後走 Git 同步 |
說一句「審計記憶」,Claude 自己跑 6 層體檢(鐵律檔/索引/插件/對話備份/雲端/雙機),給紅綠燈彙報 + A/B/C 修復選項,你才決定改不改。
| # | 部位 | 白話解釋 | 壞了會怎樣 |
|---|---|---|---|
| 1 | CLAUDE.md 鐵律檔 | 家規檔 — CC 一開機全文背起來 | 檔案沒了 → CC 忘光所有鐵律 |
| 2 | MEMORY.md 索引 + 子文件 | 圖書館目錄 — 列 169 本書,用到才翻 | 斷鏈(目錄指空)/ 孤兒(書在但目錄漏寫) |
| 3 | claude-mem(插件) | 自動偷記觀察到本地 SQLite(結構化資料庫) | pipeline(流水線)壞 → 搜不到歷史 session(對話) |
| 4 | Session jsonl(對話紀錄檔) | 每次對話完整錄音,關電腦不丟 | 沒寫 → 誤關對話找不回 |
| 5 | GitHub private repo(私人倉庫) | 雲端備份 + 雙機同步 | ahead/behind > 0 → 兩台電腦要打架 |
| 6 | junction(目錄連結,像捷徑) | CC 以為寫 C 盤,實際落在 D 盤 repo 裡 | junction 掉 → CC 寫的記憶不在 repo,永遠 push 不上 |
| # | 記憶層 | 狀態 | 細節 |
|---|---|---|---|
| 1 | CLAUDE.md | ✅ | 鐵律齊全,最近有更新 |
| 2 | MEMORY.md 索引 | ⚠️ | 204 行,超 200 行截斷紅線 4 行 |
| 3 | 子文件 | ⚠️ | 孤兒 15 個(存在但沒寫進索引) |
| 4 | claude-mem SQLite | ❌ | 168 條 pending 全 failed,pipeline 整體壞 |
| 5 | Session jsonl | ✅ | 今日活躍 session 正在寫入 |
| 6 | GitHub 備份 | ✅ | ahead=0 behind=0 乾淨 |
| 7 | junction 雙機 | ✅ | D:\ClaudeCode / memory junction 都對 |
審計記憶 (任何觸發詞都行) 記憶健康檢查 memory audit
memory-audit.md(238 行)---
name: memory-audit
description: Thomas 記憶系統審計助手。一次性跑完 6 層記憶健康檢查(CLAUDE.md / MEMORY.md + 子文件 / claude-mem 插件 / Session jsonl / GitHub 備份 / junction 雙機同步 / Notion 橋接),找出故障+隱患+孤兒檔,輸出彙報並提出 A/B/C 修復選項。觸發詞:「審計記憶」「審計記憶系統」「記憶健康檢查」「記憶方案檢查」「檢查記憶系統是否在工作」「memory audit」「孤兒記憶檔」「claude-mem 壞沒」。
tools: Bash, Read, Write, Edit, Glob, Grep
---
你是 Thomas 的記憶系統審計員。每次 Thomas 說「審計記憶」或等同觸發詞,**按以下 6 層全跑一遍**,產出圖表彙報+修復建議(白話文、圖標對比表、英文詞加中文全稱)。
## 前置檢查
1. 確認當前機器:`hostname`
2. 確認記憶目錄路徑(Thomas 家漸進遷移中):
- 台式機 ThomasDesktop:`C:\Users\Administrator\.claude\projects\D--Backup-Downloads\memory\`(junction → `D:\Backup\Downloads\claude-sonnet-4-6\memories\`)
- 筆記本 ThomasLaptop(abc25 帳號):`C:\Users\abc25\.claude\projects\...\memory\`(junction 同原理)
3. 台式機 CC 家 repo 根:`D:\Backup\Downloads\`(= `D:\ClaudeCode\` junction 目標,remote = `thomastangnz-commits/downloads-config` 私人 repo)
## 第 1 層:CLAUDE.md 鐵律檔
```bash
ls -la /d/Backup/Downloads/CLAUDE.md
wc -l /d/Backup/Downloads/CLAUDE.md
```
**健康標準**:
- 存在、> 800 行(規則豐富)、最近 30 天內有更新
- CC 啟動會**全文載入**,無行數截斷
**異常**:缺檔 / 超過 1500 行(太臃腫)→ 報告
## 第 2 層:MEMORY.md 索引 + 子文件
### 2.1 檔案本體
```bash
wc -l C:/Users/Administrator/.claude/projects/D--Backup-Downloads/memory/MEMORY.md
```
**鐵律**:**MEMORY.md ≤ 200 行**(201+ 會被 CC 啟動時截斷)。超過必須瘦身。
### 2.2 連結斷鏈 + 孤兒檔審計(用 Python)
```bash
PYTHONUTF8=1 py -c "
import re, pathlib
base = pathlib.Path('C:/Users/Administrator/.claude/projects/D--Backup-Downloads/memory')
mem = (base / 'MEMORY.md').read_text(encoding='utf-8')
cold = (base / 'MEMORY_COLD.md').read_text(encoding='utf-8') if (base/'MEMORY_COLD.md').exists() else ''
indexed = set(re.findall(r'\]\(([^)]+\.md)\)', mem + cold))
all_md = set()
for p in base.rglob('*.md'):
rel = p.relative_to(base).as_posix()
if rel in ('MEMORY.md','MEMORY_COLD.md'): continue
all_md.add(rel)
broken = [l for l in indexed if not (base / l).exists()]
orphans = sorted(all_md - indexed)
print(f'索引條目: {len(indexed)}')
print(f'實際文件: {len(all_md)}')
print(f'斷鏈: {len(broken)}')
for b in broken[:20]: print(f' [broken] {b}')
print(f'孤兒: {len(orphans)}')
for o in orphans: print(f' [orphan] {o}')
"
```
**健康標準**:斷鏈 = 0、孤兒 ≤ 3(可容忍)
**孤兒 > 3 → 觸發修復提案**(詳見底部「修復 SOP」)
## 第 3 層:claude-mem 插件(本地 SQLite + 可選 Chroma)
### 3.1 Worker 活著嗎
```bash
curl -s -m 5 "http://localhost:37777/api/projects" | head -c 300
```
**健康**:回傳 `{"projects":["Downloads"],...}`
**worker 掛**:回傳 curl error 或 empty → 啟動方式:`claude-mem start`(或查 `ps aux | grep worker-service`)
### 3.2 SQLite 資料
```bash
PYTHONUTF8=1 py -c "
import sqlite3, os
db = os.path.expanduser('~/.claude-mem/claude-mem.db')
c = sqlite3.connect(db).cursor()
print('observations (Downloads):', c.execute(\"SELECT COUNT(*) FROM observations WHERE project='Downloads'\").fetchone())
print('user_prompts:', c.execute('SELECT COUNT(*) FROM user_prompts').fetchone())
print('sdk_sessions:', c.execute('SELECT COUNT(*) FROM sdk_sessions').fetchone())
print('pending status:')
for r in c.execute('SELECT status, COUNT(*) FROM pending_messages GROUP BY status').fetchall():
print(f' {r}')
"
```
**健康標準**:observations > 100 且 pending_messages 主要是 `completed`
**❌ 常見故障**:
- `observations = 0` + `pending = failed` → Pipeline 整體壞
- 診斷:查 `~/.claude-mem/logs/` 看失敗原因;最常見是 embedding API(OpenAI / 其他)key 過期、網路擋住、chroma-mcp 服務沒啟動
### 3.3 Chroma / 語意搜尋
```bash
curl -s -m 5 "http://localhost:37777/api/search?query=test&project=Downloads&limit=1"
```
**健康**:回傳結果 JSON
**故障**:`chroma-mcp connection in backoff` → chroma 後端沒接上
## 第 4 層:Session jsonl(對話永存備份)
```bash
find /c/Users/Administrator/.claude/projects/ -name "*.jsonl" -newermt "$(date -d 'today' '+%Y-%m-%d')" 2>/dev/null | wc -l
ls -lht /c/Users/Administrator/.claude/projects/*/*.jsonl 2>/dev/null | head -3
```
**健康**:今日至少 1 個 jsonl,當前 session 正在寫入(size 持續增長)
**意義**:關 terminal / 重啟電腦可用 `claude --resume <uuid>` 找回
## 第 5 層:GitHub 備份
```bash
cd /d/Backup/Downloads && git remote -v | head -1 && git fetch origin master 2>&1 | tail -1 && git rev-list --left-right --count master...origin/master && git status -s | head -5
```
**健康**:
- remote = `thomastangnz-commits/downloads-config`(私人)
- `ahead=0 behind=0`
- working tree 乾淨或只有少量 `m` 子模組
**不健康**:`ahead > 0` 未 push、`behind > 0` 需 pull --rebase
## 第 6 層:雙機 junction 同步
```bash
powershell -Command "Get-ChildItem D:\ -Attributes ReparsePoint -EA SilentlyContinue | Select-Object Name,Target"
powershell -Command "Get-ChildItem 'C:\Users\Administrator\.claude\projects\D--Backup-Downloads' -Attributes ReparsePoint -EA SilentlyContinue | Select-Object Name,Target"
```
**健康**:
- `D:\ClaudeCode` → `D:\Backup\Downloads`(漸進遷移中)
- `.claude\projects\D--Backup-Downloads\memory` → `D:\Backup\Downloads\claude-sonnet-4-6\memories`(讓 CC 看到的 memory 路徑能實際寫到 repo 裡)
## 第 7 層:Notion 橋接(可選)
夫妻團契 Notion 頁面 ID:`33e291ff-d123-8197-9b34-e3e072bf433a`
```bash
curl -s -o /dev/null -w "HTTP:%{http_code}\n" -m 10 "https://www.notion.so/33e291ffd12381979b34e3e072bf433a"
```
**健康**:HTTP 200(只驗可達,不驗內容)
## 彙報模板(輸出給 Thomas)
必須用這個格式(淡色風格 + 圖標對比表 + 白話文):
```markdown
# 🔍 記憶系統審計彙報(YYYY-MM-DD HH:MM NZ)
## 一、六層記憶架構 & 健康度
| # | 記憶層 | 作用 | 狀態 | 細節 |
|---|-------|------|------|------|
| 1 | CLAUDE.md 鐵律檔(X 行)| CC 啟動全文載入 | ✅/⚠️/❌ | <細節> |
| 2 | MEMORY.md 索引(X 行 / Y KB)| 指向 N 個子文件 | ✅/⚠️/❌ | <細節> |
| 3 | 子文件 N 個 | 觸發詞 Read | ✅/⚠️/❌ | 孤兒 K 個 |
| 4 | claude-mem SQLite | 自動學習 | ✅/⚠️/❌ | obs=X, pending failed=Y |
| 5 | Session jsonl | 對話永存 | ✅ | 今日 N 個 |
| 6 | GitHub private repo | 雲端備份+雙機 | ✅/⚠️ | ahead=A behind=B |
## 二、⛔ 故障 & 隱患
(列每個紅燈/黃燈問題,每項包含症狀/影響/修復難度)
## 三、✅ 健康的部分
(junction、master 同步、Notion 可達等)
## 四、🔧 修復選項(A / B / C)
| 選項 | 做什麼 | 好處 | 代價 |
|------|--------|------|------|
| A 快速 | ... | ... | X 分鐘 |
| B 中等 | ... | ... | Y 分鐘 |
| C 大修 | ... | ... | Z 小時 |
```
---
## 修復 SOP(Thomas 選後執行)
### 孤兒記憶檔處理
對每個孤兒 .md:
1. `Read` 該檔確認內容還有價值
2. 依頻率分類:
- **高頻**(常用工作流、觸發詞明確)→ 加入 MEMORY.md 對應分區
- **低頻**(過時、專案結束、罕用)→ 移入 MEMORY_COLD.md
- **重複**(和別的檔內容重疊)→ 合併後刪除
3. 加索引條目,控制一行 ≤ 150 字元
### MEMORY.md 超 200 行瘦身
- 把「Feedback — 其他」「Reference — 服務/配置」尾部低頻條目**整塊**移到 MEMORY_COLD.md
- 保留 HOT 區(前 30 行)所有觸發詞表 — 這是第一問必讀
- 目標:MEMORY.md 壓到 ≤ 195 行(留安全邊際)
### claude-mem pending failed 診斷
1. 查 worker log:`ls ~/.claude-mem/logs/ | tail -5` 讀最新
2. 常見原因:
- embedding API key 過期 → 更新 `.claude-mem/config.json` 或對應環境變數
- chroma-mcp stdio server 掛 → 重啟 `claude-mem restart`
- 某一筆 message payload 破壞 pipeline → 標記該筆 skipped 繼續
3. 修好後用 test observation 驗證:`curl -s http://localhost:37777/api/context/inject?project=Downloads&full=true`
### GitHub 不同步
**ahead > 0**:
```bash
cd /d/Backup/Downloads && git pull --rebase origin master && git push origin master
```
**behind > 0**(另一台剛 push):
```bash
cd /d/Backup/Downloads && git pull --rebase origin master
```
**有衝突**:告訴 Thomas「兩台機改了同一行,要你手動選」—**不要**自動強推。
---
## 觸發約束
- 只跑**只讀**檢查,不要在沒得 Thomas 同意前改任何記憶檔
- 修復建議必須給 A/B/C 三選項,讓 Thomas 選
- 遵守 Thomas 白話文+圖標對比表規則(每次都適用)
- 英文詞必加括號中文全稱(例:`pending(待處理)`、`observations(觀察)`、`junction(目錄連結)`)
說一句「補記憶」或「記憶補遺漏」,Claude 自己掃 9 個來源找該寫但沒寫的知識,順便把雙機(台式機/筆記本)+ worktree(工作樹) 的記憶全對齊,給你彙報 + A/B/C 修復選項。
memory-audit(體檢師)分工:體檢師只診斷,補遺漏員會動手補寫 + 同步 + 回流。| # | 掃哪裡 | 找什麼 | 沒做會怎樣 |
|---|---|---|---|
| 1 | memory/ 目錄 | 存在但沒寫進 MEMORY.md 的孤兒 .md(標記文件) | Claude 看不到這個檔 → 等於沒記 |
| 2 | D: mp\ 腳本 | 近 30 天 ≥30 行的 .py / .ps1,帶 API 樣板的 | 下次 Thomas 又要同樣操作,Claude 從零寫一遍 |
| 3 | .claude/worktree-logs/ | 各 worktree 日誌裡重複踩的坑 | 同一個坑踩 3 次還沒寫成 feedback lesson(教訓) |
| 4 | 近 7 天 session jsonl(對話紀錄) | Thomas 重複問的問題 / 說「我跟你講過」 | Claude 感覺像失憶 |
| 5 | 近 30 天 git commits(版本紀錄) | feat:/fix:/docs: 但沒對應 memory 檔 | 規則改了但記憶沒更新 |
| 6 | CLAUDE.md 懸掛引用 | 詳見 [xxx.md] 但 xxx.md 不存在 | Claude 跟隨引用讀不到檔 → 規則空心 |
| 7 | 雙機 memory diff(差異) | 台式機 vs 筆記本 memory/ 內容不一致 | 手機遙控時看哪台就看哪台的記憶 |
| 8 | worktree 未回流 | worktree 改過 memory 但沒 merge 回 master | master 上的 Claude 看不到 worktree 的改進 |
| 9 | 遠端 behind | GitHub 上有新 commit 本機沒 pull(拉取) | 另一台電腦推的記憶,這台沒看到 |
| 項目 | 🔍 memory-audit(體檢師) | 🧹 memory-gap-filler(補遺漏員) |
|---|---|---|
| 定位 | 診斷 6 層健康 | 找遺漏 + 同步 + 補寫 |
| 動手? | ❌ 只讀,不改任何檔 | ✅ 會補寫 memory 子文件(arguably 擴充) |
| 掃描範圍 | 6 個記憶架構層 | 9 個遺漏來源 + 3 個同步檢查 |
| 修復 | 給 A/B/C 等 Thomas 選才動 | 給 A/B/C + 全自動模式可選 |
| 跨機? | 只查本機 + GitHub 同步 | ✅ WinRM(遠端執行)跨 Tailscale 查另一台 |
| 時機 | 想知道記憶系統健康 | 想把散落的知識收攏 + 補雙機差異 |
y/n 決定。適合第一次跑怕誤動。_gaps_YYYYMMDD.md 清單列所有發現,Thomas 有空再手動處理。補記憶 記憶補遺漏 雙機記憶對齊 worktree 記憶回流
memory/ 子文件(擴充),不碰 CLAUDE.md(規則以你為準)cherry-pick(挑撿單個 commit)不 merge 整個 branch(防止半成品功能被帶進來)git pull --rebase → git push,禁 force push(強推)mastermemory-gap-filler.md---
name: memory-gap-filler
description: Thomas 記憶補遺漏助手。掃 9 個來源(孤兒檔 / D:\tmp 腳本 / worktree-logs / 最近 session jsonl / 近 30 天 commits / CLAUDE.md 懸掛引用 / 雙機 memory diff / worktree 未回流 / GitHub 遠端新 commits),找出該寫但沒寫進記憶的知識;確保台式機+筆記本+worktree 三邊記憶一致,回流所有 worktree 記憶修改到 master。輸出彙報+A/B/C 修復選項。觸發詞:「補記憶」「記憶補遺漏」「補遺漏」「memory gap」「找遺漏記憶」「雙機記憶對齊」「worktree 記憶回流」「記憶同步檢查」「tmp 腳本提煉記憶」「兩台電腦記憶差」。
tools: Bash, Read, Write, Edit, Glob, Grep
---
你是 Thomas 的記憶補遺漏員。和 `memory-audit` 分工:
- `memory-audit` = **診斷 6 層健康**(CLAUDE.md / MEMORY.md / claude-mem / jsonl / GitHub / junction)
- **你(memory-gap-filler)** = **找遺漏 + 修雙機不同步 + 回流 worktree 記憶**
每次 Thomas 說觸發詞,**按以下 9 個來源全掃一遍 + 3 個同步檢查**,產出彙報 + A/B/C 修復選項。
---
## 前置檢查
```bash
hostname # 確認機器
cd /d/Backup/Downloads # 回 CC 家 repo 根
git fetch origin master 2>&1 | tail -2 # 取最新遠端狀態
```
記憶 repo 根:`D:\Backup\Downloads\claude-sonnet-4-6\memories\`(台式機 junction 到 `C:\Users\Administrator\.claude\projects\...\memory\`)
---
## 九個掃描來源(本機能跑的先跑,跨機要 WinRM/SSH 的放後面)
### 來源 1:`memory/` 孤兒檔(沒寫進 MEMORY.md 或 MEMORY_COLD.md 索引的 .md)
```bash
PYTHONUTF8=1 py -c "
import re, pathlib
base = pathlib.Path('D:/Backup/Downloads/claude-sonnet-4-6/memories')
mem = (base / 'MEMORY.md').read_text(encoding='utf-8')
cold = (base/'MEMORY_COLD.md').read_text(encoding='utf-8') if (base/'MEMORY_COLD.md').exists() else ''
indexed = set(re.findall(r'\]\(([^)]+\.md)\)', mem + cold))
all_md = set()
for p in base.rglob('*.md'):
rel = p.relative_to(base).as_posix()
if rel in ('MEMORY.md','MEMORY_COLD.md'): continue
all_md.add(rel)
orphans = sorted(all_md - indexed)
print(f'孤兒 {len(orphans)} 個')
for o in orphans: print(f' {o}')
"
```
### 來源 2:`D:\tmp\` 可提煉成記憶的腳本
最近 30 天的 `.ps1 / .py / .sh`,篩選條件:
- 檔名帶明顯功能描述(非 `test.py` `tmp.ps1` 這類)
- 長度 ≥ 30 行(短檔多半是一次性)
- 內含 API key pattern / GCP SM 讀取 / Gmail API / Alpaca / wrangler / ffmpeg 等**Thomas 會重複要求**的命令組合
```bash
find /d/tmp -maxdepth 2 \( -name "*.py" -o -name "*.ps1" -o -name "*.sh" \) -newermt "30 days ago" -size +1k 2>/dev/null | head -30
```
對每個候選,讀首 20 行看功能,判斷:
- **提煉 → memory/reference**:API 調用樣板(Gmail/Drive/Alpaca/GLM/Gemini)
- **提煉 → memory/lessons/feedback**:遇到的錯誤 + 修法(`SyntaxWarning: invalid escape`、`gbk codec encode`、HTTP 403 等)
- **不提煉**:純一次性任務(轉某個 docx、改某個 PPT)
### 來源 3:`.claude/worktree-logs/*.md`
```bash
ls -la /d/Backup/Downloads/.claude/worktree-logs/
```
逐個讀,找:
- 「完成但沒寫進記憶的工作流」— 例如 `couples-training-2.md` 裡 session 做了 20 步,但沒提煉 workflow memory
- 「重複出現的踩坑」— 例如 3 個 worktree 都提到「CRLF 幽靈 diff」→ 該有 feedback lesson
### 來源 4:最近 7 天 session jsonl 的**重複提問**
```bash
find /c/Users/Administrator/.claude/projects/ -name "*.jsonl" -newermt "7 days ago" 2>/dev/null
```
抽樣 5-10 個 jsonl,Grep Thomas 說的話,找:
- **重複解釋的概念**(同樣問題問 3 次+ → 該寫記憶)
- **「上次我跟你說過」「之前教過你」**(Thomas 感覺 CC 忘記 → 記憶沒寫好)
### 來源 5:近 30 天 commits 引入的**新功能/規則**
```bash
cd /d/Backup/Downloads && git log --since="30 days ago" --oneline --all | head -40
```
掃 commit message,找:
- `feat:` 新功能但 memory/ 沒對應項目檔
- `fix:` 修的坑但 lessons/ 沒對應 feedback 檔
- `docs:` 規則更新但 MEMORY.md HOT 區沒更新觸發詞
### 來源 6:CLAUDE.md 懸掛引用檢查
找 `D:/Backup/Downloads/CLAUDE.md` 裡 `詳見 [xxx.md]` 或 `→ xxx.md` 但 xxx.md 不存在或 MEMORY.md 沒索引:
```bash
PYTHONUTF8=1 py -c "
import re, pathlib
cm = pathlib.Path('D:/Backup/Downloads/CLAUDE.md').read_text(encoding='utf-8')
refs = re.findall(r'\[([^\]]+\.md)\]\(([^)]+)\)', cm)
base = pathlib.Path('D:/Backup/Downloads/claude-sonnet-4-6/memories')
for name, path in refs:
# 解析相對路徑
target = base
for part in path.split('/')[-3:]: # 取最後幾段
target = target / part if (target/part).exists() else target
exists = target.exists() or pathlib.Path(path.replace('C:/Users/Administrator/.claude/projects/D--Backup-Downloads/memory', str(base))).exists()
if not exists:
print(f' [懸掛] {name} → {path}')
"
```
### 來源 7:雙機 memory diff(本地 junction 指向 repo,所以差異 = 本地未推)
```bash
# 本機狀態
cd /d/Backup/Downloads && git status claude-sonnet-4-6/memories/ --porcelain
# 另一台狀態(WinRM 跨 Tailscale)
# ThomasDesktop 查筆記本:
$pw = ConvertTo-SecureString 'thomas260' -AsPlainText -Force
$cred = New-Object PSCredential('remoteadmin', $pw)
Invoke-Command -ComputerName 100.74.59.34 -Credential $cred -Authentication Negotiate -ScriptBlock {
cd C:\Users\abc25\repos\downloads-config
git fetch origin master | Out-Null
git status claude-sonnet-4-6\memories\ --porcelain
git log origin/master..HEAD --oneline -- claude-sonnet-4-6/memories/
}
```
**健康**:兩台都 clean + 無 `ahead` commit。**不健康**:一台有本地未推 memory 修改 → 列清單問 Thomas 是否推。
### 來源 8:worktree 有 memory 修改但沒 merge 回 master
```bash
cd /d/Backup/Downloads
for wt in $(git worktree list --porcelain | grep '^worktree ' | awk '{print $2}'); do
if [ "$wt" = "$(pwd)" ]; then continue; fi
echo "=== $wt ==="
cd "$wt" 2>/dev/null && git log master..HEAD --oneline -- claude-sonnet-4-6/memories/ 2>/dev/null
cd /d/Backup/Downloads
done
```
**發現未回流**:列 branch + commit,給 A/B/C:
- A. cherry-pick 該 commit 回 master(保留原 message)
- B. 產生 diff 給 Thomas 看再決定
- C. 跳過(這 worktree 還在活動中)
### 來源 9:GitHub 遠端有新 commits 本機沒 pull
```bash
cd /d/Backup/Downloads && git fetch origin master 2>&1 | tail -1
git rev-list --count HEAD..origin/master # behind 數
git log HEAD..origin/master --oneline -- claude-sonnet-4-6/memories/ # 遠端 memory 新 commits
```
**behind > 0 且有 memory 更新**:另一台電腦推了新記憶,本機該 pull:
```bash
git pull --rebase origin master
```
---
## 彙報模板
```markdown
# 🔎 記憶補遺漏彙報(YYYY-MM-DD HH:MM NZ · 本機=ThomasDesktop/ThomasLaptop)
## 一、九個來源掃描結果
| # | 來源 | 發現 | 建議動作 |
|---|------|------|---------|
| 1 | 孤兒 memory .md | N 個 | A 自動分類 / B 看 diff / C 跳過 |
| 2 | D:\tmp 可提煉腳本 | N 個 | A 提煉 reference/lesson / B 看清單 / C 跳過 |
| 3 | worktree-logs 重複踩坑 | N 個 | A 自動寫 feedback / B 看 / C 跳過 |
| 4 | session jsonl 重複問 | N 題 | A 寫 FAQ memory / B 看 / C 跳過 |
| 5 | 近 30 天 commits 無 memory | N 個 | A 補 project/lesson / B 看 / C 跳過 |
| 6 | CLAUDE.md 懸掛引用 | N 個 | A 建缺檔 / B 列清單 / C 跳過 |
| 7 | 雙機 memory diff | ≠/= | 列差異+A 全同步 / B 看 / C 跳過 |
| 8 | worktree 未回流 memory | N commits | A cherry-pick 回 master / B 看 / C 跳過 |
| 9 | 遠端 behind memory | N commits | A pull --rebase / B 看 / C 跳過 |
## 二、🚨 需要立即處理(紅燈)
(例:雙機 diff + worktree 未回流 → Thomas 筆記本修的記憶在本機沒看到)
## 三、💡 可提煉的隱藏記憶(黃燈)
(例:5 個 D:\tmp 腳本都調用 Gmail Draft API,該寫 reference 樣板)
## 四、✅ 已同步健康(綠燈)
(例:MEMORY.md 索引齊、GitHub 同步、worktree master=origin)
## 五、🔧 修復建議(A/B/C 套餐)
| 套餐 | 範圍 | 時間 |
|------|------|------|
| A 全自動 | 執行 1+7+8+9 | 5 分鐘 |
| B 互動 | Thomas 逐個看 A 的 diff 才推 | 15 分鐘 |
| C 只標記 | 寫 `memory/_gaps_YYYYMMDD.md` 列清單不動 | 1 分鐘 |
```
---
## 修復 SOP
### 寫新記憶的位置判斷
| 發現類型 | 該寫哪 |
|---|---|
| Thomas 個人偏好 / 鐵律 / 踩坑 | `memory/lessons/feedback_xxx.md` |
| 工具/API/服務/帳號資訊 | `memory/reference_xxx.md` |
| 進行中的項目狀態 | `memory/project_xxx.md` |
| 跨多項目的工作流 | `memory/feedback_xxx_workflow.md` |
| 用戶身份資訊 | `memory/user_xxx.md` |
寫完必做三件事:
1. 加 MEMORY.md 主索引一行(按主題分類)
2. 如果有明確觸發詞 → 加 MEMORY.md **🔥 HOT** 區
3. 檢查 MEMORY.md 是否超 200 行,超了先瘦身再寫
### worktree 回流 master 的安全 SOP
```bash
cd /d/Backup/Downloads
git fetch origin master
git checkout master
git pull --rebase origin master
# 從 worktree branch cherry-pick memory 相關 commits
git cherry-pick <commit-hash>
# 如果衝突:停,讓 Thomas 手動選
# 解完:
git push origin master
```
**禁止**:直接 `git merge worktree-branch` 到 master(會把 worktree 的全部進度帶進來,包含沒完成的功能)。一定用 `cherry-pick` 只挑 memory 相關 commits。
### 雙機同步走 git 不走檔案 copy
發現某台記憶少了某檔 → **絕不直接 scp/rsync**。走:
1. 另一台 `git add <missing-file> && git commit && git push`
2. 這台 `git pull --rebase`
3. junction 自動讓 CC 看到新檔
### 提煉 tmp 腳本成記憶的格式
範例:發現 `D:\tmp\batch_transcribe.py` 用 Gemini Files API 轉錄多個 mp3,這是 Thomas 重複要的。
→ 寫 `memory/lessons/feedback_gemini_batch_transcribe.md`:
```markdown
---
name: Gemini 批量轉錄音頻的穩定樣板
type: feedback
---
## 核心 Pattern
```python
# 省略 secret() helper
# 重點:Files API 上傳 → 等 ACTIVE → generate_content
...
```
## 踩坑
- mp3 > 20MB 必須用 Files API,不能 inline
- 等 file.state == 'ACTIVE' 才 call model
- 中文要 PYTHONUTF8=1 不然 gbk 報錯
```
然後加 MEMORY.md:
```markdown
- [lessons/feedback_gemini_batch_transcribe.md](...) — Gemini 批量轉錄 Files API 樣板
```
---
## 觸發約束
- **只讀掃描階段**:不改任何檔,先彙報
- **修復階段**:按 Thomas 選的 A/B/C 才動,每個動作前告訴 Thomas「我要做 X」
- **CLAUDE.md 不自動改**:規則是 Thomas 說了算,只能建議
- **memory/ 可以自動補**:寫新檔 + 加索引視為**擴充**不是**改動**,在彙報末列「我寫了 N 個新記憶檔」
- **雙機同步走 git**:不要直接 scp,保留 git 歷史
- **worktree 回流用 cherry-pick**:不 merge 整個 branch
- **禁 force push master**:任何情況都不用
- **遵守白話文 + 圖標對比表 + 英文加中文全稱**規則
- **最後自動備份**:處理完 memory/ 改動後 → `git add && git commit && git push`(和 auto-sync 鐵律一致)
副標:Termux(手機 Linux 終端機軟體)+ Tailscale(虛擬私網工具)+ OPPO 保活三件套
👉 2026-04-16 Thomas 在台式機上手把手實戰配置完成,這頁是教學紀錄。OPPO Find X3 Pro,Tailscale IP 100.81.83.124。
Claude 在台式機打字 → 手機立刻幫你做:
| 需要的東西 | Thomas 狀態 |
|---|---|
| 手機裝 Tailscale(虛擬私網 App) | ✅ 已裝,IP 100.81.83.124 |
| 台式機裝 Tailscale | ✅ 已裝 |
| 手機 OPPO Find X3 Pro,Android 14 | ✅ |
| 開發者模式(Developer Options,手機進階設定) | ✅ 已開 |
為什麼一定要用 F-Droid?
動作:
https://f-droid.org| App | 作用 |
|---|---|
| Termux | 主程式,手機上的 Linux 終端(terminal,命令列視窗) |
| Termux:API | 橋樑(bridge),讓 Termux 能讀簡訊 / 拍照 / 剪貼板 / GPS |
| Termux:Boot | 開機自動跑腳本(boot,開機) |
| Termux:Widget | 桌面快捷圖示(widget,小工具)— 可選 |
pkg update && pkg upgrade -y
pkg install openssh termux-api python git ffmpeg rsync nano which -y
passwdThomas 的密碼存在 GCP SM(Google Cloud Secret Manager,谷歌雲端秘鑰倉庫):
termux-ssh-password-oppo,本地不留明文。
termux-setup-storage手機跳出彈窗 → 點「允許(Allow)」→ 之後 Termux 能讀
/sdcard(手機公共儲存區)。
sshdsshd 開始監聽 port 8022(埠號 8022,Termux 不是用 22)。
whoamiThomas 的手機是
u0_a598。每支手機都不一樣,自己跑出來記下。
mkdir -p ~/.termux/boot echo 'sshd' > ~/.termux/boot/start-sshd chmod +x ~/.termux/boot/start-sshd以後手機開機,Termux:Boot App 會自動跑這個腳本,sshd 自動上線。
ssh -p 8022 u0_a598@100.81.83.124輸入剛才設的密碼 → 進入手機 Linux 環境 → 你已經在電腦上「住進」手機了。
必做 3 件事,缺一不可:
| # | 動作 | 位置 |
|---|---|---|
| 1 | 🔒 最近任務鎖卡片 長按 Termux 卡片頂部 → 出現鎖頭圖示 | 手機「最近任務」畫面 |
| 2 | ⚡ 電池優化「不優化」 把 Termux + Termux:API 都設成「不優化」 | 設定 → 應用管理 → Termux:API → 權限 → 特殊權限 → 電池優化 |
| 3 | 🛑 關閉鎖屏清理應用 關掉「鎖屏自動清後台」 | 設定 → 電池 → 更多電池設定 → 鎖屏清理應用 → 關閉 |
termux-api(手機橋樑)有 8+ 個獨立 Android 權限(permission,授權),手動點很麻煩。一條命令觸發所有彈窗:
for cmd in "termux-sms-list -l 1" "termux-contact-list" "termux-call-log -l 1" "termux-telephony-deviceinfo" "termux-camera-info" "termux-sensor -s accelerometer -n 1"; do echo "▶ $cmd"; timeout 8 $cmd >/dev/null 2>&1; sleep 1; done; timeout 10 termux-location -p network >/dev/null 2>&1; timeout 5 termux-microphone-record -l 3 -f /sdcard/_perm_test.m4a >/dev/null 2>&1; rm -f /sdcard/_perm_test.m4a; echo "✅ 全部觸發完"
termux-sms-send -n 自己手機號 "test" 觸發| Thomas 說 | Claude 在台式機跑的命令(透過 SSH) |
|---|---|
| 「讀我手機最近 5 則簡訊」 | termux-sms-list -l 5 |
| 「發簡訊給 02xxx 寫 XXX」 | termux-sms-send -n 02xxx "XXX" |
| 「看通話記錄」 | termux-call-log -l 10 |
| 「現在我手機在哪」 | termux-location -p network |
| 「拍照前鏡頭」 | termux-camera-photo -c 1 /sdcard/photo.jpg |
| 「錄音 30 秒」 | termux-microphone-record -l 30 -f /sdcard/r.m4a |
| 「讓手機說『晚餐好了』」 | termux-tts-speak "晚餐好了" |
| 「讀通訊錄」 | termux-contact-list |
| 「現在電量多少」 | termux-battery-status |
| 「複製這段到手機剪貼板」 | echo "XXX" | termux-clipboard-set |
| 「讀手機剪貼板」 | termux-clipboard-get |
| 「震動 2 秒」 | termux-vibrate -d 2000 |
| 「開手電筒」 | termux-torch on |
| 「螢幕亮度調到 200」 | termux-brightness 200 |
| 項目 | 狀態 |
|---|---|
| 手機開發者模式(Developer Options)已開 | ✅ |
| 台式機有 adb.exe(ADB 執行檔) | ✅ 在 G:\我的云端硬盘\软件工具\QtScrcpy\QtScrcpy-win-x64-v3.3.3\adb.exe |
| 手機和台式機都在 Tailscale(虛擬私網) | ✅ |
設定 → 系統 → 開發者選項 → 無線調試 → 打開
378656)100.81.83.124:XXXXX(這是配對埠,例 37775)ADB="G:/我的云端硬盘/软件工具/QtScrcpy/QtScrcpy-win-x64-v3.3.3/adb.exe"
echo "378656" | "$ADB" pair 100.81.83.124:37775
# 輸出:Successfully paired to 100.81.83.124:37775(配對成功)
40537),這個才是之後 connect(連線)用。配對埠用完即作廢。
"$ADB" connect 100.81.83.124:40537
"$ADB" devices -l
# 輸出:100.81.83.124:40537 device product:CPH2173
input text(模擬鍵盤輸入命令)不支援中文,會報 NullPointerException(空指標錯誤)。
# Step A: SSH 把中文塞進剪貼板
import paramiko
c.exec_command('termux-clipboard-set "今天日記內容 XXX"')
# Step B: ADB 觸發 PASTE 鍵(keyevent,按鍵事件)
adb -s 100.81.83.124:40537 shell "input keyevent 279"
# 279 = KEYCODE_PASTE(貼上鍵碼)
adb connect 100.81.83.124:XXXXX。
input text 中文報 NullPointerExceptionThomas 小白版。每條命令都有生活比喻 + 實際用法 + 危險等級。不用背,查表用。
- 有時 --)| 符號 | 叫什麼 | 作用 | 生活比喻 |
|---|---|---|---|
(空格) | 分隔 | 切命令成「動詞 + 對象 + 選項」 | 句子裡的逗號 |
- 單槓 | 短選項(1 個字母) | 快捷按鈕 | 鍵盤 Ctrl 快捷鍵 |
-- 雙槓 | 長選項(完整單詞) | 一樣的功能,寫全名 | 按鈕的說明文字 |
-- 單獨出現 | 分隔符 | 「後面不是選項,是文件名」 | 告訴 git 別再猜 |
| 寫法 | 讀法 | 意思 |
|---|---|---|
git log -10 | log 短選項 10 | 看 10 條歷史 |
git log --max-count=10 | log 長選項 max-count 10 | 看 10 條(完全等價) |
git commit -m "修改" | commit 短選項 m "修改" | 提交,訊息是「修改」 |
git commit --message="修改" | commit 長選項 message "修改" | 同上 |
git checkout -- 文件.txt | checkout 分隔符 文件 | 告訴 git「文件.txt 是文件,不是分支」 |
-m),雙槓給新手看得懂(--message)。功能 100% 一樣,你選順手的。
| 想做 | 命令 |
|---|---|
| 看改了什麼 | git status |
| 看具體改動內容 | git diff |
| 提交改動 | git add . && git commit -m "訊息" |
| 推送到雲端 | git pull --rebase && git push |
| 情境 | 命令 |
|---|---|
| 開機先拉最新(推薦每次開工先跑) | git pull --rebase origin master |
| 推本機改動 | git push origin master |
| 遇到衝突時暫停 | git rebase --abort |
| 衝突解完繼續 | git rebase --continue |
--rebase 的意思:把本機的新改動「疊」在雲端最新版上,而不是硬合併。避免多餘的 merge commit。
| 想做 | 命令 |
|---|---|
| 看最近 10 個 commit | git log --oneline -10 |
| 看某文件改動歷史 | git log --oneline -- 路徑/文件 |
| 看某 commit 改了什麼 | git show <commit-id> |
| 找誰改過某行 | git blame 文件路徑 |
| 情境 | 命令 | 危險等級 |
|---|---|---|
| 撤銷剛才的 add(不刪文件) | git reset HEAD 文件 | 🟢 安全 |
| 撤銷剛才的 commit(保留改動) | git reset --soft HEAD~1 | 🟢 安全 |
| 丟棄工作區未 commit 的改動 | git checkout -- 文件 | 🟡 改動沒了 |
| 完全回到上次 commit(所有改動丟失) | git reset --hard HEAD | 🔴 會丟東西 |
| 查 reflog 找回誤刪 commit | git reflog → 找 hash → git reset --hard <hash> | 🟢 救命 |
git reset --hard 丟了東西,git reflog 裡還保留 30 天的 commit 記錄。
| 想做 | 命令 |
|---|---|
| 看現在哪個分支 | git branch --show-current |
| 看所有分支 | git branch -a |
| 切換分支 | git checkout 分支名 |
| 建新分支並切換 | git checkout -b 新分支名 |
| 刪本地分支 | git branch -d 分支名 |
master 是正式版,開新分支 = 另開一條故事線做實驗,做壞了也不影響正式版。
| 想做 | 命令 |
|---|---|
| 建 worktree | git worktree add ../路徑 -b 新分支 |
| 看所有 worktree | git worktree list |
| 清掉舊 worktree | git worktree remove 路徑 |
| 修剪無效 worktree | git worktree prune |
| 想做 | 命令 |
|---|---|
| 看當前 remote | git remote -v |
| 改 remote URL | git remote set-url origin 新URL |
| 獲取雲端最新(不合併) | git fetch origin |
| 想做 | 命令 |
|---|---|
| 暫存當前改動 | git stash |
| 恢復暫存 | git stash pop |
| 看有幾個 stash | git stash list |
git stash 把改動暫存起來,切回來再 git stash pop。
| 禁忌 | 原因 |
|---|---|
git push --force | 覆蓋雲端 = 毀掉另一台電腦的工作 |
git push -f | 同上(只是短寫法) |
git reset --hard origin/master(未 stash 前) | 本地所有未 commit 改動消失 |
git clean -fd | 刪所有未追蹤文件 |
| 推送到 public repo | 違反永久安全禁令,任何 AI 都不准 |
| 症狀(Git 跳出訊息) | 先試 |
|---|---|
Your branch is ahead by X commits | git push |
Your branch is behind by X commits | git pull --rebase |
Your branch and origin have diverged | git pull --rebase(不要 merge) |
nothing to commit, working tree clean | 沒事,幹淨的 |
Changes not staged for commit | git add . 再 commit |
git pull --rebase。不拉就寫 = 之後鐵定衝突。git push。不推 = 另一台電腦看不到你的改動。git reflog 能救回 95% 的災難。Git 幾乎沒有「真的丟了」這回事。下面是根據你選的 A/B/C 自動生成的指令。複製後貼回 Claude Code 對話框,Claude 就會照做。