Files
arcrun-collector/machinemark.go
T
Leo 5a140faf1f fix(collector): 機器寫進筆記庫的檔案一律帶前綴,不再跟使用者的頁面撞名(arcrun-rag#60)
leo 2026-08-12:「我的 Logseq 又被覆蓋⋯⋯**不只是加上 journal,可能所有的檔案都加一個前後綴,比如「wiki」**。」

不是資料被蓋掉,是機器產出用了跟他一樣的命名空間(status.md、日期檔那些)
⇒ 他打開資料夾分不出哪些是自己的。**心理上的覆蓋跟實際覆蓋一樣糟。**
2026-08-12 14:57:32 +08:00

58 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// machinemark.go — daemon 寫進使用者資料夾的每一個檔案,檔名都帶同一個標記
// arcrun-rag#60 第二輪,2026-08-12 leo 實撞)。
//
// 🔴 為什麼上一輪不夠:
//
// 第一輪(1e36bb1)只改了「卡片**落在哪個目錄**」——vault 就改落隱藏的
// `.arcrun-rag/wiki/cards/`。但 Logseq/Obsidian 的**頁名是從 basename 來的**
// 而卡片的 basename 一直是「原稿的 basename」:使用者的 `journals/2026_08_10.md`
// 萃出來的卡就叫 `2026_08_10.md`,跟他自己的日誌頁**同名**。
// ⇒ 只要那個目錄有任何一刻被看見(他自己翻資料夾、備份工具攤平、之後改成非隱藏、
// 或是**非 vault 的一般資料夾**——那裡卡片本來就是可見的),撞名就回來了。
// leo 原話:「不只是加上 journal,**可能所有的檔案都加一個前後綴,比如「wiki」**。」
//
// 🔴 規約(本檔是唯一真相源,不准有第二種標記):
//
// **daemon 在使用者的監看根底下產生的每一個檔案,basename 一律以 MachineMark 開頭。**
//
// 一種就是一種——「一部分加一部分不加」比全不加更難分辨(leo 的紅線)。
// 所以任何新的寫檔點都必須經過 MarkName(),不得自己拼檔名。
// 迴歸網=vault_footprint_test.go:它 walk 整個監看根,只要有任何新檔沒帶標記就紅,
// **與寫檔點的數量無關**——這正是上一輪缺的那張網(上一輪只點測了一個常數)。
//
// 為什麼是「前綴」不是「後綴」:`ls`/Finder/Logseq 的頁面清單都是按名字排序的,
// 前綴會讓機器寫的東西**全部聚成一叢**,一眼就掃得完;後綴則散落在他自己的檔案之間,
// 等於還是要一個一個看。leo 要的是「打開資料夾一眼分得出」,那就是前綴。
//
// 為什麼標記字串是 `arcrun-` 而不是 leo 舉例的 `wiki`:`wiki` 是他自己筆記裡會用的
// 普通詞(`wiki-整理術.md` 是他的、不是我們的),拿它當標記等於製造新的誤認;
// `arcrun-` 直接說出「這是 Arcrun 寫的」,且與既有的 `.arcrun-rag/` 目錄同一組字。
// 這是一行常數,leo 覺得該用別的字就改這裡一個地方(連舊產物一起 tidy 重跑即可)。
package collector
import "strings"
// MachineMark 是 daemon 產物的**唯一**標記。改這裡=改全部(含 tidy 的認人判準)。
const MachineMark = "arcrun-"
// MarkName 把一個 basename 加上標記。冪等:已經帶標記的原樣回傳,
// 不會疊成 `arcrun-arcrun-x.md`tidy 重跑、daemon 重跑都會走到這條)。
func MarkName(base string) string {
if IsMarked(base) {
return base
}
return MachineMark + base
}
// IsMarked 回答「這個 basename 是不是機器寫的」。
// ⚠️ 只吃 basename,不吃路徑——路徑中間的目錄名不算數(目錄是不是機器的,
// 由 cardsRelDirFor 那組常數決定,不由這裡猜)。
func IsMarked(base string) bool {
return strings.HasPrefix(base, MachineMark)
}
// UnmarkName 去掉標記,回傳原本的名字。tidy 拿來對照「這張卡對應哪一份原稿」。
func UnmarkName(base string) string {
return strings.TrimPrefix(base, MachineMark)
}