作者: tm731531

  • Hacker News 每日精選 – 2026-03-25

    🚀 科技趨勢週報:從 AI 硬體革新到企業級生態系的全面擴張

    今日的科技圈展現了從底層硬體到頂層商業應用的劇烈變動。我們不僅看到 Arm 與 Google 在 AI 效能優化上的突破,更目睹了 Apple 正式向企業服務市場發起總攻。這是一個「優化」與「深化」並行的時代,對於開發者與創業者來說,如何兼顧安全性與實戰經驗將是未來的核心競爭力。✨

    🤖 AI / 機器學習

    TurboQuant:以極限壓縮重新定義 AI 效率

    Google Research 推出了名為 TurboQuant 的新技術,旨在解決大型語言模型(LLM)推論時的記憶體與運算瓶頸。透過極致的量化壓縮技術,TurboQuant 能顯著降低模型體積而不犧牲精準度,這對於在邊緣裝置上運行高效能 AI 至關重要。這項研究為未來更普及、更廉價的 AI 應用鋪平了道路。🚀

    閱讀原文

    Arm 發布 AGI CPU 專屬架構

    Arm 宣布推出專為人工通用智能(AGI)設計的 CPU 架構,這標誌著硬體層級對 AI 的支持進入了新階段。新架構優化了張量運算與神經網路的執行效率,試圖在節能與強大算力之間取得完美平衡。隨著硬體廠商紛紛跳下場,AI 算力競賽已從 GPU 延伸至通訊與通用處理器領域。⚡

    閱讀原文

    告別 Sora:專案團隊的謝幕

    近日在社群媒體上引起廣泛關注的 Sora 相關專案(非 OpenAI 官方)宣布終止營運。這反映出在 AI 浪潮下,獨立開發者在面對法律合規、資源壓力以及巨頭競爭時的艱難處境。這則新聞提醒我們,AI 創業除了技術熱情,更需要長遠的營運策略。📌

    閱讀原文

    💻 開發工具與開源專案

    ⚠️ 安全警告:Litellm PyPI 套件遭到入侵

    熱門的開源 AI 整合工具 Litellm 爆出安全漏洞,版本 1.82.7 與 1.82.8 在 PyPI 平台上被發現含有惡意程式碼。開發者社群強烈建議所有使用者立即檢查自己的環境,並更新至最新修復版本。這再次敲響了軟體供應鏈安全的警鐘,使用第三方庫時務必謹慎。🛡️

    閱讀原文

    Video.js 10 重磅回歸:體積縮減 88%

    創始人在時隔 16 年後重新接手 Video.js,並在第 10 版進行了徹底的重寫。這次更新不僅去除了陳年的技術債,更將核心檔案大小大幅削減了 88%,效能提升顯著。對於追求網頁載入速度與極簡主義的開發者來說,這是一個非常值得關注的開源回歸案例。📦

    閱讀原文

    VitruvianOS:受 BeOS 啟發的桌面 Linux

    VitruvianOS 是一個致力於將經典作業系統 BeOS 的操作體驗帶入現代 Linux 的專案。它強調反應快速的 UI 與簡潔的系統架構,為對現有桌面環境感到疲勞的用戶提供了一個充滿懷舊感與創新的替代選擇。對於作業系統愛好者來說,這是一個值得把玩的開源寶庫。🖥️

    閱讀原文

    🏢 創業 / 商業

    Apple Business:一站式企業管理平台正式登場

    Apple 宣布推出全新的 Apple Business 平台,旨在為各種規模的企業提供統一的裝置管理、雲端服務與技術支援。這顯示了 Apple 進軍企業市場(B2B)的野心,透過整合硬體優勢與訂閱服務,試圖建立一個比以往更封閉且高效的商業生態系。這對現有的企業管理軟體供應商無疑是巨大的威脅。🍎

    閱讀原文

    深入第一線:為了打造 SaaS,我先去當了除蟲技師

    一位創業者分享了他開發垂直領域 SaaS 的真實經歷:為了開發除蟲行業的軟體,他親自入行擔任基層技師。這種「接地氣」的開發模式讓他洞察到許多辦公室裡觀察不到的需求痛點。這篇文章強烈推薦給所有想要開發垂直領域產品的創業者閱讀,理解用戶永遠比寫程式碼更重要。🐜

    閱讀原文

    🌍 其他關注

    Flighty Airports:數據驅動的機場指引

    知名飛航追蹤 App Flighty 推出了全新的機場數據庫。透過大量真實航班數據,為旅客提供各機場的平均延誤時間、通關效率等深度分析。這不僅是一個功能更新,更是大數據轉化為實用生活決策工具的優良範例。✈️

    閱讀原文

    英國政府試點:禁止青少年使用社群媒體

    英國政府正計劃對青少年實施數位戒嚴,試行社群媒體禁令與數位宵禁。這項政策引發了關於青少年保護、個人隱私與數位人權的激烈爭論。隨著各國政府對網路成癮與心理健康日益重視,這類政策可能會在未來引發全球性的連鎖反應。🇬🇧

    閱讀原文

    💡 今日觀點:回歸真實需求與安全性

    總結今天的趨勢,我們可以看到兩個截然不同但同樣重要的方向:

    • 技術的極致優化: 無論是 Video.js 的 88% 縮減,還是 TurboQuant 的壓縮技術,「更輕、更強、更快」 依然是技術的核心追求。
    • 對現實世界的深挖: 從 Apple 對企業流程的整合,到創業者親自下場抓蟲,這提醒我們成功的軟體來自於對現實問題的深刻理解

    💡 行動建議:
    如果您是開發者,請立即檢查並更新 Litellm 等依賴項,確保軟體鏈安全;
    如果您是創業者,請思考您的產品是否真正觸及了用戶在實務中的痛點,而不僅僅是解決了表面上的邏輯問題。

  • 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 小時

    下一篇見!👋

  • Claude Code 系列文 (1/5):一人公司的開發穩定性秘密

    ⚡ 重點摘要

    • 一人公司最大問題:時間少,重複改動多
    • 規劃優先方法:CLAUDE.md + 設計文檔 → Claude一次做對
    • 每個功能開發時間從8-16小時縮短到2-3小時
    • 本系列5篇教你建立完整的一人公司開發系統

    寫給:一人公司老闆、獨立開發者 痛點:時間少、要求多、不能重複勞動 解決方案:用規劃優先的工作流 + Claude Code


    你的困境(認真的)

    你一個人同時是:

    • 💼 產品經理(要什麼功能)
    • 🔨 開發者(怎麼建)
    • 🧪 QA(有沒有 bug)
    • 📚 文檔編寫者(怎麼用)
    • 🚀 運維(部署和監控)

    時間分配很絕望

    • 實際寫代碼:可能只有 30%
    • 重複做同樣的決策:20%
    • 找 bug、修 bug:20%
    • 手動測試:15%
    • 其他雜事:15%

    結果

    • 一個月才能交付一個功能
    • 沒時間優化
    • 沒時間文檔
    • 夢裡都在 debug

    一般人的解決方案(都不對勁)

    ❌ 方案 1:招一個開發者

    • 成本:月薪 $2000-4000
    • 你的增加成本:70-80% (管理、協調、溝通)
    • 結果:不划算,特別是你的需求變化快

    ❌ 方案 2:外包給開發公司

    • 成本:$1000-3000 per feature
    • 問題:
    • 他們不懂你的業務邏輯
    • 一堆 bug 需要反覆修
    • 根本沒人維護
    • 改 UI 要等一周

    ❌ 方案 3:用低代碼/無代碼工具

    • 優點:快速上手
    • 缺點:
    • 超過基本功能就卡住
    • 無法擴展
    • 數據鎖定在平台
    • 月費永不停止

    ✅ 我的方案:Claude Code + 規劃優先

    這個方案的核心理念:

    少 prompt(提示詞)→ 多文檔(規劃文件)→ 穩定開發

    運作邏輯

    傳統 Claude Code 用法:
    user: "加個登入功能"
    claude: "好,現在實施..."
    結果: 80% 對,20% 要改,改 3 次才對 ❌
    
    ===
    
    我的方法:
    user: 先寫設計文檔
       ├─ 登入流程圖
       ├─ 數據模型
       ├─ API 規格
       ├─ 錯誤情況
       └─ 安全檢查點
    
    claude: 讀完設計文檔
           → 一次到位 ✅
           → 90%+ 對
           → 最多微調 1-2 次

    為什麼效果這麼好?

    1. 你花 2 小時規劃,省 8 小時改
    • Claude 少猜測 80%
    • 實施清晰,bug 少
    1. 從此不重複決策
    • 設計一次,可重用
    • 新人接手也看得懂
    • 6 個月後改需求,有據可查
    1. Claude 更聰明
    • 它讀懂需求精細度 ↑ → 代碼品質 ↑
    • 不再「我猜你想要」
    • 自動找出邊界情況
    1. 自動化率提高
    • Hooks 自動 lint + format
    • 測試自動跑
    • 手動操作 ↓ 50%

    一人公司的黃金公式

    CLAUDE.md (5 min 寫)
      ↓
    設計文檔 (20-30 min 寫)
      ↓
    Claude Code 實施 (1-2 hours)
      ↓
    驗收 (15 min)
      ↓
    上線 (5 min)
      ↓
    自動化監控 (0 min,Hook 搞定)
    
    總時間:2-3 hours per feature ✅

    vs

    傳統方式:
    實施 → 測試 → 修改 1 → 測試 → 修改 2 → ...
    總時間:8-16 hours per feature ❌

    這個系列會教你什麼

    📖 第 1 篇 (本篇):為什麼規劃優先

    📖 第 2 篇:建立你的「編碼憲法」

    • CLAUDE.md 怎麼寫
    • 一次性規則,永遠生效
    • 讓 Claude 記住你的風格和要求

    你寫一次:「所有 API 返回都要帶 error_code」
    之後:Claude 永遠自動加這個,不用提醒

    📖 第 3 篇:設計文檔模板

    • Invoice 系統設計文檔怎麼寫
    • 從業務需求到技術規格
    • 讓 Claude 能一次實施正確

    📖 第 4 篇:自動化 Hook

    • 自動格式化、自動測試、自動檢查
    • 從此沒有手動 lint 這種事
    • 節省每週 5-10 小時

    📖 第 5 篇:實戰案例 – Taiwan Invoice System

    • 完整的一人公司開發流程
    • 從零到部署,3 天內完成
    • 如何用 Plan Mode 少 prompt

    一人公司老闆應該知道的三件事

    事實 1:你的時間不是資源,是稀缺商品

    你的時間 ≠ 開發者的時間

    你 1 小時的時間價值 = 你一個小時的營收機會成本

    所以

    • ✅ 花 30 分鐘規劃(你做)
    • ❌ 不要花 8 小時反覆改(讓 Claude 做,正確率 90%+)

    事實 2:文檔是最好的投資

    一個一人公司最怕什麼?

    • 不是 bug
    • 不是需求改變
    • 是「我忘了為什麼這樣設計」

    3 個月後

    • ❌ 沒文檔:「為什麼税務計算這樣寫?誰知道… 反正改不了」
    • ✅ 有文檔:「哦,這是因為台灣稅法 §96,我記得」

    事實 3:規劃優先,自動化第二

    很多人想著「如何自動化我的工作」

    正確的順序是「如何規劃好我的工作」才能「自動化」

    類比

    • 製造業 1.0:手工 → 效率低
    • 製造業 2.0:流程化 + 自動化 → 效率高
    • 開發 1.0:隨意寫代碼 + 手動測試 → 慢
    • 開發 2.0:規劃 + 自動化 → 快

    你應該期待什麼結果

    Week 1(學習)

    • 讀完這個系列(2 小時)
    • 寫出你的 CLAUDE.md(1 小時)
    • 設置 Hook(30 分鐘)
    • 第一個功能用新方法(3 小時)

    Week 2-4(習慣)

    • 每個功能都有設計文檔(快速發現問題)
    • 自動化 lint/test(省去手動操作)
    • 改需求不再是「全部改」,而是「增量改」

    Month 2(收穫)

    • 開發速度 ×3
    • bug 率 ÷2
    • 個人壓力 ÷3
    • 有時間優化產品

    Month 3+(習慣)

    • 文檔成為資產(不是負擔)
    • 新功能開發時間可預測(不再「要多久」→「大概 2 天」)
    • 可以考慮擴招(有文檔,新人能快速上手)

    下一篇預告

    第 2 篇:CLAUDE.md – 你的編碼憲法

    我會教你怎樣用一份文檔,讓 Claude 永遠記住:

    • 你的代碼風格
    • 你的業務邏輯
    • 你的命名約定
    • 你的安全要求

    寫一次,永遠受用。


    現在就開始

    問自己三個問題:

    1. 我上週浪費了多少時間在「改 bug」上?
    • < 3 小時:你還不夠痛苦,可以緩一緩
    • 3-10 小時:現在該改了
    • \> 10 小時:你應該昨天就開始
    1. 我有沒有寫過設計文檔?
    • 沒有:你損失了 80% 的時間
    • 有,但是手寫的:轉換成模板化的吧
    1. 我願不願意花 2 小時規劃,換 8 小時省下來?
    • 願意:到第 2 篇見!
    • 不願意:你可能不是一人公司老闆該有的效率思維

    系列文快速導航

    篇章標題重點你需要做什麼
    1️⃣為什麼規劃優先理解痛點讀完,認同理念
    2️⃣CLAUDE.md 編碼憲法寫一份文檔複製模板,填入自己的規則
    3️⃣設計文檔模板學會規劃為下個功能寫設計文檔
    4️⃣Hook 自動化節省時間設置 3-5 個 Hook
    5️⃣實戰:Taiwan Invoice看完整案例套用到自己的項目

    核心觀念一句話

    「規劃優先,少 prompt;文檔優先,少反覆。」

    多花 30% 規劃時間,省 70% 改動時間。

    一人公司的職責太多,不能靠「反覆試錯」活著。

    下一篇見!👋

  • Claude Code Agent Teams:從穩定執行到自動化代碼審查的完整指南

    Claude Code Agent Teams:從穩定執行到自動化代碼審查的完整指南

    本文整合三部分內容:(1) Agent Teams 的穩定執行框架;(2) 全局代碼審查規則系統的設計與實施;(3) 自動化雙 Agent 審查機制(架構師 + PM)的完整實現方案。這是一份實踐導向的指南,涵蓋從資源評估、權限配置、到自動觸發流程的所有細節。

    第一部分:Agent Teams 的三層穩定執行框架

    1.1 評估層(Assessment)— 前置資源檢查

    每次建立 Agent Team 前,必須執行三個評估動作:

    1. 記憶體現狀:執行 free -h 或查看 Docker stats,確認可用容量
    2. 計算容量:根據模型選擇計算最大並行 agent 數(opus ~1GB、sonnet ~600MB、haiku ~400MB)
    3. 決策與確認:列出 agent 角色、模型、預估記憶體,取得用戶確認後才建立

    模型選擇口訣

    • 需要「想」 → Opus(架構決策、安全設計、業務邏輯、複雜 SQL、Code Review)
    • 需要「做」 → Sonnet(CRUD 實作、API 對接、測試撰寫、文件撰寫)
    • 需要「找」 → Haiku(檔案掃描、配置對比、API 整合)

    1.2 確認層(Confirmation)— 用戶決策前置

    建立 Team 前,必須向用戶列出清晰的角色定義和資源計劃,包括:

    • 各 agent 的角色名稱與職責
    • 指定的 AI 模型及其預估記憶體
    • 總計容量和系統可用容量
    • 並行數量和預期執行順序

    只有在用戶明確確認後,才啟動 TeamCreate 和後續任務建立。這一步防止了資源耗盡、權限誤配、以及 agent 之間通訊不暢的根本原因。

    1.3 執行層(Staged Execution)— 分階段序列化

    即使資源充足,也不應讓所有 agent 同時轟炸執行。分階段策略包括:

    1. 第 1 階段:啟動基礎設施 agent(如資源管理、環境配置)
    2. 第 2 階段:啟動 researcher agent,進行資訊搜集與分析
    3. 第 3 階段:啟動 architect agent,設計方案
    4. 第 4 階段:啟動 developer agent,進行實作
    5. 第 5 階段:啟動驗證 agent,進行測試與審查

    各階段 agent 完成任務後,主動進入「空閒」狀態並通知團隊。不進行「拉取」操作,而是由前置 agent 完成後才推進下一階段。這種設計確保:

    • 前置依賴滿足後才啟動
    • 消息傳遞清晰,無需輪詢
    • 系統記憶體壓力均勻分散
    • 故障範圍可控,易於除錯

    第二部分:全局代碼審查規則系統架構

    2.1 雙層規則設計

    代碼審查規則分為兩層,確保通用性和專案適應性的平衡:

    • 全局層~/.claude/memory/):所有項目共享的代碼品質標準(SOLID 原則、Design Pattern、代碼異味、測試規範、語言特定規範)
    • 項目層項目/.claude/code-review-rules.md):專案特定的業務邏輯規則、設計稿映射、外部驗證清單

    2.2 全局規則內容結構

    code-review-global-rules.md(SOLID、Pattern、Code Smell、Testing)

    • SOLID 五項原則的定義和違反示例
    • Design Pattern 反面示例(God Object、Feature Envy 等)
    • 代碼異味檢查清單(N+1、Magic Number、過長方法、過多參數、重複代碼、複雜邏輯)
    • 單元測試最低標準(80%+ 覆蓋、邊界情況、Mock vs Real Dependency)

    code-review-languages.md(Java、Python、JavaScript/TypeScript、SQL)

    • 命名規範(類名、方法名、變數名、常數、包名)
    • 包結構約定(分層架構:domain/service/repository/validator 等)
    • 異常處理規範
    • 語言特定工具規範(Lombok、OSGi、Type Hint、Docstring 等)

    code-review-feedback.md(架構師與 PM Agent 職責和對焦框架)

    • 架構師 Agent:SOLID 遵循度(1-5 分)、Design Pattern、Code Smell、測試覆蓋、異常處理、語言規範
    • PM Agent:功能 vs 設計稿對齐、API 返回值、邊界情況、業務邏輯、用戶體驗、外部驗證需求
    • 雙方對焦框架:架構師問「代碼設計能支持你檢查的功能嗎?」,PM 反問「這些功能需求會造成架構問題嗎?」

    code-review-process.md(自動觸發、Agent 角色、聯合報告格式)

    • 觸發點:Task marked as completed
    • Agent 角色 Prompt(初版):架構師評估、PM 評估、聯合對話
    • 聯合報告格式:分離的評估 + 統一優先級排序 (P0/P1/P2)
    • 最終判定:Pass / Needs Work / Fail

    2.3 項目層規則(台灣發票系統範例)

    項目規則分為三類:

    A. 業務邏輯規則(優先級最高)
    • 進項稅計算公式(進項稅金額 = 發票金額 × 5%,DECIMAL(19,2) 向下取整)
    • 三聯式(不含稅)vs 二聯式(含稅)的會計處理邏輯
    • 進項稅折讓的強制申報期限(當期內必須申報,無延後例外)
    • 兼營營業人的比例扣抵公式(可扣抵進項稅 = 總進項稅 × (應稅銷售額 / 總銷售額))
    • 發票號碼連續性檢查和遺失空白發票記錄
    • 發票開立日期 → 申報期間的映射(1-2月→第1期、3-4月→第2期 等,共六期)
    B. 設計稿對齐規則(優先級次之)
    • API 端點的返回格式和欄位定義
    • 邊界情況的預期響應(零金額、負數、超大金額)
    • 數據型態和範圍檢查
    C. 外部驗證清單(優先級最低,但定期更新)
    • 進項稅可扣抵期限是否仍為 10 年
    • 電子發票強制規定的生效狀態
    • 設計稿版本確認
    • 技術規範(iDempiere PO 模型、OSGi Bundle)

    第三部分:自動化雙 Agent 審查機制的實現

    3.1 TaskCompleted Hook 配置

    .claude/settings.local.json 中配置 TaskCompleted Hook,每當任務標記完成時,自動觸發架構師和 PM 兩個 agent 進行深度審查:

    {
      "hooks": {
        "TaskCompleted": [
          {
            "hooks": [
              {
                "type": "agent",
                "prompt": "Conduct comprehensive code review: (1) Architecture: SOLID principles (1-5), design patterns, code smells (P0/P1/P2), testing, exceptions. (2) Functional: spec alignment, API contracts, boundary cases, business logic (Taiwan tax rules). Provide unified P0/P1/P2 priority with Pass/Needs Work/Fail decision and file:line recommendations.",
                "model": "opus",
                "statusMessage": "Running code review on completed task...",
                "timeout": 300
              }
            ]
          }
        ]
      }
    }

    3.2 架構師 Agent 職責細節

    架構師 Agent 按以下維度進行評估,每項 1-5 分自評:

    1. SOLID 原則遵循度:檢查 S(單一職責)、O(開閉)、L(里氏替換)、I(接口隔離)、D(依賴倒轉)五項是否遵循
    2. Design Pattern 應用恰當性:是否應用了合適的設計模式,是否存在過度設計
    3. 代碼異味程度:N+1 查詢、Magic Number、過長方法(>20 行)、過多參數(>3 個)、重複代碼、複雜邏輯(圈複雜度 > 10)
    4. 測試覆蓋度:目標 80%+,是否涵蓋邊界情況(null、empty、max/min)
    5. 異常處理完整性:是否避免過寬泛的異常捕捉,異常信息是否有意義,是否吞掉異常
    6. 語言特定規範遵循度:根據 code-review-languages.md 檢查命名、包結構、工具使用規範

    輸出:各維度評分 + 具體改進建議(標記優先級 P0/P1/P2 和代碼位置)

    3.3 PM Agent 職責細節(含 QA)

    PM Agent 進行務實檢查,確保功能實現和業務邏輯正確性:

    1. 功能 vs 設計稿對齐:設計稿的所有功能點是否實現,是否有範圍蠕動
    2. API 返回值對齐:返回欄位是否與文檔一致,資料型態是否正確,必需欄位是否都有
    3. 邊界情況涵蓋:null 輸入、空集合、最大值/最小值、負數、零值是否處理
    4. 業務邏輯正確性:根據項目規則(進項稅計算、發票號碼、申報期間映射等)是否正確
    5. 用戶體驗:錯誤提示是否清楚,用戶流程是否順暢,是否有令人困惑的行為
    6. 外部驗證需求:是否需要查證業務規定(優先 C)、設計稿(優先 A)、技術規範(優先 B)

    輸出:功能層缺陷清單、QA 項目、待驗證項(註明 C/A/B 優先級)

    3.4 聯合報告與優先級統一排序

    架構師和 PM 分別完成評估後,進行深度對話:

    • 架構師問 PM:「代碼結構能支持你檢查的功能嗎?」
    • PM 反問架構師:「這些功能需求會造成架構問題嗎?」

    基於對話結果,生成聯合報告:

    • P0(Critical):N+1 查詢、安全漏洞、死鎖風險、未處理的邊界情況、違反台灣稅務規則
    • P1(Important):過長方法、重複代碼、Magic Number、缺失測試、不清晰的錯誤提示
    • P2(Nice to Have):輔助方法提取、考慮設計模式、日誌增強

    最終判定

    • Pass:P0 問題 0 個,P1 問題可接受(≤2 個或不影響核心功能)
    • ⚠️ Needs Work:P0 問題 1-3 個,或 P1 問題 >3 個,或測試覆蓋度 <70%
    • Fail:P0 問題 ≥3 個,或安全漏洞,或違反重要法規

    第四部分:審查流程與反覆迭代

    4.1 外部驗證流程

    當 PM Agent 提出待驗證項時,按優先級啟動查詢:

    優先級 C(業務邏輯)— 需人工驗證
    • 用戶透過稅務官網或法規文件進行人工查證(AI 查詢易出錯)
    • 驗證結果更新到項目規則
    • 重新審查涉及的代碼
    優先級 A(設計稿)— 查閱項目文檔
    • 查閱設計文件、API 文檔
    • 如無對應文件,提示用戶補充
    • 確認後更新 code-review-rules.md
    優先級 B(技術規範)— 查詢官方文檔
    • 查詢 iDempiere、OSGi 官方文檔
    • 標記為參考(變動機會低)

    4.2 修改與重審流程

    當報告判定為 Needs Work 或 Fail 時:

    1. 開發者查看報告,收到 P0/P1/P2 改進清單
    2. 開發者修改代碼並完成新測試
    3. 重新標記 Task 為 completed(或手動觸發 /code-review-force)
    4. 自動重審(流程回到架構師 + PM 評估)
    5. 迴圈進行,直到最終判定 Pass

    第五部分:系統集成與迭代計劃

    5.1 全局記憶結構

    所有規則和流程信息保存在用戶的全局記憶庫中:

    • ~/.claude/memory/code-review-global-rules.md — SOLID、Pattern、Code Smell、Testing
    • ~/.claude/memory/code-review-languages.md — Java、Python、JS、SQL 規範
    • ~/.claude/memory/code-review-feedback.md — 架構師/PM 職責與對焦框架
    • ~/.claude/memory/code-review-process.md — 自動觸發、報告格式、判定標準

    5.2 項目級別記憶結構

    • 項目/.claude/code-review-rules.md — 業務邏輯規則 + 設計稿映射 + 外部驗證清單
    • 項目/.claude/settings.local.json — TaskCompleted Hook 配置

    5.3 三個迭代階段

    Phase 1(現在)
    • 建立全局規則知識庫(4 個記憶文件)
    • 編寫項目層規則(code-review-rules.md)
    • 配置 TaskCompleted Hook
    • 在項目中試用審查機制
    Phase 2(2-4 週後)
    • 根據實際審查結果優化規則(哪些規則發現了 bug、哪些規則太寬泛)
    • 改進 Agent Prompt(增加上下文、更清晰的指導)
    • 補充項目層規則細節(特別是邊界情況和特殊規則)
    Phase 3(1-2 月後)
    • 考慮集成到 CI/CD(每次 PR 自動審查)
    • 累積審查報告,形成項目代碼品質歷史
    • 調整 Hook 超時和 Agent 模型選擇

    第六部分:常見問題與實踐建議

    Q1:如果審查花太長時間怎麼辦?

    A:初版 timeout 設為 300 秒。如果超時,可調整為 600 秒,或簡化 Agent Prompt 去掉某些維度。對大型代碼改動,可分成多個小 Task,每個分別審查。

    Q2:外部驗證項目誰負責查證?

    A:初版由用戶或 PM 手動查證(特別是業務邏輯 C 項)。後續可考慮集成更多自動化(如 WebSearch for C 項、文檔連接 for A 項)。

    Q3:PM Agent 如何知道設計稿的內容?

    A:初版需在 code-review-rules.md 的 B 項中維護設計稿摘要(API 返回格式、欄位定義、邊界情況)。後續可考慮直接連接設計文件或 API 文檔鏈接。

    Q4:審查報告輸出到哪裡?

    A:初版直接輸出到對話(用戶可複製保存或導出)。後續可考慮存到 Task comment、Markdown 文件或項目文檔。

    Q5:如何確保 Agent Teams 穩定運行?

    A:遵循三層框架:

    • 評估層:前置資源檢查和確認,不盲目建立 Team
    • 確認層:列出角色、模型、容量,取得用戶確認
    • 執行層:分階段序列化,避免並行轟炸,讓 agent 主動進入空閒狀態而不是被拉取

    以及定期檢查記憶體、監控 agent 通訊、設置合理的超時時間。

    結論

    穩定可信的 Agent Teams 不是靠運氣,而是靠紮實的前置規劃、清晰的資源評估、以及精心設計的執行流程。本文提供的三層框架(評估→確認→分階段執行)確保了 Team 運行的穩定性。配合全局規則庫 + 項目規則 + 自動審查機制,可以建立一套完整的代碼品質保證體系,既有通用性,也有靈活性。

    從 Phase 1 的試用開始,逐步優化規則和 Agent Prompt,經過 2-4 週的實踐,可以達到穩定的審查效果。最終目標是讓代碼審查成為自動化流程的一部分,開發者無需手動申請審查,系統自動評估和反饋,確保每個 Task 完成時都經過架構師和 PM 的雙重把關。

  • Hacker News 每日精選 – 2026-03-24

    🚀 科技趨勢週報:從大型模型突破到邊緣運算的硬核實踐

    今日科技圈的風向標指向了 AI 邏輯推理能力的跨越式進步,以及行動端運算能力的驚人突破。從 GPT-5.4 Pro 解決頂尖數學難題,到 iPhone 17 Pro 嘗試運行超大規模模型,我們正見證著 AI 從雲端走入終端、從對話走入嚴謹科學研究的轉型期。對於開發者與技術愛好者來說,掌握模型優化與硬體整合的邊界將是未來的核心競爭力。

    🤖 AI / 機器學習

    🧠 Epoch 證實 GPT-5.4 Pro 解決了前沿數學懸案

    • 重點摘要: AI 的推理能力達到新里程碑,GPT-5.4 Pro 被證實成功解決了一個關於「藍姆西超圖 (Ramsey hypergraphs)」的前沿數學開放問題。這不僅僅是知識的檢索,而是 AI 在高難度邏輯推導與數學證明上的實質突破。這項發現預示著 AI 輔助科學研究(AI for Science)正進入一個產出真正新知識的時代。
    • 原文連結: 閱讀全文

    📱 iPhone 17 Pro 展示運行 400B 參數大語言模型

    • 重點摘要: 在社群平台上引起熱議的技術展示中,新款 iPhone 17 Pro 被展示能夠運行擁有 4000 億(400B)參數的超大型模型。這通常需要數張頂級伺服器顯示卡才能負擔,顯示了 Apple 在硬體加速器與模型量化技術上的深厚積累。這意味著未來的高階個人裝置將具備處理極其複雜 AI 任務的能力,且無需依賴雲端伺服器。
    • 原文連結: 查看推文

    🔍 自動化研究:重啟舊研究思路的嘗試

    • 重點摘要: 本文探討了利用 AI 進行「自動化研究」的可能性,特別是針對一些被塵封已久的舊研究概念進行現代化的重新檢視。作者展示了如何利用 LLM 的處理能力來挖掘過去文獻中的價值,並嘗試產生新的洞察。這種方法論可能成為未來學術界加速研究流程、避免重複造輪子的重要工具。
    • 原文連結: 閱讀全文

    🛠️ Cq:AI 程式碼開發代理人的 Stack Overflow

    • 重點摘要: Mozilla AI 推出的開源專案 Cq,旨在為 AI 程式碼代理人(AI Agents)提供高品質、結構化的問題與解答資料庫。傳統的 Stack Overflow 是為人類設計的,而 Cq 則是專為 AI 訓練與參考量身打造。這將大幅提升開發型 AI 在面對複雜專案時的準確性與除錯能力。
    • 原文連結: 閱讀全文

    🛠️ 開發工具與開源專案

    🖥️ Terminal 專用的日誌文件查看器:lnav

    • 重點摘要: lnav 是一款專為終端機設計的進階日誌(Log)查看工具,它能自動解壓縮日誌、合併多個文件並進行語法高亮。對於經常需要透過 SSH 進入伺服器排查問題的工程師來說,lnav 提供了類似於現代 IDE 的過濾與搜尋體驗。它的出現極大地簡化了在純文字環境中追蹤複雜系統錯誤的過程。
    • 原文連結: 專案官網

    🔌 BIO – Bao I/O 協同處理器

    • 重點摘要: 這是一個關於硬體協同處理器的最新進展更新,BIO 旨在處理繁重的輸入輸出任務,釋放主處理器的運算資源。這對於需要高併發 I/O 處理的嵌入式系統或物聯網裝置開發者來說,是一個非常值得關注的高效能解決方案。
    • 原文連結: 查看詳情

    🏢 創業 / 商業 / 政策

    🛡️ FCC 更新受監管清單:包含外國製造的家用路由器

    • 重點摘要: 美國聯邦通信委員會(FCC)近期擴大了其受監管通訊設備清單,將部分外國製造的家用路由器納入其中,主因是出於國家安全與網路隱私的考量。這項政策更新不僅影響相關廠商的市場佈局,也提醒了消費者與企業在選擇網通設備時,地緣政治與安全合規已成為不可忽視的因素。
    • 原文連結: 官方公告

    🎨 其他:DIY 與科學發現

    🏠 秘密盒:將舊公寓對講機低調改裝為 Apple Home 支援

    • 重點摘要: 一個極具創意的 DIY 案例,作者展示了如何在不更換原有外殼的情況下,透過隱蔽的硬體改裝,讓老舊的公寓對講機也能整合進 Apple HomeKit 生態系。這篇文章詳細介紹了硬體逆向工程與軟體整合的過程,非常適合熱愛智慧家居與電子手作的讀者參考。
    • 原文連結: 閱讀全文

    📐 證明莫德爾猜想的 Gerd Faltings 榮獲阿貝爾獎

    • 重點摘要: 數學界殿堂級榮譽阿貝爾獎(Abel Prize)近期頒發給了 Gerd Faltings。他最著名的成就之一是證明了代數幾何領域的「莫德爾猜想 (Mordell conjecture)」。這篇文章回顧了他的卓越職涯以及他如何深刻地改變了當代數學的面貌,是數學愛好者不容錯過的深度介紹。
    • 原文連結: 閱讀全文

    🏹 龐貝城的戰火痕跡:與古代「機關槍」的連結

    • 重點摘要: 考古學家在龐貝城發現了與古代先進武器相關的證據,研究指出當時可能已存在某種自動化程度極高的遠程投射武器。這項研究重新審視了古羅馬時期的軍事科技水平,並透過科學分析證實了古代技術可能遠比我們想像中更加先進。
    • 原文連結: 閱讀全文

    💡 今日觀點

    「從邏輯深度到終端廣度」

    今日的趨勢共同指向了一個核心事實:AI 的發展正在同時挑戰「難度」與「環境」的極限。GPT-5.4 Pro 的突破顯示模型已經具備解決人類頂尖智力活動的能力,而 iPhone 17 Pro 運行 400B 模型的嘗試則預告了 AI 的普及化將不再受限於雲端頻寬。

    給讀者的行動建議:

    • 對於開發者: 關注模型量化與終端側推理(Edge AI)的技術進展,這將是下一個軟體開發的主戰場。
    • 對於研究者: 善用 AI 工具進行舊研究思路的「重啟」,利用 LLM 的大規模檢索能力來挖掘被忽略的學術價值。
    • 對於普通讀者: 留意家用網路設備的品牌與安全性,隨時更新韌體,以因應日益複雜的網路安全環境。
  • Claude Code Hook 進階應用:6 個 Lifecycle Points 和 12+ 實戰場景

    Hook 看起來簡單,但它的威力來自於「在正確的時刻介入」。本篇深入 Hook 的生命週期,展示 6 個不同的 Hook 觸發點(lifecycle points),提供 12+ 個實戰場景範例,以及具體的配置和部署步驟。

    🔄 Hook 的完整生命週期

    Claude Code 在執行工作時,會經過多個檢查點。Hook 就是在這些檢查點上「攔截」執行流程,進行驗證、轉換或防禦。

    用戶輸入
      ↓
    [PreRequest Hook] ← Hook 1:攔截請求前
      ↓
    驗證認證和權限
      ↓
    [PreToolUse Hook] ← Hook 2:在工具執行前
      ↓
    執行工具(bash、read、edit 等)
      ↓
    獲取工具結果
      ↓
    [PostToolUse Hook] ← Hook 3:在工具執行後
      ↓
    結果驗證和轉換
      ↓
    [Stop Hook] ← Hook 4:決定是否需要暫停和修正
      ↓
    返回結果給用戶
      ↓
    [PostResponse Hook] ← Hook 5:響應後的清理
      ↓
    異常處理
      ↓
    [OnError Hook] ← Hook 6:異常發生時的恢復
      ↓
    完成
    

    📍 6 個 Hook 觸發點詳解

    1️⃣ PreRequest Hook(最上游的防禦)

    觸發時機:用戶提交請求時,在任何工具執行前

    使用場景:

    • 🔴 防禦場景 1:檢查用戶是否試圖讀取敏感檔案(.env, .ssh, .config)
    • 🟠 檢查場景 2:驗證請求是否包含危險關鍵字(git reset –hard, rm -rf)
    • 🟡 轉向場景 3:根據時間或上下文自動拒絕某些類型的請求
    # 配置位置:~/.claude/settings.json 或 settings.local.json
    
    {
      "hooks": {
        "pre_request": {
          "enabled": true,
          "rules": [
            {
              "name": "block_sensitive_files",
              "pattern": "(read|cat).*(\\.env|\\.key|\\.ssh|credentials)",
              "action": "block",
              "message": "⚠️ Cannot access sensitive files"
            },
            {
              "name": "warn_destructive",
              "pattern": "git (reset --hard|push --force)|rm -rf",
              "action": "confirm",
              "message": "⚠️ This command is destructive. Continue?"
            }
          ]
        }
      }
    }
    

    2️⃣ PreToolUse Hook(工具執行前的最後檢查)

    觸發時機:具體工具(bash、read、edit 等)即將執行時

    使用場景:

    • 🔴 防禦場景 1:攔截特定工具(禁止 rm、禁止 git push 到 main)
    • 🟠 檢查場景 2:驗證檔案路徑存在性(避免編輯不存在的檔案)
    • 🟡 轉換場景 3:修改命令參數(將 rm 改為 mv to trash)
    • 🟢 記錄場景 4:記錄所有敏感操作的日誌
    # 例子:PreToolUse Hook - 禁止直接刪除
    
    {
      "hooks": {
        "pre_tool_use": {
          "enabled": true,
          "rules": [
            {
              "name": "prevent_direct_deletion",
              "tool": "bash",
              "pattern": "^rm ",
              "action": "transform",
              "transform": "echo 'Using rm is disabled. Use: mv $file ~/.trash' && false"
            },
            {
              "name": "verify_branch_safety",
              "tool": "bash",
              "pattern": "git push.*main",
              "action": "confirm",
              "message": "Push to main? This is permanent."
            },
            {
              "name": "auto_backup_on_edit",
              "tool": "edit",
              "action": "pre_action",
              "command": "cp {file} {file}.backup"
            }
          ]
        }
      }
    }
    

    3️⃣ PostToolUse Hook(工具執行後的驗證和轉換)

    觸發時機:工具執行完畢,獲得結果後

    使用場景:

    • 🟡 驗證場景 1:檢查 bash 命令是否成功(exit code = 0)
    • 🟠 轉換場景 2:格式化輸出(JSON 格式化、表格美化)
    • 🟢 記錄場景 3:自動保存重要操作結果
    • 🔵 優化場景 4:清理大型輸出(截斷日誌)
    # 例子:PostToolUse Hook - 自動格式化和驗證
    
    {
      "hooks": {
        "post_tool_use": {
          "enabled": true,
          "rules": [
            {
              "name": "validate_bash_success",
              "tool": "bash",
              "action": "validate",
              "check": "exit_code == 0",
              "on_fail": "log_error"
            },
            {
              "name": "auto_format_json",
              "tool": "bash",
              "pattern": "jq|json",
              "action": "transform",
              "transform": "jq '.' (automatically format JSON output)"
            },
            {
              "name": "save_large_results",
              "tool": "bash",
              "pattern": "curl|wget",
              "action": "post_action",
              "command": "save_to_file ~/.cache/last_result.json"
            },
            {
              "name": "truncate_verbose_output",
              "tool": "bash",
              "action": "transform",
              "condition": "output_size > 10000",
              "transform": "head -100 + '... (truncated {remaining} lines)'"
            }
          ]
        }
      }
    }
    

    4️⃣ Stop Hook(驗證器決策點)

    觸發時機:結果返回給用戶前,決定是否需要暫停和修正

    使用場景:

    • 🔴 驗證場景 1:JSON 格式驗證(無效 JSON 需要修正)
    • 🟠 邏輯場景 2:檢查結果合理性(SQL 查詢應該有行,否則可能是錯誤)
    • 🟡 決策場景 3:判斷結果是否完整(檔案大小是否符合預期)
    # 例子:Stop Hook with Validator - JSON 驗證和自動修復
    
    {
      "hooks": {
        "stop_hook": {
          "enabled": true,
          "validator": {
            "name": "json_validator",
            "rules": [
              {
                "id": "valid_json",
                "check": "is_valid_json(result)",
                "on_fail": "stop_and_request_fix",
                "message": "JSON is malformed. Please fix and retry.",
                "auto_attempt": 3
              },
              {
                "id": "non_empty_result",
                "check": "len(result) > 10",
                "on_fail": "warn",
                "message": "Result might be incomplete (too short)"
              },
              {
                "id": "api_error_check",
                "check": "'error' not in result.lower()",
                "on_fail": "stop_and_request_fix",
                "message": "API returned an error. Review and retry."
              }
            ]
          }
        }
      }
    }
    

    5️⃣ PostResponse Hook(執行後的清理和通知)

    觸發時機:結果已返回給用戶,工作完成後

    使用場景:

    • 🟢 清理場景 1:刪除臨時檔案(/tmp 下的中間結果)
    • 🔵 通知場景 2:記錄到監控系統(重要操作記錄)
    • 🟣 統計場景 3:更新執行統計(執行次數、成功率)
    # 例子:PostResponse Hook - 清理和通知
    
    {
      "hooks": {
        "post_response": {
          "enabled": true,
          "rules": [
            {
              "name": "cleanup_temp_files",
              "action": "cleanup",
              "targets": ["/tmp/*.temp", "/tmp/claude-*"],
              "condition": "age > 1h"
            },
            {
              "name": "log_sensitive_operations",
              "action": "log",
              "condition": "tool in ['bash', 'edit'] AND (git|deploy|delete) in command",
              "log_file": "~/.claude/audit.log"
            },
            {
              "name": "notify_on_error",
              "action": "notify",
              "condition": "exit_code != 0",
              "channels": ["stderr", "log_file"]
            }
          ]
        }
      }
    }
    

    6️⃣ OnError Hook(異常情況處理)

    觸發時機:工具執行失敗或發生異常時

    使用場景:

    • 🔴 恢復場景 1:自動回滾(某個命令失敗,執行恢復操作)
    • 🟠 重試場景 2:自動重試(網絡超時自動重試)
    • 🟡 降級場景 3:使用備選方案(API 1 失敗,嘗試 API 2)
    # 例子:OnError Hook - 自動恢復和重試
    
    {
      "hooks": {
        "on_error": {
          "enabled": true,
          "rules": [
            {
              "name": "auto_retry_network_errors",
              "error_pattern": "(timeout|connection refused|ECONNREFUSED)",
              "action": "retry",
              "max_attempts": 3,
              "backoff": "exponential"
            },
            {
              "name": "rollback_on_git_error",
              "error_pattern": "git (push|merge|rebase)",
              "action": "execute",
              "command": "git reset --hard HEAD"
            },
            {
              "name": "fallback_api_endpoint",
              "error_pattern": "api1\\.example\\.com",
              "action": "retry_with",
              "new_command": "replace(api1, api2)"
            }
          ]
        }
      }
    }
    

    🛠️ 如何正確配置和部署 Hook

    步驟 1:選擇配置位置

    1. 全局配置:~/.claude/settings.json(所有項目適用)
    2. 項目級配置:{project}/.claude/settings.local.json(單個項目)
    3. 團隊配置:{team}/.claude/team-settings.json(團隊共享)

    🔵 最佳實踐

    敏感規則(.env 保護、刪除防禦)→ 全局 settings.json

    項目特定規則(特定分支政策、特定工具限制)→ settings.local.json

    步驟 2:編寫 Hook 規則

    Hook 規則的通用結構:

    {
      "hook_type": "pre_tool_use",      // 觸發點
      "name": "rule_name",               // 規則名稱
      "tool": "bash",                    // 適用工具(可選)
      "pattern": "regex_pattern",        // 匹配模式(可選)
      "action": "block|confirm|transform|validate", // 動作類型
      "condition": "expression",         // 執行條件(可選)
      "message": "User-facing message",  // 給用戶的提示
      "auto_attempt": 3,                 // 自動重試次數(可選)
      "transform": "transformation",     // 轉換規則(如果 action=transform)
      "on_fail": "action_on_failure"    // 失敗時的行動
    }
    

    步驟 3:驗證 Hook 配置

    # 1. 檢查 JSON 語法
    jq '.' ~/.claude/settings.json
    
    # 2. 列出所有啟用的 Hook
    claude config list-hooks --enabled
    
    # 3. 測試特定 Hook(乾跑)
    claude hook test --name rule_name --dry-run
    
    # 4. 查看 Hook 日誌
    tail -f ~/.claude/hooks.log
    

    步驟 4:分層部署(由簡到複雜)

    1. 第 1 周:安全防禦
      • PreRequest Hook:阻止敏感檔案讀取
      • PostToolUse Hook:驗證 bash 執行成功
    2. 第 2 周:工作流驗證
      • Stop Hook:JSON 驗證
      • PostToolUse Hook:自動格式化
    3. 第 3 周:錯誤恢復
      • OnError Hook:自動重試
      • PostResponse Hook:清理臨時檔案

    📋 12+ 個實戰範例速查表

    範例 Hook 類型 動作 效果
    保護 .env 檔案 PreRequest Block 永不讀取敏感檔案
    防止 git reset –hard PreToolUse Confirm 需要確認才能執行
    禁止直接 rm PreToolUse Transform 改為移到回收站
    自動格式化 JSON PostToolUse Transform 自動美化輸出
    驗證 JSON 有效性 Stop Validate 無效 JSON 拒絕返回
    自動備份編輯檔案 PreToolUse Pre-action 編輯前自動備份
    日誌敏感操作 PostResponse Log 所有敏感操作記錄
    網絡超時自動重試 OnError Retry 最多重試 3 次
    清理臨時檔案 PostResponse Cleanup 自動刪除 /tmp
    驗證 bash 成功 PostToolUse Validate exit code ≠ 0 時警告
    截斷大型輸出 PostToolUse Transform > 10KB 自動截斷
    API 故障轉移 OnError Fallback 用備選 API 重試

    ⚠️ Hook 配置的常見陷阱

    陷阱 1:規則太寬鬆,誤傷正常操作

    ❌ 錯誤:
    "pattern": "read"  // 任何包含 "read" 的命令都會觸發
    
    ✅ 正確:
    "pattern": "read (.*\\.env|\\.key|\\.credentials)"  // 只針對特定檔案
    

    陷阱 2:Hook 順序錯誤導致邏輯失效

    ❌ 錯誤順序:
    1. PostToolUse(驗證)
    2. PreToolUse(保護)  ← 太晚了,工具已經執行了
    
    ✅ 正確順序:
    1. PreToolUse(攔截和保護)
    2. PostToolUse(驗證結果)
    3. Stop(決定是否修正)
    

    陷阱 3:Transform 規則語法錯誤

    ❌ 錯誤:
    "transform": "cmd.replace('old', 'new')"  // Python 語法,但 Hook 是 shell
    
    ✅ 正確:
    "transform": "sed 's/old/new/g'"  // Shell 語法
    或
    "transform": "replace(cmd, old, new)"  // Hook 提供的函數
    

    ✅ Hook 部署檢查清單

    • ☐ 配置檔案 JSON 語法正確(jq 驗證通過)
    • ☐ Hook 規則的 pattern 足夠明確(不會誤傷)
    • ☐ PreToolUse 規則在最關鍵的地方(防禦第一)
    • ☐ Stop Hook 驗證邏輯清晰(什麼時候拒絕)
    • ☐ OnError Hook 有適當的重試邏輯
    • ☐ 測試了至少一個完整工作流
    • ☐ 查看日誌確認 Hook 被正確觸發
    • ☐ 團隊成員知道有這些 Hook(溝通重要)

    🔗 與其他文章的連結

    📚 延伸閱讀

    總結:Hook 的 6 個層次

    • 🎯 L1:PreRequest(最上游,全局防禦)
    • 🎯 L2:PreToolUse(工具前,細粒度保護)
    • 🎯 L3:PostToolUse(結果驗證和轉換)
    • 🎯 L4:Stop(決策點,是否修正)
    • 🎯 L5:PostResponse(清理和通知)
    • 🎯 L6:OnError(異常恢復)

    掌握這 6 個層次,你就能在任何地方「攔截」執行流程,實現你想要的保護和自動化。