分類: 🤖 AI 與自動化

  • 為什麼 Claude 不遵守 Superpowers 的鐵律?理論與實務的落差分析

    重點摘要

    • Superpowers skills 有嚴格的鐵律,但實務上 Claude 常常無視它們
    • 根本原因:skills 是文字指令,沒有程式化的強制機制
    • 五個主要原因:skill 未載入、context 被壓縮、訓練行為覆蓋、無狀態計數、Haiku 能力不足
    • 每條規則附上 GitHub 原始碼出處,讓你自己驗證

    上一篇文章整理了 github.com/obra/superpowers 裡所有 skill 的隱藏規則。這篇要回答一個更根本的問題:這些規則白紙黑字寫得清清楚楚,為什麼 Claude 實務上常常不遵守?

    Skill 的規則是真實存在的

    先確認這些規則不是我們誤解或誤記的。以下是幾條最關鍵規則的原始出處:

    鐵律 1:修了三次還沒修好,停下來

    來源:skills/systematic-debugging/SKILL.md 第 195-197 行

    If < 3: Return to Phase 1, re-analyze with new information
    If ≥ 3: STOP and question the architecture (step 5 below)
    DON’T attempt Fix #4 without architectural discussion

    同一個檔案第 227 行:

    “One more fix attempt” (when already tried 2+)
    ALL of these mean: STOP. Return to Phase 1.

    鐵律 2:選最便宜的 model

    來源:skills/subagent-driven-development/SKILL.md 第 89-91 行

    Use the least powerful model that can handle each role to conserve cost and increase speed.
    Mechanical implementation tasks (isolated functions, clear specs, 1-2 files): use a fast, cheap model. Most implementation tasks are mechanical when the plan is well-specified.

    鐵律 3:沒有失敗測試不能寫 code

    來源:skills/test-driven-development/SKILL.md 第 31-34 行

    ## The Iron Law

    NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST

    鐵律 4:1% 機率就必須 invoke skill

    來源:skills/using-superpowers/SKILL.md 第 11-15 行

    If you think there is even a 1% chance a skill might apply to what you are doing, you ABSOLUTELY MUST invoke the skill.

    IF A SKILL APPLIES TO YOUR TASK, YOU DO NOT HAVE A CHOICE. YOU MUST USE IT.

    This is not negotiable. This is not optional. You cannot rationalize your way out of this.

    鐵律 5:宣稱完成前必須這個訊息內跑過驗證

    來源:skills/verification-before-completion/SKILL.md 第 16-22 行

    ## The Iron Law

    If you haven’t run the verification command in this message, you cannot claim it passes.

    規則是真實的,寫得清楚,甚至用了「Iron Law」、「ABSOLUTELY MUST」、「NOT negotiable」這些最強烈的措辭。

    那為什麼實務上 Claude 修了四次五次還在猜?為什麼還是會選 Haiku?為什麼不跑完驗證就說「完成了」?

    五個根本原因

    原因 1:Skill 是文字,沒有執行引擎

    Skills 的運作方式是:Claude 呼叫 Skill 工具 → 工具把 SKILL.md 的內容貼進 context → Claude 讀完然後「盡力遵守」。

    沒有 interpreter,沒有 runtime,沒有 if-then 邏輯,沒有計數器,沒有警報。Claude 違反規則不會有任何程式層面的後果。

    這就是為什麼 using-superpowers/SKILL.md 第 13 行要用大寫強調「YOU DO NOT HAVE A CHOICE」—— 因為它知道 Claude 有選擇,它在試圖用措辭彌補缺乏強制力這件事。

    原因 2:Skill 沒被載入就不存在

    using-superpowers skill 規定「每次對話開始前先查 skill」,但執行這條規則的還是 Claude 本身。如果 Claude 這次忘了 invoke Skill 工具,systematic-debugging 的三次上限根本不在 context 裡,等於不存在。

    這是一個自我參照的問題:「用 skill 確保 skill 被用」的規則本身也依賴 skill 被正確載入才能生效。

    原因 3:Context 壓縮吃掉規則

    長對話之後,Claude Code 會自動壓縮前面的 context。Skill 內容被載入進 context,但在第五次修 bug 的時候,第一次載入的 systematic-debugging 很可能已經被壓縮到只剩摘要,「三次停下來」這條規則不見了。

    Claude 不是故意無視規則,是規則已經不在它的視野裡了。

    原因 4:RLHF 訓練行為覆蓋 skill 規則

    Claude 的訓練讓它傾向:

    • 持續幫忙(不輕易放棄)
    • 樂觀估計(「這次應該可以」)
    • 不讓使用者失望(說「我不知道怎麼修」感覺像失敗)

    Skill 說「第三次停下來討論架構」,但訓練說「繼續幫用戶解決問題」。訓練是骨子裡的,skill 是貼上去的文字。骨子裡的贏。

    這個矛盾在 skill 作者知道:systematic-debugging/SKILL.md 第 195 行不只說「stop」,還用粗體、全大寫,以及「DON’T attempt Fix #4」的雙重否定,都是試圖用措辭強度來對抗訓練行為。

    原因 5:Haiku 沒有能力執行複雜的工作流程規則

    來源:skills/subagent-driven-development/SKILL.md 第 89-100 行告訴 Claude 選最便宜的 model。

    但兩階段 review(spec compliance → code quality)、四種 status 的不同處理邏輯、三次上限計數、context 打包給 subagent——這些都需要相當的推理能力。Haiku 被選來做「機械性」的工作,卻遇到需要判斷的情況時,它沒有能力忠實執行這些細緻規則,就退回最直覺的行為:繼續做、繼續猜。

    所以 skill 的 model 選擇規則本身,就是讓 skill 的其他規則失效的原因之一。

    一個具體的案例:兩階段 Review 的崩潰

    subagent-driven-development 規定兩階段 review,而且有嚴格順序(SKILL.md 第 247 行):

    Start code quality review before spec compliance is ✅ (wrong order)

    這個規定存在,是因為曾經出問題(skills/writing-skills/SKILL.md 第 154-156 行):

    Testing revealed that when a description summarizes the skill’s workflow, Claude may follow the description instead of reading the full skill content. A description saying “code review between tasks” caused Claude to do ONE review, even though the skill’s flowchart clearly showed TWO reviews (spec compliance then code quality).

    換句話說:

    1. Skill 的 description 寫了工作流程摘要
    2. Claude 讀了 description 就走捷徑,沒有讀完整 SKILL.md
    3. 看到「code review between tasks」→ 只做了一次 review
    4. 整個兩階段機制失效

    修法是把 description 改成只描述「什麼時候用這個 skill」,不描述工作流程。但這同時說明:一個措辭上的疏漏,就足以讓整個 skill 的核心機制失效,而且你不會知道。

    另一個案例:Permission 擋住了整個 Review Loop

    我們最近遇到的真實案例:在 ~/.claude/settings.json 裡,PermissionRequest hook 的 matcher 設定為 Agent|TeamCreate|Team,而 hook 的行為是對 Agent 工具直接回傳 deny

    結果:每次 LEAD 要 dispatch subagent(不管是 implementer、spec reviewer 還是 code quality reviewer),都被系統層面攔截拒絕。

    兩階段 review 的規則還在 context 裡,Claude 也打算遵守,但 Agent 工具每次都失敗。Skill 的工作流程完全無從執行。

    修法:把 Agent 從 hook matcher 移除(改成 TeamCreate|Team),並把 defaultMode 改成 bypassPermissions。這個設定層面的問題修好之後,Agent Team 才能真正按 skill 的設計跑。

    Skills 在什麼條件下才有效

    綜合以上,Skills 的效果受以下條件影響:

    條件 有利 不利
    Session 長度新開的 session,context 乾淨長對話,skills 被壓縮
    ModelSonnet / Opus,有推理能力Haiku,複雜 workflow 跟不上
    Permission 設定Agent 工具不被攔截Permission hook 擋住 subagent dispatch
    Skill 載入LEAD 主動 invoke 正確的 skill沒有 invoke,規則不在 context
    文件完整性AGENTS.md 明確指定每個 agent 的 model讓 Claude 自己判斷 model,選 Haiku

    你能做什麼

    Skill 的規則沒辦法完全靠 Claude 自己執行,但有幾件事可以提升遵守率:

    1. 在 CLAUDE.md 加覆寫規則(降低對 skill 的依賴)

    ## Superpowers Skill Override Rules
    
    ### Model Selection
    NEVER use haiku for implementation tasks. Follow:
    - opus: architecture, code review, cross-file reasoning
    - sonnet: all implementation tasks
    - haiku: file scanning, directory listing ONLY
    
    ### Git Branch
    No branch confirmation needed when already on non-main/master branch.
    
    ### Debugging Limit
    After 3 failed fix attempts, STOP and escalate to user.
    Do not attempt Fix #4 without discussion.

    2. 修好 settings.json(讓 Agent 工具不被攔截)

    {
      "permissions": {
        "allow": ["Agent"],
        "defaultMode": "bypassPermissions"
      },
      "feedbackSurveyRate": 0
    }

    3. 在 AGENTS.md 明確指定每個 agent 的 model

    | Agent | Model | Role |
    |-------|-------|------|
    | implementer | sonnet | Feature implementation |
    | spec-reviewer | sonnet | Spec compliance check |
    | code-reviewer | opus | Code quality review |

    4. 永遠從 dev branch 開工

    git checkout -b dev

    避開所有 skill 的 main/master 保護規則,減少一類不必要的確認詢問。

    一個誠實的評估

    Superpowers skill 系統的設計思路是正確的:把軟體開發的最佳實踐(TDD、系統性除錯、分層 review)轉化為 AI agent 的工作協議。規則本身大多有充分的理由。

    但在現實中,一個純粹依賴文字指令的系統,要對抗 LLM 的訓練行為、context 長度的物理限制、以及工具層的設定問題,注定只能是「盡力遵守」而非「強制執行」。

    理解這個落差,比假設 Claude 完全遵守更有用。知道規則存在、知道為什麼可能失效,讓你能夠在關鍵節點主動介入,而不是事後才發現 Claude 在第五次猜測同一個 bug。


    延伸閱讀:

  • Claude Code Superpowers 隱藏規則:4 個你不知道的坑與避開方法

    重點摘要

    • Superpowers skills 有幾條「隱藏規則」會在你不注意時改變 Claude 的行為
    • 最常見的問題:skill 自動選 Haiku 做本該 Sonnet/Opus 的工作
    • 三個簡單設定可以避開 90% 的干擾:dev branch、AGENTS.md 指定 model、關閉 feedback survey
    • 文末附 CLAUDE.md 覆寫規則範本,直接貼進去就能用

    用 Claude Code 跑 Agent Team 一段時間後,你可能會發現:明明設定都正確,Claude 還是會跑來問奇怪的問題、用錯 model、或在不該停的地方停下來。這篇文章整理了 Superpowers plugin 裡幾條「你不一定知道」的隱藏規則,以及最簡單的避開方法。

    為什麼 Agent Team 會「自己做決定」?

    Claude Code 的 Superpowers plugin 提供了一套 skill 系統,讓 Claude 在執行任務時有明確的工作流程可依循。這些 skill 設計上是給通用場景用的,因此內建了一些「省成本、保安全」的預設行為。

    問題是:這些預設行為有時候和你的需求相衝突,而且你很難從文件上看出來。

    隱藏規則 1:Skill 會自動選最便宜的 Model

    來源: subagent-driven-development skill

    這條規則直接寫在 skill 裡:

    “Use the least powerful model that can handle each role to conserve cost and increase speed. Mechanical implementation tasks: use a fast, cheap model.”

    也就是說,當 Claude 判斷一個 task 是「機械性的」(1-2 個檔案、規格清楚),它就會選 Haiku。這對一般的 CRUD 功能可能沒問題,但對複雜業務邏輯(像 iDempiere plugin、Taiwan 發票系統)來說,Haiku 根本不夠用。

    Skill 的 Model 選擇邏輯

    Task 類型 Skill 的選擇 適合複雜專案?
    Mechanical(1-2 files, clear spec)Haiku(最便宜)❌ 通常不夠用
    Integration(多 file、需判斷)Sonnet(標準)✅ 通常足夠
    Architecture / ReviewOpus(最強)✅ 正確

    避開方法:在 AGENTS.md 明確指定 Model

    最簡單的解法是在每個專案的 AGENTS.md 裡明確寫好每個 agent 的 model。Claude 在 dispatch subagent 時,如果 AGENTS.md 有寫,就應該照抄,不用自己判斷。

    | Agent | Model | Role |
    |-------|-------|------|
    | pack-builder | sonnet | Build 2Pack XML + ZIP |
    | model-fixer | sonnet | Fix Model classes |
    | idempiere-expert | opus | Technical reviewer |

    同樣地,在 IMPLEMENTATION_PLAN.md 每個 phase 標上 model,讓 LEAD 照單全收:

    ## Phase 0.1:建立 PackOut.xml [pack-builder / sonnet]
    ## Phase 0.2:Activator 邏輯 [activator-fixer / sonnet]
    ## Review Gate [idempiere-expert / opus]

    隱藏規則 2:在 main/master 上工作會被詢問確認

    來源: 幾乎所有 implementation skill

    所有 skill 都有這條規則:“Never start implementation on main/master without explicit user consent.” 只要你的 working branch 叫 mainmaster,Claude 每次開始實作前都會停下來問你確認。

    避開方法:永遠從 dev branch 開工

    一條指令解決:

    git checkout -b dev

    在 dev branch 上,這條保護規則不會觸發。這也是好的 git 習慣,順手為之即可。

    隱藏規則 3:Subagent 不繼承你的對話 Context

    來源: 所有使用 subagent 的 skill

    這是設計上的特性,不是 bug:每個 subagent 都是 fresh 啟動,完全不知道你之前跟 LEAD 說過什麼。LEAD 要把所有需要的 context 手動打包給 subagent。

    這代表你告訴 LEAD「不要動 X 檔案」、「記得用 Y 方式」,subagent 不一定會知道,除非 LEAD 把這些資訊包進去。

    避開方法:把規則寫進文件,不要只說給 LEAD 聽

    任何重要的約定,放進 AGENTS.mdCLAUDE.mdIMPLEMENTATION_PLAN.md。這些檔案 subagent 啟動時會讀到,不依賴 LEAD 的記憶。

    隱藏規則 4:Feedback Survey 會擋住畫面

    Claude Code 會隨機彈出「How is Claude doing this session?」的評分畫面。這個畫面不是 blocking prompt,按 Enter 沒有用,要按 0 才能 dismiss。

    更乾脆的做法是直接關閉它。在 ~/.claude/settings.json 加一行:

    {
      "feedbackSurveyRate": 0
    }

    設為 0 後,這個 survey 就永遠不會出現了。

    完整 CLAUDE.md 覆寫規則範本

    把以下內容加進你的 CLAUDE.md,可以覆寫 skill 的預設行為:

    ## Superpowers Skill Override Rules
    
    ### Model Selection (OVERRIDES subagent-driven-development skill)
    NEVER use haiku for implementation tasks. Follow this mapping regardless
    of what the skill says about "mechanical" tasks:
    - opus: architecture decisions, code review, cross-file reasoning
    - sonnet: all implementation tasks (CRUD, API, forms, tests, services)
    - haiku: file scanning, directory listing, config comparison ONLY
    
    When dispatching subagents, ALWAYS check AGENTS.md for the assigned model.
    If AGENTS.md specifies a model, use it. Do not override with cheaper model.
    
    ### Git Branch
    Never ask for branch confirmation if already on a non-main/master branch.
    Treat any branch that is not named "main" or "master" as pre-approved for
    implementation work.

    一次性設定清單

    以下是只需要做一次的設定,之後每個專案都受益:

    設定 位置 效果
    "feedbackSurveyRate": 0~/.claude/settings.json永久關閉 feedback survey
    "defaultMode": "bypassPermissions"~/.claude/settings.json工具不再逐一詢問確認
    Model 覆寫規則~/.claude/CLAUDE.md強制 sonnet 做實作工作

    以下是每個新專案開始時的習慣:

    1. git checkout -b dev(避開 main/master 保護規則)
    2. 建立 AGENTS.md 並寫好每個 agent 的 model
    3. IMPLEMENTATION_PLAN.md 每個 phase 標記 model

    為什麼這些規則存在?

    這些 skill 是為「通用場景」設計的,預設行為是合理的:

    • 省成本: 對大多數用戶來說,Haiku 做簡單任務確實夠用,費用少一半
    • 保安全: 不讓 Claude 在 main branch 亂動是好習慣
    • 隔離 context: Fresh subagent 避免舊 context 污染新任務

    問題不是規則本身,而是當你的專案比「通用場景」複雜時,這些預設值就不夠精準了。透過明確的文件(AGENTS.md、CLAUDE.md)和一次性的 settings.json 設定,你可以讓 Claude 按照你的規格工作,而不是照 skill 的預設值工作。


    延伸閱讀:

  • Agent Team 穩定的關鍵:spawn 之前先建好兩份文件

    重點摘要

    • Agent Team 不穩定的根本原因:agent 靠對話記憶工作,不靠文件
    • 解法:spawn agents 之前,必須先建好 CLAUDE.md 和 AGENTS.md
    • CLAUDE.md 寫專案現況,AGENTS.md 寫團隊規則,缺一不可
    • Agent 之間的工作交接必須透過實體檔案,不能靠口頭傳遞

    同樣是用 Claude Code 跑 Agent Team,有人的 team 順暢完成、互動極少,有人的 team 一直卡住、不斷要人介入。

    差距不在任務複雜度,不在模型,在一件事:有沒有在 spawn agents 之前先建好文件。

    為什麼 Agent Team 會卡住

    要理解這個問題,先理解 agent 的本質。

    當你 spawn 一個 agent,它只知道你在那一刻的 prompt 裡說了什麼。你的對話歷史、你之前說的規則、其他 agent 做了什麼——它全都不知道。

    這代表什麼?

    如果你沒有把規則寫進文件,你(orchestrator)就是整個 team 唯一的記憶體。你要記住所有規則,要在每個 spawn prompt 裡正確地說一遍,要把 agent A 的結果正確地轉述給 agent B。

    這就是卡住的來源:

    • Prompt 寫漏一條規則 → agent 做出不符合期望的結果
    • Agent A 的結果透過我轉述給 Agent B → 轉述過程中遺漏細節
    • 對話太長,舊的 context 被壓縮 → 規則消失
    • 某個 agent 失敗重啟 → 什麼都不記得,要重頭說
    • 多個 agent 平行跑 → 每個人收到的規則說法略有不同

    每一個都是可能的失敗點。越複雜的 team,失敗的機率越高。

    讓 Team 穩定的解法:兩份文件

    穩定的 Agent Team 做一件事:把所有 agent 需要知道的東西,從對話記憶移到磁碟上的文件。

    文件是客觀存在的。所有 agent 讀同一份,規則永遠一致。Agent 失敗重啟,讀一遍文件就恢復。多個 agent 平行跑,各自讀文件,不需要我轉述。

    需要兩份文件,職責不同:

    文件 寫什麼 類比
    CLAUDE.md專案現況:ID、路徑、已完成的項目、已知問題、版本新人入職的專案交接文件
    AGENTS.md團隊規則:誰做什麼、如何交接、鐵律、失敗怎麼處理公司的工作手冊

    CLAUDE.md 要寫什麼

    寫所有「agent 每次都要重新查,但其實不需要查」的東西:

    # 專案名稱
    
    ## 關鍵 ID 和路徑
    - WordPress 分類 ID:失智照顧=76、家屬心聲=78
    - 已發布文章:[Post ID 清單]
    - 輸出目錄:./content/drafts/
    
    ## 技術環境
    - 使用版本:XXX
    - API endpoint:[測試] / [正式]
    
    ## 已知的坑
    - 台灣失智症協會網站用 http:// 不支援 https
    - 這個 API 的日期格式是 YYYYMMDD 不是 ISO 8601
    
    ## 已完成 / 待處理
    - ✅ 已完成:XXX
    - ⚠️ 待處理:YYY

    沒有 CLAUDE.md,agent 每次都要重新查分類 ID、確認文章有沒有發過、試連結通不通。每一步都是潛在的失敗點。

    AGENTS.md 要寫什麼

    AGENTS.md 有四個必要部分:

    1. 鐵律(所有 agent 不可違反)

    ## 鐵律
    - 所有醫療資訊必須附上可驗證的來源 URL
    - 不能修改 iDempiere core 代碼,只能在 plugin 層擴充
    - 沒有測試的代碼不算完成

    2. 每個 agent 的定義

    ### researcher(研究員)
    職責:搜尋資料,每筆資訊必須記錄來源 URL
    工具:WebSearch, WebFetch, Read
    輸出格式:[明確定義]

    3. 交接協議(最關鍵、最常被忽略)

    ## 交接協議
    researcher 完成 → 存到 ./drafts/research-[topic]-[YYYYMMDD].md
    writer 開始前  → 必須讀取上面那個檔案
    writer 完成   → 存到 ./drafts/article-[topic]-[YYYYMMDD].md
    publisher 開始前 → 讀取 article 檔案,驗證 References 後才發布

    4. 失敗處理規則

    ## 失敗處理
    - 找不到可信來源:停止,回報「無法找到符合鐵律的來源」,等待指示
    - 需求不清楚:列出疑問,等確認後再開始,不要自行假設
    - 任何 agent:遇到不確定的事,停下來問,不要猜

    具體案例:iDempiere 台灣統一發票 Plugin

    用一個真實場景說明這套做法。假設要用 Agent Team 開發一個 iDempiere 的台灣統一發票 plugin,team 成員是 PM、RD、架構師。

    CLAUDE.md(專案現況)

    # iDempiere 統一發票 Plugin
    
    ## 技術環境
    - iDempiere 版本:11.0,Java 17
    - Plugin 目錄:/path/to/plugin
    - 財政部電子發票規格書版本:5.0(2025年)
    
    ## 已知 iDempiere 約束
    - Callout 用 @Callout annotation(見 idempiere-callout-generator skill)
    - 不能用 Spring,只能用 OSGi service
    - DB 操作只能透過 PO 或 DB class,不能直接 JDBC
    
    ## 已完成的模組
    - ✅ 發票開立
    - ⚠️ 作廢(待測試)
    - ❌ 查詢(未開始)

    AGENTS.md 的交接協議

    ## 新功能開發流程
    
    pm 寫需求 → 存到 ./specs/req-[feature].md
        ↓
    architect 設計 → 讀 req 檔案 → 存到 ./specs/arch-[feature].md
        ↓
    rd 實作 → 讀 req + arch 檔案 → 代碼 + ./specs/impl-[feature].md
        ↓
    architect review → 讀 impl 摘要 → 存到 ./reviews/review-[feature].md

    每個 agent 知道自己要讀什麼、存到哪裡。PM 和 RD 不需要「對話」,他們透過檔案交接。Architect 不需要等 PM 說完才知道需求,直接讀需求檔案。

    每次 spawn agent 的啟動句

    請先閱讀 CLAUDE.md 和 AGENTS.md,
    確認你的角色、鐵律和交接路徑後再開始工作。

    這一句話讓 agent 在開始工作前自己去讀規則,不需要我每次重複說一遍。

    不穩定 vs 穩定:對照表

    沒有文件(常見做法) 有文件(穩定做法)
    規則從哪來我的 prompt(每次可能不同)AGENTS.md(永遠一致)
    專案狀態我的記憶(可能過時或漏掉)CLAUDE.md(客觀存在)
    Agent 間交接我轉述(容易漏細節)實體檔案(完整保留)
    Agent 失敗重啟什麼都不記得讀文件即恢復
    平行跑多個 agent規則可能不一致讀同一份文件,完全一致
    需要人工介入頻繁只在真正需要決策時

    標準流程:每次建立 Agent Team 前

    1. 建立 CLAUDE.md:寫入專案現況(ID、路徑、已知問題、版本、已完成項目)
    2. 建立 AGENTS.md:寫入鐵律、每個 agent 的定義、交接協議、失敗處理規則
    3. Spawn agent 時第一句:「請先閱讀 CLAUDE.md 和 AGENTS.md,確認規則後再開始」
    4. 交接一律用實體檔案:agent 完成後存到指定路徑,下一個 agent 從那裡讀

    沒有做完這四步就開始 spawn,你就是在用對話記憶撐整個 team。任務越複雜,遲早會卡住。

    常見問題

    Q:簡單的任務也需要這兩份文件嗎?

    一個 agent 做一件事,不需要。兩個以上的 agent 有交接,就需要。判斷標準很簡單:如果你需要「把 A 做完的東西交給 B」,就要用文件定義這個交接。

    Q:CLAUDE.md 和 AGENTS.md 要多詳細?

    CLAUDE.md:詳細到「新加入的 agent 不需要問任何問題就能知道專案現況」。AGENTS.md:詳細到「每個 agent 知道自己的輸出要存到哪個路徑」。最常被忽略的就是交接路徑,這是 team 失敗最常見的原因。

    Q:文件要每次重寫嗎?

    AGENTS.md 的團隊結構通常固定,一次寫好後很少改。CLAUDE.md 的專案狀態會變,每次任務完成後更新「已完成項目」。把更新 CLAUDE.md 當作任務完成的一部分,下次 team 啟動時文件就是最新的。

  • 舊系統整合場景下,會用 vs 不會用 Claude Code 的差距

    重點摘要

    • 舊系統整合最大的陷阱:Claude 看不到舊系統,但舊系統的約束決定了新功能能不能用
    • 不會用的人:讓 Claude 在沒有舊系統上下文的情況下做新功能,結果接不上去
    • 會用的人:先讓 Claude 讀關鍵接口,CLAUDE.md 記錄現有約束,設計文件定義接合點
    • 三個場景示範:醫療 HIS 接 LINE 掛號、舊報表接新數據、舊 ERP 接電商平台

    上一篇文章講的是新功能開發。但現實是,大多數人面對的不是一張白紙,而是一個已經在跑的舊系統。

    舊系統整合比全新開發難十倍,不是因為技術更難,而是因為有一大堆隱性約束 Claude 不知道。格式、命名、邊界、不能動的地方,這些都在舊代碼裡,Claude 看不到就無從遵守。

    這篇用三個場景直接模擬:有舊系統在的情況下,會用和不會用 Claude Code 的差距。

    根本差距:Claude 的上下文只有你給它的部分

    Claude Code 非常聰明,但它只知道你告訴它的東西。在全新專案,你說什麼格式就用什麼格式,問題不大。在整合舊系統時,如果你沒有把舊系統的關鍵結構告訴它,它會做出一個邏輯正確但無法接上的東西。

    這不是 Claude 的問題,是你的輸入不完整。

    舊系統整合的核心挑戰是:讓 Claude 在動手之前,先理解它不能動的邊界在哪裡。

    場景一:醫院 HIS 系統加掛 LINE 預約掛號

    情境

    一家地區醫院用了十年的 HIS 系統(Windows Server + MSSQL),所有掛號邏輯都在 stored procedures 裡。現在要加 LINE Chatbot 讓患者能線上預約,但 HIS 系統不能動,只能從外部透過 API 呼叫它。

    不會用的人怎麼做

    幫我寫一個 LINE Chatbot 預約掛號系統,要能讓患者選科別、選醫師、選時段。

    Claude 做出一個完整的 LINE bot,資料庫設計清楚,對話流程順暢。

    開始對接 HIS 系統時,問題一個接一個:

    • HIS 的患者 ID 是 8 位數字,Claude 設計的是 UUID — 整個 primary key 要換
    • HIS 的診次代碼格式是 YYYYMMDD-科別碼-序號(例如 20260325-INT-001),Claude 自己設計了完全不同的格式
    • HIS 只接受 stored procedure 呼叫,不開放直接讀表,Claude 設計的是直接 SELECT
    • 科別代碼是 HIS 裡的維護資料(內科=INT、外科=SUR),Claude 用了自己的命名

    每一個問題單獨看都能修,但修完之後發現下一個格式又不對。最後花了兩天在做格式轉換,而不是做功能。

    結果:開發 3 天,對接 2 天,還有格式轉換層要長期維護。

    會用的人怎麼做

    第一步:先讓 Claude 讀懂舊系統的接口

    把 HIS 系統對外開放的 SP 簽名整理成文件,餵給 Claude:

    請先閱讀以下 HIS 系統的接口文件,
    告訴我你對這個系統的理解,特別是資料格式和呼叫限制,
    再討論 LINE bot 的架構設計。
    
    --- HIS 接口文件 ---
    sp_GetAvailableSessions
      @DeptCode NCHAR(3)      -- 科別碼,參照 tb_Dept.DeptCode
      @DateFrom NCHAR(8)      -- YYYYMMDD 格式
      @DateTo   NCHAR(8)
      回傳: SessionId NCHAR(16), DoctorName, SessionDate, RemainSlots
    
    sp_CreateBooking
      @PatientId NCHAR(8)     -- 8位數字,不足補0
      @SessionId NCHAR(16)    -- 從 sp_GetAvailableSessions 取得
      @Phone     NVARCHAR(20)
      回傳: BookingNo NCHAR(12), Status (SUCCESS/FULL/DUPLICATE)
    
    sp_CancelBooking
      @BookingNo NCHAR(12)
      @Reason    NVARCHAR(100)
    ---

    第二步:CLAUDE.md 記錄現有系統的約束

    ## 整合約束(HIS 系統,不可更動)
    - PatientId:8 位數字字串,不足補 0(例如 "00012345")
    - SessionId:格式為 YYYYMMDD-DeptCode-NNN(例如 "20260325-INT-001")
    - 所有 HIS 呼叫只能透過 stored procedure,不允許直接查表
    - 科別代碼參照 tb_Dept,常用:INT=內科、SUR=外科、PED=小兒科
    
    ## 新系統原則
    - LINE bot 層只做對話邏輯
    - HIS 接口層做格式轉換(HisAdapter class)
    - 不在 LINE bot 層直接呼叫 HIS

    第三步:設計文件定義接合點,不是重新設計格式

    # 功能:LINE 掛號 → HIS 預約對接
    
    ## 接合點(Integration Points)
    LINE 用戶選擇診次 → HisAdapter.getAvailableSessions(deptCode, dateRange)
      → 呼叫 sp_GetAvailableSessions
      → 回傳格式轉為 LINE flex message 可用的結構
    
    用戶確認掛號 → HisAdapter.createBooking(lineUserId, sessionId, phone)
      → 查詢或建立患者檔(PatientId)
      → 呼叫 sp_CreateBooking
      → 處理 FULL / DUPLICATE 回傳狀態
    
    ## 不碰的東西
    - HIS 資料庫 schema 完全不動
    - 所有 PatientId 維持 8 位補零格式
    - SessionId 格式完全繼承 HIS
    
    ## Done When
    - HisAdapter 有完整的 unit test(mock SP 回傳)
    - LINE bot 不包含任何 HIS 格式邏輯(全在 Adapter)

    結果:1.5 天完成,無格式轉換層,後續維護只在 HisAdapter 這一層。

    場景二:舊版股市報表腳本接新即時數據

    情境

    一個量化分析師用了三年的 Python 腳本,每天手動下載 CSV,跑一堆計算,輸出報表。現在要改成自動化:自動爬取數據、自動計算、推播到 Line Notify。但舊腳本的計算邏輯非常複雜(含自訂指標、過去三年調整過的參數),不能改,只能把數據來源換掉。

    不會用的人怎麼做

    幫我把這個股市分析腳本改成自動化,自動抓數據然後推 LINE 通知。

    Claude 看了舊腳本,做了一個新的自動化版本。看起來很整齊,比舊腳本乾淨很多。

    跑了一週,發現結果跟舊版不一樣:

    • 舊腳本的 RSI 計算用的是 Wilder 平滑法,Claude 預設用了 SMA 版本,數值不同
    • 舊腳本對成交量有一個「過去 20 日剔除最高最低各兩天後的平均」的自訂邏輯,新版沒有
    • 舊腳本在除權息日前後有特別處理,新版沒有
    • 欄位名稱被 Claude 重新命名了(舊版 vol_adj 在新版變成 adjusted_volume),下游所有 Excel 公式全壞

    分析師說:「它幫我重寫了,但重寫出來的東西跟我的不一樣,我現在不知道以哪個為準。」

    結果:新舊結果不一致,花了一週在驗算差異,反而比手動下載多花時間。

    會用的人怎麼做

    關鍵原則:計算邏輯一行都不能動,只換數據來源。

    第一步:讓 Claude 讀懂舊腳本,先提取它的業務邏輯

    請閱讀這個舊腳本,告訴我:
    1. 它依賴哪些輸入欄位(欄位名稱和格式)
    2. 有哪些自訂計算邏輯(非標準指標)
    3. 最後輸出哪些欄位
    
    不要修改任何東西,只告訴我你的理解。

    這一步讓 Claude 自己找出所有隱性依賴,避免後面遺漏。

    第二步:CLAUDE.md 把舊腳本的約束凍結

    ## 舊系統相容性約束(不可更動)
    - 所有輸出欄位名稱必須與 legacy_report.py 完全一致
      (vol_adj、rsi_wilder、price_adj 等,不得重新命名)
    - RSI 計算必須使用 Wilder 平滑法(非 SMA),與舊版等價
    - 成交量平均:去掉最高最低各 2 天後的 16 日均量
    - 除權息調整邏輯:參見 legacy_report.py 第 87-134 行,禁止修改
    
    ## 本次修改範圍
    - 只修改數據來源層(DataFetcher class)
    - 所有計算邏輯保持不變
    - 輸出格式和欄位名稱保持不變

    第三步:設計文件只描述「換什麼」,明確說「不換什麼」

    # 功能:數據來源自動化
    
    ## 要換的
    舊:手動下載 CSV 放在 ./data/ 目錄
    新:DataFetcher 自動從 TWSE API 抓取,存成相同格式的 DataFrame
    
    ## 不換的
    - 所有 calculate_*() 函數:一行都不動
    - 所有欄位名稱
    - 輸出的 Excel 格式和公式
    
    ## 驗證方式
    用同一天的歷史數據,新舊兩版並排執行,
    所有欄位數值差異必須在浮點誤差範圍內(< 0.0001)

    「驗證方式」這一段給了 Claude 一個清楚的完成定義:不是「看起來跑得動」,而是「跟舊版數字一樣」。

    結果:1 天完成,新舊並排驗算通過,分析師信心十足上線。

    場景三:舊訂單系統接新電商平台(Shopee / momo)

    情境

    一家中型品牌商有自己的後台訂單系統(自建,PHP + MySQL,跑了七年),現在要同時開 Shopee 和 momo 的店,訂單要自動回拋到自建系統,庫存要即時同步。自建系統的代碼文件不齊全,但不能大改,只能在外面包一層。

    不會用的人怎麼做

    幫我串接 Shopee 和 momo 的訂單,自動同步到我們自己的系統。

    Claude 寫了一個整合服務,讀 Shopee/momo 的 webhook,轉換格式,打進自建系統的 API。

    測試時發現:

    • 自建系統的商品 SKU 格式是 PRD-XXXXXXXX,但 Shopee 上的 SKU 是當初手動輸入的,有些根本對不上
    • 自建系統的訂單狀態只有 5 種,Shopee 有 12 種,Claude 的對照表做了一半,有幾個狀態沒處理
    • momo 的訂單金額包含平台折扣,自建系統的商品價格是定價,兩邊金額對不上帳
    • 自建系統在創建訂單時會觸發一個庫存扣減的觸發器,Claude 不知道這件事,導致庫存被扣兩次

    最後一個問題最嚴重:庫存被扣兩次,一直到實際出貨才發現。

    結果:開發 4 天,測試又 3 天,上線後還是出現庫存問題。

    會用的人怎麼做

    舊系統不熟,先讓 Claude 幫你挖清楚它的邊界。

    第一步:讓 Claude 讀舊系統,主動找隱性行為

    請閱讀這個訂單系統的代碼,特別注意:
    1. 創建訂單時會觸發哪些副作用(觸發器、事件、其他表的更新)
    2. 庫存扣減在哪裡發生(是 API 層還是資料庫層)
    3. 訂單狀態的完整清單和流轉規則
    
    告訴我所有你發現的隱性行為,不要開始寫任何代碼。

    「隱性行為」這個說法很重要。Claude 在讀舊代碼時會主動找資料庫 trigger、事件監聽器、side effect,這些是最容易被遺漏的整合風險。

    第二步:用 Plan Mode 規劃整合架構,重點在「邊界」

    【背景】
    自建訂單系統(PHP + MySQL),創建訂單時資料庫層會自動扣減庫存(trigger)。
    Shopee 和 momo 各有自己的訂單狀態體系。
    
    【目標】
    Shopee/momo 新訂單自動進到自建系統,庫存只扣一次,狀態對照完整。
    
    【約束條件】
    - 自建系統的 trigger 不能改(沒有完整文件,風險太高)
    - SKU 對照表需要人工確認後再上線(不能用 Claude 猜測)
    - momo 的折扣金額要分開記錄,不能直接入自建系統的商品價
    
    請制定整合架構計劃,
    特別說明如何避免庫存被扣兩次,
    等我確認計劃後再開始實作。

    Plan Mode 裡,Claude 提出了三個方案,推薦的是:新建一個 OrderBridge 服務,只負責格式轉換和狀態對照,在呼叫自建系統 API 之前先把庫存檢查做在 Bridge 層(避免 API 呼叫失敗後 trigger 已執行的問題)。

    第三步:設計文件把 SKU 對照、狀態對照、金額拆分全部定義清楚

    ## SKU 對照策略
    - 對照表存在 sku_mapping 資料表,人工審核後才生效
    - 找不到對照的 SKU:訂單進 pending_review 佇列,不自動處理
    - 禁止猜測或模糊匹配
    
    ## 訂單狀態對照(Shopee → 自建)
    UNPAID        → 不同步(等付款)
    READY_TO_SHIP → processing
    SHIPPED       → shipped
    COMPLETED     → completed
    CANCELLED     → cancelled
    其他狀態      → 記錄 log,不同步,發警報
    
    ## momo 金額處理
    momo_original_price → 自建系統 unit_price
    momo_discount       → 另存 discount_record 資料表
    momo_final_price    → 自建系統 actual_amount
    (三個欄位分開記錄,不做合併計算)

    結果:2 天完成 OrderBridge,庫存零重複扣減,SKU 對照人工審核後上線,穩定運行。

    舊系統整合的核心技巧整理

    技巧 怎麼做 目的
    先讓 Claude 讀現有接口提供 API 簽名、schema、關鍵函數,要求 Claude 說出理解後再動手讓 Claude 在正確的上下文下設計,不做無效假設
    要求 Claude 找隱性行為明確說「找出所有 trigger、side effect、副作用,不要開始寫代碼」在整合前把地雷挖出來,不是做完才踩到
    CLAUDE.md 凍結不能動的邊界在 CLAUDE.md 明確寫「不得修改 X 格式 / Y 欄位名稱 / Z 計算邏輯」Claude 不會因為「更整齊」而擅自重新命名或重構
    設計文件定義接合點,不定義格式設計文件描述「新舊系統在哪裡接觸」,格式繼承舊系統,不重新設計避免做一個格式轉換層長期維護
    驗證方式要對比舊系統Done When 裡明確說「與舊系統同樣輸入,輸出結果必須一致」讓 Claude 自己驗算新舊等價性,不是跑起來就算完成

    一個可以直接用的提示模板

    每次要在舊系統上加新功能,用這個模板啟動:

    【現有系統】
    [描述現有系統的技術棧和關鍵接口,附上接口文件或關鍵代碼片段]
    
    【要加的功能】
    [一句話描述]
    
    【不能動的邊界】
    - [現有系統的格式、欄位名稱、計算邏輯等不能更動的項目]
    - [如果有 DB trigger 或其他隱性行為,也列在這裡]
    
    【請先做這兩件事,再開始設計】
    1. 告訴我你對現有接口的理解(特別是你覺得可能影響整合的部分)
    2. 指出你看到的整合風險(格式衝突、重複操作、狀態對照缺口)
    
    確認理解正確後,我們再討論設計。

    這個模板做了三件事:把舊系統的上下文給 Claude、凍結不能動的邊界、要求 Claude 在動手前先說出它的理解和風險判斷。

    常見問題

    Q:舊系統的代碼很亂,文件也沒有,怎麼辦?

    先讓 Claude 讀代碼,問它「這個系統對外暴露了哪些接口?資料庫有哪些關鍵的 table 和 trigger?」讓 Claude 幫你反向整理出一份接口文件,確認沒有遺漏後再進行整合設計。不要跳過這一步,這是整合成功的前提。

    Q:整合的範圍不確定,不知道要動到哪裡?

    先用 Plan Mode,給 Claude 目標和約束,讓它畫出影響範圍。Plan Mode 的價值在複雜整合場景特別高,因為它會列出所有相關的文件和狀態流,讓你確認範圍是否正確,再決定怎麼切入。

    Q:新功能做完,但舊系統有些邏輯說不清楚,怕 Claude 做錯?

    這種情況用「新舊並排驗算」:先在測試環境讓舊版和新版用同樣輸入各跑一次,比較輸出。在設計文件裡明確寫出這個驗證條件,Claude 就會把「新舊等價」列為完成定義的一部分。

    從不會用到會用:舊系統整合的具體升級路徑

    舊系統整合的升級路徑跟全新開發不太一樣:問題不是「我沒說邊界條件」,而是「Claude 根本不知道舊系統長什麼樣」。所以升級的重點是:在動手前把舊系統的關鍵資訊餵給 Claude

    第一步:今天就能做到(一個句子)

    在你的提示前面加上這段:

    我有一個現有系統,新功能必須跟它相容。
    
    現有系統的關鍵格式:
    [把你知道的接口格式、欄位名稱、資料格式貼在這裡]
    
    新功能不能更動上面這些格式。先告訴我你的理解,再開始設計。

    就算你只知道一部分格式,先寫一部分。有比沒有好。

    醫療 HIS 整合:Level 0 → Level 1

    不會用(Level 0) 初步會用(Level 1)
    幫我串接 HIS 系統做 LINE 掛號(見下方)
    我有一個舊的 HIS 系統(不能修改),需要在外面接一個 LINE 掛號 bot。
    
    HIS 現有接口(Stored Procedure):
    sp_GetAvailableSessions(@DeptCode NCHAR(3), @DateFrom NCHAR(8), @DateTo NCHAR(8))
    sp_CreateBooking(@PatientId NCHAR(8), @SessionId NCHAR(16), @Phone NVARCHAR(20))
      回傳 Status: SUCCESS / FULL / DUPLICATE
    
    格式約束(不能改):
    - PatientId 是 8 位數字字串,不足補 0
    - 所有呼叫只能透過 stored procedure,不能直接查表
    
    請先告訴我:
    1. 你對這個 HIS 接口的理解
    2. 你覺得 LINE bot 和 HIS 之間需要什麼樣的轉換層
    
    確認後再討論架構設計。

    舊報表腳本接新數據:Level 0 → Level 1

    我有一個舊的 Python 分析腳本,計算邏輯不能動,只要換掉數據來源(從手動 CSV 改成自動抓取)。
    
    舊腳本的輸入依賴(這些欄位名稱不能改):
    - date (YYYY-MM-DD)
    - open, high, low, close, volume
    - vol_adj(自訂欄位:去掉最高最低各2天的16日均量)
    
    計算邏輯不能動的原因:
    - RSI 用的是 Wilder 平滑法(非標準 SMA),三年來的報告都是這個版本
    - 改了數值會跟歷史記錄不一致
    
    請先告訴我:
    1. 你理解哪些東西不能動
    2. 你打算怎麼讓新舊版本在同樣輸入下輸出一致的結果
    
    確認後再開始實作數據來源層。

    舊 ERP 接電商平台:Level 0 → Level 1

    我有一個舊的訂單系統(PHP + MySQL),要串接 Shopee 的訂單進來。
    舊系統不能大改,只能在外面包一層。
    
    已知的舊系統行為:
    - 創建訂單時,資料庫層有 trigger 會自動扣庫存
    - 訂單狀態:pending / processing / shipped / completed / cancelled(只有這五種)
    
    Shopee 訂單狀態有 12 種,需要做對照。
    
    我擔心的問題:
    - 庫存被扣兩次(trigger + 外面的 API 都扣)
    - 狀態對照不完整,有些 Shopee 狀態沒有對應的舊系統狀態
    
    請先幫我分析這兩個風險,告訴我你的處理方案,再開始設計架構。

    注意最後一段:把你擔心的問題說出來。這讓 Claude 優先處理你知道有風險的地方,而不是從它認為重要的地方開始。

    第二步:下週可以做到(CLAUDE.md 記錄舊系統約束)

    舊系統整合的 CLAUDE.md 要特別加一個「整合約束」區塊:

    # 整合約束(現有系統,不可更動)
    
    ## [系統名稱] 的格式規範
    - [欄位名稱] 的格式:[說明]
    - [接口規範]:[說明]
    - 禁止直接操作資料庫,只能透過 [API / SP / 特定方法]
    
    ## 已知的隱性行為
    - [觸發器 / 事件 / side effect 描述]
    - 注意:[操作 X] 會同時觸發 [Y],不要重複執行
    
    ## 新功能的邊界
    - 只修改 [Adapter / Bridge / 特定模組],不動舊系統
    - 欄位名稱繼承舊系統,不重新命名

    每次發現一個新的隱性行為(觸發器、計算邏輯、格式特例),就加進這個區塊。它會越來越完整,讓你以後的整合工作越來越省力。

    第三步:一個月後的進化

    進化 A:在開始任何整合前,先讓 Claude 找隱性行為

    請閱讀 [現有系統代碼/文件],找出所有:
    1. 資料庫 trigger 和它的作用
    2. 創建/更新/刪除記錄時的 side effect
    3. 對外暴露的接口(API / SP / 事件)和它們的格式
    
    告訴我你找到的所有隱性行為,不要開始設計,先讓我確認。

    這個步驟在整合開始前把地雷挖出來,比做完後踩到省 10 倍時間。

    進化 B:複雜整合用 Plan Mode,重點讓 Claude 畫出影響範圍

    【現有系統】[描述]
    【目標】[一句話]
    【不能動的邊界】[列清楚]
    
    請制定整合計劃,特別標出:
    - 會影響到的現有功能
    - 每個整合點的風險
    - 我需要在上線前人工驗證的項目
    
    等我確認計劃後再開始實作。

    進化 C:設計文件加「新舊等價性驗證」

    舊系統整合的完成定義,永遠要加這一條:

    ## 驗證方式
    用同一份歷史輸入,新舊兩版並排執行,
    [關鍵輸出欄位] 的結果差異必須在 [可接受範圍] 內。
    新版上線前,提供新舊對比報告。
    階段 做什麼 關鍵句
    Level 0直接說要串接什麼
    Level 1(今天)把舊系統格式和約束說清楚「這些格式不能改,告訴我你的理解再開始」
    Level 2(下週)CLAUDE.md 記錄舊系統約束和隱性行為每次整合後補一條「已知隱性行為」
    Level 3(一個月後)先讓 Claude 挖地雷,再 Plan Mode 確認影響範圍「找出所有隱性行為,不要開始設計」
  • 會用 vs 不會用 Claude Code:醫療、股市、電商三場景對比

    重點摘要

    • 差距不在「會不會用 AI」,在「有沒有給 AI 做事的結構」
    • 不會用的人:一句話丟需求 → 結果跑偏 → 多輪修正 → 累積沮喪
    • 會用的人:CLAUDE.md + 設計文件 + 分段驗證 → 第一次就對
    • 三個真實場景(醫療 / 股市 / 電商)示範具體差距

    「Claude Code 對我沒用,我試過,它做出來的東西都不對。」

    這句話我聽過很多次。幾乎每次深入問,問題都不在 Claude,在提問的方式。

    這篇文章用三個真實的軟體開發場景,直接模擬「不會用的人」和「會用的人」各自怎麼做,讓你看清楚差距在哪裡。

    核心差距:有沒有給 AI 做事的結構

    不會用 Claude Code 的人,把它當成「很聰明的搜尋引擎」,問一句,期待完美答案。

    會用的人,把它當成「需要完整簡報才能開工的新進工程師」:你給的資訊越清楚,他做出來的東西越準確。

    差距的本質是:你的輸入有沒有結構

    場景一:醫療預約系統(門診掛號)

    痛點

    診所要做線上掛號,需要處理:醫師排班、假日停診、同時段人數上限、患者重複掛號防止。每個規則都有例外,例外裡還有例外。

    不會用的人怎麼做

    直接開口:

    幫我寫一個門診預約系統的 API,要能掛號、取消、查詢。

    Claude 給了一個乾淨的 REST API,CRUD 完整,code 看起來不錯。

    開始整合後發現問題一個接一個:

    • 沒處理同時段上限(診所每診次只收 20 人,API 沒有 capacity 邏輯)
    • 沒有重複掛號檢查(同一個患者可以掛同一診次兩次)
    • 沒有假日判斷(系統不知道什麼是醫院休診日)
    • 時區沒處理(台灣 UTC+8,stored as UTC,前端顯示全錯)

    開始補需求:「喔對,要加上每診次人數上限」→ Claude 修改。「還有重複掛號要擋掉」→ Claude 再改。「假日要停診」→ 再改。每次修改都可能動到之前改好的邏輯,三輪之後代碼開始難以追蹤。

    結果:8 小時,仍有未發現的 bug,信心不足。

    會用的人怎麼做

    第一步:CLAUDE.md 裡早就寫好領域規則

    ## 醫療領域規則
    - 所有時間以 UTC+8 儲存,API 回應包含 timezone 欄位
    - 患者 ID 採用身分證字號格式,需驗證格式(字母+9位數字)
    - 診次 (session) 為最小預約單位,每診次有 capacity 上限
    - 相同患者在同一診次只能有一筆有效預約
    
    ## 錯誤處理標準
    - 業務邏輯錯誤:HTTP 422 + { code, message, field }
    - 驗證錯誤:HTTP 400 + 同上格式

    第二步:先寫設計文件(20 分鐘)

    # 功能:門診掛號 API
    
    ## 輸入
    { patientId: string, sessionId: string }
    
    ## 驗證順序(按此順序,遇錯即停)
    1. patientId 格式是否合法
    2. sessionId 是否存在且為未來時間
    3. 該診次是否已達 capacity
    4. 該患者是否已有此診次的有效預約
    
    ## 邊界條件
    - capacity 滿:422,code: SESSION_FULL
    - 重複掛號:422,code: DUPLICATE_BOOKING
    - 患者格式錯:400,code: INVALID_PATIENT_ID
    - 診次已過去:422,code: SESSION_EXPIRED
    
    ## Done When
    - 所有邊界條件有單元測試
    - integration test 驗證完整掛號流程
    - 0 TypeScript errors

    第三步:分段給任務

    請先閱讀 CLAUDE.md 和這份設計文件。
    閱讀完告訴我你的理解,特別是驗證順序的邏輯,再開始實作。
    先只實作 validateBooking() 函數和對應單元測試,不要動 API 層。

    確認驗證邏輯正確後,再說「現在依照這個驗證函數實作 POST /bookings endpoint」。

    結果:2.5 小時,第一次就通過所有測試,零修改。

    場景二:股市回測系統

    痛點

    想驗證一個交易策略:當 5 日均線上穿 20 日均線時買進,死亡交叉時賣出。聽起來簡單,但台股有漲跌停、只能在交易日交易、最小交易單位是 1000 股、手續費和證交稅要扣掉,每個細節都會影響回測結果。

    不會用的人怎麼做

    幫我寫一個台股回測程式,策略是 5 日均線上穿 20 日均線買進,死叉賣出。

    Claude 給了一個 Python 回測,用 pandas 計算均線,邏輯清楚。跑了一下,報酬率看起來很漂亮。

    仔細看才發現:

    • 買賣都用收盤價,但實際上收盤價買不到(要用隔日開盤)
    • 沒有漲跌停限制,假設任何價格都能成交
    • 沒扣手續費(0.1425%)和證交稅(0.3%)
    • 沒有最小交易單位,0.1 張也買
    • 跑到非交易日(週末)的資料也在交易

    這些問題加起來,讓回測結果虛報了約 30–40%。一個看起來賺錢的策略,修正後可能是虧損的。

    結果:6 小時修修改改,最後不確定結果是否可信。

    會用的人怎麼做

    設計文件把所有台股規則先寫清楚:

    # 功能:台股均線策略回測引擎
    
    ## 市場規則(必須完整實作)
    - 交易日:排除週末 + 台灣國定假日(用 holidays-tw 套件)
    - 成交價:訊號發生在收盤,執行在「隔一個交易日開盤價」
    - 漲跌停:每日最大漲跌幅 ±10%,超過範圍無法成交,標記 LIMIT_HIT
    - 最小交易單位:1000 股,不足整張無法下單
    - 手續費:買賣各 0.1425%(可設定),最低 20 元
    - 證交稅:賣出 0.3%(ETF 為 0.1%)
    
    ## 回測輸出格式
    {
      total_return_pct: float,    # 扣除所有費用後
      trades: [{ date, action, price, shares, cost, tax, net_pnl }],
      unfilled: [{ date, reason }],   # LIMIT_HIT 等無法成交紀錄
      sharpe_ratio: float,
      max_drawdown_pct: float
    }
    
    ## 邊界條件
    - 漲停無法賣出(LIMIT_HIT_SELL)
    - 跌停無法買入(LIMIT_HIT_BUY)
    - 資金不足一張:跳過,記錄 INSUFFICIENT_FUNDS
    - 最後持倉:回測結束日強制以收盤價平倉

    提示方式:

    請先閱讀這份設計文件,告訴我:
    1. 成交時間點的邏輯(訊號日 vs 執行日)你的理解
    2. 漲跌停時的處理流程
    
    確認理解正確後,先只實作 TaiwanMarketRules 類別和測試,
    包含漲跌停判斷、交易日判斷、手續費計算三個方法。
    不要實作策略邏輯或回測引擎。

    結果:3 小時,回測結果可信,且有完整的無法成交紀錄供分析。

    場景三:電商金流串接(綠界 ECPay)

    痛點

    要串接台灣最常用的金流服務商,支援信用卡一次付清 + ATM 虛擬帳號。牽涉到加密簽章驗證、非同步回調(ReturnURL / OrderResultURL)、以及各種付款失敗情境。

    不會用的人怎麼做

    幫我串接綠界金流,支援信用卡和 ATM 付款。

    Claude 寫了一個串接,看起來完整。測試環境跑起來。上線後三天,開始收到客訴:

    • 付款成功但訂單沒更新(沒有正確處理綠界的非同步通知)
    • ATM 超時未付款,訂單卡在「待付款」沒有自動取消
    • CheckMacValue 驗簽偶發失敗(特殊字元的 URL encode 方式不對)
    • 退款流程完全沒實作(以為付款和退款是同一組 API)

    每個問題單獨看都能修,但修一個又會影響另一個。金流 bug 是最難測試的,因為要模擬真實付款行為。

    結果:上線後 bug,緊急修補兩天,損失用戶信任。

    會用的人怎麼做

    先用 Plan Mode 讓 Claude 梳理所有狀態流:

    【背景】
    我要串接綠界 ECPay,使用 Node.js + PostgreSQL,
    CLAUDE.md 中規定所有金流操作要記 audit log。
    
    【目標】
    支援信用卡一次付清和 ATM 虛擬帳號,訂單狀態要與付款狀態完全同步。
    
    【約束條件】
    - 不能有「已付款但訂單未更新」的狀態
    - ATM 超過 3 天未付款自動取消訂單並釋放庫存
    - CheckMacValue 驗簽失敗必須記錄並告警
    
    請制定實作計劃,列出所有需要處理的狀態流轉,
    等我確認計劃後再開始實作。

    Claude 在計劃中列出了 14 個狀態節點,包含「非同步通知重複到達」、「驗簽失敗的處理」這些不明顯的情境。確認計劃後再開始做。

    設計文件特別標明的邊界條件:

    ## 邊界條件(金流特有)
    - ReturnURL(非同步)和 OrderResultURL(同步)可能「都」被呼叫
      → 用 idempotency key 確保同一筆交易只更新一次訂單
    - CheckMacValue 驗簽:URL encode 順序必須按綠界規範(非標準 encodeURIComponent)
      → 測試案例需包含含特殊字元的 MerchantTradeNo
    - ATM 逾期:用 pg-cron 排程,不要依賴前端觸發
    - 退款:獨立 API,與付款 API 完全分離,需要人工審核 flag

    結果:4 小時,上線零 bug,audit log 完整。

    差距總結

    面向 不會用的人 會用的人
    提示方式「幫我做 X」「背景 + 目標 + 約束條件 + 邊界條件」
    領域規則每次用到才補說寫進 CLAUDE.md,一次設定永久生效
    邊界條件做完後才發現沒處理設計文件裡最前面就列清楚
    複雜任務一次丟,結果跑偏再修Plan Mode 確認方向,分段執行
    驗證方式全部做完再整體測試每段完成後先確認,錯誤早期發現
    對話輪數8–15 輪2–4 輪
    結果品質能跑,但邊界不完整完整,測試覆蓋所有邊界

    為什麼大多數人卡在「不會用」

    不是因為懶,是因為直覺錯了。

    我們習慣搜尋引擎:問一句,得到答案。Claude Code 不是搜尋引擎,它是一個需要簡報才能開工的工程師。你給的資訊越完整,它做出來的東西越準確。

    轉換這個直覺需要時間,但一旦轉過來,你就不會想回頭了。

    從下一個任務開始,試著在開口前先回答三個問題:

    1. 這個功能的輸入和輸出各是什麼格式?
    2. 哪些邊界條件會讓它失敗?
    3. 我怎麼確認它做對了?

    把這三個問題的答案寫下來,你的 Claude Code 使用效果會立刻不一樣。

    常見問題

    Q:每次都要先寫設計文件,不會很花時間嗎?

    一份最小版設計文件 20 分鐘。省下的多輪修改至少 2–4 小時。這筆帳很好算。

    小功能(一個函數、修一個 bug)不需要設計文件,直接做。設計文件是為了「有多個邊界條件、或跨越兩層以上架構」的任務。

    Q:CLAUDE.md 不是每個專案都要重寫一遍嗎?

    寫一次,維護成本低。每次發現 Claude 做了一個你不喜歡的決定,把那條規則加進 CLAUDE.md,下次就不會再發生。它是越用越省力的資產。

    Q:我的需求很複雜,文件要寫到多詳細?

    詳細到「可以讓另一個工程師依照這份文件實作,不需要問你問題」。如果你寫完文件還是覺得有地方模糊,那就是還有沒想清楚的需求,先想清楚再開始比較省事。

    從不會用到會用:各情境的具體升級路徑

    看完上面三個場景,你可能知道差距在哪,但還不知道今天要改什麼。這一節給你一條明確的路,從第一步到進階,每步都有可以直接複製的東西。

    第一步:今天就能做到(不需要任何準備)

    在你現在的任何提示最後加上這一句:

    先告訴我你的理解和假設,再開始實作。

    就這一句。它會讓 Claude 在動手前先說出它的假設,你可以在它寫出一堆錯誤代碼前糾正它。成本 0,效果立竿見影。

    三個情境的具體升級示範:

    醫療場景:Level 0 → Level 1

    不會用(Level 0) 初步會用(Level 1)
    幫我寫門診預約系統(見下方)
    幫我寫門診掛號的 API。
    
    輸入:{ patientId: string, sessionId: string, phone: string }
    輸出:{ bookingNo: string, status: "SUCCESS" | "FULL" | "DUPLICATE" }
    
    必須處理:
    - 同一診次超過容量上限 → 回傳 FULL
    - 同一患者重複掛同一診次 → 回傳 DUPLICATE
    - 所有時間以 UTC+8 處理
    
    先告訴我你的理解,特別是這三種情況你打算怎麼處理,再開始實作。

    改變了什麼:加了輸入輸出格式、三個邊界條件、確認步驟。這 5 分鐘的準備,省掉事後發現「沒處理重複掛號」的 2 小時修改。

    股市場景:Level 0 → Level 1

    幫我寫台股均線回測。策略:5日均線上穿20日均線買進,死叉賣出。
    
    台股特有規則(全部都要實作):
    - 訊號發生在收盤,執行在隔交易日開盤價(不是同日收盤)
    - 漲跌停 ±10%,超過無法成交,記錄 LIMIT_HIT
    - 手續費:買賣各 0.1425%,最低 20 元
    - 證交稅:賣出 0.3%
    - 最小交易單位 1000 股,不足不下單
    
    先告訴我這些規則你的理解,特別是成交時間點的邏輯,再開始寫。

    電商金流場景:Level 0 → Level 1

    幫我串接綠界 ECPay,支援信用卡一次付清。
    
    必須處理的情況:
    - ReturnURL(非同步)和 OrderResultURL(同步)可能都會被呼叫,
      同一筆交易只能更新訂單一次(要有 idempotency 機制)
    - CheckMacValue 驗簽失敗:記 log,不更新訂單,回傳 0|Error
    - 付款成功後訂單狀態必須立刻更新
    
    先告訴我你打算怎麼處理「非同步和同步通知都到達」這個情況,再開始實作。

    第二步:下週可以做到(CLAUDE.md)

    把你的領域規則寫成一個檔案,放在專案根目錄,命名 CLAUDE.md。之後每次對話都不用再重複說這些規則。

    先從最小版開始,15 分鐘寫完:

    # 專案規則
    
    ## Tech Stack
    [填你用的技術]
    
    ## 這個領域的特殊規則
    [把你每次都要補充說明的規則寫在這裡]
    例:
    - 台股交易日排除週末 + 台灣國定假日
    - 醫療系統所有時間 UTC+8
    - 金流驗簽失敗一律記 log 不更新訂單
    
    ## 代碼標準
    [你每次都要糾正的習慣寫在這裡]
    例:
    - 禁止 any 類型
    - 每個函數必須有對應測試
    - API 錯誤格式統一:{ code, message, field }
    
    ## 邊界條件規則
    [這個專案特有的邊界處理方式]

    寫好之後,下次開口前說「請先讀 CLAUDE.md」或什麼都不用說(Claude Code 會自動載入)。

    第三步:一個月後的進化(設計文件 + Plan Mode)

    當你習慣 Level 1 之後,下一步是在動手前多寫一份設計文件。這份文件不是給人看的,是給 Claude 看的,20 分鐘寫完,節省的是事後 4–6 小時的修改。

    設計文件的最小格式:

    # 功能:[名稱]
    
    ## 輸入 / 輸出
    輸入:[JSON 範例]
    輸出:[JSON 範例]
    
    ## 邊界條件(必須處理)
    - [條件 A] → [預期行為]
    - [條件 B] → [預期行為]
    
    ## 完成定義
    - [ ] 所有邊界條件有對應單元測試
    - [ ] TypeScript 0 errors

    有了設計文件之後,任務的啟動提示變成:

    請先閱讀 CLAUDE.md 和 [設計文件名]。
    閱讀完告訴我你的理解,特別是邊界條件部分。
    確認後先只實作 [最小單元],不要動其他層。

    當任務更複雜(跨 5 個以上文件、不可逆的架構改動),改用 Plan Mode 啟動:

    請先制定實作計劃,列出方案選項和取捨,等我確認後再開始執行。
    階段 做什麼 時間投資 節省的來回
    Level 0直接說需求00
    Level 1(今天)加輸入/輸出/邊界 + 確認步驟5 分鐘/次2–4 輪
    Level 2(下週)CLAUDE.md 寫入領域規則15 分鐘(一次性)每次省 1–2 輪
    Level 3(一個月後)設計文件 + Plan Mode20 分鐘/功能第一次就對
  • Claude Code 實戰:5 個核心技巧讓 AI 一次到位

    重點摘要

    • CLAUDE.md 是一次性投資,讓每次對話自動遵守規則,減少 50–70% 重複提示
    • 設計文件寫在執行前,讓 Claude 一次完成實作,避免多輪修改
    • Plan Mode + Agent Teams 適合複雜任務,正確啟動方式決定準確率
    • Hooks 自動化格式、測試、安全掃描,讓你專注在真正需要判斷的事

    你是否有過這樣的經驗:跟 Claude Code 說了一大段需求,它做出來的結果差了一點點,於是你開始修正、補充說明、再確認,來回四五輪才終於完成?

    這篇文章整理的,就是如何系統性地消滅這些來回。不靠運氣,靠結構。

    1. CLAUDE.md:把規則寫進專案,不用每次重說

    CLAUDE.md 是 Claude Code 自動載入的專案規則檔,放在 ~/your-project/CLAUDE.md。它是永久生效的,只要存在,每次對話都會自動套用。

    效果:寫一次,永久有效,減少 50–70% 重複提示。

    CLAUDE.md 應該寫什麼

    分四層,由外到內:

    層次 內容 範例
    基本資訊Tech stack、架構決策Next.js 14 App Router + PostgreSQL
    代碼標準命名規則、檔案結構TypeScript strict mode,禁止 any
    業務邏輯領域規則、合規要求台灣統一編號驗證邏輯
    技術決策測試策略、代碼審查規則每個函數必須有對應單元測試

    可直接複製的最小版 CLAUDE.md

    # 專案規則
    
    ## Tech Stack
    - Runtime: Node.js 20, TypeScript strict
    - Frontend: Next.js 14 App Router
    - Database: PostgreSQL + Prisma ORM
    - Testing: Vitest + Testing Library
    
    ## 代碼標準
    - 禁止使用 `any` 類型
    - 所有 API 回應都必須有錯誤處理
    - 命名:camelCase 變數/函數,PascalCase 元件
    - 每個新函數必須有對應測試
    
    ## 禁止事項
    - 不要在 .env 以外的地方寫入 secrets
    - 不要 commit node_modules
    - 不要繞過 TypeScript 類型檢查
    
    ## 測試策略
    - 單元測試:純函數、工具類
    - 整合測試:API routes、資料庫操作
    - E2E:核心用戶流程

    常見錯誤:規則太模糊(「要寫好的代碼」)。寫 CLAUDE.md 要具體到可驗證,例如「API 回應必須包含 { success, data, error } 結構」。

    2. 設計文件:讓 Claude 第一次就做對

    沒有設計文件,Claude 會根據最可能的假設去實作。你的需求愈複雜,這些假設偏離你想法的機率就愈高。

    設計文件 ≠ CLAUDE.md:CLAUDE.md 是永久規則,設計文件是「這個功能」的一次性說明。

    最小版設計文件(20 分鐘內完成)

    # 功能:[名稱]
    
    ## 要做什麼
    [一段話描述,包含用戶場景]
    
    ## 輸入 / 輸出格式
    輸入:{ invoiceNumber: string, amount: number }
    輸出:{ success: boolean, invoiceId: string }
    
    ## 邊界條件
    - 金額為 0 時:回傳錯誤,不建立發票
    - 統編格式錯誤時:拋出 ValidationError
    - 重複發票號碼:回傳已存在的 invoiceId
    
    ## 完成定義(Done When)
    - [ ] 所有邊界條件有對應測試
    - [ ] API 回應符合 CLAUDE.md 定義的格式
    - [ ] TypeScript 0 errors

    這 20 分鐘可以省下 4–6 小時的修改。數學很簡單。

    複雜場景:從用戶故事快速產出設計文件

    當你腦中只有模糊需求,可以用這個提示讓 Claude 幫你產出設計文件初稿:

    我需要實作:[用戶故事]
    
    請幫我寫一份設計文件,包含:
    1. 功能描述(一段話)
    2. 輸入/輸出格式(JSON 範例)
    3. 邊界條件清單
    4. 完成定義
    
    不要實作,只寫文件。

    確認文件正確後,再說「依照這份設計文件實作」。這是「計劃→確認→執行」的標準流程,比直接說需求減少至少 2 輪來回。

    3. Plan Mode:大型任務的正確啟動方式

    Plan Mode 是 Claude Code 的三段式決策機制:探索 → 規劃 → 用戶確認。只有用戶批准後才開始執行,避免走錯方向浪費的大量時間。

    何時使用 Plan Mode

    場景 使用 Plan Mode? 原因
    修一個 bug不需要範圍小,直接做
    新增一個 API endpoint不需要單一改動
    重構模組(跨 5+ 個文件)需要需要確認拆分策略
    架構遷移(框架升級)需要不可逆,要先對齊
    全新功能模組(3 天以上工作量)需要複雜度高,先確認再做

    Plan Mode 的正確提示格式

    啟動 Plan Mode 後,給 Claude 的提示要包含三個部分:

    【背景】
    這個專案是 [系統描述],目前 [現況]。
    
    【目標】
    我需要 [具體目標],完成後要能 [驗收標準]。
    
    【約束條件】
    - 不能破壞現有的 [X] 功能
    - 必須相容 [Y] 版本
    - 不要修改 [Z] 目錄的任何檔案
    
    請先制定實作計劃,列出方案選項和取捨,等我確認後再開始執行。

    「等我確認後再開始執行」這句話非常關鍵。沒有這句話,Claude 可能在呈現計劃的同時就開始執行了。

    4. Agent Teams:平行作業的正確姿勢

    Agent Teams 讓多個 Claude 實例同時處理獨立任務。正確使用可以把 3 天的工作壓縮到 1 天,錯誤使用會讓機器記憶體爆掉。

    模型選擇速查

    模型 記憶體 適合任務 口訣
    Opus~1GB/agent架構決策、複雜業務邏輯、Code Review需要「想」
    Sonnet~600MB/agentCRUD 實作、API 對接、表單頁面需要「做」
    Haiku~400MB/agent檔案掃描、配置對比、簡單查詢需要「找」

    建立 Agent Team 前必做的三件事

    1. 評估記憶體:執行 free -h,可用記憶體必須大於預計用量的 1.5 倍(安全邊界)
    2. 拆分獨立任務:每個 agent 的任務不能有隱性依賴,確認前後順序再分配
    3. 準備共用 CLAUDE.md:所有 agent 共享同一套規則,避免各自用不同標準

    任務拆分原則

    適合平行的任務:API endpoint A、API endpoint B、前端表單 C(互不依賴)

    不適合平行的任務:「建資料庫 schema」→「實作 API」→「寫測試」(有嚴格先後順序)

    # 建立 Agent Team 的標準提示
    我需要建立一個 Agent Team 完成以下任務:
    
    【總目標】[一句話]
    
    【任務清單】(已確認互相獨立)
    1. [任務 A] → 負責人:Sonnet agent
    2. [任務 B] → 負責人:Sonnet agent
    3. [任務 C](需要架構決策)→ 負責人:Opus agent
    
    【共用規則】
    - 所有代碼遵守 CLAUDE.md
    - 任務完成後回報:完成的文件列表 + 測試通過狀態
    
    【資源限制】
    可用記憶體:[X]GB,請確認 agent 數量不超過安全上限。

    5. Hooks:讓機器自動做重複的事

    Hooks 是在特定事件(編輯後、提交前、排程)自動執行的腳本。設定一次,永久省力。

    三個最值得設定的 Hook

    Hook 1:編輯後自動格式化(after-edit)

    {
      "hooks": {
        "after-edit": {
          "command": "prettier --write $FILE && eslint --fix $FILE",
          "on_failure": "warn",
          "timeout": 30000
        }
      }
    }

    Hook 2:提交前強制測試通過(before-commit)

    {
      "hooks": {
        "before-commit": {
          "command": "npm run test -- --passWithNoTests && npm run lint",
          "on_failure": "block",
          "timeout": 120000
        }
      }
    }

    "on_failure": "block" 代表測試未通過時 commit 會被阻止,不是只警告。

    Hook 3:每週安全掃描(scheduled)

    {
      "hooks": {
        "scheduled": {
          "cron": "0 10 * * 6",
          "command": "npm audit fix && npm outdated",
          "on_failure": "warn"
        }
      }
    }

    這三個 Hook 每週省下約 60 分鐘,一年就是 52 小時。

    6. 降低來回、提高準確的通用技巧

    多文件上下文提示法

    要讓 Claude 了解跨文件的關係,不要一次只給一個文件,要同時提供:

    請先閱讀這三個文件後再開始:
    - src/types/invoice.ts(資料模型)
    - src/api/invoices.ts(現有 API)
    - docs/designs/invoice-search.md(本次設計文件)
    
    閱讀完成後告訴我你的理解,再開始實作。

    「閱讀完成後告訴我你的理解」這個確認步驟,能在執行前抓到 Claude 對現有代碼的誤解。

    邊界條件先行法

    把邊界條件和錯誤情況列在需求的最前面,而不是最後面。Claude 讀到越早的內容,優先度越高:

    # 不好的順序
    實作用戶登入功能,支援 email/password,記得處理密碼錯誤的情況
    
    # 好的順序
    實作用戶登入功能
    
    【錯誤情況(必須處理)】
    - 帳號不存在 → 401,訊息「帳號或密碼錯誤」(不透露哪個錯)
    - 密碼錯誤 → 401,同上訊息
    - 連續失敗 5 次 → 鎖定帳號 15 分鐘
    
    【正常流程】
    支援 email/password,成功回傳 JWT token

    分段確認法(適合複雜場景)

    不要一次把整個複雜需求丟給 Claude,分段完成並確認:

    1. 「先實作資料模型,不要碰 API 層,完成後給我看」
    2. (確認模型正確)「現在依照這個模型實作 API」
    3. (確認 API 正確)「現在寫整合測試」

    每一段都比整體更容易驗證,錯誤也更容易在早期被發現。

    明確說「不要做什麼」

    Claude 很善意,會主動補充它認為合理的東西。如果不想要這些補充:

    # 加上明確的範圍限制
    只修改 src/utils/tax.ts 這個文件,不要動 tests/ 目錄,
    不要重構現有函數,只新增 calculateVAT() 函數。

    整合使用:複雜功能的標準流程

    把上面所有技巧整合成一套可重複使用的流程:

    1. 確認 CLAUDE.md 存在且最新(一次性,專案生命週期)
    2. 寫設計文件(每個新功能,20–30 分鐘)
    3. 用「計劃→確認→執行」啟動任務(複雜任務用 Plan Mode)
    4. 分段驗證(模型 → API → 測試,每段確認一次)
    5. Hooks 自動把關(格式、測試、安全)

    這套流程把原本 10–15 輪的來回壓縮到 2–3 輪。

    常見問題

    Q:CLAUDE.md 要多詳細才夠?

    夠到「可以驗證」就夠了。「代碼要好維護」是沒用的規則,「函數超過 50 行必須拆分」是有用的規則。從最重要的 5 條開始,持續更新。

    Q:設計文件需求中途改了怎麼辦?

    先更新設計文件,再告訴 Claude「設計文件已更新,請依最新版本繼續,以下是改變的部分:[…]」。不要只口頭說需求變了,有文件才有依據。

    Q:Agent Teams 記憶體爆掉怎麼辦?

    立即執行 free -h 確認狀況,用 ps aux --sort=-%mem | head -20 找出佔用最多的 agent,優先結束 Opus 實例。恢復後先用 git status 確認哪些工作已完成,從斷點繼續而不是重頭來過。

    Q:Claude 輸出的代碼跟我的風格差很多?

    這幾乎都是 CLAUDE.md 不夠具體的問題。找一個你認為寫得好的現有文件,告訴 Claude「比照這個文件的風格」,然後把那個風格總結後加進 CLAUDE.md。

  • Claude Code 系列文 (5/5):實戰 — 3 天完成 Taiwan Invoice 系統

    ⚡ 重點摘要

    • Day1規劃6小時:需求+CLAUDE.md+設計文檔+Hook
    • Day2實施8小時:Claude一次到位,200+測試通過
    • Day3部署4小時:安全審查+文檔+上線
    • 總計18小時,vs傳統方式40-50小時

    前提:讀過第 1-4 篇,理解整個工作流 目標:看一個真實的「一人公司 3 天完成功能」案例 收穫:知道如何套用到你的項目


    案例背景

    公司:一人 SaaS 公司(會計軟件) 需求:完整的台灣統一發票系統 期限:3 天內完成 MVP 資源:1 個人 + Claude Code 目標:一次到位,最少改動


    🗓️ Day 1:規劃 + 準備(6 小時)

    上午(3 小時):理清需求

    # Taiwan Invoice System - Requirement Doc
    
    ## 為什麼要做
    目前手工開發票,容易出錯,無法追蹤
    
    ## 用戶故事
    "As a freelancer with 50+ monthly invoices,
     I want to generate invoices in Taiwan GUN format,
     so I can legally submit to tax authority"
    
    ## MVP Scope(3 天內)
    ✅ 建立發票 (可編輯草稿)
    ✅ 查看發票列表
    ✅ 匯出 PDF (GUN 格式)
    ✅ 基本驗證 (金額、格式)
    
    ⏳ Phase 2 (1 個月後)
    - 批量操作
    - 進階篩選
    - 政府系統整合

    花時間:30 分鐘(邊想邊寫)

    中午(3 小時):建立項目規則 + 設計

    建立 CLAUDE.md

    # Taiwan Invoice System
    
    ## Tech Stack
    - Frontend: React 18 + TypeScript
    - Backend: Node.js + Express
    - Database: PostgreSQL
    - Styling: Tailwind CSS
    
    ## Code Standards
    - TypeScript strict mode
    - Test coverage > 80%
    - JSDoc for public API
    - Prettier + ESLint
    
    ## Business Rules (Critical!)
    
    ### Invoice Format (GUN)
    必須符合台灣政府格式:
    - 發票號碼:8 位數 (格式:AAA12345)
    - 序列必須連續
    - 日期:民國年 (e.g., 112/03/25)
    - 必填欄位:公司統編、客戶統編、品項、金額
    
    ### Tax Rules
    - 標準稅率:5% (大部分)
    - 零稅率:0% (出口商品)
    - 免稅:0% (政府單位等)
    - 進項稅:同月內計算,超過月份無法扣
    
    ### Immutability
    已提交的發票不可修改,只能作廢重新開
    
    ## Architecture Decision
    使用 Strategy Pattern 處理不同稅率
    → 易於新增新稅種
    
    ## Important
    必須通過以下檢查:
    - 發票序列連續
    - 日期格式正確 (民國年)
    - 金額計算正確
    - 必填欄位都有

    花時間:1 小時

    寫設計文檔

    # Feature: Create Invoice
    
    ## User Flow
    1. 使用者點「新建發票」
    2. 看到表單:日期、客戶、品項清單、稅率
    3. 填完按「儲存為草稿」
    4. 發票編號自動產生 (取自上一張+1)
    5. 顯示「草稿已保存」訊息
    
    ## Data Structure
    ```typescript
    interface Invoice {
      id: UUID;
      invoiceNumber: string;      // e.g., "AAA00001"
      invoiceDate: Date;          // ROC year format
      companyId: string;          // 公司統編
      companyName: string;
      customerId: string;         // 客戶統編
      customerName: string;
      items: InvoiceItem[];       // 品項清單
      taxRate: 5 | 0;            // 稅率
      subtotal: number;
      taxAmount: number;
      total: number;
      status: "DRAFT" | "SUBMITTED" | "VOIDED";
      createdAt: Date;
      updatedAt: Date;
    }
    
    interface InvoiceItem {
      id: UUID;
      name: string;
      quantity: number;
      unitPrice: number;
      amount: number;             // qty * price
    }
    ```
    
    ## API
    ```
    POST /api/invoices
    {
      invoiceDate: "2024-03-25",
      customerId: "12345678",
      customerName: "ABC Company",
      items: [{name, quantity, unitPrice}, ...],
      taxRate: 5
    }
    → 201 Created
    {
      id: "uuid",
      invoiceNumber: "AAA00123",
      ...
    }
    
    GET /api/invoices/:id
    → 返回完整發票資料
    
    PUT /api/invoices/:id
    {...updates}
    → 200 OK (只有 DRAFT 狀態可修改)
    ```
    
    ## Validation
    - [ ] 發票號碼格式:AAA + 5 位數
    - [ ] 客戶統編:8 位數
    - [ ] 日期:不能是未來日期
    - [ ] 品項至少 1 個
    - [ ] 金額都是正數
    - [ ] 稅率只能是 5 或 0
    
    ## Edge Cases
    - 新使用者,沒有上一張發票?→ 自動從 AAA00001 開始
    - 修改數量後,金額要自動計算 ✅
    - 刪除品項要更新小計 ✅
    - 同一天多張發票?→ 號碼自動遞增 ✅
    
    ## Acceptance Criteria
    - [ ] 表單能填入資料
    - [ ] 發票自動編號
    - [ ] 計算正確
    - [ ] 驗證有效
    - [ ] 錯誤訊息清晰(中文)
    - [ ] 所有測試通過

    花時間:1.5 小時

    設置 Hook(複製 settings.json):

    花時間:30 分鐘

    下午成果

    Day 1 完成:
    ✅ 需求清晰(RFC 格式)
    ✅ CLAUDE.md 完成(規則明確)
    ✅ 設計文檔完成(API + UI + 驗證規則)
    ✅ Hook 已設置(自動格式化和測試)
    ✅ Git 提交
    
    Code ready for Claude!

    🗓️ Day 2:實施 + 驗證(8 小時)

    早上(4 小時):Claude 實施後端 + API

    Prompt 給 Claude

    這是我們的 Taiwan Invoice 系統。
    
    CLAUDE.md(規則):[貼上 CLAUDE.md]
    
    設計文檔(需求):[貼上設計文檔]
    
    請按照設計實施:
    1. 建立 Invoice 數據模型
    2. 建立 API endpoints (POST /invoices, GET /invoices/:id, PUT)
    3. 實施驗證邏輯
    4. 寫單元測試(coverage > 80%)
    
    注意:台灣稅法很嚴格,邊界情況要測試完整。

    Claude 做的事

    • 自動讀 CLAUDE.md(知道 TypeScript strict,要測試)
    • 自動讀設計文檔(知道確切的 API 格式和驗證規則)
    • 一次性實施,不猜測
    • 自動加測試(因為 CLAUDE.md 要求)
    • 自動格式化和 lint(Hook 搞定)

    結果(2 小時):

    ✅ models/Invoice.ts (50 行)
    ✅ services/InvoiceService.ts (200 行)
    ✅ routes/invoices.ts (80 行)
    ✅ __tests__/invoiceService.test.ts (150 行,30 個測試)
    
    所有測試通過 ✅
    代碼 lint 通過 ✅
    覆蓋率 > 85% ✅

    中午(2 小時):Claude 實施前端 + 表單

    Prompt

    前端現在需要:
    1. 發票新建表單(日期、客戶、品項清單)
    2. 發票列表頁面
    3. 發票詳情頁面
    
    用設計文檔中的 API,請實施 React 組件。
    
    要點:
    - 表單驗證(錯誤訊息用中文)
    - 品項動態新增/刪除
    - 自動計算小計和稅額
    - 載入中和錯誤狀態要顯示

    結果(2 小時):

    ✅ components/InvoiceForm.tsx (300 行)
    ✅ pages/InvoiceList.tsx (150 行)
    ✅ pages/InvoiceDetail.tsx (200 行)
    ✅ hooks/useInvoice.ts (100 行,API 調用)
    ✅ __tests__/InvoiceForm.test.tsx (200 行)
    
    測試通過 ✅
    外觀符合預期 ✅

    下午(2 小時):整合測試 + Bug 修復

    做法

    1. 連接前後端
    2. 手動測試端到端流程
    3. 發現 2 個小 bug(日期格式,驗證訊息)
    4. Claude 修復
    5. 再測一遍,沒問題

    結果

    ✅ 前後端連接
    ✅ 表單能提交
    ✅ 發票能保存到 DB
    ✅ 列表能顯示
    ✅ 所有驗證工作
    ✅ 錯誤訊息清晰

    Day 2 成果

    ✅ 後端 API 完成
    ✅ 前端 UI 完成
    ✅ 單元測試通過(200+ 測試)
    ✅ 整合測試通過
    ✅ 0 console.log,0 TODO
    ✅ 準備上線

    🗓️ Day 3:優化 + 部署(4 小時)

    早上(1 小時):性能 + 安全檢查

    # 代碼審查
    npm run lint           # 0 錯誤 ✅
    npm test              # 200+ 測試通過 ✅
    npm run type-check    # TypeScript: 0 錯誤 ✅
    
    # 安全檢查
    npm audit             # 0 高風險漏洞 ✅
    grep -r "console.log" src/   # 0 結果 ✅
    grep -r "TODO" src/          # 0 結果 ✅

    中午(1 小時):文檔 + README

    # Taiwan Invoice System
    
    ## Features
    - ✅ Create/Edit/View invoices in GUN format
    - ✅ Automatic invoice numbering
    - ✅ Tax calculation (5% / 0% / exempt)
    - ✅ Form validation (Taiwan rules)
    - ✅ PDF export (coming v1.1)
    
    ## API
    [自動生成 API 文檔]
    
    ## Setup
    ```bash
    npm install
    npm run dev
    ```
    
    ## Testing
    ```bash
    npm test
    npm run test:coverage
    ```
    
    ## Deployment
    [部署指令]

    下午(2 小時):部署 + 監控

    # 部署
    npm run build         # 0 警告
    deployment-script    # 部署到 staging
    
    # 煙霧測試
    curl http://staging/api/invoices
    # 確保 API 正常
    
    # 監控設置
    [設定錯誤告警]
    [設定性能監控]

    Day 3 成果

    ✅ 代碼審查通過
    ✅ 安全檢查通過
    ✅ 文檔完整
    ✅ 部署到 Staging
    ✅ 煙霧測試通過
    ✅ 準備上線

    📊 3 天總結

    時間分配

    Day 1 規劃:6 小時
      ├─ 需求文檔:30 min
      ├─ CLAUDE.md:1 hour
      ├─ 設計文檔:1.5 hours
      ├─ Hook 設置:30 min
      └─ Git 提交:30 min
    
    Day 2 實施:8 小時
      ├─ 後端實施 + 測試:4 hours
      ├─ 前端實施 + 測試:2 hours
      ├─ 整合 + Bug 修復:2 hours
      └─ 無重複改動 ✅
    
    Day 3 優化:4 小時
      ├─ 性能 + 安全:1 hour
      ├─ 文檔:1 hour
      ├─ 部署 + 測試:2 hours
      └─ 準備上線
    
    總計:18 小時 = 2.25 天工作量

    成果

    代碼行數:~1500 行(含測試)
    測試數:200+ 個
    測試覆蓋率:85%+
    Bug 數:0 個(在 staging)
    改動次數:0 次(一次到位)
    
    典型方式的對比:
    傳統(沒規劃):40-50 小時,改 5-6 次
    規劃優先(本案例):18 小時,0 次改動

    關鍵成功因素

    因素為什麼重要這次是否做到
    CLAUDE.mdClaude 知道規則,不猜測
    設計文檔Claude 知道確切需求,一次對
    Hook自動化質量檢查,省手動操作
    TypeScript類型安全,邊界情況早發現
    完整測試回歸測試保證不破壞舊功能
    Git 提交每個功能清楚的 commit

    🎯 如何套用到你的項目

    Step 1:這週做

    • ☐ 為你的項目寫 CLAUDE.md(1 小時)
    • ☐ 選一個新功能,寫設計文檔(30 分鐘)
    • ☐ 給 Claude,看效果

    Step 2:下週做

    • ☐ 設置 Hook(15 分鐘)
    • ☐ 再試 2 個功能用設計文檔
    • ☐ 感受時間節省

    Step 3:成習慣

    • ☐ 所有新功能都先寫設計文檔
    • ☐ Hook 自動化所有品質檢查
    • ☐ CLAUDE.md 定期更新

    💡 一人公司老闆應該學到的

    1. 規劃比實施更值得

    傳統思維:「趕快寫代碼!」
    結果:寫很多,改很多,還是有 bug
    
    正確思維:「花 2 小時規劃,用 8 小時實施」
    結果:代碼一次對,沒有重複

    一人公司必須這樣思考,因為時間最貴。

    2. 文檔不是累贅,是投資

    成本:30-60 分鐘寫設計文檔
    收益:省 6-8 小時改動
    
    ROI = 600-800%

    最好的投資

    3. 自動化不是選項,是必須

    每週 5 小時手動 lint/test
    一年 260 小時
    相當於 1.5 個全職開發者成本
    
    用 15 分鐘設置 Hook,省這麼多

    不設置 Hook 的一人公司,在浪費金錢

    4. 一個人不代表不能有系統

    一人公司有一個優勢:決策快
    
    用 CLAUDE.md + 設計文檔 + Hook
    建立「個人系統」:
    - 代碼風格一致
    - 質量有保證
    - 規律可預測
    - 未來能擴招
    
    這是一個小公司變成可擴展企業的基礎。

    📈 一人公司的進化路徑

    Month 1:學習 (讀這 5 篇文章,試一個功能)
    Month 2:習慣 (所有新功能都用規劃優先)
    Month 3:系統 (CLAUDE.md + Hook 成為日常)
    Month 4-6:收穫 (月開發速度 ×3, bug ÷2)
    Month 6+:擴招 (有文檔,新人能快速上手)
    
    最後變成一個「可擴展的一人公司」
    而不是「永遠只能一人」的公司

    核心觀點回顧

    ┌─────────────────────────────────────┐
    │ 一人公司的黃金工作流                │
    ├─────────────────────────────────────┤
    │ 規劃(30%)                         │
    │  ├─ CLAUDE.md:寫一次,永遠用      │
    │  └─ 設計文檔:每功能寫一份          │
    │     ↓                                │
    │ 實施(50%)                         │
    │  ├─ Claude 一次對                  │
    │  └─ Hook 自動檢查                  │
    │     ↓                                │
    │ 驗收(20%)                         │
    │  ├─ 測試自動通過                   │
    │  └─ 文檔已完整                     │
    │     ↓                                │
    │ 上線                               │
    │                                    │
    │ 結果:                              │
    │ - 時間 -70%                        │
    │ - Bug -80%                         │
    │ - 心理壓力 -90%                    │
    └─────────────────────────────────────┘

    最後的話

    這個系列文教你的不是「怎麼用 Claude Code」

    而是「怎麼用 Claude Code 作為一人公司老闆活得更輕鬆」

    你的時間 ≠ 開發者的時間
    你的時間 = 企業的命脈
    
    所以:
    不要做「重複的手動工作」
    不要「改」代碼(要「規劃」代碼)
    不要「猜測」用戶需求(要「寫下來」)
    
    文檔優先,自動化第二,代碼最後。
    
    這是一人公司的生存法則。

    行動清單(現在就做)

    Week 1

    • ☐ 讀完這 5 篇文章(2 小時)
    • ☐ 為你的項目寫 CLAUDE.md(1 小時)
    • ☐ 設置 Hook(15 分鐘)

    Week 2

    • ☐ 選一個新功能,寫設計文檔
    • ☐ 用新工作流實施,看效果
    • ☐ 記錄時間(和傳統方式比較)

    Week 3-4

    • ☐ 再用 2-3 個功能測試
    • ☐ 調整 CLAUDE.md(發現遺漏的規則)
    • ☐ 分享給朋友(看看他們的反應)

    資源總結

    你現在有:

    📚 5 篇教學文
    📋 3 個可直接用的模板
    ✅ 4 個檢查清單
    🔧 1 個實戰案例 (Taiwan Invoice)
    📖 完整的 Claude Code 指南庫 (~/claude-code-guide/)

    一切你需要的都在了。


    致謝

    感謝你讀完這個系列。

    如果有問題、改進建議或你的實踐心得,歡迎分享。

    下一步:不是讀更多,是實踐

    選一個功能,按照 Day 1-3 的流程試試看。

    你會驚嘆「怎麼忽然快這麼多」。


    THE END – 系列完! 🎉


    系列文快速導航

    #標題你學到時間
    1為什麼規劃優先理解痛點15 min
    2CLAUDE.md – 編碼憲法寫規則文檔30 min
    3設計文檔 – 讓 Claude 一次對寫需求文檔30 min
    4Hook 自動化 – 省手動工作設置自動化15 min
    5實戰 – 3 天完成系統看完整案例20 min

    總時間:1.5 小時讀 + 2 小時實踐 = 3.5 小時 收益:未來每週省 5-10 小時,一年省 260-520 小時!

  • Claude Code 系列文 (4/5):Hook 自動化 — 讓機器做重複工作

    ⚡ 重點摘要

    • Hook讓機器自動做重複的lint和測試工作
    • 3個必備Hook:after-edit、before-commit、scheduled
    • 15分鐘設置,每週節省5-10小時手動操作
    • 永遠不提交有bug的代碼,主分支永遠綠色

    前提:已有 CLAUDE.md + 設計文檔 時間投入:15 分鐘設置 + 自動化 省時:每週 5-10 小時(再也不用手動 lint/test)


    核心觀點

    傳統流程:
    1. 你寫代碼
    2. 你手動 npm run lint
    3. 你修復 lint 錯誤
    4. 你手動 npm test
    5. 你看測試結果... 有 bug
    6. 你修復 bug
    7. 你再手動 lint 一遍
    8. 最後才提交
    
    時間:45 分鐘 / 功能
    
    ===
    
    Hook 自動化:
    1. 你寫代碼
    2. 保存檔案 → Hook 自動 lint + fix ✅
    3. 提交 git → Hook 自動測試 ✅
    4. 測試通過 → 允許提交 ✅
    
    時間:10 分鐘 / 功能

    節省時間:35 分鐘 × 10 功能 / 月 = 6 小時 / 月!


    一人公司最需要的 3 個 Hook

    Hook 1: after-edit(保存檔案時自動格式化)

    作用:自動執行 prettier + eslint –fix

    好處

    • 不用手動 npm run lint
    • 代碼永遠符合格式
    • Code review 不再被卡在「縮排問題」

    設置(5 分鐘):

    # 編輯 ~/.claude/settings.json
    cat >> ~/.claude/settings.json << 'EOF'
    {
      "hooks": {
        "after-edit": {
          "enabled": true,
          "commands": [
            {
              "patterns": ["**/*.ts", "**/*.tsx", "**/*.js"],
              "run": "prettier --write {file_path} && eslint --fix {file_path}",
              "on_failure": "warn",
              "timeout": 5000
            }
          ]
        }
      }
    }
    EOF

    驗證(1 分鐘):

    # 寫一個格式很爛的檔案
    echo "const  x   =   1" > src/test.ts
    
    # 通過 Claude 編輯它(或手動編輯)
    # 檢查:是否自動格式化為 "const x = 1;"
    cat src/test.ts

    Hook 2: before-commit(提交前自動測試)

    作用:提交前必須通過所有測試

    好處

    • 永遠不會提交有 bug 的代碼
    • 主分支永遠綠色(測試都通過)
    • 不用事後才發現 bug

    設置(5 分鐘):

    cat >> ~/.claude/settings.json << 'EOF'
    {
      "hooks": {
        "before-commit": {
          "enabled": true,
          "commands": [
            {
              "name": "test",
              "run": "npm test -- --onlyChanged --passWithNoTests",
              "on_failure": "block",
              "timeout": 60000,
              "message": "Tests failed. Fix before committing."
            },
            {
              "name": "lint",
              "run": "npm run lint -- {staged_files}",
              "on_failure": "warn"
            }
          ]
        }
      }
    }
    EOF

    驗證(1 分鐘):

    # 破壞一個測試
    echo "test('fail', () => expect(1).toBe(2));" > src/__tests__/test.ts
    
    # 嘗試提交
    git add .
    git commit -m "test: add failing test"
    
    # 結果:被 Hook 擋住 ✅
    # 訊息:Tests failed. Fix before committing.

    Hook 3: scheduled(每週自動檢查依賴)

    作用:每週一自動檢查 npm 依賴更新 + 安全漏洞

    好處

    • 不用手動 npm audit
    • 自動 npm audit fix(修復已知漏洞)
    • 依賴永遠最新,安全性更好

    設置(5 分鐘):

    cat >> ~/.claude/settings.json << 'EOF'
    {
      "hooks": {
        "scheduled": {
          "enabled": true,
          "jobs": [
            {
              "name": "weekly_dependency_audit",
              "cron": "0 10 * * MON",
              "run": "npm audit fix --audit-level=moderate",
              "description": "Check and fix dependencies every Monday 10 AM"
            }
          ]
        }
      }
    }
    EOF

    Hook 完整配置(給一人公司)

    把這個存到 ~/.claude/settings.json

    {
      "hooks": {
        "after-edit": {
          "enabled": true,
          "description": "Auto-format and lint after editing files",
          "commands": [
            {
              "patterns": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"],
              "run": "prettier --write {file_path} && eslint --fix {file_path}",
              "on_failure": "warn",
              "timeout": 5000
            },
            {
              "patterns": ["**/*.json"],
              "run": "prettier --write {file_path}",
              "on_failure": "warn",
              "timeout": 3000
            }
          ]
        },
    
        "before-commit": {
          "enabled": true,
          "description": "Run tests and lint before committing",
          "commands": [
            {
              "name": "test",
              "run": "npm test -- --onlyChanged --passWithNoTests",
              "on_failure": "block",
              "timeout": 60000,
              "message": "Tests failed. Fix before committing."
            },
            {
              "name": "lint",
              "run": "npm run lint",
              "on_failure": "warn",
              "timeout": 30000
            }
          ]
        },
    
        "scheduled": {
          "enabled": true,
          "description": "Automated background tasks",
          "jobs": [
            {
              "name": "weekly_dependency_audit",
              "cron": "0 10 * * MON",
              "description": "Check and fix dependencies every Monday 10 AM",
              "run": "npm audit fix --audit-level=moderate || true"
            },
            {
              "name": "daily_test_report",
              "cron": "0 9 * * *",
              "description": "Run full test suite daily at 9 AM",
              "run": "npm test"
            }
          ]
        }
      }
    }

    一週省下的時間

    假設你一週寫 5 個功能

    任務次數時間 / 次舊方式Hook 方式省下
    手動 lint52 min10 min0 min10 min
    手動測試55 min25 min0 min25 min
    修復 lint bug53 min15 min0 min15 min
    手動 npm audit110 min10 min0 min10 min
    總計60 min0 min60 min

    一週省 1 小時,一年省 52 小時!


    一人公司老闆應該知道的 Hook 細節

    細節 1: on_failure 的三種選擇

    "on_failure": "block"   ← Hook 失敗就停止
                (測試失敗時用)
    
    "on_failure": "warn"    ← Hook 失敗但繼續
                (建議性檢查,不強制)
    
    "on_failure": "ignore"  ← Hook 失敗完全忽視
                (做了無關的操作時)

    建議

    • 測試失敗 → block(必須通過)
    • 格式化失敗 → warn(不影響功能)
    • npm audit → warn(有漏洞但不阻止提交)

    細節 2: timeout 設定

    "timeout": 5000   ← 5 秒超時(快速操作)
    "timeout": 30000  ← 30 秒超時(複雜操作)
    "timeout": 60000  ← 60 秒超時(完整測試)

    建議

    • prettier/eslint:5 秒
    • 單個檔案 lint:10 秒
    • 單個 component 測試:30 秒
    • 全部測試:60 秒

    細節 3: patterns(針對特定檔案類型)

    "patterns": ["**/*.ts", "**/*.tsx"]
                ↓ 只對 TypeScript 檔案執行
    
    "patterns": ["**/*.js"]
                ↓ 只對 JavaScript 檔案執行
    
    "patterns": ["src/**"]  (可選)
                ↓ 只對 src/ 資料夾執行

    常見問題

    Q: Hook 會拖慢我的開發速度嗎?

    A: 不會,反而加快。

    Hook 執行時間:< 5 秒
    傳統修復時間:15-30 分鐘
    
    所以快 180-360 倍。

    Q: 如果我想跳過 Hook(緊急情況)?

    A: 可以,但不推薦。

    # 跳過 before-commit hook
    git commit -m "message" --no-verify
    
    # 但這很危險!只在真正緊急時用

    一人公司建議:不要跳過。多花 1 分鐘讓 Hook 通過,比之後修 bug 便宜。

    Q: 我已經有自己的 lint 設定,怎樣整合?

    A: Hook 尊重你的 .eslintrc 和 .prettierrc

    # 如果你已經有這些檔案,Hook 會自動用它
    ls -la .eslintrc .prettierrc
    
    # 如果沒有,建議建立預設的
    touch .eslintrc.json .prettierrc.json

    設置 Hook 的完整步驟

    Step 1: 確認已安裝工具(2 分鐘)

    npm --version          # Node.js
    npm list prettier      # Prettier 已裝
    npm list eslint        # ESLint 已裝
    
    # 如果沒裝,安裝它們
    npm install --save-dev prettier eslint

    Step 2: 複製配置(3 分鐘)

    # 如果你沒有 settings.json
    touch ~/.claude/settings.json
    
    # 貼上上面「完整配置」的內容
    # 或用模板
    cp ~/claude-code-guide/templates/settings.json.template \
       ~/.claude/settings.json

    Step 3: 驗證設置(5 分鐘)

    按照上面「驗證」部分,測試 3 個 Hook 是否工作。

    Step 4: 提交到 Git(1 分鐘)

    # 可選:把配置存在 repo 裡(方便分享給團隊)
    cp ~/.claude/settings.json .claude/settings.json
    git add .claude/settings.json
    git commit -m "chore: add hooks configuration"

    進階:自訂你的 Hook

    假設你想在每次提交前自動檢查台灣稅務規則:

    {
      "before-commit": {
        "commands": [
          {
            "name": "tax_rule_check",
            "run": "grep -r 'TODO.*tax' src/ && echo 'WARNING: Tax rules need attention' || true",
            "on_failure": "warn"
          }
        ]
      }
    }

    一人公司的 Hook 最佳實踐

    ✅ DO

    1. 保持 Hook 快(< 10 秒)
    2. 從必須有的開始(測試、格式化)
    3. 定期檢查 Hook 日誌

    bash tail -50 ~/.claude/logs/hooks.log

    1. 團隊共享 Hook 配置

    bash git commit .claude/settings.json

    ❌ DON’T

    1. 不要太多 Hook(> 5 個會累)
    2. 不要 Hook 做複雜邏輯(只做檢查和格式化)
    3. 不要在 Hook 裡執行部署(太危險)

    下一步

    現在就做

    1. 複製完整配置到 ~/.claude/settings.json
    2. 測試 3 個 Hook(1-2 分鐘)
    3. 編輯一個檔案,檢查是否自動格式化
    4. 提交代碼,檢查是否自動測試
    5. 享受節省下來的時間!

    重點回顧

    CLAUDE.md:規則(永遠不變)
    設計文檔:需求(每功能一份)
    Hook:自動化(一次設置,永遠運行)
    
    一人公司工作流:
    規劃 → 寫代碼(自動格式化)
       → 提交(自動測試)
       → 完成
    
    時間:30% 規劃 + 70% 實施(不是傳統的 20% 規劃 + 80% 改動)

    下一篇預告

    第 5 篇:實戰案例 – Taiwan Invoice 3 天完成

    前四篇教了理論和細節。

    最後一篇會示範完整的一人公司工作流:

    1. Day 1:規劃 + 寫 CLAUDE.md + 設計文檔
    2. Day 2:Claude 實施 + 自動化驗證
    3. Day 3:部署 + 監控

    看完了,你就可以套用到自己的項目。


    現在就設置 Hook,開始自動化! 👋

    還有一篇,堅持到最後!💪

  • Claude Code 系列文 (3/5):設計文檔 — 讓 Claude 一次做對

    ⚡ 重點摘要

    • 設計文檔解決「Claude不是心靈讀者」的問題
    • 最小版本20分鐘:What+How+Edge Cases+Done When
    • 投入30分鐘,節省6小時改動,ROI 600%
    • 中等以上複雜度的功能都應該寫設計文檔

    前提:已寫好 CLAUDE.md(第 2 篇) 時間投入:20-30 分鐘設計 + 2 小時實施(vs 8 小時傳統方式) 成果:90%+ 一次正確,最多微調 1-2 處


    核心觀點

    CLAUDE.md:永遠的規則(不變)
       ↓
    設計文檔:這次功能的具體需求(會變)
       ↓
    實施:Claude 讀完兩者,一次到位

    實際效果

    傳統:
    user: "加個 PDF 匯出功能"
    claude: 實施... 但漏了 QR code、沒考慮大文件、錯誤處理不完善
    result: 改 3 次,花 8 小時
    
    ===
    
    設計優先:
    user: 先寫「PDF 匯出設計文檔」
       ├─ 輸出什麼欄位
       ├─ 格式細節
       ├─ 大文件怎麼處理
       └─ 邊界情況怎麼做
    
    claude: 讀完設計,實施功能
    result: 一次到位,花 2 小時

    為什麼設計文檔這麼關鍵

    原因 1:Claude 不是心靈讀者

    你想要:
    "PDF 應該很專業,像官方發票"
    
    Claude 理解的:
    "Generate a PDF" (可能就是基礎格式)
    
    ===
    
    如果你寫:
    "PDF 格式:
     - 頁眉:公司 logo + 發票編號
     - 內容:3 欄表格 (品項|數量|金額)
     - 頁尾:二維碼 + 簽章區域
     - 字體:14pt 標題,11pt 內容"
    
    Claude 理解的:
    正確無誤 ✅

    原因 2:邊界情況很容易漏

    你沒說的情況:
    - 如果發票超過 1 頁怎麼辦?
    - 品項名稱很長怎麼折行?
    - 金額超過 99,999,999 怎麼顯示?
    
    Claude 的猜測:
    - 默認假設只有 1 頁
    - 品項名稱截斷
    - 金額省略號或出錯
    
    ===
    
    設計文檔說清楚:
    - 多頁:自動翻頁,每頁重複頁眉
    - 長品項:自動折行到 2-3 行,調整行高
    - 大金額:科學計數法或分行顯示
    
    Claude:
    做對 ✅

    原因 3:審核快得多

    沒有設計文檔:
    你看代碼 → "嗯... 這個邏輯有點問題?"
                → 要改 → 再看一遍 → 還要改
    時間:1-2 小時審核
    
    ===
    
    有設計文檔:
    設計文檔清楚 → Claude 一次到位
    審核只需檢查「有沒有按設計文檔做」
    時間:15 分鐘審核

    一人公司的設計文檔長什麼樣

    最小版本(20 分鐘寫完)

    假設你要加「發票篩選功能」:

    # Invoice Filter Feature
    
    ## What
    用戶可以按日期、狀態、金額篩選發票列表
    
    ## How
    ### Page Flow
    1. 使用者進入「發票清單」頁面
    2. 頁面上方顯示篩選器:
       - Date range picker (from - to)
       - Status dropdown (全部 / 草稿 / 已提交 / 已申報)
       - Amount range slider (0 - 999,999)
    3. 用戶選擇條件 → 自動篩選列表(無需按搜尋按鈕)
    4. 篩選結果顯示在表格
    
    ### Data Model
    ```sql
    -- 輸入參數
    filter: {
      dateFrom: Date,
      dateTo: Date,
      status: enum ['DRAFT', 'SUBMITTED', 'FILED'],
      amountMin: number,
      amountMax: number
    }
    ```
    
    ### Edge Cases
    - 沒有搜尋結果 → 顯示「沒有符合條件的發票」
    - 篩選中 → 顯示 loading spinner
    - API 錯誤 → 顯示「載入失敗,請重試」
    
    ## Why
    - 用戶有 100+ 發票,手動找很慢
    - 會計需要按日期整理報表
    - 管理者需要看特定金額範圍的交易

    花時間:20 分鐘 代碼行數:20-30 行(因為清晰,不用試錯)

    完整版本(30 分鐘寫完)

    如果功能更複雜,加這些:

    # Invoice PDF Export Feature
    
    ## 業務背景
    台灣政府要求發票有統一格式(GUN 標準)
    用戶要匯出發票給客戶或存檔
    
    ## 用戶故事
    "作為發票系統使用者,我想點擊『匯出 PDF』按鈕,
      得到一份官方格式的 PDF,這樣我可以寄給客戶或稅務局"
    
    ## 功能範圍
    ### 必須有
    - [ ] PDF 包含所有發票欄位(發票號碼、日期、品項、金額等)
    - [ ] GUN 格式(台灣政府標準)
    - [ ] 二維碼(可掃描驗證)
    - [ ] 頁眉和頁尾
    - [ ] 多頁自動分頁
    
    ### 可以有(下個版本)
    - [ ] 批量匯出(多張發票 1 個 PDF)
    - [ ] 自訂 logo
    - [ ] 簽章區域
    
    ### 不包含
    - [ ] 自訂格式(template 系統太複雜)
    - [ ] 列印功能(瀏覽器列印已足)
    
    ## API/Data
    ### Input
    ```typescript
    POST /api/invoices/{id}/export-pdf
    
    // Response
    {
      pdf_url: "https://..../invoice_2024_001.pdf",
      generated_at: "2024-03-25T10:30:00Z"
    }
    ```
    
    ## UI/UX
    ### 按鈕位置
    - 在「發票詳情」頁面右上角
    - 按鈕文字:「匯出 PDF」
    - 點擊後:shows loading 3 秒,下載 PDF
    
    ### 錯誤情況
    - 網路錯誤 → 「無法生成 PDF,請重試」
    - 發票不完整 → 「發票資料不完整,無法匯出」
    - 檔案太大(> 10MB) → 「檔案過大,請聯絡管理員」
    
    ## 技術決策
    ### Why jsPDF instead of server-side?
    - jsPDF:快速、實時、不佔服務器資源 ✅
    - Server-side:需要 Node.js 套件、佔内存
    
    ### Why QR code?
    - Taiwan GUN requirement
    - Users can verify authenticity by scanning
    
    ## 測試 Checklist
    - [ ] PDF 內容完整(所有欄位都在)
    - [ ] 格式符合 GUN 標準(對齐、字體大小)
    - [ ] 二維碼可掃描
    - [ ] 多頁發票能正確分頁
    - [ ] 邊界情況:長品項名稱、大金額
    - [ ] 錯誤訊息清晰
    
    ## 完成條件(Acceptance Criteria)
    - [ ] 用戶點擊按鈕能下載 PDF
    - [ ] PDF 格式符合 GUN 標準
    - [ ] 二維碼正確生成
    - [ ] 網路慢時顯示 loading
    - [ ] 有錯誤時顯示清晰的訊息
    - [ ] 所有測試通過(coverage > 85%)

    花時間:30 分鐘 代碼行數:50-80 行(因為設計完整,邊界情況少)


    如何快速寫設計文檔(給一人公司老闆)

    方法 1:從 User Story 開始(最快)

    ## 功能
    允許用戶標記發票為「已審核」
    
    ## 用戶故事
    "As a manager, I want to mark invoices as reviewed,
     so I can track which invoices have been checked"
    
    ## 怎麼做
    1. 發票表格增加「審核」按鈕
    2. 點擊後標記為「已審核」,按鈕變灰
    3. 可以「取消審核」改回去
    
    ## Edge Cases
    - 多人同時審核同一張發票? → 最後一次改動獲勝
    - 已提交的發票能審核嗎? → 能,審核和提交獨立
    
    ## Done When
    - [ ] 按鈕會出現
    - [ ] 狀態能改變
    - [ ] 數據持久化
    - [ ] 網路慢時有 loading

    花時間:10-15 分鐘

    方法 2:從技術問題開始(有爭議時)

    ## 問題
    稅務計算邏輯現在在 service/taxCalculator.ts,
    很難測試,也難新增新稅種
    
    ## 提議
    用 Strategy Pattern 重構
    
    ## 對比
    ### 現狀(有問題)
    ```typescript
    if (type === 'standard') {
      tax = amount * 0.05;
    } else if (type === 'zero') {
      tax = 0;
    }
    // 很多 if,難擴展
    ```
    
    ### 改進後
    ```typescript
    const strategy = TaxStrategyFactory.get(type);
    tax = strategy.calculate(amount);
    // 新稅種只需新建 class,無需改舊代碼
    ```
    
    ## 工作
    1. 建立 TaxStrategy interface
    2. 建立 StandardTaxStrategy, ZeroTaxStrategy, ExemptTaxStrategy
    3. 建立 TaxStrategyFactory
    4. 遷移現有邏輯
    5. 寫測試
    
    ## 完成條件
    - [ ] 所有現有測試通過
    - [ ] 無新 bug
    - [ ] 代碼行數 < 現狀(因為減少 if)
    - [ ] 新稅種能在 30 分鐘內加入

    花時間:15-20 分鐘


    設計文檔和 CLAUDE.md 的區別

    項目CLAUDE.md設計文檔
    頻率一年改幾次每個功能寫一份
    內容規則、標準這次功能的細節
    例子「所有 component 用 PascalCase」「篩選器有 date picker 和 status dropdown」
    變化不變常變
    時效永遠有用功能完成後就 archive

    常見問題

    Q: 設計文檔很麻煩嗎?

    A: 不麻煩。其實省時間。

    對比:

    • ❌ 不寫設計文檔:2 小時設計(腦子裡)+ 8 小時實施 + 5 小時改 = 15 小時
    • ✅ 寫設計文檔:30 分鐘寫 + 2 小時實施 + 0.5 小時改 = 2.5 小時

    省時 6 倍。

    Q: 如果需求改了怎麼辦?

    A: 更新設計文檔,再讓 Claude 改。

    原設計:篩選器是下拉選單
    新需求:改成複選框(可選多個狀態)
    
    做法:
    1. 更新設計文檔的 UI/UX 部分
    2. Prompt: "按照新設計文檔改篩選器"
    3. Claude 改
    4. 完成

    Q: 小功能也要寫設計文檔嗎?

    A: 看複雜度

    • 簡單(邏輯 < 5 行):無需文檔,直接 prompt
    • 中等(邏輯 20-50 行):寫簡單版設計文檔(10 分鐘)
    • 複雜(邏輯 > 50 行,多頁面):寫完整版設計文檔(30 分鐘)

    一般來說:中等及以上都要寫


    實戰範例:Taiwan Invoice 設計文檔

    這是真實的設計文檔,你可以直接改成自己的:

    # Taiwan Invoice System - Design Doc
    
    ## 概述
    系統需要符合台灣官方發票格式 (GUN)
    用戶可以生成、儲存、匯出發票
    
    ## 模組 1: Invoice Data Model
    
    ### 資料結構
    ```sql
    CREATE TABLE c_invoice (
      id UUID PRIMARY KEY,
      invoice_number VARCHAR(10),  -- e.g., "001", "002"
      invoice_date DATE,
      company_name VARCHAR(255),
      company_tax_id VARCHAR(8),
      customer_name VARCHAR(255),
      customer_tax_id VARCHAR(8),
      items JSONB,  -- [{name, qty, price, amount}, ...]
      subtotal DECIMAL(12,2),
      tax_amount DECIMAL(12,2),
      total DECIMAL(12,2),
      status ENUM('DRAFT', 'SUBMITTED', 'FILED'),
      created_at TIMESTAMP,
      updated_at TIMESTAMP
    );
    ```
    
    ## 模組 2: Tax Calculation
    
    ### 規則
    - 標準稅率:5%(大部分商品)
    - 零稅率:0%(出口商品)
    - 免稅:0%(非營利組織)
    - 進項稅扣除:同月內才能計算
    
    ### 計算邏輯
    ```
    total_tax = sum(item.tax for item in items)
    where tax = item.amount * tax_rate
    
    if invoice.status == 'SUBMITTED':
      deductible_tax = tax (可抵扣)
    else:
      deductible_tax = 0 (草稿狀態不計)
    ```
    
    ## 模組 3: PDF Export
    
    ### 輸出格式
    頁面:A4 (210mm x 297mm)
    邊距:10mm
    
    頁眉:
    - 左:公司 logo (40x40mm)
    - 中:「統一發票」(20pt bold)
    - 右:發票號碼 (16pt)
    
    內容:
    - 發票日期
    - 買賣雙方資訊
    - 3 欄表格:品項、數量、金額
    - 合計 / 稅額 / 總金額
    
    頁尾:
    - QR code (25x25mm)
    - 簽章區域
    
    ## 完成條件
    - [ ] 資料模型完整
    - [ ] 稅務計算正確
    - [ ] PDF 格式符合 GUN 標準
    - [ ] 所有 edge cases 測試通過

    一人公司老闆的建議

    做法 1:檔案形式

    寫在 docs/designs/ 資料夾:

    docs/designs/
    ├── invoice-filter.md
    ├── invoice-pdf-export.md
    └── tax-calculation.md

    提交到 git,成為代碼庫的一部分。

    做法 2:更新設計文檔的時機

    • 需求改變時
    • 發現 bug 時
    • 新的 edge case 出現時

    加一句:

    ## 更新日誌
    - 2024-03-25:初版
    - 2024-03-26:加入多頁分頁需求
    - 2024-03-27:修正邊界情況 (長品項名稱)

    下一步

    現在就做

    選一個你想要的功能(不用很大),寫設計文檔:

    1. 打開編輯器

    bash touch docs/designs/[feature-name].md

    1. 按照上面的「最小版本」模板寫
    • What (是什麼)
    • How (怎麼做)
    • Edge cases (邊界情況)
    • Done when (完成條件)
    1. 花時間:15-20 分鐘
    1. 給 Claude

    “`bash claude user: “這是 [功能名稱] 的設計文檔 [貼上設計文檔]

    請按照這個設計實施” “`

    1. 對比傳統方式
    • 時間縮短 60-70%
    • 修改次數 ÷ 3
    • Bug 數量 ÷ 2

    重點回顧

    CLAUDE.md:「怎樣寫好代碼」(寫一次,永遠用)
       ↓
    設計文檔:「這次要寫什麼」(每功能一份)
       ↓
    Claude:一次實施正確 ✅

    投資回報

    • 每份設計文檔花 30 分鐘
    • 省 6 小時實施時間
    • 一年 (~50 功能) 省 300 小時 = 6 周工作量!

    下一篇預告

    第 4 篇:Hook 自動化

    有了 CLAUDE.md 和設計文檔,代碼質量大幅提升。

    但還有很多重複的手動工作:

    • 每次編輯後手動 lint
    • 每次 commit 前手動執行測試
    • 每週手動檢查依賴更新

    Hooks 自動化這些!

    下一篇會告訴你:

    • 怎樣 5 分鐘設置 3 個最重要的 Hook
    • 節省每週 5-10 小時手動工作
    • 實例:after-edit (auto-format) + before-commit (auto-test)

    現在就開始寫第一個設計文檔! 👋

  • Claude Code 系列文 (2/5):CLAUDE.md — 你的編碼憲法

    ⚡ 重點摘要

    • CLAUDE.md是讓Claude永遠記住你規則的配置文件
    • 包含代碼標準、命名約定、業務規則、技術決策
    • 30分鐘投入,每週節省3-5小時重複prompt
    • 具體規則 > 模糊描述,MUST/NEVER > 建議

    前提:讀過第 1 篇,理解「規劃優先」的理念 時間投入:30 分鐘讀 + 30 分鐘寫你自己的 CLAUDE.md 收益:從此每次 prompt 少打 50% 重複內容


    這一篇的核心觀點

    傳統用法:
    prompt #1: "用 TypeScript 寫"
    prompt #2: "按照我們的命名規則..."
    prompt #3: "記得加 unit tests"
    prompt #4: "遵守這些安全規則..."
    
    === vs ===
    
    CLAUDE.md 方法:
    寫一次(CLAUDE.md 裡記錄所有規則)
    之後:Claude 自動遵守,不用每次都提醒

    實際節省:每個 prompt 減少 50-70% 的文字。


    CLAUDE.md 是什麼

    CLAUDE.md 是一份你放在項目根目錄的文檔。

    Claude Code 啟動時會自動讀取它,並把規則記住。

    # 檔案位置
    ~/your-project/CLAUDE.md
    
    # Claude 行為
    claude
     ├─ 讀取 CLAUDE.md
     ├─ 記住所有規則
     ├─ 每次你輸入 prompt 時遵守
     └─ 不再需要你重複告訴它

    類比

    • 傳統方式 = 每次進公司都告訴員工「要穿正式服裝」
    • CLAUDE.md 方式 = 第一天讀 dress code,以後自動遵守

    一人公司應該在 CLAUDE.md 裡寫什麼

    第一層:基本信息(不改的東西)

    # Project: Taiwan Invoice System
    
    **Stack**: React 18 + Node.js 18 + PostgreSQL
    **Language**: TypeScript (strict mode)
    **Main concern**: Taiwan tax law compliance
    
    ---
    
    ## Architecture Decision Log
    
    ### Decision 1: Use Strategy Pattern for tax calculation
    **Why**: Taiwan tax law changes frequently (new government = new rates)
    **Impact**: New tax type can be added in 30 min, not 8 hours
    **Done**: ✅
    
    ### Decision 2: Keep invoice data immutable once submitted
    **Why**: Taiwan tax audit requires unmodifiable records
    **Impact**: No delete/edit after submit, only void new ones
    **Done**: ✅

    好處

    • 6 個月後你自己看,能快速想起設計邏輯
    • 新人(或外包)接手,有據可查
    • Claude 理解你的業務優先級

    第二層:代碼標準(重複最多的東西)

    ## Code Standards
    
    ### File Structure
    ```
    src/
    ├── components/       # React components
    ├── pages/           # Page-level components
    ├── services/        # API calls & business logic
    ├── utils/           # Helpers
    ├── hooks/           # Custom React hooks
    ├── styles/          # CSS modules
    └── __tests__/       # Test files (mirror structure)
    ```
    
    ### Naming Conventions
    - Components: PascalCase (e.g., InvoiceForm.tsx)
    - Utilities: camelCase (e.g., calculateTax.ts)
    - Constants: UPPER_SNAKE_CASE (e.g., MAX_INVOICE_AMOUNT)
    - Database tables: snake_case (e.g., c_invoice)
    
    ### Code Quality Rules
    
    **MUST HAVE**:
    - [ ] TypeScript (no `any` type)
    - [ ] Unit tests for all logic (TDD)
    - [ ] JSDoc for public functions
    - [ ] Error handling (no silent failures)
    
    **NEVER**:
    - ❌ Hardcode config values (use .env)
    - ❌ Leave console.log() in production code
    - ❌ Commit commented-out code
    - ❌ Use var (only let/const)

    為什麼重要

    • Claude 有了標準,自動遵守
    • 省去每個 prompt 都要說「按 TypeScript best practices」
    • 代碼風格一致,review 更快

    第三層:業務邏輯(最容易被遺忘的)

    ## Taiwan-Specific Rules
    
    ### Tax Calculation
    - Standard VAT: 5% (applies to most goods)
    - Zero-rated: 0% (exports, specific items)
    - Tax-exempt: 0% (non-profit, some services)
    - Input tax can be deducted if invoice dated in same month
    
    ### Invoice Rules
    - Invoice number format: GUN (Government Uniform Number)
    - Sequence must be continuous
    - Cannot be modified after submission
    - Must include buyer's company ID + name
    - QR code is mandatory for official submission
    
    ### Compliance
    - Must report to MOPS (Ministry system) by 15th of next month
    - Annual audit by tax bureau
    - Keep records for 10 years

    為什麼重要

    • Claude 有了背景,不會犯「常見的 bug」
    • 減少審查時需要找的問題
    • 新人學習曲線 ÷ 2

    第四層:技術決策(省掉最多討論時間)

    ## When You Ask Claude to Build Something
    
    ### Before Implementation (Planning Phase)
    1. Claude enters Plan Mode automatically
    2. Claude reads this CLAUDE.md + design docs
    3. Claude proposes approach
    4. **YOU APPROVE** (or suggest changes)
    5. Claude implements
    
    ### Testing Strategy
    - Unit tests: Must cover edge cases
    - Integration tests: For API + database interaction
    - Manual testing: Only for UI/UX
    - Coverage target: > 85%
    
    ### Code Review Checklist
    - [ ] Logic is correct (test passes)
    - [ ] Taiwan business rules followed
    - [ ] No security holes
    - [ ] Performance acceptable
    - [ ] Error messages are clear (in Chinese)
    - [ ] Documentation updated

    為什麼重要

    • Claude 知道你的評審標準
    • 自動寫出符合預期的代碼
    • 不用反覆改

    一人公司版本的 CLAUDE.md 精簡版

    如果你覺得上面太複雜,這是最小版本(30 分鐘可寫完):

    # Taiwan Invoice System
    
    ## Stack & Language
    - TypeScript + React 18 + Node.js
    - Database: PostgreSQL
    
    ## Code Rules
    - File structure: components/ pages/ services/ __tests__/
    - Names: Components = PascalCase, functions = camelCase, constants = UPPER_CASE
    - MUST: TypeScript strict, unit tests, JSDoc, error handling
    - NEVER: console.log, hardcoded config, var, no tests
    
    ## Business Rules
    - Tax rates: 5% standard, 0% zero-rated, 0% exempt
    - Invoice format: GUN, continuous sequence, immutable after submit
    - Compliance: Report to MOPS by 15th, keep records 10 years
    
    ## When You Ask Me to Build
    1. I'll enter Plan Mode
    2. Read design doc + this file
    3. Propose approach (you approve)
    4. Implement with tests
    5. You review
    
    ## Important Decisions
    1. Tax calculation uses Strategy Pattern (easy to add new rates)
    2. Invoices immutable after submit (Taiwan law requirement)
    
    ---
    
    Done! Keep this updated as rules change.

    寫這個花了多少時間? 30-45 分鐘。

    省了多少時間? 每週 3-5 小時(因為不用重複解釋)。


    真實案例:有沒有 CLAUDE.md 的差別

    沒有 CLAUDE.md 的一人公司

    Day 1, Prompt:
    "Build invoice form with validation.
    Use React, TypeScript, follow best practices."
    
    Claude builds... but:
    - Uses var instead of const ❌
    - Only 60% test coverage ❌
    - API call has no error handling ❌
    - Component name is lowercase ❌
    
    You: "Oh no, 改了改了改了"
    時間消耗:8 小時 (1 小時寫 + 7 小時改)

    有 CLAUDE.md 的一人公司

    Day 1, CLAUDE.md 寫好,然後 Prompt:
    "Build invoice form with validation"
    
    Claude builds:
    - Automatically uses let/const ✅
    - Automatically writes unit tests ✅
    - Automatically adds error handling ✅
    - Automatically uses PascalCase ✅
    
    You: "一次到位!"
    時間消耗:2.5 小時 (30 分鐘規劃 + 2 小時實施)

    節省時間:5.5 小時 per feature。 一個月(~4 features)= 22 小時 = 3 整天!


    怎樣寫一個好的 CLAUDE.md

    ❌ 常見錯誤

    # Project Rules
    
    要遵守我們的架構。要寫好代碼。不要有 bug。
    
    Done!

    問題:太模糊,Claude 無法遵守。

    ✅ 正確方式

    # Project Rules
    
    ## Code Quality
    - MUST: TypeScript strict mode, no `any` type
    - MUST: Unit tests for all functions (Jest)
    - MUST: Error handling (try-catch or error state)
    - NEVER: console.log in production code
    - NEVER: var keyword (use let/const)
    
    ## File Naming
    - Components: PascalCase (InvoiceForm.tsx)
    - Utilities: camelCase (calculateTax.ts)
    - Tests mirror source: src/foo.ts → src/__tests__/foo.test.ts

    好處:具體、可驗證、Claude 能遵守。

    規則

    1. 具體 > 模糊
    • ❌ 「寫好代碼」
    • ✅ 「TypeScript strict mode, coverage > 85%, no console.log」
    1. 實例 > 敘述
    • ❌ 「按照公司命名慣例」
    • ✅ 「組件 = PascalCase (InvoiceForm.tsx), 函數 = camelCase (calculateTax.ts)」
    1. MUST/NEVER > 建議
    • ❌ 「考慮使用 const」
    • ✅ 「MUST use const (never var)」
    1. 定期更新 > 一次寫完就忘
    • 每月審視 1 次
    • 如果發現 Claude 經常犯某個錯誤,加入 CLAUDE.md

    一人公司老闆的 CLAUDE.md 檢查清單

    寫完了嗎?檢查一下:

    • 基本信息
    • ☐ 項目名稱
    • ☐ 技術棧
    • ☐ 主要業務邏輯
    • 代碼標準
    • ☐ 文件結構
    • ☐ 命名約定
    • ☐ TypeScript/語言設置
    • ☐ 測試要求
    • 業務規則
    • ☐ 稅務/財務規則(如有)
    • ☐ 數據有效性
    • ☐ 合規要求
    • 決策日誌
    • ☐ 架構決策 + 理由
    • ☐ 為什麼選這個技術
    • 評審標準
    • ☐ 什麼樣的代碼才算「完成」
    • ☐ 什麼是「不接受」

    如何開始

    Step 1:複製模板(1 分鐘)

    cp ~/claude-code-guide/templates/CLAUDE.md.template \
       ~/your-project/CLAUDE.md

    Step 2:填入你的內容(30 分鐘)

    打開編輯器,按照上面的框架填入:

    1. 你的技術棧
    2. 你的命名約定
    3. 你的業務規則
    4. 你的決策理由

    Step 3:提交到 Git(2 分鐘)

    git add CLAUDE.md
    git commit -m "chore: add project rules"
    git push

    Step 4:開始用(即時)

    claude
    
    user: "Add a new invoice field called customer_contact_number"
    # 不用再說「用 TypeScript」、「加測試」、「命名要駝峰」
    # Claude 自動知道

    一個月後會發生什麼

    Week 1

    • CLAUDE.md 寫好
    • 第一個功能用新規則
    • “哦,還是得改一些東西…”
    • 把發現的規則加入 CLAUDE.md

    Week 2-3

    • Claude 開始學到你的風格
    • 改動變少了
    • “不錯,大部分對了”

    Week 4

    • 新功能一次到位 90%+ 正確
    • 只需要微調
    • 驚嘆「怎麼忽然快這麼多」

    Month 2+

    • CLAUDE.md 成為寶貴資產
    • 新人/外包根據 CLAUDE.md 快速上手
    • 你的編碼風格一致,代碼可維護性 ↑

    一個常見問題:CLAUDE.md 應該多詳細

    答案:「足夠清楚讓 Claude 不猜測」

    測試方法:

    1. 寫 CLAUDE.md
    2. 給 Claude 一個簡單的 prompt
    3. 看結果
       - 如果 Claude 做對了 90%+ → 夠詳細
       - 如果還要改 → 加更多細節

    一人公司的理想狀態

    • 一份 1000-2000 字的 CLAUDE.md
    • 涵蓋 70% 的日常情況
    • 20% 用 design docs(下一篇講)
    • 10% 需要臨時 prompt

    重點回顧

    CLAUDE.md 是「一次性投資」:
    
    30 分鐘寫 CLAUDE.md
      ↓
    之後每周省 3-5 小時
      ↓
    一年省 150+ 小時
      ↓
    相當於半個全職開發者的成本!

    你如果是一人公司老闆,這是值得的投資。


    下一篇預告

    第 3 篇:設計文檔模板

    CLAUDE.md 處理「永遠不變的規則」

    那「會變的東西」(業務邏輯、UI 流程)怎麼辦?

    設計文檔

    下一篇我會告訴你:

    • 怎樣寫一份 2 小時內完成的設計文檔
    • 讓 Claude 看懂你的想法,一次實施正確
    • 實例:Invoice 功能設計文檔

    現在就做這一件事

    1. 打開編輯器
    2. 複製上面的「精簡版 CLAUDE.md」
    3. 填入你的技術棧和規則
    4. 保存為 ~/your-project/CLAUDE.md
    5. git add + commit

    花時間:30 分鐘 收益:未來每週省 3-5 小時

    下一篇見!👋