📚 Claude 規則百科 · Thomas 小白學習版

這裡記錄你教給 Claude 的所有規則、Skills、Agents,用白話解釋給你看,同時附原文讓你學技術細節

-
Lessons 教訓
-
Skills 技能
-
Agents 專家
-
CLAUDE.md 段
-
User/Project/Ref

🕐 資料最後更新:載入中...

🎯 八大功能

💡 資料從哪來?GitHub repo thomastangnz-commits/downloads-config 是唯一真理源。兩台電腦關機了也沒關係,GitHub Actions 每天自動掃 + 更新本站。

🔒 私人互動記錄

🔒 私人頁面 Interaction Log
Thomas × Claude Code 互動錄 · 2026-04-15
2026-04-15 凌晨 4 段錄音/錄屏 | Gemini 2.5 Flash 逐字轉錄 | Prompt 優化分析。內容包含:手機 Unified 輸入法跳動、錄屏設定沒記住、WO Mic 純錄音、91 PDF + Notion 任務。
  • 🎬 原始錄音/錄屏直接在網頁播放
  • 📝 Gemini 逐字稿(中文為主)
  • 🖥 螢幕動作分析(無聲錄屏看得懂發生什麼)
  • 🎯 每段附「我想要 vs 我說了什麼 vs 更好的 Prompt」
密碼:和其他私人站共用(GCP SM cloudflare-pages-password-thomastangnz
🔒 開啟私人站 →
📅 建立:2026-04-15 02:15 NZT 🔄 更新:2026-04-15 02:15 NZT

📖 白話百科

每條規則 = 白話卡片(預設)+ 原文(點展開)。MVP 放 3 個示範,後續 GLM 批量生成 169 條。

Lesson 教訓 🔴 鐵律
刪檔案前一定先看再確認
Claude 要刪任何檔案前,必須先讀內容 + 告訴你刪什麼 + 等你說「刪掉」才動。
🩹 踩坑:2026-04-14 Claude 刪了 rule-sentinel.yml 沒查內容也沒問,git 歷史找不到,內容永久丟失。之後加了 L2 hook 強制。
  • Read 看內容
  • 告訴你:刪什麼、為什麼、能否恢復
  • 等你說「刪掉」才執行
觸發詞:刪掉 / 同意刪 / 確認刪除
📅 建立:2026-04-14 07:21 🔄 更新:2026-04-14 07:21
📄 查看原檔
---
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
CLAUDE.md 段落 🟡 計劃中
CC 家慢慢搬家(不一次改完)
6 個月慢慢把硬編碼 D:\Backup\Downloads 改成 D:\ClaudeCode,禁止大批量 sed。
  • 寫新路徑一律用 D:\ClaudeCode\
  • 改舊文件順手機會性替換
  • 大批量替換要你明確說「做一次大掃除」
觸發詞:遷移進度多少了 / 做最終改名
📅 建立:2026-04-14🔄 更新:2026-04-14
Agent 專家 🟢 健康
教會影片剪輯助手
給它影片路徑和剪輯要求,它用 ffmpeg 剪好拼好加背景音樂。
  • 多段剪切、無縫拼接
  • 背景音樂混音
  • 崇拜程序稿片段輸出
觸發詞:剪影片 / 做教會影片
📅 建立:2026-04-01🔄 更新:2026-04-01
📌 完整 169 條由 GitHub Actions + GLM-4-flash 每晚批量生成,成本 0。

🗺️ Claude 讀檔流程

每次你打開 Claude Code,它默認讀什麼?你說話後又讀什麼?看流程圖就懂。

階段一:CC 啟動時(一次性載入)

1
讀專案 CLAUDE.md
D:\Backup\Downloads\CLAUDE.md
→ 鐵律、永久規則、系統配置。整段貼進系統提示,每次對話都生效。
2
讀 MEMORY.md 索引
~/.claude/projects/.../memory/MEMORY.md
→ 這是一張「目錄」,列 169 條記憶每條的一句話描述。用得到才翻具體檔。
3
載入 settings.json
.claude/settings.json + 全局 settings
→ 權限白名單、bypassPermissions、hooks 掛鉤。
4
掃 Skills / Agents 定義
.claude/commands/*.md + .claude/agents/*.md
→ 只讀 frontmatter(描述),不讀內文。用到才完整載入。

階段二:你說話時(按需讀檔)

1
你打一句話
例:「幫我剪影片」
2
Claude 查 MEMORY.md 索引
看哪些記憶和「剪影片」有關,決定要展開哪些具體檔。
3
決定派誰做
→ 簡單任務自己做
→ Skill 觸發詞匹配 → 跑 SOP
→ Agent 描述匹配 → 派子對話做
4
工具前 hook 檢查
例:要刪檔 → PreToolUse hook 攔下要你確認。
5
回答完 Stop Hook
→ worktree 寫日誌 → master auto-sync(commit + pull --rebase + push)。

📌 小白必懂三件事

1. CLAUDE.md 每次都看 — 要永遠記住的鐵律寫這裡
2. Memory 按需看 — 場景化經驗寫記憶檔
3. Skill / Agent 觸發才看 — 流程寫 skill,角色寫 agent
⚠️ 禁忌:所有東西塞 CLAUDE.md → 每次對話都載入,浪費 context + 規則打架。
正解:鐵律進 CLAUDE.md;場景進 memory;SOP 寫 skill;角色寫 agent。

🏥 規則健康度

自動掃 169 條記憶 + 22 skills + 10 agents + 26 段 CLAUDE.md。

💡 A/B/C 按鈕怎麼用?
1. 逐張卡片點 A / B / C 選你的決定(右下會出現「已選項目」紫色氣泡)
2. 全選完點氣泡 → 彈視窗顯示生成好的指令
3. 點「複製指令」→ 貼回 Claude Code 對話框 → Claude 逐項執行整改
重點:網頁不會直接動你的檔,必須你貼指令回 Claude 才會執行,安全。
-
🟢 健康
-
🟡 小問題
-
🔴 大問題
📌 MVP 放 4 個示範。完整掃由 GitHub Actions 每週跑 regex + GLM 分析。
🔴 大問題Lesson
feedback_html_deploy.md 職責太多
一個檔塞了:HTML 製作 + 部署 + 中文路徑 + Tab 樣式 — 應拆 3 個。
🟡 小問題Lesson
feedback_recall.md 沒寫觸發詞
Claude 不知道你說「記憶」「recall」會觸發這條。description 建議加。
🔴 大問題CLAUDE.md
CC 家保護鐵律 和 刪除鐵律 部分重疊
兩段都在講「動重要檔前要停下來問」。建議合併或互相引用。
🟡 小問題Skill
多個 skill 硬編碼 D:\Backup\Downloads\
應改用相對路徑或環境變量,否則換電腦就壞(或未來物理改名也壞)。

🔄 雙機同步健康度

GitHub Actions 每天 6 點 NZ 自動檢查。

🟢 最後檢查:2026-04-14 06:00 NZ — 全部正常
檢查項台式機筆記本狀態
最後 push 時間04-14 14:3204-13 22:10🟢
CLAUDE.md MD5a3f...a3f...🟢 一致
MEMORY.md MD5b7c...b7c...🟢 一致
settings.json hooks4 個4 個🟢
auto-sync 最近 3 天12 次5 次🟢
孤兒分支00🟢

紅燈時怎麼辦

🔴 MD5 不一致 → 可能一台 push 前另一台也改了。到兩機 git log CLAUDE.md 看誰晚,晚的那台 git pull --rebase
🔴 一機 >24h 沒 push → 那台可能關機或 hook 壞了。開機後應該自動同步。

🌳 Worktree 看板

分支機器用途最後動作狀態
claude/2026-04-10-desktop-nas-improve台式機NAS 改進2026-04-10🟡 進行中
claude/youthful-chatelet台式機(未標註)-🟡 待合併
📌 資料源:.claude/worktree-logs/ 每個分支最後 Stop Hook 寫入。

💬 誤關對話怎麼辦(鐵律:永遠找得回)

🟢 鐵律
Claude 對話記錄永遠不會消失
每個對話完整存在 C:\Users\Administrator\.claude\projects\<工作目錄>\<uuid>.jsonl。關 terminal、電腦重啟、誤按 X 都不丟。
🩹 踩坑:2026-04-15 Thomas 不小心關了一個正在做 jingdian-petfoods.pages.dev 網站 + 聊 Alex 吃飯的對話,以為丟了。實際上 session 完整在 C--Users-Administrator/8fe2057c-....jsonl,用 --resume 10 秒找回。

🔍 找回 3 種方法

方法 1:互動選單(最簡單)
原本那個工作目錄 跑:
cd <工作目錄>        # 例:C:\Users\Administrator
claude --resume
彈選單列最近 session,選一條繼續。
方法 2:指定 session ID(精準)
claude --resume 8fe2057c
8 位 uuid 開頭就夠。
方法 3:關鍵字搜(記不得哪個)
grep -l "Alex" C:/Users/Administrator/.claude/projects/**/*.jsonl
搜到 jsonl 檔 → 取 uuid → claude --resume <uuid>

🛡️ 防誤關:Windows Terminal 設定

打開 Windows Terminal settings.json
Win+R → 貼:%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
加這兩行在頂層:
{
  "confirmCloseAllTabs": true,
  "warnOnClose": "always"
}
  • confirmCloseAllTabs → 關整個視窗時確認(穩定版支援)
  • warnOnClose → 任何關 tab 都確認(Preview 版)
改完存檔即生效,不用重啟。想關掉改 false"never"
⛔ 別做這些:
  • ❌ 不要 rm jsonl 檔 → 會真的丟
  • ❌ 不要改工作目錄再 --resume → Claude 找不到
  • ❌ session 檔幾 MB 是正常的(累積 tool output),別嫌大刪

🕵️ 偵探 SOP(Thomas 說「剛才關了個對話」時 CC 自動跑)

  1. 定位 project 目錄(工作目錄 / : 換成 --
  2. 列今天 jsonl + mtime 排序
  3. 按關鍵字數命中定位目標 session
  4. 回報:session id + 工作目錄 + 首條訊息 + 主題
觸發詞:不小心關了 / 找回對話 / tree標籤找不到 / resume
📅 建立:2026-04-15🔄 更新:2026-04-15

🗣️ 不用打命令 · 中文口訣對照表

小白講中文,Claude 幫你打命令
Thomas 不會打英文命令(command,指令),下面所有動作都講中文即可:
你說這句(中文) 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 的狀態清單
🎯 小白記這 3 句就夠(一日流程)
  1. 開工前:「檢查有沒有新規則」
  2. 工作中覺得可能和另一台電腦衝突:「同步 master」
  3. 收工前:「更新 log 然後推上去」
其他一概不用打命令,中文講就行,Claude 幫你打。
⛔ 會互相覆蓋的 2 種情況
  • 記憶文件併發寫 — 同時間兩台電腦/兩個 tree 的 Claude 都改 MEMORY.md → 後存的贏,前面改動沒了。解決:說「同步記憶」
  • master 雙機同時 push(推) — 台式機和筆記本同時推主分支 → 後推的被擋要 rebase(重疊)。解決:說「同步 master」先拉再推

🚛 批量同步所有 worktree(Thomas 2026-04-15 提問)

小白原始問題
「你把這些 tree(樹)按照順序,依次每個都同步 master,我不知道是否可以同時 tree 同步到 master,因為不知道是不是會互相覆蓋,如果會,你就一個一個同步到 master」

🤔 第一個坑:「同步到 master」其實有兩個方向,意思完全不一樣

方向 意思 比喻 風險
A. merge → master
(交回)
把 worktree(工作樹)分支裡做好的東西,合進主分支 員工把做好的作品交回總部 ⚠️ 半成品/實驗代碼會污染 master
B. pull master → worktree
(補給)
把 master(主分支)最新內容拉進每個 worktree,讓它們跟上 總部把最新資料派送給員工 ✅ 低風險,只是更新 worktree
🗣️ 小白觸發詞(對應上面兩個方向)
  • 「交貨到 master」 → A 方向(merge 合進主分支)
  • 「worktree 跟上 master」 → B 方向(pull 拉最新進 worktree)
講中文就行,Claude 幫你打 git(版本控制工具)命令。

❓ 第二個問題:會不會互相覆蓋?能不能同時做?

做法 技術上 結論
依次做(一個一個) git(版本控制)每步疊在上一步基礎上,不會覆蓋 安全
同時做(全部一起) git 本身不允許同一 repo(倉庫)多個 merge(合併)同時跑 — 會鎖住 .git/index.lock 技術上不可能,不是怕覆蓋,是 git 機制
🎯 結論
  • 只能依次做,這是 git 的機制決定的,不是選擇題
  • 依次做不會互相覆蓋,放心
  • 真正的風險不是「覆蓋」,是 merge 衝突(兩個分支改了同一檔同一行) — git 會停下來讓你選保留哪版

🩺 開工前必做:先體檢,再同步

直接「全部同步到 master」很危險
13 個 worktree 裡可能有:半成品、實驗稿、已廢棄、還在開發 — 全部交貨會污染 master。
正確順序
  1. 體檢:每個 worktree 對 master 領先幾個 commit(存檔點)?落後幾個?內容摘要是什麼?
  2. 分類:值得合的 / 該刪的 / 該繼續做的
  3. 依次處理:該合的 merge 進 master,該刪的 remove,該留的拉最新 master 進來
觸發詞體檢所有 worktree

📋 口訣新增(跟上面對照表合起來用)

你說這句 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 ✅ 低風險,可放心批量
📅 建立:2026-04-15🔄 更新:2026-04-15

🌱 新建 worktree 的 base(基礎點)規則

🧒 一句話比喻
新建 worktree(工作樹)就像公司派新員工做任務:從「總部最新版本」拿一份資料影本給他,而不是從別的員工手上抄(怕抄到半成品)。

🎯 Claude 的默認規則:基於 master 最新 commit 建

✅ Thomas 說「進 worktree 做 XXX」時,Claude 自動跑:
cd D:/Backup/Downloads
git pull --rebase origin master       # 先拉最新
git worktree add .claude/worktrees/<名字> -b claude/<前綴>-<用途> master
  • 第一步永遠先同步 master — 拿最新的
  • 新分支永遠從 master 長出來 — 乾淨起點
  • 分支名必帶機器前綴 — 防兩台電腦撞名

📛 命名口訣(機器前綴 + 用途)

機器 前綴 範例
🖥️ 台式機claude/desktop-claude/desktop-alexclaude/desktop-church-ppt
💻 筆記本claude/laptop-claude/laptop-sermon-page
📱 手機 Remote Controlclaude/phone-claude/phone-quick-fix-2026-04-15

🤔 為什麼基於 master,不基於別的 worktree?

選項 好處 壞處
基於 master
(Claude 默認)
乾淨起點、不繼承實驗代碼、不被別人的半成品污染
⛔ 基於某個 worktree 可以「延續」那個工作 會繼承那個 tree 所有實驗性改動,未來合併時會打架(merge conflict)

🔀 例外:延續某個 worktree 的工作

只有 Thomas 明確說「延續 XXX 的工作繼續做」,Claude 才會用別的 branch 當 base
git worktree add <新路徑> -b claude/desktop-alex-follow-up claude/desktop-alex
  • 默認觸發詞是「進 worktree 做 XXX」→ 永遠基於 master
  • 只有說「延續 alex 繼續做」「接著 alex 那邊做」才會基於 claude/desktop-alex
如果你沒明說,Claude 默認基於 master,不會自作主張延續別的 worktree。

📋 口訣新增

你說這句 Claude 幫你做的事 base 是什麼
「進 worktree 做 XXX」
默認
從 master 長新分支 claude/<機器>-XXX 🌳 master 最新
「延續 XXX 繼續做」
或「接著 XXX 那邊做」
claude/<機器>-XXX 長新分支加 -follow-up 🔗 那個 worktree 最新
📅 建立:2026-04-15🔄 更新:2026-04-15

🔄 Worktree 生命週期全圖(建 → 工 → 合 → 棄)

🧒 一句話比喻
一個 worktree(工作樹)就像公司派一個員工去做新任務:
🟢 建立=報到入職 → 🟡 工作中=做事 → 🔵 合併回 master=交作業 → 🧟 棄掉=離職收工牌
🟢
階段 1 · 建立(員工報到)
  • 狀態圖標:🟢 新建
  • 觸發詞:開新 worktree 做 XXX / 派個 tree 處理 XXX
  • 背後 git 命令:git worktree add .claude/worktrees/<name> -b claude/desktop-<name>
  • 比喻:HR(人資)給員工一個工位 + 工牌(新分支 branch),把入職資料夾準備好
  • 產物:新資料夾 + 新 branch(分支),HEAD(當前位置指針)指向 master 最新 commit(存檔點)
🟡
階段 2 · 工作中(員工做事)
  • 狀態圖標:🟡 進行中
  • 觸發詞:進 XXX 這個 tree / 在 XXX tree 繼續
  • 背後 git 命令:cd <worktree path> && git add . && git commit -m "..."(可能多次)
  • 比喻:員工每做完一段,存一張「進度照」(commit);下班 push(推送)到雲端備份
  • 注意:每天可能有 auto-sync: desktop(自動備份 commit),那不是真工作,只是 hook(鉤子)幫你存一次
🔵
階段 3 · 合併回 master(員工交作業)
  • 狀態圖標:🔵 待合併 → ✅ 已合併
  • 觸發詞:交貨到 master / 合併 XXX 進 master
  • 背後 git 命令:git checkout master && git pull --rebase && git merge claude/desktop-<name> && git push
  • 比喻:員工把作品交回總部 → 主管審 → 收進公司主檔案庫
  • 可能踩坑:⚔️ merge(合併)衝突 — 見下一節
🧟
階段 4 · 棄掉(員工離職收工牌)
  • 狀態圖標:🧟 廢棄 / 已清理
  • 觸發詞:棄這個 worktree / 清掉 XXX tree
  • 背後 git 命令:git worktree remove <path> && git branch -d claude/desktop-<name> && git worktree prune
  • 比喻:HR 收回工牌 → 清空工位 → 員工檔案歸檔
  • 注意:合併過的才能 -d 安全刪;沒合過要強刪 -D(會丟工作,先確認)
階段圖標典型時長master 上看得到嗎?
建立🟢幾秒❌ 還沒,分支獨立
工作中🟡幾小時 ~ 幾週❌ 尚未合進來
合併回 master🔵→✅幾分鐘✅ 合完就在
棄掉🧟幾秒✅ 內容已在 master,分支可消失
📅 建立:2026-04-15🔄 更新:2026-04-15

⚔️ merge 衝突處理 SOP(兩分支改同一行怎麼辦)

🧒 一句話比喻
兩個同事同時改一份 Word(文書檔)同一句話,存檔時系統不知道該留誰的 → 停下來問你「你想要 A 還是 B 還是兩個都留?」這就叫 conflict(衝突)

🔍 git 遇到衝突會做什麼

git 動作 白話解釋
停下整個 merge(合併)不繼續往下跑,等你決定
檔案內容變「花」在衝突的那段塞入特殊標記 <<<<<<< ======= >>>>>>>
git status 顯示「Unmerged paths」列出哪些檔有衝突
📄 衝突檔案長這樣(範例:CLAUDE.md 同一行)
原來的內容...

<<<<<<< HEAD(當前分支:master)
- 早會時間:早 6 點
=======
- 早會時間:早 7 點
>>>>>>> claude/desktop-church-program-ppt(要合進來的分支)

下面的內容...
⚠️ 這 5 行(含 3 個標記行 + 兩個版本)是 git 自動加的,必須挑一個版本留下、刪掉所有標記行,檔案才算修好。

🤝 Claude vs Thomas 各做什麼

角色該做不該做
Claude ✅ 立刻停下、不自作主張
✅ 把衝突段落貼給 Thomas 看
✅ 解釋 A 版 vs B 版差別
✅ 等 Thomas 講「留 A」/「留 B」/「兩個都留」才動手
⛔ 自己選一個版本接著做
⛔ 用 --ours / --theirs 偷懶
⛔ 跳過 commit 直接 push
Thomas ✅ 看 Claude 貼的兩個版本
✅ 講中文:「留 master 的」/「留 worktree 的」/「兩個都留」/「混合:取 A 的時間 + B 的細節」
⛔ 不用打 git 命令
⛔ 不用記 <<<<<<< 是什麼意思

🎬 完整範例:CLAUDE.md 同一行兩邊改了不同內容

1
Claude 跑:git merge claude/desktop-church-program-ppt
git 回:CONFLICT (content): Merge conflict in CLAUDE.md
2
Claude 立刻停下,打開 CLAUDE.md,把衝突段貼給 Thomas 看:
🔵 master 版本:「早會時間:早 6 點」
🟢 worktree 版本:「早會時間:早 7 點」
❓ Thomas,要哪個?或者寫成「早 6 點(夏令)/ 7 點(冬令)」?
3
Thomas 講:「留 worktree 的,早 7 點」
4
Claude 改檔:刪 3 個標記行 + master 那行,只留 - 早會時間:早 7 點
5
Claude 收尾:
git add CLAUDE.md
git commit              # git 自動填好 merge commit message
git push origin master
🗣️ 觸發詞(衝突時 Thomas 講這幾句即可)
  • 有衝突怎麼辦 → Claude 進入衝突處理 SOP
  • 解衝突 → 同上
  • 留 master 的 / 留 worktree 的 / 兩個都留 → 告訴 Claude 怎麼選
⛔ 衝突時別做的事
  • ❌ 別 git merge --abort 然後就跑掉 — 衝突會一直在
  • ❌ 別關 terminal 假裝沒事 — repo 會卡在「合到一半」狀態
  • ❌ 別 git push --force — 會把另一台電腦的工作覆蓋掉
📅 建立:2026-04-15🔄 更新:2026-04-15

🧟 孤兒 / 廢棄 worktree 清理

🧒 一句話比喻
孤兒 worktree = 員工已經離職了,但工牌、工位、檔案夾還留在公司,沒人收。久了公司一堆殭屍檔案,誰都不知道哪個還活著。

🩺 怎麼識別「廢棄」

判斷條件 嚴重度 白話解釋
最後活動超過 14 天 🟡 可能廢棄 兩週沒人碰 = 八成忘了
detached HEAD(無分支名) 🔴 幾乎肯定廢棄 「員工沒掛工牌」= 沒分支管,commit(存檔)了也沒人指得到
commit 全是 auto-sync: desktop,沒實質工作 🧟 殭屍 只有自動備份在動,真人沒做事,可以刪
名字是隨機英文(如 youthful-chatelet)+ 只有 auto-sync 🧟 高機率殭屍 系統自動取的名 + 沒實質工作 = 開了沒用過

📸 2026-04-15 快照(Thomas 台式機現場體檢)

📊 共 11 個 worktree(不含 master 主目錄)
🟢 活躍 1 個 | 🟡 閒置可審 7 個 | 🔴 detached 1 個 | 🧟 高機率殭屍 2 個
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
🩺 體檢結論(給 Thomas 的建議)
  • 🟢 alex — 今天還在用,繼續
  • 🟡 hopeful-ellis / desktop-chores / xenodochial-taussig / skills-agents-site / 4 個 church 系列 / wechat-group-site / nas-improve(共 8 個)— 閒置 1~5 天,逐個問 Thomas「這個任務做完了嗎?」做完就合併或刪除
  • 🔴 flamboyant-ramanujan — detached HEAD,隨機名,無真工作 → 建議直接 remove(先 prune 確認)
  • 🧟 youthful-chatelet — 隨機名 + 只有 auto-sync 4 天 → 建議刪(系統自動開的空殼)

🧹 清理命令(Claude 幫你打)

場景 命令 白話
正常刪一個合過的 worktree git worktree remove <path> 收工牌 + 清工位
刪分支(合過 master 才能 -d 安全) git branch -d <branch> 歸檔員工檔案
強刪沒合過的分支(會丟工作) git branch -D <branch> ⚠️ 銷毀檔案,先確認
清理「資料夾刪了但 git 還記得」的孤兒 git worktree prune 把死亡記錄從 git 帳本擦掉
看現在還有哪些 worktree git worktree list 列員工花名冊
🗣️ 觸發詞
  • 清理廢棄 worktree → Claude 跑體檢 + 列建議清單
  • 找孤兒 tree → 同上,重點找 detached HEAD
  • worktree 體檢 → 出當前快照表(像上面 2026-04-15 那樣)
  • 刪掉 XXX tree → Claude Read + 確認 + 跑 remove
⛔ 清理時別做的事
  • ❌ 別 rm -rf .claude/worktrees/xxx — git 帳本會留鬼影,後續 prune 才會清
  • ❌ 別一次 -D 強刪所有閒置 — 萬一某個其實有未推 commit,工作沒了
  • ❌ 別自動跑「全部清理」— 必須逐個問 Thomas(特別是 ahead > 0 的)
📅 建立:2026-04-15🔄 更新:2026-04-15

📱 手機 Remote Control 禁忌 + 正確做法

⛔ 三大禁忌

1. 直接在 master 改東西
後果:Stop hook auto-sync 會 commit + push,錯了難回滾。
✅ 正確:說「進 worktree 做 XXX」,Claude 自動建 claude/phone-用途-日期
2. 兩台電腦同時開同名 worktree
後果:合併時 rebase 衝突。
✅ 正確:命名帶機器前綴(phone-/dt-/lp-)。
3. worktree 做完沒合併就開新的
後果:一堆孤兒分支。
✅ 正確:說「合併」或「棄這個 worktree」。

✅ 手機口訣

:「進 worktree 做 [事情]」
:「看 worktree 看板」
:「合併這個 worktree 到 master」
:「棄這個 worktree」(會確認你才刪)

📊 成長曲線

-
過去 7 天新增
-
總 lessons
-
總條目

過去 7 天新增的(最新 20 條)

最近在教 Claude 什麼(TOP 3)

  1. 遠程控制 + 家人電腦 — 24 條
  2. 教會影片/PPT 自動化 — 18 條
  3. 網頁部署 + Cloudflare — 15 條
📌 Phase 2 加完整圖表。

🔍 觸發詞衝突偵測

🟡 衝突
「備份」同時觸發 2 條規則
  • feedback_git_backup.md — AI 禁止自動 push
  • CLAUDE.md 配置備份段 — AI 可自動 push/pull
兩條互相矛盾!Claude 按哪條執行看載入順序,不穩定。
🟢 無衝突
其他 167 條無重複觸發詞

🌐 網站庫存審計

掃描 Cloudflare Pages 所有站,對照 thomastangnz-commits/ 下是否有 GitHub repo。

-
總站數
-
✅ 有 repo
-
❌ 缺 repo
💡 怎麼補?
對缺 repo 的站點擊 「A. 補 repo」 加入購物車,點右下氣泡複製指令貼回 Claude,Claude 會批量:
① gh repo create --private ② git init + 首次 push ③ 寫 auto-deploy workflow ④ 推 production

❌ 缺 repo 的站(違反 CLAUDE.md 鐵律)

✅ 已有 repo 的站

🛡️ 安全守衛

GitHub Actions 每日早 7 點(NZ)自動掃描 thomastangnz-commits 下所有 repo 的 public/private 狀態。發現 public 會立即發郵件到 thomastangnz@gmail.com,附一鍵修復指令。

-
總 repo
-
🔒 私人
-
⚠️ Public
載入中…

📋 全部 repo 清單

🔧 如果發現 public 怎麼辦

1. 打開郵箱 thomastangnz@gmail.com
找標題「⚠️ GitHub 可見性警報」的郵件
2. 複製郵件裡的 gh repo edit ... --visibility private 指令
郵件會列出每個違規 repo 對應的修復命令
3. 貼回 Claude Code 對話框執行
Claude 會逐個改回 private,再回報結果
💡 為什麼這麼設計:雲端排程獨立於兩台電腦,即使 CC 家被駭或本地腳本壞掉,守衛仍在掃。郵件 + 手動貼指令比自動改回安全 — 萬一誤判也不會亂動 repo。

🔗 thomas-share 隔離設計守衛

thomas-share.pages.dev 用「假 404 首頁」隔離 — 朋友拿到單篇分享 URL 只能看那篇,進不了其他。每日掃描 //index.html/404.html 和亂猜路徑,確認四個都回傳假 404(「This link is not valid」)。任何一個回傳真實內容 → 郵件告警。

載入中…

📋 本次探測結果

⚠️ 破壞情境:未來 Claude 不知情把 index.html 改成真正首頁/導航 → 隔離立刻破功,朋友就能爬到所有分享頁。守衛偵測到就發郵件,修復:重新把 index.html 內容複製成 404.html 的假 404 頁,然後 wrangler pages deploy

🧠 記憶升級 — 從「金魚腦」到「自動學習系統」

起源:Thomas 說「我累死了,每次你都記憶太浅,不同窗口記的都不同」。2026-04-16 完成三層升級。

✅ 已完成部署(2026-04-16) — 三層記憶系統上線:瘦身索引 + 錄像搜尋 + 自動學習。

1️⃣ CC 記憶的根本問題

🐟 生活比喻:CC 像金魚缸裡的金魚 — 每次開新窗口 = 新出生的金魚。
金魚醒來先看魚缸壁上貼的紙條(CLAUDE.md + MEMORY.md),但紙條太長看不完
看到的紙條不同 → 不同窗口「記得」的東西不同 → Thomas 崩潰。
問題原因後果
不同窗口記憶不同MEMORY.md 超過 200 行被系統截斷(原本 259 行)後半段記憶索引 CC 看不到
Thomas 糾正了還犯同樣的錯糾正只存在當次對話,沒有自動存成教訓下次新窗口又忘
歷史對話全忘CC 沒有跨對話的「大腦」,只有啟動時看紙條同樣的問題解釋 10 遍

2️⃣ 三層解決方案(已部署)

🏗️ 建築比喻
第 1 層(地基)= 把便利貼整理乾淨,金魚能看完全部 → MEMORY.md 瘦身
第 2 層(監控)= 裝攝像頭,錄下每天做的事,明天可以搜 → claude-mem
第 3 層(導師)= 配一個導師,Thomas 罵的時候自動記筆記 → claude-reflect
工具比喻解決什麼狀態
第 1 層MEMORY.md 瘦身📋 整理便利貼259→189 行,不再截斷,所有窗口看到一致索引
第 2 層claude-mem v12.1.5📹 監控攝像頭自動錄對話 → 壓縮摘要 → 下次用語意搜尋注入
第 3 層claude-reflect v3.1.0🧑‍🏫 實習導師Thomas 說「不對!」→ 自動記教訓 → 下次不再犯

3️⃣ 第 2 層:claude-mem — 錄像 + 語意搜尋

GitHub 57,900+ 星,CC 最火的記憶插件。

📹 運作比喻:公司裝了監控攝像頭。
1. 每天自動錄下員工(CC)做的所有事
2. 下班後把錄像壓縮成精華片段
3. 明天新員工(新 CC 窗口)來了,根據今天的任務,自動播放最相關的片段給他看
項目說明
安裝npx claude-mem install
搜尋CC 裡輸入 /mem-search
本地面板http://localhost:37777
存儲位置~/.claude-mem/(SQLite + ChromaDB 向量資料庫)
碰 CLAUDE.md?❌ 不碰,完全獨立存儲
Hook 事件做什麼
SessionStart(開始對話)從 ChromaDB 載入相關歷史
UserPromptSubmit(你發訊息)搜尋語意相似的過去觀察
PostToolUse(工具用完)記錄工具使用觀察
Stop / SessionEnd(結束)壓縮+存儲本次對話

4️⃣ 第 3 層:claude-reflect — 自動學教訓

GitHub 910 星,唯一能同時從錯誤成功中學習的 CC 插件。

🧑‍🏫 運作比喻:給實習生配了一個導師。
1. Thomas 說「不對!用 X 不用 Y」→ 導師立刻記下
2. Thomas 說「完美!就這樣」→ 導師也記下(這招有效)
3. 下次碰到類似的事 → 導師提醒實習生正確做法
4. Thomas 用 /reflect 審查導師的筆記,決定保留哪些
命令做什麼
/reflect審查排隊中的教訓,決定保留哪些
/reflect --scan-history掃描所有歷史對話,補抓以前漏掉的糾正
/reflect --dry-run預覽但不寫入(先看看學了什麼)
/reflect --dedupe合併重複的教訓
/reflect-skills發現重複工作模式,自動生成快捷命令
/view-queue查看排隊中的教訓
Hook 事件做什麼
UserPromptSubmit(你發訊息)偵測糾正模式(「不對」「用 X」「actually」)
SessionStart(開始對話)提醒有待審查的教訓
PreCompact(壓縮前)備份排隊教訓防丟失
PostToolUse: Bash(commit 後)提醒跑 /reflect

5️⃣ GitHub 社區方案全景(為什麼選這三個)

#工具星數比喻能力Thomas 選?
claude-mem57,900+📹 監控攝像頭錄像 + 語意搜尋✅ 已裝
claude-reflect910🧑‍🏫 導師從糾正學 + 從成功學✅ 已裝
claude-memory-compiler744📰 日報編輯每天 6 點編譯知識庫❌ 6 點門檻被罵
claude-code-auto-memory134📝 自動秘書自動更新 CLAUDE.md❌ 全自動怕寫亂
engram2,566🗄️ 記憶資料庫SQLite 全文搜索❌ 要 Go 運行時
Hermes Agent89,700+🤖 自進化 AI自寫技能卡+自改進⛔ 不支援 Windows
mcp-memory-service1,676🏠 雲端檔案室知識圖譜 + 三端共享⏸️ 未來升級方向

6️⃣ Hermes Agent — 為什麼沒選

🤖 Hermes Agent(NousResearch,89,700+ 星)是 GitHub 上最強的「自進化 AI」。
它的自學原理:做完任務 → 自己寫技能卡 → 下次碰到類似的自動調用 → 技能卡越改越好

但有 3 個致命問題:
問題說明
⛔ 不支援 Windows只能裝在 Linux / WSL,官方明確寫「Native Windows is not supported」
⛔ 取代 CC 不是加強 CCHermes 是獨立系統,用自己的模型(不是 Claude),切過去現有記憶全廢
⛔ 架構倒置Hermes 設計成「當經理」指揮 CC 幹活,不能反過來讓 CC 指揮 Hermes
結論:Hermes 的自學原理很好(寫技能卡),但 claude-reflect 已經用更輕量的方式實現了同樣的事 — 從糾正中學習並寫進 CLAUDE.md。不需要換系統。

7️⃣ claude.ai(網頁/手機)和本地 CC 的記憶共享

⚠️ 殘酷事實:兩邊完全獨立,沒有任何同步機制
你在手機 claude.ai 教它的東西,本地 CC 永遠看不到。反過來也一樣。
Anthropic 沒有提供打通兩邊的 API。
項目claude.ai(手機/網頁)本地 CC
記憶存在哪Anthropic 雲端伺服器你電腦本地文件
學習方式自動從對話中蒸餾(每 24 小時)CLAUDE.md + MEMORY.md + 插件
跨設備✅ 手機 ↔ 網頁自動同步✅ 兩台電腦靠 Git 同步
互通⛔ 不互通 — 需手動複製
未來升級方向:部署 mcp-memory-service 到 GCP Cloud Run,讓本地 CC、網頁版、手機版都連同一個記憶倉庫。觸發詞:「開始部署記憶升級計劃」「記憶雲端」

8️⃣ 插件安全注意事項

風險說明對策
PostToolUse 衝突reflect 和 mem 都 hook Bash 的 PostToolUse(CC bug #42702)目前實測無影響;reflect 那個 hook 只是提醒
CLAUDE.md 衝突reflect 會寫 CLAUDE.md;mem 不碰reflect 有 /reflect 人工審核門
筆記本同步插件安裝是 per-machine,筆記本需另裝教訓寫進 CLAUDE.md 後走 Git 同步

🔍 記憶系統自我審計(memory-audit agent)

說一句「審計記憶」,Claude 自己跑 6 層體檢(鐵律檔/索引/插件/對話備份/雲端/雙機),給紅綠燈彙報 + A/B/C 修復選項,你才決定改不改。

Agent 專家 🟢 可用
memory-audit — 記憶體檢師
像年度體檢,六個部位從頭掃到腳:鐵律檔還活著嗎?索引有沒有斷鏈?插件壞了沒?對話有備份嗎?GitHub 同步嗎?兩台電腦一致嗎?
🩹 踩坑:2026-04-16 Thomas 發現另一個 CC 說不出記憶系統狀態,必須手動逐層查。於是加了這個 agent,一句話跑完整體檢。
  • 30 秒只讀檢查 — 不動任何記憶檔,絕對安全
  • 🚦 紅 / 黃 / 綠 三燈告訴你哪一層有事
  • 🩹 修復三選項(A 快速 / B 中等 / C 大修),你選 Claude 才動手
觸發詞: 審計記憶 記憶健康檢查 memory audit 孤兒記憶檔 claude-mem 壞沒
📅 建立:2026-04-16 🔄 更新:2026-04-16

🏥 六層體檢項目(白話對照表)

#部位白話解釋壞了會怎樣
1CLAUDE.md 鐵律檔家規檔 — CC 一開機全文背起來檔案沒了 → CC 忘光所有鐵律
2MEMORY.md 索引 + 子文件圖書館目錄 — 列 169 本書,用到才翻斷鏈(目錄指空)/ 孤兒(書在但目錄漏寫)
3claude-mem(插件)自動偷記觀察到本地 SQLite(結構化資料庫)pipeline(流水線)壞 → 搜不到歷史 session(對話)
4Session jsonl(對話紀錄檔)每次對話完整錄音,關電腦不丟沒寫 → 誤關對話找不回
5GitHub private repo(私人倉庫)雲端備份 + 雙機同步ahead/behind > 0 → 兩台電腦要打架
6junction(目錄連結,像捷徑)CC 以為寫 C 盤,實際落在 D 盤 repo 裡junction 掉 → CC 寫的記憶不在 repo,永遠 push 不上

🎯 彙報範例(Thomas 今天跑出的真實結果)

#記憶層狀態細節
1CLAUDE.md鐵律齊全,最近有更新
2MEMORY.md 索引⚠️204 行,超 200 行截斷紅線 4 行
3子文件⚠️孤兒 15 個(存在但沒寫進索引)
4claude-mem SQLite168 條 pending 全 failed,pipeline 整體壞
5Session jsonl今日活躍 session 正在寫入
6GitHub 備份ahead=0 behind=0 乾淨
7junction 雙機D:\ClaudeCode / memory junction 都對

🔧 修復三選項(範例)

A. 快速(5 分鐘) — 瘦身 MEMORY.md 到 ≤195 行,先解截斷警報
B. 中等(20 分鐘) — A + 把 15 個孤兒檔分類(加索引 / 搬 MEMORY_COLD / 合併刪除)
C. 大修(1 小時) — A + B + 診斷 claude-mem pipeline,修 168 條 pending failed(看 embedding key 過期 / chroma-mcp 掛了)

🚀 怎麼用

1 步:對 Claude 說觸發詞
審計記憶      (任何觸發詞都行)
記憶健康檢查
memory audit
Claude 自動:找到機器名 → 跑 7 個 bash/python 檢查 → 產出上面彙報 → 給你 A/B/C。
⚠️ 鐵律:agent 只做只讀檢查,絕對不在沒問你之前動任何記憶檔。修復一定要你選 A/B/C 才動手。

📄 agent 完整定義(給想學技術的你)

展開看原始 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(目錄連結)`)
📅 建立:2026-04-16 16:00 NZT 🔄 更新:2026-04-16 16:00 NZT 📁 原檔:D:/Backup/Downloads/claude-sonnet-4-6/agents/memory-audit.md

🧹 記憶補遺漏員(memory-gap-filler agent)

說一句「補記憶」「記憶補遺漏」,Claude 自己掃 9 個來源找該寫但沒寫的知識,順便把雙機(台式機/筆記本)+ worktree(工作樹) 的記憶全對齊,給你彙報 + A/B/C 修復選項。

Agent 專家 🟢 可用
memory-gap-filler — 記憶補遺漏員
像家裡的保潔阿姨 — 專門找你忘了收的東西 + 把台式機和筆記本的抽屜整理到一模一樣。和 memory-audit(體檢師)分工:體檢師只診斷,補遺漏員會動手補寫 + 同步 + 回流
🩹 背景:2026-04-16 Thomas 說「我有很多 tmp 腳本、worktree 記下的經驗,但沒整理進記憶系統,另一台電腦也不知道」→ 做了這個 agent。
  • 🔎 9 個來源全掃 — 孤兒檔 / tmp 腳本 / worktree 日誌 / session 對話 / 近期 commits / CLAUDE.md 懸掛引用 / 雙機 diff(差異)/ worktree 未回流 / 遠端新 commits
  • 🤝 雙機對齊 — 台式機 + 筆記本經 GitHub repo(私人倉庫)同步,發現哪台少檔就 pull(拉取)
  • 🌳 worktree 回流 — 用 cherry-pick(挑撿)把 worktree 的記憶 commit 單獨挑回 master,不把半成品功能帶進來
  • 🩹 修復三套餐:A 全自動 5 分鐘 / B 互動審閱 15 分鐘 / C 只標記清單不動 1 分鐘
觸發詞: 補記憶 記憶補遺漏 雙機記憶對齊 worktree 記憶回流 tmp 腳本提煉記憶 找遺漏記憶
📅 建立:2026-04-16 🔄 更新:2026-04-16

🔎 九個掃描來源(白話對照表)

#掃哪裡找什麼沒做會怎樣
1memory/ 目錄存在但沒寫進 MEMORY.md 的孤兒 .md(標記文件)Claude 看不到這個檔 → 等於沒記
2D: 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 檔規則改了但記憶沒更新
6CLAUDE.md 懸掛引用詳見 [xxx.md] 但 xxx.md 不存在Claude 跟隨引用讀不到檔 → 規則空心
7雙機 memory diff(差異)台式機 vs 筆記本 memory/ 內容不一致手機遙控時看哪台就看哪台的記憶
8worktree 未回流worktree 改過 memory 但沒 merge 回 mastermaster 上的 Claude 看不到 worktree 的改進
9遠端 behindGitHub 上有新 commit 本機沒 pull(拉取)另一台電腦推的記憶,這台沒看到

🤝 和 memory-audit 分工對照

項目🔍 memory-audit(體檢師)🧹 memory-gap-filler(補遺漏員)
定位診斷 6 層健康找遺漏 + 同步 + 補寫
動手?❌ 只讀,不改任何檔✅ 會補寫 memory 子文件(arguably 擴充)
掃描範圍6 個記憶架構層9 個遺漏來源 + 3 個同步檢查
修復給 A/B/C 等 Thomas 選才動給 A/B/C + 全自動模式可選
跨機?只查本機 + GitHub 同步✅ WinRM(遠端執行)跨 Tailscale 查另一台
時機想知道記憶系統健康想把散落的知識收攏 + 補雙機差異

🎯 修復三套餐(範例)

A. 全自動(5 分鐘) — 自動處理 #1 孤兒分類 + #7 雙機 pull + #8 worktree cherry-pick + #9 拉遠端。不動 CLAUDE.md。
B. 互動審閱(15 分鐘) — 每筆修改產 diff(差異)給 Thomas 看,按 y/n 決定。適合第一次跑怕誤動。
C. 只標記不動(1 分鐘) — 寫一份 _gaps_YYYYMMDD.md 清單列所有發現,Thomas 有空再手動處理。

🚀 怎麼用

1 步:說觸發詞
補記憶
記憶補遺漏
雙機記憶對齊
worktree 記憶回流
Claude 自動:確認機器 → 9 個來源掃 → 產彙報 → 給 A/B/C 套餐。
⚠️ 鐵律
  • 只自動補 memory/ 子文件(擴充),不碰 CLAUDE.md(規則以你為準)
  • 雙機同步走 git,不直接 scp/rsync(保留版本歷史)
  • worktree 回流用 cherry-pick(挑撿單個 commit)不 merge 整個 branch(防止半成品功能被帶進來)
  • 修復前後都 git pull --rebasegit push禁 force push(強推)master

📄 agent 完整定義

展開看原始 memory-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 鐵律一致)
📅 建立:2026-04-16 NZT 🔄 更新:2026-04-16 NZT 📁 原檔:D:/Backup/Downloads/claude-sonnet-4-6/agents/memory-gap-filler.md

📱 手機遙控術 — 從「摸螢幕」到「CLI 遙控外網手機」

副標:Termux(手機 Linux 終端機軟體)+ Tailscale(虛擬私網工具)+ OPPO 保活三件套

👉 2026-04-16 Thomas 在台式機上手把手實戰配置完成,這頁是教學紀錄。OPPO Find X3 Pro,Tailscale IP 100.81.83.124

1️⃣ 為什麼要做這件事?

🐶 → 🧑‍💼 生活比喻:手機原本像「必須親手摸螢幕的寵物」,每次叫牠做事都要親自上去戳。
做完這套之後,手機變成「可以在台式機打字指揮的員工」——Claude 在電腦端一行指令,手機就執行。

Claude 在台式機打字 → 手機立刻幫你做:

  • 📩 讀簡訊(SMS,短訊)/ 發簡訊
  • 📞 看通話記錄(call log)
  • 📷 用前後鏡頭拍照 / 錄影
  • 🎙 開麥克風錄音
  • 🗣 TTS(Text-to-Speech,語音合成)讓手機說話
  • 📍 讀 GPS(全球定位)位置
  • 👥 讀通訊錄 / 電量 / 剪貼板(clipboard)
  • 📳 震動 / 開手電筒 / 調亮度
  • 📂 上傳檔案 + 全部 Linux 命令列(command line,命令行)
🌐 關鍵:走 Tailscale(虛擬私網),外網 / 4G 行動數據 / 咖啡廳 Wi-Fi 都通,不需要手機跟電腦在同一個 Wi-Fi。

2️⃣ 必備前置(你已具備)

需要的東西Thomas 狀態
手機裝 Tailscale(虛擬私網 App)✅ 已裝,IP 100.81.83.124
台式機裝 Tailscale✅ 已裝
手機 OPPO Find X3 Pro,Android 14
開發者模式(Developer Options,手機進階設定)✅ 已開

3️⃣ 第一步:裝 F-Droid(另一個應用商店)

🛒 生活比喻:F-Droid 像小米應用商店之外的「另一家專賣場」,專門放開源(open source,源代碼公開的免費軟體)App。

為什麼一定要用 F-Droid?

  • Google Play 上的 Termux 已經停更 3 年,很多功能壞掉
  • F-Droid 上的 Termux 才是現役活躍版本

動作:

  1. 手機瀏覽器打開 https://f-droid.org
  2. 下載 APK(Android Package,安卓安裝包)
  3. 點 APK 安裝
⚠️ OPPO 坑:安裝「未知來源(unknown sources,非官方商店的 App)」會警告兩次,都點「繼續安裝」

4️⃣ 從 F-Droid 裝 4 個 Termux App

App作用
Termux主程式,手機上的 Linux 終端(terminal,命令列視窗)
Termux:API橋樑(bridge),讓 Termux 能讀簡訊 / 拍照 / 剪貼板 / GPS
Termux:Boot開機自動跑腳本(boot,開機)
Termux:Widget桌面快捷圖示(widget,小工具)— 可選
⚠️ 4 個都必須從 F-Droid 裝,不能混 Google Play 版本。
原因:兩家的 App 簽名(signature,數位身分證)不同,互不認對方,會無法互相呼叫。

5️⃣ Termux 8 步命令配置

1
更新系統包
pkg update && pkg upgrade -y
2
裝 8 個核心工具
pkg install openssh termux-api python git ffmpeg rsync nano which -y
📦 openssh(遠程登錄)/ termux-api(手機橋樑)/ python(程式語言)/ git(版本管理)/ ffmpeg(影音處理)/ rsync(檔案同步)/ nano(簡易編輯器)/ which(找命令位置)
3
設 SSH 密碼
passwd
Thomas 的密碼存在 GCP SM(Google Cloud Secret Manager,谷歌雲端秘鑰倉庫):termux-ssh-password-oppo,本地不留明文。
4
允許 Termux 讀手機儲存空間
termux-setup-storage
手機跳出彈窗 → 點「允許(Allow)」→ 之後 Termux 能讀 /sdcard(手機公共儲存區)。
5
啟動 SSH 伺服器(sshd,SSH 守護進程)
sshd
sshd 開始監聽 port 8022(埠號 8022,Termux 不是用 22)。
6
記下用戶名(username)
whoami
Thomas 的手機是 u0_a598每支手機都不一樣,自己跑出來記下。
7
設開機自動啟動 sshd
mkdir -p ~/.termux/boot
echo 'sshd' > ~/.termux/boot/start-sshd
chmod +x ~/.termux/boot/start-sshd
以後手機開機,Termux:Boot App 會自動跑這個腳本,sshd 自動上線。
8
台式機驗證連線(見證奇跡的時刻)
ssh -p 8022 u0_a598@100.81.83.124
輸入剛才設的密碼 → 進入手機 Linux 環境 → 你已經在電腦上「住進」手機了。

6️⃣ OPPO 保活三件套(🔑 最關鍵!)

🚪 生活比喻:OPPO 系統像個嚴格的物業管理員,看到你不在家就會把「快遞員 sshd」轟出大樓。
不做保活 → sshd 過幾分鐘就被殺 → 台式機連不上 → 整套系統失效。

必做 3 件事,缺一不可:

#動作位置
1🔒 最近任務鎖卡片
長按 Termux 卡片頂部 → 出現鎖頭圖示
手機「最近任務」畫面
2電池優化「不優化」
把 Termux + Termux:API 都設成「不優化」
設定 → 應用管理 → Termux:API → 權限 → 特殊權限 → 電池優化
3🛑 關閉鎖屏清理應用
關掉「鎖屏自動清後台」
設定 → 電池 → 更多電池設定 → 鎖屏清理應用 → 關閉
🔍 找不到?打開「設定」搜尋框,搜「鎖屏清理」、「後台」、「凍結」三個關鍵字輪流試。

7️⃣ termux-api 權限一次開完(複製這條命令觸發 8 個彈窗)

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 "✅ 全部觸發完"
  • 每個彈窗點「允許(Allow)」
  • 位置權限選「始終允許(Allow all the time)」
  • ⚠️ 發簡訊權限(SEND_SMS)是獨立的,要另外執行一次 termux-sms-send -n 自己手機號 "test" 觸發
📚 生活比喻:READ_SMS(讀簡訊)和 SEND_SMS(發簡訊)是兩張不同的證件——「只有讀書證不能借書」。

8️⃣ 能力展示表(觸發詞 → 命令)

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

9️⃣ 踩過的坑(生活比喻 + 教訓)

坑 1:SSH 一開始連不上
🗝 比喻:家門鑰匙沒帶,走到門口才發現。
原因:手機 Tailscale App 沒開(背景被殺了)。
解法:手機把 Tailscale 開啟,並設電池不優化。
坑 2:鎖屏一陣子後 SSH 斷線
🚪 比喻:物業把快遞員轟出大樓,你下樓收件時找不到人。
原因:OPPO「鎖屏清理應用」殺了 Termux。
解法:第 6 步保活三件套全做完。
坑 3:termux-sms-send 回傳 EXIT:0 但對方沒收到
📮 比喻:郵差拿了信,但你忘了貼郵票。
原因:SIM 卡話費不夠 / 簡訊套餐用完。
解法:先在手機原生簡訊 App 試發一則,確認話費 OK。
坑 4:termux-api 權限分得很細
📚 比喻:圖書館「讀書證」和「借書證」是兩張,只有讀書證不能借書。
原因:READ_SMS(讀簡訊)和 SEND_SMS(發簡訊)是 Android 兩個獨立權限。
解法:第 7 步那條命令觸發讀類權限,發類要單獨跑一次發簡訊命令觸發。
坑 5:SSH 觸發不了 Android 權限彈窗
🪪 比喻:辦身分證一定要本人到場,不能叫朋友代辦。
原因:Android 權限彈窗只能在「手機 Termux 前台運行」時跳出,SSH 是背景連線。
解法:手機打開 Termux App(看到提示符),然後在 SSH 那邊跑命令,彈窗會出現在手機螢幕。

🔟 小白安全提醒

  • 🔐 SSH 密碼存 GCP SM,本地不留明文。電腦被偷也撈不到密碼。
  • 🛡 Tailscale 是虛擬私網,只有 Thomas 自己 Google 帳號授權的設備才能連到手機,外人黑客(hacker,駭客)進不來。
  • 📩 讀簡訊會看到驗證碼 / 銀行通知。Claude 操作時心裡有數,敏感場景建議先問你一聲。
  • 💸 發簡訊 / 撥電話會真的扣話費 + 通知對方。Claude 不要亂試。
  • 📷 拍照 / 錄音是真的開鏡頭和麥克風。手機在哪就拍到哪,不是你在看的畫面。
🎓 學完之後:Thomas 對 Claude 說「用我手機讀最近 3 則簡訊」或「讓我手機說 XXX」,Claude 就會走 Tailscale → SSH → termux-api 一條龍幫你完成。

🔥 進階:ADB 無線調試 — CLI 往任何 App 注入中文

📖 為什麼要做這個(小白比喻)
之前的 Termux(終端機模擬器)+ SSH(Secure Shell,安全連線)能做 90% 事,但不能往手機上任何 App(應用程式)的輸入框打中文字(Thomas 寫日記、發微信、回 Gmail(谷歌郵件)都想用 CLI(Command Line Interface,命令列介面)搞定)。
👉 ADB(Android Debug Bridge,安卓調試橋)= 系統級權限,可以模擬真實鍵盤輸入 / 觸發 paste(貼上)動作。
🏢 比喻:Termux 像「請客人幫忙拿東西」,ADB 像「員工卡,能刷進公司系統任何角落」。

✅ 前置條件

項目狀態
手機開發者模式(Developer Options)已開
台式機有 adb.exe(ADB 執行檔)✅ 在 G:\我的云端硬盘\软件工具\QtScrcpy\QtScrcpy-win-x64-v3.3.3\adb.exe
手機和台式機都在 Tailscale(虛擬私網)

🚶 5 步流程

第 1 步:手機開無線調試(Wireless Debugging)
設定 → 系統 → 開發者選項 → 無線調試 → 打開
第 2 步:手機點「使用配對碼(pairing code)配對設備」
看到:
  • 配對碼:6 位數字(每次不同,例 378656
  • IP(網址):埠(Port,通訊埠):100.81.83.124:XXXXX(這是配對埠,例 37775
⚠️ 這個螢幕先別關,關了配對碼就作廢。
第 3 步:台式機配對(pair,配對)
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(配對成功)
第 4 步:回無線調試主頁,抄連線埠(跟配對埠不一樣!)
主頁顯示的 IP:埠是連線埠(例 40537),這個才是之後 connect(連線)用。配對埠用完即作廢。
第 5 步:台式機連線(connect)
"$ADB" connect 100.81.83.124:40537
"$ADB" devices -l
# 輸出:100.81.83.124:40537  device product:CPH2173

🔥 注入中文的絕活(小白必看)

⚠️ Android(安卓)原生 input text(模擬鍵盤輸入命令)不支援中文,會報 NullPointerException(空指標錯誤)。
正確做法 = SSH clipboard(剪貼板)+ ADB paste(貼上)雙劍合璧
# 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(貼上鍵碼)
🎯 用法(4 步就好)
  • 1. 手機打開任何 App(日記、Gmail、微信、記事本)
  • 2. 點中輸入框,讓游標閃爍
  • 3. 告訴 Claude「準備好了」
  • 4. Claude 一條命令 → 中文自動出現在游標位置 ✨

📱 能注入到哪些 App

  • ✅ OPPO 內建日記 / 記事本
  • ✅ Google Gmail、Keep(筆記)、Docs(文件)
  • ✅ 微信、WhatsApp(通訊軟體)、Line 聊天框
  • ✅ 淘寶、Google 搜尋框
  • ✅ 任何支援「長按 → 貼上」的 App(99% 都支援)
  • ❌ 遊戲自訂鍵盤、特殊安全輸入框(銀行 App 密碼欄,有防截獲機制)

🩹 踩過的坑

坑 1:配對埠 ≠ 連線埠
兩個埠號不同,第 2 步看到的埠和第 4 步看到的埠是兩回事,新手必踩。
坑 2:配對埠用一次就失效
每次開無線調試手機會重新分配配對埠,上次抄的沒用。
坑 3:手機 Tailscale 斷了 ADB 也斷
重開 Tailscale 後要再跑一次 adb connect 100.81.83.124:XXXXX
坑 4:input text 中文報 NullPointerException
Android 原生 input method(輸入法介面)不支援非 ASCII 字符。必須改走 clipboard + keyevent 279(貼上)。

🔒 安全提醒

  • 無線調試 = 系統級權限,比 SSH 還高。但配對過的電腦是白名單(whitelist),陌生電腦連不上(Google 設計)。
  • 別在公共 WiFi 開無線調試(Tailscale 已隔離內網,家裡也不用擔心)。
  • 每次重啟手機,無線調試會自動關(Android 安全機制)→ 要用時再手動開。
🎓 學完之後:Thomas 對 Claude 說「幫我在 OPPO 日記寫今天 XXX」或「回這條微信:YYY」,Claude 就會走 Tailscale → SSH 設剪貼板 → ADB keyevent 279 一條龍,中文字自動出現在你點的輸入框。

⚙️ Git 命令查詢表

Thomas 小白版。每條命令都有生活比喻 + 實際用法 + 危險等級。不用背,查表用。

💡 什麼是 Git?Git 是「時光機 + 備份工」。你寫的每份檔案,Git 都能記住「誰、什麼時候、改了什麼」,隨時回到任何一個時間點。兩台電腦共享 Git = 自動同步文件。

🔤 符號速查(為什麼有時 - 有時 --

符號叫什麼作用生活比喻
(空格)分隔切命令成「動詞 + 對象 + 選項」句子裡的逗號
- 單槓短選項(1 個字母)快捷按鈕鍵盤 Ctrl 快捷鍵
-- 雙槓長選項(完整單詞)一樣的功能,寫全名按鈕的說明文字
-- 單獨出現分隔符「後面不是選項,是文件名」告訴 git 別再猜

具體例子(讀法)

寫法讀法意思
git log -10log 短選項 10看 10 條歷史
git log --max-count=10log 長選項 max-count 10看 10 條(完全等價)
git commit -m "修改"commit 短選項 m "修改"提交,訊息是「修改」
git commit --message="修改"commit 長選項 message "修改"同上
git checkout -- 文件.txtcheckout 分隔符 文件告訴 git「文件.txt 是文件,不是分支」
為什麼有兩種:單槓給老手手速快(-m),雙槓給新手看得懂(--message)。功能 100% 一樣,你選順手的。

1️⃣ 每日基本三件套

想做命令
看改了什麼git status
看具體改動內容git diff
提交改動git add . && git commit -m "訊息"
推送到雲端git pull --rebase && git push

2️⃣ 兩台電腦同步(CC 家專用)

情境命令
開機先拉最新(推薦每次開工先跑)git pull --rebase origin master
推本機改動git push origin master
遇到衝突時暫停git rebase --abort
衝突解完繼續git rebase --continue
💡 --rebase 的意思:把本機的新改動「疊」在雲端最新版上,而不是硬合併。避免多餘的 merge commit。

3️⃣ 看歷史 / 找東西

想做命令
看最近 10 個 commitgit log --oneline -10
看某文件改動歷史git log --oneline -- 路徑/文件
看某 commit 改了什麼git show <commit-id>
找誰改過某行git blame 文件路徑

4️⃣ 撤銷 / 後悔藥

情境命令危險等級
撤銷剛才的 add(不刪文件)git reset HEAD 文件🟢 安全
撤銷剛才的 commit(保留改動)git reset --soft HEAD~1🟢 安全
丟棄工作區未 commit 的改動git checkout -- 文件🟡 改動沒了
完全回到上次 commit(所有改動丟失)git reset --hard HEAD🔴 會丟東西
查 reflog 找回誤刪 commitgit reflog → 找 hash → git reset --hard <hash>🟢 救命
救命秘訣:Git 幾乎什麼都能找回來。就算 git reset --hard 丟了東西,git reflog 裡還保留 30 天的 commit 記錄。

5️⃣ 分支(Branch)

想做命令
看現在哪個分支git branch --show-current
看所有分支git branch -a
切換分支git checkout 分支名
建新分支並切換git checkout -b 新分支名
刪本地分支git branch -d 分支名
💡 分支是什麼:好比故事的平行宇宙。master 是正式版,開新分支 = 另開一條故事線做實驗,做壞了也不影響正式版。

6️⃣ Worktree(你每次用的)

想做命令
建 worktreegit worktree add ../路徑 -b 新分支
看所有 worktreegit worktree list
清掉舊 worktreegit worktree remove 路徑
修剪無效 worktreegit worktree prune
💡 Worktree 是什麼:好比同一個 Git 倉庫的「分身」,每個分身在不同資料夾、不同分支。CC 做實驗就開 worktree,不污染 master。

7️⃣ 遠端倉庫(GitHub)

想做命令
看當前 remotegit remote -v
改 remote URLgit remote set-url origin 新URL
獲取雲端最新(不合併)git fetch origin

8️⃣ 暫存(Stash)

想做命令
暫存當前改動git stash
恢復暫存git stash pop
看有幾個 stashgit stash list
💡 Stash 什麼時候用:手邊改到一半不想 commit,但又要切到別的分支 → 先 git stash 把改動暫存起來,切回來再 git stash pop

9️⃣ ⛔ 永遠不要用(Thomas 鐵律)

禁忌原因
git push --force覆蓋雲端 = 毀掉另一台電腦的工作
git push -f同上(只是短寫法)
git reset --hard origin/master(未 stash 前)本地所有未 commit 改動消失
git clean -fd刪所有未追蹤文件
推送到 public repo違反永久安全禁令,任何 AI 都不准
⚠️ 這 5 條命令 Claude 也不會替你執行。如果你手打出來 Claude 會停下來問你是不是真的想這麼做。

🔟 最常遇到的狀況速查

症狀(Git 跳出訊息)先試
Your branch is ahead by X commitsgit push
Your branch is behind by X commitsgit pull --rebase
Your branch and origin have divergedgit pull --rebase(不要 merge)
nothing to commit, working tree clean沒事,幹淨的
Changes not staged for commitgit add . 再 commit

🎓 總結:3 條黃金法則

1
開工先拉git pull --rebase。不拉就寫 = 之後鐵定衝突。
2
收工先推git push。不推 = 另一台電腦看不到你的改動。
3
出事找 refloggit reflog 能救回 95% 的災難。Git 幾乎沒有「真的丟了」這回事。
💡 什麼時候用命令,什麼時候不用:Thomas 平時不用碰命令列,VS Code 左邊 Source Control 圖示一鍵 commit/push 就夠。這張表是「當 Claude 給你 git 命令時,你能看懂它在做什麼」用的。
0已選項目 · 生成指令