化實(shí)踐)
卸載 Raycast 的時(shí)候我以為自己干得很干凈把 App 從「應(yīng)用程序」里拖進(jìn)廢紙簍清空廢紙簍重啟。結(jié)果幾天后為了排查一個(gè)問(wèn)題重新裝回 Raycast打開(kāi)的一瞬間整個(gè)人愣住了——之前的擴(kuò)展、自定義命令、快捷鍵設(shè)置、甚至本地緩存里的搜索記錄全部都在像什么都沒(méi)發(fā)生過(guò)一樣。這件事讓我意識(shí)到一個(gè)一直被我忽略的事實(shí)在 macOS 上「把 App 拖進(jìn)廢紙簍」根本不叫卸載最多只能叫「刪掉主程序」。真正的卸載清理是一件需要系統(tǒng)化對(duì)待的事。所以后來(lái)我把這套清理流程整理成了一份可復(fù)用的檢查清單最后干脆做成一個(gè)開(kāi)源的 Skill 項(xiàng)目讓安裝了 Raycast 的人可以直接跑一段自動(dòng)化流程把殘留掃出來(lái)、清干凈。這篇文章就把整個(gè)思路和實(shí)現(xiàn)過(guò)程完整的拆給你包括殘留到底藏在哪些目錄、為什么這些目錄會(huì)被系統(tǒng)保留、以及我在做開(kāi)源 Skill 時(shí)踩過(guò)的權(quán)限和誤刪的坑。1. 卸載 ≠ 刪除Raycast 殘留的真實(shí)構(gòu)成1.1 為什么拖進(jìn)廢紙簍刪不干凈很多人對(duì) macOS 卸載軟件的認(rèn)知還停留在 Windows 時(shí)代的「卸載程序」思維但在 macOS 上大多數(shù) App 都是一個(gè)自包含的 .app 包主程序確實(shí)只是一坨文件。問(wèn)題是App 運(yùn)行的時(shí)候會(huì)在用戶目錄里寫下一堆「屬于它自己」的數(shù)據(jù)這些數(shù)據(jù)散落在系統(tǒng)的各個(gè) Library 目錄里根本不在 .app 包里。Raycast 尤其典型。它不是一個(gè)單純的啟動(dòng)器它承擔(dān)了剪貼板歷史、窗口管理、擴(kuò)展系統(tǒng)、片段管理、AI 對(duì)話這些功能運(yùn)行期間會(huì)在你用戶目錄的 Library 下寫下大量文件。拖進(jìn)廢紙簍這個(gè)動(dòng)作只解決了 /Applications/Raycast.app 這一個(gè)目錄剩下的數(shù)據(jù)全部留在原地。我卸載重裝后之所以所有配置都回來(lái)了就是因?yàn)?Raycast 把大部分配置和狀態(tài)數(shù)據(jù)都存放在~/Library/Application Support/Raycast這個(gè)目錄下。這個(gè)目錄承載了擴(kuò)展、主題、本地?cái)?shù)據(jù)庫(kù)、偏好設(shè)置等等。你刪了 App 本身但 Application Support 下的數(shù)據(jù)沒(méi)掉重新安裝后它自然就恢復(fù)了。這不是 Bug這是 macOS 的標(biāo)準(zhǔn)行為。1.2 殘留文件到底藏在哪為了搞清楚洗干凈的底線在哪我花了兩個(gè)晚上反復(fù)安裝、卸載、再掃描文件系統(tǒng)最終把 Raycast 的殘留歸納成了五大類位置。你可以直接對(duì)照這份清單檢查自己的機(jī)器。第一類是應(yīng)用支持?jǐn)?shù)據(jù)主要的目錄是~/Library/Application Support/Raycast/~/Library/Application Support/com.raycast.macos/這里面存的是核心業(yè)務(wù)數(shù)據(jù)。擴(kuò)展安裝記錄、Store 緩存、配置數(shù)據(jù)庫(kù)、日志都在這里。這一塊體積通常最大也是卸載后必須清掉的大頭。第二類是緩存數(shù)據(jù)。Raycast 這類工具型 App 緩存寫得很勤主要路徑有~/Library/Caches/com.raycast.macos/~/Library/HTTPStorages/com.raycast.macos/~/Library/WebKit/com.raycast.macos/緩存的體積時(shí)大時(shí)小取決于你平時(shí)怎么用。WebKit 目錄主要存 Raycast 內(nèi)置瀏覽器或網(wǎng)頁(yè)相關(guān)組件的數(shù)據(jù)很多人會(huì)漏掉它。第三類是偏好設(shè)置~/Library/Preferences/com.raycast.macos.plist這是defaults系統(tǒng)讀取的配置文件。有些第三方工具會(huì)誤以為刪掉 plist 就會(huì)出問(wèn)題其實(shí)恰恰相反卸載后保留 plist 反而是最常見(jiàn)的問(wèn)題來(lái)源。第四類是登錄項(xiàng)與系統(tǒng)集成。Raycast 為了開(kāi)機(jī)自啟會(huì)在這里留下東西~/Library/LaunchAgents/com.raycast.macos.ShortcutCommands.plist~/Library/LaunchAgents/com.raycast.macos.plist如果你在 Raycast 里設(shè)置過(guò)「開(kāi)機(jī)自動(dòng)啟動(dòng)」、全局快捷鍵、或者把 Raycast 設(shè)成了默認(rèn)的剪貼板管理工具這些 LaunchAgents 就會(huì)存在。不刪掉它們的話重啟后系統(tǒng)依然會(huì)嘗試?yán)鹣嚓P(guān)服務(wù)。第五類是狀態(tài)與應(yīng)用快照~/Library/Saved Application State/com.raycast.macos.savedState/~/Library/Logs/Raycast/Saved Application State 是 macOS 的窗口恢復(fù)機(jī)制留下的雖然不影響功能但屬于典型殘留。日志目錄則是排障時(shí)有用的數(shù)據(jù)釋放空間時(shí)也該一起清理。1.3 這些殘留會(huì)造成什么影響有人可能會(huì)說(shuō)殘留就殘留唄不占多少地方。但實(shí)際情況不是這樣殘留文件會(huì)繼續(xù)被系統(tǒng)索引、被 Spotlight 掃描、占用 inode而且在卸載后如果立刻重裝舊配置會(huì)把新版本的一些默認(rèn)行為覆蓋掉導(dǎo)致你沒(méi)法判斷新版本到底改了什么。更現(xiàn)實(shí)的問(wèn)題是你換了電腦、想把舊機(jī)器徹底交出去之前清理干凈這時(shí)候殘留就變成隱私風(fēng)險(xiǎn)了——用戶數(shù)據(jù)還躺在 Application Support 里。所以清理不是潔癖而是 Mac 維護(hù)里一件需要正視的事。2. 清理流程設(shè)計(jì)從「隨手找」到「按清單圍剿」2.1 手動(dòng)清理時(shí)最容易犯的三個(gè)錯(cuò)在把流程寫進(jìn) Skill 之前我先手動(dòng)清理了小十臺(tái)機(jī)器過(guò)程中反復(fù)踩到一些坑這三個(gè)是最典型的。第一個(gè)錯(cuò)是不查進(jìn)程直接刪文件。Raycast 如果在后臺(tái)運(yùn)行著你刪它的 Application Support 目錄時(shí)Permission Denied 是??鸵?yàn)槲募€在被進(jìn)程占用。就算刪了一部分Raycast 發(fā)現(xiàn)配置丟失會(huì)立刻重建一份默認(rèn)配置等你卸載完再檢查文件又回來(lái)了。所以清理前必須先殺掉進(jìn)程。第二個(gè)錯(cuò)是不分青紅皂白全刪。比如 Preferences 里面其實(shí)有一些是系統(tǒng)組的偏好緩存還有 Extension 目錄里如果你裝過(guò)第三方擴(kuò)展有些文件擁有比較奇怪的授權(quán)。全盤rm -rf會(huì)誤傷同一用戶下其他工具的共享資源。第三個(gè)錯(cuò)是刪完了不驗(yàn)證。很多人清完覺(jué)得「應(yīng)該干凈了」實(shí)際上一查還剩好幾個(gè)目錄。沒(méi)有驗(yàn)證環(huán)節(jié)清理就只是自我安慰。2.2 我設(shè)計(jì)的清理檢查流程基于這些教訓(xùn)我最后把清理流程固定為四步每一步都有明確產(chǎn)物第一步停止相關(guān)進(jìn)程。執(zhí)行osascript直接退掉 Raycast再用ps aux | grep -i raycast兜底檢查有沒(méi)有子進(jìn)程殘留。第二步掃描殘留目錄并生成報(bào)告。逐一檢查前面列出的所有路徑是否存在、是否可讀、體積多大把結(jié)果匯總成一張報(bào)告。這一步只讀、不改任何東西。第三步按風(fēng)險(xiǎn)等級(jí)分級(jí)刪除。我把清理對(duì)象分為安全級(jí)和警告級(jí)緩存類、日志類、Saved State 屬于安全級(jí)可以放心刪Application Support 和 Preferences 屬于警告級(jí)因?yàn)檫@兩個(gè)目錄里如果還有你需要保留的數(shù)據(jù)刪了就真沒(méi)了。所以默認(rèn)只清安全級(jí)警告級(jí)要通過(guò)--force參數(shù)才會(huì)執(zhí)行。第四步驗(yàn)證并輸出清理摘要。清理完成后重新掃描一遍對(duì)比清理前后的路徑列表輸出還剩多少殘留、釋放了多少空間。這套流程單獨(dú)用終端也能跑但要給更多非技術(shù)背景的人用做成 Skill 顯然更合適。2.3 為什么不做成清理 App而是 Skill這里解釋一下設(shè)計(jì)決策。市面上不是沒(méi)有 Mac 清理工具但我覺(jué)得有兩個(gè)問(wèn)題第一它們太重了一個(gè)幾百 MB 的 App 為了刪幾個(gè)目錄有點(diǎn)殺雞用牛刀第二App 本身的卸載同樣會(huì)產(chǎn)生新的殘留形成一種荒誕的循環(huán)。而「Skill」這個(gè)形態(tài)就輕得多。它本質(zhì)上是一組指令和腳本的集合運(yùn)行在 Raycast 的 Skill 生態(tài)里也可以直接在終端用命令行調(diào)用。對(duì)用戶來(lái)說(shuō)安裝成本極低不需要單獨(dú)下載 App不需要常駐后臺(tái)用的時(shí)候跑一下就行。而且腳本開(kāi)源出來(lái)任何人可以審查每一行命令在做什么不會(huì)被莫名其妙地收集數(shù)據(jù)。3. 把經(jīng)驗(yàn)變成代碼Skill 的目錄、腳本與權(quán)限設(shè)計(jì)3.1 Skill 的整體目錄結(jié)構(gòu)這個(gè)開(kāi)源 Skill 的倉(cāng)庫(kù)結(jié)構(gòu)我設(shè)計(jì)如下保持了簡(jiǎn)單和可讀性raycast-cleaner-skill/ ├── README.md ├── skill-manifest.json ├── scripts/ │ ├── scan.sh │ ├── clean.sh │ └── report.sh └── tests/ ├── fixtures/ └── reproduce.shskill-manifest.json是 Skill 的入口描述文件聲明了這個(gè) Skill 能干什么、需要什么權(quán)限、包含哪些可執(zhí)行指令。scan.sh負(fù)責(zé)掃描殘留clean.sh負(fù)責(zé)清理report.sh負(fù)責(zé)把掃描和清理結(jié)果整理成可讀的摘要。3.2 manifest 里的權(quán)限聲明Skill 和普通腳本最大的區(qū)別在于它運(yùn)行在 Raycast 生態(tài)中所以必須有清晰的權(quán)限邊界。這是我的skill-manifest.json里的核心字段設(shè)計(jì)用來(lái)說(shuō)明它能訪問(wèn)什么路徑、執(zhí)行什么操作{ name: mac-residual-cleaner, version: 1.0.0, description: Scan and clean residual files for common mac apps, especially Raycast., permissions: { filesystem: [ { path: ~/Library/Application Support/Raycast, access: delete, comment: Raycast core application data }, { path: ~/Library/Caches/com.raycast.macos, access: delete, comment: Raycast cache data }, { path: ~/Library/Preferences/com.raycast.macos.plist, access: delete, comment: Raycast preference file } ], processes: [ { name: Raycast, action: terminate, comment: Stop Raycast before cleaning } ] }, strict: true }strict: true是我自己加的一個(gè)設(shè)計(jì)約束意思是 Skill 只會(huì)操作 manifest 里聲明的路徑不會(huì)去掃整個(gè)磁盤。這樣無(wú)論是對(duì)用戶還是對(duì)審查代碼的人信任成本都低很多。3.3 掃描腳本只讀不刪先把敵人找全掃描是整個(gè) Skill 的核心如果不掃描就直接刪那你根本不知道自己刪了什么。scan.sh做的事很簡(jiǎn)單拿一份殘留路徑清單逐一檢查存在性返回每個(gè)路徑的狀態(tài)和體積。#!/bin/bash # scripts/scan.sh - Scan Raycast residual files (read-only) RESIDUAL_PATHS( $HOME/Library/Application Support/Raycast $HOME/Library/Application Support/com.raycast.macos $HOME/Library/Caches/com.raycast.macos $HOME/Library/HTTPStorages/com.raycast.macos $HOME/Library/WebKit/com.raycast.macos $HOME/Library/Preferences/com.raycast.macos.plist $HOME/Library/LaunchAgents/com.raycast.macos.plist $HOME/Library/LaunchAgents/com.raycast.macos.ShortcutCommands.plist $HOME/Library/Saved Application State/com.raycast.macos.savedState $HOME/Library/Logs/Raycast ) found0 total_size0 for path in ${RESIDUAL_PATHS[]}; do if [ -e $path ]; then found$((found 1)) size$(du -sk $path 2/dev/null | awk {print $1}) total_size$((total_size size)) echo [FOUND] $path (${size} KB) else echo [OK] $path fi done echo ---- echo Found $found residual item(s), total size: $((total_size / 1024)) MB這個(gè)腳本輸出的重點(diǎn)是「可讀」和「可驗(yàn)證」。你一眼能看到哪些路徑還殘留總共有多少體積然后再?zèng)Q定下一步。3.4 清理腳本分級(jí)刪絕不用一把梭清理腳本的核心邏輯是分級(jí)。我把殘留路徑分成兩組SAFE_PATHS和ADVANCED_PATHS。SAFE_PATHS緩存、日志、Saved State、HTTPStorages這類文件刪了最多重新生成沒(méi)有數(shù)據(jù)丟失風(fēng)險(xiǎn)。ADVANCED_PATHSApplication Support 和 Preferences這類包含用戶數(shù)據(jù)和配置默認(rèn)不刪只有加--force才動(dòng)。#!/bin/bash # scripts/clean.sh - Clean residual files with risk levels SAFE_PATHS( $HOME/Library/Caches/com.raycast.macos $HOME/Library/HTTPStorages/com.raycast.macos $HOME/Library/WebKit/com.raycast.macos $HOME/Library/Saved Application State/com.raycast.macos.savedState $HOME/Library/Logs/Raycast ) ADVANCED_PATHS( $HOME/Library/Application Support/Raycast $HOME/Library/Application Support/com.raycast.macos $HOME/Library/Preferences/com.raycast.macos.plist $HOME/Library/LaunchAgents/com.raycast.macos.plist $HOME/Library/LaunchAgents/com.raycast.macos.ShortcutCommands.plist ) # Stop Raycast first pkill -x Raycast 2/dev/null clean_paths() { local risk_label$1 shift for path in $; do if [ -e $path ]; then rm -rf $path echo [DELETED] $path fi done } echo Cleaning safe-level residual files... clean_paths [SAFE] ${SAFE_PATHS[]} if [ $1 --force ]; then echo Cleaning advanced-level residual files... clean_paths [ADVANCED] ${ADVANCED_PATHS[]} else echo Advanced paths skipped. Use --force to remove them. fi分級(jí)的好處是普通用戶跑一遍默認(rèn)清理就能解決 80% 的體積問(wèn)題如果確定要徹底干凈、準(zhǔn)備賣掉電腦再手動(dòng)加--force。這個(gè)設(shè)計(jì)降低了誤刪的恐懼感也讓 Skill 的適用范圍更廣。3.5 報(bào)告腳本清理完才算數(shù)清理完必須再掃一遍這是流程閉環(huán)的關(guān)鍵。report.sh做的事情就是再次調(diào)用 scan 腳本并把清理前后的結(jié)果合并成一份摘要。這個(gè)腳本的價(jià)值在于它讓「清理結(jié)果可驗(yàn)證」不是我說(shuō)清了就清了而是機(jī)器再掃一遍告訴你還剩什么。實(shí)際執(zhí)行效果大概是這樣的格式Scan summary: - Before cleaning: 8 residual item(s), ~240 MB - After cleaning: 2 residual item(s), ~12 MB - Advanced paths remaining (use --force to clean): - ~/Library/Application Support/Raycast這個(gè)結(jié)果直接決定了你要不要繼續(xù)用--force做深度清理。4. 開(kāi)源后的打樣倉(cāng)庫(kù)結(jié)構(gòu)、使用方式與運(yùn)行效果4.1 為什么值得開(kāi)源出來(lái)這件事做成了 Skill 之后我第一反應(yīng)是發(fā)給身邊幾個(gè)也在用 Raycast 的朋友。他們?cè)囉煤蠓答伓纪φ娴瑫r(shí)提了個(gè)問(wèn)題這套腳本能不能讓他們自己在別的場(chǎng)景下也跑一下這時(shí)候我意識(shí)到與其把腳本捂在自己手里不如開(kāi)源。Raycast 的 Skill 生態(tài)本身就鼓勵(lì)分享官方也有對(duì)應(yīng)的社區(qū)目錄。開(kāi)源能讓別人用你的腳本解決同樣的問(wèn)題也能讓別人幫你發(fā)現(xiàn)沒(méi)覆蓋到的殘留路徑——比如我一開(kāi)始就沒(méi)寫全HTTPStorages這個(gè)路徑是別人測(cè)試后提醒我的。這種協(xié)作是個(gè)人博客、私有腳本給不了的。開(kāi)源倉(cāng)庫(kù)里的README.md我寫得很細(xì)把安裝方式、運(yùn)行方式、風(fēng)險(xiǎn)說(shuō)明都交代了。我的原則是一個(gè)開(kāi)源項(xiàng)目最差的部分往往是文檔我不想犯這個(gè)錯(cuò)。4.2 用戶怎么安裝和使用用戶拿到這個(gè) Skill 之后使用路徑非常簡(jiǎn)單把倉(cāng)庫(kù)克隆下來(lái)或者直接把 scripts 目錄復(fù)制到 Skill 工作目錄然后在 Raycast 中執(zhí)行 Skill 的對(duì)應(yīng)指令即可。也可以用純命令行方式運(yùn)行g(shù)it clone https://github.com/yourname/raycast-cleaner-skill.git cd raycast-cleaner-skill ./scripts/scan.sh # 先看殘留情況 ./scripts/clean.sh # 默認(rèn)清理安全級(jí) ./scripts/clean.sh --force # 深度清理高級(jí)級(jí)第一次跑的時(shí)候系統(tǒng)可能會(huì)彈權(quán)限提示因?yàn)閽呙鑯/Library下的目錄需要終端或 Raycast 擁有「完全磁盤訪問(wèn)權(quán)限」。這一點(diǎn)我單獨(dú)寫在 README 的「常見(jiàn)問(wèn)題」里了避免用戶卡在第一步。4.3 實(shí)測(cè)效果到底能清出多少空間我在自己兩臺(tái) Mac 上做了對(duì)照測(cè)試。一臺(tái)是日常主力機(jī)Raycast 用了大半年擴(kuò)展裝了十幾個(gè)另一臺(tái)是剛拿到手一個(gè)月的新機(jī)器Raycast 只用了幾天。主力機(jī)上掃描結(jié)果讓我挺意外Application Support 里的擴(kuò)展和緩存加起來(lái)一共有 350 多 MB其中 Store 緩存占了將近一半。新機(jī)器上少一些但也有 80 多 MB 的各類數(shù)據(jù)。清理掉安全級(jí)之后主力機(jī)釋放了約 190 MB深度清理后又能釋放剩下的一部分。當(dāng)然這個(gè)數(shù)據(jù)會(huì)因?yàn)槟闶褂?Raycast 的強(qiáng)度不同而浮動(dòng)但至少說(shuō)明「殘留不占地方」這句話是不可信的。關(guān)鍵不是這 190 MB而是清理后系統(tǒng)里確實(shí)沒(méi)有 Raycast 的痕跡了。重新安裝后不會(huì)再?gòu)棾鲆欢雅f配置也不會(huì)出現(xiàn)「明明重裝了但快捷鍵還保留著上次的綁定」這種讓人困惑的情況。4.4 邊界說(shuō)明什么不能亂刪開(kāi)源項(xiàng)目最怕的不是沒(méi)人用而是有人用出事故然后罵你。為避免這種情況我在 README 里把邊界說(shuō)得非常清楚不要在其他工具還在運(yùn)行時(shí)清理它們的殘留目錄。這個(gè) Skill 只針對(duì) Raycast雖然腳本結(jié)構(gòu)可以擴(kuò)展到其他 App但默認(rèn)清單里全是 Raycast 的路徑。不要對(duì)你不確定的路徑使用--force。Application Support 里如果存了你正在用的擴(kuò)展數(shù)據(jù)刪了之后擴(kuò)展需要重新配置。這是我的 Skill 里風(fēng)險(xiǎn)最高的一步所以默認(rèn)被保護(hù)起來(lái)了。清理前建議關(guān)掉所有可能引用這些路徑的 App。比如你如果在用某些 Raycast 擴(kuò)展同步工具它可能同時(shí)讀寫這些目錄邊寫邊刪會(huì)出問(wèn)題。5. 開(kāi)發(fā) Skill 時(shí)踩過(guò)的坑權(quán)限、誤刪與兼容性5.1 完全磁盤訪問(wèn)權(quán)限第一次跑就卡住開(kāi)發(fā)過(guò)程中我遇到的第一個(gè)攔路虎是 macOS 的 TCC 權(quán)限機(jī)制。腳本在終端里跑的時(shí)候訪問(wèn)~/Library/Application Support下的某些文件會(huì)被系統(tǒng)靜默拒絕不是報(bào)錯(cuò)而是權(quán)限不夠?qū)е伦x取到的文件列表是空的。解決方法是到「系統(tǒng)設(shè)置 → 隱私與安全性 → 完全磁盤訪問(wèn)權(quán)限」里把終端如果你通過(guò)終端運(yùn)行腳本或 Raycast如果你通過(guò) Raycast 運(yùn)行 Skill加進(jìn)去。這個(gè)操作在 README 里必須放在開(kāi)頭位置不然用戶第一次跑掃描就會(huì)發(fā)現(xiàn)結(jié)果和預(yù)期不符。這里有個(gè)小細(xì)節(jié)值得提醒如果你在 VS Code 里調(diào)試這個(gè) Skill也需要給 VS Code 加完全磁盤訪問(wèn)權(quán)限否則調(diào)試時(shí)讀到的文件系統(tǒng)視圖是不完整的。5.2 誤刪風(fēng)險(xiǎn)開(kāi)發(fā)測(cè)試中的一次差點(diǎn)翻車做測(cè)試的時(shí)候?yàn)榱藦?fù)現(xiàn)殘留場(chǎng)景我在一臺(tái)不常用的機(jī)器上反復(fù)安裝和卸載 Raycast。有一次我為了驗(yàn)證--force邏輯直接跑了清理腳本結(jié)果誤刪了 Application Support 里另一個(gè)工具的配置目錄——因?yàn)樗鼊偤靡步?Raycast 開(kāi)頭的子目錄。那次之后我改了腳本設(shè)計(jì)所有清理路徑必須精確匹配不允許用模糊匹配比如rm -rf $HOME/Library/Application Support/Raycast*這種帶通配符的寫法全部禁止。寧可漏掉一個(gè)路徑也不要誤刪一個(gè)路徑。這也直接促成了 manifest 里strict: true這一設(shè)計(jì)。先聲明要?jiǎng)幽男┞窂饺缓竽_本里強(qiáng)制校驗(yàn)路徑精確性雙重保險(xiǎn)。5.3 不同 macOS 版本的路徑差異另一個(gè)測(cè)試中頻繁出現(xiàn)的問(wèn)題是系統(tǒng)版本差異。比如LaunchAgents目錄在 macOS 12 和 macOS 14 上對(duì)于 Raycast 的處理不太一樣舊版本可能不在這里寫文件而新版本會(huì)寫com.raycast.macos.ShortcutCommands.plist。我在掃描腳本里對(duì)所有路徑做了存在性檢查就不需要針對(duì)版本寫分支了。存在就報(bào)出來(lái)不存在就跳過(guò)這種設(shè)計(jì)在涉及多版本兼容的工具里特別實(shí)用。做這個(gè) Skill 的過(guò)程中我最大的體會(huì)是清理殘留這件事本身沒(méi)什么技術(shù)含量真正有價(jià)值的是把清理流程抽象成一套標(biāo)準(zhǔn)化的檢查邏輯。你不需要記住十幾個(gè)路徑只需要運(yùn)行一次掃描機(jī)器會(huì)告訴你答案。比起手動(dòng)翻目錄這種感覺(jué)踏實(shí)得多。