前陣子,我教會一位朋友使用 Claude Code。他完全不會寫程式,連 Terminal 是什麼都沒聽過。但他有一個很清楚的產品想法,一直找不到工程師幫他做。
兩週後,他把那個產品完整地實作出來了。
不是原型、不是 wireframe,是一個可以實際運作的產品。他全程沒有寫過任何一行程式碼——他只是用中文描述他要什麼功能,Claude Code 就幫他把程式寫出來、跑起來、除完錯。
你可能會想:那它跟 ChatGPT 到底差在哪?
大部分人聽到「Claude Code」就先退了一步。Code,程式碼,那不是工程師的事嗎?
試試看跟它說這句話:「幫我把這個資料夾裡所有 PDF 的檔名,整理成一份清單。」
它會自己寫一段程式碼、跑完、把清單生出來。你完全不需要看懂那段程式碼。同樣的事在 ChatGPT 上做,它會把程式碼貼給你看,然後你得自己想辦法找地方執行。
你需要學的不是程式語言,而是怎麼把需求講清楚。但光是能下指令還不夠——如果它每次只能做一件事就停下來等你,那跟比較聰明的 Siri 也沒什麼兩樣。
用過 ChatGPT 或 Gemini 的人對 AI 的印象通常是:問一個問題,得到一個答案。一來一回,像在傳訊息。
跟 Claude Code 說「幫我把這 20 張圖片都縮小到寬度 800px,轉成 WebP 格式,存到 output 資料夾」,看看會發生什麼。
ChatGPT 會給你一段教學。Claude Code 直接幫你做完,output 資料夾裡已經躺著 20 張處理好的圖片。中間如果某張圖片格式有問題,它會自己發現錯誤、換個方式處理、繼續往下跑。
聊天機器人給你資訊。Agent 幫你完成工作。
不過,這裡有一個問題。它能做事、能跑程式,但它做事的地方在哪裡?
一般的 AI 聊天活在瀏覽器的分頁裡,跟你的電腦之間隔著一道牆。它摸不到你的檔案、打不開你的資料夾、跑不了你的程式。
Claude Code 不一樣。它跑在你的終端機裡,你的整台電腦就是它的工作空間。
你跟它說「把桌面上那份報告裡的表格抓出來,轉成 Excel」。它真的去讀那份報告、解析內容、生成一個 .xlsx 檔案放在你指定的位置。不是給你教學叫你自己做——是它做完了,你打開檔案確認就好。
聽起來很強。但如果每次開啟它都要重新自我介紹、重新解釋你的工作背景和偏好,那你大概用三天就煩了。
跟 ChatGPT 聊天,每次開新對話都要重新說一遍:「我是做行銷的」「報告格式要用繁體中文」「我們公司用 HubSpot」。每次都要講,它每次都忘。
Claude Code 有一個叫 CLAUDE.md 的設定檔。你把工作背景、偏好、常用格式、公司的內部規範寫進去,每次啟動它都會先讀這份檔案。
你可以根據不同的專案類型,設計不同的 CLAUDE.md。寫部落格的專案有一份,管理客戶資料的專案有另一份,做產品開發的專案又是另一份。每份都帶著不同的背景知識和工作規範。
同一個工具,在不同的專案裡表現出完全不同的行為。它不是一個通用的 AI,它是你針對每一種工作量身定做的 AI。你甚至可以隨時告訴它「記住這件事」,下次開新對話,這些記憶還在。
但「認識你」只是第一步。你的工作領域有大量的專業知識——格式規範、品質標準、判斷邏輯——光靠一份設定檔裝不下。
這就是 Skill 的用途。
Skill 是一份結構化的知識文件,告訴 Claude Code 在特定任務上應該怎麼做。我們團隊有一個「寫部落格文章」的 Skill,裡面定義了文章格式、語氣標準、該避免的用詞、品質評分方式。每次寫文章,Claude Code 就按照這份 Skill 的標準來執行。
把它想像成一本操作手冊。你把你最擅長的工作方法寫成 Skill,Claude Code 就能用你的標準幫你做事。
一個會計可以寫一份「月結報表」的 Skill。一個設計師可以寫一份「設計稿命名規範」的 Skill。一個業務可以寫一份「客戶提案信」的 Skill。這些 Skill 可以分享給同事,也可以跨專案使用。你的專業知識不再只存在你的腦袋裡。
到這裡,你有了一個認識你、懂你專業的 AI。但你每天的工作不只在一個工具裡完成——你要收 Email、更新 Notion、在 Slack 回報進度、到 Google Sheets 整理資料。這些工具之間,還是得靠你自己搬資料。
Claude Code 能透過 API、CLI 和 MCP 連接其他服務。
MCP(Model Context Protocol)聽起來很技術,概念卻很簡單——它是一個標準化的方式,讓 AI 可以直接跟其他軟體對話。裝了對應的 MCP 之後,你可以跟 Claude Code 說「把這份報告的摘要貼到 Slack 的 #marketing 頻道」,它就直接發出去了。
不用切換視窗、不用複製貼上、不用開 Zapier 設定自動化流程。一句話,串起原本要在三個工具之間跳來跳去的動作。
現在想像一下:你有一個理解你工作方式的 AI、它懂你的專業知識、還能操作你所有的工具。但如果你教會它的東西,每次都會消失呢?
前面提到的記憶、Skill、MCP 連接,有一個共同的特性:它們是累積的。
你今天花 30 分鐘教會 Claude Code 怎麼處理月報,下個月只要說一句「跑月報」就好。你花一個小時把客戶分類的邏輯寫成 Skill,之後每次新客戶進來,它自動按照你的邏輯分類。
ChatGPT 的對話是一次性的,下次還是要從頭教。Claude Code 的設定是持久的,你投入的每一分鐘都在為未來節省時間。
三個月後回頭看,你會發現它已經知道你的工作方式、品質標準、常用格式和偏好工具。你投入的時間是線性的,但它帶來的時間節省是指數型的。
這就引出了最後一個問題:既然這些能力這麼強,為什麼是「現在」開始?
還記得 2000 年代初期,有人說「我的工作不需要用電腦」嗎?還記得 2010 年代,有人說「我不需要學 Excel」嗎?
我認為,「會不會用 AI 工具」正在成為跟「會不會用 Office」一樣基本的職場技能。差別在於,這次的轉變速度快得多。
現在學 Claude Code 的門檻,是它誕生以來最低的時候。社群資源在快速成長、操作介面越來越友善、Anthropic 持續在降低入門的摩擦。但工具的能力每週都在增加。
早一天開始,你就多累積一天的記憶、Skill 和工作流。等到身邊的人都開始用的時候,你已經有了三個月甚至半年的領先優勢。
這個優勢不是「我比你多認識一個工具」,而是「我的 AI 已經理解我的工作方式,而你的還在從零開始」。
不需要一次學完所有功能。
第一步:安裝 Claude Code,用中文跟它說一件你今天本來要手動做的事。整理檔案、改檔名、合併資料——任何重複性的工作都行。
就這樣。從一件具體的小事開始。
當你第一次看到它在 15 秒內完成你原本要花 30 分鐘的工作,你就不需要任何人再說服你了。
為什麼不是 Codex?為什麼不是 Gemini CLI?為什麼不是 OpenClaw?
每隔幾天就有人問我這些問題。或者換個問法:「你怎麼不用 XXX?大家都在用欸。」
我的答案一直沒變過。但要解釋清楚為什麼,得從頭說起。
我是 WordPress 工程師,寫了十幾年的 PHP。當 AI 開始能輔助寫程式的時候,我第一個反應不是興奮,是懷疑。畢竟 WordPress 的生態系有它自己的一套規則和慣例,這些不是通用的程式知識,而是你要在這個生態待過才會知道的細節。
各家模型我都試過。老實說,每一家都有各自擅長的領域,寫程式的能力也都在快速進步。但就我個人的使用情境——WordPress 外掛開發、WooCommerce 客製化、LINE 串接——Claude 的模型在這些場景中的表現,一直是最讓我順手的。
真正讓我做出判斷的,不是某一次的驚艷體驗,而是持續使用超過一年的累積。這一年多來,我用它跑過多個客戶專案,也拿它開發自己的產品。從最早期的版本到現在,我能明顯感受到它的進步——對 WordPress 生態系的理解越來越深,給出的方案也越來越貼近實務。它不只是語法正確,而是真的理解 WordPress 的開發慣例和設計邏輯,給出的方案越來越貼近有經驗的工程師會做的選擇。這不是靠「會寫程式」就能做到的,是長期迭代後才有的理解深度。
這不代表其他模型不好。只是當你在一個工具上投入了足夠的時間、建立了足夠的工作流程和信任感之後,除非有明確的理由讓你搬家,否則留下來是最合理的選擇。
這跟我一直選擇 WordPress 是同一個道理。十幾年來,每隔一陣子就有人問我:「為什麼不換框架?」Laravel、Next.js、各種新東西輪番出現,每個都有它的優勢。但我在 WordPress 上累積的理解、踩過的坑、建立起來的開發效率,不是換一個框架就能帶走的。工具的價值不只在功能本身,還在你跟它之間磨合出來的默契。
Claude 也是一樣。一直沒有給我搬家的理由。反而是每次更新,都讓我更確定留在這裡是對的。
但模型好只是第一步。接下來的問題是:你要怎麼用它?
既然 Claude 的模型寫程式最好,那用整合了 Claude API 的開發工具應該不錯吧?我也是這樣想的。
Cursor 我用了一陣子。體驗確實不錯,自動補全的速度快、上下文理解也到位。但它的訂閱費用對我來說是個問題——每個月的開銷加上去,對一個小團隊的荷包不太友善。當我發現 Claude Code 能做到同樣的事,甚至做得更多,而且計費方式更透明的時候,就沒有繼續留在 Cursor 的理由了。
Antigravity 我也試過。介面設計得漂亮,操作體驗流暢。但核心問題沒變:中間隔了一層,你不確定它到底是把你的需求原封不動傳給了模型,還是做了什麼改寫或截斷。
後來我直接用 Claude Code。
沒有華麗的 GUI,就是一個終端機介面。但第一次用完一整天的感受是:終於沒有東西擋在中間了。
我描述需求,它理解。它改了什麼檔案、改了哪幾行,全部攤在你面前。不用猜它在背後做了什麼。出問題的時候,你知道是你的需求沒描述清楚,還是它的判斷有誤——這個透明度,在其他工具上得不到。
我沒有客觀數據證明它「更快」或「更準」。這純粹是主觀體驗。但這個主觀體驗夠強烈,讓我再也沒打開過其他工具。
選定 Claude Code 之後,這幾個月的觀察更讓我確信這個選擇是對的。
Claude Code 的開發團隊顯然有在看社群。一個功能需求在 GitHub Discussions 或 X 上被討論幾天,很可能下個版本就出現了。不是那種「我們聽到了,會排進路線圖」的官方回覆,是真的直接做出來。
Hooks 機制就是一個例子。社群裡有人想在每次 commit 前自動跑 lint,有人想在檔案修改後觸發自訂腳本。Claude Code 直接做了一套 hooks 系統,讓你可以在特定事件觸發時執行任意 shell 指令。這個機制後來被好幾個 AI 開發工具借鑑。
CLAUDE.md 也是。一個純文字檔案,放在專案根目錄,告訴 AI 這個專案的架構、慣例、偏好。這個概念簡單到不行,但它解決了一個所有 AI 工具都在頭痛的問題:怎麼讓 AI 理解「這個專案」的脈絡,而不只是「這個語言」的語法。類似的做法在其他工具上也有,像 Cursor 的 .cursorrules 甚至更早就出現了。但 Claude Code 在這個基礎上做得更完整——支援全域、專案、子目錄三層載入,加上自動記憶系統,讓專案脈絡的管理更有彈性。
還有 MCP(Model Context Protocol)、自訂 Skill、記憶系統、子代理人(Sub-agent)、背景任務⋯⋯這些功能一個接一個地推出,而且每個都不是花拳繡腿,是解決真實開發場景的問題。
一個工具的迭代速度能維持這麼快,代表它背後的團隊真的在用自己的產品。這件事聽起來理所當然,但在軟體業,做到的人比你想的少。
回到最初的問題:為什麼不用其他工具?
我的核心觀點是:Claude Code 目前是這個市場的規則制定者。
它不只是一個好用的工具。它在定義「AI 輔助開發應該長什麼樣子」這件事上,走在最前面。其他工具在追它的功能、參考它的設計模式、借用它的概念。
在這個前提下,我認為選擇 AI 工具的原則很簡單:選最底層的。
什麼叫最底層?就是它能做到的事情,是其他工具的功能來源。用 Claude Code 你可以做到那些「套殼」工具做得到的所有事情,甚至做到它們做不到的事情。反過來就不行了。
那些包了一層 GUI、加了一些限制、重新包裝過的工具,本質上都是在 Claude 的能力之上做篩選和呈現。篩選的過程中,一定會有東西被擋掉。有些是刻意的設計選擇,有些是能力上的限制。不管是哪種,你能用的,都只是模型完整能力的一部分。
我不想只用一部分。我想要完整的能力。
當然,Claude Code 的學習門檻比其他 AI 開發工具高。你得會用終端機,得理解基本的命令列操作,得學會怎麼寫 CLAUDE.md、怎麼設定 hooks、怎麼用 MCP 連接外部工具。這些東西第一次接觸確實需要花時間。
但這個投資是值得的。因為你學會的是最底層的操作方式,往上的工具你隨時都能理解、隨時都能切換。反過來,如果你只會用上層工具,一旦它們的限制卡住你,你就得從頭學起。
我不是 Anthropic 的粉絲,這個選擇跟品牌忠誠沒有關係。如果明天有另一家公司做出了更強的模型和更好的開發工具,我會毫不猶豫地換過去。
但以 2026 年 3 月的時間點來看,Claude Code 就是目前最好的選項。模型能力最強、工具迭代最快、社群最活躍、對開發者的理解最深。
選工具不是選信仰。它是一個工程判斷——在你手邊可選的方案裡,哪個能讓你用最少的時間、做出品質最高的成果。
就我個人來說,目前這個答案是 Claude Code。就這麼簡單。
你聽說 Claude Code 很厲害,能用中文下指令就幫你寫程式、整理檔案、自動化重複工作。但打開教學文章,第一步就叫你「打開終端機輸入 npm install」——然後你就默默關掉教學分頁了…
這篇文章就是寫給你的。我們會介紹兩種安裝 Claude Code 的方式,從最簡單到稍微進階,讓你根據自己的需求選擇。
如果你只是想趕快開始用,這個方法三分鐘就能搞定。
第一步:下載安裝
到 claude.ai/download 下載 Claude Desktop App。Mac 和 Windows 都有,跟你平常安裝 LINE 電腦版或 Spotify 一樣——下載、打開、拖進應用程式資料夾,結束。
第二步:登入帳號
打開 App 之後用你的 Anthropic 帳號登入。如果還沒有帳號,在這一步就能註冊。
第三步:升級到 Pro 方案
免費帳號無法使用 Claude Code。登入後到帳號設定頁面,訂閱 Pro 方案(每月 20 美元)。這是使用 Claude Code 的最低門檻——付完之後,Code 分頁才會開放。
第四步:切換到 Code 模式
登入之後你會看到一般的聊天介面,跟網頁版 Claude 一樣。但注意上方——有一個 「Code」 分頁。點下去。

這就是 Claude Code。
第四步:選擇工作資料夾
進入 Code 分頁後,它會請你選擇一個「目的地資料夾」。這個資料夾就是 Claude Code 工作的地方——所有你要餵給它的檔案,或是它幫你產生的檔案,都會放在這裡。

你可以從最近使用過的資料夾裡選,也可以點「Choose a different folder」自己指定。如果你還不確定要用哪個資料夾,先在桌面建一個新的空資料夾就好,之後隨時可以換。
選好之後,你就能開始在對話框裡打字,告訴 Claude Code 你想做什麼了。
想像你打開 Word 之後,上面有「文件」和「簡報」兩個分頁。Claude Desktop App 的概念類似——「Chat」是一般聊天,「Code」是讓 AI 幫你處理電腦上的工作。
Desktop App 用起來很順手,但用一陣子之後你可能會碰到一些限制。比方說:
你每天都在用圖形介面操作電腦:用滑鼠點資料夾、拖拉檔案、按按鈕。終端機是另一種操作電腦的方式——用打字代替點滑鼠。
打個比方:圖形介面像觸控螢幕的點餐機,你看到什麼就點什麼。終端機像直接跟店員說「一杯中杯拿鐵、去冰、加燕麥奶」——你得知道怎麼說,但說出來之後更快、更精確,還能一口氣講完複雜的要求。
你不需要記住什麼指令。Claude Code 的強大之處就在於——你只要用中文告訴它你想做什麼,它會自己跑對應的指令。終端機只是它工作的地方。
Mac 和 Windows 都有內建的終端機程式,但老實說,預設的終端機介面不太友善。我們推薦用 Warp——它是專門為現代使用設計的終端機軟體,介面乾淨、操作直覺,打字的時候有自動完成,還能把輸入和輸出分成清楚的區塊。
到 warp.dev 下載安裝就好,Mac 和 Windows 都有,流程跟裝一般軟體一樣。
開啟 Warp 之後,在可以輸入指令的地方,複製以下的安裝指令並按下 Enter。它會自動幫你安裝 Node.js、Git 和 Claude Code。
安全提醒: 在網路上看到任何「貼上一行指令就能安裝」的做法時,請養成一個好習慣——先把指令貼給 ChatGPT 或 Gemini,請它幫你檢查這段指令在做什麼、有沒有危險性。有些惡意人士會利用這種方式在你的電腦安裝後門程式。以下這兩行指令你也可以先檢查,我們完全公開原始碼:Mac 版 / Windows 版。
Mac:
curl -fsSL https://gist.githubusercontent.com/oberonlai/f4f6b8a7a2f8e0c70118d2d437e326b5/raw/install-claude-code-mac.sh | bash
過程中會跳出密碼輸入框(安裝 Node.js 需要系統權限),輸入你的 Mac 登入密碼後按 Enter。密碼不會顯示在畫面上,這是正常的。安裝 Git 時會彈出一個視窗,點「安裝」就好。
執行完成後,你會看到類似這樣的畫面,代表全部安裝成功:

Windows: 在工作列搜尋「Warp」,右鍵選「以系統管理員身分執行」,貼上這行指令後按 Enter:
irm https://gist.githubusercontent.com/oberonlai/61ef05497999adc560600fceaabfe2b8/raw/install-claude-code-windows.ps1 | iex
安裝完成後,輸入:
claude
第一次執行會請你登入 Anthropic 帳號。畫面會出現三個選項,選第一個「Claude account with subscription」就對了。

登入完成後,就可以開始用自然語言跟 Claude Code 聊天了。直接打中文告訴它你想做什麼,它就會幫你處理。

Desktop App 很方便,但終端機版本有幾個優勢:
跑互動式指令。 有些工具會在過程中問你問題——「要選哪個選項?」「確定要繼續嗎?」——這類互動在終端機裡可以直接處理,Desktop App 目前還不支援。
不用在 App 和終端機之間來回切換。 有些工作本來就需要在終端機裡執行,例如啟動程式或跑腳本。如果你已經在終端機裡用 Claude Code,它可以直接幫你處理,不用另外開視窗。
簡單來說,Desktop App 像是在餐廳用平板點餐,終端機版本像是直接走進廚房。大部分時候平板就夠了,但如果你想做更細緻的事,廚房讓你有更多可能。
| Desktop App | 終端機版本 | |
|---|---|---|
| 安裝難度 | 下載就能用 | 貼上一行指令自動安裝 |
| 上手速度 | 馬上 | 需要 1 分鐘設定 |
| 適合用途 | 簡單任務、初次體驗 | 專案開發、檔案操作、進階自動化 |
| 彈性 | 基本 | 完整 |
我們的建議:先從 Desktop App 開始。等你用出心得、發現有些事情它做不到的時候,再來裝終端機版本。兩個可以同時存在,不衝突。
要。Claude Code 需要至少 Pro 方案才能使用,免費帳號無法開啟。最入門的 Pro 方案是每月 20 美元,適合偶爾使用的人。如果用量比較大,Max 方案有每月 100 美元和 200 美元兩種選擇,額度更多。建議先從 Pro 開始,不夠再升級。
可以。Desktop App 有 Windows 版,直接下載安裝就能用。終端機版本也支援——上面的安裝步驟 Mac 和 Windows 都有,照著做就行。
網頁版 Claude 是聊天機器人——你問它問題,它回答你。Claude Code 是工作助手——它能直接操作你電腦上的檔案、執行指令、建立專案。差別在於,聊天機器人只能給你建議,Claude Code 能幫你動手做。
能。你不需要看懂它寫的程式碼,就像你不需要知道微波爐的電路設計才能加熱便當。你只要用中文描述你想做的事:「幫我把這 50 個 Excel 檔合併成一個」「把這個資料夾裡的照片按日期重新命名」——它會自己處理。
一鍵安裝指令會在最後顯示 Node.js、Git 和 Claude Code 的版本號碼。如果其中任何一個沒有出現,可以個別檢查:
node --version,有出現版本號碼就是裝好了git --version,同上claude --version,同上如果某個工具顯示「command not found」,關掉終端機重新打開再試一次——有些安裝需要重啟終端機才會生效。
Mac 用戶: 如果安裝過程中沒有跳出密碼輸入框就直接出現錯誤,重新執行一次指令,這次留意密碼提示。
Windows 用戶: 如果出現紅字錯誤訊息,最常見的原因是沒有用系統管理員身分執行 Warp。關掉目前的視窗,重新在工作列搜尋「Warp」,右鍵選「以系統管理員身分執行」,再貼上指令。
核心功能相同,都是 Claude Code。差別在於運作環境——Desktop App 把它包在一個圖形介面裡,終端機版本直接在你的電腦環境中執行,能做的事情更多。
我一直在想一件事:怎麼讓 Claude Code 直接幫我管 WordPress 網站?
最早的想法是自己寫一支外掛,開一組 REST API 讓 Claude Code 呼叫。後來也研究過用 MCP(Model Context Protocol)來串接。但越想越覺得不對——不管是自建 API 還是 MCP,Claude Code 能做的事都被限制在這些工具提供的端點裡。我想新增一個功能,就得先回去改 API;我想查一個 log,得先確認有沒有對應的 endpoint。
我真正想要的不是這個。我想要的是:Claude Code 直接幫我寫外掛、直接丟到主機上測試、直接用 WP-CLI 操作資料庫。不是透過中間層間接控制,而是像我自己 SSH 進主機一樣,什麼都能做。
透過 API 或 MCP 技術上做得到,但要把 WordPress 的管理權限開放給外部呼叫,風險太高。一個 API endpoint 設計不好,等於幫攻擊者開了一扇門。
後來發現答案其實很簡單——SSH。
我在 Terminal 裡打了一句話:「幫我找出 Gmail 裡的退信,把對應的殭屍帳號從 WordPress 刪掉。」
三十秒後,Claude Code 讀完退信、提取出失敗的 email、SSH 進遠端主機、用 WP-CLI 查到那個帳號、確認是機器人註冊的,然後刪除。整個過程我只按了一次確認。
這不是什麼未來場景。我今天早上剛做完。
你的 WordPress 網站放在一台遠端的電腦上,也就是主機。平常你透過瀏覽器打開後台管理介面來操作它,但其實還有另一種方式——直接「登入」那台電腦,用打字下指令的方式操作。
SSH 就是這個遠端登入的通道。你可以把它想像成一條加密的秘密隧道,連接你的電腦和主機。透過這條隧道,你可以在自己的電腦上對主機下達指令,就像你坐在那台主機前面一樣。
那 SSH key 又是什麼?一般登入需要帳號密碼,但每次都要輸入密碼很麻煩,而且密碼可能被猜到。SSH key 是一種更安全的驗證方式——它會產生一對鑰匙,一把「私鑰」留在你的電腦上,一把「公鑰」放到主機上。連線時兩邊自動配對,對上了就放行,不需要輸入任何密碼。
這對 Claude Code 來說很重要。因為它沒辦法像人一樣互動式地輸入密碼,但有了 SSH key,它就能直接連進主機執行指令,完全不需要人工介入。
整個設定大概五分鐘。
在 Claude Code 裡直接請它幫你產生:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_你的主機名稱 -N "" -C "claude-code"
-N "" 是空密碼,這樣 Claude Code 才能非互動式地使用這把 key。ed25519 是目前推薦的演算法,比 RSA 更快更安全。
產生完會有兩個檔案:私鑰和 .pub 結尾的公鑰。把公鑰的內容複製起來,貼到你主機的 SSH 設定裡。
每家主機商的操作位置不同:
~/.ssh/authorized_keys這一步最關鍵。在 ~/.ssh/config 加上一組別名:
Host kinsta
HostName 你的主機IP
Port 你的SSH Port
User 你的使用者名稱
IdentityFile ~/.ssh/id_ed25519_你的主機名稱
IdentitiesOnly yes
設完之後,ssh kinsta "whoami" 能成功回傳使用者名稱,就代表搞定了。
從這一刻起,Claude Code 只要執行 ssh kinsta "任何指令",就等於在你的遠端主機上操作。
設定好之後,你可以用自然語言請 Claude Code 做這些事:
「幫我看一下遠端主機裝了哪些外掛,有沒有需要更新的。」
Claude Code 會執行 ssh kinsta "cd public && wp plugin list" 然後列出清單。需要更新就一句話搞定。
「幫我搜尋這個 email 的會員帳號,如果是殭屍帳號就刪掉。」
它會用 wp user get [email protected] 查詢,確認角色和註冊時間,然後執行刪除。刪除前還會跟你確認。
「網站回報 500 錯誤,幫我查一下 error log。」
它會直接 SSH 進去看 log,分析錯誤訊息,可能還會順便找到問題根源。
「幫我把所有草稿狀態超過一年的文章刪掉。」
ssh kinsta "cd public && wp post delete \$(wp post list --post_status=draft --format=ids --date_query='{\"before\":\"1 year ago\"}') --force"
你不需要自己寫這串指令。告訴 Claude Code 你要什麼,它會自己組出來。
「把所有商品的 SEO 標題,從商品名稱改成『商品名稱 | 品牌名稱』的格式。」
這種手動要改幾百筆的工作,Claude Code 可以寫一段 WP-CLI 腳本一次跑完。
SSH 只是基礎層。當你把其他工具也串起來,Claude Code 就變成一個完整的網站維運助手。
我們今天早上做的那個「清理殭屍帳號」的任務,實際流程是這樣的:
五個步驟,跨了三個不同的服務。全部在 Claude Code 裡一氣呵成,我只需要描述需求和按確認。
能直接操作主機,不代表應該直接對正式站動手。
好的工作流程是這樣的:在 ~/.ssh/config 裡設定兩組別名——一組指向測試站,一組指向正式站。
Host staging
HostName 測試站IP
User ...
IdentityFile ~/.ssh/id_ed25519_staging
Host production
HostName 正式站IP
User ...
IdentityFile ~/.ssh/id_ed25519_production
日常操作的原則很簡單:改東西先在測試站跑,確認沒問題再到正式站執行。
跟 Claude Code 協作時也一樣。「幫我在測試站更新 WooCommerce 到最新版」,確認功能正常、沒有衝突之後,再說「正式站也更新」。外掛更新、PHP 版本升級、WP-CLI 批次腳本——任何可能影響網站運作的變更,都應該先過測試站。
有些操作例外。查 log、查會員資料、看外掛狀態這類唯讀操作,直接在正式站跑沒問題。刪殭屍帳號這種只影響特定資料的操作,確認對象正確後也可以直接執行。判斷的標準是:這個操作如果出錯,會不會影響到正在使用網站的人? 會的話,先去測試站。
大部分主機商都提供一鍵建立測試站的功能。Kinsta 的 Staging Environment、Cloudways 的 Staging Area,都能從正式站複製一份完整的環境。還沒有測試站的話,強烈建議先建一個。
把 SSH 存取權交給 AI 工具,第一反應通常是「這樣安全嗎?」
幾個重點:
私鑰只存在你的本機。 Claude Code 跑在本機,SSH key 也在本機,沒有任何憑證被上傳到雲端。
每個指令都會顯示在 Terminal。 Claude Code 不會偷偷執行什麼。每一步操作你都看得到,破壞性操作(刪除檔案、刪除帳號)會先跟你確認。
可以限制 SSH 使用者權限。 大多數主機商的 SSH 帳號本來就不是 root。你在遠端能做的事有上限,Claude Code 也一樣。
建議用獨立的 SSH key。 不要共用你平常登入用的 key。獨立的 key 方便管理,要撤銷存取權只要刪掉那把 key。
測試站和正式站用不同的 key。 這樣即使你不小心在對話中搞混別名,也不會因為同一把 key 通行兩邊而造成意外。
確認 ~/.ssh/config 裡有加 IdentitiesOnly yes,而且 IdentityFile 路徑正確。如果主機端的公鑰沒加好,SSH 會 fallback 到密碼驗證。
任何支援 SSH 的主機都行。Kinsta、Cloudways、Linode、DigitalOcean、自架 VPS,甚至共享主機(如果有開 SSH)都可以。
不一定,但強烈建議。沒有 WP-CLI,Claude Code 還是能透過 SSH 操作檔案和跑指令。但有了 WP-CLI,它就能用結構化的方式管理 WordPress——查外掛、管使用者、操作資料庫,效率差很多。大部分主機商都有預裝 WP-CLI。
Claude Code 在執行破壞性操作前會先跟你確認。但更好的做法是養成習慣:有風險的變更先在測試站驗證。確保你的主機有自動備份,Kinsta 每天自動備份,大部分主機商也都有類似機制。真的出事可以回滾。
在 ~/.ssh/config 裡設定多組別名就好:
Host site-a
HostName ...
User ...
IdentityFile ~/.ssh/id_ed25519_site_a
Host site-b
HostName ...
User ...
IdentityFile ~/.ssh/id_ed25519_site_b
跟 Claude Code 說「連到 site-a 看一下外掛狀態」「連到 site-b 更新 WooCommerce」,它會自動用對應的別名。
FTP 只能傳檔案。SSH 能執行指令。Claude Code 需要的是在遠端「做事」,不只是搬檔案。用 SSH 它能跑 WP-CLI、看 log、改設定、重啟服務,這些 FTP 都做不到。
設定 SSH key 本身不難,五分鐘的事。但它打開的可能性很大。
以前管 WordPress 網站,我得開 Dashboard 點來點去,或是 SSH 進主機自己打指令。現在我只要用中文跟 Claude Code 講一句話,它會自己決定該用什麼指令、怎麼組合、按什麼順序執行。
它不只是一個更快的 Terminal。它是一個理解你意圖、能跨工具協作的維運助手。而 SSH key,就是讓這一切成為可能的第一步。
我們團隊每次寫完一篇文章,就會開始想:這個內容之後要對客戶提案、在內部分享,或拿去社群聚會上講。每一次都得重新打開簡報軟體,把文章的重點一段一段搬過去,調版型、對齊、改字級。
同一份內容做了兩次,結果文章改了,簡報忘了更新。
後來我們團隊找到了一種「網頁簡報」的做法——使用一套叫做 Marp 的工具,讓文章內容可以直接轉換成簡報,而且簡報的風格會自動跟官網一致。只要跟 AI 助手說一句「幫我做成簡報」,五分鐘後就有一份可以直接使用的簡報,還能嵌在文章頁面上讓讀者直接翻閱。
簡單來說,網頁簡報就是一份可以在瀏覽器裡播放的投影片。它看起來跟傳統簡報一模一樣——有封面、有內容頁、可以一頁一頁翻——但它本質上是一個網頁。Marp 就是把文字內容自動轉換成這種網頁簡報的工具。

這代表什麼?
PowerPoint 或 Keynote 當然是好工具,但對我們團隊來說,有幾個痛點一直存在:
內容要做兩次。 文章寫完了,簡報還要再做一份。同樣的重點、同樣的結論,卻要手動搬到另一個工具裡排版。
品牌風格不一致。 每個人做的簡報長得都不太一樣。字體大小、顏色、間距,每次都要從頭調整。就算有範本,實際使用時還是會跑版。
更新很麻煩。 文章修改了,簡報也要跟著改。但通常改了文章就忘了簡報,結果兩邊的內容對不上。
網頁簡報解決了這三個問題。
我們團隊的做法是這樣的:寫文章和做簡報用的是同一份內容來源。文章更新了,重新產生一次,簡報也跟著更新。不會再有「簡報跟文章對不上」的問題。
而且因為簡報的視覺風格是事先設定好的——用的是跟官網同一組品牌色、同一套字體——所以產出的簡報不需要額外調整,每一份都跟官網的風格一致。
不需要自己調顏色、不需要對齊文字、不需要煩惱排版。風格一致這件事,從設定好的那一刻起就自動完成了。
我們設計了四種頁面類型,基本上涵蓋了商業簡報會遇到的所有場景:
深灰色背景搭配金色標題,置中排版。放上簡報主題和公司名稱。封面頁會自動隱藏頁碼,讓畫面乾淨俐落。

白色底色的標準頁面,適合放條列重點、表格、引述等內容。左上角會顯示品牌名稱,右上角顯示公司全名,每一頁都有一致的品牌識別。

當你需要做章節分隔,或是有一段話特別重要想要強調時,可以切換到深色背景。標題會自動變成金色,整個畫面的視覺衝擊力明顯不同。

最後一頁放公司資訊和 QR Code。掃描 QR Code 就能直接連到完整的文章頁面。QR Code 會在每次產生簡報時自動更新,不需要另外製作圖片。

這是整個流程最省力的部分。
我們團隊使用 Claude Code 作為 AI 助手。只要說一句「幫我把這篇文章做成簡報」,它就會自動完成以下所有步驟:
整個過程不需要打開任何設計軟體,也不需要手動調整任何排版。從一篇兩千字的文章到一份十五頁的簡報,大約五分鐘。
簡報跟文章最大的差異是空間限制。文章可以無限往下捲,但簡報的每一頁就是一個固定大小的畫面,超出的內容會直接被截斷。
幾個我們團隊摸索出來的原則:
AI 助手在幫你轉換時,也會自動遵循這些原則來安排內容。
可以。Marp 本身就支援多種匯出格式,除了網頁簡報之外,同一份內容也能透過 Marp 直接轉換成:
不管匯出什麼格式,都是從同一份來源產生的,不需要額外製作。
Marp 是我們團隊的選擇,但不是唯一的選擇。如果你的團隊已經習慣用 PowerPoint、Keynote、Canva 或 Google Slides,現在也有對應的 AI 整合工具,同樣可以讓 AI 助手直接幫你製作簡報。
Office-PowerPoint-MCP-Server 是一套開源的 AI 整合工具,讓 AI 助手可以直接建立和編輯 PowerPoint 檔案——新增投影片、插入圖表、調整格式,全部由 AI 完成。如果需要更精緻的成品,SlideSpeak 和 Plus AI 則是商業方案,支援自訂範本和更豐富的視覺效果。
Mac 使用者可以試試 keynote-mcp,它讓 AI 助手透過 macOS 的自動化功能直接操控 Keynote,支援三十多種操作,包含建立簡報、新增投影片、插入圖片等。
Canva 官方已經推出了 AI 整合工具,可以讓 AI 助手直接在 Canva 裡建立設計、套用範本、搜尋素材,還能匯出成 PDF 或圖片。如果你的團隊本來就在用 Canva,這是最無痛的整合方式。
Google Workspace MCP 讓 AI 助手可以操作整個 Google 工作區,包含 Google Slides。Google 自己也推出了官方的 AI 整合方案,支援直接透過 AI 建立和修改簡報。
不管你選哪一套工具,核心概念都一樣:讓 AI 幫你處理排版和格式,你只需要專注在內容上。
不需要。整個流程是由 AI 助手完成的。你只需要會寫文章,然後告訴 AI 助手「幫我做成簡報」就好。所有技術上的事情——格式轉換、套用風格、產生檔案——都是自動完成的。
簡報本身可以離線播放,因為它是一個獨立的網頁檔案。但最後一頁的 QR Code 需要網路連線才能顯示。如果需要在沒有網路的環境使用,可以事先把 QR Code 圖片存到本地。
拆成兩頁。不要試圖縮小字體來塞更多內容。簡報的核心原則是讓觀眾「一眼看懂」,而不是「把所有東西都放上去」。
不是全自動,但非常簡單。文章修改後,只要再跟 AI 助手說一聲「重新產生簡報」,它就會根據最新的文章內容重新產生。因為來源是同一份,所以不會出現內容不一致的問題。
可以。但要注意投影片的畫面空間有限,圖片太大會擠壓文字的空間。建議一張投影片上如果有圖片,文字就少放一點,讓畫面保持清爽。
最後整理一下:
整個過程不需要打開任何設計軟體,不需要手動排版,也不需要擔心品牌風格不一致。
對我們團隊來說,最大的改變是心態上的轉換:簡報不再是一個獨立的產出物,而是文章的延伸。寫完文章,簡報就自然而然地產生了。
我們團隊的官網 codotx.com 部署在 Cloudflare Pages 上,流量分析用的是 Cloudflare Web Analytics——輕量、不需要 cookie、隱私友善,而且網站本來就掛在 Cloudflare 上,在 Dashboard 開啟就能用。
但每次要看數據都得登入 Dashboard 點來點去,不太方便。我們想在 Claude Code 裡直接查流量,甚至每天自動產生報告。這篇記錄整個串接過程,包括中間踩到的幾個坑。

Dashboard 看數據當然可以,但我們想在 Claude Code 裡直接查詢。Cloudflare Web Analytics 的數據可以透過 GraphQL API 取得,不過需要一組有適當權限的 API Token。
第一個嘗試是用 wrangler CLI 的 OAuth token。結果不行——wrangler 的 token scope 不包含 analytics 相關權限。
需要另外建立一組 API Token。到 Cloudflare Dashboard → My Profile → API Tokens,選擇「查看分析與記錄」範本。

建立時有幾個重點:

建立完成後,用 verify endpoint 確認 token 有效:
curl -s "https://api.cloudflare.com/client/v4/user/tokens/verify" \
-H "Authorization: Bearer YOUR_API_TOKEN" | jq '.success'
回傳 true 就表示可以用了。
Cloudflare Web Analytics 的 API endpoint 是 https://api.cloudflare.com/client/v4/graphql。查詢需要三個參數:
這裡我們卡了一陣子。直覺上會以為 siteTag 就是 Dashboard 上給的 beacon token,但如果你用的是自動注入模式,Cloudflare 會分配一組不同的 siteTag。
用 beacon token 查詢,回傳空陣列。資料明明在 Dashboard 上看得到,API 卻拿不到。
解法是先不帶 siteTag 篩選,改用 requestHost 來找:
curl -s -X POST "https://api.cloudflare.com/client/v4/graphql" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "{ viewer { accounts(filter: {accountTag: \"YOUR_ACCOUNT_ID\"}) { rumPageloadEventsAdaptiveGroups(filter: {datetime_geq: \"2026-03-09T00:00:00Z\", datetime_leq: \"2026-03-10T23:59:59Z\", requestHost: \"codotx.com\"}, limit: 10, orderBy: [count_DESC]) { count dimensions { requestPath siteTag } } } } }"
}'
這樣就能從回傳結果裡拿到實際的 siteTag。拿到之後,後續查詢就能直接用 siteTag 篩選了。
GraphQL schema 裡的欄位命名不太直覺。一開始我們用 path 查詢頁面路徑,結果噴 unknown field 錯誤。正確的欄位名稱是 requestPath。
類似的情況還有國家欄位要用 countryName、瀏覽器要用 userAgentBrowser。效能數據更是要用完全不同的 dataset——rumPerformanceEventsAdaptiveGroups 而不是 rumPageloadEventsAdaptiveGroups。
以下是我們實際在用的查詢,一次拉回熱門頁面和國家分布:
{
viewer {
accounts(filter: {accountTag: "YOUR_ACCOUNT_ID"}) {
topPages: rumPageloadEventsAdaptiveGroups(
filter: {
datetime_geq: "2026-03-09T00:00:00Z"
datetime_leq: "2026-03-10T23:59:59Z"
requestHost: "codotx.com"
}
limit: 20
orderBy: [count_DESC]
) {
count
dimensions { requestPath }
}
topCountries: rumPageloadEventsAdaptiveGroups(
filter: {
datetime_geq: "2026-03-09T00:00:00Z"
datetime_leq: "2026-03-10T23:59:59Z"
requestHost: "codotx.com"
}
limit: 10
orderBy: [count_DESC]
) {
count
dimensions { countryName }
}
}
}
}
效能數據的查詢長這樣:
{
viewer {
accounts(filter: {accountTag: "YOUR_ACCOUNT_ID"}) {
performance: rumPerformanceEventsAdaptiveGroups(
filter: {
datetime_geq: "2026-03-09T00:00:00Z"
datetime_leq: "2026-03-10T23:59:59Z"
siteTag: "YOUR_SITE_TAG"
}
limit: 1
) {
count
quantiles {
pageLoadTimeP50
pageLoadTimeP75
pageLoadTimeP90
pageLoadTimeP99
}
}
}
}
}
注意效能數據的單位是微秒,需要除以 1000 才是毫秒。
能從 API 拿到數據之後,下一步是自動化。我們寫了一個 shell script,每天早上用 cron job 執行,產生 markdown 格式的流量報告。
核心邏輯:
date -v-1d 取得昨天的日期作為查詢範圍jq 解析 JSON 回傳值,組合成 markdown 表格reports/YYYY-MM-DD.md產生出來的報告長這樣:
# codotx.com 每日流量報告
**日期:** 2026-03-09
## 總覽
| 指標 | 數值 |
|------|------|
| 瀏覽量 (Pageviews) | 25 |
| 造訪數 (Visits) | 15 |
## 熱門頁面
| 頁面 | 瀏覽量 |
|------|--------|
| `/` | 18 |
| `/about/` | 2 |
| `/news/2026-03-09-claude-code-lsp-setup/` | 2 |
一開始我們用 Claude Code 的 /loop 指令來排程,設定每天早上 10 點自動跑報告。用起來很方便,但有個根本問題:/loop 的排程只存在於當前 session,Claude Code 關掉就沒了。對於每天要跑的任務來說不太實際,最後還是回到 cron job。
設定 cron job 的指令:
# 每天早上 10:03 執行
3 10 * * * /path/to/scripts/daily-report.sh >> /path/to/reports/cron.log 2>&1
reports/ 和 scripts/ 資料夾都加到 .gitignore,不進版控。
整個串接過程遇到三個問題:
requestHost 反查path 要用 requestPath,效能數據要用不同的 dataset從建立 API Token 到 cron job 跑出第一份報告,整個過程大約一個小時。大部分時間花在找 siteTag 和摸索 GraphQL schema 上。一旦搞清楚 API 的結構,後面的自動化就很順了。
經營技術部落格一段時間後,我們發現自己很少主動去看 Google Search Console。不是不想看,是每次都要登入後台、點來點去、手動比較數據,久了就懶了。但 SEO 數據其實藏著很多寶貴資訊——哪些關鍵字有人在搜、哪些頁面帶來最多流量、哪些主題值得寫更多文章。
所以我們決定:寫一個腳本,每週一早上自動從 GSC API 撈數據,產出一份 Markdown 週報,打開就能看。
動手之前先想清楚報告該包含什麼。我們定了四個區塊:
第三點是我認為最有價值的部分。一個關鍵字如果曝光 300 次但只被點了 1 次,要嘛排名太後面,要嘛標題不吸引人,要嘛根本沒有對應的文章。不管是哪種情況,都是可以改善的機會。
要從程式存取 GSC,需要一個 Google Cloud 的 Service Account。整個設定用 gcloud CLI 就能完成,不用進 Google Cloud Console 的網頁介面。
gcloud projects create codotx-gsc --name="Codotx GSC"
建議為這個用途開一個獨立專案,跟其他 GCP 資源分開管理。
gcloud config set project codotx-gsc
gcloud services enable searchconsole.googleapis.com
gcloud iam service-accounts create gsc-reader --display-name="GSC Reader"
gcloud iam service-accounts keys create gsc-credentials.json \
[email protected] \
--project=codotx-gsc
這會在當前目錄產生一個 gsc-credentials.json,Python 腳本會用這個檔案來驗證身份。記得把它加進 .gitignore,千萬不要 commit 進版本庫。
# .gitignore
gsc-credentials.json
四個指令,API 端的設定就完成了。
API 端設好了,但 GSC 那邊還不認識這個 Service Account。需要到 Google Search Console 後台手動加一次。
進入 設定 → 使用者和權限,你會看到目前的使用者清單:

點「新增使用者」,輸入 Service Account 的 email:
[email protected]
權限選「限制」就夠了,我們只需要讀取數據。

加完之後,使用者清單會多出 gsc-reader 這筆,狀態顯示為「限制」權限。到這邊,API 跟 GSC 的連線就建立好了。
安裝 Python 套件:
pip3 install google-api-python-client google-auth
腳本的核心是透過 searchanalytics().query() 來查詢數據。這個 API 支援多種 dimension(query、page、date、country 等),可以根據不同維度來拆分數據。
我們對同一個日期範圍發了三次查詢:
# 1. 關鍵字排名(依點擊數排序)
keywords = query_gsc(service, start_date, end_date, ['query'], 50, 'clicks')
# 2. 頁面排名(依點擊數排序)
pages = query_gsc(service, start_date, end_date, ['page'], 30, 'clicks')
# 3. 內容機會(依曝光數排序,後續再篩選)
all_keywords = query_gsc(service, start_date, end_date, ['query'], 100, 'impressions')
第三個查詢拿到所有高曝光的關鍵字後,用條件篩選出「內容機會」。
一開始我們用固定門檻(曝光 >= 50 算高優先、>= 20 算中優先),但馬上發現問題:對一個新站來說,一週 50 次曝光的關鍵字可能根本沒幾個;等流量長起來後,50 次又變得不值一提。固定數字沒辦法適應不同規模的網站。
最後我們採用混合制——先設最低門檻過濾噪音,通過門檻的再用百分位數分級:
MIN_IMPRESSIONS = 20 # 週曝光低於 20 的直接忽略.
# 篩選:通過最低門檻,且 CTR 低於全站平均或排名低於全站平均.
qualified = [r for r in all_keywords if r['impressions'] >= MIN_IMPRESSIONS]
avg_ctr = sum(r['clicks'] for r in qualified) / sum(r['impressions'] for r in qualified)
avg_pos = sum(r['position'] for r in qualified) / len(qualified)
opportunities = [
r for r in qualified
if r['ctr'] < avg_ctr or r['position'] > avg_pos
]
# 用百分位數動態分級.
imp_values = sorted([r['impressions'] for r in opportunities])
p75 = percentile(imp_values, 75) # 前 25% = 高優先.
p50 = percentile(imp_values, 50) # 前 25%~50% = 中優先.
這個做法的好處是門檻會隨著網站流量自動調整。報告裡也會標出本週的實際門檻值,讓你知道「高優先」這週代表的是曝光幾次以上。
分級結果:
報告自動計算「上週一到上週日」的完整七天:
days_since_monday = today.weekday()
last_monday = today - timedelta(days=days_since_monday + 7)
last_sunday = last_monday + timedelta(days=6)
這樣每週一執行時,拿到的永遠是上一個完整週的數據,不會有不完整的天數。
最後把所有數據組成 Markdown 表格,寫入 reports/gsc-weekly-YYYY-MM-DD.md。選 Markdown 而不是 CSV 或 HTML,是因為在終端機、GitHub、筆記軟體裡都能直接閱讀,不需要額外工具。
完整腳本放在 scripts/gsc-weekly-report.py,手動執行一次確認沒問題:
python3 scripts/gsc-weekly-report.py
如果 API 連線正常,會看到:
Report generated: reports/gsc-weekly-2026-03-10.md
腳本能跑了,最後用 cron 排程讓它每週一早上 10 點自動執行:
crontab -e
加入這行:
# codotx.com GSC 週報 - 每週一上午 10:00 執行
0 10 * * 1 /usr/local/bin/python3 /path/to/scripts/gsc-weekly-report.py >> /path/to/reports/cron.log 2>&1
注意幾個細節:
python3 和腳本位置,cron 的 PATH 環境跟你的 shell 不一樣* * 1 的 1 代表星期一(0 是星期日)產出的週報會長這樣:
關鍵字排名:
| # | 關鍵字 | 點擊 | 曝光 | CTR | 平均排名 |
|---|---|---|---|---|---|
| 1 | line flex message | 6 | 97 | 6.2% | 4.7 |
| 2 | line user id 查詢 | 6 | 12 | 50.0% | 3.3 |
| 3 | flex message | 4 | 116 | 3.4% | 6.8 |
| 4 | line login | 4 | 296 | 1.4% | 6.9 |
| 5 | line notify 替代方案 | 4 | 55 | 7.3% | 4.2 |
內容機會分析:
篩選條件:週曝光 >= 20,且 CTR 低於全站平均或排名低於全站平均 本週門檻:高優先 >= 206 曝光、中優先 >= 76 曝光
高優先(>= 206 曝光,前 25%):
| 關鍵字 | 曝光 | 點擊 | CTR | 排名 |
|---|---|---|---|---|
| line notify | 347 | 1 | 0.3% | 9.9 |
| line login | 296 | 4 | 1.4% | 6.9 |
中優先(76~205 曝光):
| 關鍵字 | 曝光 | 點擊 | CTR | 排名 |
|---|---|---|---|---|
| flex message | 116 | 4 | 3.4% | 6.8 |
| ai 圖像辨識網站 | 76 | 0 | 0.0% | 10.3 |
跟一開始用固定門檻的版本比,原本列出 18 個「機會」,混合制篩到只剩 7 個。數量少了但每個都更值得投入。例如「line notify」曝光 347 次但只被點了 1 次,排名在第 10 名左右,寫一篇完整教學搶進前 5 名,流量成長空間很大。而像「ai 圖像辨識網站」曝光 76 次、完全沒被點擊,代表有搜尋需求但我們沒有對應內容,是一個明確的內容缺口。
回顧一下,實現這個自動週報需要以下工具:
設定完成後,每週一早上報告就會自動出現在 reports/ 資料夾裡。不用登入任何後台,打開檔案就能看到上週的 SEO 表現和下一步該寫什麼文章。
對我們來說,這份報告最實用的部分是內容機會分析。它把「猜測讀者想看什麼」變成了「數據告訴你讀者在搜什麼」,寫文章的方向清楚很多。更進一步,每週一早上拿到報告後,我們會直接把內容機會丟給 AI,請它根據這些高曝光、低點擊的關鍵字來撰寫對應的文章。從數據採集到內容產出,整條流程都能在同一個早上完成。
我們團隊用 Claude Code 寫程式已經一段時間了,最近開始研究它的 Skill 機制——可以把特定的工作流程封裝成一份指令文件,之後只要觸發對應的 Skill,Claude 就會依照預設的規範執行任務。
我們第一個想做的 Skill 是「技術部落格寫作」。原因很直接:公司的技術文章產出頻率不高,每次寫都要重新跟 AI 溝通語氣、格式、禁用詞彙,效率不好。如果能把這些規範寫成 Skill,以後只要丟素材進去就能產出符合風格的初稿,應該能省下不少時間。
這篇記錄我們從零開始設計這個 Skill 的完整過程,包含中間踩的坑和迭代修正。
設計 Skill 之前,我們先分析了自己網站上幾篇文章的寫作模式。抓了三篇不同類型的文章來讀:
從這三篇歸納出幾個共同特徵:
同時也讀了 content config 和 category 設定,確認 frontmatter 的格式要求。
除了分析自己的文章,我們還參考了 GitHub 上的 humanizer-tw 這個 Skill。它專門處理中文 AI 寫作的去痕跡問題,把常見的 AI 味寫法分成八大類、19 個具體問題,每個都附上替換表和改寫範例。
這個 Skill 有幾個設計值得借鑑:
不過 humanizer-tw 的語氣定位偏口語,像是「我覺得」「得想想」「聊一下」,這對個人部落格合適,但我們是公司技術部落格,需要再正式一些。
第一版 Skill 寫完後,我們用三個測試案例跑了一輪:
三篇都順利產出,格式正確、沒有 AI 套話。但讀完之後有個明顯問題:語氣太隨性了。
踩坑紀錄那篇出現了「光看那個 crash log 真的完全猜不到原因」,反思那篇寫了「玻璃心碎了一地」「快崩潰」。這些表達放在個人部落格完全沒問題,但放在公司的技術部落格就顯得不夠專業。
問題出在 Skill 裡的語氣指引。第一版寫的是「讓人覺得是一個真的工程師在跟你聊天」,這個定位太偏聊天了。
我們重新定義了語氣定位:「專業技術文章,但讀起來不會想睡。」並且加了一張三欄語氣校準表,明確標出「太正式」「適當」「太隨便」的分界:
| 太正式 | 適當 | 太隨便 |
|---|---|---|
| 經由詳細的調查分析 | 排查之後發現 | 隨便 google 一下 |
| 予以高度重視 | 我們很重視這個問題 | 超在意的 |
還特別標注了一點:「我認為」在本部落格是適當的用語,不需要降到「我覺得」。這是跟 humanizer-tw 不同的地方。
修正後重跑三篇測試,語氣明顯改善。「光看那個 crash log 真的完全猜不到原因」變成了「一開始我們沒有馬上聯想到是架構相容的問題」,「玻璃心碎了一地」變成了「這個問題困擾了我好一段時間」。專業但不死板。
第一版 Skill 有列禁用清單,但只是把所有禁用詞和句型混在一起。AI 在執行時容易遺漏,因為沒有分類就沒有逐項檢查的依據。
參考 humanizer-tw 的做法後,我們把 AI 寫作問題整理成八大類、19 個具體問題:
每個類別都附上替換表或改寫範例,讓 AI 有明確的對照可以參考。
這個問題是從 humanizer-tw 的「個性與靈魂」段落得到的啟發。即使文字通過了所有 AI 味檢查,如果每句話都正確但沒有觀點、沒有轉折、沒有真實經驗的痕跡,讀起來還是像機器寫的。
我們在 Skill 裡加了「缺乏靈魂的警訊」清單:
以及七個「增添人味的技巧」:交代決策脈絡、加入具體數字、寫出轉折、帶入觀點、變化節奏、承認不確定性、對感受要具體。
經過兩輪迭代,最終產出的 Skill 是一份約 300 行的 SKILL.md,包含以下模組:
實際使用時,只要告訴 Claude Code「幫我寫一篇關於 X 的文章」,它就會自動載入這份 Skill,按照規範產出初稿。如果素材不足,它會主動詢問缺少的資訊,不會自己編造技術細節。
先分析再動手。 我們一開始就讀了自己的文章和別人的 Skill,這讓第一版的品質有一個不錯的起點。如果直接憑感覺寫,可能要多迭代好幾輪。
測試案例要涵蓋不同類型。 如果我們只測了踩坑紀錄,可能不會發現語氣在反思型文章中過於隨性的問題。三種模式各跑一篇,問題很快就浮現了。
語氣校準需要明確的邊界。 光說「專業但不僵硬」太模糊,AI 不知道邊界在哪。三欄對照表(太正式 / 適當 / 太隨便)比抽象描述有效得多。
去除 AI 味和注入人味是兩件事。 前者是刪掉壞的,後者是加入好的。只做前者會得到乾淨但無聊的文字。兩者都做,才能產出讀起來像真人寫的文章。
我平常就有在使用電子書裝置來閱讀書籍。翻頁、調字體、換背景色、關掉瀏覽器下次自動接上——這些體驗一旦習慣了,回頭看網站上的文章就覺得少了點什麼。
捲動式的長頁面、旁邊的側邊欄、頂部的選單列,這些東西在「瀏覽」的時候很好用,但在「閱讀」的時候是干擾。於是我開始想:我們寫的這些 Claude Code 教學文章,是否也可以改用電子書的形式,提供給讀者更乾淨、沒有干擾的閱讀體驗?
加上這些文章散落在十個不同的網址,讀者想從頭讀到尾,得在不同頁面之間跳來跳去。讀起來像在翻一本被拆散的書。
我們決定把這些文章重新組裝起來,做成一本可以在網頁上直接翻頁閱讀的電子書。

一般部落格的閱讀方式是這樣的:打開一篇文章,從頭捲到尾,看完了,回到列表頁,找下一篇,點進去,再捲一次。每篇文章之間沒有連結、沒有順序、沒有「上一篇 / 下一篇」的脈絡。
對於偶爾逛進來的讀者來說,這沒什麼問題。但對於想系統性學習的讀者,這個體驗很破碎。
他不知道應該先讀哪一篇。讀完一篇之後,也不確定下一步該看什麼。如果中間被打斷,下次回來得重新找到上次讀到的那篇文章——還不一定找得到。
我們想解決的,就是這個斷裂感。
我們跟 Claude Code 描述了這個需求:想要一個獨立頁面,把十篇文章串成一本書,讓讀者可以像用 Kindle 一樣,一頁一頁往下翻。不是捲動,是真的翻頁——畫面上一次只顯示一頁的內容,點一下就翻到下一頁。
Claude Code 聽完之後,提出了一個跟專業電子書引擎相同的做法。它把所有文章的內容排列在一起,再根據螢幕大小自動切成一頁一頁的畫面。讀者看到的每一頁,剛好就是螢幕能容納的內容量。
最後做出來的閱讀器,有幾個讓我們滿意的細節。
翻頁手感。 在手機上左右滑動,或是點螢幕的左右兩側,就能翻頁。在電腦上用鍵盤的方向鍵也行。操作方式跟一般電子書 App 一樣直覺。

閱讀設定。 讀者可以自己調整文字大小、行高、背景顏色(白色、米色、深色)和字型。每個人對「好讀」的定義不同,把控制權交給讀者自己。

章節目錄。 左上角有一個目錄按鈕,點開後從螢幕左側滑出完整的章節列表。想跳到特定文章,直接點就能到。目前正在讀的那篇會特別標示出來。

自動記住進度。 關掉瀏覽器,下次再打開,會自動跳回上次讀到的那一頁。目錄頁的按鈕也會從「開始閱讀」變成「繼續閱讀」。
十篇文章不是隨便排在一起的。我們把它們分成三個章節:
從「這是什麼」到「怎麼用在工作上」再到「怎麼用得更深」,讀者跟著目錄讀下去,就是一條從入門到進階的路徑。
這個順序是刻意設計的。我們發現,很多讀者對 Claude Code 感興趣,但不知道從哪裡開始。給他一份排好順序的閱讀清單,比丟十個連結給他有用得多。
對我們來說,這個電子書系統最有價值的地方,是它的管理流程幾乎沒有成本。
我只要跟 Claude Code 說有哪些文章要把它變成是書的內容,並請他自己幫我分類;如果要修改的話,我就直接口頭跟他講哪些文章要歸類於哪個分類底下,全部都可以用自然語言完成。

更重要的是,電子書裡的內容跟原本的文章是同一份。我們更新了某篇文章的內容,電子書裡的那一章也會自動更新。不需要另外維護兩份內容,不會出現「文章改了但電子書忘了更新」的問題。
目錄頁會自動計算收錄了幾篇文章、總共多少字、預估閱讀時間。這些數字不需要手動更新,加了新文章之後它自己會算。
這套系統也不限於 Claude Code 這個主題。如果未來我們寫了另一個系列的文章——比如 WordPress 開發實戰——只要建立一份新的文章清單,就會自動產生另一本電子書,擁有完全相同的閱讀體驗。
回頭看這件事,技術上的實作其實不是重點。重點是:我們把十篇各自獨立的文章,變成了一個有結構、有順序、有連貫閱讀體驗的產品。
讀者不需要在十個頁面之間跳來跳去。他打開這本書,從第一頁開始讀,隨時可以放下,下次回來繼續。讀完一個章節,自然接上下一個章節。就像讀一本真正的書。
而我們要做的,就是持續寫文章,然後把新文章的名字加進清單裡。
電子書會自己長大。
電子書可以離線閱讀嗎?
目前不行,需要網路連線才能開啟。但只要頁面載入完成,閱讀過程中斷網也不會影響翻頁和設定操作。
手機上怎麼翻頁?
點螢幕右側是下一頁,左側是上一頁。也可以左右滑動。進入閱讀器時會有提示。
閱讀進度會自動儲存嗎?
會。關掉瀏覽器後再次開啟,會自動跳回上次讀到的頁面。目錄頁的按鈕也會從「開始閱讀」變成「繼續閱讀」。
可以調整閱讀的字體大小嗎?
可以。點右上角的設定按鈕,能調整文字大小、行高、背景顏色(白色、米色、深色)和字型。設定會自動記住。
文章更新後,電子書的內容會同步嗎?
會。電子書的內容跟原始文章是同一份,文章更新後重新部署就會自動同步,不需要額外維護。
我可以把電子書分享給朋友嗎?
可以。目錄頁右上角和閱讀器的設定面板裡都有分享按鈕。讀完最後一頁也會出現分享提示。
我把 IDE 關掉了。現在打開電腦,只開 Warp 終端機,整天的開發工作都在裡面完成。
這不是為了追求極簡或懷舊。原因很單純:當 AI 寫程式的能力越來越強,我親手看程式碼的時間越來越少,那個佔據螢幕 80% 面積的程式碼編輯視窗,開始顯得多餘。
在 AI 時代前,我都是使用 PhpStorm。PHPStorm 確實順手——跳到函式定義、儲存時自動格式化和檢查,這些功能讓開發效率提升不少。
進入 AI 時代後,我用了 Cursor 好幾個月。自動補全和聊天介面加速了不少開發流程。但用了一段時間,我發現自己還是需要理解程式碼的能力,最後回到 PHPStorm 搭配 Claude Code 的組合。
後來也試過 Google 的 Antigravity。除了免費額度以外,用起來跟 VS Code 差不多。直到某天我打開系統監控,發現 Antigravity 的記憶體佔用竟然到了 40 幾 GB。
40 幾 GB,只為了一個程式碼編輯器。
這讓我開始重新思考一個問題:傳統 IDE 的設計核心是「程式碼」。整個介面以程式碼編輯器為主體,側邊欄、終端機、除錯面板都是輔助角色。
但我現在的開發流程已經變了。大部分時間我在跟 Claude Code 對話,描述需求、確認方向、審查它產出的結果。真正需要自己打開檔案逐行閱讀的時候,一天可能不到三成。
既然主要的工作模式是「對話 + 指令」,那為什麼不直接在終端機裡做?

我選了 Warp 作為主力終端機。用了幾週下來,整理出三個讓我回不去 IDE 的原因。
我同時在跑好幾個專案。在 Warp 裡,每個專案就是一個 Tab。早上開工時,Warp 會把我開過的專案分頁都暫存起來,只要一啟動時,就是所有我目前手邊正在進行中的專案,每個 Tab 直接切到對應的專案目錄。要切換專案,Command + 數字鍵就到了。
不用像以前那樣開好幾個 IDE 視窗,每個視窗吃掉一大塊記憶體。
Command + D 就能分割畫面。我常用的配置是左邊跑 Claude Code,右邊開一個終端機執行指令。如果需要同時監看 log 或跑測試,再切一個小視窗出來。
這跟 IDE 裡開 Terminal 的體驗完全不同。在 IDE 裡,終端機是被塞在底部的附屬品;在 Warp 裡,終端機就是主角,每個分割視窗都是平等的。我可以根據當下的需求,自由調整每個視窗的比例和用途。
真的需要瀏覽檔案結構的時候,Warp 左側也有目錄面板,點選就能開啟檔案。雖然不像 IDE 那樣有語法高亮和智慧提示,但對於偶爾需要確認檔案內容的場景來說夠用了。
我不會說每個開發者都該丟掉 IDE。如果你的工作需要大量手寫程式碼、頻繁使用重構工具、依賴型別檢查和自動補全,IDE 依然是最好的選擇。
但如果你跟我一樣,日常開發有一大半時間在跟 AI 協作——描述需求、審查產出、下指令執行——那 IDE 裡那個大大的程式碼視窗,可能真的不是你最需要的東西。
Warp 的介面設計剛好反映了這個轉變:它以 AI 對話為主體,終端機操作為輔助。當你的工作流程本來就是「對話 + 指令」,這樣的配置比 IDE 順手得多。
我們團隊日常開發都用 Claude Code 作為 AI 程式助手。一般情況下它靠 Grep 和 Glob 搜尋檔案,對小專案來說夠用,但專案一大,每次找定義或追引用都要翻好幾輪文字搜尋,效率明顯下降。
後來發現 Claude Code 從 v2.0.74 開始支援 LSP(Language Server Protocol),裝上之後它就像拿到了 IDE 的「程式碼地圖」——跳轉定義、查引用、看型別,都是毫秒級回應。根據社群的測試數據,查詢速度從原本的 45 秒降到 50ms,快了將近 900 倍。
這篇整理我們實際安裝的過程,涵蓋 TypeScript / JavaScript、Python、PHP 三種我們最常用的語言。
LSP 是微軟提出的通訊協定,讓編輯器和語言伺服器之間有統一的溝通方式。VS Code、Neovim 這些編輯器的「跳轉定義」「查找引用」功能,背後都是 LSP 在運作。
沒有 LSP 的 Claude Code 只能靠文字比對來理解程式碼。問它「這個函式定義在哪」,它得用 Grep 掃一遍檔案,碰到同名變數或字串就容易搞混。裝上 LSP 之後,它能直接跟語言伺服器溝通,拿到精確的型別資訊和符號位置。
裝完 LSP 後 Claude Code 會多出一個 LSP 工具,支援以下操作:
Claude Code 的 LSP 透過 Plugin 系統運作。安裝流程分兩步:先在系統上裝好語言伺服器的執行檔,再透過 Claude Code 的 /plugin 指令從官方市集 claude-plugins-official 安裝對應的 Plugin。
確認你的 Claude Code 版本在 v2.0.74 以上:
claude --version
TypeScript 用的是 vtsls(Vue/TypeScript Language Server),支援 .ts、.tsx、.js、.jsx、.mts、.cts 等副檔名。
npm install -g @vtsls/language-server typescript
用 pnpm 或 bun 也可以:
# pnpm
pnpm install -g @vtsls/language-server typescript
# bun
bun install -g @vtsls/language-server typescript
在 Claude Code 中輸入:
/plugin install typescript-lsp@claude-plugins-official
重啟 Claude Code 讓 LSP 伺服器生效。
Python 用的是 Pyright,微軟開發的高效能靜態型別檢查器。
npm install -g pyright
/plugin install pyright@claude-plugins-official
重啟 Claude Code。
PHP 用的是 Intelephense,高效能的 PHP 語言伺服器,支援程式碼補全、定義跳轉、引用查找和即時診斷。
npm install -g intelephense
/plugin install php-lsp@claude-plugins-official
重啟 Claude Code。
裝完之後怎麼確認有沒有成功?兩個步驟。
在 Claude Code 中輸入 /plugin,切到 Installed 頁籤,確認你安裝的 Plugin 顯示 Status: enabled。
這是最常見的坑——Plugin 裝了但沒有啟用。如果狀態顯示 disabled,手動啟用:
claude plugin enable typescript-lsp
請 Claude Code 對一個具體的檔案執行 LSP 操作。例如在 TypeScript 專案中:
幫我用 LSP 的 hover 看一下 src/i18n/translations.ts 第 527 行第 14 個字元的型別資訊
如果 LSP 正常運作,你會看到回傳的型別定義,而不是「No LSP server available」的錯誤訊息。
也可以試試 documentSymbol,請 Claude Code 列出某個檔案的所有符號:
用 LSP 列出 src/i18n/translations.ts 的所有符號
正常的話會看到檔案中所有變數、函式、屬性的清單和行號。
最常見的原因有三個:
which vtsls、which pyright、which intelephense 確認執行檔在 PATH 中/plugin 檢查狀態,手動 enableENABLE_LSP_TOOL部分版本的 Claude Code 需要手動啟用 LSP 工具。如果重啟後還是看不到 LSP 工具,在 ~/.zshrc 加上:
export ENABLE_LSP_TOOL=1
或是啟動時直接帶:
ENABLE_LSP_TOOL=1 claude
/plugin 介面有個 Errors 頁籤,如果 LSP 伺服器啟動失敗,錯誤訊息會顯示在這裡。常見的錯誤是「Executable not found in $PATH」,代表語言伺服器的執行檔沒裝好或路徑不對。
裝上 LSP 之後,不需要特別下指令叫 Claude Code 去用它。在日常對話中描述需求,它會自己判斷該不該呼叫 LSP。以下是我們實際遇過的幾種情境。
「幫我把
menuData這個變數改名成navigationData,所有引用的地方都要改到。」
沒有 LSP 的時候,Claude Code 會用 Grep 搜 menuData,但可能漏掉解構賦值的寫法,或是誤改到註解裡剛好出現的同名字串。有了 LSP,它會先用 findReferences 拿到所有真正引用到這個變數的位置,再逐一修改。
「
sanitize_text_field這個函式是 WordPress 內建的還是我們自己寫的?幫我找到它的定義。」
Claude Code 會用 goToDefinition 跳到函式定義的位置。如果是專案內的函式,直接跳過去;如果是第三方套件或框架內建的,LSP 也會指向 node_modules 或 vendor 裡的原始碼。比起 Grep 搜出一堆 sanitize_text_field 的呼叫處,精確太多。
「
getCollection的回傳值是什麼型別?」
Claude Code 用 hover 查詢,直接拿到完整的型別簽名。在 TypeScript 專案裡特別有用——泛型嵌套幾層之後,光讀原始碼很難直接看出展開後的型別。LSP 會幫你把推導結果算好。
「我想改
CategoryNavigation元件的 props 介面,幫我看看哪些地方有用到這個元件。」
findReferences 會列出所有引入和使用這個元件的檔案與行號。這比 Grep 搜元件名稱可靠,因為 Grep 會把 import 語句、註解、字串裡的提及全部撈出來,LSP 只回傳真正的程式碼引用。
「列出
src/i18n/utils.ts裡面所有 export 的函式。」
Claude Code 用 documentSymbol 取得檔案的完整符號清單,包含函式、變數、介面、型別別名,附帶行號。在閱讀不熟悉的程式碼時,這比從頭讀到尾快很多。
「專案裡有沒有叫
Pagination的元件或型別?」
workspaceSymbol 會在整個專案範圍內搜尋符號名稱。跟 Glob 搜檔名不同,它搜的是程式碼裡的符號定義——同一個檔案裡定義了多個 class 或 function,它都能找到。
「
woocommerce_checkout_order_processed這個 action hook 在我們的外掛裡哪些地方有掛載?」
PHP 專案裝了 Intelephense 之後,findReferences 能精確找到 add_action 和 add_filter 中引用到的 hook 名稱,不會像純文字搜尋那樣把 do_action 的觸發點和 add_action 的掛載點混在一起。
這些場景有個共通點:你不需要跟 Claude Code 說「請用 LSP」。正常描述你的需求,它會根據任務性質自動選擇用 Grep 還是 LSP。型別查詢、定義跳轉、引用追蹤這類需要語意理解的操作,它會優先走 LSP;純文字內容搜尋(例如找某段中文翻譯),它還是會用 Grep。
裝完 LSP 等於是讓 Claude Code 多了一組更精確的工具,它會自己判斷什麼時候該用。
用 AI 寫程式碼的時候,有一個容易被忽略的問題:AI 很擅長把功能做出來,但它不一定了解你用的工具有哪些「該注意但沒注意就會出事」的地方。
每個開源框架都有自己的一套使用建議。有些寫在官方文件的安全性章節,有些藏在效能調校的頁面,有些是社群踩過坑之後整理出來的。這些建議通常不影響功能是否能跑,但會影響上線之後會不會出問題 — 資料被未授權的人看到、頁面越來越慢、資料庫改版時資料不見了。
問題是,這些建議散落在不同地方,就算是有經驗的開發者也不一定每次都記得。AI 更不會主動幫你對照這些清單。
我們團隊一直有在使用 Claude Code 的 Command、Agent、Skill 三層架構來擴充開發流程,剛好可以用來解決這個問題:把框架的使用建議整理成結構化的檢查清單,讓 AI 寫完程式碼之後,自動根據這份清單逐項檢查。
這篇文章分享我們怎麼設計這套機制。我們用 Payload CMS(一個 Node.js 的開源後端框架)作為實際案例,但整套設計方法可以套用到任何框架或工具。
第一件要做的事不是寫程式,而是好好讀一遍你用的框架的官方文件。特別是跟上線部署、安全性、效能相關的章節。大部分成熟的開源工具都會把這些注意事項寫出來,只是散落在不同頁面,需要自己整理。
以 Payload CMS 為例,我們花了一些時間把官方文件翻過一輪,整理出三個需要特別注意的面向:
安全性 — Payload 在伺服器端提供了一組內部 API,方便開發者直接操作資料庫。但這組 API 有一個特性:預設不會檢查使用者的權限(官方文件有明確說明)。如果開發者沒有手動開啟權限檢查,任何人都可能透過這組 API 讀到不該看到的資料。另外,官方在 Preventing Abuse 和 Deployment 頁面分別列出了防暴力破解、跨站請求偽造防護、查詢深度限制等上線前該設定的項目。
效能 — Payload 在查詢資料時,可以自動帶出關聯的資料(例如查文章時順便帶出作者資訊)。這個功能很方便,但每多帶一層關聯,就多一輪資料庫查詢。官方文件(Depth、Select、Indexes)建議開發者明確控制要帶幾層、只取需要的欄位、對常查詢的欄位建立索引。開發時資料少感覺不出差異,上線後資料量一大就會明顯變慢。
資料庫變更安全 — 開發過程中經常需要修改資料結構(加欄位、改名稱、刪欄位)。Payload 處理欄位改名的方式比較特別:它不是直接改名,而是先把舊欄位刪掉再建一個新的(Migrations 文件)。這代表舊欄位裡的資料會直接消失。官方建議的做法是分階段處理:先加新欄位、把資料搬過去、確認沒問題、最後才刪舊欄位。
每個框架會有不同的注意事項。重點是從官方文件出發,有系統地整理,而不是等出了問題才回頭找原因。
找出風險維度之後,下一個決定是:要做幾個審查指令?什麼時候觸發?
我們一開始的直覺是做一個大指令,把所有檢查項目塞在一起。但實際用了幾次之後發現兩個問題:第一,每次都跑全部檢查太慢也太浪費 token;第二,migration 的風險等級遠高於效能問題,混在一起報告時容易忽略真正危險的項目。
最後我們拆成兩類,共五個指令:
日常開發用 — commit 前跑:
/payload-check:自動偵測改了哪些檔案,只跑需要的審查/payload-review:單獨跑安全性審查/payload-perf:單獨跑效能審查/payload-migrate:單獨跑 migration 審查定期健檢用 — 每週跑:
/payload-audit:三個維度同時掃描整個 codebase拆開的好處是日常開發不會被完整審查拖慢。改了一個 hook 就只跑安全性和效能審查,不需要等 migration 審查跑完。/payload-check 負責自動判斷該跑哪些,開發者不用記。
觸發時機我們選在 commit 之前。原因很實際:commit 前發現問題可以直接改,改完一起 commit,git history 乾淨。如果 commit 之後才跑,發現問題還要再改再 commit,多出一堆 fix commit。
這是整個設計中最關鍵的決定。Claude Code 提供三種機制:Command、Agent、Skill。
| 層級 | 機制 | 放什麼 |
|---|---|---|
| Command | .claude/commands/*.md | 入口點。接收使用者指令,決定啟動哪個 Agent |
| Agent | .claude/agents/*.md | 執行者。定義審查流程:收集 diff → 讀取知識 → 逐項檢查 → 產出報告 |
| Skill | .claude/skills/*/SKILL.md | 知識庫。完整的 checklist、正確 / 錯誤程式碼範例、官方文件對應 |
為什麼要分三層?因為知識和流程的更新頻率不同。
Skill 裡的 checklist 會隨著框架版本更新而變(Payload v3 和 v4 的最佳實踐不一樣),但審查流程(收集 diff → 讀知識 → 檢查 → 報告)基本不會變。如果把 checklist 直接寫在 Agent 裡面,每次更新 checklist 都要同時改 Agent,改錯了連流程都壞掉。
分開之後,更新 checklist 只需要改 Skill 檔案,Agent 和 Command 完全不用動。
Command 只需要一句話說明用途,加上指定啟動哪個 Agent。以 /payload-review 為例:
Run a Payload CMS SaaS security review on the current git diff.
Launch the `payload-saas-reviewer` agent to execute the review.
不要在 Command 裡寫具體的檢查步驟。Command 是入口,不是說明書。
Agent 定義審查的執行流程和輸出格式,但具體要檢查什麼則從 Skill 讀取。
## Workflow
1. Gather context — Run `git diff --staged` and `git diff`.
2. Load knowledge — Read `.claude/skills/payload-saas-review/SKILL.md`.
3. Identify scope — Determine which file types changed.
4. Read surrounding code — Never review in isolation.
5. Apply checklist — Work through each category in SKILL.md, CRITICAL first.
6. Report findings — Only report issues with >80% confidence.
關鍵是第 2 步:Agent 被指示去讀 Skill 檔案。這樣 Skill 更新了,Agent 下次執行自動就會用新的 checklist。
Agent 裡還有一個重要的設計:Noise Filter。我們要求 Agent 只報告信心度超過 80% 的問題,同類問題要合併(「3 個 collection 缺少 tenant filter」而不是 3 個獨立項目)。沒有這個過濾,審查報告會充斥大量低信心度的噪音,開發者很快就會忽略所有警告。
Skill 是整套機制的核心,內容最多也最重要。一份好的 Skill 檔案需要包含:
1. 分級的 Checklist
按嚴重程度分級:CRITICAL(必須封鎖合併)、HIGH(合併前修復)、MEDIUM(後續 PR 處理)、LOW(記錄備忘)。
不分級的 checklist 等於沒有 checklist — 開發者不知道哪些問題要優先處理。
2. 正確和錯誤的程式碼範例
每個檢查項目都配一組「錯誤寫法 → 正確寫法」的程式碼對照。光是描述規則不夠,Agent 需要具體的 pattern 才能準確辨識程式碼中的問題。
以 Payload 的 depth 控制為例:
// ❌ 沒有設定 depth,使用預設值,觸發不必要的關聯查詢
const posts = await payload.find({
collection: 'posts',
})
// ✅ 明確設定最低必要的 depth,搭配 select 只取需要的欄位
const posts = await payload.find({
collection: 'posts',
depth: 1,
select: { title: true, slug: true, category: true },
})
3. 官方文件對應
每條規則標註出處,例如「根據 Preventing Abuse 文件,maxLoginAttempts 必須設定」。這讓開發者可以自己去查原始文件,也讓 Agent 的建議更有說服力。
日常開發有三個獨立的審查指令,但每次都要想「這次該跑哪個」很煩。所以我們做了 /payload-check — 它看 git diff 改了哪些檔案,自動決定該啟動哪些 Agent。
改了 migrations/ 或 collection 欄位定義 → 啟動 migration Agent。改了 payload.find() 相關的程式碼 → 啟動效能 Agent。改了 access control 或 auth 邏輯 → 啟動安全 Agent。多個維度同時觸發就並行跑。
另外一個問題是:diff 審查只看「這次改了什麼」,不會抓到已經存在的問題。三個月前寫的 collection 沒加 index,上週部署時忘記設定 maxLoginAttempts,這些不會出現在任何一次 diff 裡面。
所以我們做了 /payload-audit,同時啟動三個 Agent 掃描整個 codebase,產出一份按嚴重程度排序的完整報告。這個指令的 token 消耗較高(大約是單一 diff 審查的 5-10 倍),不建議每天跑,每週一次或上線前跑比較合理。
最終的開發流程:
寫完功能
↓
/payload-check ← 自動偵測,只跑需要的審查
↓
有問題 → 修完再跑一次
沒問題 ↓
git commit → push
每週再跑一次 /payload-audit 做全面健檢。
到目前為止,我們的範例都是 Payload CMS 的 SaaS 平台,安全審查重點放在 tenant 隔離和計費邏輯。但同樣的三層架構可以適用於任何專案類型。
你需要做的是:根據你的專案類型,設計對應的 Skill 檔案。Agent 和 Command 的結構幾乎不需要改,因為審查流程是通用的(收集變更 → 讀知識 → 逐項檢查 → 產出報告),只有知識庫的內容需要替換。
以下是幾種不同專案類型的 checklist 方向,供你參考。
安全性的重點從 tenant 隔離轉移到交易安全:
user.id === order.customer 的驗證效能的重點在商品查詢和購物車:
安全性聚焦在發布權限和公開 API:
效能重點在內容查詢和快取:
額外需要關注的維度:
不管是哪種專案類型,設計 checklist 時有幾個原則:
最後整理一下完整的檔案結構,方便你照著建:
.claude/
├── commands/
│ ├── payload-check.md # 入口:自動偵測 + 啟動對應 Agent
│ ├── payload-review.md # 入口:啟動安全 Agent
│ ├── payload-perf.md # 入口:啟動效能 Agent
│ ├── payload-migrate.md # 入口:啟動 migration Agent
│ └── payload-audit.md # 入口:三個 Agent 並行掃全 codebase
├── agents/
│ ├── payload-saas-reviewer.md # 安全審查流程
│ ├── payload-performance-reviewer.md # 效能審查流程
│ └── payload-migration-reviewer.md # Migration 審查流程
└── skills/
├── payload-saas-review/
│ └── SKILL.md # 安全知識庫(checklist + 範例)
├── payload-performance-review/
│ └── SKILL.md # 效能知識庫
└── payload-migration-review/
└── SKILL.md # Migration 知識庫
如果你要替換成自己的框架,把 payload 換成你的框架名稱,修改 Skill 裡的 checklist 和程式碼範例就可以了。Agent 的 workflow 和 Command 的入口邏輯基本上可以直接複用。
這套機制上線大約兩週,我們的感受是:它不會取代人工 code review,但確實補上了一個盲區。AI 寫程式碼的速度很快,但速度帶來的風險是容易略過框架特有的注意事項。這些注意事項寫在官方文件裡,但分散在各個頁面,就算是人類開發者也不一定每次都記得。
把這些知識整理成結構化的 checklist,讓 AI 在產出程式碼之後自己檢查一遍,比起每次人工逐項確認高效得多。發現的問題在 commit 前就修掉,不會帶到生產環境才爆炸。
如果你也在用 AI 輔助開發,不管是什麼框架,花幾個小時把官方文件的最佳實踐整理成 Skill 檔案,設計對應的 Agent 和 Command,長期來看絕對值得。
恭喜你讀完了整本書!
覺得內容實用嗎?分享給你的朋友吧。